2007年2月7日(水) まだまだ白い空 [同日]
● gettextで得られる文字列を入れるバッファの大きさはどうやって決めるんだろう?
@ITに、「ロケールの問題でプログラムが正常に動作しない場合には」という記事が載っていた。gripというプログラムを例に採って、LANG=Cで使えるプログラムが日本語ロケール(ってFC6ならja_JP.UTF-8なのかな?)で使えない場合にどうやって修正するのか解説してある。曰く、char versionbuf[20];をchar versionbuf[22];にしろ、とのこと。えぇーっ?「ここで挙げた対処方法は、あくまで暫定的な措置なので自己責任の下で作業していただきたい」と断り書きがあるにせよ、これはさすがにまずそうだと感じる。きっと他のロケールで落ちる。
興味が湧いてきたのでコードを覗いてみることにした*1。grip-3.2.0のsrc/grip.cに下記のようなコードがあった。
char versionbuf[20];
(中略)
sprintf(versionbuf,_("Version %s"),VERSION);
label=gtk_label_new(versionbuf);
(中略)
gtk_widget_show(label);
VERSIONはconfig.hで定義されるマクロだろう。
この場合、versionbufに必要な大きさは実行時まで不明ということになるのかな。なら、malloc(3)でメモリ領域を確保するべきなんだろう。C99ならsnprintf(3)で必要なバイト数を測るか、C99が仮定できない場合にはprintf(3)のmanページにあるコードでメモリ領域を確保しつつ文字列を作ることになりそう。
さて、こうやってmalloc(3)で確保された領域の文字列をgtk_label_new()に渡した場合はこの領域はいつまで確保しとかないといけないか…ちょっと探しただけではわかませんでした。GUIは難しいね…結論はそれか?
*1 そんなことしてる時間がないのは自明の事実なのだけれど。
● [memo] Debian:i18n (ukai.org)
gettextについていろいろ探している過程で、「i18nについて世界のdeveloperにたいして言わなければいけない時に忘れてはいけないポイント」の書いてあるページをみつけました。もし国際化するべきプログラムを書く時があれば参考になりそうだ。i18nについて自分にたいして言わなければならないポイント。
● Citrixのウインドウを画面の端にドラッグして離したらメニューバーにアクセスできなくなった。もう用済みなので閉じたいのですが。ローカルのWindowsからはウインドウが選択されていないように見えるようで、Alt+F4でも閉じられないし、Alt+Space-Mでも移動できない。ネットワークが切れる(そのうち必ず切れる)のを待とうかとも思ったけれど、スタートメニューの横にならんでるアイコンを右クリックしてCloseを選んだら閉じられた。しかしデータベースとやりとりするのにデータベースサーバのウインドウを持って来ちゃうってのは斬新な発想だよねえ…。
● オモコンマシン死亡
ハードディスクの問題じゃなかったか…。 フリーズ時のtopは下記のような感じ。gccを作り中でした。 やっぱりファイルの操作時に不安定になるみたい。
top - 17:54:06 up 9:02, 4 users, load average: 1.07, 1.22, 1.25
Tasks: 71 total, 2 running, 69 sleeping, 0 stopped, 0 zombie
Cpu(s): 99.3% us, 0.7% sy, 0.0% ni, 0.0% id, 0.0% wa, 0.0% hi, 0.0% si,
Mem: 515452k total, 504420k used, 11032k free, 58796k buffers
Swap: 1004052k total, 144k used, 1003908k free, 289840k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20989 zunda 25 0 8908 7780 372 R 99.1 1.5 1:11.81 bzip2
2313 zunda 16 0 1900 920 720 R 0.7 0.2 1:21.09 top
2269 zunda 15 0 6140 1148 824 S 0.3 0.2 0:03.74 sshd
20988 zunda 17 0 1748 680 588 S 0.3 0.1 0:00.04 tar
1 root 16 0 1908 636 540 S 0.0 0.1 0:00.82 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
4 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/0
5 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 khelper
6 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kthread
8 root 10 -5 0 0 0 S 0.0 0.0 0:00.62 kblockd/0
9 root 20 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid
83 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 khubd
85 root 10 -5 0 0 0 S 0.0 0.0 0:00.01 kseriod
143 root 15 0 0 0 0 S 0.0 0.0 0:02.51 kswapd0
144 root 20 -5 0 0 0 S 0.0 0.0 0:00.00 aio/0
310 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 kpsmoused
kernel-2.6.20に行ってみるか?ハードウェアの問題か?泥沼か?うーん…
(追記) 8日に古い方のハードディスクを物理的にはずして再挑戦。
top - 17:33:27 up 8:50, 4 users, load average: 1.02, 1.17, 1.22 Tasks: 71 total, 3 running, 68 sleeping, 0 stopped, 0 zombie Cpu(s): 99.3% us, 0.7% sy, 0.0% ni, 0.0% id, 0.0% wa, 0.0% hi, 0.0% si, Mem: 515452k total, 509740k used, 5712k free, 60724k buffers Swap: 1004052k total, 128k used, 1003924k free, 293064k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 19154 zunda 25 0 8908 7780 372 R 99.4 1.5 2:02.16 bzip2 1870 zunda 17 0 51604 43m 3616 S 0.3 8.7 0:09.62 ruby 1919 zunda 16 0 1896 916 720 R 0.3 0.2 1:22.08 top (後略)
で目の前で止まってしまいました T_T マザーボードか電源か…。嗚呼。
● parse error, unexpected $, expecting kEND (SyntaxError)
そういえば昨日職場でPythonのスクリプトを書いていた。
gtk_label_new()だと,中でg_strdup()しているので,すぐに開放してかまいません.<br>たぶん,ふつうのまともなライブラリはそうなっていると思います.(そうなっていて欲しい.)
Momongaのgripではちゃんと日本語出てるなぁ、と思ったら<br>char versionbuf[30];にするというadd hocなパッチがあたってるようでした。<br>http://sourceforge.net/tracker/index.php?func=detail&aid=1233171&group_id=3714&atid=103714<br>なんてのが結構前に出てるのに変更されてない、ってことは本家では修正予定はないのでしょうかねぇ...
なるほど。kouさん、h_nakamuraさんありがとうございます。BTSを見てもgtkの関数には便利そうなのがありますよね。富豪的だけど。やっぱりちゃんと使えるようになりたいかなあ。
脳味噌から汁が出るくらい考える。こともある。
最近のツッコまれどころ