オブジェクト指向スクリプト言語。サーバプロセスからone-linerまで何でもこなす優れモノらしいが、まだド素人な私が真髄を理解できるようになるにはしばらくかかりそうだ。とりあえず、sedやawkの代替たり得るのか見極めたい。
 
 *link [#o691a3a1]
 -[[オブジェクト指向言語Ruby:http://www.ruby-lang.org/ja/]]
 -[[One Liner:http://www-step.kugi.kyoto-u.ac.jp/~futaana/Briefcase/Ruby/oneLine.html]]
 -[[Ruby (*Unofficial*) Documents:http://ns103.net/~arai/ruby/]]
 
 perlだが
 -[[Perl one liner 集 perl 1行野郎:http://sonic64.hp.infoseek.co.jp/2003-06-04.html]]
 
 *RubyGems [#ke31b997]
 
 パッケージインストーラみたいなもの。ってことを調べるだけでかなりの時間がかかった。公式ページ?すらしばらく見つからなかった(Ruby使ってる人は大抵相応のスキルを有しているので、basicな事柄がなかなか見つからないことが多い)
 
 -[[RubyGems:http://rubyforge.org/frs/?group_id=126]]
 -[[RubyGems Manuals:http://docs.rubygems.org/]]
 
 rubygems-0.8.11.zipを頂いてきて
  ruby setup.rb
 としたら
   Successfully built RubyGem
   Name: sources
   Version: 0.0.1
   File: sources-0.0.1.gem
 などと言われた。無事導入できたようだ。次にrubygems(でインストールしたライブラリ)を使えるように設定する必要があるが、環境変数RUBYOPTにrubygemsを設定するのがお手軽でよい。
 
 
 *win32ole [#d46bace3]
 
 rubyでオートメーションができる。
 -[[Win32OLE 活用法 【第 1 回】 Win32OLE ことはじめ:http://jp.rubyist.net/magazine/?0003-Win32OLE]]
 -[[Win32OLE 製作過程の雑記:http://homepage1.nifty.com/markey/ruby/win32ole/index.html]]
 -[[Win32OLE(0.3.0)リファレンス:http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Win32OLE]]
 -[[COM Meets Ruby:http://arton.hp.infoseek.co.jp/indexj.html]]
 -[[Ruby による Win32OLE プログラミング:http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/ruby-win32ole.html]]
 
 *sqlite [#e7f880ce]
 軽量データベースsqliteをrubyから使用できる。sqliteにはバージョン2と3の系列があるが、新しい方の3を使ってみることにする。
 -[[SQLite/Rubyのプロジェクトページ(入手はこちらから):http://rubyforge.org/projects/sqlite-ruby]]
 -[[SQLite3/Ruby(本家ドキュメント):http://sqlite-ruby.rubyforge.org/sqlite3/]]
 -[[SQLite/Ruby(解説):http://www.gesource.jp/programming/ruby/database/sqlite.html]]
 
 **gemでインストール [#rdcad362]
 windows環境だとインストールがめんどうだなと思っていたが、RubyGemsを使うと何も考えずにインストールできた。きっとlinuxでも同様に簡単にできるのだろう。
  gem install sqlite3-ruby
 とするとインストールされた。windows環境においては、パスの通ってるディレクトリに sqlite3.dll を置いておく必要があった。
 
 **swigのインストール [#z5ab7d9f]
 インストールにあたってはswig(Simplified Wrapper and Interface Generator)が必要となる。
 -[[Simplified Wrapper and Interface Generator:http://www.swig.org/]]
 -[[SWIGのインストール:http://www.02.246.ne.jp/~torutk/cxx/swig/install.html]]
 
 これは、スクリプト言語からC/C++で記述されたライブラリにアクセスするためのラッパーのようなものである。面白そうなのでヒマな時にでもいじってみたい。
 
 手元の環境(Linux)では、swigが入ってなかったりrubyに対応してなかったりしたので、上記総本山から当時の最新版(1.3.29)を拾ってきてHOMEにインストールした。
  ./configure --prefix=$HOME/usr
  make
  make -k check
  make install
 checkの段では結構な量のエラーが出たが、付属ドキュメントには「エラーが出ても諦めずにインストールせよ」とかいう事が書いてあったので気にしないことにした。
 
 **SQLite3/Rubyのインストール [#z492c1b3]
 私の環境で、sqlite3はシステム標準ではなくHOMEにインストールしたので、インストール時にはそれらの場所を指定する必要があった。[[Rubyリファレンスマニュアル - mkmf:http://ruby-lang.org/ja/man/?cmd=view;name=mkmf;em=dir_config#dir_config]]を参考にし、ext/sqlite3_api/extconf.rbにて
  #dir_config( "sqlite3", "/usr/local" )
  dir_config( "sqlite3", "/(path_to_home)/usr" )
 などとした上で、
  ruby setup.rb config --prefix=/(path_to_home)/usr
  ruby setup.rb show # 確認用
  ruby setup.rb setup # エラーは出なかった
  ruby setup.rb install --no-harm # 確認用
  ruby setup.rb install # エラーは出なかった
 とした(あと、rubyが使えるswigにパスが通っていて、システム標準のものよりこちらが優先して実行されるのを確認しておく)。
 
 **テスト [#w6724bba]
 とても安直な記述でテスト。まあうまく動いてるみたいだ。
  $LOAD_PATH << "/(path_to_home)/usr/lib/site_ruby/1.8"
  require 'sqlite3'
  
  db = SQLite3::Database.new( "data.db" )
  
  sql = <<SQL
  create table students (
   name varchar(10),
   grade integer
  );
  SQL
  db.execute(sql)
  
  db.execute( "insert into students values('Taro', 1)" )
  db.execute( "insert into students values('Jaro', 6)" )
  
  db.execute( "select * from students" ) do |row|
    p row
  end
  
  db.close
 
 実行結果は
  ["Taro", "1"]
  ["Jaro", "6"]
 で、これらのデータは data.db に格納されている。
 
 *TMail [#d7b49d1a]
 メールを扱うためのライブラリ。以下OSXに導入した時のメモ
 **インストール [#g8072005]
  ruby setup.rb config --prefix=/Users/myname/usr
  ruby setup.rb show # 確認用
  ruby setup.rb setup # エラーは出なかった
  ruby setup.rb install --no-harm # 確認用
  ruby setup.rb install # エラーは出なかった
 **運用 [#od2d01f2]
 base64.rbでエラーが出た。
  require "tmail/base64.so"
 で、存在しないものをrequireしているが、例外がうまく投げられてきてないみたい。スキルの無い私は、安直にこれらをコメントアウトし、つねにrubyのメソッドを使うようにした。でもパフォーマンスの点でイマイチなのかな?
 
 
 *リファレンス [#l22158cb]
 「困った時に、如何に素早く解りやすい資料が参照できるか」が、あらゆる事のキモだと思う。Rubyとは関係ないが、その点Igor Proは非常に優れている。ここがおろそかなソフトや言語も多いが、これらは全く使う気になれない(参照しにくい上に、トンチキな和訳日本語を見せられた日にゃ発狂しそうになる。原文のドキュメントも同梱してくれればいいのに)。
 
 **非ローカル [#w9e35bef]
 -[[Ruby リファレンスマニュアル:http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB]]
 でOK。最新で、検索も可能
 
 **ローカル [#l04fa623]
 
 でもやっぱりローカルにも資料は欲しい。本だけだとフットワーク的に不利。HTMLのリファレンスマニュアルだと検索するのが面倒だなあと思っていたら、[[ReFe:http://i.loveruby.net/ja/prog/refe.html]]なるものを発見した。話を簡単にするため、リファレンスつきのソースを頂いて
  ruby setup.rb config --prefix=/home/myname/usr # suになれないマシンでセットアップしたい
  ruby setup.rb show # 確認用、必須ではない
  ruby setup.rb setup
  ruby setup.rb install --no-harm # 確認用、必須ではない
  ruby setup.rb install
 とすれば大体の準備は整う。適宜環境変数 RUBYLIB に require されてるモジュールのディレクトリ(私の場合 /home/myhome/usr/lib/site_ruby/1.6)も加えればさらに磐石。
 
 これで一応リファレンスがひけるようになった。リファレンスの内容をアップデートすることも可能で、やり方はREADMEやhttp://www.ruby-lang.org/ja/man/?cmd=view;name=ReFe あたりに記述されているが、実際やってみたらコケた。マニュアルの表記に原因があるみたい。 http://i.loveruby.net/d/20050211.html
 
 まあどうせ最新の機能なんかは使いこなせないので、多少古くとも本体付属のリファレンスで私は充分
 
 
 
 *ド素人メモ [#me7821b9]
 **雑多 [#jfa59e2d]
 -配列の添字に-1を指定すると最後の要素を意味する
 -コマンドラインでスクリプトを書く時にはeオプションを最後の引数として付ける。併せてnオプションで、gets(入力からの一行読込)のwhile文を回しながらコマンドを処理してくれる。pだとさらに、ループ最後に表示もしてくれる。
 -区切りを意味する改行はセミコロンで代用できる。
 -ruby 1.6.8 で、readlinesの引数はStringのみだった(Regexpは無理)。よって正規表現によってレコードを分割したいなら
  A=readlines(nil); B=A[0].split(/.../); ...
 などとする。readlines(nil)で区切りなく読んでくれるみたいなので、その後にsplitで分割
 
 **ライブラリ [#w1aa7f43]
 requireすると適宜ライブラリを一度だけ読みこむ。その探索パスは配列 $LOAD_PATH で、これは -Iオプションと環境変数RUBYLIBなどから決まる。
 
 *ド素人実例 [#m7b1de21]
 恥ずかしいので私以外の人はあんまり見ないで下さい。
 
 **外部コマンド [#l7eaaa07]
 exec、system、forkとか。systemが一番単純?execの後のコードは実行されないらしい。挙動に関しては何もまだ調べていない。
 
 **ハイフン囲み部分除去 [#bfc7b230]
 ハイフンから成る行で挟まれた部分、即ちハイフンの「内側」を削除する(表示しない)テキストフィルタ。但し冒頭から最初のハイフン行までは「外側」とする。
  ruby -e 'd=true; c=/^-+$/; while gets; if not c=~$_; if d; print $_; end; else; d=(not d); end; end;'
 
 **カレントディレクトリ内のファイルを列挙 [#se073955]
 ***正攻法 [#f80f4326]
  Dir.glob('*.bmp') do |f|
    puts f
  end
 でOKだった。以前私が書いた以下の「まわりくどい方法」なんてバカみたいだ
 
 ***まわりくどい方法(メリットなし) [#sdaa3978]
 列挙する条件もあると便利。でもlsとシェルのワイルドカードの方が便利かも
  files = Dir.entries(Dir.pwd).find_all{|x| x =~ /.*\.rb$/}.each do |rubyfile|
    puts rubyfile
  end
 
 **ファイル名に連番つけて拡張子も変える [#h83edc16]
 愚直に
  puts "test.rb".gsub(".rb",sprintf("%03d.html", n))
 文字列の追加は
  <<
 
 cf.
 -[[連番ファイルの桁そろえ:http://fg-180.katamayu.net/?id=50726025212]]
 
 **正規表現のマッチ結果を利用(バックリファレンス) [#n199556f]
 丸カッコで正規表現を囲む
  /(\d)\.rb/ =~ "test5.rb"
  puts $1
 
 
 **一括rename [#n2e05a6a]
 ***その1 [#rabd7532]
 1.bmp, 2.bmp ... とあるファイルの体裁をもうちょっと整える。
 
  linenum = ARGV.shift.to_i
  Dir.foreach(Dir.pwd) do |file|
    if file =~ /\d+\.bmp/
      File.rename(file, file.sub(/(\d+)/){sprintf("line%02d_%04dum", linenum, ($1.to_i-1) * 250)} )
    end
  end
 
 ***その2 [#l5d40844]
 1.jpg, 2.jpg ... というファイル群があった。数字は野球選手の背番号。これを対応する選手名に一括renameしたいと思った。この時
  0 高橋光信
  2 荒木雅博
  ...
 
 みたいな対応表(スペース区切りテキストファイル)を作り、sedで処理して
  0.jpg 高橋光信.jpg
  2.jpg  荒木雅博.jpg
  ...
 とかした後に
  text = open("rename.txt")
  while line = text.gets
    /(.*) (.*)/ =~ line
    File.rename($1,$2)
  end
  text.close
 とした。途中でsedの処理が入る俺はヘタレだ
 
 ***その3 [#c40297a3]
 bashなんかだと、ファイルの操作の際はワイルドカードで結構お手軽に色々とできるので好き。rubyでの処理でこの助けを借りるならば、
  ruby hoge.rb *.bmp
 なんて感じか。hoge.rbは、例えば以下のような感じ。
 
  ARGV.each do |a|
   puts a
  end
 
 
 *GUI [#d5ce1d9d]
 
 **VisualuRuby [#j3caccce]
 Windows環境においては鉄板?のライブラリ。
 -[[]]
 -[[VisualuRuby計画(仮称):http://www.osk.3web.ne.jp/~nyasu/software/vrproject.html]]
 -[[FormDesigner for project VisualuRuby:http://sourceforge.jp/projects/fdvr]]
 -[[VisualuRuby強化計画(仮称):http://www.pen-chan.jp/~vruby/20041107.html]]
 
 **link [#l31d1b1b]
 ***紹介 [#yc37aa05]
 -[[Ruby de GUI:http://jp.rubyist.net/magazine/?0001-RubyGUI]]
 -[[Ruby GUIライブラリ:http://www.gesource.jp/programming/ruby/gui/]]
 -[[RubyGuiLibraries:http://i.loveruby.net/w/RubyGuiLibraries.html]]
 -[[Takahiro's inside out - ツールキット比較:http://takahr.dhis.portside.net/cgi-bin/rwiki.cgi?cmd=view;name=%A5%C4%A1%BC%A5%EB%A5%AD%A5%C3%A5%C8%C8%E6%B3%D3]]
 
 ***各論 [#d1597c93]
 
 -[[Ruby-GNOME2 Project Website:http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi]]
 
 おまけ
 -[[Glade/GTK+ for Windows:http://gladewin32.sourceforge.net/modules/news/]]