2月の映画

気まぐれがおきないかぎり、今月はもう映画を見れないと思うのでまとめる。今月は6本。テレビでやっているのはいれていない。

RED/レッド

こちらは劇場で。とっても素晴らしいエンタメでした。爽快。音楽もちゃんとあっていてよかった。なんというか、ベテラン役者が退役軍人として生活しているところをどんどん事件にまきこまれていくんだけど、やっぱりかっこいい。

告白

ずっとグルグル回る感じの映画。日本映画らしいというと日本映画らしいストーリーだったなぁ。

告白 【Blu-ray完全版】

告白 【Blu-ray完全版】

BECK

役者だけでみると、カブトと電王と水木さんがフロントをつとめるバンドのお話。もともと原作が好きだったのもあって見てみた。見る前はだいぶ不安だったけど、全然大丈夫。途中ちょこちょこ変に芸人を使っているのは気になったけど、全体でみたらちゃんとしてた。脇役としての斎藤さんにサイトー(カンニング竹山)や、蘭さんに中村獅童という配役はピッタリすぎた。

「BECK」 2枚組(本編Blu-ray+特典DVD)

「BECK」 2枚組(本編Blu-ray+特典DVD)

カンフーパンダ

なんで、こんな素晴らしい映画を今迄見ていなかったのか、わかんない。素晴らしいの一言。

カンフー・パンダ [Blu-ray]

カンフー・パンダ [Blu-ray]

ヒーローショー

なんで、見たんだろうなぁ。何もない映画。痛いの見たいだけだったら、青い春 [DVD]見るわー。

ヒーローショー [DVD]

ヒーローショー [DVD]

ゾンビランド

ヒーローショーと一転して、全部入りの映画。素晴らしい。ストーリーも成長も恋愛も家族愛もスリルも。タイトルにゾンビとついているわけだが全然ロードムービー。個人的には本物のゾンビ映画好きには、あまり好かれないんじゃないかなぁと思う。何度も見たい。

ゾンビランド [Blu-ray]

ゾンビランド [Blu-ray]

Mac で XZ 形式を圧縮・解凍したいときの備忘録

XZ 形式というのは、比較的新しい圧縮形式で、GNU tar 1.22 からサポートされていて gzipより圧縮効率が大きいらしい

そんな XZ 形式なんだけど、Mac 標準の tar コマンドだと扱うことができない。

% tar Jxvf ./hoge.tar.xz 
Usage:
  List:    tar -tf <archive-filename>
  Extract: tar -xf <archive-filename>
  Create:  tar -cf <archive-filename> [filenames...]
  Help:    tar --help

で、Homebrew で以下をインストール。

% brew install xz
% brew install gnu-tar

gnu-tar を使うには prefix として 'g' の付いた、gtar コマンドを使用する。

% gtar Jxvf ./hoge.tar.xz

1月に見た映画

諸先輩の方が、プレゼンで映画のスライド使ったり、映画音楽かけたりしていているので、今年は映画を沢山見ようと決心したんだけど、そんなに見れてない。プレゼン時に音楽をかけるとしたら、わたしは短い人生でわたしの中での情景がうかぶ曲しかセレクトできないんだけど、映画音楽だとシーンと音楽を共有できるという点でいいなぁと思った。

ということで、1月は6本のはず。

インセプション Blu-ray & DVDセット (初回限定生産)

インセプション Blu-ray & DVDセット (初回限定生産)

よく使われていたのと、公開当時気にはなっていたので。ちょっと期待しすぎていたので、見てこんなもんかと思ってしまった。

キック・アス Blu-ray(特典DVD付2枚組)

キック・アス Blu-ray(特典DVD付2枚組)

こちらは劇場で。前々から気になっていたけど、劇場が込んでいるという話を聞いていたので、遅めに行った。よくできている。そりゃあ、ボンクラはやられるわ。ヒットガールとビッグダディやばい。

その男 ヴァン・ダム [DVD]

その男 ヴァン・ダム [DVD]

昔、名古屋の街を歩いているときに、街頭で見てずっと気になっていた映画。これはだいぶいい映画。落ちぶれたけど、地元では英雄のヴァンダム

んー。思いいれがないからか、そこまで。

ダークナイト [Blu-ray]

ダークナイト [Blu-ray]

