2011年09月19日

RubyでGETのHTTPリクエストを送る

言語: Ruby 1.8.6
サーバ: Apache 2.2.17
OS: Mac OS X 10.5.6

ブラウザじゃなくて、スクリプトでGETのHTTPリクエスト送るときってあります。

そんな場合のRubyでのやり方です。

やり方はいろいろあるようなのですが、わかりやすいと思われる方法を紹介します。

以下サンプルスクリプトです。
[クライアント側のスクリプト]
#!/usr/bin/ruby

require 'net/http'

request = Net::HTTP::Get.new('/ruby_response.php?key1=100&key2=200')

response = Net::HTTP.start('localhost', 80) {|http|
    http.request(request)
}

puts response
なんとなく雰囲気は掴めると思います。
Net::HTTP::Getクラスのnewメソッドでリクエストを生成しています。この引数にはドメイン名以下のパスを指定します。GETリクエストの場合、リクエストパラメータもここに含めることができます。
Net::HTTPのstartメソッドで通信します。リクエスト送信はブロック内で行います。requestメソッドです。
このブロックはブロックの値を返すので、レスポンスがそのまま取得できます。
最後にレスポンスを表示しています。

[サーバ側のスクリプト]
<?php var_dump($_GET); ?>
GETパラメータをダンプして表示しています。

[実行結果]
#<Net::HTTPOK:0x44124>
array(2) {
  ["key1"]=>
  string(3) "100"
  ["key2"]=>
  string(3) "200"
}
成功すると、Net::HTTPOKオブジェクトが返ります。いわゆる200 OK ってやつですね。
GETパラメータもしっかり渡されていることが判ります。

2011年01月11日

Rubyでマルチバイト文字列の長さを取得する

言語:Ruby

Rubyでマルチバイト文字列の長さを取得する方法を説明します。
半角文字ならば、Stringクラスのsizeメソッドやlengthメソッドを呼べば良いのですが、これらのメソッドはバイト数を返すのでマルチバイト文字列の場合は文字数と一致しません。

そこで、マルチバイト文字列の場合は、まず、文字列を1文字ずつに分割して配列に格納し、その配列の要素数を取得するという方法をとります。

