monoの開発ブログ

プログラム開発の記録

Archive for the ‘Ruby’ tag

Ubuntu+Apache+Rack+FastCGIな環境でSinatraを使う

without comments

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文字程度)途切れずに表示されるので実害はないのですが、よく分からない感じです。

Written by mono

3月 4th, 2010 at 10:33 pm

Posted in Linux, Ruby, Ubuntu, Web

Tagged with , , , , , ,

Ubuntu+Apache+Rack+FastCGIな環境でRubyを動かしてみる

without comments

情報量が少ないのでメモ。
苦労したのは情報量が少ないというのと、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を動かせたらいいなぁと思ってます。

Written by mono

3月 4th, 2010 at 1:00 pm

Posted in Linux, Ruby, Ubuntu, Web

Tagged with , , , , ,

RubyでGmailを利用したメール送信

without comments

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では、この問題に対してファイル名の末尾に_(アンダーバー)を付加することで強引に対処しています。

Written by mono

2月 26th, 2010 at 11:20 pm

Posted in Google, Ruby

Tagged with , , ,

Google Chromeのtextareaを外部エディタで編集する (Ruby版)

without comments

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を適切に設定すれば動作するんじゃないかと思います。

Written by mono

1月 30th, 2010 at 7:26 pm

Posted in Chrome, Google, Ruby

Tagged with ,

Perfume HeadlineをWordPressに移行

without comments

Perfume HeadlineをWordPressに移行させました。
これまでのRamaze+Sequelで作ったCGIと比較して、高い安定性、高速な表示、以前よりきれいなケータイ対応、iPhone対応、PubSubHubbub対応(これはうまく動かないのでまだ見送っています)などの利点があります。

実装方法は、クローラで収集した記事をXML-RPCで投稿しているだけのシンプルなものです。
datファイルの閲覧などは、これまでどおりRamaze+SequelのCGIになっています。

Written by mono

8月 27th, 2009 at 3:03 pm

Ramazeでセッション情報を生成しない方法

without comments

今日ふとPerfume Headlineのキャッシュディレクトリを開いてみると、セッション情報であふれていました。
そもそもPerfume Headlineにはセッションを必要とするような機能を何も実装していないので、削除したついでにセッション情報を生成しないようにしてみました。

というわけで、以下にその方法をメモしておきます。
記述する場所はstart.rbとかでいいんじゃないでしょうか。

Ramaze::Global.sessions = false
Ramaze::Global.no_cache_flash = false

なお、この方法はRamaze-2009.03で動作することを確認しています。
2009.04以降ではRamaze::Globalが廃止されたらしいのでたぶん動作しないと思います。

Written by mono

5月 28th, 2009 at 7:46 pm

Posted in Ramaze, Ruby

Tagged with , ,

Ramazeでレンダリング結果をファイルにキャッシュする正しい方法

without comments

たまたまRamazeをインストールしたディレクトリを見ていたところ、ramaze/cache/file.rbなるファイルが。
というわけでstart.rbあたりに以下のような記述をするとキャッシュがファイルに生成されるようになり、CGIでもキャッシュを活用できるようになります。
前回書いたコードは忘れてください。

Ramaze::Global::cache = Ramaze::FileCache

あとはメモリキャッシュを用いる場合と同様にコントローラを記述すれば細かな制御が行えます。
とっても簡単できれいですね。
この方法だとCGI起動、ライブラリ読み込みのオーバーヘッドは発生してしまいますが、何もしないときよりは高速ですのでまあ十分かと思います。

ただし、Ramazeは「:(コロン)」を含んだファイル名でキャッシュを生成しようとするので、Windows環境だとローカルでのデバッグ時にエラーが発生します。
そのへんは各自対処してください。

Written by mono

5月 2nd, 2009 at 8:31 pm

Posted in Ramaze, Ruby

Tagged with , ,

Ramazeでレンダリング結果をファイルにキャッシュする

with 3 comments

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です。

Written by mono

4月 19th, 2009 at 7:02 pm

Posted in Ramaze, Ruby

Tagged with , ,

Perfume Headline Archiveを公開

without comments

Perfume Headlineの過去のデータを閲覧できるPerfume Headline Archiveを公開しました。

Perfume Headline Archive

今までのデータは保存していなかったのでまだデータ数が少ないのですが、時間があるときに過去ログを解析する予定です。

Written by mono

2月 22nd, 2009 at 12:58 am

Posted in Perfume, Ruby

Tagged with , , , ,

Perfume Headlineを再開

with 2 comments

チケット当選のうれしさから久しぶりに2chのPerfumeスレをのぞいたところ、
同じ方かどうかは分かりませんが、「今日のまとめ、明日の予定」という投稿が毎日行われているようです。

投稿者の方に感謝しつつ、早速Perfume Headlineの対応作業を行いました。また以前と同じようにご利用いただければと思います。

Perfume Headline

なお、以前のまとめと予定氏はトリップをつけてくださったため、正確に書き込みを抽出することができましたが、今回は本文やレスの内容からまとめかどうかを判断して掲載しているため、掲載漏れや関係ない記事が掲載される可能性があります。あらかじめご了承ください。といっても、公開直後ほど簡単に荒らされることはないと思いますが。

Written by mono

2月 14th, 2009 at 9:24 pm

Posted in Perfume, Ruby

Tagged with , , ,