怖話でコメント欄がスパムで埋め尽くされて困ったので日本語が入ってないコメントは弾くようにしました。

「日本語が入ってない場合弾く」というのはMovableTypeの時からあるやり方ですが、イマイチ綺麗に実装できる感がしなくて控えてました。しかしmojiという素晴らしいgemを使ったら簡単に出来ました。

class Comment < ActiveRecord::Base
  validates_format_of :body,
    :with => Moji.regexp(Moji::ZEN_ALNUM | Moji::ZEN_KANA | Moji::ZEN_KANJI),
    :message => I18n.t('errors.messages.not_a_zenkaku')
end

mojiは色々な文字種の正規表現を持っていて手軽に組み合わせたりできます。最初はMoji::ZENで全角文字があればOKにしました。しかし実データ(スパム)にはギリシャ文字やキリル文字が存在していたのでそれも除外するようにしました。

$ rails c -E production
>> Comment.all.each {|c| c.destroy unless c.valid? }

これで今までの全てのスパムが消滅。今のところ新しいスパムも防げてるようでスッキリ。

カウンターキャッシュのリセット

以前、update_countersメソッドを使ってカウンターキャッシュを設定したつもりになっていました。しかし、update_countersメソッドは与えた数だけカウンターが増えるという動作だったようです。代わりにreset_countersメソッドを使えばcomments.countの数にresetしてくれるようです。

Story.all.each do |story|
  Story.reset_counters(story.id, :comments)
end

コレをHerokuに移しました。

何よりも「僕が12時に起きてパソコンを立ち上げていないと動かない」という致命的な問題への対応です。

他の人も登録可能にすれば便利かな?誰か頼む・・・。

komagata/random_lunch - GitHub

Facebookページ・アプリでハマるところシリーズ。

RailsでFacebookアプリ作ります。FacebookアプリはIFRAME内のページをPOSTメソッドで呼び出します。エントリー一覧(/entries)のようなものをFacebookアプリのトップページにしようとしたらアレ?となります。(POSTしたらcreate呼ばれるから)

オーマイゴッド!じゃあ/entries/newをPOSTメソッドも受け入れるようにしてこれをトップにしよう。しかしFacebookアプリは/で終わるURLしか指定できません。仕方ないので/entries/new/を受け入れるようにしよう・・・。

しかしログインしたはずが情報が引き継がれません。おかしいな。

WARNING: Can't verify CSRF token authenticity

ログを見るとCSRF tokenのWARNING。考えてみりゃ当然ですが、FacebookからPOSTで呼ばれる時にはCSRF tokenなんぞ付いてないのでWARNINGが出ます。そして危ないのでsessionは一旦破棄されるわけです。自動ログアウト。

paperclipを使ってて「縦長の画像をアップしたら横長になる」という問題。

これはpaperclipが悪いんじゃなくて、元のファイルもMacのPreviewで見ると縦長なんだけど、ブラウザで見ると横長。MacのPreview他、ExifのOrientationタグに対応したソフトで見ると縦長に見える。

Webアプリ的にはちょっと困る。「縦長の画像をアップしたら横長になった!」と言われても見てるツールの違いで最初から横長なんだから。

imagemagickのconvertにはExifのOrientationタグの内容に合わせて画像データを回転させてくれる超便利な-outo-orientオプションがあるのでそれを使えばいい。

paperclipはrmagickを使わず、convertコマンドを呼び出すだけで、好きなオプションが渡せるというイカシタ作りになっているのでこんな感じでOK。

class User < ActiveRecord::Base
  has_attached_file :picture, convert_options: {all: '-auto-orient'}
end

allは複数のstyleが合った場合に全部にこのオプションを付けるという指定。originalも残るから安心。

phpでアップロードサイズね。はいはい、upload_max_filesize、ワロスワロスとかいってっとやべーぞ!

nginxのclient_max_body_sizeとphp.iniのupload_max_filesize, post_max_sizeを変える必要がある。

それぞれデフォルトは1MB, 2MB, 8MBになってっからデカイ画像とかアップできない。

# nginx
client_max_body_size 32M;
; php.ini
post_max_size = 32M
upload_max_filesize = 32M

sudo するときに sbin にパスを設定する方法 | Carpe Diem

僕はDebian派です。CentOSは嫌い・・・というかCentOSが俺のこと嫌いなんじゃないかと思っていた原因の一つがコレ。

オフィスにn0tsさんが来てたので、せっかくなので日ごろ気になってたアレコレを聞いてみたらスッキリした解決方法を教えてくれました。

「visudoは構文チェック機能のために存在する」こととか。

久しぶりにWindowsのパソコンを入手したので入れたソフト。リビング用なので仕事にはほとんど使わないです。

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  if Rails.env.production?     
    provider :twitter, 'xxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxx'
  else
    provider :twitter, 'ooooooooooo', 'oooooooooooooooooooo'
  end
end

今まで通りだと動きません。test/test_helper.rbに下記を追加。

require 'shoulda/rails'

今βのshoulda 3.xなら大丈夫なのでもうすぐこれも必要無くなるみたいです。

リビング(ニコ動)用としてマウスコンピューターのLm-AS411Eというヤツを買いました。

デスクトップパソコン|マウスコンピューター BTOパソコンの通販ショップ

Windows7アップグレード版とXP通常版(SP無し)、Vista通常版をもってるのでOS無しにしたんですが、一瞬詰んだかと思いました。

Windows7のアップグレード版をDVDブートした場合は何かしらのWindowsがHDDに入ってないと「プロダクトキーが間違っています。」と出る。(このエラーメッセージは不親切だと思う)

このLm-AS411EはWindows7しかサポートしないと書いてありますが、ホントにWindows XPはインストールできず何度もブートするし、Vistaはドライバーがなくてインストールできない。

(ハードもソフトも製品版をちゃんと買っているのに詰んだか・・・?)

と焦りましたが、アップグレード版をクリーンインストールする方法は有名らしく、こちらを参考にして解決しました。

Windows7アップグレード版からクリーンインストールする方法-GIZAZINE(ギザジン)

「何だよコンチクショウ!」