読者です 読者をやめる 読者になる 読者になる

2週間ほどのベトナム滞在記

お久しぶりです。学校の留学プログラム、みたいなもので2週間ほどベトナムハノイに行っていました。

今回はそこでの経験を書き起こしておこうと思います。

そもそもなんで行ったのか

そもそもなんで留学なんか行ったの?というお話ですがそれは研究室配属の時に教授に「君プログラミングそれなりにできるみたいだし院行くから春休み暇だよね!まさにベストスウィートだよ!」と激押しされ、さらに渡航費用も成績のおかげで2万~4万で済むということでホイホイ釣られたというわけですね。実際に大した予定もなく、英語でコミュニケーション取ってアプリ開発というのも良い経験になりそうだなと思い、今回の滞在に繋がるという次第です。

滞在先での目的

では現地で一体何をするかというと「BLEを使ったAndroidアプリケーション開発」です。BLEはBluetooth Law Energyの略だったはず。 事前の勉強会ではBLEにおける、サーバーのような役割をもつPeripheral(今回はAndroid側です)とクライアント的な役割のCentral(今回はRaspberry PiのNode.jsプログラム)の解説を受けました。スマホアプリ開発に関してはiOSを少し触った程度ではありましたが大体一緒だったので仕様の把握にはそこまで手惑いませんでした。問題はNode.jsの理解です。 正直javascriptがなんとなく苦手で今まで避けてはいたのですが今回いい機会だったので片っ端からソースを読んで使用するライブラリのGitHubのソースもしっかり理解しました。おかげでコールバックを少し理解できました。

と、まぁここまでが事前準備です。実際に何を作るかは現地で他の外国人の方と話し合って決めます。

着いたはいいけど…

さて、6時間のフライトの末に着いたそこはまさに発展途上国。溢れるバイク、雲から太陽が顔を覗かせることはほぼ皆無。青空?なにそれ美味しいの?状態の街でした。歩道は普通にバイクが走るし道の舗装もがたがたです。日本の電車に乗ってる人たちがそのままバイクに乗っていると思ってもらえばその交通量の多さが想像できるでしょうか? 

泊まるところも泊まるところで控えめに言って牢屋のようだなと。初日にはお湯も使えず冷水しか出ない。なので他の部屋にシャワーを借りにいくという事態になっていました。

ベッドも寝返りをうつたびにギシギシと結構大きな音を立て、掛布団はなく、どう見てもシーツだろこれっていう感じの薄い布で初日の夜を明かしました。 正直初日にしてもう日本に帰りたいと思っていました。

気を取り直してプロジェクトスタートです

文句を言おうが朝はやってくるもので泊まっている寮からはタクシーを使って学校にいきます。「タクシーとか贅沢してんじゃねえよ」と憤慨する方もいるかもしれませんがベトナムのタクシーは2キロ走ってもらっても150円ぐらいで済みます。超安いです。 そんなこんなで学校に着き、軽く他の現地学生の方や留学生の方たちと自己紹介を済ませてプロジェクトメンバーが決められます。

今回の僕たちの班は3人でした。内訳としては僕、同じ日本人(Rさん)、ナイジェリアからの留学生(Eさん)でした。 他にも3つほどチームがあり日本人とベトナム人の混成チームです。

メンバーも決まったとこで何を作るかという話になりました。僕はあらかじめ考えていた「脱出ゲームとかで使えそうなスマホアプリケーション」を提案しました。詳細は後述します。

まぁぶっちゃけ拒否られるかなーなんて思ったりもしてましたけど意外とすんなり受け入れてくれたので決定しました。

プロジェクトの概要

ではプロジェクトの概要をざっくばらんに書いてみます。 まず、何をするシステムかというと「raspberry piに近づいてアプリを起動するとクイズが配られるのでそれを解いて得点ゲット!」という非常にチープなものです。構想自体はCTF4bで誰かが問題を解くたびにブザーが鳴っていてそれがラズパイで管理してるというものから着想しました。ただそれを実装してみると意外とめんどくさい。

f:id:kk_river108:20170315200818j:plain

