SlideShare a Scribd company logo
1 of 29
Download to read offline
WAFをつくってる話
大阪Pythonユーザの集まり 2016/04
MASASHI SHIBATA
! c_bata_
@c_bata_
django / flask / pandas
明石高専
話すこと
1. WSGIの話とか
2. WAFに欲しい機能を考える
3. Kobinの紹介
4. Kobinにおける取り組み
WSGI
Web Server Gateway Interface
WSGI??
• Pythonで作るWebアプリケーションの実装方
法の標準化仕様
• 実装を切り離して、WebサーバとWAFの組み
合わせを柔軟に
https://www.python.org/dev/peps/pep-3333/
https://www.python.org/dev/peps/pep-333/
WSGI v1.0.1 (PEP3333)
• 2つの引数を持った呼び出し可能なオブジェクト
• 第2引数として渡されたオブジェクトにHTTPス
テータスコードと (header_name,
header_value) タプルのリストを渡す
• 返り値はバイト文字列を yield する iterableなオ
ブジェクト
https://www.python.org/dev/peps/pep-3333/
WSGI v1.0.1 (PEP3333)
def app(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b"Hello World"]
• 2つの引数を持った呼び出し可能なオブジェクト
https://www.python.org/dev/peps/pep-3333/
WSGI v1.0.1 (PEP3333)
def app(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b"Hello World"]
• 第2引数として渡されたオブジェクトの引数は

HTTPステータスコードと

(header_name, header_value) タプルのリスト
https://www.python.org/dev/peps/pep-3333/
WSGI v1.0.1 (PEP3333)
def app(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b"Hello World"]
• バイト文字列を yield する iterable を返さなければ
ならない
• 例えば、バイト文字列のリストを返すようにする
https://www.python.org/dev/peps/pep-3333/
Hello World with gunicorn
$ gunicorn -w 1 main:app
[2016-04-15 10:17:00 +0900] [1873] [INFO] Starting gunicorn 19.4.5
[2016-04-15 10:17:00 +0900] [1873] [INFO] Listening at: http://127.0.0.1:8000 (1873)
[2016-04-15 10:17:00 +0900] [1873] [INFO] Using worker: sync
[2016-04-15 10:17:00 +0900] [1878] [INFO] Booting worker with pid: 1878
^C[2016-04-15 10:17:08 +0900] [1873] [INFO] Handling signal: int
[2016-04-15 10:17:08 +0900] [1878] [INFO] Worker exiting (pid: 1878)
[2016-04-15 10:17:08 +0900] [1873] [INFO] Shutting down: Master
def app(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b"Hello World"]
Hello World with wsgiref
$ python main.py
127.0.0.1 - - [15/Apr/2016 10:24:21] "GET / HTTP/1.1" 200 11
127.0.0.1 - - [15/Apr/2016 10:24:21] "GET /favicon.ico HTTP/1.1" 200 11
def app(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b"Hello World"]



if __name__ == '__main__':
from wsgiref.simple_server import make_server
httpd = make_server('', 8080, app)
httpd.serve_forever()
WAFで欲しい機能を考える
最低限欲しい機能
• ルーティング
• どこにアクセスしても Hello World
• HTMLテンプレート
• 今はplain text返してるだけ
• Jinja2のTemplate Loaderを用意
最低限欲しい機能
• 静的ファイルをいい感じに返す機能
• 本番だとNginxとか使うけど、開発中は...
• リクエスト・レスポンスオブジェクト
• リクエスト情報はenvが渡されてるけど、

