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

Rails で public_activity.gem を使っていて、 activities テーブルにレコードが追加されたタイミングで callback を仕掛けたい衝動に駆られた。ちょっと調べてみたけどやり方が見つからなかったので、チームの人と相談して以下のようにした。 public_activity は PublicActivity::Activity というモデルを gem の中に持っていて、こいつが belongs_to :model になる。

なのでこのモデルクラスを open して以下のように記述した。

# RAILS_ROOT/lib/public_activity/activity.rb

module PublicActivity
  class Activity
    after_create do
      HogeHogeMailer.send_mail(self.trackable).deliver
    end
  end
end

ただしこのファイルを config/initializers/ とかで require してやらないと Rails がファイルを読み込んでくれない。 Rails.application.config.autoload_pathslib/**.rb とかを追加しとけば自動的に読み込まれるんじゃないかなと思ったけどそうじゃなかった。 Rails の autoload は、 ConstMissing という例外が発生したときに定数の名前からファイル名を推測して require するらしい。名前が既に定義済みだと ConstMissing 例外が発生せず autoload では読み込まれないので明示的に読み込む必要があるということらしい。

読み込みされていないクラスを使用すると ConstMissing という例外が発生します。 この部分に介入して autoload_paths の中に規約に合うファイルがあるか確認します。 存在する場合は読み込みします。 存在しない場合は ConstMissing を発生させます。

Rails の自動読み込みの話 - そんなこと覚えてない

ナルホディウスですぞ〜!!!

そのうち忘れそうなのでここに書き記しておきます。

| @Mac/iPhone

2年くらい前に Western Digital の My Book Live という NAS を買った。ほんとは Time Capsule が良かったんだけど Time Capsule を買う金はなくてこれにした。

狭い机の上にハードディスクを置くのが嫌だったので NAS にしたんだけど、ものすごく使いづらい。 WiFi 経由なのもあるかもしれないけど、転送速度がすごく遅い。 MacBook Pro Mid 2009 のディスクを HDD から SSD に交換したとき、 My Book Live 内の TimeMachine バックアップから WiFi 経由で復元したら、 300 GB 程度のデータを転送するのに丸三日かかった。 WiFi ルーターが Fon の 802.11b/g のやつだから 802.11n のやつに変えればもう少し実用的な速度になるのかも知れない。

TimeMachine 用に使うにはバックアップに頻繁に失敗するのもつらい。なんかディスクの信頼性が低下したとかで頻繁に過去のバックアップを消去して新規バックアップを作成しろとか出る。 Mountain Lion の頃によくこの警告出てて Mavericks にしてからあまり出なくなったけど、それでも 2 ヶ月に 1回くらいの頻度でバックアップ新規作成(=フルバックアップ作成。これも 2, 3 日かかる)しないといけなくなるのでつらい。

ちなみにバックアップディスクの信頼性が低下したときは以下のような一連の呪術的なプロセスを経ることでタイムマシーンのバックアップディスクとして再利用可能になる。

| @散財

D90 のキットレンズだった AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED が1年半くらい前からズームしたときに遠くのものにピントが合わなくなっていた。(近くのものにはピント合う)

最初はそういう仕様だったかなぁと思いながら(ピントが合わないのは遠くのものだけなので)、単焦点レンズしか使わなかったのであまり気にしていなかったのだけど、ネットで検索したら同じ症状の人が何人かいて、どうやら故障しているらしいということが分かった。

kakaku.com の掲示板で、「 Nikon のサービスセンターに持っていったら玉を固定してるねじを締めてもらうだけで直り無料だった」と書いてる人がいたので、無料で直るかなと思って Nikon のサービスセンターに持っていったら「36,000円です」と冷酷に告げられてしまった。型落ちで中古でも4万くらいで買えるレンズの修理に36,000円も払うのはあり得ないと思ったので修理は頼まなかった。

合理的な価格で修理をやってくれるカメラ店とかないかと思って検索してたらゼネラルカメラサービスという会社が福岡にあることが分かったので持っていってみた。

10,500円で直るとのことだったので直してもらうことにした。今日受け取ってきたけど遠くのものもちゃんと撮れるようになってた。

DSC_5583

レンズとかカメラとか壊れたときにメーカーに修理頼んで高額な見積もり来て困ったら、こういう修理屋さんを探してみると良いと思った。あと恐らく修理頼んだとこはヨドバシとかキタムラからの修理依頼も受けてて、量販店に頼むと量販店の取次料とかがかかるっぽいので、行ける範囲にこの手の修理会社ある人は直接そこに持って行ってみると良いと思った。以上、個人の日記でした。

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

Fukuoka.rbで Ruby で連続するダブルクオートの扱いについて @nagachika さんに聞いたら面白い話が聞けた。

Lokka のテストで FactoryGril でフィクスチャーデータ作ってるところに、以下のような文字列があった。

  factory :post do
    association :user
    sequence(:title){|n| Test Post #{n}” }
    body <p>Welcome to Lokka!</p><p><a href=“”/admin/“”>Admin login</a> (user / password : test / test)</p>”
    type ‘Post’
    created_at create_time
    updated_at update_time
  end

この body の部分で、ダブルクオートが連続して書いてある場所があって、ここがらみでテストを流してたら失敗する現象に遭遇した。テストに失敗したときのメッセージは以下。

Failures:

  1) Post markup default should == “<p>Welcome to Lokka!</p><p><a href=/admin/>Admin login</a> (user / password : test / test)</p>”
     Failure/Error: it { post.body.should == post.raw_body }
       expected: “<p>Welcome to Lokka!</p><p><a href=/admin/>Admin login</a> (user / password : test / test)</p>”
            got: “<p>Welcome to Lokka!</p><p><a href=\”/admin/\”>Admin login</a> (user / password : test / test)</p>” (using ==)
     # ./spec/unit/post_spec.rb:56:in `block (4 levels) in <top (required)>

なんか expect の方で HTML 内のダブルクオートが省略されてる。ダブルクオートが連続してるのが怪しいなと思って、文字列内でダブルクオートが連続したら、一つ目の はエスケープ文字列みたいな扱いになるのかなと思った。

しかし実はそうではなくて、 @nagachika さんの説明によると、ダブルクオートが連続した場合、一つ目の " で文字列の終端と判定される。すぐ右隣の " は新しい文字列の開始と見なされ、結果としては文字列として連結されるらしい(C 言語由来の慣習とのこと)。

たとえば、次のような文字列は

<p>Welcome to Lokka!</p><p><a href=“”/admin/“”>Admin login</a> (user / password : test / test)</p>”

“<p>Welcome to Lokka!</p><p><a href=“”/admin/“”>Admin login</a> (user / password : test / test)</p>” という三つの文字列と見なされ、クオートとクオートの間に何も挟まらないので自動的に一つの文字列として連結され、以下のようになる。

<p>Welcome to Lokka!</p><p><a href=/admin/>Admin login</a> (user / password : test / test)</p>”

これ、なぜいままで Lokka でこの状態で CI のテスト通ってたのかわからないけど、今日 wercker で CI の設定していてテストが通らなくてこの問題に気がついた。同じように手元でテスト実行しても落ちた。ひょっとすると Ruby 2.1.0 で落ちるのかも知れない。いずれにせよ "" は使わない方が良さそうなので修正して Pull Request 出そう。

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

このブログを Capistrano 3 でデプロイするようにした。こちらを参考にした。

一点、 deploy:restart 内で、 invoke メソッドで他の namespace の task を呼び出すところ

The deploy has failed with an error: #<NoMethodError: undefined method `verbosity' for "/usr/bin/env unicorn:restart\n":String>

というエラーが出てた。調べたらどうも sshkit のバグっぽかった。

最新版では Pull Request マージされてて治ってるぽかったので Gemfile で

gem 'sshkit', github: 'capistrano/sshkit'

と書いておいた。

Capistrano 3、他の gem いれなくても色付いたりマルチステージになってたり rbenv 対応しててモダンになってると思った。あとシンボリックリンク作ってくれる task が便利。

| @Mac/iPhone

Mavericks にしてからマウスジェスチャーソフトの xGestures がうまく使えなくなった。起動するときにエラーが出て、いちいちターミナルから open -a ~/Library/PreferencePanes/xGestures.prefPane/Contents/Resources/xGestures.app して呼び出したりしてたけど、今朝ついに起動しなくなってしまった。

マウスジェスチャーのソフトはいろいろあるけど、 xGestures の良かったところはブラウザープラグインではなく、 Finder などブラウザ以外のソフトでもジェスチャーを設定出来るところだった。 Finder や FTP クライアントなどのような「戻る」「進む」概念のあるソフトウェアでマウスジェスチャー使えたのが大変便利だった。

xGestures は昔からアップデートが遅くて、 OS のバージョン上げる度に苦労してた印象ある。このまま新しいバージョンとか出ない可能性もある。ひと思いに他のソフトに移行してみようかと検索してみたけど、 CocoaSuite とかも開発止まってたし、良い感じのソフトなかった。検索して出てくるのはどれも Magic Trackpad / Magic Mouse を使いやすくするソフトウェアばかりだった。

いま普通の Mac ユーザーはみんな Magic (Trackpad|Mouse) 使ってて、 OS X に標準で組み込まれてるスワイプ機能とかで事足りてるのかも知れない。みんなタッチスクリーンに慣れてるし、画像編集ソフトなんかで細かい修正作業とかするとき以外 Mac でわざわざマウス使う理由とかない感じがする。そのうち若い人はマウスとか使わなくなって、「マウスジェスチャーって何? 原始時代の儀式か何か?」みたいに感じになるのかも知れない。