イラク日報全文検索サービスを3時間で開発し、Yahoo! ニュースに載るまでの日報
はじめまして、 @alea12 です。普段は株式会社ポップインサイトでサービス開発を担当しています。先日、防衛省が公開した陸上自衛隊イラク派遣部隊の日報を全文検索できるサービス、「イラク日報村」を公開しました。
単に 日報の全文が検索できるだけのシンプルなサービスです。しかし、日報そのものの話題性と、日報の公開からリリースまでを約 1 日で実現出来たことにより多くの反響を頂き、Yahoo!ニュースをはじめ多数のメディアで取り上げて頂きました。
サービスのリリース以降、「どのように短期間で開発を行ったのか」「OCR 化はどのように行ったのか」「アクセスはどの程度あったのか」「仕事をサボっていたのでは」など多くのご意見を頂戴しました。この記事では、サービス開発の経緯を「日報」形式でご紹介出来ればと思います。
きっかけ (4/16 25:40頃)
イラク日報村でも触れていますが、きっかけは @dragoner_JP さんが日報のデータを .zip にまとめ、それを Twitter で公開されていたことでした。
そもそも日報自体が公開されたのが 16 日の夕方で、深夜にかけて私のタイムラインでは日報の内容が話題になりつつありました。しかし、日報は OCR 処理が施されておらず、検索性が低いという問題がありました。
自分も日報を読み耽り、ある自衛隊員が徐々にモンゴルの陸軍大佐と親交を深めていくやり取り等は非常に興味深く読んでいました。そして、つい PDF ファイルの中で特定のキーワードで検索するべく [ ⌘ + F ] を押して思い出すのでした、これは OCR されていない文書なのだと…。
OCR 処理の実施 (4/16 26:00)
そこで、当初は自分で使って楽しむつもりで OCR 処理を企てました。ちょうど業務で Google Cloud Vision を使ったサービスの開発を検討していたこともあり、同サービスの API ドキュメントを調べることに。すると、β版ではあるものの PDF の OCR 処理に対応しているとのこと!
ネットで見つけた興味深い資料の OCR 化と、Google が出しているβ版のサービスの利用とを同時に行えるなんてまさに一石二鳥と考え、早速 PDF を Google Cloud Storage にアップロードし、 API を使って OCR 処理を行うコードを node.js で書きました。この時は、これをサービスとして公開することになるとは考えてもいませんでした。
OCR 化の結果確認 (4/17 AM)
API を活用できるとはいえ 10,000 ページ近い PDF の OCR 処理には時間がかかります。そのうち終わるだろうと思って夜は休んだ所、翌日の午前には OCR 化が完了していました。寝ている間に Google のサーバが OCR 処理を終えてくれたのです。
OCR 結果の後処理 (4/17 18:00)
日中はいつもどおり通常業務を行い、作業を再開したのは 18:00 頃。まずは OCR 処理の結果を利用しやすい形で DB に投入する作業を行いました。Google が返してくる OCR 結果はあまりにもリッチで、 PDF 上のテキストの座標データなんかも含まれています。今回必要だったのは文字情報のみだったので、必要な情報のみを抽出し DB に突っ込む処理を Ruby で書きました。
全文検索の実装 (4/17 18:30)
ここまで来れば後は簡単。DB に対して検索を実行するような UI を組めば OK です。業務でも似たような処理を書いた経験があったので、その際のコードを参考にしつつ実装を進めます。また、このタイミングで進捗を Twitter で共有したところ、予想外に大きな反響がありました。
特定のキーワードで検索している様子を GIF として投稿しただけなのですが、予想外なことに多くの方から反応を頂きました。自分だけが楽しむつもりで開発していたのですが、これを契機に公開サービスとして開発を進めることにしました。
インフラの検討 (4/17 18:45)
公開サービスとしてリリースするからには「誰よりも速くリリースしたい!」と考え、最も手慣れている Ruby on Rails を選択しました。デプロイ環境としては、個人サービスの公開用として利用経験が多い Heroku を選択しました。独自ドメインは悩んだのですが、収益性が不透明なサービスに対する出費は抑えたく、Heroku のデフォルトの URL を使うことにしました。
UI の調整 (4/17 19:00)
この間にも Twitter では多くの反応を頂いていたので、実用に耐えうる最低限のクオリティでリリースするべく UI の調整を進めました。
当初はインクリメンタルサーチと呼ばれる、文字を入力するたびに(検索ボタンを押さなくても)次々と検索結果の表示が切り替わる UI を検討していました。しかしこの UI は DB に対する負荷が大きく、検索ボタンを押下することによりページ遷移を行い、遷移先で検索結果を表示する形に切り替えました。
夕食 (4/17 19:30)
夕食はつけ麺を食べました。
リリース (4/17 20:30)
満を持して 20:30 にサービスをリリース。悩みに悩んだ結果、公開直前に Google Adsense を導入しました。あまり大規模に Adsense を運用した経験がなく、また Adsense が 3 月にリリースした「自動広告」を試してみたかったというのもあります。
初期反応 (4/17 22:00)
リリース後は作業場所から帰宅したのですが、その間もスマホで Google Analytics はチェックしており、アクセスの多さにただただ驚いていました。リリースから 1 時間半を過ぎた 22:00 頃に同時アクセス数は 100 を超え、この時点で 2,000 PV を達成していました。
著名人からの反応 (4/17 24:00)
この頃、楠さんや小飼弾さんといった界隈の著名な方々にもリアクションを頂き始めました。楠さんなんて某セミナーで登壇されているところを指を咥えながら眺めていた、雲の上の上の存在だったのに、感無量です…。
各サイトへの連絡 (4/17 26:00)
興奮で眠れなくなり、ここまで注目してもらえるなら、各種 Web メディアにもご紹介頂けるのでは…! という下心からメールを送りまくりました。
初の取材 (4/18 10:00)
翌朝、お客様先での打合せのために電車で移動していると一通の DM が届きました。差出人は…ねとらぼさん! 実は一番サービスとの親和性が高いのではないかと思っていたメディアなのですが、まさか一番にご連絡頂けるとは思っていませんでした。移動中のため、簡単にテキストベースでご質問にお答えしました。
ねとらぼへの記事掲載 (4/18 13:00)
打合せを終えて昼食をとっていると、「記事を掲載しました」とのご連絡が。ねとらぼさん、何たる執筆スピード…! 初の Web メディア露出で、このあたりから冷や汗が止まらなくなりました。
Gigazine への記事掲載 (4/18 15:00)
さらに平静を装って業務を続けていると、知人から「GIGAZINE載ってるよ!」との連絡が。取材はお受けしていないものの、ねとらぼさんの内容にも準拠したボリュームたっぷりの記事を出して頂きました。
Yahoo! ニュースへの掲載 (4/18 15:50)
この辺りから平常心を失いはじめます。この日はシェアオフィスで同僚とテレビ会議等をしながら作業していたのですが、「声の調子がおかしい」「目が浮ついている」「初恋に落ちた中学生かよ」など散々な言われようでした。
Yahoo! トップページへの掲載 (4/18 20:00)
やはりYahoo! ニュースの威力は凄まじく、ついに実家の親から連絡が来ます。この頃の同時アクセス数が常時 300-500 の間で推移していました。多少読込みが遅くなったものの、インフラに大きな問題は生じることなく、リリースから 24 時間が経とうとしていました。
リリースから 1 日経過 (4/18 20:30)
リリース後丸一日の時点で、各種指標は以下のような具合でした。PV 57,700 / UU 33,000 はいずれも個人で制作したサービスとしては断トツの最高記録で、只々唖然とするばかりでした。
その後
その後もサービスをさらに拡充するべく、不正アクセスへの対応、ランキングの実装、日報詳細ページの追加、PDF の軽量化などなど、多くの施策を業務の間を縫って実装・リリースしていきました。この辺りのイラク日報村のその後に関するお話は、需要があれば本記事の「続編」として公開したいと思います!