2009-04-02
■[Ruby] アンダースコアだけで Ruby プログラムを書くライブラリ _
ref: http://github.com/mame/_/tree/master
インストール
自己責任で。
$ gem install mame-_ --source=http://gems.github.com/
サンプル
require "_" ____ _ _____ ____ __ ____ ____ __ ___ ____ __ __ _ ______ _____ ___ _ _ ___ _____ ______ ____ _ _ ____ _ _ ____ _ ____ __ __ ___ _ ______ ___ ____ __ ______ ____ _ ____ ____ __ _ ____ _ _ ___ _____ _____ _ ______ ____ _ ______ _____
ただの Ruby プログラムなので、ruby で普通に実行できます。1.8 でも 1.9 でも OK *2 。改行の位置は好きなように変えていいです (順序は変えちゃダメ) 。
$ ruby18 __hello__.rb Hello, world! $ ruby19 __hello__.rb Hello, world!
エンコード
__script__ メソッドでできます。
$ echo -n 'puts"Hello, world!"' | ruby19 -r_ -e 'puts __script__($<.read)' require "_" ____ _ _____ ____ __ ____ ____ __ ___ ____ __ __ _ ______ _____ ___ _ _ ___ _____ ______ ____ _ _ ____ _ _ ____ _ ____ __ __ ___ _ ______ ___ ____ __ ______ ____ _ ____ ____ __ _ ____ _ _ ___ _____ _____ _ ______ ____ _ ______ _____
どうでもいいこと
なんとなく _ にしましたが、英文字ならなんでもいいです。
$ ruby19 -r_ -e ' abcd e fghij klmn op qrst uvwx yz abc defg hi jk l mnopqr stuvw xyz a b cde fghij klmnop qrst u v wxyz a b cdef g hijk lm no pqr s tuvwxy zab cdef gh ijklmn opqr s tuvw xyza bc d efgh i j klm nopqr stuvw x yzabcd efgh i jklmno pqrst ' Hello, world!
文字数にあわせて英作文できたらかっこよかったけど、英語力的に無理だった。
どうでもいいこと 2
github いじめ。_ という名前のリポジトリを扱えるのかなーと。やってみたところ、作るだけならできたけど push できなかった (Invalid url とかなんとか言われた) 。それでどうしたかというと、
- まず underscore という普通の名前でリポジトリを作り、gem 生成を有効にする
- ソース一式と _.gemspec と underscore.gemspec を push する (どっちの gemspec が動いたかは知らない)
- リポジトリの名前を _ に変える (変えたらもう push できなくなった)
- 宝石のアイコンをクリックして Rebuild Latest Rubygems を押す
という手順でできた。
github のソースツリーで lib 以下が見えない。バグっぽくていいですね。そのせいでソースが見えないので (gem install や git clone すれば見えるけど) 、この記事の最後にソースを貼っときます。
まあ mame-_ みたいな名前の gem を作りたいだけなら gemspec だけ編集すればよかったのかもしれない。
github をいじめた天罰か知らないけど、エイプリルフールにあわせて作ったのに github の gem 生成サーバが落ちてたせいで 4/1 中に公開できなかった。ちくしょう。
ソース
def __script__(src) code = [] src = src.unpack("C*").map {|c| c.ord.to_s(6).rjust(3, "0").chars.to_a } src.flatten.map {|n| n.to_i(6) + 1 }.each do |n| code.empty? || code.last.size + n + 1 >= 60 ? code << "" : code.last << " " code.last << "_" * n end ([%q(require "_")] + code).join("\n") end $code, $fragment = [], [] def method_missing(mhd, *x) if x.empty? $code.concat($fragment.reverse) $fragment.clear end $fragment << mhd.to_s.size - 1 end at_exit do $code.concat($fragment.reverse) eval($code.join.scan(/.../).map {|c| c.to_i(6) }.pack("C*")) end
トラックバック - http://d.hatena.ne.jp/ku-ma-me/20090402/p1
リンク元
- 73 http://reader.livedoor.com/reader/
- 29 http://www.rubyist.net/~kazu/samidare/
- 28 http://d.hatena.ne.jp/rubynews/20090403/1238780165
- 27 http://www.google.com/reader/view/
- 19 http://d.hatena.ne.jp/technohippy/20110103/1294054345
- 16 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=rnM&num=100&q=多倍長演算 GMP&btnG=検索&lr=lang_ja
- 15 http://d.hatena.ne.jp/
- 14 http://jp.rubyist.net/magazine/?0025-FirstStepRuby191
- 13 http://mamememo.blogspot.com/2009/11/library-that-allows-you-to-write-ruby.html
- 12 http://www.google.co.jp/reader/view/
