2009-02-12Ruby 1.9.1 リリースとインストーラー
2008-12-19Rubyエバンジェリストになるために。
■ [Ruby]Rubyをほかの人に教えるってどうしたらいいんだろうか。

そもそも、プログラミングをやったことない人に、どうやって教えればいいもんか、ということをちょっと考えてみた。
ひとつのアプローチとして、こんな感じになるのかなと思う。
- コマンドプロンプトで、cdとかdirとかの基本操作を触ってみる。
- Open Command Window Here(PowerToys for Windows XP)を使えば、いろいろ楽になるかも。
- 人によっては案外、「*」(ワイルドカード)の使い方とか、タブでファイル名の補完ができることを知らなかったりするかも。
- あとコマンドプロンプトの便利機能として、コマンドプロンプトに、ファイル・フォルダをドラッグ&ドロップすると、そのファイル・フォルダのフルパスが入力できる。
- irb上でメソッドを自作してみる。
- irb上で、ブロックを使ってみる。
- その後、エディタでプログラムを書いてみる。
- それから、クラスを定義したりして、複数のクラス(複数のスクリプトファイル)をTDDで作っていく。
今日の記事は、Rubykaigiの、「成功するRuby教育のプラクティス (吉田裕美)」の動画を見て、思いついたことをメモってみた。
講演の様子は、ここで見れます。
2008-12-07Ruby で DSL
■ [Ruby][DSL]Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。

「DSLってなんだ?」っていう人は、まつもとさんの記事を読むと少しわかるかもしれない。
「まつもと直伝 プログラミングのオキテ 第6回 メタプログラミング」
http://itpro.nikkeibp.co.jp/article/COLUMN/20070604/273453/?ST=oss
Rubyはメタプログラミング機能が優れているってって話。
どのような点で優れているかっていうと、Rubyでは、Classクラス(Moduleクラスのサブクラス)のメソッドを駆使して、動的にクラス定義を生成できる。
(いや、Javaとかでも同じことはできるんで、優れているというのは間違っているともいえるけど。)
また、動的にクラス定義を変更することも可能(変数、定数、メソッドの「一覧参照・追加・変更・削除」が可能)
詳しくは、Rubyのリファレンスを参照。
Moduleクラス
http://www.ruby-lang.org/ja/man/html/Module.html
Classクラス
http://www.ruby-lang.org/ja/man/html/Class.html
なお、Classクラスは、Moduleクラスのサブクラスとして実装されている。
Methodクラス
http://www.ruby-lang.org/ja/man/html/Method.html
Symbolクラス
http://www.ruby-lang.org/ja/man/html/Symbol.html
Rubyの実行系では、クラス、メソッドを特定するために、Symbolクラスを利用する。
なお、String <-> Symbolの相互変換が可能。なので、これをうまく使えば、設定ファイルから、動的にクラス定義を生成することが可能。
蛇足だけれど、以下のページによると、Symbolクラスの値は、即値らしい。
http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.2a
「機能別索引」
Rubyにおいて、変数・メソッドを定義する、一覧取得する、削除する方法が調べられる。
「FAQ:ブロック付きメソッド呼び出し」
あと、DSLを実装するときには、いかにブロックを使いこなすか、ということが重要だと思う。
たとえば、Rakeなんかも、taskを表現するときにはブロックを使ってる。
で、そのブロックの実装には「yield」とか使う、はず。(よくわかんないけど)
http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#yield
それに関連して、ブロックを渡すときには、&を使うらしい。
http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.26
それから、単項演算子の再定義には@を使う。
http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.40
これくらいを知っていると、DSLに関する記事を読んでも、なんとなくイメージがわくんじゃないかと。
たとえば、InfoQにいい記事があったので紹介。
http://www.infoq.com/jp/articles/properties-metaprogramming
あと、こことか。
http://techno.hippy.jp/rorwiki/?An+Exercise+in+Metaprogramming+with+Ruby
2007-09-25Faster CSVで、tsvファイルを読む。
■ [Ruby]Faster CSVで、tsvファイルを読む。

