みるめも

[2021年5月号] Software Design(技術評論社) サマリー+個人メモ

[2021年5月号] Software Design(技術評論社) サマリー+個人メモ
みるみ
Follow Me!
みるみ

ブロガー、エンジニア。

文章を書くのが好きです。

Software Design の2021年5月号について、

  • ざっくり内容紹介
  • 個人的に気になった記事やポイント

をまとめている記事です。

サマリー記事の一覧はこちら

特集①:ハンズオン TCP/IP

  • 押さえておきたいネットワークの基本用語
    • IP、およびIPパケット
      • ホスト→ルータ→ホストというルートをバッファを経由しつつ転送される
      • IPパケットの中にはヘッダとペイロードがある
        • ちょうど最近知ったけど、ペイロードという言葉のニュアンスは「データ部本体」という感じらしいので今回はヘッダに対してのペイロードで分かりやすい
      • IPパケットは封筒、自分では移動できず運ぶ人が必要
        • 運ぶ人はEthernet、Wi-Fi、FTTH、5Gなど。いわゆるインターネット
    • TCP
      • IPはバカ正直に送り続けるだけ、TCPはベストエフォートを目指して(日本語正しい?)データの全てが順序よく正しく届くように制御する
      • TCPを使うプロトコルの例
        • HTTP/1,2
        • SMTP
        • IMAP
        • SSH
      • TCPはユニキャスト(1対1)でのみ動作し、内部ではIPを使うけどACKという確認応答をもらいながら処理を続けることで信頼性を担保している
    • UDP(User Datagram Protocol)
      • TCPの信頼性をいい感じに保証しつつ、ちょっとだけ自由度を上げたいときに使うプロトコル。例えば「途中が抜けていても次を待たずに送信してほしい」みたいな感じ。パケットそのものはなくなるかもしれないけどデータ破損はないことを保証する機能は提供してくれるらしい
    • IPアドレス
      • 「普段よく聞くけど実は細かいことは全く理解されてない技術用語No.1」ではないだろうか
      • 階層分け、プライベート部、マルチキャストとかいつもの話
    • Ethernet
      • EthernetはIPとは独立した技術、使うのはMACアドレス
        • MACアドレスはEthernetを使う機器のROMに書き込まれているか、Wi-FiやBluetoothならそこでも分かる
      • バス型からスター型に
    • ポート番号
      • 届けてもらった郵便物は色々な部署宛てのものがごちゃまぜになっており、そこから先は誰も面倒を見てくれない、それを分かりやすくするのがポート番号
      • TCPやUDPが、届いたIPパケットを見て適切なアプリケーションに振り分ける
      • UDPと併用できるプロトコル:
        • HTTP
        • SIP
      • UDPしかないプロトコル:
        • DHCP
      • (TCPしかないプロトコル:)
        • SSH
      • 以上はどれもポート番号は同じ
    • この辺り、仕事してても全く分かっていないエンジニアは超多い印象。Web系会社でもソフトウェアエンジニアリング専門の会社でもないのはたしかにそうなんだけど、技術職ならネットワークの基本くらいは必修と思うべきだと最近強く思う。業務外レベルの話でも言葉が通じないのよね…(IPにプライベートとかあんの?VPN is 何?)
  • pingを自作してネットワーク通信の実装を知る
    • だいぶ実装寄りの話だったので割愛
  • TCPによるソケットプログラミング
    • ソケットプログラミングってなんでしょう
      • 特に言葉の解説はなかったけど、ググった感じ「OSや言語を限定せずにTCP/IP上のネットワークで動作するものを作ること」ということのよう
    • socketというものを作って実際にTCP通信する流れを知っていく感じの話。実装はC。内容はかなりシンプルで普通に読めた(ヘッダでインポートしている中身は全然知らないから想像だけど)
  • UDPによるソケットプログラミング
    • これがUDPになるとどう変わるか、ということ
    • 主に「NAT越え」と「マルチキャスト受信」がポイント?
      • なるほど全然わからん
        • 全部書いてたらヤバいので普通に飛ばすつもりだったけど、そもそもこの記事の企画はこんなに適当でいいのだろうか。いいよね。うん、いいな。

