RubyのStructのイディオムとアンドキュメンテッドな機能

改めてStruct関連のイディオムについて調べた。Ruby標準のStructクラスを使えばコンストラクタでの面倒な初期化を飛ばせる。以下のクラスBとクラスCは、ほぼ同じ機能を実現する。 class B attr_accessor :var1, :var2 def initialize(var1, var2) @var1, @va…

しつこく Hub を読む

しつこく「Hub」を眺めている。語学学習に精読と多読の2つのアプローチがあるように、コードリーディングにも精読というのがあるはずで、試しにそれをやってみている。モヤッする「分かってない感」を感じたら、基本的に分かるまで調べるのが精読。そのため…

git/GitHubを便利に使うHubを少し読む(3)

git/GitHubを便利に使うRuby製ツールのコマンドラインツール「Hub」のソースコードを少し読んだので、あれこれメモ。これとこれの続き。GitHubのAPIをラップする lib/hub/github_api.rb は、クラス定義関連を抜き出すと以下。 module Hub class GitHubAPI mo…

ビットシフトでRubyでも2^n倍の掛け算割り算は速くなる

ruby/src/error.c を眺めていて、RangeErrorの以下の例に、おやっと思った。 /* * Document-class: RangeError * * Raised when a given numerical value is out of range. * * [1, 2, 3].drop(1 << 100) * * <em>raises the exception:</em> * * RangeError: bignum …

git/GitHubを便利に使うHubを少し読む

git/GitHubを便利に使うRuby製ツールのコマンドラインツール「Hub」のソースコードを少し読んだ。コメントが非常に丁寧だし、小さなツールなので、全体を把握しやすい。いろいろ勉強になる。あれこれランダムにメモしてみる。featuresの下にあるcucumberのテ…

git/GitHubを便利に使うHubを少し読む(2)

git/GitHubを便利に使うRuby製ツールのコマンドラインツール「Hub」のソースコードを少し読んだので、あれこれメモ。git/GitHubを便利に使うHubを少し読むの続き。GitHubのAPIをラップする lib/hub/github_api.rb は、クラス定義っぽいところを抜き出すと以…

Ruby標準ライブラリのDigestでの const_missing の用法

Digestには何があったかなと思って、ruby/ext/digestを見てみたら、lib/digest.rbに以下のようなコードあった。Rubyはハッシュ関数として、MD5、SHA1、SHA2、RDM160というのなんかをサポートしてる。BubbleBabbleというマイナーなものも入ってるらしい。で、…

じゃんけんごときにクラスなんて要るのか

CodeIQというプログラミング課題に挑戦するサイトに、Rubyでジャンケンクラスを作れという問題があったのでやってみた。すでに問題は読めなくなっているけど、こんな感じのJankenクラスを作れという。 $ irb > require './janken.rb' > left = Janken.new > …

寄り道してたらWikipediaに迷い込む

ちゃんと1行ずつ読もう、分からないところは飛ばさず読もうと思ってRailsのサンプルアプリを読み始めた。1.year.from_nowって意味は自明だけど、実際のところ何だろうか? とか立ち止まりつつ。こういうのってActiveSupportの、確かDurationオブジェクトで。…

CRubyで末尾最適化を使った再帰

Schemeなんかと違って、言語としてのRubyは末尾最適化(Tail Call Optimization)の実装は必須ではないけど、処理系としてのCRubyは2.0.0からオプション扱いで入っている、という話。2012年の6月ごろにはMatzさんはTCOをデフォルトにするという考えもあった…

find.rbにみるRubyのthrow/catchの大域脱出の例

Rubyのthrow/catchの大域脱出って、あまり見かけない気がしているけど、どういうときに使うのかなとぼんやり思っていたら、標準添付の lib/find.rbになるほどと思う例が見つかった。 # # find.rb: the Find module for processing all files under a given d…

Rubyで自前の例外クラスを作るときExceptionではなくStandardErrorを継承する理由

Rubyの例外について少し調べたので、まとめてみる。多くのモダンな言語同様にRubyでは例外処理機構が組み込まれている。 ファイルを開こうと思ったらファイルが存在しなかった ネットワーク先のサーバが反応しなくてタイムアウトした 定義されていない(存在…

method_missing の中で gsub 呼んだら無限ループに

method_missing って自分で試したことがなかったので、Eloquent Rubyの21章を参考に、オレオレ定義を書いてみた。Eloquent Rubyのサンプルは英語で単語間の距離を発音の近さで判定するSoundexというものを使っていたけど、全く同じでもつまらないし、日本人…

Rubyではメソッドの中で定数を変更できないのはflymakeもお見通し

Rubyではメソッドの中で定数を変更できない(リフレクション系のメソッドを使わない限り、という意味で)。これは動的にエラーや例外となっているのではなくて、パーズした段階で吐き出されるエラーのようだ。 MyConst = 2 def change_const MyConst = 3 end…

RubyのDateTimeとTimeはどちらを使うべきか

TimeはもともとPOSIXのtime_t型のラッパーで、内部的には1970年1月1日を起点とする秒数を保持している。WikipediaによるUnix timeの記述を見ると、time_tは、なんと初期のUnixでは32ビット整数であったものの、60Hzのクロックに同期してカウントアップしてい…

アトキンの篩

素数を求めるアルゴリズムとして、エラトステネスの篩よりも計算量的には速いというアトキンの篩というのを実装してみようと思って検索したら、StakOverflowに Pythonの例があった。Wikipediaの記述のまんま。これをRubyに書き直してみた。 import math def …

RubyのDATAという特殊なグローバル定数

Rubyにはスクリプト言語らしい機能が色々ある。::DATAを使うと、スクリプト本体の後ろにテキストデータを貼り付けておける。 def show_data puts "DATA: #{DATA.class}" DATA.each_line do |l| puts "line: #{l}" end end show_data __END__ 1 2 3 $ ruby da…

printfで文字列のところにintを渡す

c

#include <stdio.h> int main(int argc, char *argv[]) { int i = 100; printf("%s:\n", i); return 0; } とするとSEGVで落ちるけど、このとき起こっていることを理解してなかったと、久しぶりに使った valgrind のメッセージで気付いた。 $ valgrind ./seg ==25237==</stdio.h>…

素数列を enumerable ぽく作る

下から数えて1万番目の素数を求めよ、という何を求められているのか実はよく分からないコーディング課題に対してRubyで以下のように書いてみた。PrimeSeq[n]で、n番目の素数が得られる。 class PrimeSeq include Enumerable def initialize @primes = [2, 3]…

あみだくじジェネレータを状態をなるべく扱わない方向で書く

みなとRuby会議01というイベントで、ペアプロ大会みたいなのがあったらしい。http://willnet.in/10あみだくじ。いろんな人の書いた結果が残ってるらしいし、勉強になるかなと思って、ぼくもやってみた。どう書くのかなと思って、まず2、3行ほど何かを書いて…

xhrの抽象化を眺めていてプログラミングの勉強って何よとか不毛な悩みが浮かんできた

Ruby on Railsで英辞郎CD-ROMをインポートしてオレオレ単語帳が作れるアプリを作ってる。復習間隔を徐々に伸ばすことで記憶定着率を高めるというアプローチのもの。これがいい感じになってきた。でも単語帳アプリって、やっぱりローカルで動かすだけだとイマ…

Canvasでライフゲームを作ってみた

Canvasでライフゲームを作ってみた。ライフゲームが何かは知っていたし、いくつかの有名なパターンの動きも見たことがあったはずだけど、自分で適宜セルの生死をトグルしたり、パターンをロードしたりできると、思ったよりも面白かった。そして、iPadやAndro…

JavaScriptのslice(0)はRubyのObject#dup相当のイディオム

CoffeeScriptのサンプルとして、doccoのソースコードを眺めていたら、以下のような謎のslice(0)があった。 # Run the script. # For each source file passed in as an argument, generate the documentation. sources = process.ARGV.sort() if sources.len…

Emacsの中からrdefsを呼ぶ

Rubyのコードを読んでるとき、全体の構造をぱっと把握したいことがある。RDocやSDoc、あるいはYARDといったドキュメント生成ツールもいいけど、こういうツールはソースコードを読むためのものというよりも、APIを調べるためのものなので、クラスやメソッドが…

RailsでTwitter Bootstrapを使う

Twitter BootstarpをRailsで使う場合、Twitter Bootstrap for Rails 3.1 Asset Pipelineというgemが便利。便利なのだけど、CSSやHTMLの生成に使うテンプレート言語のデフォルトが好みじゃない場合にはどうするのがいいのだろうか。具体的にはERB、LESSという…

Enumerable#injectって分かりやすいのかな

CSVって、RFC4180とかに仕様がまとまってるんだとマイルドに驚きつつ、RubyのCSVクラスをのぞいてみた。FasterCSVと呼ばれていたものが正式にRubyに入り、1.9系のRubyではインターフェースが変わっているという話。CSVライブラリのソースコードには、冗長と…

Ruby 1.9.2でrequire 'sqlite3'は遅かった

単語帳を作るために英辞郎CD-ROMを買った。sqlite3に突っ込んで、Rubyで引けるようにして、Emacsでメジャーモードを作った。require 'sqlite3'が異様に遅い。Ruby 1.9.2から1.9.3にアップデートしたら遅いのが解決した。何だったんだろうか。うーん、「異様…

周囲の世界が歪む錯視をCanvasで

Canvasでアニメーションによる錯視を作ってみた。20〜30秒ほど中心を見つめ、視野全体で螺旋が渦巻く感じを得た後に周囲の部屋を見渡すと、数秒間ほど柱なんかがグニャグニャと歪んで見える。人によって見える程度がかなり違う模様。 http://dl.dropbox.com/…

Canvasでタートルオブジェクトを作ってドラゴンカーブを描く

JavaScriptの習作として、Cavansを使ってドラゴンカーブを描いてみた。若干なにかが違うような気がしつつ……。ドラゴンカーブは、長い帯を半分に折って、さらに半分に折って、さらに……という操作を続けて、最後に折り目がそれぞれ直角になるように開いた図形…

素振り重要

いろいろとJavaScriptを勉強している。面白いような、「うげぇ、まじか、これはひどいんじゃないか」とウンザリするような感覚がなかなかいい。素振りを始めた。以下のようなHTMLを、上から一気に手打ちする。 <html> <head> <title>grid demo</title> <script type="application/javascript"> function draw_grid () { var ct</head></html>…