先月の話になりますが、「NPBイロレーティング」というサイトを作りました。それに関して思ったことをまとめていきます。
Facebook創始者のマーク・ザッカーバーグが学生時代に、大学の女子生徒の顔写真をユーザーに評価させてランキング化するサイトを作ったという逸話は、「ソーシャル・ネットワーク」という映画でも描写されたこともあり有名です。
自分が作りたかったのは、そのNPB(日本プロ野球)の野球選手バージョンです。2人の野球選手の成績の数字を表示し、どちらが凄いのか投票してもらう。その投票が大量に集まることで、世代の垣根を超えた最高のランキングができるのではないか?というものです。
想い
たとえば大谷翔平とイチローは、どちらもメジャーリーグでMVPを獲得していますが、トータルではどっちの方が凄いのでしょうか?
単年の成績を評価するか、長年続けた成績を評価するか……。色々な評価方法がありますし、野球ファンの間でも意見が分かれるところです。自分はいち野球ファンとして、それをユーザーの投票に委ねたらどうなるかに興味を持ちました。
野球マニアになればなるほど、野球選手の成績の数字を見るとワクワクするものです(少なくとも自分はそうです)。
野球というスポーツは、映像がもはや残っていない太古の選手でも、成績の数字だけは必ず残っているというのがいいところだと思います。
このようなサイトを作ったことには、名前の知られていない昔の選手を知る機会ができればいい、という想いが込められています。
妻には、「昔の知らない選手が出てきても面白くない」と言われましたが、そこは断固、「いいや昔の選手も混ぜる」、と主張を通しました。
もちろん、どんなにすごい成績でもレベルの低い古い時代の成績は価値がない、と思う人もいるでしょう。それもいいと思います。それを含めてランキングです。
協力
選手の成績データは、「日本プロ野球記録」様からお借りしました。
野球ファンの中では知らない人はほぼいない有名なサイトです。選手の個人成績だけでなく、各チームの全試合の勝敗など、膨大なデータが掲載されています。
データの利用許可をしてくださっただけではなく、連絡した際に「面白そう、出来たらぜひ見せて欲しい」と言ってくださり、とても親切に対応してくださいました。
素晴らしいデータサイトを運用されていることを含め、この場を借りてお礼申し上げます。
アーキテクチャ
アーキテクチャは、Go + React を使いました。Go、React、いずれも勉強中なので何か作って学びたい、というのが一番の理由です。
ただ、Go に関しては、運用上の都合もあります。
自分は Twitter を長年やっているものの、アニメの二次創作イラストを投稿するのが主で、多くの野球ファンに呼びかける術は持っていないです。
アクセス数がなんぼのサービスを作っておいてこう言うのもなんですが、あまりアクセス数は見込めないので、あくまで自己満足です。費用はかけたくないのが正直なところです。
なので、自分がすでに契約している、さくらの Web サーバで動作するものにしたいと思いました。
Go は標準モジュールだけで Web サービスを簡単に作ることができますが、その場合、ちょっとコードを変えるだけで、CGI として動かすことも出来ます。
クロスコンパイルしてさくらの Web サーバで動作するバイナリを作れば良いのです。
開発は普通に HTTP サーバーを立てて行い、実際の運用では CGI。これが一番やりやすいと思ったので、この方法に決めました。
このあたりのやり方に関してはやっていて色々知見が溜まったのですが、話が長くなるので後日記事にします。
その他いろいろ
イロレーティング
レーティング方式は、ザッカーバーグが使ったものと同じ、イロレーティングを使いました。
チェスなどのランキングにも使われるものですが、最近だとゲームで使われているのをよく目にするでしょうか。
自分はポケモンのランクバトルをやったことがあるのですが、ポケモンにも同じようなレーティングが使われています。
「1500」を初期値とし、勝てばレートが増え、負ければ減る。相手のレートが高く自分との差が大きいほど、勝った時のレートの増分が大きくなる。というものです。理屈はシンプルですね。
増分の計算式は複雑なものから簡易化したものまで色々あるのですが、そこまで精度が求められるものではないので、簡易なものを使いました。
ダミー投票
先程述べた通り、大量の投票がないとこのサービスは成り立ちません。
また、全選手のレートが「1500」の状態で始まったとして、ランキングとして見て面白いものになるまで相当な時間がかかり、ユーザーの関心を引くことができません。
そこで、ある程度のレートの初期値を決められるよう、成績のみで機械的にダミー投票をさせることにしました。
選手の成績を機械的に評価して勝敗をつけるだけなのですが、その微調整が難しかったです。
たとえば大谷翔平の成績は言うまでもなく素晴らしく、最上位にランクづけされるべき選手ですが、日本に居た期間は短いので通算成績では他の選手に劣ってしまいます。
メジャーリーグでの成績を高く評価するようにすれば良いのですが、そうすると、「アメリカで活躍、衰えたのち日本で数年プレーした外国人選手」みたいな選手の評価が異常に高くなってしまいます。
あくまでNPB出身選手のイロレーティングなので、日本で活躍していない選手はあまり高く評価したくないような気はします。
そんなことを考えて調整を続けたのですが、結局、自分の好き嫌いでターゲットを変えることになってしまい、うまくいきませんでした。
最終的な調整ではイチローと大谷翔平がトップを争うような形になったので、まあ、感覚的には妥当かな、と思うのですが、まだ上位に謎の外国人選手がいたりします。
どうすればよかったのか、未だにわかっていません。これは本当に難しいところです。
開発期間
コミットログによると作り始めたのは2022/11/4でした。
ちらっと話しましたが、私はポケモンが好きなので、2022/11/18のポケモン新作発売日が来てしまうと開発をしなくなると思いました。なので、11/18に間に合うよう急いで作りましたが間に合わず、ポケモンが発売してしまいました。
ポケモンが発売してからは案の定開発をしなくなり、再開したのは2023/3/26でした。発表は4/17です。
なので、トータルでは5週間前後というところでしょうか。もちろん仕事をしながらですし、それ以外の趣味もしていたので、全力で取り組んだらもっと早く出来たとは思います。
ただ、そこまで集中するのは自分にとって現実的ではないので、この規模でも知見ゼロから始めると1ヶ月以上はかかってしまうというのが現実なのかなと思います。
反響
残念ながら、このサービスは驚異的に人気がありませんでした!
数少ない、遊んでくれた人は面白いと言ってくれたので、アイデア自体は悪くなかったのかなと思うのですが、野球ファンに呼びかける手段がなさすぎるのが致命的でした。
実は以前にも野球に関するサービスを作ったことがあるのですが、それも惨敗だったので、勉強用とはいえもうちょっと何かあったかなという気はします。
過去に Ruby on Rails の練習として SNS を作った時も、ひどいクオリティのものでしたが、一定の反響は得られていましたし、やはり野球ファン、しかもそれなりにコアな野球ファンにしか響かないというのが難しかったのでしょう。
ただ、 Go や React の勉強には良かったので、これからも懲りずにサービスを作り続けたいと思います。
それでは。