2014年8月10日日曜日

Golang Cafe #41

8/3(日)に開催された「Golang Cafe #41」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、初参加の植木浩次さん、私の4名でした。

今回はO/Rマッパー「gorp」を叩く回でしたが、私は植木さんのフォローをさせて頂きました。

植木さんはWindowsユーザーということで、都度、WindowsチームのHaginoさんからアドバイスを頂きながら作業を行いました。

植木さんはGo言語は初めてということで、まずはGoのインストールから開始。

  1. 今回はバイナリー版をインストール。
    →ソースからだとMercurialやGCCの別途インストールが必要で時間がかかるため。
  2. 環境変数にGOROOTとGOPATHを設定して、Go ToolsへのPATHを追加。
  3. 「Hello, World!」をコーディングしてgo runにて実行できるところまで確認。

ここから本線のgorp叩きに参加して頂こうとしましたが、go getを使う際にGitクライアントが必要なことが発覚。さらにデータベースも必要で、セットアップが続きそうな状況に...(@o@)

さすがに時間がもったいないので、再び脱線して「How to Write Go Code」の「Your first library」から進めて頂く事にしました。

本線チームの方は、順調に進んで無事gorpでデータベースにアクセスするところまで到達されていました。(後日、本線チームのメンバーのブログを追っかけて補完しますm(__)m)

「Golang Cafe #4」にてdatabase/sqlパッケージ + PostgreSQLを触っていたため、より順調に進められたようで、データベースをSQLiteに変更してみたり、参考サイトの内容をPosgreSQLで実行してみたりと、変化をつけて叩かれていました。

私の場合「How to Write Go Code」を使ったハンズオンは、GDGChugokuで1回、Golang Cafeで2回、行ったことになります。この範囲であればフォローできますので「Go言語は初めて」という方がいつGolang Cafeに来られても大丈夫...のハズ?

個人的には、初めての方が参加された時は、今回のように「他のメンバーの方々には随時フォローを頂きつつ、初めての方は主に私が担当して、他のメンバーの方々には本線を進めて頂き、その成果をブログにまとめて頂き、後日、私はそのブログを追って補完する。」というパターンで大丈夫だと思っています。

次回は「今から?」いえいえ「これから!」公式サイトの「Effective Go」を読み進めるようです。が、台風11号が接近中...q@w@p

2014年8月9日土曜日

自分が作成したGopherを公開するには?

ネット上で各自が作成したオリジナルGopherを見かけるようになりました。私の周囲でも「オリジナルGopher君グッズを作ろう!」といった話もちらほらと?嬉しい限りですね!q@w@p

そこで、自分が作成したオリジナルのGopherをネットに公開したりグッズに使うために気をつけること、すなわち、Gopherのライセンスについて調べてみました。

Gopherのライセンスについての記述はどこ?

公式サイトのFAQに「What's the origin of the mascot?」として記載されています。

 [抜粋] The mascot and logo were designed by Renée French.The logo and mascot are covered by the Creative Commons Attribution 3.0 license.

また、公式ブログの「The Go Gopher」の文中にも掲載されています。

 The gopher images are Creative Commons Attributions 3.0 licensed. That means you can play with the images but you must give credit to their creator (Renee French) wherever they are used.

これらにより、Gopherには「Creative Commons Attribution 3.0 Unported(日本語版)」のライセンスが付与されていることがわかります。

「Creative Commons Attributions 3.0」とは?

略称は「CC BY 3.0」で、「Criative Commons(日本版)」という組織が発行しているライセンスで、バージョンは「3.0」、種類は「表示」であることを表しています。

種類は、CCサイトの「クリエイティブ・コモンズ・ライセンスとは」に記載されており、Gopherの場合は「表示(BY)」です。

 【表示】原作者のクレジット(氏名、作品タイトルなど)を表示することを主な条件とし、改変はもちろん、営利目的での二次利用も許可される最も自由度の高いCCライセンス。

これらにより、Gopherに関する著作物を使用する場合は、原著作者、すなわち公式サイトのFAQにもある「Renée French」氏のクレジット表示が必要になります。

