@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Go: json & や < や > をエスケープしない 

SetEscapeHTML() を使う。

b = new(bytes.Buffer)
enc = json.NewEncoder(b)
enc.SetEscapeHTML(false)
enc.Encode("&<>")
fmt.Println(b.String())
//=> "&<>"

Go の json パッケージは &, <, > をエスケープする。 *json.Encoder.SetEscapeHTML() に false を渡すとエスケープを抑止できる。 json.Marshal() では無理なので Encoder を使う必要がある。

https://golang.org/pkg/encoding/json/#Encoder.SetEscapeHTML


実験結果

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

Go で chomp (末尾の改行文字を取り除く)

strings.TrimSuffix() を使う。

strings.TrimSuffix(s, "\n")
s := " hello, world!\n"
fmt.Printf("%#v\n", strings.TrimSuffix(s, "\n"))
//=> " hello, world!"

https://golang.org/pkg/strings/#TrimSuffix

TrimRight()\n だけを取り除くのであれば同じだが、 TrimSuffix を使う方が適切らしい。

s := " hello, world!\n"
fmt.Printf("%#v\n", strings.TrimRight(s, "\n"))
//=> " hello, world!"

https://golang.org/pkg/strings/#TrimRight

TrimRight returns a slice of the string s, with all trailing Unicode code points contained in cutset removed.

To remove a suffix, use TrimSuffix instead.

TrimSpace() は文字列の両端の空白文字を取り除く。

s := " hello, world!\n"
fmt.Printf("%#v\n", strings.TrimSpace(s))
//=> "hello, world!"

https://golang.org/pkg/strings/#TrimSpace


Ruby との対比表を作るならこんな感じ

Ruby String#chomp String#rstrip String#strip
Go strings.TrimSuffix(s, "\n") strings.TrimRight(s, " \t\r\n\f\v\0") strings.TrimSpace(s)

実験結果

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

Go: json struct 大文字小文字

JSON and Go - The Go Blog

The json package only accesses the exported fields of struct types (those that begin with an uppercase letter). Therefore only the the exported fields of a struct will be present in the JSON output.

  • json.Marshal: 構造体の非公開フィールドは JSON に現れない
  • json.Unmarshal: 構造体の非公開フィールドには JSON の値は入らない
    • そのフィールドの型のゼロ値が入る

https://play.golang.org/p/28f97JGBmmk

Marshal/Encode せず Unmarshal/Decode するだけでも、値にアクセスしたければ構造体のフィールド名は大文字始まりにすること。

リモートワーク時代に再認識したいコミュニケーションの同期・非同期

「リモートワーク」「テレワーク」「在宅勤務(Work From Home)」など呼び方は様々だが、

  • オフィス以外の場所から、同期的に働くこと
  • オフィス以外の場所から、非同期に働くこと

どちらの意味だと解釈しているか?一緒に働く人と認識を合わせておいた方が良い。案外、コミュニケーションの同時性を区別しておらず、暗黙のうちに「相手も自分と同じ解釈だろう」とみなしていることがある。

テレワーク - Wikipedia によれば、

勤労形態の一種で、情報通信技術(ICT、英: Information and Communication Technology)を活用し時間や場所の制約を受けずに、柔軟に働く形態をいう。

とあるので、本来コミュニケーションは非同期が前提のはず。しかし、リモートワークが許されている環境においても、勤務時間の制約は緩まっていないことが多い。

同期・非同期どちらのコミュニケーションスタイルを好むか?は個人差があり、異なるコミュニケーションスタイルの持ち主同士が一緒に働くことは時に困難を極める。 Slack に投稿した内容には(メンションの有無にかかわらず)即レスを期待する人と、数時間おきに未読をチェックする人とでは、スタイルが違いすぎる。

ある人が同期・非同期どちらのコミュニケーションを好むか?は、言動から推測できそうだ。仕事で何か対処が必要な事柄がある時、

  • Zoom できますか?→同期コミュニケーションの人
  • Issue 立てといてください→非同期コミュニケーションの人

といえるかもしれない。


Slack や Teams のようなビジネスチャットツールを、

  • 便利で多機能なメールと考えるか
  • 喋らなくて良い電話と考えるか

の違いだ、ということもできるだろう*1

*1:友人に話したところ、反応は芳しくなかったが

プロジェクト型 vs プロダクト型

友人と、人にも組織にもプロジェクト型とプロダクト型があるよね、という話をした。

プロジェクト型

  • 仕事 = 締め切りまでに終わらせるべきもの、という価値観
  • 所与の条件下でいかに良い成果を出すか?という考え方
  • 優先順位は 納期 > 質。間に合わせるためなら質は落としても良い

プロダクト型

  • 仕事 = 一定の質の成果を挙げるべきもの、という価値観
  • 目指す成果を出すために必要な条件は何か?という考え方
  • 優先順位は 納期 < 質。完成度を上げるためならスケジュールは伸ばしても良い

人も組織も両方の要素が内在するが、どちらの傾向が強いか?が特徴に現れる。組織であれば、トップやリーダーのタイプが強く影響を及ぼす。

自分や自分のチームがどちらのタイプか?一緒に働く相手や組織がどちらのタイプか?を意識することが大事。