かとじゅんの技術日誌

技術の話をするところ

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

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

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

掲題についての議論です。 僕の結論はこちら。"モジュール分割せずにモデルを分割するだけ"はCQRSと呼んでいけないのでは?まず原義からちゃんと把握しようというお話。 CQRSするにはC/Qは独立しないとダメなので、それをどう連携させるかすごい難しい課題。…

具体的な実装コードから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といえばやはり…

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

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

CQRS+Event Sourcingを学ぶための教材

超久しぶりのブログ…。 Octopressに疲れたのではてなブログに戻ってきました(Octopressの過去の記事ははてなブログにインポート済です)。ついでプロに移行。 さて、海外のDDDコミュニティではCQRS+Event Sourcing(以下, ES)が人気なのですが、ようやく日本で…

DDDのリポジトリのインターフェイスをどのように設計すべきか

scala-dddbase scala-dddbaseではどのようなインターフェイスとしているか? 以下のようになっています。 戻り値はモナドにラップして返すことを想定しているので、高階型としてM型を指定できるようにしました。一般的にMには、同期型リポジトリとしてはTry…

ServiceとDCIについて

面白そうなネタがあったので、自分なりの考えをまとめてみる。 Ruby/Rails 用 DI コンテナ Dee をつくった、あるいは Ruby のカルチャーについて この記事はRuby用のDIコンテナの話題なんですが、DCIについても言及されているようです。比較軸はDIそのものと…

ScalaでのDCIの実装を考える

みなさん、こんばんわ。 会社のアドベントカレンダーで、Scalaコードでわかった気になるDDDというブログを書いたのですが、最近、老害を防ぐためにDCIについても勉強中です。 DCIアーキテクチャ - Trygve Reenskaug and James O. Coplien とりあえず、これを…

ドメインモデルの関連を表現するには

(Scala前提の記事なので注意してください) たとえばこんなモデルがあって、相互に依存しているケースを考えよう。 注意:説明を簡単にするために、varを利用しています。 従業員 class Employee( val id: Long, val name: String, var department: Option[Dep…

シナリオ -> モデル -> コード ->

昨日もDDDの話題を少ししたので、シナリオ→モデル→コードのサイクルについて身近な例を踏まえてネタを提供できないかと思った。何でもいいんだけど、鍼とか整体とかマッサージとか一度は行った経験あると思うので、そのドメインで考えてみるか。

ユビキタス言語とドメインモデル、そしてモデル探索のうずまき

最近、ドメイン駆動設計ってどうやって実践すればいいかなーという質問をよくされるので、この記事が満額回答にはならないと思いますが、書いてみたいと思います。 シンプルな問題はトランザクションスクリプト、いわゆる手続き型で対処できます。問題が小さ…

Re: Scala の Trait

trait 便利ですね! メソッド名が衝突する。 override を指定してやると動く。 scala> (new M with N { override def m = super[N].m }).m() hi @rosylilly Scala の Trait trait Mとtrait Nは継承関係もないので別の型として識別されているから仕方ないんだ…

ドワンゴを退職しました

2/28日付けでドワンゴを退職しました。お世話になった会社なのでちゃんとお礼をいっておこうと思います。 初めてのコンシューマ向けウェブサービスでした。とてもよい経験をさせてもらいました。ありがとうございました。 一番大きいところは、ScalaとDDDを…

関数のカリー化と部分適用

今日は、カリー化と関数の部分適用の話題。 Haskellの視座からScalaのカリー化と部分適用を見てみる まず、Haskellでの関数のカリー化と部分適用についておさらい。 例えば、引数を合計する関数 mysum があるとして、 mysum :: Num a => a -> a -> a -> a my…