Open Flash Chart II Plugin for Ruby on Rails on Heroku

on 2011/10/31 - 0 Comments -

Open Flash Chart II Plugin for Ruby on Rails

By using this plugin, you can generate beautiful charts easily on Ruby on Rails, even if it's on Heroku.

Setup:

# cd someproject
# rails plugin install git://github.com/pullmonkey/open_flash_chart.git
# cp vendor/plugins/open_flash_chart/assets/javascripts/swfobject.js public/javascripts/
# cp vendor/plugins/open_flash_chart/assets/open-flash-chart.swf public/



Wirte chart generation codes in some controller:

class TestItController < ApplicationController
  def index
    @graph = open_flash_chart_object(600,300,"/test_it/graph_code")
  end

  def graph_code
    title = Title.new("MY TITLE")
    bar = BarGlass.new
    bar.set_values([1,2,3,4,5,6,7,8,9])
    chart = OpenFlashChart.new
    chart.set_title(title)
    chart.add_element(bar)
    render :text => chart.to_s
  end
end



Write chart display codes in some view:

<script type="text/javascript" src="/javascripts/swfobject.js"></script>
<%= @graph %>



Write route setting in config/routes.rb:

match "/test_it/graph_code" => "test_it#graph_code"



Restart Server:

# rails s



Push to Heroku if it works:

# git push heroku master



All done.

神宮・赤坂御用地・皇居(11km)

on 2011/10/30 - 0 Comments

皇居をかすって帰ってくる周回コース。
このコースはいたるところに坂があって鍛えられそうです。

プロ野球やってる日は神宮は通らないほうがいいです。

10月:54km

How to generate a specific Date on Ruby

on 2011/10/29 - 0 Comments -


somocode.rb
require 'date'

# Today
Date.today

# 1st of this month
Date.new(Time.now.year, Time.now.month, 1)

# 1st of next month
Date.new(Time.now.year, Time.now.month, 1) >> 1

# 1st of last month
Date.new(Time.now.year, Time.now.month, 1) << 1

# 1 week later
Date.today + 7

# 1 week before
Date.today - 7



And you can use these Date valuables in Model 'where' phrase on Rails.


somocode.rb
models = SomeModel.where("date <= ?", Date.today)


作業効率を上げるためにすべきたった1つのこと

on 2011/10/26 - 0 Comments -

Key Repeat Rate を Max にしましょう。


Word、Excel、Emacs でカーソルの移動が速くなり、作業効率がそれだけで数%は向上するでしょう。
# ただし常に検索で瞬間移動してる人は除く

神宮・赤坂御用地(11km)

on 2011/10/25 - 0 Comments -

気持ちよく走れるようになってきた!
自転車を買ってから調子がいいです!

10月:43km

家から皇居(9km)

on 2011/10/15 - 0 Comments -

ごーさんと一緒に家から皇居。

赤坂御用地を一週するコースは皇居と同じく信号がなく、また適度に坂がありよいコースだと思った。というかむしろ空いてるし、こっちのほうがいいかも。

調子は底辺からの上向き気配。

10月:32km

no such file to load -- net/https

When I started using heroku, I got some errors and solved them by installing ext modules.

Installing libopenssl-ruby package by apt-get was one of the solutions, but I couldn't use that package because there was no available package for my ruby, version 1.9.

The error is:


