[ja] fix conflicts

This commit is contained in:
yuuji.yaginuma
2016-10-17 08:04:39 +09:00
parent 9a08ecab9e
commit 6251606d3b
7 changed files with 5 additions and 484 deletions

View File

@@ -1,28 +1,3 @@
<<<<<<< HEAD
# 1 GOの環境設定
Goの世界へようこそ、さっそく初めてみましょう
Goは新しい言語です、並列処理、ガベージコレクションを備え、軽快にプログラムできる言語です。以下のような特徴を持っています
- 一台のコンピュータ上であっという間に大型のGoプログラムを作り出すことができます。
- Goはソフトウェアの構造にモデルを提供します。分析をより簡単にこなせ、Cスタイルの頭にありがちなファイルとライブラリのincludeの大部分を省くことができます。
- Goは静的型付け言語です。型には階層がありません。このためユーザは型の定義の関係に時間をとられることなく、典型的なオブジェクト指向言語よりももっとライトに感じるくらいです。
- Goは完全にガベージコレクションタイプの言語です。また、並列処理とネットワークを基本的にサポートしています。
- Goはマルチプロセッサ対応のソフトウェアを作成できるようデザインされています。
Goはコンパイラ型言語の一種です。インタプリタ型言語の軽い身のこなしと動的型付け言語の開発効率、それに静的型付け言語の安全性を兼ね備えています。また、モダンにネットワークとマルチプロセッサもサポートしています。これらの目標を達成するには、解決しなければならない言語上の問題がいくつかあります表現力豊かだけれども軽いシステム、並列処理とガベージコレクション、厳格な依存定義などです。これらはライブラリやツール無しにはうまくいきません。Goもその要望に応えます。
この章ではGoのインストール方法と設定について述べます。
## 目次
![](images/navi1.png?raw=true)
## links
* [目次](<preface.md>)
* 次へ: [Goのインストール](<01.1.md>)
=======
# 1 GOの環境設定
Goの世界へようこそ、さっそく初めてみましょう
@@ -40,10 +15,9 @@ Goはコンパイラ型言語の一種です。インタプリタ型言語の軽
この章ではGoのインストール方法と設定についてご紹介します。
## 目次
![](images/navi1.png?raw=true)
## links
* [目次](<preface.md>)
* 次へ: [Goのインストール](<01.1.md>)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa

View File

