
51.GoogleAPIでステータスコードが200以外だったら処理を終了する
ナックス「もうすぐクリスマス!」
デビー君「そうだね。今年はどんなプレゼントをもらえるかなー」
デビー君「そういえばサンタクロースってなんで赤い服を着てるんだろうね?空を飛んでるときに目立って人間に見つかってしまいそうだけど……」
ナックス「ん?何を言っているんですか、デビー君。サンタクロースは白い服を着ていますよ?」
デビー君「え?」
ナックス「白い服を着ることで、うまく雪にまぎれて人に見つからないように空を飛ぶことが出来るのです」
デビー君「えー?良く、漫画とかテレビとかに出てくるサンタクロースの服は赤色じゃなかったっけ?」
ナックス「あれ?デビー君、もしかして知らないんですか?」
デビー君「え?何を?」
ナックス「えーっと……。あんなに有名なサンタクロースの実物を誰も見たことが無い、っていうのはおかしいと思いませんか?」
デビー君「え?いや、まあそれは……」
ナックス「更にはサンタクロースからの好意をわざわざ断って親が自分のお金で子供にプレゼントすることもあるって不思議だと思いませんか?」
デビー君「え!?両親がサンタクロースの正体じゃなくて、サンタクロースを断ってるの!?」
ナックス「最近ではデビー君みたいにサンタクロースの存在を嘘だと思ったまま親になって、子供にサンタの代わりにプレゼントを渡す人もいる始末」
デビー君「確かにサンタさんが本当にいるなら、誰もサンタさんを捕まえたことが無い、っていうのはおかしいな……」
ナックス「サンタさんは、行きは白い服を着ているのですが、帰る頃には服は赤くなっています」
デビー君「……?」
ナックス「あれは返り血です」
デビー君「!!?」
ナックス「だから、サンタクロースの正体を調べようとしたり捕まえようとしたりするな、っていうのは常識なんですけどね。一晩で世界中を飛び回る怪物相手にして、生きて帰れると思うなんてバカですよね……」
デビー君「…………」
ナックス「はい!テンションも上がってきた所で今回はステータスコードが200以外だったら処理を終了するコードを書きます!」
デビー君「えぇっ!?このテンションから解説始まるの!?」
ナックス「まあでも、200コードかどうかをキャッチするなんて、正直、今までの知識で結構行けそうですね」
デビー君「うん。ステータスコードを手に入れるのは簡単そうだよね。要はアドレスを取得した時と同じ考え方でしょ?」
ナックス「そうです。では、やってみたまえ、デビー君」
デビー君「えーっと、47.シェルスクリプトに引数をプレゼントを参考に、検索キーワードで検索して戻ってきたデータを整理するところまで」
curl -e http://www.my-ajax-site.com \ http://ajax.googleapis.com/ajax/services/search/images?q\=${keyword}\&v\=1.0\&hl\=ja\&rsz\=large\&start\=0\&safe\=off \ | tr , \\n
デビー君「をまず書いて、と」
デビー君「次に、ステータスコードが書かれている行を抜き出せばいいんだな」
デビー君「45.Google画像検索API。返ってきた結果を解読しよう。の返ってきたデータの例を見ると、ステータスコードの行は」
"responseStatus": 200
デビー君「ってなっているからresponseStatusをまずgrepで取り出して……」
デビー君「ん?まてよ?そもそも今回はステータスコードが200かどうかなんだから、単純に」
grep 200
デビー君「をパイプでつなげて、もしこれで200と書かれた行が見つからなかったらステータスコードはエラーが返ってる、という判断でいいんじゃないかな?」
ナックス「おぉ。なかなか面白いアイデアですね。というか、普通にデビー君が成長していて、ちょっと感動しております」
デビー君「へっへっへ。まあね。これくらいは──」
ナックス「でも、それはダメです」
デビー君「えー?なんでさ」
ナックス「grepは、その文字が書かれた行を抜き出すものでした。たとえばもし、タイトルに"200"という文字が使われている画像があったら?」
デビー君「あー。なるほど」
ナックス「ほかにも、画像のアドレスに200という文字が使われる可能性も無きにしもあらず」
デビー君「そうなんだ……」
ナックス「いえ、でも落ち込む必要はありません。確かに、アイデアはバグが潜む可能性のあるものでしたが、自力で考えたからこそバグが潜む可能性が生まれるのです。教科書どおりに作って何も自分で考えずに作れば、バグがある可能性は無いですが、その人の成長もまた、無いでしょう。というわけで、本当に私は感動しておりますよ」
デビー君「どうもどうも」
デビー君「じゃあ、grepでresponseStatusを抜き出して……」
ナックス「あ。待ってください。確かに画像のアドレスが含まれた行を抜き出すときは"url"というキーワードで抜き出しましたが、それはアドレスが画像ごとに違うためでした」
ナックス「でも、今回調べるデータはステータスコードの一つだけです。なので、今回はgrepでそのまま」
grep "responseStatus": 200
ナックス「としてしまいましょう」
デビー君「はーい」
デビー君「ん?そういえば可能性は限りなく低そうだけど、画像のタイトルとかに"responseStatus": 200っていう文字が使われる可能性は無いの?」
ナックス「…………」
デビー君「…………」
ナックス「バグの無いプログラムなんて、サンタさんがいないクリスマス・イヴみたいなものさ」
デビー君「いやいや。意味が分からない上に、さっきの話を聞いた後では、サンタさんがいるクリスマスも考え物だけど」
ナックス「正直、これもバグが含まれてる可能性はあります」
デビー君「あるんだ」
ナックス「一応、何行目のデータか、っていうのを取得すれば回避できますね」
デビー君「おお!なるほど!!」
ナックス「でも、行での取得は、もしGoogleのAPIが返してくるデータの形式が変わったら、途端に使えなくなるよね」
デビー君「そうなんだ……」
ナックス「まぁ。別に公開して金を取るためのプログラムじゃなくて、プライベートで使うプログラムだから、バグのひとつや二つ、気にするな!」
デビー君「そんなんでいいんだ」
デビー君「えーっと、これをさっきのと合わせてパイプでつなげて」
curl -e http://www.my-ajax-site.com \ http://ajax.googleapis.com/ajax/services/search/images?q\=${keyword}\&v\=1.0\&hl\=ja\&rsz\=large\&start\=0\&safe\=off \ | tr , \\n | grep "responseStatus": 200
デビー君「とまぁ、ここまで作ってみましたが」
ナックス「上出来ですね。えーっとじゃあ、こいつの結果を変数に入れよう。変数名はStatusOKで」
デビー君「えーっとStatusOKという変数に」
StatusOK
デビー君「さっきの結果を入れる、と」
StatusOK=`curl -e http://www.my-ajax-site.com http://ajax.googleapis.com/ajax/services/search/images?q\=${keyword}\&v\=1.0\&hl\=ja\&rsz\=large\&start\=0\&safe\=off | tr , \\n | grep "responseStatus": 200`
デビー君「横に長いなぁ」
ナックス「で!これでもしStatusOKになにかデータが入っていたら、ステータスコードは200だった。逆に空なら200以外だったということに!」
デビー君「なるほど!」
デビー君「えーっと空か空じゃないかは」
if [ -z StatusOK ] then fi
デビー君「こんな感じで調べるんだよね」
ナックス「そうです。でもって、空だったときは中断……つまり、終わればいいんです」
if [ -z StatusOK ] then exit fi
ナックス「こんな感じのをコードの最初の方に書けば良いのですね」
ナックス「実際にコードに書いた実例は、最後にプログラムを完成させる際に書きたいと思います」
デビー君「はーい」
ナックス「あと、ここでこっそり言っておきますが画像の検索結果数が20個で、5ページ目とか6ページ目とかのデータを取りに言ってもステータスコードは200なままな気がします」
デビー君「え?そうなの?」
ナックス「そうですね。多分、検索結果が0なのでurlとかの行は含まれませんが、サーバー側のエラー(APIを返すコンピュータに問題が発生した)では無いので200が返ってくるかと」
デビー君「じゃあ、今回やったことは無駄?」
ナックス「いえ。API側に問題が発生していたときは200以外が返ってくるのは事実なので、無駄では無いです」
ナックス「というわけで、次回くらいから完成版を作成していきましょう(52.Google APIを使用した画像の取得シェルスクリプト完成版)」