お薦め ページ


メニュー

ハワイ島 遊覧飛行ツアー

ハワイ島 B&B・ホテル

ハワイ島 不動産情報

ハワイ島 情報・観光ガイド

ブログ(Blog)

その他

関連サイト

: カテゴリー :

Ruby

2008年2月 7日

RedmineのWikiページの文法の詳細「A Textile Reference」

redMineのウィキの文法について解説してある Redmine.org の 「Wiki formatting」 の「Text formatting」の項目を読んでみると、 「A Textile Reference」 を参照するように説明されている。

この 「A Textile Reference」 ページでは、非常にたくさんの redMineの Wiki文法が サンプル付きで解説されている。 また、この Textile を Rubyでのモジュールとして実装したモノを 「 RedCloth 」 と言い、 Python 用を「PyTextile」と言うらしい。 ということは、 redMine では、 Ruby のモジュールである RedCloth を利用して Wikiを実現している、ということであろう。

A Textile Reference」 ページには、 「 Quick Reference 」 があるので、これが非常に参考になる。

さらにもっと詳しいマニュアルとしては、 「 RedCloth 」 サイトにある 「 Official Textile Reference Manual for RedCloth 4 」 が タグの一つひとつについて詳しく解説している。

【参考リンク】

カテゴリー: Redmine , Ruby     22:32 | コメント (0) | トラックバック (0)

2008年1月26日

FreeBSD上のRubyからの「no such file to load -- iconv」というエラーメッセージ

redmineのインストール中、
% rake db:migrate RAILS_ENV="production"
というコマンドを実行すると、
(in /usr/home/redmine/redmine-0.6.4)
rake aborted!
no such file to load -- iconv
/usr/home/redmine/redmine-0.6.4/Rakefile:10
(See full trace by running task with --trace)
というエラーを吐いて止まってしまった。 どうも「iconv」が見つからないっぽいエラーだ。

いろいろとググってみると、 とた日記「野良 port mobileimap-2.1_1」
ruby を FreeBSD の port からインストールした場合は iconv モジュール は別途 converters/ruby-iconv から インストールする必要があります。 lang/ruby18/pkg-message を見れば分かることだったのに。。。
という記述が見つかった。 確認のために /usr/ports/lang/ruby18 の pkg-message を見てみると、
====
Note that some of the standard libraries are provided as separate
ports since they require extra dependencies:

        converters/ruby-iconv   iconv module

        databases/ruby-gdbm:    GDBM module

        x11-toolkits/ruby-tk:   Tcl/Tk modules
        japanese/ruby-tk:       Tcl/Tk modules for Japanized Tcl/Tk

        lang/ruby-mode.el:      Emacs lisp modules

Install them as occasion demands.
====
このように、確かに iconv module は 別にインストールするように記述されている。

そこで早速、converters/ruby-iconv をポートすることにする。
% su
# cd /usr/ports/converters/ruby-iconv
# make install
この時のログが
===>  Vulnerability check disabled, database not found
===>  Extracting for ruby18-iconv-1.8.6.111,1
===>   ruby18-iconv-1.8.6.111,1 depends on file: /usr/local/bin/ruby18 - found
/bin/mkdir -p /usr/ports/converters/ruby-iconv/work
/bin/ln -sf /usr/ports/lang/ruby18/work/iconv /usr/ports/converters/ruby-iconv/work/
===>  Patching for ruby18-iconv-1.8.6.111,1
===>   ruby18-iconv-1.8.6.111,1 depends on file: /usr/local/bin/ruby18 - found
===>   ruby18-iconv-1.8.6.111,1 depends on file: /nonexistent - not found
===>    Verifying patch for /nonexistent in /usr/ports/lang/ruby18
===>   Returning to build of ruby18-iconv-1.8.6.111,1
===>   ruby18-iconv-1.8.6.111,1 depends on file: /usr/local/bin/ruby18 - found
===>   ruby18-iconv-1.8.6.111,1 depends on shared library: iconv.3 - found
===>  Configuring for ruby18-iconv-1.8.6.111,1
===>  Running extconf.rb to configure
checking for iconv() in iconv.h... no
checking for iconv() in -liconv... yes
checking for const of iconv() 2nd argument... yes
creating Makefile
===>  Building for ruby18-iconv-1.8.6.111,1
cc -I. -I. -I/usr/local/lib/ruby/1.8/i386-freebsd6 -I. -DICONV_INPTR_CONST -I/usr/local/include -fPIC -O2 -fno-strict-aliasing -pipe    -fPIC -c iconv.c
cc -shared -o iconv.so iconv.o -L'.' -L'/usr/local/lib' -Wl,-R'/usr/local/lib' -L'/usr/local/lib' -Wl,-R'/usr/local/lib' -L.  -rdynamic  -Wl,-soname,iconv.so  -Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -lruby18 -liconv  -lcrypt -lm  -rpath=/usr/lib:/usr/local/lib -pthread  -lc
===>  Installing for ruby18-iconv-1.8.6.111,1
===>   ruby18-iconv-1.8.6.111,1 depends on file: /usr/local/bin/ruby18 - found
===>   Generating temporary packing list
===>  Checking if converters/ruby-iconv already installed
/usr/bin/install -c -o root -g wheel -m 0755 iconv.so /usr/local/lib/ruby/1.8/i386-freebsd6
===>   Registering installation for ruby18-iconv-1.8.6.111,1
これによると、/usr/local/lib/ruby/1.8/i386-freebsd6 ディレクトリに iconv.so がインストールされているようだ。

【参考リンク】

カテゴリー: FreeBSD , Redmine , Ruby     22:45 | コメント (0) | トラックバック (0)

2007年5月24日

「 LibIDN Ruby Bindings 」のテスト

前回のブログで 「LibIDN Ruby Bindings」 をインストールするところまできたので、 それでは実際に このライブラリが動作するのかどうか、 テスト用のRubyスクリプトを書いて確認してみる。

「国際化ドメイン名 IDN(Internationalized Domain Name) 」において 最も基本的な変換をテストしてみる。
require 'idn'
include IDN

idnAscii = Idna.toASCII("日本語ドメイン名example.jp")
puts 'Idna.toASCII: ' + idnAscii

idnUnicode = Idna.toUnicode('xn--example-6q4fyliikhk162btq3b2zd4y2o.jp')
puts 'Idna.toUnicode: ' + idnUnicode

このスクリプトを見てすぐに わかるとおり、 Idna.toASCII というメッソドが UTF-8 のユニコードのドメイン名から ASCII文字列に変換するメソッド。 そして、Idna.toUnicode というメッソドが その逆変換である。

