SlideShare a Scribd company logo
1 of 56
Download to read offline
1
Bottleではじめる
WEBアプリの最初の一歩
2016/07/06
みんなのPython勉強会#14
山田 聡(@denzowill)
2
# whoami
•名前
• 山田 聡(@denzowill)
•仕事
• DBエンジニア(○racle,PostgreSQL)
• チョットだけWebLogicエンジニア
• Pythonは趣味
•スキル
• 統計もわかりません
• 機械学習もわかりません
• ちょっとWEBアプリわかります
3
アジェンダ
•WEBアプリ?
•フレームワークとハードル
•だからBottle
4
アジェンダ
•WEBアプリ?
•フレームワークとハードル
•だからBottle
5
WEBアプリ?
•そもとも普通のWEBサーバ
Apacheとか、WEBサーバは指定されたアドレスにある
静的なHTMLをそのまま戻す。内容は固定。
6
WEBアプリ?
•昔からのWEBアプリケーション
サーバでJavaとかPythonが動いてて、HTTP通信で
渡ってきたデータを元に、頑張って動的なHTMLを
組み立てて、ブラウザでそれを表示する。
7
WEBアプリ?
•最近のWEBアプリケーション
動的なHTMLを受けとるだけでなく、Javascriptが頑
張って裏ですっごい非同期通信して、ページ遷移無しで
もいろいろ画面がかわる
8
今回は?
9
今回は?
今回はこちら中心です。
(基本なので。)
10
WEBアプリに必要なもの
ルーティング
http://xx/list
http://xx/add
http://xx/del/2
入口
view_list()
add_item()
del_item(
id=2
)
→ URLと処理のマッピング
11
WEBアプリに必要なもの
ビジネスロジック → あなたがやりたいこと
普通の処理
def view_list():
connect = db.connect()
cur = connect.cursor()
cur.execute("select id,name from items order by id")
item_list = []
for row in cur.fetchall():
item_list.append({
"id":row[0], "item_name": row[1]
})
return item_list
DBから商品一覧を
取得したい etc
12
WEBアプリに必要なもの
HTMLの表示 → ビジネスロジックの結果を画面に
<h1>アイテム一覧</h1>
<table border="1">
%for item in item_list:
<tr>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
</tr>
%end
</table>
13
アジェンダ
•WEBアプリ?
•フレームワークとハードル
•だからBottle
14
フレームワークとハードル
•WEBアプリケーションフレームワーク(WAF)?
あるルールに従って作成すると、簡単にWEBアプリケー
ションが作成できるようにしたライブラリの集合のよう
なもの。
15
フレームワークのよくある機能
•ルーティング
• URLに応じて処理先を割り当て
•テンプレート
• HTMLを簡単に動的に組み立て
•ORM
• RDBMS等をオブジェクトとして透過的に操作
16
フレームワークのよくある機能
•ルーティング
• URLに応じて処理先を割り当て
•テンプレート
• HTMLを簡単に動的に組み立て
•ORM
• RDBMS等をオブジェクトとして透過的に操作
フレームワークによっては
他のORMライブラリを
組み込むケースも
17
WEBアプリのデザインパターン
MODEL
VIEW
CONTROLER
ビジネスロジック
DBでの永続化
画面表示
HTML/CSS
ルーティング
MVの橋渡し
18
WEBアプリのデザインパターン
MODEL
VIEW
CONTROLER
19
WEBアプリのデザインパターン
MODEL
VIEW
CONTROLER
→ こうするとキレイに書けるよって話
20
このあたりから
途端に辛い
21
なんでつらい?
•MVCとかMTVとかいろいろある
•フレームワーク毎に解釈が違ったりする
•フレームワークの作法に従えばなんとなくは
できる
•でも、それはそのフレームワークに縛られる
22
なんでつらい?
•MVCとかMTVとかいろいろある
•フレームワーク毎に解釈が違ったりする
•フレームワークの作法に従えばなんとなくは
できる
•でも、それはそのフレームワークに縛られる
一旦MVCは忘れて
基本を見てみる
23
機能と学習量の関係
すごい
つらい
24
機能と挫折率の関係
すごい
つらい
25
機能と挫折率の関係
すごい
つらい
26
アジェンダ
•WEBアプリ?
•フレームワークとハードル
•だからBottle
27
Bottleはとてもシンプル
28
Bottleはとてもシンプル
•テンプレート、ルーティングの機能あり(ORM無し)
•bottle.pyという1ファイルがすべて
•外部ライブラリに依存性無し
•シンプルだからWEBアプリの動きをつかみやすい
学習に最適!
29
この時点で残り10分
ですが(想定)、いまから
アプリ書きます
30
つくるもの
•アイテムの一覧が見られる(参照)
•フォームからアイテムを追加できる(登録)
•既存のアイテムを削除できる(更新)
この3つが大体基本
31
Bottleセットアップ
$ mkdir <適当なディレクトリ>
$ cd <作ったディレクトリ>
$ wget https://github.com/bottlepy/bottle/raw/master/bottle.py
bottle.pyを持ってくれば終わり
32
Bottleの動作確認
from bottle import route, run
# / にアクセスしたら index関数が呼ばれる
@route("/")
def index():
# 画面に表示されて欲しいHTMLを戻す
return "<h1>WELCOME STAPY!</h1>"
# サーバを起動(localhost:9999で起動する設定)
run(reloader=True, port=9999)
app.py
33
$ python app.py
34
アイテム一覧見たい
# アイテム一覧を戻す関数
@route("/list")
def view_list():
# ダミーデータ(あとでDBから取得するようにする)
item_list = [
{"id": 1, "name": "りんご"},
{"id": 2, "name": "ばなな"},
{"id": 3, "name": "すいか"},
]
# 表示用のHTMLを組み立てる
display_html = "<table border='1'>"
for item in item_list:
display_html += "<tr>"
display_html += "<td>{}</td>".format(item["id"])
display_html += "<td>{}</td>".format(item["name"])
display_html += "</tr>"
display_html += "</table>"
return display_html
app.py
35
http://127.0.0.1:9999/list
36
HTMLをベタがき
つらいので
テンプレートつかう
37
テンプレート使う
<h1>アイテム一覧</h1>
<table border="1">
%for item in item_list:
<tr>
<td>{{item["id"]}}</td>
<td>{{item["name"]}}</td>
</tr>
%end
</table>
list_tmpl.tpl
ほぼHTML
% や{{ }}のなかだけ
Pythonのように処理される
item_listは
使うときにapp.pyから
ディクショナリを渡す
38
テンプレート使う
from bottle import route, run, template
:
:
# アイテム一覧を戻す関数
@route("/list")
def view_list():
# ダミーデータ(あとでDBから取得するようにする)
item_list = [
{"id": 1, "name": "りんご"},
{"id": 2, "name": "ばなな"},
{"id": 3, "name": "すいか"},
]
# 表示はテンプレートを戻すだけ
return template("list_tmpl", item_list=item_list)
app.py
39
http://127.0.0.1:9999/list
さっきと同じだけど\(^o^)/
40
DBのデータを参照する
(sqliteつかう)
41
初期データの準備
import sqlite3
# items.dbとつなぐ(なければ作られる)
conn = sqlite3.connect('items.db')
c = conn.cursor()
# テーブル作成
c.execute("create table items(id, name)")
# 3行投入
c.execute("insert into items values(1,'りんご')")
c.execute("insert into items values(2,'ばなな')")
c.execute("insert into items values(3,'すいか')")
# 確定
conn.commit()
# バイバイ
conn.close()
pythonを対話型で起動して実行
42
DBからitem_listを取得するように変更
import sqlite3
from bottle import route, run, template
:
:
@route("/list")
def view_list():
# items.dbとつなぐ
conn = sqlite3.connect('items.db')
c = conn.cursor()
c.execute("select id,name from items order by id")
item_list = []
for row in c.fetchall():
item_list.append({
"id": row[0],
"name": row[1]
})
conn.close()
# 表示はテンプレートを戻すだけ
return template("list_tmpl", item_list=item_list)
app.py
43
登録処理作る
44
登録用のフォームのテンプレート作る
<h1>アイテム登録</h1>
<form action='' method='POST'>
<input type='text' name='item_name' placeholder='アイテム名'/>
<input type='submit' value='登録' />
</form>
add_tmpl.tpl
45
ルーティングとメソッド作成
@route("/add", method=["GET","POST"])
def add_item():
return template("add_tmpl")
app.py GETとPOST
両方でアクセス
できるようにする
46
http://127.0.0.1:9999/add
登録は押せる
ただし何も起きない
47
ルーティングとメソッド作成
@route("/add", method=["GET","POST"])
def add_item():
if request.method == "POST":
# POSTアクセスならDBに登録する
# フォームから入力されたアイテム名の取得(Python2ならrequest.POST.getunicodeを使う)
item_name = request.POST.getunicode("item_name")
conn = sqlite3.connect('items.db')
c = conn.cursor()
# 現在の最大ID取得(fetchoneの戻り値はタプル)
new_id = c.execute("select max(id) + 1 from items").fetchone()[0]
c.execute("insert into items values(?,?)", (new_id, item_name))
conn.commit()
conn.close()
return "SUCCESS"
else:
# GETアクセスならフォーム表示
return template("add_tmpl")
app.py
POST/GETで分岐
GETはフォーム出すだけ
formからPOSTされた
データを取得
48
http://127.0.0.1:9999/add
49
削除処理作る
50
一覧画面のテンプレート変更し削除リンク追加
<h1>アイテム一覧</h1>
<a href='/add' >新規作成</a>
<table border="1">
%for item in item_list:
<tr>
<td>{{item["id"]}}</td>
<td>{{item["name"]}}</td>
<td><a href="/del/{{item['id']}}">削除</a></td>
</tr>
%end
</table>
list_tmpl.tpl
ついでに新規作成つけとく
削除リンク
/del/1や/del/2といった
URLへリンクする
51
削除処理を追加、URLから削除対象のID取得
# /del/100 -> item_id = 100
# /del/one -> HTTPError 404
@route("/del/<item_id:int>")
def del_item(item_id):
conn = sqlite3.connect('items.db')
c = conn.cursor()
# 指定されたitem_idを元にDBデータを削除
c.execute("delete from items where id=?", (item_id,))
conn.commit()
conn.close()
# 処理終了後に一覧画面に戻す
return redirect("/list")
app.py
delの後ろに数字がくると
関数の引数として取れる
後はそれで
delete文するだけ
52
http://127.0.0.1:9999/list
押したら消える
53
完成https://github.com/denzow/sample_bottle
54
10分で基本的な要素を
抑えたWEBアプリが
できました(想定では)
55
次の一歩に向けて
•参照・登録・削除ができればアプリは作れる
•見た目はCSSやJavascriptを覚える
• 参考:Bootstrap http://getbootstrap.com/
•アプリが大きくなると各所で辛さが出る
• SQLの管理
• ルーティングの管理
•辛くなったらもっと高機能なWAFを覚えて見る
56
ご清聴ありがとうございました。

