Rubyで日付の計算するならactive_support使っとけって世間で言われてるけどマジだわ

最近、RubyRailsを使わずに開発をする機会があるのですが、日付に関する計算は結構面倒なことが多く、コードも汚くなってしまいがちです。
しかし、railsでおなじみのactive_supportを使えば、直感的に書けてしまいます。
やはりactive_supportは偉大です。

require 'rubygems'
require 'active_support/all'

date = Date.today #<Date: 2013-06-08 ((2456452j,0s,0n),+0s,2299161j)>

date.tommorrow # 翌日(Sun, 09 Jun 2013)
date.yesterday # 昨日(Fri, 07 Jun 2013)

date.next_year # 来年(Sun, 08 Jun 2014)
date.prev_year # 昨年(Fri, 08 Jun 2012)

date.beginning_of_week # 今週の初め(Mon, 03 Jun 2013)
date.end_of_week # 今週の終わり(Sun, 09 Jun 2013)

Dateクラスだけでなく、Timeクラスも同様に操作できます。
詳細はリファレンスを参照ください。

ちなみに、require 'active_support/all'の部分は、active_support 2時代は require 'active_support'という記述でよかったそうですが、active_support 3以降は'active_support'、'active_support/time'、'active_support/core_ext'の3つに細分化され、それぞれ個別に読み込むことが可能になりました。
そのため、require 'active_support'という記述だと、上記の日時系のメソッドはNoMethodErrorになります。

日付関連の操作は面倒なので非常に助かります。

参考:
http://railsdoc.com/active_support#%E6%97%A5%E4%BB%98%E9%96%A2%E9%80%A3
http://blog.livedoor.jp/sasata299/archives/51312035.html
http://memo.yomukaku.net/entries/200

ももクロとニュータイプとガンダム

先日、かねてから念願だったももクロのライブ
『誰でもカモ~ン!~ただし、ホワイトベレーの方に限ります♡~』
に参戦してきた。
初めてのももクロライブである。

ユニクロのTシャツとチノパンで参戦した僕とは違い、9割9分の方はももクロ衣装のコスプレやハッピ等を身に纏まとっていた。事前準備を怠った自分の怠惰心を心の底から呪った。

ももクロライブのコスプレの様子はこの辺りを参照されたい。
http://matome.naver.jp/odai/2134400598238382901

さて、本題のライブの感想はというと、
事前のネット等の情報によって構築された高いハードルをいとも容易く超えるほど、見所満点でサービス精神の溢れるライブであった。
特に印象的だったのが、ライブの開演前と閉演後の観客の楽しませ方である。
(えっ、それライブじゃねぇじゃん。というツッコミはご容赦ください。)

まず、ライブ開演前である。
開演1時間前に席に到着して暇を持て余していると、ステージ上からマネージャーらしき男性2人とかなこ氏が。
えっ?
なんと開演までの待ち時間を利用してトークライブが始まったのである。あどけないトークで会場を和ませた。
その後も、会場の巨大スクリーンに観客をランダムで抜き、モノマネを無茶振りするなどして開演直前まで観客を待たせないようにしていた。

ライブが終わり、人混みに流されて家路を急いでいると、何やら出口付近でスタッフがA4サイズの白い紙を配っているではないか。どうせグッズの広告か何かだろうとその紙に目を向けると、そこにはなんと、かなこ氏からの手紙が書かれていたのである。
丁寧に書かれた手紙にグッとくる気持ちを抑えながら会場をあとにした。

f:id:yachibit:20130530023009j:plain


さて、ライブ自体はどうだったのかというと、、、
会社帰りのおっさんがワイシャツの上にハッピを着て、サイリウムを力強く振り、汗をだらだらと流しながら
「あーっ、れにちゃん!」
と叫んでいた。
そんな熱狂的なモモノフ達が1人や2人ではない。
いや、その熱狂ぶりが会場全体を包んでいるのである。
凄まじい一体感。
言葉を介さずとも通じ合っている感覚。
ん、これは、もしや。。。
機動戦士ガンダムで描かれていたニュータイプの能力ではないのか。
そうか、ももクロは現代の生けるニュータイプだったのか。
そして僕たち、おっさん達のニュータイプ能力を開花させてくれていたのか。


はい、2日前にガンダムを見ていた僕は、見たもの聞いたもの全てを脳内でガンダムと関連付けて纏めたくて仕方がなかったのです。そんな厨二心を押さえることができず、こうしてノートパソコンのキーボードを叩き始めるに至った訳である。
(お分かりかもしれないが、このニュータイプの下りが1番言いたかったことであり、それ以前の手紙云々はどうでも良かったのだ。)

アイドルとガンダムネタついでに言うと、
AKBはガンダムに乗ったアムロ・レイのようである。
AKBという箱に入ることで、世間での知名度や影響度は計り知れない。
しかし、それはAKBだから人気が出たのであたって本人の実力で人気が出たのではないと(本人達の頑張り等とは無関係に)揶揄されてしまう。
これは正に、ガンダムに乗ることでアムロが陥ってしまった「祝福と呪い」である。

とまぁ、あまりに酷い内容の記事になってしまったので、百田監督が考えてくださった素晴らしいセットリストを紹介して本記事を締めくくろう。

1.走れ!
2.Chai Maxx
3.行くぜっ!怪盗少女
-MC-
4.DNA狂詩曲
5.全力少女
6.仮想ディストピア
7.ワニとシャンプー
-MC-
8.労働讃歌
9.ゲッダーン!
10.BIONIC CHERRY
11.月と銀紙飛行船
12.ももクロのニッポン万歳!
13.黒い週末
14.ココ☆ナツ
15.コノウタ

