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

November 03, 2008 [長年日記]

[Ruby] CoolなRDocテンプレート Allison

使いやすいRDocテンプレートないかなぁ、と思って探してたらナイスなの見つけたので、さっそくRuby-GetText-PackageのAPIリファレンスに適用してみた。

何といってもフレームを使っていないのが良い。もうこれだけで採用!って感じなんだけど、左ペインで表示クラスをフィルタできたりするのもナイス。

使い方は簡単。

gem install allison

してインストールした後に、

$ allison --title 'My RDoc' --line-numbers --main README --promiscuous *

と実行するだけ。

Rakefileに指定する場合は普通のタスクの他にtemplate指定を追加するだけ。具体的には以下のような感じにする。

Rake::RDocTask.new { |rdoc|
  rdoc.rdoc_dir = 'doc'
  rdoc.title    = "Ruby-GetText-Package API Reference"
  rdoc.options << '--line-numbers' << '--inline-source'
  rdoc.rdoc_files.include('README', 'ChangeLog')
  rdoc.rdoc_files.include('lib/**/*.rb')
  rdoc.template = `allison --path`.chop
}


November 04, 2008 [長年日記]

[Ruby] Ruby-1.9.1を試してみた

String#%のRuby-GetText-Package拡張(?)が採用されてるじゃありませんか!? わーい!!

 irb(main):001:0> "I love %{val}" % {:val => "Ruby"}
 => "I love Ruby"

このチケットですね

こんなこともできるようになったのか。

irb(main):002:0> "%<foo>d : %<bar>f" % { :foo => 1, :bar => 2 }

これはこれでRuby-GetText-Packageでも活用できますね(でもこの記法はちょっと複雑なのでRuby-GetText-Packageスタイルもサポートしてくれてよかったです)。
関係各位、採用していただきありがとうございました。


November 07, 2008 [長年日記]

[Rails] Rails-2.2のActiveSupport::Memoizableがイイ!

Rails-2.2の勉強中。いやー、こりゃまたエラくかわったなー、とか見てたら、いろんなところでmemoize :foge 的な記述が。ん?なんじゃこれ?っというわけでググるとこの辺に詳しい情報が。おぉぉぉ。こ、これは・・・すげーいい。そして実装がエロい(当社比)。

ぬー、Ruby-GetTextでも使いたいなー。マジですげー使いたい。

でも、ActiveSupportに依存させたら負けだよなー(何に?)。

正直Ruby-GetTextではサンプルのイマイチな例文と同じことメソッド単位でチマチマてんこもりでやっているので超ダサいと言われてもしょうがない状況(穴があったら入りたい、そして冬眠したい)。

独自に簡易版を実装するかなー(コピペとも言う)。

こういったメソッドの結果をキャッシュするのって、Rubyのように比較的遅いと言われているスクリプト言語では比較的単純で効果的な高速化のやり方だよね。Ruby本体に入っていてもいいと思ったり。

ん?これメソッドの引数をそのままキャッシュオブジェクト(要はハッシュ)のキーにしてるのか・・・。使い方によってはメモリリークするんじゃないかな・・・。あるいはOutOfMemoryとか。引数の与え方は注意しないとダメかも。なかなか単純ってわけにもいかなそうだなぁ。


November 10, 2008 [長年日記]

[Ruby] to_s, to_str, inspect

またしても違いに悩んでしまったのでメモ。Ruby 1.9.0 リファレンスマニュアルから。

  1. Object#inspect - オブジェクトを人間が読める形式に変換した文字列を返す。
    組み込み関数 Kernel.#p は、このメソッドの結果を使用してオブジェクトを表示する。
  2. Object#to_s - オブジェクトの文字列表現。
    Kernel.#print や Kernel.#sprintf は文字列以外のオブジェクトが引数に渡された場合このメソッドを使って文字列に変換する。
  3. to_str - 暗黙の変換用。
    では、暗黙の変換とは・・・。うーん、難しい。そのサブクラスが「文字列が使われるすべての場面で代置可能であるような、文字列そのものとみなせるようなものという厳しいもの」との説明。

