自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

December 03, 2006 [長年日記]

[Rails] Ruby-GetTextのRails 1.2RC1対応(2)

この前のテストの件も解決したっぽい。とりあえず、一段落かな。

人柱になってくれる方は是非、Rails1.2RC1+Ruby-GetText CVS版で試して見てくださいませ。

CVSのホーム(README)のあるディレクトリでrake packageとするとpkg配下にgemができるので、後はそれをgem installすればOKです。あるいは、ruby setup.rbでOK。

[Misc] それにしても

なんだか、最近、Ruby-GNOME2にしろRuby-GetTextにしろ質問メールが多いな。というか、Ruby-GNOME2は早く次出せ!ってのが多いか。まぁ、それだけ放置してるのが問題なのはわかっているのよん(すんまそん)。


December 04, 2006 [長年日記]

[Ruby] Ruby-GetTextのRails 1.2RC1対応(3)

昨日のCVSの状態だと、poparser.rbが見つからない、というエラーが出るというレポートをいただきました。

このファイルは元々はsrc/poparser.ryからリリース時にrake poparserして生成していたのですが、考えてみるとほとんどアップデートしていないので、lib/gettext/poparser.rb自体をCVSにインポートしました。

なので、CVS版を試される方は再度最新版で試してくださいませ。


December 13, 2006 [長年日記]

[Rails] act_as_translatable

指定したモデルのカラムを翻訳できるようにするプラグイン。Globalizeと同様にデータベース中に翻訳文字列を持たせる形態。

Ruby-GetTextを「アプリが提供する静的な文字列の国際化」、act_as_translatableを「アプリを使うユーザが入力する動的な文字列の国際化」、と棲み分けて使うことを想定しているようだ(上記サイトの例でもRuby-GetTextと連携する方法を書いてくれている)。

ちょっと使いかたがわかりづらかったので紹介がてら検証した方法をメモっておくことにする。mysqlとRailsを事前にインストールしておく。

まず、テスト用のプロジェクトを作る。

$ rails test -d mysql
  :
  :
$ cd test

db/schema.rbというファイルを作る。内容は以下。articlesというのはRuby-GetTextのサンプルを持ってきただけなので特に意味は無い。念のため。

ActiveRecord::Schema.define(:version => 1) do
  create_table "articles", :force => true do |t|
    t.column "name", :string
  end
end

config/database.ymlを適宜修正する。Fedora Core 6の場合はsocket/encodingの指定を追加する。以下のような感じかな。

development:
  adapter: mysql
  database: test_development
  username: root
  password:
  host: localhost
  socket: /var/lib/mysql/mysql.sock
  encoding: utf8

んで、DBとテーブル作成。

$ mysqladmin -u root create test_development #rootは環境に合わせて変更してね。
$ rake db:schema:load

ここまででDBの準備は終了。mysqlで内容を確認してみる。

$ mysql -u root test_development
mysql> show tables;
+----------------------------+
| Tables_in_test_development |
+----------------------------+
| articles                   | 
| schema_info                | 
+----------------------------+
2 rows in set (0.00 sec)
 
mysql> desc articles;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment | 
| name  | varchar(255) | YES  |     | NULL    |                | 
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

さて、前置きが長くなったけど、ここからはacts_as_translatableの説明。mysqlのコンソールは後で使うのでそのまま放置し、別のウインドウで以下を実行してほしい。

まずは、上であげたリンク先からacts_as_translatable-0.2.0.tar.gzをダウンロードして/vendor/pluginsに配置する。

$ cd vendor/plugins
$ tar xvzf ~/acts_as_translatable-0.2.0.tar.gz -C .

おっと、モデルを作るのを忘れてた。

$ cd ../../
$ ruby script/generate model article

acts_as_translatableで日本語を使うためのおまじないをconfig/environment.rbの一番下に記述する。

$KCODE = "u"  #これは上の方がベター
class TranslationLanguage
  LANGUAGES.merge!({:ja => '日本語'})
end
TranslationLanguage.base = :en  #デフォルトを英語とする。

app/models/article.rbに以下を追加。nameカラムを翻訳可能にする。

class Article < ActiveRecord::Base
  acts_as_translatable :fields => [:name]
end

準備完了。以降はscript/consoleを使う。

