Go tipでなにが行われてる?(2013-09-07)
What's happening in Go tip (2013-09-07)よりメモ。
前回のメモはこちら: http://atotto.hatenadiary.jp/entry/2013/08/31/202919
(以下、間違い/勘違いがあるかもしれないので注意してね)
What's happening in Go tip (2013-09-07)
compress/flate
のWriterが再利用可能にtext/template
の改善database/sql
のコネクションプールがより調整可能に- ツールの変更
compress/flate
のWriterが再利用可能に
新しく追加されたReset()
メソッドで新しくメモリ割り当てをしなくてもWriterをリセットできるようになった。速度も向上してる。
text/template
の改善
text/template
とその拡張html/template
でテンプレートの記述がより簡単になる。
詳細は原文参照。
ツールの変更
go doc の廃止
godoc
とgo doc
は似てるようで違うもので、go doc
の方が機能が制限されてた。
godoc
が拡張されるのにともなって削除とあいなった。
gitリポジトリのためのgo get
Go1.2でgo get
はgitリポジトリを適切にクローンする。go get -u
でgit pull
をするようになる。
Go1.2にアップデートしたらgo get -u
で新しいフォーマットに自動的に更新される。
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)
- 作者: Mark Summerfield
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2012/05/01
- メディア: Kindle版
- この商品を含むブログを見る
golintをemacsで使う
プロジェクトはこちら: https://github.com/golang/lint
導入は:
$ go get -u github.com/golang/lint/golint
で、基本的な使い方は:
$ golint main.go
などとすれば解析結果がでてきます。
vimはmattnさん(@mattn_jp)が追加したプラグインを使えば大丈夫です(導入方法はREADMEを参照のこと)。ですがemacs版はなかったので、先日追加しました。
golintをemacsで使う
既にgolintを使っている人はgo get
に-u
を付けてアップデートしてください:
$ go get -u github.com/golang/lint/golint
emacsの設定ファイルには以下を追加すればOKです:
(add-to-list 'load-path (concat (getenv "GOPATH") "/src/github.com/golang/lint/misc/emacs")) (require 'golint)
emacsにGOPATHなどの環境変数が渡っていないとエラーになります。
話がずれますが、OSX用のEmacsを使っていてシェルの環境変数がEmacsへ渡らないとお困りの方は、例えば こんなのを作ってシェルからEmacsを起動するといいと思います。
使い方
Go言語のプログラムを編集中にM-x golint
すれば解析が走り、C-x `で警告が出ている箇所へジャンプします。ベースは Compilation Mode を使っています。
スクリーンショットはこちら:
その他の使い方は http://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation-Mode.html を参照してください。
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)
- 作者: Mark Summerfield
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2012/05/01
- メディア: Kindle版
- この商品を含むブログを見る
A Tour of Go日本語版を更新しました
本家の更新に追従してA Tour of Go を更新しました。
主な変更は以下のとおりです:
あまり大きな変更はありませんが、スライドが追加されたことで、途中のスライドでブクマしているユーザは内容がずれてしまってます。あしからず。。
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)
- 作者: Mark Summerfield
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2012/05/01
- メディア: Kindle版
- この商品を含むブログを見る
Go tipでなにが行われてる?(2013-08-30)
What's happening in Go tip (2013-08-30)よりメモ。
前回のメモはこちら: http://atotto.hatenadiary.jp/entry/2013/08/24/214941
(以下、間違い/勘違いがあるかもしれないので注意してね)
What's happening in Go tip (2013-08-30)
- より安全に
- GIF画像のエンコーディングをサポート
- zipの圧縮方法の選択肢が増える
- MD5とSHAでハッシュがより簡単に
- go get -tで依存関係のテスト
より安全に
Go is becoming a better citizen ← タイトルの訳し方がわからなかった。。
メモリの割り当てに関する話。
- 64bitシステムで1GB、32bitシステムで250MBのスタックサイズの制限が入る(?)
- 10MBを超える全ての変数はヒープへ移動する
runtime/debug.SetMaxThreads()
を通してスレッドの数を設定する- DNSルックアップの???
GIF画像のエンコーディングをサポート
これまで、GIFはデコードだけだったけど、Go 1.2でGIFエンコーダが実装される。
image/draw
パッケージに2つのインターフェースが追加されてる:
* Drawer
インターフェース
* Quantizer
インターフェース
みんな大好きGIFアニメーションは、新しいエンコーダのEncodeAll
関数にある。
zipの圧縮方法の選択肢が増える
archive/zip
ではこれまで圧縮方法がハードコードされてた。
zipの仕様では、11の圧縮方法がある。
Goは2つ(DEFLATE、stored)だけサポートしてる。
今回の変更でarchive/zip
を直接修正しなくても新しい圧縮方法を追加することができるようになる。
MD5とSHAでハッシュがより簡単に
data := []byte(`hello, world`) h := sha1.New() h.Write(data) hash := h.Sum(nil) fmt.Printf("H(data) = %x\n", hash) // Output: H(data) = b7e23ec29af22b0b4e41da31e868d57226121c84
↓ Go 1.2でこうなる。
data := []byte(`hello, world`) hash := sha1.Sum(data) fmt.Printf("H(data) = %x\n", hash) // Output: H(data) = b7e23ec29af22b0b4e41da31e868d57226121c84
go get -tで依存関係のテスト
go get
に依存関係をテストする-t
オプションが追加される。
ひとまずおしまい。。
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)
- 作者: Mark Summerfield
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2012/05/01
- メディア: Kindle版
- この商品を含むブログを見る
Redmineのチケットにテンプレートを入れる(プラグイン不要) #redmine #redminejp
Redmineのチケットにテンプレートを埋め込みます。 ここで紹介する方法はプラグイン不要ですので、簡単に運用できるとおもいます。
結論からいうと、チケット作成ページのURLにクエリパラメータ(クエリ文字列)を付け足します。
では、さっそく試してみましょう。
Redmine デモサイト へログインした後、以下のURLをクリックしてみてください:
すると:
となり、見事にテンプレートをいれることに、成功しました。 このようなリンクをチームで展開しておけば捗りますね。
URLのクエリパラメータ(?
以降の部分)を自分のプロジェクトのチケット作成画面のURLに付ければ使えます:
?issue[subject]=XXX:&issue[description]=h2%2e%20%E7%8F%BE%E8%B1%A1%0d%0a%0d%0ah2%2e%20%E5%86%8D%E7%8F%BE%E6%89%8B%E9%A0%86%0d%0a%0d%0ah2%2e%20%E5%8E%9F%E5%9B%A0%0d%0a%0d%0ah2%2e%20%E5%AF%BE%E7%AD%96%0d%0a
チケット登録時に使えるクエリパラメータまとめ
以下にクエリパラメータをまとめておきます:
クエリ | 内容 |
---|---|
issue[tracker_id]= | トラッカーID(int: 1...) |
issue[subject]= | 題名(stirng) |
issue[description]= | 説明(stirng) |
issue[status_id]= | ステータスID(int: 新規=1, 進行中=2, 解決=3, フィードバック=4, 終了=5) |
issue[category_id]= | カテゴリID(int) |
issue[priority_id]= | 優先度 (int: 低め=3, 通常=4, 高め=5, 急いで=6, 今すぐ=7 |
issue[assigned_to_id]= | 担当者ID(int) |
issue[fixed_version_id]= | 対象バージョン(int) |
issue[parent_issue_id]= | 親チケットID(int) |
issue[start_date]= | 開始日(%Y-%m-%d) |
issue[due_date]= | 期日(%Y-%m-%d) |
issue[estimated_hours]= | 予定工数(float) |
issue[done_ratio]= | 進捗%(int: 0, 10, 20, ..., 100) |
issue[watcher_user_ids][]= | チケットのウォッチャー(int) |
issue[custom_field_values][0]= | カスタムした内容の0番目 |
※ stringで記述する部分はURLエンコードしておく必要があります
各クエリを&
で接続すれば、全ての要素を指定できます。
便利なクエリパラメータを作って時間を節約しましょう!
参考資料:
他の方法
今回紹介した方法以外にもテンプレートを定義する方法もあります:
- bookmarkletを使う方法: clmemo@aka: Redmine の「説明」にテンプレート・テキストを挿入する bookmarklet を作った
- Issue Template Pluginを入れて使う方法: 新規チケットに自動で文字を入れておくために、Issue Templateをインストール - yuriken27's blog
おしまい。
- 作者: 前田剛
- 出版社/メーカー: 秀和システム
- 発売日: 2012/08
- メディア: 単行本
- 購入: 2人 クリック: 2回
- この商品を含むブログ (2件) を見る
- 作者: 小川明彦,阪井誠
- 出版社/メーカー: 翔泳社
- 発売日: 2010/10/13
- メディア: 大型本
- 購入: 16人 クリック: 337回
- この商品を含むブログ (51件) を見る
- 作者: 倉貫義人,栗栖義臣,並河祐貴,前田直樹
- 出版社/メーカー: インプレスジャパン
- 発売日: 2009/07/24
- メディア: 単行本
- 購入: 6人 クリック: 245回
- この商品を含むブログ (31件) を見る
- 作者: 小川明彦,阪井誠
- 出版社/メーカー: 翔泳社
- 発売日: 2012/08/24
- メディア: 大型本
- クリック: 31回
- この商品を含むブログ (7件) を見る
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者: 山本陽平
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)
- 購入: 143人 クリック: 4,320回
- この商品を含むブログ (172件) を見る
Go tipでなにが行われてる?(2013-08-23)
What's happening in Go tip (2013-08-23)よりメモ。
前回のメモはこちら:http://atotto.hatenadiary.jp/entry/2013/08/19/083830
(以下、間違い/勘違いがあるかもしれないので注意してね)
What's happening in Go tip (2013-08-23)
- スライスの新しいシンタックス
- パフォーマンス向上
- 高速な定数時間 P-256 楕円曲線の追加
- godocはどこへ??
スライス
Go 1.2で追加されるなかでもちょっと議論になる内容。
mySlice[i:j]
とするとi
からj
までの新しいスライスが生成されます。
mySlice
と新しいスライスは共有しており、操作するともう一方にも影響があります。
これはちゃんと期待された振る舞いです。
気づいてないかもしれないけど、2つのスライスは容量も共有してます。
スライスは"長さ"と"容量"をもっている、つまり、スライスの要素の数見られるし、要素の数潜在的にアクセスできる。
容量はappend()
を使うときに関係する。
スライスへappendするとき、
基礎となる配列(容量)に十分な空きがあるかチェックします。
もしあれば、同じ配列、同じメモリに新しいスライスを大きな"長さ"で作成します。
code: http://play.golang.org/p/rvV8gLTPvZ
append()
は不思議な結果になる。オリジナルのスライスを書き換えちゃう。
安全な代替は、まだ自前のメモリアロケータを実装を許すことだけど、
無造作なメモリ汚染の防止は、返すスライスの容量を制限すること、
appendは作用できないメモリの更新をしないようにすることだろう。
それで、新しい代替は、スライスの新しいシンタックス mySlice[i:j:k]
です。
(最初の2つの要素はこれまでどおり、i
からj
へのスライス。
3つ目の要素は容量(k-i
として計算)に影響する)
k-i
の容量は、単にk
は、
新しいスライスで作用可能にする基礎となる配列への絶対的なインデックスを意味する。
k
をj
と同じにすることで、その長さを超えて作用できません。
これで、メモリのN
バイトを返すというアロケータを書くことができ、
これ以上先を見せることを防ぐことが出来ます。
パフォーマンス向上
- net/httpパッケージのパフォーマンス向上
- JSONエンコーディングの高速化
- ZIP圧縮の高速化
- HTTPの改善
- DNS Lookupの複数アクセス時の統合
sync.Cond
の高速化- DES暗号化の高速化
- bzip2圧縮の高速化
io.Copy
の高速化
高速な定数時間 P-256 楕円曲線の追加
定数時間 P-256 楕円曲線 (constant-time P-256 elliptic curves)
定数時間ってのが大事な点で、 全ての入力に対して関数のとる時間が同じなので、 タイミングアタック(Timing attack - Wikipedia, the free encyclopedia)を避けることができる。 タイミングアタックは、サイドチャネルアタック(Side channel attack - Wikipedia, the free encyclopedia)のひとつで、タイミングの情報は暗号化を破るために使われる。
godocはどこへ??
Go tipを使うと godoc が動きません。というか、godoc は無くなりました。 残っているgodocを使うと次のようにエラーがでるでしょう:
readTemplate: open /Users/rsc/g/go/lib/godoc/codewalk.html: no such file or directory
godocはgo.tools
のサブリポジトリへ引っ越したので:
$ go get code.google.com/p/go.tools/cmd/godoc
として取ってくる必要があります。
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)
- 作者: Mark Summerfield
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2012/05/01
- メディア: Kindle版
- この商品を含むブログを見る
コンパイル時に特別な文字列情報を入れるには #golang
Go言語の話題です。
コンパイル時にフラグを与えることで、ソースコード上の特定の文字列情報を書き換えることができます。 これを応用すれば、例えば、バージョンやリビジョン番号などの特別な文字列情報を後で指定するといった使い方ができます。
以下、例を書いてみました(version.go):
package main import ( "fmt" ) var version string func main() { fmt.Println(version) }
versionの変数が定義されていますが、情報を持っていません。 ここで:
$ go build -ldflags "-X main.version 0.1" version.go
としてコンパイルして実行してみます。すると:
$ ./version 0.1
と出力されます!
ちなみに、 -ldflags
でGoのリンカに対して引数を与えます。
-ldflags
に渡せる引数は:
$ go tool 6l
とすると一覧が表示できます。(6lなのか8lなのか、環境で違います。go tool -n
を使ってコマンドを確かめましょう。)なお、ここにもヘルプが書かれています: ld - The Go Programming Language
他にも使い方が考えられますので、いろいろと試してみてください。
本日のgist: version.go
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)
- 作者: Mark Summerfield
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2012/05/01
- メディア: Kindle版
- この商品を含むブログを見る