More Related Content
Similar to 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト (20)
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
- 19. POSIX中心主義 ― 実践①POSIX原理主義
1. POSIXコマンドだけで実装
AWK、sed等はチューリング完全。
2. 言語はシェルスクリプト
POSIXにあるのがそれだから。
→ POSIXの範囲で、どんな計算も書ける。
19
POSIX公式情報サイト
http://pubs.opengroup.org/onlinepubs/9699919799/
- 20. 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
- 21. 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版
- 26. 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つの書式で書く。
- 30. 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('サーバーが不正な応答を返しました。');
}
}
- 32. POSIX中心主義 ― 戦歴
(1) 郵便番号から住所を検索
http://lab-sakura.richlab.org/ZIP2ADDR/public_html/
全国のたかが14万レコードなど、一瞬で探せる。
32
- 33. POSIX中心主義 ― 戦歴
(2) ショッピングカート(組織の資金源)
https://richlab.org/coterie/
商品・在庫データをテキストファイルで管理
Cookie等で
買い物カゴ実装
クレカ決済
(Web API)も対応
WordPressも、はてなブログも
ショッピングサイト化可能
「恐怖! シェルショッカー 1号男」
→ http://www.slideshare.net/tomoyukimatsura/1-php-con2014-40134119
33
- 34. POSIX中心主義 ― 戦歴
(3) 鉄道運行状況表示プログラム
http://metropiper.com
東京メトロのWeb APIから車両の現在位置を取得
何駅前まで列車が来ているかわかる
34
- 35. POSIX中心主義 ― 戦歴
(3) 鉄道運行状況表示プログラムは、
東京メトロのコンテストに送り込んだ怪人
https://developer.tokyometroapp.jp/
オープンデータ活用コンテスト
2014年開催
35