<参考ページ>
FasterCSV
Rubyの標準添付CSVパーサーが遅い
Rubyの標準ライブラリにくっついているCSVクラスとは違って、セパレータを指定する方法がわからず戸惑った。
なるほど。引数がハッシュのときは、こういう風に指定すればいいのか。
# tsv.rb : tsvファイルを読み込むサンプル require 'fastercsv' FasterCSV.foreach("test.log", :col_sep=>"\t", :headers=>%w(id name message), :return_headers=>true) do |row| p row end
サンプルプログラムの補足。
"%w"は%記法ってのがあって、Rubyのドキュメントによると、
だそうです。
ということで、早速実行してみる。
サンプルデータはこれ。
1 sato "hello world!" 2 abe "good bye!" 3 ida "execuse me..."
プログラムの出力結果は以下のとおり。
$ruby tsv.rb #<FasterCSV::Row:0x2f98cb8 @row=[["id", "id"], ["name", "name"], ["message", "message"]], @header_row=true> #<FasterCSV::Row:0x2f98754 @row=[["id", "1"], ["name", "sato"], ["message", "hello world!"]], @header_row=false> #<FasterCSV::Row:0x2f98254 @row=[["id", "2"], ["name", "abe"], ["message", "good bye!"]], @header_row=false> #<FasterCSV::Row:0x2f97d7c @row=[["id", "3"], ["name", "ida"], ["message", "execuse me..."]], @header_row=false>
ちなみに、foreachメソッドの引数から、":return_headers=>true"を削ると、出力結果の1行目
#<FasterCSV::Row:0x2f98cb8 @row=[["id", "id"], ["name", "name"], ["message", "message"]], @header_row=true>
の部分がなくなる。csvファイルのヘッダ部分(カラム名のところ)がなくなるってことです。
また、サンプルコードを
# tsv.rb : tsvファイルを読み込むサンプル require 'fastercsv' FasterCSV.foreach("test.log", :col_sep=>"\t") do |row| p row end
のようにした場合の出力は、以下のとおりです。
$ruby tsv.rb ["1", "sato", "hello world!"] ["2", "abe", "good bye!"] ["3", "ida", "execuse me..."]
「:headers=>%w(id name message)」, 「:return_headers=>true」の使い方もなんとなくわかった。
でも、データを読むだけだったら、そうそう使わないだろうな。
2007-09-22RubyでServletを作る
■ [Servlet][Ruby]RubyでServletを作る (HTTPServlet::AbastractServletの使用例)

Rubyでもサーブレットが作れる、ということを知ったので、早速試してみた。Javaのサーブレットとおんなじ感じ。でも、コードがすっきりしてる。
Rubyでサーブレットを使うってことで、わかりやすくtnomuraさんが説明していたで、引用させてもらう。(リンク先の最後尾のところ)
サーブレットを作成するためには、HTTPServlet::AbastractServlet クラスから、サーブレット HelloServlet を導出して、そのクラスに do_GET のようにリクエストの名前に関連したメソッドを定義します。
それからサーバオブジェクト s の mount メソッドを使って、URI と サーブレットクラスを登録すると、ブラウザからの GET リクエストにたいして do_GET メソッドが実行されます。
この説明には、サーブレットのサンプルコードがついていた。勉強のため、これを改造。
ということで、以下、その改造したサンプルコード。
#!/usr/bin/ruby # servlet.rb サーブレットのサンプル require 'webrick' include WEBrick s = HTTPServer.new( :Port => 8080 ) class HelloServlet < HTTPServlet::AbstractServlet def do_GET(req, res) body =<<HTML <HTML> hello, world.<br> <form method="POST" action="hello"> INPUT:<input type="text" name="input"> <input type="submit" value="send"> </form> </HTML> HTML res.body = body res['Content-Type'] = 'text/html' end def do_POST(req, res) res.body = "<HTML>INPUT : #{req.query["input"]}<br></HTML>" res['Content-Type'] = 'text/html' end end s.mount('/hello', HelloServlet) trap('INT'){ s.shutdown } s.start
ちなみに、Servletのdo_GETメソッドの引数の型が、WEBrick::HTTPServlet::AbstractServletには書いてなかったので補足。
reqとresは、それぞれWEBrick::HTTPRequestオブジェクトとWEBrick::HTTPResponseオブジェクトなんだそうな。
念のため、サンプルプログラムの使い方について。
使い方は、まず上記の servlet.rb を保存。「ruby servlet.rb」でサーバを実行したら、http://localhost:8080/helloにアクセスする。フォームに文字列を入力し、sendボタンを押すと、入力した文字列が表示される。
■ [SQLite][Ruby] SQLite3-rubyを使う

Rubyで手軽にデータベースを使うなら、sqlite-rubyがいいのかな。
id:rubyco:20070606#sqlite3 にあるサンプルコードをみながら、試してみる。
SQLiteって、トランザクションを使って書き込みをしないと、プログラムが落ちるほどに書き込みが遅いのね。原因不明のバグじゃなかったんだ。
大体1Mbくらいのデータベースを書き込むときは、必ずトランザクションを併用しよう。
SQLite3-ruby FAQの日本語訳があったら、需要があるんだろうか? 翻訳を見かけたことないから、需要がないんだろうな、うん。
助かりました。
反応がおくれて申し訳ないです。
お役に立てて光栄です。