The Man Who Fell From The Wrong Side Of The Sky:2008年9月分

2008/9/1(Mon)

[NetBSD] debugging nvi-1.81.6(24bit wchar_t problem) その5

前回のつずき(原文ママ)。

#0  0xbbbdb12c in regexec () from /usr/pkg/lib/libvi.so.0
#1  0xbbbc09f2 in f_search () from /usr/pkg/lib/libvi.so.0
#2  0xbbb9f3a4 in ex_line () from /usr/pkg/lib/libvi.so.0
#3  0xbbb9f885 in ex_range () from /usr/pkg/lib/libvi.so.0
#4  0xbbbc7276 in v_exaddr () from /usr/pkg/lib/libvi.so.0
#5  0xbbbc7506 in v_searchf () from /usr/pkg/lib/libvi.so.0
#6  0xbbbceea8 in vi () from /usr/pkg/lib/libvi.so.0
#7  0xbbbb99e0 in editor () from /usr/pkg/lib/libvi.so.0
(以下略)

ふむ。

これregexec()を追うと、regex2.hのISWORD()マクロが悪さしちょるもより。

#define ISWORD(c)       ((c <= 0xFF && isalnum(c)) || (c) == '_')

これもwchar_t=signed int問題によって、cに負の値が入るとisalpha(3)はctype.hでは

#define isalpha(c)      ((int)((_ctype_ + 1)[(c)] & (_U|_L)))

ちゅうマクロなので_ctype_配列をindex out of boundsしてどかーんですにゃ。
げー。

patch更新、とりあえずこれでGB18030の4byteコードの入力と検索が動いてるもより *1
しかしUCHAR_Tにキャストするのは美しくないちゅうか移植性が微妙だなー。

そいやNetBSD 5では10年ぶりくらいにlibcのmajor crunkがあるというもっぱらの噂なので
wchar_tをtypedef intからtypedef unsigned intにするタイミングでもあるな。

