Hatena::Grouprubyist

irykazeの日記 このページをアンテナに追加 RSSフィード

2009-02-12Ruby 1.9.1 リリースとインストーラー

[]Ruby 1.9.1リリースとデブサミ 00:11 Ruby 1.9.1リリースとデブサミ - irykazeの日記 を含むブックマーク はてなブックマーク - Ruby 1.9.1リリースとデブサミ - irykazeの日記 Ruby 1.9.1リリースとデブサミ - irykazeの日記 のブックマークコメント

デブサミでyuguiさんのRuby 1.9.1の話を聞いてきた。

とりあえず早く移行しろ、とお達しを受けたので、インストーラを探してみる。

Ruby-1.9.1-p0のWin32版だと、以下の2種類が見つかったので、ちょっとメモ。

2008-12-19Rubyエバンジェリストになるために。

[]Rubyをほかの人に教えるってどうしたらいいんだろうか。 22:14 Rubyをほかの人に教えるってどうしたらいいんだろうか。 - irykazeの日記 を含むブックマーク はてなブックマーク - Rubyをほかの人に教えるってどうしたらいいんだろうか。 - irykazeの日記 Rubyをほかの人に教えるってどうしたらいいんだろうか。 - irykazeの日記 のブックマークコメント

そもそも、プログラミングをやったことない人に、どうやって教えればいいもんか、ということをちょっと考えてみた。


ひとつのアプローチとして、こんな感じになるのかなと思う。

  • コマンドプロンプトで、cdとかdirとかの基本操作を触ってみる。
  • irbで、putsとか、足し算引き算の命令を試してみる。変数を作って、表示するとか。
  • irbで、if文、whileとかloop文を書いてみる。
  • irb上でメソッドを自作してみる。
  • irb上で、ブロックを使ってみる。
  • その後、エディタでプログラムを書いてみる。
  • それから、クラスを定義したりして、複数のクラス(複数のスクリプトファイル)をTDDで作っていく。
    • テストプログラムは、こちらで作っておく。
    • irbでプログラムを試したり、APIリファレンスを使うことを教えておく。
    • 逆引きRubyも教えてあげるといいかも。

今日の記事は、Rubykaigiの、「成功するRuby教育のプラクティス (吉田裕美)」の動画を見て、思いついたことをメモってみた。

講演の様子は、ここで見れます。

2008-12-07Ruby で DSL

[][]Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 22:14 Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 - irykazeの日記 を含むブックマーク はてなブックマーク - Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 - irykazeの日記 Rubyで言語内DSLを実現するための参考文献へのリンクをまとめてみる。 - irykazeの日記 のブックマークコメント

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/FAQ_CAD1BFF4A1A2C4EABFF4A1A2B0FABFF4.html#a2.2e1.20.ca.d1.bf.f4.a4.e4.c4.ea.bf.f4.a4.d8.a4.ce.c2.e5.c6.fe.a4.cb.a4.e8.a4.ea.a5.aa.a5.d6.a5.b8.a5.a7.a5.af.a5.c8.a4.cf.a5.b3.a5.d4.a1.bc.a4.b5.a4.ec.a4.de.a4.b9.a4.ab


Rubyで使われる記号の意味 - *

http://www.ruby-lang.org/ja/man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html#a.2a


「機能別索引」

http://www.ruby-lang.org/ja/man/html/_B5A1C7BDCACCBAF7B0FA.html#a.ca.d1.bf.f4.a4.f2.ba.ef.bd.fc.a4.b9.a4.eb

Rubyにおいて、変数・メソッドを定義する、一覧取得する、削除する方法が調べられる。



FAQ:ブロック付きメソッド呼び出し」

http://www.ruby-lang.org/ja/man/html/FAQ_A5D6A5EDA5C3A5AFC9D5A4ADA5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html




あと、DSLを実装するときには、いかにブロックを使いこなすか、ということが重要だと思う。

たとえば、Rakeなんかも、taskを表現するときにはブロックを使ってる。



で、そのブロックの実装には「yield」とか使う、はず。(よくわかんないけど)

http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#yield


それに関連して、ブロックを渡すときには、&を使うらしい。

Rubyで使われる記号の意味 - *

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ファイルを読む。

[]Faster CSVで、tsvファイルを読む。 09:53 Faster CSVで、tsvファイルを読む。 - irykazeの日記 を含むブックマーク はてなブックマーク - Faster CSVで、tsvファイルを読む。 - irykazeの日記 Faster CSVで、tsvファイルを読む。 - irykazeの日記 のブックマークコメント


<参考ページ>

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のドキュメントによると、

%w!STRING! : 要素が文字列の配列(空白区切り)

c.f. 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を作る

[][]RubyServletを作る (HTTPServlet::AbastractServletの使用例) RubyでServletを作る (HTTPServlet::AbastractServletの使用例) - irykazeの日記 を含むブックマーク はてなブックマーク - RubyでServletを作る (HTTPServlet::AbastractServletの使用例) - irykazeの日記 RubyでServletを作る (HTTPServlet::AbastractServletの使用例) - irykazeの日記 のブックマークコメント

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ボタンを押すと、入力した文字列が表示される。


[][] SQLite3-rubyを使う  SQLite3-rubyを使う - irykazeの日記 を含むブックマーク はてなブックマーク -  SQLite3-rubyを使う - irykazeの日記  SQLite3-rubyを使う - irykazeの日記 のブックマークコメント

Rubyで手軽にデータベースを使うなら、sqlite-rubyがいいのかな。

id:rubyco:20070606#sqlite3 にあるサンプルコードをみながら、試してみる。

SQLiteって、トランザクションを使って書き込みをしないと、プログラムが落ちるほどに書き込みが遅いのね。原因不明のバグじゃなかったんだ。

大体1Mbくらいのデータベースを書き込むときは、必ずトランザクションを併用しよう。

SQLite3-ruby FAQの日本語訳があったら、需要があるんだろうか? 翻訳を見かけたことないから、需要がないんだろうな、うん。

GananGanan2007/11/22 19:57大変分かり易い例をありがとうございました!
助かりました。

irykazeirykaze2011/05/21 15:04すごく昔のコメントに今更気づきました。
反応がおくれて申し訳ないです。

お役に立てて光栄です。