いわむぶろぐ

Webエンジニア@スタートアップ@のんびり綴ってます。

WEB+DB PRESS Vol.123 を読んで

f:id:kohei_iwamura:20210907110739j:plain

https://www.amazon.co.jp/dp/4297122073

を読んだので、かなりざっくりまとめました。
自分用のメモ。

PHPの型管理Psalm

もともとのPHPの型宣言の弱点

  • 型の表現力の不足 。配列の型の指定がないなど
  • PHPDocの型アノテーションの強制力がない。IDEでPHPDocをもとに型をチェックしているが、言語自体には含まれていない
  • 型宣言が実行時に行われるため、実行されるまで誤りを検知できない

PHPSalmの特徴

  • 静的解析ツールで実行前に型チェックできる
  • Composerからインストールでき、設定も簡単に行える
  • 型の表現が他のOSSの中で最も豊富

Golangのメモリ管理

Golangのstructがどのようにメモリ領域を使うのかを説明している(Go1.16)

メモリ領域には アラインメント が鍵となる。
アラインメント: データがメモリ上にどのように配置されるかに関する取り決め

各型のアラインメントのサイズは、コンパイラによって決められている

Golangの場合

  • Int8 => 1バイト
  • Int16 => 2バイト
  • Int64 => 4バイト

メモリ配置のルール

  • 各型がメモリに配置される際、アラインメントの倍数の位置にデータの先頭が配置される。(Int64の場合は8 or 16 or 24... の位置から保存される。)
    • これを実現するためにパッディングと呼ばれる余白がある。
      • 例: 3バイトまでデータが書き込まれていて、次にint64のデータを書き込む場合、4バイトのバッティングが追加されて、8バイト目からint64が配置される。
  • 型のサイズ: アラインメントと一致する。

structの場合

  • アラインメント: 内包されている型の中で一番大きいアラインメントのサイズと一致
  • 型のサイズ: 内包されている型の中で一番大きいアラインメントのサイズの倍数と一致(パッディングが追加される場合もある)

struct定義時、アラインメントが大きい順に定義するとメモリ使用量が最適化されることもある

structのデータ①

type Hoge
{
    A int64 // アラインメントサイズ8
    B int16  // アラインメントサイズ2
    C int8  // アラインメントサイズ1
}

0~7: Aを保存
8~9: Bを保存
10: Cを保存
11~15: パッディング(Hogeのサイズは、Bのアラインメント8の倍数とする必要がある)

合計16byteを利用することになる

structのデータ②

type Fuga
{
    A int16  // アラインメントサイズ2
    B int64  // アラインメントサイズ8
    C int8  // アラインメントサイズ1
}

0~3: Aを保存
4~7: パッディング(Bのアラインメントは8のため、8の倍数から保存を始めるため)
8~16: Bを保存
17: Cを保存
18~23: パッディング(Fugaのサイズは、Bのアラインメント8の倍数とする必要がある)

合計24byteを利用することになる

構造体のサイズはどのように調べればよいか

NextJS

  • Reactベース、Nodejsで起動するフレームワーク
  • SSRCSRだけでなく、SSGといった様々なHTML生成方法を実現できることが強み。

Vercel

  • Nextjsの開発、デプロイ環境を簡単に生成、設定してくれるツール。
  • 僅かな設定でDevelop, Preview, Ship環境を作成できる。

○ HTTP3

※あまり理解できていない

一言でいうと、HTTP2の弱点を克服したHTTPプロトコルの通信方法。 トランスポート層TCPではなくQUICを使っていることが鍵となっている。

バージョンごとの特徴と課題

HTTP/1.1

課題

  • 1つの接続で連続でリクエストを行うkeep-Alive時に、リクエストの順番ごとにレスポンスを返してもらう必要があったため、前の処理が止まってしまうと後続の処理も待たされてしまった。

HTTP/2

改善

  • HTTPメッセージを細切れ(フレーム)にし並列(のように)で送るようにした。フレーム内の情報はそれらを格納する位置が決められていた。その仕組みでリクエストとレスポンスが紐付いていたため、リクエストの順番でレスポンスを返す必要がなくなった。

課題

  • 4階層モデルでHTTP/2の下位層で利用しているTCPは信頼性の担保のため、送信者がパケットを送信した順番通りに受信者がバケットを処理する必要があった。
    • そのためパケットロスが発生した場合は、再度送り直してもらう必要があり、後続のパケットが送られてきても、ロスしたパケットを取得し直すまではデータをアプリケーションに渡さずに待つ必要があった。

HTTP/3

改善

  • トランスポート層にQUICを導入。
    • QUICでは仮想的な通信可能単位であるストリームを複数持つ。
    • HTTP/2では、HTTP層でストリーム管理、TCP(信頼性担保)でパケット管理を行っていたため、ストリーム単位では信頼性を担保できなかった。
    • QUICではそれをまとめて行うようにしたためストリーム単位での信頼性を担保できるようになった。ストリームはそのままアプリケーションに渡しつつ、パケットロスしたストリームは再送してもらうことが可能になった。