memoメモ

最近はGo言語関連で。φ(..)メモメモ

Go tipでなにが行われてる?(2013-09-07)

What's happening in Go tip (2013-09-07)よりメモ。

前回のメモはこちら: http://atotto.hatenadiary.jp/entry/2013/08/31/202919

gopher

(以下、間違い/勘違いがあるかもしれないので注意してね)

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 の廃止

godocgo docは似てるようで違うもので、go docの方が機能が制限されてた。 godocが拡張されるのにともなって削除とあいなった。

gitリポジトリのためのgo get

Go1.2でgo getはgitリポジトリを適切にクローンする。go get -ugit pullをするようになる。

Go1.2にアップデートしたらgo get -uで新しいフォーマットに自動的に更新される。

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る
基礎からわかる Go言語

基礎からわかる Go言語

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

golintをemacsで使う

golintはGo言語用のlintプログラムです。

プロジェクトはこちら: 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 を参照してください。

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る
基礎からわかる Go言語

基礎からわかる Go言語

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

A Tour of Go日本語版を更新しました

本家の更新に追従してA Tour of Go を更新しました。

主な変更は以下のとおりです:

あまり大きな変更はありませんが、スライドが追加されたことで、途中のスライドでブクマしているユーザは内容がずれてしまってます。あしからず。。

基礎からわかる Go言語

基礎からわかる Go言語

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Go tipでなにが行われてる?(2013-08-30)

What's happening in Go tip (2013-08-30)よりメモ。

前回のメモはこちら: http://atotto.hatenadiary.jp/entry/2013/08/24/214941

gopher

(以下、間違い/勘違いがあるかもしれないので注意してね)

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オプションが追加される。

ひとまずおしまい。。

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る
基礎からわかる Go言語

基礎からわかる Go言語

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Redmineのチケットにテンプレートを入れる(プラグイン不要) #redmine #redminejp

Redmineのチケットにテンプレートを埋め込みます。 ここで紹介する方法はプラグイン不要ですので、簡単に運用できるとおもいます。

結論からいうと、チケット作成ページのURLにクエリパラメータ(クエリ文字列)を付け足します。

では、さっそく試してみましょう。

Redmine デモサイト へログインした後、以下のURLをクリックしてみてください:

https://my.redmine.jp/demo/projects/demo/issues/new?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

すると:

f:id:atotto:20130827210024p:plain

となり、見事にテンプレートをいれることに、成功しました。 このようなリンクをチームで展開しておけば捗りますね。

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エンコードしておく必要があります

各クエリを&で接続すれば、全ての要素を指定できます。 便利なクエリパラメータを作って時間を節約しましょう!

参考資料:

他の方法

今回紹介した方法以外にもテンプレートを定義する方法もあります:

おしまい。

入門Redmine 第3版

入門Redmine 第3版

Redmineによるタスクマネジメント実践技法

Redmineによるタスクマネジメント実践技法

Redmine -もっと手軽にプロジェクト管理!

Redmine -もっと手軽にプロジェクト管理!

チケット駆動開発

チケット駆動開発

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Go tipでなにが行われてる?(2013-08-23)

What's happening in Go tip (2013-08-23)よりメモ。

前回のメモはこちら:http://atotto.hatenadiary.jp/entry/2013/08/19/083830

gopher

(以下、間違い/勘違いがあるかもしれないので注意してね)

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は、 新しいスライスで作用可能にする基礎となる配列への絶対的なインデックスを意味する。 kjと同じにすることで、その長さを超えて作用できません。 これで、メモリの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)のひとつで、タイミングの情報は暗号化を破るために使われる。

補足資料:サイドチャネル攻撃 - Wikipedia

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

として取ってくる必要があります。

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る

基礎からわかる Go言語

基礎からわかる Go言語

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

コンパイル時に特別な文字列情報を入れるには #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

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る
基礎からわかる Go言語

基礎からわかる Go言語

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Programming in Go: Creating Applications for the 21st Century (Developer's Library)