$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

PostgreSQLのSSL接続の様子を観察する

遊びでNode.jsのprismaからherokuのPostgreSQLのDBへ接続しようとしたら、error: no pg_hba.conf entryというエラーが出て困ってしまった。ちょっと調べてみると、herokuのPostgreSQLのFreeなプランはSSL通信を自己署名証明書を使っているためエラーになってしまっているということがわかった。これについては遊びで使っていたこともあるのでNode.js, PostgreSQL error: no pg_hba.conf entry for host - Stack Overflowとかを見ながら一旦rejectUnauthorized=falseを設定することで回避した(参考)。

この件で、そもそもPostgreSQLSSL接続の様子をちょっと見てみたいなと思ったので、軽く調査したのをメモしておく。

そもそも証明書はどうなってる?

以下のコマンドで確認できる。

$ openssl s_client -starttls postgres -connect <domain>:5432 -showcerts
CONNECTED(00000005)
depth=0 CN = ip-10-0-69-188.ec2.internal
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = ip-10-0-69-188.ec2.internal
verify return:1
---
Certificate chain
 0 s:CN = ip-10-0-69-188.ec2.internal
   i:CN = ip-10-0-69-188.ec2.internal
...

これをみるとherokuのFreeのPostgreSQLはEC2が提供しているself signed certificateを使っている(というかDNSを見てみると普通にEC2に接続しようとする)。このため、証明書のチェック部分でエラーとなり、接続できていなかったことがわかる。

どうやってSSL通信に変わっている?

https://www.postgresql.org/docs/current/protocol-flow.html#id-1.10.5.7.11 を見ると、クライアントからStartupMessageより前にSSLRequestを送り、サーバからSが帰ってきたらSSL通信になると書いてある。これを元にWiresharkをみてみると

4番目のパケットでSSLRequestを送っている。 f:id:shiba_yu36:20210425151950p:plain

6番目のパケットでSが返ってきている。 f:id:shiba_yu36:20210425152121p:plain

それ以降、TLSv1.3のClient Helloが送られ、SSL通信が始まっていることが分かる。

オフィスでの仕事で何が生まれていたか a.k.a リモートワーク時代でも取り戻したいもの

この一年、オフィスのオフラインでの仕事から、一気にリモートワークのオンラインでの仕事に切り替わった。その中で色々困っていることが共有されているが、特に雑談がしづらくなったというデメリットを見かけることが多い。

そこで今回は、リモートワーク時代でもオフィス時代のメリットを享受するためのヒントを得るために、オフィスの仕事で何が生まれていたかを少しだけ掘り下げて考えてみたい。

僕はオフィス時代では次の3つが生まれていたと考えていて、リモートワーク時代でも取り戻したいと考えている。

  • 偶然のアイデアの発見
  • 複数人が勢いで何かをやっていく熱量
  • 自然な知見の横展開

偶然のアイデアの発見

  • オフィス時代ではその辺で会話していたら、それを周りで聞きつけた人が別職種・別チーム問わずやってきて、簡易ブレストみたいになることがあった。それにより新しい機能アイデアとか、ちょっとした改善アイデアが偶然発見されたりしていた
  • 出張して来た人と雑に話していたときも、実はこういうこと困ってるんですね〜から、それシュッと改善できますよ、みたいな話に発展することがある

今は「能動的に話に行く」ことはオンラインツールで出来るのだけど、「受動的に気になることが聞こえてきたので会話をしに行く」みたいなのは実現出来てないので、この問題が起こってそうに見える。

複数人が勢いで何かをやっていく熱量

  • オフィス時代では、会話していたら熱量が上がってきて、2~3時間くらいで複数人でガッと取り組むことで、何か動くものが出来るということがあった
  • オンラインで、熱量が上がってきて勢いで作る、ということが中々起こりづらく感じる

コミュニケーションツールでの解決ではなく、強制20%ルールといったやり方を使い、数人で取り組めるゆとりの時間で解決する、みたいな方法もあるかもしれない。

自然な知見の横展開

  • ランチや休憩スペースで偶然居合わせた人と、最近こういうことをチームでやっているとか、こういうこと困ってるみたいな話から、自然と知見が横展開されていた
  • あとこれわからない!!みたいな相談をチーム内でしていたら、周りで聞いていた別チームの人がやってきて教えてくれることもあった
  • それ以外でも、仕事とは直接は関係ない疑問(例えば自作ツールでうまくいかない!とか)みたいな話を、詳しそうな人をちょっと捕まえて話すみたいなことが出来ていた

オンラインになって、おりゃっと突撃するのがしにくくなったり、偶然居合わせるということがなくなったりすることで起きてきている問題だろうか?話しかけても良いかどうかを非言語情報から察知できなくなったことも要因かもしれない。

仕事以外の会話がしやすい雑相談Slackチャンネルやグループみたいなものがあってもいいかも。

まとめ

今回はオフィス時代のメリットを少しだけ深掘りすることで、リモートワーク時代でも取り戻したいものについて考えてみた。このように深掘りすれば、単純に「リモートワークでも雑談を増やそう」以外だけでなく、組織構造などを変えることでアイデアを発見しやすくしたり、スクラム開発など開発フロー面で対策を取ることで熱量を起こすといった別の対策も考えられるだろう。個人的にはリモートワークをせざるを得ない状況になることにより、場所の制約から解放されるチャンスが生まれていると思うので、どんどんリモートワークでもいい感じに働ける工夫をしていきたい。

TypeScriptで「Reactを自作しよう」をやってみた

最近2分間コーディングのすすめ、コードを書く習慣のハードルを下げるに触発されて2分間コーディングをやってみている。まずは昔興味が出ていたReactを自作しようをやってみたのでメモ。

やった様子は https://github.com/shibayu36/building-own-react に置いた。メインファイルは https://github.com/shibayu36/building-own-react/blob/main/src/index.tsx

create-react-appしたままだと色々おかしくなったのでejectして手直ししたり、JSXのtranspileを置き換えるためにwebpackの設定を少しいじったりしたところが苦労した。そのあたりについては https://github.com/shibayu36/building-own-react/commits/main を眺めると様子がわかると思う。

学べたこと

  • Fiberという仕組みによって細かく作業単位を分割しながらレンダリングし、ユーザーのインタラクションを妨げないようにしている仕組みについて理解が深まった
  • Reactの型構造について理解が深まった
  • JSXの解釈を自分で実装する方法が学べた
  • requestIdleCallbackを使った無限ループっぽい仕組みによって、変更を監視する手法を学べた
  • ReactのRender PhaseとCommit Phaseそれぞれでやっていることの理解が深まった
  • 差分検出の簡単な流れについて理解が深まった

数百行くらいのコードで、JSXのtranspile・render・差分検出・関数コンポーネント・useStateが簡単に使えるものが出来上がるのはすごい。作った後にReactを使っているコードのスタックトレースを眺めていたら、今回作った関数名などが出てきて理解しやすくなったなと感じた。

参考