オブジェクト指向スクリプト言語。サーバプロセスからone-linerまで何でもこなす優れモノらしいが、まだド素人な私が真髄を理解できるようになるにはしばらくかかりそうだ。とりあえず、sedやawkの代替たり得るのか見極めたい。

link *

perlだが

RubyGems *

パッケージインストーラみたいなもの。ってことを調べるだけでかなりの時間がかかった。公式ページ?すらしばらく見つからなかった(Ruby使ってる人は大抵相応のスキルを有しているので、basicな事柄がなかなか見つからないことが多い)

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 *

rubyでオートメーションができる。

sqlite *

軽量データベースsqliteをrubyから使用できる。sqliteにはバージョン2と3の系列があるが、新しい方の3を使ってみることにする。

gemでインストール *

windows環境だとインストールがめんどうだなと思っていたが、RubyGemsを使うと何も考えずにインストールできた。きっとlinuxでも同様に簡単にできるのだろう。

gem install sqlite3-ruby

とするとインストールされた。windows環境においては、パスの通ってるディレクトリに sqlite3.dll を置いておく必要があった。

swigのインストール *

インストールにあたってはswig(Simplified Wrapper and Interface Generator)が必要となる。

これは、スクリプト言語からC/C++で記述されたライブラリにアクセスするためのラッパーのようなものである。面白そうなのでヒマな時にでもいじってみたい。

手元の環境(Linux)では、swigが入ってなかったりrubyに対応してなかったりしたので、上記総本山から当時の最新版(1.3.29)を拾ってきてHOMEにインストールした。

./configure --prefix=$HOME/usr
make
make -k check
make install

checkの段では結構な量のエラーが出たが、付属ドキュメントには「エラーが出ても諦めずにインストールせよ」とかいう事が書いてあったので気にしないことにした。

SQLite3/Rubyのインストール *

私の環境で、sqlite3はシステム標準ではなくHOMEにインストールしたので、インストール時にはそれらの場所を指定する必要があった。Rubyリファレンスマニュアル - mkmfを参考にし、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にパスが通っていて、システム標準のものよりこちらが優先して実行されるのを確認しておく)。

テスト *

とても安直な記述でテスト。まあうまく動いてるみたいだ。

$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 *

メールを扱うためのライブラリ。以下OSXに導入した時のメモ

インストール *

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 # エラーは出なかった

運用 *

base64.rbでエラーが出た。

require "tmail/base64.so"

で、存在しないものをrequireしているが、例外がうまく投げられてきてないみたい。スキルの無い私は、安直にこれらをコメントアウトし、つねにrubyのメソッドを使うようにした。でもパフォーマンスの点でイマイチなのかな?

リファレンス *

「困った時に、如何に素早く解りやすい資料が参照できるか」が、あらゆる事のキモだと思う。Rubyとは関係ないが、その点Igor Proは非常に優れている。ここがおろそかなソフトや言語も多いが、これらは全く使う気になれない(参照しにくい上に、トンチキな和訳日本語を見せられた日にゃ発狂しそうになる。原文のドキュメントも同梱してくれればいいのに)。

非ローカル *

ローカル *

でもやっぱりローカルにも資料は欲しい。本だけだとフットワーク的に不利。HTMLのリファレンスマニュアルだと検索するのが面倒だなあと思っていたら、ReFeなるものを発見した。話を簡単にするため、リファレンスつきのソースを頂いて

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

まあどうせ最新の機能なんかは使いこなせないので、多少古くとも本体付属のリファレンスで私は充分

ド素人メモ *

雑多 *

ライブラリ *

requireすると適宜ライブラリを一度だけ読みこむ。その探索パスは配列 $LOAD_PATH で、これは -Iオプションと環境変数RUBYLIBなどから決まる。

ド素人実例 *

恥ずかしいので私以外の人はあんまり見ないで下さい。

外部コマンド *

exec、system、forkとか。systemが一番単純?execの後のコードは実行されないらしい。挙動に関しては何もまだ調べていない。

ハイフン囲み部分除去 *

ハイフンから成る行で挟まれた部分、即ちハイフンの「内側」を削除する(表示しない)テキストフィルタ。但し冒頭から最初のハイフン行までは「外側」とする。

ruby -e 'd=true; c=/^-+$/; while gets; if not c=~$_; if d; print $_; end; else; d=(not d); end; end;'

カレントディレクトリ内のファイルを列挙 *

正攻法 *

Dir.glob('*.bmp') do |f|
  puts f
end

でOKだった。以前私が書いた以下の「まわりくどい方法」なんてバカみたいだ

まわりくどい方法(メリットなし) *

列挙する条件もあると便利。でもlsとシェルのワイルドカードの方が便利かも

files = Dir.entries(Dir.pwd).find_all{|x| x =~ /.*\.rb$/}.each do |rubyfile|
  puts rubyfile
end

ファイル名に連番つけて拡張子も変える *

愚直に

puts "test.rb".gsub(".rb",sprintf("%03d.html", n))

文字列の追加は

<<

cf.

正規表現のマッチ結果を利用(バックリファレンス) *

丸カッコで正規表現を囲む

/(\d)\.rb/ =~ "test5.rb"
puts $1

一括rename *

その1 *

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 *

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 *

bashなんかだと、ファイルの操作の際はワイルドカードで結構お手軽に色々とできるので好き。rubyでの処理でこの助けを借りるならば、

ruby hoge.rb *.bmp

なんて感じか。hoge.rbは、例えば以下のような感じ。

ARGV.each do |a|
 puts a
end

GUI *

VisualuRuby *

Windows環境においては鉄板?のライブラリ。

link *

紹介 *

各論 *

おまけ


Last-modified: Wed, 24 May 2006 00:11:58 JST