zsh symbolic programming
TRANSCRIPT
zsh で記号プログラミング
2011年1月8日 mollifier
自己紹介
はてな : id mollifier
twitter : @mollifier
神戸のプログラマ
好きなもの
zsh
vim
vimperator
Ubuntu
ブログとか
はてなダイアリーhttp://d.hatena.ne.jp/mollifier/
twitterhttp://twitter.com/mollifier
slidesharehttp://www.slideshare.net/mollifier
githubhttps://github.com/mollifier
zsh で記号プログラミングに挑戦
例えばこんな時 ...
よし、プログラムを書くぞ!
あああ!!!
キーボードが壊れてしまった!
アルファベットと数字のキーが効かない!
今日中に Hello World を納品しないと会社が潰れてしまうのに!
記号のキーだけは使えるんだけど、記号だけでどうやってHello World を書けばいいんだ
その仕事、俺に任せてみないか
というわけで
記号プログラミングとは
アルファベット、数字を使わずに記号だけでプログラムを書くこと
いろいろあります
これは何でしょうか?
''=~('(?{'.('[[).[|`%,,/`[/[@$'^'+)@@/^(@@@@@,@),@').'!
"})')
Perl のHello world!でした
% perl kigou.pl
Hello world!
いろんな言語で記号プログラミングされています
シェルの中でも最強の zsh
当然記号プログラミングでも最強
今日は zsh で記号プログラミングに挑戦
記号だけでHello, world! を出力します
ソースコード
:;__=$?;((___=!__));((____=___+___));((_____=____+___));((______=_____+___));((_______=______+___));((________=____*_____));((_________=________+___));((__________=____*______));((___________=_____*_____));____________=$(% |& >& $___);$____________[-$______]$____________[-$____$____]$____________[-$_______]$____________[-$___$_________] "\\$__$___$___$__\\$__$___$______$_______\\$__$___$_______$______\\$__$___$_______$______\\$__$___$_______$_________, \\$__$___$________$_________\\$__$___$_______$_________\\$__$___$________$____\\$__$___$_______$______\\$__$___$______$______!"
記号だけで読みやすいですね
解説
最終的にecho "Hello, world!"を実行したい
その前にまず 0 から 9 までの数字を作る
これで 0
:__=$?
: は何もしないコマンド。戻り値は 0 なのでそれを __ という変数に代入
:__=$?
0 を否定すると 1
((___=!__))
あとは足し算。1 + 1 で 2
((____=___+___))
2 + 1 で 3
((_____=____+___))
順番に 9 まで作る
次に"Hello, world!"の部分
実は Ascii コードで書ける
% echo "\\0101"A
8進数の Ascii コードで書けば OK
echo "\\0110\\0145\\0154\\0154\\0157, \\0167\\0157\\0162\\0154\\0144!"
数字はさっき作ったので
記号に置き換えるecho "\\$__$___$___$__\\$__$___$______$_______\\$__$___$_______$______\\$__$___$_______$______\\$__$___$_______$_________, \\$__$___$________$_________\\$__$___$_______$_________\\$__$___$________$____\\$__$___$_______$______\\$__$___$______$______!"
この Ascii コードで表せるという機能
普段は全く役に立たない
まさに記号プログラミングのためにある機能
右の文字列の部分は記号で表せた
でもまだecho が残ってる
ここで、突然ですがzsh で % コマンドを実行
zsh -c '%'
zsh:fg:1: no job control in this shell.
エラーメッセージが出力された
zsh:fg:1: no job control in this shell.
よーく見ると...
zsh:fg:1: no job control in this shell.
よーく見ると...
zsh:fg:1: no job control in this shell.
e c h o の 4文字が!
これだ!!
msg=$(% 2>&1)
このエラーメッセージを変数に代入する
msg=$(% $____>&$___)
2 と 1 を記号に置き換えて...
msg=$(% $____>&$___)
no job control in this shell.
リダイレクトできない!
msg=$(% $____>&$___)
リダイレクトの左側は変数に置き換えれない
これがだめ
msg=$(% 2>&1 | cat)
いったん変形する
msg=$(% 2>&1 | cat)
置き換え可能
msg=$(% |& cat)
msg=$(% |& cat >& 1)
さらに変形する
msg=$(% |& cat >& 1)
この cat は省略可能
msg=$(% |& >& 1)
コマンドを指定せずにリダイレクトだけ書くと cat コマンドを指定したことになる
% ls ~ | > home.txt
この機能も普段は全く役に立たない
記号プログラミングをやるとどうでもいいことばかり覚えてしまう
ここまで来たので
msg=$(% |& >& 1)
変数名と 1 を記号に置き換える
____________=$(% |& >& $___)
エラーメッセージを変数に代入できた
文字列の一部分には添え字でアクセスできる
$____________[-4]#=> e
これで echo が作れる
$____________[-4]$____________[-22]$____________[-5]$____________[-17]
添え字の数字を記号に置き換えると...
:;__=$?;((___=!__));((____=___+___));((_____=____+___));((______=_____+___));((_______=______+___));((________=____*_____));((_________=________+___));((__________=____*______));((___________=_____*_____));____________=$(% |& >& $___);$____________[-$______]$____________[-$____$____]$____________[-$_______]$____________[-$___$_________] "\\$__$___$___$__\\$__$___$______$_______\\$__$___$_______$______\\$__$___$_______$______\\$__$___$_______$_________, \\$__$___$________$_________\\$__$___$_______$_________\\$__$___$________$____\\$__$___$_______$______\\$__$___$______$______!"
できた!
いざ実行
みなさんも記号プログラミングに挑戦してみてください
ありがとうございました