2008-08-03T10:48:02の更新内容
programming/ruby/tips/index.wiki.txt
current | previous | |
---|---|---|
102,7 | 102,7 | |
-cf. File.flock |
-cf. File.flock |
|
***時刻の取得、文字列から/への変換 |
***時刻の取得、文字列から/への変換 |
|
~ |
require 'time' |
require "time" |
|
|
|
t = Time.parse("2008/1/9 23:30:30") |
t = Time.parse("2008/1/9 23:30:30") |
|
print "#{t}\n" |
print "#{t}\n" |
|
118,7 | 118,7 | |
***CGI |
***CGI |
|
リクエストからパラメータpの値を取得し、HTML形式のテキストをレスポンスとして返すCGIプログラム。 |
リクエストからパラメータpの値を取得し、HTML形式のテキストをレスポンスとして返すCGIプログラム。 |
|
~ |
require 'cgi' |
require "cgi" |
|
|
|
cgi = CGI.new |
cgi = CGI.new |
|
|
|
|
138,7 | 138,7 | |
***RSS |
***RSS |
|
RSS(この例ではhttp://example.com/rss.rdf)を読み込み、linkとtitleをHTMLのアンカタグの形式で出力する。 |
RSS(この例ではhttp://example.com/rss.rdf)を読み込み、linkとtitleをHTMLのアンカタグの形式で出力する。 |
|
~ |
require 'rss/1.0' |
require "rss/1.0" |
require 'net/http' |
require 'net/http' |
|
|
|
|
Net::HTTP.version_1_2 |
Net::HTTP.version_1_2 |
|
158,16 | 158,6 | |
-Net::HTTP.getで指定されたURLのリソースを取得する |
-Net::HTTP.getで指定されたURLのリソースを取得する |
|
-RSS::Parser.parseは引数に渡された文字列をRSSとして解析する |
-RSS::Parser.parseは引数に渡された文字列をRSSとして解析する |
|
+ |
***エコーバックをオフにしてパスワード入力を求める |
|
+ |
system 'stty -echo' |
|
+ |
print 'Password: ' |
|
+ |
password = $stdin.gets.chop |
|
+ |
system 'stty echo' |
|
+ |
print "\n" |
|
+ | ||
+ |
-入力したパスワードが表示されないようにする方法 |
|
+ |
-stty -echoでエコーバックをオフにし、その間に入力されたキャラクタが表示されないようにする |
|
+ | ||
***パスワードの暗号化(crypt) |
***パスワードの暗号化(crypt) |
|
def crypt_passwd( passwd ) |
def crypt_passwd( passwd ) |
|
salt = [ rand(64), rand(64) ].pack( "C*" ).tr( "\x00-\x3f","A-Za-z0-9./" ) |
salt = [ rand(64), rand(64) ].pack( "C*" ).tr( "\x00-\x3f","A-Za-z0-9./" ) |
|
203,7 | 193,7 | |
***メールの送信 |
***メールの送信 |
|
require 'jcode' |
require 'jcode' |
|
require 'base64' |
require 'base64' |
|
~ |
require 'time' |
require "time" |
require 'net/smtp' |
require 'net/smtp' |
|
$KCODE = "UTF8" |
$KCODE = "UTF8" |
|
|
|
|
237,169 | 227,5 | |
送信テストです。 |
送信テストです。 |
|
END_OF_BODY |
END_OF_BODY |
|
+ |
***HTTPリクエスト |
|
+ |
require 'net/http' |
|
+ |
uri = URI.parse("http://example.com/") |
|
+ |
http = Net::HTTP.new(uri.host, 80) |
|
+ |
req = Net::HTTP::Get.new(uri.path) |
|
+ |
res = http.request(req) |
|
+ |
print res.body |
|
+ |
または |
|
+ |
require 'net/http' |
|
+ |
uri = URI.parse("http://example.com/") |
|
+ |
http = Net::HTTP.new(uri.host, 80) |
|
+ |
res = http.get(uri.path) |
|
+ |
print res.body |
|
+ | ||
+ |
-GET以外にもHTTPリクエストメソッドを送信することが出来る(以下リクエストの抜粋) |
|
+ |
--Net::HTTP.head |
|
+ |
--Net::HTTP.post |
|
+ |
--Net::HTTP.put |
|
+ |
--Net::HTTP.delete |
|
+ |
--Net::HTTP.copy |
|
+ |
--Net::HTTP.options |
|
+ | ||
+ |
***open-uriによるページ取得 |
|
+ |
require 'open-uri' |
|
+ |
|
|
+ |
resp = open('http://example.com/") |
|
+ |
resp.each_line do |line| |
|
+ |
print line |
|
+ |
end |
|
+ |
もしくは |
|
+ |
open('http://example.com/') do |resp| |
|
+ |
resp.each_line do |line| |
|
+ |
print line |
|
+ |
end |
|
+ |
end |
|
+ |
User-Agent等のヘッダを追加する場合は次のようにする。 |
|
+ |
resp = open('http://example.com/', |
|
+ |
'User-Agent' => 'Mozilla/5.0', |
|
+ |
'If-Modified-Since' => last_modified.httpdate) |
|
+ |
取得したページの情報は次のようにして参照できる。 |
|
+ |
print resp.status |
|
+ |
print resp.last_modified |
|
+ |
print resp.content_type |
|
+ |
print resp.content_encoding |
|
+ |
print resp.charset |
|
+ |
失敗した場合はOpenURI::HTTPErrorがスローされる。 |
|
+ |
begin |
|
+ |
resp = open(uri) |
|
+ |
rescue OpenURI::HTTPError => e |
|
+ |
print e |
|
+ |
end |
|
+ | ||
+ |
***WSSE認証ヘッダ(X-WSSE)の生成 |
|
+ |
require 'time' |
|
+ |
require 'base64' |
|
+ |
require 'digest/sha1' |
|
+ |
|
|
+ |
def generate_wsse(username, password) |
|
+ |
nonce = '' |
|
+ |
20.times do |
|
+ |
nonce << rand(256).chr |
|
+ |
end |
|
+ |
|
|
+ |
created = Time.now.iso8601 |
|
+ |
|
|
+ |
return sprintf("UsernameToken Username=\"%s\", PasswordDigest=\"%s\", Nonce=\"%s\", Created=\"%s\"", |
|
+ |
username, |
|
+ |
Base64.encode64(Digest::SHA1.digest(nonce + created + password)).chomp, |
|
+ |
Base64.encode64(nonce).chomp, |
|
+ |
created) |
|
+ |
end |
|
+ | ||
+ |
***プロセスのデーモン化 |
|
+ |
Process.daemonを使う場合。 |
|
+ |
Process.daemon { |
|
+ |
... |
|
+ |
} |
|
+ | ||
+ |
Process.forkを使う場合。 |
|
+ |
Process.fork{ |
|
+ |
Process.setsid |
|
+ |
Dir.chdir('/') |
|
+ |
trap("SIGINT"){ exit! 0 } |
|
+ |
trap("SIGTERM"){ exit! 0 } |
|
+ |
trap("SIGHUP"){ exit! 0 } |
|
+ |
File.open('/dev/null') {|f| |
|
+ |
STDIN.reopen f |
|
+ |
STDOUT.reopen f |
|
+ |
STDERR.reopen f |
|
+ |
} |
|
+ |
... |
|
+ |
} |
|
+ |
exit! 0 |
|
+ | ||
+ |
***Loggerによるログ出力 |
|
+ |
logger = Logger.new($DEBUG ? STDERR : 'test.log') |
|
+ |
logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN |
|
+ |
|
|
+ |
logger.debug('debug') |
|
+ |
logger.info('information') |
|
+ |
logger.warn('warning') |
|
+ |
logger.error('error') |
|
+ |
logger.fatal('fatal') |
|
+ | ||
+ |
-ログレベルと記録される内容 |
|
+ |
--DEBUG: fatal, error, warn, info, debug |
|
+ |
--INFO: fatal, error, warn, info |
|
+ |
--WARN: fatal, error, warn |
|
+ |
--ERROR: fatal, error |
|
+ |
--FATAL: fatal |
|
+ | ||
+ |
**WWW::Mechanize |
|
+ |
WWW::Mechanizeの使用例。 |
|
+ | ||
+ |
***ページの取得 |
|
+ |
require 'rubygems' |
|
+ |
require 'mechanize' |
|
+ |
|
|
+ |
agent = WWW::Mechanize.new |
|
+ |
page = agent.get('http://example.com/index.html') |
|
+ | ||
+ |
***Basic認証/Digest認証 |
|
+ |
Basic認証/Digest認証が必要なページでは、あらかじめauthメソッドで認証に用いるユーザ名・パスワードを指定しておくと、自動的に認証に必要なヘッダの送信が行われる。 |
|
+ |
agent = WWW::Mechanize.new |
|
+ |
agent.auth('user', 'pass') |
|
+ |
page = agent.get('http://example.com/members/index.html') |
|
+ | ||
+ |
***UAの設定 |
|
+ |
agent = WWW::Mechanize.new |
|
+ |
agent.user_agent_alias = 'Linux Mozilla' |
|
+ | ||
+ |
***リンクをたどる |
|
+ |
開いたページのコンテンツから「次のページ」のテキストを含むaタグを探し、そのaタグのhrefで指定されているURLを開く例。 |
|
+ |
page = agent.get('http://example.com/page0.html') |
|
+ |
10.times do |page| |
|
+ |
link_next = page.links.text("次のページ") |
|
+ |
page = agent.get(link_next.href) |
|
+ |
end |
|
+ | ||
+ |
***フォームへの入力と送信 |
|
+ |
開いたページのフォームに値を入力し、その内容を送信する例。 |
|
+ |
page = agent.get('http://example.com/comment.cgi') |
|
+ |
form = page.forms.name('comment').first # name属性が'comment'のformを取得 |
|
+ |
form['name'] = 'ななし' # name属性が'name'の欄に'ななし'と入力 |
|
+ |
form['mail'] = 'sage' |
|
+ |
form['text'] = 'テステス' |
|
+ |
agent.submit(form) # 取得したformの送信ボタンを押す(formの内容を送信する) |
|
+ | ||
+ |
***複数のsubmitボタンがある場合 |
|
+ |
formに複数のsubmitボタンがある場合は、buttonを指定してsubmitメソッドを呼ぶ。 |
|
+ |
if mode == 'delete' |
|
+ |
button = form.buttons.name('delete').first |
|
+ |
else |
|
+ |
button = form.buttons.name('edit').first |
|
+ |
end |
|
+ |
form.submit(button) |
|
+ | ||
+ |
***ファイルのアップロード |
|
+ |
page = agent.get('http://example.com/upload.cgi') |
|
+ |
form = page.forms[0] |
|
+ |
form.file_uploads[0].file_name = './test.zip' |
|
+ |
agent.submit(form) |
|
+ | ||
**文書情報 |
**文書情報 |
|
+ |
-2008-08-03 追記 |
|
-2008-01-10 初版公開 |
-2008-01-10 初版公開 |