| @労働

hsbt さんが会社に入ってから大きく雰囲気変わった。hsbt さんは並の寿司を上にぎりとかにランクアップするパワーがあると思う。IRC とか Ustream ごしにその存在感を感じる。こういう人がメンターだなんて今年ペ社に入った新卒エンジニアはとてつもなくラッキーだったと思う。世の中には訳のわからない Java の研修を延々受けさせられてる新卒 SE さんもいるのに、ペ社の新卒エンジニアは WEB+DB PRESS に寄稿するような人から最新シャレオツ Rails 開発事情をたたき込まれたのだ。下手をすると中途で入って実サービスに投入されてる経歴不詳の怪しい30過ぎのおっさんよりも良いコーディングマナーを身につけているかもしれない。新卒エンジニア氏一名が自分の部署に配属されることになったので、来月自分は戦力外通告を受けて気がついたらハローワークに日参しているかもしれない。

なんか hsbt さんばかり持ち上げてしまったけど antipop さんも Webistrano をさくっと Rails 3.2.5 で動くようにしたりとかすごい。技術力ある人は技術力に比例して行動力が高い気がする。やらなきゃと思ったこと、読まなきゃと思った技術書を一晩とかでさくっと実装・読破してしまう。そういうところが並のエンジニアと大きく異なる点だと思う。

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

あるモデルがあって、#save が実行されたときに同一モデル内で複製したインスタンスも一緒に保存したかった。一個目の #save が走る前にコールバックメソッドを使って複製したインスタンスを保存するようにした。コードだと以下のような感じ。

class Model
  before_validation :method_one
  before_create :method_two

  def method_one
    ...
  end

  def mothod_two
    Model.reset_callbacks(:validation)
    Model.reset_callbacks(:create)

    @model = Model.new
    @model.save
  end
end

なんで reset_callbacks 呼んでるのかというと二回コールバックメソッドを走らせないため。一回目の #save (コントローラーから呼ばれる)が呼ばれたときだけコールバックメソッドを実行して、二回目の #save (モデルのコールバックメソッド内で呼ばれる)では実行したくないから。

しかしここではまってしまった。なんとコールバックメソッドで複製したドキュメントを DB 内で確認すると created_at が空になっている。なんじゃこりゃ。

どうも reset_callbacks(:create) がいかんかったみたい。ORM が実行する create 周辺のコールバックメソッドも軒並みリセットされてしまう模様。

そういうわけで以下の様にして解決した。

class Model
  before_validation :method_one
  before_create :method_two

  def method_one
    ...
  end

  def hoge
    Model.skip_callback :create, :before, :sell
    Model.skip_callback :create, :after, :send_notification
    Model.reset_callbacks(:validation)

    @model = Model.new
    @model.save
  end
end

callback、便利だけど奥が深い。ちなみにこれら skipp_callback とか reset_callbacks とかは ActiveModel や ActiveRecord (僕はMongoidで開発してます)などの OR マッパーのメソッドではなく、 ActiveSupport::Callbacks のメソッドだったりします。ActiveSupport も奥が深い。

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

im.kayac.com、パスワードか秘密鍵設定してないとスパム通知が沢山来ることが分かったので、パスワード認証と秘密鍵認証に対応させました。

隙あらばメール通知やりたいんだけど、一プラグインの中でメール送信の仕組みを持つの無駄が多そう。Lokka本体もしくは別のプラグインとしてメール送信の仕組みあった方が良さそう。WordPressキラー路線を突き詰めるんだったらお問い合わせフォームみたいのがいるだろうし、だとしたらどうやってもメール送信のことは無視できない。

というか既にメール送信系は誰かが作ってたりして。(もう布団の中なので調べてません)

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

5ddb946876a3908769ea35051852592b.png (427×640)

Lokka はデフォルトだと Akismet が有効になっていてコメントが承認制になっていると思うのですが、なかなかコメントに気がつかないことが多いので、コメントが投稿されたときに im.kayac.com 経由で iPhone に通知が届くようにしました。 im.kayac.com 、初めて使ったけど便利ですね。