実験。

class Test
  def to_s; "to_s"; end
  def to_str; "to_str"; end
  def inspect; "inspect"; end
end
 
t = Test.new
p t  #=> inspect
puts t #=> to_s
puts "result = #{t}"  #=> to_s
puts "result = " + t #=> to_str

to_sとinspectはいいんだけど、to_strがとても難しい。まつもとさんの説明では、「Stringと類似のメソッド集合を持たないオブジェクトはto_strを定義するべきではない」ということで、実際、Pathname#to_strが削除されているし、CSVの例では、to_strを使う場合は、そのクラス自身がStringとほぼ同じAPIを持つべしということでStringへのDelegateが推奨されている。
今、作っているクラスは、to_strがあるととてもうれしい(上の例で、to_strがないと最後の行だけ失敗するのはちょっと気持ち悪い)のだけど、そこはあえてto_sするか、"#{t}"形式を使うようにするか、としないといけないってことなのかなぁ。


November 20, 2008 [長年日記]

[Rails] Rails-2.2

ソースを読むと至る所にmemoize :fooが使われてる。キャッシュしまくりだな。

高速化は良いことだけど、メモリ使用量が増えて困った、なんてことはないんだろうか。

・・・・ってか、TemplateFinderなくなっちゃたのか?


November 22, 2008 [長年日記]

[Rails] Rails2.2 default_charset

Rails 2.2ではContent-Typeの文字コードを設定できるようになった。 Ruby-GetText-Packageが個別に設定する必要はなくなったのでRails2.2版では削除しよう。これは素直にうれしい。

class ApplicationController < ActionController::Base
   :
   :
  self.default_charset = "iso8859-1"
end

ActionController::Baseのクラス変数のアクセッサとして登録されているのでそれを使う。(当たり前だけど)self.を使わないとうまくセットされないので注意。


November 27, 2008 [長年日記]

[Ruby] Ruby-Localeはじめました。そしてヘルプミー!

Ruby-GetText-PackageからLocaleクラス部分を切り離したライブラリ、Ruby-Localeと、そのRuby on Rails 2.2用プラグイン Ruby-Locale for Ruby on Railsをリリースしようと思います。

このライブラリはあらゆる環境下のプログラム(GUI, CUI, WWW, ライブラリ、MatzRuby, JRuby, Win32, *nix)でロケール情報の根幹であるロケールID(Language tags)を一元的・シームレスに扱うことができるもので、あらゆるI18n/L10nのベースとして、あるいはハブとして使用することができるライブラリです。

スレッドセーフで、優先度順に複数のロケールを扱うことができる、しかも、RFC, CLDR, POSIX, Java, Win32などの言語タグを相互に変換可能、など、I18n/L10nのベースとなる機能を十分に備えていると自負しています。

・・・で、もうほとんどリリースできるんですけど、ドキュメントの一部(英語)とRuby-Locale for Ruby on Railsのテストが書けてません。

というわけで、ドキュメントはともかく、テスト書いてくれる人ボシュー。(いるわけないか・・・(苦笑))。

あ、試してみたい方はSVNからどうぞ。samples配下に動作するサンプルがあります。

あと、これベースのライブラリ・アプリもボシュー。いや、こちらはホント。

これが終わったら、これベースのGetTextだなー。道は遠いっす。


November 30, 2008 [長年日記]

[Rails] Ruby-Locale for Ruby on Rails sample

Ruby-Locale for Ruby on Railsにあるサンプルにちょっと手を加えて公開してみました。ぜひ見てみてくださいまし。

[Rails] Rails2.2でサイトトップではないアプリケーションの配置・設定

