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/ に帰ってきたら成功です。
おめでとうございます。

February 4, 2010

MongoDB 体験記

環境: Mac OSX 10.5.8

インストール 〜 起動

wget で tgz を取ってきて解凍して DB 用の適当なディレクトリ作って bin/mongod コマンドを叩けばすぐに起動できる。

wget http://downloads.mongodb.org/osx/mongodb-osx-i386-1.2.2.tgz
tar xvzf mongodb-osx-i386-1.2.2.tgz
cd mongodb-osx-i386-1.2.2
mkdir ~/tmp/db
bin/mongod --dbpath ~/tmp/db

Ruby から使う

ライブラリのインストール

gem install mongo_ext

簡単な使い方

“foo” というデータベースの “test” というコレクション(テーブルみたいなもの?)に {’a’ => 10} というような Hash オブジェクトを突っ込む。

# mongodb example
require 'rubygems'
require 'mongo'

db = Mongo::Connection.new.db('foo')
coll = db.collection('test')

coll.remove

coll.insert({'a' => 10})
coll.insert({'b' => 20})
coll.insert({'c' => 30})

coll.find().each { |doc| puts doc.inspect }

たぶん、デフォルトで localhost の MongoDB に接続しにいってるんだろうな。

GridFS

GridFS (MongoDB で動作するファイルシステムみたいなもの?)を使ってみる。

“test.txt” というファイルに “Hello, world!” という文字列を書き込んだあとにファイルの内容を読み込んで画面に出力する。

# mongodb GridFS example
require 'rubygems'
require 'mongo'
require 'mongo/gridfs'

include GridFS

db = Mongo::Connection.new.db('grid')

GridStore.open(db, 'test.txt', 'w') do |f|
  f.puts "Hello, world!"
end

GridStore.open(db, 'test.txt', 'r') do |f|
  puts f.read
end

画像とかも保存できるんかな。

次回

次はアクセス制御とかのところを調べたい。

January 31, 2010

notify.gem : クロスプラットフォームなデスクトップ通知ライブラリ

Picture 1

クロスプラットフォームなデスクトップ通知ライブラリを作りました。
これを使うと統一されたインターフェイスで growl や notify-send を使った通知が行えます。

インストール

gem でインストールできます。

gem install notify

これに加え、以下のライブラリもしくはコマンドのいずれかがインストールされている必要があります。

  • ruby-growl (ライブラリ)
  • notify-send (コマンド)
  • growlnotify (コマンド)

今のところ上記のライブラリおよびコマンドしかサポートしていません。

使い方

ライブラリを読み込んで Notify.notify メソッドを呼び出すだけです。

require 'rubygems'
require 'notify'

Notify.notify("タイトル", "メッセージ")

growl だとこんな感じで通知がでます。

Picture 1

notify-send だとこんな感じ。

Screenshot-1

使用するライブラリを指定したい場合は環境変数 “NOTIFY” にあらかじめ値をセットしておきます。

ENV["NOTIFY"] = 'growlnotify'
require 'rubygems'
require 'notify'

Notify.notify("タイトル", "メッセージ")

ソースコード

http://github.com/jugyo/notify

その他

growl と notify-send の他にも対応して欲しいライブラリがあったりしたら pull request ください〜。

December 21, 2009

Enjoy Scala! #3 : 配列を扱う

こんばんは!
正月が待ち遠しい jugyo です!
みなさんは何歳くらいまでお年玉をもらっていましたか?

さて、Enjoy Scala! の第3回目です。
今日は Scala で配列を扱ってみたいと思います。

ではさっそくコードを見てみましょう。

// Array を new
val strings = new Array[String](4)
// 配列に値をセット
strings(0) = "A"
strings(1) = "B"
strings(2) = "C"
strings(3) = "D"
// 出力
strings.foreach(i => println(i))

この例では、長さが 4 の配列を定義しています。
strings(3) = "D"」のように「()」を使って配列に値をセットしていますね。
こう書いたとき、コンパイラが「strings.update(3, "D")」というふうに update メソッドを呼び出すかたちに変換してくれるらしいです。

次に、配列の 0 〜 2 番目までを出力したいとしましょう。
そういう場合は以下のようにします。

for (i <- 0 to 2)
  println(strings(i))

ちなみに、上記の「0 to 2」という部分は実際には「(0).to(2)」というメソッド呼び出しに変換されるらしいです。
なので、以下のように書きかえることもできます。