$ ruby script/console
Loading development environment.
>> TranslationLanguage.current = :ja #現在の言語を指定
>> article = Article.new(:name => "English name")
=> #<Article:0x2aaaae544bc8 @new_record=true, @attributes={"name"=>"English name"}>
>> article.save
=> true

このタイミングでmysqlのウインドウに戻ってみると、以下のようにtranslation_articlesというテーブルが新規作成されていることがわかる。

mysql> show tables;
+----------------------------+
| Tables_in_test_development |
+----------------------------+
| articles                   | 
| schema_info                | 
| translation_articles       | 
+----------------------------+
3 rows in set (0.00 sec)
 
mysql> select * from articles;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | English name | 
+----+--------------+
1 row in set (0.00 sec)
 
mysql> desc translation_articles;
+----------+------------+------+-----+---------+----------------+
| Field    | Type       | Null | Key | Default | Extra          |
+----------+------------+------+-----+---------+----------------+
| id       | int(11)    | NO   | PRI | NULL    | auto_increment | 
| model_id | int(11)    | NO   | MUL |         |                | 
| language | varchar(2) | NO   |     |         |                | 
| name     | text       | YES  |     | NULL    |                | 
+----------+------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
 
mysql> select * from translation_articles;
Empty set (0.00 sec)

当然、このタイミングではtranslation_articlesは空だ。

引き続き、script/consoleを実行しているウインドウに戻り、以下を実行する。

>> article.name = "Japanese name"
=> "Japanese name"
>> article.save
=> true

mysqlの内容を確認してみる。

mysql> select * from articles;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | English name | 
+----+--------------+
1 row in set (0.00 sec)
 
mysql> select * from translation_articles;
+----+----------+----------+---------------+
| id | model_id | language | name          |
+----+----------+----------+---------------+
|  1 |        1 | ja       | Japanese name | 
+----+----------+----------+---------------+
1 row in set (0.00 sec)

あとは、これらを参照するときにどの言語で検索するかで結果が異なる。内容の方は@attributesのnameの値を確認してほしい。

>> Article.find :first
=> #<Article:0x2aaaae4ec4a0 @attributes={"name"=>"Japanese name", "id"=>"1"}>
>> TranslationLanguage.current = :en
=> :en
>> Article.find :first
=> #<Article:0x2aaaae4e3ff8 @attributes={"name"=>"English name", "id"=>"1"}>
>> TranslationLanguage.current = :de
=> :de
>> Article.find :first
=> #<Article:0x2aaaae4da700 @attributes={"name"=>"English name", "id"=>"1"}>

上記のポイントは、「一度登録したカラムに対し、新たにデータをセットすると、それが翻訳文字列として認識される。」ということ。最初に生成したものが翻訳対象(翻訳元文字列)という扱いである。実際はcontrollerで情報を保存していくんだろうけど、その際に最初に保存するオリジナル文字列が何で、これから登録しようとしている情報が翻訳文字列でというのをUI側でうまく区別しないとダメなんだろうな。管理系の登録画面でベース言語とユーザ言語の2種類の入力欄を用意する、みたいな感じで使うのかしら。あとはベース言語を入力して、その後、まったく別のタイミングでユーザ言語を追加する、みたいな感じか。

実はGlobalizeを見たときもよくわからなかったんだけど、こういうのって具体的にはどのような時に使うんだろう。CMSなんかで、ユーザ自身がいろいろと国別に表示するような情報を作成する時には使うのかな。あるいは複数言語の同一内容の記事を提供するニュースサイトとか・・・。そっか、そういう用途なら結構アリかも。

蛇足なんだけど、オレ的にはこのアプローチの他に、もう一つのacts_as_localized (?)みたいなものを考えてたりする。どういうものかというと、単に、ある言語で登録された情報はその言語の時にしか表示しない、というもの。acts_as_translatableは翻訳元があって翻訳先を作るわけだけど、こちらは単に登録された言語の情報しか表示しない。例えばローカライズされたWikiをURLの変更無しで見るようなイメージ。実装はきっとシンプルで、langというカラムをローカライズしたいテーブルに追加してwith_scopeで現在のlocaleに限定するって感じ。

ま、ともかく、今までGloblizeにしか無いとしてGlobalizeの利点としてあげられていた機能が単独でかつ、Ruby-GetTextと組み合わせて使うことができるというのは良いことだ。また一つピースが埋まった感じがするよ。うひ。


