2011-03-22

twitterやfacebookのOAuthをつかってrails+omniauthでログイン機能を実装するメモ その1

OAuthをつかっていろんなサービスと連動したアプリケーションがつくりたくなったので調査。
railsでやるにはoauth_pluginとかwarden_oauthとか色々なプラグインがあるみたいだけど、omniauthがよさそうです。
rails初心者なので基本的にはomniauthのチュートリアルビデオに沿って作業します。
- https://github.com/intridea/omniauth
- http://railscasts.com/episodes/235-omniauth-part-1

自前でパスワードやメールアドレスは保持せずに、twitterやfacebookのアカウントを使ってログインできるようにするのが目標です。
ちなみにtwitter anywhereを使えば似たようなことはできそうですが、twitterに依存してしまうので今回はパス。

--

インストール

とりあえず以下を追記。nifty-generators, twitterはお好みで。deviseは後半で使います

gem 'devise'
gem 'omniauth'
gem 'nifty-generators', :group => :development
gem 'twitter'

設定

omniauth.rb作成

config/initializers/omniauth.rbを作成

Rails.application.config.middleware.use OmniAuth::Builder do
  privider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
end

ここでセットするoauthアプリケーションは、twitter側で正しくcallback urlを設定しておく必要があります。
通常は http://yourhost.com/auth/twitter/callback のようなURLです。
そうしておかないと、twitterにリダイレクトされる前で 401 unauthorized となってはじかれます。

controller

ここではnifty generatorをつかいます

rails g nifty:scaffold authentication user_id:integer provider:string uid:string index create destroy

できたAuthenticationsControllerのcreateを以下のように書き換えます。

class AuthenticationsController < ApplicationController

def create
  render :text => request.env['omniauth.auth'].to_yaml
end

request.env['omniauth.auth']の部分は過去のバージョンではrequest.env['rack.auth']なので、うまくいかない場合はバージョンを確認してください。

routes.rb

callback用に以下を追記します

match '/auth/:provider/callback' => 'authentications#create'

ここまでやって http://localhost:3000/auth/twitter にアクセスしてtwitterで認証すると、yamlで認証情報が取得できているのが確認できます。

まとめ

以上でとりあえずOAuthでユーザ情報やcredentialをとることができました。
次回( http://taksatou.blogspot.com/2011/03/twitterfacebookoauthrailsomniauth.html )後半でtwitterでログインするところをつくります。

その他

  • rails 3.0.3, ruby 1.8.7 を使用

2011-03-21

githubでPermission denied (publickey)

自分のgithubリポジトリに複数のホストからpushする方法についてメモ

% git push git@github.com:taksatou/config.git master

とかやって

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

なってしまう場合は公開鍵が登録されていない

のSSH Public Keys からpushしたいホストの公開鍵を登録すればOK

2011-03-19

Javascriptの統計ライブラリ jStatについて

jStat (http://www.jstat.org/) とはJavascriptでMATLABやRのような処理をするためのライブラリです。
(同名のjvm統計データ監視ツールとは関係ないです)

http://www.readwriteweb.com/hack/2011/03/jstat-its-like-r-for-javascript.php
でも紹介されてます。
R開発者のEd Borasky氏によると、これからはJavascriptでビジュアライズするのがトレンドらしいです。

というわけでちょっと遊んでみました。

準備

jStatは以下のものに依存してるけど、http://www.jstat.org/download から依存ライブラリをまとめてパッケージにしたものがダウンロードできるので特になにもしなくてOK。

Bundleをダウンロードして(jstat-1.0.0.zip) 解凍すると、デモがindex.htmlにあるのでそれをブラウザで開くだけ。

デモ

試しにtwitterのpublic timelineに流れてるtweetの文字列長の正規分布のグラフをつくってみました。timelineがかわるとグラフも変わります。



ソースはこんなかんじです


$(document).ready(function() {
$.getJSON("public_timeline.php", function(json) {
            var x = new Array(json.length);
            var sum = 0;
            for (var i = 0; i < json.length; ++i) {
                x[i] = json[i]['text'].length;
                sum += x[i];
            }
            var mean = sum / json.length;
            var sum2 = 0;
            for (var i = 0; i < json.length; ++i) {
                sum2 += Math.pow((mean - x[i]), 2);
            }
            var variance = sum2 / json.length;
            var sd = Math.sqrt(variance);
            var distribution = jstat.dnorm(x, mean, sd);
            jstat.plot(x, distribution, {main: "tweet length distribution", type: "p"});
        });
});

本家サイトにデモがあるのでそっちもみると雰囲気がわかると思います http://www.jstat.org/demonstration

まとめ

  • 導入が簡単でブラウザさえあればいけるので、RやMATLABにくらべると敷居が低い感じ。
  • jQueryがつかえればUI的な面で有利
  • ブラウザでRを使いたい場合はRStudio ( http://www.rstudio.org/ ) とかもあるけど、RStudioは完全に開発者向けなのに対して、jStatはリアルタイムに集計結果を一般ユーザに見せたい、みたいなシチュエーションで重宝しそう

以下気になる点

  • まだドキュメントがない
  • Javascriptで実装されてるので複雑なことをやるにはちょっと非力かも??

2011-03-16

tmuxの複数セッション間でバッファを共有する方法

マルチモニタで開発してる場合、それぞれのモニタ毎に端末アプリをたちあげることになりますが、端末ウィンドウ間でコピペをしたいときにマウスを使用せざるをえなくなってめんどうです。
emacsをサーバモードで起動すれば大抵の場合は事足りるのですが、いつもemacsだけで完結できるとは限りません。
というわけでtmuxとかscreenをつかってコピペするわけですが、tmuxのセッションをまたいでバッファを共有する方法をしらなかったのでメモ。

manをみたところ、セッションをまたいでバッファをやりとりするのに以下コマンドが使えそうです。

copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t dst-session]
(alias: copyb)
             Copy a session paste buffer to another session.  If no sessions are specified, the current one is used instead.

毎回コマンドをたたくのはめんどうなので、以下のような設定をかきました

unbind C
bind C run-shell "for i in `tmux list-session | awk -F':' '/attached/ {print \$1}'`; do tmux copyb -t \$i  ; done"

dst-sessionは明示しないとだめなので、list-sessionでセッション一覧を取得して、アタッチ中のものすべてにコピーするようにしました。

なお、これも含めてその他もろもろの設定ファイルは以下においてます

ZenBackWidget