More Related Content

What's hot

HoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみた
HoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみたHoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみた
HoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみたFranz Weitl
 
JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料Morpho, Inc.
 
フリップボード・ブレスト(Online版)
フリップボード・ブレスト(Online版)フリップボード・ブレスト(Online版)
フリップボード・ブレスト(Online版)Rikie Ishii
 
SSII2020SS: 微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​
SSII2020SS:  微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​SSII2020SS:  微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​
SSII2020SS: 微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​SSII
 
Objectnessとその周辺技術
Objectnessとその周辺技術Objectnessとその周辺技術
Objectnessとその周辺技術Takao Yamanaka
 
階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門shima o
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
四脚ロボットによる つくばチャレンジへの取り組み
四脚ロボットによるつくばチャレンジへの取り組み四脚ロボットによるつくばチャレンジへの取り組み
四脚ロボットによる つくばチャレンジへの取り組みkiyoshiiriemon
 
LiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピングLiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピングTakuya Minagawa
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門KnowledgeGraph
 
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日Kitsukawa Yuki
 
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理Toru Tamaki
 
3次元レジストレーション(PCLデモとコード付き)
3次元レジストレーション(PCLデモとコード付き)3次元レジストレーション(PCLデモとコード付き)
3次元レジストレーション(PCLデモとコード付き)Toru Tamaki
 
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentationTakuya Minagawa
 
