メインコンテンツへスキップ

ソフトウェアアーキテクチャのためのC4モデル

C4モデルとは
#

ソフトウェアのアーキテクチャを表現するためのモデル。

  • コンテキスト(context)
  • コンテナ(containers)
  • コンポーネント(components)
  • コード(code) で構成される。

C4モデルは特別な表記法を規定していない。以下、ダイアグラムの図はThe C4 model for visualising software architectureを参考に作成した。

flowchart TD
	ソフトウェアシステム:::system
	ソフトウェアシステム --> containerA(コンテナ)
	ソフトウェアシステム --> containerB(コンテナ)
	ソフトウェアシステム --> containerC(コンテナ)
	componentA1:::dot
	containerA:::dot --> componentA1(コンポーネント)
	componentA:::dot
    containerB --> componentA(コンポーネント)
	containerB --> componentB(コンポーネント)
	containerB --> componentC(コンポーネント)
	containerB:::container
	componentC:::dot
 	componentA2:::dot
	containerC:::dot --> componentA2(コンポーネント)
	componentB --> codeA(コード)
	componentB --> codeB(コード)
	componentB --> codeC(コード)
	componentB:::component
	codeA:::code
	codeB:::code
	codeC:::code
	classDef dot fill:#eef,stroke:#f66,stroke-width:2px,color:#aaa,stroke-dasharray: 5 5
	classDef system fill:#faa,stroke:#333,color:#fff,stroke-width:4px
	classDef container fill:#44f,stroke:#333,color:#fff,stroke-width:4px
	classDef component fill:#77f,stroke:#333,color:#fff,stroke-width:4px
	classDef code fill:#aaf,stroke:#333,color:#fff,stroke-width:4px

レベル1 システムコンテキスト ダイアグラム
#

対象システムが、それを使用する人や関連する他システムとの関係性、どのような位置づけにあるかを図示する。

flowchart TD
	pbc(((銀行の顧客))) --> |口座残高参照,支払いに使用|ibs(インターネットバンキングシステム):::system
	ibs --> |口座情報取得,支払いに使用|mbs(メインフレームバンキングシステム)
	ibs --> |メール送信に使用|es(E-mailシステム)
	es --> |メール送信|pbc
	classDef system fill:#faa,stroke:#333,color:#fff,stroke-width:4px

システムコンテキスト ダイアグラムの例

レベル2 コンテナ ダイアグラム
#

ソフトウェアシステムを拡大したもので、それを構成するコンテナ(アプリケーション、データストア、マイクロサービスなど)を図示する。

flowchart TB
	subgraph インターネットバンキングシステム
		direction TB
		wa(Webアプリケーション\nJava ans Spring MVC):::container
		spa(シングルページアプリケーション\nJavaScript and Angular):::container
		mba(モバイルアプリケーション\nXamarin):::container
		wa --> |顧客のブラウザへ配信|spa
		spa --> |API呼び出し JSON,HTTPS|api(APIアプリケーション\nJava ans Spring MVC):::container
		mba --> |API呼び出し JSON,HTTPS|api
		api --> |読み込み, 書き込み|db[(データベース\nOracle Database)]:::container
	end
	pbc(((銀行の顧客)))
	pbc --> |サイトを開き使用|wa
	pbc --> |口座残高参照,支払いに使用|spa
	pbc --> |口座残高参照,支払いに使用|mba
	es --> |メール送信|pbc
	api --> |メール送信に使用|es(E-mailシステム)
	api --> |API呼び出し XML,HTTPS|mbs(メインフレームバンキングシステム)
	classDef container fill:#44f,stroke:#333,color:#fff,stroke-width:4px

コンテナ ダイアグラムの例

レベル3 コンポーネント ダイアグラム
#

個々のコンテナにズームインし、その中のコンポーネントを表示する。コードベースのなかの実際の抽象概念(たとえば、コードのグループ化など)にマップする。

flowchart TB
	spa(シングルページアプリケーション\nJavaScript and Angular):::container
	mba(モバイルアプリケーション\nXamarin):::container
	subgraph APIアプリケーション
		sic(サインインコントローラ\nSprint MVC Rest Controller):::component
		sic --> |使用する|sc(セキュリティコンポーネント\nSpring Bean):::component
		rpc(パスワードリセットコントローラ):::component
		rpc --> |使用する|sc
		rpc --> |使用する|ec(E-mailコンポーネント):::component
		asc(アカウントサマリコントローラ\nSprint MVC Rest Controller):::component
		asc --> |使用する|mbsf(メインフレームバンキング\nシステムFacade\nSprint Bean):::component
	end
	spa --> |APIコール\nJSON, HTTPS|sic
	spa --> |APIコール\nJSON, HTTPS|rpc
	spa --> |APIコール\nJSON, HTTPS|asc
	mba --> |APIコール\nJSON, HTTPS|sic
	mba --> |APIコール\nJSON, HTTPS|rpc
	mba --> |APIコール\nJSON, HTTPS|asc
	sc --> |読み込み,書き込み|db[(データベース\nOracle Database)]:::container
	ec --> |メール送信で使用|es(E-mailシステム)
	mbsf --> |APIコール\nXML, HTTPS|mbs(メインフレームバンキングシステム)
	classDef container fill:#44f,stroke:#333,color:#fff,stroke-width:4px
	classDef component fill:#77f,stroke:#333,color:#fff,stroke-width:4px

