2月 242014
 

本題に入る前、一点。
FreeBSD の ports の KDE4 が kde-4.12.2 になりましたなぁ。今までは /usr/local/kde4/ にインストールされていたのですが、このバージョンからは /usr/local/ にインストールされるようになりました。僕の環境では 130 個弱の ports の再インストールが発生しまた。けど、これでようやっと、独自ディレクトリから開放されるぞぉー。って感じです。

と、いうことで本題。

KDE4 をインストールすると default のブラウザに konqueror がインストールされます。それとは別に他のブラウザをインストール、例えば rekonq をインストールするとします。

konqueror も rekonq もユーザエージェントを偽装できる機能を持っています。例えば FreeBSD のこれらのブラウザでアクセスすると「あんたのブラウザでは全部の機能が動作しない。」とか「最新のブラウザではないので利用できない。」などと蹴られる場合があり、以降の表示を止めてしまうウェブサイトがあったりします。

まぁ、仮に表示されたとしても確かに正しく動作しない場合なんかもあったりするんですけどねf(^^;;。

https://profile.microsoft.com なんかは UserAgent を IE11 に偽装したとしても正しく表示できなかったりしますが、それは konqueror や rekonq などのブラウザが対応していないので正常動作しない。と、いうことですね。

 
さてさて。それにしもブラウザでユーザエージェントが選べるのに表示される情報がどれもこれも古いバージョンで困ってしまいます。

konqueror_ua_1

これを最新のバージョンに変更できないのかなぁ? とか思いソースコードを眺めるのですが、ふむ。ブラウザは KDE コンポーネントを見ているようで、ブラウザのソースコードには無いようです。

KDE 的には konqueror も rekonq はコテコテの KDE・Qt アプリなので、共通な機能については共通コンポーネントを使うようになっており、一個のパーツを色々なアプリで利用するってが仕様のようです。例えば Proxy とか キャッシュなども KDE4 の複数のアプリで共有するコンポーネントです。

ブラウザの UserAgent 偽装機能も一緒で konqueror も rekonq もユーザエージェントの設定はコンポーネントが一緒です。
では、その場合ソースコードがどこにあるのか? ですが、見つけました。 FreeBSD の ports 的には以下になります。

x11/kde4-baseapps/work/kde-baseapps-4.10.5/konqueror/settings/kio/uasproviders/

ここに *.desktop というファイルがたくさんあり、ブラウザのバージョンごとの情報を持っているフアイルが複数あります。
これらはインストールすると以下のディレクトリにインストールされることが解りました。

/usr/local/share/kde4/services/useragentstrings/

ここに最新のブラウザに対応した .desktop ファイルを置いてあげると次回起動時にはそのファイルを読み込んで最新のバージョンのユーザエージェントが利用できるようになります。

せっかくですので firefox-24.0 と MSIE-11.0 の .desktop ファイルを作成したので、利用してみたいと思う方は以下の URL から持って行ってください。

http://icmpv6.org/Prog/KDE/firefox240oncurrent.desktop
http://icmpv6.org/Prog/KDE/ie110onwinnt61.desktop

これで konqueror や rekonq では最新の他のブラウザとして動作することができるようになりました。パチパチパチ。ただ、ユーザエージェントの情報が変わっただけで、上にも書いている通り、正しく表示・機能しないウェブサイトがたくさんあることに違いが無いのでご注意ください;-)。

 
さてさて。ここからは付録に近いのですが、 Qt 系ブラウザとして arora というブラウザがあります。 ports 的には www/arora になるんですけども。こいつのユーザエージェントが更新されてないのでソースコードも眺めてみました。すると arora の場合は独自にソースコード中に書いているようですね。以下の xml なファイルで定義しているようです。

arora-0.11.0/src/useragent/useragents.xml

もし、 arora を利用している人でユーザエージェントを最新のブラウザに偽装したい場合には上記のファイルを編集してコンパイルし直せば良いと思われます。

arora は Qt を利用しているけど、 KDE にベッタリ。ってことは無い独自路線のウェブブラウザ。ってことなんですねぇ。

今回はちろっと KDE4 の構成的な説明と、ブラウザのユーザエージェント偽装のためのネタでした。

2月 062014
 

僕はデスクトップに KDE4 を利用しているのですが、 JKUG の日本語化チームとは別に自分で利用する KDE アプリで、日本語化されていないものをコツコツと個別に翻訳しています。

例えば rekonq という konqueror を再定義し直した KDE・Qt ライクなブラウザがあるのですが、こいつはソースに日本語 po ファイルが付いてこないのでメニューなどが英語で表示されます。

まぁ、 konqueror を再定義しただけのことはあって konqueror よりは rekonq のほうが使いやすいかなぁ。とは思う点が多々あるので僕は利用しているんですけども、いかんせん日本語化されてないので、しょーがねぇなぁ。自分で po ファイル書くかぁ。などと思いコツコツと日本語化しているのであります。

