IkaLogの裏側~「スプラトゥーン」のリアルタイム画像解析はどのように行われているのか

第3回 「ニコ生主でもつかえるIkaLog」を目指してのWindows対応

この記事を読むのに必要な時間:およそ 5.5 分

wxPythonでGUI開発

もう1つの取り組みとして,IkaLogにGUIを付ける作業をはじめました。IkaLog実行中の操作をGUIでできるといいのでしょうが,何よりCLIなどでゲーマー層に設定ファイルを作成させるのは,かなり難易度が高い話です。このため,とりあえず設定や実行をWindowsアプリケーションっぽくすることを目指しました。

GUI部分の開発には,Windows,Mac OS X,そしてLinuxをターゲットにしたマルチプラットフォームなGUIアプリケーションを作成できるwxWidgets,それをさらにPythonから利用できるようにするバインディングであるwxPythonを利用することにしました。別件で,PythonとwxPythonの組み合わせでWindowsとMac OS Xの両方から利用できるGUIアプリが作れるか試していたため,⁠これを使えば,とりあえず目的のものは作れるだろう」という感触を持っていたからです。

私は,高校生から大学生の頃にDelphiでWin32アプリを書いたりしていたので,wxWidgetsやwxPythonを用いたプログラミングはなんとなく感覚的にわかります。また,2004年の新卒当時,新人研修でJava AWTを使った開発を経験していたので,その感覚でwxPythonを使ったコードを書くことができました。

 IkaLog GUI (IkaUI)

図 IkaLog GUI (IkaUI)

Windows向けの利用を想定したIkaLogのGUI機能ですが,その開発は基本的に「MacOS X上で開発および動作チェックを済ませたうえで,Windows上で最終的な動作確認をする」というフローで開発を進めました。IkaLogの画像認識部分などは,Mac OS X上で動けば,Windowsでもだいたい動きます。しかし,wxWidgetsやwxPythonがクラスプラットフォームを謳うGUIツールキットだといっても,⁠Mac OS Xで動いても,Windowsで表示されない」⁠Windowsで動いても,Mac OS Xだとエラーで落ちる」といった程度には挙動差が生じていました。IkaLogのような,wxWidgetsのお作法をよく理解せずに書かれたコードでは,他プラットフォーム上でバッチリ一発動作させるのは難しいのかもしれません。このため,GUI部分に変更を加えた際には,原則Windows環境で動作確認するようにしています。

IkaLogのGUI部分は旧来からのデスクトップアプリケーションのような作りになっていますが,今は「Webアプリケーションとして作るのが理想的だったかな」と思っています。たとえば,棒グラフや円グラフなどをユーザーに見せるためのライブラリはHTML5のほうが良いものが充実しています。また,手元で試しているかぎり,MacOS XでwxPythonを使ったGUIにビデオのフレームを描画するより,WebブラウザにMotion JPEGフォーマットでストリームしたほうがプロセッサへのの負荷が低いこともわかっています。そして,いまどきのUIに関わられているエンジニアの協力も得やすかったでしょう。

Windows版のビルド環境にはSlackでアクセス

先述のとおり,私は普段はMac OS Xで(IkaLogに限らず)ほとんどの作業をしており,Windows環境はあまり使っていません。しかし,IkaLogのWindows版バイナリを生成するには,Windows環境での作業が必要になります。

当初は,IkaLogのWindows版バイナリを生成するためだけに,MacBook Pro上でWindowsの仮想マシンを起動し,手作業でPy2EXEを実行していました。しかし,この作業は地味に面倒でした。自宅で作業しているときはまだいいのですが,年末年始は毎年スノーボード旅行で青森県八甲田山に遊びに出かけます。2015年年末は,ちょうどスノーボード旅行のタイミングでスプラトゥーンのアップデートがあり,山荘の布団の中からIkaLogの機械学習データの更新やWindows版バイナリの生成作業をしたのですが,これがまたけっこう大変でした。

このため,現在はIkaLog開発に使用しているSlackに/buildという専用のコマンドを追加しています。このコマンドを実行すると,Slack→Jenkins→自宅にあるビルドサーバ(Windows 10の仮想マシン)へとジョブが伝わり,下記の作業が自動的に行われるようにして,省力化しています。

  • 自動的にGitHubのmasterブランチをチェックアウト
  • Py2EXEでEXEファイルを生成
  • 公開用ZIPファイルを作成
  • 公開領域にZIPファイルをコピー
  • Slack経由で生成したZIPファイルのURLをフィードバック

結果として,⁠やろうと思えば,ですが)電車の中からiPhoneでパッチをマージ,Slackアプリから/buildコマンドを実行し,最新のWindows版IkaLogバイナリを生成できるようにしています。

 SlackからIkaLogをビルド

図 SlackからIkaLogをビルド

著者プロフィール

長谷川猛(はせがわたけし)

(株)SRAで7年間のシステム構築&提案を経験したのち,Fusion-ioのセールスエンジニアを経て,フリーランスエンジニアとして活動中。『LDAP Super Expert』(技術評論社)に寄稿したほか,『Xen 徹底入門』(翔泳社)および『萌え萌えうにっくす!UNIX ネットワーク管理ガイド』(毎日コミュニケーションズ)の共著者のひとりである。

スノーボード,ごまラーメン,飼い犬のミニチュアシュナウザー「ラピス君」が大好き。