ただのdictなのでうまくパースしてほしい
• ステータスとかヘッダ情報をコントロール
a small and statically-typed web framework
kobin
https://github.com/c-bata/kobin
a small and statically-typed web framework
kobin
https://github.com/c-bata/kobin
Hello World
from kobin import Kobin
app = Kobin()
@app.route('^/(?P<name>w*)$')
def hello(name: str):
return "Hello {}!!".format(name)
if __name__ == '__main__':
app.run()
• 日本語: https://kobin.readthedocs.org/ja/latest/
• English: https://kobin.readthedocs.org/en/latest/
Hello World with Jinja2
import os
from kobin import Kobin, template
app = Kobin()
@app.route('^/$')
def index():
return template('index')
• https://github.com/c-bata/kobin-example
• https://kobin.herokuapp.com/
特徴
• Type Hintsの活用
• Bottleのコードを読んでる時に結構混乱
• mypy 使いたい
• ルーティングへの活用
Routing in Django
from django.conf.urls import url
urlpatterns = [
url(r'^blog/page(?P<num>[0-9]+)/$', page),
]
def page(request, num="1"):
# Output the appropriate page of blog entries
...
https://docs.djangoproject.com/en/1.9/topics/http/urls/
• 引数が全て文字列
Routing in Bottle
from bottle import route
@route('/object/<id:int>')
def callback(id):
assert isinstance(id, int)
http://bottlepy.org/docs/dev/tutorial.html#request-routing
• 独自DSL
• 型が分かるため、view関数には型変換したオブジェ
クトを渡すことができる
ルーティングに対する考察
• 正規表現ベース (Django等)
• 自由度は高い
• 型情報を取得出来ない
• 独自DSL (Bottle, Flask等)
• 自由度は低い
• 型情報を自由に付けれる
Routing in Kobin
from kobin import Kobin
app = Kobin()
@app.route('^/years/(?P<year>d{4})$')
def casted_year( year: int ):
return 'A "year" argument is integer? : {}’ 
.format(isinstance(year, int))
https://github.com/c-bata/kobin/blob/master/example/hello_world.py
• 正規表現により自由度が高い
• Type Hintsの恩恵(IDE, mypy)をそのまま受けれる
Ecosystem Threats to Python
• Pythonのエコシステムはその巨大さゆえに、バー
ジョンアップについていきづらい
• コミュニティとしてもPython3に移行していきたい
• Type Hintsを移行のきっかけに
PyCon APAC/Taiwan 2015: Keynote
References
• Documentations
• https://kobin.readthedocs.org/ja/latest/
• https://kobin.readthedocs.org/en/latest/
• Kobin Example
• https://github.com/c-bata/kobin-example
• https://kobin.herokuapp.com/
おまけ
PEP333とPEP3333
PEP333 と PEP3333
$ python2.7
>>> b'hoge' + u'日本語'
u'hogeu65e5u672cu8a9e'
$ python3.5
>>> b'hoge' + u'日本語'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
PEP333 と PEP3333
• PEP333 (WSGI v1.0)
• Python2ではbytesとstrを結合出来たり…
• Python3で文字列の扱いが大きく変わった
• PEP3333 (WSGI v1.0.1)
• 後方互換は保ったまま、文字列の扱いを整備して
長年たまってたデファクトの修正案も取り込み
Thanks!

More Related Content

What's hot

Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LTWeb Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LTMasahiro Nagano
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
PHP x AWS でスケーラブルなシステムをつくろう
PHP x AWS でスケーラブルなシステムをつくろうPHP x AWS でスケーラブルなシステムをつくろう
PHP x AWS でスケーラブルなシステムをつくろうTaiji INOUE
 
NorikraのJVMチューンで苦労している話
NorikraのJVMチューンで苦労している話NorikraのJVMチューンで苦労している話
NorikraのJVMチューンで苦労している話SATOSHI TAGOMORI
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Yu Nobuoka
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較Sugawara Genki
 
chat bot framework for Java8
chat bot framework for Java8chat bot framework for Java8
chat bot framework for Java8masahitojp
 
apachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったapachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったJunichi Ishida
 
Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Teppei Sato
 
明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudy明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudyTakeshi Komiya
 
Real World PHP in pixiv
Real World PHP in pixivReal World PHP in pixiv
Real World PHP in pixivKenta USAMI
 
Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道Shinya Okano
 
仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 Hideo Takahashi
 
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編hiboma
 
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-Masashi Shinbara
 
誰でも出来るローカル開発環境の作り方
誰でも出来るローカル開発環境の作り方誰でも出来るローカル開発環境の作り方
誰でも出来るローカル開発環境の作り方666oh666
 
わんくま東京#46 予告編
わんくま東京#46 予告編わんくま東京#46 予告編
わんくま東京#46 予告編Sunao Tomita
 

What's hot (20)

Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LTWeb Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
PHP x AWS でスケーラブルなシステムをつくろう
PHP x AWS でスケーラブルなシステムをつくろうPHP x AWS でスケーラブルなシステムをつくろう
PHP x AWS でスケーラブルなシステムをつくろう
 
