プロコン自由部門(procon28)に参加した話

概要

去る10月8日~10月9日に開催された「プログラミングコンテスト(通称: プロコン)」の自由部門本戦に参加しました。結果は敢闘賞でした。数カ月に渡ってチームで企画・開発を進めてきましたが、この経験を忘れないように簡単な参加記を残したいと思います。ところどころ内輪でしか通じない部分もあるかと思いますがその点はご了承いただき、温かい目で見ていただければ幸いです。

さて、本戦終了から1週間ほど経ってはしまいましたが、時系列順に回想を初めていきます。

プロコン参加の経緯(1月)

年が明けてすぐ(つまり、まだ高専本科5年の時)、某M教授からプロコン参加のお誘いをいただきました。正直な話、最初話を聞いたときは卒研やセキュリティの勉強の方に気持ちが行っていたのであまり乗り気ではなく、かなり迷いました。ただ本科自体に参加した経験がなかったり、専攻科でどのような人生を送ろうか考えている時期でもあったので「まあやってみるか」くらいの気持ちで参加意志を表明した記憶があります。
この頃既にチームメンバーの構成などを大まかに聞き、コミュ障の僕は餅を食べながら震えていました(1月なので)。

アイデア出し(~4月)

「さて実際に何を作ろうか」ということを考えるこの期間ですが、アイデアの欠片が出てはダメ出しを食らい、という日々でした。個人で趣味の開発をするときはあまり深いことは考えず、「とりあえずこんなの作ってみるか~」くらいのノリで進めるのでやはりこの段階では結構苦戦しました。

アイデア出しにおいて良かったことはSlackを活用して、とりあえずアイデアの卵をたくさん出してみる、ことが出来ていた点です。ちょうどアイデア出し開始より少し前にSlackにスレッド機能が実装されていたので、1日1レス目標を立ててアイデアの卵を皆で生み出していました。良くなかったのは、このアイデアの卵を育てきれなかった点です。たくさん出たアイデアの卵の中から自分の一番好きなものを挙げて、それを1日1個ずつブラッシュアップ方式を取っていましたが、1日と言っても放課後の時間は限られており、アイデアを育てるのには十分な時間が取れていなかったなと感じています。
とは言ってもアイデアの卵たちもそのまま時の狭間へ――というわけではなく、趣味での開発には面白そうなものもいくつかあったので時間を作って掘り出してみるのも良いかなと思います。

突然の死、そして予選資料作成へ(5, 6月?)

結論から言うとアイデア欠乏によりチームが他チームに吸収合併されることになりました。この時にチームを離れていくメンバーもいて、正直僕にとっても迷い2という感じの心境でした。この後さらに様々な話し合い、感情のゆらめきを経て僕が新チーム(?)のリーダーを務めることになりました。チーム「サーモン焼いたらシャケ」が爆誕します(このチーム名が発案されるのはこれより少しあとのことだったとは思いますが)。
チーム開発、リーダー業…。正直不安しかありませんでした。しかしこの時既に予選資料提出が近づいていてそれどころではなかったので、アイデアの整理をチーム内でしながら予選資料作成までなんとか持っていけました。提出ギリギリまでSlackでああでもないこうでもないと言いながら作業したのは結構楽しかったです。

予選通過(6月)

予選を通過しました。
ここまで触れていませんでしたが、サーモンでは「2機のドローンとヘッドマウントディスプレイを用いた立体視」をテーマに開発を進めていくことになります。
予選結果発表までは空白だったわけではなく、システム構成の見直しをしたりしていました。今思えばこの時期にお買い物フェーズ完了、個々のテストくらいまで出来ていると良かったのですが、この辺は予選結果によっては考えものなのでジレンマだな~みたいな気持ちです(ドローンなどの購入は予算を大幅にドロンする可能性があったので)。

お買い物フェーズ、そして開発期間へ

「アイデア出しは辛いが、開発さえ始まればどうにかなるだろう」と思っていた時期が僕にもありますた。
まずお買い物フェーズで失敗を重ねてしまいました。ドローンが発注から配達完了まで1ヶ月近くかかる事実の発覚や、小道具的機器の発注ミスなど痛手が多かったです。発注したと思い込んでいたものが実際にはしていなかったり、購入物品の仕様の確認が足りず届いたものが思っていたのと違うといったことまであり、かなり辛かったです。結果、元々委員会で保有していたヘッドマウントディスプレイやRaspberry Pi関連以外の開発が大きく遅れることになりました。

