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

スプラッタ

単項演算子のアスタリスクの意味がよく分からない。 irb(main):001:0> a = [1,2,3] => [1, 2, 3] irb(main):002:0> p a [1, 2, 3] => nil irb(main):003:0> p *a 1 2 3 => nil irb(main):004:0> *b = 4,5,6 => [4, 5, 6]配列をバラしてオブジェクトの並びに…

Social IMEをコマンドラインから

Web 2.0時代のかな漢字変換Webサービス「Social IME」がAPIを公開している。これがWebサービスとかRESTとか、JSONとか、そんなややこしいものじゃなくて、単に「/api?string=」で文字列を渡せば、ペロンとタブ区切り、改行区切りの変換候補文字列がプレーン…

なぜコンストラクタは多段ロケットみたいなの?

Rubyではオブジェクトをインスタンス化するのにnewメソッドを使う。でも実際にはinitializeというメソッドが呼ばれる。なんでこの2つが一致していないのか、どうも分からない。str=String.intialize("hello")とかでいいんじゃないの?The Ruby Wayにはちょっ…

クラスのfreeze

オブジェクトはObject#freezeメソッドで凍結できるというじゃないか。 str = "hey" str.freeze str.upcase! # TypeError: can't modify frozen string ということはClassオブジェクトもかしらと思ってやってみた。 String.freeze class String # TypeError: …

injectの練習問題

与えられた単語のリストから、もっとも多く母音が含まれる単語を返す。というのは、injectを使う例として恣意的に考え付いた練習問題だけど。ついでにString#scanも使ってみたかった。 class String def number_of_vowels scan(/[aiueo]/).size end alias si…

クラスメソッド練習問題

クラスメソッドの練習問題。アルコールの分解速度はその人がもつ酵素の構成で遺伝的に決まっており、二日酔いにならない飲酒量というのは人それぞれで決まっている。問題は、世の中にはいろんな種類のお酒があって、いわゆる「チャンポン」な飲み方をすると…

ruby-modeあなどりがたし