NorikraのJVMチューンで苦労している話
NorikraのJVMチューンで苦労している話NorikraのJVMチューンで苦労している話
NorikraのJVMチューンで苦労している話
 
Haikara
HaikaraHaikara
Haikara
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
 
chat bot framework for Java8
chat bot framework for Java8chat bot framework for Java8
chat bot framework for Java8
 
apachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったapachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin Serverっぽいやつをつくった
 
Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Closure Compiler Updates for ES6
Closure Compiler Updates for ES6
 
明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudy明日から始める Chef 入門 #bpstudy
明日から始める Chef 入門 #bpstudy
 
Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
Real World PHP in pixiv
Real World PHP in pixivReal World PHP in pixiv
Real World PHP in pixiv
 
Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道Djangoフレームワークの紹介 OSC2015北海道
Djangoフレームワークの紹介 OSC2015北海道
 
仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法
 
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
 
Composer
 Composer Composer
Composer
 
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
 
誰でも出来るローカル開発環境の作り方
誰でも出来るローカル開発環境の作り方誰でも出来るローカル開発環境の作り方
誰でも出来るローカル開発環境の作り方
 
わんくま東京#46 予告編
わんくま東京#46 予告編わんくま東京#46 予告編
わんくま東京#46 予告編
 

Viewers also liked

Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャShiroyagi Corporation
 
Pyconjp2016 pyftplib
Pyconjp2016 pyftplibPyconjp2016 pyftplib
Pyconjp2016 pyftplibShinya Okano
 
幾個曾經 發生在數位系的小故事
幾個曾經 發生在數位系的小故事幾個曾經 發生在數位系的小故事
幾個曾經 發生在數位系的小故事小均 張
 
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!Antoine Choppin
 
Python入門 コードリーディング - PyConJP2016
Python入門 コードリーディング - PyConJP2016Python入門 コードリーディング - PyConJP2016
Python入門 コードリーディング - PyConJP2016Shinya Okano
 
Robot framework association intro
Robot framework association   introRobot framework association   intro
Robot framework association introIsmo Aro
 
利用 Appium + Robot Framework 實現跨平台 App 互動測試
利用 Appium + Robot Framework 實現跨平台 App 互動測試利用 Appium + Robot Framework 實現跨平台 App 互動測試
利用 Appium + Robot Framework 實現跨平台 App 互動測試Jeremy Kao
 
Pythonで実現する4コマ漫画の分析・評論
Pythonで実現する4コマ漫画の分析・評論Pythonで実現する4コマ漫画の分析・評論
Pythonで実現する4コマ漫画の分析・評論esu ji
 
4コマ漫画 Machine Learning 分析データを集めたかった話
4コマ漫画 Machine Learning 分析データを集めたかった話4コマ漫画 Machine Learning 分析データを集めたかった話
4コマ漫画 Machine Learning 分析データを集めたかった話esu ji
 
Web testing automation
Web testing automationWeb testing automation
Web testing automationkuozui
 
開放資料與 Drupal
開放資料與 Drupal開放資料與 Drupal
開放資料與 DrupalCharles Chuang
 
Entity framework + Linq 介紹
Entity framework + Linq 介紹Entity framework + Linq 介紹
Entity framework + Linq 介紹Alan Tsai
 
並行與平行
並行與平行並行與平行
並行與平行Justin Lin
 
ATDD Using Robot Framework
ATDD Using Robot FrameworkATDD Using Robot Framework
ATDD Using Robot FrameworkPekka Klärck
 
Functional Tests Automation with Robot Framework
Functional Tests Automation with Robot FrameworkFunctional Tests Automation with Robot Framework
Functional Tests Automation with Robot Frameworklaurent bristiel
 
Frontend django, Django Web 前端探索
Frontend django, Django Web 前端探索Frontend django, Django Web 前端探索
Frontend django, Django Web 前端探索Tim (文昌)
 
Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3
Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3
Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3Kuro Hsu
 

Viewers also liked (20)

Introduction of Feedy
Introduction of FeedyIntroduction of Feedy
Introduction of Feedy
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャ
 
Pyconjp2016 pyftplib
Pyconjp2016 pyftplibPyconjp2016 pyftplib
Pyconjp2016 pyftplib
 
幾個曾經 發生在數位系的小故事
幾個曾經 發生在數位系的小故事幾個曾經 發生在數位系的小故事
幾個曾經 發生在數位系的小故事
 
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!
RaspberryPiで日本の子供たちにプログラミングのパッションを伝えよう!
 
