Software Design の2021年3月号について、
- ざっくり内容紹介
- 個人的に気になった記事やポイント
をまとめている記事です。
サマリー記事の一覧はこちら。
特集①:Javaでもう一度学び直すオブジェクト指向プログラミング
- 「オブジェクト指向ってなに?」という質問に対するあらゆる意味での返答の難しさをちゃんと前置きし、慎重に書き出されている
- ちなみに説明は結局クラスとインスタンスから始まった
- その次は「カプセル化」「ポリモーフィズム」「継承」
- カプセル化ってそういえば久しぶりに聞いたなと思ったけど当然過ぎて概念の存在を忘れてた(外から内部の処理が見えない)
- どちらかというと大事なのは「責務分担をちゃんとして疎結合にしようね」に関わる部分だよね
- ポリモーフィズムのために「インターフェース」を使う
- ここがあんまりよく分かってない、クラス図書いたあとの詳細設計に近い感じ?Javaの例を見ると
interface
として関数名や戻り値と引数の型とかがたしかに例示されている
- ここがあんまりよく分かってない、クラス図書いたあとの詳細設計に近い感じ?Javaの例を見ると
- 継承の例が微妙だなーと思ってたら注釈に「差分プログラムと呼ばれるバッドプラクティスであり~」って書いてあった:それはどうなんだ?笑
- カプセル化ってそういえば久しぶりに聞いたなと思ったけど当然過ぎて概念の存在を忘れてた(外から内部の処理が見えない)
- オブジェクト指向のメリット
- クラスライブラリとして再利用できる
- アプリケーションとしてひな形を再利用できる
- 設計パターンを再利用できる
- 実は上記メリットもそこまでピンと来ているかというと難しいところだけど、そのあとに「既にあるクラスやフレームワークを "使う" ため」とあり、腑に落ちた:逆説的だけど、今既にある財産を有効に使うために自分がそのスキルを身につけるべきというのは重要な考え方だと思った
- Javaならではのオブジェクト指向について
- Javaは今後使う予定はないのでスキップ
- と言いつつJavaScriptとのオブジェクト指向についての比較部分は読んだ
- Javaの方がオブジェクト指向っぽいというかクラスに関するしがらみが多いイメージだったけど、概ねその理解であっていた
- JavaScriptでは関数自体もオブジェクトである点についても触れられていた、無名関数に似たラムダ式がJava 8からも実装されたけど、そこまでちゃんとしていない模様
- クラスを利用した型の作成
- インターフェースの使い方
- 継承疲れに聞くコンポジション/列挙型のススメ
- 前置きに「継承はカプセル化違反や誤った設計を継承する危険性などから、今となっては最善の手段ではありません」とあった:そうなんだ…
- 理想では継承だけで色々うまくいくはずだったけど、サブクラスだらけでコードが分散し、変更の影響範囲も分かりづらくなるなど問題があった
- カプセル化も壊してしまう(スーパークラスの中身も強制的に下層に引き継がれちゃう)
- ただ現代で言う「継承」は厳密な意味での言葉ではなくて、「クラスを引き継いで頑張って一般化しましょう」くらいの代名詞になっているよね?僕だけ?
- コンポジションは継承したいクラスのオブジェクトを持つ、みたいな感じ
- 結果的に「混ざる」からコンポジションという:背景を知ってたら良いと思えるけど結果的に継承の概念からはほとんど離れてない?と改めて思った
- 前置きに「継承はカプセル化違反や誤った設計を継承する危険性などから、今となっては最善の手段ではありません」とあった:そうなんだ…
特集②:WebAssembly入門
- Web上でのアセンブリ言語的なポジション、それがWebAssembly
- Wasm(ワズム)というらしい
- イメージはJavaScriptの代替(ただしJavaScriptの代替を目指すものではないと明言はされている、あくまでもイメージ)
- C++、Rust、Goなどのアーキテクチャを使える
- 実行速度、コンパイル量の削減などがメリット、なので速い
- Google Meetの背景ぼかしの処理にWasmが採用されたらしい:こういう事例ワクワクするのでもっと教えてほしい!
- ブラウザAPIに限っては結局JavaScriptをインポートするらしいので、「コアなアルゴリズムをWasmにしてUI部分のJavaScriptと橋渡しにするような役目」を主張しているそう:だいぶ端折って意訳してます
- Wasm自体はバイナリフォーマットなので、中間言語が必要→WATという→どちらかというとこれがアセンブリ言語のポジション?
- Webアプリの可能性
- クライアント側でffmpegを使って動画エンコード
- なるほどこういう作業ができるようになるのか…、具体的なイメージがかなり湧いた、良い。
- フォトショやGIMPみたいなものがWebアプリとして機能する
- これつまり今までC++とかで動いていたクライアントアプリケーションを全部ブラウザ上で動かせるようになるってことで合っている?極論だけどすごい。
- PHPをブラウザ上で動作させる
- もうわけがわからないよ。どういうことなんだ。
- PHPはC/C++でできている→WebAssemblyで動く:なるほどね(なるほどじゃない)
- 広告モデルではなく計算資源としてのマネタイズ
- 勝手にマイニング事件を彷彿とさせるけど、そういう考え方は面白いかも
- クライアント側でffmpegを使って動画エンコード
- 後半はWASIやProxy-Wasmなど難しかった
- 超ざっくり言うとブラウザをVMみたいに見立てて外のネットワークから独立させて安全に使いたいみたいな感じ?っぽい。クライアントアプリケーションの代替を目指すならそうなるのも必然かと(でもそれブラウザでやる意味が今度は…笑)
Column
- 高校数学「確率のエッセンス」
- 確率の基本(場合の数とか)から書いてある
- 普段日常で一番関わる数学は確率論だと思っていたので
(麻雀のやりすぎ)面白い! - 順列と組み合わせ、確率の計算まではちゃんと覚えてた、確率密度関数が怪しかった
- そういえば学生の頃は「プログラミングはITの知識より前に数学だ」とか思ってたけど、最近はそういうイメージがなくなっている。もちろん触れている分野によるけど、「どんどん細かい部分を意識する必要はなくなってブラックボックス化していく」のがIT界隈全体で進んでるのかなーなど思った
Development
- イラストで明解「Gitコマンド」
- 第一回目、今回は
git status
- 分かる状態は大きく分けて「ファイル変更なし」「ファイル変更あり」「ステージに上っている」の3つ
- あれ、内容こんだけ?笑
イラスト図解も思ったほどのものではなかった、絵は綺麗でかわいい
- 第一回目、今回は
- Pythonの脆弱性
- 2020年に修正されたDoS攻撃に関する脆弱性の紹介
urllib.request
内の正規表現に関わる部分が問題だった- Basic認証の認証方法を伝える引数に大量のカンマを打ち込むとセルフ停止みたいになる(カンマ64個で1時間終わらない)
- 有限オートマトンなど難しい仕組みの話が出てきたど
僕には分からないので要は「正規表現の書き方がまずかった」ということのよう - 普段使っているアプリケーション(今回は言語)でも正規表現でミスを招くことがあるんだーなど。しかもよく使う関数だし面白いなと。
- パズルで鍛えるアルゴリズム力
- 2つの文字列の類似度を測るための動的計画法
- パズル好きだし、こういうアルゴリズムの解説も大好きなんだけど、実際の実装でこういうのをゼロから考えて抜け漏れなく実装できる自信など皆無なので、なるべく頭の良い先人たちが作った資産を流用しようなど改めて思った()
- VS CodeでGitHub Gist
- 僕はブログがあるのでGitHub Gistを使いたいと思ったことはないけど、IT分野で手軽に発信したい人にはやっぱり良さそう
- ちなみに僕は記事の原稿もVS Codeで書いているんだけど、そういう意味では連携やバージョン管理は魅力的に思えた
OS/Network
- サイバー空間の見える化
- さくらの人が色々書いてる、現在のデータセンターの主な内部構造が図示されている
- コンテナのシェアでDockerが65%、Kubernetesが58%・・・など(海外調べ)
- 全世界のサーバー売上推移が2017年くらいに高騰している(この件については特に触れられていない)
- ↑は、2019年時点で約9兆円だとのこと(/年)
そのほか
- なし
Software Design 2021年3月号
この号の分のみ単品で読みたい方は、普通にAmazonで買うのがおすすめ。
紙 or 電子書籍で選べます。