Sinatra(0.9.2)&Rack(1.0.0)でCGI動作させるとErrno::ESPIPE - Illegal seek

普通にインストールして、現在だとSinatra(0.9.2)&Rack(1.0.0)が入るんだけど、普通にエラーになる。
頼みます、まじで。
なんだか、毎回この界隈ですんなりいかないのよね、Sinatra。

チケット出てた。
#227 "Errno::ESPIPE: Illegal seek" with CGI + Sinatra - sinatra

Fixed on the 0.9.x and master branches.


と言っているので、持ってこれば良いのか。
面倒な人は、直で以下のように直すとよろし。

Commit 4d94830a3609cbb0e8d718b4738bf9bb7c38ff1a to sinatra's sinatra - GitHub

6月って最近じゃないかー。

Rubyのフレームワーク「Sinatra」を使ってみた(View編)

Sinatra自体にはView機能は無いので、他のテンプレートライブラリを使いことになります。
まあ、使わなくてもいけそうなんですが、それはそれでコードが見づらくなるし、PHPでSmartyに慣れきってしまっている僕としては無いと寂しいのです。

ざっと以下のライブラリがサポートされてます。
・Haml
・Sass
・Erb
・Builder

■テンプレートエンジン選び
まず、Builderは無し。
あんまり検索したけど、情報が出てこなかった。

SassはCSS用のライブラリだし、Hamlの機能の一つって事で、これも置いとく。

で、HamlとErbに絞られたんだけど、なんとなく勢い的にはHamlな感じ。
なんだかカッコいいでなー。

けど、Erbを使うことにした。
理由としては、

・覚える事が少ない
・Hamlは実装は綺麗だけど、あまりに原形をとどめていない=覚えることが多そう

難しいことは嫌なのです。


■Erbで頑張ってみる
Erbの使い方は以下のサイトを参考にした。
ERB More
まあ、適当です。

SinatraからErbを使う時は、
erb :index

とかやっちゃけば、
./views/index.erb

の内容が表示される。
※「./views」ディレクトリを変更も可


■レイアウト機能も使えるよ
レイアウト機能っていうのかしら。
一部分だけをページ毎に変えたいって時に使う場合に使う奴。

./views/layout.erb

ってファイルを作って、ページ毎に変えたい部分に
<%= yield %>

と書いておけば、宜しくやってくれます。
レイアウトファイル使いたくないわ!って時は、
erb :index, :layout => false 

でOK。


■テンプレートへの値の渡し方
2パターンあります。

(1)インスタンス変数で渡す
@hoge = 'unko'

とやっておけば、テンプレートファイルで
<%= @hoge %>

で、表示されます


(2)ローカル変数として渡す
erb :index, :locals => {:unko => 'unkoman'} 

とやっておけば、テンプレートファイルで
<%= unko %>

で、表示されますよー。


■その他、オプション値まとめ
ソースを見た感じ、こんぐらいな気がする。
:layout           #レイアウトの有無(true/false)、レイアウトファイルの指定も出来る模様
:locals           #ローカル変数指定
:views_directory  #テンプレートのディレクトリも指定可

試してないのもあるし、マニュアルに無いのもあるけど、動くくさい。


と、こんなところまで調べました。
ある程度切り捨てちゃってる感が、気持ちが良いのかもと思いました。

Rubyのフレームワーク「Sinatra」を使ってみた(設置編)

最近お邪魔しているFLOSS桜山で、主催者である河合先生が、「注目しているRubyのフレームワークはSinatra」とか言ってて、まあ、そうなのかで終わるところだったんだけど、その理由を聞いて俄然興味を持った。
それが

「僕、簡単なのが好きなんだよねぇ」

はいはい、僕も大好物ですよ、簡単なの。

ということで

「たくさんのこと覚えるの苦手」
「ちゃっちゃと作りたい」
「出来れば軽いのが最高」

な人に最適なフレームワークSinatraのサイトがこちら。

Sinatra
Sinatra

もう雰囲気がフレームワークって感じじゃないのが気に入った!
でらクール!!

で、トップページみたら、飛び込んできたサンプルコードががこれ。
# myapp.rb
require 'rubygems'
require 'sinatra'

get '/' do
  'Hello world!'
end

良いねえ、お手軽な雰囲気がプンプンするではないか。


で、早速動かそうとしたらはまりました。
ローカルで動かすなら、公式サイトのドキュメントに載ってるんだけど、CGIとして動かす方法が載っていない。

あ~でら不親切!
Rubyのフレームワークってみんなこんな感じなんだよね、ドキュメント。
Rubyistはみんなお金持ちってこと?
Coreserverみたいな激安レンタルサーバは使わないのかしら。

そこでなんとか見つけ出したのがこちらのサイト。
Sinatra を CGI スクリプトとして実行する - ursmの日記

助かりました、ホント。
ほとんど情報無いわ、フレームワークもシンプルなら、公式サイトのドキュメントもシンプルだわ、Rackもいまいちわからんわって状態だったので。

けど、これだけじゃイメージ通りに動きません。
参考サイトの通りに設定すると
get '/hello' do
  'Hello world!'
end


http://hogehoge.com/hoge.rb/hello

こんな感じでアクセスできた。

でも、そうじゃなくて
http://hogehoge.com/hello

といきたいわけです。

ということで、約1日かけてたどり着いたのがこちら。

#.htaccess

DirectoryIndex index.html index.php start.rb

AddHandler cgi-script .rb
Options +ExecCGI

SetEnv RUBYLIB /virtual/account/lib/site_ruby/1.8:/virtual/account/lib
SetEnv GEM_HOME /virtual/account/lib/ruby/gem

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*) start.rb/$1 [L]

もっとちゃんと書き方あるかと思いますが、まあ、これをみて察してください。

で、実際のアプリのコードはこんな感じ。
#/start.rb

require 'rubygems'
require 'sinatra'

set :run, false                #HTTPサーバ立ち上げないならfalse
set :environment, :production

get '' do                      #'/'だと駄目くさい
  'Hello world!'
end

Rack::Handler::CGI.run Sinatra::Application


こんな感じで
http://hogehoge.com/

でHello Worldが出ます。
泣ける。

これでやっと、Sinatraワールドが楽しめます。

長くなったので、今回はここまで。
余力があれば、DB周りやView周りのことも書きたいです。

※htaccessのSetEnvの箇所は大橋さんの記事を参考にさせていただきました(それまではstart.rbに直書きでした)。
htaccessに記述した方が何かとスマートかなと思います。
ありがとうございました。
Sinatra、結構いいかも | コンピューターと人の触媒になるのを目指して
1 of 1

アーカイブ

2010

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com