「二次的著作物(derivative work)」とは?

CCサイトのFAQに「二次的著作物とは何でしょうか。」として説明があります。

今回の話題でいえば「自分で作成(描いたり作ったり)したGopher」になります。

「二次的著作物」のライセンス制約

表示ライセンスは、二次的著作物でも原著作者のクレジット表示が条件です。


原則、二次的著作物のライセンスは原著作者のライセンスより緩められません。


これらにより、自分で作成したGopherを公開する場合は、原著作者のクレジットも表示する必要があり、さらにCCライセンスを付与するなら、原則「表示」以上の制約を持つ種類になります。

「二次的著作物」の公開

二次的著作物には、自分のクレジットを付けてもO.K.です。

 CCライセンスで作品を提供する場合に、気をつけることはありますか?

Web上に公開する場合、クレジット表示は二次的著作物と同一のベージが望ましいです。


これらにより、自分で作成したGopherにCCライセンスを付与した場合は、自分のクレジットも表示させることができ、Web上に公開する場合は、自分で作成したGopherと原著作者のクレジット、CCライセンス付きなら自分のクレジットを、なるべく同一ページに配置するようにします。

結局、どうすればよい?

Renée French氏が作成した公式サイトのGopher画像を使ったり、自分が作成したGopherをCCライセンスなしで使う場合は、

 「Gopherの原著作者はRenée Frenchさんです。」

といったクレジットを、自分が作成したGopherをCCライセンス付きで使う場合は、

 「このGopherは○○○○が作成しました。
  Gopherの原著作者はRenée Frenchさんです。」

といったクレジットとCCライセンス情報を一緒に公開するだけでO.K.です。

つまり

このGopherはRyuji Iwataが筆ペンで作成!
Gopherの原著作者はRenée French氏です。

2014.08.09 二次的著作物をCCライセンス付きで公開する場合には、原著作者の種類に関わらずCCライセンス情報を提示するように修正。

2014年7月27日日曜日

Golang Cafe #39

7/20(日)に開催された「Golang Cafe #39」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、私の4名でした。

今回は「Gorilla web toolkit」のcontextとsessionsのパッケージを叩きました。

contextパッケージは「requestの範囲にて、値をmap形式で保持する入れ物」だと理解しました。

contextパッケージは前回muxパッケージをインストールした際に含まれていたので無意識に使えたのですが、sessionsパッケージは今回新たにインストールする必要があり、その際securecookieパッケージもインストールされました。

sessionsパッケージは「sessionの範囲(=requestの間)にて、値はmap形式で保持して、受け渡しはCookieを介して行う仕組み」だと理解しました。

自分はコードを書き切れなかったので体感できていないのですが(^^;)、YokoyamaさんやHaginoさんは以下の方法を実行しても保持している値がクリアされない事象に見舞われていました。

  • httpサーバーを再起動
  • WWWブラウザーを再起動
  • WWWブラウザーをCookieを保持しない状態で使用

Webシステム構築はJavaでの経験が多いため、まずは「サーブレット脳」で機能や処理をイメージして理解するようになっていますが(^^;)、それでは太刀打ちできない場面もありましたので、GoでのWebシステム構築に関する知識を体系的に学習しておきたいところです。

次回はGorillaの残りのパッケージ(reverse, rpc, schema, securecookie)を叩くようです。

2014年7月20日日曜日

Golang Cafe #38

7/13(日)に開催された「Golang Cafe #38」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、私の4名でした。

今回は「Gorilla web toolkit」のmuxパッケージを叩きました。

muxパッケージの説明に「powerful URL router and dispatcher(強力なURLルータとディスパッチャー)」と記述されており、私はここで初めて「URLルータ」という言葉を聞きました。

コーディングをしてみて、「URLルータ」とは「リクエストパラメータなどを元にして遷移先のURLを作成(=ルーティング)するもの」と解釈しました。

muxパッケージのOverviewを参考に、net/httpを使った簡易Webサーバーを作成して動作を確認して行きました。

