Open Data API Portal
今回から内閣官房 情報通信技術(IT)総合戦略室が運営しているAPIプラットフォームサイト「Open Data API Portal」をいじっていこうと思います。
なんでそんなことを始めたのかというと、グラフを作ったり、機械学習したりとプログラミングを勉強していくに当たって、あるといいなと思うもの。
それは「データ」です。
特に大規模なデータになればなるほど、個人ではなかなか集められません。
かといって小規模なものだとあまり意味をなさない、なんてこともあります。
ということでどこかから大量のデータを引っ張ってくる必要があります。
ただし、あくまでも個人の勉強(趣味)の範囲、そんなにお金をかけたくないですし、どれだけお金がかかるか分からない状態で、できるかどうか分からないことを始めるのはまだまだ怖いわけです。
そこで無料で使えるデータを探していたところ、見つけたのが内閣官房 IT総合戦略室が運営しているAPIプラットフォームサイト「Open Data Portal」なのです。
しかもこのサイトは、単にデータをダウンロードするというわけではなく、API(Application Programming Interface)を介してデータにアクセスできるようになっています。
Twitter APIの時でもそうですが、安全にデータにアクセスできるように設定されているAPIは結構色々な場面で使っていくようなので、APIに慣れる練習もできるということで一石二鳥なのです。

ということで「データの取得」と「APIに慣れる」ということを中心に、Open Data API Portalを色々いじっていきたいなと思います。
それでは始めていきましょう。
Open Data API Portalへの登録
Open Data API Portalを使うには、ユーザー登録が必要になります。
ということでOpen Data API Portalにアクセスします。
そして右上の「Sign In」をクリックします。

サインイン用の画面に移動しますので、「Create an account」をクリック。

名前、性、メールアドレス、パスワードを入力し、「I agree to the terms.」のチェックボックスにチェックを入れ、「Create Account」をクリックします。

「確認メールを送りました」画面に移動しますので、メールボックスを確認します。

「cas-jp-opendataapiportal」からこんな感じのメールが届くので、URLをクリックします。

ちなみにメールはすぐ届きましたが、このリンクは10分しか使用できないので、すぐに進めるようにしてください。
これで登録は完了です。
API keyの取得
次にOpen Data API PortalのAPIに接続するためのAPI keyを取得します。
再度Open Data API Portalのページにアクセスし、右上の「Sing In」をクリックします。

サインイン画面で今度はメールアドレスとパスワードを入力し、「SING IN」をクリックします。

ログインに成功すると、右上の「Sing In」と書かれていたところが、登録したメールアドレスに変わります。

右上のメールアドレスをクリックして、「Apps」をクリックします。

まずは新規のアプリを登録するため、「+NEW APP」をクリックします。

アプリ名(App Name)とアプリの詳細(Description)を入力し、下にスクロールします。

APIsに使用できるAPIのリストがありますので、使用したいAPIの「Action」の列にある「Enable」をクリックします。
今回はとりあえず「00厚生労働省 新型コロナウイルス関連オープンデータAPI」を使用することにしましょう。

「Enable」をクリックするとStatusの列に「Save to enable」と表示されますので、右下の「SAVE」をクリックして、保存します。

画面が切り替わった後、下に画面をスクロールします。

「API keys」のところに先ほど実行可能にしたAPI用のAPI keyが表示されますので、コピーします。
(API keyの横の四角マークをクリックすることでコピーできます)

それでは先ほど登録したAPIの詳細を確認するため、上のメニューの「APIs」をクリックしてみましょう。
APIの詳細確認
APIsにはこのOpen Data API Portalで使用できるAPIが一覧・検索できるようになっています。
今回は試しに「00厚生労働省 新型コロナ関連オープンデータAPI」の詳細を見てみましょう。

アクセスすると左にアクセス可能なAPIのパス、中央から右に詳細が表示されます。
試しに「/death-case」(死亡者数)をクリックしてみます。

「HTTP request」に死亡者数を取得するためのURLが記載されています。
ただこのままでどう使えばいいのかわかりません。
その場合は右上の四隅だけの四角ボタンをクリックします。

