マッシュアップ ( プログラミング演習 )
ウェブコンピューティング
2020
年12
月2
日演習の前に
-
演習室のPC
にログインするアカウントを持っていない人は、必要であれば アカウントを配布するので前に取りにきて下さい-
サンプルプログラムのためのAPI
キーを取得しましょう- https://webservice.recruit.co.jp/register/
-
上のURL
からリクルートのサービスを使えるように登録-
発行に少し時間がかかる可能性があるので、早めに取得推奨演習の課題:マッシュアップとは?
• マッシュアップ (Web プログラミング )
複数の
Web
サービスのAPI
を組み合わせ、あたかも一つのWeb
サービスのようにする機能のことWeb
サービス事業者がサービスの機能やデータの一部を 公開し、他のサービスが利用できるように用意した「ア プリケーションプログラミングインタフェース」• Web サービスの API
マッシュアップサービスを企画・作成してもらいます
• 実演の課題
演習
実際に API を利用した
アプリケーションを作ってみよう!
–
提出締切:1
月15
日(金)17:00
–
提出先:lec-webcomp[at]googlegroups.com
- (1)
と(2)
をメールに添付して提出演習・レポート課題(計 2 題)
(1) 調査課題
(2)
プログラミング課題(いずれか一題を選択)松 竹 梅
基本 難しい そこそこ 易しい
根
(1) 調査課題
• 公開されている Web サービスについて調査し,そ れらをマッシュアップした新たな Web サービスの アイディアを提案せよ(少なくとも1つ).
–
利用するWeb
サービスの情報と組合せ方の全体像✓
図などがあると良い–
実際にどのようなWeb
サービスとなるのか(入出力の 例)などを明記してください–
提案したサービスの何がいいのか?–
提案したサービスがあるとどんな貢献があるのか?などを存分にアピールしてください
API を利用した過去の例 (1)
• 提案サービス
–
入力した場所の周囲3km
以内にある,5000
円以下の宿 泊施設の空室情報を出力する• 利用した Web サービス
– Google Maps API (Google Geocoding API)
•
地名を入力するとその地点の緯度経度を出力する–
楽天トラベル空室検索API
•
緯度経度を入力するとその付近の宿泊施設の空室を出力 する(半径や値段の指定はオプション)• 利点
–
すぐに行ける安宿を出力してくれるので一人で予定を 立てずに旅行するときに大変重宝するAPI を利用した過去の例 (2)
「ホットペッパーグルメ」
「文字を読める
Slackbot
」画像の中の文字を抽出し、
その文字を出力できる。 お店のジャンルや予算などの 様々な条件を指定して検索が できる。
(2) プログラミング課題
• 目的
–
自分自身でプログラミングを行い,自分自身でAPI
を叩 いてみよう!• 言語: Python3 ( 推奨 )
–
他の言語でやりたい!という場合には構いません–
サンプルはPython3
でしか用意していません(2)
プログラミング課題(いずれか一題を選択)松 竹 梅
基本 難しい そこそこ 易しい
根
→
詳しくはスライド最終ページ参照(2) プログラミング課題
• 目的
–
自分自身でプログラミングを行い,自分自身でAPI
を叩 いてみよう!(2)
プログラミング課題(いずれか一題を選択)松 竹 梅
基本 難しい そこそこ 易しい
根
Python
プログラミ ングの基本(×マッシュアップ)
マッシュアップ の基礎 ウェブアプリ
ケーション の基盤 ウェブアプリ
ケーション
(2) プログラミング課題 ( 根 )
• サンプルプログラムを参考に,学校検索を行うプ ログラムを作成せよ.(検索クエリの種類は問わ ない)
–
プログラムの概要(特に何を入出力とするのか)–
利用したWeb
サービスの情報–
プログラムのソース–
実行例(3つ以上)–
考察•
工夫した点,苦労した点,問題,感想等レポートの内容
(2) プログラミング課題 ( 梅 )
• 「職業検索(サンプル)と学校検索(根)」を マッシュアップせよ(組合せ方は問わない)
(なお、片方のみ(職業 or 学校)と他のAPIをマッシュアップしたものでも良い
→ もしかして「竹」?)
–
プログラムの概要(特に何を入出力とするのか)–
利用したWeb
サービスの情報–
プログラムのソース–
実行例(3つ以上)–
考察•
工夫した点,苦労した点,問題,感想等レポートの内容
(2) プログラミング課題 ( 竹 )
• (1) 調査課題において提案した Web サービスを実際
に行うプログラムを作成せよ.(シェル上での処 理のみで構わない)
–
プログラムの概要(特に何を入出力とするのか)–
利用したWeb
サービスの情報–
プログラムのソース–
実行例(3つ以上)–
考察•
工夫した点,苦労した点,問題,感想等レポートの内容
(2) プログラミング課題 ( 松 )
• (1) 調査課題において提案した Web サービスを実際 に行うプログラムを作成し, Web ブラウザ上で動 作を行えるようにせよ.
–
プログラムの概要(特に何を入出力とするのか)–
利用したWeb
サービスの情報–
プログラムのソース–
作成したWeb
サービスのURL –
実行例(3つ以上)–
考察•
工夫した点,苦労した点,問題,感想等レポートの内容
–
提出締切:1
月15
日(金)17:00
–
提出先:lec-webcomp[at]googlegroups.com
- (1)
と(2)
をメールに添付して提出演習・レポート課題(計 2 題)
(1) 調査課題
松 竹 梅
基本 難しい そこそこ 易しい
根
(2)
プログラミング課題(いずれか一題を選択)環境設定
• 設定ファイル & サンプルプログラムをダウンロー ドしてください
– http://www.cl.ecei.tohoku.ac.jp/publications/2020/
WebComp2020.zip
• 演習室の PC でなく、自前の PC やサーバーで作業し てもらっても差し支えありません(が、故障等の 責任は負いかねます)
• プログラミングができる人はドンドン先に進んで
OK です
(以降の説明を必ずしも聞く必要はありません)( 自前 PC 向け )Windows での環境構築
• Windows
でUnix-like
な環境を使いたい場合,WSL
が便利– Windows Subsystem for Linux
•
コントロールパネルを開き,“プログラム →Windowsの機能の有効化
または無効化” を選択• “Linux用Windowsサブシステム”にチェックを入れる
• PC
を再起動する( 自前 PC 向け )Windows での環境構築
• Microsoft Store
を開き,“Ubuntu”
で検索• “Ubuntu”
のページを開き,”
入手”
ボタンを押す•
インストール後,再起動( 自前 PC 向け )Windows での環境構築
• “win
キー+ x” -> “i”
または“win
キー+ r”
で”powershell”
と入力•
黒い画面が立ち上がるので”bash”
と入力– 初回はユーザ名とパスワードの設定を要求される
– 今後の実験はbashと入力した先の環境で行う(毎回やる必要がある)
•
以下のコマンドを入力(
設定したパスワードが要求されるので注意)
– sudo apt update
– sudo apt install python3 python3-pip
– echo alias python=¥“python3¥” >> ~/.bashrc #コピペ厳禁(バグるので) – echo alias pip=¥“pip3¥“ >> ~/.bashrc #コピペ厳禁
– source ~/.bashrc
( 自前 PC 向け )Windows での環境構築
•
デフォルトだと日本語が文字化けしてしまうのでフォントを変える• “
フォント”
から日本語が含まれてそうなフォントを選択•
バー上で右クリックし”
プロパティ”
を選択• Bash起動後に日本語が確認できればOK
計算機管理室の環境
• 計算機室のデフォルト Python -> Python2.7
❌ : Python3
をインストールする(→ 難しいし、面倒)
⭕️ : Python3
がインストールしてある場所を参照し、その
Python3
を使用する皆さんの計算機室アカウント
(
たぶん、Python2.7
)TA
の計算機室 アカウントPython3
インストール済みsetup.sh
でpython3
を参照( 演習室 PC 向け ) 環境設定
✓
ダウンロードしたファイル内のsetup.sh
を実行-
端末上でダウンロード・展開したディレクトリに移動した後、- sh ./setup.sh - source ~/.bashrc
- Pythonの環境設定とpip(Pythonのパッケージ管理ソフト)がセット
アップされます。✓
正しく適用されたかのチェック1. “python –V” 実行時 ”Python 3.6.・・・” と出力されればok 2. 端末上で “pip list” でエラーを吐かなければok
✓
分かる人へ- setup.sh では、~/.bashrcと~/.config/pip/pip.conf を再設定しています - 即ち、自分自身で環境を弄っている人は要注意!!
- 誤って実行してしまったときは、バックアップを自動的に取るようになっ
上手く動かない場合は(早めに)TAを呼ぶ
( 演習室 PC 向け ) 環境設定(具体例 * )
*__MACOSXはただのゴミ
*
あくまで一例 ダウンロード解凍
ディレクトリ移動
セットアップ実行
( 演習室 PC 向け ) 環境設定
• 動かない人へ
– setup.shの対応シェルはbashのみです
• Bash 以外を使用している人へ
- 単にPATHを貼ってるだけなので、setup.shを参照して、自身が 使用しているシェルの設定ファイルを適当にいじってください
–
複数人が同時にアクセスすると上手くインストールできないこと があります (もしかして? → ベストエフォート)– “pip list”でwarningが出る!
• 実用上は問題ありません。
• 鬱陶しい場合は、~/.config/pip(ディレクトリ)を作成した上で、
WebComp2020 内の.pip.conf を pip.conf(ピリオドを取る)として コピーすると消せます。
上手く動かない場合は(早めに)TAを呼ぶ
pip に関して
• pip は python のパッケージ管理ソフトです。
• 使い方
–
インストールする• pip install
入れたいパッケージ–-user
–
探す• pip search
探したいパッケージ–
インストールした一覧を見る• pip list
詳しくは
https://pip.pypa.io/en/stable/user_guide/
自分のディレクトリに インストールする
まずはサンプルプログラムを動かそう!
$ python search_job_json.py
飛行機 研究2
件のお仕事が見つかりました。最初の2
件を表示しています。--- No. 1 ---
【職業】航空機・船舶技術者・研究者
【説明】航空機や船舶の技術開発や研究を行う
【資格】技術士<国>
【学問】機械工学 航空・船舶・自動車工学 システム・制御工学 電子工 学 環境工学 応用物理学
--- No. 2 ---
【職業】電気通信技術者・研究者
【説明】現代社会では欠かせない通信やネットワークに関する様々な技 術や研究開発を行う。
【資格】工業英語能力検定試験 電気通信の「工事担任者」<国> 電気 通信主任技術者<国>
【学問】通信工学 応用物理学
←
実行コマンド→
残念ながらすぐには動かないのであしからずサンプルプログラム (search_job_json.py: 1/2)
ウェブコンピューティング-プログラミング演習- 2020/12/02
27
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
"""
# python search_job_json.py
"""
import sys #
import urllib.request # URL import urllib.parse # URL import json # JSON API
def create_work_info(index, work_node):
#Web
return """ No. {}
{}
{}
{}
{}""".format(index, # No.
work_node["name"], # work_node["desc"], #
" ".join([l["name"] for l in work_node["license"]]), # " ".join([s["name"] for s in work_node["subject"]]) # )
def create_result_info(json_result):
#Web
return "{} {} ".format(
json_result["results"]["results_available"], # ~
json_result["results"]["results_returned"] # ~ )
def main():
# API Web
url = "http://webservice.recruit.co.jp/shingaku/work/v1/?{}".format(
urllib.parse.urlencode(
{"key" : "382312f6b1fe7a75", # API ﴾ db*3+9﴾
"keyword" : " ".join(sys.argv[1:]), #
"format" : "json" # JSON }))
f_url = urllib.request.urlopen(url).read()
json_result = json.loads(f_url.decode("utf8")) # JSON
#
print(create_result_info(json_result))
for index, work in enumerate(json_result["results"]["work"]): #enumerate ﴾ index print(create_work_info(index+1,work))
return
サンプルプログラム (search_job_json.py: 2/2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
"""
# python search_job_json.py
"""
import sys #
import urllib.request # URL import urllib.parse # URL import json # JSON API
def create_work_info(index, work_node):
#Web
return """ No. {}
{}
{}
{}
{}""".format(index, # No.
work_node["name"], # work_node["desc"], #
" ".join([l["name"] for l in work_node["license"]]), # " ".join([s["name"] for s in work_node["subject"]]) # )
def create_result_info(json_result):
#Web
return "{} {} ".format(
json_result["results"]["results_available"], # ~
json_result["results"]["results_returned"] # ~ )
def main():
# API Web
url = "http://webservice.recruit.co.jp/shingaku/work/v1/?{}".format(
urllib.parse.urlencode(
{"key" : "382312f6b1fe7a", # API ﴾ db*3+9﴾
"keyword" : " ".join(sys.argv[1:]), #
"format" : "json" # JSON }))
f_url = urllib.request.urlopen(url).read()
json_result = json.loads(f_url.decode("utf8")) # JSON
#
print(create_result_info(json_result))
for index, work in enumerate(json_result["results"]["work"]): #enumerate ﴾ index print(create_work_info(index+1,work))
return
if __name__ == "__main__":
main()
実際に動かしてみよう
ウェブコンピューティング-プログラミング演習- 2020/12/02
29
•
テキストエディタを起動し、サンプルプログラムを開く– 取得した「リクルートのAPIキーに変更する」
–
プログラムはutf-8 形式で保存する事
• 実行方法
「
python search_job_json.py
単語1 単語2 …
」1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
"""
# python search_job_json.py
"""
import sys #
import urllib.request # URL import urllib.parse # URL import json # JSON API
def create_work_info(index, work_node):
#Web
return """ No. {}
{}
{}
{}
{}""".format(index, # No.
work_node["name"], # work_node["desc"], #
" ".join([l["name"] for l in work_node["license"]]), # " ".join([s["name"] for s in work_node["subject"]]) # )
def create_result_info(json_result):
#Web
return "{} {} ".format(
json_result["results"]["results_available"], # ~
json_result["results"]["results_returned"] # ~ )
def main():
# API Web
url = "http://webservice.recruit.co.jp/shingaku/work/v1/?{}".format(
urllib.parse.urlencode(
{"key" : "382312f6b1fe7a", # API ﴾ db*3+9﴾
"keyword" : " ".join(sys.argv[1:]), #
"format" : "json" # JSON }))
f_url = urllib.request.urlopen(url).read()
json_result = json.loads(f_url.decode("utf8")) # JSON
#
print(create_result_info(json_result))
for index, work in enumerate(json_result["results"]["work"]): #enumerate ﴾ index print(create_work_info(index+1,work))
return
# APIキー(自分で取得する)
実際に動かしてみよう
$ python search_job_json.py
飛行機 研究2
件のお仕事が見つかりました。最初の2
件を表示しています。--- No. 1 ---
【職業】航空機・船舶技術者・研究者
【説明】航空機や船舶の技術開発や研究を行う
【資格】技術士<国>
【学問】機械工学 航空・船舶・自動車工学 システム・制御工学 電子工 学 環境工学 応用物理学
--- No. 2 ---
【職業】電気通信技術者・研究者
【説明】現代社会では欠かせない通信やネットワークに関する様々な技 術や研究開発を行う。
【資格】工業英語能力検定試験 電気通信の「工事担任者」<国> 電気 通信主任技術者<国>
【学問】通信工学 応用物理学
ターミナル上
サンプルプログラムについて
• 利用している Web サービスの仕様は?
どんな検索ができるのか?
どんな出力をするのか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
"""
# python search_job_json.py
"""
import sys #
import urllib.request # URL import urllib.parse # URL import json # JSON API
def create_work_info(index, work_node):
#Web
return """ No. {}
{}
{}
{}
{}""".format(index, # No.
work_node["name"], # work_node["desc"], #
" ".join([l["name"] for l in work_node["license"]]), # " ".join([s["name"] for s in work_node["subject"]]) # )
def create_result_info(json_result):
#Web
return "{} {} ".format(
json_result["results"]["results_available"], # ~
json_result["results"]["results_returned"] # ~ )
def main():
# API Web
url = "http://webservice.recruit.co.jp/shingaku/work/v1/?{}".format(
urllib.parse.urlencode(
{"key" : "382312f6b1fe7a", # API ﴾ db*3+9﴾
"keyword" : " ".join(sys.argv[1:]), #
"format" : "json" # JSON }))
f_url = urllib.request.urlopen(url).read()
json_result = json.loads(f_url.decode("utf8")) # JSON
#
print(create_result_info(json_result))
for index, work in enumerate(json_result["results"]["work"]): #enumerate ﴾ index print(create_work_info(index+1,work))
return
if __name__ == "__main__":
main()
サンプルプログラムの
API
について 話すが、見るべき箇所はどのAPI
でもだいたい同じWeb サービスの仕様(入力)
http://webservice.recruit.co.jp/shingaku/reference.html
↑
実態は「URL
」にアクセスしているだけ(つまり、Webブラウザで正しく入力 すれば、何かしらの出力が返って来る)
「
API
エンドポイント+
検索クエリ」で 実際にアクセスするURL
を作成APIエンドポイント
検索クエリ
→
*検索クエリは各パラメータが
「必須かどうか」に着目する
Web サービスの仕様(出力)
(
xml
の出力例)→
階層構造として出力される(2) プログラミング課題 ( 根 )
• サンプルプログラムを参考に,学校検索を行うプ ログラムを作成せよ.(検索クエリの種類は問わ ない)
–
プログラムの概要(特に何を入出力とするのか)–
利用したWeb
サービスの情報–
プログラムのソース–
実行例(3つ以上)–
考察•
工夫した点,苦労した点,問題,感想等レポートの内容
根の出力(例)
• 住所を入力するとその住所を含む学校を出力する プログラム
python search_school.py 仙台市青葉区荒巻
3件の学校が見つかりました。最初の3件を表示しています。
--- No. 1 ---
【 学 校 】宮城教育大学
【キャンパス】
【 学 部 】教育学部 --- No. 2 ---
【 学 校 】東北大学
【キャンパス】片平キャンパス 雨宮キャンパス 星陵キャンパス 川内キャンパス 青葉山キャンパス
【 学 部 】文学部 教育学部 法学部 経済学部 理学部 医学部 歯学部 薬学部 工学部 農学部 --- No. 3 ---
【 学 校 】赤門鍼灸柔整専門学校
【キャンパス】
【 学 部 】柔道整復科 柔道整復科第二部 鍼灸科第二部 鍼灸指圧科 鍼灸科第一部
課題(根)に関して
✓ リクルートの学校検索 API を使うのが便利
– http://webservice.recruit.co.jp/shingaku/school/v1
✓ 改造方法
1.
サンプルプログラムの検索クエリをなげる箇所を学校 検索に変更2.
出力の解析部分(create_work_info)
を学校検索API
の出 力をするように変更ウェブコンピューティング-プログラミング演習- 2020/12/02
36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
"""
# python search_job_json.py
"""
import sys #
import urllib.request # URL import urllib.parse # URL import json # JSON API
def create_work_info(index, work_node):
#Web
return """ No. {}
{}
{}
{}
{}""".format(index, # No.
work_node["name"], # work_node["desc"], #
" ".join([l["name"] for l in work_node["license"]]), # " ".join([s["name"] for s in work_node["subject"]]) # )
def create_result_info(json_result):
#Web
return "{} {} ".format(
json_result["results"]["results_available"], # ~ json_result["results"]["results_returned"] # ~ )
def main():
# API Web
url = "http://webservice.recruit.co.jp/shingaku/work/v1/?{}".format(
urllib.parse.urlencode(
{"key" : "382312f6b1fe7a", # API ﴾ db*3+9﴾
"keyword" : " ".join(sys.argv[1:]), #
"format" : "json" # JSON }))
f_url = urllib.request.urlopen(url).read()
json_result = json.loads(f_url.decode("utf8")) # JSON
#
print(create_result_info(json_result))
for index, work in enumerate(json_result["results"]["work"]): #enumerate ﴾ index print(create_work_info(index+1,work))
return
↓ まずこの部分を書き換える
注意
• API にはアクセス制限がある場合が多い
–
短時間に何度もクエリを飛ばさない事– MediaWiki API
• There is no hard and fast limit on read requests, but we ask that you be
considerate and try not to take a site down. Most sysadmins reserve the right to unceremoniously block you if you do endanger the stability of their site.
– Google Custom Search API
• For CSE users, the API provides 100 search queries per day for free.
• 多くの API は使用するために登録が必要
–
リクルート,食べログ,twitter, …
–
登録からAPIキー発行まで時間のかかる場合も(〜二週間?)–
課題を出す直前の登録だとキーの取得が提出までに間に合わない 事も!?今後の予定
• 12/2( 今回 )
–
課題説明・準備など• 12/16( 水 ) # 2週間後 # (3分程度)
–
中間発表(主に「(1)
調査課題」の発表と、「(2)
プログラ ミング課題」の進捗状況を報告してもらいます)• 1/13( 水 ) # 4週間後 # (3分程度)
–
最終発表(中間発表会の「(1)
調査課題」を踏まえ、「(2)
プログラミング課題」の進捗状況を報告してもらいます)• 12/9( 水 ) ・ 12/23( 水 ) ・ 1/6( 水 ) 演習
• 1/15( 金 ) 17:00
–
課題提出〆切演習
• わからないところがあれば TA にどんどん聞いてく ださい!
–
このAPI
使いたいんだけどどうやって使えばいいのかわ かんない……
–
サンプルのこの部分ってどういう意味?–
そもそもPython
がわからない などなどお気軽に!• TA と連絡先
(基本は全員にCc
してください)•
浅妻 佑弥:asazuma.yuya.r7 [at] dc.tohoku.ac.jp
• Li Yunmeng
:li.yunmeng.r1 [at] dc.tohoku.ac.jp
補足: Python に関して (1/4)
• for 文や if 文の開始時に「 { (e.g. C 言語 ) 」の代わ りに「 : 」を置き,インデントで範囲を指定
• for 文は配列(リスト)の要素を順に取り出す
for i in [-1,0,1,2]:
if I > 0:
c += 1 print(i)
print(”Number of N is {}”).format(c)
インデント→ 出力
-1 0 1 2
Number of N is 2
↓ ☓ループの回数 ○配列
実行結果
補足: Python に関して (2/4)
• def( 引数 ) は関数定義
def create_work_info(index, work_node):
-
2つの引数を入力とする関数create_work_info
• json 形式はハッシュ ( 辞書 ) 形式として格納される
–
ハッシュ:「key
」 と「value
」のペアD = { ”code”: ”a12”, ”urls”:{”mobile”: ”http…”, ”pc”:” …}
print(D[“code”]) -> “a12”
–
リクルートのAPI
の出力の仕様を見ながらcreate_work_info
の”license”
,”subject”
をいじるハッシュのvalueにハッシュを記述可能
→ 階層構造を表現 key value
補足: Python に関して (3/4)
• enumerate は現在のループ番号を取得する
for n, i in enumerate([”a”,”b”,”c”]):
print n, i
出力0 a
1 b 2 c
• トラブルシューティング
–
多いエラー1.
誤字・脱字2.
全角スペース3.
インデント4.
文字コード誤り✓
エラー出力を確認- エラーの場所が分かる