2020年12月1日火曜日

アメリカ史 下 (YAMAKAWA SELECTION) 紀平 英作

20世紀及ぼ21世紀のアメリカについて記述されている。時代が近いので上巻よりは面白いがそれでも淡々と歴史が語られているという点は同じである。

産業の発展で大量に生産されたものを吸収することが出来ずに大恐慌に突入し、それを回復させたのは戦争であった。

ただ、景気が上向くと福祉に対して予算が振り分けられる様になり始めている。

第二次世界大戦においては、国民の総動員が必要とされるという特性から黒人や女性の社会への進出が促された面もあるようだ。

50年代からは景気は上向き続け、中産階級が生まれている。社会全体が豊かになり貧困がなりを潜める時代らいい。

これらの人たちは、現代の老人世代となる人達だ。

豊かな成長は長期間は続かず、景気が冷え込むとともに社会のありようも変わる。雇用が守られることはなく貧富の差は拡大し始める。

アメリカのひどい貧富の差の拡大というのは、80年代から続く傾向のようだ。除法技術がそれに拍車をかけたにせよ、政治的にもそのような方向に向かっていたようだ。

9.11でアメリカは一体化したかに見えたが、実際には分断し続けている。というの実際のところに感じる。

分断の種類は、人種だったり、労働者かどうかなどだったり、時代によって変わるが、常に分断と対立の国内政治という感じだ。

だからこそ2大政党制というの機能しているのかとも思う。

黒人差別も同様で、常に改善が模索されるが大した改善はしないというところだろうか。

興味深いのは、アメリカ社会にも基本的には良心があり、景気の拡大と資本の集中が行き過ぎると社会福祉に関心が向いて、大統領がそのような課題に取り組むということだ。ただし、取り組んだとしても国内の反発にあい、政権は大きな成果を残すことなく社会福祉の課題解決には至らないという点だ。

おそらく次期政権も社会福祉政策を実行しようとするだろうけれども、反発にあい実現しないのではないかと思う。

結果的に、外交に力を入れるようになり核の拡大につながらないかは懸念される。軍事予算が増えれば工場が増えて労働者に富が分配されるので心配である。

一貫しているように感じるのは、経済的な影響力を強めた集団が自分たちの利益のための決断をしていくという点だけな気がする。

2020年11月2日月曜日

とてつもない数学

面白いが、数学を知らない人が数学の面白さや美しさを感じるための本というよりは、すでに数学に触れて美しいなと感じている人が共感するための本かなという感じはする。
子供が将来読んだら面白いだろうかと思って読んでみたが、少々内容が数学好きのために書かれていると感じる。

ただ、奇数を足し合わわせていくと平方根とか
19x13の掛け算が平面図形で考えかえると簡単に理解できるようなところなどは、数学の面白さがわかりやすくかつ簡単に書かれていると思う。

 とてつもない数学 永野 裕之 https://www.amazon.co.jp/dp/447810882X/ref=cm_sw_r_tw_dp_x_RT6NFbWHZNNTH

2020年10月28日水曜日

アメリカ史 上 (YAMAKAWA SELECTION) 紀平 英作

11の国のアメリカ史――分断と相克の400年

を最初に読んだが、アメリカの歴史についての知識がなさすぎて難しかったので、入門書として読んだ。
本としては、歴史が列挙してあるだけなので、物語性はなく、退屈といえば退屈である。
ただ、黒人解放のための南北戦争だったのかというと、そうではなく、南部の独立を阻むだめの戦争に過ぎなかったとか。
北部も、奴隷制は非人道的であるが、黒人が白人と平等かというと全くそんなことは思っておらず、むしろ差別意識があり、黒人を集めてアフリカに送り返すのが良いと思っていたりとか。
黒人奴隷を所有しているのは、白人でもごく一部で、奴隷主と非奴隷主で利害関係の対立があったことも奴隷制の廃止に寄与したとか。
よくよく考えれば当たり前だが、奴隷制の廃止は、黒人のことを考えた結果ではなく、白人同士の利害関係の対立の結果として発生しているにすぎ無いというのが分かる内容ではあった。