傾向スコアの概念とその実践
傾向スコアの概念とその実践傾向スコアの概念とその実践
傾向スコアの概念とその実践Yasuyuki Okumura
 
3Dマップを活用したVisual Localization
3Dマップを活用したVisual Localization3Dマップを活用したVisual Localization
3Dマップを活用したVisual LocalizationHajime Taira
 
SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向SSII
 
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜SSII
 
Rでコンジョイント分析
Rでコンジョイント分析Rでコンジョイント分析
Rでコンジョイント分析osamu morimoto
 
情報抽出入門 〜非構造化データを構造化させる技術〜
情報抽出入門 〜非構造化データを構造化させる技術〜情報抽出入門 〜非構造化データを構造化させる技術〜
情報抽出入門 〜非構造化データを構造化させる技術〜Yuya Unno
 

What's hot (20)

HoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみた
HoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみたHoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみた
HoloLens で OpenCV をどう使うか レーザーポインター 認識で試してみた
 
JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料JDLA主催「CVPR2023技術報告会」発表資料
JDLA主催「CVPR2023技術報告会」発表資料
 
フリップボード・ブレスト(Online版)
フリップボード・ブレスト(Online版)フリップボード・ブレスト(Online版)
フリップボード・ブレスト(Online版)
 
SSII2020SS: 微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​
SSII2020SS:  微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​SSII2020SS:  微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​
SSII2020SS: 微分可能レンダリングの最新動向 〜「見比べる」ことによる3次元理解 〜​
 
