2013年 5月 15(水曜日)
Ubuntu's autofs, or automounter, have the script auto.smb to mount Windows shares with share names by accessing for example "/smb/minitrue/tmp". It works OK with samba shares, but NG with Windows shares according to some errors in the script. Until Today, I wrote direct settings in auto.xxx as follows for all shares instead of using the script. minitrue -fstype=cifs,rw,username=myUser,passwd=myPasswd,iocharset=utf8 ://minitrue/tmp
But I feel very inconvenient with it, and try to fix it. I found a solution for the issue in the site, but it does not work correctly as is. The problems are as follows: - auto.smb uses smbclient for listing services and it executes with "-N" (=no-pass). It is OK for servers providing the listing function for anonymous account, but causes an error with those require an authentication. Therefore we should remove "-N" from options and add authentication parameters like "-credentials".
- mount seems to be done with mount.cifs and it does not allow to use credential file but direct parameters like username, password or domain.
Then the fixed script is as follows. #!/bin/bash # This file must be executable to work! chmod 755 key="$1" opts="-fstype=cifs,rw,iocharset=utf8" creddir="/etc/auto.credentials" credfile="" host=`echo $key | sed 's!^//!!;s!/.*$!!'` if [[ "$key" =~ '/' ]]; then path=${key#*/} fi if [ -z "$credfile" ]; then # Search for credentials file if [ -n "$path" ]; then if [[ "$path" =~ '/' ]]; then share=${path%%/*} else share=$path fi fi # First look for $creddir/$host.$share then for $creddir/$host if [ -n "$share" ]; then if [ -e "$creddir/$host.$share" ]; then credfile="$creddir/$host.$share" elif [ -e "$creddir/$host" ]; then credfile="$creddir/$host" fi elif [ -e "$creddir/$host" ]; then credfile="$creddir/$host" else credfile="$creddir/defaults" fi fi smclopts="" if [ "z$credfile" != "z" ]; then smclopts="$smclopts --authentication-file=$credfile -gL" credopts="" username=`egrep '^username' $credfile | sed 's!^.*= !!;s! $!!'` password=`egrep '^password' $credfile | sed 's!^.*= !!;s! $!!'` domain=``egrep '^domain' $credfile | sed 's!^.*= !!;s! $!!'` if [ "z$username" != "z" ]; then [ "z$credopts" = "z" ] \ && credopts="username=\"$username\"" \ || credopts="$credopts,username=\"$username\"" fi if [ "z$password" != "z" ]; then [ "z$credopts" = "z" ] \ && credopts="password=\"$password\"" \ || credopts="$credopts,password=\"$password\"" fi if [ "z$domain" != "z" ]; then [ "z$credopts" = "z" ] \ && credopts="domain=\"$domain\"" \ || credopts="$credopts,domain=\"$domain\"" fi opts="$opts,$credopts" else smclopts="$smclopts -gNL" fi for P in /bin /sbin /usr/bin /usr/sbin do if [ -x $P/smbclient ] then SMBCLIENT=$P/smbclient break fi done
[ -x $SMBCLIENT ] || exit 1
$SMBCLIENT $smclopts $key 2>/dev/null| awk -v key="$key" -v opts="$opts" -F'|' -- ' BEGIN { ORS=""; first=1 } /Disk/ { if (first) print opts; first=0 dir = $2 loc = $2 # Enclose mount dir and location in quotes # Double quote "$" in location as it is special gsub(/\$$/, "\\$", loc); gsub(/\&/,"\\\\&",loc) print " \\\n\t \"/" dir "\"", "\"://" key "/" loc "\"" } END { if (!first) print "\n"; else exit 1 } '
After
this fix, we should prepare credential file with name line "minitrue",
"minitrue.tmp" and "defaults" in the directory "/etc/auto.credentials/".
The format of the files can be refered by "man smbclient". The file defaults should be like as follows, username = myUser password = myPassword domain = myDomain
The file must be create for the shared path, if username or password is different from the defaults. 日本語で追加automountのsmbマウントがauto.smbでできない場合の修正方法を説明します。(できていれば、/smb/host/shareでアクセスすると、自動でマウントされます) まとめ - オリジナルのauto.smbは、サービスのリストを得るために、smbclientを無名アクセスで行っています。このため、通常のWindows共有で蹴られます。認証情報のオプション(-credentials)を付けて実行する必要があります。
- マウント自体は、mount.cifsを使用しています。こちらにも同じ認証情報を渡さないとなりませんが、ドメイン、ユーザ、パスワードで分けて渡します。
- 認証情報は、相手サーバによって違うのが普通なので、複数の認証ファイルを使い分けるようにしないとなりません。
結局のところ、 このサイト のを参考にして、上記スクリプトにしました。利用には、以下のようにします。 - /etc/auto.credentials/に認証ファイルを置きます。
共有名が、\\host\share であれば、host.shareのファイル、 share間で共通であれば、hostのファイル、 デフォルトはdefaultsのファイルです。 - マッチングの優先度は、細かく指定されているほう(host.share > host > defaults)になります。
- 書式は、
username = 認証ユーザ名 password = このユーザのパスワード domain = この共有のドメイン
"Ubuntu Tips: Fix auto.smb for automount Windows shares." の続きを読む...
2011年 5月 24(火曜日)
FOMAにメディアファイルを入れる方法メディアファイルのフォーマット変換サービスが、最近のFOMA端末では動かないとのことなので、情報を集めていました。どうやら、AAC on MP4とWMAしか再生できなくなっているということが分りましたので、実機で試してみることにしました。その仮定で、MTPやらデータベース化やら、技術的な問題が出ましたので、(全部のFOMAに当て嵌るかは不明ですが)整理します。特に、Linuxで携帯を利用するMTPのやり方について詳しく解説します。 実機はテスト用の昨年入手していたDoCoMo F-08Bです。さっそく作成した音声ファイルを読み込ませようとすると上手く行かないのでした。 - USBマスストレージ: ファイルはコピーできるのですが、データフォルダからは見えません。
どこにコピーしても、ネットで調べた命名規則(mol060みたいな)にしても駄目。 - SDカードにコピー: これも1と同様。こんなんでは、マスストレージやSDカードに対応してると言えないのでは…。
- メール添付: ミュージックに入らずに、iモーションの「データ交換」に入る。
再生可も、ミュージックプレイヤーからはアクセスできないためプレイリストに入れられない。 - FOMAシリーズSDユーティリティ: それで仕方なく、富士通製転送プログラムをインストールする。
勿論 Windows でしか動かない。音声ファイルはコピーできるものの、依然としてミュージックプレイヤからはアクセスできない。 メディアファイルに関しては、「FOMA90Xiでしか使えないよ」、という警告が出る。 - Window Media Player: それで、Windows Media Player 11のファイルの同期を行うことでコピーできました。
なんと言いますか、無理やり機能制限を加えて行く内に、ぐちゃぐちゃな仕様になってしまいましたという感じの、典型的なガラケーでイライラさせられてしまいました。皆さん、これで使うことができているのでしょうか? ちょっと理由を考えてみました。 多分、1と2は、メディアファイルをデータベース化したからと思われます。怪しいファイルができていたり、太ったりするので、これに入っていると思われますが、中身が読めません。iPodやWalkmanと同じで、プロプラな制御しかさせないよ、というがっかりな仕組みです。 4はいかにもなガラケー的な解決方法で、追加で(タイトルが半角カナ文字な)アプリをインストールしないとなりません。しかも、これで完結できないのが、信じられないところです。 5は、これまた嫌われ者のMedia Player 11を使わないとならないということと、いちいち、端末設定をMTPモードに切り替えないとならないというゴミっぷりです。WMP11は、iTunesと同じく、ただ音楽を再生したいだけなのに、不要な音楽を新しく買え買え、言われてうんざりです。 整理すると、音声ファイルはデータベース管理になっていて、ファイルシステムのファイルとしては見えません。従って、SDカードにファイルとして書き込むことはできますが、携帯電話から音声ファイルとしては認識されなくなります。代わりに、本体はMTPモードを持っています(マスストレージ上のアプリプロトコルではなく)。MTPはケータイの中でデータベースに接続されているため、データフォルダやミュージックプレイヤ等から見える状態で書き込まれます。 MTPMicrosoft発案のメディア転送プロトコルですが、ファイル単位でマニピュレートするだけのもののようです。本当にこんなもの新しくいるの?って感じです。しかし、幸いなことに、Linuxでも使えることが分りました。 - 最低限必要なのは、libmtp。libusbがなれば要インストールですが、最新のものではlibmtpがコンパイル不可なので、0.1.12版が良いようです。これにはユーティリティが付いており、リスティング、コピー、削除等ができます。
- これでは不便なので、mtpfsを追加します。これによって、ファイルシステムにマウントすることができるようになります。
libmtpには、以下のようなユーティリティが付いていて、大体のマニピュレートを網羅しています。 mtp-albumart mtp-files mtp-newfolder mtp-thumb mtp-albums mtp-folders mtp-newplaylist mtp-tracks mtp-connect mtp-format mtp-playlists mtp-trexist mtp-delfile mtp-getfile mtp-reset mtp-detect mtp-getplaylist mtp-sendfile mtp-emptyfolders mtp-hotplug mtp-sendtr
デバイスは、mtp-detectで表示されていれば認識されていることになります。(継いだだけの段階では、ドライバがないよ、と言われます)。しかし、mtp-filesしてもフラットにファイルがリストされてしまい、かなり使い難いです。
マウントするためには、mtpfsを使います。fuseがなければ、事前インストールが必要になります。これも理由は不明なのですが、デバイスファイル経由のアクセスにはされていないみたいで、マウントはいきなり、以下のようにします。 mtpfs -o allow_other /mnt/mtp
デバイスファイルがないので、mount -vt mtp ...のようにはできなくて、恰好悪いです。
しかしながら、これによって、Linuxでも扱えるようになりました。ケータイXXX転送みたいなプロプラなアプリを購入しないとならないよりはマシとも言えるかもしれません。
2011年 2月 13(日曜日)
GTフォントのLinuxでの利用方法
スラドの記事によれば、Tフォントがリリースされたようなので、インストールしてみました。 昔、GTフォントとして公開されていたもののようです。以前は不具合が多くて使っていませんでしたが、フィックスされているとのことです。字体は、明朝、ゴシック、楷書の3書体。良く分らないグリフのファイルが沢山入っていたり、等幅フォントのときにアルファベットも全角になるなど、独自の主張があるようです。 ブラウザで使っている限りでは、中々きれいですが、ゴシックには少し癖があるでしょうか。個人的な意見としては、IPAより少し落ちますが、通常使うフォントとしては申し分ありませんし、マイクロソフトのウィンドウズに付属するフォントよりも遥かにきれいです。これだけのフォントが無償で公開されるということは本当にありがたいことです。 freetype用のfonts.scaleと、xtt用のfonts.dirを置きます。(ttfont_dir.zip) xtt用は、太字、イタリック、反イタリックの生成も行っています。 唯一、不具合というか、原因は良く分らないのですが、ブラウザ(Firefox)で下線がやたら太くなることがあります。フォントのせいではないかもしれません。
2011年 1月 7(金曜日)
unannotationなSKK-JISYO.L久し振りにskk openlaboを見てみましたら、辞書が沢山更新されていましたので、入れ替えてみました。 しかし、既に使う人が居ないのか、unannotatedな辞書(註釈が入っていない)は配布されていません。また、註釈を抜くツールunannotate.awkも配布が打ち切られているようですし、捜し出してきたものを現在の辞書に適用してもうまく行きませんでした。 そこで、超簡単なスクリプト(skk-unannotate.pl.zip)を作成して、カレントの辞書の註釈抜きバージョン(unannotate.zip)を作成しました。註釈のフォーマット仕様を調べず、眺めただけで書いていますので、もしかすると不具合があるかもしれません。 それにしても、現在のリリース物には、ゴミエントリ(行頭が">"のものなど)があるようなのですが、未チェックなのでしょうかねぇ。
2010年 12月 29(水曜日)
RPDL4プリンタをLinuxで使う Ricoh IPSiO SP4000 業務用レーザープリンターで、 少し前から安売りされていています。HP複合機の調子悪くなってきたため物色していたのですが、Linuxでも使えるらしいことが分り、購入しました。少し前から動かしていたのですが、今回年賀状印刷で設定を見直しました。RPCS, RPDL 4をサポートしていますが、Postscriptは未サポートです。Linuxで動かすことに関しては、リコーのドライバ配布もあるために楽観視していたのですが、色々と問題がありました。 私のマシンにインストールされているGhostscript 7.07 では、RPCSも RPDLの未サポートです。古いシステム(FedoraCore1)のため新しいGhostscriptも動きませんので、リコーからドライバを取ってきます。しかしながら、これは、Debian向けということで、Ghostscript-ESP(gs-esp)というもので、通常?のGhostscriptとは互換性がありません。そのため/その上、同梱されているバイナリは動作しませんでした。 そこで、幾つか道が考えられます。 - GhostscriptにRPDL 4のドライバを追加する。
- gs-espを追加する。
まず、素性の良い(1)をやってみました。色々と拾ってきてコンパイルします。RPSL4対応ができたように見えるのですが、少なくともこのプリンターでは印字できません。なにやらエラーが表示されるだけです。 それで気を取り直して(2)でやってみます。リコーの配布物はgs-esp_7.07.1-rpdl4.tar.gzで、ソースパッチとバイナリ(不動)、PPDファイルが入っています。そこで、gs-eps-7.07を取ってきて、リコーのパッチを当ててビルドすることに。 コンパイルすると日本語関係のパッチが足りなくて?色々エラーが出ます。この辺りは強引に直して、とりあえず進めます。最後の libpng 関連のエラーは、古いlibpng.so.3をリンクさせれば出なくなります。(ln -s libpng.so.3 libpng.so) 後は、CUPS の設定(PPDファイルをコピーしてcupsconfigを起動します)すれば動くようになりました。PPDはリコーのものでOKです。とりあえずprintcap にも rp=ipsio で追加します。 さて、こうして作成したgs-espは、SP4000の印刷はできるものの、Ghostscriptとしては駄目駄目になってしまいました。article9.psなどを表示できません。仕方ないので、/usr/bin/gsは元々のGhostscriptに戻します。新しいgs-espは違う名前(gs-esp-rpdl)でインストールしました。この場合、PPDファイルのパスを合わせて変更しておきます。 結論レーザープリンタを買うなら、Postscript対応のものに限ります。(因みにIPSIOも4010以降は PS サポート)。昔、CanonやXeroxのLIPSやらESC/P対応プリンタで苦労したことを思い出しました。これはLinuxだけの話ではなく、Windowsでも、OSが新しくなったときにドライバーが提供されなければ同様の苦労が待っています。それにしても、Postscriptのライセンス料金はそんなに高いのかなぁ。
2010年 7月 5(月曜日)
Firefox以外のGreaseMonkeyユーザスクリプト実行環境Firefoxには、ウェブページのGUIをカスタマイズするユーザスプリプト実行環境Greasemonkeyがあります。私もユーザスクリプトを2つ公開しています。最近はWindows環境のIEやChromeを使うことがありますので、そこでもユーザスクリプトを使うことができないか、と思い、調査してみました。 IEとChromeに関してはGreasemonkey互換環境があり、YahooAuctionSは問題なく動作しました。 インターネットエクスプローラIEには2種類あるようです。TrixieとGreasemonkey for IEです。ネイティブな記述言語は、前者はJavascript、後者はDHTMLです。Trixieのほうが歴史が古く、Greasemonkeyとの互換性という点では良さそうです。 TrixieTrixieは外部プログラムになっており、インストールもMSIファイルになります。インストールすると、「ツール」メニューの中に"Trixie Options..."というメニューが追加され、設定を行うことができるようになります。ユーザスクリプトは、<<C:\Program Files\Bhelpuri\Trixie\Scripts\>>にコピーすれば自動的に読み込まれます。(読み込まれない場合、Trixie OptionsでReload Scriptsボタンを押します)。 YahooAucitonSしか動かしていませんが、特に動作に問題はないようです。 Google Chrome今年の春に組込み機能としてサポートされたようです。基本的に環境のインストールは必要がなく、ユーザスクリプトをファイルとしてブラウザに読み込ませることでインストールされ、それ以降はスクリプトが動作するようになります。こちらもYahooAuctionSの動作には問題はありません。 しかし、一つ問題があります。それは、ユーザスクリプトがインストールされるフォルダのパスが可読な形式でないことです。例えば、私のところでは、こんなパスです→<<C:\Users\XXXX\AppData\Local\Google\Chrome\User Data\Default\Extensions\ecegpedmokfjpiaofpacmkejhjfidfbf\1.0\>>。つまり、Extensionsの下に直に(他のAddOnと同列に)置かれてしまい、かつ、GUIDのような無意味な文字列のフォルダ名にされてしまいます。しかも、その下は、"manifest.json"と"script.js"とファイルが自動生成されています。(後者はyafooauctions.user.jsをリネームしたもの)。このため、どこにインストールされたかは、ファイルを開けて捜さないと分りません。 現在、YahooAuctionSは設定UIを持たず、設定変更はスクリプトファイルの直接編集になっていますので、ファイルの場所が分らないというのは問題です。設定UIを開発しないと一般ユーザには使っていただけない状況かと思います。 おまけで更新しました。マイオークションメニューの「値下げ交渉」リンクを「検索履歴」に差し替えることができるようになります。「値下げ交渉」というのは使われているのでしょうか? 検索履歴は良く使うので代りにメニューに入れました。 var SUBSTITUTE_OFFERDISCOUNT_TO_SEARCHHISTORY = true;
とすることでメニューが切り替わります。 yahooauctions.user.js ※ (7/7追記 前回「終了したウォッチリストの削除から戻る」が間違ったページに戻るようになっていたのを修正)
2010年 7月 5(月曜日)
blogシステムserendipityをchromeで編集できるようにするパッチChromeブラウザでserendiputyの管理者スィートを立ち上げた場合、警告(alert)が度々表示される不具合があります。"mozilla < 1.3 beta is not supported"というものです。これをfixするパッチを作りました。 serendipity-chrome.patch これは、Safari系ブラウザに共通なもののようです。このアラートは、Geckoエンジン(SafariはKHTMLのような?)の場合に、リリース日時を調べて、一定以上昔の場合に表示されています。通常はこれでOKなのですが、Safariの場合はちょっと動作が違っていて、初期リリース(1.0版)のリリース日時を返すとのこと。このため、必要以上に古い日時が返されて警告が表示されていました。 Safari系のブラウザ(Safari, Chrome)は新しく、時期的に"< mozilla 1.3"とかいうことはありませんので、単純に警告を抑制することにしました。実際には、AppleWebKitを使っているものに対して抑制します。調べていませんが、このモジュールが上記動作をしていると思われます。 もしかしたら、serendipityの最新リリースでは直っているかもしれません。(ソースコメントに、この部分の実装が不完全なことが注記されていますので)
2010年 5月 28(金曜日)
SKKの入れ替え嵌り易い漢字変換システムにSKKがあります。その名の通りシンプルな単語変換ですが、入力の手順が手書きと似ているところが気に入っています。元々はEmacsに特化したシステムだったこともあり、ユーザも多くはないながらも熱心な人が多いようで、廃れることもなかったので、利用し続けてきました。また、幸いなことに今ではLinux(iBus, SCIM, UIM, XIM), Windows、Macなど多くの環境で利用することができます。 やっと、受託していた開発を納品することができましたので、なんだか無駄なことがしたくなり、SKK関係の不満を解消しようと思い立ちました。 SKKIME on WindowsWindowsにはSKKIMEがあります。本当に素晴しい。これと、XKeymacsがあるおかげでWindows上でも快適に作業をすることができるようになりました。しかし、私が使っていたバージョンでは「IMEをオープンしたときに"かな"に戻す」の設定が効いていないことが、小さな不満でした。特にWindowsではステータスバーがウィンドウから離れた端っこのほうに出るので、いちいち確認していられないのです。 さて、サイトを見てみると新しい版が出ていますので、入れ替えてみました。設定が大幅に変わっているようで、Shift+Spaceを押しても動きません。どうやら、この辺のキーハンドルが自分でできるように変更されたようです。このため、XKeymacsで設定していた"toggle-ime"のキーマップを解除し、skkimeのプロパティ設定のキーマップの設定で、Shift-Spaceを追加して、toggle-imeを設定。これでできました。最新版では、上記の「"かな"に戻す」も動作しています。 この設定を見ていると、もっとカスタマイズできそうなので、以前から気になっていたのを変更することにします。 skkでは"\"(あるいは¥)で句点コード入力モードに入りますが、UNIXと違い、Windowsではディレクトリのセパレータとして"\"自体を入力することが多く、この仕様はちょっと困りものでした。要するに、"\"で"\"が入力されるようにします。同じくキーマップ設定で"\"の "skk-j-mode-map"を"self-insert-char"にして、別のキーに"skk-input-by-code-or-menu"を割当てます。IME起動と"Shift+Space"にしているために空いている"C-\"に設定しました。 SkkInput3 on Linuxこれで気を良くしたので、Linuxのほうも変更してみることにしました。ディストリビューションにはskkinput2が入っているため、こちらをバージョンアップしつつ使っていたのですが、何かの拍子に落ちてしまうこと(しばしばFirefoxと共に落ちる)や、漢字登録ダイアログが消去できなくなってしまうことがあり、解決策を捜していました。 バージョン3版を取ってきてコンパイルしてみると動きそうです。(以前は何故か動かなかった記憶が)。とりあえず、実行ファイルも同じskkinputになるので、同じように使うことができますが、共存は想定されていないようです。 こちらも、そのままでは動かないようです。Xリソースに書いてある設定は効いていないようで、emacs-lispの設定ファイルを作らなくてはなりません。で、".skkinput.el"を作ります。とりあえず、".skk"にリンクすれば良さそうです。(ln -s .skk .skkinput.el) こちらもしばらく使っていた限りでは、前述の問題は解決されています。落ちないようですし、登録ダイアログの動作も申し分ありません。なのですが、原因不明の不具合が発生しており、一時的にバージョン2に戻していて、そのまま乗り換えには至っていません。不具合はFirefox上で"Enter"が入力できなくなってしまうことがある、のと、Backspaceが誤動作(?)することです。skkinput以外の何かの設定が原因かもしれません。
2010年 4月 11(日曜日)
VIA VT6102イーサネットコントローラの不具合解決VIA Technologies Inc.社のチップセットKT600(多分他のファミリにも)には、VT6102(6105とかも)イーサネットコントローラ(NIC)が付いています。このNICはRhine/Rhine IIと呼ばれていて、勿論Linuxでもサポートされているのですが動作上の不具合があり、今に至るもfixされていないようです。しかし、VIAが提供するドライバを使えば解決することが解りました。 不具合の内容不具合は、このデバイスをLinuxで使うとき、長時間コネクション繋ぎっぱなし、もしくは連続して大量のデータの通信をすると、"NETDEV WATCHDOG: eth0: transmit timed out"というwatchdogタイマによるリセットが入ってコネクションが切断されてしまう、というものです。リセット後は再度接続可能になるため、Webなど小まめに切断される通信では問題となりませんので、殆どのユーザは気付かずに使っているかもしれません。 しかし、サーバとして使うなどして、大きなファイル転送などを行うと途中で切れてしまうので、使い物になりません。また、Windowsではこのような不具合は報告されていないようですので、原因はハードウェアバグとしてもドライバソフトウェアでの回避は可能なはずです。 以前に一回調査してみたのですが原因が掴めていないようで、カーネルの残バグとして残っています。対症療法として、ACPIを切れば動くとか、APICを使わなければ動くとか書いてあるものもあり、やってみましたが直りませんでした。(Linuxカーネルでは、何か不具合あると、仕様が必ずしもオープンでないACPIやAPICに原因を求めようとする悪い癖があるような。度々grub.confに色々書き込んで試しています)。結局仕方なく、別途NICカードを差して対処していました。 VIAのドライバ今回、ひょんなことからVIAがLinux向けにドライバの提供を行っていると知り、もしやと思って捜してみたらRhine II向けもありました。ソース提供なのでコンパイルして"rhinefet"というモジュールをロードしてみます。今迄使ってみていますが、不具合は出ていないようです。作業で1GBx40個のファイルを転送しましたが大丈夫です。有難いことです。もしも、この不具合に悩まされているサーバ屋さんがいらっしゃいましたら、このドライバを試してみることをお勧めします。 それにしても、Linuxのサポートが全くなかったり、不具合以外のfirmwareやBIOSのupdateを行わないのは、今や日本メーカだけなのではないでしょうか。酷い場合には、アメリカサイトでは提供しているのに、日本サイトだけには置いていなかったりします。最近もF通のPC(Inetl 865チップセット)でPrescottが使えなくて残念な思いをしました。以前はサポートのことも考えて国内メーカ製の機器を選んでいましたが、今は韓国や台湾を始めとする海外メーカのものを選んでしまいます。 提供してもし不具合が出たらとか、コールセンタへの問い合わせが増えたら困るということなのでしょうけれど。そろそろこういった社内対応優先主義、あるいは事なかれ主義のようなものはやめていただきたいですね。「お客様第一」などと口では言いますが、全然そうなっていません。
2010年 3月 17(水曜日)
Linuxで使える世界時計
サーバのメンテナンスのために休止したり、データを入れ換えるのは、利用者になるべく不便を掛けないような時刻を選ぶようにしています。最近は海外からのアクセスが結構あるので、海外の時刻が何時なのか気になっていました。ヨーロッパとの時差は何となく実感としてあるのですが、アメリカは今何時なのだろう、と。 それで、良く証券会社の仕事場の映像に出ているような、壁に世界中の都市の時刻を表示する時計が一杯並んでいるようなものが欲しいなと思いました。
検索してみると、意外なことに、こういった世界時計は多くありません。なんだか平気で有料シェアウェアとかになっています。時差があるだけで簡単なものだと思うのですが。このため、時計を横に並べたようなものを自分で作ってみようかとemiclockのソースを取ってきたりしたのですが、残念ながらこれはGPLではないため改造して使うことはできないようです。 zdumpそうこうしている内に、zdumpというプログラムを見つけました。使い方は簡単で、 $ zdump Europe/Pais Europe/Paris Wed Mar 17 06:54:09 2010 CET
これで現在時刻の表示ができました。色々な場所を一度に表示したければ、 $ zdump Europe/London Australia/Sydney Asia/Tokyo Asia/Singapore Asia/Katmandu Europe/Paris \ Europe/Moscow America/New_York America/Los_Angeles Africa/Kinshasa Pacific/Honolulu Europe/London Wed Mar 17 05:55:57 2010 GMT Australia/Sydney Wed Mar 17 16:55:57 2010 EST Asia/Tokyo Wed Mar 17 14:55:57 2010 JST Asia/Singapore Wed Mar 17 13:55:57 2010 SGT Asia/Katmandu Wed Mar 17 11:40:57 2010 NPT Europe/Paris Wed Mar 17 06:55:57 2010 CET Europe/Moscow Wed Mar 17 08:55:57 2010 MSK America/New_York Wed Mar 17 01:55:57 2010 EDT America/Los_Angeles Tue Mar 16 22:55:57 2010 PDT Africa/Kinshasa Wed Mar 17 06:55:57 2010 WAT Pacific/Honolulu Tue Mar 16 19:55:57 2010 HST
というふうにできます。いつも一時に表示したければ、こんな感じで良いでしょう。 $ alias wclock='zdump Europe/London Australia/Sydney Asia/Tokyo Asia/Singapore Asia/Katmandu \ Europe/Paris Europe/Moscow America/New_York America/Los_Angeles \ Africa/Kinshasa Pacific/Honolulu'
worldclock.plさて、これで充分なのですが、ディストリビューションやバージョンによってはzdumpが動かないことがあるようです。何かのバージョン不整合があったのか、私のデスクトップマシンでは最初動きませんでした。いつも同じ時刻(グリニッジ標準時か東京時刻)を表示してしまいます。これは結局zoneinfoのインストールが上手くなかったようで、zoneinfoの少し新しいバージョンを入れたら動作するようになりました。元々はzoneinfo(/usr/share/zoneinfo)に.ics(中身はVCalendar)のファイルしかなかったのですが、追加したら拡張子が付かないバイナリファイル(TZif形式)が追加されてました。 それで、動かない間に、元々の.icsファイを読んでzdumpと同じ動作をするworldclock.pl(worldclock.pl.zip)を作成しました。こちらは少しおまけが付いていて、都市だけで、もしくは都市名に完全に一致しなくても、マッチするものを表示します。 $ worldclock.pl Par 03/17 Wed 03:19:47 2010 SRT America/Paramaribo 03/17 Wed 07:19:47 2010 CET Europe/Paris
こちらも、都市名(Aria/City)を複数指定して、上記のwclockのようにalias等を設定することができます。 #!/usr/bin/perl $Usage = "$0 [-h] [-verbose] [Aria/]city ...\n";
$ZoneinfoDir = "/usr/share/zoneinfo"; @WeekdayName = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); @MonthName = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); $Verbose = 0;
#--- interpret the command-line arguments while ($ARGV[0]) { # print STDERR "$ARGV[0]\n"; if ($ARGV[0] =~ /^-D.*/) { $Debug = 1; } elsif ($ARGV[0] =~ /^-v.*/) { $Verbose = 1; } elsif ($ARGV[0] =~ /^-.*/) { print STDERR "$Usage"; exit 0; } else { last; } shift(@ARGV); }
#--- checking to set the necessary variables. #--- DebugPrint function #$Debug = 1; sub Dprint { if (defined($Debug)) { printf STDERR "DBG @_"; } return 0; } Dprint "ARGS($#ARGV): @ARGV\n";
#--- Current time of Greenwich. $gm_time = time() - 9 * 60 * 60;
#--- Check zoneinfo dir if (!-d $ZoneinfoDir) { my @zdirs = `locate /zoneinfo/Asia/Tokyo.ics`; #-- Use the first one without reasons. if ($#zdirs < 0 || $zdirs[0] !~ m|^(.*)/[^/]+/[^/]+$/|) { printf STDERR "$0 zoneinfo directory is not found."; exit(-1); } $ZoneinfoDir = $1; Dprint "ZoneinfoDir ($ZoneinfoDir)\n"; }
#--- Create file list foreach my $arg (@ARGV) { my @matchs_complete = (); my @matchs_partial = (); my $sout = ""; if ($arg =~ m|/|) { #-- Asia/Katmandu if (-f "$ZoneinfoDir/$arg.ics") { push(@matchs_complete, "$ZoneinfoDir/$arg.ics"); } @matchs_partial = glob("$ZoneinfoDir/${arg}?*.ics"); } else { #-- Katmandu @matchs_complete = glob("$ZoneinfoDir/*/$arg.ics"); @matchs_partial = glob("$ZoneinfoDir/*/${arg}?*.ics"); } Dprint "Complete: (@matchs_complete)\n"; Dprint "Partial : (@matchs_partial)\n"; foreach my $zfile (@matchs_complete) { $sout = GetLocalTimeString($zfile); print "$sout\n"; } foreach my $zfile (@matchs_partial) { $sout = GetLocalTimeString($zfile); print "$sout\n"; } }
exit 0;
#--- sub GetLocalTimeString { my ($zf) = @_; my $srtn; open(IN, "<$zf") or return ""; my @czf = <IN>; close(IN); my ($tzsign, $tzhour, $tzmin, $tzname) = ("", "", ""); foreach (@czf) { if (m|TZOFFSETTO:([+-])([0-9]{2})([0-9]{2})|i) { ($tzsign, $tzhour, $tzmin) = ($1, $2, $3); } elsif (m|X-LIC-LOCATION:(.+)|i) { $tzlocation = $1; } elsif (m|TZNAME:([a-zA-Z]{3})|i) { $tzname = $1; } } Dprint "($tzsign, $tzhour, $tzmin, $tzname)\n"; if (length($tzhour) <= 0 || length($tzmin) <= 0 || length($tzsign) <= 0) { return ""; } my $lc_time; if ($tzsign eq "-") { $lc_time = $gm_time - ($tzhour * 60 + $tzmin) * 60; } else { $lc_time = $gm_time + ($tzhour * 60 + $tzmin) * 60; } Dprint "($gm_time, $lc_time)\n"; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($lc_time); if ($isdst) { #-- The aria supports summer time. ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($lc_time + 60 * 60); $tzlocation .= " (ST)"; } $srtn = Fmt($mon + 1, 2) . "/" . Fmt($mday, 2) . " $WeekdayName[$wday] " . Fmt($hour, 2) . ":" . Fmt($min, 2) . ":" . Fmt($sec, 2) . " " . ($year + 1900) . " $tzname " . "$tzlocation";
return $srtn; }
#--- sub Fmt { my ($nbr, $kta) = @_; return sprintf("%0${kta}d", $nbr); }
因みにzoneinfoがあるディレクトリは/usr/share/zoneinfoだと思いますが、これがなかった場合、あるいはあってもVCalendar形式ファイルがなくTZifのバイナリファイルだけの場合には、システム中からlocateで捜します。evolutionの下にあったりするようです。
2010年 1月 11(月曜日)
XCalendar.hol 2010年版さすがに、もう使っている人もいないのかもしれませんが、LinuxとかBSDの X11用のカレンダーソフト"xcalendar"の2010年用の祝日設定ファイルxcalendar.holです。"/usr/X11R6/lib/X11/xcalendar/xcalendar.hol"にコピーして使います。(本当は"/usr/X11R6/lib/X11/ja/xcalendar/xcalendar.hol"のほうが良いような気がしますが、こちらに置くと動作しませんね)
2009年 10月 7(水曜日)
Apacheの高速化: eacceleratorとmod_perlWebで動的なページを作るとき、私は通常ページはPHP、CGIにはPerlを使っています。これらの処理が遅いと思ったことは特にないのですが、各々を高速化するソフトウェアがあります。私が書いているコードは大した行数ではないので効果は薄いかもしれませんが、PHPで書かれているserendipityには多少なりとも効果があるかもしれないと思い、導入してみることにしました。 PHPの高速化eacceleratorの設定eacceleratorというものがあるのを最近知りました。Apacheには元々PHPのインタープリターが組込まれているので、特に高速化手段はいらないものと思っていましたが誤解であったようです。仕組としては、コンパイル済みコードをメモリ/ハードディスクにキャッシュしておくようです。(PHPも実行時コンパイルする仕掛だったのですね) ソースはEacceleratorのプロジェクトページから取得することができます。 cd eaccelerator-0.9.5.2/ export PHP_PREFIX="/usr" /usr/bin/phpize ./configure --prefix=/usr --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man \ --enable-eaccelerator --enable-shared --enable-static make
しかし、何故かphpizeでエラーします。以下のように"/usr/bin/phpize"を修正します。色々インストールしていたからでしょうか。phpizeを修正してから、再度実行します。 6,7c6 < #phpdir="`eval echo /usr/lib`/build" < phpdir="/usr/lib/php4/build" --- > phpdir="`eval echo /usr/lib`/build make install ls -la /usr/lib/php4/ mkdir /var/cache/eaccelerator chown apache.apache /var/cache/eaccelerator chmod 700 /var/cache/eaccelerator cp eaccelerator.ini /etc/php.d/ cp control.php /var/www/html/usage/ #-- 適宜場所を変えて下さい /etc/rc.d/init.d/httpd restart
httpdのrestartの前には、"/etc/php.d/eaccelerator.ini"を編集しておきましょう。 eaccelerator.cache_dir = "/var/cache/eaccelerator" eaccelerator.allowed_admin_path = "/var/www/html/usage/" #-- 上記設置場所に
動作状況は、http://yourhost/usage/control.phpをアクセスすると表示されます。(この画面から設定もできるようです) Perl CGIの高速化: mod_perl通常PerlはCGIとして動かされています。つまり、別プロセスとして起動したperlによって処理されています。 mod_perlはこのインタプリタをapache組み込みにするものです。従って、プロセス起動のオーバーヘッドを短縮することができます。 mod_perlは各ディストリビューションで配布されていますので、インストールして下さい。 perlスクリプトは、通常のCGIとは共存できないようですので、cgi-binのディレクトリとは別に用意します。(例 /var/www/perl)。 このとき、/etc/httpd/conf.d/perl.conf に以下を追加します。 Alias /perl /var/www/perl <Directory /var/www/perl> SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders Options +ExecCGI </Directory> これで設定は完了です。httpdを立ち上げ直せば動作します。以下の"hello.cgi"を置くとmod_perlのバージョンが表示されます。 #!/usr/bin/perl -w print "Content-type: text/html\n\n"; $s = <<EOL; <html><head><title>Hello CGI, mod_perl</title></head><body> Hello, CGI !!<br/> MOD_PERL=$ENV{'MOD_PERL'} </body></html> EOL print "$s\n";
しかしながら、cgi-binから/var/www/perlにCGIを移動しただけでは、簡単には動作しないようです。 まず、ライブラリのサーチパスが変わってしまい、カレントディレクトリは含まれません。これに対しては、 "use lib '/var/www/perl'; " を頭に挿入して対処しました。 しかしながら、CGIの中で使っているライブラリの中でエラーしてしまうため、動きませんでした。(環境のせいでしょうか) 効果や考察などさて、効果ですが、計測していません。eacceleratorのほうは動いていて、遅くなることはなさそうですのでそのまま使っています。特にエラーも出ていないようです。 mod_perlのほうはちゃんとは動いていないので、使うことができていません。くやしいので少し考察してみました。 ラフな見積もりとして、空のプロセスを立ち上げて実行時間を計ってみます。 localhost$ time for i in `seq 1 1000`; do ./bar; done real 0m0.629s user 0m0.160s sys 0m0.450s localhost$ time for i in `seq 1 1000`; do true; done real 0m0.012s user 0m0.010s sys 0m0.000s
ここで、"bar"はmain(){exit(0);}だけのプロセスです。trueはbashの組み込みコマンドなので、プロセス起動コストの大まかな評価としてはこれで良いでしょう。 これで見ると、プロセス1個の起動に掛かる時間は大体600μ秒くらいでしょうか。とりあえずは、問題のないオーバーヘッドと思われます。アクセスが極度に多いサーバ、かつ、一回のCGIで行っている処理が軽い場合には無視できないかもしれません。
2009年 10月 4(日曜日)
dcdのパッチその2数日前にdcdのパッチを掲載しましたが、更なる変更を加えました。複数のCD ROMを使えるようにする目的でオプションを追加したパッチdcd-0.99.2-2.patch.gzを作成しました。 パソコンに2台以上のCD ROMやDVDのドライブが付いている場合、デバイス名で使い分けることになります。音楽CD(CDDA)の場合は、どのドライブでも再生できるわけですから、dcdでもデバイス指定して動作させたいところです。しかし、元々はビルド時に指定できるだけでしたので、コマンドラインオプションを追加することにしました。オプションは"-D デバイス名"です。 プログラムの構造とコンフリクトがあり、変更が少し大きくなってしまいました。その上、両方同時に再生するのには問題が残っていて、2番目に再生するドライブで"dcd s"としても同時再生できません。これは、常駐プロセスが1台のみ管理することを想定しているためと思われます。しかし、同時再生してミックスして聴く必要は通常ないと思いますので、対応はしないことにしました。
2009年 10月 1(木曜日)
dcdのインストールとパッチLinux/BSDにdcdというCDプレイヤーがあります。それのコマンドラインでのプログラムモードを可能にするパッチです。 PCのCDプレイヤー今迄gnome-cdを使っていましたが、プログラムモードがない(≒プレイリストが作れない)ことに不便を感じていました。 そこで、workmanというものをインストールしてみたのですが、こちらはいちいち1トラックずつプレイリストに登録して行かなくてはならなくて面倒臭いです。 というのも、私は単に一部のトラックを連続で聴けるように設定したいだけで、好きな順序に並べたいわけではありません。クラシック音楽のCDでは1枚に複数の曲が入っていて、かつトラックは楽章毎に振られていることが多いため、ある1曲を聴くためには、トラック3,4,5を連続で再生する、ということが必要になるからです。 据え置き型のオーディオCDプレイヤーには必ず「プログラム」モードがあって、カレンダーボタンで簡単に操作できます。この辺りの操作はWindowsのMediaplayerやUbuntuのRythmboxのプレイリスト機能でも許容範囲なのですが、それでもリストからマウスで選択して行くのはやはり面倒です。 dcdのインストールDave's CD playerというCD playerを見つけました。 ダウンロードはこちらからできます。 これはCUIのCDplayerです。似たようなプロダクトにcdplayがありますが、ずっと高機能です。これはコマンドラインでトラックリストを渡すことができるため、希望している機能に近いようです。 しかし、どうした訳か、単純に"dcd 3 4 5"のように再生することができません。"dcd 3 4 5 quit"や"dcd loop 3 4 5"のようにはできます。"dcd start 3 4 5"ができないのは仕様としても不思議です。 そこで、少しイジってみました。このパッチdcd-0.99.2-1.patch.gzで、以下の処理を加えました。 localhost% dcd 3 5 7 トラック3,5,7を連続で再生してから、再生を止める。 localhost% dcd 3-5 連続したトラック3,4,5を連続で再生してから、再生を止める。
これで快適。しばらく、こちらを使ってみようと思います。
2009年 9月 16(水曜日)
Windows VistaからWindows 7へのアップグレードMSDNでWindows 7の商用版(RTL)がダウンロード可能になっていましたので、開発マシンのWindows Vistaをアップグレードしてみました。基本的にVistaからのアップグレードインストールには問題はありません。動作がキビキビするようになって快適になりますのでお勧めすることができます。 しかし、他には変化はあまり感じられません。そう考えると、製品名を変えて課金するだけの価値があるものなのかという疑問も湧きます。マイクロソフトの開発陣ともあろうものが2年半の歳月を掛けて、GUIのチューンナップしかできなかったのでしょうかねぇ。 インストール状況アップグレードはWindows Vista UltimateからWindows 7 Ultimateで行いましたが、インストール自体は自動で完了しました。 問題らしい問題は2点程。1つはオンボードのサウンドチップ(VIA VT1612A)の認識ができなかったことです。これは、Vistaで動いていたドライバーを入れたら大丈夫でした。もう一つはマウスの設定ユーティリティの"IntelliPoint"がアップグレードしただけでは動かないことです。MSのサイトに行って最新版(7.0)を落としてきてインストールします。<<http://www.microsoft.com/hardware/download/download.aspx?category=MK>>。英語版と言われますが、表示は日本語になっています。 雑多な問題点私は所謂XMouse機能を使っていますが、これ自体はVistaのときと同じく、"コンピュータの簡単操作"で設定することができます。しかし、GUIのレスポンスが向上したためか、AutoRaise機能(マウスを入れて選択したウィンドウが自動的に前面にポップされる)が速すぎて使い難くなってしまいました。これはUNIX系では通常delayを設定できるものです。この遅延設定は以下のレジストリで設定できました。"HKEY_CURRENT_USER\Control Panel\Desktop\ActiveWndTrkTimeout"、単位はミリ秒です。注意点としては、同じパスに"ActiveWndTrackTimeout"という紛らわしいキーがあることです。多分開発途中で不要になったのでしょうがリリース前には整理して欲しいですね。 システムからAcrobat Readerが何かエラーを出していると報告されます。解決するにはアップデートしろと言われますが、自動アップデータ(実体はインストーラAdbeRdr910_ja_JP.exe)では"AdbeRdr910_ja_JP.msi"でネットワークエラーが起りました、と言われて失敗してしまいます。ネットを調べたところ、MSIファイルを直接ダウンロード<<http://ardownload.adobe.com/pub/adobe/reader/win/9.x/9.1/jpn/AdbeRdr910_ja_JP.msi>>して、「ない」と言われているフォルダに置けばインストーラが先に進むようになります。ja_JPのmsiの抽出に失敗しているようです。 試験環境をVirtual PCで構築していますが、インストール後には"Virtual Machine Network Service"に対応したNICがないと怒られてしまいます。そこで、"ネットワークと共有センター"の"ローカルエリア接続"にサービス"Virtual Machine Network Services"をインストールします。しかし、途中で"VMNetSrv.sys"がないと言って止まります。これは、"WINDOWS\system32\DriverStore"の下にありますので、それを指定すれば無事完了させることができました。 どういう訳か、Windows 7の"ファイルの検索"機能を使うとこのファイルが見つかりません。何かの設定が必要なのかもしれませんが、いきなり「見つかりませんでした、終了」みたいになってしまうと、本当にないのかと思ってしまいます。なんだかなぁ。私は、Cygwinのfindを使って見つけました。 状況が今一掴めていませんが、時々画面解像度が1024x768になってしまいます。実際のディスプレイは1280x1024でして、PnPディスプレイを再認識させると直ります。この過程で、画面上に置いたアイコンがグチャグチャな順番になってしまいますので、かなり迷惑な仕様(もしくはバグ)です。もしかすると、ディスプレイが繋っていない状態で起動すると、設定をリセットしてしまうのかもしれません。(ディスプレイ切り替え器を使っています)。これはVistaでは問題ありませんでしたし、自動認識できなければ設定をそのままにすべきですよね。 結論アップグレードインストール自体は比較的すんなり行きます。費用を考えなければ、全般的には軽くて快適になるのでアップグレードしたほうが良いと思います。しかし、これがアップグレードだけで27,000円と言われると必要ないかなぁとも思ってしまいます。 問題があるとすれば、Windows XPからのアップグレードが用意されていないことでしょう。Vistaを我慢していたユーザをバッサリ切り捨ててしまっています。しかしながら考えてみると、Vistaにしなかった/できなかった人の場合、マシン性能上の問題も大きかったと思いますので、どうせハードを新規に買うからイイダロと思っているのでしょうか。 おまけ:ハードウェア要求についてハードウェア要求について注意点を少し書いておきます。基本的にはVistaと同じになります。 一番問題なのはVGAで、DirectX 9のサポートがないとAeroが動きません。オンボードのチップセットでは、intel 945以降になります。広く出ている 845, 865はおろか、915でも不足です。CPU種類で言うと、Socket478は全滅、Socket775で945からです。単体カードのほうは、nVidiaのGPUではGeForce FX5200以降、Radeonは9500以降。nVidiaは良いとして、ベストセラーのRadeon 9200で動きません。 サウンドは、チップセット付属のものは大体大丈夫(上記のようになんとかなるレベルも含む)ようです。単体カードのほうは、性能というよりもドライバが提供されるかどうかが鍵になっています。メーカの多くが弱小のこともありサポートが打ち切られているものが殆どであるため、古いのはほぼ駄目と考えなくてはなりません。中でも問題なのはCreative Labo.で、Sound Blaster Live Value以前のドライバ更新を提供していません。マイクロソフト製のがありますが、少なくとも私のカードでは音が歪んで使い物になりませんでした。 CPUは、Pentium4 2.4GHzレベルで充分、メモリはDDR333が1GBあれば問題なしのようです。
|