Upgrade to Pro — share decks privately, control downloads, hide ads and more …

POSIX中心主義と情報科学教育

 POSIX中心主義と情報科学教育

多数の言語、ライブラリー、ミドルウェア等に依存し、コード保守やサーバ保守で日々泣かされるソフトウェア業界の現状を打開すべく、広い互換性と長い寿命を持った「保存食」のようなプログラムを作る方法と教育の提案

Avatar for Rich Mikan

Rich Mikan

March 12, 2016
Tweet

Other Decks in Programming

Transcript

  1. (2) POSIX中心主義と 情報科学教育 USP研究所・金沢大学 共同研究活動報告資料 IoT時代に資するユニケージ開発手法の 普及啓発に関する研究 松浦智之† 大野浩之‡ 當仲寛哲†

    † ユニバーサル・シェル・プログラミング研究所 ‡ 金沢大学 総合メディア基盤センター 発表日:2016/03/11 スライド最終修正日: 2016/03/12
  2. POSIX中心主義 ― 概要  POSIXの高い互換性の要因  現在、多くのUNIX系OSが準拠している。  明示的準拠……商用UNIX、 Mac

    OS Xなど  暗示的準拠……FreeBSD、 LinuxなどのPC UNIX  OSベンダーにとって、準拠はメリット  OS間でソフトウェア資産が共有できる。  ユーザにUNIX系OSであると認知され、選択される理由になる。
  3. POSIX中心主義 ― 概要  POSIX中心主義を身に付ける際、 より低水準の領域を学ぶ。 ハードウェア ハードウェア ハードウェア カーネル

    シェル 言語 言語 アプリ アプリ アプリ アプリ アプリ POSIX中心主義と高級言語の学習範囲のイメージ 高級言語の学習領域 POSIXの学習領域
  4. POSIX中心主義 ― 方針  3つの具体的な方針 ① POSIX準拠 プログラミング ②交換可能性担保 プログラミング

    ③W3C勧告準拠 プログラミング 単独ホスト または Webサーバ Webクライアント
  5. POSIX中心主義 ― 方針 ①POSIX準拠  POSIXには、160個のコマンドがある。 (2013年改訂)  AWK, sed,

    grep, ……  AWKやsed等、チューリング完全なコマンドを 含む。 → POSIXの範囲で、どんな計算も書ける。
  6. POSIX中心主義 ― 方針 ①POSIX準拠  シェルスクリプトはOS依存が激しい?  それはPOSIXを意識せずに書いてしまうから。  OS依存性を避けるため、言語(ライブラリ含む)や

    ミドルウェア等を選んでも、OS依存に喘ぎながら インストール、メンテナンスしては本末転倒。  依存ソフトが激しく非互換ver. upするせいで、 バージョン依存を起こしてはさらに本末転倒。
  7. POSIX中心主義 ― 方針 ①POSIX準拠  例(1)―日付計算コマンド(utconv)  https://github.com/ShellShoccar-jpn/misc-tools/blob/master/utconv  日常時間←→UNIX時間

    相互変換  ほぼAWKで実装  dateコマンドは、OS依存が激しいため再発明 $ echo 2016031112000000 | utconv 6299836182000 $ echo 6299836182000 | utconv –r 2016031112000000 $
  8. POSIX中心主義 ― 方針 ①POSIX準拠  例(2)―XMLパーサ(parsrx.sh)  https://github.com/ShellShoccar-jpn/Parsrs/blob/master/parsrx.sh  XML→行列指向フォーマット(XPath

    - value)への変換  sed, AWK, tr等、26個のコマンドをパイプで連結し生成。  JSON, CSVパーサも同様に実装済。 <文具購入リスト 会員名="文具 太郎"> <購入品>はさみ</購入品> <購入品>ノート(A4,無地)</購入品> <購入品>シャープペンシル</購入品> <購入品><取寄商品>替え芯</取寄商品></購入品> <購入品>クリアファイル</購入品> <購入品><取寄商品>6穴パンチ</取寄商品></購入品> </文具購入リスト> /文具購入リスト/@会員名 文具 太郎 /文具購入リスト/購入品 はさみ /文具購入リスト/購入品 ノート(A4,無地) /文具購入リスト/購入品 シャープペンシル /文具購入リスト/購入品/取寄商品 替え芯 /文具購入リスト/購入品 /文具購入リスト/購入品 クリアファイル /文具購入リスト/購入品/取寄商品 6穴パンチ /文具購入リスト/購入品 /文具購入リスト ¥n ¥n ¥n ¥n ¥n ¥n ¥n
  9. POSIX中心主義 ― 方針 ①POSIX準拠  例(3)―RDBMS的操作  データは半角空白区切りのテキストファイル持ち  AWK,

    grep, sort, join等の組み合わせでselect文相当が実現 → SQL文(RDBMS)不要! 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版
  10. POSIX中心主義 ― 方針 ①POSIX準拠  例(4)―URLエンコーディング(urlencode/urldecode)  https://github.com/ShellShoccar-jpn/misc-tools/blob/master/urldecode  RFC文書が示す規格を学習し、コーディング(RFC3986

    sec.2.1)  コマンド内の大半はAWKで実装  Web系変換コマンドの大半は、同様に実装可能。 $ echo 情報A 授業 | urlencode %E6%83%85%E5%A0%B1A+%E6%8E%88%E6%A5%AD $ echo %E6%83%85%E5%A0%B1A+%E6%8E%88%E6%A5%AD | urldecode 情報A 授業 $
  11. POSIX中心主義 ― 方針 ①POSIX準拠  その他―POSIXのコマンドで不十分なもの  非Web系  乱数、

    mktemp相当、 全角・半角文字相互変換、 排他制御……  Web系  Cookie、 セッション管理、 MIMEマルチパート作成・解読、 Base64、 CGI変数授受…… Webアプリ開発に必要なものまで、概ね作れる。
  12. POSIX中心主義 ― 方針 ②交換可能性担保  一定条件とは、「交換可能性」の担保  交換可能性とは?  「現在利用中の実装が、使えなくなっても、同等機

    能を有する別の実装に交換できる性質」と定義  (例)  Apache ←→ nginx ←→ lighttpd 等  sendmail ←→ Postfix ←→ qmail ←→ exim 等  cURL ←→ Wget  OpenSSL ←→ LibreSSL  そもそもPOSIX準拠OS同士には交換可能性がある。
  13. POSIX中心主義 ― 方針 ②交換可能性担保  交換可能性担保における注意点  その実装固有の機能に依存してはならない。  (例)

     「Apache ←→ nginx ←→ lighttpd」における、 Apacheのプロクシ機能  「cURL ←→ Wget」における、 cURLのファイルアップロード機能 依存した瞬間から、他実装へ交換できなくなる。
  14. POSIX中心主義 ― 方針 ②交換可能性担保  担保したコードの実例(Twitterクライアント) https://github.com/ShellShoccar-jpn/kotoriotoko/blob/master/BIN/twmediup.sh : : #

    --- 2.HTTPアクセスコマンド(wgetまたはcurl) if type curl >/dev/null 2>&1; then CMD_CURL='curl' elif type wget >/dev/null 2>&1; then CMD_WGET='wget' else error_exit 1 'No HTTP-GET/POST command found.' fi : : curlまたはwgetコマンド 両方の存在を確認。 どちらかがあれば、続行 するようにしている。 Web APIアクセスコマンド 存在確認ルーチン
  15. POSIX中心主義 ― 方針 ②交換可能性担保  担保したコードの実例(続き:Twitterクライアント) : 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側でも使わない。 →独自に実装 (mime-makeコマンド) wgetコマンド用、curlコマン ド用に分岐させ、2つの書式を 用意する。 ファイルアップロードルーチン
  16. POSIX中心主義 ― 方針 ②交換可能性担保  その他―POSIXではできなかったこと  日本語メール送信……sendjpmail (sendmailコマンドラッパー) 

    添付ファイルにも対応  https://github.com/ShellShoccar-jpn/misc-tools/blob/master/sendjpmail  PDF作成 なども…
  17. POSIX中心主義 ― 方針 ③W3C勧告準拠  Ajax処理も、40行足らずでフルスクラッチできる。  (例)https://github.com/ShellShoccar-jpn/Ajax_demo/blob/master/CLOCK.JS // 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('サーバーが不正な応答を返しました。'); } }
  18. POSIX中心主義 ― 作成例  (3) 鉄道運行状況表示プログラム  http://metropiper.com  東京メトロのWeb

    APIから車両の現在位置を取得  何駅前まで列車が来ているかわかる
  19. 考察 ― POSIX中心主義の妥当性  互換性のためのI/F標準化の試 みは、POSIX以外にもいくつか あった。  SSI, MOSI,

    X/OPEN, OSF など  参考文献  「UNIXの標準化とPOSIX」,斎藤 信男,コンピュータソフトウェア 6(1), 84-92, 1989-01-13  「OSインターフェース標準化の動向」,越田 一郎,情報処理学会研究報告シ ステムソフトウェアとオペレーティング・システム 37, 1-6, 1987-06-12
  20. 考察 ― POSIX中心主義の評価 ①開発  実際、既に動かない作品が出 てきている。  https://developer.tokyometroapp.jp/app 

    ただし、コンテスト終了に伴い、意図的に公開終了 した可能性のある作品も含まれ、すべてではない。
  21. 考察 ― POSIX中心主義の評価 ①開発  POSIX中心主義の本作品は、 今も順調に動作中。  http://metropiper.com/ 

    これまで内容の改修は一切なし。 スマートフォン用レイアウトで動作している様子⇒ (POSIX+W3C勧告のCSSとJavaScriptで実装)
  22. 質疑応答の記録 Q. 開講する授業デザインをどのように考えているか。あれ ば公開してくれるとありがたい。  発表者(松浦)自身は、開発現場(産学連携の産)の 立場から参加しているため教育の詳しい知識を持 ち合わせていない。  学の立場である、金沢大の先生方の協力のもと考

    えていきたい。  ただ、フルスクラッチ開発時、RFC文書の読み解き 作業は低水準領域の学習に大変効果的だと実感し たこともあり、現場から得たそういうノウハウは 盛り込んでいきたい。
  23. 独自の質疑応答想定 Q. 例示した地下鉄アプリは今まで改修無しだが、東京メトロ がAPI仕様や路線仕様を修正したら改修が必要なので、持 続可能性確保の試みは無駄では?  東京メトロ自身が、自社の公式アプリを作るとい う想定で考えてもらいたい。  自社都合による仕様変更のタイミングは自社でコ

    ントロールできる。  しかし、東京メトロのような大きな企業とて、依存 ソフト開発団体(PHP GroupやMySQLのOracleな ど)に「バージョンアップを待って」とは言えない。  依存ソフトのバージョンはアンコントローラブル
  24. 独自の質疑応答想定 Q. 例示されたXMLパーサなど、公開しているということは利 用(=依存)を促すことであり、矛盾ではないか?  利用する場合、中身を理解しながら使うことが大 事(ブラックボックスなままの使用が不幸を招く)  依存ソフトに不具合があったとしても自分の力で 対処できるよう、次の2つの心掛けが大事

    1. どういう原理で動いているか、また動作の癖を理解 し、自分の手足のような感覚を得る。 2. 使いだしたら自分の製作物のごとく責任を持つ。  上記理由により、私が公開しているソフトは基 本的に権利放棄(public domain)している。