こちらに幾つかの言語でのAPIのコマンドが記載されています。
使いたい言語はPythonなので「PYTHON」をクリックしてみましょう。

PythonでのAPI使用方法(デモ用プログラム)が表示されました。
これを元に次回、APIでアクセスして、情報を取得するためのプログラムを作成していくことにしましょう。

またこのOpen Data API Portalではこのウェブサイト上でどのようなデータが得られるのか確認することもできます。
その場合は右上の「AUTHORIZE」をクリックします。
サインインしていない場合は、先ほど取得したAPI keyを「Key」の欄にクリックします。

サインインしている場合はプルダウンメニューからアプリを線tなくするだけでAPI keyが入力されます。

入力が終わったら、入力欄かプルダウンメニューのすぐ下にある「AUTHORIZE」をクリックします。

「OK」をクリックし、「EXECUTE」をクリックすると、選択した情報(今回の場合は/death-case)が取得できます。

ただし結構混んでいるのか、「503 Service Unavailable」が結構な頻度で出ます。
その場合はまた時間を改めて試してみてください。

ちなみに情報の取得に成功すると「200 OK」と表示され、こんな結果が表示されます。

これでOpen Data API Portalの登録は完了です。
デモ用プログラムの確認
まずはデモ用プログラムの確認をしてみましょう。
デモ用プログラムの場所に関しては前回解説しましたが、おさらいということで再度解説していきます。
Open Data API Portalにアクセス。
上のメニューの「APIs」をクリック。

今回は「00 厚生労働省 新型コロナ関連オープンデータAPI」を使っていきますので、こちらをクリック。

とりあえず死亡者数のデータである「/death-case」を見てみましょう。

右上の四隅だけの四角マークをクリック。

今回言語はPythonですので、「PYTHON」をクリック。

こちらの赤枠内のプログラムがデモ用プログラムです。

