「英辞郎 第四版」CD-ROM版をUbuntuのsdicにインストール
ノートパソコンで英語辞書「英辞郎」を使ってみようかな、と思っていたら、ちょうど「英辞郎 第四版」が発売されたのでCD-ROM版を買ってみた。ノートパソコンはLinuxだったのだけど、ダウンロード販売版⊂CD-ROM版だろうと思って。
とりあえずEmacsのsdicから使おうと試す。
$ sudo apt-get install sdic sufary $ sudo apt-get install sdic-eijiro
…すみません、世の中を甘く見てました。CD-ROM版には、Linuxから見るかぎりでは、肝心のtext版辞書が入ってませんでした。
Building /usr/share/dict/eijiro.sdic ... /media/cdrom/eijiro/eijiro*.txt: No such file or directory
いまさらダウンロード版を買い直すのも負担なので、「スコスコ blog: 英辞郎 第四版をEBViewで使うの巻」を参考に、いちどWindowsにインストールしたあとtext形式でぶっこ抜いて、nkf -W16 -sでShift_JISに変換。そのうえで、sdic-eijiroを-plowでインストールしなおす。
$ cd /var/cache/apt/archives $ sudo dpkg-preconfigure -plow sdic-eijiro_2.1.3-15_all.deb $ sudo dpkg -i sdic-eijiro_2.1.3-15_all.deb
-plowの効果でtext版辞書のありかを聞いてくるので、ぶっこ抜いた辞書のディレクトリを手動で指定した。
ノートパソコンのファンが騒がしく回るのを聴きながら待っていたら、うまくいったっぽい。
VMware Player 2.5 Linux版は一発インストール
ちょろっと実験するときなどに、Ubuntu上でVMware Playerを使って仮想マシン環境を動かしている。
そのVMware Playerが2.5になったということでインストールしてみた。以下、メモ。
インストールがえらく簡単に
Linux版の2.0までは、ダウンロードサイトに.rpm版と.tar.gz版があり、Ubuntuでは.tar.gz版を選んでいた。が、2.5では.tar.gz版がない。かわりに、.bundle版というのがある。
これをダウンロードしてみた。さっそくファイルの正体をfileコマンドで調べてみる。
$ file VMware-Player-2.5.0-118166.i386.bundle VMware-Player-2.5.0-118166.i386.bundle: a bash script text executable
ときどきある、バイナリの頭にシェルスクリプトを付けた自己解凍形式のようだ。そこで、実行。
$ sudo bash VMware-Player-2.5.0-118166.i386.bundle
ずらずらとメッセージが表示されたあと、ダイアログが表示された。
なお、画面をキャプチャーするときのミスでダイアログのタイトルバーや枠が写っていないのはご容赦を。
ここで「install」をクリックすると、インストールが即実行されて、
何も聞かれずにインストール完了した。びっくり。
2.0まではコマンドラインだしコンパイラやカーネルヘッダーが必要だし、多くの確認項目を聞かれるしだったのだけど、ずいぶん楽になったもんだ。
bridge接続で無線LANが使えた
あと2.5でうれしいのは、仮想NICをbridge接続に設定していても無線LANが使えたこと。いままでは、有線LANにするか、仮想NICをNAT接続に設定するかする必要があった。これで、無線LANしかない場所でもLAN内から仮想マシンに接続できる。
Re: compact-number-list
bashで。引数→標準出力。
function compact-number-list() {
local i r prev=-2
for i;do
if ((i != prev + 1));then
print-range $r
r=''
fi
r="$r $i"
prev=$i
done
print-range $r
echo
}
function print-range() {
if (( $# > 1 ));then
echo -n "( $1 "
shift $(($# - 1))
echo -n "$1 ) "
else
echo -n "$1 "
fi
}
# test
echo -n '1 3 4 5 6 12 13 15 ->'
compact-number-list 1 3 4 5 6 12 13 15
# expects:
# 1 3 4 5 6 12 13 15 -> 1 ( 3 6 ) ( 12 13 ) 15
Re: コマンドラインで一ヶ月分のファイル名を作る
$ year=2008; mon=10; for i in $(LC_ALL=C cal $mon $year | egrep -v '[a-z]'); do printf "access_log.%04d%02d%02d\n" $year $mon $i; done
さ〜て、Perlやzshではどう書くんだろうか?
ネタふりをしてみる。
これいいですね。calの結果をほぼそのままforに食わせるというのがシンプルで確実。実用コマン道としてベスト解なんじゃないでしょうか。
以下、私がちょっとほかの方法を試行錯誤してみた、実用的じゃない例です。方法そのものはともかく、モジュールやコマンドの挙動は自分の勉強になりました。
Perlで
DateTime->last_day_of_month()で月末を求めてループする方法です。ワンライナーで使うには長い。
$ perl -MDateTime -e '$y=2008; $m=12; printf "access_log.%04d%02d%02d\n", $y, $m, $_ for (1..DateTime->last_day_of_month(year=>$y, month=>$m)->day)'
dateコマンドで
GNU系のdateに「1日の1か月後の1日前」を指定して月末を求める方法です。なんかまどろっこしい感じ。
$ y=2008; m=12; e=$(date -d "$y-$m-1 +1 month -1 day" +%d); for ((i=1; i<=$e; i++));do printf 'access%04d%02d%02d\n' $y $m $i; done
zshのzsh/datetimeモジュールで
strftime -r(Cのstrptime()相当)がどの月でも31日まで受け付けるので、その結果をstrftimeにかけて、翌月にならない日を表示する方法です。こんなややこしいことワンライナーでやりません。
% zmodload -i zsh/datetime % y=2008; m=12; for ((i=1; i<=31; i++));do strftime -r -s e %F $y-$m-$i || break; strftime -s d access_log.%Y%m%d $e; [[ $d == *$i ]] && echo $d; done
Re: コマンドラインで連番のファイル名を作る
$ for i in `perl -e 'printf("%0.2d\n", $_) for (1..27)'` ; do rm -f /usr/local/apache/logs/old/access_log.200801$i*.gz ; done
$ i=1; limit=13; while [ $i -le $limit ]; do j=$(printf "%03d" $i); echo access_log.200801$j; i=$(($i+1)); done
お二方のやりかたでまったく問題はないと思いますが、bashやzsh、kshであれば、算術forを使うのもアリかなと思いました。POSIX-shやBourne Shellでは使えませんが。
$ for ((i=1; i<=27; i++));do printf "access_log.200801%02d\n" $i;done
ちなみにseqかjotかという話を抜かすと、seqではこんな感じですね。
$ seq -f 'access_log.200801%02g' 1 27
修正2008-09-25: 自分のコードだけprintfまわりの冗長な部分を整理しました。どう見ても後出しジャンケンです、本当に(ry
追記2008-09-30: 言及やはてブで、zshでは「print -l access_log.200801{01..27}」でいけると教えていただきました。zshすげー。
DebianやUbuntuでXMLカタログを変更する
Debian的には上記の操作を/usr/sbin/update-xmlcatalogでやるのが正攻法らしい。後で調べる。
というわけで、RSS 0.91のDTDをXMLカタログに登録する操作を、DebianやUbuntuで用意されている機構でやりなおしてみる。このへんを参考にした。
DTDを置くディレクトリを作るところと、DTDをダウンロードするところまでは同じ。カタログは自分で作らずに、とりあえずDTDだけコピーする。
$ sudo mkdir /usr/local/share/xml/schema/rss $ wget http://www.rssboard.org/rss-0.91.dtd $ sudo cp rss-0.91.dtd /usr/local/share/xml/schema/rss
で、update-xmlcatalogを使って、/usr/local/share/xml/schema/rss/catalog.xmlを生成する。
$ sudo update-xmlcatalog --add --local /usr/local/share/xml/schema/rss/catalog.xml --type public --id "-//Netscape Communications//DTD RSS 0.91//EN" --file /usr/local/share/xml/schema/rss/rss-0.91.dtd
続いて、それを指す/etc/xml/rss.xml(パッケージというらしい)を生成する。update-xmlcatalogのソースを見るかぎり、--packageであれば、--idで指定した文字列はXMLカタログ中で「publicStartString」扱いとなるようだ。
$ sudo update-xmlcatalog --add --package rss --local /usr/local/share/xml/schema/rss/catalog.xml --type public --id "-//Netscape Communications//DTD RSS"
最後に、パッケージを指す大元の/etc/xml/catalogを変更する。やはりupdate-xmlcatalogのソースを見るかぎり、--rootであれば、--idで指定した文字列はXMLカタログ中で「publicStartString」扱いとなるようだ。
$ sudo update-xmlcatalog --add --root --package rss --type public --id "-//Netscape Communications//DTD RSS"
これで、前回とほぼ同じ結果になった、と思う。
RSS 0.9のDTDをXMLカタログでさしかえる
Plaggerで、今月に入ってからRSS 0.9のフィードのパースエラーが起きていたので、調べてみた。
の続き。
面倒なのでwiresharkで調べてみたら、libxmlのパーサーはDTDのURLに本当にアクセスしていた。へー。
避ける方法ぐらいあるんじゃなかろうかと思って、libxmlやXMLについて付け焼き刃で勉強してみた。どうやらXMLにはXMLカタログという機構があって、リソースの参照先を指定したり変更したりできるらしい。
というわけで、RSS 0.91のDTDの参照先を設定してみる。以下、Debianでの例。
まず、DTDとXMLカタログを置くディレクトリを適当なところに作る。
$ sudo mkdir /usr/local/share/xml/schema/rss
次にDTDをダウンロードする。
$ wget http://www.rssboard.org/rss-0.91.dtd
以下のようなXMLカタログを作る。ここではcatalog.xmlという名前とする。
<?xml version='1.0'?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<public publicId="-//Netscape Communications//DTD RSS 0.91//EN"
uri="file:///usr/local/share/xml/schema/rss/rss-0.91.dtd"/>
</catalog>
カタログとDTDをコピーする。
$ sudo cp catalog.xml rss-0.91.dtd /usr/local/share/xml/schema/rss
最後に、/etc/xml/catalogを編集して、<catalog 〜>と</catalog>の間に以下のような行を追加する。
<delegatePublic publicIdStartString="-//Netscape Communications//DTD RSS"
catalog="file:///usr/local/share/xml/schema/rss/catalog.xml"/>
とりあえず、PerlのXML::RSS::LibXMLのテストケースは通るようになった。
追記2008-09-21:Debian的には上記の操作を/usr/sbin/update-xmlcatalogでやるのが正攻法らしい。後で調べる。

