2007-01-01から1年間の記事一覧

Ruby 1.9.0 で tDiary を動かしてみる(トップページだけ)

http://www.machu.jp/diary/20071228.html#p01 まちゅさんによる記事。Ruby 1.8.5で動いていたtDiaryを1.9.0で動かす試み。 Rubyの違いに注目するだけではなく、トラブったときの調べ方、目の付け所を参考にするとよさげ。

Ruby-1.9.0 Windows Installer Package

お試しパッケージということでRuby-1.9.0を一式パッケージ化したMSIを提供します。 L'eclat des jours(2007-12-27) arton先生、ありがとう!

プログラミング言語Rubyの勉強会資料

わかりやすいRubyの資料。 http://dev.ariel-networks.com/articles/workshop/ruby/ via id:naoyaのブックマーク

JRubyが速くなっている?

JRubyが遅いという話は過去のものになるかもしれません。 http://recompile.net/2007/10/trunkjruby.html だそうです。わくわく。 追記: なひさんから情報(感謝)。 あらかたJRuby勝ってる。でもRoRで不思議なことが、というエントリが以下。エントリ内で…

String#replace

[ruby-list:44038]を読んで、String#replaceという破壊的なメソッドを知る。 a = 'hyuki' b = a a.replace 'rubyco' # 破壊的 puts a, b c = 'hyuki' d = c c = 'rubyco' # 非破壊的 puts c, d 実行結果です。 rubyco rubyco rubyco hyukiString#replaceはSt…

フィボナッチ・ミュージック

artonさんのところで見かけたのを、そのままお借りしています。すみません。JRubyにして動かしています。 # cf. http://arton.no-ip.info/diary/20070807.html#p01 require 'java' def fib(n, r = [0,1]) r[n] ||= fib(n - 2, r) + fib(n - 1, r) end class …

添字に正規表現を使って置換

RubyではString#[]=で正規表現を指定すると破壊的な置換ができます。 以下の例では、strが保持しているStringオブジェクトを書き換えてcolorをflowerにしています。 str = 'Do you like this color?' str[/color/] = 'flower' p str #=> "Do you like this f…

String.newではto_strメソッドが使われる

7月になったのでStringクラスで遊びましょう(意味なしジョーク)。 オブジェクトoを文字列として扱うときにはto_sメソッドを使いますが、String.new(o)で文字列を作るときには、to_strメソッドを使います。 class Rubyco def initialize(s) @s = s end def …

String#%は書式制御

RubyのString#%メソッドは、レシーバをprintf的書式制御文字列として扱います。 以下の例では、0〜31の数値を10進数、16進数、2進数で表示します。 (0..31).to_a.each do |k| puts "%5d %5X %5b" % [k, k, k] end 実行結果です。 0 0 0 1 1 1 2 2 10 3 3 11 …

String#*は文字列の繰り返し

String#*を使って、指定した回数繰り返した新しい文字列を作ることができます。 以下のプログラムでは'-'を20個並べた横線を表示します。 puts '-' * 20 実行結果です。 --------------------ちょっと遊びましょうか。 ['-', '=', '+'].each do |a| ['-', '=…

指定した期間内から、ランダムで一日を選択する

randを使ってある期間(1940〜1980とか)をランダムに返すにはどうしたらいいんだぁあぁあぁあぁあ http://d.hatena.ne.jp/ayabaud/20070704/1183527974 を読んで、別のことを考えました。 指定した期間内から、ランダムで一日を選択する方法。全期間分のDat…

1から1000まで続けて書いてできる整数…を考える

sumimさんの記事経由で灘中学校98年2日目第1問(問題)へ。 1から15まで続けて書くと123456789101112131415となる。これを1つの整数と考えると、この数は21けたで,1が8回使われている。このように、1からある整数まで続…

Rubyの父と対談

rubycoの中の人id:hyukiが、Rubyの父Matzさんと対談しました。詳しくはこちらをどうぞ。 日経ソフトウエアで「まつもとゆきひろ×結城浩」の対談

Marshalでオブジェクトを冷凍保存

Marshal.dumpでRubyのオブジェクトをファイルに保存し、Marshal.loadで戻すことができます。 1. 以下のプログラムではオブジェクトxをalice.dumpedというファイルにdumpで保存し、すぐ後でloadしてhelloメソッドを呼び出しています。 require 'pathname' cla…

メソッドの戻り値

Rubyでは、returnが書かれていないとき最後に実行した文の値が戻り値になります。 def method "hello" if false end p method #=> nil 上で、表示されるのがfalseではなくnilなのは、ifの条件式が成り立っていないときのif文の値はnilだから、と理解しました…