奴隷解放後も黒人差別はのこるというかむしろ悪化するなどしている点も興味深い。また、貧富の差の問題など100年以上前からある課題が、世界1の経済国家でも克服できていないというのは、もはや克服する気はなく、政治家のパフォーマンスの道具程度の意味合いしか無いのだろうなとか思うなどする。

そういった気づきを得られたという点では良書だと思う。

学生向けというよりは、ニュースなどをある程度見ている社会人向けかと思う。

アメリカ史 上 (YAMAKAWA SELECTION) 紀平 英作 https://www.amazon.co.jp/dp/4634423812/ref=cm_sw_r_tw_dp_x_P0xMFb21B7PK6




2020年10月5日月曜日

詳解HTTP/2

 ためにはなったけど、アプリケーションを作る立場の人はあまり学びがない気がする。

通信内容をみてデバッグしようと思ったときでも、そんなに役に立たない可能性がある。


インフラ周りを構築する際には良いのかも。という程度。


詳解HTTP/2 Barry Pollard https://www.amazon.co.jp/dp/B087JFFK9V/ref=cm_sw_r_tw_dp_x_5wSEFb21NFFFJ

2020年9月24日木曜日

おいしい昆虫記

前半は面白かったけど、終盤は息切れ感がある。

最終的に昆虫で生活が安定するところまで行っていれば、物語として楽しめたけど、まだ途中という感じ。

昆虫食自体のデータに基づいた価値を説く本ではないので、仕方がないが、もう少し昆虫の食べ方などのこの先の展開などの示唆があると良かった。 


おいしい昆虫記 (Natsume-sha Science) 佐伯 真二郎 https://www.amazon.co.jp/dp/4816368957/ref=cm_sw_r_tw_dp_x_tbaBFbY9ARQDY

2020年7月8日水曜日

実践 ソフトウェア アーキテクチャ

1章
アーキテクチャーは、技術やメンバーだけでなく様々なものに影響を受ける。
アーキテクチャーは少人数で作成さ、文書化されなければならない。
この章に書いてあることが全体のチェックリストになる気もするので、あとで書き下す。

2章
アーキテクチャーは利害関係者のコミュニケーション手段
初期の設計方針を決める。品質特性を決める。組織構造を決定する。再利用可能なものを抜き出すことができる。

どのようなコード単位で構造化するのか?(モジュール)
実行時の振る舞いの単位(コンポーネント)とその相互作用(コネクター)
それらをどの環境に置くか(割当)
の大きく分けて3つのビュー(見方)がある。
更に、細部には様々な要素があるがすべてをドキュメント化する必要はない。

論理ビュー
 オブジェクトやクラスなどの(モジュールビュー)
プロセスビュー
 並行性と機能の分散を扱い
配置ビュー
 ライブラリや開発の単位
物理ビュー
 プロセスや通信のノードへのマッピングを示す

How(どのように)よりはWhat(何を)するのかを明らかにすることで、議論ができるようになる。


3章
A7-E航空電子工学プロジェクトを具体例としてアーキテクチャーの構造について説明している。
分割構造は、どのようにモジュールに分割するのか?
ハードウェアを隠蔽するモジュール
ビジネスロジックを分割していくモジュール
アルゴリズムなどを格納するモジュール

使用の構造は、どの処理がどの処理を参照するのか?などだ。Layer化アーキテクチャだと改装をまたいだ参照はしないなど。

プロセス構造は
同期の順番や排他制御の場所など

航空機の具体的なものはそんなに語られていない。


第2部
アーキテクチャーと品質について。
品質はむる人によって変わる。

