Anchor
2014-12-16 14:06:21 -08:00
409 changed files with 377 additions and 311 deletions

3
LANGS.md Normal file
View File

@@ -0,0 +1,3 @@
* [English](en/)
* [中文](zh/)
* [日本語](ja/)

View File

@@ -1,35 +1,20 @@
# 《Go Web 编程》
这本书目前有多个版本:
# Mulit Language Version
* [English](en/)
* [中文](zh/)
* [日本語](ja/)
[中文开始阅读](<https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/preface.md>)
# Donate
[日文开始阅读](<https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/ebook/preface.md>)
[English Version](<https://github.com/astaxie/build-web-application-with-golang/blob/master/en/eBook/preface.md>)
目前这本书已经出版,如果你觉得内容还可以,你可以通过下面几个途径购买,谢谢支持:
- [chinapub](http://product.china-pub.com/3767290)
- [当当网](http://product.dangdang.com/product.aspx?product_id=23231404)
- [京东](http://book.jd.com/11224644.html)
- [Amazon](http://www.amazon.cn/Go-Web%E7%BC%96%E7%A8%8B-%E8%B0%A2%E5%AD%9F%E5%86%9B/dp/B00CHWVAHQ/ref=sr_1_1?s=books&ie=UTF8&qid=1369323453&sr=1-1)
![](ebook/images/ebook.jpg)
# 通过捐款支持本书
如果你喜欢这本《Go Web编程》的话 可以通过捐款的方式, 支持作者继续更新本书或者做出其他更多好玩好用的开源应用: 比如为本书修补漏洞、添加更多有趣的章节, 或者发行有更多更棒内容的下一版或者改善beego等等。
支付宝扫描捐款: ![](ebook/images/alipay.png)
AliPay: <img src="zh/images/alipay.png" alt="alipay" width="100" height="100">
English Donate:[donate](http://beego.me/donate)
## 交流
欢迎大家加入QQ群259316004 《Go Web编程》专用交流群
## Community
QQ群386056972
论坛交流[http://bbs.go-china.org/](http://bbs.go-china.org/)
BBS[http://golanghome.com/](http://golanghome.com/)
## 致谢
首先要感谢Golang-China的QQ群102319854(已满)请加2群(384414723),里面的每一个人都很热心,同时要特别感谢几个人
## Acknowledgments
- [四月份平民](https://plus.google.com/110445767383269817959) (review代码)
- [Hong Ruiqi](https://github.com/hongruiqi) (review代码)
@@ -39,11 +24,9 @@ English Donate:[donate](http://beego.me/donate)
- [polaris](https://github.com/polaris1119)(review书)
- [雨痕](https://github.com/qyuhen)(review第二章)
## 授权许可
除特别声明外,本书中的内容使用[CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)(创作共用 署名-相同方式共享3.0许可协议)授权,代码遵循[BSD 3-Clause License](<https://github.com/astaxie/build-web-application-with-golang/blob/master/LICENSE.md>)3项条款的BSD许可协议
## License
Book License: [CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)
## 开始阅读
[开始阅读](<https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/preface.md>)
Code License: [BSD 3-Clause License](<https://github.com/astaxie/build-web-application-with-golang/blob/master/LICENSE.md>)
[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/44c98c9d398b8319b6e87edcd3e34144 "githalytics.com")](http://githalytics.com/astaxie/build-web-application-with-golang)

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

1
images
View File

@@ -1 +0,0 @@
ebook/images/

View File

@@ -96,13 +96,16 @@ PATHを設定します。`export PATH=$PATH:$GO_INSTALL_DIR/go/bin`
もしgoのUsage情報が現れた場合は、goはすでにインストールされています。もしこのコマンドが存在しないと出てきた場合は、自分のPATH環境変数の中にgoのインストールディレクトリが含まれているか確認してください。
### Windows インストール
### Windows インストール ###
[ダウンロードURL][downlink]に接続し、32bitシステムはgo1.0.3.windows-386.msiをダウンロードします。64bitシステムであればgo1.0.3.windows-amd64.msiをダウンロードします。ファイルをダブルクリックして、デフォルトのまま「次へ」をクリックします。この時goはすでにあなたのシステムにインストールされています。デフォルトでインストール後の環境変数には`c:/go/bin`が追加されています。cmdを開いて、`go`と入力します。
[Google Code ダウンロードページ][downlink]に接続し、32bit の場合は名前に windows-386 を含む msi パッケージをダウンロードします。64bit であれば名前に windows-amd64 を含むものをダウンロードします。ダウンロード後実行しますが、デフォルトのインストールフォルダである C:\Go\を変更してはいけません。他の場所にインストールしてしまうと、あなたが書いた Go コードが実行できなくなってしまうかもしれません。インストールが終わるとデフォルトで環境変数 Path に Go のインストールフォルダの下にある bin フォルダ `C:\Go\bin\` が追加され、Go のインストールフォルダである `C:\Go\` の値が環境変数 GOROOT に追加されます。
macインストール成功の画像で、インストールが成功します。
** インストールが成功しているか確認する **
「ファイル名を指定して実行」に `cmd` を入力することでコマンドラインツールを開きます。プロンプトで`go`と入力することで Usage 情報が確認できるか確かめることができます。`cd %GOROOT%` を入力すると、Go のインストールフォルダに入れるか確認できます。どちらも成功していれば、インストールに成功しています。
インストールに成功していなければ、環境変数 Path と GOROOT の値を確認してください。もし存在しなければアンインストールの上再インストールし、存在していればコンピュータを再起動し、上の手順を再度お試しください。
もしGoのUsage情報が現れたら、Goはすでにインストールされています。もしこのコマンドが存在しないと出た場合は自分のPATH環境変数にGoのインストールディレクトリが含まれるか確認してください。
## サードパーティツールのインストール
### GVM

View File

@@ -33,7 +33,7 @@
array_windows.go
array_freebsd.go
`go build`の際、システム名の末尾のファイルから選択的にコンパイルすることができます(linux、darwin、windows、freebsd
`go build`の際、システム名の末尾のファイルから選択的にコンパイルすることができます(Linux、Darwin、Windows、Freebsd
## go clean

View File

@@ -166,7 +166,7 @@
"env": { "GOPATH": "$HOME/golang:$GS_GOPATH" }
}
`$GS_GOPATH` は gosublime の仮想的な環境変数です。自動的に`.go`ファイルが存在する `~/go/src` を探し出すことで、 `~/go/` をプロジェクトのパスと推測し、自動的に `GOPATH` を適用します。
`$GS_GOPATH` は gosublime の仮想的な環境変数です。自動的に`.go`ファイルが存在する `~/go/src` を探し出すことで、 `~/go/` をプロジェクトのパスと推測し、自動的に `GOPATH` を適用します。注意このような方法ではsublimeにおいてオリジナルのGOPATHを上書きしてしまいます。もしこの設定でエラーが発生した場合は、GOPATHに関連した問題が発生していることになります
もうひとつは、sublime プロジェクトの保存です。 project_name.sublime-project を修正して項目を追加します
@@ -226,7 +226,7 @@ Vimはviから発展したテキストエディタです。コード補完、コ
5. おめでとうございます。インストール完了です。あなたは今から`:e main.go`でGoで開発する面白さを体験することができます。
より多くのVIM 設定は、[リンク](http://monnand.me/p/vim-golang-environment/zhCN/)をご参照ください。
より多くのVIM設定は、[リンク](http://monnand.me/p/vim-golang-environment/zhCN/)をご参照ください。
## Emacs
Emacsは伝説の神器です。彼女はエディタであるだけでなく、統合環境でもあります。または開発環境の集大成と呼んでもよいかもしれません。これらの機能はユーザの身を万能のオペレーティングシステムに置きます。
@@ -457,4 +457,4 @@ Javaに親しい読者はideaには不慣れだと思います、ideaはプラ
## links
* [目次](<preface.md>)
* 前へ: [Goのコマンド](<01.3.md>)
* 次へ: [概要](<01.5.md>)
* 次へ: [まとめ](<01.5.md>)

View File

@@ -1,4 +1,4 @@
# 1.5 概要
# 1.5 まとめ
この章では主にどのようにしてGoをインストールするかについてご紹介しました。Goは3つの種類のインストール方法がありますソースコードインストール、標準パッケージインストール、サードパーティツールによるインストールです。インストール後開発環境を整え、ローカルの`$GOPATH`を設定します。`$GOPATH`設定を通じて読者はプロジェクトを作成することができます。次にどのようにプロジェクトをコンパイルするのか説明しました。アプリケーションのインストールといった問題はたくさんのGoコマンドを使用する必要があります。そのため、Goで日常的に用いられるコマンドツールについてもご説明しました。コンパイル、インストール、整形、テストなどのコマンドです。最後にGoの開発ツールについてご紹介しました。現在多くのGoの開発ツールにはLiteIDE、sublime、VIM、Emacs、Eclipse、Ideaといったツールがあります。読者は自分が一番慣れ親しんだツールを設定することができます。便利なツールで素早くGoアプリケーションを開発できるよう願っています。

View File

@@ -15,5 +15,5 @@ GoはCに似たコンパイラ型言語です。ですが、このコンパイ
## links
* [目次](<preface.md>)
* 前へ: [第一章概要](<01.5.md>)
* 前へ: [第一章まとめ](<01.5.md>)
* 次へ: [こんにちは、Go](<02.1.md>)

View File

@@ -103,7 +103,7 @@ Goではbool値の型は`bool`です。値は`true`もしくは`false`です。
>注意しなければならないのは、これらの型の変数間は相互に代入または操作を行うことができないということです。コンパイル時にコンパイラはエラーを発生させます。
>
>下のコードはエラーが発生します。
>下のコードはエラーが発生します。invalid operation: a + b (mismatched types int8 and int32)
>
>> var a int8
@@ -135,7 +135,7 @@ Goではbool値の型は`bool`です。値は`true`もしくは`false`です。
frenchHello = "Bonjour" // 通常の代入
}
Goの文字列は変更することができません。例えば下のコードはコンパイル時にエラーが発生します。
Goの文字列は変更することができません。例えば下のコードはコンパイル時にエラーが発生します。cannot assign to s[0]
var s string = "hello"
s[0] = 'c'
@@ -168,7 +168,10 @@ Goでは`+`演算子を使って文字列を連結することができます:
m := `hello
world`
`` ` `` で括られた文字列はRaw文字列です。すなわち、文字列はコード内の形式がそのままプリント時の形式になります。文字列の変更はありません。改行はそのまま出力されます。
`` ` `` で括られた文字列はRaw文字列です。すなわち、文字列はコード内の形式がそのままプリント時の形式になります。文字列の変更はありません。改行はそのまま出力されます。例えばこの例では以下のように出力されます:
hello
world
### エラー型
Goにはビルトインの`error`型があります。専らエラー情報の処理に使用されます。Goの`package`の中にはエラー処理を行う`errors`というパッケージがあります。
@@ -383,7 +386,7 @@ sliceには便利な操作があります
下のコードをご覧ください。`map`の読み込みと代入は`slice`と似ています。`key`を通して操作します。ただ、`slice``index``int`型のみになります。`map`には多くの型があります。`int`でもかまいませんし、`string``==``!=`演算子が定義されている全ての型でもかまいません。
// keyを文字列で宣言します。値はintとなるディクショナリです。この方法は使用される前にmakeで初期化される必要があります。
var numbers map[string] int
var numbers map[string]int
// もうひとつのmapの宣言方法
numbers := make(map[string]int)
numbers["one"] = 1 //代入
@@ -407,7 +410,7 @@ mapを使う段階で注意しなければならないことがいくつかあ
`delete``map`の要素を削除します:
// ディクショナリを初期化します。
rating := map[string]float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 }
rating := map[string]float32{"C":5, "Go":4.5, "Python":4.5, "C++":2 }
// mapはつの戻り値があります。つ目の戻り値では、もしkeyが存在しなければ、okはfalseに、存在すればokはtrueになります。
csharpRating, ok := rating["C#"]
if ok {
@@ -445,7 +448,7 @@ mapを使う段階で注意しなければならないことがいくつかあ
図2.5 makeとnewの低レイヤでのメモリの割り当て
"ゼロ値"というのは何もカラの値ではありません。これは一種の"変数が埋めらる前"のデフォルト値であり、通常は0です。
"ゼロ値"というのは何もの値ではありません。これは一種の"変数が埋めらる前"のデフォルト値であり、通常は0です。
それぞれの型のゼロ値は以下の通りです
int 0

View File

@@ -1,7 +1,7 @@
# 2.3 フローと関数
この節ではGoの中のフロー制御と関数操作についてご紹介します。
## フロー制御
フロー制御はプログラム言語の中の最も偉大な発明です。なぜならこれがあるだけで、あなたはとても簡単なフローの記述でとても複雑なロジックを表現できるからです。フロー制御は3つの部分から成ります:条件判断、ループ制御及び無条件ジャンプです。
フロー制御はプログラム言語の中の最も偉大な発明です。なぜならこれがあるだけで、あなたはとても簡単なフローの記述でとても複雑なロジックを表現できるからです。Goではフロー制御は3つの部分から成ります:条件判断、ループ制御及び無条件ジャンプです。
### if
`if`はあらゆるプログラミング言語の中で最もよく見かけるものかもしれません。この文法は大雑把に言えば:もし条件を満足しなければ何々を行い、そうでなければまたもう一つ別のことをやるということです。
@@ -50,7 +50,7 @@ Goには`goto`句があります- - ぜひ賢く使ってください。`goto`
>タグの名前は大文字小文字を区別します。
### for
Goにで最も力なロジックコントロールといえば、`for`です。これはループでデータを読むのに使えます。`while`でロジックをコントロールしても構いません。イテレーション操作も行えます。文法は以下の通りです:
Goにで最も力なロジックコントロールといえば、`for`です。これはループでデータを読むのに使えます。`while`でロジックをコントロールしても構いません。イテレーション操作も行えます。文法は以下の通りです:
for expression1; expression2; expression3 {
//...
@@ -369,7 +369,7 @@ Goでは関数も変数の一種です。`type`を通して定義します。こ
type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])
を型として扱うことにメリットはあるのでしょうか?ではこの型の関数を値として渡してみましょう。以下の例をご覧ください。
を型として扱うことにメリットはあるのでしょうか?ではこの型の関数を値として渡してみましょう。以下の例をご覧ください。
package main
import "fmt"
@@ -415,7 +415,7 @@ Goでは関数も変数の一種です。`type`を通して定義します。こ
### PanicとRecover
GoにはJavaのような例外処理はありません。例外を投げないのです。その代わり、`panic``recover`を使用します。ぜひ覚えておいてください、これは最後の手段として使うことを。つまり、あなたのコードにあってはなりません。もしくは`panic`を極力減らしてください。これは非常に力なツールです。賢く使ってください。では、どのように使うのでしょうか?
GoにはJavaのような例外処理はありません。例外を投げないのです。その代わり、`panic``recover`を使用します。ぜひ覚えておいてください、これは最後の手段として使うことを。つまり、あなたのコードにあってはなりません。もしくは`panic`を極力減らしてください。これは非常に力なツールです。賢く使ってください。では、どのように使うのでしょうか?
Panic
>ビルトイン関数です。オリジナルの処理フローを中断させることができます。パニックが発生するフローの中に入って関数`F``panic`をコールします。このプロセスは継続して実行されます。一旦`panic``goroutine`が発生すると、コールされた関数がすべて返ります。この時プログラムを抜けます。パニックは直接`panic`をコールします。実行時にエラーを発生させてもかまいません。例えば配列の境界を超えてアクセスする、などです。
@@ -468,7 +468,7 @@ Goのコードを書いている時は、importコマンドによってパッケ
fmt.Println("hello world")
上のfmtはGo言語の標準ライブラリです。実はgorootの下にこのモジュールが加えられています。当然Goのインポートは以下のようなつの方法で自分の書いたモジュールを追加することができます
上のfmtはGo言語の標準ライブラリです。実は`GOROOT`環境変数で指定されたディレクトリの下にこのモジュールが加えられています。当然Goのインポートは以下のようなつの方法で自分の書いたモジュールを追加することができます
1. 相対パス

View File

@@ -2,7 +2,7 @@
前のつの章で関数とstructをご紹介しました。関数をstructのフィールドとして処理したくなったんじゃないですか今日は関数のもう一つの形態についてご説明します。受け取り手のいる関数で、我々が`method`とよんでいるものです。
## method
今、このような状況にいると仮定します。あなたは長方形というstructを定義してこの面積を求めようとしています。では、我々の一般的な思考回路に基づけば下のような方法で実現するでしょう。
今、このような状況にいると仮定します。あなたは長方形というstructを定義してこの面積を求めようとしています。我々の一般的な思考回路に基づけば下のような方法で実現するでしょう。
package main
import "fmt"
@@ -22,11 +22,11 @@
fmt.Println("Area of r2 is: ", area(r2))
}
このコードは長方形の面積を求めることができますが、area()はRectangleのメソッドで実現されたものではありません(オブジェクト指向のメソッドのようなもの)。Rectangleのオブジェクトここではr1,r2を引数に面積を京s何する関数に渡しているだけです。
このコードは長方形の面積を求めることができますが、area()はRectangleの(一般的なオブジェクト指向でいうような)メソッドで実現されたものではありません。Rectangleのオブジェクトここではr1,r2を引数に面積を計算する関数に渡しているだけです。
このように実現してももちろん構わないのですが、図形が増えてきて、正方形、五角形ついには多角形になってきた頃、これらの面積も求めようとするとどうでしょう?この場合関数を増やすしかなくなってしまいます。関数名はそれぞれ用意しなければなりません。`area_rectangle, area_circle, area_triangle...`といった具合に。
下の図で示すように、楕円が関数を表しています。これらの関数はstructに属していないまたはオブジェクト指向の専門用語でclassに属していないといいますので、structの外側に単独で存在しており、概念上どのstructにも属していないことになります。
下の図で示すように、楕円が関数を表しています。これらの関数はstructに属していないオブジェクト指向用語で言い換えるとclassに属していないので、structの外側に単独で存在しており、概念上どのstructにも属していないことになります。
![](images/2.5.rect_func_without_receiver.png?raw=true)
@@ -34,7 +34,7 @@
明らかにこのような実現方法はエレガントではありません。それに概念からしても"面積"は"形状"の一属性です。これはある特定の形状に属しています。長方形の縦と横と同じようなものです。
このような理由から`method`の概念が生まれました。`method`はある型の上に付属しています。この文法と関数の宣言の文法はほとんど同じです。ただ、`fenc`の後にreceivermethodがくっついているということです)を追加します。
このような理由から`method`の概念が生まれました。`method`はある型属しています。この文法と関数の宣言の文法はほとんど同じです。ただ、`func`の後にreceivermethodがくっついているということですを追加します。
上で述べた形状の例からすると、method `area()` はある形状たとえばRectangleに由来して発生しています。Rectangle.area()の主語はRectangle、area()はRectangleに属するメソッドで外側の関数ではありません。
@@ -89,9 +89,9 @@ methodの文法は以下のとおりです
methodを使う時にはいくつか注意が必要です。
- methodは名前はまったく同じといってもレシーバが異なればmethodも異なります。
- methodはまったく同じ名前でもレシーバが異なればmethodも異なります。
- methodはレシーバのフィールドにアクセスすることができます。
- methodのコール`.`を通じてアクセスします。structがフィールドにアクセスするのと同じです。
- methodの呼び出し`.`を通じて行います。structがフィールドにアクセスするのと同じです。
図解:
@@ -122,7 +122,7 @@ methodはstructの上でしか使用されないのでしょうか当然違
"December":31,
}
わかりましたか簡単でしょうこのように自分のコードの中に意味のある型を定義することができるのです。実際はエイリアスを定義しているだけです。Cのtypedefにたようなもので、例えば上のagesはintの代わりになっています。
わかりましたか簡単でしょうこのように自分のコードの中に意味のある型を定義することができるのです。実際はエイリアスを定義しているだけです。Cのtypedefにたようなもので、例えば上のagesはintの代わりになっています。
それじゃあ、`method`にもどりましょう。
@@ -156,7 +156,7 @@ methodはstructの上でしか使用されないのでしょうか当然違
b.color = c
}
func (bl BoxList) BiggestsColor() Color {
func (bl BoxList) BiggestColor() Color {
v := 0.00
k := Color(WHITE)
for _, b := range bl {
@@ -192,13 +192,13 @@ methodはstructの上でしか使用されないのでしょうか当然違
fmt.Printf("We have %d boxes in our set\n", len(boxes))
fmt.Println("The volume of the first one is", boxes[0].Volume(), "cm³")
fmt.Println("The color of the last one is",boxes[len(boxes)-1].color.String())
fmt.Println("The biggest one is", boxes.BiggestsColor().String())
fmt.Println("The biggest one is", boxes.BiggestColor().String())
fmt.Println("Let's paint them all black")
boxes.PaintItBlack()
fmt.Println("The color of the second one is", boxes[1].color.String())
fmt.Println("Obviously, now, the biggest one is", boxes.BiggestsColor().String())
fmt.Println("Obviously, now, the biggest one is", boxes.BiggestColor().String())
}
上のコードはconstでいくつかの定数を定義しています。その後カスタム定義型を定義しています。
@@ -209,20 +209,20 @@ methodはstructの上でしか使用されないのでしょうか当然違
次に上のカスタム定義型をレシーバとしてmethodを定義します。
- Volume()はレシーバをBoxとして定義します。Boxの積を返します。
- Volume()はレシーバをBoxとして定義します。Boxの積を返します。
- SetColor(c Color)はBoxの色をcに変更します。
- BiggestsColor()はBoxListに定義されており、listの中の体積が最大の色を返します。
- PointItBlack()はBoxListのすべてのBoxの色を全部黒に変更します。
- String()はColorに定義されており、Colorno具体的な色を返します(文字列形式)
- BiggestColor()はBoxListに定義されており、listの中の体積が最大の色を返します。
- PaintItBlack()はBoxListのすべてのBoxの色を全部黒に変更します。
- String()はColorに定義されており、Color具体的な色を返します(文字列形式)
上のコードは文字で書くと非常に簡単に思えませんか?私達は問題を解決する場合問題の描写を通して、対応するコードを書くことで実現します。
### ポインタとしてのreceiver
ではここで、SetColorのメソッドを見なおしてみましょう。このreceiverはBoxのポインタをさしています。そうです。*Boxを使えるのです。どうしてBox本体ではなくポインタを使うのでしょうか
SetColorを定義した本当の目的はこのBoxの色を変更することです。もしBoxのポインタを渡さなければ、SetCororが受け取るのは実はBoxのコピーになってしまいます。つまり、メソッド内で色の変更を行うと、Boxのコピーを操作しているだけで、本当のBoxではないのです。そのため、ポインタを渡す必要があります。
SetColorを定義した本当の目的はこのBoxの色を変更することです。もしBoxのポインタを渡さなければ、SetColorが受け取るのは実はBoxのコピーになってしまいます。つまり、メソッド内で色の変更を行うと、Boxのコピーを操作しているだけで、本当のBoxではないのです。そのため、ポインタを渡す必要があります。
ここではreceiverをメソッドの第一引数にました。こうすれば前の関数で説明した値渡しと参照渡しも難しくなくなるでしょう。
ここではreceiverをメソッドの第一引数にました。こうすれば前の関数で説明した値渡しと参照渡しも難しくなくなるでしょう。
もしかしたらSetColor関数の中で以下のように定義すべきじゃないかと思われたかもしれません。`*b.Color=c`、ところが`b.Color=c`でよいのです。ポインタに対応する値を読み込むことが必要ですから。

View File

@@ -142,7 +142,7 @@ mはつの型を持つことのできるオブジェクトなので、Men型
mike := Student{Human{"Mike", 25, "222-222-XXX"}, "MIT", 0.00}
paul := Student{Human{"Paul", 26, "111-222-XXX"}, "Harvard", 100}
sam := Employee{Human{"Sam", 36, "444-222-XXX"}, "Golang Inc.", 1000}
Tom := Employee{Human{"Sam", 36, "444-222-XXX"}, "Things Ltd.", 5000}
Tom := Employee{Human{"Tom", 37, "222-444-XXX"}, "Things Ltd.", 5000}
//Men型の変数iを定義します。
var i Men
@@ -354,7 +354,7 @@ sort.Interfaceは実は組み込みフィールドです。sort.Interfaceのす
}
### リフレクション
Goはリフレクションを実装しています。いわゆるリフレクションとは動的な実行時の状態です。私達が一般的に使用しているパッケージはreflectパッケージです。どのようにreflectパッケージを使うかはオフィシャルのドキュメントに詳細な原理が説明されています。[laws of reflection](http://golang.org/doc/articles/laws_of_reflection.html)
Goはリフレクションを実装しています。リフレクションはプログラムの実行時の状態を検査することができます。私達が一般的に使用しているパッケージはreflectパッケージです。どのようにreflectパッケージを使うかはオフィシャルのドキュメントに詳細な原理が説明されています。[laws of reflection](http://golang.org/doc/articles/laws_of_reflection.html)
reflectを使うにはつのステップに分けられます。下で簡単にご説明しますリフレクションは型の値これらの値はすべて空のインターフェースを実装しています。。まずこれをreflectオブジェクトに変換する必要がありますreflect.Typeまたはreflect.Valueです。異なる状況によって異なる関数をコールします。このつを取得する方法は

View File

@@ -31,16 +31,16 @@ goroutineはGoのruntime管理を利用したスレッドコントローラで
say("hello") //現在のGoroutines実行
}
出力
hello
world
hello
world
hello
world
hello
world
hello
// 上のプログラムを実行すると以下のように出力されます
// hello
// world
// hello
// world
// hello
// world
// hello
// world
// hello
goキーワードで非常に簡単にマルチスレッドプログラミングを実現することがお分かりいただけるかと思います。
上の複数のgoroutineは同じプロセスで実行されています。メモリのデータを共有しますが、デザイン上共有を利用して通信を行ったりせず、通信によって共有を行うようにしましょう。
@@ -137,7 +137,7 @@ channelは`<-`演算子を使ってデータを送ったり受けたりします
}
}
`for i := range c`でこのchannelがクローズを明示されるまで連続してchannelの中のデータを読み込むことができます。上のコードでchannelのクローズが明示されているのが確認できるかと思います。生産者はキーワード`close`関数によってchannelを閉じます。channelを閉じた後はいかなるデータも送信することはできません。消費側は`v, ok := <-ch`という式でchannelがすでに閉じられているかテストすることができます。もしokにfalseが返ってきたら、channelはすでにどのようなデータも無く、閉じられているということになります。
`for i := range c`でこのchannelがクローズを明示されるまで連続してchannelの中のデータを読み込むことができます。上のコードでchannelのクローズが明示されているのが確認できるかと思います。生産者は`close`ビルトイン関数によってchannelを閉じます。channelを閉じた後はいかなるデータも送信することはできません。消費側は`v, ok := <-ch`という式でchannelがすでに閉じられているかテストすることができます。もしokにfalseが返ってきたら、channelはすでにどのようなデータも無く、閉じられているということになります。
>生産者の方でchannelが閉じられる事に注意してください。消費側ではありません。これは容易にpanicを引き起こします。
@@ -236,4 +236,4 @@ runtimeパッケージにはgoroutineを処理するいくつかの関数が含
## links
* [目次](<preface.md>)
* 前へ: [interface](<02.6.md>)
* 次へ: [概要](<02.8.md>)
* 次へ: [まとめ](<02.8.md>)

View File

@@ -1,4 +1,4 @@
# 2.8 概要
# 2.8 まとめ
この章では主にGo言語のいくつかの文法をご紹介しました。文法を通してGoがいかに簡単かご覧いただけたかと思います。たった個のキーワードです。もう一度これらキーワードが何に使われるのか見てみることにしましょう。

View File

@@ -1,11 +1,11 @@
# 3 Webの基礎
Webのプログラミングの基礎を勉強することはあなたにとってまさにこの本を読む理由でしょう。事実、どのようにGoを使ってWebアプリケーションをプログラムするかはこの本の目的でもあります。前回までで、Goは既に成熟したHttp処理パッケージを持つことをご紹介しました。これによってどのような事情の動的なWebプログラミングも簡単に作成できます。これ以降の章でご紹介する内容はどれもWebプログラミングの範疇です。この章ではWebに関する概念とGo言語がいかにWebプログラムを実行するかに集中して討論します。
Webのプログラミングの基礎を勉強することはあなたにとってまさにこの本を読む理由でしょう。事実、どのようにGoを使ってWebアプリケーションをプログラムするかはこの本の目的でもあります。前回までで、Goは既に成熟したHTTP処理パッケージを持つことをご紹介しました。これによってどのような事情の動的なWebプログラミングも簡単に作成できます。これ以降の章でご紹介する内容はどれもWebプログラミングの範疇です。この章ではWebに関する概念とGo言語がいかにWebプログラムを実行するかに集中して討論します。
## 目次
![](images/navi3.png?raw=true)
## links
* [目次](<preface.md>)
* 前へ: [第二章概要](<02.8.md>)
* 次へ: [webでの作業方法](<03.1.md>)
* 前へ: [第二章まとめ](<02.8.md>)
* 次へ: [Webでの作業方法](<03.1.md>)

View File

@@ -85,6 +85,8 @@ HTTPプロトコルはステートレスです。同じクライアントの前
//空行、リクエストヘッダとボディを分けるために使われます。
//ボディ、リソースへのリクエストのオプション、例えばPOSTが渡すオプション
HTTPプロトコルはサーバに対して交互にリクエストを送る方法が定義されています。基本は四種類。GET,POST,PUT,DELETEです。ひとつのURLアドレスはひとつのネットワーク上のリソースを描写しています。またHTTPの中のGET, POST, PUT, DELETEはこのリソースの検索、修正、増加、削除のつの操作に対応しています。よく見かけるのはGETとPOSTです。GETは一般的にリソースの情報を取得/検索するために用いられ、POSTはリソース情報を更新するために用いられます。
fiddlerパケットキャプチャを通して下のようなリクエスト情報を見ることができます。
![](images/3.1.http.png?raw=true)
@@ -95,13 +97,12 @@ fiddlerパケットキャプチャを通して下のようなリクエスト情
図3.5 fiddlerがキャプチャしたPOST情報
**GETリクエストのボディが空であることがわかります。POSTリクエストにはボディがあります**。
HTTPプロトコルはサーバに対して交互にリクエストを送る方法が定義されています。基本は四種類。GET,POST,PUT,DELETEです。ひとつのURLアドレスはひとつのネットワーク上のリソースを描写しています。またHTTPの中のGET, POST, PUT, DELETEはこのリソースの検索、修正、増加、削除のつの操作に対応しています。よく見かけるのはGETとPOSTです。GETは一般的にリソースの情報を取得/検索するために用いられ、POSTはリソース情報を更新するために用いられます。
GETとPOSTの区別を見てみましょう。
1. GETが入力するデータはURLの後に置かれます。?によってURLと渡すデータを分割します。オプションの間は&で繋ぎます。例えばEditPosts.aspx?name=test1&id=12345。POSTメソッドは入力するデータをHTTPパケットのBodyの中に置きます。
2. GETが入力するデータの大きさには制限があります。ブラウザのURLに対する長に制限があるためです。またPOSTメソッドで入力するデータには制限がありません
3. GETメソッドで入力されたデータはセキュリティの問題を引き起こします。例えばログイン画面があったとして、GETメソッドでデータを入力した場合、ユーザ名とパスワードはURL上にあらわれてしまうことになります。もしページがバッファリングされていたり他の人によっがこのマシンにアクセスすることができれば、ヒストリログからこのユーザのアカウントとパスワードを取得することができてしまいます。
1. GETリクエストのボディが空であることがわかります。POSTリクエストにはボディがありま
2. GETが入力するデータはURLの後に置かれます。?によってURLと渡すデータを分割します。オプションの間は&で繋ぎます。例えばEditPosts.aspx?name=test1&id=12345。POSTメソッドは入力するデータをHTTPパケットのBodyの中に置きます。
3. GETが入力するデータの大きさには制限があります。ブラウザのURLに対する長に制限があるためです。またPOSTメソッドで入力するデータには制限がありません。
4. GETメソッドで入力されたデータはセキュリティの問題を引き起こします。例えばログイン画面があったとして、GETメソッドでデータを入力した場合、ユーザ名とパスワードはURL上にあらわれてしまうことになります。もしページがバッファリングされていたり他の人によっがこのマシンにアクセスすることができれば、ヒストリログからこのユーザのアカウントとパスワードを取得することができてしまいます。
### HTTPレスポンスパケットサーバ情報
HTTPのresponseパケットを見てみることにしましょう。構造は以下のとおりです
@@ -116,7 +117,7 @@ HTTPのresponseパケットを見てみることにしましょう。構造は
//空行 ヘッダとボディを分けるために使われます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... //ボディ
Response包中的第一行叫做状态行由HTTP协议版本号 状态码, 状态消息 三部分组成
レスポンスパケットの第一行はステータス行と呼ばれ、HTTPプロトコルバージョン番号、ステータスコード、及びステータスメッセージのつの部分から構成されています
ステータスコードはHTTPクライアントにHTTPサーバが事前にResponseを発生させるか伝えます。HTTP/1.1プロトコルでは種類のステータスコードが定義されています。ステータスコードは3桁の数字で表されます。はじめの数字はレスポンスの型を定義しています。
@@ -156,4 +157,4 @@ Keep-Aliveは永久にコネクションを保持するものではありませ
## links
* [目次](<preface.md>)
* 前へ: [Webの基礎](<03.0.md>)
* 次へ: [GOでwebサーバを建てる](<03.2.md>)
* 次へ: [GOでWebサーバを建てる](<03.2.md>)

View File

@@ -1,8 +1,8 @@
# 3.2 GOで簡単なwebサーバを立てる
# 3.2 Goで簡単なWebサーバを立てる
前の節でWebはHTTPプロトコルに基づいたサービスであるとご紹介しました。Go言語では完全なnet/httpパッケージを提供しています。httpパッケージを通して実行できるwebサービスを非常に簡単に立ち上げる事ができます。同時にこのパッケージを使用することで、簡単にwebのルーティング、静的なファイル、テンプレート、cookie等のデータに対して設定と操作を行うことができます。
前の節でWebはhttpプロトコルに基づいたサービスであるとご紹介しました。Go言語では完全なnet/httpパッケージを提供しています。httpパッケージを通して実行できるWebサービスを非常に簡単に立ち上げる事ができます。同時にこのパッケージを使用することで、簡単にWebのルーティング、静的なファイル、テンプレート、cookie等のデータに対して設定と操作を行うことができます。
## httpパッケージでwebサーバを立てる
## httpパッケージでWebサーバを立てる
package main
@@ -50,15 +50,15 @@
図3.8 ユーザがWebにアクセスしてサーバが出力する情報
上のコードでwebサーバを書くためにはhttpパッケージのつの関数を呼ぶだけで良いことがわかります。
上のコードでWebサーバを書くためにはhttpパッケージのつの関数を呼ぶだけで良いことがわかります。
>もしあなたが以前PHPプログラマであれば。こう問うかもしれません。我々のnginx、apacheサーバは必要ないのですかとなぜならこいつは直接tcpポートを関ししますので、nginxがやることをやってくれます。またsayhelloNameは実は我々が書いたロジック関数ですので、phpの中のコントローラcontroller関数に近いものです。
>もしあなたがpythonプログラマであったのなら、tornadoを聞いたことがあると思います。このコードはそれとよく似ていませんかええ、その通りです。goはpythonのような動的な言語によく似た特性を持っています。webアプリケーションを書くにはとても便利です。
>もしあなたがPythonプログラマであったのなら、tornadoを聞いたことがあると思います。このコードはそれとよく似ていませんかええ、その通りです。GoはPythonのような動的な言語によく似た特性を持っています。Webアプリケーションを書くにはとても便利です。
>もしあなたがrubyプログラマであったのなら、RORの/script/serverを起動したのと少し似ている事に気づいたかもしれません。
>もしあなたがRubyプログラマであったのなら、RORの/script/serverを起動したのと少し似ている事に気づいたかもしれません。
Goを通じて簡単な数行のコードでwebサーバを立ち上げることができました。さらにこのWebサーバの内部ではマルチスレッドの特性をサポートしています。続くつの節でgoが以下にWebのマルチスレッドを実現しているのか細かくご紹介します。
Goを通じて簡単な数行のコードでwebサーバを立ち上げることができました。さらにこのWebサーバの内部ではマルチスレッドの特性をサポートしています。続くつの節でGoが以下にWebのマルチスレッドを実現しているのか細かくご紹介します。
## links
* [目次](<preface.md>)

View File

@@ -41,7 +41,7 @@ Goがクライアントのリクエストを待ち受けるには以下のよう
ServeHTTP(ResponseWriter, *Request) // ルーティング実現器
}
Handlerはインターフェースですが、前の節の中`sayhelloName`関数特にServerHTTPというインターフェースを実装してはいませんでした。どうして追加できるのでしょうかもともとhttpパッケージの中では`HandlerFunc`という型定義ています。この型はデフォルトでServerHTTPインターフェースを実装しています。つまり、HandlerFunc(f)をコールして強制的にfをHandlerFunc型に型変換しているのです。このようにしてfはServerHTTPメソッドを持つことになります。
Handlerはインターフェースですが、前の節の中`sayhelloName`関数では特にServeHTTPというインターフェースを実装してはいませんでした。どうして追加できるのでしょうかもともとhttpパッケージの中では`HandlerFunc`という型定義されています。私達が定義した`sayhelloName`関数はまさにこのHandlerFuncがコールされた結果であり、この型はデフォルトでServeHTTPインターフェースを実装していることになります。つまり、HandlerFunc(f)をコールして強制的にfをHandlerFunc型に型変換しているのです。このようにしてfはServeHTTPメソッドを持つようになります。
type HandlerFunc func(ResponseWriter, *Request)
@@ -50,7 +50,7 @@ Handlerはインターフェースですが、前の節の中で`sayhelloName`
f(w, r)
}
ルータでは対応するルーティングルールを保存した後、具体的にはどのようにリクエストを振り分けているのでしょうか?以下のコードをご覧ください。デフォルトのルータは`ServerHTTP`を実装します:
ルータでは対応するルーティングルールを保存した後、具体的にはどのようにリクエストを振り分けているのでしょうか?以下のコードをご覧ください。デフォルトのルータは`ServeHTTP`を実装します:
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
if r.RequestURI == "*" {
@@ -62,7 +62,7 @@ Handlerはインターフェースですが、前の節の中で`sayhelloName`
h.ServeHTTP(w, r)
}
上に示す通りルータはリクエストを受け取った後、`*`であれば接続を切断し、そうでなければ`mux.handler(r).ServerHTTP(w, r)`をコールして対応する設定された処理Handlerを返し、`h.ServeHTTP(w, r)`を実行します。
上に示す通りルータはリクエストを受け取った後、`*`であれば接続を切断し、そうでなければ`mux.handler(r).ServeHTTP(w, r)`をコールして対応する設定された処理Handlerを返し、`h.ServeHTTP(w, r)`を実行します。
つまり、目的のルーティングのhandlerのServerHTTPインターフェースへのコールです。ではmux.Handler(r)はどのように処理するのでしょうか?
@@ -93,9 +93,9 @@ Handlerはインターフェースですが、前の節の中で`sayhelloName`
return
}
もともとこれはユーザのリクエストしたURLとルータの中に保存されているmapマッチングにって、このhandlerのServHTTPインターフェースコールすることで目的の関数を実行することができます。
もともとこれはユーザのリクエストしたURLとルータの中に保存されているmapに従ってマッチングしています。マッチングにって保存されているhandlerが返されるにあたり、このhandlerのServeHTTPインターフェースコールされ、目的の関数を実行することができます。
上の紹介を通て、ルーティングの全体プロセスを理解しました。これはHandlerインターフェースです。つまり外部ルータHandlerインターフェースを実装するだけで良く、自分自身で実装したルータのServHTTPの中でカスタム定義されたルータ機能を実することができます。
上の紹介を通て、私達はルーティングの全体プロセスを理解しました。Goは実は外部で実装されたルータをサポートしています。`ListenAndServe`の第2引数が外部のルータを設定する為に用いられます。これはHandlerインターフェースのひとつで、外部ルータHandlerインターフェースを実装し、そのServeHTTPカスタム定義のルーティング機能を実することができます。
下のコードを通して、自分自身で簡単なルータを実装してみます。
@@ -135,11 +135,11 @@ httpパッケージへの分析を通して、全体のコードの実行プロ
順序にしたがっていくつかの事を行います:
1 DefaultServerMuxのHandlerFuncをコールする。
1 DefaultServeMuxのHandlerFuncをコールする。
2 DefaultServerMuxのHandleをコールする。
2 DefaultServeMuxのHandleをコールする。
3 DefaultServerMuxのmap[string]muxEntryで目的のhandlerとルーティングルールを追加する。
3 DefaultServeMuxのmap[string]muxEntryで目的のhandlerとルーティングルールを追加する。
- 次にhttp.ListenAndServe(":9090", nil)をコールする。
@@ -161,7 +161,7 @@ httpパッケージへの分析を通して、全体のコードの実行プロ
8 handlerのServeHttpをコールする
9 この例の中では、この後DefaultServerMux.ServeHttpの中に入ります
9 この例の中では、この後DefaultServeMux.ServeHttpの中に入ります
10 requestに従ってhandlerを選択し、このhandlerのServeHTTPに入ります
@@ -178,4 +178,4 @@ httpパッケージへの分析を通して、全体のコードの実行プロ
## links
* [目次](<preface.md>)
* 前へ: [Goはどのようにしてweb作業を行うか](<03.3.md>)
* 次へ: [概要](<03.5.md>)
* 次へ: [まとめ](<03.5.md>)

View File

@@ -1,4 +1,4 @@
# 3.5 概要
# 3.5 まとめ
この章ではHTTPプロトコル、DNS名前解決のプロセス、どのようにしてgoで簡単なweb serverを実装するかご紹介しました。net/httpパッケージのソースコードに触れるうちにこのserverを実装する秘密についてお分かりいただけたかと思います。
この章の学習を通じて、GoによるWeb開発の初歩をご理解いただければ幸いです。我々はまた対応するコードを見ることでGoでWebアプリケーションを開発することがとても便利でまた相当柔軟であると分かりました。

View File

@@ -21,5 +21,5 @@ HTTPプロトコルはステートレスなプロトコルです。ではどの
## links
* [目次](<preface.md>)
* 前へ: [第三章概要](<03.5.md>)
* 前へ: [第三章まとめ](<03.5.md>)
* 次へ: [フォームの入力を処理する](<04.1.md>)

View File

@@ -38,14 +38,14 @@ Webアプリケーションを書く時は主につの方面のデータ検
>Goの正規表現の実装は[RE2](http://code.google.com/p/re2/wiki/Syntax)です。すべての文字はUTF-8エンコーディングです。
## 中
フォームの要素からユーザの中国語名を得たい場合で、なおかつ正しい中国語であることを保証したい場合、検証を行う必要があります。ユーザに自由に入力はさせません。中国語に対する有効な検証方法は今のところ正規表現しかありません。下のコードをご確認ください
## 中国語
フォームの要素からユーザの中国語名を得たい場合で、なおかつ正しい中国語であることを保証したい場合、検証を行う必要があります。ユーザに自由に入力はさせません。中国語に対する有効な検証には、`unicode` パッケージが提供する `func Is(rangeTab *RangeTable, r rune) bool` と正規表現を使う方法がありま。下のコードをご確認ください
if m, _ := regexp.MatchString("^[\\x{4e00}-\\x{9fa5}]+$", r.Form.Get("realname")); !m {
if m, _ := regexp.MatchString("^\\p{Han}+$", r.Form.Get("realname")); !m {
return false
}
## 英
## 英
あるユーザの英語名を知りたいときなど、フォームの要素から英語の値を取り出したい場合は、astaxieであってasta谢ではないはずです。訳注:「谢」はピンインでxieと書く
簡単な正規表現を使ってデータを検証することができます:

View File

@@ -113,7 +113,8 @@
fmt.Println("error opening file")
return err
}
defer fh.Close()
//iocopy
_, err = io.Copy(fileWriter, fh)
if err != nil {
@@ -152,4 +153,4 @@
## links
* [目次](<preface.md>)
* 前へ: [フォームの多重送信の防止](<04.4.md>)
* 次へ: [概要](<04.6.md>)
* 次へ: [まとめ](<04.6.md>)

View File

@@ -1,4 +1,4 @@
# 4.6 概要
# 4.6 まとめ
この一章ではGoでどのようにフォームの情報を処理するか学びました。ユーザのログインから、ファイルのアップロードの例で、Goがformの情報およびファイルをアップロードする手段についてご説明しました。しかし、フォームを処理する過程ではユーザの入力した情報を懸賞する必要があります。ホームページのセキュリティの重要性を考慮すると、データのフィルタリングは相当重要です。そのため、以降の章では異なる方面のデータフィルタリングをご説明します。同時にGoの文字列に対する正規表現についても述べます。
この一章を通してクライアントとサーバが如何にデータを互いにやりとりするか理解いただけたと思います。クライアントはデータをサーバシステムに渡し、サーバはデータを受け取って結果をクライアントにフィードバックします。

View File

@@ -5,10 +5,12 @@ Goはどのようなデータベースの使用もbuiltinではサポートさ
現在NOSQLはすでにWeb開発の流行となっています。多くのアプリケーションがNOSQLをデータベースとして採用しています。以前のキャッシュではありません。5.6節ではMongoDBとRedisの2つのNOSQLデータベースについてご紹介します。
>[Go database/sql tutorial](http://go-database-sql.org/)ではよく使われる例と詳細な説明を提供しています。
## 目次
![](images/navi5.png?raw=true)
## links
* [目次](<preface.md>)
* 前へ: [第四章概要](<04.6.md>)
* 前へ: [第四章まとめ](<04.6.md>)
* 次へ: [database/sqlインターフェース](<05.1.md>)

View File

@@ -1,5 +1,5 @@
# 5.1 database/sqlインターフェース
GoPHPと異なる部分は、Goにはオフィシャルが提供するデータベースドライバを持っていない事です。開発者が開発するためにデータベースドライバで標準のインターフェースが定義されています。開発者は定義されているインターフェースに従って目的のデータベースドライバを開発することができます。これにはメリットがあります。標準のインターフェースを参照するだけでコードを開発できます。以降データベースに移する時、どのような修正も必要ありません。では、Goはどのような標準インターフェースを定義しているのでしょうか詳しく分析してみることにしましょう。
GoPHPと異なる部分は、Goには公式に提供されたデータベースドライバない事です。開発者が開発するためにデータベースドライバで標準のインターフェースが定義されています。開発者は定義されているインターフェースに従って目的のデータベースドライバを開発することができます。これにはメリットがあります。標準のインターフェースを参照するだけでコードを開発できます。以降データベースに移する時、どのような修正も必要ありません。では、Goはどのような標準インターフェースを定義しているのでしょうか詳しく分析してみることにしましょう。
## sql.Register
database/sqlに存在する関数はデータベースドライバを登録するためにあります。サードパーティの開発者がデータベースドライバを開発する時は、すべてinit関数を実装します。init関数ではこの`Register(name string, driver driver.Driver)`をコールすることでこのドライバの登録を完了させます。
@@ -138,7 +138,7 @@ Next関数はひとつのデータを返すのに用いられます。データ
## driver.RowsAffected
RowsAffestedは実はint64のエイリアスです。しかしResultインターフェースを実装していますので、低レイヤーでResultの表示メソッドを実装するために用いられます。
RowsAffectedは実はint64のエイリアスです。しかしResultインターフェースを実装していますので、低レイヤーでResultの表示メソッドを実装するために用いられます。
type RowsAffected int64

View File

@@ -37,7 +37,7 @@ GoではMySQLをサポートしたドライバが現在比較的多く、以下
package main
import (
_ "github.com/Go-SQL-Driver/MySQL"
_ "github.com/go-sql-driver/mysql"
"database/sql"
"fmt"
//"time"
@@ -114,7 +114,7 @@ GoではMySQLをサポートしたドライバが現在比較的多く、以下
キーとなるいくつかの関数についてご説明します:
sql.Open()関数は登録済みのデータベースドライバを開くために使用されます。Go-MySQL-Driverの中でmysqlのデータベースドライバを登録し、つ目の引数はDSN(Data Source Name)です。これはGo-MySQL-Driverが定義するデータベース接続と設定情報です。以下のシンタックスをサポートします
sql.Open()関数は登録済みのデータベースドライバを開くために使用されます。go-sql-driverの中でmysqlのデータベースドライバを登録し、つ目の引数はDSN(Data Source Name)です。これはgo-sql-driverが定義するデータベース接続と設定情報です。以下のシンタックスをサポートします
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8

View File

@@ -1,6 +1,6 @@
# 5.3 SQLiteデータベースの使用
SQLiteはオープンソースの組み込み式リレーショナルデータベースです。独立しており、設定なしでトランザクションのSQLデータベースエンジンをサポートします。非常にポータブルで簡単に利用でき、コンパクトで効率が高く、信頼性があります。他のデータベース管理システムとは異なり、SQLiteのインストールと実行は非常に簡単です。多くの場合は、ただSQLiteのバイナリファイルを用意するだけですぐに作成、接続、使用することができます。もしあなたが現在組み込み式データベースかソリューションをお探しであれば、SQLいては絶対に考慮するに値します。SQLiteはいわばオープンソースのAccessのようなものです。
SQLiteはオープンソースの組み込み式リレーショナルデータベースです。独立しており、設定なしでトランザクションのSQLデータベースエンジンをサポートします。非常にポータブルで簡単に利用でき、コンパクトで効率が高く、信頼性があります。他のデータベース管理システムとは異なり、SQLiteのインストールと実行は非常に簡単です。多くの場合は、ただSQLiteのバイナリファイルを用意するだけですぐに作成、接続、使用することができます。もしあなたが現在組み込み式データベースかソリューションをお探しであれば、SQLiteは絶対に考慮するに値します。SQLiteはいわばオープンソースのAccessのようなものです。
## ドライバ
Goがサポートするsqliteのドライバも比較的多いのですが、大部分はdatabase/sqlインターフェースをサポートしていません。

View File

@@ -9,7 +9,7 @@ MySQLはOracleに買収され、現在徐々にクローズされつつありま
## ドライバ
GoはPostgreSQLをサポートしたドライバも非常に多く実装されています。国外では多くの人が開発でこのデータベースを使用しているためです。
- https://github.com/bmizerany/pq database/sqlドライバをサポートしています。純粋にGoで書かれています。
- https://github.com/lib/pq database/sqlドライバをサポートしています。純粋にGoで書かれています。
- https://github.com/jbarham/gopgsqldriver database/sqlドライバをサポートしています。純粋にGoで書かれています。
- https://github.com/lxn/go-pgsql database/sqlドライバをサポートしています。純粋にGoで書かれています。
@@ -43,7 +43,7 @@ package main
import (
"database/sql"
"fmt"
_ "github.com/bmizerany/pq"
_ "https://github.com/lib/pq"
)
func main() {

View File

@@ -84,7 +84,7 @@ beedbインターフェースはもう一種類の挿入の方法を提供して
複数のデータを挿入
addslice := make([]map[string]interface{})
addslice := make([]map[string]interface{}, 0)
add:=make(map[string]interface{})
add2:=make(map[string]interface{})
add["username"] = "astaxie"

View File

@@ -111,4 +111,4 @@ mgoの操作方法とbeedbの操作方法はほとんど似ていることがわ
## links
* [目次](<preface.md>)
* 前へ: [beedbライブラリを使用してORM開発を行う](<05.5.md>)
* 次へ: [概要](<05.7.md>)
* 次へ: [まとめ](<05.7.md>)

View File

@@ -1,8 +1,10 @@
# 5.7 概要
# 5.7 まとめ
この章ではGoがどのようにdatabase/sqlインターフェースを設計するのかご説明しました。その後、サードパーティによるリレーショナルデータベースドライバの使用をご紹介しました。次にbeedbというリレーショナルデータベースに基づくORMライブラリがどのようにしてデータベースに対して簡単な操作を行うかご説明しました。最後にNOSQLのいくつかの知識をご紹介しました。現在GoのNOSQLに対するサポートはなかなかよくできています。Goは21世紀のC言語ですから、21世紀のデータベースに対するサポートも非常によくできています。
この一章の学習を通じて、いろいろなデータベースをどのように操作するか学んできました。Webの中でも重要なデータの保存に関する問題が解決したので、みなさんのdatabase/sqlの設計思想により一歩進んだ理解が深まることを願っています。
>[Go database/sql tutorial](http://go-database-sql.org/)ではよく使われる例と詳細な説明を提供しています。
## links
* [目次](<preface.md>)
* 前へ: [NOSQLデータベースの操作](<05.6.md>)

View File

@@ -1,12 +1,12 @@
# 6 sessionとデータの保存
Web開発ではどのようにしてユーザの閲覧過程のすべてをコントロールするかということは非常に重要です。HTTPプロトコルはステートレスですので、ユーザの毎回のリクエストにはステータスがありません。Web操作の全体の過程の中でどの接続がどのユーザと関係しているのか知る方法がありません。では、どのようにしてこの問題を解決しているのでしょうかWebでの伝統的な解決方法はcookieとsessionです。cookieによるメカニズムはクライアント側でのメカニズムです。ユーザのデータをクライアントに保存します。sessionメカニズムはサーバ側でのメカニズムです。サーバはハッシュテーブルのような構造でデータを保存します。ホームページの各閲覧者はユニークなIDを与えられます。すなわち、SessionIDです。この保存形式は2つだけですurlによって渡されるか、クライアントのcookieに保存されるかです。当然、Sessionをデータベースに保存することもできます。よりセキュリティが高まりますが、効率の面ではいくつか後退します。
6.1節ではsessionメカニズムとcookieメカニズムの関係と区別についてご紹介します。6.2ではGo言語がどのようにsessionを実現しているかご説明します。この中では簡単なsessionマネージャを実現します。6.3節ではどのようにしてsessionハイジャックの状態を防ぐかご説明します。どのように効果的にsessionを保護するのか。sessionはそもそもどのようなところに保存してもよいのです。6.3節ではsessionをメモリの中に保存しますが、我々のアプリケーションをもう一歩展開させる場合、アプリケーションのsession共有を実現する必要があります。sessionをデータベースの中(memcacheまたはredis)に保存します。6.4節ではどのようにしてこの機能を実装するかご説明します。
6.1節ではsessionメカニズムとcookieメカニズムの関係と区別についてご紹介します。6.2ではGo言語がどのようにsessionを実現しているかご説明します。この中では簡単なsessionマネージャを実現します。6.3節ではどのようにしてsessionハイジャックの状態を防ぐかご説明します。どのように効果的にsessionを保護するのか。sessionはそもそもどのようなところに保存してもよいのです。6.3節ではsessionをメモリの中に保存しますが、我々のアプリケーションをもう一歩展開させる場合、アプリケーションのsession共有を実現する必要があります。sessionをデータベースの中(memcachedまたはredis)に保存します。6.4節ではどのようにしてこの機能を実装するかご説明します。
## 目次
![](images/navi6.png?raw=true)
## links
* [目次](<preface.md>)
* 前へ: [第五章概要](<05.7.md>)
* 前へ: [第五章まとめ](<05.7.md>)
* 次へ: [sessionとcookie](<06.1.md>)

View File

@@ -60,8 +60,8 @@ wは入力する必要のあるresponse、cookieはstructです。cookieオブ
例を一つ見てみましょう。どのようにcookieを設定するかです。
expiration := *time.LocalTime()
expiration.Year += 1
expiration := time.Now()
expiration = expiration.AddDate(1, 0, 0)
cookie := http.Cookie{Name: "username", Value: "astaxie", Expires: expiration}
http.SetCookie(w, &cookie)
@@ -92,7 +92,7 @@ sessionメカニズムはサーバサイドのメカニズムです。サーバ
sessionメカニズム自身は特に複雑ではありませんが、その実装と設定の柔軟性は複雑を極めます。これは一回の経験やひとつのブラウザ、サーバのみの経験でもって普遍的に通用するものではありません。
## 概要
## まとめ
上述の通り、sessionとcookieの目的は同じです。どちらもhttpプロトコルのステートレスであるという欠点を克服するためにあります。しかしその方法は異なります。sessionはcookieを通じてクライアントにsession idを保存します。またユーザの他のセッション情報はサーバのsessionオブジェクトに保存されます。これとは対照的に、cookieはすべての情報をクライアントに持たせる必要があります。そのためcookieにはある程度潜在的な脅威が存在します。例えばローカルのcookieに保存されたユーザ名とパスワードが解読されたり、cookieが他のホームページに収集されます例えば1appAが主導的にゾーンBのcookieを設定し、ゾーンBにcookieを取得させます2XSS、appAでjavascriptを通じてdocument.cookieを取得し、自分のappBに送信します

View File

@@ -206,7 +206,7 @@ Webアプリケーションにはユーザのログアウト操作がありま
GCが十分にtimeパッケージのタイマー機能を利用していることがおわかりいただけるかと思います。時間が`maxLifeTime`を超えた後GC関数をコールした際、これによって`maxLiefTime`時間内でsessionが利用できることを保証できます。このような方法はまたオンラインユーザの数といった統計に用いることもできます。
## 概要
## まとめ
これまでに、WebアプリケーションにおけるグローバルなSession管理に用いられるSessionManagerを実装してまいりました。Sessionを提供するために用いられるストレージを定義し、Providerのインターフェースを実装しました。次の節では、インターフェースの定義を通してProviderを実装します。ぜひご参考ください。
## links

View File

@@ -86,4 +86,4 @@ sessionが始まると、生成されたsessionIDの時間を記録する一つ
## links
* [目次](<preface.md>)
* 前へ: [sessionストレージ](<06.3.md>)
* 次へ: [概要](<06.5.md>)
* 次へ: [まとめ](<06.5.md>)

View File

@@ -1,4 +1,4 @@
# 6.5 概要
# 6.5 まとめ
この章ではsession/cookieとは何かを、また両者の関係について勉強しました。しかし現在Goのオフィシャルパッケージではsessionがサポートされていません。そのため、sessionマネージャを設計しました。sessionの作成から破棄に至る全体の過程を実装し、Providerのインターフェースを定義することによって、各バックエンドのsessionストレージをサポートできるようにしました。第三節ではメモリストレージによってどのようにsessionの管理を実装するのかご紹介しました。第四節ではsessionハイジャックの過程と、どのようにsessionハイジャックを防止するのかを解説しました。第一章の解説を通して、読者の皆様方にはsessionの実行原理とどのように実現されるか、またどのように安全にsessionを使用するかについて理解いただけるよう望んています。
## links
* [目次](<preface.md>)

View File

@@ -1,12 +1,12 @@
# 7 テキスト処理
Web開発においてテキスト処理は非常に重要な要素です。往々にして出力または入力する内容に対して処理を行う必要があります。ここでのテキストには文字列、数字、Json、XML等々が含まれます。高性能な一言語としてのGo言語では、これらのテキストの処理はすべてオフィシャルの標準パッケージにサポートされています。また利用中にGo標準ライブラリが巧みに設計されていることに気がつくでしょう。またユーザからすれば非常に簡単にこれらのテキストを処理することができます。本章ではつの節を通してユーザにGo言語のテキスト処理のよい知識をご紹介したいきたいと思います。
XMLは現在多くの標準インターフェースの対話型言語となっています。多くの場合Javaで書かれたwebserverとのやりとりはどれもXML標準にもとづいて行われます。7.1節ではどのようにXMLテキストを処理するかご紹介します。XMLを使用した後あまりに複雑だと気づきます。現在多くのインターネット企業の対外的なAPIでは多くがJSON形式を採用しています。この形式は描写が簡単ですが、意味をよく表現することができます。7.2節ではどのようにこういったJSON形式のデータを処理するかご説明します。正規表現は人に愛され、また恨まれる道具です。このテキスト処理能力は非常に協力です。我々は前のフォームの検証でその強力さをすでに味わっています。7.3節ではどのようにGoの正規表現を利用するのがよいかより詳しく解説していきます。Web開発において非常に重要な部分としてMVCの分離があります。Go言語ではWeb開発中Vにおいて`template`という専門的にサポートするパッケージがあります。7.4節ではテンプレートをつかってコンテンツをどのように出力するのか詳細に解説していきます。7.5節ではどのようにしてファイルとディレクトリを操作するのか詳しくご紹介します。7.6節の概要では文字列に関する操作についてご紹介します。
XMLは現在多くの標準インターフェースの対話型言語となっています。多くの場合Javaで書かれたwebserverとのやりとりはどれもXML標準にもとづいて行われます。7.1節ではどのようにXMLテキストを処理するかご紹介します。XMLを使用した後あまりに複雑だと気づきます。現在多くのインターネット企業の対外的なAPIでは多くがJSON形式を採用しています。この形式は描写が簡単ですが、意味をよく表現することができます。7.2節ではどのようにこういったJSON形式のデータを処理するかご説明します。正規表現は人に愛され、また恨まれる道具です。このテキスト処理能力は非常に協力です。我々は前のフォームの検証でその強力さをすでに味わっています。7.3節ではどのようにGoの正規表現を利用するのがよいかより詳しく解説していきます。Web開発において非常に重要な部分としてMVCの分離があります。Go言語ではWeb開発中Vにおいて`template`という専門的にサポートするパッケージがあります。7.4節ではテンプレートをつかってコンテンツをどのように出力するのか詳細に解説していきます。7.5節ではどのようにしてファイルとディレクトリを操作するのか詳しくご紹介します。7.6節のまとめでは文字列に関する操作についてご紹介します。
## 目次
![](images/navi7.png?raw=true)
## links
* [目次](<preface.md>)
* 前へ: [第六章概要](<06.5.md>)
* 前へ: [第六章まとめ](<06.5.md>)
* 次へ: [XMLの処理](<07.1.md>)

View File

@@ -69,23 +69,23 @@ Matchパターンは文字列の判断に対してのみ使うことができ、
src := string(body)
//HTML标签全转换成小写
//HTMLタグを全て小文字に変換します
re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
src = re.ReplaceAllStringFunc(src, strings.ToLower)
//去除STYLE
//<style>タグを除去します
re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>")
src = re.ReplaceAllString(src, "")
//去除SCRIPT
//<script>タグを除去
re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>")
src = re.ReplaceAllString(src, "")
//去除所有尖括号内的HTML代码并换成换行符
//<>内の全てのHTMLコードを削除し、改行文字に置き換えます
re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
src = re.ReplaceAllString(src, "\n")
//去除连续的换行符
//連続した改行を除去します
re, _ = regexp.Compile("\\s{2,}")
src = re.ReplaceAllString(src, "\n")

View File

@@ -341,7 +341,7 @@ Webアプリケーションを作る時はテンプレートの一部が固定
>単一の集合のようなテンプレートは互いを知っています。もしあるテンプレートが複数の集合によって使用された場合、複数の集合の中で別々にパースされる必要があります。
## 概要
## まとめ
テンプレートに対する上記の詳細な紹介で、どのようにして動的なデータとテンプレートを融合させるかご理解いただけたかと思いますループしたデータの出力、関数を定義、テンプレートのネスト等々。テンプレートの技術を応用することで、MVCパターンのVの処理を完成させることができます。以降の章ではどのようにMとCを処理するかご紹介します。
## links

View File

@@ -1,5 +1,5 @@
# 7.5 ファイルの操作
どのようなコンピュータ設備でもファイルは必要です。またWebプログラミングではファイルの操作はWebプログラマがよくぶつかる問題です。ファイルの操作はWebアプリケーションにおいて必須で、非常に有用です。我々はよくディレクトリ、ファイル(フォルダ)の編集といった操作を生成することになります。ここではGoによるこれらの操作に対して詳細な概要を作成し、どのように使用するか実例をお見せします。
どのようなコンピュータ設備でもファイルは必要です。またWebプログラミングではファイルの操作はWebプログラマがよくぶつかる問題です。ファイルの操作はWebアプリケーションにおいて必須で、非常に有用です。我々はよくディレクトリ(フォルダ)の生成、ファイルの編集といった操作をすることになります。ここではGoによるこれらの操作をいくつかかいつまんで詳細に説明し、どのように使用するか実例をお見せします。
## ディレクトリの操作
ファイル操作の大部分の関数はどれもosパッケージにあります。以下にいくつかディレクトリの操作を行うものを挙げます
@@ -17,10 +17,10 @@
- func RemoveAll(path string) error
pathに従って階層的なサブディレクトリを削除します。たとえばpathがひとつの名前であれば、、このディレクトリ削除されません
pathに従って階層的なサブディレクトリを削除します。たとえばpathがあるひとつの名前であった場合、このディレクトリ以下のサブディレクトリが全て削除されま
以下はデモコード:
以下はコード例です
package main

View File

@@ -65,7 +65,7 @@
- func Trim(s string, cutset string) string
s文字列からcutsetで指定した文字列を除去する。
s文字列の先頭と末尾からcutsetで指定した文字列を除去する。
fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! "))
//Output:["Achtung"]
@@ -149,4 +149,4 @@
## links
* [目次](<preface.md>)
* 前へ: [ファイルの操作](<07.5.md>)
* 次へ: [概要](<07.7.md>)
* 次へ: [まとめ](<07.7.md>)

View File

@@ -1,4 +1,4 @@
# 7.7 概要
# 7.7 まとめ
この章ではみなさんにXML、JSON、正規表現およびテンプレートの技術といったテキスト処理のツールをいくつかご紹介しました。XMLとJSONを使って様々な意味を表現することができます。正規表現ではテキストの検索/置換/切り取りといった処理を行うことができます。テンプレート技術を使うとこれらのデータをユーザに表示させることができます。これらはどれもWebアプリケーションを開発する過程で必要となる技術です。この節のご紹介を通じてどのようにテキストを処理、表示するかご理解いただけたかと思います。
## links

View File

@@ -1,5 +1,5 @@
# 8 Webサービス
WebサービスではHTTPプロトコルの基礎の上にXMLまたはJSONを使って情報を交換することができるようになります。もし上海の天気予報を知りたかったり、チャイナペトロの株価やタオバオの商店にある商品の情報を知りたかったりすると、簡単なコードを少し書くことでこれらの情報を取得し、標準のインターフェースに開放することができます。ローカルで関数をコールし、値をひとつ返すのと同じようなものです。
WebサービスではHTTPプロトコルの基礎の上にXMLまたはJSONを使って情報を交換することができるようになります。もし上海の天気予報チャイナペトロの株価やタオバオの商店にある商品の情報を知りたいとすると、簡単なコードを少し書くことでこれらの情報を標準的なオープンインターフェースを介して取得することができます。ローカルで関数をコールすると値をひとつ返すのと同じようなものです。
Webサービスのバックエンドのキーはプラットフォームに依存しないことです。あなたはあなたのサービスをLinuxシステムで実行してもかまいませんし、他のWindowsのasp.netプログラムと交互に同様に一つのインターフェースを通じてFreeBSD上で実行されているJSPとなんの障害も無く通信することもできます。
@@ -7,14 +7,14 @@ Webサービスのバックエンドのキーはプラットフォームに依
RESTリクエストはとても直感的です。なぜならRESTはHTTPプロトコルに基いた追加だからです。各リクエストはどれもHTTPリクエストです。異なるmethodに従って異なるロジックを処理します。多くのWeb開発者はいずれもHTTPプロトコルに詳しいので、RESTを学ぶことは比較的簡単でしょう。ですので我々は8.3節においてどのようにGo言語でRESTメソッドを実装するか詳細にご紹介します。
SOAPはW3Cのネットワークを超えた情報伝達とリモートコンピュータの関数コール方面の標準のひとつです。しかしSOAPはとても複雑で、完全な規則は非常に長くなります。また内容はいまでも増加しています。Go言語は簡単さで有名ですのでSOAPのような複雑なものはここではご紹介しません。Go言語は生まれながらにしてとても良い、開発に便利なRPCメカニズムを提供しています。8.4節ではどのようにしてGo言語を使ってRPCを実装するか詳しくご紹介するつもりです。
SOAPはW3Cのネットワークを超えた情報伝達とリモートコンピュータの関数呼び出し規約の標準のひとつです。しかしSOAPはとても複雑で、完全な規則は非常に長くなります。また内容はいまでも増加しています。Go言語は簡単さで有名ですのでSOAPのような複雑なものはここではご紹介しません。Go言語は生まれながらにしてとても良い、開発に便利なRPCメカニズムを提供しています。8.4節ではどのようにしてGo言語を使ってRPCを実装するか詳しくご紹介するつもりです。
Go言語は21世紀のC言語です。性能と簡単さを追求するため、8.1節ではどのようにしてSocketプログラミングを行うかご説明します。多くのゲームサービスはどれもSocketを採用してサーバをプログラムしています。HTTPプロトコルは比較的性能を必要とするものですので、Go言語がどのようにしてSocketプログラミングを行うのか見てみることにしましょう。現在HTML5の発展にしたがって、webSocketsも多くのゲーム会社が引き続き開発する手段の一つとなりつつあります。8.2節ではGo言語でどのようにしてwebSocketsのコードをプログラムするかご説明します。
Go言語は21世紀のC言語です。性能と簡単さを追求するため、8.1節ではどのようにしてSocketプログラミングを行うかご説明します。多くのゲームサービスはどれもSocketを採用してサーバをプログラムしています。HTTPプロトコルは比較的性能を必要とするものですので、Go言語がどのようにしてSocketプログラミングを行うのか見てみることにしましょう。現在HTML5の発展にしたがって、WebSocketも多くのゲーム会社が引き続き開発する手段の一つとなりつつあります。8.2節ではGo言語でどのようにしてWebSocketのコードをプログラムするかご説明します。
## 目次
![](images/navi8.png?raw=true)
## links
* [目次](<preface.md>)
* 次へ: [第七章概要](<07.7.md>)
* 次へ: [第七章まとめ](<07.7.md>)
* 前へ: [Socketプログラミング](<08.1.md>)

View File

@@ -1,5 +1,5 @@
# 8.1 Socketプログラミング
多くの低レイヤのネットワークアプリケーションの開発者の目には一切のプログラムがどれもSocketのように映ります。すこし大げさかもしれませんが、だいたいこのようなものです。現在のネットワークプログラミングはほぼすべてにおいてSocketを使用してプログラムされています。このような場面を考えたことはありませんか毎日ブラウザを開いてページを閲覧する際、ブラウザプロセスはどのようにしてWebサーバと通信を行っているのでしょうQQを使ってチャットする時、QQプロセスはどのようにしてサーバまたはあなたの友達がいるQQプロセスと通信を行なっているのでしょうPPstreamを開いてストリーミング映像を見るとき、PPstreamプロセスはどのようにして動画サーバと通信をおこなっているのでしょうこのように、すべてはSocketに依存して通信を行なっています。ひとつを見てすべてを理解すると、Socketプログラミングは現代のプログラミングの中でも非常に多くの重要な地位を占めていることが見て取れます。この章ではGo言語においてどのようにSocketプログラミングを行うのかご紹介します。
多くの低レイヤのネットワークアプリケーションの開発者の目には一切のプログラムがどれもSocketのように映ります。すこし大げさかもしれませんが、だいたいこのようなものです。現在のネットワークプログラミングはほぼすべてにおいてSocketを使用してプログラムされています。このような場面を考えたことはありませんか毎日ブラウザを開いてページを閲覧する際、ブラウザプロセスはどのようにしてWebサーバと通信を行っているのでしょうQQを使ってチャットする時、QQプロセスはどのようにしてサーバまたはあなたの友達がいるQQプロセスと通信を行なっているのでしょうPPstreamを開いてストリーミング映像を見るとき、PPstreamプロセスはどのようにして動画サーバと通信をっているのでしょうこのように、すべてはSocketに依存して通信を行なっています。ひとつを見てすべてを理解すると、Socketプログラミングは現代のプログラミングの中でも非常に多くの重要な地位を占めていることが見て取れます。この章ではGo言語においてどのようにSocketプログラミングを行うのかご紹介します。
## Socketとは何か
SocketはUnixを起源とします。Unixの基本哲学の一つは"すべてはファイルである"です。すべては"開くopen -> 読み書きwrite/read -> 閉じるclose"のパターンによって操作されます。Socketはこのパターンの実装の一つです。ネットワークのSocketデータ通信は特殊なI/Oの一つです。Socketもファイルディスクリプタの一種です。Socketもファイルを開く関数を持っていますSocket()。この関数はint型のSocketディスクリプタを返します。以後の接続の確立によってデータ転送といった操作はすべてこのSocketを通ることで実現されます。
@@ -10,7 +10,7 @@ SocketはUnixを起源とします。Unixの基本哲学の一つは"すべて
![](images/8.1.socket.png?raw=true)
8.1 七層のネットワークプロトコルの図
8.1 七層のネットワークプロトコルの図
TCP/IPプロトコルを使用したアプリケーションプログラムは通常アプリケーションプログラムのポートを採用しますUNIX BSDのソケットsocketとUNIX System VのTLIすでに淘汰されていますによってネットワークプロセス間の通信を実現します。現在ではほぼすべてのアプリケーションプログラムではsocketが採用されています。現在はネットワーク時代で、ネットワークのプロセス通信はどこにでも存在します。"すべてがSocket"というのはこういうことです。
@@ -386,7 +386,7 @@ UDPサーバがどのように処理するか見てみましょう
}
}
## 概要
## まとめ
TCPとUDP Socketプログラミングの描写と実装を通して、GoはすでにSocketプログラミングを完全にサポートしていることがお分かりいただけたかと思います。使用に際してもとても便利です。Goはたくさんの関数を提供しています。これらの関数を使って簡単に高性能なSocketアプリケーションを書くことができます。

View File

@@ -142,7 +142,7 @@ WebSocketはクライアントとサーバに分けられます。ここでは
図8.4 WebSocketサーバが受け取った情報
上の例でクライアントとサーバでWebSocketを実装するのが非常に簡単だとわかりました。Goのソースコードのnetブランチではすでにこのプロトコルが実装されており、直接持ってきて使用することができます。現在HTML5の発展にしたがって将来WebSocketがWeb開発の充填になると考えています。我々はこの方面の知識を蓄える必要があります。
上の例でクライアントとサーバでWebSocketを実装するのが非常に簡単だとわかりました。Goのソースコードのnetブランチではすでにこのプロトコルが実装されており、直接持ってきて使用することができます。現在HTML5の発展にしたがって将来WebSocketがWeb開発にとって重要になると考えています。我々はこの方面の知識を蓄える必要があります。
## links

View File

@@ -1,7 +1,7 @@
# 8.3 REST
RESTful、とは現在もっとも流行しているインターネットソフトウェアフレームワークです。構造が明瞭で、標準に合っており、理解しやすく、拡張に便利です。そのため、まさに多くのホームページで採用されつつあります。この節ではこれが一体どのようなフレームワークなのか、Goではどのようにして実現するのかを学んでいきます。
## RESTとは何か
REST(Representational State Transfer)という概念は2000年Roy Thomas Fielding彼はHTTPルールの主な編集者の一人です。)の博士論文の中で現れました。この中ではあるフレームワークの制約条件と原則について触れています。これらの制約条件と原則を満足したアプリケーションまたは設計はRESTfulということです。
REST(Representational State Transfer)という概念は2000年Roy Thomas Fielding彼はHTTP仕様の主な者の一人です。)の博士論文の中で初めて登場しました。この中ではあるフレームワークの制約条件と原則について触れています。これらの制約条件と原則を満足したアプリケーションまたは設計はRESTfulということです。
RESTが何かを理解するためには、以下のようないくつかの概念を理解する必要があります
@@ -106,8 +106,8 @@ GoにはRESTに対する直接のサポートはありません。しかし、RE
上のコードではどのようにRESTなアプリケーションを書くかご覧いただきました。我々がアクセスするリソースはユーザです。異なるmethodによって異なる関数にアクセスしました。ここではサードパーティライブラリ`github.com/drone/routes`を使用しています。前の章でどのように自分で定義したルータを実現するかご紹介しました。このライブラリは自分で定義したルートと便利なルートのルールを反映させます。これを使って簡単にRESTのフレームワークを実装することができます。
## 概要
RESTはフレームワークスタイルの一種です。WWWの成功経験を汲み取っていますステートレス、リソースを中心とし、HTTPプロトコルとURIプロトコルを十分利用しています。統一したインターフェース定義を提供し、Webサービスを設計する方法の一つとして流行しました。ある意味でURIとHTTPといった黎明期のInternet標準を強調することで、RESTは大型のアプリケーションプログラムサーバ時代の前のWeb方式に回帰しています。現在GoRESTに対するサポートはやはり簡単です。自分dね定義したルーティングを通して、異なるmethodに異なるhandleを実装することができます。このようにRESTのフレームワークは実現されています。
## まとめ
RESTはフレームワークスタイルの一種です。WWWの成功経験を汲み取っていますステートレス、リソースを中心とし、HTTPプロトコルとURIプロトコルを十分利用しています。統一したインターフェース定義を提供し、Webサービスを設計する方法の一つとして流行しました。ある意味でURIとHTTPといった黎明期のInternet標準を強調することで、RESTは大型のアプリケーションプログラムサーバ時代の前のWeb方式に回帰しています。今のところGoRESTに対するサポートはまだシンプルです。自分定義したルーティングを通して、異なるmethodに異なるhandleを実装することができます。このようにRESTのフレームワークは実現されています。
## links
* [目次](<preface.md>)

View File

@@ -1,9 +1,9 @@
# 8.4 RPC
前の節でどのようにSocketとHTTPに基づいてネットワークアプリケーションを書くかご紹介しました。SocketとHTTPが採用しているのは"情報交換"パターン、すなわちクライアントがサーバに情報を一つ送信し、その後(一般的に)サーバが一定の情報を返すことでレスポンスとする、ようなものであると理解しました。双方は互いが発生させた情報を解析できるように、クライントとサーバ間情報をやり取りする形式が締結されます。しかし独立した多くのアプリケーションは特にこのようなパターンを採用はしません。その代わり通常の関数をコールするのに似た方法で必要となる機能を完成させます。
前の節でどのようにSocketとHTTPに基づいてネットワークアプリケーションを書くかご紹介しました。SocketとHTTPが採用しているのは"情報交換"パターン、すなわちクライアントがサーバに情報を一つ送信し、その後(一般的に)サーバが一定の情報を返すことでレスポンスとする、ようなものであると理解しました。双方は互いが発生させた情報を解析できるように、クライントとサーバ間情報をやり取りする形式が取り決められています。しかし多くの独立したアプリケーションは特にこのようなモデルを採用していません。その代わり通常の関数をコールするのに似た方法で必要となる機能を実現しています。
RPCは関数をコールするモデルをネットワーク化したものです。クライアントはローカルの関数をコールするのと同じように、引数をひっくるめてネットワークを通じてサーバに送信します。サーバでは処理の中でそれを展開し実行します。そして、実行結果をクライアントにフィードバックします。
RPCRemote Procedure Call Protocol 、このリモートプロセスのコールプロトコルは、ネットワークを通してリモートコンピュータのプログラムにおいてリクエストするサービスです。低レイヤのネットワーク技術におけるプロトコルを理解する必要はありません。これは何らかの転送プロトコルの存在を仮定します。例えばTCPまたはUDPです。通信を行うプログラム間で情報データを簡単にやりとりすることができます。これを使って関数をコールするモデルをネットワーク化することができます。OSIネットワーク通信モデルで、RPCはデータリンク層とアプリケーション層を飛び越えます。RPCはネットワーク分散型の複数プログラムを含めてアプリケーションプログラムの開発を用意にします。
RPCRemote Procedure Call Protocol 、このリモートプロセスのコールプロトコルは、ネットワークを通してリモートコンピュータのプログラムにおいてリクエストするサービスです。低レイヤのネットワーク技術におけるプロトコルを理解する必要はありません。これは何らかの転送プロトコルの存在を仮定します。例えばTCPまたはUDPです。通信を行うプログラム間で情報データを簡単にやりとりすることができます。これを使って関数をコールするモデルをネットワーク化することができます。OSIネットワーク通信モデルで、RPCはデータリンク層とアプリケーション層を飛び越えます。RPCはネットワーク分散型の複数プログラムを含めてアプリケーションプログラムの開発を容易にします。
## RPCの動作原理
@@ -381,7 +381,7 @@ json-rpcはTCPプロトコルにもとづいて実装されていることがお
}
## 概要
## まとめ
GoはすでにRPCに対して良いサポートを提供しています。上のHTTP、TCP、JSON RPCの実装を通して、多くの分散型のWebアプリケーションの開発を簡単に行うことができます。読者であるあなたはすでにここまでマスターしたものと思われます。ただ残念なことに現在GoはまだSOAP RPCのサポートを提供していません。幸い現在すでにサードパーティのオープンソースで実現されています。
@@ -389,4 +389,4 @@ GoはすでにRPCに対して良いサポートを提供しています。上の
## links
* [目次](<preface.md>)
* 前へ: [REST](<08.3.md>)
* 次へ: [概要](<08.5.md>)
* 次へ: [まとめ](<08.5.md>)

View File

@@ -1,4 +1,4 @@
# 8.5 概要
# 8.5 まとめ
この章では現在流行しているいくつかの主なネットワークアプリケーションの開発方法についてご紹介しました。第一節ではネットワークプログラミングの基礎をご紹介しました。Socketプログラミングです。なぜなら現在ネットワークはクラウドの方向に急速に進化しています。この技術で展開されるsocket知識の基礎は開発者としてマスターしておかなければなりません。第二節では現在流行しつつあるHTML5の重要な特徴であるWebSocketについてご紹介しました。これを使うとサーバは主導的に情報をpushできるようになります。昔のajaxポーリングパターンの簡略化も述べました。第三節ではRESTプログラミングパターンをご紹介しました。これらのパターンは特にネットワークアプリケーションAPIの開発に適しています。上の四種類の開発方法において、Goはすでに良いサポートを提供しています。netパッケージおよびそのサブパッケージはいずれもネットワークプログラミングのツールの在り処を含んでいます。もしより詳しく関連する実装の詳細に足を踏み入れるのであれば、このパッケージのソースコードを試しに読んでみてください。
## links
* [目次](<preface.md>)

View File

@@ -16,5 +16,5 @@ Webアプリケーションプログラムのセキュリティ問題の理由
## links
* [目次](<preface.md>)
* 前へ: [第八章概要](<08.5.md>)
* 前へ: [第八章まとめ](<08.5.md>)
* 次へ: [CSRF攻撃の予防](<09.1.md>)

View File

@@ -84,7 +84,7 @@ tokenを検証
このように基本的には安全なPOSTを実現しました。しかしもしtokenのアルゴリズムが暴かれてしまったらと思われるかもしれません。しかし理論上は破られることは基本的に不可能です。ある人が計算したところ、この文字列を無理に破るにはだいたい2の11乗の時間が必要です。
## 概要
## まとめ
クロスサイトリクエストフォージェリ、すなわちCSRFは非常に危険なWebセキュリティ問題です。Webセキュリティ界隈では"眠れる巨人"と呼ばれています。リスクレベルはこの"肩書き"を見ればお分かりでしょう。この節ではクロスサイトリクエストフォージェリの紹介にとどまらず、このようなセキュリティホールを生み出す原因の所在についても詳しくご説明しました。これでもって攻撃への防御を促し、読者に安全なWebアプリケーションを書いていただけますよう望んでいます。
## links

View File

@@ -51,7 +51,6 @@
CleanMap["name"] = name
}
上面代码中我们初始化了一个CleanMap的变量当判断获取的name是`astaxie``herry``marry`三个中的一个之后
上のコードではCleamMapという変数をひとつ初期化しています。取得したnameが`astaxie``herry`、marry`のつの打ちの一つだと判断した後、データをCleanMapに保存します。このようにCleanMap["name"]のなかのデータが合法であると保証することができます。そのためコードの他の部分にもこれを使用します。当然else部分に非合法なデータの処理を追加してもかまいません。再度フォームを表示しエラーを表示するといったこともできます。しかしフレンドリーに汚染されたデータを出力してはいけません。
上の方法はすでに知っている合法な値のデータをフィルタリングするのには有効ですが、すでに合法な文字列で構成されていると知っているデータをフィルタリングする場合はなんの助けにもなりません。例えば、ユーザ名をアルファベットと数字のみから構成させたいとする場合です:
@@ -63,7 +62,7 @@
CleanMap["username"] = username
}
## 概要
## まとめ
データのフィルタリングはWebセキュリティにおいて基礎となる作用です。多くのセキュリティ問題はデータのフィルタリングと検証を行わなかったことによるものです。例えば前の節のCSRF攻撃と以降に説明するXSS攻撃、SQLインジェクション等はどれも真面目にデータをフィルタリングしなかった事によって引き起こされます。そのため、この部分の内容は特に重視する必要があります。
## links

View File

@@ -43,7 +43,7 @@ XSSに関するより詳しい分析は"[新浪微博XSS事件分析](http://www
このようにすることでブラウザにhtmlを出力させずjavascriptコードを解釈させることができます。
## 概要
## まとめ
XSSセキュリティホールはとても危険なものです。Webアプリケーションを開発している時、必ずデータをフィルタリングするよう肝に銘じておいてください。特にクライアントに出力する前に。これは現在のところXSSを防止する手段として有効です。
## links

View File

@@ -53,14 +53,14 @@ MSSQLサーバは後ろのシステムに新しいユーザを追加するコマ
SQLインジェクション攻撃の被害はこれだけ大きく、どのように予防すればよいのでしょうか以下のこれらの提案はひょっとしたらSQLインジェクションの予防に一定の助けとなるかもしれません。
1. Webアプリケーションのデータベースの操作権限を厳格に制限する。このユーザにはその作業に必要となる最低限の権限だけを与え、最大限注入攻撃がデータベースに与える被害を減少させる。
1. Webアプリケーションのデータベースの操作権限を厳格に制限する。このユーザにはその作業に必要となる最低限の権限だけを与え、できる限りSQLインジェクション攻撃がデータベースに与える被害を減少させる。
2. 入力されたデータが期待するデータ形式であるか検査し、変数の型を厳格に制限する。例えばregexpパッケージを使ってマッチング処理を行ったり、strconvパッケージを使って文字列を他の基本型のデータに変換することで判断する。
3. データベースに入ってくる特殊文字('"\角括弧&*;等に対してエスケープ処理を行う。またはエンコードする。Goの`text/template`パッケージには`HTMLEscapeString`関数があり、文字列に対してエスケープ処理を行うことができます。
4. すべての検索クエリにはなるべくデータベースが提供するパラメータ化検索インターフェースを使用する。パラメータ化されたクエリはパラメータを使用し、ユーザが入力した変数をSQLクエリに埋め込みません。すなわち、直接SQLクエリを組み立てないということです。例えば`database/sql`の検索関数`Prepare``Query`を使ったり、`Exec(query string, args ...interface{})`を使います。
5. アプリケーションをデプロイする前になるべく専門のSQLインジェクション検査ツールを使って検査を行い、発見されたSQLインジェクションセキュリティホールにはすぐにパッチをあてる。ネット上ではこの方面のオープンソースツールがたくさんあります。例えばsqlmap、SQLninja等です。
6. ページがSQLのエラー情報を出力するのを避ける。例えば型のエラー、フィールドのミスマッチ等です。コードのSQLクエリが暴露されることで攻撃者がこれらのエラー情報を利用してSQLインジェクションを行うのを防ぎます。
## 概要
## まとめ
上の例によってSQLインジェクションは被害が相当大きいセキュリティホールであるとわかりました。そのため我々が通常書くWebアプリケーションに対してはどのような小さな事でも非常に重視する必要があります。小さな事が命運を分けます。生活も同じ、Webアプリケーションを書くことも同じです。
## links

View File

@@ -77,7 +77,7 @@ Go言語のこの三種類の暗号化アルゴリズムの実装は以下の通
上の方法によってユニークな対応するパスワードの値を取得することができます。これは現在までもっともクラックが難しいものです。
## 概要
## まとめ
ここまででもしあなたに危機感が芽生えたのだとすれば、行動すべきです:
- 1もし普通のユーザであれば、LastPassによってパスワードを保存/生成するのをおすすめします。異なるサイトで異なるパスワードを使用します。
@@ -86,4 +86,4 @@ Go言語のこの三種類の暗号化アルゴリズムの実装は以下の通
## links
* [目次](<preface.md>)
* 前へ: [入力のフィルタリングを確実に行う](<09.4.md>)
* 次へ: [データを暗号化/復する](<09.6.md>)
* 次へ: [データを暗号化/復する](<09.6.md>)

View File

@@ -1,7 +1,7 @@
# 9.6 データを暗号化/復する
# 9.6 データを暗号化/復する
前の節でどのようにしてパスワードを保存するかご紹介しました。しかしあるときには、慎重に扱うべきデータを暗号化して保存し、将来のあるときにいつでもそれらを復元したい場合があります。この時双方向暗号化アルゴリズムを使って我々の要求を満たさなければなりません。
## base64で暗号化/復する
## base64で暗号化/復する
もしWebアプリケーションが十分に簡単であれば、データのセキュリティにはそれほど厳格な要求があるわけではありません。ですので比較的簡単な暗号化である`base64`を採用することができます。このような方法は実装するのが比較的簡単で、Go言語の`base64`パッケージではすでにこれをよくサポートしています。下の例をご覧ください:
package main
@@ -38,9 +38,9 @@
}
## 高度な暗号化/復
## 高度な暗号化/復
Go言語の`crypto`では双方向暗号の高度な暗号化/復パッケージがあります:
Go言語の`crypto`では双方向暗号の高度な暗号化/復パッケージがあります:
- `crypto/aes`パッケージ:AES(Advanced Encryption Standard)は、Rijndael暗号化アルゴリズムとも呼ばれます。アメリカの連邦政府が採用しているブロック暗号の標準の一つです。
- `crypto/des`パッケージDES(Data Encryption Standard)は双方向暗号化標準のひとつです。これは現在秘密鍵のシステムに最も広く使用されています。特に金融データのセキュリティの保護で使われています。かつてアメリカ連邦政府の暗号化のスタンダードでしたがすでにAESにとってかわられています。
@@ -59,14 +59,14 @@ Go言語の`crypto`では双方向暗号の高度な暗号化/復元パッケー
var commonIV = []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}
func main() {
//暗号化したい文字列
// 暗号化したい文字列
plaintext := []byte("My name is Astaxie")
//暗号化された文字列を渡すと、plaintは渡された文字列になります。
// 暗号化された文字列を渡すと、plaintは渡された文字列になります。
if len(os.Args) > 1 {
plaintext = []byte(os.Args[1])
}
//aesの暗号化文字列
// aesの暗号化文字列
key_text := "astaxie12798akljzmknm.ahkjkljl;k"
if len(os.Args) > 2 {
key_text = os.Args[2]
@@ -81,13 +81,13 @@ Go言語の`crypto`では双方向暗号の高度な暗号化/復元パッケー
os.Exit(-1)
}
//暗号化文字列
// 暗号化文字列
cfb := cipher.NewCFBEncrypter(c, commonIV)
ciphertext := make([]byte, len(plaintext))
cfb.XORKeyStream(ciphertext, plaintext)
fmt.Printf("%s=>%x\n", plaintext, ciphertext)
// 復文字列
// 復文字列
cfbdec := cipher.NewCFBDecrypter(c, commonIV)
plaintextCopy := make([]byte, len(plaintext))
cfbdec.XORKeyStream(plaintextCopy, ciphertext)
@@ -110,13 +110,13 @@ Go言語の`crypto`では双方向暗号の高度な暗号化/復元パッケー
Decrypt(dst, src []byte)
}
この3つの関数は暗号化/復操作を実現します。詳細な操作は上の例をご覧ください。
この3つの関数は暗号化/復操作を実現します。詳細な操作は上の例をご覧ください。
## 概要
この節ではいくつかの暗号化/復アルゴリズムをご紹介しました。Webアプリケーションを開発している時は要求に合わせて異なる方法によって暗号化/複合を行うことができます。一般的なアプリケーションではbase64アルゴリズムを採用することができます。より高度な場合はaesやdesアルゴリズムを採用することができます。
## まとめ
この節ではいくつかの暗号化/復アルゴリズムをご紹介しました。Webアプリケーションを開発している時は要求に合わせて異なる方法によって暗号化/復号を行うことができます。一般的なアプリケーションではbase64アルゴリズムを採用することができます。より高度な場合はaesやdesアルゴリズムを採用することができます。
## links
* [目次](<preface.md>)
* 前へ: [パスワードの保存](<09.5.md>)
* 次へ: [概要](<09.7.md>)
* 次へ: [まとめ](<09.7.md>)

View File

@@ -1,4 +1,4 @@
# 9.7 概要
# 9.7 まとめ
この章ではCSRF攻撃、XSS攻撃、SQLインジェクション攻撃といったWebアプリケーションの典型的な攻撃手法をご紹介しました。これらはどれもアプリケーションがユーザの入力に対して良いフィルタリングを起こさなかったことによるものです。そのため、攻撃の方法をご紹介する以外に、これらの攻撃の発生を防止する方法としてどのようにして有効にデータをフィルタリングするかについてもご紹介しました。また、日増しに発生する重大なパスワード漏洩事件に対し、Webアプリケーションを設計する上で採用可能な暗号化ソリューションについて基礎から専門的なものまでご紹介しました。最後に慎重に扱うべきデータに対する暗号化/復元をご紹介しました。Go言語では三種類の双方向暗号化アルゴリズムを提供していますbase64、aesとdesの実装です。
この章を書いた目的は読者の意識でセキュリティの概念を強化して欲しいと思ったからです。Webアプリケーションを書く時はぜひご注意していただき、我々が書くWebアプリケーションをハッカー達の攻撃から遠ざけるようにしてください。これらのパッケージを十分に利用することで、安全なWebアプリケーションを作ることができます。

View File

@@ -21,5 +21,5 @@
## links
* [目次](<preface.md>)
* 前へ: [第九章概要](<09.7.md>)
* 前へ: [第九章まとめ](<09.7.md>)
* 次へ: [デフォルトロケールの設定](<10.1.md>)

View File

@@ -76,7 +76,7 @@ URLアドレスをもっとRESTfulな見た目にしたいと思うかもしれ
当然ユーザにあなたが提供するセレクトボックスや他の何らかの方法で対応するlocaleを設定させることもできます。ユーザの入力した情報を、このアカウントに関連するprofileに保存し、ユーザが再度ログインした時にこの設定をlocale設定にコピーします。これによってこのユーザの毎回のアクセスで自分が以前に設定したlocaleをもとにページを取得するよう保証することができます。
## 概要
## まとめ
上のご紹介から、Localeの設定にはいくつもの方法があるとわかりました。要求の違いによって異なるLocaleの設定方法を選択する必要があります。ユーザが最もよく知る方法で我々が提供するサービスを得る事で、アプリケーションのユーザビリティを高めます。
## links

View File

@@ -125,7 +125,7 @@ Localeの違いによってビューを表示させる場合もあるかもし
このような方法を採用することでビューとリソースをローカライズすると、用意に拡張を行うことができます。
## 概要
## まとめ
この節ではどのようにしてローカライズリソースを使用し、保存するかご紹介しました。ある時は置換関数によって実装する必要があり、またある時はlangによって設定する必要があります。しかし最終的にはどれもkey-valueの方法によってLocaleに対応したデータを保存することになります。必要な時に対応するLocaleの情報を取り出して、もしそれがてkしうと情報であれば直接出力し、もし時間や日時または通過であった場合は`fmtPrintf`を使ったりその他のフォーマッタ関数によって処理する必要があります。異なるLocaleのビューとリソースに対しては最も簡単で、パスにlangを追加するだけで実装することができます。
## links

View File

@@ -171,10 +171,10 @@
{{.V.Money | M}}
## 概要
## まとめ
この節を通して多言語パッケージのWebアプリケーションをどのようにして実現するかわかりました。カスタム言語パッケージでは便利に多言語を実装することができます。また、設定ファイルによって非常に簡単に複数の言語を拡張することもできます。デフォルトではgo-i18nはパブリックな設定ファイルをロードします。例えば時間、通貨等です。非常に簡単に使用することができ、同時にテンプレートにおいてこれらの関数をサポートするため、対応するテンプレート関数も実装しました。このようにしてWebアプリケーションを開発する際直接テンプレートにおいてpipelineの方法で多言語パッケージを操作することができます。
## links
* [目次](<preface.md>)
* 前へ: [ローカライズリソース](<10.2.md>)
* 次へ: [概要](<10.4.md>)
* 次へ: [まとめ](<10.4.md>)

View File

@@ -1,4 +1,4 @@
# 10.4 概要
# 10.4 まとめ
この章の紹介を通じて、読者はどのようにしてi18nを操作するかに対して深く理解が得られたはずです。私もこの章の内容にもとづいてオープンソースのソリューションであるgo-i18nをご紹介しましたhttps://github.com/astaxie/go-i18n このオープンソースライブラリを通して多言語バージョンのWebアプリケーションを非常に簡単に実現することができ、我々のアプリケーションに気楽に国際化を実現させることができます。もしこのオープンソースライブラリに間違いや足りない部分があれば、ぜひこのオープンソースプロジェクトに参加することで、このライブラリがGoの標準ライブラリになるよう手助けしてください。
## links
* [目次](<preface.md>)

View File

@@ -15,5 +15,5 @@ Webアプリケーションを開発するにあたって、エラーは避け
## links
* [目次](<preface.md>)
* 前へ: [第十章概要](<10.4.md>)
* 前へ: [第十章まとめ](<10.4.md>)
* 次へ: [エラー処理](<11.1.md>)

View File

@@ -1,5 +1,5 @@
# 11.1 エラー処理
Go言語の主な設計は簡潔、明瞭です。完結とは文法がCと似ていて、かなり簡単であるということです。明瞭とはいかなるキーワードも分かりやすいということを指しています。どのような隠された意味も含まず、エラー処理の設計でもこの思想は一貫しています。C言語では-1またはNULLをといった情報を返すことでエラーを表していることをご存知だと思います。しかしユーザからすると、対応するAPIの説明ドキュメントを見なければ、この戻り値がいったいどういう意味を表しているのかそもそもよくわかりません。例えば:0を返すと成功するのか失敗するのかといったことです。Goではerrorと呼ばれる型を定義することで、エラーを表しています。使用する際は、返されるerror変数とnilを比較することで操作が成功したか判断します。例えば`os.Open`関数はファイルのオープンに失敗した時にnilではないerror変数を返します。
Go言語の主な設計方針は:簡潔、明瞭です。簡潔とは文法がCと似ていて、かなり簡単であるということです。明瞭とはいかなるキーワードも分かりやすいということを指しています。どのような隠された意味も含まず、エラー処理の設計でもこの思想は一貫しています。C言語では-1またはNULLをといった情報を返すことでエラーを表していることをご存知だと思います。しかしユーザからすると、対応するAPIの説明ドキュメントを見なければ、この戻り値がいったいどういう意味を表しているのかそもそもよくわかりません。例えば:0を返すと成功するのか失敗するのかといったことです。Goではerrorと呼ばれる型を定義することで、エラーを表しています。使用する際は、返されるerror変数とnilを比較することで操作が成功したか判断します。例えば`os.Open`関数はファイルのオープンに失敗した時にnilではないerror変数を返します。
func Open(name string) (file *File, err error)
@@ -126,7 +126,7 @@ Goはエラー処理においてCに似た戻り値を検査する方法を採
}
}
上の例ではデータの取得とテンプレートの展開をコールする時にエラーの検査を行なっています。絵rが発生した場合は共通の処理関数である`http.Error`をコールし、クライアントに500エラーを返して対応するエラーデータを表示します。しかしHnadleFuncが追加されるに従って、このようなエラー処理ロジックのコードが多くなってきてしまいます。実は我々は自分で定義したルータを使ってコードを短縮させることができます(実装のやり方は第三章のHTTPの詳しい説明をご参考下さい)。
上の例ではデータの取得とテンプレートの展開をコールする時にエラーの検査を行なっています。エラーが発生した場合は共通の処理関数である`http.Error`をコールし、クライアントに500エラーを返して対応するエラーデータを表示します。しかしHnadleFuncが追加されるに従って、このようなエラー処理ロジックのコードが多くなってきてしまいます。実は我々は自分で定義したルータを使ってコードを短縮させることができます(実装のやり方は第三章のHTTPの詳しい説明をご参考下さい)。
type appHandler func(http.ResponseWriter, *http.Request) error
@@ -191,7 +191,7 @@ Goはエラー処理においてCに似た戻り値を検査する方法を採
上で示したとおり、viewにアクセスした際異なる状況によって異なるエラーコードとエラー情報を取得することができます。これははじめのバージョンに比べてコード量にさほど変化はありませんが、これが表示するエラーはよりわかりやすくなっています。提示されるエラー情報のユーザビリティが高められ、拡張性もはじめのものに比べてよくなっています。
## 概要
## まとめ
プログラムの設計において障害の許容は重要な仕事の一部です。Goではエラー処理によってこれを実現します。errorはひとつのインターフェースに過ぎませんが、多くに変化させることができます。自分の需要に合わせて異なる処理を実装することができます。最後にご紹介したエラー処理の方法で、皆様によりよいWebエラーの処理の方法を設計するにあたってご助力になれば幸いです。
## links

View File

@@ -240,7 +240,7 @@ GDBが実行している現在のプログラムの環境ではいくつかの
goroutinesのコマンドを確認することでgoroutineの内部がどのように実行されているのか詳しく理解することができます。各関数のコールされる順番はすでにはっきり表示されています。
## 概要
## まとめ
この章ではGDBデバッグにおけるGoプログラムの基本コマンドのいくつかをご紹介しました。`run``print``info``set variable``continue``list``break`といったよく使われるデバッグコマンドを含め、上のデモで行ったように、読者はすでにGoプログラムに対してGDBを使ったデバッグを基本的に理解したものと信じています。もしより多くのデバッグテクニックを知りたければオフィシャルのページのGDBデバッグの項目をご参照ください。
## links

View File

@@ -139,11 +139,11 @@ Go言語はあらかじめ用意されている軽量なテストフレームワ
上の結果は我々がどのような`TestXXX`なユニットテスト関数も実行していないことを示しています。表示される結果は耐久テスト関数のみを実行しただけです。第一行には`Benchmark_Division`が500000000回実行され示し、毎回の実行が平均で7.76ミリ秒であったことを示しています。第二行は`Benchmark_TimeConsumingFunctin`が500000000回実行され、毎回の平均実行時間が7.80ミリ秒であったことを示しています。最後の1行は全体の実行時間を示しています。
## 概要 
## まとめ 
上のユニットテストと耐久テストの学習を通じて、`testing`パッケージが非常に軽量で、ユニットテストと耐久テストを書くのは非常に簡単であるとわかりました。ビルトインの`go test`コマンドを組み合わせることで、非常に便利にテストを行うことができます。このように我々が毎回コードを修正し終わる度に、go testを実行するだけで簡単に回帰テストを行うことができます。
## links
* [目次](<preface.md>)
* 前へ: [GDBを使用したデバッグ](<11.2.md>)
* 次へ: [概要](<11.4.md>)
* 次へ: [まとめ](<11.4.md>)

View File

@@ -1,4 +1,4 @@
# 11.4 概要
# 11.4 まとめ
この章では3つの節に分けてGo言語においてどのようにエラーを処理するか、どのようにエラー処理を設計するかをご紹介しました。第二節ではどのようにしてGDBを使ってプログラムをデバッグするかご紹介しました。GDBを使うことで我々は簡単にステップ実行、変数の表示、変数の修正、実行過程の出力等を行うことができます。最後にどのようにしてGo言語がはじめから持っている軽量なフレームワーク`testing`を利用してユニットテストと耐久テストを書くかについてご紹介しました。`go test`を使用することで便利にこれらのテストを行うことができ、将来のコードがアップグレードされ、修正された後でも簡単に回帰テストを行うことができます。この章はあなたがプログラムのロジックを書くことに対して何の助けにもならなかったかもしれません。しかし、あなたが書いたプログラムコードの質を高く保つには非常に重要です。なぜならよくできたWebアプリケーションは必ずよくできたエラー処理メカニズム(エラーの表示がユーザフレンドリーで拡張性がある)を持っているからです。ユーザフレンドリーなユニットテストと耐久テストは実運用が開始された後のコードが良い性能を保ち、予定通り実行されることを保証してくれます。
## links

View File

@@ -1,11 +1,11 @@
# 12 デプロイとメンテナンス
現在までのところ、我々はどのようにプログラムを開発するかご紹介しました。プログラムのデバッグとテストには開発の最後の10%は90%の時間を必要とすると言われます。ですから、この章では最後の10%の部分を強調して、信用と使用に足る優秀なアプリケーションになるよう細部を考慮する必要があります。上の10%はこれらの細部を指しています。
この章ではつの節によってこれらの細部の処理をご紹介します。第一節ではサーバでプログラムが生成するログをどのように記録するかご紹介します。第二節ではエラーが発生した時に我々のプログラムがどのように処理されるかと、ユーザのアクセスに与える影響をなるべく少なくするにはどうすべきかご紹介します。第三節ではGoの独立したプログラムをどのようにデプロイするかご紹介します。現在GoプログラムはまだCのようにdaemonを書くことができませんので、これらのプロセスとプログラムのバックエンドをどのように実行すべきでしょうか?第四節ではアプリケーションデータのバックアップとリストアをご紹介します。アプリケーションが壊れた状況でなるべくデータの完全性を保証します。
この章ではつの節によってこれらの細部の処理をご紹介します。第一節ではサーバでプログラムが生成するログをどのように記録するかご紹介します。第二節ではエラーが発生した時に我々のプログラムがどのように処理されるかと、ユーザのアクセスに与える影響をなるべく少なくするにはどうすべきかご紹介します。第三節ではGoの独立したプログラムをどのようにデプロイするかご紹介します。現在GoプログラムはまだCのようにdaemonを書くことができません。ではこれらのプロセスとプログラムのバックエンドをどのように実行すべきでしょうか?第四節ではアプリケーションデータのバックアップとリストアをご紹介します。アプリケーションが壊れた状況でなるべくデータの完全性を保証します。
## 目次
![](images/navi12.png?raw=true)
## links
* [目次](<preface.md>)
* 前へ: [第十一章概要](<11.4.md>)
* 前へ: [第十一章まとめ](<11.4.md>)
* 次へ: [アプリケーションログ](<12.1.md>)

View File

@@ -157,7 +157,7 @@ seelogはカスタムなログ処理の定義をサポートしています。
このような方法によって簡単に対応する情報を探し出すことができます。これにはアプリケーションログに対して統計と分析を行えるという利点があります。また、ログのサイズを考慮する必要もあります。高トラフィックのWebアプリケーションにとって、ログの増加は恐るべきものです。そのため、seelogの設定ファイルでlogrotateを設定することで、ログファイルが絶え間なく増大し我々のディスクスペースが足りなくなるといった問題を引き起こさないよう保証することができます。
## 概要
## まとめ
上のseelogシステムとこれに基づいてどのようにログシステムを定義するかを学ぶことによって、非常に気軽に強力で適切な機能を持つログシステムを作成できることができました。ログシステムはデータ分析に信用できるデータソースを提供します。例えばログの分析を通して、システムをより一歩改善することができますし、アプリケーションに問題が発生した時に問題の位置を特定しやすくなります。また、seelogはログのレベル分け機能もサポートしています。minlevelの設定によって簡単にテストや配布版の出力情報のレベルを設定することができます。
## links

View File

@@ -116,7 +116,7 @@
上ではエラーと例外の区別をご紹介しました。我々がプログラムを開発する時はどのように設計すべきでしょうかルールは非常に簡単ですもしあなたが定義した関数が失敗する可能性があるなら、エラーを返さなければなりません。他のpackageの関数をコールする時、もしこの関数の実装がとてもよい場合、panicの心配をする必要もありません。本当に例外を発生させなければならない状況ではないのに発生させてしまっているにしても、私がこれを処理するいわれはないはずです。panicとrecoverは自分が開発したpackageで実装されたロジックや、特殊な状況に対して設計されます。
## 概要
## まとめ
この節では我々のWebアプリケーションをデプロイした後どのようにして各種のエラーを処理するかについてまとめましたネットワークエラー、データベースエラー、オペレーティングシステムのエラー等、エラーが発生した際、我々のプログラムはどのようにして正しく処理するのでしょうかユーザフレンドリーなエラーインターフェースを表示し、操作をロールバックし、ログを記録し、管理者に通知するといった操作を行います。最後にどのようにしてエラーと例外を正しく処理するかについてご紹介しました。一般的なプログラムにおいてはエラーと例外はよく混同されます。しかし、Goではエラーと例外は常に明確な区別がなされます。そのため、我々がプログラムを設計するにあたってエラーと例外を処理する際はどのような原則に従うべきかについてご紹介しました。
## links
* [目次](<preface.md>)

View File

@@ -171,7 +171,7 @@ Supervisordをインストールするとsupervisorとsupervisorctlという2つ
- supervisorctl stop all、すべてのプロセスを停止します。注start、restart、stopは最新の設定ファイルを読み込みません。
- supervisorctl reload、最新の設定ファイルを読み込み、新しい設定に沿ってすべてのプロセスを起動、管理します。
## 概要
## まとめ
この節ではGoがどのようにdaemon化を実現しているのかについてご紹介しました。ただ現在Goのdaemon実装は不足しており、サードパーティのツールによるアプリケーションプログラムのdaemon管理を行う方法に頼る必要があります。そのためここではpythonで書かれたプロセス管理ツールSupervisordをご紹介しました。Supervisordを使って簡単にGoアプリケーションプログラムを管理することができます。

View File

@@ -165,10 +165,10 @@ redisのリストアはホットバックアップとコールドバックアッ
しかし時にはコールドバックアップによってデータをリストアする必要もあります。redisのコールドバックアップは実は保存されたデータベースファイルをredisのワーキングディレクトリにコピーするだけです。その後redisを起動すればOKです。redisは起動している間自動的にデータベースファイルをメモリにロードします。起動の速度はデータベースのファイルの大小によって決定します。
## 概要
## まとめ
この節ではアプリケーションのバックアップとリストアについてご紹介しました。ファイルのバックアップからデータベースのバックアップまで、どのように災害に対応するかです。また、rsyncを使った異なるシステムでのファイルの同期についてもご紹介しました。MySQLデータベースとredisデータベースのバックアップとリストアです。この節の紹介を通して開発された本番プロダクトの障害に対するひとつの参考になれば幸いです。
## links
* [目次](<preface.md>)
* 前へ: [アプリケーションのデプロイ](<12.3.md>)
* 次へ: [概要](<12.5.md>)
* 次へ: [まとめ](<12.5.md>)

View File

@@ -1,4 +1,4 @@
# 12.5 概要
# 12.5 まとめ
この章ではどのようにして我々の開発したWebアプリケーションのデプロイとメンテナンスを行うかについていくつかのトピックを討論しました。これらの内容は非常に重要で、メンテナンスを最小化し、アプリケーションの円滑な運用を行うためにはかならずこれらの問題を考慮する必要があります。
この章で討論した内容は具体的には:

View File

@@ -8,5 +8,5 @@
## links
* [目次](<preface.md>)
* 前へ: [第12章概要](<12.5.md>)
* 前へ: [第12章まとめ](<12.5.md>)
* 次へ: [プロジェクトのプラン](<13.1.md>)

View File

@@ -45,7 +45,7 @@
## フレームワーク設計
ブログの迅速な作成を実現するため、上のプロセス設計に従って最小化されたフレームワークを開発します。フレームワークにはルーティング機能、RESTをサポートしたコントローラ、自動化とテンプレートの適用、ログシステム、設定管理等が含まれます。
## 概要
## まとめ
この節ではブログシステムにおいてGOPATHを設定するところからディレクトリの作成といった基礎情報までをご紹介しました。フレームワークの構造がMVCモードを採用することや、ブログシステムのデータフローの実行プロセスについても簡単にご紹介しました。最後にこれらのプロセスを通じてブログシステムのディレクトリ構造を設計しました。ここまでで、フレームワークの基本的な作成が完了しました。以降のいくつかの節ではひとつひとつ実装していきます。
## links
* [目次](<preface.md>)

View File

@@ -24,15 +24,15 @@
ブログの主なルーティング規則は以下のようになります:
//ブログのトップページを表示
beego.RegisterController("/", &controllers.IndexController{})
beego.Router("/", &controllers.IndexController{})
//ブログの詳細な情報を検索
beego.RegisterController("/view/:id([0-9]+)", &controllers.ViewController{})
beego.Router("/view/:id([0-9]+)", &controllers.ViewController{})
//ブログの文章を作成
beego.RegisterController("/new", &controllers.NewController{})
beego.Router("/new", &controllers.NewController{})
//ブログの削除
beego.RegisterController("/delete/:id([0-9]+)", &controllers.DeleteController{})
beego.Router("/delete/:id([0-9]+)", &controllers.DeleteController{})
//ブログの編集
beego.RegisterController("/edit/:id([0-9]+)", &controllers.EditController{})
beego.Router("/edit/:id([0-9]+)", &controllers.EditController{})
## データベーススキーマ
@@ -66,8 +66,7 @@ ViewController:
}
func (this *ViewController) Get() {
inputs := this.Input()
id, _ := strconv.Atoi(this.Ctx.Params[":id"])
id, _ := strconv.Atoi(this.Ctx.Input.Params(":id"))
this.Data["Post"] = models.GetBlog(id)
this.Layout = "layout.tpl"
this.TplNames = "view.tpl"
@@ -101,8 +100,7 @@ EditController
}
func (this *EditController) Get() {
inputs := this.Input()
id, _ := strconv.Atoi(this.Ctx.Params[":id"])
id, _ := strconv.Atoi(this.Ctx.Input.Params[":id"])
this.Data["Post"] = models.GetBlog(id)
this.Layout = "layout.tpl"
this.TplNames = "new.tpl"
@@ -126,8 +124,10 @@ DeleteController
}
func (this *DeleteController) Get() {
id, _ := strconv.Atoi(this.Ctx.Params[":id"])
this.Data["Post"] = models.DelBlog(id)
id, _ := strconv.Atoi(this.Ctx.Input.Params(":id"))
blog := GetBlog(id int)
this.Data["Post"] = blog
models.DelBlog(blog)
this.Ctx.Redirect(302, "/")
}
@@ -255,4 +255,4 @@ edit.tpl
## links
* [目次](<preface.md>)
* 前へ: [ログとコンフィグ設計](<13.4.md>)
* 次へ: [概要](<13.6.md>)
* 次へ: [まとめ](<13.6.md>)

View File

@@ -1,4 +1,4 @@
# 13.6 概要
# 13.6 まとめ
この章ではどのように基礎的なGo言語のフレームワークを実装するかについてご紹介しました。フレームワークにはルーティング設計が含まれます。Goのビルトインのhttpパッケージにあるルーティングにはいくつか足りない部分があるため、我々は動的なルーティング規則を設計し、その後MVCモデルにおけるController設計をご紹介しました。controllerはRESTを実装しており、主な考え方はtornadeフレームワークからきています。次にも出るのlayoutおよびテンプレートの自動化技術を実装しました。主に採用したのはGoのビルトインのモデルエンジンです。最後に補足的なログ、設定といった情報の設計をご紹介しました。これらの設計を通して基礎的なフレームワークbeegoを実装しました。現在このフレームワークはすでにgithub上でオープンソースになっています。最後に我々はbeegoを通じてブログシステムの実装を行いました。この実例コードを通してどのように快速にホームページを開発するのかが見渡せたのではないかと思います。
## links

View File

@@ -1,5 +1,5 @@
# 14 Webフレームワークの拡張
第13章においてWebフレームワークの開発をご紹介しました。MVC、ルーティング、ログ処理、設定処理の紹介を通じて基本的なフレームワークシステムを完成しました。しかしより良いフレームワークは便利な補助ツールでもって素早いWeb開発を行うものです。ではこの章ではどのように素早くWeb開発を行うツールを利用するかについてご紹介していきましょう。第1章で静的なファイルをどのように処理するかご紹介しました。現在あるtwitterのオープンソースのbootstrapをどのように利用することで素早く美しいホームページを開発するか、第二節では前にご紹介したsessionを使ってどのようにユーザのログイン処理を行うかについてご紹介します。第3節ではどのように簡便にフォームを出力する、これらのフォームにどのようにデータの検証を行うか、どのように素早くmodelと結合してデータの追加、削除、修正といった操作を行うかご紹介しました。第4節ではどのようにユーザの認証をおこなうかご紹介しました。http basci認証、http digest認証を含みます。第5節では前にご紹介したi18nを使ってどのように多言語をサポートアプリケーションを開発するかご紹介しました。
第13章においてWebフレームワークの開発をご紹介しました。MVC、ルーティング、ログ処理、設定処理の紹介を通じて基本的なフレームワークシステムを完成しました。しかしより良いフレームワークは便利な補助ツールでもって素早いWeb開発を行うものです。ではこの章ではどのように素早くWeb開発を行うツールを利用するかについてご紹介していきましょう。第1章で静的なファイルをどのように処理するかご紹介しました。現在あるtwitterのオープンソースのbootstrapをどのように利用することで素早く美しいホームページを開発するか、第二節では前にご紹介したsessionを使ってどのようにユーザのログイン処理を行うかについてご紹介します。第3節ではどのように簡便にフォームを出力し、どのようにフォームのデータの検証を行うか、また、どのように素早くmodelと結合してデータの追加、削除、修正といった操作を行うかご紹介しました。第4節ではどのようにユーザの認証をおこなうかご紹介しました。http basci認証、http digest認証を含みます。第5節では前にご紹介したi18nを使ってどのように多言語をサポートアプリケーションを開発するかご紹介しました。
この章の拡張を通して、beegoフレームワークが素早いWeb開発の特徴を有することになります。最後にどのようにこれらの拡張の特徴を利用して第13章で開発したブログシステムを拡張するかご紹介しましょう。完全で美しいブログシステムを開発することで、読者はbeego開発があなたに与えるスピードをご理解いただけると思います。
@@ -8,5 +8,5 @@
## links
* [目次](<preface.md>)
* 前へ: [第13章概要](<13.6.md>)
* 前へ: [第13章まとめ](<13.6.md>)
* 次へ: [静的なファイルのサポート](<14.1.md>)

View File

@@ -102,4 +102,4 @@ goroutineをクリックすると詳細な情報を得ることができます
## links
* [目次](<preface.md>)
* 前へ: [多言語サポート](<14.5.md>)
* 次へ: [概要](<14.7.md>)
* 次へ: [まとめ](<14.7.md>)

6
ja/14.7.md Normal file
View File

@@ -0,0 +1,6 @@
# 14.7 まとめ
この章は主にどのようにしてbeegoフレームワークにもとづいて展開を行うかについて詳しく述べました。これには静的なファイルのサポートが含まれます。第1節では静的なファイルでは主にどのようにしてbeegoを利用して素早くウェブページを開発するか、bootstrapを利用して美しいサイトの作成についてご紹介しました第2節ではどのようにしてbeegoにおいてsessionManagerを構成するかについてご紹介しました。これはユーザがbeegoを利用した時に素早くsessionを利用するのに便利です第3節ではフォームとバリデーションについてご紹介しました。Go言語のstructの定義に基づくと、Webを開発する過程で重複する作業から解放されます。また、バリデーションを追加するとできるかぎりデータを安全にすることができます。第4節ではユーザの認証についてご紹介しました。ユーザの認証は主につの需要があります。http basicとhttp digest認証、サードパーティ認証、カスタム定義の認証です。コードを用いてどのようにして現在あるサードパーティパッケージからbeegoアプリケーションでこれらの認証を実装するのかデモを行いました。第5節では多言語サポートをご紹介しました。beegoではgo-i18nという多言語パッケージを使用しています。ユーザはとても簡単にこのライブラリを利用して多言語Webアプリケーションを開発することができます。第6節ではどのようにしてGoのpprofパッケージを利用するのかご紹介しました。pprofパッケージは性能テストに使われるツールです。beegoに対する改造を施した後pprofパッケージを使うことでユーザはpprofからbeegoにもとづいて開発されたアプリケーションのテストを行うことができます。これら6つの節を通して比較的健全なbeegoフレームワークを展開してきました。このフレームワークは現在の数多くのWebアプリケーションに十分対応することができます。ユーザは自身の相続力を継続して発揮することができます。私はここで簡単にいくつか重要と思われる拡張についてご紹介したにすぎません。
## links
* [目次](<preface.md>)
* 前へ: [pprofのサポート](<14.6.md>)

View File

@@ -1,40 +1,2 @@
# "Go Web プログラミング"
現在この本はすでに出版されています。もし悪くない内容だと思ったら以下より購入することができます。ご協力に感謝いたします:
- [chinapub](http://product.china-pub.com/3767290)
- [当当网](http://product.dangdang.com/product.aspx?product_id=23231404)
- [京东](http://book.jd.com/11224644.html)
- [Amazon](http://www.amazon.cn/Go-Web%E7%BC%96%E7%A8%8B-%E8%B0%A2%E5%AD%9F%E5%86%9B/dp/B00CHWVAHQ/ref=sr_1_1?s=books&ie=UTF8&qid=1369323453&sr=1-1)
![](ebook/images/ebook.jpg)
# カンパでサポートする
もし"Go Webプログラミング"を気に入っていただけたのなら、寄付を通じて作者にこの本の続きを更新させるか、もっと面白くてためになるオープンソースアプリケーションの開発をご検討下さい例えばこの本にパッチをあてたり、もっと面白い章を追加したり、もっともっと凄い内容の次回作を出してみたり、beegoを改修してくれたり、です。
寄付はこちら: [https://me.alipay.com/astaxie](https://me.alipay.com/astaxie)
## 連絡方法
ぜひQQ群にどうぞ259316004 《Go Web编程》专用交流群
掲示板:[http://bbs.mygolang.com](http://bbs.mygolang.com)
## 謝辞
まずGolang-ChinaのQQ群102319854に感謝を申し上げます。彼らはみんな非常に熱心で、特に数名の方には本当に感謝しています。
- [四月份平民](https://plus.google.com/110445767383269817959) (コードレビュー)
- [Hong Ruiqi](https://github.com/hongruiqi) (コードレビュー)
- [BianJiang](https://github.com/border) (go開発ツールの作成,VimとEmacsの設定)
- [Oling Cat](https://github.com/OlingCat)(コードレビュー)
- [Wenlei Wu](mailto:spadesacn@gmail.com)(画像の提供)
- [polaris](https://github.com/polaris1119)(本のレビュー)
- [雨痕](https://github.com/qyuhen)(第二章のレビュー)
## ライセンス
特に明示されている場合を除き、この本の内容は[CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)(クリエイティブ・コモンズ 表示-継承3.0非移植)が適用されます。コードは[BSD 3-Clause License](<https://github.com/astaxie/build-web-application-with-golang/blob/master/LICENSE.md>)三条項BSDライセンスとなります。
## 読み始める
[読み始める](<https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/ebook/preface.md>)
[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/44c98c9d398b8319b6e87edcd3e34144 "githalytics.com")](http://githalytics.com/astaxie/build-web-application-with-golang)
# Go Web プログラミング
Webプログラミングが好きでGo webプログラミングを書きました。皆さんに気にいってもらえれば幸いです。

Some files were not shown because too many files have changed in this diff Show More