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 初版公開