2回目。KICK ASS見たから、見なおしたくなった。なんというか、KICK ASSとは対極な世界だよなぁ。KICK ASSは日常の悪党と戦うかんじだけど、ダークナイトは1、2本キレているし。よくできている。

銀河ヒッチハイク・ガイド [DVD]

銀河ヒッチハイク・ガイド [DVD]

いきおいで。こちらも2回目なんだけど。いろいろ思うことはあるけど、原作の世界をちゃんと再現できているなぁ。

Rails3ではrelative_url_rootが無くなっていた

とりあえず、Rails3.0.3ではまったので備忘録。

thinを使って、以下のようにディレクティブを使って一つのドメインで複数のRailsアプリを動かそうとすると、画像等の静的ファイルがみえなくなってしまった。

http://exsample.com/app1
http://exsample.com/app2

原因は、Rails3になって ActionController::Base.relative_url_root が無くなってしまったため。そのため上記のようなことをやろうとする場合、config/environments/XXX.rb 内で config.action_controller.asset_path or config.action_controller.asset_url を設定する必要があるみたい。

今回は、静的ファイルは同一ドメイン内に配置しているのでconfig.action_controller.asset_path を使用した。config.action_controller.asset_path の使用方法は、Stringを渡す方法と proc を渡す方法の2種類。

String を使うときは printf のようになる。

config.action_controller.asset_path = "/app1/%s"

proc を使う場合は、ブロックの評価結果となる。

config.action_controller.asset_path do |path|
   "/app1#{path}"
end

オブジェクトの中身が知りたーい

昨日のRubyスクリプトをdaemonで起動する - tricknotesのぼうけんのしょでした。

で、Ruby逆引きレシピAdvent Calendar : ATNDの5日目です。まず最初に大事なこと。このままだと明後日には、このカレンダーは終了となってしまいます。レシピ先輩にお世話になっている人とか、興味のあるひとは参加するといいとおもうの。

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)

で、まずこの本の書評を。
この本は、やりたいことをRubyでどうやるの?という形で参照するレシピブックです。Rubyの自体の機能だけでなく、他のライブラリも使用しており、どのようにやるのかがとても参考になります。また、5名の著者によっての共作ですので、いろんな分野のことが幅広くカ バーされているのも特徴です。普通に読んでもおもしろい本ですが、手元に1冊おいておくだけでもとても重宝します。

で、本日はレシピ197「オブジェクトの中身を調べたい」を紹介します。

みなさんはプログラムを書いていてデバッグをするときはruby-debugをお使いになると思うのですが、だいたい問題点が把握できており実行も簡単というときは俗にいうprintfデバッグも便利です。

Rubyでprintfデバッグをするときは、pメソッドが便利です。pメソッドは、Object#inspectの結果を表示してくれます。

class User
  attr_reader :id, :name
  def initialize(id, name)
     @id, @name = id, name
  end
end

ruby-1.8.7-head > u = User.new 1, "takkanm"
 => #<User:0x1006856e0 @name="takkanm", @id=1> 
ruby-1.8.7-head > u.inspect
 => "#<User:0x1006856e0 @name=\"takkanm\", @id=1>" 
ruby-1.8.7-head > p u
#<User:0x1006856e0 @name="takkanm", @id=1>

また、ppというライブラリもあります。ppはpretty printの略になります。ppは

require 'pp'

することで使用できます。pとppの違いは以下のようになります。

ruby-1.8.7-head > require 'pp'
 => true 