デモ用プログラムを読み解いてみる
それではデモ用プログラムを読み解いていってみましょう。
# Demo code sample. Not indended for production use.
# See instructions for installing Requests module for Python
# http://docs.python-requests.org/en/master/user/install/
import requests
def execute():
requestUrl = "https://api.opendata.go.jp/mhlw/death-cases?apikey=[YOUR_API_KEY]"
requestHeaders = {
"Accept": "application/json"
}
request = requests.get(requestUrl, headers=requestHeaders)
print request.content
if __name__ == "__main__":
execute()
最初に上の4行のコメントアウトしてある部分(頭に#がついている行)はプログラムではなくコメントですので飛ばします。
インポートはHTTPの制御を行う「request」のみです。
import requests
実行する関数として「execute」が定義されています。
def execute():
最後の2行をみると、main関数が定義されています。
if __name__ == "__main__":
execute()
ということは「.pyファイル」を作成してダブルクリックで実行したり、他のプログラムから呼び出ししたりできるということです。

execute関数の中身を見ていきましょう。
まずはアクセスするURLの定義をしています。
requestUrl = "https://api.opendata.go.jp/mhlw/death-cases?apikey=[YOUR_API_KEY]"
このURLは先ほどのAPIの説明画面のこちらに記載されているものです。


URLの最後の方に「?apikey=[YOUR_API_KEY]」と書かれていますが、この[YOUR_API_KEY]の部分を自分のAPI keyに書き換えて使用します。
次に「requestHeaders」が定義されています。
requestHeaders = {
"Accept": "application/json"
}
ここはよく分かりませんが、URLにアクセスして、情報の送信を要求した際に、どのような形式でファイルを送ってもらうかということのようです。
request = requests.get(requestUrl, headers=requestHeaders)
print request.content
そしてrequests.getを使って、URLにアクセスし、request.contentで情報の中身を取得し、print関数で表示しています。
ちなみにprint関数の書き方から、この記事を書いている2021年7月現在主流なPython3ではなく、Python2を使っているようです。
Python3の書き方としてはみなさんご存知の通り「print(request.content)」ですね。
プログラムを組み替えてみる
それではデモ用プログラムを元に自分が使いやすい形のプログラムに組み替えていきましょう。
ちなみに私が使い難いなと思った点はこの3点です。
- 関数(main、execute)を使っている
- API keyがURLに組み込まれている
- 取得した情報がバイト形式になっている
ということでこんなプログラムに組み替えてみました。
import requests
import json
apikey = 'YOUR_API_KEY'
url = f'https://api.opendata.go.jp/mhlw/death-cases?apikey={apikey}'
requestHeaders = {
"Accept": "application/json"
}
request = requests.get(url, headers=requestHeaders)
if request.status_code == 200:
data = json.loads(request.content.decode())
print(data)
else:
print(request.status_code)
まず全体として関数を使用せずに書き直しました。
APIに慣れていない今の段階では、私にはこちらの方が流れが分かりやすいです。
そしてAPI keyの部分は分割してこのようにしました。
apikey = 'YOUR_API_KEY'
url = f'https://api.opendata.go.jp/mhlw/death-cases?apikey={apikey}'
API keyを書き換えるときも楽ですし、例えば他のファイルに記載しておいて、読み込ませて使用する場合でも変数apikeyに格納すればいいだけなので楽です。
「if request.status_code == 200:」以降は結構サーバーがダウンしていることが多いことから、レスポンスによって場合分けした部分です。
if request.status_code == 200:
data = json.loads(request.content.decode())
print(data)
else:
print(request.status_code)
もしサーバーがダウンしておらず、正常な情報が返ってきた場合、つまり「request.status_code == 200」だった場合は、「request.content.decode()」でバイト形式の文字を変換(デコード)します。
ちなみにデコードせずに「request.content」を表示するとこんな感じです。
print(request.content)
実行結果(適宜改行しています)
b'[{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/14","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80
\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/15","\xe6\xad\xbb
\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020
/2/16","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5
\xe4\xbb\x98":"2020/2/17","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":
"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/18","\xe6\xad\xbb\xe4\xba\xa1\xe8\
x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"2020/2/19","\xe6\xad\
xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97\xa5\xe4\xbb\x98":"
2020/2/20","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\xb0":"1"},{"\xe6\x97
\xa5\xe4\xbb\x98":"2020/2/21","\xe6\xad\xbb\xe4\xba\xa1\xe8\x80\x85\xe6\x95\x
b0":"1"},{"\xe6\x97\xa5\xe4\x (以下略)
頭のb’はバイト形式の文字であることを示しています。
変換するとデータはJSON形式なっているので、json.loadsで読み込み、変数dataに格納しました。
data = json.loads(request.content.decode())
こうすることで全体を表示するにはこうします。
print(data)
実行結果
[{'日付': '2020/2/14', '死亡者数': '1'}, {'日付': '2020/2/15', '死亡者数': '1'},
{'日付': '2020/2/16', '死亡者数': '1'}, {'日付': '2020/2/17', '死亡者数': '1'},
{'日付': '2020/2/18', '死亡者数': '1'}, {'日付': '2020/2/19', '死亡者数': '1'},
{'日付': '2020/2/20', '死亡者数': '1'}, {'日付': '2020/2/21', '死亡者数': '1'},
{'日付': '2020/2/22', '死亡者数': '1'}, {'日付': '2020/2/23', '死亡者数': '1'},
{'日付': '2020/2/24', '死亡者数': '1'}, (以下略)
また1日毎のデータはリスト形式として、古い順に保存されていますので、特定の日を取得したい場合はこのように取得します。
print(data[0])
実行結果
{'日付': '2020/2/15', '死亡者数': '1'}
リスト内のそれぞれの要素は辞書形式で「日付」と「死亡者数」が保存されているので、それぞれ取得したい場合はこのようにします。
print(data[0]['日付'])
実行結果
2020/2/14
print(data[0]['死亡者数'])
実行結果
1
ちなみにサーバーがダウンしている場合はそのステータスが表示されます。
if request.status_code == 200:
data = json.loads(request.content.decode())
print(data)
else:
print(request.status_code)
実行結果
503
これでだいぶ使いやすくなりました。
このように「503」が表示された場合は、サーバーがパンクしていますので、また時間が経ってから試してみてください。
これでデータの取得方法は分かりました。
データ取得のために、自分が使いやすいように書き換えたプログラムがこちらです。
<セル1>
import requests
import json
apikey = 'YOUR_API_KEY'
url = f'https://api.opendata.go.jp/mhlw/death-cases?apikey={apikey}'
requestHeaders = {
"Accept": "application/json"
}
request = requests.get(url, headers=requestHeaders)
if request.status_code == 200:
data = json.loads(request.content.decode())
print(data)
else:
print(request.status_code)
今回はここから得られたデータをグラフにしていきましょう。
グラフ化するためのデータの処理
まずはグラフ化するためにデータを処理していきます。
先ほどの<セル1>のプログラムを実行するとこんな結果が表示されます。
[{'日付': '2020/2/14', '死亡者数': '1'}, {'日付': '2020/2/15', '死亡者数': '1'},
{'日付': '2020/2/16', '死亡者数': '1'}, {'日付': '2020/2/17', '死亡者数': '1'},
{'日付': '2020/2/18', '死亡者数': '1'}, {'日付': '2020/2/19', '死亡者数': '1'},
{'日付': '2020/2/20', '死亡者数': '1'}, {'日付': '2020/2/21', '死亡者数': '1'},
{'日付': '2020/2/22', '死亡者数': '1'}, {'日付': '2020/2/23', '死亡者数': '1'},
{'日付': '2020/2/24', '死亡者数': '1'}, {'日付': '2020/2/25', '死亡者数': '1'},
{'日付': '2020/2/26', '死亡者数': '1'}, {'日付': '2020/2/27', '死亡者数': '3'},
{'日付': '2020/2/28', '死亡者数': '4'}, {'日付': '2020/2/29', '死亡者数': '5'},
{'日付': '2020/3/1', '死亡者数': '5'}, (以下略)
つまり1日毎のデータがリスト形式で格納されていて、その1日のデータは辞書形式で「日付」と「死亡者数」として格納されているわけです。
そのため、最初の日の日付、死亡者数を取得するにはこう表記しました。
print(data[0]['日付'])
実行結果
2020/2/14
print(data[0]['死亡者数'])
実行結果
1
このままではmatplotlibでグラフ化できませんので、日付と死亡者数をそれぞれリストへと変換する必要があります。
ということでfor文を使ってこんな感じにしてみました。
<セル2>
date = []; death = []
for oneday in data:
date.append(oneday['日付'])
death.append(int(oneday['死亡者数']))
for文で1日ごとのデータを取得し、辞書のキーでそれぞれ日付と死亡者数を取得します。
そしてそれぞれをリストdataとdeathに格納していきます。
これで日付だけのリストと死亡者数だけのリストを作ることができます。
グラフ化
次にmatplotlibを使ってグラフ化していきます。
matplotlibに関しては、このシリーズの記事で解説していますので、良かったらどうぞ。

ということで作成したプログラムがこちら。
<セル3>
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
fig = plt.figure()
plt.clf()
plt.plot(date, death)
plt.xticks(np.arange(0, len(date)+1, 30),rotation=90)
plt.tight_layout()
最後は
今回はインポートするライブラリとしては、numpyとmatplotlibです。
import numpy as np
from matplotlib import pyplot as plt
そしてJupyter notebook上でグラフを表示するためのマジックコマンドを記載しています。
%matplotlib inline
最初の2行はmaplotlibでグラフ表示する際のお決まりのコマンドです。
fig = plt.figure()
plt.clf()
1行目でグラフ表示の領域を設定し、2行目で領域内のグラフを初期化しています(念の為)。
グラフ作成のコマンドは「plt.plot(Xの値、Yの値)」なのでこれだけ。
plt.plot(date, death)
そして最後のコマンドでグラフを表示です。
plt.tight_layout()
ちなみにグラフの表示には「plt.show()」でもいいのですが、たまに軸名やラベルがはみ出します。
その場合「plt.tight_layout()」を使うと、はみ出さないように調節してくれるので、おすすめです。
このプログラムを実行し、グラフを表示したのがこちらです。

このグラフを見て初めて「死亡者数」は累積の死亡者数だと気づいたのは内緒です。
X軸の表示を飛び飛びにする
実は先ほどのプログラムの解説の中で1行飛ばしました。
それはこちらの行です。
plt.xticks(np.arange(0, len(date)+1, 30),rotation=90)
ここではX軸に表示する値の調整を2つ行なっています。
一つ目が「np.arange(0, len(date)+1, 30)」の部分、二つ目が「rotation=90」の部分です。
二つ目の「rotation」に関しては前に一度使っていたりしますが、X軸の値を表示する角度を変えることができるオプションです。

先ほどは「rotation=90」として90度傾けていますが、オプションを付けていない、つまりデフォルトである「rotation=0」の場合はグラフの表示はこうなります。
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
fig = plt.figure()
plt.clf()
plt.plot(date, death)
plt.xticks(np.arange(0, len(date)+1, 30))
plt.tight_layout()
実行結果

X軸の値が重なってしまって見えませんね。
もう一つ、45度にしてみるとどうなるでしょうか。
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
fig = plt.figure()
plt.clf()
plt.plot(date, death)
plt.xticks(np.arange(0, len(date)+1, 30), rotation=45)
plt.tight_layout()
実行結果

こちらでもなかなかいい見栄えです。
通常は指定なしの0度か45度、90度あたりを使うのがいいのではないでしょうか。
解説が逆になってしまいましたが、次に一つ目の「np.arange(0, len(date)+1, 30)」を解説していきます。
もしこのオプションを付けない場合はこうなります。
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
fig = plt.figure()
plt.clf()
plt.plot(date, death)
plt.xticks(np.arange(0, len(date), 30), rotation=90)
plt.tight_layout()
実行結果

そう、X軸の値が全て表示されてしまい、なにも見えなくなってしまうのです。
ということで「np.arange(0, len(date)+1, 30)」のオプションはX軸の値を飛び飛びで表示するためのものなのです。
np.arrange自体はrangeと似た機能を持つコマンドで、「np.arange(開始の数, 終了の数, ステップ)」で、飛び飛びの値を取得することができます。

「np.arange(0, len(date)+1, 30)」の場合は、0からdataの要素数+1までを30刻みで取得していく、ということになります。
そのため、最初のプログラムの実行結果では30日刻みでX軸が表示されていたというわけです。

ちなみに調べた時にnp.arangeを使っているサイトが多かったので、np.arangeを使ってしまいましたが、rangeでも問題なく表示されました。
from matplotlib import pyplot as plt
%matplotlib inline
fig = plt.figure()
plt.clf()
plt.plot(date, death)
plt.xticks(range(0, len(date), 30), rotation=90)
plt.tight_layout()
実行結果

これでまずは累積の死者数のグラフを作成することができました。
日々の死亡者数を計算
それでは累積の死亡者数から日々の死亡者数を計算していきます。
そのためにはある日の累積死亡者数から前日の累積死亡者数から引くことで、特定の日の死亡者数を取得することができます。
最終的にはnumpyを使うことで、同じインデックスの要素同士を引き算することができるので、まずは1日ずらしたリストを作成します。
ということでこんな感じ。
import copy
prev_death = death.copy()
prev_death.insert(0,0)
del prev_death[-1]
sub_death = np.array(death) - np.array(prev_death)
print(sub_death)
死亡者数を1日ずらしたリストを作成するため、まずは「prev_death = death.copy()」で死亡者数のリストをコピーしています。
ここで新しく「copy」モジュールを使っているので、少し解説してみることにします。
copyモジュール
「copy」モジュールを使って、死亡者数のリストをコピーしている部分はここです。
import copy
prev_death = death.copy()
ここで重要なのは「.copy()」でコピーすることです。
例えばリスト「a」があった時に、リスト「a」と同じリスト「b」を作りたいとします。
そこで「b = a」としてしまうと、リスト「b」を変更した場合、リスト「a」まで変更されてしまいます。
試してみましょう。
a = [1, 2, 3, 4, 5]
b = a
b.append(6)
print(f'a:{a}')
print(f'b:{b}')
実行結果
a:[1, 2, 3, 4, 5, 6]
b:[1, 2, 3, 4, 5, 6]
a=[1, 2, 3, 4, 5]というリストを作って、「b = a」としてリストbにコピーしました。
そしてリストbに「6」を追加して、printでリストaとリストbを表示しています。
するとリストaもリストbも「1, 2, 3, 4, 5, 6」と6が追加されてしまっています。
これは「b = a」はコピーしたのではなく、「同じもの」と定義したことになることから起こります。
そこで必要なのがその状態をコピーする「.copy()」というわけです。
同じように試してみましょう。
import copy
a = [1, 2, 3, 4, 5]
b = a.copy()
b.append(6)
print(f'a:{a}')
print(f'b:{b}')
実行結果
a:[1, 2, 3, 4, 5]
b:[1, 2, 3, 4, 5, 6]
先ほどと同じようにa=[1, 2, 3, 4, 5]というリストを作り、今度は「.copy()」でコピーします。
そしてリストbに「6」を追加し、printで表示しています。
結果は見ての通り、リストaでは[1, 2, 3, 4, 5]なのに対し、リストbでは「6」が追加された[1, 2, 3, 4, 5, 6]になっています。
このように内容は同じだけども、同一ではないリストを作成したい場合は「.copy()」を使います。
リストへの追加・削除
次にコピーしたリスト「prev_death」の値を1日後ろにずらします。
つまりリストの最初に要素を一つ「0」を追加し、最後の要素を削除します。
prev_death.insert(0,0)
del prev_death[-1]
このようにリストの特定のインデックスに要素を追加する場合は「リスト名.insert(挿入するインデックス番号, 挿入する要素)」とします。
また要素を削除する場合は少し書き方が特殊で「del リスト名[インデックス番号]」とします。
これで1日ずれたリストが作成できました。
numpyを使った要素ごとの計算
次にnumpyを使って、要素ごとを引き算していきます。
先ほどのリストdeathとリストprev_deathは通常のリストですので、「np.array(リスト名)」とすることで、numpyのリストに変換します。
そして単純に引き算することで、同じインデックス番号の要素ごとを引き算したリストを作成することができます。
sub_death = np.array(death) - np.array(prev_death)
print関数で表示してみるとこんな感じです。
print(sub_death)
実行結果
[ 1 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 0 1
0 0 0 0 0 0 1 2 3 3 4 2 1 2 4 1 2 2
2 1 5 1 1 2 1 3 3 2 2 1 3 3 6 1 3 7
1 4 3 6 4 4 7 10 17 12 6 7 10 15 91 10 30 17
14 3 25 13 26 17 26 34 18 11 22 8 49 13 8 22 25 19
23 15 19 5 14 8 6 19 12 12 10 16 12 9 7 12 5 1
2 6 3 4 7 2 0 0 3 1 2 2 1 0 2 4 4 0
17 1 0 2 8 4 1 2 0 1 0 2 1 1 1 0 0 1
2 1 1 0 0 0 0 2 1 0 0 0 0 3 1 1 2 1
3 0 2 3 3 2 5 0 1 4 6 4 7 6 1 7 5 7
4 10 12 3 11 16 13 16 11 14 7 5 15 13 17 12 17 9
15 17 11 12 11 19 8 6 14 16 13 6 11 16 3 9 10 12
(以下略)
グラフ化
最後はグラフ化です。
fig = plt.figure()
plt.clf()
plt.plot(date, sub_death)
plt.xticks(np.arange(0, len(date)+1, 30),rotation=90)
plt.tight_layout()
実行結果

日々の死亡者数をグラフ化することができました。
本当はもっと色々とやりたかったのですが、どうもこのAPIは接続できない時間が多くて、作業時間が限られてしまうため、これ以上使っていくのに耐えれなくなってきました。
ということでOpen Data API Portalに関しては、一旦ここで終了とします。
せっかくいいポータルサイトなので、安定したらもっと使って試していきたいと思います。
ではでは今回はこんな感じで。
コメント