4章
アーキテクチャのなかで特に重要な品質特性について。
また、品質特性をどのように表現するのか。
品質特性は
刺激の発生源、刺激、環境、成果物、応答、応答測定
から表現される。



可用性を具体例とすると


可用性のシナリオ
  • 刺激の発生源
    • システムの内部/外部
  • 刺激
    • クラッシュ、障害
  • 成果物
    • システムの処理、メモリー、プロセッサ
  • 環境
    • 通教稼働している状況か、異常な状況か。
  • 応答
    • 記録をとる、通知をする
  • 応答測定
    • システムが使用可能な時間の計測、縮退状態の時間計測
変更性のシナリオ
  • 刺激の発生源
    • ユーザー、開発者、システム管理者
  • 刺激
    • 機能、品質特性に対する追加改善変更
  • 成果物
    • システム、UI、プラットフォーム
  • 環境
    • 実行時、コンパイル時、設計時の環境
  • 応答
    • テストし、配置する
  • 応答測定
    • 時間、コスト
性能のシナリオ
  • 刺激の発生源
    • ユーザー
  • 刺激
    • トランザクション、秒間X回、read, write
  • 成果物
    • システム
  • 環境
    • 通教状態/非常状態/高負荷状態
  • 応答
    • トランザクションが処理された結果
  • 応答測定
    • イベントが発生してからの応答の時間

セキュリティのシナリオ
  • 刺激の発生源
    • 個人/システム、権限のある/ない、
  • 刺激
    • データの変更の試み
  • 成果物
    • システム内のデータ
  • 環境
    • オンライン/オフライン、ファイアウォール内/外
  • 応答
    • アクセスを承認する/拒絶する/記録する
  • 応答測定
    • アクセスの記録/攻撃の検出/データの復元
テストの容易性のシナリオ
  • 刺激の発生源
    • テスト担当者
  • 刺激
    • テストの実行
  • 成果物
    • 設計、コード
  • 環境
    • 設計時、コンパイル時、Deply時
  • 応答
    • テスト結果
  • 応答測定
    • カバー率、実施時間、依存関係

使いやすさのシナリオ
  • 刺激の発生源
    • ユーザー
  • 刺激
    • ユーザーニーズ、効率的に使いたい、エラーを最小化したいなど
  • 成果物
    • システム
  • 環境
    • 実行時、設定時
  • 応答
    • システム学習支援/効率的な利用支援/エラーの最小化/国際化
  • 応答測定
    • 作業時間、エラー数など
様々な品質特性はトレードオフの関係にある。これを比較するために刺激に着目し、関連するのか独立しているのかをまとめると良い。

他にも規模拡張性、移植性などの品質特性がある。

ビジネス品質
  • 市場投入までの時間
  • コストと利益
  • システムの寿命予測
  • targeted market
  • 改善投入スケジュール
  • 既存システムとの統合


5章
アーキテクチャーの実現方法がテーマではあるが、やや抽象的な話に終止する。
可用性
多数決というのは、複数システムにより処理して、多数のシステムがOKならOKとかそういうこと。
変更容易性
セキュリティ
使いやすさ
性能
テスト容易性

6章
航空管制システムを例にとって説明している。
物理ビューや分割ビューなどあって実用的かも。

実現方法をすべて細かくはかけないが、これらをチェック・ポイントして見直せば良いと思う。
物理ビュー
モジュール分割ビュー
プロセスビュー
クライアント・サーバービュー
コードビュー(機能がコードのどこにmappingしているかを示す)
対障害性ビュー

各ビューはシステムの異なる視点からの記述であるため、当然同じような名刺が登場する。
アプリケーションはプロセスやクライアントサーバービューに出てくるといった具合だ。
マッピングを示すことでわかりやすくなる。
ただ、これらは完璧なセットではない。システムによって必要なビューは異なる。
そのシステムがどのような品質特性を満たそうとしているのかを記述するためにこれらはセク製される。