それか、やぱしGB18030を31bitに収めるか、これはmklocale(1)に細工が必要。
いやまぁFreeBSDみたいにruneの値を直接書くでもいいのだが、それはごもっともだけど俺の考えは違(以下略
ただしこれzh_CN.GB18030/LC_CTYPEの互換性問題が出るのでやりたくないんだなぁ。

*1:相変わらずja_JP.ISO-2022-JPだと馬く動かない…つかxorgかuxtermのja_JP.ISO-2022-JPがおかしいっぽい。

[NetBSD] tech-userlevel

snscanf(3)いとかこわろし、これってfmemopen(3) + fscanf(3)でいいような希ガス。
いつものやつ、投げよかなどしよかな。

2008/9/2(Tue)

[NetBSD] いろいろ

fopenmemとかの話になったのでfmemopen(3)ネタ発射。
*_sの方はOpen Watcomのテストケース流用したんだが
dynamic interfaceの方は用意してないんだよなー。

nviで発覚したwchar_t=signed int問題、wchar_tをuint32_tにしようというネタは これだった。
これって現状GB18030だけで発生する問題(まぁISO2022でMOHTA bit使ってUnicodeサポートする場合もだけど)
なので、mklocale(1)いじって32bit目を落として我慢すべきだったと反省。

uxtermでja_JP.ISO-2022-JPの時コピペできない問題は放置して
PuTTY使ってテストすることにしたが、まずはlibcでISO-2022-JPダメなやつ(printf/scanf他)を
潰さないと阿寒のだな、これはまぁmulti-localeネタの一環でやるつもりだったので
ここまでのpatchをもっと真面目に書き直してaymeric氏に送りつけて完としよう。

そいやいつのまにまにless(1)って-Rでなく-rがデフォになったのだろ。
それとも昔からこうだっけ?

[NetBSD] いろいろ2

lib/39445ありがとうございます、これ4系にもpullupかけんとな。

あーあと先日のwcwidth(3)問題もpullupしとくか。

そいやi18n fold(1)の件もメールの返事2回目書かないと、もう2週間ぐらい放置してる。

nvi-1.81.6の問題がひと段落なので(まだメールしてないけど)、次はlocaleioか。

yamtさんがginsbach氏のlocaleioだと、setlocale(3)の度にLC_* dbを読んでは捨ててるので
(Citrus LC_CTYPEはキャッシュしてdisk accessを減らしてる)NFSの場合
性能が…と気にされてるのでmulti-locale実装の部分からlocale_template部
(setlocale.hの_locale_category_t)を先に導入しちゃおうかな。

ホントはmulti-localeごと突っ込めばいいのだけど
vfprintf/vfscanfなんかのmulti-locale versionを書くのがめどくて
5の枝切りに間に合いそうも無い。

あとはdb formatか、もうlocaledef(1)よりも優先順位上げてcitrus db使って
書き直しちまおうかな、toolchain問題はdb(1)的なツールを用意する *1ことで回避するとか。

LC_MESSAGESについては、例えばja_JP.eucJPでは

^[yYyYはハ].*
^[nNnNいイ].*

のよに、multibyte regex(3)必須になるのでそっちをどうにかせんと。

*1:そしてまたmanual書かずにwizd(8)に怒られる、と。
mkcsmapperとmkesdbのmanも用意しないとなー。

今日

ボトルが転位してクイズマスター福田氏が完全にクワァアック!したそうな。

Minolta X-700初期型がミラーアップしたまま突然死、とほほ。
修理するより中古買った方が安いのだが、屍増やすのもなんなので病院送りかねぇ。
今月お金ないので来月以降だな…

Kenkoからフォーカルプレーンで1/4000までいける KF-2NをMDマウント化したボディでねぇかな。
まぁあの安っぽい雑なボディとファインダーのままならいざ買うとなると二の足踏むかもしれんが。
SEAGULLのDF-300系は布幕1/1000らしいので、そんなら中古のX-700を探して買う罠。

[NetBSD] debugging nvi-1.81.6(mbrtowc usage)

CP932なファイルををLANG=ja_JP.eucJPで開いて
(つまりillegal byte sequenceが発生しうる状態で)hjklでキー移動してると
時々移動できなくなる上、その状態でキー連打すると落ちるな。

Program received signal SIGSEGV, Segmentation fault.
0xbbb89b65 in mbrtowc () from /usr/lib/libc.so.12
(gdb) bt
#0  0xbbb89b65 in mbrtowc () from /usr/lib/libc.so.12
#1  0x0804f40a in default_char2int ()
#2  0x0804f73f in fe_char2int ()
#3  0x0805034d in db_get ()
#4  0x080805ad in vs_line ()
#5  0x08082c7d in vs_paint ()

illegal byte sequenceが発生した場合の処理だろうかねぇ。
ちょっと調べる。

2008/9/3(Wed)

今日

なんでいきなり月初から金がないかというと、Minolta W.ROKKOR-NL 1:2.8 f=21mmを
ポチってまったちゅう、相場より大分高めだったけど玉数少ないんで頑張ってまった。
ってもSONY SAL20F28の1/3程度だけどNE。

外観はφ72mmちゅう大口径だけあってかなりエラそう、こわい。
ファインダー覗いてみると開放の場合周辺めちゃ甘め。
かなりのクセ玉の予感ガス、歪みもレトロフォーカスだからそれなり。

歪みが嫌ならビオゴンのコピー、W.ROKKOR-PI 1:4.5 f=21mmあるいは
W.ROKKOR-QH 1:4 f=21mmをゲットすべし、ただし周辺減光でるけどね。
このレンズの注意点は、ミラーアップ可能な機種でないと使えないので
SR系ボディが必要なのと、専用外付けファインダーが欠品してるのを掴まされないこと。
こっちは更に玉数少ないのでかなり高値だけども。
# それでもC Biogon T* 21mm F4.5 ZMよりは安上がりかw

あと先日ゲトしたMC ROKKOR-PG 1:1.2 f=58mmはさすがに普段持ち歩くには重いので
MC ROKKOR-PF 1:1.4 f=58mmもゲト、実は既に1本持ってたんだけど
後玉がカビによる腐食で状態悪かったのよな。

ちゅうか俺、このnviのバグ取れたら写真撮りに行くんだ…

[NetBSD] pkgsrc/converter/libiconv

うーん//IGNORE使うアプリはこのGNU libiconvの POSIX非準拠の動作
回避しようとして使ってるという理由が多いような気がする。

Citrusのiconv(1)

$ echo \\u3042ABCD | /usr/bin/iconv -s -f java -t iso-8859-1
?ABCD

んでGNU libiconv

$ echo \\u3042ABCD | /usr/pkg/bin/iconv -s -f java -t iso-8859-1         

リンク先にも書いた通りの理由で、変換が途中で止まってしまう、なので

$ echo \\u3042ABCD | /usr/pkg/bin/iconv -s -f java -t iso-8859-1//ignore 
ABCD

というようにして回避してんじゃないかなーとか。
本当に心から代替文字をsuppressしたいという理由ではないんじゃないかなと。
でもBruno氏は"useful"とか直す気なさそうだし困ったもんだ。

まぁ元々iconv(1)には-cオプションがあるにも関わらず、iconv(3)では
制御できないという元の仕様の方が腐ってるといえば腐ってるのかもしれない。

$ echo \\u3042ABCD | /usr/pkg/bin/iconv -cs -f java -t iso-8859-1
ABCD

-cと//ignoreは等価ですやね。

というわけで//IGNOREだけならCitrusでも-cの実装の為にある
__ICONV_F_HIDE_INVALIDフラグを使えば簡単に実装できそうなのだけど
//TRANSLITの方はおおごとなので(現在1:1変換しか対応してないiconvを
M:N変換可能にしなければならない)優先順位が低いのよなー。

というかLC_COLLATEの実装に必要なTrieがそのまま使えるはずなので
そっちが先かな。

というかGNU libiconvを完全にエミュレートしようとすると
これとか これもあってキリがないのよね。
特に後者、hook APIは内部UCS4前提だったりするので
Citrusには向かないんだよな、困ったもんだ。

つかどっからsubscribeするんだろ。

2008/9/5(Fri)

[NetBSD] いろいろ

dlopen() はあまりに低レベル、RPCなんかだと高レベル過ぎますしねぇ。

ebijunさんのNetBSD MLとfukaumiさんのとこのarchiveが私の脳内でidenticalでなかった orz

昨日

5日から本番稼動でしばらく籠の鳥なので景気づけにお好み焼き屋で飲み会。

家に着いたらなぜか入館証が真っ二つに割れてた、ふきつ、なにかいよかん。

荷物整理してたら前世紀に期限が切れてるポラロイドフィルムが5本ほど出てきた。
念写実験にでも使うかどうしよか。

メイプルソープといえばハッセルブラッドによる正方形フォーマット(6x6)だけど
これやっぱポラロイドから写真をスタートした人だからなんだろうな。

メイプルソープ撮影のジャケ写で有名なパティ・スミス(Patti Smith)の チャック全開伝説
これがパティ・スマイス(Patty Smyth, 別人)の方だったら
「パンクじゃないから恥ずかしくないもん!」で済んだはず。

スクエアなカメラ買ってメイプルソープ風エリンギの写真とか挑戦してみたい。

なぜか映画DMCなぞ観てきた友人のギタリストと

つーどうでもいい会話をしたりした。

2008/9/8(Mon)

[C] multi-locale

kbkさんに呼ばれたようなので 2つのvsnprintf_l