Python入門 コードリーディング - PyConJP2016
Python入門 コードリーディング - PyConJP2016Python入門 コードリーディング - PyConJP2016
Python入門 コードリーディング - PyConJP2016
 
Robot framework association intro
Robot framework association   introRobot framework association   intro
Robot framework association intro
 
利用 Appium + Robot Framework 實現跨平台 App 互動測試
利用 Appium + Robot Framework 實現跨平台 App 互動測試利用 Appium + Robot Framework 實現跨平台 App 互動測試
利用 Appium + Robot Framework 實現跨平台 App 互動測試
 
Pythonで実現する4コマ漫画の分析・評論
Pythonで実現する4コマ漫画の分析・評論Pythonで実現する4コマ漫画の分析・評論
Pythonで実現する4コマ漫画の分析・評論
 
4コマ漫画 Machine Learning 分析データを集めたかった話
4コマ漫画 Machine Learning 分析データを集めたかった話4コマ漫画 Machine Learning 分析データを集めたかった話
4コマ漫画 Machine Learning 分析データを集めたかった話
 
Web testing automation
Web testing automationWeb testing automation
Web testing automation
 
Python入門
Python入門Python入門
Python入門
 
開放資料與 Drupal
開放資料與 Drupal開放資料與 Drupal
開放資料與 Drupal
 
Entity framework + Linq 介紹
Entity framework + Linq 介紹Entity framework + Linq 介紹
Entity framework + Linq 介紹
 
並行與平行
並行與平行並行與平行
並行與平行
 
ATDD Using Robot Framework
ATDD Using Robot FrameworkATDD Using Robot Framework
ATDD Using Robot Framework
 
JavaCro'14 - Test Automation using RobotFramework Libraries – Stojan Peshov
JavaCro'14 - Test Automation using RobotFramework Libraries – Stojan PeshovJavaCro'14 - Test Automation using RobotFramework Libraries – Stojan Peshov
JavaCro'14 - Test Automation using RobotFramework Libraries – Stojan Peshov
 
Functional Tests Automation with Robot Framework
Functional Tests Automation with Robot FrameworkFunctional Tests Automation with Robot Framework
Functional Tests Automation with Robot Framework
 
Frontend django, Django Web 前端探索
Frontend django, Django Web 前端探索Frontend django, Django Web 前端探索
Frontend django, Django Web 前端探索
 
Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3
Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3
Rails Girls Weekly - 初探前端網頁技術 JavaScript 3/3
 

Similar to Webフレームワークを作ってる話 #osakapy

Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの PerlのつかいかたRyuzo Yamamoto
 
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~genroku
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botdcubeio
 
近頃のDockerネットワーク
近頃のDockerネットワーク近頃のDockerネットワーク
近頃のDockerネットワークYuji Oshima
 
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情Hirotaka Kawata
 
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話R S
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますfukuoka.ex
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Shogo Kawahara
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
Observability, Service Mesh and Microservices
Observability, Service Mesh and MicroservicesObservability, Service Mesh and Microservices
Observability, Service Mesh and MicroservicesTaiki
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsYoshio Terada
 
2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)Naoki Okino
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」fukuoka.ex
 

Similar to Webフレームワークを作ってる話 #osakapy (20)

Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの Perlのつかいかた
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
HTML5最新動向
HTML5最新動向HTML5最新動向
HTML5最新動向
 
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack bot
 
近頃のDockerネットワーク
近頃のDockerネットワーク近頃のDockerネットワーク
近頃のDockerネットワーク
 
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
KotlinConf 2018 から見る 最近の Kotlin サーバーサイド事情
 
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
 
[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
Observability, Service Mesh and Microservices
Observability, Service Mesh and MicroservicesObservability, Service Mesh and Microservices
Observability, Service Mesh and Microservices
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab Contents
 
2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)
 
RESTful Webサービス
RESTful WebサービスRESTful Webサービス
RESTful Webサービス
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
 

More from Masashi Shibata

MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...Masashi Shibata
 
実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72Masashi Shibata
 
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1Masashi Shibata
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
Implementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generatorImplementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generatorMasashi Shibata
 
DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会Masashi Shibata
 
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnGoptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnMasashi Shibata
 
PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019Masashi Shibata
 
Djangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationDjangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationMasashi Shibata
 
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018Masashi Shibata
 
Django の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsDjango の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsMasashi Shibata
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPMasashi Shibata
 
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)Masashi Shibata
 
Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法Masashi Shibata
 
How to develop a rich terminal UI application
How to develop a rich terminal UI applicationHow to develop a rich terminal UI application
How to develop a rich terminal UI applicationMasashi Shibata
 
pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話Masashi Shibata
 
Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3Masashi Shibata
 
テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2Masashi Shibata
 
Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015
Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015
Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015Masashi Shibata
 

More from Masashi Shibata (20)

MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
MLOps Case Studies: Building fast, scalable, and high-accuracy ML systems at ...
 
実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72実践Djangoの読み方 - みんなのPython勉強会 #72
実践Djangoの読み方 - みんなのPython勉強会 #72
 
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
CMA-ESサンプラーによるハイパーパラメータ最適化 at Optuna Meetup #1
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
Implementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generatorImplementing sobol's quasirandom sequence generator
Implementing sobol's quasirandom sequence generator
 
DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会DARTS: Differentiable Architecture Search at 社内論文読み会
DARTS: Differentiable Architecture Search at 社内論文読み会
 
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 AutumnGoptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
Goptuna Distributed Bayesian Optimization Framework at Go Conference 2019 Autumn
 
PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019PythonとAutoML at PyConJP 2019
PythonとAutoML at PyConJP 2019
 
Djangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationDjangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django application
 
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
 
Django の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsDjango の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication Patterns
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
 
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
システムコールトレーサーの動作原理と実装 (Writing system call tracer for Linux/x86)
 
Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法
 
How to develop a rich terminal UI application
How to develop a rich terminal UI applicationHow to develop a rich terminal UI application
How to develop a rich terminal UI application
 
Pythonのすすめ
PythonのすすめPythonのすすめ
Pythonのすすめ
 
pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話pandasによるデータ加工時の注意点やライブラリの話
pandasによるデータ加工時の注意点やライブラリの話
 
Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3Pythonistaのためのデータ分析入門 - C4K Meetup #3
Pythonistaのためのデータ分析入門 - C4K Meetup #3
 
テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2
 
Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015
Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015
Introduction of PyCon JP 2015 at PyCon APAC/Taiwan 2015
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Recently uploaded (9)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

