【個人開発】ボードゲームポータルサイトのデータを可視化するサービスを作りました

# はじめに
個人開発でサービスをリリースしたので記事にまとめます。
最近[こちらの記事](https://globis.jp/article/6567)などでキャリアの構築には専門性の掛け算が大事という話をよく聞くので私がそこそこ専門性を持っている『IT×ボードゲーム』なサービスを作りました。
作ったサービスはこちら → https://joururi-soft.com
以下は閲覧オンリーユーザーのログインに必要な情報です。

```
ユーザー名：DilemmaHoldem
パスワード：texasholdem
```

# どんなサービスを作ったか
『[盤上遊戯の編纂者-BoardGameAnalytics-](https://joururi-soft.com)』と自称しているサービスを開発しました。（OSS の BI ツールにデータ乗せて公開しただけなのでサービスと呼んで良いのかアレですが……）
このサービスでは『[BoardGameGeek(BGG)](https://boardgamegeek.com/)』という海外のボードゲームサイトからボードゲームのジャンル、発売年等をデータベース化しそれらのデータを可視化することができます。
今回このサービスを作ったきっかけは私自身が『[浄瑠璃ソフト天遊団](http://gamemarket.jp/booth/gm2171/)』というサークルで同人活動としてボードゲーム制作を行っており、制作のネタを考えるのにこんなサービスが欲しいと思ったからです。
（ずっと誰かに作ってもらいたかったのですが誰も作ってくれないので自分で作りましたｗ）
以下は可視化の一例です。
![2019-05-20 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/6b5aca6b-6310-2b2b-460b-fc1dfabd5e9c.png)
こちらはボードゲームのメカニクス（『協力ゲーム』『ダイスロール』等のゲームのルールを細分化したもの）を横軸、評価レートを縦軸、登録ゲーム数をマスの色の濃さで表したヒートマップです。
このヒートマップで一番色の濃いマスが高い位置に出ているほど高い評価を得られるメカニクスであるという仮説が立てられます。
![2019-05-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/1a6b92aa-179b-54c0-26a9-90df7108f424.png)
次に、この図は横軸に発売年、縦軸に各メカニクスの発売ゲーム数を積み重ねたエリアグラフです。
直近数年で幅が広がっていってきているメカニクスは最近人気のメカニクスと見て良いでしょう。
逆に最近幅が狭くなってきているメカニクスは最近あまり人気がないと考えられます。

こんな感じの可視化情報があれば、どんなゲームが売れるか仮説を立てて実際のボードゲームを作ることができるのでボドゲ制作者の方々が幸せになるはずです。少なくとも私は幸せです。

# 技術概要
技術要素としては以下の図の通りです。
![2019-05-20 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/27ef7475-646c-8b92-e656-25f64f3e4ca4.png)
Scala + PhantomJS でバッチ処理を作成し、MySQL のデータベースにテーブルを作成。
Docker コンテナ上で動いている BI ツールの Superset でデータベースを参照・可視化を行います。
ユーザー登録しているユーザーは権限に応じてデータの参照やダッシュボードの作成が可能です。

# それぞれの要素
使った技術要素は以下の通りです。
それぞれの項目を見ていただければわかると思いますが色々な記事から情報を取得しているので多分その気になれば誰でも似たようなサービスは作れます。

## 独自ドメイン
[お名前.com](https://www.onamae.com/) で独自ドメインを取得しました。
無料のドメインもあるらしいのですがよく分からなかったので有料ドメイン取っちゃいました。
あと、[こちらの記事](https://qiita.com/okamu_/items/ea4ef4c060fc45662384)とかで有料ドメインを取得するとやる気が出ると見たのでまず一番最初にドメインを購入して退路を潰しました。
実際リリースまでこぎつけることができたのでこれは有効だったと思います。
~~これが本当のドメイン駆動開発（ﾎﾞｿｯ~~

## データ収集バッチ
```
メイン言語：Scala
ライブラリ：scala-scraper（スクレイピング）、phantomjsdriver（XML API 叩く用）、scalikeJDBC（DB 接続）等
```
言語は Scala です。最近一番使うことが多いというだけの理由です。
BGG では [XML API](https://boardgamegeek.com/wiki/page/BGG_XML_API2) が公開されておりこの API で各ゲームの評価レート、メカニクス等を取得できます。
バッチ処理ではこの API を叩いてデータを収集、MySQL に蓄積します。
PhantomJS が既に開発終了しているということはバッチを作成し終わってから知りました……。
今だと puppeteer とかになるのでしょう。
このバッチは現状ローカル環境で動かしてデータを集め、ダンプデータをリモートの MySQL に投入しています。
ソースコードはもう少し整理したら github で公開します。

### 参考にした記事
[scala-scraperによるWebスクレイピング](https://qiita.com/harry0000/items/0c4e37ebb71d102cf8b0)
[Scala で PhantomJS を使う](https://qiita.com/hoxo_m/items/b7a25b7e7924f614c930)

## サーバ
サーバは GCE の small インスタンスです。
今はこのスペックで十分動きますが今後利用者が増加するようなことがあればスペック上げます。
ちなみに無料枠の micro だとメモリ足りなくて MySQL が起動しませんでした:sob:
OS は特にこだわり無いのですが今までの仕事で一番使ってきた CentOS を使いました。
できるだけ新しいバージョンで勉強したかったのでバージョンは 7 です。
GCP のロードバランサを使って https 対応も行っています。
他にも SSH 接続のデフォルトポートを潰したり、http のポート開けたり色々設定してます。
本当は MySQL サーバと BI ツールのサーバは分けた方が良いのでしょうが現状一緒のサーバに乗せています。

### 参考にした記事
[GCE の無料枠のサーバを立るときに、初見でハマりそうなところ](https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd)
[Google Cloud Platform (GCP) で独自ドメインを設定する](https://qiita.com/tomy0610/items/adc839be9d100c0daf96)
[GCP managed SSL(β版)を利用したhttpsサーバ構築](https://qiita.com/koshilife/items/a75a69d03e2524f33c8e)

## データベース
データベースは最新版を使った方が今後に活きるやろの精神で MySQL 8 を使用しています。
BI ツールから接続するために develop というリモート接続可能なユーザーを追加しています。
ポート開けたり、外部接続可能なユーザー作ったりといったことを全然知らなかったので今回のサービス開発では MySQL の環境を整えるのが多分一番苦労しました。

### 参考にした記事
[MySQL 8.0 初期設定覚書](https://qiita.com/nobu-maple/items/3849b2161a21f90ae298)
[Mysqlのgrant文でユーザ作成&権限付与しようとしてエラーが出たのでメモ](https://qiita.com/yamateion/items/5509484aaf1a02e9cc57)
[centos7 mysql 外部接続を許可しよう](https://qiita.com/ma7ma7pipipi/items/3757fef14fd6de2b94b5)

## BI ツール
色々調べた結果 Superset が良さそうだったのでそれを使うことにしました。
有名どころは Re:dash とかだと思うのですが仕事で使っていて可視化の種類があまり多くないこと、SQL スキルにかなり依存する等ちょっと微妙に思うところが多かったのでそれらが良い感じに緩和されていそうな Superset を使うことにしました。
ただ、実際使ってみるとやっぱり SQL のスキルはある程度必要だったのでちょっと微妙かも……。
今まで Docker を使ったことがなかったのでインストールは Docker コンテナ上に行いました。とても簡単でした。

### 参考にした記事
[Dockerコマンドメモ](https://qiita.com/curseoff/items/a9e64ad01d673abb6866)
[BIツール superset をdockerでインストール](https://qiita.com/suzukihi724/items/07b6a871af9ce593d3af)
[Supersetを導入して、DBを可視化してみた](https://qiita.com/ikotan69/items/10dd7a1cb8a396557ca9)

# サービスをリリースしてみて思ったこと
主に GCP のお陰で全体的に割と簡単に開発が進められたのですが、私はアプリのエンジニアなのでインフラ周りは超苦労しました。
特に MySQL のインストールから設定辺りは一歩進むごとに罠にハマるのを繰り返していたので作りたいもののゴールを描いていないと途中で投げ出していたような気がします。
しかし、ほとんど全て自分で作ったお陰で少しずつ進めるうちに徐々に目標に近づいていく感覚はとても感じたので楽しく開発できました。
そして、今回は OSS や GCP をふんだんに使ったお陰で個人としてはそれなりのスピードと品質でリリースまでいけたと思います。恐らく総作業時間は二週間前後くらいではないかと？
GCP 等は普段の仕事でも使うときは使うのでそういったノウハウを作りながら学べたのはかなり良い学習になったと思います。

# 今後の展望
可視化したデータはまだまだ少ないのでこれからどんどん増やしていきます。そのために今はデータ可視化について勉強中です。
あと、このサービスを作ったそもそもの目的はボードゲームの開発を行うことなのでこのサービスを使ってデザインしたボードゲームで一発ブチ当てたいです。今まで作った作品たちは大ヒットとまでは言えないので……。
そして、このサービスの発表のために 2019/5/25(土) に東京ビッグサイトで行われる[ゲームマーケット](http://gamemarket.jp/)という同人ボドゲの即売会にサークル参加してきます。ブース番号は『Q19』です。
即売会なのにゲームを売らないという酔狂なブースゆえに多分暇してると思うので技術の話とかしに遊びに来ていただけると喜びます。

以上、お読みいただきありがとうございました！