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(ギザジン)

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

rails3.1でMySQLからやってくる文字列がASCII-8BITになっているのでto_jsonすると壊れる(to_jsonがencodingを見て処理するので)。sqlite3では起こらない。

環境はSnow Leopard、ruby1.9.2-p290、homebrewで入れたmysql 5.1.54。

% rails new foo
% cd foo
% vi Gemfile
(...)
gem 'mysql'
(...)
% bundle
% vi config/database.yml
(...)
development:
  adapter: mysql
  encoding: utf8
  database: foo_development
  pool: 5
  username: root
  password: 
  host: localhost
  socket: /tmp/mysql.sock
(...)
% rails g model post title:string
% rake db:create
% rake db:migrate
% vi db/seeds.rb
Post.create!(title: 'うんk')
% rake db:seed
% rails c
ruby-1.9.2-p290 :001 > puts Post.first.title
うんk
 => nil 
ruby-1.9.2-p290 :002 > Post.first.title.encoding
 => #<encoding:ascii-8bit>
ruby-1.9.2-p290 :003 > puts Post.first.title.to_json
"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd"
 => nil

CentOS 5.6でも同じ。

解決:

mysql gemはruby1.9.1からのencodingに対応してない。だからmysql2を使えば解決でした。

% vi Gemfile
(...)
  gem 'mysql2'
(...)
% vi config/database.yml
(...)
  adapter: mysql2
(...)
% rails c
ruby-1.9.2-p290 :001 > Post.first.title.encoding
 => #<Encoding:UTF-8>

adapterにmysql2と書けるというところが盲点でした・・・。

% node -v  
v0.4.8
% rails -v
Rails 3.1.0
% rails new foo
% cd foo
% vi app/assets/stylesheets/foo.css.scss
body {
  background: image-url("rails.png");
}
% rake assets:precompile
rake aborted!
rails.png isn't precompiled
  (in /Users/komagata/tmp/foo/app/assets/stylesheets/foo.css.scss)

Tasks: TOP => assets:precompile
(See full trace by running task with --trace)

何故だろう?

とりあえずはconfig/environments/production.rbconfig.assets.compile = true

にしてLive compileして凌いでいる。

追記:

rails3.1のバグでした。3.1.1を待て。