足りない機能とかあったらご連絡・ pull request いただけると幸いです。

| @WWW

FANIC

会社で何の仕事をしているか書いてなかったので書いておきます。DAZAIFU プロジェクトの FANIC というプロジェクトでプログラミングをやってます。FANIC とは音楽をやっている人のためのサイトで、デザインのカスタマイズがわりと自由な音楽ホームページです。ご自分が作った曲をアップロードしてインターネットユーザーの皆さんに音楽を聴いてもらうことができます。

先日やっと、音楽を販売する機能がリリースされました。ここまで結構長く時間がかかってしまい、販売機能を待ちわびていたミュージシャンの方々には申し訳ない限りです。

自分で作った音楽を売ろうと思っているけど売りたい場所が見つからなかった方、是非一度 FANIC をお試し下さい。いまなら月額の利用料金(315円)がかかりません。

FANIC が他の音楽販売サイトと異なる点は、非圧縮の音源をアップロード出来る点だと思います。AIFF や WAV といった高音質の音源を販売することが出来ます。圧縮音源では自分の音楽を売りたくないとお考えの方にもご満足頂けるのではないかと思っています。また iTunes や Amazon と違って、仲介業者を通さず個人が直接 FANIC で音楽を売ることができます(これが意外とハードル高いっぽい)。仲介業者を通さないので手数料が安めです(販売額の 15.75%)。

ここで読者の皆様にお知らせです。shikakun という若者がいて、僕はこの人の作る音楽が好きなんですけど、これまで shikakun のサイトなどから曲をダウンロードしても shikakun に投げ銭をする方法がありませんでした。しかしいまは FANIC があります。http://fanic.jp/shikakun にアクセスすれば、shikakun が作った音楽を試聴し、気に入ればその場で購入&ダウンロードすることができます。是非、shikakun の音楽を買ってあげて下さい。shikakun にメロンパン以外のものを食べさせてあげて下さい。

FANIC と shikakun の音楽をよろしくお願いします。

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

このサイトはさくらVPSで動いてたんですけど(Herokuにデプロイするとなぜか Application Error が出るのでHeroku使うのはやめました)、3月にさくらVPSの新プランが発表されて、旧プランからメモリとディスク容量が100GBに増えた新プランに引っ越した(借りかえた)ので、旧プランの契約が終わる5/31までにサイトをどっかに移動させないといけませんでした。新さくらVPSで動かそうかとも思いましたが、EC2のマイクロインスタンスが一年間ただで使えるのでEC2を使ってみることにしました。

EC2とは言えインスタンスを立ち上げたらあとは普通のLinuxなので必要なパッケージをインストールして環境構築しました。Lokkaを bundle install するときに、このサイトでは必要ない PostgreSQL がないとかでエラーが出るのがだるかったけど、デプロイを Capistrano で自動化していたので思ったよりあっさりと移行できました。よかったよかった。

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

昨日のやつ(Ruby の Enumerable#inject() - portal shit!)、「使い方間違ってるだけだろwww」みたいな感じの言及があったのでもうちょっと調べてみた。やりたかったのは以下のようなこと。日付の範囲をレシーバーにした Enumerable オブジェクトをつくって、日付をキーにグルーピングされたハッシュを作りたかった。

Date.today.beginning_of_month.upto(Date.today.end_of_month).inject({}) do |result, date|
  result[date] = Document.where(:created_at.gt => date).and(:created_at.lt => date)
end

これを実行しようとすると

NoMethodError: undefined method `[]=' for Tue, 01 May 2012:Date

と言われる。

しかし以下のようにしたら意図した通りのハッシュを作ってくれた。

Date.today.beginning_of_month.upto(Date.today.end_of_month).inject({}) do |result, date|
  result[date] = Document.where(:created_at.gt => date).and(:created_at.lt => date)
  result
end

ふむふむ〜、ナルホディウスですぞ〜〜〜〜〜。Enumerable#inject の引数がハッシュではなく配列のときは最後の result はいらないのだけど、ハッシュのときはいるらしい。

ルbyーーー1.9.2-p290 + レールズ 3.2.2 での現象です。