僕が今まで日本語化した po ファイルは以下の URL に置いてあるので良かったら持って行ってください。

http://icmpv6.org/Prog/ja.po/

rekonq-2.4.2 に対応した po ファイルの最新版は rekonq-2.4.2-20140205_1.po になります。

 
さてさて。翻訳していて一番大変なのはバージョンアップした時ですね。
新規に po ファイルの翻訳をするのであれば、とある言語の po フアイルを引っ張ってきて Language: とか を ja に変更して、翻訳を開始していけば良いのですが、バージョンアップが発生したときはどうするの?とかになるわけです。

以下、作業手順。あ。僕が個別にどの翻訳グループにも属していないのでこのような手順を踏んているだけで、もしかしたらちゃんとしたもっと効率の良いやり方というのがあるのかもしれませんが・・。その場合は、教えて頂ければ幸いです。

1). 新しいバージョンの po ファイルを取得
2). 以前に翻訳した po ファイルをエディタで開く
3). 新しいバージョンの po ファイルをエディタで開く
4). 新しいバージョンの po ファイルの msgid に以前翻訳した msgstr をペースト
5). 新規に出てきた未翻訳の msgid を翻訳
6). やっと完成。ふぅ・・

なんていう、クラクラするような作業をしなければならずほんとにイヤになる・・。もっと効率的なやり方は無いんかな?

 
と、いうことで考えた技は以下の通り。 UNIX コマンド使いまくりだぁ;-)。 効率よく po ファイルをバージョンアップする技を考えてみました。

・新しい po ファイル: rekonq-2.4.2.po
・古い po ファイル: rekonq-2.3.2.po

ソースコードに日本語の po ファイルが無い場合には他の言語の po ファイルを日本語として使いまわします。 rekonq の場合は po/sv/rekonq.po を利用して rekonq-2.4.2.po としました。

1). msgid の抜き出し

$ cat rekonq-2.3.2.po | grep ^msgid > rekonq-2.3.2.po_msgid
$ cat rekonq-2.4.2.po | grep ^msgid > rekonq-2.4.2.po_msgid
$ diff -ur rekonq-2.3.2.po_msgid rekonq-2.4.2.po_msgid > msgid.diff

 
これで新規に追加になったメッセージと削除されたメッセージの差分が出てきます。
diff ファイルで “+” の部分は新しく登録された msgid で “-” の部分は削除された msgid です。

 
2). diff 結果の取り込み

$ cp rekonq-2.3.2.po rekonq-2.4.2_New.po
$ mule rekonq-2.4.2_New.po

 
rekonq-2.3.2.po は以前に翻訳したファイルなのでそれを最新版にします。そのために msgid.diff の差分を新しく用意した rekonq-2.4.2_New.po に反映して行きます。
“+” で表示されている msgid とその関連する部分は追加し “-” の部分の関連する情報は削除していきます。ガシガシしていきます;-)。 po ファイルには「ソースコードの何行目」なんていうコメント行がありますが、とりあえずそんなのは無視していきます;-)。

以上はエディタで編集する必要がありますが、これで新旧の情報がマージされた po ファイルが完成です。ちっこいバージョンアップだと差分が少ないので po ファイルの更新も楽ちんです;-)。

 
3). 翻訳者支援アプリ
テキストエディタで直接 po ファイルを更新しても良いとは思うのですが、何か支援 AI ではなく、支援ソフトは無いんかなぁ? とか思って調べてみると ports に editors/poedit というのがありますね。 GTK アプリで GUI で利用できそうです。こいつをインストールして起動してみます。

起動したら rekonq-2.4.2_New.po ファイルを読み込みます。すると翻訳可能な状態になります。キャプチャはありませんが、左側が msgid で、右側が msgstr です。 msgstr が空白な部分が翻訳されていない文字列になるのでそれをベコベコ打ち込んでいけば良いかと思われます。
日本語文字入力時に emacs キーバインドが利用できないのが痛いんだけど、GTK2 の emacs キーバインドの設定すれば良いんかなぁ?今度試してみよう。

 
GUI 的なモノで msgid を google 翻訳で翻訳してその結果を msgstr に表示するヤツとかあるんかなぁ? google の textproc/translate-toolkit なんかはその類なのかな? python のコマンドラインツールなんてのは使いたく無いんだけど;-P。

 
poedit は Windows 版 Mac 版もあるようです。編集した po ファイルを保存すると msgfmt も実行してくれるのでいきなり mo ファイルが生成されます。あとはそれを share/locale/ja/LC_MESSAGES/ 辺りにほーりこんで rekonq を再起動すると確認ができます。

 
翻訳用の po ファイルに対する新旧二つの情報のマージって、もっと他に何か画期的な方法・手段ってあるのかなぁ? google で探したけど見当たらなくて、結局 diff してその差分を古いバージョンの po フアイルにマージって方法にしたんだけど・・。

