GNU coding standards (February 20, 2004.) 4.3 Formatting Error Messages
source-file-name:lineno: message
などの形式とする。
仕事をしているとやはり、MS Word のファイルが送られてくる。 できるだけ、他の形式に変換して送ってもらっているのだが、時間がない時はそうもいっていられない。ので、以前から耳にはしていた MSWordView 0.5.2 をいれてみることにする。
$tar zxvf mswordview-0.5.2.tar.gz $cd mswordview $./configure $make #su #make install
また MsWordView は日本語文書を UTF-8 で出力する。 Web で調べるとコード変換に tcs を使っている人が多いので、 これもいれておく。
$uncompress tcs.shar.Z $/bin/sh tcs.shar $make $regress
エラーメッセージがでなければ o.k.
$su #cp tcs /usr/local/bin #cp tcs.1 /usr/local/man/man1
では実際に変換してみよう。
$mswordview -o - test.doc | tcs -f utf -t ujis | sed s/charset=utf-8/charset=EUC-JP/ > test.doc.html
とすることで test.doc を test.doc.html に変換する。 ここでは mswordview の変換結果を標準出力に出すようにして、tcs で日本語 EUC に変換、META タグで指定されている文字コードセットを sed で書き換えている。
仕事で受け取ったファイルを変換してみたところ、図らしきところが一部みれないようだが、いい感じだ。 MS Word でどう見えるのか知らないのでこれ以上評価はできないが、テキストベースのものなら十分これで済みそうだ。
#!/bin/sh /usr/local/bin/mswordview -o - "$@" | \ tcs -f utf -t ujis | sed s/charset=utf-8/charset=EUC-JP/
というスクリプトでも書いておけば便利であろう。
今回は、scanf による入力と if 文の学習。
「年齢を入力させ、その値から車の免許が取れるかどうかと酒を飲めるかどうかのメッセージを出力するプログラムを作れ。」
質問の内容が、操作からコンパイルエラーについてに変わってきた。 やっと、学生も操作になれてきたということか。 まだ、プログラム内容についてはついてきているようだ。 そのうち、どうプログラムを組んでいいかわからなくなってくる学生が増えてくるところか。
変数宣言が関数(ブロック)の先頭になければならない事は授業で説明されただろうか。指定のテキストでは明確にその点について記述されていないため、学生が間違えるのもしかたないか。
「MA1(えむえーわん)」と呼ばれている人がいたが彼は一体?
昨日 Solaris 8 に入れようとしたアプリケーション、セットアップで
To ensure the smoothest evaluation experience, we recommend that you have a valid DNS DomainName.
とでてアボートしていた。 なので、テスト用 DNS サーバたててドメイン名をひけるようにした。 が。アボート。
セットアップスクリプトをよくみてみたら、`domainname` の結果が空だとアボートさせている。 ??? domainname って NIS ドメイン名で DNS とは関係ないと思っていたんだけど。 今は違うの? とりあえずエラーメッセージに騙された感じ。
domainname コマンドでドメイン名を指定し、/etc/defaultdomain に同じ名前を書いておく。 で、再度セットアップしてみたらすんなり通ってしまった。 がっくし。 まぁ、djbdns の使い方覚えたからいっか。
PDLを使ったPerl数値処理プログラムによりインタラクティブ性が求められるようになってきたので、一部をCで書いて高速化する事を検討。 問題は Linux でも Windows + ActivePerl でもすんなり動くかどうか。
とりあず PDL::PP のサンプルから sumit 関数あたりを MathEx.pd に書いておく。
Foo::Bar パッケージの中の Foo::Bar::Math の一部を Foo::Bar::MathEx に移して、C extension 化したい。 ということで lib/Foo/Bar/MathEx.pd として、Makefile.PL の各種設定をしてみる。
がどうもうまくいかない。 PDL::PP の Makefile.PLサポートは、Makefile.PL と同じ位置に .pd がある事を想定しているようなので、いろいろと小細工をしなければならない。 一方 Perl の XS は Foo::Bar のベース名から Bar.so を作る前提になっているようで、これまたパッケージの中の一部のモジュールをどうもXS化しにくい。
Perl の ext/SDBM_File を真似て、子 Makefile.PL を使ってみることにした。
Foo-Bar-x.xx | +- Makefile.PL | +- lib | | | +- Foo | | | +- Bar.pm | | | +- Bar | | | +- Math.pm | | | +- MathNoEx.pm | | | ... | | +- blib/... | +- MathEx | | | +- Makefile.PL | | | +- MathEx.pd ...
パッケージディレクトリの下に MathEx ディレクトリを作り、そこに Makefile.PL と MathEx.pd を置く。 Makefile.PL は MathEx.pd 専用になるので、PDL::PP の標準的なものでOKになる。
全体のパッケージング・PPM化・インストール等が面倒にならないかと心配したが、Foo-Bar パッケージ化で perl Makefile.PL、make xxx を実行すれば子Makefile.PLまできちんと面倒をみてくれる。 MathEx 以下でビルドしたものもパッケージの blib に一緒に入れてくれるし(=一緒にインストールできる・PPM化できる)。 逆に make dist の際には子Makefileの方は余計なとりまとめはしないで、親Makefileが一括して tar.gz に入れてくれる。 これはよい。 MathEx.pd もきちんと Foo/Bar/MathEx.so になった。
XSが使えない環境のために、PerlとPPの両方で関数を書いておく。 XSが使えれば MathEx を、使えなければ MathNoEx.pm を使うように。 表向きのAPIは Foo::Bar::Math とし、ここで AUTOLOAD を使ってどちらか一方を呼び出すようにする。 間接呼び出しにして遅くなるのはいやなので、シンボルテーブルを直接設定する。
use vars qw($IMPLEMENT_CLASS $AUTOLOAD); BEGIN { $IMPLEMENT_CLASS = 'Foo::Bar::MathEx'; eval "use $IMPLEMENT_CLASS"; if ($@) { warn "Can't load $IMPLEMENT_CLASS: $@"; $IMPLEMENT_CLASS = 'Foo::Bar::MathNoEx'; eval "use $IMPLEMENT_CLASS"; die $@ if $@; } } sub AUTOLOAD { my $name = $AUTOLOAD; $name =~ s/.*://; my $implement = $IMPLEMENT_CLASS . '::' .$name; no strict "refs"; *{$name} = \&{$implement}; # ここでシンボルテーブル設定 return &{$implement}(@_); }
最初は、AUTOLOAD の最後の行で die したら、trap してエラーメッセージ中のパッケージ名(Foo::Bar::MathEx や Foo::Bar::MathNoEx)を呼び出された Foo::Bar::Math に置換して die し直すようにしようかと思ったが面倒なのでやめ。
使っているWindows BOX には Visual C++ 6 が入っているので、XSも問題なくビルドでき PDL extension もうまく動いた。
PPM化までここで済ませば、他のPCにも持っていけるはず。
これでバシバシPPで書けるわけだが、PPがこれまた難解で最初は苦労しそう。
2.01 で POSIX プラットフォームで動くようになった NSIS であるが、2.02、2.03 は Linux上ではソースパッケージからのビルドでエラーになってしまっていた。
1月5日に 2.04 がリリースされたので、こちらも試してみる。お、ビルドできた。
tar jxvf nsis204.tar.bz2 cd NSIS/Source make USE_PRECOMPILED_EXEHEADS=1 cd .. su ./install.sh /usr/local/NSIS-2.04
インストール時に Menu ディレクトリが無くてエラーメッセージが出るのは前回と一緒。CVS リポジトリをみるとHTMLで書かれたドキュメントがあるだけのようなので、無くても問題なさそうである。 付属の install.sh も改行コードが CRLF から LF に修正されているためそのまま実行できるようになった。
[ Linux 上で NSIS ]
私も大人であるから Word や Excel や PowerPoint のファイルのやりとりがあれば Windows BOX で読み書きしている(参考: Richard Stallman 氏に習う Word 添付ファイルの断り方)。
そしてメールに添付されてくるそれらのファイルは多くの場合、日本語ファイル名だったりする。 Linux 上の Mew 上で適当にASCII文字を使ったファイル名をつけて保存、Samba 経由で Windows BOX で閲覧するというのがいつもの流れだ。 しかし適当に名前をつけているので、すぐどれがどのファイルだがわからなくなる。
Samba で共有しているディレクトリ以下ぐらいは、日本語ファイル名のファイルを作ってもいいことにするかなぁ。
ということで環境設定。
これを機会に一気に UTF-8 化を促進するか。
LANG を ja_JP.eucJP からja_JP.UTF-8 に。 もともと locales では ja_JP.UTF-8 も生成済みだったので特に作業無し。
ターミナルソフトも去年 mlterm に乗り換えているので問題無し。
(set-default-coding-systems 'utf-8-unix)
default-file-name-coding-system も utf-8-unix になる。
3.0 系。
dos charset = CP932 unix charset = UTF-8 (default)
既に設定済み。
さすがに Bash 上で日本語ファイル名を打つのも面倒なので、何かファイルマネージャがあった方がいいな。 できれば Emacs っぽいキーバインディングで。 …… dired でいっか。
移行した。 pLaTeX のエラーメッセージとか、UTF-8端末だと読めないものもあるので多少の不便はあるものの大きな問題は今のところなさそうだ。
しばらくやってみる。
APT ラインが stable だったため中途半端に etch が混ざっているのが気になっているサーバがある。 セットアップした管理者がしばらく不在にしているので、アップグレードすることにしたが、やはりすんなりとはいかなかった。
Python を使っているパッケージより先にインタープリタが削除されたため、そのパッケージが削除できなくなった。
依存関係無視して一旦削除して、更新。
Dovecot はアップデートしたら、設定ファイルの項目が変わったのか、エラーメッセージを吐いてデーモンがあがらなくなった。 MySQL 使ってたり、いろいろ苦労して設定してたものなので、いじるのは危険。 sarge からパッケージ持ってきてダウングレード。
kernel も 2.4 から 2.6 へアップデートしたが、再起動したら md まわりでエラー。 RAID のところがそのままでは駄目っぽい。 慌てて元に戻す。
一旦 udev にしたのも hotplug に戻した。
こちらは、バーチャルホストといくつかのモジュールの有効化がリセットされてサイトが見られなくなっていたので、それぞれ有効化しなおして復帰。
今まで Windows ではそれほど Unison を使わなかったのと、自分では日本語ファイル名をつけないということで気がつかなかったんだけれど、Unison は Windows 上では日本語ファイル名処理に問題があるらしい。
Unison 2.27.57 で日本語ファイル名のファイルを同期しようとすると `The name of this Unix file is not allowed in Windows' というエラーメッセージが表示されることがある。 チェックは正規表現 "\\.*|aux|con|lpt1|prn|(.*[\000-\031\\/<>:\"|].*)" でしているらしい。 マルチバイト文字だとこれで誤認識されることがあるようだ。
パッチあててもいいけれど、Windows 上で Ocaml ビルド環境入れてとかちょっと面倒。 他のファイル同期ツール探すか、Linux 上で同期するかどちらかだな。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
nDiki は1999年1月に始めたコンピュータ日誌を前身とする Naney の Web 日記(兼パーソナルナレッジベース)です。
#nNote タグがついている記事は他の記事に比べて、より断片的・未整理・不完全なちょっとしたノートです。まだ結論に至っていない考えなども含まれます。頻繁/大幅に更新したり削除したりすることがあります。
ナレッジベースアプリケーション Obsidian で書いているノートの一部を notes.naney.org で 公開しています。
※内容は個人的見解であり所属組織とは関係ありません。