76
zsh で 記号プログラミング 2011年1月8日 mollifier

zsh symbolic programming

Embed Size (px)

Citation preview

Page 1: zsh symbolic programming

zsh で記号プログラミング

2011年1月8日 mollifier

Page 2: zsh symbolic programming

自己紹介

はてな : id mollifier

twitter : @mollifier

神戸のプログラマ

Page 3: zsh symbolic programming

好きなもの

zsh

vim

vimperator

Ubuntu

Page 4: zsh symbolic programming

ブログとか

はてなダイアリーhttp://d.hatena.ne.jp/mollifier/

twitterhttp://twitter.com/mollifier

slidesharehttp://www.slideshare.net/mollifier

githubhttps://github.com/mollifier

Page 5: zsh symbolic programming

zsh で記号プログラミングに挑戦

Page 6: zsh symbolic programming

例えばこんな時 ...

Page 7: zsh symbolic programming

よし、プログラムを書くぞ!

Page 8: zsh symbolic programming

あああ!!!

Page 9: zsh symbolic programming

キーボードが壊れてしまった!

Page 10: zsh symbolic programming

アルファベットと数字のキーが効かない!

Page 11: zsh symbolic programming

今日中に Hello World を納品しないと会社が潰れてしまうのに!

Page 12: zsh symbolic programming

記号のキーだけは使えるんだけど、記号だけでどうやってHello World を書けばいいんだ

Page 13: zsh symbolic programming

その仕事、俺に任せてみないか

Page 14: zsh symbolic programming

というわけで

Page 15: zsh symbolic programming

記号プログラミングとは

Page 16: zsh symbolic programming

アルファベット、数字を使わずに記号だけでプログラムを書くこと

Page 17: zsh symbolic programming

いろいろあります

Page 18: zsh symbolic programming

これは何でしょうか?

