February 6, 2010

twitter-auth を使って Rails で簡単 Twitter 認証♪

twitter-auth という Rails プラグインを使うと簡単に Twitter を使った認証が行えるようになります。

http://github.com/mbleigh/twitter-auth

ですが、普通に使おうとすると request_token を取得するところで 以下のようなエラーが出てしまいました。

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
...

サーバー証明書がないためにエラーになっているようなのですが、調べてみたところ twitter-auth には証明書を指定する方法が用意されていませんでした。
なので github で fork して証明書を指定できるようにしてこの問題を回避することにしました。

http://github.com/jugyo/twitter-auth

インストール

./script/plugin install git://github.com/jugyo/twitter-auth.git

使い方

generator が用意されていて、以下を実行すると必要なファイルを作ってくれます。

 script/generate twitter_auth 

migration も作られるので必要に応じてスキーマを編集して rake db:migrate してください。

証明書ファイルの取得

以下のページを参考に、 Twitter の CA 証明書ファイルを取得し、適当な場所に保存します。

http://d.hatena.ne.jp/vividcode/20091031/1256967931

コンシューマーキーとシークレットキーの取得

以下のページからアプリケーションを登録し、コンシューマーキーとシークレットキーを取得してください。

https://twitter.com/apps

設定

config/twitter_auth.yml を編集します。

development:
  strategy: oauth
  oauth_consumer_key: "コンシューマーキー"
  oauth_consumer_secret: "シークレットキー"
  base_url: "https://twitter.com"
  authorize_path: "/oauth/authenticate"
  api_timeout: 10
  remember_for: 14 # days
  oauth_callback: "http://localhost:3000/oauth_callback"
  ca_file: "証明書ファイルのパス"
...

確認

./script/server でアプリケーションを起動し http://localhost:3000/session/new にアクセスすると、リダイレクトされて以下のようなページが表示されると思います。

twitter_oauth

承認を求めているアプリケーションの名前が正しいことを確認し「Allow」ボタンを押してください。
リダイレクトされて http://localhost:3000/ に帰ってきたら成功です。
おめでとうございます。

November 6, 2009

delayed_job の使い方(中途半端)

delayed_job の使い方をちょっとだけ調べた(プロジェクトの wiki 読んだだけだけど)。
調べた結果、今回やりたいこととは若干合わない感じだったので結局使わないことにした。

delayed_job
http://github.com/tobi/delayed_job

プライオリティを指定してジョブを登録する

“1″ がプライオリティ。
デフォルトは “0″。

Delayed::Job.enqueue(NewsletterJob.new('text', User.find(:all).collect(&:email)), 1)

時間を指定してジョブを登録する

“5.minutes.from_now” とすることで 5 分後にジョブを実行するように指定できる
“0″ はデフォルトのプライオリティ。

Delayed::Job.enqueue(NewsletterJob.new('text', User.find(:all).collect(&:email)), 0, 5.minutes.from_now)

設定

最大試行回数(MAX_ATTEMPTS)等を指定することができる。

# config/initializers/delayed_job_config.rb

Delayed::Job.destroy_failed_jobs = false
silence_warnings do
  Delayed::Job.const_set("MAX_ATTEMPTS", 3)
  Delayed::Job.const_set("MAX_RUN_TIME", 5.minutes)
end
February 17, 2009

Rails2.3 の Nested Attributes を試す

Rails2.3 の Nested Attributes の機能を試してみました。

rails 2.3 のインストール

rails 2.3 は以下のようにしてインストールしました。

sudo gem install rails --source http://gems.rubyonrails.org

アプリケーションの作成

アプリケーションを作り、モデルをいくつか作成します。

% rails nested_attributes_sample
% cd nested_attributes_sample
% script/generate model book title:string
% script/generate model author name:string book_id:integer
% script/generate model page text:text book_id:integer
% rake db:migrate

モデルファイルに関連の情報を書きます。

app/models/book.rb

class Book < ActiveRecord::Base
  has_one :author
  has_many :pages

  accepts_nested_attributes_for :author
  accepts_nested_attributes_for :pages, :allow_destroy => true
end

accepts_nested_attributes_for メソッドを呼び出しているところがポイントです。
これにより authorpages に対して Nested Attributes の機能が使えるようになります。
さらに pages に関しては :allow_destroy => true とすることで親(Book)から削除できるようにしています。

app/models/author.rb

class Author < ActiveRecord::Base
  belongs_to :book
end

app/models/page.rb

class Page < ActiveRecord::Base
  belongs_to :book
end

確認

script/console でちゃんと動作するか確認してみます。

% script/console

One-to-one

まずはデータの作成。

>> book = Book.create({:title => 'ruby book', :author_attributes => {:name => 'foo'}})
>> book.author.name
=> "foo"

ちゃんと book.author が作成されてますね!

次にデータの更新。

>> book.update_attributes({:author_attributes => {:name => 'jugyo'}})
>> book.author.name
=> "jugyo"

ちゃんと更新されてますね!

One-to-many

次は「一対多」の場合のデータ作成のやり方です。
こんなふうにします。

>> book = Book.create({
              :title => 'rails book',
              :pages_attributes => {
                'new_1' => {:text => 'aaaaaaaaa'},
                'new_2' => {:text => 'bbbbbbbbb'},
                'new_3' => {:text => 'ccccccccc'},
              }
       })
>> book.pages.size
=> 3
>> book.pages[0].text
=> "aaaaaaaaa"

おお、ちゃんとできてるっぽい!
page に対応する 各 Hash のキーは 'new' という文字列から始まっている必要があるようです。

データを更新してみます。

>> book.attributes = {:pages_attributes => {1 => {:text => 'AAAAAAA'}}}
>> book.pages[0].text
=> "AAAAAAA"

データを削除してみます。

>> book.attributes = {:pages_attributes => {1 => {'_delete' => '1'}}}
>> book.save
>> book.pages.size
=> 3

ん?、book.pages.size が 3 のままですね。
でも DB を見てみるとちゃんと削除されてたのでとりあえずはよしとします。

参考URL:
http://weblog.rubyonrails.org/2009/1/26/nested-model-forms
http://api.rubyonrails.com/classes/ActiveRecord/NestedAttributes/ClassMethods.html

December 24, 2008

Rails勉強会@東京第36回に参加してきました

Rails勉強会@東京第36回 に参加してきました。

あとで書く。

詳細なレポートはこちらをどうぞ。
Rails勉強会@東京第36回に行ってきた – なんとなく日記

前半セッション – Cucumber

Cucumber はテストツールのようです。
自然言語でテストを書くことが可能だそうです。
日本語でも書けるらしいです。
自然言語といっても正規表現でマッチさせてるだけらしいです。
自然言語で書ける、さらに日本語で書けると何が嬉しいのかというと、プログラムがわからない人にも理解できるテストを作成できることなんだと思います。
「システムがこのように動作する」という仕様そのものがテストケースとして動作するイメージでしょうか。
これがその通りに実現すれば実に素晴らしいですね。

Cucumber では Webrat というライブラリを使って実際にテストを動作させています。
僕はこの Webrat のほうにすごく興味を持ちました。
Webrat については以下の記事が詳しいです。
Webratがスゴい(続:Cucumberがアツい) – moroの日記
えーっと、要するに Webrat を使うと Web アプリケーションのテストが簡単に書けるみたいです。
例えば、clicks_button("送信") と書くことで「送信」ボタンを押したときの挙動を再現できるとか、なんかそういったものらしいです。
僕は Web アプリのテストによく Selenium IDE を使ってますがあんな感じでしょうか。
Selenium は実際にブラウザを動かしてるので、厳密に言うと Webrat とはちょっと違いますが、あんな感じのことを Ruby だけできるということなのであればかなり便利かもしれません(ていうか mechanize 使えばできるか)。

後半セッション – Merb

Merb というか DataMapper の説明でした。
DataMapper は ActiveRecord に比べていろいろ書きやすそうです。
検索メソッドも簡単で、取っつきやすい感じです。
ActiveRecord は :conditions => ... なんて書かないといけないのがプチストレスなんですよねぇ。
DataMapper は全体的に見て ActiveRecord よりも楽に使えそうな印象です。
ActiveRecord を理解している人であれば DataMapper を使い始めるのは簡単だと思います。
でも DataMapper にも問題がないわけではなくて、バグがあったりあやしい動きのところがあったりして実用に耐えるかどうかはまだ微妙みたいです。

その他

角谷さんの「実践Rails」の話も聞きたかった。

ていうか、
MerbはRails3にマージされる事になった – Hello, world! – s21g
らしいです(ビックリ〜)。
OR マッパーとかどうなるんですかね。
Merb 調べないとなぁ〜。

October 27, 2008

Rails勉強会@東京第34回に参加してきました

後で書く。

追記

Rails勉強会@東京第34回に参加してきました。

勉強会と呼ばれるようなものに参加するのはこれが初めてです。
いやー、行ってよかったです。

勉強会の前半は Yuumi3 さんの「Scaffoldの半歩先へ」という Rails 初心者向けのセッションに参加しました。
Yuumi3 さんは Ruby on Rails のセミナーやってたり、Gauche on Rails なんかも作っていたりするすごい人です。
そんな人に教えてもらえる勉強会っていいですよね。
教えてもらってばっかりじゃだめだと思うんですが、まだまだ僕は初心者です。

やっぱり Ruby とか Rails にもっとコミット(ソースをコミットするとかじゃなくて)していかないとだめだなぁ、と思いました。
だって、知れば知るほどおもしろいですからね、Ruby も Rails も。
(ちなみに、PHP は知れば知るほど嫌いになる言語な気が最近すごくしてます)

Rails や Ruby は、ただ使い方を覚えるだけじゃなくて、その思想を理解する必要があると思うんですよねぇ。
Ruby や Rails の目指していることろって、如何にスマートに問題を解決するか、ってところだと思うんですよ。
実際に Rails でバリバリ開発している人の話を聞いてると、そういった思想とか考え方みたいなものがすごく伝わってくる気がするんですよね。
こういうのが勉強会のいいところなんだなぁと思いました。

勉強会の後半は Yugui さんによる「Railsのリファレンスを全部読む」というセッションでした。
話のスピードにちょっとついていけないところもあったんですけど、Yugui さんの独り言みたいな喋りともろはしさんの親切な解説がなかなか良かったです。
「リファレンスを全部読む」っていうのは重要だなと思いました。
全部暗記しなくとも、確かこういうのがあったなくらい思い出せるだけで全然違ってくると思います。

初めての参加でかつ知ってる人もいないのでドキドキしましたが、まあ、そんな緊張する必要もなかったな、と思いました。
勉強会行きたいけどなんかドキドキするなぁなんて思って躊躇している人がいたら僕に連絡してください。
一緒に行きましょう。

追記

懇親会にも参加しました。
8人くらい来てました。
Mac と iPhone の話題で結構盛り上がってました。
MacBook と iPhone 欲しくなりました。
やっぱり新しい MacBook かっこいいですねー。
あと、id:willnet さんと話ができてよかった。

October 21, 2008

JJUG Cross Community Conference 2008 Fall レポート2

これの続き。

DOMパフォーマンスチューニング入門

講師: amachang

JavaScript は遅い遅いといわれているけど
ベンチマーク取ってみると Rerl とか Ruby 並みの速度
遅いのは DOM に 関する処理

DOM 関連の処理を分解してみると、

  1. コンポーネントとの通信
  2. DOMノードの追加
  3. スタイルの再計算
  4. レイアウトの再計算

となる。

1 コンポーネントとの通信
XPConnect や COM との通信
IE が特に遅い
無駄なプロパティアクセスを減らすと良い
→ 変数に入れるなどして

2 DOMノードの追加
ノードに「変更されたフラグ」が立つ
「parent.appendChild(child)」とすると parent と child にフラグが立つ
(DOM に対する処理をすぐに実行するのではなくて後でまとめてやるためにマークを付けとく、みたいな感じですかね。)

3 スタイルの再計算
スタイルの再計算が行われるタイミングを把握しておく必要がある
スタイルの再計算はどんな時に行われるか

  1. 変更フラグが立っているノードがあるまま JavaScript が終了した時
  2. 変更フラグが立っている状態でスタイルの再計算が必要な処理を行った時
    offsetWidth プロパティの値を取得したり

処理の順番を意識する必要がある
スタイルの再計算が行われるエレメントを意識する必要がある
子ノードとか下にあるエレメントとかもスタイルの再計算が行われる

4 レイアウトの再計算
要素の幅、高さ、位置の計算がここで行われる
激しく重い
→ 親ノードにも影響を及ぼすことがあるので
基本、スタイルの再計算に気をつけていればいい

プロファイラのデモ
各メソッドの実行時間とか、呼び出し回数なんかが簡単に調べられる
(safari 4 にはプロファイラが搭載されるらしい)

質問タイム
Q: 再計算のタイミングを知るには
A: Webkit をデバッガで起動。ログを仕込んだりして調べる。

Q: Webkit のソース解読 Tips
A: Webkit の IDL ファイルを見ると良い

ギークなお姉さんができるまで

講師: べにぢょ (アルカーナ株式会社), purprin (エスカフラーチェLLC)

個人的にはあまり興味がわかない内容でした。
おもしろかったけど。
(というか、人の話を聞くのって基本おもしろい。退屈な話しかしない人もいるけど、自分が何を考えているのかということをちゃんと話そうとして話している人の話はだいたい面白い。)
purprin さんの話がもうちょっと聞けたらよかったかも。
Web デザインの話とか。

『JavaからRubyへ』・アンド・ナウ

講師: 角谷 信太郎 (株式会社永和システムマネジメント), 高井 直人, 和田 卓人

Java から Ruby、EJB から Rails という流れの裏にどのような歴史があるのか、というようなお話
以下はスピーカーの方達のブログ記事。

YET ANOTHER GREEN IT

講師: 和田 卓人, 角谷 信太郎 (株式会社永和システムマネジメント)

息が合えばペアプログラミングってすごく楽しそうだなぁと見てて思った。
こういうセッションも楽しいですね。
他人が開発してるところとか普段そんなに注意深く見てないし。

Agileは現場に適用できるのか? ~オンナだらけのパネル・ディスカッション~

講師: 片山 智咲子 (Java Edge), きたむら (日本XPユーザグループ), 柳本芙友子 (要求開発アライアンス)

なにかこう、釈然としないディスカッションでした。
アジャイルという言葉の意味が人によってまちまちだなぁ、とすごく思いました。

java-jaプレゼンツ・第十一回 第2回チキチキ JJUG だよ全員集合 ライトニングトーク大会

おもしろかったです。
え?、西尾さんビーズの話して終わり?みたいな。

May 3, 2008

TechCrunch Japanese » Twitter、Ruby on Railsを放棄か

複数の情報筋からの情報:2年近くの間、高い頻度で発生していたスケーリング関連のトラブルで、TwitterはRuby on Railsのフレームワークを捨て、PHPないしJava(Rubyは使い続け、Railsのフレームワークのみを放棄する案もあるようだ)を使ってゼロから作り直すことにしたようだ。

TechCrunch Japanese アーカイブ » Twitter、Ruby on Railsを放棄か

実際のところどういう問題があったのか知りたいな。
おそらく、Twitter のような膨大なトラフィックを集めるサイト特有の問題だと思われる。
以下のような話も関連してるんだろうな。

TwitterのスケーリングについてはCookがその任に当たっていたが、彼はこの作業をうまくこなすことに失敗した。
[略]
Twitterは今年になって、少なくとも3つ、キーとなる技術面での雇用を行っている。Lee MighdollはVPエンジニアおよび運用担当として1月から参加している。そして今週になってJohn Kaluckiと(「BloggerおよびBlogspotのスケーリング分野での働きでその名を知られる」)Steve Jensenという、2名のスケーリング分野のエキスパートを採用した。

TechCrunch Japanese アーカイブ » Twitterにおける素人の前座は終わり?

というか、アレですよ。
Web アプリケーションをいかにスケールさせるか、という話になってくると、どのフレームワークが良いとかそういう話の重要度はきわめて低くなってくるんだろうな。
例えば、Java もしくは PHP に置き換えることによってシステムの負荷がほんのちょっと下がるだけでハードウェアにかかるコストがものすごく減る、なんてこともあるだろうし。
ごくごく一般の Web アプリケーションにおいてはこういう問題はそうそう起こらないと思う。

つまりは、「開発コスト」と「運用コスト」の二種類のコストがあって、サイトの規模や種類によってどちらの負担が大きくなるかが変わってくる、ということですね。
そういったことを考慮した上でシステムに採用する技術(言語やフレームワーク等)を決める必要があると。
なので、 Rails がダメだったから、とか早急に結論づけるのは問題の本質をとらえ損ねてるわけですよ。

いや、でも、Rails もしくは Ruby に致命的な問題があったとかだったらまた話は変わってくるけど。