かとじゅんの技術日誌

技術の話をするところ

Rustでブロッキングキューを実装する

Rustでブロッキングキューを実装した話。これはRustのカレンダー | Advent Calendar 2023 - Qiitaの22日目の記事です。 ブロッキングキューはご存じだろうか。(えっ…スレッドはブロックしたくない…と思った人は最後まで読むとよいかも) Javaにはあります。 d…

Scala 3でデータ指向プログラミングは可能か

Scala 3におけるデータ指向プログラミング(以下DOP)について深掘りする。久々にScalaの話題を取り上げるが、これはScala Advent Calendar 2023の14日目の内容でもある。 早速だけど、DOPの基本原則は意外とシンプルだ。 コード(動作)をデータから切り離…

RustでProperty-based testing ライブラリを実装してみた

この記事はRust Advent Calendar 2022 - Qiitaの12日目の記事です。 以前、Rustの実装力をあげるために、Property-based testingライブラリを作ったのですが、それについて説明する記事です。

メモ:値オブジェクトの定義と差異について

「値オブジェクト」の定義について不勉強だったので「DDDの値オブジェクト」の定義とDDD以外の「値オブジェクト」との違いについて、改めて関連書籍を読み直し整理してみました。 すごい長いし細かいので他人に読ませるような記事ではなく、自分のために書い…

Re: Re: ドメイン固有型(値オブジェクト含む)を再考する

kumagi.hatenablog.com こちらの記事への反応です。 違う。値オブジェクトとはID以外で等価判定をするオブジェクトの事であって、RubyのHash、Pythonのdict、C++のstd::unordered_setすらも値によって等価判定を行うのでこれらは値オブジェクトであるがドメ…

ドメイン固有型(値オブジェクト含む)を再考する

DDD

Value Objectが盛り上がっているらしい。 Value Objectについて整理しよう - Software Transactional Memo Value Objectの説明に異論がないものの、主題はValue Object Obsessionのほうですよね。 こちらも聞いてみた。 fukabori.fm よい機会なので、よくわ…

Rustを使ってスケーラブルなプログラムを書く方法

この記事はRust Advent Calendar 2021の12/24日の記事です。 仕事ではScalaを使っていますが、趣味のプログラミングではRustで書いたものが増えました。Rustは楽しいですね。 今回は、Rustでオブジェクト指向プログラミングに関数型デザインを導入することで…

Rustで真に安全なプログラムを書く方法

この記事はRust Advent Calendar 2021の12/8日の記事です。 Rust前提の記事として書きましたが、他の言語にも適用できる考え方なので、ほかの言語勢の方々もよければお付き合い下さい。 今回のテーマは「Rustで真に安全なプログラムを書く方法」についてです…

「DDDで複数集約間の整合性を確保する方法 Rev2」に対する考察

DDD

どうも、かとじゅんです。 松岡さん(id:little_hands)が以下の記事を更新されたそうです。松岡さん自身が悩まれた中で検討したオプションであって、唯一の正解ではないと踏まえたうえで、率直な感想を述べたいと思います。結論からいうと、論旨は前回の記事…

「DDDで複数集約間の整合性を確保する方法」に対する考察

DDD

久しぶりにブログ記事を書きますか。 ということで、松岡さん(id:little_hands)のブログ記事に対する考察記事です。 この記事は古くなったので、ぜひ以下も参照してください。 blog.j5ik2o.me little-hands.hatenablog.com 題材も松岡さんのブログ記事と同じ…

CQRSはなぜEvent Sourcingになってしまうのか

CQRSはなぜEvent Sourcingになってしまうのか、まとめてみたいと思います。 なぜまとめるか、それはCQRSにとってEvent Sourcingはオプションだと誤解されている方が多いからです。この記事を書いてる本人も最初はそう思っていましたが、実際に開発・運用を経…

CQRSはモデルだけでなくモジュールも分割する

掲題についての議論です。 僕の結論はこちら。"モジュール分割せずにモデルを分割するだけ"はCQRSと呼んでいけないのでは?まず原義からちゃんと把握しようというお話。

具体的な実装コードからEvent Sourcingを理解する

DDD Community JPのほうでCQRS/Event Sourcingについて少し盛り上がったので、どういう議論をしたかまとめるのと同時に補足も追加しました。ちなみに、Event Sourcingが主題ですが、CQRSも前提として関係します。その想定で読んでいただければと。 発端はこ…

外部キー制約は何も考えずに適用するとよくない

このブログが話題になってますね。制約を付けること自体はよいことだけど、無目的に適用すると害も生じると思います。 無目的という言い方はおかしいな…。外部キー制約をどのように使えばいいのか、逆にどんなときに使うとまずいのかを考えてみたいと思いま…

CQRS/ESによって集約の境界定義を見直す

peing.net メッセージングシステムのお題のようです。面白そうなのでちょっと考えてみよう。 問題提起 集約候補が以下の3つ。 ユーザー 企業 スレッド メッセージ スレッド集約はメッセージを複数保持するようです。 1000件のメッセージを保持するスレッド集…

