Kenji Tachibana's Weblog

http://blogs.sun.com/kenji/date/20050803 2005年 8月 03日 水曜日

Metropolis がやってきた

久しぶりなので、Blog らしく、くだけた感じで堅苦しくないことを書こうかと思います。

先日、まちに待った、新しいホームマシンがやってきました。それも...

Sun Java Workstation W1100z - Metropolis

すばらしい!プロダクトのテストマシンとしては、何度も使っていて、「こんなのが、自分専用だったらなぁ」 とずっと思っていたのですが、本当にやってくるとは。詳細な spec は、 http://jp.sun.com/products/desktop/ws/w1100z にありますが、主なものだけ書くと、

- AMD Opteron 150 プロセッサ (2.4GHz)
- 2GB Memory (1GB + 1GB 拡張)
- XF86-NV NVidia Corporation NV34GL [Quadro FX 500]
- 80GB SCSI disk

という構成です。すごい。Disk 容量が IDE base の PC に比べるとちょっと少ない気がしますが、 80GB あれば、使い切ってしまうことはないでしょう。早速 Solaris 10 を install してみました。 社内の machine なので、あらかじめ用意されているインストールサーバーから、ネットインストールしました。W1100z は、デフォルトでは、PXE boot を受け付けてくれず、BIOS の設定画面から、PXE boot を 有効にしてあげないと、boot device の選択 (起動直後に F8 を押すと表示される) で、network が選べません。はじめてネットインストールをしようと思うときには、注意が必要です。 順調に install が始まったんですが、早い! S10 の entire (全部) のインストールで、30分ぐらいでした。 Net install とはいえ、この早さは驚きでした。

今までは、Solaris 9 を使っていて、CDE を使っていましたが、 この際 Sun Java Desk Top に切り替えることにしました。 早速、ログインすると ..... 遅い。あれれ、こんなはずではなかったんですけどね... 端末エミュレータ (gnome team) の背景を透明にして、クルクルとドラッグしながら 回してみると、まるで分身の術のようでした。うーん、なんじゃこりゃ。 このマシンでこの遅さはまずいんじゃないのと思い、 Solaris チームの佐山さんに相談してみると、どうやら、video card の ドライバの問題で、修正版が、

http://solaris-x86.eng/nVIDIA/

にでているそうです。早速ダウンロードして、インストールし、Xorg の設定を変更しました。 私のディスプレイは、マイナーな 24inch だったので、
  1. dtlogin から console で login し、dtlogin を止める
     # /etc/init.d/dtlogin stop

  2. xorg.conf のテンプレートを自動生成
     # env HOME=/ /usr/X11/bin/Xorg -configure

  3. #2 で生成されたテンプレート xorg.conf.new の Monitor の部分を修正
     
     Section "Monitor"
        DisplaySize       473.6  296    # mm
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
        HorizSync       30-96
        VertRefresh 48-160
      EndSection

  4. #2 で生成されたテンプレート xorg.conf.new の SubSection "Display" の部分の Modes を
    1920x1200 に変更

  5. システムを reboot (X を起動し直すだけでは、driver が有効にならないので)
で、再度、login してみると、大成功。S9 では使用できなかった 1920x1200 も きちんと使えるし、さっきの分身の術もすっかり直っていました。さすが、佐山さん! あまりにも快適になった、ホームマシン。これで looking glass も動かせるようになりました。 次は、free の mailer でも入れてみようかと思っています。

http://blogs.sun.com/kenji/date/20050624 2005年 6月 24日 金曜日

第2話 - libauto_ef の使い方

libauto_ef の使い方です。libauto_ef は、文字エンコーディングを 判別するための library で、auto_ef (第1話参照) も、libauto_ef を 使って、エンコーディングを判別しています。 libauto_ef が提供している関数の詳細については、libauto_ef(3LIB) を 参照してください。ここでは簡単な sample (auto_ef_file()) とその説明を載せます。

     /*                                   */
     /* test_file.c : auto_ef_file sample */
     /*                                   */
     1  #include 
     2  #include 
     3
     4  main (int argc, char **argv)
     5  {
     6          auto_ef_t *root1 = NULL;
     7          int i=0;
     8          size_t test;
     9          test = auto_ef_file(&root1, argv[1], AE_LEVEL_0);
    10          for (i=0; i < (int)test; i++){
    11                  printf("encoding = %s\n", auto_ef_get_encoding(root1[i]));
    12                  printf("score = %f\n", auto_ef_get_score(root1[i]));
    13                  printf("\n");
    14          }
    15          auto_ef_free(&root1[0]);
    16          exit(0);
    17  }

     2  #include 
