赤シャツエンジニア

赤シャツエンジニア

エリック・エヴァンスのドメイン駆動設計 1章を読んで

ddd-community-jp.connpass.com

上記のイベント参加前に「エリック・エヴァンスのドメイン駆動設計 1章」を読んでの殴り書きです。

活動のサイクル

  1. 開発者が(現時点で描ける)ドメインモデルを作成する
  2. ドメインエキスパートを含めたプロジェクト関係者と話す。話す内容は以下の通り
    • 現在着目しているシナリオ(つまりユースケース?)にドメインモデルが適合しているか?
    • ドメインモデルあるいはシナリオで登場する言葉に違和感はないか?
    • 不要な概念はないか?
  3. 結果を整理し、最初に戻る

現在着目しているシナリオにドメインモデルが適応しているか

  • 筆者の環境ではドメインモデルが書いてある資料を見て、その製品の有識者が「このパターン忘れてない?」「こんなときはどうするの?」という発言がそれに当たると考える

ドメインモデルあるいはシナリオで登場する言葉に違和感はないか?

  • そっちでは「XX」って書いてあるけど、普段は「YY」って言っているやつねという発言がそれにあたると考える
  • 2章をチラ見したら熱く語られている。とにかくばらばらの言葉を使っているとコストがあまりにも高くつきすぎる

不要な概念はないか

  • ドメインモデルが書いている資料をみて、設計者・有識者が「そのクラスいる?」「なんかかぶってない?」という発言がそれに当たると考える
  • 筆者の例では、以下のようなことがあった

電源制御のコンテキストの中で停電が発生した際のシステムのふるまいをモデリングしていた。 具体的には、停電発生時に、UPSが落ちきる前にシステムを安定状態に持っていくというものをモデルに入れていた。 しかし、電源制御なので、電源周りを責務するはずで、

  • 内外部の状態、指示に応じて電源をONしたりOFFしたりする
  • 電源の現在の状態を通知にしたり、要求に対して応答したりする

以上のことを実施するとおかしいという指摘が入った。 結果としてシステムを安定状態に持っていくのはシステムがわのコンテキスト側でモデリングし、 電源制御はUPS時間待機し、システムの安定状態を受信するか、UPS時間が満了した場合に電源を落とすというモデルに変更した。これで、モデルはすっきりし、電源制御の役割も明確化した。完ぺきではないかもしれないが、エヴァンス本でのモデルの蒸留(不要な概念の排除)を体験した。

所感

  • エヴァンス本にでてくるドメイン・エキスパートがミーティングに積極的だなと思いました
    • エリック・エヴァンスのドメイン駆動設計 輪読会 1回「序文、目次、索引」でも話されていましたが、ドメインエキスパートが近くにいなかったり、捕まらなかったりしてこれが実現できない現場はあるだろうなと
    • ここでは省略されていますが、ドメイン・エキスパートを据えることが設計・開発プロジェクトにとってどれだけ重要であるがということが共有されていないと難しいと感じた
    • 逆に、エヴァンスの例やDDDが実践されている組織はその認識が持てるような工夫があるのかもしれない

水中ポンプを動かす

背景

1,2年前に水中ポンプを動かそうとしたら動きませんでした。 マイコンで水中ポンプを制御して、植物の世話をするようなものにあこがれていたのですが、そもそも水中ポンプ制御自体ができなかったので投げていました。 先日ひょんなことから水中ポンプを手に入れたので、もう一度チャレンジしたらうまくいったので、備忘録として残しておきます。

準備物

水中ポンプ用に5Vをつくりたかっただけなので、AC100V/DC5V電源があれば、それ単体で実現できますが手元になかったので、この構成で実現します。

f:id:mametarou963:20200628003931j:plain

検証

シンプルにつなぐだけで、動きました。 リレーで制御して、電源周りをもっとすっきりさせれば、M5StickCなんかでお手軽に制御できそうです。 材料がそろえば試してみたいと思います。

M5StickC+UIFlow+ThingSpeakで軽量で意味のないIoTシステムを作る

概要

とにかくM5StickCのボタンを押すと、web上でボタンを押したことが確認できるだけのものを作ります。 IoTシステムを作る際にM5StickC側であまり悩みなくなかったためお試しでやってみました。

ThingSpeakは以下の理由により、今回の目的に合致しているため採用しました。 - Web APIが提供されていること - 送ったデータを勝手にプロットしてくれるところ - ごちゃごちゃした設定がいらないところ

Web APIではなく、mqttなどでデータを送信するのがIoTの主流のようですが、 UIFlowベースでAWSなどに接続している記事は見当たらなかったため、Web APIを選択しました。

準備するもの

  • M5StickC
  • ThingSpeakのアカウントとチャンネル ※アカウント作成とチャンネル生成は省略します

UIFlowのコード

内容としては以下のようになります

  • wifi接続
  • Aボタンを押すとカウントアップした値を送信
  • 応答結果を表示

