Goのtext/templateで、”{{“と”}}”を出力する

Goのtext/templateで、delimiterとして使われる”{{“と”}}”が含まれる文字列を出力したい。

まずは基本的な使い方を確認。”{{“と”}}”で囲んだ箇所は評価される。

https://play.golang.org/p/o0Y5CaZpIMN

package main

import (
	"log"
	"os"
	"text/template"
)


func main() {
	t := `
{{ .Foo }}
`
	tpl, err := template.New("t").Parse(t)
	if err != nil {
		log.Fatal(err)
	}
	data := map[string]interface{}{
		"Foo": "aaa",
	}
	tpl.Execute(os.Stdout, data)
}

結果は次の通り。

aaa

さて、ここからが本題。text/templateを使って、{{ foo }} というテキストを得たい場合どうするか。

素朴にエスケープしてもうまくいかない。

https://play.golang.org/p/loznU_SgNU2

package main

import (
	"log"
	"os"
	"text/template"
)

func main() {
	t := `
\{\{ foo \}\}
`
	tpl, err := template.New("t").Parse(t)
	if err != nil {
		log.Fatal(err)
	}
	data := map[string]interface{}{
		"Foo": "aaa",
	}
	tpl.Execute(os.Stdout, data)
}

\が結果に含まれてしまうため、これでは駄目。

\{\{ foo \}\}

ではどうするかというと、次のようにdelimiterの中で文字列を評価することで実現できる。

https://play.golang.org/p/ko6-P7p86fo

package main

import (
	"log"
	"os"
	"text/template"
)

func main() {
	t := `
{{ "{{ foo }}" }}
`
	tpl, err := template.New("t").Parse(t)
	if err != nil {
		log.Fatal(err)
	}
	data := map[string]interface{}{
		"Foo": "aaa",
	}
	tpl.Execute(os.Stdout, data)
}

次のように、期待した結果が出力される。テンプレートがややこしくなり、読みにくくなるが…

{{ foo }}

delimiterを変えることでも実現できる。

https://play.golang.org/p/IPUxNVPrw5Y

package main

import (
	"log"
	"os"
	"text/template"
)

func main() {
	t := `
{{ foo }}
`
	tpl, err := template.New("t").Delims("[[", "]]").Parse(t)
	if err != nil {
		log.Fatal(err)
	}
	data := map[string]interface{}{
		"Foo": "aaa",
	}
	tpl.Execute(os.Stdout, data)
}

この場合でも、期待した結果を得られる。テンプレートはスッキリするが、delimiterが普段と違うとそれはそれで混乱する気がする。

{{ foo }}

知っているとすぐ読めるけど、知らないとどうなってるのこれ?とハマりそうだな、これ。

これまで買ったウォーターボトル、プロテインシェイカー、水筒を紹介

ザバス プロテインシェイカー

安かったのでザバスのプロテインと一緒に購入。シンプルな構造で飲み口が広く洗いやすいが、ふたを閉めないと持ち運ぶのは困難。

ブレンダーボトル ミキサー シェーカーボトル

次に買ったのはブレンダーボトルのシェーカーボトル。飲み口がワンタッチ式で飲みやすい。リング状の持ち手は指に引っ掛けて持ち運べるので便利。シェーク用のボールがついていてこれがよかった。ザバスのシェイカーと組み合わせて使ったりしている。

ナルゲン OTFボトル

ブレンダーボトルは気に入っていたのだけど、鞄に入れるには少し直径が大きい。ということでナルゲンのOTFボトルを購入。これもワンタッチ式の飲み口かつ指を引っ掛けられる持ち手がついている。水を入れて鞄に放り込んだりしている。

nalgene(ナルゲン) OTFボトル クリアグリーン 91393
nalgene(ナルゲン) (2015-07-13)
売り上げランキング: 4,978

京セラ セラブリッド

おまけ。水筒。コーヒー買いに行く時などに使っている。内側がセラミック加工されていて、匂いがつきにくいらしい。ホワイトを買ったのだけど、塗装が剥げるので次買うならシルバーにする。

Vaultをインメモリで起動してテストに使うテクニックの紹介

Hashicorp Vaultを扱うコードのテストを書く場合、Vaultへのアクセス部分をモックするかテスト時にVaultサーバーを起動するかのどちらかを選ぶことになる。今回は、テスト前にVaultをインメモリで起動する方法を紹介する。

テストのためのVaultのリポジトリの中には、テスト用のサーバーを起動する関数がいくつかある。これを使うことで、UnsealeされたVaultサーバーを使うことができる。

package foo

import (
  "testing"
  vhttp "github.com/hashicorp/vault/http"
  "github.com/hashicorp/vault/vault"
)

