清水理史の「イニシャルB」

ウチの「NAS」はめっちゃポケモンに詳しい!

「PokéAPI」のDockerコンテナをSynology NASで動かす

 NASがポケモンにどれくらい詳しいのかというと、800以上のポケモン、700以上のワザ、800以上のアイテムなどを、バージョンごと、言語別に保有しているのだ。その情報は、REST APIでいつでも引き出すことができる。

 もともとは教育用の目的でインターネット上で公開されている「PokéAPI」というサービスがあり、これを自宅のNASで動かせば、公開サーバーの制約なく利用可能になるわけだ。

インターネット上で公開されているPokéAPI

ポケモンマスターの前に、JSONマスターになれる!?

 「PokéAPI」は、教育向けとして公開されているポケモンのコンテンツだ。

 過去に発売された『ポケットモンスター』の各タイトルから集められた膨大なデータが保管されており、REST APIによって、手軽に情報を取り出すことができる。Pythonや.NETのWrapperも存在するなど、海外ではメジャーな存在だ。

 上記サイトでテストすることができるので、リクエストを投げてみれば分かるが、気軽な気持ちで使うと後悔するほど、膨大な情報を手に入れることができる。

9701lines!

 例えば、「https://pokeapi.co/api/v2/pokemon/pikachu/」などとすると、9701行ものJSONが吐き出される。しかも、ポケモンの名前を日本語で取得しようとすれば、そこからさらに別のリクエストで1197行のJSONを扱わなければならない。さらに、ワザの詳細な情報を参照するには……、とキリがない。

  「教育用って、本気で言ってますか?」

 というのが正直な感想だ。確かに、ここから欲しい情報を組み合わせて出力するには、配列から条件を指定してデータを取得し、さらにそのデータをキーとして別のJSONから情報を取り出す、という一連の作業が必要になる。ポケモンマスターになる前に「JSONマスター」になれること請け合いだ。

 実際、筆者も以下のように、UiPathを使ったお遊びワークフローを作ってみた。やろうと思えば、まだまだ情報を追加できるほど、「いじり甲斐」のあるサービスと言える。

インターネット上によくある診断サービスを真似たUiPathのワークフロー。名前を入力すると、ポケモンを答えてくれる。画像も表示できるが、もちろん、ここでは避けている
ワークフローの一部。詳細な作り方は、僚紙「窓の杜」で連載中の「無駄ロボット研究所」で取り上げる予定

 娘が小学生だったら、「今年の夏休みの自由研究、コレやらない?」と提案したくなるほどだ。

 しかしながらインターネット上のサービスであり、フェアユースポリシーに記載されている通り、高い負荷をあまりかけるのは好ましくないため、今回はSynologyのNAS上で動作させてみることにした。

 Dockerを使えば、数クリックだけで、あっという間に、あなたのNASがポケモンにめちゃくちゃ詳しくなるわけだ。

NAS上でDockerコンテナを作成する

 では実際に、NASでPokéAPIを動かしてみよう。

 と言っても、これは説明するまでもないほど簡単だ。イメージをダウンロードして、標準設定でDockerコンテナを作成して起動するだけでいい。

 Dockerに対応したSynologyのNASを用意して、「Docker」アプリを起動し、「レジストリ」から「pokeapi」と入力してイメージを検索する。いくつかヒットするが、今回は「stevenaldinger / pokeapi」を利用した。

ここでは、「pokeapi」と検索して一番上に表示されるDockerイメージをダウンロード

 Dockerイメージのダウンロードが完了したら、イメージを選択して「起動」ボタンを押し、コンテナを作成する。標準設定のままで、特に何もパラメーターを設定する必要はない。ウィザードを淡々と進め、Dockerコンテナを作成してしまおう。

Dockerコンテナを標準設定で作成

 最後にコンテナを起動すれば、作業は完了だ。起動したコンテナの画面で、自動的に割り当てられた「ローカルポート」を確認しよう。