Error, Defect, Fault, Failureの定義と解釈

移動しました。 https://zenn.dev/j5ik2o/articles/6c4dbab802c9701fd878

akka-cluster スプリットブレインリゾルバ OSS実装一覧

Akkaクラスターがネットワーク分断に遭遇した場合に、UnreachableメンバーをDown状態に遷移させるためのリゾルバのOSS実装を以下にまとめる。 ちなみに、このリゾルバがない場合はUnreachableのままだとリーダアクションが取れずにクラスターが機能不全状態…

sbtでビルドしたDockerイメージをECRにプッシュする方法

sbt-native-packagerとsbt-ecrを使って、ビルド→ECRログイン→ECRへのプッシュまで行います。 https://github.com/sbt/sbt-native-packager https://github.com/sbilinski/sbt-ecr ECRを作成する レジストリを作る。作成後 以下のようなURIが取得できます。 1…

Microsoft社のDDD, CQRSに関する記事一覧

CQRS+ESパターンの説明 コマンド クエリ責務分離 (CQRS) パターン ステートソーシング(CRUD)の短所としてあげているもの 読み取りと書き込みのデータ表現不一致問題 ステートの同時更新による競合問題 読み取りと書き込みが同じモデルによる、データの誤用問…

Scala.js ウェブフレームワーク Facade 調査(2019年4月版)

主要なウェブフレームワークのFacadeについて調査した(2019/4/17日時点)。 React.js Reactバージョン Scalaバージョン ライブラリ名 スター数 最終更新日時 タグ形式 ReactRouterサポート Reduxサポート 備考 16.6+ 2.12,2.11 japgolly/scalajs-react 1196 1…

ID生成方法についてあれこれ

引っ越しました。 ID生成方法についてあれこれ

akka-streamを使ってmemcachedクライアントを作るには

かなり前になるのですが、akka-streamの習作課題として、Memcachedクライアントを実装したので、概要を解説する記事をまとめます。詳しくはgithubをみてください。 https://github.com/j5ik2o/reactive-memcached TCPのハンドリング方法 akkaでTCPをハンドリ…

「エンティティの同一性を表現するためにequalsをオーバーライドすべきか否か」の感想

毎日、ドメイン駆動設計というか、設計の話が投稿されると、楽しくなりますね。 さて、今日の話題は、以下です! エンティティの同一性を表現するためにequalsをオーバーライドすべきか否か ”稀によくあるサンプル”。多分これ僕が書いた事例ですね。というこ…

akka-httpにswagger2.xを組み込む方法

akka-httpにswagger2.xを組み込む方法を以下に示します。 ※DIコンテナであるAirframeを使っていますが、もちろん必須ではありません。適宜読み替えてくだだい。 ライブラリの依存関係 swagger-akka-httpを追加します。javax.ws.rs-apiはアノテーションを利用…

Getter/Setterを避けて役に立つドメインオブジェクトを作る

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んでます。モデリングに関しては成分薄めですが、よい本だと思います。はい。 Clean Architecture 達人に学ぶソフトウェアの構造と設計作者: Robert C.Martin,角征典,高木正弘出版社/メーカー: KA…

DDDリポジトリを楽に実装するライブラリ

DDDのリポジトリを実装するのがダルいので、ライブラリ化したというか前から書いていたけど、Redis, Memcachedなどの実装も追加したので、簡単に説明を書いてみる。 プロジェクトなどで自前で実装する際も、参照実装として参考になると思います。Scalaの例だ…

sbtでDAOを自動生成する方法

DDDのリポジトリを実装する際、ほとんどのケースでDAOが必要になります。が、ボイラープレートが多く、自動生成したいところです。というわけで作りました。 どうやって自動化するか septeni-original/sbt-dao-generator 指定されたスキーマのJDBCメタ情報と…

jupyter-scala の セットアップ方法と使い方

セットアップ $ pyenv install 3.6.5 $ pyenv virtualenv 3.6.5 jupyter-notebook $ cd jupyter-scala $ pyenv local jupyter-notebook $ pip install --upgrade pip $ pip install jupyter-notebook $ wget https://raw.githubusercontent.com/alexarchamba…

FluxとDDDの統合方法

おはこんばんにちは、かとじゅんです。 久しぶりにブログを書く…。最近、趣味でAngular2やらReactやらやっています。やっとWebpackになれました…。 さて、今回のお題は「FluxとDDDの統合方法」について。Angular2を先に触っていましたが、Fluxといえばやはり…

混乱しがちなサービスという概念について

社内でサービスがよくわからないという話になったので、考察を少しまとめておきます。 過去のエントリでも以下のように触れましたが、もう少しかみ砕いてみよう。 サービスという言葉はあいまい まず、簡単に前提の整理から。単に"サービス"って言葉が何を指…