7章
アーキテクチャーを具体的にどのように設計していくのかのステップが記述されている。
そのまま全文のせたいくらいである。
  1. 分割するモジュールを選択する
  2. モジュールを詳細化する
    1. アーキテクチャドライバを選択する
    2. アーキテクチャパターンの選択
    3. 複数のビューを用いながらモジュールをインスタンス化して、機能性を割り当てる
    4. サブモジュールのインターフェースを定義する
    5. ユースケースと品質シナリオをサブモジュールの制約として検証して、詳細化する
アーキテクチャドライバとはシステムの方向を決める要求のこと

8章
シュミレータについての具体例を示している。
統合容易性という大規模システムでは非常に重要なものを取り扱う。

リアルタイム処理と逐次処理の2つの統合について語られているが、具体的には以下のところくらいだ。


Timeline Synchronizerなるものが統合のメインになりそう。

9章
アーキテクチャーの文書化とは、各ステークホルダーのコミュニケーションの促進であり、システムへの理解を助けることにある。
見るステークホルダーのコミュニケーションのニーズがどこに有るのか?によって視点が変わり、書くべきことも変わる。

具体的な文書化の方法が書かれており、全体的にリスト化したいところだ。

適切なビューを選択すべきである。

  • 候補となるビューをリスト化する
  • ビューを組み合わせて文章を見る人のニーズを満たせるかチェックする
  • 優先順位をつける
各ビューでは、
  1. プライマリープレゼンテーション
  2. 要素カタログ
  3. コンテキスト図
  4. 可変性ガイド。どのように変更できるか
  5. アーキテクチャーの背景
  6. 用語集
  7. その他の作者や変更履歴など
を記述する。
また、インターフェースを定義しなければいけない。
どこのインターフェースということだが、システムのインターフェースになると思う。
リソースに着目し、どのリソースをコントロールするモジュールで、どのリソースを提供したり利用したりするモジュールなのかなど。
  1. インターフェースの識別子(名前やID)
  2. 提供するリソース
  3. データ型
  4. 例外の定義
  5. 提供されるか編成(関数を受けれて処理を変えられるのかなど)
  6. 品質特性の特徴
  7. 要素の要求
  8. 根拠と設計の背景
  9. 使用ガイド
また、ビュー間をまたぐ文書を作成する必要もある。
ビュー同士の関係を記述することでわかりやすくなる。
  1. ビューカタログやビューテンプレートを利用し
  2. システムの概要とビュー間の要素のマッピングを記述し
  3. なぜそれが選ばれたのかを記述していく
モデリングにはUMLなどを用いても良い。

10章
アーキテクチャーを再現する。
文書がないときに作ることに相当する。
データから分け始めて、ツールに夜よるのが良さそう。


第3部
アーキテクチャーを評価するのは計画的に行われるべきで、それが早期に行われることでシステムの問題が浮き彫りになる。
ATAM、CBAMなどの具体的手法もある。

11章
ATAMの説明と具体例について記述している。
ATAMについては、かなり具体的にきじゅつされている。
評価チーム、アーキテクト、ステークホルダーの3つの集団が評価に参加して、最終的にレポートを上げる。
評価方法のステップまで示されているので、この本に書いてあることをそのまま行えば、きちんと評価できる気はする。ただ、細かすぎるので中くらいのシステムやアーリータイミングでのシステムでは向かないかもしれない。
ただ、規模感を小さくして行うのは価値があると思う

12章
CBAMの具体的な進め方についての記述がある。
コストを考えてて、そこからアーキテクチャーを評価することになるという切り口。
品質特性とコストを場合分けして、それについて投票して決めていくというのは有効な手段であると思う。
ただ、利益を計算して費用対効果が最も良いものを選ぶとあるが、利益がかんたんに計算できることは稀だし、資料作成者の作為が入る可能性が高いと思うので、利益については考慮しないほうが良いのではないかと個人的には思う。


