サイトアイコン しらかわるーむ

バスがぐるぐる回ってる!熊本の観光アプリ開発で丸一日バグと戦った話

「……なんでバスがここでぐるっと一周してるんだ?」

スマホの画面に映った地図を見て、思わず声が出ました。熊本市の水道町交差点。青い線で描かれたバスの経路が、なぜか交差点の周りをくるりと一周してから、また元の道に戻っていく。実際のバスはそんな走り方をしません。

今、私は「くまモビ」という熊本の観光交通アプリを個人開発しています。市電やバスの乗り換えを調べたり、観光スポットを巡ってスタンプを集めたり。熊本を旅する人が「これ一つあれば大丈夫」と思えるアプリを目指しています。

そのアプリが、いよいよクローズドテストの一歩手前まで来ました。ところが最後の最後で、この「ぐるぐる問題」が立ちはだかったのです。

今日はそんな、地味だけれど濃密な一日を振り返ります。個人開発の泥臭い現場を、少しだけ覗いてみてください。

スポンサーリンク

この記事のポイント

  1. 地図上でバスがぐるぐる回る謎のバグ。その原因は意外なところに潜んでいた
  2. 「推測で直さない」を貫くと、遠回りに見えて実は最短ルートだった話
  3. 時刻表・お知らせ・スタンプ機能を追加。クローズドテストまであと少し

7分4秒でわかるまとめ動画

朝はスタンプの「演出」から始まった

一日の始まりは、実はバグ退治ではありませんでした。スタンプラリーの演出づくりです。

くまモビには、熊本の観光地や銅像を巡ってスタンプを集める機能があります。現地に着いてボタンを押すと、画面にスタンプが「ポンッ」と押される。この瞬間の気持ちよさが、アプリを使い続けてもらえるかどうかを左右すると思っています。

最初に作った演出は、正直イマイチでした。スタンプが小さくて、地図の下に隠れてしまう。全部集めたときの「おめでとう」の演出も、なんだか安っぽい。

そこで世界中の評価の高いアプリを研究しました。iMessageの紙吹雪エフェクト、LINEのトーク背景、ゲームアプリのクリア演出。それぞれの「気持ちよさ」の正体を探っていくと、共通点が見えてきます。

紙吹雪ひとつとっても、ただ落とすだけでは駄目なんですね。手前と奥の二層に分けて奥行きを出す。一枚一枚がヒラヒラと翻る。落ちるタイミングをバラバラにする。こうした細部の積み重ねが、あの「おおっ」という感覚を生んでいる。

左右のクラッカーからパーンと紙吹雪が飛ぶ演出も加えました。最初は物理法則を無視して真横に飛んでいたので、放物線を描いて自然に画面外へ抜けるよう計算し直しています。

効果音も、効果音ラボさんの「和太鼓でドン」と「歓声と拍手」をお借りしました。スタンプを押した瞬間に和太鼓が鳴る。全部集めたら拍手が湧く。これだけで達成感がまるで違います。

ちなみに、最初はClaudeで音を合成していたのですが、どうしても不気味な音になってしまって。妻に「怖い」と言われて素直に差し替えました。餅は餅屋です。

そして地獄の「ぐるぐる問題」が始まった

演出が固まって、いよいよ機能追加に取りかかりました。時刻表画面、お知らせ画面、そして訪問者数を記録する仕組み。順調に進んでいたのですが、時刻表から経路を表示したとき、冒頭のあの光景に出会ったわけです。

地図上でバスがぐるぐる回っている。

ここからが長かった。結論から言うと、原因は四段階にわたって潜んでいました。一つ潰すと次が顔を出す、まるでモグラ叩きです。

第一の原因:区間の切り出し方

バスの走行経路は、道路に沿った点の集まりとして持っています。「A停留所からB停留所まで」を表示するには、その範囲を切り出す必要がある。

ところが単純に切り出すと、折り返し運転をする路線で問題が起きました。行きと帰りで同じ道を通る場合、実際には走らない区間まで描いてしまうのです。

停留所ごとに細かく区切って積み上げる方式に変更し、一度描いた場所には戻らないルールを追加。これで一つ目は解決しました。

第二の原因:地図データに含まれた「ヒゲ」

まだ回ります。データを調べると、同じ座標を何度も通っている箇所が13箇所も見つかりました。

間隔を見ると、いずれも短い。数十メートル進んで戻る、という往復が繰り返されている。これは経路データを作る過程で生じた「ヒゲ」でした。

短い往復だけを検出して畳む処理を追加。ただし、本物の循環バス路線まで削ってしまっては困ります。往復は数百メートル、循環路線は数キロ。この差を使って区別しました。

第三の原因:上下線が別々の道だった

それでも白川公園前で回る。

スクリーンショットを見て気づきました。ループが妙に細長い。幅は30メートルほどで、長さは400メートル。これは往復です。しかも行きと帰りが、少し離れた位置を通っている。

国道3号線は、上り線と下り線が別々の線として地図データに登録されているんですね。両者は25〜35メートル離れている。だから「同じ場所に戻った」と判定できず、これまでの対策をすり抜けていたのです。

判定の距離を広げて対応しました。

第四の原因:停留所の座標が道路の外にあった

水道町では、ループではなく三角形が出ていました。前に進みながら、途中で寄り道して戻ってくる形です。

これも原因が違いました。

