きょこみのーと

技術に関係ないほうのブログ

Goのテンプレート言語egoを使ってみた

golangtext/template最近ようやく慣れてきたけど、 やっぱり{{}}が増えてくると辛いので、他のパッケージに手をだしてみました。

egoが触った中で一番しっくりきたのと、一通り色々なことができそうな気配を感じたので気に入りました。

benbjohnson/ego · GitHub

インストール

go getだけでOKです。

$ go get github.com/benbjohnson/ego

egoを呼び出すソースコード

ディレクトリ構成

├── main.go
└── templates
    └── sample.ego

templates/sample.egoは、ego用のtemplateファイル。拡張子.egoじゃないとダメです。

golang ego sample

egoを実行する

$ ego -package main templates

実行するとego.goが作成される。*1

├── ego.go
├── main.go
└── templates
    └── sample.ego

go runで実行する

$ go run main.go ego.go
## Titleを表示
test

## Titleをローカル変数titleに代入して表示


title = test

## FooListをfor文で回して表示

    abc ローカル変数のスコープ = test

    def ローカル変数のスコープ = test

    ghi ローカル変数のスコープ = test

    foo ローカル変数のスコープ = test


## FooMapをfor文で回してkeyとvalueを表示

    キー: a 値: 111 ローカル変数のスコープ = test

    キー: b 値: 222 ローカル変数のスコープ = test

    キー: c 値: 333 ローカル変数のスコープ = test

*1: go:generateでも実行できます。参考

go-bindataをgo:generateで実行する

この手の生成ツールはgo:generateで、まとめて実行するようにすればMakefileとか書かなくていいので幸せになれそうです。

go-bindataの使い方とかは以下などを参考にしていただければと。

アセット的なアレを実行バイナリ内に入れる話。 — さにあらず

jteeuwen/go-bindata · GitHub

go-bindataしたファイルを参照したいmainのソースコード

ディレクトリ構造はこんな感じです。

├── data
│   └── emoji.json
└── main.go

//go:generate go-bindata data/のコメントを入れる。

go-bindataをgo:generateで実行するhttp://kyokomi.hatena ...

go generateを実行する

bindata.goが生成されました。

$ go generate
$ ll
total 144
  0 drwxr-xr-x   5 kyokomi  staff    170  1 17 21:01 .
  0 drwxr-xr-x  16 kyokomi  staff    544  1 17 20:51 ..
136 -rw-r--r--   1 kyokomi  staff  69509  1 17 21:00 bindata.go
  0 drwxr-xr-x   3 kyokomi  staff    102  1 17 20:54 data
  8 -rw-r--r--   1 kyokomi  staff    222  1 17 21:01 main.go

おわり

もっと色々とgo:generateで便利なやつないかな。

docomo APIのGoライブラリ(go-docomo)を作った

docomoAPIを利用する目的で作ったGo製のライブラリです。 各API叩いてるだけなので、特別なにかやってるとかはないです。

kyokomi/go-docomo · GitHub

今のところ以下のAPIに対応しています。

  • 雑談対話
  • 知識Q&A
  • トレンド記事抽出

ライブラリの構成とかはgo-githubを参考に作りました。

docomo API

docomoAPIを利用するには、以下でDeveloper登録が必要です。 Google+とかFacebookとかのSNSアカウントでログイン対応してるので、すぐAPIを触れます。

docomo Developer support | NTTドコモ

docomoAPI

f:id:kyokomi:20150114142403p:plain

※詳しくは公式APIドキュメントを見ていただければと

利用例

大体こんな感じに使われてます。

以下の記事を見て自分もGoでやってみたいなーと思いました。

DocomoruでBOTと雑に会話する - Qiita

go-docomoでつくったGo製のSlackbot

雑談APIと知識Q&AのAPIを使ってます。

f:id:kyokomi:20150114142934p:plain

いーすんさん可愛い!!!

雑なソースコードはこちら ↓

kyokomi/nepu-bot · GitHub

go-docomoの使い方

普通にgo getします。

go get github.com/kyokomi/go-docomo/docomo

docomoで登録したAPIはNewClientの引数で渡すようにしているので、 環境変数なり起動引数なりで読み込んでセットしてください。

package main

import (
    "log"
    "os"

    "github.com/kyokomi/go-docomo/docomo"
)

func main() {
    apiKey := os.Getenv("DOCOMO_APIKEY")

    c := docomo.NewClient(apiKey)

    message := "こんにちわ"
    req := docomo.DialogueRequest{
        Utt: &message,
    }
    res, err := c.Dialogue.Get(req, true)
    if err != nil {
        log.Fatalln(err)
    }
    log.Printf("%+v", res)
}

実行結果

2015/01/14 14:52:02 &{Context:kqRd3UD-30ov__ecH7exLA Da:0 Mode:dialog Utt:こんにちわー Yomi:こんにちわー RequestError:{PolicyException:{MessageID: Text:}}}

