恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

59
恐怖 シェルショッカーのPOSIX原理主義シェルスクリプト シェルショッカー日本支部 https://github.com/ShellShoccar-jpn 1 2016320@歌舞伎座.tech#9

Transcript of 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

Page 1: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

恐怖 シェルショッカーのPOSIX原理主義シェルスクリプト

シェルショッカー日本支部

https://github.com/ShellShoccar-jpn

1

2016年3月20日@歌舞伎座.tech#9

Page 2: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

全世界

70000000000000000000000人

くらいのプログラマー達よ、

2

Page 3: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

お前たちは、

今の開発言語、開発環境に

満足しておるのか?

3

Page 4: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

OS、言語、ライブラリー、

ミドルウェア……

毎日飽きもせずver. up、

4

Page 5: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

突然動かなくなって、

徹夜で泣きながら修正……

とか...

5

Page 6: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

そういう目に遭わずに

済む奴はいるのか?

6

Page 7: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

より便利な競合ソフトの登場、

代わりに、消えていくソフト……

7

Developer Survey Results 2016 IV. Trending Tech on Stack Overflow (Losers) http://stackoverflow.com/research/developer-survey-2016

Page 8: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

せっかく勉強したのに

開発現場から消え、

知識が役に立たなくなる……

8

Page 9: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

10年後の自分は、

10年分の成長が

できているのか……

9

Page 10: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

10 秘密結社シェルショッカー。

Page 11: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義

プログラミング (POSIX Centric Programming)

秘密結社シェルショッカーの

11

Page 12: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 概要

UNIX系OSの最低限のI/Fを定めた規格、

「POSIX」に極力準拠させる

プログラミング方針

12

Page 13: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 概要

POSIX準拠させる理由① ― 準拠OSが多い 明示的準拠……商用UNIX、 Mac OS Xなど

暗示的準拠……FreeBSD、 LinuxなどのPC UNIX

→どこへ持っていっても動く

13

Page 14: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 概要

POSIX準拠させる理由② ― 殆ど改定しない 非営利団体の国際規格

準拠するベンダーが多いので簡単に改定できない

→長年動く (動いてきた)

14

Page 15: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 概要

過酷な環境変化に耐える

「ソフトウェアの乾パン」

15

Page 16: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 概要

複雑な状態変質がイヤで

Immutable Infrastructure?

16

Page 17: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 概要

必要ない!

サーバーよ、好きなだけ変質しろ!

Be mutable! infrastructure

17

Page 18: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践

3つの方針を導入

18

① POSIX

原理主義

②交換可能性担保

③ W3C

原理主義

単独ホスト または Webサーバー Webクライアント

Page 19: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践①POSIX原理主義

1. POSIXコマンドだけで実装 AWK、sed等はチューリング完全。

2. 言語はシェルスクリプト

POSIXにあるのがそれだから。

→ POSIXの範囲で、どんな計算も書ける。

19

POSIX公式情報サイト http://pubs.opengroup.org/onlinepubs/9699919799/

Page 20: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践①POSIX原理主義

例(1)―XMLパーサ(parsrx.sh) https://github.com/ShellShoccar-jpn/Parsrs/blob/master/parsrx.sh

XML→行列指向フォーマット(XPath - value)への変換 sed, AWK等、26個のコマンドをパイプで連結し生成。 JSON, CSVパーサも同様に実装済。

20

<文具購入リスト 会員名="文具 太郎">

<購入品>はさみ</購入品>

<購入品>ノート(A4,無地)</購入品>

<購入品>シャープペンシル</購入品>

<購入品><取寄商品>替え芯</取寄商品></購入品>

<購入品>クリアファイル</購入品>

<購入品><取寄商品>6穴パンチ</取寄商品></購入品>

</文具購入リスト>

/文具購入リスト/@会員名 文具 太郎

/文具購入リスト/購入品 はさみ

/文具購入リスト/購入品 ノート(A4,無地)

/文具購入リスト/購入品 シャープペンシル

/文具購入リスト/購入品/取寄商品 替え芯

/文具購入リスト/購入品

/文具購入リスト/購入品 クリアファイル

/文具購入リスト/購入品/取寄商品 6穴パンチ

/文具購入リスト/購入品

/文具購入リスト ¥n ¥n ¥n ¥n ¥n ¥n ¥n

Page 21: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践①POSIX原理主義

例(2)―RDBMS的操作 データは半角空白区切りのテキストファイル持ち AWK, grep, sort, join等の組み合わせでselect文相当が実現

→ SQL文(RDBMS)など要らぬ!

21

SELECT MEM."会員ID", MEM."会員名" FROM blacklist AS MEM RIGHT OUTER JOIN members AS BL ON BL."会員名" = MEM."会員名" WHERE BL."会員名" IS NOT NULL ORDER BY MEM."会員ID" ASC;

