Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
emasaka
1,002 views
メタメタプログラミングRuby
NOTE: These are joke programs
Art & Photos
◦
Read more
2
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 49
2
/ 49
3
/ 49
4
/ 49
5
/ 49
6
/ 49
7
/ 49
8
/ 49
9
/ 49
10
/ 49
11
/ 49
12
/ 49
13
/ 49
14
/ 49
15
/ 49
16
/ 49
17
/ 49
18
/ 49
19
/ 49
20
/ 49
21
/ 49
22
/ 49
23
/ 49
24
/ 49
25
/ 49
26
/ 49
27
/ 49
28
/ 49
29
/ 49
30
/ 49
31
/ 49
32
/ 49
33
/ 49
34
/ 49
35
/ 49
36
/ 49
37
/ 49
38
/ 49
39
/ 49
40
/ 49
41
/ 49
42
/ 49
43
/ 49
44
/ 49
45
/ 49
46
/ 49
47
/ 49
48
/ 49
49
/ 49
More Related Content
PDF
What is Metasepi?
by
Kiwamu Okabe
PDF
Nginx lua
by
Moriyoshi Koizumi
PDF
JavaScript入門
by
Ryo Maruyama
PDF
PHP5.5新機能「ジェネレータ」初心者入門
by
kwatch
PDF
菩薩でもわかる!Rで動かすExcelアドインの作り方
by
Nagi Teramo
PDF
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
by
Kazuya Wada
PDF
traitを使って楽したい話
by
infinite_loop
PDF
Subprocess no susume
by
Makoto Kishimoto
What is Metasepi?
by
Kiwamu Okabe
Nginx lua
by
Moriyoshi Koizumi
JavaScript入門
by
Ryo Maruyama
PHP5.5新機能「ジェネレータ」初心者入門
by
kwatch
菩薩でもわかる!Rで動かすExcelアドインの作り方
by
Nagi Teramo
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
by
Kazuya Wada
traitを使って楽したい話
by
infinite_loop
Subprocess no susume
by
Makoto Kishimoto
What's hot
PDF
Python で munin plugin を書いてみる
by
ftnk
PDF
awk v.s. bashどっちが強い?@OSC2011Tokyo
by
Ryuichi Ueda
KEY
Perlで伝統芸能
by
hitode909
PDF
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
by
nabe-abk
PPTX
前期講座09
by
Takenori Nakagawa
KEY
Ll xcode
by
Net Kanayan
PPTX
実用裏方 Perl 入門
by
keroyonn
KEY
Mojoliciousをウェブ制作現場で使ってみてる
by
jamadam
PDF
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
by
emasaka
PDF
GNU awk (gawk) を用いた Apache ログ解析方法
by
博文 斉藤
PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス)
by
Rui Hirokawa
PPTX
ActiveResourceが面白すぎる件
by
Kazuki MATSUMOTO
PDF
RのffとbigmemoryとRevoScaleRとを比較してみた
by
Kazuya Wada
PDF
Slub data structure
by
Masami Ichikawa
PDF
Teclab3
by
Eikichi Yamaguchi
PDF
PHPの今とこれから2021
by
Rui Hirokawa
PDF
Spectacular Future with clojure.spec
by
Kent Ohashi
PDF
Slub alloc and free
by
Masami Ichikawa
PDF
最近の PHP の話
by
y-uti
PDF
Testman
by
makoto tsuyuki
Python で munin plugin を書いてみる
by
ftnk
awk v.s. bashどっちが強い?@OSC2011Tokyo
by
Ryuichi Ueda
Perlで伝統芸能
by
hitode909
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
by
nabe-abk
前期講座09
by
Takenori Nakagawa
Ll xcode
by
Net Kanayan
実用裏方 Perl 入門
by
keroyonn
Mojoliciousをウェブ制作現場で使ってみてる
by
jamadam
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
by
emasaka
GNU awk (gawk) を用いた Apache ログ解析方法
by
博文 斉藤
最新PHP事情 (2000年7月22日,PHPカンファレンス)
by
Rui Hirokawa
ActiveResourceが面白すぎる件
by
Kazuki MATSUMOTO
RのffとbigmemoryとRevoScaleRとを比較してみた
by
Kazuya Wada
Slub data structure
by
Masami Ichikawa
Teclab3
by
Eikichi Yamaguchi
PHPの今とこれから2021
by
Rui Hirokawa
Spectacular Future with clojure.spec
by
Kent Ohashi
Slub alloc and free
by
Masami Ichikawa
最近の PHP の話
by
y-uti
Testman
by
makoto tsuyuki
Similar to メタメタプログラミングRuby
ODP
Rubyのソースコードを読んでみよう(入門編)
by
baban ba-n
PDF
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
by
Koichi Sasada
PPTX
Ruby講座一回目
by
Masayuki Matsumoto
PDF
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
by
mametter
PPTX
Ruby講座一回目
by
Masayuki Matsumoto
PDF
Ruby 2.5
by
Masahiro Tomita
PDF
2011年12月9日
by
nukaemon
PPT
Start!! Ruby
by
mitim
PDF
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
by
monglee
ODP
Programming camp Codereading
by
Hiro Yoshioka
KEY
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
PDF
ラボユース 最終成果報告会
by
shiftky
PPTX
Ruby – The Scripting Language
by
Akio Tajima
PDF
Ruby on rackhub
by
asonas
PDF
Ruby on rackhub
by
asonas
PDF
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
by
mametter
PDF
Oss coding style
by
Toshihisa Tanaka
PDF
RubyKaigi2014: Just in Time compiler for CRuby
by
imasahiro
KEY
Rails基礎講座 part.1
by
Jun Yokoyama
PDF
アプリケーションへのRubyインタープリターの組み込み
by
Kouhei Sutou
Rubyのソースコードを読んでみよう(入門編)
by
baban ba-n
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
by
Koichi Sasada
Ruby講座一回目
by
Masayuki Matsumoto
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
by
mametter
Ruby講座一回目
by
Masayuki Matsumoto
Ruby 2.5
by
Masahiro Tomita
2011年12月9日
by
nukaemon
Start!! Ruby
by
mitim
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
by
monglee
Programming camp Codereading
by
Hiro Yoshioka
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
ラボユース 最終成果報告会
by
shiftky
Ruby – The Scripting Language
by
Akio Tajima
Ruby on rackhub
by
asonas
Ruby on rackhub
by
asonas
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
by
mametter
Oss coding style
by
Toshihisa Tanaka
RubyKaigi2014: Just in Time compiler for CRuby
by
imasahiro
Rails基礎講座 part.1
by
Jun Yokoyama
アプリケーションへのRubyインタープリターの組み込み
by
Kouhei Sutou
More from emasaka
PDF
ibus-skkをなんとかすっぺ会議
by
emasaka
PDF
濁点の話
by
emasaka
PDF
GoBoLinuxを試した
by
emasaka
PDF
さくらのクラウドでh2oのベンチマーク
by
emasaka
PDF
みおぽん for CLI
by
emasaka
PDF
GNU make 4.0に何かいる
by
emasaka
PDF
長いの
by
emasaka
PDF
)の品格
by
emasaka
PDF
人力
by
emasaka
PDF
エコなWebサーバー
by
emasaka
PDF
Bash on Railsの逆襲
by
emasaka
ibus-skkをなんとかすっぺ会議
by
emasaka
濁点の話
by
emasaka
GoBoLinuxを試した
by
emasaka
さくらのクラウドでh2oのベンチマーク
by
emasaka
みおぽん for CLI
by
emasaka
GNU make 4.0に何かいる
by
emasaka
長いの
by
emasaka
)の品格
by
emasaka
人力
by
emasaka
エコなWebサーバー
by
emasaka
Bash on Railsの逆襲
by
emasaka
メタメタプログラミングRuby
1.
@emasaka
2.
自己紹介 ●
@emasaka ● 本名:高橋正和 ● 40代 フリーター ● ブログ 「本を読む」http://emasaka.blog65.fc2.com/ ● 代表作:Bash on Rails
3.
近況
4.
nagaino作りました ●
複数の短縮URLを1リクエストで多段展開する Web APIサービス http://nagaino.herokuapp.com/
5.
今日の話
6.
Perl
7.
Perlのソースフィルタ ●
ソースを読み込んでからパースするまでの間 に、スクリプトからソースを直接いじれる
8.
Filter::SQL ●
Perlのソース中にインラインでSQL文を埋め 込む ● 奥一穂氏作
9.
どっちかというとAcme (ネタ系)モジュールで
使われる
10.
Acme::Bleach ●
自分を読みんでいるソースファイルを書き換え て、空白とタブだけにしてしまう ● (でも実行できる)
11.
Acme::Brainfuck ●
Perlのソース中にインラインでBrainf*ckを埋 め込む
12.
Acme::W ●
Perlの識別子を草だらけにする ● print → WWwwWW
13.
Acme::Metification ●
ソース中に“meta 2, 5”と書くと、その行が、 2〜5行目の内容に置きかわる ● 指定範囲に自分が入っていると無限再帰 ● “recursemeta depth => 10, 2, 5”と書くと、 10レベルまで再帰
14.
Rubyで(超簡易版) ソースフィルタ
15.
Rubyのソースにパッチ ●
ruby.cのload_file_internal()
16.
diff up ruby1.9.2p290/ruby.c filterruby1.9.2p290/ruby.c ruby1.9.2p290/ruby.c 20101223 19:49:13.000000000 +0900 +++ filterruby1.9.2p290/ruby.c 20111028 21:50:44.452623054 +0900 @@ 1618,7 +1618,16 @@ load_file_internal(VALUE arg) return (VALUE)rb_parser_compile_string(parser, fname, f, line_start); } rb_funcall(f, set_encoding, 2, rb_enc_from_encoding(enc), rb_str_new_cstr("")); tree = rb_parser_compile_file(parser, fname, f, line_start); + { + VALUE source_filter = rb_intern("source_filter"); + if (rb_obj_respond_to(rb_cObject, source_filter, 1)) { + VALUE s1 = rb_funcall(f, rb_intern("read"), 0); + VALUE s2 = rb_funcall(rb_mKernel, source_filter, 1, s1); + tree = rb_parser_compile_string(parser, fname, s2, line_start); + } else { + tree = rb_parser_compile_file(parser, fname, f, line_start); + } + } rb_funcall(f, set_encoding, 1, rb_parser_encoding(parser)); if (script && tree && rb_parser_end_seen_p(parser)) { rb_define_global_const("DATA", f);
17.
内容 ●
source_filterメソッドが定義されていれば ● ファイルの内容をStringに読み込む ● source_filterに通す ● 結果をパース ● 定義されていなければいつも通り
18.
利用例
19.
例1 「Rubyのメソッド呼び 出しが“.”なのは直感に
反する。 “->”に」
20.
フィルタ(arrow.rb) def source_filter(str) str.gsub(/>/, '.') end
21.
サンプル(arrow_sample.rb) [3, 5, 7]>map {|i| i + 2 }>each do |i| puts i>to_s end
22.
実行 $ ruby rarrow arrow_sample.rb 5 7 9
コマンドライン で直接指定
23.
例2:さらに ●
“$”“{”を無視 ● “}”を“end”に ● “function”を“def”に ● “this”を“self”に
24.
フィルタ(arrow2.rb) def source_filter(str) str.gsub(/>/, '.').gsub(/}/, 'end'). gsub(/function/, 'def'). gsub(/this/, 'self'). delete('${') end
25.
サンプル(arrow2_sample.rb) class Hoge { function foo() { puts($this>class()); return $this; } } Hoge>new>foo();
26.
実行 $ ruby rarrow2 arrow2_sample.rb Hoge
27.
例3 「Rubyはrequireとinclude
が混乱する」
28.
フィルタ(include.rb) def source_filter(str) str.gsub(/^s*#s*includes+<(.[^>]*)>$/, 'require "1"' ) end
29.
サンプル(include_sample.rb) #include <uri> u = URI.parse("http://example.com:80/hoge? fuga#foo") p u
30.
実行 $ ruby rinclude include_sample.rb #<URI::HTTP:0x8463c84 URL:http://example.com/hoge?fuga#foo>
31.
例4 “ennnnnd”で5レベル まとめてendしたい
32.
サンプル(ennd_sample.rb) module MyModule class MyClass def my_method 10.times do |i| if (i % 2) == 0 puts 'even' else puts 'odd' ennnnnd MyModule::MyClass.new.my_method
33.
フィルタ(ennd.rb) def source_filter(str) str.gsub(/e(n{2,})d/) do Array.new($1.length, 'end').join(';') end end
34.
実行 $ ruby rennd ennd_sample.rb even odd even odd even odd even odd even odd
35.
例5 “end”なしでインデントで
endしたい
36.
すでにendless rubyが
あるのでパス
37.
例6 縦書きで Rubyを書く
38.
サンプル(tate_sample.rb)
e ( n 1 d e i . n f . d p 2 u ( 0 t i ) s . % e i a 2 c ) h = d = o 0 | i |
39.
フィルタ(tate.rb) def source_filter(str) str.split(/n/).inject([]) {|r, s| s.each_char.with_index do |c, i| r[i] = r[i] ? r[i] + c : c end r }.reverse.join("n") end
40.
実行 $ ruby rtate tate_sample.rb 2 4 6 8 10 12 14 16 18 20
41.
例7 スペースとタブで Rubyを書く
42.
サンプル(bleach_sample.rb)
見えません
43.
フィルタ(bleach.rb) def source_filter(str) [str.delete("^ t"). tr(" t", '01') ].pack('b*') end
44.
実行 $ ruby rbleach bleach_sample.rb Hello, World!
45.
例8 見えないとつまらないので “ダァシエリイェス!!”で
Rubyを書く
46.
サンプル(kq_sample.rb) ダァダァダァダァシエリイェス!!シエリイェス!! シエリイェス!!ダァシエリイェス!!ダァシエリイェス!!ダァ シエリイェス!!シエリイェス!!シエリイェス!!ダァダァダァ シエリイェス!!ダァシエリイェス!!シエリイェス!!シエリイェス!!ダァ シエリイェス!!シエリイェス!!ダァダァシエリイェス!!シエリイェス!! シエリイェス!!ダァダァダァダァダァ ダァシエリイェス!!ダァダァシエリイェス!!シエリイェス!! シエリイェス!!ダァダァシエリイェス!!ダァダァ ダァダァダァシエリイェス!!ダァダァ シエリイェス!!ダァシエリイェス!!ダァシエリイェス!!ダァ ダァシエリイェス!!シエリイェス!!ダァダァダァ シエリイェス!!シエリイェス!!ダァシエリイェス!!シエリイェス!!ダァ ダァダァシエリイェス!!シエリイェス!!ダァシエリイェス!! シエリイェス!!ダァシエリイェス!!シエリイェス!!シエリイェス!!シエリイェス!! ダァシエリイェス!!シエリイェス!!ダァダァダァ シエリイェス!!シエリイェス!!ダァシエリイェス!!ダァダァ ダァダァダァダァダァシエリイェス!! ダァダァシエリイェス!!シエリイェス!!シエリイェス!!ダァ シエリイェス!!ダァシエリイェス!!ダァシエリイェス!!シエリイェス!! シエリイェス!!シエリイェス!!ダァシエリイェス!!シエリイェス!!ダァ ダァシエリイェス!!ダァダァシエリイェス!!シエリイェス!! シエリイェス!!ダァダァダァシエリイェス!!シエリイェス!! ダァシエリイェス!!シエリイェス!!ダァダァダァ シエリイェス!!ダァダァシエリイェス!!シエリイェス!!ダァ シエリイェス!!ダァダァダァダァシエリイェス!! ダァダァシエリイェス!!シエリイェス!!シエリイェス!!ダァ ダァシエリイェス!!ダァダァダァシエリイェス!! ダァシエリイェス!!ダァダァダァダァ
47.
フィルタ(kq.rb) # * coding: utf8 * def source_filter(str) [str.force_encoding(Encoding::UTF_8). scan(/ダァ|シエリイェス!!/). map {|s| s == 'ダァ' ? '0' : '1' }. join('') ].pack('b*') end
48.
実行 $ ruby rkq kq_sample.rb Hello, World!
49.
終
Download