Memo: トレンド記事取得の関連記事取得が中々ヒットしない仕様?みたいで「ぐぬぬ」ってなりますのでご注意ください

おわり

気軽にPR等投げていただければと思います。

ただ、英語全然ダメなので、こっそりTwitterとかで日本語で話しかけていただけると助かります・・・

Go言語でのInterfaceの可視性について

ちょっとハマったのでメモがてらまとめました。

Interfaceも通常のstruct等と同じく先頭が小文字で始まる場合に別パッケージで参照できないという点についてです。

ディレクトリ構成

example
├── factory1
│   └── factory.go
├── factory2
│   └── factory.go
├── main1.go
└── main2.go

外部でinterface実装可能

FactoryインターフェースのCreate(),Register()ともに先頭が大文字でパッケージ外から参照可能なので、別のパッケージでインターフェースを実装することが出来ます。

// example/factory1/factory.go
package factory1

type Factory interface {
    Create()
    Register()
}

// example/main1.go
package main

import "./factory1"

type BarFactory struct {

}

func (h BarFactory) Create() {

}

func (h BarFactory) Register() {

}

var _ factory1.Factory = (*BarFactory)(nil)

func main() {
    f1 := BarFactory{}
    f1.Create()
    f1.Register()
}

外部でinterface実装不可能

Factoryインターフェースと同じパッケージ内で実装したものなら、 外部パッケージから利用可能です。

ポイント

  • register()は先頭小文字で不可視になっているため、外部パッケージからはCreate()しか呼べない
  • register()は先頭小文字で不可視になっているため、外部パッケージではインターフェースの実装ができない
//example/factory2/factory.go
package factory2

type Factory interface {
    Create()
    register() // 別packageから参照不可能
}

type FooFactory struct {

}

func (h FooFactory) Create() {
    h.register()
}

func (h FooFactory) register() {

}

var _ Factory = (*FooFactory)(nil)

// example/main2.go
package main

import "./factory2"

func main() {
    f2 := factory2.FooFactory{}
    f2.Create()

    // ERROR: 不可視なので呼び出せない
    // f2.register()
}

type BazFactory struct {

}

func (b BazFactory) Create() {

}

func (b BazFactory) register() {

}
// ERROR: Factory.register()が不可視なのでinterface実装できない
//var _ factory2.Factory = (*BazFactory)(nil)

おわり

あまりinterfaceを使う機会がなかったので、よくわかってなくてハマりました。

(単に使い方わかってなくて使い所がわかってなかっただけかもしれませんが・・・)

触りながら自己理解したので、もし認識違い等ありましたら指摘いただけると助かります。

最近買ったもの(2014年下期編)

スワダ 爪切り クラシック L

スワダ 爪切り クラシック L

スワダ 爪切り クラシック L

確かに切れ味もよくて爪も飛び散らないいい感じ。 うまく切れた指はヤスリ掛け不要だった。

タブレットPC対応フレキシブルマウントアームスタンド

と思っていたが。。。

Nexus9結構持ち歩くので、いちいちセットアップするの面倒いとかで結局ほとんど使ってない。

Qiチー対応ワイヤレス充電器(USB供給)

値段的にもコスパ高くて、買って良かった。

注意点:

  • ケーブル指して充電するより充電速度が遅い
  • ケーブル指して充電するより端末が熱くなる

サイクロン式 2in1スティッククリーナー

5年使った3980円の掃除機と別れを告げた。

吸引力が違うので時間かからないのと、コードレスなのでちょっとゴミを見かけたらサッと掃除機掛けれるのが良い。

PlayStation Vita TV (VTE-1000AB01)

PSVitaのゲームたまに家でガッツリやるときがあるので、勢いで買ってみた。

バリューパック買わなかったの失敗した。した。。。した。。。

PS3のコントローラーあるし〜とか思ってたけど、コントローラのケーブルを刺さないと操作できないのでいちいち抜き差しするのが面倒でお蔵入りしそう。

47型テレビで使うと少し画質が悪いのが目立つけど、特別こだわりがなければ問題ない。

セーブデータに関しての注意点:

  • PlayStation®Plusを登録してセーブデータを預ける(お金かかる)
  • nasneにセーブデータをコピーして上書きする(めんどい)
  • 1つのメモリースティックを抜き差しして使う(めっちゃめんどい)

2014年を振り返り

とにかくCocos2d-x漬けな一年だったと思う。。。

Gitub

2014/12/31追記: GitHubの草活載せるの忘れてた。

Private込み

f:id:kyokomi:20141231150945p:plain

Private抜き

f:id:kyokomi:20141231151008p:plain

前半の差分は、ローグライクゲームの開発。さすがにリリース前に丸々コピーされてリリースされてもアレなので。 リリース後はソースも公開して面白可笑しく作っていければいいな〜とか思ってた。