注意点として、このスクリプト内ではユニコード(UTF-8)を使っているので ファイルを保存する際には、以前のブログ 『ruby での「 Invalid char `\357' in expression 」エラーメッセージ』 でレポートしたとおり、UTF-8N を指定して保存しておくこと。

このスクリプトの実際の実行結果は
% ruby -rubygems ./IDNtest.rb
Idna.toASCII: xn--example-6q4fyliikhk162btq3b2zd4y2o.jp
Idna.toUnicode: 日本語ドメイン名example.jp
となる。

昨日のブログの通り、この「 LibIDN Ruby Bindings 」のインストールには RubyGemsを採用している。 しかし、上記スクリプトのソース・コード内に 「 require 'rubygems' 」の1行を入れていないので、 変わりにrubyの実行時に 「-rubygems」オプション をつけて対応した。

それから Punycode(ピュニコード)のエンコードとデコード のテスト・スクリプト。
require 'idn'
include IDN

punyAscii = Punycode.encode("日本語ドメイン名example")
puts 'Punycode.encode: ' + punyAscii

punyUnicode = Punycode.decode("example-6q4fyliikhk162btq3b2zd4y2o")
puts 'Punycode.decode: ' + punyUnicode
これも 見たとおり、Punycode.encode と Punycode.decode を呼ぶだけ。 その実行結果は
Punycode.encode: example-6q4fyliikhk162btq3b2zd4y2o
Punycode.decode: 日本語ドメイン名example
となる。

【参考リンク】

カテゴリー: DNS・URL・URI , Ruby     22:23 | コメント (0) | トラックバック (0)

2007年5月23日

「 LibIDN Ruby Bindings 」のインストール

GNU の IDN Library 「 Libidn 」をインストールし テストしてきたが、今度はこれをRubyから呼べるようにしてみよう。 探してみると、 「LibIDN Ruby Bindings」 という Rubyのライブラリがみつかったので 早速インストールしてみる。

インストールの方法は LibIDN Ruby Bindings サイトのドキュメントによると、
  • RubyGemsによる自動インストール
  • Rakeによる 半自動インストール
  • extconf.rb による 手動インストール
と3つが挙げられている。

ここでは、最も簡単な RubyGemsによるインストールを行ってみる。
# gem install --remote idn
Building native extensions.  This could take a while...
ERROR:  Error installing idn:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby18 extconf.rb install --remote idn
checking for main() in -lidn... yes
checking for idna.h... no
ERROR: could not find idna.h header file!

  Please install the GNU IDN library or alternatively specify at least one
  of the following options if the library can only be found in a non-standard
  location:
    --with-idn-dir=/path/to/non/standard/location
        or
    --with-idn-lib=/path/to/non/standard/location/lib
    --with-idn-include=/path/to/non/standard/location/include
エラーが起きてしまった。 idna.h が見つからないようだ。

それなら、と --with-idn-include オプションを付けてみた
# gem install --remote idn --with-idn-include=/usr/local/include
ERROR:  While executing gem ... (OptionParser::InvalidOption)
    invalid option: --with-idn-include=/usr/local/include
#
ところが、まだエラーがでる。

そこで、 「LibIDN Ruby Bindings」 の記述を参考にして gemのコマンド行を2行に分けて指定してみた。
# gem install --remote idn -- \
? --with-idn-include=/usr/local/include
Building native extensions.  This could take a while...
Successfully installed idn-0.0.2
1 gem installed
Installing ri documentation for idn-0.0.2...
Installing RDoc documentation for idn-0.0.2...
#
今度は成功したようだ。 しかし、なぜ1行ではエラーが起こるのか?

1行で
# gem install --remote idn -- --with-idn-include=/usr/local/include
のようにしても成功した。 どうしても「 -- 」が必要なようだ。 ただし、これに関しては RubyGemsのドキュメントをみても どこにもみつけることができなかった。

【参考リンク】

カテゴリー: DNS・URL・URI , Ruby     22:56 | コメント (0) | トラックバック (0)

2007年5月12日

rake - Ruby Make

rake」 とは、ビルドツールの一種で Ruby版のMake といったところ。 名前もいかにも それらしい。

rake の特徴としては、
  • Makefile にあたる「Rakefile」が 完全に Rubyの文法で記述できるので、余計な変な文法を憶える必要がない。
  • 必要条件と共にタスクを指定できる。
  • 暗示的タスクを統合するためのルール・パターンを記述できる。
  • FileList という機能で ファイル名やパスを柔軟に操作することがきる。
  • Rakefileを簡単に記述するためのパッケージ・タスクのライブラリが揃っている。
となっている。

では、実際にインストールしてみる。 インストールの方法には 通常の方法 と gemを用いた方法が紹介されている。 先日せっかく RubyGems を インストールしたので、 ここでは gemコマンドを使って Rake をインストールしてみる。
# gem install --remote rake
すると
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rake-0.8.1
1 gem installed
Installing ri documentation for rake-0.8.1...
Installing RDoc documentation for rake-0.8.1...
#
のように rake がインストールされた。 実際にインストールされたか確認してみると、
% rake -V
rake, version 0.8.1
%
のようにバージョンを確認することができる。

それから 如何にして「Rakefile」を記述するかに関しては 「Rakeの覚え書き」 に 非常に丁寧な説明があるのでこちらを参考のこと。

【参考リンク】

カテゴリー: Ruby     22:13 | コメント (0) | トラックバック (0)

2007年5月11日

RubyGems の インストール

昨日のブログで調査した「RubyGems」を 実際にインストールしてみる。

RubyGems Manuals」 の 「Installing RubyGems」 によると、 RubyForge「rubygems ファイル」のページ (http://rubyforge.org/frs/?group_id=126) に ソースコードがあるのでそれをダウンロードしてくる、とある。 現段階で最新のソースのアドレスが 「http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz」 なので
# cd /usr/local/src
# wget http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz
# tar xzf rubygems-0.9.2.tgz
# cd rubygems-0.9.2
# ruby ./setup.rb
これで gemコマンド が使えるハズである。

RubyGems の インストール後の注意点として重要な事項がある。 今後、gemコマンドを用いてRubyのパッケージ(ライブラリ)を インストールして、それを使ってゆくわけだが、 その際に、Rubyにどうやって gemsレポジトリーを知らせるか、 ということが問題となる。 これは、RubyGemsがRubyの標準ライブラリ・ディレクトリではなく RubyGems独自のディレクトリにライブラリを置いていることに起因している。 そのため、 今後、gemコマンドによってインストールされたライブラリを Rubyスクリプト内から呼ぶ場合には、
require 'rubygems'
require 'some_gem_library'
# ...
のように 事前に「require 'rubygems'」の一行を加える必要がある。

ところが、これでは 全てのスクリプトを変更しなければならなくなってしまう。 それを回避する別の方法が用意されている。 それが
ruby -rubygems my_program_that_uses_gems
のように Rubyのコマンドラインに「-rubygems」オプションをつけること。

ところが、これでも Rubyを実行するたびに毎回 「-rubygems」オプションを つけなければならない。 そこで もうひとつの別の方法が、 環境変数 RUBYOPT に rubygems という値をセットしておくこと。 例えば、Bシェル系であれば .profile 等に
export RUBYOPT=rubygems
を Cシェル系であれば、.cshrc 等に
setenv RUBYOPT rubygems
を設定しておけばよい。

【参考リンク】

カテゴリー: Ruby     22:31 | コメント (0) | トラックバック (0)

2007年5月10日

RubyGems とは

「RubyGems」 とは Rubyのライブラリ管理ツールの1つであり デファクトスタンダードとも言える 「RubyGems」というのがある。 これは、perl でいうところの CPAN。 PHP で言うところの pear のようなもの。

RubyGems では gem コマンドを使って Rubyのパッケージの管理・作成・配布 等が簡単に行える。 例えば
gem install rake
とすると、rake という新しいパッケージが 自動的にインストールされてしまう。

RubyGemsの特徴としては、
  • パッケージの簡単なインストールと削除
  • ローカル・パッケージの管理と制御
  • パッケージ間の依存関係の管理
  • ローカルおよびリモートのパッケージの検索と問い合せ
  • パッケージにおける複数の異なったバージョンのサポート
  • インストールされたパッケージのドキュメントをウェブベースで閲覧可能
  • 新規gemパッケージの構築が簡単
  • 作成されたパッケージが簡単に配布可能
等が挙げられる。

RubyGemsについては 「RubyGems Manuals」 に 英語ではあるが 詳しくまとめてある。

【参考リンク】

カテゴリー: Ruby     22:01 | コメント (0) | トラックバック (0)

2007年5月 6日

ruby で URLエンコード プログラミング

昨日のブログで「 URLエンコード(URIエンコード)」について レポートしたが、 それでは、rubyで実際にプログラミングしてみよう。

rubyのサンプル・プログラムは以下の様に
require 'uri'
p URI.escape('ウィキペディア')
たった2行である。 これで「ウィキペディア」という言葉を URLエンコードした結果が表示されるハズである。 ウィキペディア「URLエンコード」ページに 例題として「ウィキペディア」という言葉を Shift_JIS、EUC-JP、UTF-8 の各漢字コードで URLエンコードした結果があるので、 それと比較できるように、ここでは同じ言葉としてみた。

Shift_JIS、EUC-JP、UTF-8 の それぞれの漢字コードに 対応するために、それぞれに URLencodeSJIS.rb、URLencodeEUC.rb、URLencodeUTF8N.rb と名づけて、エディターから 漢字コードを指定して保存した。 それぞれを ruby で実行してみると、
C:\soft\ruby>ruby URLencodeSJIS.rb
"%83E%83B%83L%83y%83f%83B%83A"

C:\soft\ruby>ruby URLencodeEUC.rb
"%A5%A6%A5%A3%A5%AD%A5%DA%A5%C7%A5%A3%A5%A2"

C:\soft\ruby>ruby URLencodeUTF8N.rb
"%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2"
のような結果となり、当たり前であるが、 ウィキペディア「URLエンコード」ページ の結果と同じになった。

【参考リンク】

カテゴリー: DNS・URL・URI , Ruby , 文字コード・文字化け     22:54 | コメント (0) | トラックバック (0)

2007年2月 4日

Rubyにおける「バックスラッシュ記法」(2)

以前のブログ 「Rubyにおける「バックスラッシュ記法」(1)」 に加えて、Rubyの「バックスラッシュ記法」に 特殊な表記法があるので それについて例題を挙げてみる。

まず、 補足として 以前のブログ 「Rubyにおける「バックスラッシュ記法」(1)」 の例題スクリプト
printf(" %#04x ", "\n"[0])  #=> 0x0a (改行)
で用いた printf のフォーマットについて。 これについては、 Ruby「sprintfフォーマット」 に解説してある。 この例で使用しているフォーマットは「 %#04x 」 この意味を解析してみると、
  • 「 % 」 sprintfフォーマットの開始を表すメタ文字。
  • 「 # 」 16進表示における「 0x 」というプレフィックスを付加することを指定する
  • 「 0 」 出力が右詰めの場合に余った部分に空白の代わりに `0' を詰めこむことを指定する。
  • 「 4 」 幅。この場合は、プレフィックス「 0x 」を含めて4桁ということ。
  • 「 x 」 これは、16進表示するための指示子。
となる。

それでは 「バックスラッシュ記法」の例題にはいる前の 下調べとして e-Words の 「ASCII文字コード表」 から アルファベット「A」の文字コードを調べておく。 そうすると、10進で「65」、8進で「0101」、16進で「0x41」と判る。

ここで、 Ruby「バックスラッシュ記法」 にある
  • \nnn : 8進数表記 (n は 0-7)
  • \xnn : 16進数表記 (n は 0-9,a-f)
