試運転ブログ

技術的なあれこれ

ADF 2015 Bugfix Backend

 リクルートホールディングス主催のADF 2015というイベントにスタッフとして参加してきた。その中で2日目のバグフィックス チャレンジというコンテンツを任された。

ADF 2015とは

 ADF2015とはリクルートホールディングスが、3/28~3/30で行った就活中の学生エンジニア向けの2泊3日のイベントである。全体で100名規模のイベントとなっていた。また、東京の学生にも品川プリンスホテルの個室が割り当てられるなど、とてもあれがかかっていたイベントである。

recruit-jinji.jp

 1日目から2日目はチーム対抗で様々な競技(ゲームプログラミングやショートコーディング)で稼いだポイントを競い、3日目はハッカソンをするという流れになっている。

 これらの入賞者には、それぞれ豪華商品が送られている。入賞者のブログなどぜひ見てみて欲しい。とてもあれがかかっている。

Bugfix Challenge とは

 バグフィックスは、その名の通りにバグの渡されたプログラムを修正することだ。バグフィックス チャレンジでは、バグの修正できる力を競う。ジャンルは、iOSAndroid、Web(Front)、Web(Backend)の4ジャンルを出題した。参加者は、これらのうちどれかを選択し解答することができる(複数選択可)。競技スタイルは個人戦とした。

 参加者へのルール説明は以下のGitHubレポジトリで行った。github.com

Backend の問題の環境

 私はBugfixのBackendの問題を作成した。github.com

 バックエンドのエンジニア向けのバグフィックスといっても、バックエンドで必要となる技術が多種多様で、共通して全員ができるものというのはなかなか無いと思う。今回は、参加者の中で触れたことの多そうな素のPHP(フレームワーク、テンプレートエンジン、ORMは使わない)とMySQLを利用した簡易ショッピングサイトを題材として扱うことにした。

作問について

 バックエンドの問題では「報告されているバグリスト」というものを参加者に提示し、これらで報告されているバグを修正してもらうことにした。バックエンドでのバグは期待する動作がされていないものとし、一部の書き換えだけでなく、修正のためにプログラムを追加することが必要な箇所もあった。

 バグは5題用意した。また、バグリスト以外にも多数の修正した方が良い箇所があり、これらの修正に関しても加点対象とした。PHP固有の問題(型にまつわる問題など)はあまり触れず、バックエンドのエンジニアならば原因の特定とフィックスができそうなバグを心掛けた。

対象のアプリケーションについて

f:id:otameshi61:20150404184743p:plain

 こんなサイトを対象とした。
 ちなみに、見た目がダサいはバグではない。

各問題について

 以下のようなバグレポートをあげた。

# Bug1

"新しい品物!"で何も選択をしない場合で,"商品を追加する"を押した時は,
同じページにリダイレクトさせたいのに,index.phpに遷移してしまう.

# Bug2

login後に、"メッセージを残す"で自動的に名前の入力が投稿に反映されない

# Bug3

商品をすべて購入後に"新しい品物!"にアクセスすると表示がおかしくなる

# Bug4

"メッセージを残す"で"いつもお世話になってます!>_<b(>_<) Good Job!! >_< "などと打つとが表示がおかしくなる

# Bug5

一度購入したものも、ログアウトしてカートに入れた後にログインすると、カートに入ったままで再度購入ができてしまう

解答と講評

 簡単にだが解答と講評を行う。

# Bug1

リダイレクト先がおかしいというバグ。リダイレクト先を指定のパスにすれば良い。
カートに何か入ってる場合は、/index.phpに入っていない場合は、/new_items.php?isNew=Nにリダイレクトするのが想定解であった。

多くの人ができていた。

# Bug2

disabled属性になっているinput要素のplaceholder属性にのみ属性値が設定されており値が送られていないというバグ。
想定解としては、disabled属性をreadonly属性にしvalue属性を追加させる方法であった。

# Bug3

while(true)でitemsがnullの時にループが停止しないというバグ。

想定解のひとつとして、breakへの条件である、

if ($counter == count($items)) { break; }

を

if ($counter >= count($items)) { break; }

を想定していた。

itemsがnullであったらbreakするという、新たにif文を追加している人が多かった。

# Bug4

HTML escapeがされていないためタグの表示がおかしくなるというバグ。

想定解としては、出力前にhtmlspecialcharsの関数でエスケープする方法だった。

解答はデータベースに入れる前にエスケープしているものが多かった。
HTML エスケープは単純に'<' を'& lt;'などの文字実体参照に変換するものであり、データベースで保持する際にはエスケープ前のものを保持することを想定していた。

# Bug5

ログイン前にカートへの追加が可能なため、以前に購入したものを再度カートへ入れることができ要件をみたしていないというバグ。

想定解は、"購入履歴"に対応するhistory.phpの中のSQL 文を流用して、カート内に過去に購入したものがあった場合には自動で取り除く方法を想定していた。

カートへの追加をログイン後にのみ可能にする、ログイン処理の直後にカートを初期化するといった解答が多かった。
一位の方は、購入したもののみカートから取り除くという処理いれており、想定解通りの解答になっていた。素晴らしい。

全体の講評

 Bug 5まである程度の修正を行えていた人は比較的多くいた。動作としては治っているが一時しのぎ的なもの、前後の流れをみて修正しているものなど解答も様々であった。
 環境構築から、全体動作の理解、バグ報告されているバグの修正の全部を3時間でやってもらうという課題であったが、参加者からの感想や提出されて解答をみる限りでは3時間でやるには時間がやや足りない程度のボリュームだったようだ。

 また、アプリケーションのルートディレクトリをwww/という記述をしたが、この設定ができなかったのか、リダイレクトなどのすべてのパスを絶対パスから相対パスに書き換えている解答が多くあった。

tipsだが、最近のPHPはサーバーも付属しているので、www/配下で

php -S localhost:5000

とすると、localhostに5000番ポートでカレントディレクトリをルートとしたPHPのサーバーが起動する。また、XAMPPなどでapacheを利用している場合、httpd.confのDocumentRootを指定することでアプリケーションのルートディレクトリを設定することができる。

感想

 フレームワークを利用しないPHPについては、久しぶりに触ったという人がほとんどであったと思う。また、MySQLにはついては触ったことがないという人もいた。
 直接話を聞く限りでは参加した人には楽しんでもらえたようで良かった。ただ、解答を提出してくれた半分程度の人には声をかけられたが、全員と話せなかったのが少し残念だった。ゆっくりと参加者同士で交流できる時間が欲しかった。
さて、2日目のLT会で話すはずだったが時間の都合上なくなった「Bug Fix Backendを攻撃してみた」についておまけで紹介する。興味があれば見てみてほしい。otameshi61.hatenablog.com