iPhoneのパスワード自動補完で1Passwordが使えることに気づいたので設定した

iPhoneのSafariから1Passwordを使う時、これまではシェアボタンから起動していたのだけど、結構面倒。どうにかならんかなと思っていたら、自動補完設定に気づいたので設定した。

設定方法は1Passwordアプリが説明してくれるのでその通りにする。

すると、ページを開いたタイミングですぐにサジェストされる。ログインする場合はボタンを押せばFaceIDで認証してログインできる。

これはもっと早く知りたかった…

リモートワークでビデオMTGする時に使っている機材

リモートワークを始めた人がマイクやカメラについて調べているのをちょくちょく見るので、自分が使っている機材を晒しておく。

ロジクール ウェブカメラ C920r

カメラはこれ。Macbookをクラムシェルで使っているので、外付けのカメラが欲しくて購入した。ちょっと画角が広くて、一人で使うには顔が遠く見えてしまうのが欠点(というほどでもないけど)。モニタの上に置いて使っている。

ディアルマイク内蔵で、割と音質は良さそう。

Micolindun MG-2 ゲーミング イヤホン

リモートワークを始めた時、とりあえずマイク付きイヤホンを買おうと思って適当に買った。まぁ普通ですね。着脱式のマイクが付いている。

AirPods Pro

リモートワーク用に買ったのではないのだけど、軽くてマイク性能割といいので使っている。

Apple AirPods Pro
Apple AirPods Pro
posted with amazlet at 20.02.18
Apple(アップル) (2019-10-30)
売り上げランキング: 46

使い分け

完全に気分で使い分けている。音が気になる時はイヤホンで、それ以外はウェブカメラとモニタのスピーカー使うくらいかなー。僕と通話してる人で聞き取りにくいということがあったら教えてください。

デスクや椅子なども含めた環境については https://scrapbox.io/rtakaishi/自宅の作業環境、デスク周りのまとめ を参照してほしい。

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を頑張って起動する必要もなくなる。便利なのでお試しください。