2010/02/17


TwitterのBasic認証APIは6月で廃止される予定なのですが、OAuthという認証方法はブラウザを起動してユーザに認証して貰わなければなりません。一見flickrアプリケーションの様な認証方法を想定しますが、OAuthはflickr認証の様にサーバから貰ったトークンをブラウザから渡して認証させる様な物ではありません。
今回OAuthの問題を解決すべくOAuthを拡張した認証方式であるxAuthが取り入れられました。
詳しくはAPIドキュメントか以下のサイトが分かりやすいかと思います。
s-take Blog.: Twitterによる簡易版OAuth: "xAuth"

従来のOAuth認証ではまずアプリケーション(OAuthコンシューマ)がTwitterに接続してRequest Tokenを取得し、認証画面を開いてRequest Tokenを承認させ、承認されたRequest Tokenを使ってAccess TokenとToken Secretを取得することによって各APIにアクセスできるようになります。しかしこれはアプリケーション側の実装が複雑になる上、デスクトップアプリケーションの場合はわざわざWebブラウザへ切り替えなければならず(ブラウザを内包するものもありますが)、ユーザにとっても面倒なものです。

http://s-take.blogspot.com/2010/02/twitteroauth-xauth.html
the.hackerConundrum: Sneak peek at Twitter's browserless OAuth credentials exchange method

Over the past couple of months the Twitter API Google Group has been overflowing with more and more disgruntled developers complaining about lack of bug fixes, slow rollout of promised features, no mobile interface for OAuth, etc. (The list goes on and on) Well I'm happy to say Twitter appears to be almost done with one much requested feature: browserless OAuth credentials exchange. It was hinted that Seesmic Look was using said exchange so today I took a peek at how Look worked behind the scenes.

http://the.hackerconundrum.com/2010/02/sneak-peek-at-twitters-browserless.html
実装だと
Maraigue風。:[Ruby][Twitter] OAuthのアクセストークンを、ブラウザなしで、Twitterのユーザ名およびパスワードのみを用いて取得する(通称:xAuth)ためのRubyのコード
http://blog.livedoor.jp/maraigue/archives/1109122.html
とか
pastebin - 誰か - post number 1796209
http://ja.pastebin.ca/1796209
あとOAuthな話ですが
あまやどり: OAuthで認証してTwitterでつぶやいてみた
http://petitbanca.blogspot.com/2009/11/oauthtwitter.html
あたりが参考になります。今日はpythonを使ってxAuthするサンプルを書いてみました。pythonにも元々oauthライブラリはあるのですが、今回は分かりやすく使わず書いてみました。
以下ソース。
from pit import Pit
from random import getrandbits
from time import time
import hmac, hashlib
import sys
import urllib
import urllib2
import urlparse

consumer_key = 'YOUR-CONSUMER-KEY'
consumer_secret = 'YOUR-CONSUMER-SECRET'
user = Pit.get('twitter.com', {'require' : {
  'username' : 'your username in twitter.com',
  'password' : 'your password in twitter.com',
}})
message = sys.argv[1]
access_url = 'https://api.twitter.com/oauth/access_token'
post_url = 'http://twitter.com/statuses/update.json'

# build parameter to get access token
params = {
  'oauth_consumer_key' : consumer_key,
  'oauth_signature_method' : 'HMAC-SHA1',
  'oauth_timestamp' : str(int(time())),
  'oauth_nonce' : str(getrandbits(64)),
  'oauth_version' : '1.0',
  'x_auth_mode' : 'client_auth',
  'x_auth_username' : user['username'],
  'x_auth_password' : user['password'],
}
params['oauth_signature'] = hmac.new(
  '%s&%s' % (consumer_secret, ''),
  '&'.join([
      'POST',
      urllib.quote(access_url, ''),
      urllib.quote('&'.join(['%s=%s' % (x, params[x])
          for x in sorted(params)]), '')
  ]),
  hashlib.sha1).digest().encode('base64').strip()

# get access token
req = urllib2.Request(access_url, data = urllib.urlencode(params))
res = urllib2.urlopen(req)
token = urlparse.parse_qs(res.read())
token_key = token['oauth_token'][0]
token_secret = token['oauth_token_secret'][0]

# build parameters to post
params = {
  'oauth_consumer_key' : consumer_key,
  'oauth_signature_method' : 'HMAC-SHA1',
  'oauth_timestamp' : str(int(time())),
  'oauth_nonce' : str(getrandbits(64)),
  'oauth_version' : '1.0',
  'oauth_token' : token_key,
}
params['status'] = urllib.quote(message, '')
params['oauth_signature'] = hmac.new(
  '%s&%s' % (consumer_secret, token_secret),
  '&'.join([
      'POST',
      urllib.quote(post_url, ''),
      urllib.quote('&'.join(['%s=%s' % (x, params[x])
          for x in sorted(params)]), '')
  ]),
  hashlib.sha1).digest().encode('base64').strip()
del params['status']

# post with oauth token
req = urllib2.Request(post_url, data = urllib.urlencode(params))
req.add_data(urllib.urlencode({'status' : message}))
req.add_header('Authorization', 'OAuth %s' % ', '.join(
  ['%s="%s"' % (x, urllib.quote(params[x], '')) for x in params]))