Webフレームワークを作ってる話 #osakapy

  • 2. @c_bata_ django / flask / pandas 明石高専
  • 3. 話すこと 1. WSGIの話とか 2. WAFに欲しい機能を考える 3. Kobinの紹介 4. Kobinにおける取り組み
  • 6. WSGI v1.0.1 (PEP3333) • 2つの引数を持った呼び出し可能なオブジェクト • 第2引数として渡されたオブジェクトにHTTPス テータスコードと (header_name, header_value) タプルのリストを渡す • 返り値はバイト文字列を yield する iterableなオ ブジェクト https://www.python.org/dev/peps/pep-3333/
  • 7. WSGI v1.0.1 (PEP3333) def app(env, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b"Hello World"] • 2つの引数を持った呼び出し可能なオブジェクト https://www.python.org/dev/peps/pep-3333/
  • 8. WSGI v1.0.1 (PEP3333) def app(env, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b"Hello World"] • 第2引数として渡されたオブジェクトの引数は
 HTTPステータスコードと
 (header_name, header_value) タプルのリスト https://www.python.org/dev/peps/pep-3333/
  • 9. WSGI v1.0.1 (PEP3333) def app(env, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b"Hello World"] • バイト文字列を yield する iterable を返さなければ ならない • 例えば、バイト文字列のリストを返すようにする https://www.python.org/dev/peps/pep-3333/
  • 10. Hello World with gunicorn $ gunicorn -w 1 main:app [2016-04-15 10:17:00 +0900] [1873] [INFO] Starting gunicorn 19.4.5 [2016-04-15 10:17:00 +0900] [1873] [INFO] Listening at: http://127.0.0.1:8000 (1873) [2016-04-15 10:17:00 +0900] [1873] [INFO] Using worker: sync [2016-04-15 10:17:00 +0900] [1878] [INFO] Booting worker with pid: 1878 ^C[2016-04-15 10:17:08 +0900] [1873] [INFO] Handling signal: int [2016-04-15 10:17:08 +0900] [1878] [INFO] Worker exiting (pid: 1878) [2016-04-15 10:17:08 +0900] [1873] [INFO] Shutting down: Master def app(env, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b"Hello World"]
  • 11. Hello World with wsgiref $ python main.py 127.0.0.1 - - [15/Apr/2016 10:24:21] "GET / HTTP/1.1" 200 11 127.0.0.1 - - [15/Apr/2016 10:24:21] "GET /favicon.ico HTTP/1.1" 200 11 def app(env, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b"Hello World"]
 
 if __name__ == '__main__': from wsgiref.simple_server import make_server httpd = make_server('', 8080, app) httpd.serve_forever()
  • 13. 最低限欲しい機能 • ルーティング • どこにアクセスしても Hello World • HTMLテンプレート • 今はplain text返してるだけ • Jinja2のTemplate Loaderを用意
  • 14. 最低限欲しい機能 • 静的ファイルをいい感じに返す機能 • 本番だとNginxとか使うけど、開発中は... • リクエスト・レスポンスオブジェクト • リクエスト情報はenvが渡されてるけど、
 ただのdictなのでうまくパースしてほしい • ステータスとかヘッダ情報をコントロール
  • 15. a small and statically-typed web framework kobin https://github.com/c-bata/kobin
  • 16. a small and statically-typed web framework kobin https://github.com/c-bata/kobin
  • 17. Hello World from kobin import Kobin app = Kobin() @app.route('^/(?P<name>w*)$') def hello(name: str): return "Hello {}!!".format(name) if __name__ == '__main__': app.run() • 日本語: https://kobin.readthedocs.org/ja/latest/ • English: https://kobin.readthedocs.org/en/latest/
  • 18. Hello World with Jinja2 import os from kobin import Kobin, template app = Kobin() @app.route('^/$') def index(): return template('index') • https://github.com/c-bata/kobin-example • https://kobin.herokuapp.com/
  • 19. 特徴 • Type Hintsの活用 • Bottleのコードを読んでる時に結構混乱 • mypy 使いたい • ルーティングへの活用
  • 20. Routing in Django from django.conf.urls import url urlpatterns = [ url(r'^blog/page(?P<num>[0-9]+)/$', page), ] def page(request, num="1"): # Output the appropriate page of blog entries ... https://docs.djangoproject.com/en/1.9/topics/http/urls/ • 引数が全て文字列
  • 21. Routing in Bottle from bottle import route @route('/object/<id:int>') def callback(id): assert isinstance(id, int) http://bottlepy.org/docs/dev/tutorial.html#request-routing • 独自DSL • 型が分かるため、view関数には型変換したオブジェ クトを渡すことができる
  • 22. ルーティングに対する考察 • 正規表現ベース (Django等) • 自由度は高い • 型情報を取得出来ない • 独自DSL (Bottle, Flask等) • 自由度は低い • 型情報を自由に付けれる
  • 23. Routing in Kobin from kobin import Kobin app = Kobin() @app.route('^/years/(?P<year>d{4})$') def casted_year( year: int ): return 'A "year" argument is integer? : {}’ .format(isinstance(year, int)) https://github.com/c-bata/kobin/blob/master/example/hello_world.py • 正規表現により自由度が高い • Type Hintsの恩恵(IDE, mypy)をそのまま受けれる
  • 24. Ecosystem Threats to Python • Pythonのエコシステムはその巨大さゆえに、バー ジョンアップについていきづらい • コミュニティとしてもPython3に移行していきたい • Type Hintsを移行のきっかけに PyCon APAC/Taiwan 2015: Keynote
  • 25. References • Documentations • https://kobin.readthedocs.org/ja/latest/ • https://kobin.readthedocs.org/en/latest/ • Kobin Example • https://github.com/c-bata/kobin-example • https://kobin.herokuapp.com/
  • 27. PEP333 と PEP3333 $ python2.7 >>> b'hoge' + u'日本語' u'hogeu65e5u672cu8a9e' $ python3.5 >>> b'hoge' + u'日本語' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't concat bytes to str
  • 28. PEP333 と PEP3333 • PEP333 (WSGI v1.0) • Python2ではbytesとstrを結合出来たり… • Python3で文字列の扱いが大きく変わった • PEP3333 (WSGI v1.0.1) • 後方互換は保ったまま、文字列の扱いを整備して 長年たまってたデファクトの修正案も取り込み