後半は、ほとんどGoだと思う。素振りがメインで、なんか思いつきでツール作ったりGo麻雀とか放置ゲーのサーバーサイド(Go)とかとか

Private込みのシムシティ

jasonlong/isometric-contributions使って、シムシティっぽく見るとよくわかるけど、やっぱ土日のcommitが多い。

f:id:kyokomi:20141231151753p:plain

これが、来年どうなるか楽しみ。

Cocos2d-x

  • C++入門から始めたけど、中々難しかった
    • Cocos2d-x使うだけならとりあえず最低限の作法とかで大丈夫という知見を得た
  • 3.0alpha版からコツコツ触ってた
    • 環境構築と0.1VerUpするだけここまで変わって気が狂ういい経験になった
  • 2014年の上期はブログに乱投稿しまくってた
  • しょぼいbugfixだけどCocos2d-x本家に数回PullRequest送った (※1, ※2, ※3
    • OSS使うだけじゃなくて貢献するの楽しいなと思った
    • Author入るの楽しい
  • Cocos2d-x界隈の方々と交流して交友関係が広がった
    • 2回くらいオールで飲んだの忘れないと思う

Go

  • Goすごい気に入った
  • 勉強会とかカンファレンスにいけるだけ行った気がする
    • 次はなんかLTとか発表したい(ネタがなかった・・・)
  • 半年くらいコツコツGoで素振りしてた
  • Go覚えてすぐに勢いで書いた絵文字のライブラリがGithubスター26まで行った
  • ISUCON4予選にGoで出た(Go初見なチームメンバ、スマンカッタ。。。)

個人ゲーム開発

  • ローグライクゲーム結構ガッツリつくったけどゲームバランス妥協できずエターナった
    • データ作成が地獄だ
  • そんなにバランス考えなくていいという自分が興味薄い放置ゲーつくりはじめた
    • ちょっと飽きてる。コツコツやるとします
  • SRPGゲーが作りたい...

仕事

  • 本業はCocos2d-xでそこそこ個人活動での成果は出せた気がする
  • SlackとQiita:Teamを導入して啓蒙活動した
    • 社内AdventCalendarも埋まってよかった(非公開だけど)
  • 2年くらい同じ会社にいたけど、ろくに話したことない人々とTLで絡むようになって面白い

その他

  • アニメ視聴数は去年より増えてる
    • nasne導入と風呂でPSVitaを使って視聴など取り入れて効率良くなった
  • ゲーム購入してるけど、あまりやってないきがする
  • PC周辺機器とか椅子とか自宅環境を良くした
  • Amazon Kindleを積極的に使うようにして紙の本への依存が無くなってよかった
  • 高尾山三つ峠登った
  • 2年ぶりに実家に帰った

まとめ

とりあえず、Goに出会って今後の人生変わったと思う。 来年はCocos2d-xは一旦お休みして、Goメインで色々やっていく。 (でもUnityもちょっと触りたい感じもある)

なんかめっちゃ飲み行った方々、いろいろとお世話になりました。

来年もよろしくお願いします!!!!!!!!!!!

それでは、よいお年を!!!!!!!

ドッキングステーション ピッコロJUD530をしばらく使った感想

J5 create ドッキングステーション piccolo JUD530

J5 create ドッキングステーション piccolo JUD530

公式URLはこちら

ちなみに自分が使っているMacBookAir13インチの2012年Midモデルです。

USB3.0経由でドッキングステーションとしてHDMIVGA、サウンド、有線LANなどを提供してくれるすぐれものです。

買った理由

  • MacBookAir2012Midは、Thunderboltの口が1つしかない(ディスプレイ or 有線LANだった)
  • サブディスプレイが2台あるので2台繋ぎたかった

メモ

  • 有線LANは接続した時点でDriverインストール不要で使えた
  • HDMIのディスプレイに関してはDriverのインストールが必要(最初に記載した公式URLからダウンロードページへいくとダウンロードできます)

使ってみた感想

有線LANは全然ストレスなく使えてます。 HDMIのディスプレイ接続に関しては、すぐにやめました。 USB3.0経由だとどうしてもカクカクしてしまい。ディスプレイ切り替え関連の動作がすべて重くなってストレスに感じるためです。

しかも、Driverをインストールしているとディスプレイが未接続の状態でもドッキングステーション上にあると認識?しているためか、動作が重いままです。 そのため、有線LANしか使いたくない方は、公式のDriverインストーラーでUninstallすることをお勧めします。

最初なんで、Driverが分かれているんだろう?と思ったのですが、たぶんPCによっては重いので選べるようにということでしょうね。。。。

f:id:kyokomi:20141222194928p:plain

自分のMacが古くてスペック的に厳しいという可能性も高いので、 買い換えたいなーと思ってはいます・・・