Objectnessとその周辺技術
Objectnessとその周辺技術Objectnessとその周辺技術
Objectnessとその周辺技術
 
階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
四脚ロボットによる つくばチャレンジへの取り組み
四脚ロボットによるつくばチャレンジへの取り組み四脚ロボットによるつくばチャレンジへの取り組み
四脚ロボットによる つくばチャレンジへの取り組み
 
LiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピングLiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピング
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門
 
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
 
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
 
3次元レジストレーション(PCLデモとコード付き)
3次元レジストレーション(PCLデモとコード付き)3次元レジストレーション(PCLデモとコード付き)
3次元レジストレーション(PCLデモとコード付き)
 
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
 
傾向スコアの概念とその実践
傾向スコアの概念とその実践傾向スコアの概念とその実践
傾向スコアの概念とその実践
 
3Dマップを活用したVisual Localization
3Dマップを活用したVisual Localization3Dマップを活用したVisual Localization
3Dマップを活用したVisual Localization
 
SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向
 
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
 
Rでコンジョイント分析
Rでコンジョイント分析Rでコンジョイント分析
Rでコンジョイント分析
 
情報抽出入門 〜非構造化データを構造化させる技術〜
情報抽出入門 〜非構造化データを構造化させる技術〜情報抽出入門 〜非構造化データを構造化させる技術〜
情報抽出入門 〜非構造化データを構造化させる技術〜
 

Similar to bottleで始めるWEBアプリの最初の一歩

DBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキルDBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキルSatoshi Yamada
 
第45回PHP勉強会(里洋平)
第45回PHP勉強会(里洋平)第45回PHP勉強会(里洋平)
第45回PHP勉強会(里洋平)Yohei Sato
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルSatoshi Yamada
 
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介Hajime Fujimoto
 
Flow を使って効率的にデータを集めたその後は Power BI に繋げよう
Flow を使って効率的にデータを集めたその後は Power BI に繋げようFlow を使って効率的にデータを集めたその後は Power BI に繋げよう
Flow を使って効率的にデータを集めたその後は Power BI に繋げようYugo Shimizu
 
Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Tokuhiro Matsuno
 
AWSerにも知ってほしいDBの話
AWSerにも知ってほしいDBの話AWSerにも知ってほしいDBの話
AWSerにも知ってほしいDBの話Kenichiro Mori
 
PHP7実環境ベンチ2016春
PHP7実環境ベンチ2016春PHP7実環境ベンチ2016春
PHP7実環境ベンチ2016春Ryo Tomidokoro
 
LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45civic Sasaki
 
俺とシビックテックとDiy
俺とシビックテックとDiy俺とシビックテックとDiy
俺とシビックテックとDiyMasayuki KaToH
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botdcubeio
 
第八回 #渋谷Java 最近のjava PaaS事情
第八回 #渋谷Java 最近のjava PaaS事情第八回 #渋谷Java 最近のjava PaaS事情
第八回 #渋谷Java 最近のjava PaaS事情Kazuhiro Serizawa
 
私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46civicpg
 
Talking about Microsoft On-premises Data Gateway
Talking about Microsoft On-premises Data GatewayTalking about Microsoft On-premises Data Gateway
Talking about Microsoft On-premises Data GatewayShinya Sakakibara
 
ソフトウェア開発が好きだ
ソフトウェア開発が好きだソフトウェア開発が好きだ
ソフトウェア開発が好きだKoichi Ota
 
『アジャイルデータサイエンス』1章 理論
『アジャイルデータサイエンス』1章 理論 『アジャイルデータサイエンス』1章 理論
『アジャイルデータサイエンス』1章 理論 Hisao Soyama
 
dots. 7/7 DSWBハンズオン資料
dots. 7/7 DSWBハンズオン資料dots. 7/7 DSWBハンズオン資料
dots. 7/7 DSWBハンズオン資料s. kaijima
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Drecom Co., Ltd.
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 

Similar to bottleで始めるWEBアプリの最初の一歩 (20)

DBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキルDBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキル
 
第45回PHP勉強会(里洋平)
第45回PHP勉強会(里洋平)第45回PHP勉強会(里洋平)
第45回PHP勉強会(里洋平)
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
 
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
 
