け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト
Rails や Merb などの著名ウェブアプリフレームワークは「サーバとして動作されるのを想定」して設計されて以下略。
今回までの設定で、ローカルでのwebrickとサーバ上でのCGIの差を気にせずに実装できるようになると思います。
(以下、詳細)
まずは、起動ファイルのサンプルでも。
#!/bin/sh
# (...省略...)
exec ruby -S -Ku -x $0 "$@"
#!/usr/local/bin/ruby
# coding: utf-8
$KCODE = 'u'# 環境固有の情報の設定
AppDir = "#{ENV['Home']}/app"
Dir.chdir AppDir# エラー出力とtmpdirの設定
STDERR.reopen('log/error_out.log', 'a')
class <<Dir
def tmpdir; "#{::AppDir}/tmp" end
endrequire 'rubygems'
require 'ramaze'$ramaze_0 = "#{::AppDir}/start.rb"
alias $0 $ramaze_0require $0
# (A)CGIモードで起動するように設定
Ramaze.options.adapter.handler = :cgi# (B)ログフォルダの設定
require 'ramaze/log/informer'
Ramaze::Log.loggers = [ Ramaze::Logger::Informer.new( "#{::AppDir}/log/ramaze.cgi.log" ) ]# (C)セッションDBの設定
require 'logger'
SessionLog = Logger.new('log/session.log')
SessionLog.level = Logger::ERROR
SessionDB = Sequel.connect('amalgalite://data/session.db', :logger => [SessionLog])
require 'ramaze/cache/sequel'
Ramaze::Cache::Sequel::Table.db = SessionDB# (D)キャッシュの設定
Innate::Cache.options.names = [:session, :user, :view]
Innate::Cache.options.session = Ramaze::Cache::Sequel
Innate::Cache.options.user = Ramaze::Cache::Sequel
Innate::Cache.options.view = Ramaze::Cache::Sequel# (E)プロダクトモードで起動
Ramaze.start :mode => :live
「require $0」を実行する部分までは前回までの言及しているので説明は省略。
ソース(A)部分でCGIを指定しています。これでrackをCGIモードで起動するように設定しています。
webrickや他、サーバとして動かす場合はポート番号なども必要ですが、CGIなので、指定はこれだけでOK。
ソース(B)で設定しているのは Ramaze の出力するログシステムの設定です。ロガークラスとして、Ramaze が提供している Informer クラスを使っています。
webrick他のサーバとして動作させる場合、ramaze はセッション情報をメモリに保持する設計になっています。
それは非常にシンプルで使いやすいのですが、CGIのようにアクセスのたびにプロセスが起動する仕組みの場合、メモリを使った仕組みでは共有が出来ません。
簡単なのはファイルを使ったセッション情報の共有化ですが、今回は Ramaze の提供する Sequel と Amalgalite を使ったファイルデータベースを使ってセッション情報を保持することにします。
ソース(C)がそのために必要なコードを記述している部分です。
まず、Sequel の SQL 実行ログを取るためのロガーを生成し、それと Amalgalite (SQLite ライブラリ)を使ってセッションデータベースを生成・接続しています。
注意すべき点は最後の2行。
セッションテーブルとして Sequel::Model から派生した Table モデルクラスを使っていますが、Sequel::Model クラスが定義される時点で、何かしらのデータベースが接続されていないとエラーが出てしまいます。このソースの場合、「require 'ramaze/cache/sequel'」の行をこれより前に記述するとエラーが出てしまう可能性があります。
最後の「Ramaze::Cache::Sequel::Table.db = SessionDB」の行で、モデルクラスとデータベースを明示的に紐づけています。
このモデルクラスは必要になった時点でテーブルの定義を確認、無ければ生成してくれるので SQLite の「データベースファイルがなければ自動作成してくれる」のと合わせて、非常に柔軟に必要なデータベースを自動生成してくれます。
ソース(D)が今回一番のキモです。
セッションテーブルなど、それらはキャッシュシステムを経由して扱うわけですが、キャッシュシステムの設定をこの行で行っています。
前半で「キャッシュの種類」を、後半で「キャッシュの種類ごとの、使用するキャッシュシステム」を指定しています。
セッションの他、ユーザ情報、ビューテンプレートのキャッシュが出来るように指定しているわけです。
実のところ、Innate の cache.rb には以下のようなサンプルが書かれているのですが……
#
# Innate::Cache.options do |cache|
# cache.names = [:session, :user]
# cache.session = Innate::Cache::Marshal
# cache.user = Innate::Cache::YAML
# end
#
この指定方法だと、エラーは出ませんが実際のキャッシュシステムに反映されていないようです。(デフォルトの Innate::Cache::Memory が使用されているのを確認)
いずれ修正されるのかも知れませんが、現在はソース(D)のように書く方が確実です。
(8/25追記)
ソース(D)のコード修正。Cache.options ブロックは無意味なので直接指定に変更。
ソースを見ると、options メソッドは単なるアクセサメソッドで、ブロックなんて取らないよーデス。なんでこんなコメントが付いているんだろう……??
ソース(E) でいよいよ起動です。
開発モードとプロダクトモードの違いは、innate.rb や ramaze.rb の最後の部分を参照して下さい。
OVA『バカとテストと召喚獣 〜祭〜』上巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,409
中古 ¥ 3,680
OVA『バカとテストと召喚獣 〜祭〜』下巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,438
中古 ¥ 2,980
生徒会役員共DJCD「アニメ生徒会役員共が全部わかるラジオ、略して全ラ!...
(キングレコード)
新品 ¥ 2,253
中古 ¥ 1,850
WORKING!! 9 初回限定特装版 (SEコミックスプレミアム)
(高津 カリノ)
新品 ¥ 2,896
中古 ¥ 2,835
「声優グランプリ」公認!声優界<雀王>決定戦! <J-1グランプリ> V...
(オムニバス)
新品 ¥ 3,159
中古 ¥ 3,099
デッドライジング 2【CEROレーティング「Z」】
(カプコン)
新品 ¥ 2,740
中古 ¥ 1,014
スプリンターセル コンヴィクション
(ユービーアイ ソフト)
新品 ¥ 2,979
中古 ¥ 1,397
Xbox 360 250GB
(マイクロソフト)
新品 ¥ 34,980
中古 ¥ 25,400
学園黙示録 HIGHSCHOOL OF THE DEAD 7 オリジナル...
(佐藤 大輔)
新品 ¥ 9,800
中古 ¥ 4,797
学園黙示録 HIGHSCHOOL OF THE DEAD SECRET ...
(佐藤 大輔)
中古 ¥ 2,500
ソードアート・オンライン〈5〉ファントム・バレット (電撃文庫)
(川原 礫)
新品 ¥ 578
中古 ¥ 692
RPG W(・∀・)RLD6 ―ろーぷれ・わーるど― (富士見ファンタ...
(吉村 夜)
新品 ¥ 651
中古 ¥ 1
魔法少女リリカルなのはViVid (3)限定版 (角川コミックス・エース...
(藤真 拓哉)
新品 ¥ 1,680
中古 ¥ 1,338
魔法戦記リリカルなのはForce (3)限定版 (角川コミックス・エース...
(緋賀 ゆかり)
新品 ¥ 1,680
中古 ¥ 418
ダンジョンズ&ドラゴンズ第4版スターター・セット
(ジェームズ ワイアット)
新品 ¥ 4,980
中古 ¥ 4,311
アリアンロッド・サガ・リプレイ(5) 激闘のピースメイカー (富士見ド...
(菊池 たけし/F.E.A.R.)
新品 ¥ 693
中古 ¥ 190
アリアンロッド・サガ・コンチェルト 1 (電撃コミックス)
(佐々木 あかね)
新品 ¥ 599
中古 ¥ 90
堀さんと宮村くん(7)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 1,000
中古 ¥ 747
浅尾さんと倉田くん(3)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 690
中古 ¥ 370
7と嘘吐きオンライン―HERO個人作品集―(ガンガンコミックスONLIN...
(HERO)
新品 ¥ 710
中古 ¥ 158
ONE PIECE 65 (ジャンプコミックス)
(尾田 栄一郎)
NARUTO―ナルト― 59 (ジャンプコミックス)
(岸本 斉史)
ワンピース 海賊無双(通常版)(初回特典:オリジナルカスタムテーマ9種DLコード、ソーシャルゲーム専用レアフィギュア用コード同梱)
(バンダイナムコゲームス)
ドラゴンズドグマ(数量限定特典『バイオハザード6』体験版用DLコード同梱)
(カプコン)