zsh で
    記号プログラミング

   2011年1月8日
   mollifier
自己紹介


    はてな : id mollifier
    twitter : @mollifier
    神戸のプログラマ
好きなもの


     zsh
     vim
     vimperator
     Ubuntu
ブログとか
   はてなダイアリー
     http://d.hatena.ne.jp/mollifier/
   twitter
      http://twitter.com/mollifier
   slideshare
      http://www.slideshare.net/mollifier
   github
      https://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
"0110014501540154
0157, 0167015701620
1540144!"
数字はさっき作ったので
記号に置き換える
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.
e c h o の 4文字が!

zsh:fg:1: no job
control in this
shell.
これだ!!
このエラーメッセージ
を変数に代入する


msg=$(% 2>&1)
2 と 1 を記号に置き
換えて...

msg=$(% $____>&$___)
リダイレクトできない!

msg=$(% $____>&$___)

no job control in this
shell.
リダイレクトの左側は
変数に置き換えれない

msg=$(% $____>&$___)


     これがだめ
いったん変形する


msg=$(% 2>&1 | cat)
置き換え可能

msg=$(% 2>&1 | cat)


msg=$(%   |&   cat)
さらに変形する


msg=$(% |& cat >& 1)
この cat は省略可能

msg=$(% |& cat >& 1)


msg=$(% |&     >& 1)
コマンドを指定せずに
リダイレクトだけ書く
と cat コマンドを指
定したことになる

% ls ~ | > home.txt
この機能も普段は
全く役に立たない
記号プログラミングを
やると
どうでもいいことばか
り覚えてしまう
ここまで来たので


msg=$(% |& >& 1)
変数名と 1 を
 記号に置き換える

____________=$(% |&
>& $___)
エラーメッセージを
変数に代入できた
文字列の一部分には
添え字でアクセスできる

$____________[-4]
#=> e
これで echo が作れる

$____________[-4]
$____________[-22]
$____________[-5]
$____________[-17]
添え字の数字を
記号に置き換えると...
:;__=$?;((___=!__));((____=___+___));
((_____=____+___));((______=_____+___));
((_______=______+___));((________=____*_____));
((_________=________+___));
((__________=____*______));
((___________=_____*_____));____________=$(% |& >&
$___);$____________[-$______]$____________[-
$____$____]$____________[-$_______]$____________[-
$___$_________] "$__$___$___$__
$__$___$______$_______$__$___$_______$______
$__$___$_______$______
$__$___$_______$_________, 
$__$___$________$_________
$__$___$_______$_________$__$___$________$____
$__$___$_______$______$__$___$______$______!"
できた!
いざ実行
みなさんも
記号プログラミングに
挑戦してみてください
ありがとうございました

zsh symbolic programming