April 26, 2009

Termtter の設定ファイルの書式を少し変えました(HEAD)

Termtter の設定ファイルの書式を少し変えました(古いままでも一応動くはずです)。
新しい書式は以下のようになります。

config.user_name = 'jugyo'
config.password = 'xxxxxxxx'

Termtter::Client.init do |t|
  t.plug 'log'
  t.plug 'confirm'
  t.plug 'growl'
  t.plug 'stdout'
  t.plug 'standard_commands'
  t.plug 'auto_reload'
end

プラグインを読み込むやりかたが変わっています。
今までみたいに plugin メソッドでプラグインを読み込むのではなく、Termtter::Client.init に渡すブロックの中で、Termtter::Client (引数に渡ってくる t は Termtter::Client そのもの)の plug メソッドを呼んでプラグインを読み込む形になります。
この変更は次のバージョンに反映されると思います。

なんでこうしたかというと、config を読み込んで ライブラリ等の初期化を行った後にプラグインを読みむようにしたかったからです。

April 20, 2009

Sinatra が Google App Engine で動くまで

(注: Google App Engine を GAE と略すことがあります。)

Sinatra を Google App Engine で動かしてみました。

Github にすぐに動かせるものを置いておいたので、手っ取り早く試したい人はここからソースを取ってきて動かしてみるといいと思います。
appengine-java-sdk は別途必要です。

http://github.com/jugyo/sinatra_on_gae/tree/master

詳細は同梱されている README を参照してくだい。

以下は、ちゃんと手順を追って試してみたい人向けの解説です。

SDK のダウンロード

SDK をマシンに入れておく必要があります。
以下から appengine-java-sdk-1.2.0.zip というのをダウンロードして適当な場所に解凍してください。

http://code.google.com/appengine/downloads.html

PATH の設定

SDK の bin ディレクトリを PATH に追加しておきます。
コマンドを実行するときにフルパスを指定するのが面倒なので。

例:

export PATH=$PATH:~/src/jruby/appengine-java-sdk-1.2.0/bin

アプリケーションのフォルダを作成

フォルダをいくつか作ります。

cd sinatra_on_gae
mkdir WEB-INF
mkdir WEB-INF/gems WEB-INF/lib

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

必要なライブラリを gem でインストールします。
その際、-i オプションでディレクトリを指定します。
さらに、rdoc や ri はいらないので –no-rdoc –no-ri オプションも付けておきます。

gem install -i WEB-INF/gems sinatra --no-rdoc --no-ri

以下のファイルは不要なので削除しておきます。

