...

Webサーバ 1 配布用 - TechInstitute

by user

on
Category: Documents
18

views

Report

Comments

Transcript

Webサーバ 1 配布用 - TechInstitute
Webサーバ 第1回
宮川大輔
配布用
講師について
•
名前: 宮川大輔
•
出身: 群馬県太田市
•
経歴
ぐんまちゃん
•
2005: 東京大学情報科学科 (学士)
•
2007: 東京大学情報理工学系研究科コンピュータ科学専攻 (修士)
•
2007∼2010: Google Japan (日本初の新卒採用勢)
•
2010∼2012: Google US (Android開発)
•
2012∼ mokha Inc. 取締役
これまで
何か
「インターネット」
HTTP GET
HTTP 200
Volley
<uses-permission
android:name=“android.permission.INTERNET" />
onClickListener
AsyncTask
Activity
android-async-http
スマホ
(Android)
RelativeLayout
WWeebbサーバの章
何か
「インターネット」
HTTP GET
HTTP 200
Google AppEngine
HTML
Python
PaaS
MySQL DB
RequestHandler
webapp2
クロスサイトスクリプティング
Webサーバ
セキュリティ
Webサーバ
•
Webページ・Webアプリ
•
•
ブラウザで開いてるそれ
Webサーバ
•
Webページを提供するコンピュータ
年中使ってない?
•
GMail, Dropbox, Google+, iTunes Store,
Facebook, Twitter, 艦これ
•
Webブラウザ
•
Webサーバと通信する
サーバ Server
•
Server … 給仕人 接客係
•
関連: サーヴァント
•
•
Servant … 使用人
誰かの「求め」に応じて「対応」する
サーバ
Web?
•
インターネット上の情報が相互にリンクしている
様子が蜘蛛の巣 (Web) のようであることから
Webサーバを作る!
その前に
本当にサーバは必要?
Webサーバは必要?
•
作りたいAndroidアプリに必要?
•
実現したいサービスに必要?
•
自分の生活に必要?
•
そもそも社会に必要?
場合によっては不要
•
「出社時刻を端末で管理するアプリを作りたい」
•
「怒った鳥を飛ばすゲームを作りたい」
•
「隣の人と対戦したい」
•
「アドホック通信」でも出来る。
必要なケース
•
「出社記録をPCのブラウザからも見たい」
•
「イカれた鳥を飛ばした距離を競わせたい」
•
「アメリカの人とカートレースしたい」
「Webサーバ」の範囲は広い
•
Androidと連携させることを念頭に置く
•
データをインターネットから取得して保存する
「Webサーバを作る」
•
こういうのは作らないよ!
「Webサーバを作る」
•
こういうのは作らないよ!
データセンター
•
Googleのような会社はこういう施設を持っている
クラウド
•
データセンターの一部を柔軟に借りられる
•
仮想化 Virtualization
•
物理的に1台のコンピュータが
複数台のコンピュータかのように見える
クラウドで楽になった
•
先行投資をする必要が少なくなった
•
「あ、Yahoo!ニュースに乗った!」
-> 負荷100倍 (「Yahoo砲」)
=
•
以前: 高い物理サーバを買ってくる
•
今: ポチポチすると100台借りることが出来る
•
資産から経費、準備の高速化!
デモ: 借りてみる
注: Amazon EC2のコンソールから
実際にインスタンスを立ち上げ
Apache2でWebサーバを立ち上げました
比較: 自宅サーバ
•
以前: 秋葉原に行ってサーバ買ってOS入れてネットワーク設定
してFW設定してえーとえーと
•
機材, 回線準備, OSインストール
•
日々のメンテナンス, 障害対応
•
障害対応はプランによって程度の差がある
注: 授業時より少し追記してます
サーバの作り方は様々
•
オンプレミス: ハードウェアから全部調達する
•
IaaS: ハードウェアはお任せ。OSレベルで勝負
•
PaaS: OSはお任せ。その上のソフトで勝負
•
SaaS: サーバ側、全部お任せ♪ API頂戴!
アプローチが複数ある
•
オンプレミス: ハードウェアから全部調達する
•
IaaS: ハードウェアはお任せ。OSレベルで勝負
•
PaaS: OSはお任せ。その上のソフトで勝負
•
SaaS: ソフトもお任せ♪
今回はこれ
Javaは使いません
•
サーバサイドではPythonを使います
•
プログラミング言語Python
•
Javaを本範囲で使うのは不適と判断しました
注: みなさんの環境にはJDK6がインストールされており、
これを破壊したくないというのが理由の一つです。
GAE JavaはJDK7、EclipseのPython開発用プラグインも
JDK7です。なお最新は「8」であって
7は7でこれまた時代遅れなんですけれども。
また、GAE JavaはJavaっぽくタイプ量が増えがちなんですよね
新しい
プログラミング言語
大変そう (>_<;)
今日、理解して欲しい
Pythonコード全て
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
今日、理解して欲しい
Pythonコード全て
1
2
3
4
5
6
7
8
9
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
空行を消す
1
2
3
4
5
6
7
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
7行
目標はPythonじゃない
•
どのような通信が行われているかを理解する
•
•
ある程度「イメージ」で分かれば良い。
(教科書にPython入門記事も含めてあります)
Python特有の注意ポイント
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
インデント(行頭の空白)が
], debug=True)
Javaの{ }にあたる
インデントは大事
•
•
XMLやJavaコードのインデントがないと
•
プログラムの「ブロック構造」が分かりづらい
•
バグ発見が遅れる
•
本質的なことに時間をかけられない
Pythonではインデント間違いは「エラー」
•
インデントに慣れましょ
今日の流れ
•
Pythonの実行環境のインストール
•
•
GAE (Google AppEngine) SDKのインストール
•
•
PCでサーバが動くようになる
Hello Worldサーバのアップロード
•
•
PythonがPCで動くようになる
世界にサーバを公開してみる
PyCharm Community Editionのインストール
インストール作業ばっかりだなあ
–みつを
現在の開発環境との比較
•
Python実行環境 <-> Java (JDK)
•
•
GAE SDK <-> Android SDK
•
•
プログラミング言語をPCで使えるようにする
対象となる環境を操作する仕組みをPCに準備する
PyCharm <-> Eclipse
•
開発を楽にするIDE(統合開発環境)を準備する
こんだけやっても
Javaより早く色々分かる
•
Javaの準備は以外に面倒なのだ…… orz
•
•
皆様のPCに入ってるの、JDK「6」だし
何か心配そうな人は復元ポイントを設定しましょう
•
教科書の付録参照
教科書を元に進める
•
本章範囲を進められるだけ進めてください。
•
適宜途中に説明を入れていきます。
時間が余ったら
•
付録の「Python入門」を眺める
•
教科書を先に進める
•
•
更に新しい機能を追加する
自分のアプリとの絡みを考えてみる
•
特にサーバを必要とするアプリを考えている人
注: ここで演習
が入りました
Web サーバ 第1回
後編
宮川大輔
Hello Worldサーバ
解説
今日、理解して欲しい
Pythonコード全て
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
本質的な部分
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
3箇所
「パス」と「担当者」の
対応がある
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
•
/ を MainHandlerというクラスが担当している
「パス」と「担当者」の
対応がある
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
•
http://ti-hello.appspot.com/ -> MainHandler
対応がなければ「存在しない」
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
•
http://ti-hello.appspot.com/example -> 不在
404は
サーバとは通信できている証
404 ?
HTTP Status Code
HTTP is 仕様
•
クライアントはこういうリクエストを送れ
要求
•
サーバはこういうレスポンスを返せ
応答
HTTP Status Code
•
3桁の数字がサーバでの結果を示している
•
200 -> 「あるから送るわ(`・ω・́)」
•
404 -> 「そんなものない(́・ω・`)」
•
503 -> 「悪い俺今日体調悪いわ (́☓ω☓`)」
GAEでは対応を明示しなければ
「存在しない」
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
•
http://ti-hello.appspot.com/example -> 不在
いつでも Hello World を表示させたい
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
(‘/.*’, MainHandler)
], debug=True)
•
「正規表現」で/exampleも受け入れるようにする例
正規表現?
(#́・ω・`#)
注: プログラミングについて勉強すると
おそらくWebサーバ云々よりも前に
「正規表現」という言葉が先に登場します。
原稿執筆時点ではこのあたりの重要性を
見落としてました。サーセン
正規表現
•
「こういう感じの文字列じゃない?」と
プログラムに聞ける仕組み
•
さっきの例: /.*
「続かなければならない」
は 「+」
•
「スラッシュで始まり」
•
「何か文字が」「続くかもしれない」
正規表現は定番ツール
•
•
プログラミングでよく使う
•
文字列の一部をルールに基づいて抽出する
•
テキストファイル、ログファイル、HTML……
GAEはPythonの正規表現エンジンを使っただけ
/path1/path2 …
•
フォルダと仕組みは概ね同じ
•
•
フォルダ構造 = 「木」構造
木の枝先に「資源」がある
注: 本授業では正直
余計なスライドだった気がします。
資源の構造が木である、というのは
割と重要なんですが……
Webサーバ
•
HTTPというプロトコルを介して
資源
resource
•
フォルダ構造(木構造)になってるリソースを
•
クライアントとやりとりする、サーバ
•
GET … ください
•
POST … あげます
•
↑ 主語はクライアント側 (Android, ブラウザ)
デモ: 締め切りを抜き取る 注: PythonとRubyを用いて
Tech Instituteのトップページから
締め切りに関する<span>タグ内の
中身を取り出しました。
(次スライド)
授業で使用したスクリプト
import urllib
import re
r = re.compile('<span style="color:red;">(.*)</span>')
m = r.search(urllib.urlopen(‘http://techinstitute.jp/').read())
print m.group(1)
結果:
<big>東京、大阪 ともに 第2期受講 11月12日(水) 〆切迫る!!</big>
このデモ数日後、
文字列が書き換わったことを
確認しました( ー`дー́)キリッ
正規表現だけで授業できる
•
•
例: メールアドレスかどうかを「ラフに」チェック
•
“^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]
+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}
[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[azA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$”
•
これでも実は全然ちゃんとチェックできてない
学んどくとじわじわ便利です
これ以上は割愛
いつでも Hello World を表示
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
(‘/.*’, MainHandler)
], debug=True)
•
http://ti-hello.appspot.com/example もOK
バグってると、
503はGAEが出す
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
突然のコメントでも何でもない日本語
app = webapp2.WSGIApplication([
(‘/.*’, MainHandler)
], debug=True)
•
「503 悪い俺今日体調悪いわ (́☓ω☓`)」 by GAE
注: 状況によっては出ないこともあるようです……
本質的な部分は
あとひとつあった
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
理解してほしいポイント
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
HTTP GETを実装している
•
第14章「ネットワークプログラミング」で登場
•
Android側 -> GETリクエストを送る側
•
•
第14章はこっち
サーバ -> GETレスポンスを返す側
•
今回はこっち
HTTPには
リクエストが数種類ある
•
•
今回は(第2,3回含めて)GETとPOSTだけ扱う
•
GET … データ取る
•
POST …… データ送る
他にもあるし使うこともある。
•
「Ruby on Rails」など別の仕組みだと見るかも
ホスト名についての処理は
GAEがやってくれている
Google AppEngine
import webbapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
(‘/.*’, MainHandler)
], debug=True)
•
http://ti-hello.appspot.com/example
Google AppEngine
•
•
GAEではそれぞれに関数(メソッド)を割り当てる
•
GET -> get(), POST -> post()
•
ヘンなもんが来たらGAEが対処する
その他の環境では自力で実装する必要があるかも
仕様と実装
•
GAEという特定技術についての知識は
今回はそれほど重要ではない
•
•
状況によって変わるから
GAEはプロトコルをプログラムの皮に
上手く包み込んでいる
•
ここまでOSのコマンドは出て来なかった!
•
パッケージをインストールもしなかった!
技術要素は分けて理解する
•
言い方を変えると: 何が使いまわせる?
•
•
HTTPの仕様は存在し公開されている。GAEは否。
そうでないものには痛い未来があるかもしれない……
•
GAEがなくならないか心配
•
Pythonはオープンだから、まだ大丈夫
•
……2020年にどうなるかな??
デモ
HTTPの仕様(RFC)を
眺めてみる
注: 正直、ここは尻切れトンボでした
次回予告
•
シラバスサーバを作る
•
•
Androidと連携をしてみよう
余談: 何を話そう……
注: オンラインでは基本オフレコとさせてください
• 特になければ … Googleのときの話
(動画では残ってるかも)
Fly UP