$shibayu36->blog;

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

「独学大全」読んだ

Twitterとかで見かけて気になってたので読んだ。

習慣レバレッジ、カルテ・クセジュ、検索語みがき、目次マトリクスあたりが自分の中で興味深い技法として知れたのが良かった。

読書メモ

* 習慣レバレッジ:自分のやりたい独学を、いつもやっている日課をトリガーに引っ掛けて習慣づける 1489
    * 1. 一日のうち頻繁に行う習慣(例: スマホを見る、トイレに入る)を選ぶ
    * 2. その習慣の直前に新しい習慣を行う。簡単ですぐ取り掛かれて短時間で終わるもの(例: 英単語1個覚えるなど)。習慣を作ることが目的なので、覚えきれなくても良い
    * 3. 2を繰り返し、少しずつ重い習慣に変えていく
*  現状のグラフ化や目標などを壁に貼っておくと、誰かの目に触れるかもしれないという可能性だけで、ノートに綴じ込んでいる場合よりも効果があると言われている 1713
    * パブリックポスティング
    * 気付き: コードレビューも、誰かに見られるかもというだけで良い設計になるみたいなところある気がする
* 会読:読書会の技法 1891
    * 1. 本を選ぶ or 先に人を集めてから本を選ぶ
    * 2. 参加者は当日までに読んでおく
    * 3. 参加者は自分の読みを持ち寄り共有する
        * 集まりに先立って、要約を作ったり、疑問点などをメモしておくと良い
    * 気付き: 読書会するときも、先に疑問点を持ち寄って議論をベースにした方が、短時間で実りがあるように感じることが多い
* カルテ・クセジュ:これから取り組もうとする分野について脳内知識を棚卸しすることで、学ぶ方向性を決める 2178
    * 気付き:経営・問題解決・SSLを学ぶときとかに使えそうな話題。miroとかで作っていくと範囲に制限がなくて良さそうか?
    * 1. 取り組もうとしている分野や課題について、なんでも思いつく限り何も書けなくなるまで書き出す
        * 知りたいこと、気になること、いくらか知っていること、聞いたことのある名前や用語など
    * 2. まずは知っていること、学んだことがあるもの、聞いたことあるものなど、知識に引っかかるものを四角で囲む
    * 3. 四角で囲んだものの中から気になる/大事そうなものを選んで調べる。調べたものはさらに四角で囲み、二重四角にする
        * この段階では短時間で調べていく
    * 4. いくつか調べた後で、項目同士で関係がありそうなものを線で結んでいく
    * 5. 3~4を繰り返し、項目を結びつけたカルテの変化と成長が落ち着いたら、今度はもっと知りたいと思うものをいくつか丸で囲んでいく
    * 6. 丸をつけた項目の中から、最も知りたいものを一つ選び、二重丸にする。これが学習のテーマとなる
* 検索語みがき:より精度の高い検索ができるワードを見つける 2473
    * 1. コトバンクなどを使い、表現の揺れやスペルをチェックし検索に使う言葉や表現を集める
    * 2. 1で収集したワードを検索にかける
        * 同じ事柄を表すものでも、専門的な情報がヒットしやすいものもあれば、素人が書いたブログばかり見つかるものもある
    * 3. Googleの検索結果や他のキーワードなどから、よく一緒に出てくる共起フレーズを集める
    * 4. 目的に合致しなかった検索結果によく登場する言い回しを集め、除外フレーズとする
* 文献たぐりよせ:文献から文献を探す 2592
    * 引用文献のリストから文献を見つける
    * 被引用文献からより新しい文献を見つける
        * Google Scholarとか?
    * 著者名から別の文献を見つける
* 教科書があるほど成熟した分野なら、そのうち最新の教科書を使うと良い 2814
    * 大学で使うレベルの教科書は学術的にも信用できるその分野の入門書となっていて、索引や用語集も充実し、次に何を読めばいいか信頼できる読書案内や文献リストが入っている
* 事典を先に引くことで基礎知識の手がかりを早めに見つけることができる 2871
    * コトバンク、EPWING版の百科事典
* 教科書で調べるときに大切なこと2つ 3236
    * 1. 取説を確認・熟読する。冒頭で意図を含めて構成と扱っている内容や教科書ならではの工夫などをを解説している
    * 2. 教科書独自の工夫を活用する
* 目次マトリクス:目次だけを読んでまとめることで、多くの文献で出てくる重要ワードを素早く集める 3793
    * 気付き: カルテ・クセジュ同様、体系的に学びたい新しい事柄に使えそう。目次からカルテ・クセジュに使うワードを見つけることもできそう
    * 1. 独学のテーマとごとにシートを作る。例: spreadsheetやmiroなど
    * 2. 文献のタイトル、著者名、目次から見出しや必要なら各章の概略を書き込む
    * 3. 同じ/似た内容をマーキングしたり囲んで繋いだりする
* タイム・スケール・マトリクス:デマの矛盾をあぶり出す 4144
* 掬読:必要なものだけ読み取る 4600
    * 1. 序論・第一パラグラフを読み「目的」「問い」を見つける
    * 2. 結論・最終パラグラフを読み、「答え」を見つける
* 問読:見出しから問いを先に作り、その答えを探す形で読む 4688
* 限読:決まった時間で読み終えることにより、速読のスキルをつけていく 4760
    * 読む時間を決めて、先に読み終えるための作戦を5分くらいで決め、実際に読む
    * 習慣とすることで自分の読み方と読書スキルを再構築する
    * 目次・索引が充実した本、論文のようにフォーマットが決まっているものは限読に向いている
* 外国語と数学を学ぶと、利用可能な学術資源の範囲を拡大する 6421

「プロフェッショナルSSL/TLS」を読んだ

[asin:4908686009:detail]

最近ふとSSL/TLSの仕組みについて知りたくなったので、「プロフェッショナルSSL/TLS」を読んだ。

かなりいろんな話題を網羅していて、かつ具体的な設定例なども書かれていて良かった。TLSに関する仕事をするときや、SSL/TLSHTTPS周りで何回かハマったことがあるなら非常にお勧めできる。

仕組みを理解したいなら1章 SSL/TLSと暗号技術・2章 プロトコル・3章 公開鍵基盤が参考になった。実運用なら8章 デプロイ・9章 パフォーマンス最適化・16章 Nginxの設定あたりが参考になりそう。またTLS周りでハマった時のトラブルシューティングには12章のOpenSSLによるテストが使えるだろう。

ただ最新のTLS 1.3に関してはそこまで多く言及はなかった(電子書籍版の巻末の付録のみ)ので、これについては別書籍や別資料で学ぶ必要があるだろう。

読書メモ

* 暗号は大きくストリーム暗号化方式とブロック暗号化方式の2種類 7
* 安全に通信できる要件(機密性、完全性、真正性)を満たす最小構成 14
    * 共通鍵暗号化によるデータ暗号化で機密性
    * 改竄防止のためのハッシュ鍵によるMAC計算
    * 抜き取ったり送り直したりできないようにメッセージに連番をつけてMACの計算に入れる
    * 会話の最後に特別なメッセージを送り、勝手に中断されないように
    * 公開鍵暗号化方式を使ってお互いを認証し、鍵交換アルゴリズムで共通鍵を交換
* トランスポート層に対する攻撃は大半は中間者攻撃 17
* RSAでの鍵交換をしてしまうと前方秘匿性(PFS)がない。前方秘匿性があるものを利用し、いずれ鍵が漏れても復号できないようにしておくこと 20
* プロトコル 24
    * Recordプロトコルがコンテナ
    * Handshakeプロトコル
        * 大まかに三つ
        * 1. サーバ認証を伴うフルハンドシェイク
        * 2. 前回のセッションを再開する場合の、一部のメッセージを省略したハンドシェイク
        * 3. クライアントとサーバの認証を伴うハンドシェイク
    * Application Dataプロトコル 45
    * Alertプロトコル 45
* 証明書は同じファイル内で複数内容が入っていて良い 30
    * 先頭はサーバ証明書、その後ろに中間証明書が順番に続く。ルート証明書は省くべき