ruby-1.8.7-head > users = [User.new(1, "takkanm"), User.new(2, "takkan_m"), User.new(3, "m")]
 => [#<User:0x1007499a0 @name="takkanm", @id=1>, #<User:0x100749838 @name="takkan_m", @id=2>, #<User:0x100749680 @name="m", @id=3>] 
 
ruby-1.8.7-head > p users
[#<User:0x1007499a0 @name="takkanm", @id=1>, #<User:0x100749838 @name="takkan_m", @id=2>, #<User:0x100749680 @name="m", @id=3>]
 => nil 
 
ruby-1.8.7-head > pp users
[#<User:0x1007499a0 @id=1, @name="takkanm">,
 #<User:0x100749838 @id=2, @name="takkan_m">,
 #<User:0x100749680 @id=3, @name="m">]

ppのほうが、pよりも出力がわかりやすいですね。

さて、ここからはレシピ先輩に書かれていないこと。
みなさんプログラムを書いているとメソッドチェーンの評価中の値がどうなっているか気になるときに、一度その式を切って確認していたりしないでしょうか?そのような便利なライブラリtappをご存知でしょうか?

tappはRuby1.9から採用されたtapを拡張したものです。tapは1.8.7でもバックポートされています。

tappを使うには、gemでインストールする必要があります。

gem install tapp

後は

require 'tapp'

するだけ。簡単!!(といっても、1.8.系の人はrequire 'rubygems'してね)

では使ってみましょう。こんな式があったとします。

users.map(&:id).inject(0) { |i,j| i + j}

このとき、mapする前のusersの状態が知りたいとしましょう。その場合、こんなふうにすると簡単にわかります。

ruby-1.8.7-head > users.tapp.map(&:id).inject(0) { |i,j| i + j}
[#<User:0x100328010 @id=1, @name="takkanm">,
 #<User:0x1003279a8 @id=2, @name="takkan_m">,
 #<User:0x100327340 @id=3, @name="m">]
 => 6 

ほら、簡単でしょう。tappの便利なところは、tapと同じで途中に差し込むだけでppしてくれ、式の評価に影響を与えないことです。また、tappはみんな大好きなブロックをとることができ、tapと同じことができます。

ruby-1.8.7-head > users.tapp{|us| us.size }.map(&:id).inject(0) { |i,j| i + j}
3
=> 6

また同様の動作をするtaputs(tappと違いputsする)もあります。

さて、最後に。レシピ先輩は去年(西暦)のRuby会議で買ったので、もう1年以上も前の本です。ですが、今でもペラペラめくると面白い内容が見つかったりするので、とても満足な1冊です。著者の5名さん、ありがとう。

札幌Ruby会議03に参加してきました。

日記を全然書いていなかったわけなんですが、やっぱり感極まったので書きます。内容については、他の人がきっとすごい記事書くんだから、ブクマでもおっかけてください。私的感想。

Ruby札幌: 札幌Ruby会議に初めて現地で参加をしました。過去二回はUstでの参加していました。

なんというか、わたしにとって札幌Ruby会議というかRuby札幌は、全然遠い地域Rubyist集団なのですが、とても好きな集団です。

去年の札幌Ruby会議02の翌日は、ちょうどRuby Advent Calendar jp: 2009に記事を書く日でした。そのときは、実際は前もって書くことは決めていたのですが、角谷さんの発表でだいたい言ってもらった感じで、どうしようかと思いながら記事を投稿した記憶があります。あのときから、自分はどうRubyにかかわることができるかということがテーマになった記憶があります。

で、あの札幌Ruby会議02の後、1年でRubyにまつわるetcにどのように関われたかを振り替えってみたいと思う。

  • RubySpecをやって、簡単なTestのfailだったけど修正しパッチをだした
  • 東京Ruby会議03でワークショップをやった
  • Rails勉強会の司会をやるようになってきた
  • Ruby会議のレポート班としてスタッフをやった
  • 札幌Ruby会議でLTをさせていただいた

なんだかんだで何かは関われていたんだよなぁ。しかし、わたしがこういうことをできたといのはコミュニティの力が強い。ほんとうにまわりには感謝している。

よく「Asakusa.rbってなんだか、初心者とか行けなそうなんですかね。」とか言われることがある。わたしの回答は、「そんなこと無いよ、むしろ来い」っていうようにしている。たしかに、面子をみたら普通はびっくりしそうなメンバーの集りは他の地域Rubyist集団には無いのはわかるし、今のわたしの環境が恵まれているっていうのも認める。しかし、数年前のわたしも他の人と一緒だったんだけど(環境も今とは違ったし)、一人でRHGの逆襲とかに参加したりしていた。RHGの逆襲には、諸事情(東京から地元に引っ越し)で、結局2回しか行けなかったが、そのまま居れれば続けていっていたと思う。結局、コミュニティや勉強会
(Asakusa.rbは勉強会ではありません)には、少しの興味と勇気があれば参加できるんだと思う。

そして、現代には発達したインターネットがあるわけで、インターネットがあるおかげでその場に行かなくても人と繋ることができる。わたしの札幌Rubyとの関わり(といってもわたしの一方的なLove)もインターネットが最初だった。レシピ先輩の執筆者のメンバーとも最初はインターネットで知って(ほんとtwitterは偉大)、RubyKaigi2009のサイン会では、何故か名前を覚えていただいていてビックリしたのをすごく印象にのこっている。ちょっと踏みだせば世界は本当に近いと思う。twitterみたいな関わり方以外にも、Rubyには日本語で気軽に参加できるMLなどがあるわけだし。門はほんとそこらじゅうにある。

最後に、しまださんは本当に卑怯だと思う。何故かあの人のせいで、こっちまで感極まってしまう。2009のRubyKaigi後には、あの人のせいで感極まって、るびまの編集者になりたいって手をあげてしまったわけで。今年は感極まって無茶な内容でLTに応募してしまった。

最後に、LTをさせてくれてありがとうございました。きっと、あのメンバーの並びでやるには、わたしには役者不足だし、内容も見合わないもの以外の何ものでもなかったと思うし。

今年の札幌Ruby会議が終わったので、来年一年どうするかを考えなくてはならない。それは、ここ(今新千歳空港)で書くには時間が足りないので、別に書こう。

最後に、Ruby札幌ほんとうにありがとうございました。

Sexy Validationで独自のValidationを

いつのまにか、Rails3+1.9.2というモテコンビで仕事をやっております。で、Rails3から入った新機能として、SexyValidationというのができたので、それを使ってみました。

Sexy Validationとは、いままでのRailsのvalidationの書き方とは違い、Modelに対してのvalidationがスッキリ書けるようになりました。例えば、titleカラムを持つPostというModelがあるときに、title要素は必須なんだというvalidationを書こうとすると、以下のようになります。

class Post < ActiveRecord::Base
   validates :title, :presence => true
end

今迄の

validates_presence_of :name

よりわかりやすいのではないでしょうか。

独自のvalidationをしたくなったらどうすればいいのでしょうか?

その場合、ActiveModel::EachValidatorを継承したクラスを作り、each_validatorメソッドをオーバーライドします。文字列にあらかじめ設定されたwordが含まれていないか確認するvalidationを定義してみましょう。

class NgWordValidator < ActiveModel::EachValidator
   def validate_each(record, attribute, value)
      record.errors[attribute] << 'include ng word' if value =~ /NG WORD/
   end
end

引数valueには、validateメソッドの第一引数のカラムの値が渡ってきます。validationを失敗とするときは、record.errors[]にエラーメッセージをいれます。attributeはvlidationの名前が入ってきます。

validationを利用する側では、以下のように設定できます。

class Post < ActiveRecord::Base
   validates :title, :presence => true, :ng_word => true
end

簡単ですね。実際にどうなるか確認してみましょう。

> post = Post.new
=> #<Post id: nil, title: nil, created_at: nil, updated_at: nil> 
> post.valid?
=> false 
> post.errors
=> {:title=>["can't be blank"]} 
> post.title = "NG WORD TITLE"
=> "NG WORD TITLE" 
> post.valid?
=> false 
> post.errors
=> {:title=>["include ng word"]} 
> post.title = "TITLE"
=> "TITLE" 
> post.valid?
=> true

正しくvalidationできていることがわかります。

今回は、内部でエラーとする文字列を保持していましたが、利用する側から渡したい場合は、trueとしているとこにハッシュを渡します。

class Post < ActiveRecord::Base
   validates :title, :presence => true, :ng_word => {ng:"NG WORD"}
end

validate_each側では、渡されたハッシュはoptionsに入ってわたってきます。

class NgWordValidator < ActiveModel::EachValidator
   def validate_each(record, attribute, value)
      record.errors[attribute] << 'include ng word' if value =~ /#{options[:ng]}/
   end
end

作成したValidatorは全てのActiveModelで使用することができます。例えば、bodyカラムを持つCommentモデルを作成して、以下のようにvalidationを設定すれば、先程のng_word validatorが使用できます。

class Comment < ActiveRecord::Base
   validates :body, :ng_word => {ng:"XXXX"}
end
> comment = Comment.new
=> #<Comment id: nil, body: nil, created_at: nil, updated_at: nil> 
> comment.body = "NG WORD"
=> "NG WORD" 
> comment.valid?
=> true 
> comment.body = "XXXX"
=> "XXXX" 
> comment.valid?
=> false

とても、簡単なのでどんどん利用していきたいです。目下の悩みどころは、このValidatorのクラスをどこに配置するべきかがわかっていないので、有識者の方に教えてもらいたいです。(libにいれたのですが、勝手にrequireされなくて。。)