dm-validations-i18n.gem version 0.3.9 released.

This gem can localize error messages for dm-validations.

I made it, because dm-core or dm-validations are not have localized error messages, and authors of them will not provide them.

The gem supports locales en, ja, ru, zh-CN and zh-TW. These locales made by  gugods, makevoid and others in several countries. I really appreciated their works.

production環境ではexception_notificationでエラーをメールしてる人も多い思います。(AirBreakとかも)

怖話でもそうやってエラーメールが一通も来ない状態にしたいんですが、例えば下記のような”バグじゃないエラー”は皆様どうやって対応してるんでしょう?

A ActionView::MissingTemplate occurred in home#index:

 Missing template home/index, application/index with {:handlers=>[:erb, :builder, :haml], :formats=>["*/*;q=0.01"], :locale=>[:ja, :ja]}. Searched

formatsに*/*;q=0.01なんて文字列を送ってくるのは単なるスパム。使ってるformatだけに限定するように何か書く?うーん・・・。

$ rails c
>> Story.last.previous
=> #<Story id: 1, title: "パンドラ(禁后)", body: "私の故郷に伝わっていた「禁后」というものにまつわる話です。\nどう読むのかは最後までわかりませんでしたが...", view: 0, user_id: 1, created_at: "2011-11-25 08:48:33", updated_at: "2011-11-25 08:48:33", comments_count: 0, scares_count: 0>

バグ報告からふとActiveRecordで使えるpreviousメソッドってどこからきてるんだろう?と思ってgemsをgrepしてみるも見当たらず。

┐(´ー`)┌「これだからメタプログラミングってやつは・・・」.

Twitter / @irohiroki: @komagata Method#source_lo ...

なんですと!よし、場所を探り当ててやる!

>> Story.last.method(:previous).source_location
=> ["/Users/komagata/code/kowabana-jp/app/models/story.rb", 38]

( ゚д゚)

(つд⊂)ゴシゴシ

# app/models/story.rb:
class Story < ActiveRecord::Base
  def previous
    Story.where('id < ?', id).order('id').limit(1).last
  end
end

(((((((( ;゚Д゚)))))))

自分で普通にmodelに定義してた。

因みに複数人開発で他人が実装したとかではなく、紛れも無く俺が実装したメソッドである。おまけにテストも書いてある。

何故このような自体が発生したのか。それはメソッド名が自然過ぎたか、俺がアルツハイマーか、もしくはその両方である。

日本の祝日が分かるgem、holiday_jp 0.3.1をリリースしました。

単純なgemなんですが、何故か@pwimさんが高速化してくれたり、@kakutaniさんがリファクタリングしてくれたりで、gemを介して遊んでるみたいな感じです。

今回はjewelerオワコンってことでbundlerにしたり、travis-ciしたり、rubygems-test対応したりしました。

僕も他のgemで新しいツールを使う前の実験台として使ったりしています。:-)

rubygems-testって面白いですね。僕はperl使ってた時に、「cpanの自動テストうっっっz」とか思ってましたが、良い物ですね。すいません。

特にrubygems-testをユーザーがインストールをしてるとプラットフォーム毎にテストが通ったかどうかを自動でhttp://test.rubygems.org/にアップしてくれるのがイカス。

Gem Testers

holiday_jpに幸あれ、rubygems-testに幸あれ。

Railsアプリで画像添付メール経由で画像を受け取りたい。(ガラケーとか)

/etc/aliases:

foo: "| cat $1 > /tmp/foo"

これだとファイルのownerがnobodyとかになっちゃうので.forwardを使う。

/home/unk/.forward:

"| cat $1 > /tmp/foo"

Railsでメールを受け取る

Railsでメールを受け取りたい。railsをCLIから呼び出すにはrails runnerを使う。しかし、railsコマンドはRAILS_ROOT外ではrails new用の動きをするので困る。

しかし、その為にあるのかも知れないscript/railsを使えばOK。

rvm経由で呼び出すと相当長くなる。

"| BUNDLE_GEMFILE=/var/www/foo/current/Gemfile /home/unk/.rvm/bin/rvm ruby-1.9.2p290@foo exec bundle exec /var/www/foo/current/script/rails runner 'PictureMailer.receive(STDIN.read)' -e production"

しかしまだ画像ファイルが600で作成されるという問題が残る。下記の様にchmodするようにしてもいいけど、umaskを変更する方がいいかも。

mod_passenger利用時の注意点 - komagata

"| umask 0022; BUNDLE_GEMFILE=/var/www/foo/current/Gemfile /home/unk/.rvm/bin/rvm ruby-1.9.2p290@foo exec bundle exec /var/www/foo/current/script/rails runner 'PictureMailer.receive(STDIN.read)' -e production"

umaskは子プロセスに引き継がれるのでPaperclip経由で出来るファイルもこれで644になる。

# hello.rb:
require 'rubygems'
require 'sinatra/base'

class Hello < Sinatra::Base
  get '/' do
    'hello'
  end
end

Hello.run! if __FILE__ == $0
$ ruby hello.rb

Sinatra::Baseと違ってSinatra::Applicationは便利な初期化をかなり色々やってくれるので1ファイルで書く時はやっぱり普通のがオススメ。

utf-8のメールをmail.gemを使って送るとWARNINGが出る。

Non US-ASCII detected and no charset defined.
Defaulting to UTF-8, set your own if this is incorrect.

明示的にcharsetを指定すればOK.

# coding: utf-8
require 'rubygems'
require 'mail'

mail = Mail.new do
  to       'foo@example.com'
  subject  'テスト'
  body     'テストメール'
end

mail.charset = 'utf-8' # It's important!
mail.delivery_method :sendmail
mail.deliver

TokyuRuby会議04でLokkaについてLTさせていただきました。

TokyuRuby会議に初めて参加させていただきました。運営に携わった皆様ありがとうございました。スポンサーのサントリー様のプレミアムモルツ美味しゅうございました。@2celebさんの料理もとても美味しかったです。

Lokkaでもpadrino-helpersをマージしようとしてますが、Padrinoエヴァンジェリストの@udzuraさんと話せたのも嬉しかったです。

改めて勉強会やイベントの目的とは何なのか考えさせられたイベントでした。

routesがシンプルなところ。

# routes.rb:
require 'rubygems'
require 'sinatra'
require 'pp'

get('/foo')  {}
post('/foo') {}
get('/bar')  {}
post('/bar') {}

pp Sinatra::Application.routes

exit
% ruby routes.rb 
{"GET"=>
  [[/^\/foo$/,
    [],
    [],
    #<Proc:0x000001009c5a58@/Users/komagata/.rvm/gems/ruby-1.9.2-p290@default/gems/sinatra-1.3.1/lib/sinatra/base.rb:1212>],
   [/^\/bar$/,
    [],
    [],
    #<Proc:0x0000010159c318@/Users/komagata/.rvm/gems/ruby-1.9.2-p290@default/gems/sinatra-1.3.1/lib/sinatra/base.rb:1212>]],
 "HEAD"=>
  [[/^\/foo$/,
    [],
    [],
    #<Proc:0x0000010159cd90@/Users/komagata/.rvm/gems/ruby-1.9.2-p290@default/gems/sinatra-1.3.1/lib/sinatra/base.rb:1212>],
   [/^\/bar$/,
    [],
    [],
    #<Proc:0x0000010159bee0@/Users/komagata/.rvm/gems/ruby-1.9.2-p290@default/gems/sinatra-1.3.1/lib/sinatra/base.rb:1212>]],
 "POST"=>
  [[/^\/foo$/,
    [],
    [],
    #<Proc:0x0000010159c868@/Users/komagata/.rvm/gems/ruby-1.9.2-p290@default/gems/sinatra-1.3.1/lib/sinatra/base.rb:1212>],
   [/^\/bar$/,
    [],
    [],
    #<Proc:0x0000010159ba08@/Users/komagata/.rvm/gems/ruby-1.9.2-p290@default/gems/sinatra-1.3.1/lib/sinatra/base.rb:1212>]]}

Hash, Array, Regex, Procの組み合わせに過ぎない。自由度MAX。

これはセクシーだ。

怖話をruby1.8.7 & rails3.0.8からruby1.9.2 & rails3.1.1の最新状態に更新しました。引っかかったところメモ。

yamlのエラー

$ rake db:migrate
rake aborted!
couldn't parse YAML at line 267 column 42

rake db:migrateがエラー。

require 'yaml' YAML::ENGINE.yamler= 'syck'

config/boot.rbの2行目に下記を追加。

require 'yaml'
YAML::ENGINE.yamler = 'syck'

日本語

db/seeds.rbで日本語を使ってたので先頭に下記magick commentを追加。

# coding: utf-8

何でもかんでもmagick commentを入れるのは良くないので必要なところにだけ。rubyのm17nは素晴らしいと思います。

Array#choice

ruby1.9.2ではArray#choiceが無くなってる。Array#sampleを使えばいい。

Fixtures

FixturesがActiveRecord::Fixturesになりました。

db/seeds.rbでfixtureを読み込む場合(test用のとは別に用意してる場合とか)

require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/db/seed", 'stories')

こんな感じだったんですが、

require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/db/seed", 'stories')

こうなりました。

Asset Pipeline

developmentで余裕こいてるとproduction世界でひっそり幕を閉じる。(via ブロントさん)

Asset Pipelineを大きく下記の4つに分けて考えるとわかりやすいです。

  • preprocessing(coffee -> jsなど)
  • concatenation(複数のファイルを一つにする)
  • compression(圧縮)
  • fingerprinting(ファイル名にハッシュ値を付ける)

対象は下記3つ

  • javascript
  • stylesheet
  • image

productionではrake assets:precompileで上記4つを対象3つに施してpublic/assetsフォルダーに入れ、nginx等のWebサーバーに配信させてrailsは関与しません。アプリ起動前からpublic/assets以下に必要な全てのファイルが揃って準備完了している必要があります。

precompileされるにはファイルがsprocketsの記法= require tree .等やconfig.assets.precompile += %w()のリストに入ってる必要があります。ここから漏れているファイルはpublic/assetsに無いことになるので表示されません。

jsの中でひっそり使われてる画像や特定のページでだけ読み込んでるcss、そういえば使ってたjqueryプラグインなど、とても見落としやすいので気を付けなければなりません。

それを乗り越えればnginxでcache期限無限のフィーバー状態です。でも既存アプリのバージョンアップなどでは上記見落としを無くすのはとても難しいと思います。もし見逃しそうならば・・・

config.assets.compileをtrueにするんだな。
おまえにもかぞくがいるだろう…