2014年9月18日木曜日

Golang Cafe #47

9/14(日)に開催された「Golang Cafe #47」に参加してきました。

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

今回はGoでWebSocketを叩きました。週中にHaginoさんが先行して触られていたので、要所で説明を頂きながら進めて行きました。

まずはgolang-samples/websocket/simpleのソース(main.goとindex.html)とgo.net/websocketのドキュメントをにらめっこしました。

クライアント側のサンプルとして、昨年、Haginoさん主催で開催された「HTML5を業務アプリで使うための勉強会」でのファイルが紹介されたので懐かしかったです。
# サンプルの中で対象となるファイルは「sample01.html」と「sample01.js」です。

途中、Goをソースからビルドしていた「Yokoyama@早すぎる男」さんが「Go 1.4からはsrc/pkgはsrc/に変更」にハマっていて作業が遅れていた事が発覚。それに触発されて「Hagino@先走る男」さんもGo 1.4化にチャレンジしたのですが「Windowsの最新ビルドはfail中」にハマってしまってGo 1.3.1に戻られていました。
# 私ができたのは、そんなお二人の姿を向かいの席から暖かく見守ることのみ...q@w@p

その後、Haginoさんから「チャットを作ってみよう」という提案があったので、そちらにチャレンジしましたが、私の結果は半分成功で半分失敗(^^;) 原因はHaginoさん作のソースを中途半端に実装していたためでした。

ちなみに、半分成功で半分失敗の挙動は、Webブラウザーにて2つのウィンドウからアクセスした後、メッセージを送ると片方のウィンドウにしか表示されないというものです。

以下、記録として、そんな私の半々ソース(?)です。

package main

import (
        "code.google.com/p/go.net/websocket"
        "io"
        "net/http"
        "sync"
)

var (
        mux       sync.Mutex
        clientMap = make(map[*websocket.Conn]bool)
)

func addClient(ws *websocket.Conn) {
        mux.Lock()
        defer mux.Unlock()
        _, ok := clientMap[ws]
        if !ok {
                clientMap[ws] = true
        }
}

func echoHandler(ws *websocket.Conn) {
        addClient(ws)
        for k, _ := range clientMap {
                io.Copy(k, ws)
        }
}

func main() {
        http.Handle("/echo", websocket.Handler(echoHandler))
        http.Handle("/", http.FileServer(http.Dir(".")))
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
                panic("ListenAndServe: " + err.Error())
        }
}

後日、タイムリーにQiitaへ「WebSocketをGoで触ってみた」という記事が投稿されたので、見直しておきます。

次回は、9/11(木)に東京で開催された「GolangTestNight (Gunosy.go#10)」の各発表資料を読み進めるようです。

2014年9月7日日曜日

Golang Cafe #45

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

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

今回は各種資料の読み進めとHaginoさんが作成されたGoツールのソースチェック(?)を行いました。

今週は、ruiさんのQiitaへの記事の投稿が始まったり、8月に開催された各Goイベントの資料が公開されていたりと、関連資料が豊作の週でした。

前半は、公開された資料の中から、以下の2つを読み進めました。


ruiさんの投稿も牧さんのスライドも量が多いので斜め読みになりましたが、再度、どちらもじっくりと読み直したいところです。

後半は、Haginoさんが作成された、サイト「textream(テキストリーム)」の記事をWebスクレイピングするツールのソースチェック(?)を行いました。

以下、自分用のメモも兼ねて、ツールのセットアップ手順です。

1)SQLiteがインストールされていることを確認
  →インストールされていなければインストールして下さい。

 $ sqlite3 -version
 3.7.12 2012-04-03 19:43:07

2)go-yahoo_textreamをインストール

 $ go get github.com/taknb2nch/go-yahoo_textream

3)必要なパッケージをインストール

 $ go get github.com/mattn/go-sqlite3
 $ go get github.com/coopernurse/gorp
 $ go get code.google.com/p/cascadia
 $ go get github.com/PuerkitoBio/goquery

4)Webブラウザーにて、サイト「textream」からWebスクレイピングしたい記事を表示

  1. トップページの左側の一覧からカテゴリーを選択。
    例)ニュース速報
  2. 一覧からメッセージを選択。
    例)アイドル(エンターテイメントの欄)
  3. 各メッセージのパーソナルのリンクをクリック。
    例)Yahoo!ニュース トピックス

4)go-yahoo_textream/batch/配下のusers.json.sampleをusers.jsonにリネームした後、テキストエディターにて、表示した記事の内容で書き換え

  • YahooId
    パーソナルページの右側のYahoo! ID/ニックネーム
  • DisplayName
    パーソナルページの右側の表示名
  • Url
    パーソナルページのURL

 書き換え例)
  "Id" : 1,
  "YahooId" : "y_news_topics",
  "DisplayName":"Yahoo!ニュース トピックス",
  "Url" : "http://textream.yahoo.co.jp/personal/history/comment?user=HrwFiSBtiy9RitKhZWXCdRGC"

5)同ディレクトリ内のmain.goを実行
  →記事をWebスクレイピングしてSQLiteに格納するため、時間がかかります。

 $ go run main.go

6)go-yahoo_textream/web/配下のmain.goを実行して、Webサーバーを起動

 $ go run main.go

7)Webブラウザーにて、http://127.0.0.1:8080/users/ にアクセス

8)記事を最新化したい場合は、5)を実行した後、Webブラウザーをリロード

次回も引き続き各種資料の読み進めを行うようです。