cat blacklist.txt | # 第1列:BL会員ID # sort -k 1,1 | ←会員IDで並替え uniq > sorted_bl.txt cat members.txt | # 第1列:会員ID 第2列:名前 # sort –k 1,1 |←会員IDで並替え join -1 1 -2 2 -v 2 sorted_bl.txt - ←BLの会員IDで joinできない行 のみを抽出

ブラックリストに掲載された会員「以外」を表示するデータ操作

SQL版 POSIX版

Page 22: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践①POSIX原理主義

例(3)―その他いろいろ 非Web系

乱数、 mktemp相当、 全角・半角文字相互変換、 排他制御……

Web系

Cookie、 セッション管理、 MIMEマルチパート作成・解読、Base64、

CGI変数授受……

主にRFC文書を読みながら作る。

Webアプリ開発に必要なものまで、概ね作れる。

22

Page 23: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践②交換可能性担保

POSIXの範囲で実現できないもの

バイナリ処理(非現実的処理速度なため)

ネットワーク処理(コマンドが無く、原理的に不可)

一定条件の元、POSIX外コマンドを認める。

23

Page 24: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践②交換可能性担保

一定条件とは、「交換可能性」の担保

交換可能性 「現在依存している製品が使えなくなっても、同じ機能を持つ別製品が存在し、交換できる」 (例) Apache ←→ nginx ←→ lighttpd 等 sendmail ←→ Postfix ←→ qmail ←→ exim 等 cURL ←→ Wget

そもそもPOSIX準拠OS同士には交換可能性がある。

24

Page 25: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践②交換可能性担保

例 ― CUI版Twitterクライアント怪人「恐怖!小鳥男」

https://github.com/ShellShoccar-jpn/kotoriotoko

25

Page 26: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践②交換可能性担保

Twitter APIアクセスでcURL、Wget両対応にする。

26

: s=$(mime-make -m) ct_hdr="Content-Type: multipart/form-data; boundary=¥"$s¥"" eval mime-make -b "$s" $mimemake_args | if [ -n "${CMD_WGET:-}" ]; then case "$timeout" in '') : ;; *) timeout="--connect-timeout=$timeout";; esac cat > "$Tmp/mimedata" "$CMD_WGET" ${no_cert_wget:-} -q -O - --header="$oa_hdr" --header="$ct_hdr" --post-file="$Tmp/mimedata" $timeout "$API_endpt" elif [ -n "${CMD_CURL:-}" ]; then case "$timeout" in '') : ;; *) timeout="--connect-timeout $timeout";; esac "$CMD_CURL" ${no_cert_curl:-} -s $timeout -H "$oa_hdr" -H "$ct_hdr" --data-binary @- "$API_endpt" fi :

[注意] Wgetには、ファイルアップロード機能がないため、cURLにあっても使わない。 →POSIX原理主義で実装 (使ったら交換不可能に

なるではないか!)

Wget用、 cURL用、 2つの書式で書く。

Page 27: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践②交換可能性担保

その他の例

メール送信コマンド ― sendjpmail sendmailコマンドの日本語対応ラッパー

主要MTAには、必ずsendmailコマンドがある。

添付ファイルにも対応

https://github.com/ShellShoccar-jpn/misc-tools/blob/master/sendjpmail

27

Page 28: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践③W3C原理主義

WebアプリではWebブラウザー側でも開発必要

WebブラウザーはUNIXではない。 HTML/CSS/JavaScript

W3C勧告に準拠 W3C勧告は、いわば「POSIXのWebブラウザー版」

28

Page 29: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践③W3C原理主義

W3C勧告のHTML/CSS/JavaScript仕様のみ使用

https://www.w3.org/TR/

個々のWebブラウザーの独自仕様は使用禁止。

独自ライブラリーも禁止

jQueryその他

W3C勧告の範囲でフルスクラッチ

29

Page 30: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践③W3C原理主義

Ajax処理ごとき、40行足らずでフルスクラッチ可能。

(例)https://github.com/ShellShoccar-jpn/Ajax_demo/blob/master/CLOCK.JS

30

// 1.Ajaxオブジェクト生成関数 function createXMLHttpRequest(){ if(window.XMLHttpRequest){return new XMLHttpRequest()} if(window.ActiveXObject){ try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(e){} try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(e){} try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){} } return false; } // 2.Ajax通信関数 function update_clock() { var url,xhr,to; url = get_homedir()+'CLOCK.CGI'; xhr = createXMLHttpRequest(); if (! xhr) {return;} to = window.setTimeout(function(){xhr.abort()}, 30000); xhr.onreadystatechange = function(){update_clock_callback(xhr,to)}; xhr.open('GET' , url+'?dummy='+(new Date)/1, true); xhr.send(null); }

つづく→

→つづき // 3.コールバック関数 function update_clock_callback(xhr,to) { var str, elm; if (xhr.readyState === 0) {alert('タイムアウトです。');} if (xhr.readyState !== 4) {return; } window.clearTimeout(to); if (xhr.status === 200) { str = xhr.responseText; elm = document.getElementById('clock'); elm.innerHTML = str; } else { alert('サーバーが不正な応答を返しました。'); } }