上の写真はシステムのアーキテクチャを図で表現してみたものです。 大きく分けて3つのコンポーネントがあります。

  1. ラズパイ node.jsのプログラムが走ってます。nobleというライブラリを用いて片っ端からAndroid端末をサーチして条件が合致しているようであればJSON形式のクイズをバッファーに変換してandroid送信します。JSONデータは別ファイルに保存してます。

  2. Android javaで書いてます。まずこいつが「今ここにいますよー」的な宣伝をして、そいつをラズパイが検知して、問題拾って、ユーザー作るorログインして、問題解いて正解か否かを判断してユーザー情報更新のリクを別サーバーに送信するって感じです

  3. JsonAPIServer 自作したAPIサーバーです。ユーザー情報(ユーザー名、ID、スコア)を保持しています。一般的なGET,POST,PUTリクエストを受け付けます。Node.jsで書いていてmongoDBでコレクションを保存しています。

すごく大雑把でこんな感じです。実は最初はAPIサーバーを使わずに普通にMySQLとかで済ませるつもりでした。しかし、Androidアプリから外部DBサーバーにアクセスするのがすごく面倒くさくて(まる1日格闘してコネクションエラーとかで無理でした)Httpリクとか使うAPIサーバーだったらそこまで面倒くさくないだろうということでこの形に収まりました。

役割分担としてはラズパイ側はEさんに、画面UIと効果音とかをRさんに、APIサーバーの作成とAndroidAPIサーバーのコネクション、その他JSONデータのパースやその処理は自分が担当しました。

作業日数は実質的には7日ほどでしたが無事完成させることはできました。

思わぬ伏兵

開発の方自体はそこまで問題ではなかったのですがしかし全てがうまくいくことなんて当然ないわけで…

7日目ぐらいに高熱を出しました。その3日前から休日だったのですが休日という名の観光だったので体力的に全く休むことができず恐らく疲労によるものだと思いました。日本から持ってきた解熱剤をがぶ飲みしてなんとか1日で復帰しましたが頭痛や腹痛は帰るまで続いていました。観光自体は楽しかったですがやはりどこかでストレスは溜まっていたのかもしれません。自己管理不足です。

そして最終発表へ…

ぶっ倒れそうになりながらもなんとかプログラムを完成させ動作確認もしっかりでき、あとは最後のプレゼンだけでした。

しかし、英語でのプレゼンなんて当然したこともなかったので台本しっかり作って5,6時間練習してようやくそれっぽく仕上げられました。日本語だったら…なんて考えもありましたがそれはそれ。しっかり他の皆さんと同じ土俵でいい発表をしようと思いました。

本番は多少つまりながらも伝えたいことは伝えられたと思います。しかし、問題はそのあとの質問タイム。ベトナム人の先生の英語での質問が全くと言っていいほど何を言っているのかわかりませんでした。見かねたEさんが返答してくれましたがとても悔しかったです。 英語は引き続き自分の重要課題ですね。

と、そんなこんなで発表は終わり自分は「燃え尽きちまったぜ。真っ白にな…」状態でした。

f:id:kk_river108:20170315205846j:plain

発表は午前だけだったので午後からは自由時間で他のみんなは桜祭りとやらに行っていたのですが自分は寮の部屋で一人発表の反省とプログラムの確認をしていました。もうなんか何も動きたくなかったですね。

ベトナムに来る前からプログラムの開発と発表のことしか頭になかったのでそれが終わったら本当に抜け殻になってました。もしかして自分は仕事人間の才能があるのではないかと自覚した瞬間でした。 畢竟、ここまでガチでやったのは僕だけなんじゃないかと思います。自惚れだとは思いますが。

帰国へ

色々ありましたが二週間ほどをなんとか生きて過ごし、ついに帰国となりました。 今帰国してから3日ほど経ちますが日本は素晴らしい国ですね。帰ってきてから次の日に親子丼を食べに行ったのですが美味しすぎて心が慈愛に満ち、すべてを穏やかな心で見ることができるくらいでした。

と、まぁ冗談はここまでにしておいて今回のベトナム滞在で得たものは非常に大きかったです。英語でコミュニケーションを取るということ。違う環境下での体調の管理。プレゼンの仕方。まだまだ学ぶことは沢山あります。自分は韜晦するような振る舞いが苦手なのでいつも全力でやりますがそれ故に自分に足りないものが痛いほどわかるのはある意味利点だと思います。 4月にはTOEICの試験があるのでとりあえずそこに向けてしっかり勉強しておきたいと思います。

柄にもなく長文をしたためてしまいましたがここまでお付き合いしていただきありがとうございました。 今回はこのあたりで筆をおかせていただきます。