次は、文字コードがUTF-8の場合のマルチバイト文字列の長さを取得するRubyスクリプトです。
p "abc".split(//u).size
p "あいう".split(//u).size

splitメソッドで文字列を1文字ずつに分割して、sizeメソッドでその配列の要素数を取得しています。
splitメソッドの引数//uは文字列を1文字ずつに分割する正規表現です。文字コードがUTF-8の場合は//の後にuを置きます。文字コードがEUC-JPなら//eとなり、Shift_JISなら//sとなります。
このスクリプトを実行すると、以下のような結果になります。
3
3

半角文字でも、マルチバイト文字でも、正しい文字数が取得できていることがわかります。

2010年10月20日

Rubyの標準入出力

----------------------------------------------------------------------------------
ブログを見て頂いてありがとうございます。
このブログ以外にWebサイトを公開しました。
内容はこのブログの流用が多いですが、今後はもっと体系的でわかりやすくする予定です。
もちろん、このブログも続けて行きます。
----------------------------------------------------------------------------------

言語:Ruby

今回はRubyの標準入出力です。標準入出力には標準入力・標準出力・標準エラー出力があります。C言語にも標準入出力がありましたが、Rubyのそれは少しことなります。
オブジェクト指向言語のRubyには、IOオブジェクトというものがあり、これらのオブジェクトがレシーバとなっていろいろなメソッドを呼び出す形式になっています。
それでは、順番に説明します。

1. 標準入力


主にキーボードからの入力を標準入力といいます。標準入力を扱うオブジェクトは、組み込み定数のSTDINとグローバル変数の$stdinです。これらのオブジェクトにはgetsメソッドがあり、入力した文字を返します。
以下は使用例です。
# STDINを使った標準入力
print(">")
str = STDIN.gets

puts("Your input is #{str}")

# $stdinを使った標準入力
print(">")
str = $stdin.gets

puts("Your input is #{str}")

>の後に文字を入力してEnterを押すと、入力した文字が変数strに格納されて、putsメソッドでコンソールに出力されます。

2. 標準出力


通常、標準出力はコンソールへの出力になります。標準出力は組み込み定数のSTDOUTとグローバル変数の$stdoutを用いて行います。これらのオブジェクトのputsやprintといったメソッドを使って、出力を行います。
以下は使用例です。
# STDOUTを使った標準出力
STDOUT.puts("STDOUT's output")

# $stdoutを使った標準出力
$stdout.puts("$stdout's output")

コンソールには
STDOUT's output
$stdout's output

と出力されます。

3. 標準エラー出力


コンソールへの出力には、標準エラー出力というものもあります。主に、プログラムにエラーメッセージを吐かせる場合に使います。
使用例は以下のようになります。
# STDERRを使った標準エラー出力
STDERR.puts("STDERR's output")

# $stderrを使った標準エラー出力
$stderr.puts("$stderr's output")

実行すると
STDERR's output
$stderr's output

と表示されます。

4. 出力のリダイレクト


標準出力と標準エラー出力はどちらもコンソールに出力されてしまい違いがわかりにくいので、出力をリダイレクトさせて、それぞれの出力を確認します。
以下のスクリプトをリダイレクトでファイルに出力させます。
ファイル名はstdio.rbにしました。
# STDOUTを使った標準出力
STDOUT.puts("STDOUT's output")

# $stdoutを使った標準出力
$stdout.puts("$stdout's output")

# STDERRを使った標準エラー出力
STDERR.puts("STDERR's output")

# $stderrを使った標準エラー出力
$stderr.puts("$stderr's output")


4-1. 標準出力をリダイレクトしてファイルへ出力
ターミナルから次のように実行します。
% ruby stdio.rb > stdout.txt

標準出力はコンソールに出力されず、stdout.txtに書き出されます。

4-2. 標準エラー出力をリダイレクトしてファイルへ出力
ターミナルから次のように実行します。
% ruby stdio.rb 2> stderr.txt

標準エラー出力はコンソールに出力されず、stderr.txtに書き出されます。

2010年10月15日

Rubyのハッシュ [その1]

言語:Ruby

ハッシュとは、キーと値をペアで保持することができるオブジェクトです。配列よりも便利な場合があります。

1. Hashクラスの生成


ハッシュを作るには、いくつかの方法があります。
{}を使ったり、Hash.newを使う方法です。以下は使用例です。
hash1 = {"Sato" => 100, "Tanaka" => 200}
hash2 = Hash.new

Hash.newメソッドには、引数を渡すこともできます。引数は登録されてないキーで参照したときの値になります。
hash3 = Hash.new("not key")
p hash3["aaa"]

"aaa"という登録されていないキーを指定したので、hash3["aaa"]は"not_key"を返します。

また、引数を指定しないで、登録されていないキーを指定するとnilが返ります。
hash4 = Hash.new
p hash4["aaa"]

hash4["aaa"]はnilを返します。

2. キーと値の設定・参照


ハッシュにキーと値を設定するには、[ ]storeメソッドを使います。
オブジェクト[キー] =
オブジェクト.store(キー, )
です。以下は使用例です。
hash5 = Hash.new

hash5["Sato"] = 300
hash5.store("Tanaka", 500)

p hash5["Sato"]
p hash5["Tanaka"]

実行すると、
300
500

と表示されます。

ハッシュの値を参照するには、[ ]fetchメソッドを使います。
fetchメソッドは登録されていないキーを指定すると、例外を発生させます。以下は使用例です。
hash6 = {"Sato" => 500, "Tanaka" => 1000}

p hash6["Sato"]
p hash6["Saito"]

p hash6.fetch("Tanaka")
p hash6.fetch("Suzuki")

実行すると以下のようになります。
500
nil
1000
hash.rb:6:in `fetch': key not found (IndexError)

hash6.fetch("Suzuki")で、例外(IndexError)が発生しているのが判ります。

3. キーを配列で取得する


登録されているキーを配列で取得するにはkeysメソッドを使います。
hash7 = {"Sato" => 500, "Tanaka" => 1000, "Suzuki" => 2000}

p hash7.keys

実行すると以下にようになります。
["Tanaka", "Suzuki", "Sato"]

キーが配列で取得できているのが判ります。

4. 値を配列で取得する


値を配列で取得するメソッドも用意されています。valuesメソッドです。
hash8 = {"Sato" => 500, "Tanaka" => 1000, "Suzuki" => 2000}

p hash8.values

実行すると以下のようになります。
[1000, 2000, 500]

値が配列で取り出されています。

ハッシュにはまだまだいろいろな機能があるので、今後記事にしていく予定です。

2010年10月12日

Rubyのeachメソッド

言語:Ruby

Rubyには、eachメソッドという繰り返し処理を行うメソッドがあります。配列やハッシュやファイル読み込みに対して効果を発揮します。

1. eachの基本構文


eachメソッドの基本構文は以下のようになります。
オブジェクト.each { |変数|
    処理
}

オブジェクトの部分に配列やハッシュやファイルオブジェクトが対応します。

2. 配列でeachメソッドを使う


配列での使用例は以下のようになります。
names = ["Sato", "Tanaka", "Suzuki"]

names.each { |name|
    print("#{name}\n")
}

結果は
Sato
Tanaka
Suzuki

と表示されます。

3. ハッシュでeachメソッドを使う


次はハッシュの例です。
fruits = {"Apple"=>100, "Banana"=>50, "Orange"=> 120}

fruits.each { |name, price|
    print("#{name}:#{price}\n")
}

結果は
Orange:120
Apple:100
Banana:50

と表示されます。

4. ファイル読み込みでeachメソッドを使う


ファイルを読み込んで1行ずつ処理する場合にもeachメソッドは便利です。
以下の内容のファイルを読み込んで表示します。ファイル名はtest.txtです。
aaa
bbb
ccc


使用例は以下のようになります。
f = File::open("test.txt", "r")

f.each { |line|
    print("#{line}")
}

f.close()

結果は
aaa
bbb
ccc

と表示されます。