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

今年の3月くらいから、寿限無の和田さんが発起人になって Fukuoka.rb という勉強会をやってる。毎週木曜の 19:30 からで、ペ社は会場を提供している。勉強会と言ってもやってることは技術書の輪読で、最初は『メタプログラミング Ruby』を読んだ。メタプログラミング Ruby は中級者以上向けの本でなかなかレベルが高く、当初は 30人ちかくいた参加者が回を重ねるごとに減っていき、最後は5, 6人くらいしか参加者がいなかったけれども、歯を食いしばって出席し続けた。簡潔に書ける、美しいコードが書ける、という以上のことができる Ruby の側面を学んだと思う。いまは二冊目の課題図書として洋書の『Eloquent Ruby』を読んでいる。

福岡でやってる Ruby の勉強会、何回か出たことあるけど、Rails ハンズオンみたいな初心者向けの内容だったり技術より精神面を重視した内容だったりで個人的には消化不良な感じがあった。また開催が不定期で、プログラマ同士の情報交換がしにくいと感じていた。

Fukuoka.rb は原則的に毎週開催で、扱う内容も初心者よりというよりは中上級者向けで、本を読みながら喧々諤々とした議論も繰り広げられるし、自分はあまり参加しないのだけど勉強会の後はみんなで飲みに行ったりもする。業務で感じていた疑問を詳しい人に尋ねたり情報交換しやすい。

個人的には、中学生の頃に通っていた隣町の塾を思い出す。自分は田舎に住んでいたので、都会の塾に行くだけでレベルの高さに驚くとともに刺激を受けて、都会っ子に追いつこうと勉強を頑張った。Fukuoka.rb は参加者のレベルが高く、なかなかついて行くのが大変なのだけど、確実に Ruby 力が高まっていると思うし、出てて良かったと感じる。

Asakusa.rb や Yokohama.rb のような Ruby コミュニティをずっとうらやましく思っていたけど、これらに近い Ruby コミュニティが福岡にできつつあると思う。時々は Ruby コミッターの @nagachika さんも参加している。福岡在住の Ruby プログラマで腕に覚えがある人は、是非毎週木曜日に天神プライムビル8階で開催されている Fukuoka.rb にお越しください。面白くしていきましょう。

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

アンチポップさんの日記に登場できて何だかうれしいんだけど、最近会社で社内SNSをハッキングするのが流行ってる。

自分がこれまで作ったのは社内SNSの日報を読みやすくするGoogle Chrome拡張とMarkdownで書いてある日報の本文をパースしてHTMLに変換して表示するやつ。「便利ですね」とか言われちゃったりなんかしてなかなか面白かった。

ハッキングは楽しい。制限されたところで無理やるやるのが面白いと思う。2008年頃のTwitterを思い出す。Firefoxとグリモン全盛期で、youpyさんとかkoyachiさんとかfubaさんとかucnvさんとかが作ったへんてこりんなグリモンをインストールしてTwitterを見るのが楽しみだった。あの頃は単なる使い手だったけど、いまじゃ自分で簡単なグリモンや拡張は作れるようになって、とても充実感がある。ずっと筋トレしてた虚弱体質の人が人前で力こぶを作って「おおー」と言われたときに感じるであろう感覚を味わっている。そんな感じです。

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

あるモデルがあって、#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 いただけると幸いです。

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

このサイトはさくら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 での現象です。