を試してみる。 ダブルクォートで囲まれた中で この表現を使うと、 そのコードの文字列になるハズである。ここでは 上記で調べた「A」を例としてスクリプトを書いてみると
p "\101"    #=> "A"    「A」の  8 進 表現
p "\x41"    #=> "A"    「A」の 16進 表現
当たり前ではあるが、それぞれ「 "A" 」と表示される。

話は断線するが、文字「A」の10進のコード「65」から文字に直したい場合は、
p 65.chr    #=> "A"    「A」の 10進数から 文字へ変換
とするとよい。 私見ではあるが、「バックスラッシュ記法」の流れから言うと、
p "\d65"    #=> "A"    「A」の 10進 表現
なんて出来そうな気がするが、これはできない。 単に「 "d65" 」と表示されるだけ。

この他にも
  • \cx : コントロール文字 (x は ASCII 文字)
  • \C-x : コントロール文字 (x は ASCII 文字)
  • \M-x : メタ x (c | 0x80)
  • \M-\C-x : メタ コントロール x
のような「バックスラッシュ記法」がある。

【参考リンク】

カテゴリー: Ruby     22:56 | コメント (0) | トラックバック (0)

2007年1月 9日

Rubyにおける「バックスラッシュ記法」(1)

ここのところ何回か、Rubyにおける正規表現について 書いてきたが、それを続けるにあたって Rubyにおける「バックスラッシュ記法」を知っておく必要が出てきた。 今回のブログでは、「バックスラッシュ記法」について調査してみた。

「バックスラッシュ記法」とは 特殊な文字コード、例えば 改行文字 等 を Rubyの文字列中でどのように表現するのか ということで、C言語の時代から利用されている表記方法である。

これについての詳細は、Rubyマニュアルの 「バックスラッシュ記法」 に詳しく解説してある。 まずはこのマニュアルページの「バックスラッシュ記法」にある 文字コードを確かめる 例題スクリプトを作ってみた。
printf(" %#04x ", "\t"[0])  #=> 0x09 (タブ)
printf(" %#04x ", "\n"[0])  #=> 0x0a (改行)
printf(" %#04x ", "\r"[0])  #=> 0x0d (キャリッジリターン)
printf(" %#04x ", "\f"[0])  #=> 0x0c (改ページ)
printf(" %#04x ", "\b"[0])  #=> 0x08 (バックスペース)
printf(" %#04x ", "\a"[0])  #=> 0x07 (ベル)
printf(" %#04x ", "\e"[0])  #=> 0x1b (エスケープ)
printf(" %#04x ", "\s"[0])  #=> 0x20 (空白 or スペース)
この例では、
  • \t (タブ)
  • \n (改行)
  • \r (キャリッジリターン)
  • \f (改ページ)
  • \b (バックスペース)
  • \a (ベル)
  • \e (エスケープ)
  • \s (空白 or スペース)
の 文字コードを 16進数で表している。

例えば、「 "\n" 」 とは、 改行コード のみからなる 文字列となる。 Rubyも文字列では「 文字列[n] 」のように表記すると、 与えられた数字 n 番目のバイトの整数(文字コード)を返すメッソドがある。 数える場合は文字列の最初の文字が 0番目から開始されるので、 「 "\n"[0] 」という表記は 文字列「 "\n" 」の 0番目(最初の文字)の 文字列コードを 表していることになる。

ここで得られる文字コードは10進数となるので、 それを ここでは判りやすいように printf のフォーマットで16進数に変換してから表示している。

文字コードに関しては e-Words の 「ASCII文字コード表」 にASCIIコードの一覧表がある。

【参考リンク】

カテゴリー: Ruby     22:01 | コメント (0) | トラックバック (1)

2007年1月 8日

Rubyの正規表現「 . (ピリオド or ドット)」

正規表現では あらゆるパターンを表現するために 特殊な記号や文字を駆使することになる。 それらの正規表現記号のことを「メタ文字」という。

最も基本的はメタ文字のひとつが「 . 」。「ピリオド」とか「ドット」とか呼ばれている。 Rubyマニュアルの 「正規表現」の 説明によると、「改行を除く任意の 1 文字にマッチします。」 とある。 簡単な正規表現ではあるが、 Rubyスクリプトによる例題を挙げてみる。

p "The quick brown fox" =~ /quick/   #=> 4
p Regexp.last_match[0]               #=> "quick"
まずは、メタ文字を使用していない例。 文字列「"The quick brown fox"」において 正規表現である「/quick/」 を 「=~」 によってマッチするかどうか判断している。 マッチしていたら、マッチしていた位置を 行頭を「0(ゼロ)」として数えた値を返す。 よって、この例では、「4」となるので それを 「p」メッソドで表示している。 「#」マークから右側はコメント。 「=>」は なくても構わないのだが、 Rubyの世界では実行結果を示す場合にはこのマークをつける慣例になっているようだ。 ここでもこの慣習に習ってつけている。 結果をコメントとして表示している。

2行目は「 Regexp.last_match[0] 」という変数を表示させている。 これは、最後に成功した正規表現のパターンマッチでマッチした文字列を表す変数(配列?)。 これを「 $& 」と書いても同じ結果になるのだが、 なれない人が見ると 何のことだか わかりずらいので ここでは あえて 「 Regexp.last_match[0] 」としてみた。

p "The quick brown fox" =~ /qu.ck/   #=> 4
p Regexp.last_match[0]               #=> "quick"
次の例では、任意の 1 文字にマッチする メタ文字「 . (ピリオド or ドット)」を 正規表現の中に使ってみた。 正規表現を「/qu.ck/」としたので、 これは、「qu」で始まり、どんな文字でもいいので1文字あって、 続けて「ck」で終わる5文字の文字列が存在するとマッチすることになる。 だから「quick」に限らず「quock」でも「quAck」でもマッチすることになる。

p "The quick brown fox" =~ /qu..ck/  #=> nil
p $&                                 #=> nil
今度は、マッチしない例。 「qu」で始まり、どんな文字でもいいので2文字あって、 続けて「ck」で終わる6文字の文字列は、 「"The quick brown fox"」中に見当たらないので 結果が「nil」となっている。 2行目で、 「 $& 」を使っているのは 「 Regexp.last_match[0] 」を用いると スクリプトがエラーで止まってしまうので、 ここでは「 $& 」の方を用いた。

p "The quick brown fox" =~ /q...k/  #=> 4
p $&                                #=> "quick"
この例でも、「q...k」が「quick」にマッチするのがわかる。

p "The quick brown fox" =~ /..i../  #=> 4
「..i..」も「quick」にマッチする。

このブログでは 自分自身と、それから 正規表現の勉強をこれからはじめる人の参考になるように、 出来るだけ丁寧に説明をつけてみた。 これから、少しずつ メタ文字を増やしていって、 正規表現の実験スクリプト例をどんどんアップしていこうと思う。

【参考リンク】



カテゴリー: Ruby , 正規表現     22:11 | コメント (0) | トラックバック (0)

2007年1月 7日

Rubyの正規表現マッチで利用する「$〜」

Ruby において 正規表現でマッチさせた場合、 ローカルスコープ変数「 $~ 」に自動的にある値がセットされる。 これは、現在のスコープで最後に成功したマッチに関する MatchData オブジェクト を表す。

Rubyのマニュアル 「$~」 によると
現在のスコープで最後に成功したマッチに関する MatchData オブジェクトです。 これを設定すると $& や $1 ... $9 などの 値が変化します。 このデータから n 番目のマッチ($n)を取り出すためには $~[n] で 参照できます。
とある。 また この「 $~ 」は、「 Regexp.last_match 」 と同じである。 よって、「 $~[0], $~[1], $~[2] 」 も 「 Regexp.last_match[0], Regexp.last_match[1], Regexp.last_match[2] 」 と等価となる。

さらに、上記の説明にも出てきた「 $& 」という変数があり、 これが、Regexp.last_match[0] と同じであり、 マニュアルでの説明には
現在のスコープで最後に成功した正規表現のパターンマッチでマッチした文字列です。 最後のマッチが失敗していた場合には nil。
となっている。

これらの例題として
test="The quick brown fox jumps over the lazy dog."
p test =~ /(qui)(ck)/
puts

p $~ 
p $~[0], $~[1], $~[2]
p $&, $1, $2
puts

p Regexp.last_match
p Regexp.last_match[0], Regexp.last_match[1], Regexp.last_match[2]
p $&, $1, $2
というRubyスクリプトを実行してみる。 ここで、2行目の正規表現で「(qui)(ck)」とあるのは 正規表現のグループ化で、 最後に成功したパターンマッチでn番目の括弧にマッチした値が $1, $2 ... に格納される。 これは Regexp.last_match[1], Regexp.last_match[2], ... と同じ。 よって実行結果は
4

#<MatchData:0x2ea421c>
"quick"
"qui"
"ck"
"quick"
"qui"
"ck"

#<MatchData:0x2ea421c>
"quick"
"qui"
"ck"
"quick"
"qui"
"ck"
となる。この結果から 「 $~ 」と「 Regexp.last_match 」 が、 「 $& 」と「 Regexp.last_match[0] 」 とが 全く同じものである ことが確認できる。