13章
WWWの発展を通して、アーキテクチャーの変更容易性について記述している。
具体的すぎて、逆にWWWの紹介のようになっている。
また、ちょっと規模感が大きすぎて参考にならない面もあるとおもう。


14章以降
プロダクトラインに対する考えと具体例が続く。
プロダクトラインの考え方は、市場に投入する製品群にたいして適切な共通システムを抜き出して再利用するのか?という点にある。
少々ハードウェア寄りで、現在のシステム開発とは違う気もするが視点として共通部分を抜き出すというのは考えるべきところだと思う。


全体を通して言えるのは、組込みシステムなどに向けたアーキテクチャーの例が多いという点だ。
CPUや物理の構成を理解するのは重要だが、現在はそれらも抽象化されており、ある程度雑な見積もりをしてもあとから変えられる部分が大きいので、低レイヤーの設計において、この本の書いてあることを忠実に守る必要はないと思う。
ただ、手法や考え方は現代にも通じると思うし作業リストを作る際の抜け漏れなどをチェックするにも非常に有効な本だと思う。



2020年6月5日金曜日

マイクロサービスパターン[実践的システムデザインのためのコード解説]

良い本でした。
マイクロサービスというタイトルだけどアーキテクチャーについて網羅的に記述ている。

Chap1
SOAとの違いは、データベースがサービスごとにありグローバルに参照するわけではないこと。
単純なアプリならモノリシックな方が良いことのほうが多い。


Chap2
command=データの更新系
query=データの読み出し
業務(ドメイン)に従ってサービスを分けていく


Chap3
Service間で通信は必須

同期・非同期がある。
同期ではOpenApi、gRPCが主に使われる。
Circuit breaker(失敗が続いたら受付を止める処理)は必須。
マイクロサービスのフレームワークにあったりするので探すのが良い。
サービスディスカバリーもEurekaなどライブラリーがある。
Dockerやk8sはサービスディレクトリを提供する。可能な限りこれを使うほうがメンテナンスがしやすい。

非同期ではmessage brokerがメッセージを仲介する
非同期では、リクエスト/レスポンスのスタイルと一方通行の2種類のスタイルを分けてドキュメントを作る必要がある。
Kafka/JMS/RabbitMQなどがある。
MQはat least onceなので、重複するメッセージが来る。
冪等性の確保は必須。データベースにmessage idを保存するなどして対処する
メッセージの送信の信頼性の確保にはoutboxデータベースを送信元で作成して、それをpolingするかdbのtransaction logをtailingする。
著者はEventuate tramというフレームワークで高レベルapiを用意している。

非同期にすることで可用性は上がる。


Chap4
サーガとは複数のサービスで一つの目的を達成するための単位。
コレオグラフィとオーケストレーションの2択がある。
コレオグラフィは、各ServiceがP2Pで連携するイメージ。
オーケストレーションは、O家すとれーたクラスで一括管理すつ方法。
オーケストレーションの方が、一箇所にまとまりやすいのでおすすめ。

オーケストレーションでステートマシンで管理するのがよい。
ロールバックなどの命令もここでやる。
サーガには3ステップある。
補償可能トランザクション:補償トランザクションでもとに戻すことが可能。
ピボットトランザクション:このトランザクションが成功したらあとは成功するのみの分岐点。
再試行可能トランザクション:ピボットトランザクションのあとで確実に成功するトランザクション
カウンターメジャーで、処理の順番の不整合に対処する。イベントが期待通りの順番に飛んでこないこともあるので、その場合に対処する道具がカウンターメジャー.。
pendingなどの状態で管理するsemantic lock
処理の順番が入れ替え可能にするcommunicative update
処理の不整合が発生しそうなupdateを最後に持ってくるpessimistic view
処理の最初にreadして、もう一度更新前にreadした値が更新されていないかcheckするreread value

OderServiceがOderSagaStateを作成するような形で、Sagaを作るのもまたService