@@ -1,30 +1,6 @@
# 1.1 Goのインストール
## 3つのインストール方法
<<<<<<< HEAD
Goにはいくつものインストール方法があります。どれでも好きなのを選んでかまいません。ここでは3つのよくあるインストール方法をご紹介しましょう
- ソースコードのインストール標準的なインストール方法です。Unix系システムをよく使うユーザ、特に開発者にとってはお馴染みの方法です。
- 標準パッケージのインストールGoは便利なインストールパッケージを用意しています。Windows, Linux, Macなどのシステムをサポートしています。初心者にはうってつけでしょう。システムのbit数に対応したインストールパッケージをダウンロードして、"Next"をたどるだけでインストールできます。
- サードパーティツールによるインストール現在便利なサードパーティパッケージも多くあります。たとえばUbuntuのapt-get、Macのhomebrewなどです。これらのシステムに慣れたユーザにはぴったりのインストール方法です。
最後に同じシステムの中で異なるバージョンのGoをインストールする場合は、[GVM](https://github.com/moovweb/gvm)が参考になります。どうすればよいか分からない場合一番うまくできます。
## Goソースコードのインストール
Goソースコードの中で、いくつかの部分はPlan 9 CとAT&Tコンパイラを使っています。そのため、もしあなたがソースコードをインストールしたい場合は、Cのコンパイルツールをインストールしておく必要があります。
Macシステムでは、Xcodeに適切なコンパイラが含まれています。
Unixシステムでは、gccなどのツールをインストールする必要があります。例えばUbuntuシステムではターミナルで`sudo apt-get install gcc libc6-dev`を実行することでコンパイラをインストールすることができます。
Windowsシステムでは、MinGWをインストールする必要があります。その後MinGWでgccをインストールして、適切な環境変数を設定します。
Goは[Mercurial][hg]を使ってバージョン管理を行います、まずMercurialをインストールしなければ、ダウンロードできません。もしMercurialがインストールされているのであれば、以下のコードを実行します
もしGoのインストールディレクトリが`$GO_INSTALL_DIR`だったとすると
hg clone -u release https://code.google.com/p/go
=======
Goにはいくつものインストール方法があります。どれでも好きなのを選んでかまいません。ここでは3つのよくあるインストール方法をご紹介します
- ソースコードのインストール標準的なインストール方法です。Unix系システムをよく使うユーザ、特に開発者であれば、設定を好みに合わせて変更できます。
@@ -44,45 +20,11 @@ Windowsでは、MinGWをインストールする必要があります。その
直接オフィシャルサイトから[ソースコードをダウンロード](http://golang.org/dl/)できます。対応する`goVERSION.src.tar.gz`のファイルをダウンロードし、`$HOME`ディレクトリに解凍してから以下のコマンドを実行します。
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
cd go/src
./all.bash
all.bashを実行後"ALL TESTS PASSED"が表示されると、インストール成功です。
<<<<<<< HEAD
上記はUnixスタイルのコマンドです、Windowsではインストール方法は似ており、all.batを実行するだけです。コンパイラはMinGWのgccを使います。
その後環境変数をいくつか設定します、
export GOROOT=$HOME/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
下のような画像が現れると、インストール成功です。
![](images/1.1.mac.png?raw=true)
図1.1 ソースコードインストール後Goコマンドを実行するの図
もしGoのUsage情報が現れたら、Goはインストールが成功していますもしこのコマンドが存在しない場合は、自分のPATH環境変数のなかにGoのインストールディレクトリが含まれているか確認してください。
## Go標準パッケージのインストール
Goはさまざまなプラットホームでインストールパッケージを提供しています、これらのパッケージはデフォルトで以下のディレクトリにインストールします/usr/local/goWindowsシステムc:\Go。当然これらのインストール場所を変更することもできます、ただし変更後はあなたの環境変数を以下のように設定する必要があります
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
### 自分の操作しているシステムが32bitか64bitか判断する方法。
Goインストールの次はシステムのbit数の判断ですので、この章では先に自分のシステムの種類を確認しましょう。
WindowsシステムのユーザはWin+Rを押してcmdを実行してください。`systeminfo`と入力してエンターキーを押します。少しするとシステムの情報が現れます。"システムの種類"の一行に、"x64-based PC"と表示されていれば、64bitシステムです。もし"X86-based PC"とあれば、32bitシステムです。
Macユーザは直接64bit版を使用することをおすすめします。なぜなら、GoがサポートしているMac OS Xのバージョンはすでに32bitプロセッサをサポートしていないからです。
=======
上記はUnixスタイルのコマンドです、Windowsもインストール方法は似ており、`all.bat`を実行するだけです。コンパイラはMinGWのgccを使います。
もしMacまたはUnixユーザであればいくつかの環境変数を設定する必要があります。再起動しても有効にしたい場合は以下のコマンドを`.bashrc``.zsh`に書いておきます。
@@ -108,7 +50,7 @@ GoのUsage情報が表示されれば、Goのインストールは成功です
Goはさまざまなプラットホームでインストールパッケージを提供しています、これらのパッケージはデフォルトで以下のディレクトリにインストールします/usr/local/goWindowsc:\Go。当然これらのインストール場所を変更することもできます、ただし変更後はあなたの環境変数を以下のように設定する必要があります
export GOROOT=$HOME/go
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
@@ -121,7 +63,6 @@ Goのインストールにはオペレーティングシステムのbit数を判
WindowsのユーザはWin+Rを押してcmdを実行してください。`systeminfo`と入力してエンターキーを押します。しばらくするとシステムの情報が表示されます。"システムの種類"の一行に"x64-based PC"と表示されていれば64bitシステムです。もし"X86-based PC"とあれば、32bitシステムです。
Macユーザは直接64bit版を使用することをおすすめします。GoがサポートしているMac OS Xのバージョンは、すでに32bitプロセッサをサポートしていないためです。
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
LinuxユーザはTerminalで`arch`(すなわち、`uname -a`)を実行することでシステムの情報を確かめることができます。
@@ -135,21 +76,6 @@ LinuxユーザはTerminalで`arch`(すなわち、`uname -a`)を実行するこ
### Mac インストール
<<<<<<< HEAD
[ダウンロードURL][downlink]に接続し、32bitシステムはgo1.0.3.darwin-386.pkgをダウンロードします。64bitシステムであればgo1.0.3.darwin-amd64.pkgをダウンロードします。ファイルをダブルクリックし、すべてデフォルトで「次へ」ボタンをクリックします。これでgoはあなたのシステムにインストールされました。デフォルトでPATHの中に適切な`~/go/bin`が追加されています。このとき端末を開き、`go`と入力します。
インストール成功の画像があらわれるとインストール成功です。
もしgoのUsage情報が現れた場合は、goはすでにインストールされています。もしこのコマンドが存在しないと出てきた場合は、自分のPATH環境変数の中にgoのインストールディレクトリが含まれているか確認してください。
### Linux インストール
[ダウンロードURL][downlink]に接続し、32bitシステムはgo1.0.3.linux-386.tar.gzをダウンロードします。64bitシステムであればgo1.0.3.linux-amd64.tar.gzをダウンロードします。
今後はGoがインストールされたディレクトリを`$GO_INSTALL_DIR`と仮定します。
`tar.gz`をインストールディレクトリに解凍します:`tar zxvf go1.0.3.linux-amd64.tar.gz -C $GO_INSTALL_DIR`
=======
[ダウンロードURL][downlink]にアクセスし、32bitシステムはgo1.4.2.darwin-386-osx10.8.pkgをダウンロードします。64bitシステムであればgo1.4.2.darwin-amd64-osx10.8.pkgをダウンロードします。ファイルをダブルクリックし、すべてデフォルトで「次へ」ボタンをクリックします。これでgoはあなたのシステムにインストールされました。デフォルトでPATHの中に適切な`~/go/bin`が追加されています。端末を開いて`go`と入力します。
インストール成功の画像が表示されればインストール成功です。
@@ -163,7 +89,6 @@ LinuxユーザはTerminalで`arch`(すなわち、`uname -a`)を実行するこ
以下ではGoがインストールされたディレクトリを`$GO_INSTALL_DIR`と仮定します。
`tar.gz`をインストールディレクトリに解凍します:`tar zxvf go1.4.2.linux-amd64.tar.gz -C $GO_INSTALL_DIR`
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
PATHを設定します。`export PATH=$PATH:$GO_INSTALL_DIR/go/bin`
@@ -171,21 +96,6 @@ PATHを設定します。`export PATH=$PATH:$GO_INSTALL_DIR/go/bin`
![](images/1.1.linux.png?raw=true)
<<<<<<< HEAD
図1.2 Linuxシステムでインストールに成功したあとgoを実行して表示される情報
もしgoのUsage情報が現れた場合は、goはすでにインストールされています。もしこのコマンドが存在しないと出てきた場合は、自分のPATH環境変数の中にgoのインストールディレクトリが含まれているか確認してください。
### Windows インストール ###
[Google Code ダウンロードページ][downlink]に接続し、32bit の場合は名前に windows-386 を含む msi パッケージをダウンロードします。64bit であれば名前に windows-amd64 を含むものをダウンロードします。ダウンロード後実行しますが、デフォルトのインストールフォルダである C:\Go\を変更してはいけません。他の場所にインストールしてしまうと、あなたが書いた Go コードが実行できなくなってしまうかもしれません。インストールが終わるとデフォルトで環境変数 Path に Go のインストールフォルダの下にある bin フォルダ `C:\Go\bin\` が追加され、Go のインストールフォルダである `C:\Go\` の値が環境変数 GOROOT に追加されます。
** インストールが成功しているか確認する **
「ファイル名を指定して実行」に `cmd` を入力することでコマンドラインツールを開きます。プロンプトで`go`と入力することで Usage 情報が確認できるか確かめることができます。`cd %GOROOT%` を入力すると、Go のインストールフォルダに入れるか確認できます。どちらも成功していれば、インストールに成功しています。
インストールに成功していなければ、環境変数 Path と GOROOT の値を確認してください。もし存在しなければアンインストールの上再インストールし、存在していればコンピュータを再起動し、上の手順を再度お試しください。
=======
図1.2 Linuxシステムでインストールに成功したあとgoを実行した時に表示する情報
もしgoのUsage情報が表示された場合は、goはすでにインストールされています。もしこのコマンドが存在しないと出てきた場合は、自分のPATH環境変数の中にgoのインストールディレクトリが含まれているか確認してください。
@@ -199,7 +109,6 @@ PATHを設定します。`export PATH=$PATH:$GO_INSTALL_DIR/go/bin`
「ファイル名を指定して実行」に `cmd` を入力し、コマンドラインツールを開きます。プロンプトで`go`と入力することで Usage 情報が確認できるか確かめることができます。`cd %GOROOT%` を入力すると、Go のインストールフォルダに入れるか確認できます。どちらも成功していれば、インストールに成功しています。
インストールに成功していなければ、環境変数 Path と GOROOT の値を確認してください。もし存在しなければアンインストールの上再インストールし、存在していればコンピュータを再起動し、上の手順を再度試してください。
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
## サードパーティツールのインストール
@@ -210,23 +119,13 @@ gvmはサードパーティが開発したGoのバージョン管理ツールで
インストールが完了したあと、goをインストールすることができます
<<<<<<< HEAD
gvm install go1.1
gvm use go1.1
下のコマンドで、毎回gvm useをコールする手間を省くことができます
gvm use go1.1 --default
上のコマンドを実行したあと、GOPATH、GOROOTなどの環境変数は自動的に設定されます。これで、直接利用することができます。
=======
gvm install go1.4.2
gvm use go1.4.2
下のコマンドで、毎回gvm useをコールする手間を省くことができます
gvm use go1.4.2 --default
上のコマンドを実行したあと、GOPATH、GOROOTなどの環境変数が自動的に設定されます。これで、直接利用することができます。
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
### apt-get
Ubuntuは現在最も多く利用されているLinuxデスクトップシステムです。`apt-get`コマンドでソフトウェア・パッケージを管理します。下のコマンドでGoをインストールすることができます、今後のため`git``mercurial`もインストールしておくべきでしょう:
@@ -237,11 +136,7 @@ Ubuntuは現在最も多く利用されているLinuxデスクトップシステ
sudo apt-get install golang-stable git-core mercurial
### homebrew
<<<<<<< HEAD
homebrewはMacシステムで現在最も使用されているソフトウェア管理ツールです。現在Goをサポートしており、以下のコマンドでGoを直接インストールすることができます。今後のため`git``mercurial`もインストールしておくべきでしょう:
=======
homebrewはMacで現在最も使用されているソフトウェア管理ツールです。現在Goをサポートしており、以下のコマンドでGoを直接インストールすることができます。今後のため`git``mercurial`もインストールしておくべきでしょう:
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
brew update && brew upgrade
brew install go
@@ -254,9 +149,4 @@ homebrewはMacで現在最も使用されているソフトウェア管理ツー
* 前へ: [Goの環境設定](<01.0.md>)
* 次へ: [GOPATHとワーキングディレクトリ](<01.2.md>)
<<<<<<< HEAD
[downlink]: http://code.google.com/p/go/downloads/list "Goインストールパッケージダウンロード"
[hg]: http://mercurial.selenic.com/downloads/ "Mercurialダウンロード"
=======
[downlink]:http://golang.org/dl/ "Goインストールパッケージダウンロード"
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa

View File

@@ -1,121 +1,3 @@
<<<<<<< HEAD
# 1.3 Goのコマンド
## Goのコマンド
Go言語は完全なコマンド操作ツールセットを持つ言語です。コマンドラインで`go`を実行することでそれらを確認することができます:
![](images/1.3.go.png?raw=true)
図1.3 Goコマンドで詳細情報を表示
これらのコマンドは我々が普段コードを書いている時に非常に役立つものです。次に普段使用するコマンドを理解していきましょう。
## go build
このコマンドは主にコンパイルテストに用いられます。パッケージのコンパイル作業中、もし必要であれば、同時に関連パッケージもコンパイルすることができます。
- もし普通のパッケージであれば、我々が1.2章で書いた`mypath`パッケージのように、`go build`を実行したあと、何のファイルも生成しません。もし`$GOPATH/pkg`の下に対応するファイルを生成する必要があれば、`go install`を実行してください。
- もしそれが`main`パッケージであれば、`go build`を実行したあと、カレントディレクトリの下に実行可能ファイルが生成されます。もし`$GOPATH/bin`の下に対応するファイルを生成する必要があれば、`go install`を実行するか、`go build- o パス/a.exe`を実行してください。
- もしあるプロジェクトディレクトリに複数のファイルがある場合で、単一のファイルのみコンパイルしたい場合は、`go build`を実行する際にファイル名を追加することができます。例えば`go build a.go`です。`go build`コマンドはデフォルトでカレントディレクトリにある全てのgoファイルをコンパイルしようと試みます。
- コンパイル後に出力されるファイル名を指定することもできます。1.2章の`mathapp`アプリケーションでは`go build -o astaxie.exe`と指定できます。デフォルトはpackage名mainパッケージではないになるか、ソースファイルのファイル名mainパッケージになります。
実際はpackage名は[Go言語の規格](https://golang.org/ref/spec)においてコード中の"package"に続く名前になります。この名前はファイル名と異なっていても構いません。デフォルトで生成される実行可能ファイル名はディレクトリ名。
- go buildはディレクトリ内の"\_"または"."ではじまるgoファイルを無視します。
- もしあなたのソースコードが異なるオペレーティングシステムに対応する場合は異なる処理が必要となります。ですので異なるオペレーティングシステムの名称にもとづいてファイルを命名することができます。例えば配列を読み込むプログラムがあったとして、異なるオペレーティングシステムに対して以下のようなソースファイルがあるかもしれません。
array_linux.go
array_darwin.go
array_windows.go
array_freebsd.go
`go build`の際、システム名の末尾のファイルから選択的にコンパイルすることができますLinux、Darwin、Windows、Freebsd
## go clean
このコマンドは現在のソースコードパッケージのなかでコンパイラが生成したファイルを取り除く操作を行います。これらのファイルはすなわち:
_obj/ 旧objectディレクトリ、MakeFilesが作成する。
_test/ 旧testディレクトリMakefilesが作成する。
_testmain.go 旧gotestファイルMakefilesが作成する。
test.out 旧testログMakefilesが作成する。
build.out 旧testログMakefilesが作成する。
*.[568ao] objectファイルMakefilesが作成する。
DIR(.exe) go buildが作成する。
DIR.test(.exe) go test -cが作成する。
MAINFILE(.exe) go build MAINFILE.goが作成する。
私は基本的にこのコマンドを使ってコンパイルファイルを掃除します。ローカルでテストを行う場合これらのコンパイルファイルはシステムと関係があるだけで、コードの管理には必要ありません。
## go fmt
読者にC/C++の経験があればご存知かもしれませんが、コードにK&Rスタイルを選択するかANSIスタイルを選択するかは常に論争となっていました。goでは、コードに標準のスタイルがあります。すでに培われた習慣やその他が原因となって我々は常にANSIスタイルまたはその他のより自分にあったスタイルでコードを書いて来ました。これは他の人がコードを閲覧する際に不必要な負担を与えます。そのためgoはコードのスタイルを強制し例えば左大括弧はかならず行末に置く、このスタイルに従わなければコンパイルが通りません。整形の時間の節約するため、goツールは`go fmt`コマンドを提供しています。これはあなたの書いたコードを整形するのに役立ちます。あなたの書いたコードは標準のスタイルに修正されますが、我々は普段このコマンドを使いません。なぜなら開発ツールには一般的に保存時に自動的に整形を行ってくれるからです。この機能は実際には低レイヤでは`go fmt`を呼んでいます。この次の章で2つのツールをご紹介しましょう。この2つのツールはどれもファイルを保存する際に`go fmt`機能を自動化させます。
>go fmtコマンドの使用では、多くの場合はgofmtを使用しますが、-wオプションが必要になります。さもなければ、整形結果はファイルに書き込まれません。gofmt -w src、ですべての項目を整形することができます。
## go get
このコマンドは動的にリモートコードパッケージを取得するために用いられます。現在BitBucket、GitHub、Google CodeとLaunchpadをサポートしています。このコマンドは内部で実際には2ステップの操作に分かれます第1ステップはソースコードパッケージのダウンロード、第2ステップは`go install`の実行です。ソースコードパッケージのダウンロードを行うgoツールは異なるドメインにしたがって自動的に異なるコードツールを用います。対応関係は以下の通りです
BitBucket (Mercurial Git)
GitHub (Git)
Google Code Project Hosting (Git, Mercurial, Subversion)
Launchpad (Bazaar)
そのため、`go get`を正常に動作させるためには、あらかじめ適切なソースコード管理ツールがインストールされていると同時にこれらのコマンドがあなたのPATHに入っていなければなりません。実は`go get`はカスタムドメインの機能をサポートしています。具体的な内容は`go help remote`を参照ください。
## go install
このコマンドは実際には内部で2ステップの操作に分かれます。第1ステップはリザルトファイルの生成実行可能ファイルまたはaパッケージ、第2ステップはコンパイルし終わった結果を`$GOPATH/pkg`または`$GOPATH/bin`に移動する操作です。
## go test
このコマンドを実行すると、ソースコードディレクトリ以下の`*_test.go`ファイルが自動的にロードされ、テスト用の実行可能ファイルが生成/実行されます。出力される情報は以下のようなものになります
ok archive/tar 0.011s
FAIL archive/zip 0.022s
ok compress/gzip 0.033s
...
デフォルトの状態で、オプションを追加する必要はありません。自動的にあなたのソースコードパッケージ以下のすべてのtestファイルがテストされます。もちろんオプションを追加しても構いません。詳細は`go help testflag`を確認してください。
## go doc
(1.2rc1 から go doc コマンドはなくなり、 godoc コマンドのみになります)
多くの人がgoはいかなるサードパーティドキュメントも必要としないと言っています。なぜなら例えばchmマニュアルのようにもっとも私はすでに[chmマニュアル](https://github.com/astaxie/godoc)を作っていますが)、この中にすでに非常に協力なドキュメントツールが入っているからです。
どのように対応するpackageのドキュメントを確認すればよいでしょうか
例えばbuiltinパッケージであれば、`go doc builtin`と実行します。
もしhttpパッケージであれば、`go doc net/http`と実行してください。
パッケージの中の関数を確認する場合は`godoc fmt Printf`としてください。
対応するコードを確認する場合は、`godoc -src fmt Printf`とします。
コマンドラインでコマンドを実行します。 godoc -http=:ポート番号 例えば`godoc -http=:8080`として、ブラウザで`127.0.0.1:8080`を開くと、golang.orgのローカルのcopy版を見ることができます。これを通してpkgドキュメントなどの他の内容を確認することができます。もしあなたがGOPATHを設定されていれば、pkgカテゴリの中で、標準パッケージのドキュメントのみならず、ローカルの`GOPATH`のすべての項目に関連するドキュメントをリストアップすることができます。これはグレートファイアーウォールの中にいるユーザにとっては非常にありがたい選択です。
## その他のコマンド
goは他にも様々なツールを提供しています。例えば以下のツール
go fix は以前の古いバージョンのコードを新しいバージョンに復元するために使われます。例えばgo1の前の古いバージョンのコードをgo1に移動させます。
go version はgoの現在のバージョンを確認します。
go env は現在のgoの環境変数を確認します。
go list は現在インストールされている全てのpackageをリストアップします。
go run はGoプログラムのコンパイルと実行を行います。
以上これらのツールはまだ多くのオプションがあり、ひとつひとつはご紹介しませんが、ユーザは`go help コマンド`で更に詳しいヘルプ情報を取得することができます。
## links
* [目次](<preface.md>)
* 前へ: [GOPATHとワーキングディレクトリ](<01.2.md>)
* 次へ: [Goの開発ツール](<01.4.md>)
=======
# 1.3 Goのコマンド
## Goのコマンド
@@ -171,7 +53,7 @@
- `-installsuffix suffix` デフォルトのインストールパッケージと区別するため、このサフィックスを利用して依存するパッケージをインストールします。`-race`をオプションに指定した場合はデフォルトで`-installsuffix race`が有効になっています。`-n`コマンドで確かめることができますよ。
- `-ldflags 'flag list'` オプションを5l, 6l, 8lに渡してコールします。
- `-tags 'tag list'` コンパイル時にこれらのtagをつけることができます。tagの詳細な制限事項に関しては [Build Constraints](http://golang.org/pkg/go/build/) を参考にして下さい。
## go clean
このコマンドは現在のソースコードパッケージと関連するソースパッケージのなかでコンパイラが生成したファイルを取り除く操作を行います。これらのファイルはすなわち:
@@ -276,7 +158,7 @@ gofmtの引数紹介
簡単な例をご紹介します。例えば我々が度々`yacc`を使ってコードを生成していたとしましょう。その場合以下のようなコマンドをいつも使用することになります:
go tool yacc -o gopher.go -p parser gopher.y
-o は出力するファイル名を指定します。-pはパッケージ名を指定します。これは単独のコマンドであり、もし`go generate`によってこのコマンドを実行する場合は当然ディレクトリの任意の`xxx.go`ファイルの任意の位置に以下のコメントを一行追加します。
//go:generate go tool yacc -o gopher.go -p parser gopher.y
@@ -320,4 +202,3 @@ Go1.2バージョンより以前は`go doc`コマンドがサポートされて
* [目次](<preface.md>)
* 前へ: [GOPATHとワーキングディレクトリ](<01.2.md>)
* 次へ: [Goの開発ツール](<01.4.md>)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa

View File

@@ -1,30 +1,3 @@
<<<<<<< HEAD
# 4 フォーム
フォームは我々が普段Webアプリケーションを書く時によく使うツールです。フォームを通して便利にユーザにサーバとデータをやり取りさせることができます。以前にWeb開発をしたことのあるユーザにとってはフォームはとてもお馴染みのものです。しかしC/C++のプログラマからすると、少々ばかり門外漢かもしれません。フォームとは一体何でしょうか?
フォームは表の要素を含むエリアです。フォームの要素はユーザがフォームの中で(例えば、テキストフィールド、コンボボックス、チェックボックス、セレクトボックス等です。)情報を入力する要素です。フォームはフォームタグ(\<form\>)で定義します。
<form>
...
input 要素
...
</form>
Goではformの処理にすでにとても簡単な方法が用意されています。Requestの中にformを専門に処理するものがあります。とても簡単にWeb開発に利用できるものです。4.1節の中でGoがどのようにフォームの入力を処理するかご説明します。いかなるユーザの入力も信用はできないので、これらの入力に対しバリデーションを行う必要があります。4.2節ではどのように普通のバリデーションを行うか、細かいデモンストレーションを行います。
HTTPプロトコルはステートレスなプロトコルです。ではどのようにして一人のユーザを同定するのでしょうかまた、フォームが複数回送信されてしまわないように保証するにはどうするのでしょうか4.3と4.4節ではcookie(cookieはクライアントに保存される情報です。handlerとサーバを通る度にやり取りされるデータです。等をより詳しくご紹介します。
フォームにはもうひとつ、ファイルをアップロードできるという大きな機能があります。Goはファイルのアップロードをどのように処理しているのでしょうか大きなファイルをアップロードする際効率よく処理するにはどうすればよいでしょうか4.5節ではGoによるファイルのアップロード処理の知識を一緒に勉強します。
## 目次
![](images/navi4.png?raw=true)
## links
* [目次](<preface.md>)
* 前へ: [第三章まとめ](<03.5.md>)
* 次へ: [フォームの入力を処理する](<04.1.md>)
=======
# 4 フォーム
フォームは普段Webアプリケーションを書く時によく使われるツールです。フォームを通して便利にユーザにサーバとデータをやり取りさせることができます。以前にWeb開発をしたことのあるユーザにとってはフォームはとてもお馴染みのものです。しかしC/C++のプログラマからすると少々取っ付きにくいかもしれません。フォームとは一体何でしょうか?
@@ -50,4 +23,3 @@ HTTPプロトコルはステートレスなプロトコルです。ではどの
* [目次](<preface.md>)
* 前へ: [第三章まとめ](<03.5.md>)
* 次へ: [フォームの入力を処理する](<04.1.md>)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa

View File

@@ -1,63 +1,3 @@
<<<<<<< HEAD
# 4.4 フォームの複数回送信の防止
以前どこかのBBSやブログでご覧になったかもしれませんが、一つのスレや文章の後でいくつもの重複が記録されていることがあります。これらの大多数はユーザが複数回書き込みフォームを送信してしまったことによるものです。様々な原因で、ユーザはよくフォームを複数回送信してしまいます。通常はマウスの誤操作によるもので、送信ボタンをダブルクリックしてしまったり、一旦送信した内容を再度修正しようとして、ブラウザの戻るボタンを押した後に次へボタンではなくまた送信ボタンを押してしまうことによるものです。当然、故意によるものもあります。- - 例えばネット上のアンケート調査やくじ引きにおいて重複して投票するなどです。では、どのようにしてユーザが同じ内容のフォームの送信を行うことを効果的に防げるのでしょうか?
解決方法はフォームの中に唯一の値を持ったhiddenフィールドを追加することです。フォームを検証する際、この唯一の値を持ったフォームがすでに送信されているかどうか検証します。もしすでに送信されていれば、二回目の送信を拒絶します。そうでなければフォームに対して処理ロジックを行います。また、もしAjax形式で送信するフォームだった場合、フォームが送信された後、javascriptによってフォームの送信ボタンを禁止します。
4.2節の例を改良してみましょう:
<input type="checkbox" name="interest" value="football">サッカー
<input type="checkbox" name="interest" value="basketball">バスケットボール
<input type="checkbox" name="interest" value="tennis">テニス
ユーザ名:<input type="text" name="username">
パスワード:<input type="password" name="password">
<input type="hidden" name="token" value="{{.}}">
<input type="submit" value="ログイン">
テンプレートの中に`token`というhiddenフィールドを追加しました。この値にはMD5(タイムスタンプ)によってユニークな値を割り当てます。この値をサーバに保存することでsessionによってコントロールは、章でどのように保存するか解説しますフォームが送信される際の判定に使うことができます。
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //リクエストを受け取る方法
if r.Method == "GET" {
crutime := time.Now().Unix()
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
token := fmt.Sprintf("%x", h.Sum(nil))
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, token)
} else {
//リクエストはログインデータです。ログインのロジックを実行して判断します。
r.ParseForm()
token := r.Form.Get("token")
if token != "" {
//tokenの合法性を検証します。
} else {
//tokenが存在しなければエラーを出します。
}
fmt.Println("username length:", len(r.Form["username"][0]))
fmt.Println("username:", template.HTMLEscapeString(r.Form.Get("username"))) //サーバ側に出力します。
fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password")))
template.HTMLEscape(w, []byte(r.Form.Get("username"))) //クライアントに出力します。
}
}
出力されるページのソースは以下の通り:
![](images/4.4.token.png?raw=true)
図4.4 tokenを追加した後クライアントが出力するソース情報
tokenはすでに出力値を持っていますので、連続してページを更新することができます。この値が次々と変化するのがお分かりいただけるかと思います。このように毎回formが表示される時にユニークになるよう保証します。ユーザが送信するフォームは唯一性が保持されます。
この解決方法は悪意の無い攻撃に対しても防止することができます。また悪意のあるユーザに対してもしばらく効果があります。その後、この悪意のある動機を捨て去ることができなかった場合は更に複雑な作業が必要となります。
## links
* [目次](<preface.md>)
* 前へ: [クロスサイトスクリプティングの予防](<04.3.md>)
* 次へ: [ファイルのアップロード処理](<04.5.md>)
=======
# 4.4 フォームの複数回送信の防止
これまでにどこかのBBSやブログでご覧になったことがあるかもしれませんが、一つのスレッドや文章の後でいくつもの重複が記録されていることがあります。これらの大多数はユーザが複数回書き込みフォームを送信してしまったことによるものです。様々な原因でユーザはよくフォームを複数回送信してしまいます。通常はマウスの誤操作によるもので、送信ボタンをダブルクリックしてしまったり、一旦送信した内容を再度修正しようとして、ブラウザの戻るボタンを押した後に次へボタンではなくまた送信ボタンを押してしまうことによるものです。当然、故意によるものもあります。- - 例えばネット上のアンケート調査やくじ引きにおいて重複して投票するなどです。では、どのようにしてユーザが同じ内容のフォームの送信を行うことを効果的に防げるのでしょうか?
@@ -116,4 +56,3 @@ tokenはすでに出力値を持っていますので連続してページを更
* [目次](<preface.md>)
* 前へ: [クロスサイトスクリプティングの予防](<04.3.md>)
* 次へ: [ファイルのアップロード処理](<04.5.md>)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa

View File

@@ -1,127 +1,3 @@
<<<<<<< HEAD
# 9.6 データを暗号化/復号する
前の節でどのようにしてパスワードを保存するかご紹介しました。しかしあるときには、慎重に扱うべきデータを暗号化して保存し、将来のあるときにいつでもそれらを復元したい場合があります。この時双方向暗号化アルゴリズムを使って我々の要求を満たさなければなりません。
## base64で暗号化/復号する
もしWebアプリケーションが十分に簡単であれば、データのセキュリティにはそれほど厳格な要求があるわけではありません。ですので比較的簡単な暗号化である`base64`を採用することができます。このような方法は実装するのが比較的簡単で、Go言語の`base64`パッケージではすでにこれをよくサポートしています。下の例をご覧ください:
package main
import (
"encoding/base64"
"fmt"
)
func base64Encode(src []byte) []byte {
return []byte(base64.StdEncoding.EncodeToString(src))
}
func base64Decode(src []byte) ([]byte, error) {
return base64.StdEncoding.DecodeString(string(src))
}
func main() {
// encode
hello := "你好,世界! hello world"
debyte := base64Encode([]byte(hello))
fmt.Println(debyte)
// decode
enbyte, err := base64Decode(debyte)
if err != nil {
fmt.Println(err.Error())
}
if hello != string(enbyte) {
fmt.Println("hello is not equal to enbyte")
}
fmt.Println(string(enbyte))
}
## 高度な暗号化/復号
Go言語の`crypto`では双方向暗号の高度な暗号化/復号パッケージがあります:
- `crypto/aes`パッケージ:AES(Advanced Encryption Standard)は、Rijndael暗号化アルゴリズムとも呼ばれます。アメリカの連邦政府が採用しているブロック暗号の標準の一つです。
- `crypto/des`パッケージDES(Data Encryption Standard)は双方向暗号化標準のひとつです。これは現在秘密鍵のシステムに最も広く使用されています。特に金融データのセキュリティの保護で使われています。かつてアメリカ連邦政府の暗号化のスタンダードでしたがすでにAESにとってかわられています。
これらつのアルゴリズムは使用方法が似ていますので、ここではaesパッケージだけを例にこの使用を解説します。下の例をご覧ください
package main
import (
"crypto/aes"
"crypto/cipher"
"fmt"
"os"
)
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は渡された文字列になります。
if len(os.Args) > 1 {
plaintext = []byte(os.Args[1])
}
// aesの暗号化文字列
key_text := "astaxie12798akljzmknm.ahkjkljl;k"
if len(os.Args) > 2 {
key_text = os.Args[2]
}
fmt.Println(len(key_text))
// 暗号化アルゴリズムaesを作成
c, err := aes.NewCipher([]byte(key_text))
if err != nil {
fmt.Printf("Error: NewCipher(%d bytes) = %s", len(key_text), err)
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)
fmt.Printf("%x=>%s\n", ciphertext, plaintextCopy)
}
上では`aes.NewCipher`(引数keyはかならず16、24または32桁の[]byteとなります。それぞれAES-128, AES-192とAES-256アルゴリズムに対応します。)関数をコールすると`cipher.Block`インターフェースを返します。このインターフェースは3つの機能を実現します:
type Block interface {
// BlockSize returns the cipher's block size.
BlockSize() int
// Encrypt encrypts the first block in src into dst.
// Dst and src may point at the same memory.
Encrypt(dst, src []byte)
// Decrypt decrypts the first block in src into dst.
// Dst and src may point at the same memory.
Decrypt(dst, src []byte)
}
この3つの関数は暗号化/復号操作を実現します。詳細な操作は上の例をご覧ください。
## まとめ
この節ではいくつかの暗号化/復号アルゴリズムをご紹介しました。Webアプリケーションを開発している時は要求に合わせて異なる方法によって暗号化/復号を行うことができます。一般的なアプリケーションではbase64アルゴリズムを採用することができます。より高度な場合はaesやdesアルゴリズムを採用することができます。
## links
* [目次](<preface.md>)
* 前へ: [パスワードの保存](<09.5.md>)
* 次へ: [まとめ](<09.7.md>)
=======
# 9.6 データを暗号化/復号する
前の節では安全なパスワードの保存の仕方を説明してきました。しかしあるときには、既にデータベースに保存されている、プライバシーに関わる暗号化されたデータを修正する必要があるかもしれません。データを復号することが必要な時は、既に述べた1方向ハッシュ関数の代わりに、対称鍵暗号アルゴリズムを使うべきです。
@@ -207,4 +83,3 @@ Go言語の`crypto`では対称鍵暗号アルゴリズムをサポートして
* [目次](<preface.md>)
* 前へ: [パスワードの保存](<09.5.md>)
* 次へ: [まとめ](<09.7.md>)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa

View File

@@ -1,12 +1,2 @@
<<<<<<< HEAD
<<<<<<< 380a8ee74c41759d8189ad553423467994187253
# Go Web プログラミング
Webプログラミングが好きでGo webプログラミングを書きました。皆さんに気にいってもらえれば幸いです。
=======
# Go Web プログラミング
Webプログラミングが好きでGo webプログラミングを書きました。皆さんに気にいってもらえれば幸いです。
>>>>>>> update the structure for gitbook
=======
# Go Web プログラミング
Webプログラミングが好きでGo webプログラミングを書きました。皆さんに気にいってもらえれば幸いです。
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa