マラソンを支える技術

# はじめに

エンジニアの健康を支えているのは筋トレという説が優勢な気がしまして、ランニングも良いよ！というランニングクラスタからも情報発信したいと思います。

私の健康と肩こりはランニングによって守られていますが（走らないと肩こりで死ぬ！）、そんなランニングのモチベーションの一つとなるのがマラソン大会です。
本稿では、エンジニア視点からマラソンを支える技術・サービスを紹介したいと思います。

# 自己紹介

[株式会社アールビーズ](https://qiita.com/organizations/runners)にて、マラソン大会における様々なサービス等を開発しているエンジニアです。
日本ではマラソンのデファクトに近いサービスを提供しているため、手前味噌ですが自社サービス紹介が「マラソンを支える技術」と言って過言ないかと思います。

Facebook: [Kurimoto Atsuo](https://www.facebook.com/kurimoto.atsuo)
Twitter: [@KurimotoAtsuo](https://twitter.com/KurimotoAtsuo)
[Wantedly](https://www.wantedly.com/companies/runners/employee_interviews/8747)

### 趣味
- [UTMF完走記](https://www.facebook.com/notes/kurimoto-atsuo/2014%E5%B9%B44%E6%9C%8825-27%E6%97%A5-utmf%E5%AE%8C%E8%B5%B0%E8%A8%98/510312625739879/?__xts__[0]=68.ARAYKJO0A0x_nZrJndcLQYI7TFwxyoZNUOIULqLKO1fk54LU5Gz44KBRZwi8d6CM_Ft6-GAv4xR5ZLiPq3s8Jv5_VdKUTH4l7p5-fs3NHv2RSDCNz7hnUURp8Em23DOgq5huzWqsKBjzCbFIo7lWS9j1PkBpOAs3H1m6VGiO1Vx28yPX05S1&__tn__=HH-R)
- [八ヶ岳スーパートレイル100mile完走動画](https://www.youtube.com/watch?v=1rcyR9hH_6k)
- [トレニックワールド 100mileリタイア記](https://runnet.jp/trail/column/racereport/main_n27.html)
- [OMM参加レポート](https://runnet.jp/trail/column/racereport/main_n5.html)
- [トレランイベントレポート](https://runnet.jp/trail/column/teamreport/main_n1.html)

# で、マラソンって何かIT関係あるの？

![img12.jpg](https://qiita-image-store.s3.amazonaws.com/0/80905/7c73d47d-aa8c-5ba3-577b-2106967aca85.jpeg)

こういうチップ、ご存知でしょうか？
大会に参加すると配布されて、シューズにくっつけるやつです。

「ああ、このチップをつけてマットの上を踏むと、ピッとなるやつね」

という方はきっとマラソン経験者。

このタグはRFID (Radio Frequency IDentification)技術を用いたもので、[こちらの記事](https://qiita.com/ksbababa/items/a97356cab913a20456e1)など参考になるかと思います。
広義に捉えればETCやSuicaなどもRFIDの一種だとか。

現在、マラソン大会には様々なITサービスが提供されていますが、その基盤となるのがこのRFIDを用いた計測システムです。
（世界的にもこれが主流です）

# 計測システム

ざっくりとした資料がこちらです。

![img10.jpg](https://qiita-image-store.s3.amazonaws.com/0/80905/33c212b5-8901-0d1b-82fc-b72eb362e053.jpeg)

スタート地点、5km地点、フィニッシュ地点等それぞれの計測地点に専用のRFIDリーダーを用意し、そこから得られたデータを加工してサーバ等に上げています。

特筆すべき点は、マラソン大会の会場は常に通信環境が保証されている訳ではないという点。
オフィスでまったり暮らしているとあまり意識することはありませんが、光回線はおろか、山の中や、見渡す限り道路しかない場所が計測地点ということもままあります。

モバイルWiFiを使えば、、と思っても、人が多かったり悪天候の場合だったりと、状況によってモバイル回線は不安定となるため、なかなか利用できるケースは限られます。
場合によってはNTTにお願いして電話線を電柱から引っ張って、モデム通信によってサーバに接続することもあります。
そして電柱すらないような場所では、「孤立したPCからUSBでデータを回線が繋がるところまで頑張って繰り返し運ぶ」という衝撃的？な運用すら採られることもあります。

そのため計測地点におけるクライアントは、データ通信量を極力減らす必要があります。

こうした現場の努力によってサーバに吸い上げられた計測データ（IDとtimestamp）は、IDで選手データ（氏名や参加種目）と紐づけられ、timestampで順位計算がなされ、派生サービスの元となっていきます。
（このサーバはクラウド上にあることもあれば、大会現場のローカルネットワークで完結していることもあります）


# 様々な派生サービス

選手の記録情報は、基本的にはトップ選手の表彰や、大会終了後のリザルトに利用されます。
そしてその記録情報をベースとした、大会を楽しくするための様々なサービスが開発・提供されています。

## 記録速報

計測システムによっては、記録データをリアルタイムで配信することが可能なものもあります。
Webやアプリで閲覧可能なもので、選手の家族や友人が応援に利用したり、本人が速報を確認するのに利用されたりします。
ちなみに速報は正式な記録ではなく、後に失格の選手や計測漏れがあった場合のフォロー等が加わった確報が正式記録として出されます。

日本では[ランナーズアップデート](https://runnet.jp/runtes/update/)が有名です。
（と客観ぽく言おうとしてますが自社サービスです）

## 位置情報予測サービス

「マラソンの参加選手はほぼ一定のペースで走っている」という仮説のもと、例えば5km地点に20分で着いたなら10km地点には40分で着くはずとし、地図上にコースを引いて、そのコース上のどこに選手がいるかを予測するサービスです。

人によっては凄まじく正確に予測できますが、途中で歩いてしまったり、ラストスパート頑張ったりとペース変動が激しいと精度が悪くなります。機械学習案件かなーと思いつつ手をつけられていません。

海外でも類似サービスは多くありますが、日本では[応援navi](https://runnet.jp/smpapp/ouennavi/)（自社サービス）がメジャーになってきています。

![screen696x696.jpg](https://qiita-image-store.s3.amazonaws.com/0/80905/dffc1ddd-2b44-0ba1-095f-0c10dc8de389.jpeg)

### 応援naviを支える技術

大会当日サービスはその性質上、大会当日に大量のアクセスが発生するものの、普段はベタ凪です。
そのためサーバレス構成が非常に適しています。

過去にはEC2で構築されていましたが、これを全てAWS LambdaとDynamoDBに置き換え、非常に高いパフォーマンスを低コストで出せるようになりました。

置き換えの過程では[CloudSearchの内部動作と、それを知らぬがゆえにハマったこと](https://qiita.com/kurimoto/items/3a869ad8dd7fab1bd3a6)にキレて[DynamoDBで全文検索もどきをする](https://qiita.com/kurimoto/items/97db4addf73f8dede0e3)という荒技に出たりもしましたが、後悔はちょっとしかしていません。

また、[Mapbox](https://www.mapbox.com/)という地図サービスにも大変お世話になっています。
地図サービスにはライセンス料がつきものですが、「人や物の位置をリアルタイムで把握する」という行為には「アセット・トラッキング」というライセンスが適用されます。
例えば別の某地図サービスではトラックする対象数に応じた課金となるため、参加選手数×単価という中々に恐ろしい金額となります。地図サービスの選定も重要な要素でした。

## 大会当日完走証

フィニッシュしたら完走証。これはもう業界の常識のようになっています。
速報記録ではありますが、計測システムから回線を引いてプリンタを大会現場に揃え、ゼッケン番号をオペレータに伝えるとすぐに完走証が印刷される、というシステムです。

仕組みとしては単純ですが、共通部分は事前に印刷しておく等、何万人という選手にも対応できる工夫を凝らして現場運用を設計します。

## 写真サービス

メジャービジネスモデルとしては、大会中にプロカメラマンが写真を撮影し、それを後からWebで確認して購入できる、といったサービスです。
写真にスポンサーロゴを入れることでユーザには無料で提供するケースもあります。

撮影した写真と選手を紐づけるにはいくつか方法がありますが、手動によるもの、記録によるものと、画像認識によるもの等が挙げられます。

- 手動による紐づけ

写真に写っているゼッケン番号を見て、手動で登録します。
これは一番確実ですが、いかんせん何万枚という規模の写真を扱うにはかなりのコストとなります。

- 記録による紐づけ

この手法では、カメラマンが記録計測地点に待機します。
そこで撮影された写真のEXIFから撮影日時を取得し、その時間と記録計測時間を照らし合わせることで、ほぼ100%の精度で本人と写真を紐づけることができます。
人感センサーによる自動撮影でも運用できるというメリットがある一方、計測地点でしか撮影できないという点で表現の幅が狭くなり、選手にとって嬉しい写真を撮り辛い、というデメリットもあります。

弊社では[ランフォト](https://runnet.jp/runphoto/#service01)というサービス名にて、写真のDLだけでなく、写真入り完走証も提供しています。

- 画像認識による紐づけ

ゼッケン番号や特定のQRコードのような模様を選手に着用してもらうことで、画像認識により選手のゼッケン番号を判別する手法です。
この手法では撮影場所を選ばないため表現力の富んだ写真を撮影できるというメリットがある一方、悪天候時には認識精度が落ちるといったデメリットもあります。

弊社では[ランフォト＋](https://runnet.jp/runphoto/index.html#service02)というサービス名にて提供しています（特許6251336）。

### ランフォト＋を支える技術

ランフォト＋では速報性を担保できるよう、運用によってはリアルタイムでユーザに写真が届けられる設計にしています。

現場カメラマンは撮影した写真をタブレットに自動転送し、タブレットは指定したサーバに写真を自動アップロードするように運用します。
こうすることでネットワーク帯域が許す限り、リアルタイムに近い形でサーバへ写真を送ることができるようになります。

サーバに届けられた写真は即座に画像認識にかけ、選手との紐づけを行います。
この際には写真の端に写っている選手は認識対象から除外する等、様々な認識率を上げるための工夫を凝らしています。

この仕組みにより、選手がゴールしてすぐに写真入り完走証を提供することが可能となっています。

また、完走証は大会毎にオリジナリティを出したいという要望が多いため、HTMLでデザインしたテンプレートに、ヘッドレスブラウザで写真と記録データを埋め込むという手法で非常に自由度の高いデザインを実現しています。

ちなみに画像データだけでなく、QRコード認識にて大会ゴール会場で即座に印刷できる機能も作りました。

<img width="799" alt="スクリーンショット 2018-09-17 7.27.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/80905/80f78933-04f2-0556-a7d7-0d060f733e09.png">

開発者として現場も知らなければいけないので、巨大な高性能プリンタを10台、クライアントPCを20台繋げて電源とネットワーク配線用意して、、という現場運用を3人で回した時は死亡案件でした。特に腰がw

## 動画サービス

先述の「記録による紐づけ」と同様の概念を用いて、固定カメラの映像から選手がゴールした瞬間の動画を提供するサービスが多くの大会で実施されています。

このサービスは世界的にもメジャーなものですが、弊社ではこれとは別途、動画完走証という位置付けで[.finisher(ドットフィニッシャー)](https://finisher.runnet.jp/about)というサービスを提供しています。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/80905/e5d5ee67-06c7-b79b-652e-e26e27d70916.png)

### .finisherを支える技術

.finisherではWebGLとヘッドレスブラウザを用い、AWS Batchでレンダリングを行なった結果を動画に変換しています。
その他にも様々な技術を組み合わせて実現した、2018年時点ではかなり先進的なプロダクトです（特開2019-204438）。

ちなみにサンプル動画はこちらです。
https://vimeo.com/runnet/dot-finisher

余談ですが、日本最大級の100mileトレイルランニングレース、2018年UTMF（現在は大会名が変わりMt. FUJI100）にて採用していただきました。

## 通知サービス

各地のマラソン大会では、大会専用のLINEアカウントを作成して情報配信を行なっているところもあります。
弊社では[大会LINEアプリ](https://fujisan-marathon.jp/line/)により、レース情報をリアルタイムにLINEへ通知する、というサービスも提供しています。
（こちらはサービス終了しました、、残念）

# おわりに

ちょっとでも目を引く話はありましたでしょうか。
こんな話題で、ランニング好きのエンジニアコミュニティがもっと活発になると嬉しく思います！

あ、もしこういう仕事してみたい方いらしたら[こちら](https://www.wantedly.com/projects/1414331)からお声がけください。

マラソンだけでなく、日常のランニングやファンランイベントをもっと楽しめるように！と思って日々サービス開発しています！