( H ム P す第員 .3 とりあえず、 Web の正体を見てみるかにや こう質問してきた。 鉄ニャンはひとしきり考えると、 「それに答えるためには、先にハッキリさせておかなければならないにや。どん なプログラマになりたいにや ? ハードにもっとも近いところを作る組込系 ? たと えば、エレベーターのプログラム書くような人にや。個別のハードに対する深い 理解と、コンパクトかっ安定的にプログラムを設計できる職人気質な人にや。そ れとも業務系なのかにや ? これは業務効率化のためにシステムを作る人だにや。 広範囲の分野の技術と業務知識と相手から要望を吸い出すコミュニケーション スキルと忍耐力の必要な人だにや。それから Web 系だにや。これは Web サー ビスを提供する人にや。金の流れとサービスに対する発想力、それを高可用性 を維持しながら提供するためにたゆまぬ努力を求められる人だにや」 ・・あんまり考えたことなかったけれど仕事として考えている訳じゃな 「ん一 ・・とりあえず色んな人に楽しんでもらいたいから Web が良いのか いからな・・ 「じゃあ、とりあえずがどういうものか ? 』は大体分かっているみたい なので『 web がどう動いているのか』について説明するにや。説明するって 言っておいて、いきなり質問ってのもアレだけどにや、 Web ってなんだと思 うにや ? 」 「 Web って・・・・・・インターネットのことじゃないの ? ほら、ググるとなんか出て きて、ェロゲのメーカーのページに行ったり、あられもない姿の女性の画像と か猫画像とか見れるヤツ」 「まあ、間違ってないけどにや・・・・・・しかし、工ロばっかだにや。とりあえず、 Web の正体を見てみるかにや」 鉄ニャンはキーボードに向かうと curl コマンドを打ち始めた。 cu 「 [ -i http://www.dezapatan.com すると、コンソールに文字がいつばいに表示された。 HTTP/I.1 200 OK
fclose($socket); function buildRequest($conn) { $request = new\stdClass(); $requestCommand = t 「 im(fgets($conn)); list ($request → method, $ 「 equest → path. $ 「 equest → ve 「 sion) = explode(). $ 「 equestCommand); while (($char = fgetc($conn)) ! = = false) { $line . = $cha 「 ; fo 「 each (explode("\n". $line) as $heade 「 ) { $label = strtouppe 「 (strt 「 ($tmp[l]. ・ $ 「 equest → $label = t 「 im($tmp[2]); if (isset($ 「 equest → CONTENT_LENGTH)) { $ 「 equest → body = f 「 ead($conn, intval($ 「 equst- >CONTENT_LENGTH)); b 「 eak; 「 etu 「 n $ 「 equest; 「これ、パイプの部分が良く分からないけど、なんとなく拡張子が " php " なら プログラムを起動するっていうところが、主な変更点だよね ? 」 「その通りだにや。パイプについては、 Linux の仕組の基本だから、そのうち こでは「プログラムとプログラムの間を通信する仕組」 説明するにや。一旦、 2 7
( H ム p す第 .6 でも、車輪のことを一番よく知ってるのは 車輪を作ったことがあるヤツだにや こんなセキュリティ無視、性能無視の 「旦那さまは、救い難いアホだにや・・ こんなテストし辛いタイプ プログラムを、どうやって最強にするんだにや・・ の低レベル層のプログラムは、世の中に既に有るものを使うべきにや。あとの 人が同じようなプログラムを作らなくて済むように接続し易いインターフェー スを作って楽をさせる。それに感謝して自分のプログラムも接続し易いイン ターフェースを作る。それを組み合わせて無限の価値を作る。これがプログラ マと UNIX と OSS の関係だにや。 OSS はオープンソースソフトウェアだにや。 お寿司じゃないにや。お寿司食べたいにや」 「なるほど・・・・・・つて、じゃあ、この折角書いた Web サーバーは ? 捨てるの ? じゃ あ、なんのために書いたの ? 」 「なんのためって ? そりや、それ書かないと Web サーバーがなんなのか、 CGI がなんなのか分からなかったにや ? 車輪の再開発は一般に悪って言われてる にや。でも、車輪のことを一番よく知ってるのは車輪を作ったことがあるヤツ だにや。たった、これだけのことだけど、知ってるのと知らないのとはでは web 屋としての質に関わってくるにや。 Web サーバーはデータを返している だけ。プラウザはそれを見易く表示しているだけ。これの連携で Web が出来 ている。逆にこれだけのことしかやっていないって分かってれば、それ以上の 期待をしちやダメなの分かるにや。そんじゃ OSS の Web サーバーを入れて設 定するにや」 sudO apt-get install nginx sud0 apt-get install php5-fpm sudO echO "serve 「 { listen 80 ; 「 00t /va 「 /www/html/webapp; index index. html index. htm; se 「 ve 「 _name test. 0 「 g; location / { 3 0
( H ム P す第員 .5 え ? bot ってプログラムでしよ ? プログラムカヾ猫耳ショタ ? えっ ? どういうメカニズム ? 翌朝、起きると鉄ニャンは起きる気配がない。マイクロビキニはいい感じに はだけてしまっているが、まるで少年漫画のお色気シーンよろしく、危っかし い箇所が上手いこと隠れている。ふと、見てみると鉄ニャンの脇には冷蔵庫に 買い置きしてあった日本酒の一升瓶が空になって転がっていた。まあ、昨日の ・・しかし、一升瓶一本って 授業料ってことで良いことにしておいてやるか・ こいっとんでもない大酒飲みなんじゃ ? 気を取り直して大学に向かう。そのまま食える食いものも冷蔵庫には入って るし、まあ半日くらい、どうにかなるだろ。講義に興味が無かった訳ではない のだが、話が頭に入ってこない。昨日、自分で作ってみたプログラムを思い返 してみる。あのプログラムが動くことで世界中にコンテンツを届けることが出 来る。それを考えるだけで、いてもたってもいられないのだ。早くあのプログ ラムを弄って、もっと色んなことを出来るようにしたい、そんなことばかり考 えているうちに全ての講義が終わってしまった。急いで家路につく。早く昨日 のプログラムの続きを書きたい、そんなことを考えて足早に歩いていると、咋 日、鉄ニャンと出会った橋に辿り着いた。 狐につままれた気分になる。相手は猫だけど。ただ、ひとつ言えるのは僕の 中で「何かが変わった」ということだ。橋の上から見る川の光を、肌に叩きっ けてくる風を、いつもよりほんの少しだけ好意的に受け止めることが出来てい る気がしていた。あの猫耳の変な生き物に少しだけ感謝していた。玄関のドア を開ける。すると、玄関で白い猫耳のついた少年が三つ指をついて待っていた。 「お帰りなさいませにやー」 あまりの出来ごとに言葉を繋げられないでいると、奥から魚肉ソーセージを 齧りながらパソコンに向かってる鉄ニャンが紹介した。 「あ、旦那さまお帰りにや。それ ? きゅうぼった。元々は Twitter の bot だっ たんだけど今は止めてるし、ちょっと、このパソコン借りて、呼び出しておい たにや。よろしくにや」 2 4
「え ? bot ってプログラムでしょ ? プログラムが猫耳ショタ ? えっ ? どういう メカニズム ? 」 説明を受けたら、より一層混乱をしていると部屋の隅に、派手で悪趣味な格 好をした猫耳が座って芋焼酎を飲んでいた。 「いちいち、うるせえなー。 bot が猫耳ショタになるくらい、よく有ることだろ。 そんなことイチイチ気にしてるんじゃねえよ」「え ? 二人目、プログラムって 猫耳ショタになるものなの ? えっ ? どういうメカニズム ? 」 「そっちは、おだいった。そっちは元々はモバファクがやっていた wassr って いうサービスで、大喜利のお題を出すための bot だったんだけど。今は止まっ ているし、このパソコン借りて呼び出しておいたにや。よろしくにや。ところ で、昨日の Web サーバーの続きなんだけど。 CGI が動くようにしてみたにや」 $ 「 equest = buildRequest($conn); $buffers = while ($conn = stream socket_accept($socket)) { } else { ech0 "$errstr ( $ e 「「 no ) く b 「 / > \ n " ・ if (!$socket) { $er 「 str); $socket = st 「 eam_socket se 「 ve 「 ( " tcp : / / 0.0.0.0 : 8080 " く ?php php $content = null; $path = >path); 引 R 2 5 if (p 「 eg-match( ・ #\. php# ・ . $path)) { if ($request → method = = ・ GET ・ & & is_file($path)) { putenv( ・ QUERY_STRING=• . $que 「 Y[1ル 〃ファイル名の " ? " よりあとがクエリストリングだよ $ 「 equest-
## 今回は ubuntu を使うにや config. vm. box = "ubuntu/t 「 usty64" config. vm. netwo 「 k ・ p 「 ivate—netwo 「 k", ip: " 192.168.33.10 " . "/va 「 /www/html/webapp" config. vm. synced f01de 「 " end 「 Ubuntu って聞いたことある。 Linux だよね ? 」 「そうにや。 Ubuntu は Linux のディストリビューションのひとつにや。 Ubuntu にしたのは単に好みだにや。シンプルで扱い易いから気に入ってる にや。 "vagrant up" で起動したら "vagrant ssh" で中に入るにや」 「あ、本当に Linux の中みたいだ。これどうなってるの ? 魔法みたいなんだけ 「さっきも説明したけど、元々 VirtualBox という仮想 OS を扱う仕組みがある にや。それを Ruby のツールでラップしたのが Vagrant にや。予めインストー ル済みの OS の box をインターネット経由でダウンロードしてきて、ネット ワークの設定とか共有ディレクトリの設定とかを自動的にやってくれるにや。 この VagrantFile と紐付けて個別に管理してくれるから、複数の開発環境を取 り扱う時に事故り難いのも特徴にや。本領を発揮するのは複数人で開発する 時だけど、その辺は端折るにや。さて、 PHP でも遊ぶかにや。『 sudo apt-get install php5-cli 』」 「ん ? PHP ってプログラミング言語だよね ? ちょっとだけ触ったことあるよ。 プログラムするの ? 」 「なにが『プログラムするの ? 』にや ? ぼくは、何を隠そう天才猫耳プログラ マ『鉄ニャン』だにや ! ! プログラムのことならなんでも聞けにや ! ! 」 「うわっ、自分で自分のことを天才とか言っちゃうイタい子だ ! ! ただでさえ、 イタい格好した工ロ猫なのに ! ! 」 「旦那様は、失礼なャツだにや。あとで、ぼくの実力を思い知って吠え面をか くことになるにや」 「ごめんごめん。前に PHP の入門書みたいなのを読んで少し書いてみたんだけ ど、全然ピンとこなくて結局やめちゃったんだよね。文法くらいなら分かるけ ど、結局、これで何が出来るのか分からないんだよね・・・・・・ちゃんと使えるよう になるためにはどうしたら良いのかな ? 」
0N7 凹 D 5 # CGI 「そういえば、 Web サーバー作っている時に拡張子が php だったら PHP を起動するのを作る時に、 CGI がどうのって言っていたけど、ど ういう意味なの ? 」 「 CGI は Common Gateway lnterface の略にや。あそこではややこしい ことしたくなかったから拡張子 php の時に、 PHP を決め打ちで起動し ていたけど、本来は CGI という Web サーバーから外部のプログラムに データを渡しながら起動するための規格があるにや。って言っても環境 変数と標準入力を使ってデータを渡して、標準出力をそのままクライア ントへ返してやることが決まってるだけにや。たとえばにや」 # !/bin/sh echo "HTTP/I.1 200 OK\r\n" ech0 "Content-Length:2\r\n" echo "Content-Type: text/html\ 「 \n" echo "\r\n" echo "OK" 「こういうシェルスクリプトを " index. cgi " という名前で置いて、パー ションを chmod で 755 にしておくにや。」 「ふむふむ」 「そうしたら試しに . /index. cgi とシェルに打つにや。」 「うん、想像通りリクエストヘッダとリクエストボディが出たね。 この このプログラムで実行してね " って意味 1 行目の # ! から始まるのが、 だったよね ? 」 「そうにや、具体的にはソースコードの 1 7 行目の拡張子で制限してい るところを直して、 25 行目の php を直接起動しているところを $path で動くようにすれば良いにや。これでサーバーにアクセスすると OK っ て出るにや。まあ、要するに本当は言語とかどうでも良くて、シェルで 実行出来るものなら、シェルで実行した結果をそのままクライアントへ 返せるということにや。詳しいことは RFC3875 を読むにや」 ツ 3 3
「で、これを simple. php として保存して、それじゃ、これを "php simple. php" で起動してプラウザで " http : 〃 192.168.33.10 : 8080 / " にアクセスしてみるにや。 もし、ちゃんと動かないようなら、 " php-lsimp . php " とするとタイプミス とかは教えてくれるにや」 「おお、プラウザに " にやーん " って出た。ん、これ、世界中がアクセスでき る場所に置いたら、世界中に " にやーん " を返せるってことか ? 」 「そうにや」 「 fwrite って、アレだよね ? print みたいなもので、ファイルに書き込むんだっ け ? でも、こで返す先って通信相手のプラウザじゃないのか ? 」 「そうにや。 UN Ⅸの世界ではなんでもファイルとして見做そうとしている にや。つまり、ソケット ( 通信 ) もファイルにや」 「ふーん、分かるような分からないような。あれ ? このプログラム、リクエス トヘッダとして送ってきてるはずの、 GET とか POST とか一切出てこないぞ ? その辺は読まないのか ? 」 「良いところ気付いたにや。それじゃ、 GET の時だけファイルを返せるように $ 「 equest = buildRequest($conn); 〃リクエストの内容を解析する $buffe 「 s = while ($conn = stream_socket accept($socket)) { 〃リクエスト来るまで待ち } else { echo "$errstr ( $ e 「「 no ) く b 「 / > \ n " if (!$socket) { $socket = stream_socket_se 「 ve 「 ("tcp://0.0.0.0:8080" 〃サーパー待ち受けでソケットオープン く ?php php してみるかにや ? 」 $content= null; $path = 引 R $ 「 equest-
# ある日の夢の話 ンプ先をセットにしたデータ構造を定義して処理するように変更してい によく分からなくなっちゃうから、テキストと選択肢と選んだ先のジャ 入れ子にさせるだけでも実現できるんだけど、それだと、後で読んだ時 お話が分岐するだけの仕組だよ。べタ書きでテキストを書いて if 文を 示させたりするんじゃなくて、単にテキストを読んで選択肢を選んで、 「アドベンチャーゲームだよ。って言っても音を鳴らしたり、画像を表 はあまりよく分からなかったけど、なんとなく読破してしまった。 あの本は語り口調や、文章の端々に現れる考え方が面白かったので内容 こ。昔、父の部屋で見掛けたラクダの表紙の本の中で見たことがある。 僕はディスプレイを覗き込んだ。どうやら perl のスクリプトのよう で、何を作っているの ? 」 る。パズルみたいで楽しいぞ」 考えて、それを修正して、またコンピュータとコミュニケーションをす コード起こして、上手く伝わらなかったら、なぜ伝わらなかったのかを 「楽しいぞ。自分の考えた設計をコンピュータに教え込むためにソース 「兄ちゃん、プログラムって楽しいの ? 」 強がてら楽しそうにソースコードを書いていた。 屋を訪ねた時のことである。兄は国内のげ企業への就職をひかえて勉 後、自室で漫画を読んでいたのだが、それにも飽きてしまって、兄の部 だった。身体の底から温めてくれるホワイトシチューでタ飯を済ませた 冷え込んでいて、空気が音を立てて凍てつくのが目に見えそうなほど 何年か前の冬の夜のことだった。その日は雪でも降りそうなくらいに 僕は大学での講義中、今朝方見た夢を思い出していた。 るところだよ」 「なになに、タイトルは『ピンと緊張したケモ尻尾は恋の証』・ いうゲームなのそれ ? まあ、完成したら僕にもプレイさせてよ」 ・どう 結局、そのゲームが完成したのか、しなかったのか・ ・・僕には分から ない。いずれにせよ、そのゲームをプレイすることはないまま、兄は死 んでしまった。
0N7 に凹 D # はじめに 井 # ご挨拶 7 スムーズになると思います。 はお好みのターミナルソフトとテキストエデイタを入れておくと導入が の方が躓きポイントが少ないかも知れません。 Windows ユーザーの方 Windows を使っていますが、同じことをするのであれば Linux か Mac 作中ではお話の都合上工ロゲをプレイできないとダメなので、 # # 環境について いということです。 知らずに、今自分の目の前にある木についてだけ深く知っても意味が無 るという考え方ですね。言い変えれば、森の中を歩き回るのに、周りを 現するのであれば周辺環境とそのシステム境界を理解しておくべきであ つまり、通常 PHP で実現する範囲である「 web プログラミング」を実 実現するのであれば 120% を理解している必要がある」ということです。 定しています。本シリーズの哲学としては「やりたいことの 100% を 今ひとっプログラミングできている気がしない」というくらいの人を想 ないところを調べつつ読むくらいは出来るかも知れないけど、なんだか シリーズを読んで理解しているし、既存のソースもググりながら分から 本シリーズの対象読者としては「 HTM L と PH P の文法は 1 0 日で学ぶ 学生の「オレ君」に Web プログラミングを教えるお話となっております。 今回は、美少女猫耳天才プログラマの「鉄ニャン」が冴えない男子大 ちは。お久しぶりです。サークル「いしだけ」です。 はじめましての方ははじめまして、はじめましてじゃない方はこんに