SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
堀内 晨彦
@hico_horiuchi
  による
Webアプリ開発のキホン
Go
16/02/27 2
よろしくお願いします
まずは自己紹介から
自己紹介
Akihiko Horiuchi
香川大学 修士2年
bit.ly/hiconyan
Emacs / Ruby / Rails / Golang
Hubot / Sensu / Ansible
研究室のインフラと掃除担当
github.com/sai-lab/mouryou
github.com/sai-lab/mouryou-web
16/02/27 3
こんなことやってます
●  Sensu Deep Talks(東京)
●  Hubot×ChatOps勉強会(大阪、神戸)
16/02/27 4
16/02/27 5
   でWebアプリを
開発するメリットは?
Go
GoでWebアプリを開発する メリット
●  インタプリタと比較して 高速・軽量
○  Railsより50倍の速度と10倍の省メモリという話も[1]
●  並列処理 が簡単
○  goroutine(スレッド)と channel(メッセージパッシング)
○  go func() のように go を使うだけ
●  シングルバイナリ でデプロイ
○  コンパイルしたバイナリをアップロードするだけ
○  ライブラリのインストールなどが不要
○  コンテナ や マイクロサービス との親和性が高そう
16/02/27 6
[1] https://plus.google.com/+MattAimonetti/posts/PeZk8FY3PWY
GoでWebアプリを開発する メリット
●  コーディング規約 を統一
○  gofmt(goimports)で強制的に直される
○  可読性が上がる、チーム開発がスムーズになる
●  標準でテストをサポート
○  関数をテストする関数を *_test.go に書く
○  あとは go test で実行するだけ
16/02/27 7
func TestSum(t *testing.T) {
actual := Sum(10, 20)
expected := 30
if actual != expected {
t.Fatal("want", expected, "got", actual)
}
}
Goの採用事例
●  犬猫10秒動画共有アプリ「mofur」
○  「Sleipnir」のフェンリルが開発
○  アプリとWebのバックエンドでGoを採用
●  Webサイト無料製作サービス「Ownd」
○  「Ameba」のCyberAgentが開発
○  決め手は 可読性 、フレームワークとして Revel を採用
16/02/27 8
16/02/27 9
Webアプリの開発で
必要なコト、考えるコト
Goの 動物図鑑 が出ました
○  チャットアプリの作成
○  WebSocket、OAuth
○  コマンドラインツールの作成
○  ミドルウェアとの連携
○  Twitter、Googleとの連携
○  REST APIの公開
○  Goの開発環境構築
などなど
基本を押えた内容で
これからGoでWebアプリを
開発する人にオススメ
16/02/27 10
必要な コト 、考える コト
●  Webアプリケーションフレームワーク
○  RubyならRails、PythonならDjango、Goは?
○  デザインパターンは Model・View・Controller ?
●  データベース周りのコト
○  マイグレーションツールは?( rake db:migrate とか)
○  ORマッパーは?(ActiveRecordとか)
●  Viewは? テンプレートエンジンは?
○  標準で "text/template" と "html/template" が付属
○  でも Slim とか Haml とか使いたい
16/02/27 11
16/02/27 12
今日は    による
「Webアプリ開発の基礎」
「オススメのパッケージ」
をご紹介します
Go
16/02/27 13
ココカラが本題です
"net/http" のキホン
●  シンプルなWebサーバを作る
○  http.HandleFunc でルーティングを定義
(ただし "/users/:id" のようにパラメタは取れない)
○  http.ListenAndServe でWebサーバを起動
○  ログ出力は "log" を使って自分で書く
16/02/27 14
func main() {
http.HandleFunc("/",
func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, World!")
log.Printf("%+vn", r)
}
)
http.ListenAndServe(":8080", nil)
}
Webアプリフレームワーク
●  GoのWebアプリフレームワークは 戦国時代
○  まだデファクトスタンダードが決まってない
○  シンプル なモノから フルスタック なモノまで[2]
○  "net/http" をベースに機能を拡張したものが多い
16/02/27 15
シンプル
(ルーティングのみ)
フルスタック
(セッションなど)
github.com/zenazn/goji
github.com/gin-gonic/gin
github.com/gorilla/mux
github.com/revel/revel
[2] http://qiita.com/najeira/items/bdc988c4e93b3b5ccf2f
Webアプリフレームワーク
●  Goji( github.com/zenazn/goji )
●  Gorilla( github.com/gorilla/mux )
16/02/27 16
router := goji.New()
router.Get("/:name", handler)

