ユーザ用ツール

サイト用ツール


lang:ruby

Ruby

Gems

gem 自体の更新

gem update --system 

インストール

gem install <gem名> 

インストール済み gem の更新

gem update 

依存関係の表示

gem dependency <名前> 

(例) rails 2.1.2 が依存する gem を表示

gem dependency rails -v 2.1.2 

-v を省略した場合は最新のインストール済み rails が依存する gem が表示されます。

デバッグ用

 
sudo gem install ruby-debug 
sudo gem install ruby-debug-ide 

NetBeans 6.5 では ruby-debug-ide が 0.3.x のみ認識するため、バージョンを指定。

 
sudo gem install ruby-debug 
sudo gem install ruby-debug-ide -v 0.3.3 

Network

メール

smtps(smtp + ssl)でメール送信

  1. gem で tlsmail をインストール

gem install tlsmail

  1. メール送信サンプル - メール1通送信
 
Net::SMTP.enable_tls( OpenSSL::SSL::VERIFY_NONE ) 
Net::SMTP.start('smtp.gmail.com', 587, 'localhost', 'foo@bar.xxx', 'password', :plain) { |smtp| 
  smtp.send_mail <<EOF, 'foo@bar.xxx', 'bar@foo.xxx' 
From: foo@bar.xxx 
To: bar@foo.xxx 
Subject: hello 

hello world 
EOF 
} 
  1. メール送信サンプル - メール連続送信
 
Net::SMTP.enable_tls( OpenSSL::SSL::VERIFY_NONE ) 
smtp = Net::SMTP.start('smtp.gmail.com', 587, 'localhost', 'foo@bar.xxx', 'password', :plain) 
contents.each { |content| 
  smtp.ready( 'foo@bar.xxx', 'bar@foo.xxx' ) { |f| 
    f.puts 'From: foo@bar.xxx' 
    f.puts 'To: bar@foo.xxx' 
    f.puts 'Subject: hello' 
    f.puts 
    f.puts content 
  } 
} 

smtp.finish 

ruby 1.9 からは tlsmail を入れなくても、標準で使えるようになるらしい。

(参考) http://d.hatena.ne.jp/zorio/20070318/1174226862

HTTP

シンプルなパターン

 
require 'net/http' 

res = Net::HTTP.get( 'www.xxx.dom', '/index.html' ) 
puts res.body 

通常のパターン

 
require 'net/http' 
require 'uri' 

Net::HTTP.version_1_2 

uri = URI.parse( 'http://host/path?query=parameter' ) 
Net::HTTP.start( uri.host, uri.port ) {|http| 
  res = http.get( uri.path + '?' + uri.query ) 
  puts res.body 
} 

HTTPヘッダを指定

 
#!/usr/bin/ruby -Ku 

require 'net/http' 
Net::HTTP.version_1_2 
require 'uri' 

uri = URI.parse( 'http://host/path?query=parameter' ) 

http = Net::HTTP.new( uri.host, uri.port ) 
http.start { 
  req = Net::HTTP::Get.new( uri.path + "?" + uri.query ) 
  req['User-Agent'] = "ruby script" 
   
  res = http.request( req ) 
  puts res.body 
} 

SSL 接続

 
#!/usr/bin/ruby -Ku 

require 'net/http' 
require 'net/https' 
Net::HTTP.version_1_2 
require 'uri' 

uri = URI.parse( 'http://host/path?query=parameter' ) 

http = Net::HTTP.new( uri.host, uri.port ) 
http.use_ssl = true 
http.ca_file = "/opt/local/lib/ruby1.9/gems/1.9.1/gems/rubygems-update-1.3.5/test/public_cert.pem"; 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
http.verify_depth = 5 

http.start { 
  req = Net::HTTP::Get.new( uri.path + "?" + uri.query ) 
  req['User-Agent'] = "ruby script" 
   
  res = http.request( req ) 
  puts res.body 
} 
  • 証明書チェックを行わない場合は、次の行を記述する。

http.verify_mode = nil

テキストデータを Post

 
#!/usr/bin/ruby -Ku 

require 'net/http' 
require 'uri' 

uri = URI.parse( 'http://somedomain/path/script' ) 
Net::HTTP.start( uri.host, uri.port ) { |http| 
  header = { 
    'User-Agent' => "ruby script" 
  } 

  body = <<CONTENTS 
key=value 
CONTENTS 
   
  res = http.post( uri.path, body, header ) 
  print res.body 
} 

URL Encoding された文字列を Post

Net::HTTP::Post を使う

 
#!/usr/bin/ruby -Ku 

require 'net/http' 
require 'uri' 

