第2話
LLカンファレンス の歴史を 振り返る
LL Saturday(2003年)
LL Weekend (2004年)
LLDN (2005年)
LL Ring(2006年)
example 2019/08/31
(今年)
LL Tiger(2010年) ニッショーホール → デスマ・プロジェクトの火消し役?
次のLLカンファレンスはどこでやる? Where is the Next LL Conference?
ナイアガラの滝なんてどうでしょうか? “waterfall” 滝
Come on in, the water's fine. Waterfalls: Not just for tourists. ウォーターフォールは: 観光客だけのものじゃなくって for most programmers! (except hackers) 職業プログラマにも必要ですから! 落ちるな危険
ウォーターフォール 開発 は 滝底に落ちない ように気をつける…
デスマーチになるかも
Escape a water grave デスマーチから抜け出そう!
use Ruby; #!/usr/bin/python # # encoding: ruby
Talks#1: Ruby On Snails 新フレームワークで開発を遅くしよう Slow down development with this new framework by Dave Thomas and Mike Clark
Waterfall 2006 Conference Location Date Niagara Falls, NY ナイアガラの滝(ニューヨーク州)にて Date April 1st, 2006 開催日は4月1日 実は既に開催 されていた!? http://www.waterfall2006.com/
☻ ☻ ☹ Talks#2: Pair Managing Is not Pair Programming ペアプロじゃなくって、ペア管理 1人のプログラマにマネージャが2人 Two Managers per Programmer by Jim Highsmith ☻ ☻ ☹
#3: Unfactoring from Patterns 読みにくいコードで職を守る Job Security through Unreadability by Joshua Kerievsky 西尾泰和
Unreadability? Perl5? 読みにくい、と言えば…?
orz
Unreadable Perl5→ 読みにくいプログラムを量産し続けるPerl5
Perl5 の変数(sigils rules) scalar array hash ------- ------ ------- $s @a %h $$s $a[0] $h{'?'} $s->foo ☹ ☹
------- ------ ------- Perl6 の変数(Sigils rule) scalar array hash ------- ------ ------- $s @a %h $$s @a[0] %h<?> $s.foo @a.foo %h.foo ☺
Readable Perl6! 読みやすいプログラムを書けるPerl6になる!
待望の Perl6 – Rakudo Star リリース!
O’REILLY
NOT’REALLY
キメラ動物みたい?
(例)
Human.Dog Yappo++
GIF89a Polyglot HTML/CSS & JavaScript & Perl in ‘GIF’
JavaScript in GIF GIF89a(q/*....../);sub GIF89a{print "Hello Perl!"} __END__#*/=1);function GIF89a(){alert("Hello JavaScrpt!")} /*<body style=visibility:hidden> <div style=position:relative;visibility:visible> <h1>Hello HTML!</h1><!-- ................................................ --><img src=?> <script src=# language=JavaScript></script></div> */// ;
HTML/CSS in GIF GIF89a(q/*....../);sub GIF89a{print "Hello Perl!"} __END__#*/=1);function GIF89a(){alert("Hello JavaScrpt!")} /*<body style=visibility:hidden> <div style=position:relative;visibility:visible> <h1>Hello HTML!</h1><!-- ................................................ --><img src=?> <script src=# language=JavaScript></script></div> */// ;
Perl in GIF GIF89a(q/*....../);sub GIF89a{print "Hello Perl!"} __END__#*/=1);function GIF89a(){alert("Hello JavaScrpt!")} /*<body style=visibility:hidden> <div style=position:relative;visibility:visible> <h1>Hello HTML!</h1><!-- ................................................ --><img src=?> <script src=# language=JavaScript></script></div> */// ;
ハチロクとバトル
BATTLE 2 : Downhill ハチロク 86 VS. 詳細不明 Unspecified
BATTLE 2 : Downhill Polyglot by TAKESAKO
記号オンリーな Polyglot プログラミング ;"#{",$/*";}";'[!&,,#>,,`^`[%!@%@!-~`-~/(&,,-!!-!!-!+(&-,+>,,`[-!|-!}/////////$$$[,-(@),~,&(@-$@,+,)(@,(@$,!,",/(@!(@"(@#$@,{,^(@%(@&$@,!,.(@*(@."=:$_]!$-~!`{~!';%#;$^_='_^)./}`;@,@<},^^,]`@_{',$^_^='/,@@[_(^,@/-]|;,@|<.}@',$^_=~('(?{$^_=~'.('_^""'^'+,|/'."-".('$%'^';{'.'(-:^;'.('[)]@'^'>_<,').'$^_})')))#;_=[*'`'..%.~.]*%;;;$_=%+%++(??%?===???_[(_=~/\{/).-@+(_=~/~/)]:%%%<<(?!*(?+-?()));_=([*%/!/..%!/!]+[*%]:]..%)@)]+[*%.[...%.`.]+[*%.{...%.}.])*%(=~_~='_');$><<$_%(/\)=~_~='_'\*=/=~_)+$_%(/~_~='_'\-/=~_)+$_%(/\-=~_~='_'\./=~_)+$_%(/\-=~_~='_'\./=~_)+$_%(/_~='_'\./=~_)+$_%(/'&/=~_)+$_%(/='_'%/=~_)+$_%(/=~_~='_'\+/=~_)+$_%(/\.=~_~='_'\//=~_)+$_%(/',/=~_)+$_%(/~='_'\//=~_)+$_%(/'_'%/=~_)+$_%(/=~_~='_'#/=~_)+%))#*/=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+"$\\"+$.$$$+$.$_$+"\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+", \\"+$.__$+$.__$+$._$_+"\\"+$.__$+$._$_+$._$$+"!\\\"\\"+$.$$$+$._$$+$.__+"\\"+$.__$+$.$$$+$.__$+"\\"+$.__$+$.$$_+$.___+$.$$$_+$._$+$.$$$$+"(\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+$.$$_$+$._$+"\\"+$.__$+$.$$_+$.$$$+")\\"+$.$$$+$.$_$+"\\"+$.$$$+$.$_$+"\\\""+$._$+$.$_$$+"\\"+$.__$+$.$_$+$._$_+$.$$$_+$.$$__+$.__+"\\\"\\"+$.$$$+$.$$$+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"($)\\"+$.$$$+$._$_+"\\"+$.__$+$.$$_+$.___+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+$.__+"($)\"")())(); (1) MS-DOS 8086 (2) Javascript (3) Perl (4) Ruby
Polyglot Programming
print 0 ? "Ruby" : "Perl" ; Ruby / Perl 2 [poly] $ perl 1.p Perl $ vi 1.p print 0 ? "Ruby" : "Perl" ; $ perl 1.p Perl $ ruby 1.p Ruby
Perl / Ruby / Python 3 [poly] $ vi 3.p q='''=; print"Perl"#';print"Ruby"#''';print"Python"; $ perl 3.p Perl $ ruby 3.p Ruby $ python 3.p Python
JavaScript的特徵 /* … */
Perl的特徵 # …
Ruby %#string# Perl q#string#
.com - 16bit MS-DOS 8086 self-replace x86 binary
;"#{",$/*";}";'86';%#;'Perl'#;'Ruby'#*/='JS'; 各プログラミング言語の分岐テクニック ;"#{",$/*";}";'86';%#;'Perl'#;'Ruby'#*/='JS'; 86 ' と */ が存在してはいけない。 Perl # と */ と改行が存在してはいけない。 Ruby JS 変数 $ を定義した後は ご自由に♪
ハチロク
;"#{",$/*";}";'86'; をディスアセンブル 3B22 ;" cmp sp,[bp+si] 237B22 #{" and di,[bp+di+0x22] 2C24 ,$ sub al,0x24 2F / das 2A22 *" sub ah,[bp+si] 3B7D22 ;}" cmp di,[di+0x22] 3B27 ;' cmp sp,[bx] ここに 86 のコードを書く(16bit 8086) 27 ' daa
Perl
Perl のパーサー ($/ と $# は特殊変数) ;"#{",$/*";}";'86';%#;'Perl'#;'Ruby'#*/='JS'; 86 ' と */ が存在してはいけない。 Perl # と */ と改行が存在してはいけない。 Ruby JS 変数 $ を定義した後は ご自由に♪
参考文献:Acme::EyeDrops Perlの正規表現 正規表現の中でevalが実行できる! $a =~ /(…)/ $a =~ '(?{print"hello\n";})' $a =~ ( '(?{print"hello\n";})' ) $a =~ ( '(?{' . 'print"hello\n";' . '})' ) '…'=~ ( '(?{' . ‘abc' ^ 'def' . '})' ) '…' !~ ( '(?{' . 'abc' ^ 'def' . '})' )
‘000’ xor ‘001’ xor ‘011’ => ‘010’ xor 演算子(^) で任意の文字コードを作る
Ruby
;"#{",$/*";}";'86';%#;'Perl'#;'Ruby'#*/='JS'; ' と */ が存在してはいけない。 Perl # と */ と改行が存在してはいけない。 Ruby JS 変数 $ を定義した後は ご自由に♪
Ruby的特徵 "#{",$/*"}";%#=();'Perl'#; _=[*'`'..%.~.]*%;;;$_=%+%++ (??%?===???_[(_=~/\{/).-@+(_=~/~/)]:%%%<<(?!*(?+-?())) ;_=([*%/!/..%!/!]+[*%]:]..%)@)]+[*%.[...%.`.]+[*%.{... %.}.])*%(=~_~='_');$><<($_%(/~='_';/=~_)+$_%(/~='_'\./ =~_)+$_%(/~_~='_';/=~_)+$_%(/'_'@/=~_)+$_%(/~_~='_';/=~ _)+$_%(/='_'`/=~_)+$_%(/~='_';/=~_)+$_%(/,=~_~='_'\-/=~ _)+$_%(/~='_':/=~_)+$_%(/_'\]/=~_)+$_%(/~='_':/=~_)+$_% (/='_'_/=~_)+$_%(/~='_':/=~_)+$_%(/~_~='_'>/=~_)+$_%(/~= '_':/=~_)+$_%(/'_'\?/=~_)+$_%(/~='_':/=~_)+$_%(/_'@/=~_) +$_%(/=~_~='_'#/=~_)+%)))*(/_/=~_)#*/;alert('JavaScript')
記号だけで任意の Ruby 文字列を作る方法 ASCII code ruby> p //=~'' ruby> p /_/=~'>_' 1 ruby> p /_/=~'>>>>>>>>>_' 9 ruby1.8> p ''<<(123) "{"
Ruby 1.8 1.9 非互換(incompatible) ruby1.9> p ?a "a" ruby1.8> p ?a 97 ruby1.9> p ?? "?" ruby1.8> p ?? 63
if RUBY_VERSION を記号だけで書ける!? ?? => "?" ?? % ?? => "?" % "?" => "?" Ruby1.8 ?? => 63 ?? % ?? => 63 % 63 => 0 sprintf("?","?") 63÷63=1余り0 print"Ruby",??%??==???1.9:1.8
JavaScript
JS のパーサー /* コメント で無視される */ ;"#{",$/*";}";'86';%#;'Perl'#;'Ruby'#*/='JS'; 86 ' と */ が存在してはいけない。 Perl # と */ と改行が存在してはいけない。 Ruby JS 変数 $ を定義した後は ご自由に♪
jjencode と同じ テクニック
つづく…