Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Strange Code: Esoteric Languages エソラングが変えた私の人生

takesako
February 11, 2024

Strange Code: Esoteric Languages エソラングが変えた私の人生

YAYAPC::Hiroshima (YAPC::Hiroshima 2024 アフターイベント)
https://connpass.com/event/300500/

takesako

February 11, 2024
Tweet

More Decks by takesako

Other Decks in Programming

Transcript

  1. 広島の会社から来ました(22年前に新卒入社) ◼広島 → Shibuya.pm → サイボウズ・ラボ → 現職 2 広島県在籍ながらShibuya.pm

    の常連でもある竹迫良範氏 出典:Perlの強者が目黒に集結、Shibuya Perl Mongers 1周年記念 テクニカルトーク(ITmedia News 2003/10/21) https://www.itmedia.co.jp/news/0310/21/nj00_spm.html 出典:http://shibuya.pm.org/blosxom/techtalks/techtalks_200310.html
  2. 日本語訳ストレンジコードが出版されます(みんな見てね 4 1章 歴代のプログラミング言語たち 2章 プログラミング言語の本質 3章 チューリングマシンとチューリング完全 4章 Forth

    5章 SNOBOL 6章 CLIPS 7章 ABC 8章 FRACTRAN 9章 Piet 10章 Brainfuck 11章 Befunge 12章 Filska 14章 Firefly 16章 Further ALGOL, APL, BASIC, PL/I, Logo, Simula, Pascal, Prolog, Smalltalk, Standard ML 書名:ストレンジコード 著者:Ronald T. Kneusel 翻訳:水野 貴明 監訳:竹迫 良範 定価:4,730円(税込) 発売:2024年2月16日 厚さ:604ページ 出典:https://www.amazon.co.jp/dp/4798069744/
  3. 日本語訳ストレンジコードが出版されます(みんな見てね 15 1章 歴代のプログラミング言語たち 2章 プログラミング言語の本質 3章 チューリングマシンとチューリング完全 4章 Forth

    5章 SNOBOL 6章 CLIPS 7章 ABC 8章 FRACTRAN 9章 Piet 10章 Brainfuck 11章 Befunge 12章 Filska 14章 Firefly 16章 Further ALGOL, APL, BASIC, PL/I, Logo, Simula, Pascal, Prolog, Smalltalk, Standard ML 書名:ストレンジコード 著者:Ronald T. Kneusel 翻訳:水野 貴明 監訳:竹迫 良範 定価:4,730円(税込) 発売:2024年2月16日 厚さ:604ページ 出典:https://www.amazon.co.jp/dp/4798069744/ 再掲
  4. 私の人生を変えた Perl の hello world プログラム 16 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'; 実行結果: hello world 出典:https://www.perlmonks.org/index.pl?node_id=329174
  5. Perl開発者”Larry Wall”より広島の皆様へご挨拶 17 use re 'eval'; ''=~('('.'?'.'{' .('['^'+').('['^"¥)").( '`'|')').('`'|'.').('['^"¥/"). "¥"".

    '#'. ('[' ^(( '"') )). ('`' | '!' ).+( ( '[' )^(( (( ( '"' )))) ) ) .+( '`' |+ (( '!' ))) .( ( '[' )^+ '+') . ((( '`' ))|+ ( '#' )). ('{' ^ '[' ).( '`'|')'). ( '[' ^(( (( ( (( '(' )) ) )) ))) . ( (( '{' ) )^'[' ).( ( (( '{' ) ))^'"').('`'|'%').('['^'/').('{'^'['). ((( '`'))^'!').( '`'|'.' ) . (('`')| ( '/' ) ) .+( '[' ^+ ( ( (( '/' ))) ) ).( ( ( '`'))|'(').( ( ( '`'))|'%').( ( '[' ) ^ ( ( ( (( ')' ) ) ) )) ) .( ( '{')^ ( ( (( ( (( ( ( ( ( ( ( (( ( '[' ))))))))))))))) ) ).('{'^'"'). +( ( ( ( ( ( ( ( ( ( ( ( ( '`' ) ) ) ))) )) ) ) ) )^'!').('{'^'+').('`' ^ ( ( '#'))).('!'^'+').'"'.'}' . ( ( ')')));$:='.'^'~';$~="¥@"| ( ( ( '(')) );$^=')'^"¥["; ($/) = ( ( '`') ) | '.' ; $, =(( '('))^'}';#;#;#; #;# ; # ; # ; # ; # ; # ; # ; # ; # ; # ; # ; # ; # ; # ; #;# ;# ; # ;#;#;#;#;#; # 実行結果: #yayapc is Yet Another YAPC 出典:Acme::EyeDrops でコード生成
  6. Just Another Perl Hacker(JAPH)を読む 18 税別¥1,500- 水野 貴明 (著) @a=split(/(¥d)/,

    "4Hacker,2another3Perl1Just"); shift(@a);%a=@a; print "@a{1..4}"; Randal Schwartz 1 Feb 1990 22:28:58 GMT • 記録されている最初のJAPH 出典:Shibuya Perl Mongersテクニカルトーク#5 (2004年12月16日) http://shibuya.pm.org/blosxom/techtalks/200412.html
  7. LLDN2005 夜の部 LTダメ自慢で「ppencode」を発表 ◼ppencode とは? ◼入力文字列を出力する(予約語のみで構成された) Perlプログラムを出力するPerlプログラム ◼コマンド使用法 20 $

    echo -n "LLDN" | ppencode #!/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 2005/08/27 Lightweight Language Day and Night
  8. Perlの予約語 21 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 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 ▪ 標準関数 (183) ▪ 演算子/制御子 (38)
  9. 予約語プログラミングのテクニック解説 ◼セミコロン ; の代わりに 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コード 22
  10. Perl Survey 2007 を読み解く ◼Perlプログラマの年収と相関の強い要素は何? 母集団数 4575人 出身国別 us 1666

    uk 588 de 282 au 230 ca 146 ru 134 in 124 fr 113 br 104 nl 94 出典:Mint‘s log: Perlサーベイを読み解く http://googlewhacks.blogspot.com/2008/02/perl.html
  11. Perl Survey 2007 から分かること ◼年収の高い人は、、、 ◼ Perlの開発に参加しており(1位、2位) ◼地元以外のPerlモンガーズに参加していて(4位、5位) ◼カンファレンスで発表している(6位) ◼年功序列か?

    ◼ 年齢の相関係数0.35→それほど高くない ◼年収と年齢は強い相関関係にない ◼言い換えると・・・ 出典:Mint‘s log: Perlサーベイを読み解く http://googlewhacks.blogspot.com/2008/02/perl.html Perlプログラマの年収は年功序列ではない