MSVCMacOS XもUlrich Drepper氏の Thread-Aware Locale Extension
ベースにmulti-localeを実装してますが、そもそもこの規格にはまだ
vsnprintf_lの仕様はまだ定義されてないのですよね。

要は両ベンダがおのおの勝手に拡張して整合性ががが、ちゅうことだと思います。

位置が違うのはあくまで想像ですが

ってとこだと思われます。

週末

両目を失明しかかったネコがにゃーにゃー悲しげ声をあげながらヨタヨタ歩いてる。
保護してやることもできない俺、ケビン・カーター状態ですわ。

残念ですがこれは道徳の授業でもフォークト=カンプフ検査でもありません。

本屋でノラ写真集なんちゅうものがようけ売っとるけども
あれは例えるに、戦場で撮った子供の笑顔だけ集めたようなもんで
ハゲワシと少女」にも似た、悲惨な場面は一切伝えてないやな。
ノラ達は常に病気に怪我、事故そして虐待による死と隣り合わせなわけで
今回のような場面に出くわすのはそう稀な事ではないからね。

まぁノラネコ写真撮る人はプチ戦場カメラマンの気持ちで挑んでちょ。

MC ROKKOR-PG 1:1.2 f=58mmの初期型げと。
絞りに若干油浮きあるのと、ヘリコイドの油抜けがあるものの
相場の半値以下で手に入った。レンズもきれいで黄変なし。

2008/9/9(Tue)

昨日〜今日

lib/39445に関連して、UCS/CP943の方もorder修正するの忘れてた。
まぁこっちはまず使うことはないと思われるのでpullupせんでいいかも。

pending-pullupsなんてPR stateあったとは(← …)。