コンポーネント ダイアグラムの例

レベル4 コード
#

コンポーネントがどのように実装されているかを示す。

---
title: com.bigbankplc.intenetbanking.componet.mainframe
---
classDiagram
	MainframeBankingSystemFacadeImpl ..> BankingSystemConnection : +uses
	MainframeBankingSystemFacadeImpl ..> GetBalanceRequest : +creates
	MainframeBankingSystemFacadeImpl ..> GetBalanceResponse: +parses
	MainframeBankingSystemFacadeImpl ..> MainframeBankingSystemException : +throws
	BankingSystemConnection ..> AbstractRequest : +sends
	BankingSystemConnection ..> AbstractResponse : +receives
	MainframeBankingSystemException --|> InternetBankingSystemException
	GetBalanceRequest --|> AbstractRequest
	GetBalanceResponse --|> AbstractResponse

参考
#

関連記事

D2 Declarative Diagramming

terrastruct/d2: D2 is a modern diagram scripting language that turns text to diagrams. テキストからダイアグラムを生成するツール。類似のツールとしてはMermaid、GraphViz、PlantUMLなどがあり、以下のサイトでこれらのツールで同じダイアグラムを書く場合の比較が可能。このサイトはD2開発元によるものらしい。 Text to diagram テキストと出力の例 # 公式サイトからの引用 # Actors hans: Hans Niemann defendants: { mc: Magnus Carlsen playmagnus: Play Magnus Group chesscom: Chess.com naka: Hikaru Nakamura mc -> playmagnus: Owns majority playmagnus <-> chesscom: Merger talks chesscom -> naka: Sponsoring } # Accusations hans -> defendants: 'sueing for $100M' # Offense defendants.naka -> hans: Accused of cheating on his stream defendants.mc -> hans: Lost then withdrew with accusations defendants.chesscom -> hans: 72 page report of cheating インストール # d2/INSTALL.md at master · terrastruct/d2 Macの場合はbrew install d2でOK

Obsidianのデイリーノートへ追記するTextwellのアクション

ObsidianのデイリーノートへTextwell から追記するためのアクション。TextwellからObsidianのデイリーノートを書く方法 - Jazzと読書の日々を参考にさせていただき以下の修正を行った。 デイリーノートのディレクトリ構成(YYYY/MM/YYYY-MM-DD.mdとした) 新規作成ではなく追記に変更 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // デイリーノートのルートディレクトリ Root = "journal"; url = "obsidian://"; d = new Date(); y = d.getFullYear(); m = Zero(d.getMonth()+1); // デイリーノートのディレクトリ構成対応(YYYY/MM/YYYY-MM-DD.md) Folder = Root + "/" + y + "/" + m; Title = y + "-" + m + "-" + Zero(d.getDate()); if(Folder) Title = Folder + "/" + Title; if(T.text) url+= "new?content=" + encodeURIComponent("\n") + T.stdin.text + "&file=" + encodeURIComponent(Title) + "&append"; T(url,{option:"cutWhole"}); function Zero(x){ return ("00"+x).slice(-2); }

Textwell

Textwell - The Modeless Textbox for iPhone, iPad, iPod touch, Mac, and Watch. メモ、メッセージ、ブログ、検索、投稿など、あらゆる文章作成タスクに使用できる多目的テキストエディタ ファイリングやスタイリングのための機能はないが、JavaScriptベースのカスタマイズ可能なアクション、自動履歴、クラウド同期などをサポートしており、シンプルで拡張性が高い Mac版、iOS版、AppleWatch版がある Textwell | URL Schemes 自作のアクションなど # ソートして重複行を削除するTextwellのアクション Obsidianのデイリーノートへ追記するTextwellのアクション Amazonから書誌情報をTextwellへ取り込むブックマークレット

機械学習のアルゴリズム選択フローチャート