Chap5
外部イベントを受け取るHandler
外部にイベントを出すPublisher adapter
データベースとやり取りするDatabase adapeter


Aggregateはそのroot同士だけでやり取りする。
主キーでお互いに参照するoderが参照するconsumerはconsumer idとなる
1つのトランザクションに対応するのは1つのaggregate


Chap6
イベントソーシング
アグリゲートを永続化するときにそのデータを保存するのではなく、イベントをすべて保存することで、あとからそのイベントをすべて処理することで、前回の状況を再構築する。
アグリゲートはprocessとapplyに分かれる。
processでイベントを複数作成し、そのをapplyでアグリゲートに適用。
イベントを保存する。
イベントを途中から再開するときは、イベントのセットを読み出してapplyを繰り返し呼び出しアグリゲートを復元。processを呼び出して新しいイベントを作って、また同じことの繰り返す。
イベントを複数処理し終わったアグリゲートを保存したスナップショットを作ることでパフォーマンスは上がる。
冪等性担保には、processed_idをtableにwriteすることで対応。
イベントソーシングでのイベントの更新には、アップキャストと言う方法を用いる。
データベースからイベントをloadするときにインスタンスを新バージョンに変えるのだ。

Chap7
CQRS
コマンドとクエリーの分離を意味する。
クエリー用のDBを作成することで、複数回のネットワークアクセスをしないようにするなどの工夫ができる。
レプリケーション遅延の問題なども起こるが、UI上の問題であればClientのDBを予め更新しておき、あとからServerと同期する形にしても良い。


Chap8
GatewayはそれぞれのFrontend向けにできるだけ分けたほうが良い。
gatewayは
認証、認可、流量制御、cahcing、メトリクスの収集、リクエストのロギングなどの役割がある。

API Gatewayも製品がある。LongやTraefikなどZuul、Spring Cloud gatewayもある。

GraphQLはスキーマ、リゾルバ、Proxyに分かれる。スキーマはI/F、リゾルバはServiceとのmapping、Proxyは実際のServiceの呼び出し。
GraphQLを使うメリットは、クライアントがqueryを打てるようになるイメージに近い。
様々なデータを様々な組み合わせでよく取得するような場合に、最も効果を発揮する。


Chap9
Serviceごとの契約(I/F)の検証としてSpring Cloud Contractなどがある。
Pactフレームワークの一種


Chap11
サービスはそれぞれ、観測可能であるべき。
Health check api
Log aggregation:複数のログをまとめ上げて、開発者が見られる形にする。log4Jとか。Elasticsearchとか、LogstashとかKibanaとか。
Distributed tracking:リクエストに紐づくIDを与えて各サービスでも追いかけられるようにする。分散トレーシング、Zipkinとか
Exception tracking:例外をcacheして開発者にアラートを送る。HoneyBadgerとかServlet Filterとか
Application metrics:カウンターやゲージなど
Audit loggging:ユーザーの行動を計測する。Spring AOPとか。

Microservice chassis(マイクロサービスシャシー)、必要なものが一通り揃ったやる。
Spring Cloud、Spring Bootとか。


Chap12
デプロイは、まあDockerだろうな。
Istioが最もポピュラーなサービスメッシュ
k8sつかって、Envoyをサイドカーとしてデプロイする。
いろいろ変わりそうなところではある。

Chap13
モノリスのリファクタリングについて。
まずは、モノリスのGatewayに相当する部分を抜き出してみる。
新規機能追加のときにServiceとして作ってみる。
必要なデータは、レプリケーションなどしてコピーしたりもする。
マイクロサービス化していったときに、モノリスをロールバックするのは不可能と言って良い。
なので、モノリスは最後の最後に、処理が終わったら必ず成功まで行くという後半に持ってこないといけない。








https://www.amazon.co.jp/dp/B086JJNDKS/ref=cm_sw_r_tw_dp_U_x_e8q0Eb9X2E665