SlideShare una empresa de Scribd logo
1 de 56
Descargar para leer sin conexión
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
ご清聴ありがとうございました。

Más contenido relacionado

La actualidad más candente

継続的インテグレーションとテストの話
継続的インテグレーションとテストの話継続的インテグレーションとテストの話
継続的インテグレーションとテストの話
Preferred Networks
 
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
naoto teshima
 

La actualidad más candente (20)

ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析
 
カスタムコネクタ入門
カスタムコネクタ入門カスタムコネクタ入門
カスタムコネクタ入門
 
SQuaRE に基づくソフトウェア品質評価枠組みと品質実態調査
SQuaRE に基づくソフトウェア品質評価枠組みと品質実態調査SQuaRE に基づくソフトウェア品質評価枠組みと品質実態調査
SQuaRE に基づくソフトウェア品質評価枠組みと品質実態調査
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
継続的インテグレーションとテストの話
継続的インテグレーションとテストの話継続的インテグレーションとテストの話
継続的インテグレーションとテストの話
 
Getting started with MLOps
Getting started with MLOpsGetting started with MLOps
Getting started with MLOps
 
Power Apps? なにそれ? おいしいの?
Power Apps? なにそれ? おいしいの?Power Apps? なにそれ? おいしいの?
Power Apps? なにそれ? おいしいの?
 
自社で実運用中!Power Apps・Power Automate 活用事例
自社で実運用中!Power Apps・Power Automate 活用事例自社で実運用中!Power Apps・Power Automate 活用事例
自社で実運用中!Power Apps・Power Automate 活用事例
 
ISO/IEC DIS 20246 についての(ごく簡単な)説明
ISO/IEC DIS 20246 についての(ごく簡単な)説明ISO/IEC DIS 20246 についての(ごく簡単な)説明
ISO/IEC DIS 20246 についての(ごく簡単な)説明
 
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説
 
そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?
 
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
 
音楽を見る:情報可視化技術の音楽情報処理への適用
音楽を見る:情報可視化技術の音楽情報処理への適用音楽を見る:情報可視化技術の音楽情報処理への適用
音楽を見る:情報可視化技術の音楽情報処理への適用
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Python パッケージの影響を歴史から理解してみよう!
Python パッケージの影響を歴史から理解してみよう!Python パッケージの影響を歴史から理解してみよう!
Python パッケージの影響を歴史から理解してみよう!
 
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方
 
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
 

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

LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45
civic Sasaki
 
『アジャイルデータサイエンス』1章 理論
『アジャイルデータサイエンス』1章 理論 『アジャイルデータサイエンス』1章 理論
『アジャイルデータサイエンス』1章 理論
Hisao Soyama
 

Similar a 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が3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 

Más de Satoshi Yamada

Más de 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)
 

Último

Último (12)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

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