「デモ自慢」 ppencode Lightweight Language Day and Night Shibuya Perl Mongers 竹迫 良範 2005/08/27 1 アンケート Perlが好きな人/嫌いな人(挙手!) 言語 “~が好き” “~が嫌い” 好きな人 の割合 Perl 212 34 81% Ruby 61 15 80% PHP 15 4 79% Python 29 2 93% ※参考:Googleの検索結果 2005/08/27 Lightweight Language Day and Night 2 Perlがもっと好きになるかも? Perlが嫌いな理由ベスト3(勝手に) 1. 変数にいちいち $ を付けるのが面倒 2. 文末のセミコロン ; を付け忘れてしまうことが… 3. とにかく、見た目からしてイヤだ! Perlが好きになる解決方法 1. 変数なんて使わなければイイじゃん! 2. セミコロンを使わないで書けばイイじゃん! 3. 見た目のインパクト重要! → Let’s 予約語プログラミング♪ 2005/08/27 Lightweight Language Day and Night 3 Quiz: これは何をするプログラムでしょう? #!/usr/bin/perl sin cos and s qq qx xor s x x print uc chr lc ord qq sleep times x xor int log cos xor eval and eval and print uc chr ord scalar reverse qq exit binmode xor qq write qw xor print uc chr ord scalar reverse qw tell my print 正解 → 標準出力に “LLDN” という文字列を出力するプログラム 2005/08/27 Lightweight Language Day and Night 4 Just Another Perl Hacker はじまりは JAPH 「just another perl hacker」を表示する 80x40以内のPerlプログラム もともとはUSENETの署名につけて、 自分のPerl好きをアピールするものだった ● 記録されている最初のJAPH @a=split(/(\d)/, "4Hacker,2another3Perl1Just"); shift(@a);%a=@a; print "@a{1..4}"; Randal Schwartz 1 Feb 1990 22:28:58 GMT 税別¥1,500- 水野 貴明 (著) 2005/08/27 Lightweight Language Day and Night Shibuya Perl Mongersテクニカルトーク#5 (2004年12月16日) http://shibuya.pm.org/blosxom/techtalks/200412.html 5 (例)STAR WARS #!/usr/local/bin/perl undef$/;$_=<DATA>;y/ODA¥n / /ds;@yoda=map{length}split;print chr oct join('',splice(@yoda,0,3))-111 while@yoda; __DATA__ 00O00O000O00O0000 000O DD000000O0 0DO0000000O0000O00 O00000 00O00000O0O 0000 0O0 O00 O00 00D 0DO 00O0 0O0 00D 000 DO0D00000D 0O00 DOD 000000O00000 000 O00O DD0000D000O0 000 0O00O0000D00DO 0OD D00O000D00O0 00000DO00O0 000 000O 00D0 O0D O00000O0DO0 0O000 OD0D O00O0 0000 0O000 O00DDO 00000 0O0D00 0O0O00OD00000DDD 00O 0D0 00000O00000000 O00 DO0 D0O00 O0000 000O000O00DO O00 000 0O000D000O00O0 0 0 0O0D 0000 DDDO000000 O00O000000 00O0O00000O 0O00O000000 DDD D0O 00O0D D00D00O000 00D00 000 00O0 0OD00 000 0D0O000000O00O00 0O0 0O0000000O000O http://www.cpan.org/misc/japh 2005/08/27 Lightweight Language Day and Night 6 Obfuscated Programming 難読プログラミング JAPH をさらに発展。見た目重視。表示するのが 「just another perl hacker」でなくてもいい。 普段あまり使われないテクニックに注目する。 80x40にとらわれず、長くても面白ければいい。 Perlプログラマのレベル10 レベル 9 Perl カンファレンスに出席するなど、 Perl コミュニティへの関与を深める。… レベル 10 Perl の obfuscation コンテストや 「golf」コンテストに参加する。… http://d.hatena.ne.jp/naoya/20050809/1123563794 2005/08/27 Lightweight Language Day and Night 7 (例)こんにちは世界 package Earth;sub Greet{ %_=('Y','~');$_='$;=!(Middle Earth.age~~~<Eart~~~~~~~~~~~~~h .age)?!(defined$ti~~~~~~~~~~~mez~~~On e[2])?!(push@time~~~~~~~~~~~~~~~~Zone,loc ~altime())?rotation?~~~~~~~~~~~~~q~~?The Worl ~~d?:q:[\w]::q=[\~~~~~~~~~~~~~~~~~d~a-f]=:q?..~~ ~~~?:q:.:;"42b3d3~~~~~~~~~~~~~~~~~~~~~728656c6c6f6 ~~~~~0277f627c64672~~~~~~~~~~~~~~~~~~~~~b3072796e647 ~~~~~~~42b3b3rg7d"=Ym~~~~~~~~~~~~~~~~~~~\$;~~*\;p~~~~u ~~~~~~~~~sh@_,$&;bless~~~~~~~~~~~~~~~~~~~~~~~~~$c~~~~~~~ ~~~~~~~~~o~ntine~~~~~nt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~s=\~~~~~~~$~~~~~~~~~~~~~~~~~~~~~~~pangaea~~~~ ~~~~~~~~~~~~~~~;{l~~~~~~~~~~~~~~~~~~~~~~~~~~~~ocal@_;local$; ~~~~~~~~~~~~~~~~~="o~~~~~~~~~~~~~~~~~~~~~~~~~cean";$^A=(defi ~~~~~~~~~~~~~~~~~~~n~~~~~~~~~~~~~~~~~~~~~~~~~ed$continents)? ~~~~~~~~~~~~~~~~~~~(vec(~~~~~~~~~~~~~~~~~~~~~~$;, YYsplit(\' ~~~~~~~~~~~~~~~~~\',${\$;}~~~~~~~~~~~~~~~~~~~~~~)%3,YYsplit( ~~~~~~~~~~~~~~~~q??,$;)**2-~~~~~~~~~~~~~~~~~~~~~~(($;=Ytr/oa ~~~~~~~~~~~~~~~~eiu//)**2))=~~~~~~~~~~~~~~~~~~~~~~=28160)?q: ~~~~~~~~~~~~~~~~~.::q?!?:\'?~~~~~~~~~~~~~~~~~~~~~~\';}$^A=Ys ~~~~~~~~~~~~~~~~:\Q.\E:pack(~~~~~~~~~~~~~~~~~~~~~~\'h*\',j ~~~~~~~~~~~~~~~~~oin(q(),~~~~~~~~~~~~~~~~~~~~~~~grep{$_= ~~~~~~~~~~~~~~~~~~Ym,$,,}~~~~~~~~~~~~~~~~~~~~~~~split(" ~~~~~~~~~~~~~~~~~",@_~~~~~~~~~~~~~~~~~~~~~~~~~~[0])) ~~~~~~~~~~~~~~~~):e~~~~~~~~~~~~~~~~~~~~~~~~~~~gexe ~~~~~~~~~~~~~~~;$d~~~~~~~~~~~~~~~~~~~~~~~~~~~="s ~~~~~~~~~~~~~~ort~~~~~~~~~~~~~~~~~~~~~~~~~~<= ~~~~~~~~~~~~>,~~~~~~~~~~~~~~~~~~~~~~~~~~YY ~~~~~~~~~~~@_~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~"~~~~~~~~~~~~~~~~~~~';; s,(~|\r|\n|\s),,g;s.Y.\x7e.g; eval};Greet;'the world'; http://www.perlmonks.org/index.pl?node_id=329174 2005/08/27 Lightweight Language Day and Night 8 ppencode のご紹介 Lightweight Language Day and Night Fun With Reserved Keywords を 自動生成するプログラム 2005/08/27 9 ppencode の使い方 ppencode とは? 入力文字列を出力する(予約語のみで構成された) Perlプログラムを自動出力するPerlプログラム コマンド使用法 $ echo -n "Have fun!" | ppencode #!/usr/bin/perl cos xor print chr ord uc qq chr uc xor print chr ord qq each ge xor print chr ord qq eval ge xor print chr ord qw x eq x xor print chr ord qq q eq xor print chr ord qw q fcntl q xor print chr ord qw q uc q xor print chr ord qw q no q xor print chr length q q while syswrite setgrent symlink q 2005/08/27 Lightweight Language Day and Night 10 Perlの予約語 (220) ■ 演算子/制御子 (38) lt gt le ge eq ne cmp not and or xor if else elsif while for foreach continue goto last local map my next redo require return use tr y s m q qq qr qw qx x ■ 標準関数 (182) 数字があるため除外 abs accept alarm atan2 bind binmode bless caller chdir chmod chomp chop chown chr chroot close closedir connect cos crypt dbmclose dbmopen defined delete die do dump each eof eval exec exists exit exp fcntl fileno flock fork formline getc getlogin getpeername getpgrp getppid getpriority getpwnam getgrnam gethostbyname getnetbyname getprotobyname getpwuid getgrgid getservbyname gethostbyaddr getnetbyaddr getprotobynumber getservbyport getpwent getgrent gethostent getnetent getprotoent getservent setpwent setgrent sethostent setnetent setprotoent setservent endpwent endgrent endhostent endnetent endprotoent endservent getsockname getsockopt glob gmtime grep hex import index int ioctl join keys kill lc lcfirst length link listen localtime log lstat mkdir msgctl msgget msgrcv msgsnd no oct open opendir ord pack pipe pop pos print printf push quotemeta rand read readdir readlink recv ref rename reset reverse rewinddir rindex rmdir scalar seek seekdir select semctl semget semop send setpgrp setpriority setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat study substr symlink syscall sysread system syswrite tell telldir tie time times truncate uc ucfirst umask undef unlink unpack untie unshift utime values vec wait waitpid wantarray warn write 2005/08/27 Lightweight Language Day and Night 11 使用禁止文字 数字 0 1 2 3 4 5 6 7 8 9 を使っちゃ駄目! 記号 変数 $, @, %, セミコロン ; カンマ , も駄目! クォート ’ ダブルクォート ” も使用禁止! その他 \ () {} [] + - : ! ? & | #.. も! もちろん・・・ ゴースト演算子 =()= シャクトリムシ演算子 ~~ スペースステーション演算子 -+- もってのほか! 2005/08/27 Lightweight Language Day and Night 12 ppencode の作り方 ppencode とは? 入力文字列を出力する(予約語のみで構成された) Perlプログラムを自動出力するPerlプログラム いわゆるコードジェネレータ その前段階として gen_ppencode ppencode を生成するためのPerlプログラム 2005/08/27 コードジェネレータのコードジェネレータ 予約語の組み合わせは膨大 (220 x 220 x …) 後途のヒューリスティックを実装 出力にゆらぎを持たせる工夫(改善の余地あり) Lightweight Language Day and Night 13 予約語プログラミングのテクニック解説 セミコロン ; の代わりに xor を使う q/??/ → q x??x → q else → ’ls’ qq/??/ → qq x??x → qq else → ”ls” qw(?? ??) → qw x?? ??x → qw sin cos print chr ord ”abc” → 先頭文字 a を出力 reverse → 文字列を反転 → 末尾文字を出力 uc, uppercase → tr/a-z/A-Z/ length → 文字列の長さ → 任意のASCIIコード 2005/08/27 Lightweight Language Day and Night 14 Ajaxっぽいデモ http://namazu.org/~takesako/ppencode/demo.html 2005/08/27 Lightweight Language Day and Night 15 ppencode って役に立つの??? 一つのエンコード方式として・・・ Perl の実行環境そのものがデコーダ そこに Perl さえあれば解凍可能! 解凍プログラムのインストールが不要! cd /usr/bin; sudo ln –s perl ppdecode uuencode の代わりに! 愛の告白に・・・ “I love you” を表示するプログラムをメールで送付 内気なGeekでも照れずに告白! 2005/08/27 Lightweight Language Day and Night 16 参考リンク 1. 洗練されたPerl: JAPHのすばらしさ http://www-6.ibm.com/jp/developerworks/linux/011026/j_l-japh.html 2. Perl Monks - Fun With Reserved Keywords http://www.perlmonks.org/index.pl?node_id=290607 3. [CPAN] Acme::EyeDrops 2005/08/27 http://search.cpan.org/~asavige/Acme-EyeDrops-1.50/ Lightweight Language Day and Night 17 まとめ Let’s 予約語プログラミング♪ Perl 以外の言語でも実装できますか? 2005/08/27 awk ? Haskell ? Lisp ? ML ? Perl → OK ! PHP ? Python ? Ruby ? Lightweight Language Day and Night 挑戦者求む! 18 ご清聴ありがとうございました Lightweight Language Day and Night http://namazu.org/~takesako/ 2005/08/27 19
© Copyright 2024 ExpyDoc