''=~('(?{'.('[[).[|`%,,/`[/[@$'^'+)@@/^(@@@@@,@),@').'!

"})')

Page 19: zsh symbolic programming

Perl のHello world!でした

% perl kigou.pl

Hello world!

Page 20: zsh symbolic programming

いろんな言語で記号プログラミングされています

Page 21: zsh symbolic programming

シェルの中でも最強の zsh

Page 22: zsh symbolic programming

当然記号プログラミングでも最強

Page 23: zsh symbolic programming

今日は zsh で記号プログラミングに挑戦

Page 24: zsh symbolic programming

記号だけでHello, world! を出力します

Page 25: zsh symbolic programming

ソースコード

Page 26: zsh symbolic programming

:;__=$?;((___=!__));((____=___+___));((_____=____+___));((______=_____+___));((_______=______+___));((________=____*_____));((_________=________+___));((__________=____*______));((___________=_____*_____));____________=$(% |& >& $___);$____________[-$______]$____________[-$____$____]$____________[-$_______]$____________[-$___$_________] "\\$__$___$___$__\\$__$___$______$_______\\$__$___$_______$______\\$__$___$_______$______\\$__$___$_______$_________, \\$__$___$________$_________\\$__$___$_______$_________\\$__$___$________$____\\$__$___$_______$______\\$__$___$______$______!"

Page 27: zsh symbolic programming

記号だけで読みやすいですね

Page 28: zsh symbolic programming

解説

Page 29: zsh symbolic programming

最終的にecho "Hello, world!"を実行したい

Page 30: zsh symbolic programming

その前にまず 0 から 9 までの数字を作る

Page 31: zsh symbolic programming

これで 0

:__=$?

Page 32: zsh symbolic programming

: は何もしないコマンド。戻り値は 0 なのでそれを __ という変数に代入

:__=$?

Page 33: zsh symbolic programming

0 を否定すると 1

((___=!__))

Page 34: zsh symbolic programming

あとは足し算。1 + 1 で 2

((____=___+___))

Page 35: zsh symbolic programming

2 + 1 で 3

((_____=____+___))

Page 36: zsh symbolic programming

順番に 9 まで作る

Page 37: zsh symbolic programming

次に"Hello, world!"の部分

Page 38: zsh symbolic programming

実は Ascii コードで書ける

% echo "\\0101"A

Page 39: zsh symbolic programming

8進数の Ascii コードで書けば OK

echo "\\0110\\0145\\0154\\0154\\0157, \\0167\\0157\\0162\\0154\\0144!"

Page 40: zsh symbolic programming

数字はさっき作ったので

Page 41: zsh symbolic programming

記号に置き換えるecho "\\$__$___$___$__\\$__$___$______$_______\\$__$___$_______$______\\$__$___$_______$______\\$__$___$_______$_________, \\$__$___$________$_________\\$__$___$_______$_________\\$__$___$________$____\\$__$___$_______$______\\$__$___$______$______!"

Page 42: zsh symbolic programming

この Ascii コードで表せるという機能

Page 43: zsh symbolic programming

普段は全く役に立たない

Page 44: zsh symbolic programming

まさに記号プログラミングのためにある機能

Page 45: zsh symbolic programming

右の文字列の部分は記号で表せた

Page 46: zsh symbolic programming

でもまだecho が残ってる

Page 47: zsh symbolic programming

ここで、突然ですがzsh で % コマンドを実行

Page 48: zsh symbolic programming

zsh -c '%'

Page 49: zsh symbolic programming

zsh:fg:1: no job control in this shell.

Page 50: zsh symbolic programming

エラーメッセージが出力された

Page 51: zsh symbolic programming

zsh:fg:1: no job control in this shell.

よーく見ると...

Page 52: zsh symbolic programming

zsh:fg:1: no job control in this shell.

よーく見ると...

Page 53: zsh symbolic programming

zsh:fg:1: no job control in this shell.

e c h o の 4文字が!

Page 54: zsh symbolic programming

これだ!!

Page 55: zsh symbolic programming

msg=$(% 2>&1)

このエラーメッセージを変数に代入する

Page 56: zsh symbolic programming

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

2 と 1 を記号に置き換えて...

Page 57: zsh symbolic programming

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

no job control in this shell.

リダイレクトできない!

Page 58: zsh symbolic programming

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

リダイレクトの左側は変数に置き換えれない

これがだめ

Page 59: zsh symbolic programming

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

いったん変形する

Page 60: zsh symbolic programming

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

置き換え可能

msg=$(% |& cat)

Page 61: zsh symbolic programming

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

さらに変形する

Page 62: zsh symbolic programming

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

この cat は省略可能

msg=$(% |& >& 1)

Page 63: zsh symbolic programming

コマンドを指定せずにリダイレクトだけ書くと cat コマンドを指定したことになる

% ls ~ | > home.txt

Page 64: zsh symbolic programming

この機能も普段は全く役に立たない

Page 65: zsh symbolic programming

記号プログラミングをやるとどうでもいいことばかり覚えてしまう

Page 66: zsh symbolic programming

ここまで来たので

msg=$(% |& >& 1)

Page 67: zsh symbolic programming

変数名と 1 を記号に置き換える

____________=$(% |& >& $___)

Page 68: zsh symbolic programming

エラーメッセージを変数に代入できた

Page 69: zsh symbolic programming

文字列の一部分には添え字でアクセスできる

$____________[-4]#=> e

Page 70: zsh symbolic programming

これで echo が作れる

$____________[-4]$____________[-22]$____________[-5]$____________[-17]

Page 71: zsh symbolic programming

添え字の数字を記号に置き換えると...

Page 72: zsh symbolic programming

:;__=$?;((___=!__));((____=___+___));((_____=____+___));((______=_____+___));((_______=______+___));((________=____*_____));((_________=________+___));((__________=____*______));((___________=_____*_____));____________=$(% |& >& $___);$____________[-$______]$____________[-$____$____]$____________[-$_______]$____________[-$___$_________] "\\$__$___$___$__\\$__$___$______$_______\\$__$___$_______$______\\$__$___$_______$______\\$__$___$_______$_________, \\$__$___$________$_________\\$__$___$_______$_________\\$__$___$________$____\\$__$___$_______$______\\$__$___$______$______!"

Page 73: zsh symbolic programming

できた!

Page 74: zsh symbolic programming

いざ実行

Page 75: zsh symbolic programming

みなさんも記号プログラミングに挑戦してみてください

Page 76: zsh symbolic programming

ありがとうございました