func handler(c goji.C, w http.ResponseWriter, r ...) {
name := c.URLParams["name"]
fmt.Fprintf(w, "Hello, %s!n", name)
}
router := gorilla.NewRouter()
router.HandleFunc("/{name}", handler)

func handler(w http.ResponseWriter, r *http.Request) {
name := gorilla.Vars(r)["name"]
fmt.Fprintf(w, "Hello, %s!n", name)
}
GoでDBのマイグレーション
●  goose( bitbucket.org/liamstask/goose )
○  マイグレーション:DBのバージョン管理のこと
(テーブルの作成、カラムの追加、ロールバックなど)
○  マイグレーションのスクリプトは SQL かGoで書く
○  create 、up 、down コマンドを使って管理
16/02/27 17
$ goose create create_posts
goose: created db/migrations/20160226202023_create_posts.sql

$ goose up
goose: migrating db environment 'development', ...
OK 20160226202023_create_posts.sql

$ goose down
goose: migrating db environment 'development', ...
OK 20160226202023_create_posts.sql
gooseのマイグレーションファイル
●  マイグレーションファイルのサンプル
○  up・down に対応するSQLスクリプトを書く
○  Goで書く場合は sql.Tx.Exec でSQLを実行
○  IDの AUTO_INCREMENT や PRIMARY KEY の設定を忘れずに
16/02/27 18
-- +goose Up
-- SQL in section 'Up' is executed when this migration is ...
CREATE TABLE IF NOT EXISTS `posts` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`body` TEXT NOT NULL,
PRIMARY KEY (`id`)
);

-- +goose Down
-- SQL section 'Down' is executed when this migration is ...
DROP TABLE `posts`;
DBから構造体にマッピング
●  ORM(Object-Relation Mapping)
○  DBのタプルをGoの 構造体 に変換するもの
○  WAFと同じく シンプル なモノと フルスタック なモノ
○  マイグレーションもできるものが多い
16/02/27 19
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}

type User struct {
gorm.Model
Name string
}
ORマッパーのサンプル
●  GORM( github.com/jinzhu/gorm )
○  かなり 高機能 でActiveRecordに近い使用感
○  First などの便利な関数、クエリの連鎖も可能
●  genmai( github.com/naoina/genmai )
○  機能はシンプルでクエリビルダに近い
16/02/27 20
db.CreateTable(&User{})
user := User{Name: "Kagawa"}
db.Create(user)
db.Where(&User{Name: "Kagawa"}).First(&user)
db.CreateTable(&User{})
user := User{Name: "Kagawa"}
db.Insert(&user)
db.Select(&users, db.Where("name", "=", "Kagawa"))
"html/template" のキホン
●  テンプレートを使うハンドラーを作る
○  構造体 をテンプレートに渡して {{}} で展開
○  template.ParseFiles でファイル読み込みも可能
type Page struct {
Name string
}

func handler(w http.ResponseWriter, r *http.Request) {
tmpl, _ := template.New("tmpl").Parse("Hello, {{.Name}}!")
tmpl.Execute(w, Page{Name: "Golang"})
}

func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
16/02/27 21
テンプレエンジン Ace を使う
●  Ace( github.com/yosssi/ace )
○  SlimやJadeにインスパイアされてる
○  ace.Load すると *template.Template が返ってくる
○  部分テンプレートにも対応( render partial 的な)
16/02/27 22
= doctype html
html lang=en
head
title Hello Ace
= css
.blue { color: blue; }
body
h1.blue {{.Msg}}
p..
Ace is an HTML template engine for Go.
= javascript
console.log('Welcome to Ace');
Goのパッケージマネージャ
●  Godep( github.com/tools/godep )
○  Godeps.json に従って Godeps/_workspace に保存
○  Herokuなどでも採用され、ほぼスタンダード?
●  gom( github.com/mattn/gom )
○  使い勝手はほぼ Bundler + Gemfile と同じ
○  gom install 、gom exec 、gom build 、など
16/02/27 23
{
"Deps": [{
"ImportPath": "code.google.com/p/go-netrc/netrc",
"Rev": "28676070ab99"
}]
}
gom の使い方
●  Rubyist なのでgom推し
○  Gomfile を書いて gom install するだけ
○  パッケージをtag、branch、commit で指定可能
○  _vendor ディレクトリにパッケージが保存される
16/02/27 24
gom 'github.com/yosssi/ace'
gom 'github.com/zenazn/goji'

