トップ «前の日記 最新 次の日記» 追記

おまぬけ活動日誌

最近のツッコまれどころ

この日誌から Google[TM] してもらう。

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のスクリプトを書いていた。

本日のツッコミ(全3件) [ツッコミを入れる]
> kou (2007年2月7日(水) 14:25)

gtk_label_new()だと,中でg_strdup()しているので,すぐに開放してかまいません.<br>たぶん,ふつうのまともなライブラリはそうなっていると思います.(そうなっていて欲しい.)

> h_nakamura (2007年2月7日(水) 16:48)

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>なんてのが結構前に出てるのに変更されてない、ってことは本家では修正予定はないのでしょうかねぇ...

> zunda (2007年2月7日(水) 19:02)

なるほど。kouさん、h_nakamuraさんありがとうございます。BTSを見てもgtkの関数には便利そうなのがありますよね。富豪的だけど。やっぱりちゃんと使えるようになりたいかなあ。


脳味噌から汁が出るくらい考える。こともある。


zunda <zunda at freeshell.org>