そのようにどったんばったん大騒ぎをしつつ、僕はヘッドマウントディスプレイへの映像描画を主に担当していました。ヘッドマウントディスプレイにはOculus Riftを使っていて、SDKやAPIも提供されていたのですんなり行くかと思いきや学内ネットワークでのランタイムや開発環境セットアップ、そもそもリソース大食漢であるところのOculus Riftを満足させられるだけのPCの用意など罠が多く仕掛けられていました。この実にVIPな立ち振舞には頭を抱えましたが、某あっちー先生にかなり支援をいただいてどうにかスタートラインに立つことができ、圧倒的感謝の気持ちで不可視の涙を滝のように流しながら開発をはじめました(本当にありがとうございました)。
さて、初めはVisual Studioを使ってC/C++で開発を進めようと思っていたわけですが、これが謎のエラーや環境的な問題で進行できなくなり途中で方針転換をしました。たられば話になりますが、この方針転換はもっと早く実施するべきでした。Python用に作られたAPIのラッパーライブラリを発見してから数日で進捗が出ました。ここから「映像の取り込みにはOpenCV」「描画にはOpenGL」の構成で本格的に開発に取り掛かりました。この時既に9月。焦りとバグしかありませんでしたが、どうにか映像を描画することが出来たときはかなりホッとしたのを覚えています。映像をテクスチャとして貼り付ける方式でしたが、ひとまず映像が描画できるようになって暫くの間左側のレンズだけ貼り付けがうまく行かず「鈴カステラ鈴カステラ」と言っていたは今となっては良い思い出です(これはライブラリがハードウェアから取得してくる初期パラメータが破損していたのが原因だった)。

こうして思い返してみても本当にヘッドマウントディスプレイに時間がかかりすぎて無限に辛いです(僕の中では夏休み突入前に終わっていたかった)。僕が鈴カステラと格闘している間、他のメンバーには分業でドローンをやってもらったり、その電源系をどうにかしてもらったり、シンクロ飛行のための超音波・画像処理をやってもらったり、また夏休み期間中にパンフレット原稿の提出も控えていたので、そちらをやってもらったりしていました。進捗が順調なタスクもあればそうでないタスクもあり、特にドローンは知見があるメンバーがほぼ皆無だったのでなかなか思うように行きませんでした。この辺のタスク振り分け的なところもにわかリーダーであるところの僕の甘さが出てしまって、負担が大きすぎるメンバーが出たり、逆に何をしたら良いかわからない、というメンバーを出してしまい、チーム開発の難しさを痛感しました。ただ、基本的に開発期間中は和気藹々と作業できていた(ちょっと騒ぎ過ぎなぐらいw)のでその点は良かったと思います。デスマデスマと世紀末のような感情で作業するよりもよっぽど良く、これはチーム開発のある意味醍醐味(なんか語感良いなこれ)なのかなと思ったりしました(一人のときは静かに開発するので)(これには多少嘘が含まれています)。「うるせぇ!」と思っていた皆さん、いたらごめんなさい。でもこれもあったから楽しく開発を続けられたと思うんです。

ポスターマニュアルパンフレット(10月)

気づけば夏休みも明け、9月末があっという間に過ぎ、10月に突入しました。プロコン本戦に向けて展示用のポスターを作ったり、マニュアルを書いたり、配布用パンフレットを作ったり…という時期です。このあたりはチームメンバーに助けてもらいつつ開発もギリギリまで並行してやっていました。サーモンは全体的に提出物も含めてギリギリになることが多く、添削をしていただいた教授にも負担をかけてしまったなと反省しています。

運搬、そしてプレゼン資料作成(プロコン直前)

今回開発を進めていたシステムは一部を事前に海上である山口県へ輸送する必要がありました。この時点でヘッドマウントディスプレイの調整は半強制的にできなくなり、UI部分のプログラムは開発半ばで送られていきました。
このあたりから流石にプレゼンのことを考え始めました(またしてもギリギリ)。僕は原稿を作って読むのが苦手(実はこれの根っこは中学時代の意見文発表会にあるのかもしれないと思った)なので、ひとまずスライドをバーっと作って「よしよし」とか言って眺めていた記憶があったりなかったりします。

本戦

Day0

(記事的な意味で)やっと本戦です。実際には木曜の夜にやっている衝撃映像を流したりする番組タイトルみたいな心境で飛行機に乗り、寝不足の頭を低速回転扠せながらプレゼン資料を見たり、半ばで送られてしまったUIプログラムの合体用調整をしていました。
山口県は思ったより暑かったです。翌日のプレゼンでのスーツ着用にいささか以上の不安を感じながら、Day0の夜はプログラムの調整とプレゼン資料を読んだりしていました。

Day1