SE.OverTure
EN1.Chai Maxx
EN2.あの空へ向かって
EN3.走れ!
-MC-
EN.4渚のラララ

『走れ!』に始まり『走れ!』で終わる。
斬新だけど素晴らしい選曲。さすが百田監督。
最高のライブをありがとう。
これからも、ももクロの一層のニュータイプ能力に期待である。

入口のない出口 (初回限定盤A)

入口のない出口 (初回限定盤A)

SQLiteのinteger型とPostgreSQLのinteger型は違うんですね

railsアプリを開発していてherokuに移行した際、エラーが発生してしまった。
ローカルで動いていたのになぜ...

$ heroku logs

でログを確認してみると

ERROR:  operator does not exist: character varying = integer

と書かれている。
ググってみるとやはりデータ型に関するエラーのよう。
調べてみるとローカルで使用してるSQLiteとherokuで使用されているPostgreSQL

integer型のバイト数に違いがあるそうだ。

SQLite:    4バイト
PostgreSQL: 1、2、3、4、6、8バイト(データサイズに依存)


今回はデータバイト数や頭にゼロが来た場合への考慮からstring型に変更するよう対応した。

class ChangeUidInUsers < ActiveRecord::Migration
  def up
    change_column :users, :uid, :string
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

MiniProfilerを使ってパフォーマンスを測定してみました

先日railsで開発しているアプリケーションのパフォーマンスを改善する機会がありました。
パフォーマンス改善の基本、「ボトルネックを特定」をするために、パフォーマンス計測のプロファイリングツールを探していたところMiniProfilerというツールが素晴らしく便利だったので紹介します。

といっても導入はとても簡単。
gemfileにgemを追加してbundleコマンドを実行しインストールを行なうだけです。

gem 'rack-mini-profiler'


アプリを再起動すると、ページレンダリングにかかる時間が表示されます。

f:id:yachibit:20130529004712j:plain


SQLのリンクをクリックすると、それぞれの処理時間とどのようなSQLクエリが実行されたかが表示されます。

f:id:yachibit:20130529004058p:plain


これらの情報は、developmentモードではデフォルトで有効化されており、表示されます。
もし、production環境でもパフォーマンスを確認したい場合は、productionの設定ファイル(/config/environments/production.rb)のserve_static_assetsオプションをtrueに変更します。

# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = true


P.S.
railsの高速化に関しては、『WEB+DB PRESS Vol.70』の成田さんの記事が大変参考になりました。ありがとうございました。


参考:
http://railscasts.com/episodes/368-miniprofiler


WEB+DB PRESS Vol.70

WEB+DB PRESS Vol.70

  • 作者: 成田一生,高津戸壮,Dr.Kein,近藤宇智朗,後藤秀宣,mala,中島聡,森田創,堤智代,A-Listers,はまちや2,佐藤裕介,久森達郎,大窪聡,本田謙,和田英一,天野祐介,藤吾郎(gfx),奥野幹也,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2012/08/24
  • メディア: 大型本
  • 購入: 8人 クリック: 89回
  • この商品を含むブログ (15件) を見る

railsのpluckメソッドが便利な件

先日、リファクタしている際に知ったpluckというメソッドが素晴らしかったのでメモです。
pluckは引数としてカラム名を渡すとそのカラムの値が配列で返してくれるメソッドです。

今までmapを使って書いていた下のようなコードが、

user_ids = Array.new
user_ids = User.map{ |user| user.id }


下記のように1行で書けてしまいます。

User.pluck(:name)

しかも、sasata299さんのブログにも紹介されている通り、
パフォーマンスも改善されるそうです。

これは使わなそんです。

SSHで接続しようとしたら秘密鍵のパーミッションでエラーが出た

リモートサーバーに公開鍵暗号方式を使用したSSHでアクセスを試みたところ下記のようなエラーが発生。

$ ssh staging
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0755 for '/Users/yachibit/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /Users/yachibit/.ssh/id_rsa
Permission denied (publickey).
19:26:55 (1.02) % cd ~/.ssh/

秘密鍵のパーミッションがオープンすぎるとのこと。
ググってみたところパーミッションを"600"にすればよいとの記事が見つかったので、
実際にやってみた。

$ chmod 600 ~/.ssh/id_rsa

$ ls -l ~/.ssh                                                                        
total 56
-rwxr-xr-x  1 yachibit  staff   222  4 24 19:23 config*
-rw-------  1 yachibit  staff  1766  9 13  2012 id_rsa
-rwxr-xr-x  1 yachibit  staff   407  9 13  2012 id_rsa.pub*

これで再度、接続を試みたらうまくいきました。

ruby書けないのに飲み会には行くんですね

新年度になり、世間は歓送迎会で賑わうシーズンになってまいりました。
例にもれず、弊社でも毎週のように歓送迎会が開かれています。
毎週のように酔っぱらって家に帰り、飲み会が面倒だと愚痴をこぼしていた自分に、
同居人の方からグサリと刺さる言葉を言われてしまいました。

「ruby書けないのに飲み会には行くんですね。」


ぐぬぬ...
本当にその通り過ぎて、ぐうの音もでませんでした。
飲み会なんて行っている暇がどこにあるのか...

貴重なお言葉を頂きありがとうございました。