コーディングの終盤で「mux.Vars()」で扱うパラメータをURL用ではなく画面からの引数と勘違いしていたのに気付いたため、進捗はかなり悪いものとなりました。
# <TEXTARE>ダグを使った画面があるのは、その時の「なごり」です(^^;)

エラーコードが404の時に自作のエラー画面を表示するには、NotFoundHandlerに自作のエラー画面のハンドラー関数を設定すれば実現できることを教えて頂いたので実装してみました。
以下、作成したコードです。
# Overviewのままなので参考にならないかと。自分用メモとして。

package main

import (
        "bytes"
        "fmt"
        "github.com/gorilla/mux"
        "net/http"
)

func main() {
        r := mux.NewRouter()
        r.NotFoundHandler = http.HandlerFunc(NotFoundHandler)
        r.HandleFunc("/", HomeHandler)
        r.HandleFunc("/gorilla/{key}", InputHandler)
        http.Handle("/", r)
        http.ListenAndServe(":8080", nil)
}

func NotFoundHandler(w http.ResponseWriter, r *http.Request) {
        bs := bytes.NewBufferString("")
        bs.WriteString("<h1>Not Found!</h1>\n")
        bs.WriteString("<a href=\"/\">Top</a>")
        fmt.Fprintf(w, bs.String())
}

func HomeHandler(w http.ResponseWriter, r *http.Request) {
        bs := bytes.NewBufferString("")
        bs.WriteString("<h1>Hello Gorilla!</h1>\n")
        bs.WriteString("<a href=\"/gorilla\">Nothing</a><br>\n")
        bs.WriteString("<a href=\"/gorilla/input\">Input</a>")
        fmt.Fprintf(w, bs.String())
}

func InputHandler(w http.ResponseWriter, r *http.Request) {
        vars := mux.Vars(r)
        key := vars["key"]
        output(w, key, "")
}

func output(w http.ResponseWriter, title, value string) {
        bs := bytes.NewBufferString("")
        bs.WriteString("<h1>%s</h1>\n")
        bs.WriteString("<form action=\"/gorilla/output\" method=\"POST\">\n")
        bs.WriteString("<textarea name=\"message\">%s</textarea><br>\n")
        bs.WriteString("<input type=\"submit\" value=\"Go!\">\n")
        bs.WriteString("</form>")
        fmt.Fprintf(w, bs.String(), title, value)
}

ちなみに、上記のコードを「gori_mux.go」といったファイル名で保存して、黒い画面で「go run gori_mux.go」と入力してWebサーバーを起動させて、Webブラウザーで「http://127.0.0.1:8080/」にアクセスすると動作確認できます。

次回(1〜2時間後:^^;)はGorillaのsessionsやcontextのパッケージを叩くようです。

2014年7月13日日曜日

Golang Cafe #37

7/6(日)に開催された「Golang Cafe #37」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、+Tam T さん、私の5名(久々の満員御礼!)でした。

今回はGoogle I/O 2014の開催中に公開された「Gmail API」をGoで叩きました。

YokoyamaさんやHaginoさんは「Golang Cafe #18」にてgoauth2を使われていたため、Pure Goでのアクセスを試みましたが、私はその回に参加できていなかったため、Gmail APIのクライアントライブラリーを使ってアクセスすることにしました。

結論から言うと、私はGmail APIにアクセスするところまで辿り着けませんでした(T_T)

当日は、以下の流れで作業を行いました。

  1. 「Gmail API」ページの「Downloads」リンクをクリック。
  2. 「Gmail API Client Libraries」ページの「Google APIs Client Library for Go (alpha)」リンクをクリック。
    # Alpha版を含めて、様々なプログラミング言語がサポートされています。
  3. 「google-api-go-client」ページの「Getting started documentation」セクションのURLリンクをクリック。
  4. 「Getting Started」ページの内容に従って作業を進める。
  5. 「OAuth HTTP Client」セクションでgoauth2に出会い、#18のリンクからご両人のブログを読み返す。
  6. 「examples」ページのgoソースを参考にして、コーディングを進める途中で終了。

#37の参加者のブログを見て、復習しておきますm(__)m

そろそろフレームワークを試して行きたいということで、次回は「Gorilla web toolkit」を試してみるようです。