プレゼン当日は午前中ホテル残留組となり、会場先発メンバーから「システムが動かない」という電話を受けて青くなりながらプレゼン練習に使いました。スライド自体はある程度出来ていても時間調整がうまく出来ていなくて不安がありました。不安しか感じてないなこいつ。そんなこんなで午後になり、一足先に社会人勢となった激強同級生から貰ったウィダーインゼリーを飲んでいました。そうこうしている内に発表時間となり、自分の前2人のプレゼンを予想以上に暑い会場で聞いた後、どうにか8分を乗り切りました。質疑応答も含めて終了後に教授に言われた「あのごまかし力はすごい」という言葉は良い意味でも悪い意味でも忘れられません。プレゼン後は一般公開の方の手伝いをしたり、他チームのプレゼンを聞いたりして会場でのDay0は終了しました。
夜は翌日のデモ・マニュアル審査に向けて、ストーリーを皆で考えたり、WIP状態で搬送したUIプログラムの調整をしていました。ちなみに魔剤完飲デビューを果たしました。

Day2

朝一でデモ審査が一つ入っており、システムのセットアップをしていました。しかしここでヘッドマウントディスプレイの接続が認識しなくなる、という問題が発生しました。ディスプレイ表示用にもう一つポートがあったので、1つ目のデモ審査はディスプレイに画面を表示してEnterキー押下でプログラムを実行できるようにし、ヘッドマウントディスプレイを接続してプログラムを起動する方式で行いました。が、デモ用に用意していた動画が短かったこともあり、思うように出来ないまま終わってしまいました。それからも原因究明に取り組み、その間にもデモ審査が入り、グラフィックボードが認識しなくなり(接触不良?)、デモ審査が入り、結局描画が正常に出来ないままマニュアル審査まで終わってしまいました。ドローンは会場で飛ばすことが出来ないので、デモ・マニュアル審査の肝はヘッドマウントディスプレイによる立体視であり、これが動かなかったのはとても大きな痛手でした。審査員に「今見れない状態です」という説明をしなければならなかったことが、本当に悔しかったです。この件において良くなかったのは、ヘッドマウントディスプレイが接続できる代替PCを用意していなかったことです。ハードウェアのリソース要件が厳しいことは予めわかっていたので調達が難しいのは飲み込んで、どうにかしてでももう1台は用意しておくべきでした。あとは、変換を噛ませすぎていたことも良くなかったことの一つで、後からわかったことなのですがDisplayポートとHDMIの変換コネクタが故障していたのが描画出来なかった直接の原因でした。この他にもミニディスプレイにミニHDMIとHDMIの変換を使ったりしていたので、今から思い返してみればどうしてこんな綱渡り構成にしてしまったのか、と悔やまれます。

接続がうまくいなくなってからの作業中、ディスプレイ自体を貸してくださった企業の方、ディスプレイの変換コネクタを貸そうとしてくださった他高専の方、電源関係のテストをさせてくださった隣ブースの高専の方、本当にありがとうございました。

午後の一般公開、閉会式を経てプロコンは終了したのでした。

終わりに

失礼しました、乱文が出てしまいました。
最後まで読んでいただいた方にはおわかりの通り、とても反省点の多い、しかしそれだけに良い経験となった、そして何より楽しいプロコンでした。基本的に「何が起こるかわからない」のが世の常で、「時間」にしても「物品」にしても余裕を持ってやっていくことの必要性というのを再確認しました。閉会式の時の「ここはプログラミングコンテスト。物をしっかりと作れないと」という言葉が胸に刺さりました。自分たちで開発をやっている間というのは、どうしても盲目になってしまいます。そこでどうにか視界を広げて(それこそ立体視でもして)、何が求められているのか、本当にこのやり方で良いのか、そのあたりの見つめ直しというのを心がけていきたいものです。

サーモンチームのメンバーには感謝してもしきれないです。このようなへっぽこリーダーについてきてくれて、ありがとう。「大変だったことほど、後から思い返すと楽しかった記憶として回顧される」と言ったものですが、企画書を書いたり、プログラムを書いている時間というのはそういう意味でもそういう意味を抜きにしても純粋に楽しかったです。
プロコンに誘ってくださったM教授、ありがとうございました。チーム合併のときに「なぜ僕はプロコンに参加しているのか、わからなくなってきた」と言った時に、プロコンにお誘いをいただいた真意(?)をお話いただいた時の会話は僕がプロコン続投の心境に立ち直るにあたって大きな要素でした。他にも機器やアドバイスなど多大な支援をいただいたあっちー先生、ドローンに関する知見を多く頂いたsryn先生、ドローン研の皆さん、そして幼稚園状態のサーモンを温かい目で見守ってくれ、見事特別賞を勝ち取った回らない寿司屋の皆さん、関係各位の皆さん本当にありがとうございました。

長くなってしまいましたが、この拙文回顧が僕にとっての戒めとなり、時々読み返しては懐かしさを感じる娯楽となり、そして少々の高望みが許されるのであれば、今後のプロコンメンバーにとっての参考やモチベーションとして少しでも貢献できれば光栄です。

以上です。