OAuth gem で multipart や xml、json データを POST する方法

OAuth の POST リクエストでは、基本的に Content-type = x-www-form-urlencoded のデータを送ることが想定されています。

もちろんそれ以外にも Content-type が multipart/form-data や application/xml、application/json などの場合も、request body が signature base string に入らないという違いはあるものの、OAuth を使って POST することは可能です。

仕様的には。

smart.fm でも一部 API で multipart (upload file) や xml/json データ (save study data : comming soon) をポストしないといけない API があるのですが、みごと ruby の oauth gem ではそれらに失敗しました。

原因は、OAuth::Consumer#create_http_request の以下の1行。青色の部分を赤色の部分のように変えれば動きます。

module OAuth
  class Consumer
    def create_http_request(http_method, path, *arguments)
      http_method = http_method.to_sym
      
      if [:post, :put].include?(http_method)
        # data = (arguments.shift || {}).reject { |k,v| v.nil? }
        data = arguments.shift
        data.reject! { |k,v| v.nil? } if data.is_a?(Hash)
      end
      
      以下略
  end
end

というところを、github の master ではこの bug が fix されているのですが、rubyforge にはまだ反映されていなくて、ちょっとハマりました。これを fix すれば、こんな感じで POST できます。

access_token.post(path, params, {'Content-Type' => 'multipart/form-data'})
access_token.post(path, xml, {'Content-Type' => 'application/xml'})
access_token.post(path, json, {'Content-Type' => 'application/json'})

Read more

smart.fm OAuth が OAuth 1.0a に対応します。(+OAuth 1.0a 対応方法概要)

ruby oauth gem も rails oauth plugin も OAuth 1.0a 対応になったので、smart.fm も OAuth 1.0a に対応することにしました。

実装は既に終わったので、予定通りだと明日の昼前に本番に反映される予定です。

OAuth の脆弱性が発見されてから、暫定的に以下の2つの制約を加えましたが、OAuth 1.0a 対応でどちらの制約も外れます。

  1. authorize 時に渡される oauth_callback を無視
  2. request token の有効期間もかなり短く

ただし OAuth 1.0a では oauth_callback を指定するタイミングが authorize 時から get request token 時に変更になっているので、authorize 時に oauth_callback 渡しても無効、というのは変わりません。

もちろん従来のフローでアクセスする consumer に対する動作は変わらないので、oauth_callback を利用しない場合は特に consumer 側の変更は必要ありません。consumer 登録時に登録する oauth_callback は、従来通り有効です。

Read more

git merge で bus error が出たときの対処法

git merge すると、bus error がでて merge が失敗することがあります。

一旦これが出ると、その 2 つの branch 間で全く merge ができなくなってしまいます。

僕もまさに今日、その現象に遭遇しました。実は以前も同じ現象があったのですが、解決方法を忘れていたので、次からは忘れないようにメモメモ。

今回は Cerego エンジニアのエースに言われるがまま、以下の順で試してみて解決しました。

git merge --strategy=**

git merge のオプションの --strategy=octopus を指定して実行してみます。デフォルトの strategy は recursive とのこと。(詳細は "git help merge" でご確認を)

でも今回の場合はこれでは解決しませんでした。

update git

git の version を最新に。git が version 1.2.2 だったので、それを version 1.3.2 にあげました。

今回はこれで解決!

結局原因は全く分かってないんですが、まぁなおったしいいやw

K-20 怪人二十面相・伝

なかなか面白かった。特に、松たか子が。

なぜ第二次世界大戦が無かった第二の世界が舞台なのか、なぜ 1949 年なのかは全然分かんなかったけど、そこは単にあの時代の画が撮りたかっただけなのかも。

しかし、本物の(初代)怪人二十面相は、相当の極悪人でしたぜ。

息子も娘も風邪っぴき - smart.fm にいろいろ動きのあった週末

水曜に娘が風邪をひき、木曜には息子にも感染。金曜には娘は回復したものの、息子は回復せず。嫁が仕事休めないということで、木曜と金曜は会社を休んで子守りでした。

smart.fm では、その間にリスト作成コラボレーション機能がリリースされたり、smart.fm 技術者ブログ「devlunch」がオープンしたりと、いろいろ動きがありました。

あ、そうそう、smart.fm Podcast が iTunes Store Podcast ランキング第一位を取ったのもこの週末でしたね。

Read more

smart.fm 技術ブログ「devlunch」が Open しました

smart.fm developer 達が、技術ブログを立ち上げました。ブログタイトルは「devlunch」。タイトル通り、技術と食べ物の話題がメインです。(全部英語です)

まだ最初の挨拶と、jQuery ベースの学習アプリケーションのデモ(Semantic Cheese « [devlunch])の2記事だけしかありませんが、これから各エンジニアがそれぞれネタを持ち合って記事をアップしていきます。

Semantic Cheese では、Freebase というセマンティック DB サービスの API を利用して、新学習アプリケーションで「チーズの種類」を学んでいます。Freebase API おもしろい。

このデモはこちらにも貼っておきます。

Read more

TOEIC 800点!

4月にTOEIC 770点を取ったのですが、予想より遥かに良くていまいち実感がなかったので、先月再度受けてみたのです。これで前回がまぐれじゃなかったことが分かりました。

やた!

ちなみに、前回のスコアを上司に伝えたところ、次の目標は900点に設定されました。

その路は、まだ遠い。

smart.fm API ver.2 - 進捗

いくつかはこっそり公開されてます。
そろそろドキュメント書かなきゃ(汗

Activity API
GET http://api.smart.fm/activities
GET http://api.smart.fm/users/:username/activities

公開済。マイニュース用 API。Activity は、Status Update や List / Item / Sentence Create を行うと自動的に作成されるので、現時点では特に Activity Creation Call は用意していません。

Status Update API
GET/POST http://api.smart.fm/status
GET http://api.smart.fm/users/:username/status

未公開。

User Profile Update API
PUT /users

公開済。パラメータはドキュメントにまとめます。

Shoutbox API
GET/POST http://api.smart.fm/shouts
GET http://api.smart.fm/users/:username/shouts

公開済。「一言ボックス」用の API です。

OpenSearch response in JSON

公開済。JSON でも open_search=true で OpenSearch Response が含まれます。

Image, Sound Upload API

公開済。こちらはドキュメントも公開されています。add image / add sound

あたらしい学習アプリ向けの API も、着々と進んでおります。ついに学習結果が保存できるようになります!