Flow を使って効率的にデータを集めたその後は Power BI に繋げよう
Flow を使って効率的にデータを集めたその後は Power BI に繋げようFlow を使って効率的にデータを集めたその後は Power BI に繋げよう
Flow を使って効率的にデータを集めたその後は Power BI に繋げよう
 
Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用
 
AWSerにも知ってほしいDBの話
AWSerにも知ってほしいDBの話AWSerにも知ってほしいDBの話
AWSerにも知ってほしいDBの話
 
PHP7実環境ベンチ2016春
PHP7実環境ベンチ2016春PHP7実環境ベンチ2016春
PHP7実環境ベンチ2016春
 
LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45
 
俺とシビックテックとDiy
俺とシビックテックとDiy俺とシビックテックとDiy
俺とシビックテックとDiy
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack bot
 
第八回 #渋谷Java 最近のjava PaaS事情
第八回 #渋谷Java 最近のjava PaaS事情第八回 #渋谷Java 最近のjava PaaS事情
第八回 #渋谷Java 最近のjava PaaS事情
 
私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46
 
Talking about Microsoft On-premises Data Gateway
Talking about Microsoft On-premises Data GatewayTalking about Microsoft On-premises Data Gateway
Talking about Microsoft On-premises Data Gateway
 
ソフトウェア開発が好きだ
ソフトウェア開発が好きだソフトウェア開発が好きだ
ソフトウェア開発が好きだ
 
『アジャイルデータサイエンス』1章 理論
『アジャイルデータサイエンス』1章 理論 『アジャイルデータサイエンス』1章 理論
『アジャイルデータサイエンス』1章 理論
 
dots. 7/7 DSWBハンズオン資料
dots. 7/7 DSWBハンズオン資料dots. 7/7 DSWBハンズオン資料
dots. 7/7 DSWBハンズオン資料
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 

More from Satoshi Yamada

Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)Satoshi Yamada
 
pythonでemlファイルを扱う話
pythonでemlファイルを扱う話pythonでemlファイルを扱う話
pythonでemlファイルを扱う話Satoshi Yamada
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLSatoshi Yamada
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社Satoshi Yamada
 
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話本気でPythonで宛名書きした話
本気でPythonで宛名書きした話Satoshi Yamada
 
10080分でPythonからIP Messeneger
10080分でPythonからIP Messeneger10080分でPythonからIP Messeneger
10080分でPythonからIP MessenegerSatoshi Yamada
 
15分で情シスに怒られる方法
15分で情シスに怒られる方法15分で情シスに怒られる方法
15分で情シスに怒られる方法Satoshi Yamada
 
Djangoで業務改善したい
Djangoで業務改善したいDjangoで業務改善したい
Djangoで業務改善したいSatoshi Yamada
 
PostgreSQL実行計画入門@関西PostgreSQL勉強会
PostgreSQL実行計画入門@関西PostgreSQL勉強会PostgreSQL実行計画入門@関西PostgreSQL勉強会
PostgreSQL実行計画入門@関西PostgreSQL勉強会Satoshi Yamada
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)Satoshi Yamada
 
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)Satoshi Yamada
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)Satoshi Yamada
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)Satoshi Yamada
 

More from Satoshi Yamada (13)

Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)
 
pythonでemlファイルを扱う話
pythonでemlファイルを扱う話pythonでemlファイルを扱う話
pythonでemlファイルを扱う話
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQL
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社
 
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話本気でPythonで宛名書きした話
本気でPythonで宛名書きした話
 
10080分でPythonからIP Messeneger
10080分でPythonからIP Messeneger10080分でPythonからIP Messeneger
10080分でPythonからIP Messeneger
 
15分で情シスに怒られる方法
15分で情シスに怒られる方法15分で情シスに怒られる方法
15分で情シスに怒られる方法
 
Djangoで業務改善したい
Djangoで業務改善したいDjangoで業務改善したい
Djangoで業務改善したい
 
PostgreSQL実行計画入門@関西PostgreSQL勉強会
PostgreSQL実行計画入門@関西PostgreSQL勉強会PostgreSQL実行計画入門@関西PostgreSQL勉強会
PostgreSQL実行計画入門@関西PostgreSQL勉強会
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
 
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 

Recently uploaded

論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayersToru Tamaki
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑Akihiro Kadohata
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptxssuserbefd24
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)keikoitakurag
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdfAyachika Kitazaki
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一瑛一 西口
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計atsushi061452
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )iwashiira2ctf
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose EstimationToru Tamaki
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521Satoshi Makita
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員Sadaomi Nishi
 

Recently uploaded (11)

論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 

bottleで始めるWEBアプリの最初の一歩