Goのテンプレート言語egoを使ってみた
golangのtext/template最近ようやく慣れてきたけど、
やっぱり{{}}
が増えてくると辛いので、他のパッケージに手をだしてみました。
egoが触った中で一番しっくりきたのと、一通り色々なことができそうな気配を感じたので気に入りました。
インストール
go get
だけでOKです。
$ go get github.com/benbjohnson/ego
egoを呼び出すソースコード
ディレクトリ構成
├── main.go └── templates └── sample.ego
templates/sample.ego
は、ego用のtemplateファイル。拡張子.ego
じゃないとダメです。
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の使い方とかは以下などを参考にしていただければと。
アセット的なアレを実行バイナリ内に入れる話。 — さにあらず
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)を作った
docomoのAPIを利用する目的で作ったGo製のライブラリです。 各API叩いてるだけなので、特別なにかやってるとかはないです。
今のところ以下のAPIに対応しています。
- 雑談対話
- 知識Q&A
- トレンド記事抽出
ライブラリの構成とかはgo-githubを参考に作りました。
docomo API
docomoAPIを利用するには、以下でDeveloper登録が必要です。 Google+とかFacebookとかのSNSアカウントでログイン対応してるので、すぐAPIを触れます。
docomo Developer support | NTTドコモ
docomoAPI
※詳しくは公式APIドキュメントを見ていただければと
利用例
大体こんな感じに使われてます。
以下の記事を見て自分もGoでやってみたいなーと思いました。
go-docomoでつくったGo製のSlackbot
いーすんさん可愛い!!!
雑なソースコードはこちら ↓
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
- 出版社/メーカー: 諏訪田製作所
- メディア: ヘルスケア&ケア用品
- 購入: 2人 クリック: 9回
- この商品を含むブログを見る
確かに切れ味もよくて爪も飛び散らないいい感じ。 うまく切れた指はヤスリ掛け不要だった。
タブレットPC対応フレキシブルマウントアームスタンド
オウルテック 新しいiPad/Nexus7対応タブレットPC対応フレキシブルマウントアームスタンド シルバー OWL-MAFA03
- 出版社/メーカー: オウルテック
- 発売日: 2012/10/17
- メディア: Personal Computers
- 購入: 1人 クリック: 1回
- この商品を含むブログを見る
いい感じ!!! pic.twitter.com/vUgC8wmfdv
— きょこみ (@k_yokomi) 2014, 11月 23
と思っていたが。。。
Nexus9結構持ち歩くので、いちいちセットアップするの面倒いとかで結局ほとんど使ってない。
Qiチー対応ワイヤレス充電器(USB供給)
Qiチー対応ワイヤレス充電器(USB供給)スマホ タブレット 置くだけ充電器
- 出版社/メーカー: Remarks Japan
- メディア: エレクトロニクス
- この商品を含むブログを見る
値段的にもコスパ高くて、買って良かった。
注意点:
- ケーブル指して充電するより充電速度が遅い
- ケーブル指して充電するより端末が熱くなる
サイクロン式 2in1スティッククリーナー
ツカモトエイム ecomo サイクロン式 2in1スティッククリーナー(ショコラブラウン) AIM-SC11-BR
- 出版社/メーカー: Tsukamoto Aim
- 発売日: 2014/04/08
- メディア: ホーム&キッチン
- この商品を含むブログを見る
5年使った3980円の掃除機と別れを告げた。
吸引力が違うので時間かからないのと、コードレスなのでちょっとゴミを見かけたらサッと掃除機掛けれるのが良い。
PlayStation Vita TV (VTE-1000AB01)
PlayStation Vita TV (VTE-1000AB01)
- 出版社/メーカー: ソニー・コンピュータエンタテインメント
- 発売日: 2013/11/14
- メディア: Video Game
- この商品を含むブログ (24件) を見る
PSVitaのゲームたまに家でガッツリやるときがあるので、勢いで買ってみた。
バリューパック買わなかったの失敗した。した。。。した。。。
PS3のコントローラーあるし〜とか思ってたけど、コントローラのケーブルを刺さないと操作できないのでいちいち抜き差しするのが面倒でお蔵入りしそう。
47型テレビで使うと少し画質が悪いのが目立つけど、特別こだわりがなければ問題ない。
セーブデータに関しての注意点:
- PlayStation®Plusを登録してセーブデータを預ける(お金かかる)
- nasneにセーブデータをコピーして上書きする(めんどい)
- 1つのメモリースティックを抜き差しして使う(めっちゃめんどい)
2014年を振り返り
とにかくCocos2d-x漬けな一年だったと思う。。。
Gitub
2014/12/31追記: GitHubの草活載せるの忘れてた。
Private込み
Private抜き
前半の差分は、ローグライクゲームの開発。さすがにリリース前に丸々コピーされてリリースされてもアレなので。 リリース後はソースも公開して面白可笑しく作っていければいいな〜とか思ってた。
後半は、ほとんどGoだと思う。素振りがメインで、なんか思いつきでツール作ったりGo麻雀とか放置ゲーのサーバーサイド(Go)とかとか
Private込みのシムシティ版
jasonlong/isometric-contributions使って、シムシティっぽく見るとよくわかるけど、やっぱ土日のcommitが多い。
これが、来年どうなるか楽しみ。
Cocos2d-x
- C++入門から始めたけど、中々難しかった
- Cocos2d-x使うだけならとりあえず最低限の作法とかで大丈夫という知見を得た
- 3.0alpha版からコツコツ触ってた
- 環境構築と0.1VerUpするだけここまで変わって気が狂ういい経験になった
- 2014年の上期はブログに乱投稿しまくってた
- しょぼいbugfixだけどCocos2d-x本家に数回PullRequest送った (※1, ※2, ※3)
- Cocos2d-x界隈の方々と交流して交友関係が広がった
- 2回くらいオールで飲んだの忘れないと思う
Go
- Goすごい気に入った
- 勉強会とかカンファレンスにいけるだけ行った気がする
- 次はなんかLTとか発表したい(ネタがなかった・・・)
- 半年くらいコツコツGoで素振りしてた
- Go覚えてすぐに勢いで書いた絵文字のライブラリがGithubスター26まで行った
- ISUCON4予選にGoで出た(Go初見なチームメンバ、スマンカッタ。。。)
個人ゲーム開発
- ローグライクゲーム結構ガッツリつくったけどゲームバランス妥協できずエターナった
- データ作成が地獄だ
- そんなにバランス考えなくていいという自分が興味薄い放置ゲーつくりはじめた
- ちょっと飽きてる。コツコツやるとします
- SRPGゲーが作りたい...
仕事
- 本業はCocos2d-xでそこそこ個人活動での成果は出せた気がする
- SlackとQiita:Teamを導入して啓蒙活動した
- 社内AdventCalendarも埋まってよかった(非公開だけど)
- 2年くらい同じ会社にいたけど、ろくに話したことない人々とTLで絡むようになって面白い
その他
- アニメ視聴数は去年より増えてる
- nasne導入と風呂でPSVitaを使って視聴など取り入れて効率良くなった
- ゲーム購入してるけど、あまりやってないきがする
- ネプテューヌRebirth1,2はクリアした。良かった
- PC周辺機器とか椅子とか自宅環境を良くした
- Amazon Kindleを積極的に使うようにして紙の本への依存が無くなってよかった
- 高尾山と三つ峠登った
- 2年ぶりに実家に帰った
まとめ
とりあえず、Goに出会って今後の人生変わったと思う。 来年はCocos2d-xは一旦お休みして、Goメインで色々やっていく。 (でもUnityもちょっと触りたい感じもある)
なんかめっちゃ飲み行った方々、いろいろとお世話になりました。
来年もよろしくお願いします!!!!!!!!!!!
それでは、よいお年を!!!!!!!
ドッキングステーション ピッコロJUD530をしばらく使った感想
J5 create ドッキングステーション piccolo JUD530
- 出版社/メーカー: J5 create
- 発売日: 2014/11/20
- メディア: Personal Computers
- この商品を含むブログを見る
公式URLはこちら
ちなみに自分が使っているMacBookAir13インチの2012年Midモデルです。
USB3.0経由でドッキングステーションとしてHDMIやVGA、サウンド、有線LANなどを提供してくれるすぐれものです。
買った理由
- MacBookAir2012Midは、Thunderboltの口が1つしかない(ディスプレイ or 有線LANだった)
- サブディスプレイが2台あるので2台繋ぎたかった
メモ
- 有線LANは接続した時点でDriverインストール不要で使えた
- HDMIのディスプレイに関してはDriverのインストールが必要(最初に記載した公式URLからダウンロードページへいくとダウンロードできます)
使ってみた感想
有線LANは全然ストレスなく使えてます。 HDMIのディスプレイ接続に関しては、すぐにやめました。 USB3.0経由だとどうしてもカクカクしてしまい。ディスプレイ切り替え関連の動作がすべて重くなってストレスに感じるためです。
しかも、Driverをインストールしているとディスプレイが未接続の状態でもドッキングステーション上にあると認識?しているためか、動作が重いままです。 そのため、有線LANしか使いたくない方は、公式のDriverインストーラーでUninstallすることをお勧めします。
最初なんで、Driverが分かれているんだろう?と思ったのですが、たぶんPCによっては重いので選べるようにということでしょうね。。。。
自分のMacが古くてスペック的に厳しいという可能性も高いので、 買い換えたいなーと思ってはいます・・・