December 16, 2006 [長年日記]

[Fedora] PCがブートしない!

電源入れるとCD Boot: とか表示されてその後何も起きなくなる。ひょっとしてハードディスクがいかれたか!?

って、iPodを接続していたのが問題でした。そっちにOSを探しに行っちゃってたのね。iPod外したら無事ブートしましたよ。

はー、びっくりした。


December 17, 2006 [長年日記]

[Rails] Ruby-GetText-Package エスペラント語

新たにエスペラント語(eo)がCVSに追加されました。14言語目、かな。

エスペラント語

[Fedora] GL/glut.hがない

RubyのOpenGLバインディングであるrbogl-0.32gをコンパイルしようとしたらGL/glut.hが無いよ、と言われてコンパイルできない。

あれこれ探してみたところ、extrasパッケージにあるfreeglut-develに入っていたので以下のようにしてインストールしたところ無事解決した。

yum install freeglut-devel

GLUTってMesaに入ってるんじゃなかったっけ? 別パッケージとして独立したのかな。それとも別実装?うーむ、よくわからん。

あれ?なんだかコンパイルでwarningがいっぱい出るな・・・。これはx86_64だから?ま、コンパイル通ったからよしとするか・・・。あれ、サンプル起動すると以下のようなWarningとが出て画面が描画されないな。

% ruby list.rb 
libGL warning: 3D driver claims to not support visual 0x5b
DRM_I830_CMDBUFFER: -22

なんだなんだ・・・・。グラフィックカードの問題? って、ま、いっか。眠いし、見なかったことにしよう(すんまそ)。

おや、Desktop EffectsをDisableにすると正常動作するぞ。もしかして、compizかAIGLXあたりの問題?


December 22, 2006 [長年日記]

[Rails] Ruby-GetText-Package カタルーニャ語

新たにカタルーニャ語(ca)がCVSに追加されました。15言語目。

カタルーニャ語

カタルーニャ語ってどこの言葉なんだろう、と思ってちょこっと調べてみたら、スペインのバルセロナ辺りで使われている言葉なんですね。

本日のツッコミ(全2件) [ツッコミを入れる]

通りすがり [スペインも多民族国家ですからね。カタルーニャ語、バスク語、ガリシア語はそれぞれの地方公用語になっています。あと、地方..]

むとう [へー、たくさんあるんですねー。]


December 26, 2006 [長年日記]

[Ruby-GNOME2] MSC version unmatch

最新のRuby One Click installerとMSVCを使ってRuby-GNOME2をコンパイルしようとしたらMSC version unmatchというエラーが出た。

ググって見るとこのようなことらしい

これって簡単に言うとVC++であろうとMinGWであろうと作成したバイナリに互換性を持たせるため、VC++はVC+6.0に限定するよってことなのかな。

今までのコンパイル手順が使えなくなるのはツライのぅ。まぁ、とはいっても今後はコンパイラが限定されるということであればこちらとしてもありがたい。

とりあえずMinGW版でコンパイルをトライしてみるか。

[Ruby-GNOME2] MinGW版

コンパイルできた。というかできるところまで持っていたというのが正解かな。同じバイナリでOne click installerも動作した。ほっ。

そういえば、rsvgとgtksourceviewもコンパイルに成功した。やったー、と思ってサンプルを実行すると「アクセスが拒否されました」というエラーが出る.... orz。ってか何なのコレ!?どうすればいいの?誰か教えてくれ〜(T_T)