Choosing the right estimator — scikit-learn 1.2.0 documentationを元にMermaidでまとめた。 flowchart TD A((Start))--> B{50サンプル以上?} B -->|Yes| B1{カテゴリの\n予測?} B -->|No| B2((データを収集)) B1 -->|Yes| C1{正解ラベルあり?} C1 -->|Yes| Z3((分類)):::terminal C1 -->|No| Z4((クラスタリング)):::terminal B1 -->|No| C2{数量の予測?} C2 -->|Yes| Z1((回帰)):::terminal C2 -->|No| H((次元削除)):::terminal classDef terminal fill:#69F 分類 # flowchart TD Z3((分類)):::terminal --> I1{10万サンプル以下?} I1 -->|Yes| I11[線形SVC] I1 -->|No| I21[SDG Classifier]:::method I21 -->|うまくいかない| I22[kernel approximation\nGBDT]:::method I11 -->|うまくいかない| I12{テキストデータ?} I12 -->|Yes| I122[ネイティブベイズ]:::method I12 -->|No| I13[K近傍法]:::method I13 -->|うまくいかない| I131[SVC\nランダムフォレスト]:::method classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px クラスタリング # flowchart TD Z4((クラスタリング)):::terminal --> J1{カテゴリ数は既知?} J1 -->|Yes| J11{<10万サンプル以下?} J11 -->|Yes| J12[KMeans]:::method J12 -->|うまくいかない| J13[スペクトラルクラスタリング\nGMM]:::method J11 -->|No| J21[MiniBatch\nKMeans]:::method J1 -->|No| J3{<10K samples} J3 -->|Yes| J31[MeanShift\nVGBMM]:::method J3 -->|No| J34((不運)) classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px 回帰 # flowchart TD Z1((回帰)):::terminal --> D1{10万サンプル以下?} D1 -->|No| E1[SGD回帰分析]:::method D1 -->|Yes| E2{説明変数xの一部が重要?} E2 -->|Yes| F1[Lasso\nElasticNet]:::method E2 -->|No| F2[Ridge\n線形SVR]:::method F2 -->|うまくいかない| F3[SVR Kernel='rbf'\nEnsembleRegressors]:::method classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px 次元削除 # flowchart TD Z((次元削除)):::terminal --> H[Randomized PCA]:::method H -->|うまくいかない| H11{10万サンプル以下?} H11 -->|Yes| H22[Isomap\nSpectral Embedding]:::method H11 -->|No| H3[kernel\napproximation]:::method H22 -->|うまくいかない| H4[LLE]:::method classDef terminal fill:#69F classDef method fill:#f9f,stroke:#333,stroke-width:4px

2ホップリンク

ホップ数 # flowchart LR B1 & B2 --> A G --> O1 H --> O1 A --> O1 & O2 O2 --> E F --> O2 B1:::hop1 B2:::hop1 O1:::hop1 O2:::hop1 F:::hop2 G:::hop2 H:::hop2 style A fill:#f9f,stroke:#333,stroke-width:4px classDef hop1 fill:#a9a classDef hop2 fill:#f96 ホップ数とは自身から任意のページまでたどり着くまでのリンクの数である。 このようなリンク関係がある場合、ページAから見て、B1 B2 O1 O2は1ホップリンクと呼ばれる。 2ホップリンクの意味 # このため、上記のリンク関係で言えば、ページAから見たG H E Fは2ホップリンクとなる。 Scrapboxでは2ホップリンクの内、アウトゴーイングリンクのページへリンクしているページ、つまり、 AからリンクしているO1へリンクしている Gと H AからリンクしているO2へリンクしている F を関連リンクとして表示している。これは、 A→C, B→Cというリンクが存在するとき、AとBの間にはなんらかの関連があると考えてよい。 「和歌山」→「みかん」、「愛媛県」→「みかん」 ならば「和歌山県」と「愛媛県」はみかんつながりになっているわけだし、 「増井」→「Rubyプログラミング」、「高林」→「Rubyプログラミング」 ならば「増井」⇔「高林」は意味がある。 出典: 2ホップリンクの考察 - 増井俊之 上記の考え方に基づく仕様であり、本サイトでもQuartzを拡張し同様の2ホップリンクを表示している(各ページ配下の「関連リンク」) QuartzにScrapbox的な2ホップリンクを追加する Obsidiaのリンク表示 参考情報 # 2ホップリンクの考察 - 増井俊之

Hugo

オープンソースの静的サイトジェネレーター。go言語で記述されておりページ生成の速度が速くカスタマイズ性が高い。 The world’s fastest framework for building websites | Hugo Hugo関連のノート # Hugoメモ Hugoのショートコードをうまく使い回す方法 Hugoのローカルサーバでページが表示されない場合 Hugoで本文の先頭画像をアイキャッチとして使用する Hugoでローカルサーバのみ実行する処理を書く方法 Hugoで楽譜を描画する(abcjs) Hugoのレンダーフックを使ったMermaidの利用 Hugoのショートコード入力を支援するChrome拡張 Hugoでイメージギャラリーを表示するhugo-shortcode-gallery Hugoで写真をリサイズしExif情報を表示する