網戸の建てつけが悪く、隙間から巨大なGそれもヤマトの極黒が進入してきて軽くパニック。
次発見した時は、AF100mm/F2.8MACROで美しいボケ味を生かして撮影してやる(やめなさい

Amazonから Control / Anton Corbijn 発送のお知らせ。
後は Joy Division / Grant Gee の日本盤が出るかどうかなんだけどな。

2008/9/11(Thu)

今日

メモ、 RubyでCitrus iconv APIを使うようになったのでなるべくなら壊さないように心がける。
まぁiconv(1)がどっちみち使ってるので、libcがmajor crunkしない限りABI保証しなきゃならん罠。

↑全然違う話だった、Citrus iconv API使ってないや。
ちょっと他界しろの男してきます。

階差機関ってハヤカワに版権移ったのか。

レムも気になったけど A Clockwork Orange 完全版だけ買ってきた、ウェ〜ルウェ〜ル。

Galaxie 500紙ジャケとか正気かよ、やめてーもう財布は空(以下略

コーンヘッドSONY α900発表、実売30万か。
視野率約100% + 倍率約0.74倍のファインダーは神いわゆるゴッド、ミノα9以上の出来とな。
シャッター耐久10万回と1/12000→1/8000のスペックダウンあたりが微妙っちゃー微妙だけども
ブツ撮り+ポトレ用途で未だフィルム中判6x7あたり使ってる人も
HORSEMAN LDのアダプタが出たら、デジ転してしまうかもな。

まぁ Adobe RGBカバー率100%のVAIO type A、こっちの方が売れるような気がしないでもない。
直前のリコール騒ぎがアレなんだけども。

kbkさんとこ
つps2pdf
Cygwinでghostscript入れれば入ってるかと。
正義については、そもそもこの規格自体がダメダメかなぁ。
やっぱしPOSIX localeもiconvも一度ゴミ箱行き(以下略

2008/9/12(Fri)

[NetBSD] tech-userlevel

replace 0xA0 to whitespace話。

そもそもNetBSDのC localeはISO646だからなぁ。
ソースをそれ以外の文字コードで書くっちゅうのは微妙だNE。
コメントだけUTF-8、リテラルはISO646にしとくってもチェックが手間になるし。

Cの規格としてはJISX0310の5.2.1あたりを読めば判るとおり、文字集合については

の2つが定められており、gccでは

ちゅうオプションがすでに実装されてたり。
動作としては

$ gcc --input-charset=eucJP --exec-charset=UTF-8 hoge.c

ちゅうのは

$ iconv -f eucJP -t UTF-8 | gcc -xc -

というようなイメージね、つまり文字(列)リテラルもeucJP -> UTF-8変換が行われる。

でもこの実行時文字集合を指定可能、ちゅうgccの--exec-charsetオプションは
ワイド文字(列)リテラル(つまりL接頭語)というものと喰いあわせが悪いのよね。
ほかほかごはんとアフラトキシンB1くらいのノリで。

ワイド文字(列)リテラルについては、JIS X3010の6.4.4〜6.4.5を読むと

処理系定義のその時点のロケールにおけるmbtowc/mbstowcs関数によって定義

とある、この一文を読むと「その時点」ってのはどこ?ちゅー疑問が涌くのだけど
まぁこれは直前に

翻訳フェーズ(7)において,
(中略)
結果の多バイト文字の並びは, 静的記憶域期間をもち,
(以下略)

とあるので、静的記憶域期間(=static)つまりプログラムの開始直前ですやね。

POSIX localeにおいては実行時のlocaleの切替はsetlocale(3)で行うので
ユーザが明示的に静的記憶域期間のロケールをきりかえることは出来ません。
つまり「この時点のロケール」ちゅうのはシステムのデフォルトなのであって
NetBSDの場合はC locale=ISO646であるわけのなのですよ。
つまりgcc --exec-charsetなんてコンパイルする人が自由に変更可能だとよろしくないわけで。

この問題に加えて、gccは(中略)なのでwchar_tは常にUCS4と仮定して
ワイド文字(列)リテラルをコンパイルしてくれやがります。

$ cat >test.c
#include <wchar.h>
int
main(void)
{
        printf("%#x\n", L'あ');
}
^D

$ gcc --input-charset=euc-jp --exec-charset=euc-jp -o test test.c
$ ./test
0x3042

$ gcc --input-charset=euc-jp --exec-charset=utf-8 -o test test.c
$ ./test
0x3042

実行時文字集合がeucJPだろうがUTF-8だろうが、どっちもU+3042ですやね。

以上のことを考えた上で、下のソース中のワイド文字列リテラルは

考えてみませう。

$ cat > test.c
#include <locale.h>
int
main(void)
{
	setlocale(LC_ALL, "ja_JP.eucJP");
	wprintf(L"あいうえお");
}

いやー本当に、C言語って、orzっですね。さいなら、さいなら。
つかEBCDICとか考えると、L'\0'以外は全て移植性(以下略

ちなみにMSVCの場合デフォルトロケールがCP932の上に、wchar_t=UCS2だから
ほとんどの人が意識していないと思われる。

まぁふつーgettext(3)なりcatgets(3)なり使ってi18n化するから問題ないのだけど。

んで、更にUnicodeリテラル、つまりU接頭語なんてものを導入すると
wchar_t != UCS4な実装だと(以下略

↑とは全く関係ない理由でragge氏がUTF-8にしよーよといってて全俺が泣いた。

ソースのコメントのi18n/m17n、javadocとかdoxygenのようなドキュメント生成まで考えると
もうplain text以外でやれ、という世界だよな。

まぁもうすぐ皆ピンク色の光線照射されてテレパシー使えるようになるから。

[NetBSD] Citrus iconv API

__iconv_{get,free}_list()は使ってるのですか、了解しました。

iconv -l相当もlibc interfaceには無いのがアレですな。
PortableにiconvのサポートするCES名一覧を取得するコードを書こうとすると
厳密にはsystem("iconv -l")しかないという(いちおうlスイッチはSUSv3以降で標準化されたので)。

まぁでも出力はunspecified formatなのでどっちみち解析するのに困るし
Solarisのマニュアルにはシェルスクリプト等で使うんじゃねぇゴルアとまで
書いてあったりするのだけれども。

そもそもiconv自体OO的にはevilなわけで、非推奨でまったくもって正しい希ガス。

//TRANSLITをサポートするなら WindowsBestFitもやらんとならんのかいな。

個人的には//NFCとか//NFDなんかは欲しいけど、//とかスイッチ化する気はないし
iconvの仕事かぁ?といわれると返す言葉がない。

突然思い出したTODO、CP936の0x80<->U+20AC問題、csmapperの方は

CP936EURO/UCS		mapper_zone	0x80-0x80:+0x202C
UCS/CP936EURO		mapper_zone	0x20AC-0x20AC:-0x202C
GB2312:CP936/UCS	mapper_parallel CP936EURO/UCS,GB2312EXT/UCS,GB2312/UCS
UCS/GB2312:CP936	mapper_parallel UCS/CP936EURO,UCS/GB2312EXT,UCS/GB2312

とかにすりゃいいのだけど、citrus_gbk2k.c側が0x80をEILSEQにしちまうので直す。
あーこれもsambaとかことを考えるとpullup必要だすな。

ところでCP54936ってGB18030のaliasにしてもおkなのだろか。
CP54932はCP936のスーパーセット、EURO記号が0x80(CP936) vs 0xA2E2(GB18030)と
異なる問題があるのだけども、なんかこれworkaround入ってたりするのかな。

2008/9/13(Sat)

今日

籠の鳥モード終了、今年は静かなもんだったな。

サンマを2尾半分ずつ切って焼いて、皿に盛りつけるときに
上下半身が正しい組合せかどうか判らなくなると非常に悔しい。

高価なアールグレイを買ったのだが勿体無いので
安売りのティーバッグに香りを移せないか実験中。

なんかいろいろやらんとならんことがたまってる。
てきぱき処理できないからこうしてudatsuがcan't risingなのだ。

しかもCP943の修正で2回もまちがえてcommitしてもた、かっこわるい。

2008/9/14(Sun)

[NetBSD] tech-userlevel

まだやってんのかUTF-8ネタ、しかも話がwsconsの方向に逸れててワロタ。

compiling-time locale問題、要するにeucJPロケールで起動したコンパイラは
ソース文字集合及び実行時文字集合をeucJPとして解釈してバイナリ吐く
というやつだけど、これだとsingle binaryでi18nを実現するのは
事実上不可能ちゅうことになってしまうのですよ。

だからPOSIX localeでは Portable Character Setちゅう概念を導入し
実行時文字集合はこのPCSとしてcompileし、setlocale(3)で
このPCSと互換性のある文字符号化手法(UTF-8やeucJP、ISO-2022-JPなど)
に切り替えることでsingle binaryによるi18nを実現してるわけでして。

先日書いた話で C/POSIX localeがISO646であることの理由はそれね。
だから--exec-charsetは勝手に変えちゃダメちゅーことで。
やるならsetlocale(3)含め、localeに影響される関数全て呼んじゃダメよ。

あと余談ですが、NetBSDはPCS=ISO646-BASICなので0x5C問題は無いゆえ
ja_JP.SJISロケールはOK(ISO646-BASICとShift_JISは互換)なのだけれども
(ただしSUSv3読むとPCSにはbackslashを含むとあるのが微妙...)
LinuxだとPCS=US-ASCIIなので、0x5C問題にひっかかるのでデフォルトではインスコされないし
localedef(1)でja_JP.SHIFT-JIS作ろうとするとわらわら警告でますな。

FreeBSDはPCS=US-ASCIIだけど、ja_JP.SJISロケールあるんだよな。
まぁなんも考えてないだけだとは思いますが。

2008/9/15(Mon)

れんきゅう!

秋口にもアレルギー性鼻炎の症状がでるようになってもた。
なんの花粉だー、ジュルリ。

多バイト文字に対するDFAこのへんですかねぇ、私は正規表現は

print "プギャー" if ($knowledge =~ m/9[^A]/);

な知識しかないのでこれ以上はすんません。

あと sscanf + %n、 integer overflowの問題を考慮するのならstrtol(3) *1に一票ですかね。
性能面でも、しょせんsscanf(3)も内部ではstrtol(3)呼んでることが多いですし。

完全に余談ですが、nul-terminateされてないbyte arrayだと
sscanf(3)どころかstrtol(3)も役に立たなくなってしまうのですが
_snscanfなんちゅう拡張がMSVCにはあるようでして
NetBSDにも入れようぜなんて話が。

私は利便性より移植性の人なので

void
test(const char *s, size_t n)
{
	int i;
	snscanf(s, n, "%d", &i);
	...
}

なんちゅうのよりも、めんどくさがらずに

void
test(const char *s, size_t n)
{
	char *s0;
	int i;

	_DIAGASSERT(s != NULL);
	_DIAGASSERT(n > 0);

	s0 = malloc(n + 1);
	if (s0 == NULL)
		abort();
	memcpy(s0, s, n);
	s0[n] = L'\0';
	sscanf(s0, "%d", &i);
	...
}

とcopyすりゃいいのにとか、メモリや性能がヤバイのであれば
すでに TR24731-2としてISO/IECに提案されてて
C1Xで標準化される可能性がわりと高いfmemopen(3)を実装して

void
test(const char *s, size_t n)
{
	FILE *fp;

	fp = fmemopen(__UNCONST(s), n, "r");
	if (fp == NULL)
		abort();
	fscanf(fp, "%d", &i);
	...
}

とすりゃいいのにと思ってしまったりするのですが、まぁ人それぞれ。

まぁ誰か責任持ってsnscanfをC1Xに推してくれるならそれでもいいけど。

*1:OpenBSD的にはstrtonum(3)、まぁNetBSD方面では フルボッコですが。

2008/9/16(Tue)

れんきゅう!!

満月の晩、モビー・グレイプのように月見団子うまうま。

NYCに長期旅行中の友人が Fender 50th Anniversary Jazzmaster Concert
に行ってきたそだ、うらやますい。

いーなーTom Verlaine(Television)観たかったな。

首長+撫肩、鶏を絞め殺すよな歌声がVerlaineそっくりといわれるが何の自慢にもならん。
つか最近ちょっと太ったのでThe Edge(U2)体型とかいわれた、あんなガチムチじゃないお。

他の出演は、Thurston Moore(Sonic Youth)がノイズ出しまくりで一人ヘヴン状態。
んでトリはJ Mascis(Dinosaur Jr)ナツカシす、マーシャルたーんと積んで爆音だったそだ。

Nels Cline(Wilco)が一番ウケてたって。Lambchopなんかのオルタナカントリー系か。
そいやLampchopは新譜出るみたい。

しかしJazzmaster使いは元気だけど、Mosriteをギャンギャン歪ませると
Fred "Sonic" Smith(MC5)、Johnny Ramone(Ramones)のように短命という不思議。

ちゅうかいつの間に CBGB & OMFUG潰れてんだ。

しかしCBGB Tシャツって、ちょと昔のDefJam Tシャツ状態でかっちょわるくて着れない。

Control限定版のおまけTシャツびみょー、どうせなら この柄にして欲しかった。
  _  ∩
( ゜∀゜)彡
 ⊂彡

Life On Mars観たいけど、スカパーどころかテレビ無い。よってDVD待ち。

2008/9/17(Wed)

[NetBSD] compiling-time locale

先日の話続き。

今現状なんの役にも立ってないCitrusの/usr/lib/i18n/lib*.a
なのだけれども、--exec-encoding=eucJPとかした場合、gccで"-lEUC_pic"とするようにして
C/POSIX localeのCES/CCSをeucJPに変更可能する、つまり実行時文字集合を明示的に
指定できるようにするといいかもNE。

ってもlib*_pic.aはNOPIC=YESなのでbuildされとらんのだけど。

現状でPOSIXのPortable Character Setとsetlocale(3)ちゅーi18n目的のkludge(ひどいいいぐさ)に
ISO-Cのソース文字集合/実行時文字集合ちゅーl10nのシカケがspoilされてるのもかっちょわるいやね。

ISO646以外が指定されてる場合はもうsetlocale(3)は必ず失敗するとかすりゃいいわけで。

まぁこんな作業の優先度は0に近いけど。
そんなことより牢に戻ってnviのバグを直す作業に戻るんだ。

今日

バスで空席に座ったら、隣の男が痙攣のよにガシガシ肩ぶつけてきた。
ケンカ売られるってやつ?やっぱしこういう時は「オメーどこ中だよ」というべきだったのかも。
BGMは Kick out the jamsby MC5 でお願いします、マダファッカ。

服装はバンダナ + サンダルが目を惹いたくらいで A.長渕 B.格闘 C.ラーメンの
三択のどれか、無害ちゅー Pattern recognitionだったのだけど、よくよく顔みたら
ボールペンで書いたような自己タトゥー(蜘蛛の巣?)を入れてたりして
まるで奇数番号リリースのようにunstableな人だた模様、これが地雷ってやつでしょうか。
つか誰のコスプレか元ネタ教えてくだちい >>識者

そもそも人相風体からwarningを感じる能力が著しく鈍いんだよな俺。
軽音サークル時代はイカレた格好の集まりなのに中身マトモてのがデフォだったので
どうにも麻痺してしまった感がある。

2008/9/19(Fri)

[m17n] String concatination

そもそもCES/CCSの異なる文字列同士が連結できるちゅー抽象化はありえんやね。
いくらSyntax Sugarったってコード変換ちゅうものをすっ飛ばして書けるちゅうのは
evil(=コード変換)の上にevilを重ねる行為でしかないわけでして。

なまじっかJavaなんかで文字列連結が

byte[] x = new byte[]{ 0xA4, 0xA2, 0x0 };
byte[] y = new byte[]{ 0xE3, 0x81, 0x82, 0x0 };

String X = new String(x, "EUC-JP");
String Y = new String(y, "UTF-8");
String Z = X + Y;

ちゅー感じで+演算子使って書けてしまうから勘違いする人が出てくるんだ、うん。
これってnew String()で明示的にコード変換が終わってるのですよ。
同じUTF16オブジェクトに「narrow」 *1済だからこそ、演算子使ってもOKなわけで。

だけんど、もしJavaが内部CSIで実装されていたとしたら

byte[] x = new byte[]{ 0xA4, 0xA2, 0x0 };
byte[] y = new byte[]{ 0xE3, 0x81, 0x82, 0x0 };

String X = new String(x, "EUC-JP");
String Y = new String(y, "UTF-8");
String Z = Sring.concat(X, Y, "UTF-8");

のようにString Zの文字コードも明示的に指定する必要があったはずなわけ。
つまり+演算子で文字列結合は出来ませんちゅうことだ。

やるならGenerics使ってこんな感じかなぁ。

byte[] x = new byte[]{ 0xA4, 0xA2, 0x0 };
byte[] y = new byte[]{ 0xE3, 0x81, 0x82, 0x0 };

String<Character<EUCJP>> X = new String<Character<EUCJP>>(x);
String<Character<UTF8>> Y = new String<Character<UTF8>>(y);
String<Character<UTF8>> Z = X + (String<Character<UTF8>>)Y;

キャ〜〜ッ! ちょ〜〜ッ! ノォ〜〜ッ!

Cの場合もCSIなwchar_tの場合だと

	char *x = "\xA4\xA2";
	char *y = "\xE3\x81\x82";
	wchar_t X[255], Y[255], Z[255];

	setlocale(LC_CTYPE, "ja_JP.eucJP");
	mbstowcs(X, x, 255);

	setlocale(LC_CTYPE, "ja_JP.UTF-8");
	mbstowcs(Y, y, 255);

	wcscpy(Z, X);
	wcscat(Z, Y);

なんてことをやらかすといろいろ壊れてしまうのですが
wchar_t=UCS4環境だとこんなんでもなんとなく動いてしまうのが困り者。

そいやC++ standardのmulti-locale使ってるアプリってどんぐらいあるのか知らないけど
NetBSDのlibcで Thread Aware Locale Extensionを実装して
GNU libstd++のmulti-locale機能を有効にしたりすると
このへんの問題がわさーと降りかかってくる悪寒、こわい。

*1:たうぜん何かが失われるかもね。

昨日

会社帰りに某CD屋寄ったら 狂熱のライヴ / Led Zeppelin がエンドレスで流れてて
ついつい散財しそうになった。

ちょー久々に Dinosaur Jr.なぞをひっぱりだして聴いている、we're all nuts so who helps who?
Jマスシス(Vo + Guitar, Drums)で

1ネマリラ = 100ラリネマ
1ラリネマ = 100マリネラ
1マリネラ = 100マスシス (およそ1ドル)
Jマスシス = 100ユニシス

を思い出す人、おっちゃんと一緒に秘境異次元ごっこでもしようや。

2008/9/21(Sun)

きのう

月命日 + お彼岸、おはぎ買ってきたお。
買物の途中、うちの子とおんなじ錆柄のネコと遭遇した。

[NetBSD] multi-locale (i am the resurrection) その1

ちょっくら復活。

cirus dbを使ったLC_{MONETARY,NUMERIC,TIME,MESSAGES}実装を
以前から作業してる multi-localeに突っ込んでみた。

citrus dbから拾った値は愚直にstrdup(3)とかしてるのであんまり効率はよくない。
これ、citrus dbって_db_lookup_*()してきたデータは_db_close()しても
_unmap_file()するまでは有効なはずなのでいちいちコピーしなくてもいいかもだが
mmap(2)しっぱなしってのもどうなんだろかね。
まぁいちおうコピったlocale dataはキャッシュして使い回してるので
ginsbach氏のlocaleioよりかはマシだと思う(いや性能測定してないが)。

それと、いちいち項目毎に_db_lookupstr_by_s()してるのだけど
ガツンとregionで取ってきた方が多分効率いいのだよな。
まぁでもlocaledef.hの定義が結構アレなのに加えて
とてもじゃないけど5枝に間に合うようにlocaledef(1)書いてる時間はにゃいので
現時点で、toolchain用に汎用的なcitrus db向けのdb(1)ライクなツールを作るちゅー方針ゆえ
こういう形にせざるを得ないんじゃないかと思ってる。
おかげでかなりLC_TIMEが頭の悪いことになっている。

いまのとこtools/genlocaleにとりあえずlocale dbを生成するツールをやっつけで作ったので
こいつをbuildしてtools/locale以下をmake installをしておくと
multi-localeでこれらのlocaleがいちおう動いてるのが確認できるトオモ。

C/ja_JP.eucJP/ja_JP.eucJP/ja_JP.eucJP/ja_JP.eucJP/ja_JP.eucJP
C/en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C
C/ja_JP.eucJP/ja_JP.eucJP/ja_JP.eucJP/ja_JP.eucJP/ja_JP.eucJP
C/en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C
ja_JP.eucJP
en_US.UTF-8
---- test_nl_langinfo_l ----
D_FMT:%Y/%m/%d
D_T_FMT:%a %b/%e %T %Y
T_FMT:%H時%M分%S秒
T_FMT_AMPM:%I:%M:%S %p
AM_STR:AM
PM_STR:PM
DAY_1:日曜日
DAY_2:月曜日
DAY_3:火曜日
...

LC_TIMEの出力を見て「きんど〜ちゃんなのよ〜キャ〜お〜おっほおっほ(中略)オッサン(以下略

あー汎用的なdb(1)ライクなツールを書くのではなしに
このgenlocale相当をmklocale(1)に無理矢理組み込んじゃうのも手かも。
どんどん低いとこに流れていく私。

2008/9/22(Mon)

[NetBSD] multi-locale(i am the resurrection) その2

前からFreeBSD/DragonFlyBSDのlinker_set.h相当が欲しいなーと思ってたら
cdefs.hに同等の__link_set_* マクロが大昔からあったのに気付いて
水出しミントジュレップソーダ噴いた、これは恥ずい。
BGMは"One Mint Julep"をJames Taylor Quartetバージョンでひとつ。

ちゅうことでrune_lc_*.cで_locale_category_t可視にするのを止めて
__link_set_*を使うようにした。

かといってlink_set_foreach()使ってby-nameでlookupするのもアホいんで
link_set_entry()を使ってby-indexでlookupするようにしたんだが、cdefs.hバグっとる。

Index: cdefs.h
===================================================================
RCS file: /cvsroot/src/sys/sys/cdefs.h,v
retrieving revision 1.69
diff -u -r1.69 cdefs.h
--- cdefs.h     17 Aug 2008 00:23:02 -0000      1.69
+++ cdefs.h     22 Sep 2008 09:39:43 -0000
@@ -368,7 +368,7 @@
 #define        __link_set_foreach(pvar, set)                                   \
        for (pvar = __link_set_start(set); pvar < __link_set_end(set); pvar++)

-#define        __link_set_entry(set, idx)      (__link_set_begin(set)[idx])
+#define        __link_set_entry(set, idx)      (__link_set_start(set)[idx])

 /*
  * Return the number of elements in a statically-allocated array,

が正しいやね。

まぁlink_set_entry()を使うにはMakefile等で指定するobject fileのリンク順が重要なので
いろいろペナルティの対象なんで考えものなのだが、まぁあまり深く考えないことにしよう。

インタフェースと実装を切り離すのにdlopen(3)や__link_set_*は
primitive過ぎるしcompilerとかobject formatに依存しすぎるし
RPCとかじゃ割鶏牛刀だしなぁ、まんどくさいのでやっぱなんか欲しい。

objective-c(以下略

_RuneLocaleからstruct _citrus_ctype_recを切り離したいんだが
ABI考えるとめんどくさいので放置。

余談だけど、sys/cdef.h 最近pcc(1)対応の為のifdefがようけはいっとるけど
これcdef_gcc.hとcdef_pcc.hとかにした方がいいんじゃないかなとも思う。

今日

ミナミコアリクイかわいい、タンクトップ柄いいな。

2008/9/23(Tue)

昨日 → 今日

雨音はショパンの取調室がriders on the storm状態でthe doorsなわけですよ。
かみなりこわいよー。

胃がしくしく痛い。
胃薬切らしてる、老人ばかりの街なので医者と調剤薬局には事欠かんのだが
普通の「これなんですか? ああコ(略)、お使いですか?」な薬屋が一軒もないんだよな。
俺はもう限界集落だと思った。

駅までいくのめんどいので牛乳と炭酸飲料のちゃんぽんで痛みをまぎらわす。
ピーロリピーロリいつかガンになる、こわい。

アオサギと前回と同じ場所同じ時間帯で再会。
どうやら彼も夕食の買物はいつもこのunder the bridge down townの様子。
今日はアホ毛生やしたゴイサギにも遭遇、サギ三昧。

いっしゃっきいもー買ったのだがパサパサして食えたもんじゃなかった。

2008/9/24(Wed)

今日

1週間に2度Blue Monday気分を味わう罰ゲーム週、how does it feel〜

現場の人達と焼肉、って胃が痛いのどうしたんだよおまいは。
だって会社から補助でるちゅーからもったいないじゃん。

でも最近極力肉類を避けた食生活( meat is murderとは関係ありません)
してたので胃が拒否反応を示して気持ち悪くなって途中退場する羽目に。

MC FISH-EYE ROKKOR-OK 1:2.8 f=16mmなぞポチッってまった。
今のSONY αのSAL16F28と光学系ほぼ一緒の対角魚眼レンズ。

美品といいながらカビ品送ってきやがった、マダファッカ。
まぁ後玉外して中性洗剤ぬりぬりで落ちたからヨカタ。

Panasonic LUMIX DMC-G1の/devっぷりに、いきなり炎上したマイクロフォーサーズでつが
OLYMPUSがちゃんと空気読んで米谷イズムを感じさせる モック投入で鎮火した模様。
これで裏面液晶が上向きだけでえーから稼動可ならちと欲しい。

2008/9/25(Thu)

今日

Kodak Ektar100

ktkr

これなら

アタシ

フィルムで

あと10年

戦える

てか

そんなの

うちのフィルムスキャナじゃ

解像度足りな〜い

みたいな

Leica S-System

アタシ

ちょっと止まる

いちじゅうひゃくせんまん

じゅうまん…ひゃく…

買えね

おこづかいじゃ

絶対無理だし

ビンボ人には関係ない世界つ〜の?

勝手に

やってろよ

みたいな

第3回日本ケータイ小説大賞って

高橋メソッド

あるいは

手術しない

アルジャーノン

てかチャーリィ?

みたいな

次は

文学と

もんたメソッド

の融合がクル

かも

てか

ケータイでプレゼン

ってもう誰か

やってそう

左を見ろ→→→→→             こっちは右だ

今日2

↑のケータイ小説の作者、最後John Lydon(a.k.a. Johnny Rotten)のように

「アハハ、騙された気分はどうだい? (ever get the feeling you've been cheated?)」

とか

「小説は死んだ! (novel is dead!)」

とかタンカ切ってPublic Image Limitedを結成し、ポストケータイ小説の時代の幕が上がるのだな。

アシッドケータイ小説とオルタナティブケータイ小説でおいらも文壇目指すか。
というかそれなんてBeatnik?

つかケータイ小説はpoetry readingすればおもろいのに。

体調は回復傾向だけど、念のためグリーン車乗って帰る。

2008/9/29(Mon)

週末!

やとこさ(その1) CONTROLのDVD観たけど、映画館で観たときは
青と茶のモノクロを混ぜてた(彼の写真作品でやってるように)とおもたのだが
確認したら全編ただのモノクロだった、記憶違いか。

やとこさ(その2)SONY α200をおんもで使ってみたが
やぱしAPS-Cのファインダーじゃおいら眼が悪いのでマニュアルフォーカス厳しいな。
レーシックするっても、俺の収入じゃチャイバシティの裏通りのモグリ医者で
オノ=センダイの義眼が精一杯、ツァイス=ソニーとか無理だわ。

試写結果、まったく意図した色にならんかったのでレタッチあり but ノートリミングで。

それにしても操作むずい、なんつーのかこのデジイチに感じるモヤモヤって
90's頃デジタルシンセにサンプラでなんとかしてアナログの存在感の音を出そうと
苦労してた頃と同じで、明らかにそれ不毛じゃね? なニホヒがすんだよな、デジタル現像(笑)
さっさとフィルム一眼のモノマネから脱しないことには
デジイチは未来無いだろなーちゅうオーラと死兆星がみえるよ!

だからこそ他社の新製品は動画機能とかのっけてきたんだろけどね。
でも動画撮るのに一眼レフの形状は全く向いてないと思うけど。

まぁ手振れ補整が進化し過ぎりまくっちゃったりして
ステディカムどころか レールにクレーン要らずになるとかなら欲しいかも(無理です)

んでシンセといえば先日本屋ぶらぶらしてて気付いたのだが
Keyboard Magazineっていつのまにか季刊になってんのね。
もうパチョコンへの入力装置でしかないのだなと全俺が泣いた。
そりゃMouse Magazineなんつーものが存在しないのと同じだ罠。

2008/9/30(Tue)

昨日

revivesaが遅れれば遅れるほど、私のlocale周りの作業時間が稼(以下略

multi-localeから5.0に入れる分を選別しないとならんなぁ。
まぁ時間的に_locale_category_tまわりとcitrus dbを使ったLC_{MONETARY,NUMERIC,TIME,MESSAGES}
だけでお茶濁して、マトモなmulti-localeを突っ込むのは6.0にするつもりなんだけどね。

今書いてる実装、そもそもキャッシュ(SIMPLEQ)と排他制御(rwlock)が必要になるのは
ファイルからlocale dbを読もうとしてるからであって、そこまで規定してしまってる
今の_locale_category_t↓のインタフェースはダサいのよな。

typedef struct {
        const char *name;
        int (*create)(const char * __restrict, const char * __restrict,
            _locale_part_impl_t ** __restrict);
        void (*destroy)(_locale_part_impl_t *);
        void (*build_cache)(_nl_cache_t * __restrict,
            _locale_part_impl_t * __restrict);
        void (*regist_method)(_locale_method_t * __restrict,
            _locale_part_impl_t * __restrict);
        _locale_part_t initial;
        SIMPLEQ_HEAD(, _locale_part_t) cache;
#ifdef _REENTRANT
        rwlock_t rwlock;
#endif
#ifdef COMPAT_50
        void (*fixup)(void);
#endif
} _locale_category_t;

こんなんアボガド。さすがわお筆先、狐狸の類が書かせたのだろうか。
いんや狐狸はプログラムなんぞで人生の時間を無駄使いしない罠、俺も動物になりたひ。
まったく設計せずにいきあたりばったりで書いてっからこういうカスコードになる>>俺

あとnl_langinfo(3)とlocaleconv(3)用のキャッシュを作るbuild_cache()も
こんなんinit()で処理可能なのでバイバイキーん。
regist_method()、本来こんなんencoding moduleがやるべき、よってさいなら。

typedef struct {
        const char *name;
        int (*init)(const char * __restrict, _locale_impl_t * __restrict);
        void (*uninit)(_locale_impl_t *);
#ifdef COMPAT_50
        void (*fixup)(void);
#endif
} _locale_category_t;

くらいにしといた方がよさげ。

というわけで排他とキャッシュはrune側でやるよにゴッソリ書き直しちう、なう。

んなことをしてたら誕生日なう。
人生をリファクタリングしないとならん年齢ですが進捗進んでません><

花屋。

近所のふいんき(ryのいい竹藪の切通しがショベルで崩されて
柵で囲われ建築許可のプレートが貼ってあった、また貴重な(以下略

まこっちゃんハウスの紅白壁より、崖っ淵にフジツボの如きミニ戸建で
玄関先でアクロバチックなガーデニングされる方がおぞまじいやな。

今日

今日撮ったやつ。 オートホワイトバランスの癖がよーわからんので、どうしても1/3〜1/2程度
露出オーバー気味の軟調な写真になっちゃうのが困りもの、しょうがないのでポスプロでいじった。
あとやぱし雨の日は壊れそうで思い切って撮れないや。

アオサギこわい!