* 接続したいサーバの名前はクライアントでserver_name拡張により指定できる。これにより仮想サーバに安全に接続できる 55
* 証明書とは、公開鍵・公開鍵に紐づけられた主体に関する情報・証明書を発行した主体のディジタル署名の3セット 64
* Name Constraints拡張を使い、例えば自分で所有しているドメイン名に対してのみ証明書を発行できる下位のCAを企業が持てる 66
* インターネットPKIの証明書の仕組みは失効がなかなか難しい 75
    * 遅延が10日間程度(中間CA証明書は12ヶ月)あり得る
    * ソフトフェイルポリシーにより、失効情報の取得エラーの場合、そのまま証明書を使い続ける
* HSTSを使うことで、ユーザー側のミスやページの問題があっても強制的に安全なリソースを取得させられる 137
* CSPを使うことで、安全でないリソースをブロックできる 137
* TLSサーバを安全に運用環境にデプロイするためのアドバイスまとめ 251 ☆
    * こういうタスクがある時は全部読みましょう
* TLSサーバでパフォーマンスを出すために考えること 271 ☆
    * こういうタスクがある時は全部読みましょう
    * TLSに対して特に大きな影響があるのはレイテンシ。ハンドシェイクに時間がかかってしまう
    * TLSにおける鍵交換アルゴリズムのパフォーマンス比較 280
*  HSTSデプロイのためのチェックリスト 301
* パスワード保護された鍵を本番環境で使っても安全性が大きく向上することはない。プログラムのメモリ上では保護されない状態になるため 328
* 証明書の拡張で属性がcriticalになっているものは、証明書を利用する全てのソフトウェアが意味を理解していなければならない 334
* openssl speedを使うと速度検証ができる 350
* プライベートCAの作り方 352 ☆
    * ルートCAを作る
    * 下位CAを作る
    * OCSPなど失効エンドポイントを作る
* Nginxの設定 469 ☆
* 0-RTTはリプレイ攻撃に脆弱である・場合によってPFSがないという問題はあるので、使い方に気をつける必要がある 518

継続的に学習するために効いたやり方3つ

育児していて時間があまり取れない状況下で継続的に学習するために色々な方法を取り入れているんだけど、その中で最近めちゃくちゃ効いた3つのやり方を紹介。

  • やりたいことリストを作っておく
  • 今日のTODOリストを作る
  • 2分間コーディング

やりたいことリストを作っておく

自分が学習したいことの一覧があると、優先度を決めやすくなり、またやりたいことが1つ終わった後すぐに次に取り組むこともできる。そこで僕はTrelloでリストを作り、とにかく少しでもやってみたいと思った開発や、読みたいと思った本などがあれば追加している。

f:id:shiba_yu36:20210504152202p:plain

今日のTODOリストを作る

時間が空いてから「今日はこれから何をやろうかな?」と考えていると、途端にやる気がなくなってダラダラしてしまう。そこで先に今日のTODOリストを作っておくということをやっておく。ポイントとしては

  • 細かい家事やプライベートでやること、勉強すること全て含めて同じリストに入れて、上から順にやっていけばOKという状況にする
  • 全てをやりきれなくても気にせず、かつ次の日に持ち越すということもしない

上のポイントを満たすために、僕はメモアプリのテキストを1つ作り、そこにずっとやることを追記し続けている。

f:id:shiba_yu36:20210504145938p:plain:h400

2分間コーディング

今日のTODOリストを作ったとしても、サボりたい誘惑にかられてしまい、取り組むところまでいけないことも多い。なんとか取り組む手法がないかと思っていたが、最近 2分間コーディングのすすめ、コードを書く習慣のハードルを下げる を見て良さそうと感じたのでやってみた。これが絶大な効果を発揮している。

f:id:shiba_yu36:20210504152416p:plain

2分だけプログラミングすれば良いと思って始めたら大体1時間とかやっていたりするので、人間始めてしまえば長時間続けられるものだなあと感心している。

まとめ

今回は継続的に学習するために自分で工夫したことの中で、特に効いた3つのことについて紹介してみた。この習慣によって、学習だけじゃなくて日々のプライベートでのやること(例えば保育園の書類を出すとか)もどんどん片付くようになったので助かっている。