なにはともあれSLAX
slax-ja-5.1.7b-2.moが日本語化モジュールなんでしょうけれども、各国(ro,tw等々)でのそれぞれの国語化って同じようなモジュール形式で実現してるんでしょうか。 また本家は「国際化」特にCJK対応について何か意見を持ってるんでしょうか。 この板では話おおきいかも知れませんが日本の将来のために「Linuxの日本語化」ってものすごく大きい意味を持つと思います>世耕さん>安倍さん >>101 言語別にひとつのモジュールにまとめるという話は本家フォーラムでは見たことないです。 ただ、こういうのができたよと言語用のモジュールを提供するのは、Tomasは気軽に受け とってくれます。とってもフレンドリーな感じです。 マルチランゲージとして下のURLにあるのですが、これもバラバラという感じですよね。 http://www.slax.org/modules.php?category=multilang 一度、すべての日本語に関するファイルをひとつのモジュールにまとめようとしたことが あったのですが、そのときはuimがどうしても動いてくれなくて諦めました。 いま、Slax標準が196MBで、日本語版が253MBというサイズになっています。単純に 日本語モジュールとひとつにまとめると57MBということになるので、このサイズがSlaxに は大きすぎるのかなぁと思ってもいます。 僕としては、Slax本家の標準に最低限の日本語環境で使いやすいものを提供して、あと はユーザがそれに加えて自分の使いたいものを自由に入れてくれればいいかなぁと。 Slax自体がとってもカスタマイズしやすいものなので、そうするのが自由なソフトウェアと して相応しいじゃないかと思ったりしていますが、どうでしょうか。 >>103 ありがとうございます。 slaxのコンセプトは「軽い」ということと「カスタマイズが簡単」ということだと思いますので、「最低限の日 本語環境の提供」案に賛成です。ここで具体的に整理したいのですが、たとえばja5.1.7b2なら以下のようなモ> ジュールが、その最低限の日本語化部分の骨格になると理解していいですか。 ●基本部分 slax-ja-5.1.7b-2.mo glibc-i18n-2.3.6-noarch-3.mo ●フォント ipafont-ttf-noarch-1.mo ●KDEまわり kde-i18n-ja-3.5.3-noarch-1.mo koffice-l10n-ja-1.5.1-noarch-1.mo ●日本語入力まわり uim-1.2.0-i386-1.mo anthy-7900-i386-1.mo >>102 経済産業省のやってるクノッピて、国家プロジェクトじゃないの? まぁ、あんまりというか全く宣伝してないけど。 小中高はWinじゃなくてlinux使わせようよ。 >>104 あと補足すると、 ●印刷 cndrvcups-common-1.20-i386-2.mo cndrvcups-lips4-1.20-i386-3.mo espgs-8.15.2-i486-1.mo gimp-print-4.2.7-i486-2.mo gnu-gs-fonts-6.0-noarch-1.mo ●エディタ vim-7.0.017-i486-1.mo ●その他 k3b-i18n-0.12.15-noarch-1.mo 残ったのは glibc-profile-2.3.6-i486-3.mo だけど、これって日本語化と関係あるんですか。 さっき ttp://squashfs.sourceforge.net/ からたどってsquashfs3.1-r2.tar.gzをおとしてbuildしてみました。 カーネルパッチはめんどーなので当てなかったのですが、./squashfs-tools/ 以下で make したら mksquashfs と unsquashfs という圧縮・解凍コマンド対ができました。 これを使うと他ディストロからでもSLAXの *.mo が作れたり、内容のリストとったりできそうです。 $ mksquashfs file1 file2 file3 hoge.mo $ unsquashfs -l hoge.mo >>106 glibc-profile-2.3.6-i486-3.moは、uimを動かす過程で、glibc-i18n-2.3.6-noarch-3.moと 一緒に入れました。本当に必要かわからなかったんだけど、両者を一緒に入れたときに uimが動いてくれたので、そのままになっています。 このglibc-profile-2.3.6-i486-3.moって、なんのためのライブラリなんでしょうね。 >>105 小中高はwinじゃなくてlinuxというのは、同感なんだけど、高校卒業して就職したとき 会社がwinだったりすると、linuxを導入した高校は使えないという評価になるんで、 なかなか難しかったりするようです。同じように大学がwinだったりすると、そこでlinux だけをやっている学生は遅れたりすることがあるんじゃないかなぁと危惧してみたり。 knoppixは、日本語版knoppixは産総研の須崎さんの研究テーマのひとつで、別の ところでも一部を支援はしているけど、国家プロジェクトというほどではないですよ。 国家プロジェクトというと国の都合で推進するわけで、そういうのとは別にやっている ほうが健全だと思ったりして。プロジェクトにべったりだと、国の都合で方針を変えな くちゃいけなかったり、いきなりやめられて途方にくれたりすることがままあります。 >>107 すごいですねぇ。 僕なんか、モジュールを作るのはslackwareでtgzファイルを作って、それをslax上で tgz2moコマンドで変換しています。もうひとつのmo2tgzコマンドを使う場合、よく バージョンの違いで怒られることがあるのですが、mksquashfsだとどうですか。 怒られないなら、こっちにしたいなぁ。 >>110 よく見たらisoイメージの./tools以下にmksquashfsとunsquashfsがありました。 *2moのコマンド群は、おなじ./tools以下にあるliblinuxliveという、関数登録用のスクリプトを起動したのち、その中の create_module() { mksquashfs "$1" "$2" $3 >/dev/null if [ $? -ne 0 ]; then return 1; fi chmod oga-x "$2" # remove execute attrib } を使っていました。つまり間接的にmksquashfsを使っていることになります。いわばwrapperですね。 >>110 つづき またmo2dirでは同じliblinuxliveの中の mount_module() { mount -t squashfs -o loop,ro "$1" "$2" err=$? if [ $err -eq 0 ]; then echo "$1 $2" >>/tmp/_mounts fi return $err } を使用していました。 unsquashfsというコマンドを使うのではなく、kernelにsquashfsパッチを当てているようです。 エラーを返すというのはこのmountの動作に関してでしょう。 unsquashfsで一部の*.moを解凍しようとすると次のようなエラーが出ます。これも類似の現象だと思います。 Major/Minor mismatch, filesystem on Avidemux_2_0_40.mo is (2:1) I only support Squashfs 3.0 filesystems! Later releases will support older Squashfs filesystems つまり、もう少ししたら3.0以前のsquashfsにも対応するから待っててね、ということのようです。 >>108 The glibc-profile package includes the GNU libc libraries and support for profiling using the gprof program. Profiling is analyzing a program's functions to see how much CPU time they use and determining which functions are calling other functions during execution. To use gprof to profile a program, your program needs to use the GNU libc libraries included in glibc-profile (instead of the standard GNU libc libraries included in the glibc package). If you are going to use the gprof program to profile a program, you'll need to install the glibc-profile program. 以上、赤帽のサイトから。これ見るかぎりglibcのプロファイリング用のライブラリ群のようですな。あまり必要ではなさそうなのですが、どうしてuimの動作と関連するのでしょう.. ためしに/modules以下のglibc-profile-2.3.6-i486-3.moを消して起動してみました。 (USBだとこういうのが簡単 ^^;) 今のところuim1.2.0も問題なく動いています(Konsole/KDEでも、jfbtermのuim-fepも)。 しばらくこのprofileモジュール外して使ってみます。もし不具合でたら報告します。 fd使いのために。 .fd2rc で次のような関連付けをしてみると*moファイルの扱いがなじんできます。 arch ".mo" "mksquashfs %TA %C &>/dev/null" "unsquashfs %C" 追加 launch ".mo" "unsquashfs -l %C|$PAGER" >>116 エラー表示も重要 launch ".mo" "unsquashfs -l %C 2>&1 |$PAGER" >>113 すいません、言葉が足りませんでした。 uimをmakeするときに、i18nとprofileを一緒に入れて動いたのが確認できたので、 それをそのまま使っています。glibc関連のライブラリは、その他のモジュールで 使う場合があるので、そのままにしておこうという感じです。 >>112 unsquashfsでエラーが出るということはSLAXがブートするときにも読めてないということだろうか? とくにエラー表示ないけどなあ。 SLAXのkernelはsquash 2.x と 3.xの両方が読めてるってことか。 すくなくとも本家のlibdvdcss_1_2_8_2.mo, alien_8_56.mo, XChat_2_6_1.mo, Syslinux_2_13.moはunsquashfs3.1では読めなかったぞ。(本家のモジュールには2.xと3.xのsquashfsが混在しているが、これでいいのか) squashfs2.xとか3.xとかいうことより、 Ftp://ftp.slax.org/SLAX-6.x/testing/technology-preview/READMEによると using LZMA compression for squashfs. This is not backwards compatible with old Slax modules, but it's better so Slax will switch to it. ということなので、いずれ全てのモジュールは新しくならざるをえない。これってsquashfsが3.2ないし4.0になるってことか? >>119 ブートするときに読めてないということではないみたいです。 単にmo2dirで展開するときに、失敗するみたいですね。 それを作ったときのsquashfsのバージョンで展開しなくちゃいけないんだけど、 どのバージョンなのか分からないまま、try & errorは避けたいです。 >>120 確かに圧縮形式が変わればモジュールのコンパチビィリティが失われるので、 これまでのモジュールは使えなくなりますね。そこのところを確かめようと、 squashfsのウェブページを見たのですが、それらしいのを見つけられませんでした。 根拠が薄いのですが、次期slaxからunionfsをaufsに変更するように、squashfsも another squashfsにするような気がします。 squashfsの作者がLZMAは好ましく思っていないというTomasのコメントがあるから そうかも。それよりスピードが遅いというスレッドも本家でたっているので、ひょっと したら見送られる可能性もあります。 >>122 ftp://ftp.slax.org/SLAX-6.x/testing/technology-preview/devel/lzma-for-squashfs.tar.gz これ、LZMAパッチの当たったsquashfsのソースだろうか。 展開コマンドunsquashfs.cについてはそのまんまのようだけど、同じunsquashfsで通用するってことかな。 いずれにしてもunsquashfsがもちっとかしこくなって、 モジュールの圧縮形式[version]まで自動検出できるようになってほしい。 それと旧バージョンの圧縮モジュールを別のバージョンの圧縮モジュールに変換するようなコマンドも。 バイナリダンプしてみると、squashfs3.xで圧縮したものは0x6fから8バイトにわたってナゾの0xffが続いている。これはunsquashfs3.1がきちんと読める。 unsquashfsがエラーを返す*.moファイルはみな、0x6fから0xffが続かないものばかりだ。まあこんなreverseするより、mksquashfsのソース読むのが正道なんだろけど。 ソース読みマスタ。squashfs_fs.hの中のstruct squashfs_super_block。 0xc-0xd(第29-30バイト)がmajor version, 0xe-0xf(第31-32バイト)がminor versionのようだ。0xffが続くとかどうとかはあまりspecificではなかった。撤回。 ということでどのバージョンのsquashfsで圧縮されているかのチェックはbashなら function checksqver { dd if=$1 bs=2 count=2 skip=14 2>/dev/null|ruby -ne 'p $_.unpack("M")'; } という感じになるかな。出力はきれいじゃないが、まあとりあえずの情報だけは得られる。テキトーにいぢってくれ。 usage: checksqver <filename> 123-126まで却下。unsquashfsがきちんと処理していた。やれやれ。 >>127 いやいや、どこにバージョン情報があるかよくわかりました。 linux自体昨日初めて聞いて触ったんだけど、これでFAX送ろうと思ったけど送れないよ。 どうやったらいいのかな。 たとえばwindow managerがKDEならば「KDE fax 送信」でググられてはいかがかと。 >>126 function checksqver{ test -f $1 && ruby -e "ARGF.seek(28); p ARGF.read(4).unpack('M')" $1; } function checksqver { test -f $1 && ruby -e "ARGF.seek(28); p ARGF.read(4).unpack('M')" $1; } ^ 空白!! >>132 function checksqver { test -f $1 && ruby -e "p IO.read(ARGV.shift,4,28).unpack('M')" $1; } Slax_Module_Inspector_060611.mo を使えば3.xも2.xも処理できます。 つーか、これブート時に展開したときのログみたいなもんを利用するモジュールかも。 >>137 標準ではKDEとfluxboxだけだと思うけど、www.slax.orgにgnome, fvwm, xfceなどのモジュールがあるのでgetして /modules以下に置けば使用できると思います。 ttp://www.slax.org/modules.php?category=system ●517jpにだけあるモジュール ochusha-0.5.8.2-3.i386.mo openprinting_mona-jp-0.1.3-0.i586.mo ●518jpにだけあるモジュール jd-1.7.0-060927.mo openprinting_M+mona-jp-0.1.3-0.i586.mo slax_5.1.8.mo ■この/modules/slax_5.1.8.moというモジュールは517jpでは/rootcopy以下におかれていたファイルをモジュール化したもののようだ。 これら設定ファイルのうち517jpにだけあって518jpには含まれないものは /root/.fonts.conf また、設定ファイルのうち518jpであらたに追加されたものは /etc/fonts/local.conf /etc/rc.d/rc.local /usr/bin/startfluxbox はじめて使ったがjdもなかなかいいな。開発が続いている点でイチオシか。 >>140 517jpと518jpの/modules以下の*.moは、名前の同じものは日付がちがっても全く同じバイナリやね。 まんま動くということのようです。 本家slax518とslax518jpの相違点の詳細(その1) ▼相異点1 バイナリー・ファイルtmp/518/boot/initrd.gzとtmp/518jp/boot/initrd.gzは違います --> initrd.gzに含まれるliblinuxliveスクリプトのutf8対応の部分のみの変更 => 以下の「相異点3」参照 バイナリー・ファイルtmp/518/boot/isolinux.binとtmp/518jp/boot/isolinux.binは違います バイナリー・ファイルtmp/518/boot/isolinux.bootとtmp/518jp/boot/isolinux.bootは違います --> isoイメージを作成するときに生成されるファイルだからか.. ▼相異点2 518jpでは/modules以下に追加モジュールが置かれている。<= まあ当然 (つづく) 本家slax518とslax518jpの相違点の詳細(その2) ▼相異点3 diff -r tmp/518/tools/liblinuxlive tmp/518jp/tools/liblinuxlive 456c456,461 < if [ "$IOCHARSET" != "" ]; then OPT="$OPT,nls=$IOCHARSET"; fi --- > # if [ "$IOCHARSET" != "" ]; then OPT="$OPT,nls=$IOCHARSET"; fi > if [ "$IOCHARSET" != "" ]; then > OPT="$OPT,nls=$IOCHARSET" > else > OPT="$OPT,nls=utf8" > fi 460c465,472 < if [ "$FS" = "vfat" -a "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET"; fi --- > # if [ "$FS" = "vfat" -a "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET"; fi > if [ "$FS" = "vfat" -a "$IOCHARSET" != "" ]; then > OPT=",iocharset=$IOCHARSET" > else > if [ "$FS" = "vfat" ]; then > OPT=",iocharset=utf8,codepage=932" > fi > fi ●結論:本家slax518とslax518jpの相違は、追加モジュールの他にはliblinuxliveスクリプトの一部(上記)変更のみである。 >>145 調査乙 fstabを作成するときなど、パーティションがvfat,ntfsのときにオプションに {iocharset|nls}=utf8, codepage=932 を付けるための修正だね。 >>146 なるほど。 これって台湾や中国、韓国でもそれぞれ同様の変更が必要となりそうですね。 case of $LANG ; esac とか使って汎用スクリプトってかけないかな>Tomas case $LANG in ja_JP* ) codepage=932 ;; ko_KR* ) codepage=949 ;; zh_CN* ) codepage=936 ;; zh_TW* ) codepage=950 ;; esac そんじゃこうなおせばいい? if [ "$FS" = "vfat" ]; then OPT=",iocharset=utf8,codepage=932" fi ↓ if [ "$FS" = "vfat" ]; then case $LANG in ja_JP* ) $CODEPAGE="codepage=932" ;; ko_KR* ) $CODEPAGE="codepage=949" ;; zh_CN* ) $CODEPAGE="codepage=936" ;; zh_TW* ) $CODEPAGE="codepage950" ;; esac OPT=",iocharset=utf8,$CODEPAGE" fi codepageが必要なのはこの4つだけですよね。 多バイト文化圏って、もっとたくさんありそうにも思うけど(タイとか、中東とかはどうなんだろう?)、とりあえずCJK対応ってことで。いいと思います。 >>150 たくさんのロケールを処理するなら本体にcase文を入れることが冗長になる。 メンテするごとにinitrdを作り直したりする必要ができてたいへんでもある。 ロケールを食わしたらコードページを返すような関数を書いて/usr/local/sbinあたりに置くのはどうか。 関数名をかりに 'langcp' とすると `langcp ja_JP.UTF-8` が 932 になるような関数。 その上で この OPT=",iocharset=utf8,codepage=932" の行を OPT=",iocharset=utf8,codepage=$(langcp $LANG)" とするのが簡潔かも知れない。 考えたら/usr/local/sbinに置いたとしても、その関数を更新すればinitrdを作りなおさなければならないという点では同じことかな。 liblinuxliveの中に langcp () { local codepage case $LANG in ja_JP* ) codepage=932 ;; ko_KR* ) codepage=949 ;; zh_CN* ) codepage=936 ;; zh_TW* ) codepage=950 ;; * ) return 1 ;; esac echo $codepage;return 0 } なんていう関数を書く方がふつうの感覚かも知れない。そのうえで OPT=",iocharset=utf8,codepage=$(langcp $LANG)" jpの修正版が上がっている。 Fluxboxで日本語がまともに使えるようになった。 スゲー殺風景なデスクトップだが軽いのが取り柄。 poorなマシンにお薦め。 ログイン後、"flux"で起動する。 liblinuxliveでtypo発見>はとちゃん --- liblinuxlive.518ja 2006-10-13 14:16:33.000000000 +0900 +++ liblinuxlive 2006-10-15 14:14:39.000000000 +0900 @@ -471,7 +471,7 @@ ja_JP* ) $CODEPAGE="codepage=932" ;; ko_KR* ) $CODEPAGE="codepage=949" ;; zh_CN* ) $CODEPAGE="codepage=936" ;; - zh_TW* ) $CODEPAGE="codepage950" ;; + zh_TW* ) $CODEPAGE="codepage=950" ;; esac OPT=",iocharset=utf8,$CODEPAGE" fi >>155 "$CODEPAGE=932"の"$"は要らない。 →"CODEPAGE=932" 実行時にエラーになる。 それに liblinuxliveはinitrd.gzの中と、toolsの下と、/usr/libの下の3カ所にあるが、 元々内容がそれぞれ微妙に違うよ。 OPTIONを設定しているところの記述は同じみたい。 修正するなら3つのファイルをなおした方がいいんじゃない? やっぱり152みたいな関数が便利かも。関数名はほかのsubfunctionの命名規則(みたいなものがあれば)にあわせて。で、本家にもってく。 152のreturn文は、とりあえずいらないと思う。 >>150 * SBCS (Single Byte Character Set) Codepages 1250 (Central Europe) 1251 (Cyrillic) 1252 (Latin I) 1253 (Greek) 1254 (Turkish) 1255 (Hebrew) 1256 (Arabic) 1257 (Baltic) 1258 (Vietnam) 874 (Thai) * DBCS (Double Byte Character Set) Codepages 932 (Japanese Shift-JIS) 936 (Simplified Chinese GBK) 949 (Korean) 950 (Traditional Chinese Big5) cf) http://www.microsoft.com/globaldev/reference/WinCP.asp >>157 grep "^.*()" liblinuxlive |sort でみるかぎりcreate_block_devices()なんていう命名が多いみたいだしlocale_codepage() ぐらいでいいんじゃないか、 意味まで含めればconvert_locale_codepage(), lookup_locale_codepage()だけど長すぎるかも。スクリプトはこんなもんでいいよ。return文は使う予定がないのなら省く。 関数にしなくても(しない方が)いいんじゃないの。もともと149の部分は関数の中にあるわけだし、それに159にあるのが全部ならこの4つのDBCSに対応すればいいだけだから。 それよかSLAX1.5.8のfluxboxは日本語対応だね。uim-ximもちゃんと動く。もしかして究極のlight weight GUI デラックス版出たでよ。 スゲー600MBを超えてる! 何が入ってるんだろ? >>155 ご指摘ありがとうございます。 initrdと02_core.moの/usr/lib配下にあるliblinuxliveの修正に手間取りましたが、 なんとか動くものができました。 ちょうど本家でも、smb-kioslaveの不具合があったので、それも修正したものを アップしましたので、ご利用ください。 http://hatochan.dyndns.org/slax-ja/index.php?slax-ja%2Fdownload SLAX起動中にUSBメモリーを差すと自動認識して、ダイアログが出る。 ここではマウントしないでキャンセルしておく。 すると、/etc/fstabにマウントエントリーが動的に作成されている。 オプションにiocharset=utf8,codepage=932が書き込まれいれば、liblinuxliveのの修正が効いた証拠。 /mnt/sda1_removableとかいうマウントポイントも出来ている。 mount /mnt/sda1_removableとしてマウントすれば、USBの日本語ファイル・ディレクトリ名が表示される。 JP版で表示されることを確認した。 >>164 jaではうまく反映していないみたい。 echo "fs:$FS iocharset:$IOCHARSET lang:$LANG" > /root/liblinuxlive.log こんな感じでsnapshotしてみたらどうかな。たぶんLANGがCになっているような気がする。 それと、ここのif文もっとシンプルになるよ。 if [ "$FS" = "vfat" ]; then if [ "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET" else case $LANG in ja_JP* ) CODEPAGE="codepage=932" ;; ko_KR* ) CODEPAGE="codepage=949" ;; zh_CN* ) CODEPAGE="codepage=936" ;; zh_TW* ) CODEPAGE="codepage=950" ;; esac OPT=",iocharset=utf8,$CODEPAGE" fi fi でもLANGで判断するのがダメなら、jpみたいにキメうちで932にしなきゃ。 cjk汎用版は無理なのかなー。 >>166 検証しました。だめでした<確認してからアップしろよ自分! というわけで簡単なスクリプトで確認した結果、これでいいかな。 誤) OPT=",iocharset=utf8,$CODEPAGE" 正) OPT=",iocharset=utf8,"$CODEPAGE >>167 いや、たぶんCODEPAGE自体が空白になってるんじゃないかと.. LANGがja_JP*に設定される前に実行されるんじゃないですかこのスクリプト >>168 jaでは、iocharset=utf8,の後が空白なので、LANGは大丈夫だと思われます。 まずは試してみます。 SLAX稼働中にUSBを差し込んだとき、fstabにマウントエントリーの追加は、 /usr/lib/liblinuxlveを使っているから、うまくいかないときはこれをなおして 何度もデバッグできる。 いちいちisoを作り直す必要はない。 >>168 どうもそれっぽいね。 >>169 空白って$LANGが設定されてないんでしょ? >>171 デフォルトではLANG=Cだったかな。 ほんと、どっかで言語(国)の情報を反映できないかな。 このままではSLAXはi18nできないことになる。 カーネルオプションで変数が渡せればcase文で処理できるのにな。 boot: slax なんたらかんたら lang=ja なんていうかんじで。 あそうか1CD-Linuxか。i18nするならやっぱりカーネルオプションしかないかなあ。 knoppixは各国語版でCD/DVD焼いてますね。 /proc/cmdlineから取れば良いんじゃね? >>176 liblinuxliveには、cmdline_parameter()とcmdline_value()が用意されていますので、 こちらを利用して、起動時のパラメータにlang=jaを指定して振りわければできると 思います。こんな感じでしょうか。 #if [ "$FS" = "vfat" -a "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET"; fi if [ "$FS" = "vfat" -a "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET" else if [ "$FS" = "vfat" ]; then CMDLINEVALUE=`cmdline_value lang` if [ "$CMDLINEVALUE" != "" ]; then case $CMDLINEVALUE in ja* ) CODEPAGE="codepage=932" ;; ko* ) CODEPAGE="codepage=949" ;; cn* ) CODEPAGE="codepage=936" ;; tw* ) CODEPAGE="codepage=950" ;; esac OPT=",iocharset=utf8,$CODEPAGE" else OPT=",iocharset=utf8" fi fi fi >>177 いいんじゃない。 cmdline_valueという関数は定義されてるんですね。 >>178 はい、liblinuxlive内にありました。 CMDLINEVALUE=`cmdline_value lang` if [ "$CMDLINEVALUE" != "" ]; then ↑これを1行でまとめられるような気がするんですが、どうするか分かりません。 jpでは、jfbtermとuim-fepで起動時からコンソールで日本語入力を可能にしている らしいのですが。slax-jaで起動時に autoexec=jfbterm;uim-fep とやっても、うまく いきません。 jpでは、どのようにこれを実現しているのでしょうか。 >>180 jfbtermの中でuim-fepを実行する。 autoexec=jfbterm -e uim-fep >>179 こんな感じ? if [ "$(`cmdline_value lang`)" != "" ]; then >>181 やってみました。 autoexec=jfbterm -e uim-fep だと -e uim-fepがjfbtermのパラメータだと認識されませんでした。 というわけで、以下のような簡単なスクリプトを作りました。 #!/bin/sh jfbterm -e uim-fep でも、プロンプトがbash-3.0となって、uim-fepは日本語オンになりませんでした。 もうちょっとぽいんですが…。 >>182 なるほど。 これだと後ろのcase文はどのようにすればいいでしょうか。 >>183 それuim-fepの起動失敗してるんじゃない? スクリプトの実行属性が付いている? >>184 一緒。 #もう寝る。 liblinuxliveの中で$LANGをトレースしてみたらやはり設定されてなかった。 そこで、ブートオプションでlang=ja_jp.UTF-8などとしてして、それを /proc/cmdlineからとってくる方法もありますが、もうひとつ、別な方法として、 実はLANGの指定は/etc/profile.d/lang.shで、 export LANG=ja_JP.UTF-8 などと設定されている。これから取ってくるものを考えてみた。 LANGの値を次のように設定する。 LANG=`grep -e ^export /etc/profile.d/lang.sh|grep LANG=|cut -f 2 -d " "|cut -f 2 -d =` この行をliblinuxliveに次のように挿入する。 if [ "$FS" = "vfat" -a "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET" else if [ "$FS" = "vfat" ]; then LANG=`grep -e ^export /etc/profile.d/lang.sh|grep LANG=|cut -f 2 -d " "|cut -f 2 -d =` case $LANG in ja_JP* ) CODEPAGE="codepage=932" ;; ko_KR* ) CODEPAGE="codepage=949" ;; zh_CN* ) CODEPAGE="codepage=936" ;; zh_TW* ) CODEPAGE="codepage=950" ;; esac OPT=",iocharset=utf8,$CODEPAGE" fi fi はとちゃん版slaxで/usr/lib/liblinuxliveを修正して動作することを確認しました。 なお、fstabのオプションの生成は/usr/lib/liblinuxliveだけが関係してくるようであり、 /usr/lib/liblinuxliveを修正するだけでOKとなった。 initrd.gzの中とtoolsの下のliblinuxliveはどこで使われるのか不明。 ま、一応修正しといた方がいいと思うけど。 >>182 > if [ "$(`cmdline_value lang`)" != "" ]; then こんなときはよく if [ x$(cmdline_value lang) != x ]; then なんてします。 ""がxの1文字で済むので両辺で2文字倹約ですう。 xのかわりに_を使うときもあります。 >>187 /etc/profile.d/lang.shはslax-ja-$(ver)-$(rev).moの中にありますね。これも良策ですが、カーネルオプションで明示的にlang=jaとやるほうが今後sysconfigのメニューで多国語選択可能になった場合、管理しやすいように思います。 sysconfigじゃなくてsyslinux.cfgまたはisolinux.cfgでした。 166-191をまとめると if [ "$FS" = "vfat" ]; then if [ "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET" else case $(cmdline_value lang) in "" ) OPT=",iocharset=utf8" ;; ja* ) OPT=",iocharset=utf8,codepage=932" ;; ko* ) OPT=",iocharset=utf8,codepage=949" ;; cn* ) OPT=",iocharset=utf8,codepage=936" ;; tw* ) OPT=",iocharset=utf8,codepage=950" ;; esac fi fi こんなかんじになるけど、これでいいのかな。iocharsetがutf8でなくてもcodepageは言語に従って指定した方がいいんじゃないかな。 (つづき) ということは、 if [ "$FS" = "vfat" ]; then if [ "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET" else OPT=",iocharset=utf8" fi case $(cmdline_value lang) in ja* ) OPT="${OPT},codepage=932" ;; ko* ) OPT="${OPT},codepage=949" ;; cn* ) OPT="${OPT},codepage=936" ;; tw* ) OPT="${OPT},codepage=950" ;; esac fi これでどうだろう。 (つづきのつづき) if [ "$IOCHARSET" != "" ]; then OPT=",iocharset=$IOCHARSET" else OPT=",iocharset=utf8" fi は1行で OPT=",iocharset=${IOCHARSET:-utf8}" って書くこともできます(bash>2.x)。 ということで決定版です。全部で9行 if [ "$FS" = "vfat" ]; then OPT=",iocharset=${IOCHARSET:-utf8}" case $(cmdline_value lang) in ja* ) OPT="${OPT},codepage=932" ;; ko* ) OPT="${OPT},codepage=949" ;; cn* ) OPT="${OPT},codepage=936" ;; tw* ) OPT="${OPT},codepage=950" ;; esac fi いい! そんじゃ、関数化するとこんなもん? get_codepage() { case $(`cmdline_value lang`) in ja* ) codepage=932" ;; ko* ) codepage=949" ;; cn* ) codepage=936" ;; tw* ) codepage=950" ;; esac echo $codepage } [ "$FS" = "vfat" ] && OPT=",iocharset=${IOCHARSET:-utf8},codepage=`get_codepage`" >>196 あ、でもlangが指定されなかった場合、つまり$(cmdline_value lang)が空だった場合、OPT=",iocharset=${IOCHARSET:-utf8}" のままでとどめたい。でないと OPT=",iocharset=utf8,codepage=" なんてことになってマウントエラーにならないかな。 それと$(~...~)のバッククオートは不要だと思う。$()が``と同じはたらきをするから。 あえて関数にするなら get_codepage() { case $(cmdline_value lang) in ja* ) echo ",codepage=932" ;; ko* ) echo ",codepage=949" ;; cn* ) echo ",codepage=936" ;; tw* ) echo ",codepage=950" ;; esac } [ "$FS" = "vfat" ] && OPT=",iocharset=${IOCHARSET:-utf8}$(get_codepage 2> /dev/null)" かな、私のクセでは最後の文を test _$FS = _vfat && .. なんて書きたい所だけど、これは他の部分の文体に合わせたほうがいい。 >>197 どうでもいいことかも知れないが、この関数の内容からすれば get_codepageではなくて show_codepageだな。 ついでにslax-ja-5.1.8-2.isoでは /tools/liblinuxliveでは # add special options for NTFS if [ "$FS" = "ntfs" ]; then OPT=",ro" #if [ "$IOCHARSET" != "" ]; then OPT="$OPT,nls=$IOCHARSET"; fi if [ "$IOCHARSET" != "" ]; then OPT="$OPT,nls=$IOCHARSET" else OPT="$OPT;nls=utf8" fi fi になっていますが、同様に書き換えると [ "$FS" = "ntfs" ] && OPT=",ro,nls=${IOCHARSET:-utf8}" ということでここも8行分が1行で済みますね。 read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる