そういえば、貧困な思考はいつも あなたのパターンを 安易なイメージ処理して
のところの最後をしばらくの間「アニメーションにして」と勘違いしていた。
遊体離脱の空耳
Flickr は親切だった。
めんどくさがって例外処理しなくても http://static.flickr.com/0/buddyicons/ 以下は全てリダイレクト。
アイコンが設定されていないときは、特別に http://www.flickr.com/images/buddyicon.jpg をアイコンとして使うんだけど、なんとなく面倒くさくてこの処理をしていなかった。というか、どういうレスポンスが返ってくるかわからなかったから放置していた。
で、なんとなくアレしてコレして見てみたら、iconserver=0 がレスポンスされるらしい。例外処理しとくかーって思ったけどリダイレクトだった。細かい配慮ないす。
ログインに使ってるスクリプト
weblogin.rb, 名前失敗したけどもういいや。
そのうち忘れるので使い方をめもる。
@cgi.header
を使うことを前提にしてる。
api_keys = { "Flickr" => { "api_key" => "Flickr70c55b82e10021ffaaapi_key6", "secret" => "Flickrdf5secret3" }, "TypeKey" => "fsakfsTypeKeyafasAPI" }
require "weblogin.rb" @cgi = CGI.new WebLogin.open(@cgi, api_keys) do |login| begin case login.auth when :login # login したときの処理 # DB にユーザ ID とユーザ情報を保存したり end rescue WebLogin::NoActionError => e puts @cgi.header("type" => "text/plain") puts login.services # 有効なサービスの配列 end end
上のようなのを認証スクリプトとしておいとく。このサイトだと /login.rb がコレ。ログインスクリプトの query_string が logout だったらセッションを破棄してリファラにリダイレクトする。ちょっとアレ。
/login.rb/Flickr?return_path= のようなリクエストをすると Flickr にリダイレクトして認証させる。認証されるとコールバック (Flickr の対応する API key のコールバックには http://example.com/login.rb/Flickr/callback のように指定しておく) にリダイレクトされるので、セッションに情報をセットして、return_path にリダイレクトする。
login.auth は、path_info に何も指定されていなかったりすると NoActionError を投げる。
require "weblogin.rb" @cgi = CGI.new WebLogin.open(@cgi, api_keys) do |login| if login.service # login している場合 login.service #=> "Flickr" login.id #=> "25514198@N00" login.user_name #=> "cho45" login.profile_uri #=> "http://www.flickr.com/photos/25514198@N00/" login.icon #=> "http://static.flickr.com/23/buddyicons/25514198@N00.jpg" login.full_name #=> "Hiroh Satoh" else # login していない場合 # id その他上記メソッドは全て nil end end
いまいち気持ち悪いんだけどどうにもこうにもわからんのでこんな感じ。ブロックをとっているのはセッションファイルを確実に閉じるため。fcgi 環境で死ぬことがあったのでこういうことやってる。
WebLogin クラスは、それ以下にある、サービス名に対応するクラスをインスタンス化してメソッドを呼び出す。例えば /login.rb/Flickr?return_path=somepath の場合、WebLogin::Flickr.new(@cgi, @session, @api_keys["Flickr"]).auth
が呼ばれる。
各サービス名の auth
メソッドはサービスの認証画面にリダイレクトする。サービスは /login.rb/Flickr/callback にリダイレクトする。
callback が指定されている場合、インスタンス化されたサービスクラスの callback メソッドを呼ぶ。callback メソッドはユーザ情報をまとめて Hash
にして返す。WebLogin
はその Hash
をセッションに保存して、最初に指定された return_path にリダイレクトする。
いろいろアレなことが思い浮かんだけどあとで考えよう。
new
にブロックって一般的じゃないんじゃ?という指摘をうけたので open
にした。確かに new
にブロックは微妙だった。
説明書を読むのが好き。
結構説明書読まない人って多いみたいだ。
小学生のときはそれこそ読まない人が全く理解できなかったけど、最近説明書を読みたくないときがあって、もしかしたらこういう感じなのかなぁって分かり始めたかもしれない。それはなんかとにかくいじくりまわしたい衝動が先にくる感覚だったのだけれど。
まぁでも結局そのあと説明書を最初から最後まで読んだわけです。何ができて何ができないのか、よくやる操作はどうやるのが一番スマートなにかを頭に入れておきたい。結構何度も説明書を読んでいると、新しい機能の発見があったりする。最初は「使わないだろう」って思って見逃しちゃうものを再発見できる。結構楽しい。
仕様書やら、プログラミングのリファレンスなんかもそういう感じでよく読む。一時期は XSLT と XPath の仕様書が常に開きっぱなしだった。ECMAScript の仕様書 (日本語 HTML 版) はむしろリファレンスとして使ってる。Ruby リファレンスマニュアルは気が付くと何故か上下になんどもスクロールしながら見てる。
暇だからできることだけど、とにかく自分が使うものは隅々まで一応知っておきたい。もし必要な機能じゃなかったら、頭の片隅にその機能があることだけを覚えておけばいい。使い方はまたあとで見ればいいから。
認証付きコメント実装
この日記にもつけてみた。
結局大して書く人がいないだろうってことでログインごとにユーザー情報を保持している XML を更新し、それを XSLT から document()
使って読み込むようにした。
Ajax では URL が変わらない?
そうとは限らないし、ちゃんと変わったほうがいいことも多い。
Ajax なりなんなりを含めて、JavaScript でいいことって画面遷移がないことであって、URL が変わらないことじゃない。
UI の補助ではなく、コンテンツを書き換える場合はむしろ URI は変わったほうがいい。要はあとでそのリソースにリンクを貼りたいとき、困るか困らないかが分かれ目だと思ってる。