2014年7月27日日曜日

Golang Cafe #39

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

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

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

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だけではなくAngularJSCloud SDKGorilla 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で使ってみる回になるようです。