正規表現の選択

正規表現の選択(|)の優先順位は低いので注意が必要です。 1. 以下のプログラムは、メールの中から「行頭にFrom:またはSubject:を含む行を抽出する」ものですが、期待はずれに終わります。 # 期待はずれ require 'pathname' Pathname.new('girl.mbox').open('…

Rubyで実験するルートの無限入れ子

ルートの無限入れ子クイズ(問題編+解答編)をRubyで実験してみます。 a = Math.sqrt(2) 20.times do |k| p a a = Math.sqrt(2 * a) end 実行結果は以下です。収束しそうな様子が読み取れますね。 1.4142135623731 1.68179283050743 1.83400808640934 1.915…

ランキングの集計

リスト中に登場する回数の多い要素トップ N を計算するとき、どんな風に書きますか? ランキングの集計 - まめめも via http://d.hatena.ne.jp/sumim/20070619/p2 たとえば、以下のように書きます。 ary = %w(foo bar foo baz foo bar qux foo bar qux quux)…

メソッド定義の中でメソッド定義

Rubyでは、メソッド定義の中でもメソッドを定義することができます。 以下のプログラムでは、outerメソッドの定義の中でmethodというメソッドを再定義しています。そのため、outerメソッドの呼び出し前後で、methodの戻り値が変化しています。 def method re…

クロージャによる超軽量並行プロセス

sumiiさんの『クロージャによる超軽量並行プロセス』を、jijixiさんがRubyに移植したようなので、試してみました。jijixiさんが書いたサンプルを写経して(そのあと、変数名などを自分の理解した範囲で書き換えて)やっと理解しました。 require 'picalc' # Sy…

Array#+とArray#concatの違い

Array#+では、新しいArrayオブジェクトが作られる。Array#concatではselfに足し込まれる。 以下のプログラムでは、新しいオブジェクトが作られたかどうかをobject_idメソッドで調べています。また、+を行う前に変数cに代入しておいた配列にはbが足し込まれな…

シングルクォートの文字列リテラルで置換されるもの

Rubyでは、シングルクォートでくくられた文字列リテラル '...' の中で使える \ のエスケープは、\\ と \' だけです。そのことを確かめようと思いました。 プログラムで \すべての文字 という形の文字列を作り、evalして長さがいくら減るかを調べます。 s = '…

Benchmarkモジュールでベンチマークテスト

複数の実装方法のどちらが速いかな?とRubyで調べたいときには、Benchmarkモジュールが便利です。 1〜nまでの和を計算する二つの方法を比較してみましょう。以下のプログラムでは、足し算を本当に繰り返して求める方法(method1)と、公式を使って計算で求める…

文字列の分割(scanとsplit)

String#scanを使うと、パターンを指定して必要な文字列を抜き出すことができます。 String#splitを使うと、区切り文字(デリミタ)を指定して必要な文字列を抜き出すことができます。 以下に例を示します。 p '123,45;6789/012'.scan(/\d+/) #=> ["123", "45…

Mailクラスでメールを解析する

Mailクラスを使うとメールを解析することができます。以下では、mbox形式のファイルストリームからメールを読み出し、差出人に example.com が含まれているものを集計しています。 require 'mailread' MBOX = 'math_girls.mbox' from = Hash.new(0) File.ope…

数字だけの文字列に注意

Rubyで、数字だけの文字列が出てきたとき、Perlの数値コンテキストの気分になっちゃうとエラーになるので注意。 [ "314", "159", "265", "358" ].each do |n| puts n + 1 end #=> in `+': can't convert Fixnum into String (TypeError) Kernel#Integerを使…

Duck Typingは大規模プロジェクトでも大丈夫か?

整数として処理したければ、オブジェクトがto_iという振る舞いを持っていることを期待してなんでもとにかくto_iしてしまうのがDuck Typingなのかなと思いました。 Duck Typing? - 18 til i die (another phase) なるほど、そうですね。 そういえば、Duck Typ…

http://d.hatena.ne.jp/takahashim/20070610#p1 何だかいいですね。 関係者のみなさまお疲れさまでした。

サンタクロース問題を解く(Ruby)

サンタクロース問題をRubyで書いてみました(via サンタクロース問題を Squeak Smalltalk で)。あちこちまだ変ですが、とりあえず公開。 require 'thread' REINDEER_NUM = 9 ELF_NUM = 10 DISCUSS_NUM = 3 mutex = Mutex.new santa_cv = ConditionVariable.…

JRuby: 速報ログ

http://jp.rubyist.net/RubyKaigi2007/Log0609-S1-04.html