スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Debian]railsをnginxとmongrel_clusterで動かす

バックでrailsをmongrel_clusterで動かし、フロントのnginxにより
中継させるまでの手順のメモです。

# mongrel_clusterをインストール
gem install mongrel_cluster
# 設定ファイル([RAILS_ROOT]/config/mongrel_cluster.yml)を作成
cd [RAILS_ROOT]
mongrel_rails cluster::configure -e development -p 3000
# mongrel_clusterを起動
mongrel_rails cluster::start

# nginxをインストール
aptitude install nginx
# 設定ファイルを編集
vi /etc/nginx/nginx.conf
-------------------------------------
http{
  upstream mongrel_cluster{
    server localhost:3000;
    server localhost:3001;
  }
  server{
    listen 80;
    root html;
    location / {
     proxy_pass http://mongrel_cluster;
    }
  }
}
-------------------------------------
# 設定ファイルを検証
nginx -t
# nginxを起動
/etc/init.d/nginx start

[Ruby]net/httpでPOST

net/httpを使用して、シンプルなPOSTからファイルのアップロードまで試してみました。

まずはシンプルなパターン。
require "net/http"
require "uri"

uri = URI.parse("http://www.mysample.com/index.php")
Net::HTTP.start(uri.host, uri.port){|http|
#ヘッダー部
header = {
"user-agent" => "Ruby/#{RUBY_VERSION} MyHttpClient"
}
#ボディ部
body = "id=1&name=name"
#送信
response = http.post(uri.path, body, header)
}

次に、HTTPRequestのサブクラスであるNet::HTTP::Postを使用したパターン。
require "net/http"
require "uri"

uri = URI.parse("http://www.mysample.com/index.php")
Net::HTTP.start(uri.host, uri.port){|http|
#リクエストインスタンス生成
request = Net::HTTP::Post.new(uri.path)
#ヘッダー部
request["user-agent"] = "Ruby/#{RUBY_VERSION} MyHttpClient"
#ボディ部
#第二引数は省略可能
request.set_form_data({:id=>"1", :name=>"name"}, "&")
#送信
response = http.request(request)
}

最後にファイルアップロードのパターン。
(form enctype="multipart/form-data"のパターン)
require "net/http"
require "uri"

uri = URI.parse("http://www.mysample.com/index.php")
Net::HTTP.start(uri.host, uri.port){|http|

#リクエストインスタンス生成
request = Net::HTTP::Post.new(uri.path)

#ヘッダー部
request["user-agent"] = "Ruby/#{RUBY_VERSION} MyHttpClient"
request.set_content_type("multipart/form-data; boundary=myboundary")
#(以下でも可)
#request["content-type"] = "multipart/form-data; boundary=myboundary"

#ボディ部
#multipart/form-dataの仕様にあわせてbodyを作成
body = ""
body.concat("--myboundary\r\n")
body.concat("content-disposition: form-data; name=\"id\";\r\n")
body.concat("\r\n")
body.concat("1\r\n")

body.concat("--myboundary\r\n")
body.concat("content-disposition: form-data; name=\"file1\"; filename=\"sample.txt\"\r\n")
body.concat("\r\n")
File::open("sample.txt"){|f| body.concat(f.read + "\r\n") }

body.concat("--myboundary\r\n")
body.concat("content-disposition: form-data; name=\"file2\"; filename=\"sample.png\"\r\n")
body.concat("\r\n")
File::open("sample.png"){|f| body.concat(f.read + "\r\n") }

body.concat("--myboundary--\r\n")
request.body = body

#送信
response = http.request(request)
}

[Ruby]rexmlを使用してみる

rexmlを触った時のメモです。

サンプルのxmlファイル(address_book.xml)。
<?xml version='1.0' encoding='UTF-8'?>
<address_book>
<address type='a' id='1'>
<name>佐藤</name>
<zip>111-1111</zip>
<address>東京都</address>
</address>
<address type='b' id='2'>
<name>鈴木</name>
<zip>222-2222</zip>
<address>埼玉県</address>
</address>
<address type='a' id='3'>
<name>田中</name>
<zip>333-3333</zip>
<address>神奈川県</address>
</address>
</address_book>

以下はサンプルのコード。
require "rexml/document"

#xmlファイルを読み込む
doc = REXML::Document.new(File.new("address_book.xml"))

#xpathで指定した要素を配列として繰り返し処理
doc.elements.each("address_book/address[@type='b']"){|address|
#属性をまとめて取得して出力
#address.attribute("id")で特定の属性を取得することも可能
address.attributes.each{|k, v|
puts k + ":" + v
}
#子要素の名前を指定してテキストを出力
puts address.elements["name"].text
#適当に書き換える
address.elements["name"].text = "遠藤"
}

#ファイルへ出力
#doc.write(STDOUT)で標準出力
doc.write(File.new("address_book.xml", "w"))

[Ruby]テスト用クラス

テスト用クラスの書き方です。

class Calc
def self.add(a, b)
a + b
end
def self.subtract(a, b)
a - b
end
def self.smaller?(a, b)
a < b ? true : false
end
def self.larger?(a, b)
a > b ? true : false
end
end

require "runit/testcase"
require "runit/cui/testrunner"

class CalcTest < RUNIT::TestCase
def test1
assert_equal(10, Calc.add(3, 7), "add error")
assert_equal(10, Calc.subtract(15, 5), "subtract error")
end
def test2
assert(Calc.smaller?(2, 3), "smaller? error")
assert(Calc.larger?(3, 2), "larger? error")
end
end

RUNIT::CUI::TestRunner.run(CalcTest.suite)

面倒ですが活用していきたいものです。

[Ruby]observerで簡易時計

まつもと直伝 プログラミングのオキテ

上記のページでobserverの使い方を読んだので、サンプルのコードを参考に、tkを使用して、簡単な時計を作成してみました。

require "observer"
require "tk"

#更新通知者
class Tick

include Observable

def tick
loop {
now = Time.now
#更新があったことを通知
changed
#監視者にパラメータを渡す(監視側ではupdateが呼ばれる)
notify_observers(now.hour, now.min, now.sec)
#1秒ごとの刻みに補正する
sleep 1.0 - Time.now.usec / 1000000.0
}
end

end

#監視者
class Clock

def initialize
#秒刻みが待ち状態となるため別スレッドで
@t = Thread.new{

Tk.root.title("Clock")
Tk.root.resizable(0, 0)

@label = TkLabel.new(
nil,
:text => "Tick Start!",
:bg => "#CCCC88",
:width => 20,
:height => 5
).pack

Tk.mainloop
}
sleep 1
end

def update(h, m ,s)
unless @t.status
#ウィンドウスレッドが終了した場合は処理終了
exit(0)
else
#時刻表示を更新
@label.text(sprintf("%02d:%02d:%02d", h, m, s))
end
end

end

#更新通知者インスタンス生成
tick = Tick.new
#更新通知者と監視者を関連づける
tick.add_observer(Clock.new)
#更新通知者実行
tick.tick

実行すると・・
簡易時計
プロフィール

jou4

Author:jou4
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。