Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

zsh symbolic programming

5,106 views

Published on

  • Be the first to comment

  • Be the first to like this

zsh symbolic programming

  1. 1. zsh で 記号プログラミング  2011年1月8日  mollifier
  2. 2. 自己紹介  はてな : id mollifier  twitter : @mollifier  神戸のプログラマ
  3. 3. 好きなもの  zsh  vim  vimperator  Ubuntu
  4. 4. ブログとか  はてなダイアリー http://d.hatena.ne.jp/mollifier/  twitter http://twitter.com/mollifier  slideshare http://www.slideshare.net/mollifier  github https://github.com/mollifier
  5. 5. zsh で記号 プログラミングに挑戦
  6. 6. 例えばこんな時 ...
  7. 7. よし、 プログラムを 書くぞ!
  8. 8. あああ!!!
  9. 9. キーボードが 壊れてしまった!
  10. 10. アルファベットと 数字のキーが効かない!
  11. 11. 今日中に Hello World を 納品しないと 会社が潰れてしまうのに!
  12. 12. 記号のキーだけは使える んだけど、 記号だけでどうやって Hello World を書けばい いんだ
  13. 13. その仕事、 俺に任せて みないか
  14. 14. というわけで
  15. 15. 記号プログラミングとは
  16. 16. アルファベット、 数字を使わずに 記号だけで プログラムを書くこと
  17. 17. いろいろあります
  18. 18. これは何でしょうか? ''=~('(?{'.('[[).[|`%,,/`[/ [@$'^'+)@@/^(@@@@@,@),@').'! "})')
  19. 19. Perl の Hello world!でした % perl kigou.pl Hello world!
  20. 20. いろんな言語で 記号プログラミングされ ています
  21. 21. シェルの中でも 最強の zsh
  22. 22. 当然 記号プログラミング でも最強
  23. 23. 今日は zsh で 記号プログラミングに 挑戦
  24. 24. 記号だけで Hello, world! を 出力します
  25. 25. ソースコード
  26. 26. :;__=$?;((___=!__));((____=___+___)); ((_____=____+___));((______=_____+___)); ((_______=______+___));((________=____*_____)); ((_________=________+___)); ((__________=____*______)); ((___________=_____*_____));____________=$(% |& >& $___);$____________[-$______]$____________[- $____$____]$____________[-$_______]$____________[- $___$_________] "$__$___$___$__ $__$___$______$_______$__$___$_______$______ $__$___$_______$______ $__$___$_______$_________, $__$___$________$_________ $__$___$_______$_________$__$___$________$____ $__$___$_______$______$__$___$______$______!"
  27. 27. 記号だけで 読みやすいですね
  28. 28. 解説
  29. 29. 最終的に echo "Hello, world!" を実行したい
  30. 30. その前にまず 0 から 9 までの数字を作る
  31. 31. これで 0 : __=$?
  32. 32. : は何もしないコマンド。 戻り値は 0 なので それを __ という変数に代入 : __=$?
  33. 33. 0 を否定すると 1 ((___=!__))
  34. 34. あとは足し算。 1 + 1 で 2 ((____=___+___))
  35. 35. 2 + 1 で 3 ((_____=____+___))
  36. 36. 順番に 9 まで作る
  37. 37. 次に "Hello, world!" の部分
  38. 38. 実は Ascii コードで 書ける % echo "0101" A
  39. 39. 8進数の Ascii コード で書けば OK echo "0110014501540154 0157, 0167015701620 1540144!"
  40. 40. 数字はさっき作ったので
  41. 41. 記号に置き換える echo "$__$___$___$__ $__$___$______$_______ $__$___$_______$______ $__$___$_______$______ $__$___$_______$_________, $__$___$________$_________ $__$___$_______$_________ $__$___$________$____ $__$___$_______$______ $__$___$______$______!"
  42. 42. この Ascii コードで 表せるという機能
  43. 43. 普段は全く役に立たない
  44. 44. まさに記号プログラミン グのためにある機能
  45. 45. 右の文字列の部分は 記号で表せた
  46. 46. でもまだ echo が残ってる
  47. 47. ここで、突然ですが zsh で % コマンドを 実行
  48. 48. zsh -c '%'
  49. 49. zsh:fg:1: no job control in this shell.
  50. 50. エラーメッセージが 出力された
  51. 51. よーく見ると... zsh:fg:1: no job control in this shell.
  52. 52. よーく見ると... zsh:fg:1: no job control in this shell.
  53. 53. e c h o の 4文字が! zsh:fg:1: no job control in this shell.
  54. 54. これだ!!
  55. 55. このエラーメッセージ を変数に代入する msg=$(% 2>&1)
  56. 56. 2 と 1 を記号に置き 換えて... msg=$(% $____>&$___)
  57. 57. リダイレクトできない! msg=$(% $____>&$___) no job control in this shell.
  58. 58. リダイレクトの左側は 変数に置き換えれない msg=$(% $____>&$___) これがだめ
  59. 59. いったん変形する msg=$(% 2>&1 | cat)
  60. 60. 置き換え可能 msg=$(% 2>&1 | cat) msg=$(% |& cat)
  61. 61. さらに変形する msg=$(% |& cat >& 1)
  62. 62. この cat は省略可能 msg=$(% |& cat >& 1) msg=$(% |& >& 1)
  63. 63. コマンドを指定せずに リダイレクトだけ書く と cat コマンドを指 定したことになる % ls ~ | > home.txt
  64. 64. この機能も普段は 全く役に立たない
  65. 65. 記号プログラミングを やると どうでもいいことばか り覚えてしまう
  66. 66. ここまで来たので msg=$(% |& >& 1)
  67. 67. 変数名と 1 を 記号に置き換える ____________=$(% |& >& $___)
  68. 68. エラーメッセージを 変数に代入できた
  69. 69. 文字列の一部分には 添え字でアクセスできる $____________[-4] #=> e
  70. 70. これで echo が作れる $____________[-4] $____________[-22] $____________[-5] $____________[-17]
  71. 71. 添え字の数字を 記号に置き換えると...
  72. 72. :;__=$?;((___=!__));((____=___+___)); ((_____=____+___));((______=_____+___)); ((_______=______+___));((________=____*_____)); ((_________=________+___)); ((__________=____*______)); ((___________=_____*_____));____________=$(% |& >& $___);$____________[-$______]$____________[- $____$____]$____________[-$_______]$____________[- $___$_________] "$__$___$___$__ $__$___$______$_______$__$___$_______$______ $__$___$_______$______ $__$___$_______$_________, $__$___$________$_________ $__$___$_______$_________$__$___$________$____ $__$___$_______$______$__$___$______$______!"
  73. 73. できた!
  74. 74. いざ実行
  75. 75. みなさんも 記号プログラミングに 挑戦してみてください
  76. 76. ありがとうございました

×