ruby-modeをあなどっていた。単にインデントやキーワードの色付けをしてくれるだけじゃなく、endの自動補完とかリージョンをirbに送りつけて別バッファで実行するといったこともできるらしい。Emacs万歳だ。 (require 'ruby-electric) (add-hook 'ruby-mode-…

singletonを調べてみる

「シングルトン(singleton)」という言葉が気になっていろいろ読み漁っている。もともとRHGのクラスの実装の解説を読んでいたところで「特異メソッド」というのが出てきて、これは一体なんだと思ったというのがきっかけ。ヘンな取っ掛かりだ。RHGは相変わら…

演算子? メソッド?

演算子の「+」や「-」は実際にはメソッド。自己代入演算子の「+=」はシンタックス・シュガーで、実際には「+」で定義されたメソッドが展開されているだけだという。演算子に見えるものはメソッドなのでオーバーライドできる。 class Fixnum def +(n) self **…

Ruby道

Ruby Way 第2版 (Professional Ruby Series)作者: Hal Fulton,豊田祐司,株式会社クイープ出版社/メーカー: 翔泳社発売日: 2008/04/15メディア: 大型本購入: 2人 クリック: 221回この商品を含むブログ (24件) を見る Hal Fultonさんが書いた「The Ruby Way」…

計算の途中経過の保存

計算途中の値をとりあえず保存したり、そのための変数名を用意するするのって何だか面倒な気がするけど、Rubyでどうやったらそれをなくせるのかがよく分からない。与えられた数値のリストから平均値を求める計算は、Lispでは以下のように書ける、というか以…

WEBrickでl33t変換プロキシを作ってみた

いいプログラマはコードをよく読むという。で、Rubyで何を読んだらいいかと聞けば、WEBrickと答える人が多いようだ。構成も美しいし、HTTPサーバなので、ネットワーク関連の処理もテキスト処理も入ってくるからということらしい。それで、あれこれ眺めたり検…

apt-get install jruby1.0

Ubuntu(ていうかDebianだろうけど)にはJRubyのパッケージがあるみたいなので、入れてみた。「aptitude instal jruby1.0」とか。それでsudoku.rbで数独パズルを生成するベンチをしてみて速いのかどうかみてみた。 $ jruby1.0 -v ruby 1.8.5 (2008-01-07 rev…

Threadを試してみた

Threadを試してみた。といってもRHGにあるサンプルをいじってみただけ。 i = 1 Thread.fork { while true puts i sleep 1 end } while line = gets i += 1 end $ ruby t.rb 1 1 1 3 7なるほど。マルチコアで処理速度が上がるわけではないようだけど、何だか…

Proc.newで冗長なコードを取りまとめ

「cp」と「mv」とメソッド名が2文字しか違わない以下の冗長なコードをまとめる方法として、Procオブジェクトを使ってみることにした。 if Options[:copy] Options[:events].each {|n| nikon.event(n).each {|photo| FileUtils.cp(photo[0],".", {:verbose =>…

タクシーキャブ数

いま使っているケータイの電話番号の局番は「3312」。この数字は「33^2+12^2=3312」という変な関係を満たしている。ということを、「What's Special About This Number?」というページで知った。このページには、ほかにも 732 = 1^7 + 2^6 + 3^5 + 4^4 + 5^3…

Proc.newが使えるのかな?

「cp」と「mv」とメソッド名が2文字しか違わない以下の冗長なコード。 if Options[:copy] Options[:events].each {|n| nikon.event(n).each {|photo| FileUtils.cp(photo[0],".", {:verbose => Options[:verbose]}) } } elsif Options[:move] Options[:event…

No, I don't want to repeat myself, either....

前に書いた写真取り込みスクリプトを案外便利に使っている。特に、さっと手元のカメラで何枚か写真を撮り、それをPCに取り込むという用途にはいい。「nikon -lcv」とかやると、ずばっと直近の写真をコピってくれる。この取り込みスクリプト、WindowsのRubyで…

なんちゃってl33t文

コメントで指摘されて気づいた。String#gsubは文字列置換のためのメソッドだけど、置換後の文字列を省略すると、イテレータとして動作してブロックを評価した結果で置換を行う、とマニュアルにある。これは便利そうだ。というわけで、練習問題として、いわゆ…

人間の文字列認識テスト

英語に限らず、人間は書き言葉を読むときに、逐字的に読んでいるわけではなく、単語や単語の塊の視覚的パターンを捉えているのではないかということを示す実験が以下。まったく難なく読めて、かなり驚いた。これを自分でも試してみようと思ってRubyでスクリ…

sudoku.rbに対称性アプローチ

また少し数独ジェネレータで実験してみた。ランダムに数字を抜き取るのではなく、対称性を考慮したほうがいいのではないか。なぜなら多くの人間が作る問題は左右、上下、あるいは反転、それらの組み合わせである回転対称などの対称性を持っていることが多い…

別解だらけ

以下にある数独ソルバーを使って生成した問題に別解がないかチェックしてみた。http://codesnippets.joyent.com/posts/show/567シンプルなアプローチで100問中7問程度、対称性アプローチで100問中10問程度の割合で別解ありの問題となってしまっていたようだ…

sudoku高速化

sudoku.rbを高速化してみた。マトリックスを埋めたあとに、1つずつ数字を消す処理(reduce+delete_one)を変えた。チェック済みかどうかを確認するのが面倒だったので、単純に1000回ランダムチェックを繰り返して「まあ大体調べたことになるだろう」という…

Ruby 1.9が速い

YARVの笹田さんがパズルのようなプログラムだとRuby 1.9系は2倍ぐらい速くなるということを言ってたので、sudoku.rbで問題を100問作るのにかかる時間を計ってみた。Ruby 1.8.6で1分50秒(110秒)かかったところ、9月の頭にビルドしたRuby 1.9.0では、わずか3…

数独ジェネレータ完成?

数独の問題ジェネレータができた気がする。「気がする」というのは、第三者が作ったソルバーで実際に問題として成立しているか検証していないから。ともあれ、以下のコードを加えて適当にマトリックスから数字を消してみた。 def delete_one srand candidate…

アドホックでブルートフォースな富豪

数独の問題を生成するプログラムを作るために、あれこれと道具をそろえてみた。9×9のマトリックスを、81個の数字を並べた1次元配列として扱う。x,y座標を与えると、それが位置する縦の列や横に列、あるいは3×3のブロックに含まれる数字を拾って返す関数を作…

RHGをiPhoneで少しずつ読む

いきなり3日坊主的ブランクがあいてしまった。いろいろとコードを書いてみたい気持ちは山々だけど、なかなか時間が取れない。Rubyソースコード完全解説をiPhoneに入れてちょぼちょぼと読み進めている。iPhoneのAirSharingというソフトがよくできていて、WiFi…

オープンクラスってすごいことなのか

オープンクラスってすごいことなのかなと思ってググッてみた。Juixe Techknowというブログの、この解説が参考になった。やっぱりオープンクラスはふつうのことではないか、少なくともJavaとは非常に好対照となっているようだ。「Rubyではクラスを閉じること…

イテレータを作ってみる

Rubyと言えばイテレータだ(ほんとか)。これを理解したい。イテレータと呼ばれてるものはブロック渡しメソッドと呼ぶほうが、いいようだ。ブロックとは処理の塊のことを指しているだけで、そのブロックにオブジェクトを1つまたは複数渡して、何か処理をする…

ブロックなしの場合は配列を返す

あるメソッドがブロックを受け付けるかどうかはあらかじめ決まっている。受け付けるものは「ブロック付きメソッド」と呼び、それはそういうもんだと思った。で、すべてのメソッドはブロックを受け付けるか、あるいは受け付けないかのどちらかなのかな、と思…