for (i <- 0.to(2))
  println(strings(i))

さらに、 foreach メソッドを使って以下のように書きかえることもできます。

0.to(2).foreach(i => println(strings(i)))

で、さっきの「0 to 2」が「(0).to(2)」となる件ですけど、 Scala ではメソッド呼び出しの際、レシーバが明示的に指定されていると「.」と「()」を省略できるらしいです。
なので例えば、「(1).+(1)」というメソッド呼び出しを「1 + 1」というふうに書けるんです!

面白いですね!

初めての Scala #2 : foreach と for

こんばんは!
クリスマスが待ち遠しい jugyo です!
ずいぶん寒くなってきましたね!

さて、今日は Scala の foreachfor についてのお話です。

foeach と for と

scala コマンドでスクリプトを起動した際、 args という変数にプログラムの引数が入ってきます。
配列の foreach メソッドを使って引数のリストを出力してみます。

args.foreach(arg => println(arg))

上記の例では foreach メソッドに arg => println(arg) という関数を渡しています。
arg => println(arg) というのが Scala における関数リテラルみたいです。
引数を一個しかとらない関数リテラルの場合は引数を省略できるらしく、上記の例だと以下のように書くこともできます。

args.foreach(println)

関数リテラルで明示的に型を指定することもできて、その場合は以下のようになります。

args.foreach((arg :String) => println(arg))

Scala では型は基本的に変数等の後ろに書くみたいです。

ちなみに for 文(式?)もあって、それを使うと上記のコードを以下のように書き換えることができます。

for (arg <- args)
  println(arg)

僕は foreach のほうが好きですね。

December 19, 2009

Scala はじめました

Home

Scala にとても興味が湧いてきたので本を買って勉強を始めました。
そのうち勉強会とかやりたいです。

とりあえず今日は Scala をインストールしてインタープリターを少しだけ使ってみました。

Mac での Scala のインストール

MacPorts を使えば簡単にインストールできる。

sudo port install scala

Scala インタープリターの起動

scala とだけ入力して実行すると Scala インタープリターが起動する。
僕の環境だと以下のような感じになる。

% scala
Welcome to Scala version 2.7.5.final (Java HotSpot(TM) Client VM, Java 1.5.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 

インタープリター中で日本語を使いたい場合は -Xnojline オプションを付ける。

Hello World!

とりあえず「Hello World!」を出力してみる。

scala> println("Hello World!")
Hello World!

変数の定義

Scala には var と val の二種類の変数がある。
var は Ruby にもあるようないわゆる普通の変数。
val は Java の final に似ていて、初期化後に別の値を代入することができない。

var の場合:

scala> var foo = "foo"
foo: java.lang.String = foo

scala> foo = "FOO"
foo: java.lang.String = FOO

val の場合:

scala> val foo = "foo"
foo: java.lang.String = foo

scala> foo = "FOO"
<console>:5: error: reassignment to val
       foo = "FOO"
           ^

val に値を再代入しようとすると怒られる。

参考

今この本を読んでいます。
わかりやすくかつおもしろいです。

December 18, 2009

GAE で Sinatra を使って “foo” を表示する最速の方法

appengine_lowres

あなたは急に、 Google App Engine で Sinatra を使って “foo” を表示したくなりました。

以下は、現時点で僕が知ってるその最速の方法です。
参考にしてください。
ちなみに環境は Mac OSX です。

google-appengine というライブラリを gem でインストールします。

% gem install google-appengine

プロジェクトのディレクトリを作成します。

% mkdir foo
% cd foo

config.ru というファイルを作成します。
以下を記述します。

require 'appengine-rack'
AppEngine::Rack.configure_app(
  :application => "application_id",
  :version => 1
)
require 'foo.rb'
run Sinatra::Application

Gemfile というファイルを作成します。

# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"
# List gems to bundle here:
gem "appengine-rack"
gem "sinatra"

foo.rb というファイルを作成します。

require 'sinatra'

get '/' do
  'foo'
end

試しにローカルで起動してみます。

% dev_appserver.rb .

(僕の環境だと一回目はなぜか起動に失敗します)

そしていよいよデプロイです。

% appcfg.rb update .

デプロイが完了したら http://<application_id>.appspot.com/ にアクセスしてみましょう。
立ち上がりはお世辞にも早いとは言えませんが、そのうち foo が表示されるはずです。

Picture 13

enjoy foo!

See also: http://code.google.com/p/appengine-jruby/