Comments
Description
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のときの話 (動画では残ってるかも)