Skip to main content

常にいまいち

[Golang] deferでerrorを参照しようとしてハマった

概要

関数が返したerrorをdeferを使ってキャプチャしようとしたらハマったのでメモ。

起こったこと

関数でエラーが発生したらそれをログに残そうとしていたとき、以下のようなコードを書いてしまった。

func Execute() error {
	var err error
	defer func() { SendErrIfExists(err) }()

	err = DoSomething()
	if !errors.Is(err, ErrCanIgnore) {
		return err
	}

	return nil // ここに来たらSendErrIfExistsの引数はnilになって欲しい
}

このコードでDoSomethingがErrCanIgnoreを返すとエラーログにはしっかりとErrCanIgnoreが記録されてしまった。 原因は以下の2点。

  • deferで実行される関数がerr変数を含むクロージャとなっている
  • クロージャが参照しているerr変数に入った値がErrCanIgnoreのまま

[BigQuery] 抽出対象から一部のカラムを除く

select * from `dataset`; みたいなクエリを実行する時に select * except(`column1`) from `dataset`; とするとcolumn1が抽出結果から除外される。 JOINした際に同名カラムを除外するときなどに役に立つ。 参照 https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax?hl=ja#except

Kubernetesのenvは後勝ち

例えば以下のようにconfigmapとenvを併用するケース。 envFrom: - configMapRef: name: test-config env: -name: TEST value: "OVERRIDE" この順で書くとtest-configに TEST: DEFAULT などと定義されていてもTEST: OVERRIDE となる。 逆順で書けばtest-configに定義された値が優先される。 基本的には同一キーを定義しないほうが混乱が少なくてよいが、覚えておくと緊急時に一時的に上書きして対処できたりする。 参考 https://stackoverflow.com/questions/54398272/override-env-values-defined-in-container-spec

Go関連のTips

全部go1.14.3で検証したもの。 部分文字列の切り出し stringsパッケージにも部分文字列の切り出しを行うメソッドはないので、slice操作と同じようにして行う。 このとき注意がいるのが、マルチバイト文字の取り扱い。 単純に以下のようにすると3文字分ではなく3バイト分になる。 s := "あいうえお" fmt.Println(s[:3]) https://play.golang.org/p/ZHXH9FEneRJ 3文字分取り出したい場合は rune を使用する。 s := "あいうえお" fmt.Println(string([]rune(s)[:3])) https://play.golang.org/p/U1rbOpQ8H3c 参考 https://qiita.com/seihmd/items/4a878e7fa340d7963fee nilへの型アサーション 型付きnilなら型アサーションができる。 if _, ok := (interface{})(nil).(int); !ok { fmt.Println("no") // これが表示される } そのため、nilが返ってくる可能性のある関数の返り値に直接型アサーションを実行できる。 例えばこんな感じ。 if _, ok := New().(MyInterface); !ok { fmt.Println("nil") } https://play.golang.org/p/ExqB3G-1rN_-

GCSへのアクセス制御(特定ドメインのアカウントだけにアクセスを許可する)

やりたいこと XXX@gmail.comだけにアクセス許可 みたいな感じで特定のドメインのアカウントだけに限定して静的サイトを公開したい。 方法 consoleから変更する場合 GCSのブラウザを開く 対象のBucketの バケットオーバーフローメニュー(右端の縦に...が並んでいるボタン) をクリックする バケットの権限を編集 を選ぶ メンバーを追加 を選ぶ 新しいメンバーのフォームに許可したいドメイン(gmail.com など)を入力 適切なロールを選択して保存する。 問題 この方法でファイルを提供することはできるが、ファイルをディレクトリまるごとアップして許可した人だけにサイト公開しようとすると1点問題が発生した。 ファイルをホストするドメインがファイルごとに異なっているので相対パスを指定しても他のファイルを参照することができなかった。 GCSのブラウザで確認できる Link URL はhttps://storage.cloud.google.com/<bucket>/<file_name> となっているが、これにアクセスすると実際にファイルを配信している別のURLにリダイレクトされる。 このときリダイレクト先のURLのドメインが必ずしも同じドメインにならないようなので、そのまま単純に相対パスの状態でhtml/js/css/imgなどをアップするとリンク先が参照できなくて破綻する。 どうするかというと単純な話でhrefなどの参照先を絶対パスで指定すれば良い。 今回アップしようとしたファイル群は create-react-app で作成したので、.env ファイルに PUBLIC_URL=https://storage.cloud.google.com/<bucket>/<必要ならディレクトリ と記述して解決できた。 参考 https://cloud.google.com/storage/docs/access-control/using-iam-permissions?hl=ja#conditions-add https://stackoverflow.com/questions/52761957/attaching-absolute-path-to-css-js-files-while-building-the-react-app/52840500#52840500

(Python)classmethodの返り値の型として自身の型を使う

検証環境 python version: 3.8.2 説明 class MyType: @classmethod def from_name(cls, name: str) -> MyType: t = cls() t.__name = name return t のようなコードを書くと、python3.8.2では -> MyType の部分がUnresolved referenceになってしまう。 これを回避するには以下のようにする。 from __future__ import annotations # この行を追加する class MyType: @classmethod def from_name(cls, name: str) -> MyType: t = cls() t.__name = name return t python 3.7からfuture behaviorとして追加されているので、それ以降ならこれだけで解決可能。 参考 https://stackoverflow.com/questions/39205527/can-you-annotate-return-type-when-value-is-instance-of-cls/58709233#58709233 https://www.python.org/dev/peps/pep-0563/#enabling-the-future-behavior-in-python-3-7

(暫定対応)ReactのCSSPropertyで型の不一致が発生する

問題 const scoreStyle = { margin: 50, textAlign: "left" }; ... <div style={ scoreStyle } > ... こういうコードを書いたところ Type '{ margin: number; textAlign: string; }' is not assignable to type 'CSSProperties'. Types of property 'textAlign' are incompatible. Type 'string' is not assignable to type '"left" | "-moz-initial" | "inherit" | "initial" | "revert" | "unset" | "center" | "end" | "justify" | "match-parent" | "right" | "start" | undefined'. TS2322 こんな感じで型が一致しない。

「HHKB Professional HYBRID Type-S 日本語配列/墨」を使ってみた感想

HHKB初心者の感想。 もともとはMajestouch使いで、Macの外付けキーボードとしてKarabinar-Elementsでmacのデフォルト配置に近い配置にして使っている。 箱とか 外箱 箱開けたところ 良いところ タイプするとコトコト感があって気持ちいい それなりに軽いので持ち出しやすい Majestouchより疲れにくくなった気はする(そこまで変わらない) Bluetoothなのでコードを気にしなくていい Bluetoothに関してはMajestouchのMINILAで良いのでは説があるが、今回はHHKBを試してみたかったのでこの機種を選択した。 コロナでしっかり試せていないが、iPadとかと一緒に外に持ち出して使えるならだいぶ大きなメリット。 悪いところ スペースキーが小さいので英/かなキーを一つ外側のキーと打ち間違える 右シフトキーが小さくかつ上キーと隣接しているので打ち間違える 軽い力でタイプできるため、たまにキーボードにおいた手の重みで意図せずタイプされる macのキーボードの上に載せて使おうとすると、左右幅がないため下敷きにしたキーが押されてしまう Karabinar-Elementsでデフォルトキーボードを無効化できるので対策可能 電池駆動なので適宜交換が必要 買って一月程度経つがまだ交換は不要そう タイプミスに関しては一月ほど使い続けたことでだいぶ減ったので、慣れの問題の範疇。