Ruby

RubyKaigi2011 Individual Sponsor

今年も個人スポンサーになりました。ロゴもできたようなので、右へ貼りつけてみました。 当日を楽しみにしております。行けるかどうか微妙な感じだけど。 ていうか来年どうしたいか、我々自身がかんがえないといけないんだろうなあ。今年は小学校のサマーキ…

RubyKaigi2010の個人スポンサーになった

20,000JPYという、お小遣いのサイズから見ても決して小さくはない金額に少し迷ったのだけど、RubyKaigi2010の個人スポンサーになった。 仕事で、プライベートで、いろいろと人生の幅を広げてくれたRubyに、でもこれまで何もしてあげられなかったので、せめて…

札幌Ruby会議01をUstream.tvで観た

hsbtさんの発表と、Lightning Talkの最初のほうと、角谷さんの発表をリアルタイムで視聴した。LTは全部聴くつもりだったけどヤボ用で席を外して戻ってきたら終わってた。動くドラ娘ことid:objectclubをあまり見られなかったのが残念。 べ、別に初音ミクのコ…

人にRubyを教えるとき

特にJava方面の人に教えるときに気をつけるべきこと。今日実際に教えてみて少し分かったような気がするので。 オブジェクト指向の実装の仕方の違い publicとprivateの区分がJavaとはかなり違うということ 代入が実は代入ではないということ 2番目は「まるご…

Ruby-DBI

影舞を入れる過程でRuby-DBIのパッケージを作った。しかしSQLiteに対応させるにはSQLite3/Rubyが必要そうなので、そっちを先に作らないと、putできないな。時間とやる気をどうやって確保するか悩みどころ。

Object#methodsは何でもかんでも検出してくれるわけじゃない

スクリプト。 class Hoge def initialize @foo = "ruby" end def method_missing return self.instance_variable_get("@#{name.to_s}") end end hoge = Hoge.new p hoge.foo p hoge.methods.include?("foo") 実行結果。 "ruby" falseまあ当たり前だが、その…

Hashが順序を保存するらしい

そろそろ議論も落ち着いたのかruby-devへ移ったのか知らないが、ruby-listでは大体収束したみたいなので。 Hashへの生成順は保障されないのか?から始まる長い、長ーいスレッドで、1.9のHashは登録順が保存されるようになってしまった。 まあ喜ぶ人がいて、…

<a href="http://d.hatena.ne.jp/rubyco/20070620/returnvalue">メソッドの戻り値</a>

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

Duck Typing?

または、String#to_iを使って整数に直します。 [ "314", "159", "265", "358" ].each do |s| puts s.to_i + 1 end というか、整数として処理したければ、オブジェクトがto_iという振る舞いを持っていることを期待してなんでもとにかくto_iしてしまうのがDuck…

FizzBuzzワンライナー

1.upto(100){|i|s=((i%3==0)?"Fizz":"")+((i%5==0)?"Buzz":"");p((s=="")?i:s)} スペースがないのが自慢(をい 追記 ネタ元ははてなブックマーク - どうしてプログラマに・・・プログラムが書けないのか?を参照。 ところで、シンタックスハイライトが追いつ…

assert_raiseの落とし穴

Test::Unitのassert_raiseメソッドを使おうとして落とし穴ににハマった。というか以前もハマったのだがまた同じ穴にorz…というわけでメモ。 assert_raiseにはブロックを与える。例: require "test/unit" require "class/hoge" def TestHoge < Test::Unit::T…

Object#method_missingの罠

以下のようなコード*1を書いてDRY原則万歳とか思っていたのだが、 require 'logger' class Hogelog def initialize(file) @log = Logger.new(file) @log.level = Logger::INFO end def method_missing(name, message, error = RuntimeError) @log.send(name,…

cloneはオブジェクトの参照先までcloneしない

今作っている数独解法ツールでは、入力ファイルの形式に出力するメソッドを用意して、それをTempfileに吐き出して、入力ファイルとして読み込む、という野蛮な方法でcloneしている。 > Smalltalk-80 には deepCopy メソッドがあるんですが、あれにはあれで >…

<a href="http://d.hatena.ne.jp/k3c/20070224/p2">数独解法ツール</a>の続き

一晩考えたが結局、超難問を解くロジックは見つからなかったので、別のアプローチ。 総当りメソッド(w ボードスイープとエリアスイープを繰り返して、変化がなくなった時点で、空マスに入る候補の数字はかなり絞り込まれている。中には2つの数字のうちどち…

数独解法ツール

数独というパズルがあって、どんなものか説明するのは大変めんどくさいのでググってほしいのだが、そのパズルを解くツールをRubyで作ってみた。たぶんどこかに転がっているとおもうのだが、探すのが面倒なのと頭の体操代わりに自分で作ってみたくなったのだ…

ローカル変数のスコープのデフォルトが変更になる、らしい

今までブロックローカルにすることを意図していたコードは、Ruby 2.0では全部書き直しってことですね。ちょっとそこだけ面倒かなあ。機械的には書き換えられそうにないし。 通常の代入によって作られるローカル変数は(class,module,defが作る)スコープローカ…

String#intern

影舞をhogeっていてうまく動かないのでなぜかと思ったら、Ruby 1.8.5からは、セーフモード1では汚染されたStringインスタンスに対してString#internするとSecurityErrorになるのだそうだ。Hashのキーを入力から取ってinternしようとしてSecurityError。 しか…

Float::EPSILON

Rubyレシピブック(P290)で 比較する数値の差を Float::EPSILON と比較する方法がありますが、記事の例(比較する数値が1.0)はTrueとなってうまくいきますが、それ以外の数値ではFalseでうまくいきません。 比較したい数で割るのを忘れているとか: $ ruby -e '…

<a href="http://www.google.co.jp/search?q=DRY%E5%8E%9F%E5%89%87&lr=lang_ja&ie=utf-8&oe=utf-8">DRY原則</a>

Rubyで簡単な計算プログラムを書きながら、DRY原則って大事だな、と思った。コードを書いて動かしてみながらいろいろ拡張していくときにも、DRY原則をなるべく守れるように考えて書いていくほうが、拡張性が圧倒的に高くなることを実感した。