停留所には複数の「のりば」があります。水道町のような大きな交差点だと、のりばが四方に散らばっている。アプリではそれらをまとめて一つの停留所として扱うのですが、その代表座標を「全のりばの平均」で計算していました。

すると、平均の位置が交差点のど真ん中、つまり道路の外に落ちてしまう。経路計算のプログラムは律儀に「その地点に立ち寄る」経路を作ろうとして、あの三角形が生まれていたわけです。

平均をやめて、実在するのりばの中から最も中心的な一本を選ぶ方式に変更しました。実際ののりばなら、必ず道路沿いにありますから。

そして真の根本原因へ

ここまで来て、ようやく本丸が見えました。

代表座標を一つに決めるということは、行きも帰りも同じ座標を使うということです。上下線が別々の道の場合、片方向は必ず「反対車線ののりば」を目指すことになる。経路計算プログラムはそこへ辿り着くために、Uターンやブロック一周を強いられる。

これが全ての元凶でした。

そこで、経路の進行方向に応じて、その方向に合ったのりばを選ぶように変更。実データで検証すると、白川公園前では北行きと南行きできちんと別々ののりばが選ばれるようになりました。

丸一日かかりましたが、これで発生源から断てたはずです。

「推測で直さない」を貫いた一日

今日、何度も自分に言い聞かせたことがあります。

推測で直さない。データで確かめてから動く。

というのも、途中で危うく大きな回り道をするところだったのです。

「御領」という停留所でループが出ると聞いて調査したところ、天草の御領のデータを見ていました。熊本市の御領を探していたのに、同じ名前の停留所が県内に6箇所もあったのです。緯度経度で確認して、ようやく気づきました。

もし気づかず「原因はこれだ」と思い込んで修正していたら、全く関係ない場所を直して、本命は残ったまま。そんな未来もあり得たわけです。

桜町バスターミナルでも同じことがありました。バスがぐるっと回っているように見える。でもデータを確認すると、重複する座標は一つもない。これはバスがターミナルの敷地に入って、乗り場に停まって、また道路に出ていく——実際の走行そのものだったんですね。

「怪しいから直す」ではなく「データがこう言っているから直す」。この姿勢がなければ、正常な動作を壊していたかもしれません。

遠回りに見えて、実はこれが最短ルートなのだと、改めて実感した一日でした。

時刻表とお知らせ、そして「訪れた人の数」

バグ退治の合間に、新しい機能も入れています。

時刻表画面は、停留所名を入力すると方面ごとの発車時刻が一覧で出ます。今日・明日・明後日を切り替えられて、今日の表示では発車済みの便を畳んで次の便を目立たせる。時刻をタップすれば、その便の経路がすぐ確認できます。

お知らせ画面では、運営からの告知を4言語で配信できるようにしました。テスト中に「こんな不具合を直しました」とお伝えしたり、観光情報を流したり。

そして地味ながら未来につながるのが、訪問者数の記録です。

スタンプを押した人を、場所ごと・言語ごとに数える仕組みを入れました。「この観光地には何人が訪れたか」「そのうち何人が英語で見ていたか」。こうした情報は、将来的に観光施設や自治体にとって価値のあるデータになるかもしれません。

日本語・英語・繁体字・タイ語の4言語に対応しているので、インバウンドの実態が見えてくる可能性もあります。まだ夢の段階ですが、こういう可能性を仕込んでおくのは個人開発の楽しみでもあります。

スタンプの対象も、観光地と銅像だけでなく、グルメと文化財にも広げました。全25箇所。熊本を隅々まで巡ってもらえたら嬉しいです。

グルメといえば、昨日ひとつ嬉しい知らせがありました。とんかつの「勝烈亭 新市街本店」さんから、写真の使用許可をいただけたのです。メールでのやり取りを経て、快くご承諾いただきました。こうして一つずつ、応援してくださる方が増えていくのは、何より励みになります。

クローズドテストまで、あと少し

バージョンを0.15.0に統一して、昨日一日の作業は終わりました。

残るはビルドして、Google Playのクローズドテストに提出するだけ。テスターの方に実際に触っていただいて、感想をもらう段階です。

テストは全国どこからでも参加できるようにしています。本来スタンプは現地でしか押せない仕様ですが、テスト期間中は距離の制限を外しました。熊本県外の方にも、スタンプの「ポンッ」という気持ちよさを試していただきたくて。

テスター募集は近日中にこのブログでお知らせします。Androidをお使いで、熊本に興味がある方。あるいは個人開発のアプリが育っていく過程を見てみたい方。ぜひご参加いただけたら嬉しいです。

おわりに

正直に言うと、こんな日は、外から見れば何も進んでいないように見えるかもしれません。新機能が華々しく増えたわけでもなく、ただ「地図の線が正しく描かれるようになった」だけ。

でも、こういう地味な作業の積み重ねが、使ったときの「なんかいいな」につながると信じています。バスの経路が変な動きをしていたら、それだけで「このアプリ、大丈夫かな」と思われてしまいますから。

個人開発は孤独な作業です。でも、こうして記録を残しておくと、後から見返したときに「あの日は頑張ったな」と思える。そして誰かが読んでくれて、少しでも面白がってもらえたら、それだけで報われる気がします。

熊本の旅が、少しでも便利で楽しくなりますように。

くまモビ、もうすぐ皆さんの手元にお届けします。

モバイルバージョンを終了