uri = URI.parse( 'http://somedomain/path/script ) 
Net::HTTP.start( uri.host, uri.port ) { |http| 
  req = Net::HTTP::Post.new( uri.path ) 
  req['User-Agent'] = "ruby script" 
  req.set_form_data( {:id => "1", :name => "hoge"}, "&" ) 
   
  res = http.request( req ) 
  # HTTP Status 
  print "HTTP "; 
  puts res.http_version 
  print res.code 
  print " " 
  puts res.message 
  # HTTP Header 
  puts res["Content-Type"]  
  p res.body 
  puts res.body 
} 

Tips

vim.ruby

2桁でのインデント設定

au BufNewFile,BufRead *.rb set tabstop=2 shiftwidth=2 

を記述。

  • Unix系 vim の場合

~/.vimrc

  • Windows用 Kaoriya版 vim の場合

ホームディレクトリの _vimrc

I/O

  • 標準入力から読み込む
 
while data = gets 
  # 行単位処理 
end 

Windows でクリップボードからデータを取得

require 'win32/clipboard' 
clipboardtext = Win32::Clipboard.data 

インストール

次の順に gem install

  1. windows-api
  2. windows-pr
  3. win32-api
  4. win32-clipboard

rubyforge から DL して、ローカル(gem install -l)からインストールする場合は次の URL から。

http://rubyforge.org/frs/?group_id=85&release_id=25233

rgmagick

次の URL から環境に合わてモジュールをダウンロード

http://rubyforge.org/frs/?group_id=12&release_id=30561

windows

  • rmagick-win32 の RMagick-2.9.0-ImageMagick-6.4.8-6-Q8.zip をダウンロード
  • ダウンロードした zip ファイルを展開
  • ImageMagick-6.4.8-6-Q8-windows-dll.exe を実行
  • gem install rmagick -l でローカルファイル rmagick-2.9.0-x86-mswin32.gem をインストール

mac

  • sudo port install ImageMagick
  • rmagick-osx-installer の rm_install-1.2.1.zip をダウンロード

Trouble Shooting

文法

ruby 1.8.7 で次のエラーが発生。

 
undefined method `length' for #<Enumerable::Enumerator:0x46b0680> 

1.8.7 から String#chars が Enumerable::Enumerator を返すようになったため。

String#chars のかわりに、String#mb_charsを使うことで回避可能。

Rails 1.2.6 の ActionView の truncate メソッドも内部で呼び出しているようなので、その場合は ruby 1.8.6 を使用。

gem

gem 1.2.0 => 1.3.1 への update に失敗する(Windows)

gem update --system

を実行すると、lib\ruby\gem\1.8\cache に rubygems-update-1.3.1.gem がダウンロードされますが、

 
c:\>gem update --system 
Updating RubyGems 
Updating rubygems-update 
Successfully installed rubygems-update-1.3.1 
ERROR:  While executing gem ... (NameError) 
 undefined local variable or method `remote_gemspecs' for #<Gem::Commands::UpdateCommand:0x2c77dcc> 

というエラーが発生。

そこで続けて update_rubygems を実行。

 
c:\>update_rubygems 
Installing RubyGems 1.3.1 
mkdir -p C:/bin/ruby/lib/ruby/site_ruby/1.8 
mkdir -p C:/bin/ruby/bin 
(中略) 
Installing rubygems-1.3.1 rdoc into C:/bin/ruby/lib/ruby/gems/1.8/doc/rubygems-1.3.1/rdoc 
(中略) 
RubyGems installed the following executables: 
        C:/bin/ruby/bin/gem 

If `gem` was installed by a previous RubyGems installation, you may need 
to remove it by hand. 

gem のバージョンを確認すると

 
c:\>gem -v 
1.3.1 

2009.02.13 補足

次の手順が正しいです

 
gem install rubygems-update 
update_rubygems 

ActiveScriptRuby

ActiveScriptRuby を使っている場合は gem.bat が

@“ruby.exe”<color red>“</color> ”%~dpn0“ %*

とタブルクォートが余分についてしまうので、次のように削除しておきましょう。

@"ruby.exe" "%~dpn0" %* 

Windows で gem install sqlite3-ruby を実行するとエラーが発生

次のエラーが発生

 
Building native extensions.  This could take a while... 
ERROR:  Error installing sqlite3-ruby: 
        ERROR: Failed to build gem native extension. 

"c:/Program Files/ruby-1.8/bin/ruby.exe" extconf.rb install sqlite3-ruby 
checking for fdatasync() in rt.lib... no 
checking for sqlite3.h... no 

nmake 
'nmake' は、内部コマンドまたは外部コマンド、 
操作可能なプログラムまたはバッチ ファイルとして認識されていません。 

sqlite-ruby 1.2.4 からは DLL は配布されず、ソースのみが配布されるようになったため、1.2.3 を指定してインストール。

gem install sqlite3-ruby -v 1.2.3 

存在する gem に対する require がエラーになる

環境変数を設定する

export RUBYOPT=rubygems 
set RUBYOPT=rubygems 

またはプログラムの先頭で rubygems を require

require 'rubygems' 

するとうまくいくらしい。

Windows環境で mysql のインストールに失敗する

Windows 環境で

gem install mysql 

を実行すると、

 
ERROR:  While generating documentation for mysql-2.7.3-x86-mswin32 
... MESSAGE:   Unhandled special: Special: type=17, text="<!-- $Id: README.html, v 1.20 2006-12-20 05:31:52 tommy Exp $ -->" 

というエラーが発生。

ドキュメントは生成されていないが、mysql 用ライブラリのインストールは成功している。

エラーメッセージが気になる場合は、ドキュメントを生成しないオプションを追加。

gem install mysql --no-rdoc --no-ri 
lang/ruby.txt · 最終更新: 2016/01/27 09:47 (外部編集)