group :development do
gom 'github.com/pilu/fresh'
gom 'golang.org/x/tools/cmd/goimports'
end
$ gom install
downloading github.com/google/go-github/github
downloading github.com/yosssi/ace
...
ビルドツールで快適に開発
●  Fresh( github.com/pilu/fresh )
○  ソースコードの変更を検知してリビルド
○  変更の反映にコンパイルが必要なGoの強い味方
○  JavaScriptだとGrantとかgulpみたいな感じ?
○  監視する拡張子と間隔を設定できる
16/01/23 25
$ gom exec fresh -c runner.conf
Loading settings from runner.conf
22:7:30 runner | InitFolders
22:7:30 runner | mkdir ./tmp
22:7:30 runner | mkdir ./tmp: file exists
22:7:30 watcher | Watching .
22:7:30 watcher | Watching app
22:7:30 watcher | Watching app/controllers
22:7:30 watcher | Watching app/views
16/02/27 26
デモンストレーション
今回のポイント・工夫
●  GojiでMVCデザインのAPIサーバを作成
○  これまでRails + Grapeで開発していたので
○  Viewはヘッダー・ナビゲーションバー・フッターのみ
●  フロントエンドはMithril.jsで作成
○  MVCデザインのJavaScriptフレームワーク
○  仮想DOM 採用で、Reactよりも 高速・軽量
○  モデルはAPIから返ってきたJSONをそのまま使う
○  ソースコードはバイナリ化してGinで配信
バックエンドはGoで最速のフレームワーク
フロントエンドもJavaScriptで最軽量のフレームワーク
16/01/23 27
シェルスクリプトマガジン
●  「香川大学SLPからお届け!」シリーズ
○  Vol. 33 Go言語とMithril.jsでWebアプリ開発 バックエンド編
○  Vol. 34 Go言語とMithril.jsでWebアプリ開発 フロントエンド編
○  (Amazonで著者セントラル作りたい…)
16/02/27 28
GoでJSONなRESTful API
●  GoでJSONを使うのはカンタン
○  雛形になる 構造体 を定義してエンコード・デコード
○  HTTPハンドラのBodyでJSONを書き込めばOK
○  GojiとGORMを使った場合のイメージ
16/02/27 29
router := goji.New()
router.Get("/api/users/:name", handler)

func handler(c goji.C, w http.ResponseWriter, r ...) {
var user User
name := c.URLParams["name"]
db.Where(&User{Name: name}).First(&user)
bytes, _ := json.Marshal(user)
fmt.Println(w, string(bytes))
w.Header.Set("Content-Type", "application/json")
}
kakuzuke
GitHub current streak runking of your followees
http://kakuzuke.hiconyan.com/
https://github.com/hico-horiuchi/kakuzuke
16/01/23 30
yosage
Web application of LGTM gif generator
http://yosage.hiconyan.com/
https://github.com/hico-horiuchi/yosage
16/01/23 31
16/02/27 32
まとめ
まとめ
●  GoでWebアプリを開発するメリット
○  高速・軽量、並列処理、デプロイ、規約、テスト
○  バックエンド( API )での採用が多い
●  MVCデザインで考える
○  Model :Goの 構造体 と ORマッパー で定義
○  View :標準の "html/template" で十分、Aceも
○  Controller:HTTPのハンドラとして実装
●  完成までに必要なこと
○  認証( OAuth など)、セッション(Cookie)
○  セキュリティ対策(CSRF、SQLインジェクション)
16/02/27 33

Weitere ähnliche Inhalte

Was ist angesagt?

組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込むYoshiki Hayama
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Hiro H.
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作るtorisoup
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論Tokoroten Nakayama
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチYoshiki Hayama
 

Was ist angesagt? (20)

組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 

Andere mochten auch

【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料Yuji Otani
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
Talknoteとgolangと私
Talknoteとgolangと私Talknoteとgolangと私
Talknoteとgolangと私Kenyu Miura
 
インフラ部門で働くCプログラマの話
インフラ部門で働くCプログラマの話インフラ部門で働くCプログラマの話
インフラ部門で働くCプログラマの話雅也 山本
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Yuji Otani
 
Introduction to Go programming
Introduction to Go programmingIntroduction to Go programming
Introduction to Go programmingExotel
 
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装Yusei Yamanaka
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangYoshiki Shibukawa
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうTakuya Ueda
 
猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座Yusei Yamanaka
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Takuya Ueda
 
Go Friday 傑作選
Go Friday 傑作選Go Friday 傑作選
Go Friday 傑作選Takuya Ueda
 
メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新Takuya Ueda
 
LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Corporation
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Ryosuke Okuta
 
機械学習概論 講義テキスト
機械学習概論 講義テキスト機械学習概論 講義テキスト
機械学習概論 講義テキストEtsuji Nakai
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Ken Morishita
 
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)徹 上野山
 

Andere mochten auch (20)

【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
Talknoteとgolangと私
Talknoteとgolangと私Talknoteとgolangと私
Talknoteとgolangと私
 
TalknoteとGolang
TalknoteとGolangTalknoteとGolang
TalknoteとGolang
 
インフラ部門で働くCプログラマの話
インフラ部門で働くCプログラマの話インフラ部門で働くCプログラマの話
インフラ部門で働くCプログラマの話
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
 
Introduction to Go programming
Introduction to Go programmingIntroduction to Go programming
Introduction to Go programming
 
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolang
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろう
 
Database sql
Database sqlDatabase sql
Database sql
 
猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発
 
Go Friday 傑作選
Go Friday 傑作選Go Friday 傑作選
Go Friday 傑作選
 
メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新
 
LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
 
機械学習概論 講義テキスト
機械学習概論 講義テキスト機械学習概論 講義テキスト
機械学習概論 講義テキスト
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識
 
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
 

Ähnlich wie GoによるWebアプリ開発のキホン

Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Goyaegashi
 
20120324 git training
20120324 git training20120324 git training
20120324 git trainingTakeshi AKIMA
 
Metahub for github
Metahub for githubMetahub for github
Metahub for githubSuguru Oho
 
スッとGoを取り入れる
スッとGoを取り入れるスッとGoを取り入れる
スッとGoを取り入れるYusuke Wada
 
140607 lib o-mini_con-ryoon
140607 lib o-mini_con-ryoon140607 lib o-mini_con-ryoon
140607 lib o-mini_con-ryoonRyo ONODERA
 
Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話Naoki Ishibashi
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選Takuya Ueda
 
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話Katsunori Kanda
 
個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編Koichi Shiraishi
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppAkihiko Horiuchi
 
GitHubで「バッジ」を集めよう
GitHubで「バッジ」を集めようGitHubで「バッジ」を集めよう
GitHubで「バッジ」を集めようarukoh
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションKazuhiro Hara
 
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜Takashi Uemura
 
Gitを使ってみませんか
Gitを使ってみませんかGitを使ってみませんか
Gitを使ってみませんかAtsuhiro Takiguchi
 
LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2Tomofumi Yagi
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話nekogeruge_987
 
GitHub Actions で CI/CD
GitHub Actions で CI/CDGitHub Actions で CI/CD
GitHub Actions で CI/CDIssei Hiraoka
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacksyaegashi
 

Ähnlich wie GoによるWebアプリ開発のキホン (20)

Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
20120324 git training
20120324 git training20120324 git training
20120324 git training
 
Metahub for github
Metahub for githubMetahub for github
Metahub for github
 
スッとGoを取り入れる
スッとGoを取り入れるスッとGoを取り入れる
スッとGoを取り入れる
 
Gitの紹介
Gitの紹介Gitの紹介
Gitの紹介
 
140607 lib o-mini_con-ryoon
140607 lib o-mini_con-ryoon140607 lib o-mini_con-ryoon
140607 lib o-mini_con-ryoon
 
Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話Railsやるやる_セキュリティ小話
Railsやるやる_セキュリティ小話
 
Vue.js with Go
Vue.js with GoVue.js with Go
Vue.js with Go
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
 
個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
 
GitHubで「バッジ」を集めよう
GitHubで「バッジ」を集めようGitHubで「バッジ」を集めよう
GitHubで「バッジ」を集めよう
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
 
Gitを使ってみませんか
Gitを使ってみませんかGitを使ってみませんか
Gitを使ってみませんか
 
LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話
 
GitHub Actions で CI/CD
GitHub Actions で CI/CDGitHub Actions で CI/CD
GitHub Actions で CI/CD
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacks
 

Mehr von Akihiko Horiuchi

