Go言語によるWebアプリの作り方    2013/2/9 GDG Kobe Creative Commons Attribution 3.0 License
自己紹介•   河本 泰孝 @kwmt27•   車関連の仕事やってます。•   androg.seesaa.net ブログ書いてます。•   私とGo言語との関わり    •   2011年のDevQuizで初めて触った    •   201...
自己紹介• 最近では公式サイトの  • Writing Web Applications  • Go Slices を翻訳してみたり。 https://github.com/kwmt/ golangwiki      ↑↑ forkして一緒に翻...
自己紹介前回は、Go Slicesについて発表させてもらったので、今回は、公式サイトのWriting Web Applicationsを元に発表させて頂きます。      Creative Commons Attribution 3.0 Lic...
もくじCreative Commons Attribution 3.0 License
もくじ1.Go言語の特徴&紹介2.Go言語の基本3.Webアプリ(wiki)を作成する4.tips         Creative Commons Attribution 3.0 License
Go言語の特徴&紹介 Creative Commons Attribution 3.0 License
Go言語の特徴&紹介オープンソース(BSDライセンス)シンプルな構文(文末のセミコロン不要など)コンパイル言語並列処理を言語レベルでサポート(ゴルーチン)GCによるメモリ管理安全性が高い(ポインタ演算なし)    Creative Common...
Go言語の特徴&紹介Webアプリケーションを作るための豊富な標準ライブラリGoogle App Engine for Go*今回の話には出て来ません*チュートリアルがまずは参考になると思います。https://developers.google...
Go言語の特徴&紹介公式サイト http://golang.org翻訳サイト http://golang.jp/Go Playground http://play.golang.org/A Tour of Go http://go-tour-j...
Go言語の特徴&紹介公式サイト http://golang.org                                       Go version 1翻訳サイト http://golang.jp/             未対...
Go言語の特徴&紹介go-wiki Articles http://code.google.com/p/go-wiki/wiki/Articlesgo-wiki Bookshttp://code.google.com/p/go-wiki/wik...
Go言語の特徴&紹介なにより、ゴーファー君がかわいい (今日の一番大切なこと)  Creative Commons Attribution 3.0 License
Go言語の基本Creative Commons Attribution 3.0 License
基本1package mainimport "fmt"func main() {  var hello string = "Hello, 世界!"  //hello := “Hello, 世界!”  String(hello)}func Str...
package から始まります                            基本1package mainimport "fmt"func main() {  var hello string = "Hello, 世界!"  //he...
基本1                 グループ化できます                                                          import(                    パッケージを読み...
基本1                           main関数が最初に呼び                                 出されますpackage main                  main関数があるpac...
基本1package mainimport "fmt"                                                            文末にfunc main() {                   ...
基本1package mainimport "fmt"func main() {                   := だけで定義できる  var hello string = "Hello, 世界!"                   ...
基本1package mainimport "fmt"func main() {  var hello string = "Hello, 世界!"  //hello := “Hello, 世界!”  String(hello)         ...
基本1package mainimport "fmt"func main() {  var hello string = "Hello, 世界!"  //hello := “Hello, 世界!”  String(hello)}        ...
基本2func main() {  for i:=0;i<10;i++{    if i%2!=0 {      fmt.Printf("%dは奇数n",i)        }    }}            Creative Commons...
基本2                                             for文、if文は()不要                                             ループはfor文だけfunc m...
基本2                                             for文、if文は()不要                                             ループはfor文だけfunc m...
基本3b := []string{“g”,”o”,”l”,”a”,”n”,”g”}配列に似ていますが、これをスライスといいます。b[2:] == []string{”l”,”a”,”n”,”g”}上記の左辺ように書くと、右辺と同じ意味になります...
基本4構造体type MyData struct {  name   string //名前    Height int       //身長}メソッドfunc (data *Mydata) SetName(name string) {    ...
言い忘れてましたが、構造体に限らず、                              基本4                             変数名の最初の文字が                     大文字と小文字に意味が...
言い忘れてましたが、構造体に限らず、                              基本4                             変数名の最初の文字が                     大文字と小文字に意味が...
基本4構造体type MyData struct {  name   string //名前    Height int       //身長}                  関数の一種だが、特定の型                   と...
基本5goを実行させるには?$go build hoge.go$./hoge$go run hoge.go(これはa.outが動く)$pwdfuga$go build$./fuga            Creative Commons Att...
Webアプリ(wiki)を作成する   Creative Commons Attribution 3.0 License
ようやく本題Webアプリとして、wikiを作成して行きたいと思います。     Creative Commons Attribution 3.0 License
wikiの仕様http://localhost:8080/edit/sample              Creative Commons Attribution 3.0 License
wikiの仕様http://localhost:8080/edit/sample Editing sample  Save              Creative Commons Attribution 3.0 License
wikiの仕様http://localhost:8080/edit/sample Editing sample  sample body  Save              Creative Commons Attribution 3.0 L...
wikiの仕様http://localhost:8080/edit/sample Editing sample  sample body  Save                           DB代わり         /save/s...
wikiの仕様http://localhost:8080/edit/sample                                             /view/sample Editing sample          ...
wikiの仕様http://localhost:8080/edit/sample                                             /view/sample Editing sample          ...
wikiの仕様http://localhost:8080/edit/sample                                            /view/sample          Title           ...
HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() {  http.ListenAndServe(":8080",nil)}           Creat...
HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓  http.ListenAndServe(":8080",nil)}         ...
HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓           ↓nilを指定(通常)  http.ListenAndServe(...
HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓           ↓nilを指定(通常)  http.ListenAndServe(...
HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓           ↓nilを指定(通常)  http.ListenAndServe(...
HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓           ↓nilを指定(通常)  http.ListenAndServe(...
ハンドラの登録 webページに出力させるには、 ハンドラを登録する必要があります。package mainimport "net/http"func viewHandler(w http.ResponseWriter, r *http.Requ...
ハンドラの登録 webページに出力させるには、 ハンドラを登録する必要があります。package mainimport "net/http"func viewHandler(w http.ResponseWriter, r *http.Requ...
http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){  fmt.Fprintf(w, “Hello, %q”, r.URL.Path)}           ...
http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){  fmt.Fprintf(w, “Hello, %q”, r.URL.Path)}type Reques...
http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){  fmt.Fprintf(w, “Hello, %q”, r.URL.Path)}           ...
http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){  fmt.Fprintf(w, “Hello, %q”, r.URL.Path)}           ...
ハンドラの登録先ほどのviewHandlerを登録すると、次のようになります。再掲func viewHandler(w http.ResponseWriter, r *http.Request){  fmt.Fprintf(w, “Hello,...
データ構造の定義さて、このwikiはeditページとviewページにTitleとBodyを持っていますので、構造体として保持しておくことにしましょう。 type Page struct {     Title string     Body [...
テキストファイルへ保存このPage構造体に対して、保存できるようにsaveメソッド作成しましょう。func (p *Page) save() error {                    パーミッション  filename := p.T...
テキストファイルから読み込み次に保存したファイルを読み込めるような関数を作りましょう。func loadPage(title string) (*Page, error) {  filename := title + “.txt”  body,...
HTMLを生成http://localhost:8080/view/sample                 sample Titleにアクセスがあった時に、                                         ...
HTMLを生成http://localhost:8080/view/sample                 sample Titleにアクセスがあった時に、                                         ...
HTMLを生成http://localhost:8080/view/sample                 sample Titleにアクセスがあった時に、                                         ...
HTMLを生成http://localhost:8080/view/sample                 sample Titleにアクセスがあった時に、                                         ...
HTMLを生成“text/template”パッケージを使います。         Creative Commons Attribution 3.0 License
HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p>                 Creative Commons Attribution 3.0 Lice...
HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p>   struct : Page{Title:”sample”}                 Creat...
HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p>                                                    He...
HTMLを生成    “text/template”パッケージを使います。    template : <p>Hello, {{.Title}}</p>                                              ...
HTMLを生成    “text/template”パッケージを使います。    template : <p>Hello, {{.Title}}</p>                                              ...
HTMLを生成    “text/template”パッケージを使います。    template : <p>Hello, {{.Title}}</p>                                              ...
HTMLを生成    “text/template”パッケージを使います。    template : <p>Hello, {{.Title}}</p>                                              ...
HTMLを生成    “text/template”パッケージを使います。    template : <p>Hello, {{.Title}}</p>                                              ...
HTMLを生成公式ページを見ると”html/template”というのもありますが、“text/template” と同じインターフェースを持ちます。違いは、”html/template”は攻撃に強いセキュアなHTMLを生成します。ただし、HT...
HTMLを生成view.htmlを次のようにします。        Creative Commons Attribution 3.0 License
HTMLを生成view.htmlを次のようにします。<h1>{{.Title}}</h1><p>[<a href="/edit/{{.Title}}">edit</a>]</p><div>{{printf "%s" .Body}}</div> ...
HTMLを生成view.htmlを次のようにします。<h1>{{.Title}}</h1><p>[<a href="/edit/{{.Title}}">edit</a>]</p><div>{{printf "%s" .Body}}</div> ...
HTMLを生成                                /edit/sample                                         Editing sample次にeditページを作成します。...
HTMLを生成                                    /edit/sample                                              Editing sample次にeditペ...
HTMLを生成次に、editページも同様に作成しましょう。   Creative Commons Attribution 3.0 License
HTMLを生成editHandlerを次のようにします。http.HandleFunc(“/edit/”, editHandler) ←ハンドラ登録も忘れずにfunc editHandler(w *http.ResponseWriter,r *...
どこまでできた?http://localhost:8080/edit/sample              Creative Commons Attribution 3.0 License
どこまでできた?http://localhost:8080/edit/sample Editing sample  Save              Creative Commons Attribution 3.0 License
どこまでできた?http://localhost:8080/edit/sample Editing sample  sample body  Save              Creative Commons Attribution 3.0 ...
どこまでできた?http://localhost:8080/edit/sample                          editHandler Editing sample  sample body  Save         /...
どこまでできた?http://localhost:8080/edit/sample                                             /view/sample                        ...
どこまでできた?http://localhost:8080/edit/sample                                             /view/sample                        ...
どこまでできた?http://localhost:8080/edit/sample                                            /view/sample                         ...
どこまでできた?http://localhost:8080/edit/sample                                            /view/sample                         ...
saveHandlerを作成edit.htmlを次のようにします。http.HandleFunc(“/save/”, saveHandler)func saveHandler(w http.ResponseWriter, r *http.Req...
saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できるhttp.HandleFunc(“/save/”, saveHandler)func saveHandler(w htt...
saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できるhttp.HandleFunc(“/save/”, saveHandler)func saveHandler(w htt...
saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できる                             http.StatusMovedPermanently = 3...
基本的なwikiは完成http://localhost:8080/edit/sample              Creative Commons Attribution 3.0 License
基本的なwikiは完成http://localhost:8080/edit/sample Editing sample  Save              Creative Commons Attribution 3.0 License
基本的なwikiは完成http://localhost:8080/edit/sample Editing sample  sample body  Save              Creative Commons Attribution 3...
基本的なwikiは完成http://localhost:8080/edit/sample                          editHandler Editing sample  sample body  Save       ...
基本的なwikiは完成http://localhost:8080/edit/sample                                             /view/sample                     ...
基本的なwikiは完成http://localhost:8080/edit/sample                                             /view/sample                     ...
基本的なwikiは完成http://localhost:8080/edit/sample                                            /view/sample                      ...
基本的なwikiは完成http://localhost:8080/edit/sample                                            /view/sample                      ...
基本的なwikiは完成エラー処理など、殆どやってないので、イケてないところが多く残っていますが、wikiの基本機能は完成です。Writing Web Applicationでは、regexpパッケージ使用して入力チェックしたり、クロージャを使用...
tipsCreative Commons Attribution 3.0 License
GET、POSTnet/http パッケージfunc Get(url string) (resp *Response, err error)例 res, _ := http.Get("http://www.google.com/robots.t...
XML、JSON   encoding/xml                 パッケージが使用できます。   encoding/json例 http://play.golang.org/p/ADbOOeCVCn                ...
XML、JSON   encoding/xml                 パッケージが使用できます。   encoding/json                                          xml        ...
XML、JSON   encoding/xml                 パッケージが使用できます。   encoding/json                    Marshal(v interface{}) (data []by...
XML、JSON   encoding/xml                 パッケージが使用できます。   encoding/json                    Marshal(v interface{}) (data []by...
XML、JSON   encoding/xml                 パッケージが使用できます。   encoding/json                    Marshal(v interface{}) (data []by...
サーバ上で Javascriptを使うhttp.Handle(“/js/”,      http.StripPrefix(“/js/”, http.FileServer(http.Dir(“js”))))               Creati...
templateファイルを分けることも可能<!doctype html><html><head></head><body>{{template “content” .}}</body></html>{{define “content”}}{{.T...
データベースのドライバSQL database drivers             Creative Commons Attribution 3.0 License
FastCGIpackage mainimport (! "fmt"! "net"! "net/http"! "net/http/fcgi")func main() {! mux := http.NewServeMux()! mux.Handl...
FastCGIpackage mainimport (! "fmt"! "net"! "net/http"! "net/http/fcgi")func main() {! mux := http.NewServeMux()! mux.Handl...
websocketwebsocketのパッケージはGo 1になって標準パッケージではなくなりましたが、別のリポジトリに残ってます。“code.google.com/p/go.net/websocket”下記のブログにwebsocketを使ってチ...
以上、つたない説明でしたがGo言語でWebアプリを作る足がかりなれば幸いです。  Creative Commons Attribution 3.0 License
ご清聴ありがとうございました   Creative Commons Attribution 3.0 License
Upcoming SlideShare
Loading in...5
×

Go言語によるwebアプリの作り方

21,216

Published on

13/02/09に #gdgkobe で #golang の発表させて頂きました資料です。

Published in: Technology
0 Comments
107 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
21,216
On Slideshare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
131
Comments
0
Likes
107
Embeds 0
No embeds

No notes for slide

Go言語によるwebアプリの作り方

  1. 1. Go言語によるWebアプリの作り方 2013/2/9 GDG Kobe Creative Commons Attribution 3.0 License
  2. 2. 自己紹介• 河本 泰孝 @kwmt27• 車関連の仕事やってます。• androg.seesaa.net ブログ書いてます。• 私とGo言語との関わり • 2011年のDevQuizで初めて触った • 2012年1月のGo言語勉強会に参加 • 2012年4月の東海GTUGさんのGAE勉強会でGoを使った • 2012年8月のGDG神戸でGo言語のスライスについて発表 • 2012年10月,2013年1月GDG名古屋のスタートGo#0,#1に 参加 Creative Commons Attribution 3.0 License
  3. 3. 自己紹介• 最近では公式サイトの • Writing Web Applications • Go Slices を翻訳してみたり。 https://github.com/kwmt/ golangwiki ↑↑ forkして一緒に翻訳しませんか? Creative Commons Attribution 3.0 License
  4. 4. 自己紹介前回は、Go Slicesについて発表させてもらったので、今回は、公式サイトのWriting Web Applicationsを元に発表させて頂きます。 Creative Commons Attribution 3.0 License
  5. 5. もくじCreative Commons Attribution 3.0 License
  6. 6. もくじ1.Go言語の特徴&紹介2.Go言語の基本3.Webアプリ(wiki)を作成する4.tips Creative Commons Attribution 3.0 License
  7. 7. Go言語の特徴&紹介 Creative Commons Attribution 3.0 License
  8. 8. Go言語の特徴&紹介オープンソース(BSDライセンス)シンプルな構文(文末のセミコロン不要など)コンパイル言語並列処理を言語レベルでサポート(ゴルーチン)GCによるメモリ管理安全性が高い(ポインタ演算なし) Creative Commons Attribution 3.0 License
  9. 9. Go言語の特徴&紹介Webアプリケーションを作るための豊富な標準ライブラリGoogle App Engine for Go*今回の話には出て来ません*チュートリアルがまずは参考になると思います。https://developers.google.com/appengine/docs/go/gettingstarted/現時点のバージョン 1.0.3 License Creative Commons Attribution 3.0
  10. 10. Go言語の特徴&紹介公式サイト http://golang.org翻訳サイト http://golang.jp/Go Playground http://play.golang.org/A Tour of Go http://go-tour-jp.appspot.comgolang-nutshttp://groups.google.com/group/golang-nutsgolang-jphttps://groups.google.com/forum/#!forum/golang-jp Creative Commons Attribution 3.0 License
  11. 11. Go言語の特徴&紹介公式サイト http://golang.org Go version 1翻訳サイト http://golang.jp/ 未対応箇所あるので注意Go Playground http://play.golang.org/A Tour of Go http://go-tour-jp.appspot.comgolang-nutshttp://groups.google.com/group/golang-nutsgolang-jphttps://groups.google.com/forum/#!forum/golang-jp Creative Commons Attribution 3.0 License
  12. 12. Go言語の特徴&紹介go-wiki Articles http://code.google.com/p/go-wiki/wiki/Articlesgo-wiki Bookshttp://code.google.com/p/go-wiki/wiki/BooksGo1に対応した日本語の書籍 プログラミング言語Goフレーズブック 基礎からわかるGo言語 Creative Commons Attribution 3.0 License
  13. 13. Go言語の特徴&紹介なにより、ゴーファー君がかわいい (今日の一番大切なこと) Creative Commons Attribution 3.0 License
  14. 14. Go言語の基本Creative Commons Attribution 3.0 License
  15. 15. 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  16. 16. package から始まります 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  17. 17. 基本1 グループ化できます import( パッケージを読み込みます “fmt”package main “io/iouti.” )import "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  18. 18. 基本1 main関数が最初に呼び 出されますpackage main main関数があるpackageはmainでなければimport "fmt" なりませんfunc main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  19. 19. 基本1package mainimport "fmt" 文末にfunc main() { セミコロン不要 var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  20. 20. 基本1package mainimport "fmt"func main() { := だけで定義できる var hello string = "Hello, 世界!" (型推論) //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  21. 21. 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello) 関数定義} プロトタイプ宣言不要func String(s string) { fmt.Println(s) 値渡し} Creative Commons Attribution 3.0 License
  22. 22. 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)} パッケージ名.(ドット)関数名でfunc String(s string) { fmt.Println(s) パッケージの関数を呼び出す} Creative Commons Attribution 3.0 License
  23. 23. 基本2func main() { for i:=0;i<10;i++{ if i%2!=0 { fmt.Printf("%dは奇数n",i) } }} Creative Commons Attribution 3.0 License
  24. 24. 基本2 for文、if文は()不要 ループはfor文だけfunc main() { for i:=0;i<10;i++{ if i%2!=0 { fmt.Printf("%dは奇数n",i) } }} Creative Commons Attribution 3.0 License
  25. 25. 基本2 for文、if文は()不要 ループはfor文だけfunc main() { for i:=0;i<10;i++{ if i%2!=0 { fmt.Printf("%dは奇数n",i) 文法ではないですが } $go fmt for.go } で綺麗になります} func main() { ! for i := 0; i < 10; i++ { ! ! if i%2 != 0 { ! ! ! fmt.Printf("%dは奇数n", i) ! ! } ! } Creative Commons Attribution 3.0 License
  26. 26. 基本3b := []string{“g”,”o”,”l”,”a”,”n”,”g”}配列に似ていますが、これをスライスといいます。b[2:] == []string{”l”,”a”,”n”,”g”}上記の左辺ように書くと、右辺と同じ意味になります。(スライスについては、前回の資料を参照ください。) Creative Commons Attribution 3.0 License
  27. 27. 基本4構造体type MyData struct { name string //名前 Height int //身長}メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  28. 28. 言い忘れてましたが、構造体に限らず、 基本4 変数名の最初の文字が 大文字と小文字に意味があります。構造体type MyData struct { name string //名前 Height int //身長}メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  29. 29. 言い忘れてましたが、構造体に限らず、 基本4 変数名の最初の文字が 大文字と小文字に意味があります。構造体type MyData struct { javaで言うところ、 name string //名前 大文字がpublicで、 Height int //身長} 小文字がprivateです。メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  30. 30. 基本4構造体type MyData struct { name string //名前 Height int //身長} 関数の一種だが、特定の型 と関連づけることが可能 (thisとかselfとかはない)メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  31. 31. 基本5goを実行させるには?$go build hoge.go$./hoge$go run hoge.go(これはa.outが動く)$pwdfuga$go build$./fuga Creative Commons Attribution 3.0 License
  32. 32. Webアプリ(wiki)を作成する Creative Commons Attribution 3.0 License
  33. 33. ようやく本題Webアプリとして、wikiを作成して行きたいと思います。 Creative Commons Attribution 3.0 License
  34. 34. wikiの仕様http://localhost:8080/edit/sample Creative Commons Attribution 3.0 License
  35. 35. wikiの仕様http://localhost:8080/edit/sample Editing sample Save Creative Commons Attribution 3.0 License
  36. 36. wikiの仕様http://localhost:8080/edit/sample Editing sample sample body Save Creative Commons Attribution 3.0 License
  37. 37. wikiの仕様http://localhost:8080/edit/sample Editing sample sample body Save DB代わり /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  38. 38. wikiの仕様http://localhost:8080/edit/sample /view/sample Editing sample sample sample body [edit] sample body Save DB代わり リダイレクト /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  39. 39. wikiの仕様http://localhost:8080/edit/sample /view/sample Editing sample sample sample body [edit] sample body Save DB代わり リダイレクト /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  40. 40. wikiの仕様http://localhost:8080/edit/sample /view/sample Title Title Editing sample sample sample body [edit] sample body Body Body Save DB代わり リダイレクト /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  41. 41. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  42. 42. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  43. 43. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  44. 44. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} ↑↑でHTTPサーバーを開始します。 Creative Commons Attribution 3.0 License
  45. 45. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} ↑↑でHTTPサーバーを開始します。 Creative Commons Attribution 3.0 License
  46. 46. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} ↑↑でHTTPサーバーを開始します。 何も出力していないから。 Creative Commons Attribution 3.0 License
  47. 47. ハンドラの登録 webページに出力させるには、 ハンドラを登録する必要があります。package mainimport "net/http"func viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path[1:])}func main() { http.HandleFunc(“/”, viewHandler) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  48. 48. ハンドラの登録 webページに出力させるには、 ハンドラを登録する必要があります。package mainimport "net/http"func viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path[1:])}func main() { ↓”/”にviewHandlerを登録 http.HandleFunc(“/”, viewHandler) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  49. 49. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)} Creative Commons Attribution 3.0 License
  50. 50. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)}type Request struct{ Method string URL *url.URL ... ↑net/urlパッケージ Form url.Values ...} Creative Commons Attribution 3.0 License
  51. 51. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)} type URL struct { Scheme stringtype Request struct{ Opaque string Method string User *Userinfo URL *url.URL Host string ... ↑net/urlパッケージ Path string Form url.Values RawQuery string ... Fragment string} } Creative Commons Attribution 3.0 License
  52. 52. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)} type URL struct { Scheme stringtype Request struct{ Opaque string Method string User *Userinfo URL *url.URL Host string ... ↑net/urlパッケージ Path string Form url.Values RawQuery string ... Fragment string} } URLは次のような形を表現しています。 scheme://[userinfo@]host/path[?query][#fragment] Creative Commons Attribution 3.0 License
  53. 53. ハンドラの登録先ほどのviewHandlerを登録すると、次のようになります。再掲func viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path[1:])}func main() { http.HandleFunc(“/” viewHandler) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  54. 54. データ構造の定義さて、このwikiはeditページとviewページにTitleとBodyを持っていますので、構造体として保持しておくことにしましょう。 type Page struct { Title string Body []byte } Creative Commons Attribution 3.0 License
  55. 55. テキストファイルへ保存このPage構造体に対して、保存できるようにsaveメソッド作成しましょう。func (p *Page) save() error { パーミッション filename := p.Title + “.txt” を8進数で指定↓ return ioutil.WriteFile(filename, p.Body, 0600)} ↑string ↑[]byte※io/ioutilパッケージのインポートが必要です。 Creative Commons Attribution 3.0 License
  56. 56. テキストファイルから読み込み次に保存したファイルを読み込めるような関数を作りましょう。func loadPage(title string) (*Page, error) { filename := title + “.txt” body, err := ioutil.ReadFile(filename) if err != nil { ↑ []byte、errorを返す return nil, err } return &Page{Title:title, Body:body}, nil}※io/ioutilパッケージのインポートが必要です。 Creative Commons Attribution 3.0 License
  57. 57. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。 Creative Commons Attribution 3.0 License
  58. 58. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。func viewHandler(w http.ResponseWriter, r *http.Request) {! title := r.URL.Path[6:]! p, _ := loadPage(title)! fmt.Fprintf(w, "<h1>%s</h1><p>[<a href="/edit/%s">edit</a>]</p><div>%s</div>", p.Title, p.Title, p.Body)} Creative Commons Attribution 3.0 License
  59. 59. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。func viewHandler(w http.ResponseWriter, r *http.Request) {! title := r.URL.Path[6:]! p, _ := loadPage(title)! fmt.Fprintf(w, "<h1>%s</h1><p>[<a href="/edit/%s">edit</a>]</p><div>%s</div>", p.Title, p.Title, p.Body)} Creative Commons Attribution 3.0 License
  60. 60. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。 このようなHTMLの ハードコーディングはダサいですよね。func viewHandler(w http.ResponseWriter, r *http.Request) { いい方法がありますよ。奥さん! title := r.URL.Path[6:]! p, _ := loadPage(title)! fmt.Fprintf(w, "<h1>%s</h1><p>[<a href="/edit/%s">edit</a>]</p><div>%s</div>", p.Title, p.Title, p.Body)} Creative Commons Attribution 3.0 License
  61. 61. HTMLを生成“text/template”パッケージを使います。 Creative Commons Attribution 3.0 License
  62. 62. HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p> Creative Commons Attribution 3.0 License
  63. 63. HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p> struct : Page{Title:”sample”} Creative Commons Attribution 3.0 License
  64. 64. HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} Creative Commons Attribution 3.0 License
  65. 65. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”}func viewHandler(w *http.ResponseWriter, r *http.Request){ ! title := r.URL.Path[6:]! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  66. 66. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”}func viewHandler(w *http.ResponseWriter, r *http.Request){ ! title := r.URL.Path[6:]! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  67. 67. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} Template構造体を作成しパースしますfunc viewHandler(w *http.ResponseWriter, r *http.Request){ *Templateとerror を返します ! title := r.URL.Path[6:]! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  68. 68. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} パースされたテンプレート tを Template構造体を作成しパースします pに適用して、func viewHandler(w *http.ResponseWriter, r *http.Request){ *Templateとerror を返します ! title := r.URL.Path[6:] wに出力します! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  69. 69. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} パースされたテンプレート tを Template構造体を作成しパースします pに適用して、func viewHandler(w *http.ResponseWriter, r *http.Request){ *Templateとerror を返します ! title := r.URL.Path[6:] wに出力します! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} 先ほどハードコーディングされた HTMLを別ファイルに書く(あとで) Creative Commons Attribution 3.0 License
  70. 70. HTMLを生成公式ページを見ると”html/template”というのもありますが、“text/template” と同じインターフェースを持ちます。違いは、”html/template”は攻撃に強いセキュアなHTMLを生成します。ただし、HTMLに書いたコメントが消されます(´;ω;`) Creative Commons Attribution 3.0 License
  71. 71. HTMLを生成view.htmlを次のようにします。 Creative Commons Attribution 3.0 License
  72. 72. HTMLを生成view.htmlを次のようにします。<h1>{{.Title}}</h1><p>[<a href="/edit/{{.Title}}">edit</a>]</p><div>{{printf "%s" .Body}}</div> Creative Commons Attribution 3.0 License
  73. 73. HTMLを生成view.htmlを次のようにします。<h1>{{.Title}}</h1><p>[<a href="/edit/{{.Title}}">edit</a>]</p><div>{{printf "%s" .Body}}</div> これは、 .Bodyが[]byteであるため、stringにして表示しています。 http://golang.org/pkg/text/template/#hdr-Functions Creative Commons Attribution 3.0 License
  74. 74. HTMLを生成 /edit/sample Editing sample次にeditページを作成します。edit.htmlを次のようにしましょう。 Save Creative Commons Attribution 3.0 License
  75. 75. HTMLを生成 /edit/sample Editing sample次にeditページを作成します。edit.htmlを次のようにしましょう。<h1>Editing {{.Title}}</h1> Save<form action="/save/{{.Title}}" method="POST"><div><textarea name="body" rows="20" cols="80">{{printf "%s" .Body}}</textarea></div><div><input type="submit" value="Save"></div></form> Creative Commons Attribution 3.0 License
  76. 76. HTMLを生成次に、editページも同様に作成しましょう。 Creative Commons Attribution 3.0 License
  77. 77. HTMLを生成editHandlerを次のようにします。http.HandleFunc(“/edit/”, editHandler) ←ハンドラ登録も忘れずにfunc editHandler(w *http.ResponseWriter,r *http.Request){ title := r.URL.Path[6:] p, err := loadPage(title) if err != nil { p = &Page{Title: title} //空のPage構造体を作成 } t, _ := template.ParseFiles(“edit.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  78. 78. どこまでできた?http://localhost:8080/edit/sample Creative Commons Attribution 3.0 License
  79. 79. どこまでできた?http://localhost:8080/edit/sample Editing sample Save Creative Commons Attribution 3.0 License
  80. 80. どこまでできた?http://localhost:8080/edit/sample Editing sample sample body Save Creative Commons Attribution 3.0 License
  81. 81. どこまでできた?http://localhost:8080/edit/sample editHandler Editing sample sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  82. 82. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  83. 83. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  84. 84. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  85. 85. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  86. 86. saveHandlerを作成edit.htmlを次のようにします。http.HandleFunc(“/save/”, saveHandler)func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} Creative Commons Attribution 3.0 License
  87. 87. saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できるhttp.HandleFunc(“/save/”, saveHandler)func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} Creative Commons Attribution 3.0 License
  88. 88. saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できるhttp.HandleFunc(“/save/”, saveHandler)func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} ステータスコードを付与してリダイレクトする ここでは“/view/” + title にリダイレクト Creative Commons Attribution 3.0 License
  89. 89. saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できる http.StatusMovedPermanently = 301http.HandleFunc(“/save/”, saveHandler) http.StatusFound = 302 http.StatusSeeOther = 303func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] http.StatusTemporaryRedirect = 307 body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} ステータスコードを付与してリダイレクトする ここでは“/view/” + title にリダイレクト Creative Commons Attribution 3.0 License
  90. 90. 基本的なwikiは完成http://localhost:8080/edit/sample Creative Commons Attribution 3.0 License
  91. 91. 基本的なwikiは完成http://localhost:8080/edit/sample Editing sample Save Creative Commons Attribution 3.0 License
  92. 92. 基本的なwikiは完成http://localhost:8080/edit/sample Editing sample sample body Save Creative Commons Attribution 3.0 License
  93. 93. 基本的なwikiは完成http://localhost:8080/edit/sample editHandler Editing sample sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  94. 94. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  95. 95. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  96. 96. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  97. 97. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body saveHandler Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  98. 98. 基本的なwikiは完成エラー処理など、殆どやってないので、イケてないところが多く残っていますが、wikiの基本機能は完成です。Writing Web Applicationでは、regexpパッケージ使用して入力チェックしたり、クロージャを使用したりありますが、詳しくはWebを参照ください。 Creative Commons Attribution 3.0 License
  99. 99. tipsCreative Commons Attribution 3.0 License
  100. 100. GET、POSTnet/http パッケージfunc Get(url string) (resp *Response, err error)例 res, _ := http.Get("http://www.google.com/robots.txt") body, _ := iouti.ReadAll(res.Body) res.Body.Close()func Post(url string, bodyType string, body io.Reader)(resp *Response, err error) Creative Commons Attribution 3.0 License
  101. 101. XML、JSON encoding/xml パッケージが使用できます。 encoding/json例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  102. 102. XML、JSON encoding/xml パッケージが使用できます。 encoding/json xml 構造体 json例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  103. 103. XML、JSON encoding/xml パッケージが使用できます。 encoding/json Marshal(v interface{}) (data []byte, error) xml 構造体 json Unmarshal(data []byte, v interface{}) error例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  104. 104. XML、JSON encoding/xml パッケージが使用できます。 encoding/json Marshal(v interface{}) (data []byte, error) xml 構造体 同じI/F json Unmarshal(data []byte, v interface{}) error例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  105. 105. XML、JSON encoding/xml パッケージが使用できます。 encoding/json Marshal(v interface{}) (data []byte, error) xml 構造体 同じI/F json Unmarshal(data []byte, v interface{}) error ポインタじゃないと例 http://play.golang.org/p/ADbOOeCVCn 怒られます Creative Commons Attribution 3.0 License
  106. 106. サーバ上で Javascriptを使うhttp.Handle(“/js/”, http.StripPrefix(“/js/”, http.FileServer(http.Dir(“js”)))) Creative Commons Attribution 3.0 License
  107. 107. templateファイルを分けることも可能<!doctype html><html><head></head><body>{{template “content” .}}</body></html>{{define “content”}}{{.Titile}}{{end}} Creative Commons Attribution 3.0 License
  108. 108. データベースのドライバSQL database drivers Creative Commons Attribution 3.0 License
  109. 109. FastCGIpackage mainimport (! "fmt"! "net"! "net/http"! "net/http/fcgi")func main() {! mux := http.NewServeMux()! mux.HandleFunc("/", index)! l, _ := net.Listen("tcp", ":9000")! fcgi.Serve(l, mux)}func index(w http.ResponseWriter, r *http.Request) {! fmt.Fprintf(w, "hello,FastCGI!")} Creative Commons Attribution 3.0 License
  110. 110. FastCGIpackage mainimport (! "fmt"! "net"! "net/http"! "net/http/fcgi")func main() {! mux := http.NewServeMux()! mux.HandleFunc("/", index)! l, _ := net.Listen("tcp", ":9000")! fcgi.Serve(l, mux)}func index(w http.ResponseWriter, r *http.Request) {! fmt.Fprintf(w, "hello,FastCGI!")} nginx上で動きます Creative Commons Attribution 3.0 License
  111. 111. websocketwebsocketのパッケージはGo 1になって標準パッケージではなくなりましたが、別のリポジトリに残ってます。“code.google.com/p/go.net/websocket”下記のブログにwebsocketを使ってチャット作った動画が上がっています。http://u.hinoichi.net/2012/12/14/websocketを使ってみた-with-go言語/動画http://www.youtube.com/watch?feature=player_embedded&v=ekXCCIxN3gg Creative Commons Attribution 3.0 License
  112. 112. 以上、つたない説明でしたがGo言語でWebアプリを作る足がかりなれば幸いです。 Creative Commons Attribution 3.0 License
  113. 113. ご清聴ありがとうございました Creative Commons Attribution 3.0 License
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×