某日記

(後期)

平成16年10月21日(木曜日)

昨日

GLOBAL GARDEN(7) / 日渡 早紀」 「道端の天使(4) / 絵夢羅」 を読んで寝た。しかしそれにしてもよく死ぬ。

JIS Q 15001 講習。判例によれば個人情報は 15,000 円(うち裁判費用 5,000 円) らしい。

夕方

神保町。数学書を眺めてたら マンガでわかる統計学とな。オーム社よお前もか。

平成16年10月22日(金曜日)

昨日

しおんの王(1) / 安藤 慈朗, かとり まさる」 「Ns’あおい(2) / こしの りょう」を読んで寝た。

今日

駆逐艦 。 日本も対抗して B.A.R. ホンダの佐藤琢磨選手に出動を要請だ!

localedef(1)

そろそろやらんといかんかのう。まあ、難しいのは LC_COLLATE だけなんだが。

LC_COLLATE も localedef(1) に関して言えば大して難しくないが、 libc 側の実装がややこしいし、それにデータフォーマットが引きずられる。 ユニバーサルな照合を実装すると、そういう機能が必要のない locale では無駄が多くなるので、ここもプラグインにするのかな、まぁ。 とりあえず単一ウェイト 1-to-1 マッピングしかサポートしないモジュールの シングルバイト版とマルチバイト版は簡単なので書くとして、 それ以外はどうしよう。

その他の locale data に関しては、 大昔 Berkeley DB を使おうかと思ってた時期があったのだが、 iconv の時にソースを眺めてみて、あれは読み込み専用に使うにしては ちょっと重いことがわかったので、簡単な DB フレームワークを追加した。 これは ESDB とか *.alias.db とか *.dir.db とかに使われてる。 localedef にもそれが流用できるな。 Citrus の DB フレームワークは mmap して on-disk フォーマットのままで 扱えるように考えられた読み込み専用の hash 表になってる。 入れ子にもできる(はず)。 読み込み専用なのでエントリを追加したりするには一旦 dump しないといけないけど、locale のデータベースでエントリを 直接書き換える必要が生じることはまずあるまい。

確か大昔 yamt さんが書きかけてた localedef があるので、 少なくともパーサに関してはそれを流用するのがよさそうだな。

locdef-20010912.tgz というのが出てきたので見てみた。 collation element は multibyte 文字列に変換した後最長一致探索をかけてるが、 これって ISO2202 で困らないんだろうか。 しかしながら思ったよりはややこしくない模様。

平成16年10月25日(月曜日)

一昨日

某所サーバ交換のため宴会。川越線沿線は遠い。

昨日

ドトールでマターリ。

今日

モチベーションが起こらないがやっつけで仕事を一つ終わらせる。

ぐる

当然の疑問ですなぁ 。 アンチ名文パターン 「無用な複雑さの持ち込み」「論点不明瞭」「過度のもったいぶり」 あたりに引っかかってると見た。

アンチ名文パターンについて知りたい方は拙筆(岩谷某訳(予定)) 「アンチ名文パターン---文筆危篤患者の救出 / 民明書房刊」 をお読みください。発売日未定。

平成16年10月26日(火曜日)

昨日

お迎えです。 (3) / 田中 メカ」を読んで寝た。

メモ

日本河川図 。 一級河川の諸元と一級河川以外も含んだ分水界が書き込んである。 分水界フェチにはたまらない逸品。

飯盒

某所より 飯盒炊爨 1,590 件 vs 飯盒炊飯 2,390 件。 炊爨の方には飯炊きから炊事一般くらいまでの意味があるのに対して 炊飯では飯を炊く意味しかないので以下略。

飯盒の歴史

平成16年10月28日(木曜日)

昨日

dear(5) / 藤原 ここあ」 「機工魔術士-enchanter(6) / 河内 和泉」 「GET LOVE!!フィールドの王子さま(5) / 池山田 剛」 「天使じゃない!!(1) / しげまつ 貴子」 「天使じゃない!!(2) / しげまつ 貴子」 「天使じゃない!!(3) / しげまつ 貴子」 を読んで寝た。

不完全型のポインタと C++

C で opaque なオブジェクトへのポインタを定義したいとき、 void * を使うとなんでも暗黙のうちにキャストされてしまって 検出の難しいプログラミングエラーを招きやすくなるので、

struct __foo_tag;               /* 宣言だけで一切定義しない */
typedef struct __foo_tag *foo_t;
などとするのは常套手段。これは基本的には C++ でも使えるイディオム。 実体のない型でも、そのポインタ変数は自由に定義できる:
struct __foo_tag entity;        /* 許されない */
foo_t  pointer;                 /* 許される */

ところが C++ でこれでは困るケースがある。 例外処理まわりでは、不完全な型を使えないのは当然として、 そのポインタまでも禁止されてる:

void bar() throw (foo_t);       /* 許されない */
void
hoge()
{
        try {
                throw (foo_t)0; /* 許されない */
        }
        catch (foo_t ptr) {     /* 許されない */
                ...
        }
ただし、void * 系だけは例外的に使える。

これが問題になるようなケースでは、(1)void * に typedef するか、 (2)__foo_tag の本体のダミーを定義する:


もちろん一長一短があって、(1) だと foo_t 型の変数にどんなポインタでも キャストなしで代入できてしまうし(foo_t 型の変数値を他のポインタへ 暗黙のうちに代入することができないのは C よりもマシだが)、 (2) だと __foo_tag な変数を作られてしまうことを禁止できない。 まあ、(1) は意図せず起こりがちであるのに対し、 (2) は(タグの命名規則にさえ注意すれば) 意図せずに __foo_tag な変数を作ってしまうということはないだろうから、 多少美しさに目をつぶっても後者にするほうが無難だと思う。 

ちなみに元ネタは NetBSD の iconv_t がこのテクニックを使ってるせいで AbiWord がコンパイルできないという話なのだが、 「そもそも iconv_t を throw するのがポータブルではない」 という soda さんの指摘がもっともであろう。

平成16年10月29日(金曜日)

ナンシーより緊急連絡

下のコンビニに警官いっぱいキターーーーーーーーーーー!!

たぶん強盗。

災害関連

高山本線(高山駅〜猪谷駅間)バスによる代行輸送について 。 ううむ、こないだ行っておいてよかった。

平成16年新潟県中越地震 交通情報 。 臨時快速列車に用もないのに乗りに行くのはやめましょう。

山陰本線 運転再開見込み 。 明日始発から。ちなみに出雲号はたぶん今日まで伯備線経由。

秋やすみ / CooRie」 「ケンタッキー・フライド・ムービー」 「リマスター版 トップをねらえ!スクール・オブ・ロック / サントラ」 をポチっとな。