SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
堀内 晨彦
@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

Más contenido relacionado

La actualidad más candente

webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話ichirin2501
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選Takuya Ueda
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?Takuya Ueda
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないCarnot Inc.
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 

La actualidad más candente (20)

webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Paxos
PaxosPaxos
Paxos
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くない
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 

Destacado

【初心者向け】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京都 機械学習勉強会)徹 上野山
 

Destacado (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京都 機械学習勉強会)
 

Similar a 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
 
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
 
Easy scripting in Go
Easy scripting in GoEasy scripting in Go
Easy scripting in Gonaoty_bot
 

Similar a 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
 
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
 
Easy scripting in Go
Easy scripting in GoEasy scripting in Go
Easy scripting in Go
 

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

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

Último

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Último (9)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

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