X_LOCALEを捨てよう

5月28日追記

RedHat 6.0 が正式にリリースされて、glibc 2.1 が普通に手に入る環境になってしばらく経過したけど、どうやら libwcsmbs をブチ込んでハマッている人が後を断たないような感じだ。得てしてこの手のハマりをしてしまうのは、過程を問わずに結果を追う、というような行動が根っこにあるような気がしてう〜む、なのだが、実際に困っている人が多いとすると不幸なことだ。だから赤字でデカデカと書いとこう。

glibc-2.1.1 には libwcsmbs は不要だ。RedHat 5.2からアップグレードする場合(つまり上書きで RedHat 6.0 を入れる場合)は、まず libwcsmbs を有無を言わさず rpm -e しよう。新規に RedHat 6.0 を入れた場合は、libwcsmbs を入れずに、wcsmbs-locale だけを入れよう。

ないしは、コ鯖から localedata-ja というバータリー極まるパッケージを落としてきて入れてもいい(笑)

11月17日追記

glibc+wcsmbsという方法を知ってからというもの、glibc-2.0.7のリリースが上がる度に、wcsmbs化のパッチをあててrebuildしては人柱してきた。が、最近になって、ついに吉山さん(wcsmbsの開発者さん)が、glibc本体とは離れてプリロードされる構成の libwcsmbsというシェアド・ライブラリを開発してくださった。

吉山さんはDebianな人なので、libwcsmbsももちろんDebian用なのだが、そこはそれ、魚心と水心、悪代官と大黒屋ってなもんで、赤帽5.xにも移植されているのだ。てなわけでさっそく使っている。

ちょっと紹介しておくと、従来は赤帽5.xのglibcベースなパッケージ集としては、日本にはJRPMしかなかったのだが、最近はPJEが赤帽5.x向けにglibc対応を開始しているのだ。

PJE-0.3alphaというのがそうなんだけど、ここにlibwcsmbsパッケージが置かれているので、wcsmbsで人柱する気があるひとは取ってきてブチ込もう。柱っつっても、特に致命的な問題なぞない。細かい不都合はあるものの、おおむねまともに動く。

libwcsmbsの何がいいって、もうglibcのリリース追っかけから解放される(少なくとも可能性はある)ことだね、なんと言っても。

意味もなくglibcの新しいreleaseが出るワケはないから、それなりにパッチがあたったりしてバグ修正などが施され、glibc-2.0.7-xx.i386.rpmという形でxxの数字が増え、新たにリリースされてくるのだが、wcsmbsでこういう出たてのglibcを使おうとすると、自分でwcsmbs化のための大がかりなパッチをあてて、glibcを丸ごとrebuildし、glibc-hogehogeという付随するパッケージをみんな差し替える必要があったんだけど、これって実際にはすごくヤバいのはすぐに想像がつくよね。

rebuildしてしまった時点で、glibcという大きなパッケージ群はすべて新しく作られてしまい、wcsmbsには関わりない部分であっても、もはやRedHat 5.xのCD-ROMに含まれていた(つまり、それなりに試験されてきたであろう)glibcとは厳密には別の物になってしまう。この十字架を取り払ってくれるのがlibwcsmbsだ。

RedHatから公式にリリースされるglibcなパッケージに追加する形でlibwcsmbsをインストールするだけなので簡単に使えるようになるうえ、RedHatからglibcの新しいreleaseが出ても、それをそのままアップデートとして差し替えて使うことができる。リクツの上ではlibwcsmbsのことは考える必要はない。これは本当に素晴しいメリットだ。

実際にオレが使っている赤帽はベースはRedHat 5.1だけど、glibcは 2.0.7-29というRedHat-5.2相当の物をftpしてきて入れてある。これにプラスしてPJE-0.3alphaのlibwcsmbsとwcsmbs-localeが入っているだけだ。でも日本語サクサクだぜ。glibc+wcsmbsからゴソッと入れ替えたけど、実作業はそれだけだった。設定ファイルの類もなにも触ってない。

ところで、PJEが赤帽5.x対応を開始したってんで、JRPMとの関係はどうなるんだ、とかいろいろと物議を醸しているようだけど、まぁ我が拳は我流なオレ的にはど〜せいいとこどりしてほげるだけなので、あまり気にしていない。日々是snap shotなオレのコンダラ赤帽に、PJEのような黙って入れれば幸せ的なおすすめセットを入れるということはまずありえないしなぁ。