オープンソースBotフレームワークではじめるChatOps
オープンソースBotフレームワークではじめるChatOpsオープンソースBotフレームワークではじめるChatOps
オープンソースBotフレームワークではじめるChatOpsAkihiko Horiuchi
 
Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視Akihiko Horiuchi
 
Jenkins 2.0 Pipeline & Blue Ocean
Jenkins 2.0 Pipeline & Blue OceanJenkins 2.0 Pipeline & Blue Ocean
Jenkins 2.0 Pipeline & Blue OceanAkihiko Horiuchi
 
BotKitで作るイベント駆動Bot
BotKitで作るイベント駆動BotBotKitで作るイベント駆動Bot
BotKitで作るイベント駆動BotAkihiko Horiuchi
 
Ansibleで一発!! VPSにDokkuを構築してみた
Ansibleで一発!! VPSにDokkuを構築してみたAnsibleで一発!! VPSにDokkuを構築してみた
Ansibleで一発!! VPSにDokkuを構築してみたAkihiko Horiuchi
 
InfluxDataのTICK Stack on DockerでNW監視
InfluxDataのTICK Stack on DockerでNW監視 InfluxDataのTICK Stack on DockerでNW監視
InfluxDataのTICK Stack on DockerでNW監視 Akihiko Horiuchi
 
クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!Akihiko Horiuchi
 
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜Akihiko Horiuchi
 
OSS監視ツールSensuの紹介
OSS監視ツールSensuの紹介OSS監視ツールSensuの紹介
OSS監視ツールSensuの紹介Akihiko Horiuchi
 
Filter・Mutator・Aggregateの使いドコロ
Filter・Mutator・Aggregateの使いドコロFilter・Mutator・Aggregateの使いドコロ
Filter・Mutator・Aggregateの使いドコロAkihiko Horiuchi
 
Go言語でBot開発やってみた
Go言語でBot開発やってみたGo言語でBot開発やってみた
Go言語でBot開発やってみたAkihiko Horiuchi
 
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すためにAkihiko Horiuchi
 
Sensuでネットワーク監視やってみた
Sensuでネットワーク監視やってみたSensuでネットワーク監視やってみた
Sensuでネットワーク監視やってみたAkihiko Horiuchi
 
学生がJANOGに行くべき3つの理由
学生がJANOGに行くべき3つの理由学生がJANOGに行くべき3つの理由
学生がJANOGに行くべき3つの理由Akihiko Horiuchi
 
HubotとChatOpsについて語るBoF
HubotとChatOpsについて語るBoFHubotとChatOpsについて語るBoF
HubotとChatOpsについて語るBoFAkihiko Horiuchi
 
サーバ監視ことはじめ
サーバ監視ことはじめサーバ監視ことはじめ
サーバ監視ことはじめAkihiko Horiuchi
 

Mehr von Akihiko Horiuchi (20)

オープンソースBotフレームワークではじめるChatOps
オープンソースBotフレームワークではじめるChatOpsオープンソースBotフレームワークではじめるChatOps
オープンソースBotフレームワークではじめるChatOps
 
Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視
 
Jenkins 2.0 Pipeline & Blue Ocean
Jenkins 2.0 Pipeline & Blue OceanJenkins 2.0 Pipeline & Blue Ocean
Jenkins 2.0 Pipeline & Blue Ocean
 
BotKitで作るイベント駆動Bot
BotKitで作るイベント駆動BotBotKitで作るイベント駆動Bot
BotKitで作るイベント駆動Bot
 
Ansibleで一発!! VPSにDokkuを構築してみた
Ansibleで一発!! VPSにDokkuを構築してみたAnsibleで一発!! VPSにDokkuを構築してみた
Ansibleで一発!! VPSにDokkuを構築してみた
 
InfluxDataのTICK Stack on DockerでNW監視
InfluxDataのTICK Stack on DockerでNW監視 InfluxDataのTICK Stack on DockerでNW監視
InfluxDataのTICK Stack on DockerでNW監視
 
クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!
 
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
 
OSS監視ツールSensuの紹介
OSS監視ツールSensuの紹介OSS監視ツールSensuの紹介
OSS監視ツールSensuの紹介
 
Filter・Mutator・Aggregateの使いドコロ
Filter・Mutator・Aggregateの使いドコロFilter・Mutator・Aggregateの使いドコロ
Filter・Mutator・Aggregateの使いドコロ
 
