| @技術/プログラミング

ポータルシットをLokkaに置き換えたくていろいろやってる。ポータルシットの過去記事をYAMLでエクスポートし、それをLokkaのDBに取り込む作業をやってる。TDD BootCampに参加したので、テストファーストしながらの作業。RSpecでテストコードを書き、ログが正しくインポートできることを確認する。テスト終了時 after(:all) フックで、取り込んだログを削除してる。コードはこんな感じ。ちなみにLokkaはDataMapperをORMに採用してるので以下はDataMapperでの話。

after(:all) do
  Category.all.destroy
  Entry.all.destroy
end

しかしこれでは AUTO INCREMENT の値がリセットされず、テストを繰り返す度に AUTO INCREMENT の値が増えていってうざかった。

DataMapperの機能で AUTO INCREMENT 値をリセットするのってないのかなと5秒くらい探してみたけど見つからなかったので、SQLを直接実行する方法を採用した。

ちなみにRDBMSに採用してるのはSQLite3。SQLiteでは UPDTE sqlite_sequence SET seq=0 WHERE name='テーブル名'; みたいなコードで AUTO INCREMENT 値を任意の値に設定できるみたい。

最終的な after(:all) フックはこんな感じ。

  after(:all) do
    Category.all.destroy
    Entry.all.destroy
    Entry.repository.adapter.execute('update sqlite_sequence set seq=0 where name="entries";')
  end

テスト実行後にはすべてのデータがデータベースから削除されて、AUTO INCREMENT の値もリセットされる。人畜無害なテストコード万歳。

| @Mac/iPhone

youpyさん作のiTunesで聞いてる曲のレートが5だったらLast.fmに "Love" を送信してくれるやつを試してみようとした。cronで2分間隔とかで回して使うやつ。

なんで二年近く前のやつを今頃使ってみようとしたのかというと、二年前はRubyとかUnixのことが全然分かんなくてブックマークしただけだったから。いまは多少はRuby分かるし、crontabの使い方も分かるので、いましかないと思ったわけです。

git clone git://gist.github.com/58251.git
cd 58251
ruby love.rb

初回起動時にはLast.fmのAPIキーやTokenを入力するようにコンソールにメッセージが表示される。その後こういうエラーが出てしまった。

/Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle: dlopen(/Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle, 9): no suitable image found.  Did find: (LoadError)
  /Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle: no matching architecture in universal wrapper - /Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:29:in `require'
  from /Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/rbosa.rb:29
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:34:in `gem_original_require'
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:34:in `require'
  from love.rb:71:in `initialize'
  from love.rb:61:in `new'
  from love.rb:61:in `get_instance'
  from love.rb:34:in `main'
  from love.rb:206

なんかアーキテクチャが違うとかそれ系のエラーメッセージが出ている模様。そもそもRubyOSAって何なんだろうと思って調べてみたら、以下にたどり着いた。

なるほど、Appleが用意してるRubyからMac OS Xのイベントとかを管理できるようにするやつか。RubyをAppleScript的な使い方が出来るようにするらしい。Snow Leopard発売前の2007年に出たVersion 0.4.0で開発止まってるみたいだし、64bit化したSnow Leopardでは使えないってことなんだろうか。いや、64bit化する前のMacBook黒からTimeMachineでデータを引き継いでるから、アーキテクチャに合わないRubyOSAが入ったままになってるのかもしんない。「10.6 Snow Leopard と RubyOSA のインストール - Numata Designed Factory」 という記事を参考に、RubyOSAを入れ直してみることにした。

svn checkout svn://rubyforge.org/var/svn/rubyosa
cd rubyosa/trunk
cat src/rbosa.c | (rm src/rbosa.c; sed "s/c ID/c RB_ID/g" > src/rbosa.c)
ruby extconf.rb
make
sudo make install
sudo make install-extras

インストール後、再度 ruby love.rb を実行してみた。しかし今度は以下のようなエラーが出る。

/Library/Ruby/Site/1.8/rbosa.rb:470: warning: Passing no parameters to XML::Parser.new is deprecated.  Pass an instance of XML::Parser::Context instead.
XML::Parser#string is deprecated.  Use XML::Parser.string instead
/Library/Ruby/Site/1.8/rbosa.rb:558:in `__send_event__': Cannot send Apple Event 'coregetd' : procNotFound (-600) (RuntimeError)
  from /Library/Ruby/Site/1.8/rbosa.rb:558:in `player_state'
  from love.rb:77:in `playing?'
  from love.rb:36:in `main'
  from love.rb:206

どうも古いバージョンの libxml を使わないとエラーが出るらしい。今度は「RubyOSA 0.4.0を使おうとしたのですが、Bus Errorが発生 - Watsonのメモ」という記事を参考に以下のようにした。

diff /Library/Ruby/Site/1.8/rbosa.rb /Library/Ruby/Site/1.8/rbosa.rb.org
39c39
<   gem 'xml/libxml', '= 0.3.8.4'
---
>   require 'xml/libxml'

とりあえず、irbでrbosaをrequireしてもエラーは出なくなった。

irb -r rbosa
>> itunes = OSA.app('iTunes')
=> <OSA::ITunes::Application:0x10173bb38 desc="'sign'($6B6F6F68$)">

iTunesでレートは★★★★★だけどLast.fmで "Love" マークが付いてない曲を再生しながら、もう一度 ruby love.rb してみたところ、 {"status"=>"ok"} が返ってきた。ちゃんとLast.fmで "Love" されてた。iTunesで音楽を聴いてるときにcronで回してあげれば常にレート5の曲をLast.fmで "Love" してくれるようになる。Launch Daemon化とかはやり方が分からないのでそのうち調べる。

| @写真

凍りついた窓 2010-12-31

雪 2010-12-31

| @WWW

ちょっと前の本だけど、『Webを支える技術』をいま読んでます。

HTTPの話とか、毎日使ってる技術のことを知らなくて、いちいち感動しながら読んでるんですけど、中でも興味深かったのがURIの話。56ページの、「URIはリソースの名前だから名詞であるべき」というくだり。バージョン 2.0以前のRailsでは、

http://example.jp/sample/people/show/123

みたいなURIがデフォだったそう。しかしRails 2.0以降は

http://example.jp/sample/people/123

となって、動詞 show が省かれるようになった。HTTP通信で動詞を表すのはHTTPメソッドだから、URI自体が動詞を含むのはおかしいということらしい。ちなみにこのとき、名詞であるURIにアクセスするためのHTTPメソッドは GET ですね。

確かに自分が作っているサイトでもRailsで動かしてるものは、動詞を含まない名詞だけで表現されたURIを表示する。しかしながらCakePHPは

http://example.jp/sample/people/view/123

みたいなのがデフォだ。クールじゃない。というわけでURIから view を省くようにルーティングの処理を書き換え、各クラスのコントローラーも書き換えといた。

この『Webを支える技術』、プログラミングの話とかは載ってないから読んでいきなり何かの役に立つというタイプの本ではないけど、Web制作者なら職種にかかわらず読んどいた方が良さそうな本だなーと思いました。

| @技術/プログラミング

80個近くある静的HTMLファイルをシステム化する必要が生じたので、HTMLをHpricotでスクレイピングしたあと、抽出したデータをSQLiteにぶっ込んだ。しかしSQLiteにぶっ込んだあとでデータの一部をいじりたくなった。そこでRailsのActiveRecordを単体で使ってみた。

なんでわざわざActiveRecordを使うのか

いやそりゃもちろんSQL書くのが怖いからですよ。というのは半分冗談なんですけど、CakePHPはSQLite 2にしか対応しておらず、SQLite 2は何かと制限が多い。replace関数が使えんとか。temp tableとか作るのかったるいし、フレームワークばっかり使っててSQLはあんまりよく分からないのでActiveRecordを使った次第です。

作業詳細

このシステム化するプロジェクト自体はCakePHPで動いており、DBはSQLite2。デフォの状態だとRailsは sqlite3-ruby しかインストールしないので、ActiveRecordからSQLite2なDBを操作することができず若干まいっちんぐだったんだけどなんとかでけた。ちなみにやったのはCRUDのReadとUpdateね。

やったこと

とりあえず以下のようなファイルを用意。各レコードの name フィールドの "hogehoge" という部分なのが邪魔なので削りたかった。

#!/usr/bin/env ruby

require "rubygems"
require "sqlite"
require "active_record"

ActiveRecord::Base.establish_connection(
  :adapter => "sqlite",
  :database => "path/to/db"
)

class Hoge < ActiveRecord::Base
end

hoges = Hoge.find(:all)
hoges.each do |hog|
  hog.name.gsub!(/hogehoge/, "")
  hoge.save
end

まず最初に、 no such file to load -- sqlite みたいなエラーが出た。要するに「お前SQLite 2のアダプター入れてねえだろ」というエラー。とりあえず sudo gem install sqlite-ruby したんだけど、それでも no such file to load — sqlite が出るのでMacを再起動したら「Rails 3ではSQLite 2はdeprecatedだからさっさとSQLite 3に移行しろや」みたいなメッセージは出るもののちゃんとDBの内容を読み込めた。CRUDのReadはでけた。

しかしUpdateの部分で失敗。Railsの感覚で hoge.save とかやったんだけどこれは意図したとおりに機能しなかった。しょうがないのでRailsのAPIリファレンスを見ながら、 update_attribute() というメソッドをぶちかましてやった。こんな感じ。

hoges.each do |hog|
  if hog.name =~ /hogehoge(.*)/
    hog.update_attribute("name", $1)
  end
end

これで狙ったことができました。

Rubyいいわー。ほんといいわー。

| @映画/ドラマ/テレビ

ルドandクルシ

評価 : ★☆☆☆☆

あらすじ

ルド(ディエゴ・ルナ)とクルシ(ガエル・ガルシア・ベルナル)の兄弟はメキシコの田舎町のバナナ農園で働いているが、一緒に暮らしている母親の再婚相手の男はむかつくし、仕事はつまらないし、人生一発逆転してやりたいと思っていた。二人はアマチュアのサッカー選手で、たまたま街で車が立ち往生したスカウトのバトゥータの目にとまり、プロサッカー選手としてメキシコシティに出ていくことになった。果たして二人は一発逆転できるのか?

感想

アルフォンソ・キュアロンの弟カルロス・キュアロンが監督で、アルフォンソも制作に関与しており、さらにガエル・ガルシア・ベルナル、ディエゴ・ルナの組み合わせという、『天国の口、終りの楽園。』のキャストが再結成して制作された機動戦士ガンダム 逆襲のシャアのような作品。期待して見に行ったんだけど、「そんなのありなの?」ってくらいつまらなかった。メキシコのオールスターが集まって作られてる映画なのに、熊本のDenkikanでは一週間しか上映されなかったのが不思議だったけど、実際に見てみて「これはお客さん入らないわ」と思いました。

ルドとクルシはそれぞれ父親が異なり、母親はさらにその後離婚して別の男と暮らしている。複雑な家庭なのだ。しかしルドもクルシも、直接会ったことはないそれぞれの父親のことを誇りに思っている。ことあるごとに「俺の親父は…」と言う。このあたりがガキっぽい。

そもそもルドもクルシも年齢不相応に夢見がちな少年として登場する。ルドは妻子がいるのに人生一発逆転したい一心で家族に黙ってメキシコシティに出て行くし、クルシはサッカー選手はどうでもよくて、本当はミュージシャンになりたと思っていて、そのための足掛かり作りのためにサッカーをする。この辺の感覚がよくわからない。

そんな軟派なノリじゃサッカー選手として大成しないだろ、と思うんだけど、映画では二人とも大活躍して、クルシはメキシコ代表として招集されたりする。さすがにこれはやり過ぎだろ思った。

クルシは念願かなってレコードデビューを果たし、カウボーイの格好して歌をうたうのだが、このシーンはまるでインドの映画を見ているみたいで異様なテンションに正直引いてしまった。ひょっとするとメキシコ人は特殊な感性を持っている人たちなのかも知れない。

ただ、ルドの嫁さんがネットワークビジネスにはまったり、ルドがギャンブルと麻薬におぼれたり、クルシが悪い女に騙されたり、兄弟の妹がマフィアと結婚したりするところが、メキシコ社会の暗い部分を描いているのかなと感じた。なんでそうなるんだよ、みんなもうちょっとしっかりしろよ、と自分はしっかりしてないくせに思いました。

そういうわけでして、ガエル・ガルシア・ベルナルが出てるからと期待して見に行っても期待を裏切られることになりますのでご注意あれ。

| @労働

三日で仕事を辞めた理由ですけど、

  • むかつく人間の下で人格否定されながら働きたくなかった
  • 裁量労働制の15時間労働に耐えられなかった

が原因ですね。

, , 「いい年したおっさんが何甘いこと言ってんだよ」でしかない。

はてなブックマーク - activecuteのブックマーク

activecuteさん、一年も前の記事に「これはひどい」とか「日本的なるもの」とか「もうすぐこの国は滅ぶ」みたいなわけわかんないブックマークタグつけて、さぞ気持ちが良いでしょうね。でも、あなたは俺のことよく分からないし、俺が辞めた会社のことだって分からない。それなのにこういうブックマークコメントで安直に悪口を書くのはやめて欲しいな。俺がやばい会社に入ってしまったなと思って三日で辞めることは(家族とかには迷惑かけたけど)本質的に自由なはずだし、あなたには何ら害を及ぼしてないのに。すごく不愉快な気持ちになりました。