タグ

ブックマーク / mametter.hatenablog.com (12)

  • quine リレー - まめめも

    Update (2013-07-15): I improved this program to 50-language version. 50 言語版にパワーアップさせました。 これはこのプログラム自身を出力する Unlambda プログラム、を出力する Whitespace プログラム、を出力する brainfuck プログラム、を出力する Java プログラム、を出力する C プログラム、を出力する Haskell プログラム、を出力する OCaml プログラム、を出力する Lua プログラム、を出力する Perl プログラム、を出力する Python プログラム、を出力する Ruby プログラム、です。 # ruby l=92.chr;eval s="s=s.dump[r=1..-2].gsub(/("+l*4+"){4,}(?!\")/){|t|'\"+l*%d+\"'%(t .s

    quine リレー - まめめも
  • rirb を github に登録して gem 化した - まめめも

    はるか昔に rirb (Remote IRB) というのを作って放置していましたが、github に登録して gem を公開してみました。せっかくなので再紹介。 rirb (Remote IRB) とは 実行中の Ruby プログラムにアタッチして irb プロンプトを開かせることができます。グローバルな状態を観察したり変更したりできます。 インストール $ gem install mame-rirb --source=http://gems.github.com/ 使い方 以下は数字をカウントアップするだけのサンプルコード。 $i = 0 loop do p $i $i += 1 sleep 0.5 end これを -rrirb 付きで実行します *1 。 $ ruby -rrirb count.rb 0 1 2 3普通にカウントアップしますね。 別のターミナルから同じディレクトリで r

    rirb を github に登録して gem 化した - まめめも
  • Ruby で書かれた Continuous Integration ツールを調べる - まめめも

    まともなのないかな。「まとも」の評価条件は 堅牢性: プロセス管理やタイムアウト管理などがしっかりしている。 汎用性: いろんなプロジェクトに適用できる。 1.9: ruby 1.9 で動く。今なら当たり前。 chkbuild akr さん作の ruby 用 CI ツール。 http://cvs.m17n.org/viewcvs/ruby/chkbuild/ 堅牢性: ◎ スーパー akr さんパワー 汎用性: × ほぼ ruby 専用。ソースコードがむずかしくて手を入れにくい。 1.9: ○ たぶん 質実剛健というか、「ハッカーが作りました」という感じが漂う。ビルドやテスト中に暴走したプロセスが残るとかのケアはしっかりしてそう。ちょっと使いにくい。 cerberus 主に Rails 向けの CI ツール。gem で入れられる。 http://cerberus.rubyforge.org

    Ruby で書かれた Continuous Integration ツールを調べる - まめめも
  • map が面倒なので DelegateMap - まめめも

    簡単なことをする map を書くのが面倒です。配列の各要素に 1 足す程度のことで、いちいち .map {|x| x + 1 } などと 12 ストローク (空白除く) も必要なんですよ。しかもなんかごちゃごちゃして読みにくい。 使用頻度の低い inject とかなら許せるんですが、特に使用頻度の高い map くらいは短く書きたい。ブロック変数名を決める必要があるのも面倒くさい。"{|x|" の部分と "}" の部分が異なる箇所に分かれるのも気に入らない *1 。 そこで考えた。こんなのどうだろう。 # 各要素に 1 を足す p [1, 2, 3].dmap + 1 #=> [2, 3, 4] p [1, 2, 3].map {|x| x + 1 } # 上と等価 # 二重配列の各要素の先頭の要素を集める (map fst みたいな) p [[1, 2], [3, 4], [5, 6]].

    map が面倒なので DelegateMap - まめめも
  • Ruby 1.9 の新機能もうひとめぐり (前編) - まめめも

    ref: Ruby Freak Lounge 第1回 Ruby1.9の新機能ひとめぐり(前編):YARV,Fiber,配列処理の強化 の補足など。 YARV (Yet Another Ruby VM) による高速化 いきなり編とあまり関係ないんだけど、高速化のまめ知識をひとつ。 YARV では while や if のようなプリミティブの構文が最適化されています (というか、Ruby の中で数少なく最適化の余地があったところ) 。そのため、1.9 では C メソッドやブロックを呼び出すより while を使ったほうが速いです。 # 1.8 で 13 秒、1.9 で 2.4 秒 n = 0 while n < 50000000 n += 1 end # 1.8 で 6.5 秒、1.9 で 5.0 秒 50000000.times {|n| } # 1.8 で 4.3 秒、1.9 で 4.8

    Ruby 1.9 の新機能もうひとめぐり (前編) - まめめも
  • ruby 1.9 を日常的に使うぼくが 1.9 の新機能を寸評する - まめめも

    なんか偉そうな見出しですが、ruby 1.9 を主に使うようになって 1 年ちょっと経ったので、1.9 の新機能に思うところや注意点などを書き残そうと思うのです。さらに 1 年後に見たとき、「あのころはあんなふうに考えてたなあ」などと感慨にひたる予定です。 あらかじめ断っておくと、ぼくの ruby 1.9 経験はすべて趣味範囲なので、エンタープライズとかシステム運用の問題とかは知りません。あとぼくは ruby のコミッタなので、色眼鏡もあると思います。あしからず。 YARV VM 実行になったという話。一般的には「速い」という文脈で語られます。1.8 と比べると確かに速いです。でも、1.9 ばかり使い出すとなんとも思わなくなるはずです。速さなんて相対的な価値ですから、当然ですけどね。好意的に考えれば、「なんとも思わない程度に、遅くて困ることが減った」のかもしれない。 コンパイルフェーズを挟

    ruby 1.9 を日常的に使うぼくが 1.9 の新機能を寸評する - まめめも
  • exhaustive な switch - まめめも

    OCaml ではパターンマッチの抜けを警告してくれます。Haskell より OCaml の方が好きな点の 1 つです*1。 type t = Foo | Bar | Baz let f = function Foo -> "foo" | Bar -> "bar" $ ocamlc pat-test.ml File "pat-test.ml", line 2, characters 8-44: Warning P: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: Baz今日気がついたのですが、gcc でも enum に対して同様のチェックをしてくれるようです。 enum t { foo, bar, baz }; char *f(enum t x) { sw

    exhaustive な switch - まめめも
  • 猿でも持ち上げられるモナド - まめめも

    最近やっとモナドの持ち上げ方を理解した気分になりました。StateT + IO 限定で。 State モナドを使って以下のようなコードを書いていたとき、 module Main(main) where import Control.Monad.State -- 階乗計算 fact :: State (Int, Int) Int fact = do (a, b) <- get -- (A) if a == 0 then return b else do modify $ \(a, b) -> (a-1, a*b) fact main :: IO () main = do let x = evalState fact (10, 1) print x コメントの (A) の位置で (a, b) の値を表示したくなったときに使える技です。 module Main(main) where impor

    猿でも持ち上げられるモナド - まめめも
  • Enumerator とブロックの省略 - まめめも

    1.9 では Enumerator が組み込みになり、大きく拡張されています。ついでにブロックの省略に対する考え方にも影響があります。結構重大な変更のわりに、この話はあまり議論や周知がされていないような気がしたので、現状の Enumerator について、その機能と問題点をまとめてみました。 Enumerator の機能 まず、each や map など、イテレータっぽいメソッドをブロックなしで呼び出すと Enumerator が得られます。 p [1,2,3].each #=> #<Enumerable::Enumerator:0xb7d38260> p [1,2,3].map #=> #<Enumerable::Enumerator:0xb7d38210> Object#to_enum または enum_for を使って、指定したメソッドによる Enumerator を明示的に作ること

    Enumerator とブロックの省略 - まめめも
  • たたみすぎる Array#flatten - まめめも

    Array#flatten は配列をたたむメソッドです。 ary = [ [1], [2, [3], 4], [5] ] p ary.flatten #=> [1, 2, 3, 4, 5] このメソッドは便利に見えて、非常にはまりやすいメソッドです。このメソッドはたたみすぎるんです。上で言うと、[1, 2, [3], 4, 5] を返してほしいのです。 例えば、「ちょっと x と y の組を作りたいけど、いちいち Point クラスを作るのは面倒」というようなときに、横着して [x, y] という配列を使います。その後、「座標の配列の配列」から「座標の配列」を作ろうと思って flatten すると、なんと「x と y が順に並んだ配列」ができてしまいます。これはたまりません。 この例だけ見れば「横着すんな」で終わりそうですが、 そうは言っても使い捨てプログラムでは横着したいし、 連想配列か

    たたみすぎる Array#flatten - まめめも
  • fisheye view の計算式とプログラム - まめめも

    fisheye view とは、なんかインターフェイスの世界では常識っぽい、フォーカスとなる点を中心に座標をぐにょーんと引き延ばす方法です。日語が不自由ですみません。要するにこういう変換です。 皇居あたりを中心に線路地図をぐにょーんと引き延ばしています。これを実装しようと思って計算式やサンプルプログラムを探したのですが、意外に情報が少なくて手間取りました。なので記録を残しておきます。 種類 参考文献 *1 を眺めたところ、cartesian fisheye と polar fisheye の二種類があるようです。左が cartesian で右が polar です。でもこの例だとほとんど区別が付かないですね。よく見ると端っこの方のつぶれ方が違います。 cartesian fisheye view フォーカスの座標を 、引き延ばしたい点の座標を 、壁の位置を とするとき ( になる) 、引き

  • Haskell がアセンブリになるまで @情報科学なんでもセミナー

    情報科学なんでもセミナーの「Haskellがアセンブリになるまで」を聞いてきました。 話者の中村さんは 3 週間ほどで GHC のソースコードを読んだそうです。発表もしっかりしていて、とても B3 とは思えませんでした。あと聴衆に shelarcy さんとか shinh さんとか著名な人が来ててこれもすごかったです。僕が発表した頃の内輪だけのなんでもセミナーとはまるで別物です。 詳細は発表資料が公開されることを期待しつつ、印象に残ったことだけメモ。 GHC の実装では type checker が desugarer より先 (参考) 。先に desugar してしまうと型エラーの表示がしにくくなるからとか? 型クラスのディスパッチは Dictionary Passing Style というので行われているらしい。型クラスのメソッドはトランポリンみたいなもので、呼び出し側で関数の実体 (最

    Haskell がアセンブリになるまで @情報科学なんでもセミナー
  • 1