清水理史の「イニシャルB」
ウチの「NAS」はめっちゃポケモンに詳しい!
「PokéAPI」のDockerコンテナをSynology NASで動かす
2019年6月17日 06:00
NASがポケモンにどれくらい詳しいのかというと、800以上のポケモン、700以上のワザ、800以上のアイテムなどを、バージョンごと、言語別に保有しているのだ。その情報は、REST APIでいつでも引き出すことができる。
もともとは教育用の目的でインターネット上で公開されている「PokéAPI」というサービスがあり、これを自宅のNASで動かせば、公開サーバーの制約なく利用可能になるわけだ。
ポケモンマスターの前に、JSONマスターになれる!?
「PokéAPI」は、教育向けとして公開されているポケモンのコンテンツだ。
過去に発売された『ポケットモンスター』の各タイトルから集められた膨大なデータが保管されており、REST APIによって、手軽に情報を取り出すことができる。Pythonや.NETのWrapperも存在するなど、海外ではメジャーな存在だ。
上記サイトでテストすることができるので、リクエストを投げてみれば分かるが、気軽な気持ちで使うと後悔するほど、膨大な情報を手に入れることができる。
例えば、「https://pokeapi.co/api/v2/pokemon/pikachu/」などとすると、9701行ものJSONが吐き出される。しかも、ポケモンの名前を日本語で取得しようとすれば、そこからさらに別のリクエストで1197行のJSONを扱わなければならない。さらに、ワザの詳細な情報を参照するには……、とキリがない。
「教育用って、本気で言ってますか?」
というのが正直な感想だ。確かに、ここから欲しい情報を組み合わせて出力するには、配列から条件を指定してデータを取得し、さらにそのデータをキーとして別のJSONから情報を取り出す、という一連の作業が必要になる。ポケモンマスターになる前に「JSONマスター」になれること請け合いだ。
実際、筆者も以下のように、UiPathを使ったお遊びワークフローを作ってみた。やろうと思えば、まだまだ情報を追加できるほど、「いじり甲斐」のあるサービスと言える。
娘が小学生だったら、「今年の夏休みの自由研究、コレやらない?」と提案したくなるほどだ。
しかしながらインターネット上のサービスであり、フェアユースポリシーに記載されている通り、高い負荷をあまりかけるのは好ましくないため、今回はSynologyのNAS上で動作させてみることにした。
Dockerを使えば、数クリックだけで、あっという間に、あなたのNASがポケモンにめちゃくちゃ詳しくなるわけだ。
NAS上でDockerコンテナを作成する
では実際に、NASでPokéAPIを動かしてみよう。
と言っても、これは説明するまでもないほど簡単だ。イメージをダウンロードして、標準設定でDockerコンテナを作成して起動するだけでいい。
Dockerに対応したSynologyのNASを用意して、「Docker」アプリを起動し、「レジストリ」から「pokeapi」と入力してイメージを検索する。いくつかヒットするが、今回は「stevenaldinger / pokeapi」を利用した。
Dockerイメージのダウンロードが完了したら、イメージを選択して「起動」ボタンを押し、コンテナを作成する。標準設定のままで、特に何もパラメーターを設定する必要はない。ウィザードを淡々と進め、Dockerコンテナを作成してしまおう。
最後にコンテナを起動すれば、作業は完了だ。起動したコンテナの画面で、自動的に割り当てられた「ローカルポート」を確認しよう。
これで、NASのアドレスとローカルポートを組み合わせたアドレス、例えば「http://192.168.1.170:32768/」などとすれば、先に紹介したインターネット上のサービスと同様に、PokéAPIのサービスがNASで稼働する。
話は逸れるが、DockerはこのようにNASの可能性を広げてくれる非常に便利なサービスなので、NASを購入するなら、対応モデルを購入することを是非お勧めしたい。SynologyのNASであれば、Dockerに対応するのはミドルレンジ以上のモデルになるが、絶対に使える方が面白い。
APIを試してみる
さて、PokéAPIのDockerコンテナを起動したら、インターネット上のサービスと同じく、トップページの「Try it now!」でAPIを試すことができる。ただ、若干バージョンが違うためか、デザインなどが異なるようだ。
APIの詳細は、「Document」のリンクから参照できる仕様書に記載されているが、その仕様は非常に単純だ。基本的には「/pokemon/pikachu」のように、「機能名/名前またはID」の形式で指定する。
ポケモンの概要なら「/pokemon」、アイテムなら「/item」、ワザなら「/move」といった具合だ。
一般的なウェブサービスのAPIのように、認証が必要なわけでもないし、パラメーターを指定して複雑なリクエストを生成しなくていいため、呼び出すのは簡単だ。
ただし、リクエストにおいて情報を絞り込める範囲が限られるため、冒頭でも触れたように、戻ってくるJSONは膨大になる。
このため、このサービスをうまく活用するコツは、JSONをいかに根気よく読み込めるか? がポイントになる。
ExcelでJSONを扱える
取得したJSONデータの閲覧方法はいくつかあるが、今回は、割と身近なExcelを使ってみることにした。
筆者は、これまでほとんど使ったことがなかったのだが、Excelには「Power Query」という機能が搭載されており、ここからREST APIの呼び出し、JSONの読み込み、データの抽出、テーブルへの変換などが可能となっている。
具体的には、「データ」タブの「データの取得と変換」にある「ウェブから」をクリックし、API込みでPokéAPIのURLを指定する。
例えば、ピカチュウの詳細な情報を取得するなら「http://192.168.1.170:32768/api/v2/pokemon-species/pikachu/」と指定すればいい。
すると、次のようなデータが表示される。「Record」や「List」となっているのは、配下に配列が含まれる部分。値が表示されている部分が、左側の名前に対応する値だ。例えば、「id」が「25」で、「base_happiness」が「70」となる。
例として、ここからポケモンの説明文を取得してみよう。
名前は、「flavor_text_entries」に格納されているが、ここは「List」になっているので、クリックして展開する。
「Record」という文字だけが並んだ表になるが、これをテーブル化する。左上の「テーブルへの変換」をクリックすると、テーブル形式で表示されるが、まだ「Record」しか表示されないので、右上のアイコンをクリックし、展開する項目を選択して「OK」をクリックする。
言語ごとの説明文が展開されたが、まだ続きがあるので、さらに右上のアイコンをクリックして展開する。また、「column1.version」も右上にアイコンがあるので、ここも再度展開する。
すべての列を展開したら、「閉じて読み込む」ボタンをクリックすると、Excelにテーブルとしてデータが展開される。
Excelのテーブルになってしまえば、あとの扱いは簡単だ。タイトル行でフィルターをかければ、必要なデータだけを参照できる。例えば言語で「ja」だけを選択すると、次のようになる。
ここでは「moon」「alpha-sapphire」「omega-ruby」「y」「x」の各データが格納されているが、それぞれの説明文が違うことが分かる。
これがポケモンごと、ワザごと、アイテムごと……、と格納されているのだから、膨大なデータになるのも納得だ。
この夏は、子どもと一緒にJSONに溺れよう
というわけで、データを見るだけならExcelを使うのが簡単だが、実際には、このデータをプログラムで処理して、必要なデータを取り出す必要がある。
PythonでもC#でも、好きな言語を使って処理すればいいが、先に紹介したUiPathで使う場合は、Linqを使ってデータを絞り込むのが簡単かもしれない(詳細は後日窓の杜で)。
ただ、決して難しいわけではなく、単に根気がいるだけなので、子供と試行錯誤して楽しむには、とてもいい教材に思える。
NASで動かせば、ほかの利用者に迷惑もかからないので、思う存分、リクエストを出せるので、実験にはお勧めだ。