# gem install heroku
# ...(installing)
# heroku
/usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient.rb:9:in `rescue in ': no such file to load -- net/https. Try running apt-get install libopenssl-ruby (LoadError)
 from /usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient.rb:5:in `'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/rest_client.rb:2:in `'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/gems/1.9.1/gems/heroku-2.9.0/lib/heroku/client.rb:2:in `'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/gems/1.9.1/gems/heroku-2.9.0/lib/heroku.rb:6:in `'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
 from /usr/local/lib/ruby/gems/1.9.1/gems/heroku-2.9.0/bin/heroku:6:in `'
 from /usr/local/bin/heroku:19:in `load'
 from /usr/local/bin/heroku:19:in `
' # (omg)



How I solved:

I installed two ext modules to my ruby - openssl and readline.
# I also installed libssl-dev before installing openssl because ssl.h was needed to install openssl.


# apt-get install libssl-dev
# cd /usr/local/src/ruby-1.9.2-p290/ext/openssl/
# ruby extconf.rb 
# make
# make install
# cd ../readline
# ruby extconf.rb 
# make 
# make install



All done.

VirtualBox + Ubuntu + Ruby + Rails + PostgreSQL

on 2011/10/12 - 0 Comments -

Ruby + Rails + PostgreSQL @ Ubuntu @ VirtualBox @ MacOS の環境構築のメモ。

1. VirtualBox のインストール

4.1.4 をダウンロードしてきて適当にインストール。

2. Ubuntu のインストール

11.04 をダウンロードしてきて VirtualBox に VM 新規追加・インストール。メモリとか HDD とかそのへんはデフォルトで。

3. もろもろインストール

ssh, emacs, git などなどを apt-get でインストール。

4. Ubuntu のネットワーク設定

一旦 VM をシャットダウンして、VirtualBox の設定画面から VM の NIC を増やす。Adapter 1 は NAT のままで、Adapter 2 を Host-only Adapter にする。設定したら VM を起動し、eth1 が up していることを確認。たぶん 192.168.XXX.XXX あたりが振られていて、ホスト側から疎通するはず。

5. Ruby のインストール

ruby-1.9.2-p290.tar.gz をダウンロードしてきて何も考えずいつもの3コマンドでインストール。

6. RubyGems のインストール

rubygems-1.8.10.tgz をダウンロードしてきて ruby setup.rb でインストール。

7. Rails のインストール

ちょっとつまずいたのでメモメモ。zlibc、rake をインストールしてから rails をインストールする。


# apt-get install zlibc zlib1g-dev

# cd /usr/local/src/ruby-1.9.2-p290/ext/zlib
# ruby extconf.rb
# make
# make install

# gem install rack
# gem install rails


なんか rails のインストールでメモリが swap out したので割り当てを増やして(1024MB)やり直したという。。

8. PostgreSQL のインストール

postgresql-9.0.4.tar.gz をダウンロードしてきて解凍後 INSTALL に書かれている以下の手順でインストール。途中 ./configure で readline が見つからず怒られたので readline6-dev をインストールしておきました。


# apt-get install libreadline6-dev

# ./configure
# make
# make install
# adduser postgres
# mkdir /usr/local/pgsql/data
# chown postgres /usr/local/pgsql/data
# su - postgres
# /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
# /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
# /usr/local/pgsql/bin/createdb test
# /usr/local/pgsql/bin/psql test


9. PostgreSQL 用アダプタのインストール

gem でインストール。簡単。


# gem install postgres-pr



これで Ruby on Rails + PostgreSQL の環境が作れたはず。おしまい。

追記 on 2011/10/15:

以下も必要っぽいです。

no such file to load -- net/https




# gem install pg -- --with-pg-dir=/usr/local/pgsql/


OAuth で Web API を提供するには

on 2011/10/10 - 0 Comments -

仕事で OAuth に詳しくならないといけなくなったので調べてみた。そのメモ。

実際に実装してみると詳しくなりそうだけど、若干めんどうなので想像だけ。以下な感じで実装すればよいと思われる。参考にしたのはOAuth の仕様書と Facebook の実装。

# 以下、仕様書の言葉に合わせて API を使う Web アプリを Client と呼びます

1. Client ID / Secret Key の実装

Web API を使う Client に ID を振り、同時に Secret Key を生成する機能を実装する。また Web API を利用するサイトの URL も登録できるようにする(リダイレクト処理の確認で使用する)。

1. 登録画面とか DB とか

とりあえず Client ID と Secret Key と Web API を利用する URL を登録できるようにしておけばよいはず。そのへんを適当に。
# Facebook でいうところの Facebook Developers みたいなやつ

2. Authorization の実装

Client が Web API 経由でユーザーにひもづく情報にアクセスすることをユーザーに許可してもらう処理を実装する。

# 例えば Facebook API を使って実装されたある Web アプリが Facebook API 経由で Facebook 上の私たちにひもづく情報、友達や写真、Feed にアクセスする場合、私たちは Web アプリが行うその動作を事前に許可するべきですし、実際許可しているはずです。つまるところそれです。

https://hogehoge.com/oauth のような URI で実装するのがよさそう。あと Client の Secret Key がバレたくないので https 使った方がいいはず。処理の流れはおそらく以下。

1. パラメータの取得

リクエストパラメータとして以下を受け取る。

・許可を与える Client ID
・処理完了時にリダイレクトする URI
・許可する Resource (必要に応じて)

2. ユーザーの認証確認

ログインしていることを確認する。もしログインしていなかったらまずログインしてもらう。ログインしてもらわないと、誰に許可を与えようとしているのかこちらで判断できないので。

3. 許可を与えようとしている Client、Resource の提示

受け取ったパラメータをもとに、許可を与えようとしている Client、Resource をユーザーに提示する。ユーザーはその表示を見て、問題がないようなら OK ボタンを押す(はず)。

なおすでに以下の処理を実施済みだったら、生成済みの Authorization Code と一緒にパラメータとして受け取っていた URI へリダイレクトする(つまりは以下の 4 を飛ばして 5 と 6 を実施する)。

4. 許可情報の保持

OK ボタンが押されてリクエストが飛んできたら、もう一回ログインを確かめて、ユーザー、許可する Client、許可する Resource のひもづけの保持する。またこの許可情報にひもづく Authorization Code を生成してこれも保持しておく。

5. リダイレクト先 URI の確認

パラメータとして受け取ったリダイレクト先の URI が事前にアプリとひも付けて登録しておいてもらった URL と一致することを確認する。Client に任意の URI へのリダイレクトを許すと色々と危ないため。

6. Client へリダイレクト

4. で生成しておいた Authorization Code と一緒に、パラメータとして受け取っていた URI へリダイレクトしてあげる(302 を返す)。

3. Access Token の実装

Web API をたたく際の Credential となるのが Access Token 。それを発行する処理を実装する。

# Access Token の仕組みを使えば Client はユーザーの認証情報(ID/Pass)なしでユーザーにひもづく情報にアクセスできる。つまりは ID/Pass が拡散せず、その分危険性が減ったり管理が煩雑にならなかったりと色々いいことがある。そこがポイント。

https://hogehoge.com/oauth/access_token のような URI で実装するのがよさげ。リクエストを受けて Access Token をレスポンスとして返す仕組み。

1. パラメータの取得

リクエストパラメータとして以下を受け取る。

・Access Token を発行したい Client ID
・その Client ID の Secret Key
・ユーザーが許可済みであることを示す Authorization Code
・処理完了時にリダイレクトする URI

2. Client の認証

Client ID と Secret Key で Client を認証する。この認証で Client が正規に登録されたものであることを確認するとともに、なりすましを防ぐ。

3. 許可状況の確認

Authorization Code が Valid なことを確認する。この確認で Client の Authorization が済んでいない Resource へのアクセスを防ぐ。

4. Access Token の生成

Authorization Code(許可された Resource)とひもづけた AccessToken を発行する。つまりはこの Access Token から許可された Resource が特定できるようになっていればよい、はず。

5. URI の確認

リダイレクトする URL が事前に登録されているものと一致することを確認する。確認が必要な理由は Authorization の時と同じ。

6. Access Token の発行

4. で生成した Access Token をレスポンスとして返す。どんなパラメータを返すべきかは仕様書の 5. Issuing an Access Token を参照。
# 参考として Facebook では Access Token と一緒に有効時間を返しています。

3. API の実装

Credential として Access Token を受け取り、指定された API を実行して結果を返す仕組みを実装する。

1. Access Token の確認

Access Token が発行済のものであること、有効時間内であることを確認する。

2. 許可状況の確認

Access Token から Authorization Code をたどり、さらにそこから許可された Resource の情報を取得し、要求されている API が実行可能かどうかを確認する。許可されていない Resource であれば 400 を返す。

4. API の実行

リクエスト、URI などで渡されたパラメータを元に API を実行する。実行した結果をレスポンスとしてユーザーに返す。
# レスポンスの形式としては XML でも JSON でもよい。ちなみに Facebook は JSON。


と、裏で他にやるべきことが色々とありますが、とりあえずこんな感じで実装しておけば OAuth 対応の Web API を公開できるはず。時間あったら実際に実装してみたいな。以上。

参考:
Facebook Developers - Authentication
The OAuth 2.0 Authorization Protocol

Head Rush Ajax

on 2011/10/09 - 0 Comments -

実は Ajax あんまりよく分かってないなぁということで読んでみた。



内容としては結局のところ Javascript による DOM の操作と非同期通信の2つがメイン。

最初に実際に Ajax アプリを作ってみて、後半で DOM の操作やリクエスト、レスポンスの形式についてブレイクダウンする感じで進む。全部読んだら Ajax の概念やキーワードは一通り押さえられるはず。ただ裏を返せば内容としては入門編なので、ちゃんと分かってちゃんとしたものを作るには他のも読んだ方がいいですね。

あと相変わらずコラムがおもしろい。ブラウザ と HTML が言い争ってたり、JSON が XML にケンカ売ってたり。ブラウザが HTML に「僕がレンダリングしてあげなきゃ君は誰にも相手されない」とか「この無知な括弧まみれ野郎め!」とののしっているのには笑った。

家から皇居(13km)

on 2011/10/08 - 0 Comments -

気温的には昼間の方がちょうどいいかも。
もうすっかり秋ですね。

10月:23km

皇居(10km)

on 2011/10/02 - 0 Comments -

後半気持ちのよいペースで走れた。
あと帰りのチャリでいかにがんばれるかが意外と重要。

10月:10km