Software Design の2021年9月号について、
- ざっくり内容紹介
- 個人的に気になった記事やポイント
をまとめている記事です。
サマリー記事の一覧はこちら。
特集①:Rustでわかるメモリ管理
- 特集①の記事にしてはやや話題が限定的であるのと、扱う話題がコンピュータサイエンス寄り(というかハードウェア寄り?)なのがちょっと新鮮。Rust分かんないけどサラッと読んでみた
- ソフトウェアから見たメモリ
- コンピュータにおけるメモリ管理の仕組みを理解するとRustという言語がソフトウェア上のどのような問題を解決するのかが分かる
- さらに言うとRustの強みとして言われる「安全なメモリ管理」が一体何であるかが分かる
- レジスタ>キャッシュメモリ>メインメモリ>HDD/SSD
- それぞれの割り当てはコンパイラ>CPU>OS/アプリケーション>ファイルシステム
- まずい、既にこの辺で知識レベルの弱さがひしひしと感じられる…。レジスタはCPUと関係がある気がしていた…。
- 物理メモリ
- CPUから見たメモリ(上記だとどっちにあたる?)
- 高速で揮発性持ち。OSから見ると広大な一次元配列みたいな感じ。
- どこに何を入れるかはカーネルが決める
- キャッシュメモリ
- コラムで書いてあった、グルーピング的には物理メモリの中の一階層という理解でよい?
- メモリもレジスタに比べたら遅いのでCPU内にあるキャッシュメモリを使うようにしたい、だからCPUと関係があるのはキャッシュメモリ。
- 仮想メモリ
- ファイルシステムでいうところのシンボリックリンクみたいなもの
- アプリケーションごとに指す実体アドレスがダブらないようにポインタみたいな感じで管理している(だいぶ意訳)
- これらの紐付けが「ページング」。ページフォルトとかあったねぇ…
- スタック、ヒープ、
malloc()
とか- 得意技「ナナメ読み」によって記述は省かれた…!!
- コンピュータにおけるメモリ管理の仕組みを理解するとRustという言語がソフトウェア上のどのような問題を解決するのかが分かる
- C、C++、Javaに見る古典的なメモリ管理
- Rust以前をまず知る、ということだね
- そもそもメモリ管理とは何を指すか
- 必要なときにメモリリソースを割り当て、必要じゃなくなったら解除すること
- この理解は合ってて安心した…
- 大域変数と静的変数
- 前者はつまりはグローバル変数で、プログラムの実行中ずっと存在するのでメモリ的によろしくない
- 後者はstatic変数と呼ばれるやつ、こっちは初期化のタイミングがグローバル変数よりまだ柔軟でマシ、コードの登場まで初期化されない
- これらはデメリットだらけのように見えるが「必要なメモリ量がコンパイル時点で決まって可視化されている」という点もある
- でもそんなプログラム多くないよね~~~ というわけである
- 自動変数
- たぶんいわゆるブロックスコープ内の変数のことと思われる
- 破壊の明示が必要ない分、色々問題を生む
- スマートポインタ
- 学生くらいのころにC++触ったときに名前だけ聞いて一切使ったことない子
- ポインタにおける自動メモリ管理が追加された賢い子
- つまり前述の自動変数の問題における大部分、ポインタに関する点を解決するためのもの、という理解でよい?
- ガベージコレクション
- メモリ管理勝手にやってくれる素晴らしい子
- よく考えたらこれらとこれまで登場した「自動系のもの」との違いを意識したことが全然なかった…。Javaにおけるメモリ管理にかっちょいい名前がついたくらいの感覚だった(Java以外でも使うワードではあるけどね)
- 不要かどうかの判別にはかなりのコストがかかるらしく、全てを彼に任せるのも欠点となってしまう模様。なんでもうまくはいかないよねぇ
- 「Stop the World」とかいうスタンド名みたいなワードが目に入ったがもうカーズは考えるのをやめた
- Rustとの違い
- 参照先の生存期間ではなく参照自体の寿命を調整する、というのがポイントのよう
- 最も避けるべきは参照が参照先リソースより長生きしてしまうこと
- これを認めない(コンパイルエラーにする)ことで安全を保つ!
- でももちろんこれまでの「古典的な」各種方法もRustでは積極的に使われている
- 参照先の生存期間ではなく参照自体の寿命を調整する、というのがポイントのよう
- 必要なときにメモリリソースを割り当て、必要じゃなくなったら解除すること
- Rustのメモリ管理機能とその特徴
- 所有権とライフタイム
- 所有権
- 変数に値を代入すると、その変数が値の所有者になる。その変数のスコープが終了するとその値は解放される
- 委譲もできるが、「借用」もできる
- これは参照に近いが、色んな制限があり安全であるとのこと
- 所有権
- 所有権とライフタイム
特集②:BigQueryが分析基盤に選ばれる理由
- BigQueryの利点と位置づけ
- Google Cloudにおけるデータ分析アーキテクチャ
- コンピューティングリソースとデータストレージの分離が特徴
- この2つのリソース配分をBigQueryが受け持つため、互いの量がアンバランスなときでも効率的に処理を行える。しかも自動
- BigQueryにおけるETL
- ETLってなに?
- Extract、Transform、Loadの略、要はデータを色々やってくれる工程とかのことだ
- 対応取り込み形式:CSV、JSON、Avoro、Parquet、ORC
- 以下実際の処理内容の説明などが続いた
- GCPもやっぱり良さそうだな~~~
- ETLってなに?
Development
- イラストで明解Gitコマンド「git stash」
- 先日たまたまTwitterで見かけた絵師さん?がちょうどこのGitコマンド図解連載の人だった!という偶然があり(そこに至るまでの経緯がけっこう色々あった)、なんか親近感を感じたので今号も一応書くことにする!
git stash
は現在の変更を一旦退避するためのもの- ファイル名はデフォルトで
WIP on [branch name]: [hash]
となる- そういや前から気になってたけどWIPってなに?WIPボードのWIPじゃないよね…
git stash list
でstashのリスト、git stash apply stash
@{0}で適用- 実際に使うのは
git stash -u
の「未コミットのファイルも含める」パターンが普通 - 名前をつけるのを忘れていつもどれを復帰させるか分かんなくなるので、ちゃんとコメントをつけておこう(戒め)
- Pythonモダン化計画「テストがない からの脱却」
- 前回のモノタロウのやつの続き(テストだけで終わるわけではなかったのか…)
- と思ったら単体テストとCIの話だったw
- JenkinsとDockerを使ったとのこと、連携先はBitbucket
- VSCode快適生活 第33回 画面構成の見直し
- このブログを読んでくれている人には言うまでもないけど(このブログの読者さんはこの記事読んでないと思うけども…)、環境設定には変態的なこだわりがあるのでこの辺は正直「そんだけ?」という感じだった。。。
Software Design 2021年9月号
この号の分のみ単品で読みたい方は、普通にAmazonで買うのがおすすめ。
紙 or 電子書籍で選べます。