i++

プログラム系のメモ書きなど

golang

golang : template で変数を利用した前後のスペース、改行をなくす

go の text/template パッケージの Text and Spaces に書かれているとおり、前のスペースをなくすには {{- を、後ろのスペースをなくすには -}} のように - をつける(アクセスする変数と - の間のスペースは必須で、括弧と - の間にスペースはいれてはいけ…

golang : ブラウザを開く

pkg/browser パッケージを使用する。ローカルの html ファイルや URL 指定などが可能。 github.com

golang : json の pretty print (タブやスペースの指定)

json.Encoder の SetIndent を使用するか、json.MarshalIntent を使用する。以下は前者の例。 func writePrettyJson(filePath string, v interface{}) error { f, err := os.Create(filePath) if err != nil { return err } defer f.Close() enc := json.New…

golang : RSA キーを含む pem ファイルの読み込み

秘密鍵の読み込み RSA の秘密鍵の pem ファイルは BEGIN RSA PRIVATE KEY で始まる場合(PKCS#1)と BEGIN PRIVATE KEY で始まる場合(PKCS#8)があり、前者の場合は x509.ParsePKCS1PrivateKey を、後者の場合は x509.ParsePKCS8PrivateKey を使ってパースす…

golang : gmail でメールを送信する

#golang メールを送信するには の通りにやれば良い。 ただし、2段階認証を有効にしている場合には <password> の部分にアプリパスワードを使う必要がある。アプリパスワードの発行 はリンク先から。アプリパスワードについての説明は アプリ パスワードでログイン 辺り</password>…

golang : 見た目が同じ長さの文字列を作成する(等幅フォント)

等幅フォントで表示する時に同じ長さに見えるような文字列を生成する。 // "github.com/mattn/go-runewidth" を使用。 func makeFixedWidthString(str string, length int) string { var buffer bytes.Buffer l := 0 for _, c := range str { cl := runewidt…

golang : csv.Reader の "wrong number of fields in line" を無視する

Read() を実行する前に FieldsPerRecord を -1 に設定する。 reader := csv.NewReader(f) reader.Comma = '\t' reader.FieldsPerRecord = -1 // これ for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } // 処理.…

golang : 固定長文字列出力フォーマット

%(文字数).(文字数)s のような形で、最大精度と最小精度を指定する。. の左側の数字の前に - を付けると左詰め、付けないと右詰め。 // 例えば50文字(左詰め)で固定。 fixedLengthString = fmt.Sprintf("%-50.50s", s)

golang : eval (数式の evaluation)を行う

go/token パッケージ、go/types パッケージ、go/constant パッケージを使用します。 import ( "fmt" "go/token" "go/types" "go/constant" ) fs := token.NewFileSet() tv, err := types.Eval(fs, nil, token.NoPos, "1 + 2 * 3 % 4") if err != nil { fmt.P…

golang : template の range で index を使う

以下の様なデータを template.Execute のデータに渡したとすると type data struct { Values []string OtherValues []string } テンプレートで <ul> {{range $i, $v := .Values}} <li>{{index $.OtherValues $i}} のようにするとインデックスでアクセスできる( Othe</li></ul>…

golang : コミット時に gofmt を実行する(pre-commit hook)

misc/git/pre-commit - The Go Programming Language を参考に作成しました。 オリジナルではフォーマットされていないコードがある場合にコミットを中断していますが、以下のスクリプトでは gofmt を実行して git add するところまでやっています。 #!/bin/…

golang : URL短縮サービス goo.gl を使う

URL Shortener API の使い方はこちら → URL Shortener。 ここでは API Key を使った方法を載せています。 type responseParam struct { Kind string `json:"kind"` Id string `json:"id"` LongUrl string `json:"longUrl"` } func GetShortenedUrlImpl(longU…

golang : 日本語(マルチバイト)文字を含む string の substring

go では string のスライスは byte として扱われるので、日本語のようにマルチバイト文字を含んだ文字列 str に対して str[start:start+length] のようなことをすると、思わぬ場所が切り取られてしまいます。 この問題を回避するために、一旦 rune にキャス…