2007-06-01から1ヶ月間の記事一覧

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

JRuby+RailsとRuby+Railsの速度比較

JRuby が「本家Rubyより速い」という @IT 記事をみて、Rails 上でスループットを比較してみました 結論としては、本家のほうがだんぜん速かったです... (略) 各一分の簡単な計測ですので、誤差はあると思いますが、それでも倍近い差ですね [ruby-list:43602]…

来週の今日、再来週の今日、…の日付を出力する

今日を起点にして、来週の今日(つまり7日後)、さ来週の今日(つまり14日後)、…を指定した回数繰り返すRubyスクリプト。以下では10週後までを表示しています。 weeks = 10 start = Date.today start.step(start + 7 * weeks, 7) do |date| puts date end 実行…

at_exitで終了時の処理を登録する

Rubyでは、at_exitで終了時の処理を登録することができます。 以下では、終了時にresourceがnilになっているかどうかを調べ、nilになっていなければメッセージを表示します。乱数を使って確率1/2で失敗するようにしてあります。 resource = '(Important reso…

JRuby: JavaプラットホームのためのRuby

この土日はRuby会議2007があります。関係者のみなさま、頑張ってください。6月9日のセッション壱の最後にはJRubyがありますね。 Ruby has become one of the fastest-growing languages in the world. Java is the most widespread platform in the world. J…

Rijndaelで遊ぶ

急にRubyで暗号化がしたくなりました。 1. cryptをインストールします。 C:\work> gem install crypt Successfully installed crypt-1.1.4ちなみにファイルは C:\ruby\lib\ruby\gems\1.8\gems\crypt-1.1.4 にインストールされています。 2. スクリプトを作り…

Amazon.co.jpの特定商品のランキングを調べるRubyスクリプト(修正あり)

『数学ガール』がアマゾンで予約可能になりました。この機会に「Amazon.co.jpの特定商品のランキングを調べるRubyスクリプト」を書いてみようと思いました。いまから作るのは「ASINのリストを元に、その本のタイトルと現在のランキングを表示する」というス…

SQLite3で遊ぶ(2)

昨日は途中で眠っちゃったので、仕切り直し。今日はテーブルの作成(CREATE TABLE)、レコードの挿入(INSERT)、それにSELECTを実行します。それからトランザクションも。 1. テーブルの作成(init.rb) CREATE TABLEを使ってpeopleというテーブルを作ります。rub…

ActionController::Base, Paginator

Ruby on Railsのscaffoldで生成したコントローラを読み、スーパークラスのApplicationController経由でActionController::Baseをちらちらと読んでいます。renderメソッドを読んで、少しわかった気分になりました。 そのあとPaginatorクラスをすこし読んで「…

SQLite3で遊ぶ(1)

何となく、Rubyを使ってSQLite3で遊びたくなりました。 1. CREATE TABLEでテーブルを作ります require 'sqlite3' SQLite3::Database.new('rubyco.db').execute_batch(<<-'EOD') CREATE TABLE people ( name TEXT ,mail TEXT ); INSERT INTO people VALUES ('…

Rubyの{ }と戯れて

1. 「ブロックを表す { } と、ハッシュリテラルの { } が混同されることはあるか?」というのが最初に抱いた疑問でした。それについては自分で「tASSOC(つまり=>)の有無でわかるじゃん」と思いました。つまり、以下の二つのメソッドmethod1, method2の呼び…

OpenStructで動的構造体を作る

RubyのOpenStruct(ostruct)を使うと、属性が自動生成される構造体を作ることができます。 require 'ostruct' alice = OpenStruct.new alice.name = 'Alice' alice.mail = 'alice@example.com' p alice #=> #<OpenStruct name="Alice", mail="alice@example.com"></openstruct>