2014年7月6日日曜日

Golang Cafe #36

6/29(日)に開催された「Golang Cafe #36」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、私の4名でした。

今回はGoogle I/O 2014でGoのセッションがあれば閲覧する予定でしたが残念ながらありませんでしたのでcodelabの「Go: Build a Backend on App Engine」を行うことになりました。
# 「box-talks」には幾つかGoのコーナーがあったようですね。

資料は初心者向けであり、ピュアGAE/GoだけではなくAngularJSやCloud SDKやGorilla frameworkといった技術も絡める内容となっているようなので、GAE/Goのチュートリアルをやり終えた方が復習がてら取り組むのにもオススメです。

今回は久々に +Takashi Yokoyama さんから進行役をふられ(^^;)、その場で英文をざっくりと意訳しながらGAE/Goハンズオンとして進めて行って「3. Creating lists」まで行いました。

要所要所で +Takashi Yokoyama さんが解説やフォローを入れて下さったので、スムーズに進めることができましたm(__)m
# Golang Cafeは、GAE/Go本の著者様が主催されている会であることも、ウリ&強み!q@w@p

今回もWindowsチームの +Takanobu Hagino さんからたまに声が上がるのが印象的でした(^^;)

GAEのローカルサーバーの管理ツールはPythonで作成されているため、その部分で質問を受けたりしたのですが、Pythonを忘れかけていたのはナイショです...(^^;)

次回は、Google I/O 2014の開催中にひっそりと公開された「Gmail API」をGoで使ってみる回になるようです。

2014年6月29日日曜日

Golang Cafe #35

6/22(日)に開催された「Golang Cafe #35」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、私の4名でした。

今回は「Go Conference 2014 springを開催しました #gocon」の中から「Five things that make Go fast」が選択され、「二 Inlining」まで読み進めました。

「Goを速くする5つの事柄」ということで、コーディングテクニックやイケてるパッケージの紹介かと思いきや、Goコンパイラーにおける速度向上の仕組みや工夫に関する内容でした。

個人的には好きな方の話だったので、都度、感心しながら読み進められました。

以下、ざっくり、かつ、超意訳にまみれた内容紹介ですm(__)m

最初に「Gopherに聞きました!Goを採用した理由トップ3」が紹介されていました。

  • 同時実行
  • デプロイが簡単
  • パフォーマンス

今回、Dave Cheneyさんはパフォーマンスを「Goの速さ」と捉えて説明されています。

一 Values

Goにてint32型で値を定義した場合は1byte/桁のメモリを消費します。(「2014」なら4byte)

Pythonでは何回もメモリを確保したり、Javaではプリミティブ型はGoに近いですがクラス型はVMのbit数に左右されるなど、落ち着きがありません。

メモリはより大容量になり、CPUはより高速になっているため、データをやりとりするバスの差は広がる一方ですが、その差を埋めるためにCPUキャッシュが導入されています。

Goは正確にメモリを確保するため、CPUキャッシュを有効に活用することができ、結果としてパフォーマンスの向上につながっています。

二 Inlining

関数呼び出しにはコストがかかり、そのオーバーヘッドを軽減させる技術として「関数のインライン化」があります。

インライン化のデメリットはバイナリーファイルのサイズが大きくなることです。

Goは単純な関数に対してインライン化を行います。複雑な関数では呼び出し時のオーバーヘッドは関数本体の処理に比べて影響が少ないためインライン化を行いません。

パッケージがコンパイルされる際、インライン化に適した単純な関数にマークが付けられます。

.a ファイルでは、コンパイラーが迅速に処理できるようにソースが少し変換されています。

コンパイラーは、到達不能なコードがあれば排除します。

Goコンパイラーはファイルやパッケージ全体に対して自動的に関数のインライン化を行います。これには標準ライブラリーからインライン化可能な関数を呼び出すコードが含まれています。

以上、ざっくり、かつ、超意訳にまみれた内容紹介でしたm(__)m

次回(本日 ^^;)は「Google I/O 2014」でのGo関連の資料を見て行く模様です。