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

自戒エントリー。

自分は Mongoid を使って開発してるんですけど、時間の境界値のテストが不十分で問題に遭遇したのでメモっておきます。

Mongoid には Date 型や DateTime 型があるけど、データベースにデータを保存するときには Time 型に変換されます(MongoDB に Date とか DateTime がないから?)。Mongo Shell で DB の中の値を見ると Time 型の値が入ってる。

だからクエリを生成するときに Date.today はなるべく使わない方がいい。Date.today では時間を 00:00:00 として扱い、月末のデータの取得に失敗する可能性が高いから。Rails console で確認すると、以下のようになります。

pry(1.9.3-p194)> 1.month.ago.end_of_month
# => Fri, 31 Aug 2012 23:59:59 JST +09:00
pry(1.9.3-p194)> Date.today.prev_month.end_of_month.to_time
# => 2012-08-31 00:00:00 +0900

上記は二つとも「先月末の月の終わり」を検索していますが、後者では時間が 00:00:00 になっています。例えば以下のような Mongoid でのクエリでは、8月31日の午前0時0分1秒以降に作成された Document を取得することが出来ません。ナンテコッタイ!!!

Model.where(:created_at.lte => Date.today.prev_month.end_of_month)

Date.today を時刻の生成の起点にしたとしても、to_time してあげればいいのでは?」と思う方もいるでしょう。確認してみましょう。

pry(1.9.3-p194)> Date.today.prev_month.end_of_month.to_datetime
# => Fri, 31 Aug 2012 00:00:00 +0000

#prev_month メソッドが呼び出された時点のオブジェクトの型は Date 型なので、Date 型に対して時間の操作を行って最後に DateTime 型に

結論

時刻まで考慮した時間の範囲でクエリを作るときは以下に留意すると良いでしょう。

  • Date.today は使わない
  • DateTime.now1.month.ago などを使う

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

RSense という Ruby のプログラムを書いているときに、レシーバの型に応じた補完候補を表示してくれるソフトがあります。Emacs とか Vim と組み合わせて使うと便利らしいです。Java で IDE 使って開発すると補完候補がわさわさ出てきて殆ど鼻くそほじってるだけでプログラミングできるという話を聞いたので、Ruby でも鼻くそほじりながらプログラミングしたいなと思ってこいつを導入してみることにしました。春頃やったときはなかなかうまく Vim から使うことが出来なくて諦めてたんだけど 、つい最近できるようになったのでやり方をメモっておきます。

Mac でのお話です

前提条件ですが、Mac で使ってます。環境は Homebrew で構築してます。また RSense を使うには Java Runtime Environment が必要です。あなたと Java

RSense のインストール

JRE のインストールは済んでいるものとします。Homebre で RSense をインストールしましょう。簡単です。

brew install rsense

インストールが済んだら以下のようなメッセージが表示されると思うので、指示に従いましょう。

If this is your first install, create default config file:
    ruby /usr/local/Cellar/rsense/0.3/libexec/etc/config.rb > ~/.rsense

すると ~/.rsense というファイルが作られ、中身は以下のようになっています。

home = /usr/local/Cellar/rsense/0.3/libexec
load-path = /Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1:/Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby/1.9.1/x86_64-darwin11.4.0:/Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/site_ruby:/Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby/1.9.1:/Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin11.4.0:/Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/vendor_ruby:/Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1:/Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.4.0
gem-path = /Users/morygonzalez/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1:/Users/morygonzalez/.gem/ruby/1.9.1

rbenv 使ってる人は load-path にちゃんと rbenv のパスが含まれているか確認して下さい。

Vim の設定

このままではまだ RSense がインストールされただけで、Vim から利用することができません。Homebrew で入れた RSense には rsense.vim がついてくるので、こいつを Vim の plugin ディレクトリにコピーします。

cp /usr/local/Cellar/rsense/0.3/libexec/etc/rsense.vim ~/.vim/plugin/

次に .vimrc で rsenseHome を指定しなければなりません。

let g:rsenseHome = "RSense home"

と書きます。僕はこの rsenseHome が分からなくてハマりました。先ほどの config.rb を実行したときに生成された ~/.rsense に書いてある home をここに指定します。なので rsenseHome は /usr/local/Cellar/rsense/0.3/libexec です。

ここまで済んだところで Vim から RSense が認識されているか確かめます。適当に Vim を起動して :se ft=ruby とし、:RSenseVersion とコマンドを打ってみます。ここで RSense 0.3 のように成功されたら設定完了です。filetype が ruby になっているファイルで 1. と打った後、補完候補を呼び出すコマンド(^X ^U)で候補を呼び出せます。以下のような感じ。

8da56d016a74ebc9d38afcf593bfeadd.png (200×116)

“ネオコン” と連携させましょう

さらに言うと、たいていの Vim ユーザーの皆さんは neocomplcache も使ってるでしょうから、neocomplcache と RSense を連携させましょう。ネオコン作者の Shougo さんのブログ記事を参考にして下さい。

以上で完了です。これで Vim で Ruby な皆さんも鼻くそほじりながらプログラミングできますね。

| @労働

9月1日からシニアエンジニアを拝命しました。シニアエンジニアには 30days/Sqale の刺身☆ブーメランさんやインフラエンジニアの @lamanotrama さんなんかがいて、自分のような職業エンジニア歴の短い人間が同じ肩書きで仕事して良いのかと不安もあるんですけど、技術責任者の mizzy さんには業務内容の他、 Lokka のプラグイン作ったりバグを見つけて pull request 送ったりしてたことを評価して頂き、晴れてシニアエンジニアとなることができました。

ちなみに選考は刺身さんが書いてる前回の様子(シニアエンジニアになりました - 刺身☆ブーメランのブログ / @kyanny’s blog)からさらにラディカルになっていて、応募(pull request で行います)からレビュー、結果の発表まで GitHub のプライベートリポジトリで行われました。ジットハブ、本当に便利ですね。

シニアエンジニアの名前に恥じないよう、多くの人に喜んでもらえるサービスを提供するとともに、「所詮ペパボ」とか言われないよう、技術力を高めていきたいと思います。

| @労働

福岡配属になった新卒氏が自分のチームに配属されたのでペアプログラミングをやってた。一応 OJT なんだけど、東京で @hsbt さんと @antipop さんによるブートキャンプを経験してきた新卒氏に「request spec を書く前に view を書くな、ハゲ」と自分の方が叱咤されたりしてこちらも良い勉強になった。

新卒氏に便利な UNIX コマンドを教えたり、rbenv の利用方法を教えたりしながら、自分で言うのもなんだけど、俺やシニアエンジニアの @linyows 氏が独学で覚えたことを口頭で教えてもらえてすごくラッキーだよなー、と思ってしまった。TDD とペアプログラミングで OJT なんてすごいと思う。特に福岡では。

訳の分からない SI 会社に入ってしまった若者は、コードを書きたいのに詳細設計書(実はなにも詳細に設計されてない、どうせコードを書く段になって仕様は変わるし設計通りに作るなんて無理だから)を方眼の Excel ドキュメントに延々書いたりとか、訳の分からないミーティングに出席させられて延々議事録を取ったりとかしてる。SI 会社の連中は FizzBuzz 問題も本当にこんな感じに「解く」。もしSIerのマネージャがFizzBuzz問題を解いたら - GeekFactory

仕事のことをブログに書くと毎回同じ結びになってしまってる気がするけど、クソみたいな SI 会社でつまんない仕事してる人は思い切って会社変えれば良いと思う。

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

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

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

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

| @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 で自動化していたので思ったよりあっさりと移行できました。よかったよかった。