Archive for the ‘Ruby’ tag
Ubuntu+Apache+Rack+FastCGIな環境でSinatraを使う
Sinatraはあっさり動いてくれました。
以下手順のメモです。
sudo gem install sinatra
ファイルの記述
前回テストしたrack-testディレクトリ以下に次の3つのファイルを配置します。
.htaccess
ファイルやディレクトリが存在しない場合にはリクエストをすべてdispatch.fcgiへ投げるようにします。
RewriteEngine On
RewriteBase /
DirectoryIndex dispatch.fcgi
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L]
start.rb
ここにはアプリケーション本体のコードを記述します。
require 'rubygems' require 'sinatra' get '/' do 'Hello, World!' end
dispatch.fcgi
start.rbを読み込んでFastCGIとして起動させているだけのコードです。
#!/usr/bin/env ruby require 'rubygems' require 'rack' require 'sinatra' require 'start' Rack::Handler::FastCGI.run Sinatra::Application
テスト
このコードを動かしてみると、うちではなぜか出力が以下のようになってしまいます。
He
ある程度出力が長ければ(30文字程度)途切れずに表示されるので実害はないのですが、よく分からない感じです。
Ubuntu+Apache+Rack+FastCGIな環境でRubyを動かしてみる
情報量が少ないのでメモ。
苦労したのは情報量が少ないというのと、fastcgiとfcgidで情報が混じっていて混乱させられるとう点だけで、実際にやることはそれほど難しくありません。
特にRubyのコードはRackがFastCGIを扱う部分をすべて吸収してくれるので、自分ではなにもする必要がありません。
すてきですね。
必要なモジュールのインストール
sudo aptitude install libapache2-mod-fastcgi libfcgi-dev sudo gem install fcgi rack
aptitudeで失敗する場合には、/etc/apt/sources.listを編集してsudo aptitude updateを行う必要があるようです。
追加すべきURLは「ubuntu パッケージ名」で検索すれば見つかると思います。
設定ファイルの編集
/etc/apache2/mods-available/fastcgi.confを編集します。
<IfModule mod_fastcgi.c> AddHandler fastcgi-script .fcgi FastCgiWrapper On FastCgiIpcDir /var/lib/apache2/fastcgi </IfModule>
FastCgiWrapperはsuEXECを利用する場合に、FastCgiIpcDirはtmpwatchが動作している場合にそれぞれ設定が必要らしいです。
Hello World
適当にVirtualHostを設定してルートにhello-world.fcgiを配置
#!/usr/bin/env ruby
require 'rubygems'
require 'rack'
app = Proc.new do |env|
Rack::Response.new.finish do |res|
res.write "Hello, Rack!"
end
end
Rack::Handler::FastCGI.run app
あとはApacheを再起動してURLにアクセスすれば、Hello, Rack!と表示されるかもしれません。
次はこの上でSinatraを動かせたらいいなぁと思ってます。
RubyでGmailを利用したメール送信
GmailのSMTPを利用してメール送信するためにTLSが必要ですが、Ruby 1.8系列では標準で利用できません。以下にRuby 1.8系列でTLSを利用するための方法をメモしておきます。
tlsmailというライブラリを利用するので、あらかじめインストールしておく必要があります。
sudo gem install tlsmail
ライブラリがインストールされた状態で以下のように記述すればGmailを利用したメール送信が可能です。
require 'rubygems' require 'net/smtp' require 'openssl' require 'tlsmail' host = 'smtp.gmail.com' port = 587 helo = 'gmail.com' user = 'abc@gmail.com' password = 'password' Net::SMTP.enable_tls OpenSSL::SSL::VERIFY_NONE Net::SMTP.start(host, port, helo, user, password, :plain) do |smtp| # メール送信 end
ちなみに、Gmailでは拡張子が.exe、.zip、.tar、.tgz、.z、.gzのファイルを添付ファイルとして送信することはできません。
downloaderでは、この問題に対してファイル名の末尾に_(アンダーバー)を付加することで強引に対処しています。
Google Chromeのtextareaを外部エディタで編集する (Ruby版)
Google Chrome のテキストエリアを外部エディタで編集する Edit with Emacs
自分のPCにはPerlがインストールされていないので、Rubyで書いてみました。Perlは分からないので勘で移植しましたが、一応動作しているようです。
#!/usr/bin/ruby -Ku
require 'webrick'
require 'tempfile'
require 'kconv'
$EDITOR = 'C:\vim\gvim.exe'
$PORT = 9292
server = WEBrick::HTTPServer.new(:Port => $PORT)
trap('INT') { server.shutdown }
server.mount_proc('/status') do |req, res|
res.status = 200
end
server.mount_proc('/edit') do |req, res|
temp = Tempfile.new('editwith_')
temp << req.body
temp.close false
system $EDITOR, temp.path
temp.open
res.body = temp.read.toutf8
temp.close
res.status = 200
res['Content-Type'] = 'text/plain'
res['Content-Length'] = res.body.size
end
server.start
$EDITORと$PORTを適切に設定すれば動作するんじゃないかと思います。
Perfume HeadlineをWordPressに移行
Perfume HeadlineをWordPressに移行させました。
これまでのRamaze+Sequelで作ったCGIと比較して、高い安定性、高速な表示、以前よりきれいなケータイ対応、iPhone対応、PubSubHubbub対応(これはうまく動かないのでまだ見送っています)などの利点があります。
実装方法は、クローラで収集した記事をXML-RPCで投稿しているだけのシンプルなものです。
datファイルの閲覧などは、これまでどおりRamaze+SequelのCGIになっています。
Ramazeでセッション情報を生成しない方法
今日ふとPerfume Headlineのキャッシュディレクトリを開いてみると、セッション情報であふれていました。
そもそもPerfume Headlineにはセッションを必要とするような機能を何も実装していないので、削除したついでにセッション情報を生成しないようにしてみました。
というわけで、以下にその方法をメモしておきます。
記述する場所はstart.rbとかでいいんじゃないでしょうか。
Ramaze::Global.no_cache_flash = false
なお、この方法はRamaze-2009.03で動作することを確認しています。
2009.04以降ではRamaze::Globalが廃止されたらしいのでたぶん動作しないと思います。
Ramazeでレンダリング結果をファイルにキャッシュする正しい方法
たまたまRamazeをインストールしたディレクトリを見ていたところ、ramaze/cache/file.rbなるファイルが。
というわけでstart.rbあたりに以下のような記述をするとキャッシュがファイルに生成されるようになり、CGIでもキャッシュを活用できるようになります。
前回書いたコードは忘れてください。
Ramaze::Global::cache = Ramaze::FileCache
あとはメモリキャッシュを用いる場合と同様にコントローラを記述すれば細かな制御が行えます。
とっても簡単できれいですね。
この方法だとCGI起動、ライブラリ読み込みのオーバーヘッドは発生してしまいますが、何もしないときよりは高速ですのでまあ十分かと思います。
ただし、Ramazeは「:(コロン)」を含んだファイル名でキャッシュを生成しようとするので、Windows環境だとローカルでのデバッグ時にエラーが発生します。
そのへんは各自対処してください。
Ramazeでレンダリング結果をファイルにキャッシュする
「mod_rewriteを使ってCGI環境で超高速にキャッシュを返す」という記事を読んで、Ramazeで同じことをやろうとしたら結構困ったのでメモしておきます。
ちなみに、Ramazeに標準で用意されているキャッシュはメモリ上にキャッシュするものなので、CGIでは使えません。
キャッシュを生成するためにはレンダリング結果のHTMLが必要なわけですが、Ramazeにはレンダリング結果を読んだり書いたりする方法は(たぶん)用意されていません。
そのため、Ramaze内部のレンダリングを行っているメソッドを上書きして強引にデータを読み取ります。
module Ramaze
class Action
unless method_defined?(:static_html_original_render)
alias_method :static_html_original_render, :render
end
def render
# オリジナルのレンダリング処理を呼び出す
content = static_html_original_render
# ここで適当に content の内容を保存
# full_pathでリクエストのパスがとれるのでこれを使うとよいです
# オリジナルと同じ値を返す
content
end
end
end
あとは冒頭で挙げた記事にあるように、.htaccessで制御、cronで古いキャッシュの削除を行えばOKです。
Perfume Headline Archiveを公開
Perfume Headlineの過去のデータを閲覧できるPerfume Headline Archiveを公開しました。
今までのデータは保存していなかったのでまだデータ数が少ないのですが、時間があるときに過去ログを解析する予定です。
Perfume Headlineを再開
チケット当選のうれしさから久しぶりに2chのPerfumeスレをのぞいたところ、
同じ方かどうかは分かりませんが、「今日のまとめ、明日の予定」という投稿が毎日行われているようです。
投稿者の方に感謝しつつ、早速Perfume Headlineの対応作業を行いました。また以前と同じようにご利用いただければと思います。
なお、以前のまとめと予定氏はトリップをつけてくださったため、正確に書き込みを抽出することができましたが、今回は本文やレスの内容からまとめかどうかを判断して掲載しているため、掲載漏れや関係ない記事が掲載される可能性があります。あらかじめご了承ください。といっても、公開直後ほど簡単に荒らされることはないと思いますが。