# done!
print urllib2.urlopen(req).read()
生の処理で書いてあるので、oauthライブラリに依存させたくない様な移植には参考になるかもしれません。
ところで今回GtkTwitterというC言語で書いたTwitterクライアントのBasic認証を止めようと思っていてこの件を調べ始めたのですが, どうやらTwitterに登録するOAuthアプリケーションには「Twitter」という文言を使ってはいけない事が今日分かりました。まぁGtkTwitterはクライアントアプリが名前登録出来た頃に書いた物なので、あの頃はOKだったのかも知れません。
しかしまぁ...どうせぃっちゅうねん!

どうしましょ。Gtkほにゃらら...何がいいやろ。困った。
Posted at by



2010/02/16


皆さん、Google Buzz楽しんでますでしょうか。
Google BuzzがTwitter対抗馬と言われて数日経ちました。現状iPhoneやGmailからといった、あるBuzz専用PCサイトではない場所からステータスの更新を行います。iPhone使っていない人もいるかと思いますし、Gmailのインタフェースが肌に合わない人もいるかと思います。
得にGmailのインタフェースではGmailの重さも合わさってか、若干重い気がします。
今日はFirefoxを使ってGoogle Buzzをスマートに扱える方法を紹介したいと思います。
用意するのは
  • Firefox
  • Stylish
この2つです。おそらく既にインストール済みという方もいらっしゃるかと思います。PC専用サイトが無いのにどうやって?と思われるかもしれません。実はこれらを使用してiPhone専用サイトにアクセスするのです。
Firefoxをインストールし、拡張であるStylishをインストールします。
Stylish :: Add-ons for Firefox

Restyle the web with Stylish, a user styles manager. Stylish lets you easily install themes and skins for Google, Facebook, YouTube, Orkut, and many, many other sites. You can even customize Firefox and other programs themselves.

https://addons.mozilla.org/ja/sunbird/addon/2108
インストールしたら以下のURLにアクセスします。
https://m.google.com/app/buzz?force=1
User Agent Switcherは使いません。アクセス後、リロードを繰り返す様な場合は一度Sign OutしてGoogleにログインし直すと上手く行きます。 そしてステータスバーにあるStylishのアイコンを右クリックして「スタイルの管理」「新しいスタイルを書く」をクリックして以下の様に入力します。
google-buzz-sidebar1
次にテキストエリア部に以下を張り付けます。
@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document url-prefix("https://m.google.com/app/buzz") {

#lm-following#following-toolbar {
  background: #AACCff !important;
  cursor: pointer;
}
#search-btn-following {
  cursor: pointer;
}
.YX40Ye.CqrfPb.Gks0Tb.leetlb.NmM0jd {
  cursor: pointer;
}

}
入力出来たら保存です。
次にこのページをブックマークし、その後メニューから「ブックマークの管理」を開きます。先ほどブックマークした物を選択し、「このブックマークはサイドバーで読み込む」にチェックを入れます。
google-buzz-sidebar2 あとはブックマークメニューから開くと...
google-buzz-sidebar3
じゃじゃーーーん!完成です。
まぁただ自動でリロードしてくれないのでiPhoneと同じく自分でリロードボタンを押さなければなりませんが、横目でサイドバーを閲覧中にどんどん増えて行って気になるよりは全然マシです。

これでスマートにGoogle Buzzが操作出来る様になりました。ちなみにStylishを使っているのは、iPhoneはカーソルが無いのでGoogle Buzzには元々マウス形状に関するスタイルシートが記述されていないのを修正する為です。あと少し背景色の調整もしています。

Postはもちろん、CommentやLikeも問題なく出来ます。一度試して見られては如何でしょうか。
なお、このサイドバー化のヒントをくれたiratqqさんに感謝を表したいと思います。ありがとうございます!
Posted at by



2010/02/09


Inspired by http://d.hatena.ne.jp/moriyoshi/20100204/1265242273(興味のある言語にPHPと書いておいたら面接で爆笑された)
UNIXエンジニアを募集してる会社の採用面接を受けた時の話。
転職エージェントに作れと言われて作ったシートに、「使っているテキストエディタ」という欄があったんです。
nanoとか秀丸とか色々書いたけど、一応WindowsでもUNIXでも使えて操作感が好きだったるので、
Vimと書いておいたのですが、それを見た仙人染みた長髪の面接官のリアクションが酷かった。
面接官「Vim・・・ふははっ!Vim!」
面接官「Vim使ってるんですか?wwwww」
  俺「(唖然)は、はい・・まだVimscriptを理解したぐらいですが。。」
面接官「Vim・・・ニヤニヤ」
その人はEmacs信者と呼ばれていて、当然Vimくらい知っている人だったので、
Emacsが「テキストエディタではなく環境」と呼ばれている事を知らないワケが無いだろうと思っていた。
つまり、このリアクションは"理不尽な状況に直面した時にどう対応するか"を見ているんだろうと判断し、あえて突っ込みは入れずに対処した。
しかし最後の質問で「何故Ctrlキーを多用する様な操作を採用したんですか?」と聞くと、
気まずそうに理由を話し、最後に「・・・と、聞いてます」と答えた。
つまりこの人は神からEmacsを使えと言われたから使っているのであって、
特別Emacsに思い入れとか無いおっさんエンジニアなんだなあと分かった。
オムニ補完とかもVim発のテクニックだし、Emacsやってるなら補完に興味を持つのは普通だと思うんだけどなあ。
多分ガチで知らなかったんだろう。
あくまでネタであって、宗教論争のつもりじゃないのであしからず。
Posted at by