ヘッダーファイル auto_ef.h を取り込んでいます。 auto_ef.h は、/usr/include/auto_ef.h にあります。
     6          auto_ef_t *root1 = NULL;
エンコーディング判別の結果を格納する root1 を定義しています。 root1 に格納された値は、auto_ef_get_encoding (3LIB)、auto_ef_get_score(3LIB) で 取得することができます。11 行目、12 行目で実際に使っているので参照してください。
     9          test = auto_ef_file(&root1, argv[1], AE_LEVEL_0);
エンコーディングの判別を行います。2番目の引数 argv[1] には、判別を行う 対象のファイル名が入ります。3番目の引数 AE_LEVEL_0 は、判別の精度を 指定しています。レベルは 0 から 3 まで存在し、AE_LEVEL_0 が最も精度が低く、 レベルが上がるに従って、精度は上がりますが、処理速度は遅くなります。 auto_ef_file は可能性のあるエンコーディングの数を戻り値 (test) として 返します。
    10          for (i=0; i < (int)test; i++){
    11                  printf("encoding = %s\n", auto_ef_get_encoding(root1[i]));
    12                  printf("score = %f\n", auto_ef_get_score(root1[i]));
    13                  printf("\n");
    14          }
判別したエンコーディングを出力しています。 auto_ef_get_encoding は、判別されたエンコーディング名を取得します。 エンコーディング名は、Solaris にバンドルされている iconv (1) で 使用できるエンコーディング名になっています。 auto_ef_get_score は、判別された エンコーディングにマッチする 可能性 (パーセンテージ) を取得します。
   
    15          auto_ef_free(&root1[0]);
auto_ef_file によって割り当てられたメモリーを解放します。

コンパイルは cc, gcc のどちらで可能です。 ただし、バンドルされている cc (/usr/ucb/cc) ではコンパイルできません。 コンパイルの仕方は、
% cc test_file.c -lauto_ef
で、コンパイルできるはずです。

実行方法は以下の通りです。
./a.out FILENAME
filename にエンコーディングを判別したいファイル名を入力します。

実行結果は以下の通りです。
% ./a.out ~/memo/command.doc 
encoding = eucJP
score = 94.000000

encoding = ko_KR.euc
score = 5.000000
このように、使い方は非常に簡単ですので、 是非試してみてください。

http://blogs.sun.com/kenji/date/20050617 2005年 6月 17日 金曜日

ローテクな話 - 第一話 auto_ef について

多少、技術的な話をまとめた自分用のメモ書きのような場所を作ってしまいました。他の方のサイトと違い、最新技術の話や、聞いて役に立つ話はほとんどないと思います... ちなみに、ローテクというは、 ローテク = low technique + localization technique の造語です。 第一話として、Solaris 10 に実装された、auto_ef というコマンドについてです。

このコマンドは私が初めて (というか最初で最後) Solaris に実装したコマンドです。 また、Sun Java Enterprise messaging server のアラビア語とタイ語の問題を 解決するためにも利用されています。タイ語は patch としてしか提供されていない ようですが (確か bugID 5084308 だったと思います)、アラビア語に関しては、一応、 docs.sun.com のドキュメントに掲載されています。 (http://docs.sun.com/source/819-1054/channel2.html)

auto_ef は引数として入力されたファイルの文字のエンコーディングを調べて出力してくれます。 nkf というコマンドが日本語では非常に有名ですが、nkf の国際化版、というのが 一番わかりやすいかと思います。もしくは、Mozilla などの browser に 実装されている文字コード自動判別機能をコマンドと、ライブラリにしたようなものです。

最も単純な使い方は、

% /usr/bin/auto_ef 
と実行すれば、 で指定されたファイルのエンコーディングを出力してくれます。
例: 
% /usr/bin/auto_ef ~/memo/command.doc 
eucJP
ここで、表示されるエンコーディングは、Solaris の iconv (1) で利用可能な、 エンコーディングです。詳しくは、iconv の man page を参照してください。
-a オプションを指定すると、可能性があると判定されてエンコーディングが スコア付きで表示されます。
例:
% /usr/bin/auto_ef ~/memo/command.doc
eucJP  0.94
ko_KR.euc  0.05
この場合、eucJP である確率が 94%、 ko_KR.euc である確率は 5%、(残り 1% は、他のエンコーディング) であると判定されています。

auto_ef とうコマンド自体は、実は、libauto_ef という library を呼び出しているだけの コマンドで、第2話では、libauto_ef について書こうと思っています。


Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.