もしかして、本家にマージされた po ファイルは既に差分が吸収された状態でリリースされるとか?そんな便利な世の中ならドンドン本家にマージしたほうが良いなぁ。

それにしても翻訳の方法はこれで良いのかな?

2月 012014
 

このブログのとあるエントリにコメントを頂きました。 URL 的にはこれになるんですけども。

http://running-dog.net/2013/11/post_829.html#comment-36710

たまたま偶然なのかもしれませんが、以前私が日本語 po フアイルを書いた wifimgr が FreeBSD 9.2-RELEASE では動作しなくなったのだけど原因解りますか? と、いうモノです。
ちなみに今回は全然関係ありませんが、日本語 po ファイルは wifimgr の作者送り、採用されています;-)。

 
まず最初に wifimgr のソースコード眺めてみましたが、こいつは小さいプログラムなので簡単でしたね。ただ GTK の部分は全くわかりませんが、今回は GTK の部分はとりあえず置いておくことができそうです。そんな感じでソースコードを眺めたのですが wifimgr は GUI のボタンを押すと system() で ifconfig とか /etc/rc.d/ の下のスクリプトを実行していることが解りました。

 
そして wifimgr のソースコードを眺めてみるとだいたいが /etc/rc.d/netif を起動して、その戻り値でエラーをはいて停止してしまうことが解りました。

次に 9.1-R と 9.2-R の /etc/rc.d/netif を diff してみましたが、大きな相違点としては、 9.2-R では /etc/rc.d/routing を呼ぶようになった部分が怪しいです。実際に 9.1-R の /etc/rc.d/netif を 9.2-R に持ってきて wifimgr を起動すると無事に動作しました。あいや。するっていと原因は本当に /etc/rc.d/routing だねぇ。と、更に特定できました。

 
あとは IRC で教えてもらった以下の設定を /etc/rc.conf に仕込んで /etc/rc.d/routing の動作確認です。

rc_debug="YES"

 
そして /etc/rc.d/routing のあちこちに logger コマンドを仕込んで変数の値を /var/log/messages に出力させます(他にも /etc/rc.subr や /etc/network.subr も見る必要がありますが)。

/etc/rc.d/routing は以下のコマンドオプションで実行されているようですね。

# /etc/rc.d/routing start any wlan0

 
さてさて。原因の特定ですが、以下の行にあることが解りました。

    43          ""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
    44                  for _a in inet inet6 ipx atm; do
    45                          afexists $_a && setroutes $_cmd $_a $_if
    46                  done
    47                  ;;

 
44 行目で inet inet6 ipx atm を定義して 45 行目で static_hoge として呼び出しているのですが inet6 を実行すると戻り値がおかしくなるらしく、その戻り値が /etc/rc.d/routing の戻り値として wifimgr に戻ってエラーになって終了するようです。
実際に

・44 行目の inet6 を消すと無事に動作する。
・45 行目の下に logger コマンドを入れると無事に動作する。
・routing_start() の終了時に return 0 を追加すると無事に動作する。

となりました。
このことをとある方にご連絡したところ、以下のパッチを書いてくださいました。多分次のリリース及び STABLE や freebsd-update では更新されるのではないかと思われます。

以下、頂いたパッチを先行して公開します。 FreeBSD 9.2-RELEASE で wifimgr を使っているが正常に動作しなくて困っている方は適用してみてください。

Index: etc/rc.d/routing
===================================================================
--- etc/rc.d/routing    (revision 255154)
+++ etc/rc.d/routing    (working copy)
@@ -42,7 +42,8 @@
                ;;
        ""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
                for _a in inet inet6 ipx atm; do
-                       afexists $_a && setroutes $_cmd $_a $_if
+                       afexists $_a || continue
+                       setroutes $_cmd $_a $_if
                done
                ;;
        *)

 
これで無事に動作するようになると思われます。 wifimgr のほうもソース修正しなくとも良い(バージョンを見て実行するコマンドオプションを変えるのもつらいべ)のではないかと思われるので一安心です;-)。

あとで wifimgr の作者にメールしようと思います;-)。

あ。最後にですけど、 static_inet6() の戻り値がぶっ壊れる(っぽい)原因は詳しくは調べていません。もしかしたら FreeBSD の rc スクリプトが原因ではなく、僕が設定した /etc/rc.conf の IPv6 の設定がおかしくてそれが原因で正しく処理されずに戻り値が壊れて、結果的に /etc/rc.d/routing の戻り値がエラーになるのかもしれません。その場合、原因は僕にありそうですねf(^^;;。