【参考リンク】



カテゴリー: Ruby , 正規表現     22:16 | コメント (0) | トラックバック (0)

2007年1月 6日

Ruby における 「正規表現」

今後「正規表現 (Regular Expression)」について Rubyの上で、いろいろ 検証・実験を行ってゆこうと思っているのだが、 そのために、Ruby における 「正規表現」の取り扱い方法を先に学んでおく。

まず、Rubyにおける「正規表現」の表現方法は Ruby「正規表現リテラル」 にあるとおり、
/ で囲まれた文字列は正規表現です。
とある。つまり、「/Ruby/」も正規表現だし、「/^.*$/」も正規表現ということになる。 また別の表現方法として、 「Ruby正規表現クラス」にある 「Regexp.compile(string)」または「Regexp.new(string)」によっても表すことができる。 つまり、上記の例は「Regexp.compile("Ruby")」、「Regexp.compile("^.*$")」 または 「Regexp.new("Ruby")」、「Regexp.new("^.*$")」 とも表現できる。

Rubyにおいて 上記の正規表現とマッチを行う方法はいくつかあるが 最もオーソドックスな方法が Ruby「=~」メソッド を利用することである。 マッチが成功すればマッチした位置のインデックスを、そうでなければ nil を返す。 文字列の先頭にマッチした場合には値「0(ゼロ)」 が返されるので注意が必要だ。

Rubyによる 正規表現の試験プログラムの例題として
test="The quick brown fox jumps over the lazy dog."
p test =~ /quick/
としてみる。 このスクリプトを実際に実行してみると、画面には「4」と表示される。 これは、文字列 "The quick brown..." のうち 「quick」という文字列が 5文字目であり、 先頭の文字を0番から数えると4番目になるため 答えが 「4」となっている。 このスクリプト例は、
test="The quick brown fox jumps over the lazy dog."
p test =~ Regexp.compile("quick")
と書いても全く同じ結果となる。

ちなみに、文字列に全く含まれていない正規表現とマッチさせる、 例えば
test="The quick brown fox jumps over the lazy dog."
p test =~ /abcdef/
のような場合は、実行結果に「nil」と表示される。

【参考リンク】



カテゴリー: Ruby , 正規表現     22:52 | コメント (0) | トラックバック (0)

2007年1月 2日

Ruby 変数とスコープ

変数の有効範囲のことを「スコープ」と呼んでいる。 最近の言語では、まず間違いなく 変数にこの「スコープ」の概念が取り入れられている。

Ruby では 変数や定数の種類が以下の様になっていて、 名前の最初の一文字によって識別されている。 また、上記以外にも「組み込み変数」という変数も存在する。

言語によっては変数を宣言する際に「変数の型」を指定しなければならない場合があるが、 こと Ruby の場合、型の指定は必要ない。 変数に新たに値を代入すれば、いつでも代入したその値の型に変更される。 その様子を例として挙げて見ると、
i=10; p i            # 10
i="ABCDEF"; p i      # "ABCDEF"
i=[1, 2, 3 ]; p i    # [1, 2, 3]
となる。この例では、「i」という変数に 1行目では 数値「10」を代入してから値を表示。 2行目では 文字列を変数「i」に文字列「"ABCDEF"」を代入してから表示。 そして3行目では 配列を代入している。

グローバル変数に関しても 言語によりさまざまである。 Rubyの場合、上記のように、「$」で始まる変数はグローバル変数として扱われる。 一方 PHPでは、 関数(Function)の中で グローバル変数を利用する際には、 関数の内部で global命令により 明示的に グローバル変数として宣言する必要がある。

【参考リンク】

カテゴリー: Ruby     22:35 | コメント (0) | トラックバック (0)

2006年12月25日

Eclipse Language Pack と RDT との同居のさせ方

以前のブログ 「Eclipse への RDTプラグイン インストレーション」 や 「Eclipse Language Pack と RDT との相性」 でレポートしたように、 Language Pack で日本語化した Eclipse に RDT(Ruby Development Tools) を インストールすると、Language Pack が無効化されてしまっていた。 そこで、RDTのインストレーション方法を変えてチャレンジしてみた。

まず、 「Eclipse のインストール」 に従って 純粋な Eclipse 環境を用意する。 その後、 「Eclipse の 日本語化」 の方法に従って、Eclipse を 日本語化しておく。

従来は、この後、 「Eclipse への RDTプラグイン インストレーション」 にあるように、推奨されている「更新マネージャを用いたプラグインのインストール」を行っていた。 ところが、この方法では、Language Pack が無効化されてしまった。 そこで、今回は試しに もう一つのインストレーション方法である 「ファイルの展開によるインストール」 を行ってみる。 RDT の ZIPファイルは 「SourceForge RDT の Files ページ」 にあるので、そこから最新版をダウンロードする。 現在の最新版は、「0.8.0 Released 2006-04-27」 このZIPファイルを展開すると 「features」 と 「plugins」 というフォルダーができているので、 その中身を Eclipse本体の 「features」 と 「plugins」 とに それぞれコピーするだけである。

Eclipseを起動してみると、今度は日本語表示のままで RDT を利用することができた。 確認のため、 [ヘルプ(Help)]−[ソフトウェア更新(Software Updates)]−[構成の管理(Manage Configuration)] から プラグインの構成を表示させてみると
  • C:\eclipse
    • Eclipse Project SDK 3.2.2......
    • Eclipse Project SDK Language Pack 1 3.2.1.......
    • Ruby Development Tools 0.8.1.609062100PRD
のように、Language Pack と RDT とが 同居しているのが 確認できた。

結論としては、Eclipseにおいて、 Language Pack による日本語化と RDT(Ruby Development Tools) を 両立させるためには、 RDTのインストール方法として 「更新マネージャを用いたインストール」ではなく、 「ファイルの展開によるインストール」を行う必要がある、 ということである。

【参考リンク】

カテゴリー: Eclipse , Ruby     22:24 | コメント (0) | トラックバック (0)

2006年12月22日

RI コマンド

ここのところ、Rubyのドキュメント関連である 「RD」、「RDoc」について書いてきているが、その続きとして 「RI」というコマンドがあるので、それについても調査報告。

まず、「RI」コマンドについては Ruby リファレンスマニュアル の 「ri」 に書いてあるが、このページによると、
コマンドラインから RDoc で書かれた Ruby のリファレンスを引くことができます。
と解説してある。 この「RI」コマンドも 「RDoc」コマンド同様に Rubyのシステムにデフォルトでインストールされているコマンドである。 実際に試してみると、 ウィンドウズ上のRuby mswin32版では、このコマンドは バッチファイル「ri.bat」として して実装されている。

使用方法としては、調べたいクラスやメッソドを単に 「ri」コマンドの引数にすればよく、 例えば Array クラスについて知りたければ、
C:\>ri Array
----------------------------------------------------------- Class: Array
     Arrays are ordered, integer-indexed collections of any object.
     Array indexing starts at 0, as in C or Java. A negative index is
     assumed to be relative to the end of the array---that is, an index
     of -1 indicates the last element of the array, -2 is the next to
     last element in the array, and so on.

------------------------------------------------------------------------


Includes:
---------
     Enumerable(all?, any?, collect, detect, each_cons, each_slice,
     each_with_index, entries, enum_cons, enum_slice, enum_with_index,
     find, find_all, grep, include?, inject, inject, map, max, member?,
     min, partition, reject, select, sort, sort_by, to_a, to_set, zip)


Class methods:
--------------
     [], new


Instance methods:
-- More  --
となる。 また、「ri -l」とすると表示可能な クラス、モジュール、メソッド が一覧表示される。
C:\>ri -l
Abbrev
Abbrev#abbrev
Acceptables
ACL
ACL::new
ACL#allow_addr?
ACL#allow_socket?
ACL#install_list
ACL::ACLEntry
ACL::ACLEntry::new
ACL::ACLEntry#dot_pat
ACL::ACLEntry#dot_pat_str
ACL::ACLEntry#match
ACL::ACLList
ACL::ACLList::new
ACL::ACLList#add
ACL::ACLList#match
AmbiguousArgument
AmbiguousOption
Arguable
Arguable::extend_object
Arguable::new
Arguable#getopts
Arguable#options=
-- More  --


以前のブログ 「Eclipse への RDTプラグイン インストレーション」 で紹介したとおり、 Eclipse 上に Rubyの開発環境 RDT(Ruby Development Tools) をインストレーションする際、 「Ri/rdoc」の項目でパスの設定を行わなければならない。 この設定を行っておくと、Eclipse 上で「RI」ビューが表示できるようになる。

もしEclipse 上に 「RI」ビューが表示されていなければ、 メニューから[Window]−[Show View]を選択すると Consoleをはじめ、表示できるが選択できるが、 その中に「RI」という項目もある。 この「RI」を選択すると、 RIコマンドの出力を専用のビューで確認することができ、 クラス、モジュール、メソッド に関する一種のオンライン・ヘルプ となる。

Eclipse 上の「RI」ビューは 大きく左右に分かれている。 左側には クラスやメソッドが ABC順に表示されており、 これがおそらく「ri -l」の出力結果であろう。 この中から 詳しく知りたい 項目をクリックすると 右側にその内容が表示される。 ここでの表示は、きれいに整形されているので ターミナル上で見るよりずっと見やすくになっている。

