見出し画像

【高校情報1】データの表現形式・離散グラフ・隣接行列・WebAPI・JSON・XML・NoSQL

◆◆はじめに◆◆


文部科学省:高等学校情報科「情報1」教員研修用教材  
第4章 情報通信ネットワークとデータ活用
 学習21 データの表現形式・離散グラフ・隣接行列・WebAPI・JSON・XML・NoSQL(前回の続きから)

高等学校情報科「情報Ⅰ」教員研修用教材(本編):文部科学省
https://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1416756.htm

大学入学共通テストの試作問題でWebサーバのアクセスログ解析が出題されていたので、WebAPIについてはHTTPリクエストとレスポンスの説明
GETとPOSTの違いについては独自に追加しました。

PythonプログラムはPEP8チェッカーで沢山エラーが出たので、エラー部分は解消させました。


◆◆動画解説◆


◆◆文字おこし◆◆

前回は、リレーショナルデータベースやSQLについて学んでいったけど
今回はデータの様々な表現形式をWebAPIやPythonを使って学んでいこう。

SNS での人のつながりや鉄道の路線などのような関係性について図を使って表現してみよう。
aからfまでの人がいたとしよう。

画像1

この図の見方は、例えば
aの人はbさん、cさん、dさんとつながっている。
bさんはaさんとdさんとつながっている
cさんはaさんとdさんとつながっている
dさんはaさんbさんcさんeさんとつながっている
eさんはdさんとfさんとつながっている
fさんはeさんとだけつながっている。

a からf までの人を表す丸を頂点(バーテックスまたはノード),
人とのつながりを表す線分を辺(エッジ)といい,頂点と辺で構成された図を「離散グラフ」という。この図は特に方向性を考えない無向グラフになっている。
人のつながりでの片想いの関係や一方通行の道路のような,方向性を考慮した有向グラフを考えることもできるんだ。

画像2

離散グラフをコンピュータ上で表現するには,コンピュータで扱うことができるデータ形式で表現する必要がある。一つの例として,2 次元配列を用いて表現することができる。
頂点どうしがつながっていれば1,つながっていなければ0 として表現する。
例えばfを基準につながっているのは、eだよねだから、eとfのつながりを表す部分は双方向で考えると2箇所あって両方1になっているのが分かるね。
このように表現する方法を隣接行列という。隣接行列を使って表現する場合,辺の本数が少ない場合には,隣接行列の要素の多くが0 である疎行列になってしまう。

画像3


そこで,接続している頂点のリストを頂点ごとにデータとして,隣接リストとして表現する方法ががある。
例えば、頂点a には頂点b とcとd が接続していることをしめしている。
{a : [ b,c,d ] , b : [ a , d ] , c : [ a , d ] , d : [ a , b , c , e ] , e : [ d , f ] , f : [ e ] }
 隣接リストでは,注目している頂点という項目と,接続している頂点のリストという値との組として表現されている。
このように,項目(キー)と値(バリュー)との組により表現されるデータの形式を
「キー・バリュー形式」という。
 隣接リストの形式では,疎行列のような不要なデータについては解消されるが,頂点同士が接続しているかどうかを調べるには隣接リストをたどって調べる必要が生じる。


今度は、WebAPIによるデータ取得の復習をしていこう。
WebAPIが何かは、コンピュータとプログラミング学習の回で説明しているからその動画を見てね。
今回はYAHOO!JAPAN デベロッパーネットワークに登録して,気象情報API を使ってJSON 形式とXML 形式のデータを取得する。

利用のためにはYAHOO!JAPAN のユーザ登録をしてから,ログインしてクライアントID の申請を行う。API を使えるようにするため,
「新しいアプリケーションを開発」の登録をこのURLから行う必要がある。
https://e.developer.yahoo.co.jp/register
クライアントIDは他の人には教えたらいけない情報だから、ここでは隠しておくね。

ブラウザからWeb API を利用して60 分後までの降水量の予測値のデータを
XML 形式とJSON 形式で取得する。

まえに、WebAPIについて説明したときに、キー値とその値を受け渡したよね。
今回は、クライアントIDと天気情報を取得したい緯度経度とjsonまたはxmlの取得形式を送信する必要がある。

画像4

HTTPのプロトコルを使って、相手にデータ取得を問い合わせる方法をHTTPリクエスト、その返却をHTTPレスポンスという。

このリクエストデータを受け渡す代表的な方法として、GETとPOSTというものがある。

画像5


GETはURLの、?マーク以降に キー値 = 受け渡す値 の形でつなげていく方法なんだ。複数ある場合は&でつなぐ
この部分をクエリ文字列とかクエリストリングという。

もう一つはPOSTだけど、これはURLには受け渡す値を記述せずに、HTTPリクエストを行うときに受け渡されるデータの、ボディ部といわれる箇所に格納される。
だから、URLからは受け渡す値は推測できない。

今回はGETを使っていこう。

画像6

まずは、東京の緯度経度で取得形式はXMLでGETリクエストを送信するね。

https://map.yahooapis.jp/weather/V1/place?appid=【自分のID】&coordinates=140,36&output=xml

値が返却されたけどこれだと分かりずらいから、
以前説明した分かりやすい形に直してくれるサイトで試そう。

親の要素の中に、子の要素があることが分かるね。

次にJSON形式取得でも試していこう
これもXMLと形は違うけど、取得できている項目はXML形式と同じ。
プログラム開発をするとき、どの形式で取得するかでプログラム内容が変わってくるからあらかじめ決めておこう。


この、キー・バリュー形式のデータを扱うことができるプログラミング言語もある。
プログラミング言語によっては,連想配列・ハッシュ・辞書などと呼ばれている。
Python の辞書というデータ構造を使って連絡先のリストを作っていこう。

画像7

A田さんは自宅電話と携帯メールを保持している
B川さんは携帯電話だけ保持している。
C山さんは携帯電話とPCメールを保持している

これをPythonプログラムで表すとこうなる

# 初めからmembers に登録する場合
members = [{"name": "A 田", "homephone": "0**-***-1111", 
           "mobilemail": "ata@***.ne.jp"},  
          {"name": "B 川", "mobilephone": "0**-***-2222"}
          ]
# 後からmembers に追加する場合
members.append({"name": "C 山", 
               "mobilephone": "090-****-3333", 
               "email": "cyama@***.com"
               })
# すべてのデータを表示する
for member in members:
   for key, value in member.items():
       print(key + ' : ' + value)
   print()
 

はじめに、A田さんとB川さんの情報をmembers変数に格納している
大きい角カッコの中に、人毎に波括弧を記述し、その中にキー コロン バリューの形で間にカンマで区切って記述する。

後からmembersに人を追加したい場合は、append関数を使う。

後はメンバー分ループを回し、更にそのメンバ毎のループの中にキーとバリューを出力する処理を記述する。

じゃあ実行してみよう。

ちゃんと定義した値が表示されたね。

前回の動画では、リレーショナルデータベースを扱ったけど Amazon Dynamo(ダイナモ)DBやオープンソースのHibariやこの前説明したオラクルクラウドもキーバリュー形式に対応したデータベースを提供している。
他のデータ形式に対応したデータベースもあり,これらのデータベー
スを総称してNoSQL と呼ばれている。NoSQL はビッグデータの活用と関連して注目されているんだ。

今回のキー・バリュー形式のデータの処理はプログラム開発でよく使われる手法だから、今回の基礎を抑えておこう。


この記事が気に入ったらサポートをしてみませんか?