今回のLocale for Ruby on RailsのサンプルはApacheのCGI(XREA上)でかつ、サイトのサブディレクトリに配置(http://www.yotabanana.com/locale_rails_sample/)した。色々大変だったのでその時のメモ。

まず、ファイルの配置。/virtual/yotabanana/がXREA上のディレクトリ。とりあえず、ローカルの/home/mutoh/配下にディレクトリを作る。

/home/mutoh/virtual/yotabanana/locale_rails_sample/
                              |                   +app/
                              |                   +config/
                              |                   +public/
                              |                   +vendor/
                              |                   + ...  
                              +lib/ruby/
                                       +site_ruby/1.8
                                       +gems/

/home/mutoh/virtual/yotabanana/lib/配下には/usr/lib/ruby/配下の内容をコピーして置く。基本的にはRubyGemsがインストールされている状態であればOKなはず(面倒くさいので全部コピってしまった)。
それから、RAILS_ROOT配下(RAILS_ROOT = /home/mutoh/virtual/yotabanana/locale_rails_sample/ね)で、rake gems:unpack, rake rails:freeze:gemsしてgemとrailsの関係ファイルを全部vendor配下にコピーしておく(/usr/lib/ruby配下をコピーさえしてしまえば実はこの作業自体不要なのかもしれないけど複数のバージョンのRailsアプリを入れる場合等は必要)。

で、Apacheの設定。RAILS_ROOT/public/.htaccessを編集する。

Options +FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
RewriteEngine On
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_METHOD} =POST [NC]
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
SetEnv RAILS_ENV production
#SetEnv RAILS_ENV development
SetEnv GEM_HOME /virtual/yotabanana/lib/ruby/gems/1.8
SetEnv RUBYLIB /virtual/yotabanana/lib/ruby:/virtual/yotabanana/lib/ruby/site_ruby/1.8

config/routes.rbを編集する。path_prefixをつけてhttp://www.yotabanana.com/locale_rails_sample/がアプリのルートになるようにする。

ActionController::Routing::Routes.draw do |map|
  path_prefix = :locale_rails_sample
  map.resources :samples, :collection => {:clear_cookie => :get,
                                          :cached_action => :get}, :path_prefix => path_prefix
  # Localized Routing.
  map.connect ':lang/:controller/:action/:id', :path_prefix => path_prefix
  map.connect ':lang/:controller/:action/:id.:format', :path_prefix => path_prefix
 
  map.connect ':controller/:action/:id', :path_prefix => path_prefix
  map.connect ':controller/:action/:id.:format', :path_prefix => path_prefix
 
  map.root :controller => "samples", :path_prefix => path_prefix
end

#これ、全部にpath_prefixつけなくてもよい方法ないのかなー。

config/environment.rbを編集する。こちらもアプリケーションのルートを指定するイメージ。

Rails::Initializer.run do |config|
     :
     :
  config.gem "locale"
  config.gem "locale_rails"
  config.action_controller.asset_host = "http://www.yotabanana.com/locale_rails_sample"
end

config.action_controller.asset_hostの指定をしないとスタイルシート・Javascript等の設定がうまくいかないようだ。この辺、もうちょっとroutes.rbで頑張れるんじゃないかと思うんだけど・・・。挫折。もっといいやり方があったら教えてください。

で、ファイルの編集が終わったところで/home/mutoh/locale_rails_sampleをXREA上の/virtual/yotabanana/locale_rails_sampleへFTPでコピー。
で、sshでXREAにログインしてシンボリックリンクを貼る。

$ cd /virtual/yotabanana/public_html
$ ln - s /virtual/yotabanana/locale_rails_sample/public locale_rails_sample

あとは、http://www.yotabanana.com/locale_rails_sample/でアクセスできるようなった。

ということで、XREAに限らず、一つのURLの元、複数のRailsアプリケーションを動作させる場合にも使えると思いまーす。

参考:

  • http://tam.qmix.org/archives/2005/03/xrea_ruby_on_ra.html
  • http://wiki.rubyonrails.com/rails/pages/Non+VHost+Installation
  • http://wiki.rubyonrails.org/rails/pages/HowToInstallApplicationsInSubdirectories
  • 本日のツッコミ(全2件) [ツッコミを入れる]

    もろはし [環境変数RAILS_RELATIVE_URL_ROOTとかを設定するとそれだけでサブディレクトリにおけるはずです。A..]

    むとう [おぉ、環境変数一発ですか!? 知らなかった・・・orz。 でも、情報ありがとうございました!!]