アクセス用のポートを確認

 これで、NASのアドレスとローカルポートを組み合わせたアドレス、例えば「http://192.168.1.170:32768/」などとすれば、先に紹介したインターネット上のサービスと同様に、PokéAPIのサービスがNASで稼働する。

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」といった具合だ。

使い方はDocumentのリンクから参照可能

 一般的なウェブサービスのAPIのように、認証が必要なわけでもないし、パラメーターを指定して複雑なリクエストを生成しなくていいため、呼び出すのは簡単だ。

 ただし、リクエストにおいて情報を絞り込める範囲が限られるため、冒頭でも触れたように、戻ってくるJSONは膨大になる。

 このため、このサービスをうまく活用するコツは、JSONをいかに根気よく読み込めるか? がポイントになる。

膨大なJSONをどう扱うか?

ExcelでJSONを扱える

 取得したJSONデータの閲覧方法はいくつかあるが、今回は、割と身近なExcelを使ってみることにした。

Excelの「Power Query」を使う

 筆者は、これまでほとんど使ったことがなかったのだが、Excelには「Power Query」という機能が搭載されており、ここからREST APIの呼び出し、JSONの読み込み、データの抽出、テーブルへの変換などが可能となっている。

 具体的には、「データ」タブの「データの取得と変換」にある「ウェブから」をクリックし、API込みでPokéAPIのURLを指定する。

 例えば、ピカチュウの詳細な情報を取得するなら「http://192.168.1.170:32768/api/v2/pokemon-species/pikachu/」と指定すればいい。

NASにインストールしたAPIのURLを指定する

 すると、次のようなデータが表示される。「Record」や「List」となっているのは、配下に配列が含まれる部分。値が表示されている部分が、左側の名前に対応する値だ。例えば、「id」が「25」で、「base_happiness」が「70」となる。

データを確認する

 例として、ここからポケモンの説明文を取得してみよう。

 名前は、「flavor_text_entries」に格納されているが、ここは「List」になっているので、クリックして展開する。

「flavor_text_entries」に説明文が格納されている

 「Record」という文字だけが並んだ表になるが、これをテーブル化する。左上の「テーブルへの変換」をクリックすると、テーブル形式で表示されるが、まだ「Record」しか表示されないので、右上のアイコンをクリックし、展開する項目を選択して「OK」をクリックする。

「Record」と、さらに配下にデータが配列で格納されていることが分かる。左上のボタンでテーブル化する

 言語ごとの説明文が展開されたが、まだ続きがあるので、さらに右上のアイコンをクリックして展開する。また、「column1.version」も右上にアイコンがあるので、ここも再度展開する。

配下のデータをすべて展開する

 すべての列を展開したら、「閉じて読み込む」ボタンをクリックすると、Excelにテーブルとしてデータが展開される。

テーブルとして読み込まれる

 Excelのテーブルになってしまえば、あとの扱いは簡単だ。タイトル行でフィルターをかければ、必要なデータだけを参照できる。例えば言語で「ja」だけを選択すると、次のようになる。

フィルターをかけて情報を読み込める

 ここでは「moon」「alpha-sapphire」「omega-ruby」「y」「x」の各データが格納されているが、それぞれの説明文が違うことが分かる。

 これがポケモンごと、ワザごと、アイテムごと……、と格納されているのだから、膨大なデータになるのも納得だ。

この夏は、子どもと一緒にJSONに溺れよう

 というわけで、データを見るだけならExcelを使うのが簡単だが、実際には、このデータをプログラムで処理して、必要なデータを取り出す必要がある。

 PythonでもC#でも、好きな言語を使って処理すればいいが、先に紹介したUiPathで使う場合は、Linqを使ってデータを絞り込むのが簡単かもしれない(詳細は後日窓の杜で)。

 ただ、決して難しいわけではなく、単に根気がいるだけなので、子供と試行錯誤して楽しむには、とてもいい教材に思える。

 NASで動かせば、ほかの利用者に迷惑もかからないので、思う存分、リクエストを出せるので、実験にはお勧めだ。

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できる Windows 10 活用編」ほか多数の著書がある。