特集②:PHP 8移行のタイミングとコツ

  • PHP 8でコーディングはどこまで変わる?
    • 新機能
      • コンストラクタ プロパティ プロモーション
        • 最近ちょうどDart(Flutter)をやっているのだけど、これひょっとしてコンストラクタ書くときに代入処理を省略できるっていう同じやつ??
      • 名前付き引数
        • PHPって名前付き引数なかったんだっけ?笑 やっと現代的になってきたな()
      • union型、mixed型
        • union型は|で複数の型を表現できる(ユニオン=連合)
          • nullableを表現できる
        • mixed型は今まで何も書かなかったのと同じ通りどんな型にでもなり得ることを示すもの
          • ただし戻り値の場合は何も書かないvoidを含むのとは意味が変わり、「何かしらは返す」ということになる 
          • PHPマニュアルではお馴染みの記法とのことだけど、たしかにいつも書いてあったな
      • match式
        • switch文みたいに使える三項演算子の無制限バージョンみたいなやつ
        • 式というより文???
          • 式らしい
      • アトリビュート
        • クラスや関数定義に付与できる注釈
          • 他の言語で言うアノテーションやデコレーターに近いものに見える
      • nullsafe演算子
        • ?->で評価したとき左辺がnullの場合に即座にnullを返せるようにするためのもの
          • アロー演算子の上位互換、という理解でいいのだろうか
        • null安全もDartの件ととてもダブる
    • PHP 8移行の注意点まとめ
      • 緩やかな比較の仕様変更
      • 演算子の優先順位とかがちょっと変わってる
      • エラーのレベルが変わったりした(Warning -> Errorなど)
  • JITコンパイラでどこまで速くなる?
    • JITコンパイラの復習→「コンピュータのプログラムが実行される直前に、そのプログラムをマシンのCPUに応じた機械語にコンパイルを行う」
      • PHPはスクリプト言語なので、「実行直前にコンパイルされる」の意味が感覚的に分かりづらいかも
        • これまではソースコードがPHPの仮想実行マシンであるZendVM上で動いていたのだけど、それと併用してJITコンパイラが直接マシン語でCPUに流し込む、みたいなことらしい
        • コンパイルの時間は前よりかかるが、CPUでの実行スピードは上がるらしい
          • それって意味あるの?笑
    • 結局Webアプリケーションではそこまで速くならない
      • Webアプリケーションはブラウザからのリクエストごとに毎度コンパイルして実行している
      • JITコンパイルによって出来上がった成果物もあまり再利用されないので恩恵を受けにくい、みたいに読めた
      • CPUバウンドなアプリケーション(=もっと低レイヤーなシステムでの実装ってこと?)ではとても速度向上するらしいのだけど(42%)、果たして誰がPHPでそんなものを作っているというのか(煽り)
  • フレームワークやライブラリなどはどう対応するべき?
    • Laravel→OK
      • 一番使われているWebアプリケーションフレームワークと言われていた記憶があるのだけど、さすがにちゃんと対応していたみたい
    • CakePHP→ちょっと危険
    • 他多数
    • WordPressの話はなし笑
  • PHPはWordPress以外でちゃんと取り組んだことはないので言語自体の理解はずっとあやふやなまま来てる。しかもWordPressのせいもあってかなり野暮ったいイメージが強く、PHPerもいつもセルフディスってるしでなんか鈍臭い言語のイメージ…。
    • でもこのアップデートを見るとかなりモダンな感じを目指そうとしているのかな。処理速度も上がってきたみたいだし。
    • そんなことより変数の前に$は本当に嫌なので勘弁してくれ。それだけだ

Column

  • なし

Development

  • イラストで明解Gitコマンド[3] git fetch/git checkout
    • fetchでリモートからローカルに取り込む、checkoutでブランチを切り替える
      • ちなみにpullとfetchの違いはpullはfetchに加えてmergeもやる、ということだった気がする→合ってた
        • さらに言うとgit cloneは単なる全体コピーで、pull/fetchペアのように差分検出などのニュアンスは一切含まれていない
  • サーバレス環境に静的コンテンツを自動でデプロイするTips
    • ここで紹介されていたのCI/CDツールは「CircleCI」というものだった
    • それ以外は「GitHubなどと連携する」などで特に目新しい話なし

OS/Network

  • Dockerネットワークのしくみ
    • DockerおよびKubernetesちゃんと勉強しようと思ったけど書籍が積ん読になっていて忘れていた
    • でも概要説明とdocker buildくらいの話がメインで、やっぱり実務で使ったりしないと勉強にはならんな、など(本も要らない子に…?)

そのほか

  • なし

Software Design 2021年5月号

この号の分のみ単品で読みたい方は、普通にAmazonで買うのがおすすめ。
紙 or 電子書籍で選べます。

 

みるみ
Follow Me!
みるみ

ブロガー、エンジニア。

このブログ「みるめも」が初めての方ははじめましての10記事がおすすめ。もやってます。

みるめも