E:\ruby-gnome2\rsvg\sample>ruby svg-viewer.rb
e:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt/rsvg2.so: 5: アクセスが拒否されました
。   - e:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt/rsvg2.so (LoadError)
        from e:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `re
quire'
        from e:/ruby/lib/ruby/site_ruby/1.8/rsvg2.rb:7

本日のツッコミ(全1件) [ツッコミを入れる]

なかだ [「互換性を持たせる」わけではなくて(そもそもVC{6,7,8}は相互に互換性がないので不可能)、コンパイル時にもはじ..]


December 27, 2006 [長年日記]

[GTK+] GNOMEのWin32向けバイナリ

む。知らんかった。結構いろんなライブラリがあるじゃん!


December 28, 2006 [長年日記]

[Ruby] sfmltoj-1.3

気づかなかったんだけど、またSF.netのメーリングリストアーカイブがバージョンアップされてたのね・・・ってまだ日本語ダメなんかい(汗)。

たださんがパッチを送ってくれた(ありがとうございました)のだけど、残念ながらSF.jpで使っているRuby(ruby-1.8.0)はNKFがまだUTF-8をサポートしていないとのことで文字化けが直らなかった。そこでNKFの部分はIconvを使うように書き換えたところうまく文字化けが直ったのでそちらのバージョンでリリースすることにした。ruby-1.8.2以降を使っている環境ではたださんのパッチをあてるだけでもOK。

あ、sfmltojが何のツールかというと、SF.net上で日本語MLの文字化けを直してくれるCGIです。SF.net上で日本語MLを運営している方は是非導入してみてください。


December 29, 2006 [長年日記]

[Ruby-GNOME2] Ruby-GNOME2-0.16.0.0 リリース

遅ればせながらリリースしました。年内に間に合ったよ。ほっ。

GTK+-2.10をサポートしてます。印刷機能やステータスバーに載せるトレイアイコン、その他諸々の機能が追加されています。ぜひ試してみてくださいね。

あ、そうそう、Ruby/Libgda, Ruby/GStreamerをリリースから外します。これらは長らくメンテナンスされておらず、また、最新のLibgda, GStreamerではコンパイルできなくなっています。ほとんど使われてないみたいですし、ま、いっかなと。必要な人はぜひメンテナに立候補してくださいね(なかなかいねーだろーなー)。

[Ruby] mkmf.rbのpkg_configメソッド

ruby-talkを見て気づいたんだけど、mkmf.rbってpkg_configっていうメソッドがあるんだねー。初めて知ったよ(Rubyリファレンスマニュアルにも書いてないし、RDoc化もされてないみたいだし、しょうがないよね(なげやり))。

実はRuby-GNOME2は自前のpkg-config.rbというもので同様の機能を提供してるんだよなー。最もpkg-configを使うであろうRuby-GNOME2プロジェクトがruby自身が提供しているpkg_configを使っていないっつーのはちとイケてないような気もするが・・・。ま、いっか。見なかったことにしよう(苦笑)。

本日のツッコミ(全1件) [ツッコミを入れる]

なかだ [抜けてますね。そのうち書きます。 > pkg_config]


December 31, 2006 [長年日記]

[Misc] 2006年度総括

2006年も終わり、ということなので一年の総括をしてみた。

  1. Ruby-GetText-Package
    今年は主にRuby-GetText-Packageに力をいれた年だった。Ruby on Railsを軸にかなり強力なライブラリ&ツールになってきたと思う。いろいろな雑誌・書籍等でも紹介してもらった。まだ、改善したい点はいくつも残っているので来年も開発を続ける予定。 もちろん、Ruby on Rails以外でも使うことができるのでデスクトップアプリケーション等でも積極的に使ってほしいなー。
  2. Ruby-GNOME2
    昨日、ようやっと0.16.0をリリースした。今年は2回しかリリースできなかったな。でも、規模がでかいのでなかなか頻繁にリリースする時間がとれないんすよ。すんまそ。
  3. Ruby/CLDR
    もう一つの国際化ライブラリとして、通貨に代表される地域ごとの情報を適切に取得したり書式指定して表示したりするAPIを提供するライブラリの開発をはじめた・・・んだけど0.1.0を出してから手を付けていない。来年、少しは手を付けられるといいんだけど・・・。
  4. Mt.Fuji, a hawk and an eggplantという英語ブログを開設
    志は高かったんだけど、全然アップデートできてないし内容も薄い。時間取れないよなぁ。
  5. ニューPC
    ひさしぶりに自宅PCを購入。Intel Core 2 Duoという x86_64なアーキテクチャのマシン&OSにしたため、i386環境でしか動作しないマルチメディア周りのライブラリ・アプリ等に振り回され、地味に面倒くさい状況に。
  6. その他
    tDiary向けのアクセスカウンタプラグイン、リファラエディタプラグイン、sfmltoj等をいただいたパッチを元にアップデート。あとはThe Ruby Way 2nd editionのお手伝い。

仕事と(OSS以外の)プライベートの方が忙しくて、あまりOSS的な活動できなかった一年だけど、まぁ、続けられて良かった。また、来年も続けられるといいな。

というわけで、また来年!