f:id:mametarou963:20200621210235p:plain

f:id:mametarou963:20200621210238p:plain

httpのURLはThingSpeakのMyChannelの「Write a Channel Feed」を参考にして貼り付けます。

使用感

注意点としては、ボタンを押すのは15秒以上あけてから送信しないとThingSpeakが値をとってくれないことです。 これは無料版アカウントの仕様で、有料版なると1秒おきでも問題ないようです。

M5StickCのAボタンを押すと、通知が送信されて、ThingSpeakに無事表示されていることが確認できました

f:id:mametarou963:20200621210722j:plain

f:id:mametarou963:20200621210626p:plain

所感

Httpはrequest成功で200を返すのに、UIFlow上ではFailのほうに入ってきて判定してしまうところがわかりにくかったです。 どんな時にsucccessになるのだろうか。

あと、15秒以内に発行した場合、Httpブロックから出てこないことが多々ありました。 この状況になってしまうと使い物にならないため、実運用では気を付けないといけないと感じました。 タイマーなどで対策しても良いと思いましたが、根本的解決ではなさそう...

M5StickCとUI-Flowでwifiに接続する

マイコンなどでwifiに接続する際にはおまじないのようにwifi接続のコードを書きますが、 UI-Flowだとかなりサポートが手厚いのであっさり書けます。

必要な物

  • M5StickC

UI-Flowのコード

以下のようにします。

f:id:mametarou963:20200621171008p:plain

再接続を考慮してもこの少なさ。ありがたいです。

6060-PUSHをm5stickCで動かす

概要

6060-PUSHはm5stack公式で販売しているアプリケーションモジュールです。 switch scienceは取扱などがなく、amazonではも2020年6月現在取扱がないので、 m5stack公式やほかのどこかで調達する必要があります。

https://m5stack.com/products/m5stack-6060-push

準備物

  • 6060-PUSH
  • 6060-PUSH用のRS485の端子台
  • m5stickc
  • RS485Unit(またはhut)
  • 丸穴の9VDC電源
  • RS485用の通信線と電源線計4線

f:id:mametarou963:20200614180804j:plain

組み立て

写真のようにつなぎます。 6060-PUSH側に電源を供給していればRS485経由でm5stickCに電源が供給されますが、この状態でm5stickCに書き込む場合はそのままusbを接続しても問題ありませんでした。

f:id:mametarou963:20200614180740j:plain

6060-PUSHのコード

6060-PUSHはRS485経由でコマンド経由で指示します。 コマンド一覧は、以下に書いてあります。 https://docs.m5stack.com/#/en/1515/6060-push

m5stickcのコード

UI-FLOWで以下のようなコードを書きます。

f:id:mametarou963:20200614174341p:plain

概要としては、m5stickCのBボタンで操作を選んでAボタンで確定し、指示します。

  • MoveZ:原点に移動します
  • MoveM:中間程度の位置に移動します
  • MoveH:一番上の位置まで移動します
  • ReadP:ポジション位置を確認するコマンドです。実質使いません

Moveの実際の値はX46.0を最高値にしてみました。48.0程度を指定すると一番上部に当たったのちさらに上昇しようとして異音がしたため、46を最大値としています。

RS485Unitではなく、Hutを使う場合は送信ピンと受信ピンをHut用のものに変更してください。

動かした様子

ドアの開閉取得をTWELITEで試す。とりあえず試す。

MONO WIRELESSを動かす

ドア開閉が取れたらいいねという話を友人としていて、ドアにつけるなら電池問題と通信問題がなー思っていたのですが、後日TWELITEがいいという話をいただいたので、購入して試しました。 写真は後日気が向けば。

購入したもの

品物 URL
BLUE PAL
OPEN-CLOSE SENSE PAL
MONOSTICK
TWELITE R
CR2032

とりあえず動かしてみる

ホスト側

  1. MONOSTIcKをUSBをPCに挿す
  2. TWELITEプログラマをダウンロード https://mono-wireless.com/jp/products/TWE-APPS/LiteProg/index.html
  3. 親機のバイナリをダウンロード https://mono-wireless.com/jp/products/TWE-APPS/App_pal/parent.html
  4. TWELITEプログラマを起動
  5. 「App_PAL-Parent-BLUE-MONOSTICK」を指定して書き込み
  6. TWELITEプログラマを終了
  7. パルビューアをダウンロード https://mono-wireless.com/jp/products/TWE-APPS/App_pal/palviewer.html
  8. パルビューアを起動する。COMはMONOSTICKのもの。ボーレートはそのまま
  9. tag viewをmagに合わせる

エッジ側

  1. BLUE PAL + OPEN-CLOSE SENSE PAL + CR2032

結果

バイスに磁石を近づけると、みれた。プログラムレスでここまでいけるのは素晴らしい

参考

いろいろみたけど、ミクミンPさんのtweetが参考になりました。

https://twitter.com/ksasao/status/1083006502883942402