rm -rf WEB-INF/gems/bin WEB-INF/gems/cache/*

jar ファイルの用意

WEB-INF/lib に以下の jar ファイルを置きます。

appengine-api-1.0-sdk-1.2.0.jar
jruby-core.jar
ruby-stdlib.jar
jruby-rack-0.9.4.jar

appengine-api-1.0-sdk-1.2.0.jar は SDK に含まれているライブラリで、 jruby-core.jar と ruby-stdlib.jar は、Github から取ってきた JRuby をビルドして必要なものだけ抜き出したものです。
jruby-rack-0.9.4.jar も Github から取ってきてビルドしました。

Sinatra アプリケーションを作成

Sinatra 上で動かすアプリケーションを作ります。

WEB-INF/app.rb

require 'rubygems'
require 'sinatra'

get '/' do
  'Hello World!!'
end

やっぱり Sinatra はシンプルでいいですね〜。

appengine-web.xml の作成

GAE アプリケーションとしての設定を appengine-web.xml というファイルに書きます。

WEB-INF/appengine-web.xml

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>sinatra_on_gae</application>
    <version>1</version>
    <static-files />
    <resource-files />
    <sessions-enabled>false</sessions-enabled>
    <system-properties>
      <property name="jruby.management.enabled" value="false" />
      <property name="os.arch" value="" />
      <property name="jruby.compile.mode" value="JIT"/> <!-- JIT|FORCE|OFF -->
      <property name="jruby.compile.fastest" value="true"/>
      <property name="jruby.compile.frameless" value="true"/>
      <property name="jruby.compile.positionless" value="true"/>
      <property name="jruby.compile.threadless" value="false"/>
      <property name="jruby.compile.fastops" value="false"/>
      <property name="jruby.compile.fastcase" value="false"/>
      <property name="jruby.compile.chainsize" value="500"/>
      <property name="jruby.compile.lazyHandles" value="false"/>
      <property name="jruby.compile.peephole" value="true"/>
   </system-properties>
</appengine-web-app>

web.xml の作成

Web アプリケーションの設定を web.xml に記述します。

WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

  <context-param>
    <param-name>public.root</param-name>
    <param-value>/</param-value>
  </context-param>

  <context-param>
    <param-name>rackup</param-name>
    <param-value>require 'rubygems'
require 'sinatra'

root_dir = File.dirname(__FILE__)

#set :environment, :production
set :environment, :development
set :root,        root_dir
set :app_file,    File.join(root_dir, 'app.rb')
disable :run

require 'app'

run Sinatra::Application
</param-value>
  </context-param>

  <context-param>
    <param-name>jruby.min.runtimes</param-name>
    <param-value>1</param-value>
  </context-param>

  <context-param>
    <param-name>jruby.max.runtimes</param-name>
    <param-value>1</param-value>
  </context-param>

  <context-param>
    <param-name>jruby.init.serial</param-name>
    <param-value>true</param-value>
  </context-param>

  <filter>
    <filter-name>RackFilter</filter-name>
    <filter-class>org.jruby.rack.RackFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>RackFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.jruby.rack.RackServletContextListener</listener-class>
  </listener>

</web-app>

sinatra のソースをちょっとだけ修正する必要があります。
WEB-INF/gems/gems/sinatra-0.9.1.1/lib/sinatra.rb の8行目です

use_in_file_templates!

#use_in_file_templates!

use_in_file_templates! というのはおそらく、ファイルの中にテンプレートを書いておける機能にまつわるメソッドだと思います。
ま、いらないと思います。

GAE のアプリとして起動する

さて、以上でアプリケーションを動かす準備が整いました。
以下のようにして起動するとこができます。

dev_appserver.sh .

ちなみに、起動の際には WEB-INF ディレクトリが置かれているディレクトリを指定する必要があります。

普通の Ruby で起動する

普通の Ruby でも当然動きます。

GEM_HOME=WEB-INF/gems ruby ./WEB-INF/app.rb

デプロイ

appengine-web.xml の application と version を適切に設定した上で以下を実行するとデプロイできます。

appcfg.sh update .

当然、Google App Engine のアカウントを持っていてかつ Java が使えるようなっている必要があります。

デモ

以下で実際に動かしてます(一週間くらいは動かしておくつもりです。Hello World!! しか出ませんけどね!)。

http://jugyo-test.appspot.com/

参考:
http://blog.bigcurl.de/2009/04/running-sinatra-apps-on-google.html

April 19, 2009

Hamlr が Google App Engine で動くまで

あとで書く。

関連:
Sinatra が Google App Engine で動くまで

April 11, 2009

growl-logger – Growl を利用したロガー(ruby製)

growl-logger というライブラリを作りました。
Growl を利用したロガーです。
普通、ロガーは標準出力やファイルにログを出力しますが、growl-logger を使うとその出力先が Growl になります。

ソースコード

おなじみ GitHub で開発してます。

http://github.com/jugyo/growl-logger

インストール

sudo gem install growl-logger

必要なもの

meowruby-growlgrowlnotify が必要です。
別途インストールしてください。
ruby-growl を使うと Windows 版の Growl (Growl for Windows ver.2 Bata) でも動作しました。

使い方

使い方はとても簡単で、GrowlLogger クラスのインスタンスを作って普通のロガーのように info とか error 等のメソッドを呼び出すだけです。

require 'rubygems'
require 'growl-logger'

log = GrowlLogger.new

log.debug('debug')
log.info('info')
log.warn('warn')
log.error('error')
log.fatal('fatal')

以下のような感じで出力されます。

growl-logger screenshot

Growl の設定画面で各プライオリティごとに色を変えておくとわかりやすくてよいです。

growl setting for growl-logger

Meow モード時だけの特別機能

Meow は RubyCocoa を利用した ruby の growl ライブラリで、growl のポップアップをクリックしたときの動作が指定できたりして便利です。
ruby-growl ではそういうことはできません。

growl-logger では、Meow がインストールされていれば優先的に Meow を使用します(Meow モードと呼んでます)。
Meow モード時、Growl のポップアップをクリックするとログが出力された位置をエディタで開きます。
エディタはデフォルトで TextMate に設定されています。
この機能もなかなか便利だと思いますよ。

April 7, 2009

ruby で OAuth を使ってみる実験

ruby で OAuth を使ってみる実験です。

twitter にアプリケーションを登録

まず twitter に自分の作ったアプリケーションを登録します。
自分のアプリケーションが無い場合でも適当なのでいけるんじゃないんでしょうか。
設定画面(Settings)の以下のリンク(丸で囲んだところ)からアプリケーションの登録画面に辿り着けるはずです。

registration

登録画面はこんな感じです。

registration2

登録すると以下のような画面が見れて、「Consumer key」と「Consumer secret」というのが発行されているのがわかります。

registration3

この「Consumer key」と「Consumer secret」を使って認証処理を行います。

oauth をインストール

oauth ライブラリを gem でインストールします。

sudo gem install oauth

irb で実験

irb で実験してみます。

% irb

まず、irb 上で以下を実行してください。

require 'rubygems'
require 'oauth'

consumer = OAuth::Consumer.new(
  "< Consumer key >",
  "< Consumer secret >",
  :site => "http://twitter.com"
)
request_token = consumer.get_request_token
puts request_token.authorize_url

処理に少し時間がかかるかもしれませんが、最後に URL が出力されるはずです。
この irb はまた後で使うので、終了せずにそのまま置いといてください。
出力された URL にアクセスすると以下のような画面が出てくると思います。

registration4

深く考えずに「Allow」をクリックしましょう。
その後、irb に戻り、以下を実行してください。

access_token = request_token.get_access_token

以上で twitter.com での OAuth による認証は完了です。
内部的には「Consumer key」と「Access token」の交換みたいなことが行われています。
取得した「Access token」の情報(token と token_secret の二つ)をアプリケーション側で保持しておけばいつでも認証を通してのアクセスができます。

試しに twitter に何かメッセージをポストしてみましょう。
以下を実行してみてください。

access_token.post('/statuses/update.json', :status => 'test for oauth')

うまく行きましたか?
http://twitter.com/ にアクセスしてみて、ちゃんとメッセージが投稿されていれば実験成功です。

rubytter の OAuth 対応の話

ちなみに、rubytter の OAuth 対応を昨日行いました。
上記で取得した「access_token」を OAuthRubytter というクラスに渡して new すると Rubytter と同じインターフェイスで OAuth な rubytter が楽しめます。

例:

r = OAuthRubytter.new(access_token)
r.update('Hello OAuth!!')
April 2, 2009

Hamlr

Ruby でブログツールを作ってます。
Hamlr っていいます。
よろしく願いします。
発音は「ハムラー」ですかね。
はじめ、Hamblr にするか迷いました。

ソース

おなじみ GitHub で開発してます。

http://github.com/jugyo/hamlr/tree/master

特徴

特徴をざっと並べてみました。

  • Haml
  • Sass
  • Textile
  • Sinatra
  • DataMapper
  • SQLite
  • プラグインシステム
  • テーマの切り替え

まあ、そんな感じです。
簡単に動かせて簡単に変更できるブログツールを目指してます。

僕 Haml 大好きなんですね。Sass も好きです。
みんなも HTML やめて Haml を使うといいと思います。

「プラグインシステム」と「テーマの切り替え」に関してはまだいろいろ思考錯誤しながら作ってる段階です。

依存関係

以下のライブラリが必要です。

  • sinatra
  • haml
  • dm-core
  • do_sqlite3
  • RedCloth

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

sudo gem install sinatra haml dm-core do_sqlite3 RedCloth

動かし方

スタンドアロンで動かす

WEBrick とか mongrel なんかで動かすには以下を実行します。

./app.rb

デフォルトのポートが 4567 だと思うので、以下からアクセスできるはずです。

http://localhost:4567/

mod_rails で動かす

mod_rails で動かすには以下のような設定を apache の設定ファイル(httpd.conf 等)に書きます。

<VirtualHost *:80>
  ServerName your.domain.com
  DocumentRoot /xxx/xxx/hamlr/public
</VirtualHost>

設定を書いたら apache を再起動する必要があると思います。
あと、動かしてる最中に変更を加えた場合は tmp/restart.txt というファイルを touch することで、mod_rails がアプリケーションを起動し直してくれるみたいです。
つまり apache を再起動する必要がない!
See Also: Phusion Passenger users guide #4.4. Redeploying (restarting the Rack application)

設定

動かす前に設定ファイルを編集して基本的な設定しておく必要があります。
「setting.yml」という YAML ファイルが設定ファイルになります。
内容は以下のような感じになっています。

environment:  production
user_id:      test
password:     test
blog_title:   blog title
par_page:     10
theme:        default
plugins:
  - sample

だいたいわかりますよね。

ディレクトリ構成

以下のようなディレクトリ構成になっています。

hamlr
  |-- README.rdoc
  |-- app.rb
  |-- config.ru
  |-- models.rb
  |-- plugins               # プラグインを置くところ
  |   `-- sample.rb
  |-- public
  |-- setting.yml
  `-- themes               # テーマを置くところ
      `-- default

plugins ディレクトリにプラグインファイルを設置して setting.yml の plugins: のところにプラグイン名(ファイル名から .rb を取り除いたもの)を追加することでプラグインが読み込めるようになっています。
ただ、今のところプラグインでどういうことをやるか(どういうことができればいいか)が全く想定できていません。
とりあえずプラグイン機能を付けてみたといった感じです。

themes ディレクトリには現在 default という名前のテーマだけが置かれています。
setting.yml の theme: の所に使用するテーマの名前(ディレクトリ名)を書いておくとそれが使われます。
デフォルトのテーマをコピーしていろいろいじれば独自のテーマが作れると思います。
テーマの中身は以下のようになっています。

hamlr/themes
`-- default
    |-- entries.haml
    |-- entry
    |   |-- entry.haml
    |   |-- form.haml
    |   `-- new.haml
    |-- layout.haml
    |-- login.haml
    |-- search.haml
    `-- styles.sass

デモ

以下で実際に動かしてます。

http://hamlr.oyguj.org/

mod_rails 上で動いてます。

課題

  • テストを書く
  • タグ付け機能を実装する
  • コメント機能を実装する