zsh symbolic programming

Post on 28-May-2015

4.678 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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]

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

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

できた!

いざ実行

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

ありがとうございました

top related