Go言語でBot開発やってみた
Go言語でBot開発やってみたGo言語でBot開発やってみた
Go言語でBot開発やってみた
 
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために
 
Sensuでネットワーク監視やってみた
Sensuでネットワーク監視やってみたSensuでネットワーク監視やってみた
Sensuでネットワーク監視やってみた
 
学生がJANOGに行くべき3つの理由
学生がJANOGに行くべき3つの理由学生がJANOGに行くべき3つの理由
学生がJANOGに行くべき3つの理由
 
HubotとChatOpsについて語るBoF
HubotとChatOpsについて語るBoFHubotとChatOpsについて語るBoF
HubotとChatOpsについて語るBoF
 
Sensu Introduction
Sensu IntroductionSensu Introduction
Sensu Introduction
 
Sensu with golang
Sensu with golangSensu with golang
Sensu with golang
 
サーバ監視ことはじめ
サーバ監視ことはじめサーバ監視ことはじめ
サーバ監視ことはじめ
 
ChatOps@研究室
ChatOps@研究室ChatOps@研究室
ChatOps@研究室
 
SKK
SKKSKK
SKK
 

Kürzlich hochgeladen

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Kürzlich hochgeladen (9)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

GoによるWebアプリ開発のキホン

  • 3. 自己紹介 Akihiko Horiuchi 香川大学 修士2年 bit.ly/hiconyan Emacs / Ruby / Rails / Golang Hubot / Sensu / Ansible 研究室のインフラと掃除担当 github.com/sai-lab/mouryou github.com/sai-lab/mouryou-web 16/02/27 3
  • 4. こんなことやってます ●  Sensu Deep Talks(東京) ●  Hubot×ChatOps勉強会(大阪、神戸) 16/02/27 4
  • 6. GoでWebアプリを開発する メリット ●  インタプリタと比較して 高速・軽量 ○  Railsより50倍の速度と10倍の省メモリという話も[1] ●  並列処理 が簡単 ○  goroutine(スレッド)と channel(メッセージパッシング) ○  go func() のように go を使うだけ ●  シングルバイナリ でデプロイ ○  コンパイルしたバイナリをアップロードするだけ ○  ライブラリのインストールなどが不要 ○  コンテナ や マイクロサービス との親和性が高そう 16/02/27 6 [1] https://plus.google.com/+MattAimonetti/posts/PeZk8FY3PWY
  • 7. GoでWebアプリを開発する メリット ●  コーディング規約 を統一 ○  gofmt(goimports)で強制的に直される ○  可読性が上がる、チーム開発がスムーズになる ●  標準でテストをサポート ○  関数をテストする関数を *_test.go に書く ○  あとは go test で実行するだけ 16/02/27 7 func TestSum(t *testing.T) { actual := Sum(10, 20) expected := 30 if actual != expected { t.Fatal("want", expected, "got", actual) } }
  • 8. Goの採用事例 ●  犬猫10秒動画共有アプリ「mofur」 ○  「Sleipnir」のフェンリルが開発 ○  アプリとWebのバックエンドでGoを採用 ●  Webサイト無料製作サービス「Ownd」 ○  「Ameba」のCyberAgentが開発 ○  決め手は 可読性 、フレームワークとして Revel を採用 16/02/27 8
  • 10. Goの 動物図鑑 が出ました ○  チャットアプリの作成 ○  WebSocket、OAuth ○  コマンドラインツールの作成 ○  ミドルウェアとの連携 ○  Twitter、Googleとの連携 ○  REST APIの公開 ○  Goの開発環境構築 などなど 基本を押えた内容で これからGoでWebアプリを 開発する人にオススメ 16/02/27 10
  • 11. 必要な コト 、考える コト ●  Webアプリケーションフレームワーク ○  RubyならRails、PythonならDjango、Goは? ○  デザインパターンは Model・View・Controller ? ●  データベース周りのコト ○  マイグレーションツールは?( rake db:migrate とか) ○  ORマッパーは?(ActiveRecordとか) ●  Viewは? テンプレートエンジンは? ○  標準で "text/template" と "html/template" が付属 ○  でも Slim とか Haml とか使いたい 16/02/27 11
  • 14. "net/http" のキホン ●  シンプルなWebサーバを作る ○  http.HandleFunc でルーティングを定義 (ただし "/users/:id" のようにパラメタは取れない) ○  http.ListenAndServe でWebサーバを起動 ○  ログ出力は "log" を使って自分で書く 16/02/27 14 func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") log.Printf("%+vn", r) } ) http.ListenAndServe(":8080", nil) }
  • 15. Webアプリフレームワーク ●  GoのWebアプリフレームワークは 戦国時代 ○  まだデファクトスタンダードが決まってない ○  シンプル なモノから フルスタック なモノまで[2] ○  "net/http" をベースに機能を拡張したものが多い 16/02/27 15 シンプル (ルーティングのみ) フルスタック (セッションなど) github.com/zenazn/goji github.com/gin-gonic/gin github.com/gorilla/mux github.com/revel/revel [2] http://qiita.com/najeira/items/bdc988c4e93b3b5ccf2f
  • 16. Webアプリフレームワーク ●  Goji( github.com/zenazn/goji ) ●  Gorilla( github.com/gorilla/mux ) 16/02/27 16 router := goji.New() router.Get("/:name", handler) func handler(c goji.C, w http.ResponseWriter, r ...) { name := c.URLParams["name"] fmt.Fprintf(w, "Hello, %s!n", name) } router := gorilla.NewRouter() router.HandleFunc("/{name}", handler) func handler(w http.ResponseWriter, r *http.Request) { name := gorilla.Vars(r)["name"] fmt.Fprintf(w, "Hello, %s!n", name) }
  • 17. GoでDBのマイグレーション ●  goose( bitbucket.org/liamstask/goose ) ○  マイグレーション:DBのバージョン管理のこと (テーブルの作成、カラムの追加、ロールバックなど) ○  マイグレーションのスクリプトは SQL かGoで書く ○  create 、up 、down コマンドを使って管理 16/02/27 17 $ goose create create_posts goose: created db/migrations/20160226202023_create_posts.sql $ goose up goose: migrating db environment 'development', ... OK 20160226202023_create_posts.sql $ goose down goose: migrating db environment 'development', ... OK 20160226202023_create_posts.sql
  • 18. gooseのマイグレーションファイル ●  マイグレーションファイルのサンプル ○  up・down に対応するSQLスクリプトを書く ○  Goで書く場合は sql.Tx.Exec でSQLを実行 ○  IDの AUTO_INCREMENT や PRIMARY KEY の設定を忘れずに 16/02/27 18 -- +goose Up -- SQL in section 'Up' is executed when this migration is ... CREATE TABLE IF NOT EXISTS `posts` ( `id` INT NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `body` TEXT NOT NULL, PRIMARY KEY (`id`) ); -- +goose Down -- SQL section 'Down' is executed when this migration is ... DROP TABLE `posts`;
  • 19. DBから構造体にマッピング ●  ORM(Object-Relation Mapping) ○  DBのタプルをGoの 構造体 に変換するもの ○  WAFと同じく シンプル なモノと フルスタック なモノ ○  マイグレーションもできるものが多い 16/02/27 19 type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time } type User struct { gorm.Model Name string }
  • 20. ORマッパーのサンプル ●  GORM( github.com/jinzhu/gorm ) ○  かなり 高機能 でActiveRecordに近い使用感 ○  First などの便利な関数、クエリの連鎖も可能 ●  genmai( github.com/naoina/genmai ) ○  機能はシンプルでクエリビルダに近い 16/02/27 20 db.CreateTable(&User{}) user := User{Name: "Kagawa"} db.Create(user) db.Where(&User{Name: "Kagawa"}).First(&user) db.CreateTable(&User{}) user := User{Name: "Kagawa"} db.Insert(&user) db.Select(&users, db.Where("name", "=", "Kagawa"))
  • 21. "html/template" のキホン ●  テンプレートを使うハンドラーを作る ○  構造体 をテンプレートに渡して {{}} で展開 ○  template.ParseFiles でファイル読み込みも可能 type Page struct { Name string } func handler(w http.ResponseWriter, r *http.Request) { tmpl, _ := template.New("tmpl").Parse("Hello, {{.Name}}!") tmpl.Execute(w, Page{Name: "Golang"}) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } 16/02/27 21
  • 22. テンプレエンジン Ace を使う ●  Ace( github.com/yosssi/ace ) ○  SlimやJadeにインスパイアされてる ○  ace.Load すると *template.Template が返ってくる ○  部分テンプレートにも対応( render partial 的な) 16/02/27 22 = doctype html html lang=en head title Hello Ace = css .blue { color: blue; } body h1.blue {{.Msg}} p.. Ace is an HTML template engine for Go. = javascript console.log('Welcome to Ace');
  • 23. Goのパッケージマネージャ ●  Godep( github.com/tools/godep ) ○  Godeps.json に従って Godeps/_workspace に保存 ○  Herokuなどでも採用され、ほぼスタンダード? ●  gom( github.com/mattn/gom ) ○  使い勝手はほぼ Bundler + Gemfile と同じ ○  gom install 、gom exec 、gom build 、など 16/02/27 23 { "Deps": [{ "ImportPath": "code.google.com/p/go-netrc/netrc", "Rev": "28676070ab99" }] }
  • 24. gom の使い方 ●  Rubyist なのでgom推し ○  Gomfile を書いて gom install するだけ ○  パッケージをtag、branch、commit で指定可能 ○  _vendor ディレクトリにパッケージが保存される 16/02/27 24 gom 'github.com/yosssi/ace' gom 'github.com/zenazn/goji' group :development do gom 'github.com/pilu/fresh' gom 'golang.org/x/tools/cmd/goimports' end $ gom install downloading github.com/google/go-github/github downloading github.com/yosssi/ace ...
  • 25. ビルドツールで快適に開発 ●  Fresh( github.com/pilu/fresh ) ○  ソースコードの変更を検知してリビルド ○  変更の反映にコンパイルが必要なGoの強い味方 ○  JavaScriptだとGrantとかgulpみたいな感じ? ○  監視する拡張子と間隔を設定できる 16/01/23 25 $ gom exec fresh -c runner.conf Loading settings from runner.conf 22:7:30 runner | InitFolders 22:7:30 runner | mkdir ./tmp 22:7:30 runner | mkdir ./tmp: file exists 22:7:30 watcher | Watching . 22:7:30 watcher | Watching app 22:7:30 watcher | Watching app/controllers 22:7:30 watcher | Watching app/views
  • 27. 今回のポイント・工夫 ●  GojiでMVCデザインのAPIサーバを作成 ○  これまでRails + Grapeで開発していたので ○  Viewはヘッダー・ナビゲーションバー・フッターのみ ●  フロントエンドはMithril.jsで作成 ○  MVCデザインのJavaScriptフレームワーク ○  仮想DOM 採用で、Reactよりも 高速・軽量 ○  モデルはAPIから返ってきたJSONをそのまま使う ○  ソースコードはバイナリ化してGinで配信 バックエンドはGoで最速のフレームワーク フロントエンドもJavaScriptで最軽量のフレームワーク 16/01/23 27
  • 28. シェルスクリプトマガジン ●  「香川大学SLPからお届け!」シリーズ ○  Vol. 33 Go言語とMithril.jsでWebアプリ開発 バックエンド編 ○  Vol. 34 Go言語とMithril.jsでWebアプリ開発 フロントエンド編 ○  (Amazonで著者セントラル作りたい…) 16/02/27 28
  • 29. GoでJSONなRESTful API ●  GoでJSONを使うのはカンタン ○  雛形になる 構造体 を定義してエンコード・デコード ○  HTTPハンドラのBodyでJSONを書き込めばOK ○  GojiとGORMを使った場合のイメージ 16/02/27 29 router := goji.New() router.Get("/api/users/:name", handler) func handler(c goji.C, w http.ResponseWriter, r ...) { var user User name := c.URLParams["name"] db.Where(&User{Name: name}).First(&user) bytes, _ := json.Marshal(user) fmt.Println(w, string(bytes)) w.Header.Set("Content-Type", "application/json") }
  • 30. kakuzuke GitHub current streak runking of your followees http://kakuzuke.hiconyan.com/ https://github.com/hico-horiuchi/kakuzuke 16/01/23 30
  • 31. yosage Web application of LGTM gif generator http://yosage.hiconyan.com/ https://github.com/hico-horiuchi/yosage 16/01/23 31
  • 33. まとめ ●  GoでWebアプリを開発するメリット ○  高速・軽量、並列処理、デプロイ、規約、テスト ○  バックエンド( API )での採用が多い ●  MVCデザインで考える ○  Model :Goの 構造体 と ORマッパー で定義 ○  View :標準の "html/template" で十分、Aceも ○  Controller:HTTPのハンドラとして実装 ●  完成までに必要なこと ○  認証( OAuth など)、セッション(Cookie) ○  セキュリティ対策(CSRF、SQLインジェクション) 16/02/27 33