カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
Ruby-GetText-Package が メジャーリリースして rails に対応した とのこと。
ちょうど業務用に作っている rails アプリがあったので、これを日本語化してみました。基本的に Ruby on RailsでRuby-GetText-Packageを使う の通りに作業して問題なく L10N 化できました。
gem でインストール。
$ sudo gem install gettext Attempting local installation of 'gettext' Local gem file not found: gettext*.gem Attempting remote installation of 'gettext' Select which gem to install for your platform (i686-linux) 1. gettext 1.0.0 (ruby) 2. gettext 1.0.0 (mswin32) 3. Cancel installation > 1 Building native extensions. This could take a while... ruby extconf.rb install gettext checking for setlocale()... yes checking for nl_langinfo()... yes creating Makefile make i686-pc-linux-gnu-gcc -fPIC -O2 -pipe -march=pentium4 -fPIC -I. -I/usr/lib/ruby/1.8/i686-linux -I/usr/lib/ruby/1.8/i686-linux -I. -DHAVE_SETLOCALE -DHAVE_NL_LANGINFO -c _locale.c i686-pc-linux-gnu-gcc -shared -L'/usr/lib' -Wl,-R'/usr/lib' -o _locale.so _locale.o -Wl,-R -Wl,/usr/lib -L/usr/lib -L. -lruby18 -lpthread -ldl -lcrypt -lm -lc make install install -c -p -m 0755 _locale.so /usr/lib/ruby/gems/1.8/gems/gettext-1.0.0/lib ruby extconf.rb install gettext checking for setlocale()... yes checking for nl_langinfo()... yes creating Makefile make make: Nothing to be done for `all'. make install install -c -p -m 0755 _locale.so /usr/lib/ruby/gems/1.8/gems/gettext-1.0.0/lib Successfully installed gettext-1.0.0
プラットフォームを選択するところがありましたが、mswin32 ではないので ruby を選んでみました。つつがなくインストールできたようです。
$ gem list gettext
*** LOCAL GEMS ***
gettext (1.0.0)
Ruby-GetText-Package is Native Language Support Library and Tools
which modeled after GNU gettext package.
require 'gettext/rails'
GetText.output_charset = 'UTF-8'
ドキュメントでは RAILS_ROOT/app/controllers/application.rb に追加していますが、こっちにおいてみました。どっちがいいんでしょ>識者の方。
class ApplicationController < ActionController::Base
before_filter :init_gettext
def init_gettext
bindtextdomain('lazydog', request.cgi)
@headers['Content-Type'] = 'text/html; charset=UTF-8'
end
end
environment.rb に移した分を除いて、ドキュメントそのままです。
rgettextによる翻訳文字列の抽出 ではシェル上で実行していますが、ワイルドカードに ** が使えないシェルを使っているので rake のタスクにしました。RAILS_ROOT/Rakefile に以下を追加(2005/09/07:rgettext コマンドではなく、GetText.rgettext を使うように修正しました)。
desc "Create pot file for L10n"
task :makepot do
require 'gettext/rgettext'
files = Dir.glob('**/*.{rb,rhtml}')
GetText.rgettext(files, "po/foo.pot")
end
po → mo変換 のままです。
desc "Create mo-files for L10n"
task :makemo do
require 'gettext/rmsgfmt'
GetText.create_mofiles(true, "po", "locale")
end
view や helper や contoroller 内の文字列をひたすら _('hoge') に。
ファイルを作って編集。
$ mkdir po $ mkdir po/ja $ rake makepot $ cp po/foo.pot po/ja/foo.po $ vi po/ja/foo.po
rake makemo
すでに動作をさせている環境だったので、kill してから ruby script/server。
おー。ブラウザの Accept-Language によって、表示すべき言語を自動で判断するんですね。便利。
pot ファイルや po ファイルをインクリメンタルに更新するにはどうすればいいんでしょうか。rgettext コマンドは新規に potファイルを生成することはできても、既存の pot ファイルに差分更新することはできないようですので。理想的には以下のようにできるといいなあと。
開発者≠翻訳者で、リリース済みアプリケーションの mo ファイルを作るのではなく、開発者=翻訳者で、開発途中のためにメッセージリソースが頻繁に更新されるという環境を想定しています。
Rubyは、日本が90年代に生み出した最高傑作のひとつ。
とうとう Webmonkey の記事に rails が。Webmonkey は特異なノリの文章で有名?ですが、相変わらず飛ばしてます。やけに半端なところで「次回に続く」となっていますが、本国版を見るに全 6 ページ構成のようですね。
void GraphicWizardsLair( void ); // 今日の井原 - アフィリエイト収入を目的としたスパムblogが急増してる件 より。
私も数ヶ月前から「○○について」という自動生成ページに、このWeb日記の内容がコピペされまくっています。どうやらGoogleやRSS検索などで引っ掛けたblogのdescriptionやCDATAから抜き出して自動生成アフィリエイトblogを生成している感じです。
仕事柄、スパムブログのブラックリストを作ったりしてますが、「○○について」系のサイトは数十確認しています。Wikipedia からすべて「引用」している辞書系サイトと、seesaa ブログのセットですね。例えば、 anon1.com と igakususume.seesaa.net。筍のように増えていて、かなりうんざりします。
差分更新はどうするのだろう と書いたところ、むとうさんと ZnZ さんに msgmerge を使えばできると教えていただきました。ありがとうございます。
ということで、Ruby-GetText-Package の Rakefile ほぼそのままですが、po/mo ファイルの差分更新を rake タスクにしてみました。
def msgmerge(name, po_root, tmp_file = "tmp.pot")
system("msgmerge -U #{po_root}/#{name}.pot #{tmp_file}")
Dir.glob("#{po_root}/*/#{name}.po") do |f|
lang = /#{po_root}\/(.*)\//.match(f).to_a[1]
system("msgmerge -U #{po_root}/#{lang}/#{name}.po #{tmp_file}")
cont = IO.read(f)
cont.sub!(/(Project-Id-Version\:.*)(\d\.\d\.\d)/, "\\1#{GetText::VERSION}")
File.open(f, "w") do |out|
out.write(cont)
end
end
end
desc "Update po files"
task :updatepo do
require 'gettext/rgettext'
files = Dir.glob('**/*.{rb,rhtml}')
GetText.rgettext(files, "tmp.pot")
msgmerge("foo", "po")
File.delete("tmp.pot")
end
desc "Create new pot file for L10n"
task :makepot do
require 'gettext/rgettext'
files = Dir.glob('**/*.{rb,rhtml}')
GetText.rgettext(files, "po/foo.pot")
end
desc "Create mo files for L10n"
task :makemo do
require 'gettext/rmsgfmt'
GetText.create_mofiles(true, "po", "locale")
end
rails で作られたウェブアプリケーションのアグリゲーションサービスです。Flickr、del.icio.us、43things、Audioscrobbler に対応。現在は RSS フィードの内容を表示するくらいしか機能がないので使い道はないですが、育ち方によっては面白そう。すぐできそうなのは、アグリゲートした結果を Javascript 出力してブログのサイドバーにはれるようにするとか、del.icio.us とはてなブックマークに同時に登録できるようにするとか。
他のウェブアプリケーションの機能を mix して自分の機能とする例(googlemap 以外で……)としては、A9.com が 43things、Flickr、Feedster からの検索結果をまとめて表示できることが挙げられるでしょうか。と書いていて気付きましたが、amazlet.com などアフィリエイトの分野の方がこの手の技は進んでますね。
こういうファイルを用意して、↓のようなワンライナー(便宜上改行)に食べさせると、
ruby -ropen-uri -ne '
BEGIN{$h={}};r=$_.chomp.strip;
$h[r]=open("http://raa.ruby-lang.org/gonzui/search?q=%22require+#{r}%22&fm=ruby").read.gsub("\n","").gsub(/<\/?strong>/,"").match(/of (\d+) for/).to_a[1];sleep 10;
END{$h.sort{|a,b|b[1]<=>a[1]}.each{|i|puts i.join("\t")}}
'
こんな結果になりました。RAA の gonzui を使って標準添付ライブラリの使用頻度を調べてみたわけです(どのくらい正確かはあんまり気にしないでください)。
ちなみに上 10 個はこんな感じでした。上 4 つと find はインストーラ、拡張ライブラリ作成やテストなどに使われるものなので多くなるのは当然として thread が結構使われているのが意外でした。socket cgi uri が多いので、Ruby はネットワークやウェブのアプリが多いってことになりそうですね。
rbconfig 249 mkmf 205 test/unit 170 ftools 142 socket 88 getoptlong 71 find 65 cgi 61 thread 52 uri 51
行ってきます。参加予定はこんな感じです。M-3 じゃなくて 8B-3 にすればよかったかな。
gorou さんの 3 つくらい後ろに座ってました。青木さんのコードに対するこだわりが聞けてよかったです。BitChannel のソースが読みやすくて感心して、自分もああいうコードが書けるようになりたいと思っていたので勉強になりました。コンパクト、そして意図を明確に、がポイントですかね。
acts_as_versionedの使い方 :: wiki.rails2u.com を読みながら acts_as_versioned を試していておやと思ったことが。
acts_as_versioned は gem でインストールして、バージョン管理テーブルは create_versioned_table で作成するとします。wikis テーブルは acts_as_versionedの使い方 :: wiki.rails2u.com そのまま。で、create_versioned_table を走らせてみます。
Wiki.create_versioned_table
/usr/lib/ruby/gems/1.8/gems/activerecord-1.11.1/lib/active_record/connection_ada pters/abstract_adapter.rb:462:in `log': You have an error in your SQL syntax. C heck the manual that corresponds to your MySQL server version for the right synt ax to use near '(14)' at line 1: ALTER TABLE wiki_versions ADD created_on dateti me(14) (ActiveRecord::StatementInvalid)
ALTER TABLE wiki_versions ADD created_on datetime(14) という無効な SQL 文を発行しているようです。create_versioned_table の該当部分に相当するコードは以下のようになります。
Wiki.connection.add_column("wiki_versions", "created_on", :timestamp, :limit => 14, :default => nil)
timestamp で type を渡しているのに datetime? ということで add_column を調べていくと、active_record/connection_adapters/mysql_adapter.rb で定義されている ActiveRecord::ConnectionAdapters::MysqlAdapter#native_database_types が原因でした。native_database_types は、ActiveRecord での型とデータベースネイティブの型の変換テーブルを提供しています。timestamp の部分を見ますと、
:timestamp => { :name => "datetime" },
というように datetime に変換されますので、上述した add_column の :timestamp, :limit => 14 は datetime(14) に変換されるわけです。
ActiveRecord の基本的なことのような気もしてきましたが、native_database_types の定義を見るに、ActiveRecord 的には timestamp よりも datetime を使った方がいいってことなんでしょうかね(MySQL 的にどうなのかもよくわかりませんが)。とりあえず、limit を指定しなければプログラム上は OK ですけれど。
安定版の新バージョンが予定通りリリースされました。が、前日のあの怒涛のコミット模様を見ていると、すぐ移行して大丈夫か不安になります……この Linux 機上では make も make test も普通に通っていますけれど。
FUSE という自分の好きなユーザランドのファイルシステムを定義できるソフトウェアがあります。これを Ruby から使えるようにしたライブラリとして FuseFS があります。データを格納する手段というのはプレーンテキスト、CSV、YAML、XML、RDB、www などなどと沢山あるわけですが、FuseFS はそれらのストレージに対するブリッジとして働き、ファイルシステムという統一されたインタフェイスでアクセスできるようにしてくれます(ドライバは自分で書かないといけませんけれど Ruby で手軽に書けます)。何か面白い使い方ができそうだなと思ってましたが、RedHanded で rails アプリの ActiveRecord クラスをマウントする記事が書かれていました。楽しそうですね、これ。後で試してみます。
ということで試してみました。
# emerge sys-fs/fuse # modprobe fuse
$ wget http://rubyforge.org/frs/download.php/6158/fusefs-0.3.tar.gz $ tar fvxz fusefs-0.3.tar.gz; cd fusefs-0.3 $ ruby setup.rb config $ ruby setup.rb setup # ruby setup.rb install
About "How to make a todo list program with Rails 0.9" にある TODO リストアプリを作り、適当にデータを登録します。
mysql> select * from todos; +----+-----------------+------+ | id | description | done | +----+-----------------+------+ | 1 | coding | 0 | | 2 | write diary | 0 | | 3 | drink tea | 1 | | 4 | read AWDR | 0 | | 5 | eat a chocolate | 0 | +----+-----------------+------+ 5 rows in set (0.00 sec)
RailsFS After a Couple Minutes of Tooling With Fuse, Whoa のコードを script/filesys として保存します。後はマウントポイントを作成してから script/filesys を実行すれば OK。
$ mkdir ~/railsmnt/ $ ruby script/filesys ~/railsmnt/
マウントできているか確認します。
$ ls ~/railsmnt/ todo ls ~/railsmnt/todo/ 1 2 3 4 5 $ cat ~/railsmnt/todo/ cat: /home/date/railsmnt/todo/: Is a directory $ cat ~/railsmnt/todo/1 --- !ruby/object:Todo attributes: done: "0" id: "1" description: coding $ vi ~/railsmnt/todo/1 # done を 1 にして :wq "railsmnt/todo/1" E212: Can't open file for writing
読むのはできましたが、書けないですね。read only になっている模様。うーむ。
NerdTV続報(L'eclat des jours) 経由
NerdTV はMacPaint のソースコードが公開へ で知った口です。その翻訳をされている方が。CC が有効活用されているのを初めて見た気がします。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).
_ むとう [environment.rb に移した方が良いかもしれませんね。requireとset_output_charset..]
_ だて [どうもです。GetText.rgettext を使うようにしました。]