func Test_vault(t *testing.T) {
  core, _, token := vault.TestCoreUnsealed(t)
  ln, addr := vhttp.TestServer(t, core)
  defer ln.Close()

  // ここにVaultのAPIを使うテストを書く

}

ただし、この場合はKVSは使えるがPKIは使えない。PKIに関するテストを行いたい場合、vault.CoreConfigでバックエンドとしてPKIを指定する必要がある。

package foo

import (
  "testing"
  vhttp "github.com/hashicorp/vault/http"
  "github.com/hashicorp/vault/vault"
)

func Test_vault_with_pki(t *testing.T) {
  coreConfig := &vault.CoreConfig{
    LogicalBackends: map[string]logical.Factory{
      "pki": pki.Factory,
    },
  }
  core, _, token := vault.TestCoreUnsealedWithConfig(t, coreConfig)
  ln, addr := vhttp.TestServer(t, core)

  // ここにVaultのAPIを使うテストを書く

}

このように、インメモリでVaultを起動すればより本番環境に近い形でテストを行うこともできるし、別途Vaultを頑張って起動する必要もなくなる。便利なのでお試しください。

リモートワークのコツ

所属している会社が全社レベルの在宅勤務中で、現在3週間目である。僕はその前から割と自宅で仕事をしているので、リモートワークするコツを書いておく。

普段と同じルーティーンで生活する

在宅勤務だと通勤がないため、ギリギリまで寝て、起きたらそのまま仕事ということがあるかもしれない。しかし、個人的にはいつもと同じルーティーンで行動するのが良いと考えている。僕の場合は朝食をちゃんと食べてシャワーを浴びて、髭剃りなどをする。オフィスに行く日と同じ行動をすることで、自宅にいても仕事モードに切り替えることができる。在宅勤務だと1on1やミーティングでビデオカンファレンスを使うことが多い。家で仕事をしているからといって、休日のような見た目だとお互い気も入らないし、音声だけだとコミュニケーションに必要となる情報が落ちてしまい、仕事がやりにくくなると考えている。

歩き回る

在宅勤務していると思ったより動かない。ずっと座って仕事をしていると体が鈍るし疲れ切ってしまう。そこで、意識して立ったり少し歩いたりしている。AppleWatchだと定期的に歩行を促してくれるので、それを使うこともある。コーヒーを買いにコンビニやカフェまで散歩することもある。リモートワークだとPCの前に張り付いていないといけない気がしてくるが、オフィスにいても少し散歩したりコンビニに行ったりはするので自宅でも同じようにすれば良いと思う(離席していることがわかるようにしておくとGood)。

Slackで雑談する / 反応速度を上げる

リモートワークだと、どうしてもコミュニケーションの量は減る。他愛のない雑談からアイデアが生まれたり、気分転換になったりすることもあるだろう。そこで、少しだけ意識してSlackで雑談をするようにしている。とはいえ、Slackで会話ばかりしていても仕事は進まない(特にコードを書くような仕事はそうだね)ので、メリハリが大事だろう。

また、SlackやGithubでメンションをもらった時の反応速度は意識して上げるようにしている。リモートだと状況が見えないので、気づいていないのか、気づいてるけど後に回しているのかなどがわからず不安になる可能性があるかもしれない。ミーティングなどでどうしても手が空いていない時を除き、まずは返信して見ていることを伝えることが大事だと思い、出来るだけ早く反応することを心がけている(できないことも多いけど)。

作業環境を整える

作業用のデスクとチェアを専用に用意して、生活空間からは見えにくい場所に置いている。リモートワーク云々とは別に、個人的にコードを書いたり現像したりと作業するときに使うために用意していたものを使っている。また、ビデオカンファレンスもやりやすいよう、カメラから見える範囲に生活空間が含まれないようにも工夫している。

オフィスと同等レベルの作業環境を整えようとするとかなり金銭的な負担も大きい(まずスペースが必要だし、デスクにチェア、モニター、ネット回線など色々必要となるだろう)ので誰にでも薦められるものではないが、参考となれば幸いである。

おわりに

他にもコツがあれば書き足していこうと思う。あなたのリモートワークのコツは何ですか?

「Kubernetesで実践するクラウドネイティブDevOps」のレビューをした

2020年2月19日に「Kubernetesで実践するクラウドネイティブDevOps」という書籍が発売されるのだが、レビュアーとしてお手伝いした。レビューとはいえ、雑誌ではない商業誌に関わったのは初めてなのでいい経験ができたと思う。ぜひ読んでみてください。

Kubernetesで実践するクラウドネイティブDevOps
John Arundel Justin Domingus
オライリージャパン
売り上げランキング: 1,870