【参考リンク】

カテゴリー: Ruby     22:25 | コメント (0) | トラックバック (0)

2006年12月21日

RDoc

昨日のブログで「RD (Ruby Document)」について書いたが、 Rubyの世界でのドキュメントに関しては、もうひとつ 「RDoc」というものもあるようだ。

RDoc については 「RDoc による自動ドキュメント生成」 に わかりやすく解説してある。 このページによると 「Ruby Documentation System (RDoc) とは, Ruby で書かれたソースコードからドキュメントを自動生成する, Ruby 本体に付属する標準ライブラリの1つです.」 とある。 これだけを読むと、RDとどこが違うのだろうか、と思ってしまう。

また、RDocのコマンドそのものについては 「RDOC - Ruby Documentation System」 に、また、その日本語訳として 「大林一平さんによるRDoc日本語訳」 に詳しく説明してある。 そのはじめの部分に
RdocとはRubyのソースファイルに対するドキュメントを生成するアプリケーションです。 JavaDocと同様に、ソースを解析し、クラス、モジュール、メソッドの定義を抜き出してきます
とある。 昨日のブログで取り上げた 「RD」が Perlの「POD(Plain Old Document)」を参考にしているのに対し、 こちらの「RDoc」は Javaの 「JavaDoc」 を 参考にした仕様になっており、 ソースコードを解析し、クラス、モジュール、メソッドの定義を抜き出して ドキュメントを生成してくれるようだ。

さらに、この RDocの書式については 「RDoc 覚え書き」 にも詳しく解説してある。

結局、上記のようなサイトを調査してみると、 RD と RDoc は 似て非なるもののようだ。 とくに RDocの方は Rubyのソースコードから、 クラス、モジュール、メソッドの定義を抜き出し、 それらの内容の直前に書かれたコメントはそのクラス等の説明である という前提でドキュメント化を行う。 また文法も若干異なるが、RDocの方が 簡単になっている。 そして RDocコマンドは、Rubyシステムに標準で添付されているコマンドである。

【参考リンク】

カテゴリー: Ruby     22:56 | コメント (0) | トラックバック (0)

2006年12月20日

RD (Ruby Document)

Ruby関連の情報をいろいろ調べていると、「RD」という言葉に遭遇することが多々ある。 では、「RD」とは、一体 何のことなのか。

まず、私が一番はじめに「RD」という言葉に遭遇したのは Rubyの「コメント」について調査した時。 以前のブログ 「Ruby の コメント(1)」 でも書いたとおり、Rubyのコメントには二通りあって、 行コメント としての「#」 と ブロックコメントの「=begin 〜 =end」。 しかし、このブロックコメントの方は、マニュアル上 コメントとは呼ばずに 「埋め込みドキュメント」 と呼んでいる。 その「=begin 〜 =end」についての説明部分を引用させていただくと。
Rubyのソースコードにドキュメントを埋め込む事ができます。 文が始まる部分の行頭の =begin から、 =end で始まる行までが埋め込みドキュメントです。 Rubyインタプリタとしては内容に縛りはかけませんが、 通常はRD形式でドキュメントを埋め込むことを期待しています。
とある。ここで「RD形式」という表現が使われている。

では、Ruby リファレンスマニュアル 「RD」 ページでの説明は、というと、ここでの説明は一行だけ。
このリファレンスマニュアルでも使われているドキュメント形式です。
あとは、関連記事へのリンクである。

いろいろリンクを辿ってみると、 「RD とは POD のようなドキュメントフォーマットである」という記述があった。 ここで言う「POD」とは何であろう。 ご存知の通り、RubyはPerlの影響を強く受けている。 そのPerlのドキュメントの基本形が 「POD(Plain Old Document)」である。 「RD」とは、このPerlの「POD」を参考にし ドキュメント形式を Ruby風にアレンジしたもののようだ。

RDの文法は POD にも似ているが Wikiにも似ていてる。 例を挙げると 「= で始まる行はタイトルになる。」 「周辺より字下げが深い箇所はそのまま出力」 「箇条書きは行頭が * で始まっている行で表す」 というようになっている。 文法について詳しくは 「RD working draft 日本語版」 に解説してある。

また文法が Wikiに似ているということから、 このRDの文法そのままで Wikiしてしまうという 「Rwiki」 というアプリケーションも存在している。

それから RDフォーマットのファイルからhtml 等の フォーマットへ変換するアプリケーションが 「RDtool」だ。 このRDtoolは、残念ながらRubyのシステムにデフォルトでは組み込まれていないようだ。

【参考リンク】

カテゴリー: Ruby     22:44 | コメント (0) | トラックバック (0)

2006年12月18日

Eclipse 上での RDT(Ruby Development Tools)による Hello World プログラミング

Eclipse上の RDT(Ruby Development Tools) の 最も基本的な使い方をマスターするために、 Rubyで 例のごとく「Hello World」プログラミングを行ってみる。

Eclipse上での大きな作業の流れとしては、
  • Ruby プロジェクトの作成
  • ファイルの作成
  • Helloworld.java の編集
  • Helloworld.java の保存(コンパイル)
  • スクリプトの実行
順番に詳しく見てみると
  1. メニューの[ファイル(File)]−[新規(New)]−[プロジェクト(Project...)]から [Ruby/Ruby Project]を選択して [次へ(Next)]ボタン。
  2. Project name: 欄にプロジェクト名を入力後、[Finish]ボタン。 ここでは、自動的に workspace フォルダーの下に 指定したプロジェクト名と同じ名前のフォルダーが作成されるようすが その下のLocation欄で確認できる。 「Use default location」のチェックボックスをクリアすると そのプロジェクトを書き込むフォルダーを Location欄で指定できるようになる。
  3. Rubyのコードを記述するためのファイルを作成する。 メニューの[ファイル(File)]−[新規(New)]−[ファイル(File)]を選択。 開いたウィンドウから 先ほど 作成したプロジェクトを選択し、 画面下の「File name:」欄に ファイル名を入力。 この際、拡張子は.rbとしておく。
  4. [Finish]ボタンをクリックすると、新たなファイルが作成され それがエディタ部分に表示される。
  5. エディタ上で「puts "Hello World"」と入力。
  6. エディタ上で右クリックから「Save」を選択。 この時、タブ部分のファイル名の前についていた「*」が消える。
  7. エディタ上で右クリックから[Run As]−[1. Ruby application]を選択。
  8. 問題がなければ 画面下の「Console」タブに めでたく「Hello World」と表示される。
これで、とりあえずEclipse上での Ruby プログラミング環境が整ったことになる。

【参考リンク】

カテゴリー: Eclipse , Ruby     22:03 | コメント (0) | トラックバック (0)

2006年12月 2日

Ruby の ブロック付きメソッド呼び出し

昨日のブログで「イテレータ」について書いたが、 最近のRubyの世界ではそれを「ブロック付きメソッド」と呼ぶほうが好まれているようだ。

まず、「ブロック付きメソッド」の定義。 Ruby リファレンスマニュアル 「ブロック付きメソッド呼び出し」 によると、 「ブロック付きメソッドとは制御構造の抽象化のために用いられる メソッドです。」 とある。 「最初はループの抽象化のために用いられていたため、 特にイテレータと呼ばれることもあります。」 この説明からも判るとおり、 もともと ループの抽象化を目的としていたので「イテレータ」と呼ばれていたようだが、 繰り返し処理でなく1度きりの処理であっても 制御構造を抽象化したい場合に、同様の記述が可能であるということから、 最近ではもっと汎用的に「ブロック付きメソッド呼び出し」と呼ぶようになっているようである。

では自分で定義したブロック付きメソッドから 引き渡されたブロックを呼び出す方法。 そのためには「yield」をメソッド定義内で記述する必要があるようだ。 詳しくは Ruby リファレンスマニュアルの 「yield」 に解説してある。

この「yield」を含めた「ブロック付きメソッド呼び出し」の 私なりの理解の方法の例を挙げてみる。
def foo            # メッソド foo の定義 
  fooprint(5)
end

def fooprint( i )  # メッソド fooprint の定義
  p i+10
end
foo                # メッソド foo を呼ぶ

def fooprint( i )  # メッソド fooprint の再定義
  p i+20
end
foo                # メッソド foo を再び呼ぶ
この例では、まず foo というメッソドを定義している。 この fooの中から fooprint というメッソドを引数「5」で呼び出すことにする。 次に、fooprint というメッソドを定義しており、 その処理内容は 引数「i」に「10」を足してから表示する、というもの。 その直後に メッソド「foo」を呼び出している。 続いて再び、メッソド「fooprint」を定義しなおしている。 その処理内容は 引数「i」に「20」を足してから表示する、というもの。 その直後に再び メッソド「foo」を呼び出している。

上の例を 「yield」を使った「ブロック付きメソッド呼び出し」で記述してみると
def foo
  yield(5)  # fooprint(5) の代わり
end

foo do |i|  # do |i| は def fooprint( i ) の代わり
  p i+10
end

foo do |i|  # do |i| は def fooprint( i ) の代わり
  p i+20