Page 31: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 実践③W3C原理主義

動作例―Ajax Clock(ボタンを押すたび時刻文字列だけ更新)

http://lab-sakura.richlab.org/AJAX/CLOCK.HTML

31

Page 32: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 戦歴

(1) 郵便番号から住所を検索 http://lab-sakura.richlab.org/ZIP2ADDR/public_html/

全国のたかが14万レコードなど、一瞬で探せる。

32

Page 33: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 戦歴

(2) ショッピングカート(組織の資金源) https://richlab.org/coterie/

商品・在庫データをテキストファイルで管理 Cookie等で 買い物カゴ実装 クレカ決済 (Web API)も対応 WordPressも、はてなブログも ショッピングサイト化可能 「恐怖! シェルショッカー 1号男」 → http://www.slideshare.net/tomoyukimatsura/1-php-con2014-40134119

33

Page 34: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 戦歴

(3) 鉄道運行状況表示プログラム http://metropiper.com

東京メトロのWeb APIから車両の現在位置を取得 何駅前まで列車が来ているかわかる

34

Page 35: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 戦歴

(3) 鉄道運行状況表示プログラムは、

東京メトロのコンテストに送り込んだ怪人 https://developer.tokyometroapp.jp/

オープンデータ活用コンテスト

2014年開催

35

Page 36: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 戦歴

コンテストは東京五輪を意識していた、

らしい。

2020年(=コンテストの6年後)

観光客の利便性向上のため、 スマホアプリまで広く募集。 受賞作品は、スマホアプリが 大半を占めた。 http://car.watch.impress.co.jp/docs/news/20150220_689397.html

36

Page 37: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 戦歴

審査員達よ・・・

その受賞作、2020年の

本番まで動くのか?

Android、iOSアプリって6年ももつのか?

37

Page 38: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

POSIX中心主義 ― 戦歴

我らが送り込んだ怪人(作品)は、

2020年に動くことを最優先に

作ったのだがな・・・・・・

38

Page 39: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

結論

低水準領域を学べ

39

Page 40: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

この男も言っているぞ

「人体を理解するとよい」と。

40

報道ステーション 2016.03.17スペシャル対談2016 イチロー×稲葉篤紀 より引用

Page 41: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

ウェイトトレーニング(シーズン前)で筋力増 ↓ 春先、打てない! ↓ シーズン中、トレーニングできず痩せる ↓

スイングスピード上がる

41

Page 42: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

この男も学習したぞ

「ハンマーの柄の方を振り回すと強い」

ことを。

42

映画「少林寺三十六房」より

Page 43: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

重いハンマーを振り回す。 ↓ 先端が重くて動きが鈍く、反撃される。 ↓ 僧侶に言われ、柄を相手に向けて振り回す。 ↓

撃退に成功

43

Page 44: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

POSIX中心主義では、

比較的低水準領域を学習する。

44

ハードウェア ハードウェア ハードウェア

カーネル

シェル 言語 言語

アプリ アプリ アプリ アプリ アプリ

POSIX中心主義と高級言語の学習範囲のイメージ

高級言語の学習領域

POSIXの学習領域

Page 45: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

同じこと。

頭でっかちは不利。

45

Page 46: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

道具を探し回るな!

使いこなせ!

46

Page 47: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

コンピューターの本質を

理解するのだ。

47

Page 48: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

POSIXシェルスクリプトは

本質に近い。

48

Page 49: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

「シェルスクリプトなんてクソだ!」

だと?

49

Page 50: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

お前は、シェルスクリプトや

UNIXを、

何も理解していない!!

50

Page 51: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

「シェルスクリプトは

OS依存が激しい」

だと?

51

Page 52: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

POSIXの仕様を読まずに

書くからだ!

52

Page 53: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

低水準領域を学べ

依存性回避のために

他言語やソフトを、OSや環境依存に苦しみながら、

コンパイル・インストール・バージョンアップしてたら、

意味がなかろうが!

53

Page 54: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

まとめ

54

Page 55: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

まとめ

基礎から学べ!

55

Page 56: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

まとめ

シェルスクリプトを使え!

56

Page 57: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

まとめ

POSIX原理主義の 聖典を買え! (宣伝)

57

本の形をした怪人 「すべてのUNIXで20年動くプログラムは どう書くべきか」 C&R研究所 発行 https://richlab.org/coterie/pfb.html

を、全国書店に送り込んだ!

Page 58: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

まとめ

ついでに、授業も受けろ (宣伝)

58

「シェルスクリプト言語論」 金沢大学@大学コンソーシアム石川で 2016年4月開講 (社会人も受講可)

組織の幹部を送り込む!

Page 59: 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト

今日はこれくらいに しといてやる!

59