Merge pull request #360 from HirofumiTamori/master

[ja] fix typos, translate a Chinese sentence, modify expression
This commit is contained in:
astaxie
2014-08-28 23:41:08 +08:00
9 changed files with 20 additions and 20 deletions

View File

@@ -445,7 +445,7 @@ mapを使う段階で注意しなければならないことがいくつかあ
図2.5 makeとnewの低レイヤでのメモリの割り当て
"ゼロ値"というのは何もカラの値ではありません。これは一種の"変数が埋めらる前"のデフォルト値であり、通常は0です。
"ゼロ値"というのは何もの値ではありません。これは一種の"変数が埋めらる前"のデフォルト値であり、通常は0です。
それぞれの型のゼロ値は以下の通りです
int 0

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`にもどりましょう。
@@ -212,17 +212,17 @@ methodはstructの上でしか使用されないのでしょうか当然違
- Volume()はレシーバをBoxとして定義します。Boxの堆積を返します。
- SetColor(c Color)はBoxの色をcに変更します。
- BiggestsColor()はBoxListに定義されており、listの中の体積が最大の色を返します。
- PointItBlack()はBoxListのすべてのBoxの色を全部黒に変更します。
- String()はColorに定義されており、Colorno具体的な色を返します(文字列形式)
- 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

@@ -116,7 +116,7 @@ HTTPのresponseパケットを見てみることにしましょう。構造は
//空行 ヘッダとボディを分けるために使われます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... //ボディ
Response包中的第一行叫做状态行由HTTP协议版本号 状态码, 状态消息 三部分组成
レスポンスパケットの第一行はステータス行と呼ばれ、HTTPプロトコルバージョン番号、ステータスコード、及びステータスメッセージのつの部分から構成されています
ステータスコードはHTTPクライアントにHTTPサーバが事前にResponseを発生させるか伝えます。HTTP/1.1プロトコルでは種類のステータスコードが定義されています。ステータスコードは3桁の数字で表されます。はじめの数字はレスポンスの型を定義しています。

View File

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

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)`をコールすることでこのドライバの登録を完了させます。

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

@@ -1,7 +1,7 @@
# 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)

View File

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

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開発があなたに与えるスピードをご理解いただけると思います。