end
となる。 こちらの例では ブロックをメッソド「foo」に直接 引数として渡しており、 前の例であった「fooprint」というメソッド定義がなくなっている。 上記2つのスクリプト例を実行してみると
15
25
となる。

自分としては、この様なイメージで 「ブロック付きメソッド呼び出し」を理解している。

【参考リンク】

カテゴリー: Ruby     22:44 | コメント (0) | トラックバック (0)

2006年12月 1日

Ruby の イテレータ

Ruby の解説記事などで 言語の特徴について書かれている場合、 必ずと言ってよいほど「イテレータ」という言葉にお目にかかる。 実は私も、Rubyについて調査・研究を始めるまで聞いたことがなかった。 それでは、「イテレータ」とはいったい何なのだろうか?

まずは英語のお勉強から。「イテレータ」は「iterator」であり、 その原型の動詞「iterate」とは「 〜を 繰り返す」という意味。 また、ウィキペディアでの 「イテレータ」ページ での定義を引用させてもらうと、
イテレータ(Iterator)とは、プログラミング言語において配列やそれに類似するデータ構造の各要素に対する繰返し処理の抽象化である。 実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。 反復するためのものの意味で反復子(はんぷくし)と訳される。
となっている。 また、Rubyリファレンスマニュアル の「イテレータとは何ですか」では
イテレータは制御構造(特にループ)の抽象化のために用いられるメソッド の一種です。
と定義付けされている。 Rubyでも繰り返しの記述方法は何通りもあるが、 繰り返したいブロックをメッソドの引数として与える記述が可能である。 そのメソッドのことを「イテレータ」と呼んでいる。

では Rubyとしての「イテレータ」の具体例を挙げてみよう。
3.times do
   print "A"
end
これは 整数クラスの「3」というオブジェクトの 「times」というメッソドに 「do ... end 」のブロックを引数として与えていることになる。 処理としてはこの場合、「do ... end 」のブロックを3回繰り返すことになる。 これを実行してみると、結果は
AAA
となる。

「do ... end 」のブロックの中へ 何回目の繰り返しかを 変数で引き渡す方法。
3.times do |i|
   print i, " "
end
前述のスクリプト例との違いは、 ブロックの開始 do の直後に「 |i| 」という このブロックへの引数を受け取るローカル変数「i」の定義があり、 ブロック内では このローカル変数「i」が参照されていること。 この実行結果は
0 1 2 
となる。

また、配列の場合であれば、
data = [5, 10, 15]
data.each do |i|
  print i, " "
end
というような記述になり、結果が
5 10 15 
となる。

【参考リンク】

カテゴリー: Ruby     22:13 | コメント (0) | トラックバック (0)

2006年11月29日

Ruby の ブロック

Ruby での ブロックとは 「 do ... end または { ... } で囲まれたコードの断片」のことを言う。 それでは do ... end と { ... } は 全く同じか、というとそうでもないようだ。

マニュアルによると 「 { ... } の方が do ... end ブロックよりも強く結合する」と記述されている。 このことを説明するための例をマニュアルから引用させてもらうと
foobar a, b do .. end   # foobarの引数はa, bの値とブロック
foobar a, b { .. }      # ブロックはメソッドbの引数、aの値とbの返り値とがfoobarの引数
となっている。

また、Rubyにおいて { ... } で囲むという表現は、ブロック以外にも存在している。 「ハッシュ式」が それにあたる。例えばハッシュの定義は
a = { 1=>2, 2=>4, 3=>8 }
のように { ... } で囲む形をしている。 もちろん、良く見れば 内容が違うので これがブロックなのかハッシュ式であるかどうか判断できるが。

C言語等では言語の仕様上 { } が多用されていたが、 今まで Rubyのサンプルを読む限りでは do ... end ブロックの方をよく見かけるようだ。

【参考リンク】

カテゴリー: Ruby     22:53 | コメント (0) | トラックバック (0)

2006年11月28日

RDE での「The parameter is incorrect.」メッセージ

ここしばらく、RDE (Ruby Development Environment) を試しているが、 どうも安定動作をしてくれない。 スクリプトを実行させると、「The parameter is incorrect.」というメッセージが 頻繁に表示されて止まってまうのである。

RDEは 使い方にも慣れてきて、便利さも感じている一方、 安定動作をしてくれないので その点に関しては非常にストレスを感じてしまう。 上記のとおり、スクリプトを メニュー「実行」の「実行」から、もしくは[F5]キーにより 実行させると、 「The parameter is incorrect.」という メッセージボックスが表示されて 止まってしまうことがある。

また、この現象は必ず起こる訳でもなく、 同じスクリプトを実行させてみても、 起こる場合と起こらない場合がある。 確立で言うと50%くらいであろうか。 スクリプトの長さや、内容にも関係がないようである。

それからこのエラーが起こった場合でも、 メッセージボックス内の「OKボタン」をクリックすると、 一回で消える場合と、 同じメッセージボックスが連続的に表示される場合がある。

何度かメッセージボックス内の「OKボタン」をクリックして スクリプトの実行が最後まで行った場合でも、 コンソールウィンドウに 正常にプログラムが終了した場合に表示される内容が きちんと表示されている場合と、 コンソールウィンドウに何も表示されていない場合とがある。

ちなみに、プログラムが最後まで実行できたかどうかは 画面下のステータスの表示が「実行中」から 「完了(0)」に変わることによって判断がつく。

原因が判明すれば、対策の講じ様もありそうなのだが、 このメッセージだけからは、まったく判断がつかなかい。 グーグルで検索してみて、同様の問題については見つからない。 さて、どうするべきか、もう少し調査をしてみよう。 ちなみに、使っているRubyは 「mswin32」版。 Ruby本体やRDEの再インストールもやってみようかと思ってはいるが、 ただ 闇雲にやってみても仕方がないので、もう少し情報を集めてみよう。

【参考リンク】

カテゴリー: Ruby     22:18 | コメント (0) | トラックバック (0)

2006年11月27日

RDE の デバッグ機能(2)

昨日のブログで Ruby のデバッグを CUIにより行ってみたが、 全く同じことを、RDE (Ruby Development Environment) 上でも 試してみようと思う。

  1. RDEから「var.rb」を開く
  2. エディタ部の行番号欄「2」と「4」のところの左端 (マウスカーソルが手の形に変わる)で、 それぞれマウスをクリックすると、赤い丸印がつく。 これがブレークポイントがついた印。 この用に RDEでは、実行する前にプレークポイントを設定することができる。
  3. メニュー「デバッグ」の「デバッグ開始・継続」を選択するか、 または[F9]キーを押すして、デバッグ・モードで実行を開始する。 すると、コンソールウィンドウに Ruby本体との通信の様子が表示される。 この時点で、既にプレークポイントが設定されたことが確認できる。
  4. 「変数ウィンドウ(Variable Window)」の中から「ローカル」タブを選択しておく。 この時点では、まだ何も表示されない。
  5. この段階で、エディタ部の行番号欄には、4行目に緑の丸印がついているが、 これは、この行まで実行してきた、ということではないようだ。 それは、コンソールウィンドウのログをみると判る。 ということで、メニュー「デバッグ」の「デバッグ開始・継続」を選択するか、 または[F9]キーを押すして、実行を継続する。
  6. すると実行が 2行のブレークポイントで止まったことがわかる。 この時、「変数ウィンドウ(Variable Window)」の中から「ローカル」タブには 「var => "Top Local Variable"」という記述が表示され、 変数の中身が確認できる。
  7. 続けて、メニュー「デバッグ」の「デバッグ開始・継続」を選択するか、 [F9]キーを押すして、実行を継続する。
  8. すると実行が 4行のブレークポイントで止まったことがわかる。 この時、「変数ウィンドウ(Variable Window)」の中から「ローカル」タブには 「var => "Top Local Variable2"」という記述が表示され、 変数の中身が変更されていることが確認できる。
文章で書くと長くなるが、 上記の処理が全てマウスのクリックだけで実現できたわけだ。 プログラミングに消費される時間の大半はデバッグ作業である。 このようなツールが使いこなせるようになると、 開発にかかる時間を短縮できるようになるであろう。

【参考リンク】

カテゴリー: Ruby     22:31 | コメント (0) | トラックバック (0)

2006年11月26日

Ruby の デバッガ(1)

Ruby には デバッガ機能がある。 実は RDE (Ruby Development Environment) も このデバッガ 機能を利用している。 そのため、 Ruby デバッガ について理解しておく方が RDEのデバッグ機能を使いこなすためにも役に立つ。

Rubyマニュアルの「 コマンドラインオプション 」によると、 「-r」オプションは 「スクリプト実行前に指定されるライブラリを require する」となっている。 つまり、上記の例では Ruby 起動時に 「debug.rb」というライブラリを読み込むことによって デバッガを走らせていることになる。

具体的なデバッグの例を挙げてみる。 ソースとして
1: var="Top Local Variable"
2: p var
3: var="Top Local Variable2"
4: p var
という簡単な スクリプトを var.rb という名前のファイルにしておく。 実際のファイルには、もちろん行頭の番号はつけていなが、 デバッグする際には、行番号が必要となるのでここでは付けてある。 このスクリプトをデバッグ・モードで起動してみる。
> ruby -rdebug var.rb
Debug.rb
Emacs support available.

c:/ruby/lib/ruby/site_ruby/1.8/ubygems.rb:10:require 'rubygems'
(rdb:1)
ここでの「(rdb:1)」というのがデバッグ・モード用のプロンプトである。 それではスクリプトの2行目に「break」コマンド、省略形は「b」を使ってブレークポイントを設定してみる。
(rdb:1) b var.rb:2
Set breakpoint 1 at var.rb:2
(rdb:1)
この場合、「ファイル名:行番号」のフォーマットで設定する必要がある。 実行する前に、「var local」コマンド、短縮形は「v l」を使って現在のローカル変数を表示させてみる。
(rdb:1) v l
(rdb:1)
当たり前だが、まだスクリプトを実行する前なのでローカル変数はなにもない。 次に、「cont」コマンド、省略形は「c」でブレークポイントに到達するまで処理を続行してみる。
(rdb:1) c
Breakpoint 1, toplevel at var.rb:2
var.rb:2:p var
(rdb:1)
ここで再び、「var local」コマンドで現在のローカル変数を表示させてみる。
(rdb:1) v l
  var => "Top Local Variable"
(rdb:1)
今度は、「var」という変数に文字列が入っているのが確認できる。 続いて 2行目にブレークポイントを設定、「cont」、そして、ローカル変数を表示をさせてみる。
(rdb:1) b var.rb:4
Set breakpoint 2 at var.rb:4
(rdb:1) c
"Top Local Variable"
Breakpoint 2, toplevel at var.rb:4
var.rb:4:p var
(rdb:1) v l
  var => "Top Local Variable2"
(rdb:1)
今度は、「var」という変数の内容が、「Top Local Variable2」に変更されているのが確認できる。

この様に、Rubyでは デバッグをすることができる。 ただし、CUIなので、入力がすこし面倒である。

【参考リンク】

カテゴリー: Ruby     22:56 | コメント (0) | トラックバック (0)

2006年11月25日

RDE の デバッグ機能について(1)

昨日のブログでインストールについてレポートした RDE (Ruby Development Environment) は スクリプト言語Rubyのウィンドウズ用の開発環境である。 これからRDEの使い方等について もう少し 調査・研究してみようと思う。

まず、公式 RDEマニュアル サイトの 「RDEとは」 を見てみると、 「RDEの実態は、debug.rbのGUIインターフェースです。」 と書いてある。 つまり、RDEが提供しているデバッグ環境は、 もともとRubyに組み込まれているデバッグ機能を呼び出しているにすぎない、 ということだ。 しかし、Rubyのデバッグ機能は CUI(Character-based User Interface) なので、 それを直感的なGUIで行えるようにしたところがスゴイところ。

ただし、 「RDEマニュアル」サイトを読んでみても 具体的なデバッグの方法が書いてないようだ。 とりあえず、マニュアルから判ることは、

画面に「変数ウィンドウ(Variable Window)」というのがあって、 ここで 各種変数等の実行情報を表示できるが、これはデバッグ時にのみ有効、 ということ。

「変数ウィンドウ(Variable Window)」には 「グローバル(Global)」「ローカル(Local)」「インスタンス変数(InstVar)」 「オブジェクト(Object)」「監視式(Display)」「スレッド(Thread)」「フレーム(Frame)」「呼出履歴(Caller)」 という8つのタブがあり、それぞれがタブで現在のプログラムの様子を表示する、 ということ。

それから、実際にデバッグをするさいには、 メニュー「デバッグ」下にある「デバッグ開始・継続(F9)」から開始し、 その後、同じメニュー「デバッグ」下にある ステップイン、ステップオーバー や ブレークポイントの設定を駆使してデバッグをしてゆくようである。

実際のデバッグの方法に関しては、 これから、おいおい調査していこうと思う。

【参考リンク】

カテゴリー: Ruby     22:08 | コメント (0) | トラックバック (0)

2006年11月24日

RDE (Ruby Development Environment) のインストール

スクリプト言語を習得するにあっても 開発環境があった方が便利である。 ruby開発環境 は既にいくつかあるのだが、 その中でもウィンドウズ上では代表的なruby開発環境である 「RDE (Ruby Development Environment)」を 試してみようと思う。

インストール方法に関しては 「RDEのインストール」 ページに解説してあるのでそれに従えばよい。 現在のバージョンは 1.0.1 なので「RDE1.0.1_setup.exe」というファイルをダウンロードし、 それをそのままWindows上で実行する。 私のPCの場合、rubyは「mswin32」版がインストールされているので、 RDEのインストール中のプロンプトに全てディフォルトを選択することで 問題なくインストールできた。

さらに 「RDEのダウンロード」ページ には UTF-8関連のパッチがあるので、このページから 「converter-1_1.zip」というファイルをダウンロード後、解凍する。 すると「japanese.dll」と「unicode.dll」というファイルが抽出されるので この2つのファイルを「C:\Program Files\RDE」ディレクトリにコピーした。

初めてRDEを起動したときには、[設定]画面が表示されるので、 「初期設定」ページに従って 設定を行う。 メニューの日本語表示のために、[Config File] 内の [Translation File]欄に 言語ファイルを設定する。 具体的には私の場合、「C:\Program Files\RDE\Translations\Japanese_1000.xml」を設定した。 RDEを再起動すると、メニュー表示が全て日本語に変換されている。

とりあえず現段階でエラーなく起動してくれている。 RDEの使い方については、これからおいおい調べて行こうと思う。

【参考リンク】

カテゴリー: Ruby     22:13 | コメント (0) | トラックバック (0)

2006年11月18日

Rubyの表示メソッド

昨日のブログで、組み込みメッソドの「p」について書いたが、 新しいプログラミング言語を習得するためには いろいろな構文や手順を 短いテストプログラムに書いて、 それを実際に実行させてみて その結果を確かめてみるのが最も近道だ。 プログラミングの世界ではそのような場合に使う言葉として 「Hello World!」という言葉まで慣習化されているくらいだ。 ということで、Rubyにおける 表示関連の 組み込みメソッドについて調査・比較してみた。

ここでは、Rubyの表示関連のメソッドとして 「p」「puts」「putc」「print」「printf」を取り上げてみる。 それぞれのメッソドの仕様の詳細はリファレンスマニュアルに譲るとして、 ここでは大まかな違いについてまとめてみる。
  • p
    引数のオブジェクトを人間に読みやすい形で出力。 文字列はダブル・クォーテーションで囲まれて表示されるので、 末尾にスペースが入っているかどうかも確認できる。 配列やハッシュ(連想配列)もそのままの形で表示する。
  • puts
    引数のオブジェクトの値それぞれに改行をつけて出力。 配列の中身もそれぞれが改行される。 ハッシュ(連想配列)は繋がって表示される。
  • putc
    1文字を出力。引数は1個だけOK。 引数が数字なら、0 〜 255 の範囲の対応する文字を出力 引数が文字列なら、その先頭の1文字を出力。
  • print
    引数を順に出力。 オブジェクト間に改行は自動的には入らないので、必要なら挿入してやる必要がある。
  • printf
    C 言語の printf と同じように、format に従い引数を文字列に変換して出力
上記の 表示関連メソッドの違いが体験できる テスト・スクリプトを作ってみた。
s = "Hello World!"
a = [123, 456, 789]
h = {'water' => 'wet', 'fire' => 'hot'}

puts "-- p --"
p s
p a
p h

puts "\n-- puts --"
puts s
puts a
puts h

puts "\n-- putc --"
putc s
# putc a     エラー `putc': can't convert Array into Integer
# putc h     エラー `putc': can't convert Hash into Integer

puts "\n\n-- print --"
print s
print a
print h

puts "\n\n-- printf --"
printf "This is %s\n", s
printf "%s\n", a
printf "%s\n", h
これを実行してみると、
-- p --
"Hello World!"
[123, 456, 789]
{"water"=>"wet", "fire"=>"hot"}

-- puts --
Hello World!
123
456
789
waterwetfirehot

-- putc --
H

-- print --
Hello World!123456789waterwetfirehot

-- printf --
This is Hello World!
123456789
waterwetfirehot
となる。

【参考リンク】

カテゴリー: Ruby     22:15 | コメント (0) | トラックバック (0)

2006年11月17日

Rubyの「p」

Rubyのサンプル・ソースコード を読んでいたりすると 途中に「{|v| p v}」 のような表現があったりする。 この表現の全体の意味については、今日は触れないが、 通常、プログラム中に「p」という 一文字の表記があると、 名前が一文字の変数かな、と思ってしまうのではないかな。 しかしRubyの場合、これが組み込み関数(メソッド)だったりする。

Ruby リファレンスマニュアル「p」 によると、このメッソド「p」の定義は、 p の引数として オブジェクトをいくつか与えると、 与えられたオブジェクトを人間に読みやすい形で出力する、 というもの。 ということで、前述の「{|v| p v}」のうち、 「p v」というところは、「v」という名前の変数の内容を 「p」メッソドを使って表示させる、ということ。

