ogginfo が日本語タイトルで常に ### に化ける
mp3, vorbis プレイヤーとして、gqmpeg を愛用しているのだが、
vorbis でエンコードしたファイルの曲名がいつも '#' で埋められているのでおかしいなあ、と。
gqmpeg のソースを読んでみると、
ogginfo の出力をパイプで読んでいるだけのようだ。
そこで、
$ ogginfo foo.ogg
とすると、タイトルが '#' で埋められている。
で、vorbis ファイルを直接読んでみると、
やっぱり '#' で埋められてる。
vorbis のファイルは abcde エンコードしており、こいつは内部で oggenc を使っているので、
結局のところ vorbis-tools のロケールまわりに問題があるらしい。
ざっとコードを見るに、
文字コードの変換は share/utf8.c で行っているんだけど、
config.h をインクルードしてないのが原因だった。
share/iconvert.c も同じく。
というわけで、以下のファイルを ports/audio/vorbis-tools/patches 以下に投入。
patch-share_iconvert_c
and
patch-share_utf8_c
Citrus なしの OpenBSD の場合、環境変数 CHARSET を設定すべし(EUC-JP とか)。
Citrus 環境下では nl_langinfo(CODESET); されるのでロケールから自動設定される。
というわけで解決。
てか、config.h が無かったら、
utf8.c も iconvert.c も何もしないコードしか出力されないんだけど。
誰もテストしてないのかよ!なんだかなあ。
ところで、FreeBSD も NetBSD も対策をしてないようなので、
このパッチは有効みたい。未確認。
pccts 入門その 2
LL(1) で解決: ch3-03p2.g
expressions
: expr ("="^ expr )* "\n"
| "\n"
;
のようにすればよい。この場合、左辺を確定した後で右辺のマッチに入るので曖昧にならない。
ただし、この場合は、
1+1=3
も文法的に正しくなる。ので、木を評価するときに左辺をチェックする。
今回はそのまま出力するだけなので、上の式だと '3' を印字する。
そういえば、一部のパターンマッチの機構を持つ言語だと確かに上の文法もアリだ。
なるほどなるほど。
pccts 入門
LL(k) parser generator の pccts について少しだけ。
私が教えてあげるわけじゃなくって、私が入門。
つうか教えてくれ。
lexer/parser
と聞いてピンとこない人は、
http://www.okisoft.co.jp/esc/whitepaper.html
こちらの「開発」はおもしろおかしくディープなこと書いていらっしゃるし、書籍なら、
Nutshell の Lex & Yacc
あたりを読めば、lexer と parser でどんなことができるのか、
ひととおりは分かるようになるんじゃないかなあ
(ちなみに yacc は LALR parser generator)。
って、日本語訳版は絶版になってるのか。
知らなかった。
続きを読む ...
xipmsg-8088 のパッチとか
xipmsg のパッチをやっつけで書いた。
ipmsg もいろいろあるけど、結局これに戻ってしまうなあ。
日本語で abcde を使う
http://d.hatena.ne.jp/...
押し売りをしてしまったので、責任を取ってまとめ。
abcde とはコンソールベースの CD リッパー、エンコーダ。
非常に手軽に使えるので(ほとんど Enter 押すだけ)、
HDD の肥やしの大量生成を可能にしてくれる素敵なソフトである。
で、もちろん日本語での細かい事情なんて知らないので、
そのままだと日本語タイトルの CD のエンコーディングはうまくいかない。
abcde 自体はシェルスクリプトなのでまあ問題はない(SJIS なファイル名とかでなければ)。
OpenBSD だと e?grep がマルチバイトを通さないので、
# cd /usr/ports/audio/abcde
# make extract
# cd w-abcde-2.2.0/abcde-2.2.0
# perl -i -p -e "s/grep/grep -a/" abcde cddb-tool
-a オプションで無理矢理対応。
次は日本語 EUC で返す CDDB を ~/.abcde.conf にセット。
CDDBURL="http://freedbtest.dyndns.org/~cddb/cddbeuc.cgi"
あとは id3 の SJIS 強制変換パッチを作成したので当てる: (id3-0.12-id3.c.diff)。
これで EUC のファイル名、id3tag が SJIS の mp3 ファイルが作成されるはず。
余談だけど、id3 はジャンルに Japan Rock が存在しないので Jpop あたりで編集し直さないといかん。ううむ。