なんでもありありなJRPMと、揃えて安心なPJEというように住み分けがすすむんじゃないかと思う。願わくば、JRPMがここみたいにアクセスが良くなってさえくれれば、なにも文句はない。だって、rufus.w3.orgも相当グシャグシャだけど、結局は探しあてることができて、目的を果せるもんねぇ。バイナリをそのまま入れるってこたないけど、すごく役に立っていて、世話になっているのも確かだ。

--- こっから下は以前のまま ---

RedHat Linux 5.0以降はベースがlibc6(つまりglibc2)になっている。このため、ja_JP.ujisなどの日本語LOCALEが扱えなくなってしまっている。さらに、パッケージとして含まれているXFree86もLOCALEのエミュレーションなしでmakeされているため、X_LOCALEを前提に日本語化されたものは軒並み使えない、という状況だ。特にRedHat4.2用にRPMで提供されているPJE 0.1も、libc5ベースでX_LOCALEありという前提なので、使用することはできない。

では日本語環境はまったく構築できないのか?というとそんなことはなくて、そこはハッカーぞろいのLinuxコミュニティ、ちゃんと手はある。完全とは言えないかも知れないが、日本語のLOCALEをサポートしたglibc2も公開されているし、XFree86はソースを持ってきてX_LOCALEつきでmakeしなおしてやれば、従来のバイナリをそのまま使うことはできないまでも、それなりに日本語を使える環境を手に入れることができる。

というわけで、
佐藤さんのページからglibc+wcsmbsとLOCALE Dataを頂いてくる。

はぁ。すまん。後はまだ書いてないのだ。近日中に書きます。

と、前回はここまで書いてあったのだが…。方針変更して今後一切、X_LOCALEは使わないことにした。だから、JRPMで提供されているパッケージのうち、X_LOCALEをあてにしているモノは軒並み動かないことになる。重いコンダラかも(笑)。

経緯はこうだ。

JRPMプロジェクトのメーリング・リスト、Package MLをsubscribeしているんだけど、そこでもやはり、glibc2にwcsmbsを追加して、日本語(のみならずアジア各国語)のLOCALEを正しく扱えるようにするのが本筋ではないか?いつまでもX_LOCALEを使ってはいられないので順次移行しよう、という話は持ち上がっている。

libc5の時代は、libc5がLOCALEを扱えないので、仕方なくXのほうでLOCALEをエミュレーションしてしのいでいた、つまり暫定的な措置だったワケだから、まぁ当然といえば当然だろう。ここですぐ思いつく考えられる方法としては、

こうしていいトコ取りできれば、常にある程度アテになる環境を保ち続けながら、X_LOCALEなしな環境に移行することができそうだ。そのために、X-TTなXFree86のパッケージなんかもX_LOCALE付きで作ってみたし、実際に一ヵ月近く使ってもみた。が、ここには落し穴が…。

X_LOCALEをあてにしてLOCALEのハンドリングをする際には、_Xsetlocale()関数を使い、Xでない環境ないしはX_LOCALEをあてにしない場合は単にsetlocale()関数を使う。というか、X_LOCALEをあてにするXのプログラムでは、setlocale()が一連のプログラムの中で、#defineマクロなどで_Xsetlocale()に置き換えられていることが多い。だから、移行の際には、_Xsetlocale()を呼んでいる箇所を単にsetlocale()に置き換える(というか元に戻す)だけでいいハズなんだが、この2つの関数には優先順位があるらしい。

早い話、X_LOCALEをXがサポートしちゃってる状態では、_Xsetlocale()がまともに動くかわりに、単なるsetlocale()は正しくLOCALEを設定してくれないそうだ。ガーン!

ていうことはつまり、X_LOCALEを使っている限り、glibc2のLOCALEサポートの良否を云々することはできないということだ。X_LOCALEを捨て、一気にglibc2のみによるLOCALEサポートに切替えてしまわない限り、いつまでたってもX_LOCALEから離れることはできないようだ。

聞くところによると、Debianの日本語化パッケージを作成するDebian-JPプロジェクトでは、libc5ベースのboからglibc2ベースのhammにバージョンを上げる際に、一挙にX_LOCALEを捨てたそうだ。佐藤さんのglibc+wcsmbsも、元々はDebian-JPのglibc+wcsmbsを、RedHat用に持ってきたものなんだそうだ。

うぅ〜む。さすが最強と名高いDebian、素晴らしいぜ。というワケで、今後はX_LOCALEなし、glibc+wcsmbsのみでいってみることにする(笑) 肝心のglibcはどうするんだ?という部分だが、とりあえずは今公開されている佐藤さんバージョンを使い、Debian-JPでリリースされるものを追いかけることになるだろう。

メール 戻る