ちなみに、「p」というのは埋め込みメッソドの名称ではあるが、 別にRubyの「予約語」になっているわけではないので、 「p」という名前の変数を作成することができてしまったりもする。 その辺も踏まえて、簡単な例題プログラムを書いてみる。
p="Hello World!"
p p

p = ["abc", 456, 789]
p p
p p[1]

p = {'water' => 'wet', 'fire' => 'hot'}
p p
p p['water']
これを走らせてみた結果は、
"Hello World!"
["abc", 456, 789]
456
{"water"=>"wet", "fire"=>"hot"}
"wet"
となる。

このように、Rubyでは メッソドの「p」と 変数名の「p」とをちゃんと識別できるわけだが、 「p」という名前の変数を作ってしまうと、 人間の方が混乱してしまうので、やめておいた方がよさそうだ。

【参考リンク】

カテゴリー: Ruby     22:45 | コメント (0) | トラックバック (0)

2006年11月16日

Ruby の コメント(2)「?#」は なぜ例外なのか?

前回のブログで、Rubyのコメントについて書いたが、その続き。 Ruby のコメントは、基本的に「# (シャープ) 」記号から行末までをコメントしているが、 例外として、「文字列中や数値リテラル `?#' 以外」となっている。

始めの「文字列中以外」というのは ダブルクォート「"」またはシングルクォート「'」で囲まれた文字列中にある 「# (シャープ) 」記号は コメント開始の印とはみなさない、ということで理解できるし、 その他の言語でもほぼ同じである。

一方、その後の「数値リテラル `?#' 以外」というのは一体何を表しているのだろうか? 調べてみると Rubyでは、数値リテラルの記述方法のひとつとして 「?a」のような書き方で「文字aのコード」を表すことができる。 つまりこの場合、アルファベットの小文字「a」のアスキー(ASCII)コードを十進数表示した「97」となる。 ということで Rubyにおいて「?#」は「# (シャープ) 」記号のアスキー(ASCII)コードを表すことになる。

実際にテストしてみると、
p ?#
というRubyスクリプトを実行してみると
35
となる。 この「35」とは、「# (シャープ)」のアスキー(ASCII)コードを十進数表示した値である。

【参考リンク】

カテゴリー: Ruby     22:20 | コメント (0) | トラックバック (0)

2006年11月15日

Ruby の コメント(1)

プログラミング言語の習得の際に 私がまずチェックするのがコメントの書き方。 さて、Ruby でのコメントの記述方法は?

Ruby リファレンスマニュアル「コメント」」 によると、
スクリプト言語の習慣にならい、文字列中や数値リテラル `?#' 以外の #から行末までをコメントと見なします。
とある。 プログラミング言語のコメントは 大きく「行コメント」と「ブロックコメント」に分けられるが、 Ruby の場合は、Perl や Python 同様に 「# (シャープ) 」による「行コメント」ということになる。

「行コメント」としては他に C++やJavaでの「//」、 BASICでの「REM」や「'(アポストロフィ)」 等がある。 また、「ブロックコメント」としては HTMLでの「<!-- -->」、 C、C++、Java、JavaScript、CSSでの「/* */」

最近の言語の傾向として 「行コメント」と「ブロックコメント」の両方をサポートするようになってきている。 では、Rubyは というと 「コメント」とは称していないが「埋め込みドキュメント」という機能がある。 これは、コメントを開始する行に「=begin」を、 コメントを終了する行に「=end」を記述することにより その間にのテキストを埋め込みドキュメントとすることができる。

コメントついでに「 (?# ) 」 は、正規表現中でのコメントで、括弧の中の任意の文字列は無視されることになっている。

【参考リンク】

カテゴリー: Ruby     22:47 | コメント (0) | トラックバック (0)

2006年11月11日

Ruby のインストール FreeBSD編

私はサーバーを何台か管理しているが それらは全て FreeBSD を使用している。 今回は、FreeBSD上での Ruby インストールについて

これに関しては、 Ruby インストールガイド「FreeBSD」 に書いてある。 ここに書いてあるとおり、 FreeBSDの場合、 バイナリパッケージである package コレクションと ソースから コンパイルしてインストールする Ports コレクション とがある。 私の場合、個人的な好みとして、 ソースからインストールしたいので いつも Ports コレクションからインストールすることにしている。

そこで Rubyも Ports コレクションからインストールしようと思う。 方法は基本的には、この Ruby インストールガイド「FreeBSD」 に書いてある通りなのだが、 この書いてあるPorts用のディレクトリ「/usr/ports/lang/ruby」が存在しておらず、 そのかわりに、「/usr/ports/lang/ruby16」や「/usr/ports/lang/ruby18」が見つかった。 そこで、Rubyのバージョン1.8 をインストールすることとして、その手順は
% su
# cd /usr/ports/lang/ruby18
# make install
# make clean
となる。 実際にやってみると「make install」には 2〜3分かかったが インストールは無事に終了した。

csh において 再ログインすることなく 新しいコマンドを試すためには
# rehash
コマンドを打てばよい。 こうすると、シェルが path 変数の示すディレクトリの内容を保持する内部ハッシュテーブル を再構成してくれるので 今インストールしたばかりのコマンドも認識されようになる。

【参考リンク】

カテゴリー: FreeBSD , Ruby     22:19 | コメント (0) | トラックバック (0)

2006年11月10日

Ruby のインストール Windows編

Rubyを試してみようと思ったら、 まずはインストールしてみなくてはいけない。

Ruby のインストールについては Rubyオフィシャルページの 「Ruby インストールガイド」に 各プラットフォーム別に詳しく解説してある。 また。、 Ruby チュートリアル「0. はじめに」 にも 基本的なrubyのインストールの方法について紹介してある。

ウィンドウズに関しては、 「Microsoft Windows版のビルト環境による違い」 のページの解説のとおり、ビルドにより大きく3種類に分けられるようだ。 違いとしては、コンパイラに マイクロソフトのVisual C++ を使った「mswin32」、 コンパイラに gcc を使った 「Mingw (Minimalist GNU for Windows)」、 そして、実行環境として Cygwin を利用した 「Cygwin版」の3種類である。 とりあえずウィンドウズ上で ruby を試したいのであれば 「mswin32」が最もお手軽のようだ。

では「mswin32」の最新版のファイルをどこから入手したらよいか、というと Rubyのオープンソースプロジェクト 「RubyForge」でも 最もアクセス数がある 「One-Click Ruby Installer」 のページから最新版をダウンロードするとよい。 あとは、ダウンロードしたファイルを実行すると、 自動的にインストーラーが起動するので、 全てディフォルト設定のままで進んで行くとRubyのインストールが終了してくれる。

将来的に もし Rubyのバージョンが上がった場合はどうするべきか? それについては 「RubyInstallerFAQ」ページに
Do I have to uninstall my previous version of Ruby (installed via One-Click Ruby Installer) before I install a newer version?
つまり、「新しいバージョンをインストールする前に、前のバージョンをアンインストールする必要があるのか?」 という質問がある。 その答えとして
You cannot install a new version on top of an old version. In the next release, the installer will check for this and offer to do an uninstall first.
つまり、「今のインストーラーでは古いバージョンの上に、新しいバージョンを上書きすることができない」 とある。 実際に私のPCでもバージョンアップを試みてみたが、 ここに指摘に従って、一度 古いバージョンをアンインストールしてから 最新バージョンをイントールしたが、今のところ問題なく動作している。

【参考リンク】

カテゴリー: Ruby     22:57 | コメント (0) | トラックバック (0)

2006年11月 9日

オブジェクト指向スクリプト言語「Ruby」

最近、Ruby が注目を集めているようだ。 「Ruby」とは まつもと ゆきひろ 氏が開発した オブジェクト指向スクリプト言語であることは、 有名な話である。

今後の開発環境をどうしようかと悩んでいた私も 遅ればせながら、この「Ruby」について少し勉強していこうと思う。 で、いつもの事ながら、このブログを 自分のノート代わりにして学習したことをメモしていくつもである。

自分も今まで いくつかのプログラミング言語を習得してきたつもりではあるが、 新しい言語を勉強するのは、ハッキリ言って骨の折れる時間の掛かる作業である。 全く初めてではないので、今まで習得した言語と、どこがどう違うかということに 焦点をあれてばよいのだが、 逆にいくつかの言語を勉強してしまうと、 実際のプログラミングの際に 細かい文法、例えば、コメントの方法とか、行末にセミコロンが必要かどうか とかが ゴッチャになってしまう。

どんなプログラミング言語でも、習得の始めは 初歩的な入門書を一通り読んでみるのがよいと思っている。 この Ruby については 「Ruby」のオフィシャルページ からもリンクが張られている Rubyのチュートリアル 「プログラミング入門 - Rubyを使って -」 が大変参考になると思う。 また、ウィキペディアの「Ruby」 ページにも rubyの各機能の説明があるし、 「日本Rubyの会」が定期的に発行している 「Rubyist Magazine (るびま)」も大変参考になる。

【参考リンク】

カテゴリー: Ruby     22:13 | コメント (0) | トラックバック (0)

 
ハワイ島での遊覧飛行ツアーとB&Bのスペシャリスト、スカイメリカ
Copyright © 2003,2009 Skymerica Corp. All rights reserved.