調べ物した結果

現役SEが仕事と直接関係ないことを調べた結果とか感想とか

2020年の振り返り~今年何やったっけなぁ。なにができるようになったかなぁ~

なにやってたかなぁ。記事をもとに振り返る。

目次

1月

エリック・エヴァンスのドメイン駆動設計を読む。とかいって中途半端に読んで途中でやめてる。
今でも設計は勉強しなきゃ―と思っているけど。どっちかというと問題集がほしい。
なんかこう。数こなしたい。こなしたいのだ。
バッタを倒しにアフリカへを読んでた。続きがきになるんだけど。続き出てないのかしら。あとは
TheGameをつくるんじゃい!つってきれいに作ろうとして全然完成せずに放置されている。やはり作るのは先だって一気につくったほうがいいなぁ。

2月

AWSとDB。おそらく4月に受ける予定だったIPAのDBの勉強してたからだと思う。
秋に延期になって、うけたけどかけなくて惨敗してる(まで結果でてないけど)
次こそ行ける。そしておおむねまじかってなさそうだしもう一回勉強したら行けるかもしれない。

3月

2月よりもDBに偏重気味。指してあげるものもなく。ただこの辺りでSQLのチューニングまわりを意識して頑張ってたおかげで、仕事もうまくいってた気がする。
先に勉強してたことがタイムリーに舞い込んでくる謎体験がこの辺りから続いてた気がする。ギリギリ感。

4月

勝手にリファクタリングやってた。またやりたい。なんか時間作らないとできなくなってるから、それを改善したいなぁ。
楽しいは楽しい。業務でJavaも読めるようになってきたから、だいぶなんでもOKになってきている。なんかいくかなぁ。
この辺りでコーチングもかじりだした。上長つかまえて勝手に実験台にさせてもらってたけど大して効果はでなかった。

5月、 6月

AWS.AWS。この辺りで本格的にアソシエイトレベルを年内に3ついくかーとか考えてた気がする。
なんとか無事とれたのでよかった。来年はスペシャルとプロフェッショナル。どっちかとりたいな。

7月

またSQL。かAWS。なんか1年とおしてSQL触ってたなぁ。パフォーマンスあたり。だいぶ頭が整理できたと思う。
また忘れているので覚え直しが必要だけど。

8月

WEB+DB PRESSを真面目に読みだしたのがこのあたりか。しらないこととかしらないこととかがぼりぼり出てくる惨状を味わえるので助かっている。
2か月に1度の課題図書みたいになっているので、他の読むものも厳選しないと時間が足りなくなってきてるなーと思う。

9月

生涯学習の理論にである。もうちょいこれも深めたい。やること多すぎるんや。

10月

とくに。この辺りからだいぶアウトプットが減っていた。どうにも質を考慮してか、はたまたいろんな理由で出力が低下していたように思う。
AWSの勉強に力を入れていたという言い訳もできなくもないけど、書こうと思えば書けたはず。

11月

仕事で配属先かわるんごーしてて引継ぎやらなにやらで忙しかった記憶。
普段からプロジェクトの資料に起こしていたのもあって大して困らなかった。大きい引継ぎはこれで3回目だけど、ずいぶんスムーズにできたと思う。
初めから引継ぎのことを考えていたのがよかったのかもしれない。この辺りちょっとなら記事にできそうなのでどこかでかくかなー。かかないかなー。

12月

AWSとSpring。Spring初めて触ったけどなかなか良き。よいがDDDとの付き合い方含めて、設計思想を人に伝えたりメリットデメリットを正しく伝える力が足りていないと感じた。
どっかのなんちゃらさんがいいっていってる。とか本に書いてたから。じゃ人は動かないっすよね。ちゃんと根拠もって説明できるようになりたい。新人君にはいけにえになってもらおう。

まとめ

AWSに偏重してたとおもってたけど、まんべんなくやってんなーという感じ。
大体自分の興味とかがわかってきた気がする。
・マネジメント(いい感じに開発ができるように)
・学習(どうやったらいい感じに開発ができるか)
この辺に偏重してる気がする。DevOpsとかそーゆーんがやりたいのかな。どうなんだろ。また変わる気もするが。

AWS認定アソシエイトレベルやっと3つ取れたので自慢する。


自慢する。ようやく3つ収めた。

AWSと業務でのかかわり

一切ない。びっくりするほどない。

とりあえず遍歴

気がつけば1年以上やってますね。
gyazo.com

なにをやっていたか

Udemyをつかって。問題集をつかってわからないところは開発者ガイドを読んで。みたいなのをひたすら。
blackbeltを時間がある時に見てました。特に動画はいいですね。1.5倍がすばらしい。
AWSはほんといろんなところに参考になる資料があっていいですね。

詳細にスコアを見ていく

ラクティショナー

gyazo.com

ギリギリにもほどがあーるよね。
実際一度不合格になっているにかかわらず適当に勉強してたからなぁ。該当するサービスをおさえていけばいける。これはいま受けても合格できる自信がある。
当たり前だけど確実に受験当時よりも今のほうがまともに知識としてもっている。

ソリューションアーキテクト、デベロッパ

gyazo.com
gyazo.com

受験後の感想はデベロッパーのほうがわるかったんだけど。なんか点数たかかった。
どっちも今受けるとあやしい。かもしれない。700ぐらいで問題次第では余裕で不合格いただくと思う。そんなレベル。精進が必要。

シスオペ

gyazo.com

やっととれたぜ!こっちも問題次第で余裕で不合(ry

おわり

4本目あたりになるとだいぶ勉強の仕方がわかってきたけど。時間がかかってしかたがない。(開発者ガイドを読み込む
次はスペシャリティーか。プロフェッショナルか。社内メンバーへの教育もやっていきたいので。
うまく共存していく方法をみつけたい。設計ももっとやらないといけないからなー。

かいたら反省ばんかりで自慢してなかった。いえーい!すげーだろ(雑









ここ最近公開アウトプットが壊滅しているのはなんでだろうか


タイトルの通り。最近目に見えてブログの投稿数が減っているので、
ひとまず1日の主な動きを考えて。いい加減投稿するペースを戻そうという目的もあるので
復活させたいので、文量は少なくても一回投稿してしまう。という奴。

目次

休み・・・公園祭り

お休みの日のタイムテーブルはこんな様子で。
 6:30 起床
 7:30 朝食やらなんやかんや終わらせて活動開始
 9:00 公園 1発目
 11:30 昼飯
 13:00 公園 2発目
 14:30 おやつタイム
 15:00 公園 3発目
 17:00 夕食
 20:00 就寝

そう。休みは全滅。基本的に土日はお仕事はなく、おやすみではあるが。
とても健康的ではあるのだけれど。
アウトプット用の端末は息子がYoutubeをみるとか。マイクラをするんだ。とかいって放してくれない。
また、私が触ってるとまとわりついてきて非常に集中しがたい。
そもそも平日はほとんど相手できていないんだから。休みの日ぐらいと1日に公園を3か所めぐって見たりしているから時間がないのだ。
あとついうっかりお酒を飲んでしまう。加えて子供いっしょにお布団に入ってしまうとそのまま寝てしまう。こまったこまった。

ということで休みは全滅。

平日・・・車通勤つらい。

平日のタイムテーブルはこんな感じで
 6:30 起床
 7:00 出勤
20:00 帰宅
21:00 夕食とかいろいろ終わらせる
23:00 就寝

働く場所が変わったので電車通勤から車通勤になったのだが。これがそれなりにつらい。
往復で2時間ほど。電車であれば寝て体力を温存することもできるがそうもいかない。
ただ時間ももったいないなーとおもうのでNHK基礎英語を垂れ流している。聞くタイプの本があるらしいが。運転中に集中してしまうのも怖いなぁ。
朝6時とか7時とか。家に帰ってくると20時とか。次の日も仕事だから寝不足で運転するのも怖い。ということで22時あたりには蹴りをつけたい。
そうなると1日とれても2時間ぐらい。になる。

どうするか・・・

環境面。別に外に向けて公開する必要があるか。と言われればないのだけれど。
ある程度縛りがないと「やったつもり」「やったことにする」が自分の中で横行してしまうので、やはり「公開」はしたい。
バイスとしてはPCがあるのだければ。スマフォでポチポチできなくもない。ないけど結構つらい。朝早くおきるかなぁ・・・

いつするか・・・

帰宅後の時間はモチベーション的にもつらく。INPUTそのものの時間もいるのでなるべく帰宅後はINPUTにあてたい。
なにせアウトプットを開始しだすとそれなりに興が乗ってしまうと結構無尽蔵に時間を使ってしまう。
それに結構頭が活性化してくるので、作業を終えてもなかなか寝付けなくなってしまう。
電車であれば問題はないが。注意力が欠落しまくってる状態で車を運転するのは嫌だ。

となると残ってるのはお昼休みと朝。やはり朝早く起きるしかない。起きるしかないか。5時ぐらいに起きれたらいいなぁ・・・

SpringFrameworkとドメインオブジェクトとのかかわりがなんだかわからなくなってしまった


いまだに釈然としてないしわかってないのだけれど。
.NetおじさんだったけどSpring使うことになり。今までとなにがどう違うのかわからん。わからんスーパーわからん。
説明受けたけどやっぱりなんか気持ち悪いところがあったりしたから吐き出す。
3層アーキテクトでいくぜい。てきなことを言われはしたが。文書にすることでちょっとはましになるかなーと思って書く。

とりあえず3層

データソースそう

リポジトリの置き場所。

プレゼンテーション層(ユースケース層)(@Controller)。ここはOK.だいたい分かった。

あんまり飛び道具的なものがなさそうなのでちょっと安心。Controllerとドメインオブジェクトとのつながりが怪しい。
Thymleafを使うのだけれど。
Thymleaf(HTML), Model, Bean, ModelAndView。この辺が頭の中でごちゃごちゃしてる。
Controllerの役割はHTTPリクエストのマッピングだとおもっている。
後述Serviceを細かく分けたときの組み立てもService(Scenarioクラス)に任せる。
これを書くまで、ここに直接サービスから受け取ったドメインオブジェクト渡せばよいとおもってたけど。
・表示は「ドメインオブジェクト」の仕事じゃない。
ということが守れなくなるのでやめたほうがよさそう。
結構責務がおおい。命名規則なので責務がわかるようにしたい。

アプリケーション層(@Service)。ここの解釈がだいぶ混乱した。

とりあえずServiceという名前からAPIのようなイメージでURL投げるようなイメージをしてしまって混乱し、
Serviceといっているのみ業務ロジック(BL)の置き場所。というような説明をうけさらに混乱した。
そーゆーときもあるのかもしれない。けどここでのサービスはいわゆるドメインオブジェクトに対するサービス。でよさそうだ。
どのドメインオブジェクトの責務にするにもちょっと落ち着かない。そんなものが置かれる場所。
この辺りで3層アーキテクトではドメインオブジェクトの置き場所がないのではないかと気づく⇒てきとうに読みあさってもどうやらあっている。

おわり

全体的に、アノテーションの言葉通りに受け取るのがよさそう。信じてるぜSpring
あと、一回読んだ本も実体験をうけて切羽詰まると読み込みが違いすぎる。やはり業務で経験するのは大事。

参考書
ドメイン駆動設計 モデリング/実装ガイド
・現場で役立つシステム設計の原則

令和2年のIPA問題に挑む~安全確保支援士 PM1①~

目的

勉強のやり直し(すーぱー忘れてる)
回答例が欲しい人は回れ右です。

問1 スマートフォンを用いた決済について

とりあえずざっくり問題をよんでいきました。どうも認証まわりが胡散臭いですね。
HMACってなにかしら。とかそんな状態。ずいぶん長いこと解いてないからか午後1の問題でもつらく感じます。
ざっと問題文に目を通したら設問にうつります。

設問1-1 なりすましの手段と問題

この決済アプリは「なりすまし」を容易にさせるポインツがあります。ということで手段と問題点を答えようという設問。
なりすましといえば
中間者攻撃
cybersecurity-jp.com
とか
セッションハイジャック
cybersecurity-jp.com
とかまさしくずばりなものもありますが、今回の場合は決済に使うバーコードがよろしくありません。

決済用のバーコードは通常ログインしてからしか生成できませんが、
16桁の会員番号をそのままバーコードとして利用し、そのまま決済している。というのが問題文から読み取れます。
会員番号がそとに漏れ出したりは問題文から読み取れませんでしたが、決済用のバーコードがずっと同じ。ということになります。これはまずいですね。

ということで
手段:他者の会員番号でログインせずにバーコードを生成して利用する(29文字)
問題:決済用のバーコードが第三者で容易に復元可能なこと(24文字)
こんな感じでいかがかな。とおもう。

設問1-2 HMAC

穴埋め問題。問題文を読む限り、暗号鍵とハッシュでどうにかするかんじで。
HMAC値αとHMAC値βがおんなじであるとか。そんなことかなーと思います。
いまいち読み取れませんでしたが、QRには「会員番号、時刻、乱数、HMAC値α」が含まれているので、
「会員番号、時刻、乱数」とWEBサーバが抱えている秘密鍵KをつかってHMAC値を生成(β)したものは、
同じルールで作ったαと同じになるはず。というようなことがしたいのだろう。

www.ipa.go.jp

設問2-1 無線ルータの設定

攻撃者のサーバーにつながせるときの問題。よくあるやつ。だいたいDNSなんだけど。
今回はルータの設定を直にいじれるパティーンということで「い」のDNSプロキシ。を選択。
DNSサーバのIPアドレスを攻撃者が用意したDNSサーバにしてしまえば、あとはやりたい放題だろう。そして気付かない(正常に名前解決しているようにしかみえない)

設問2-2 証明書の問題

あきらめます。頭が回りません。

設問3-1 攻撃者にうれしいシステムの挙動。

これは問題文を読んでる時点からあやしんでいた。なにせよくあるやつ。アンチパターンに該当するんじゃないかと思うが、何か名前がついてるのだろうか。
と思ったらいい感じにまとめてくださっている方がいた
www.ipa.go.jp
まーもろに。これということで。

IPアドレスのアラート通知の仕様もまずいような気がするけど(同一のIDじゃないと異常検知できない)
Yさんの指摘として「会員登録機能」は攻撃者が悪用すると・・・と問題文中にあるので、こっちを答えるのがよいだろう。
文字数が60文字とかあれば、両方こたえてもよかったかもしれない。

以上。

「全力でC#の好きなところをお話しするので聞いてください」というので聞いてみました。

nrs-seminar.connpass.com
とても楽しそうな会なので、youtubeみてみました。本当は当日参加したかったんだけどね。
これもINPUTではあるとおもうのでOUTPUTしてきます。

ざーっと触れていった内容に対して感想とか思ったことを書いていく。

まず全体

終始なごやかな感じで。とてもよかったです。C#やってみようかな。って人は増えたんじゃないかな。
初めて触る人もざーっとみて。雰囲気をつかめる(それはいいすぎかな)そんな感じ。
とにかくタイトル通り。C#への愛が溢れる感じの内容でした。いいですね。こーゆーの。
Microsoftを信じろ。
ぼくはもともと仕事でVB.NETを使ってたから比較するような感じで覚えているんだけど、
C#ってVBと違って厳密に書かないといけないんだよね。自由度が少ない(表現幅は広いのに)
これがすごい好きなとこではある。SQLとかもそうだけど。めちゃくちゃな自由度なので。そのあたりのつらみがC#は出にくくてすごくよいな。
と思う。VBだとね。ちょっといろんなこと省略できちゃうから。そうすると省略するべきなのかどうなのかってこと悩んでしまうんだよね。
それがない。そーゆーとこが次の話にも影響してると思います。

メソッドのデフォルトオーバーライド可否

いきなり重いんだ。基底のクラス側で子クラスをコントロールできるってね。
つまり基底でちゃんと設計しないと辛い思いしたりするので。僕は主に辛い思いする方ですね。
基底の担当チームに話つけるのが面倒なんだなーこれが。

VisualStudioめっちゃ便利でっせ?

いや。ほんとね。めちゃくちゃ便利。なにがどう便利かって本編をぜひぜひというか。
めちゃくちゃ万能。まさしく統合開発環境。それがVisualStudio。
そしてWindowsForms。最高。
今でもさっと。さらっと作ろうと思うとついついWindowsFormsでプロジェクト作ってしまったりする。
(個人的にはWPFも同じようにかけるようになりたいな)
それぐらい楽。真面目にビジネスユースでアプリを作ろうと思うと辛いとこが出てきたりはするんだけど。
簡単すぎてたくさん悪魔がうまれる的なことを動画内でも言われますが。悪魔と語り合ってた私からすると本当にその通りでね。。。

NULL合体演算子

こいつに出会ったのは最近ではあったりする。とてもよい。すごく綺麗。無茶な使い方も(やればできるけど)できない。
いろんな機能はあるんだけど、便利な機能は使い方が限定的だったりするんだけど、わりと限定せずに使えたりするのね。
そうすると悪魔が生まれるんだけど。NULL合体演算子については悪魔が生まれにくい。そこが好き。

NULL許容型

便利なんだけど。便利なんだけど悪魔が生まれやすいから避けてはいるが。
好きなとこだっつってんのに「あんまり好きではない」ってのずるい。笑う。

Linq

Linqは最高なのです。最高ではあるんだけどね。
まー思うところもあるんだけど。過去の記事(主旨は別件という)でざーっと書いてた。
couraeg.hatenablog.com

どうなんだろうな。そもそもコレクションを直接つかわずにちゃんとクラス設計すればLinq書く機会って減るんじゃないかな。
とか最近はそう思います。
速度に関しては気になるレベルで書くようなことは少ないかもしれないなーと思った。
Linqは自由度高いです。メソッドチェーンでめちゃくちゃできます。その結果悪魔が生まれます。

var

最高。型推論はめちゃくちゃに最高です。メモ帳でデバッグするときに困るから明示してほしいというようなこと言われたり言われなかったり(そこは環境合わせましょう)
ただなんでもかんでも。ではなくて個人的には右辺から型が推測できる場合につかってます。あと動画中のEnumerableシリーズ。いちいち書いてらんないからね。(かけって言われた時はvarってかいてVisualStudioに認識させてそれメモってる始末だし)

型が書いてあっても、書いてなくても可読性は変わらない。ってのはちょっとどうなんじゃらほい。
という気持ちはなくもないが。まーこれvarかけるとこは型も推測できるから。明示する必要ないなーとも思いますた。
あーということは「書いてあっても、書いてなくても。。。」ってことでこの記事書いてる最中に「あ。別にいっか。全部varでいいや。」
みたいに気持ちが傾いた。

イベント構文

これは。C#の特徴だったのか・・・しらなかった。
とくに全然。まるっきり意識してなかったから気にしてなかったけど。他の言語だともしかしてものすごくめんどくさいのか?
どこまでがC#のあれなのか。

Using最強

usingは最強よ。IDisposableさえサポートしてればいいからね。vbのWithはちょっとね。デバッグが地獄になる。

Jsonのクラス定義を作ってくれる。

しらなんだー。。。なるほど。。。C#って開発環境がVisualStudioになるから、最強IDEの恩恵をもろにうけんだなぁ。

アクセス修飾子がまぁまぁ

うん。パッケージプライベートがほしくなるんだよなぁ。名前空間で制御したい。

ギルティクラス

名前がずるい。こんなん笑ってまう。拡張メソッドはほんとね。自由度が高い。つまり悪魔が生まれる。
どうしても。どうしても既存の型を変えられないときに使う。それ以外は「ギルティ」でいってる通りだと思う。最後の方に差し込まれててめっちゃ笑った。基本的にはラップした方がいいんじゃないかーな。と思ったりする。
ただ、完成前のざっと作る時はこれでいいんだよ。完成品として出すときに。あるいは出したとにずっとこれが残ってるのはまずいと思う。
リファクタリングしていけばいいんじゃないかな。使うなっていうより使えるタイミング(プロダクトの成熟度)とかが限定的かなって思う。思うだけ。
プログラムは成熟度あるからなぁ。早期に用いたりプロトタイプしたりするようなものだったりするのかなーと認識してる。

おわり。

楽しかった。何かが「好きだ」とかそーゆーのなんか感覚がわからなかったんだけど、わかった気がした。
それなら僕もC#好きかなー。好きだと思うなー。という感じ。もともと80点ぐらい好きだったんだろうけど。再認識できた感じで。よき。
よい動画ありがとうございました。


勝手にリファクタリング~Captura①~


久々に人のソースをリファクタリングする。
①というのは1回で全然できなかったことを示す。続くかわからないけど。

LICENSE

LICENSEはMITです。リンクと著作者を張っておく。

Copyright (c) 2020 Mathew Sachin

github.com

作成者には敬意を払い。作成物を公開してくれていることに感謝して作業します。

環境

OS:Windows10
IDEMicrosoft Visual Studio Community 2017 ⇒ Microsoft Visual Studio Community 2019
※ビルドできなかったからバージョンアップした。

準備

Gitから拾ってくれば基本的に完了なのだけど、環境の更新が必要だったので残す。
久しく見ず知らずのソースみてないから大分フレームワーク等おいていかれてる感。案のじょう使っている2017ComunityだとFreameworkが追いついておらず。
ということで2019Communityをぶち込んで再度ビルドトライで無事完了。なぜかテストの一部が通らないようだけどこのまますすめる。
ちゃんと調べていないが、Fakesをつかっているのでそこの問題だと思う。

4.7.2 の適用、VisualStudioの更新

gyazo.com
C# 8.0以降を使っているようなのでさらにビルドできず。下ということで、VisualStudio 2019を拾ってくる。
dotnet.microsoft.com

対象の選定

毎度のことながら全部はできないので(する必要がないところも多数あり。)

保守容易性インデックス高すぎ問題。

さーてどこリファクタリングするかなーってなったときに、いつもコードメトリクスをつかっているのだけれど
gyazo.com

と軒並み高スコア。現状、保守面で言えばリファクタリングは不要なレベルに思える。
プロジェクトレベルでは大した差がないので、もう少し掘ってみる。
gyazo.com
なんとか50台のNamespaceを見つけたので、今回はこの辺りにしようと思う。
Drawメソッドがいい具合に複雑らしい。といっても49行。だから手の入れようがないかもしれないが。
とりあえず今回はここに決まり。

リファクタリング

さーということでそろそろリファクタしていきましょう。

テストがねぇんです

ブレイクはってテスト流してみるも止まらず。プロジェクトの数に対してテストが少ないからもしやとは思ったけど、
どうやら今回手を入れる場所のテストコードはない様子。
テストかかなきゃ。。。なんでこの辺で全体像を見ていこう

Doxygenに喰わした結果がこちら。
gyazo.com
被参照がない・・・そんなぁ・・・

原因はよくわからず。VisualStudioの参照たぐっても「え?おまちがくね?」みたいな経路になって理解が追い付かず。
厳しい。
ということで参照はあきらめてメソッドの中を見ていく。

public override void Draw(IEditableFrame Editor, Func<Point, Point> PointTransform = null)
        {
            var curPos = Args.Location;

            if (PointTransform != null)
                curPos = PointTransform(curPos);

            float clickRadius = _settings.Radius;

            var d = clickRadius * 2;

            var x = curPos.X - clickRadius;
            var y = curPos.Y - clickRadius;

            var color = GetClickCircleColor();

            Editor.FillEllipse(color, new RectangleF(x, y, d, d));

            var border = _settings.BorderThickness;

            if (border > 0)
            {
                x -= border / 2f;
                y -= border / 2f;
                d += border;

                var borderColor = _settings.BorderColor;

                Editor.DrawEllipse(borderColor, border, new RectangleF(x, y, d, d));
            }

            if (Args.Clicks > 1)
            {
                var font = Editor.GetFont("Arial", 15);
                Editor.DrawString(Args.Clicks.ToString(), font, Color.Black, new RectangleF(x + 10, y + 10, d, d));
            }

            base.Draw(Editor, PointTransform);
        }

うーん。Drawとはいったもののこいつ自身は組み立てがメインに見える。しかし書く。テストを書くのだ。

voidのテスト面倒。

何かしら引数が返ってくれるほうが嬉しい。なにせメソッド実行前後の期待する動作読めないからさぁ・・・
最終的にはBase.DrawでBaseクラスを実行するので、これはなかなかにつらい。どうかけばいいのだ。

とりあえずやってることを整理してコメントだけ入れよう。改行も問題ないはずだ。

        public override void Draw(IEditableFrame Editor, Func<Point, Point> PointTransform = null)
        {
            // 楕円を書く
            var curPos = Args.Location;
            if (PointTransform != null) curPos = PointTransform(curPos);
            float clickRadius = _settings.Radius;
            var d = clickRadius * 2;
            var x = curPos.X - clickRadius;
            var y = curPos.Y - clickRadius;
            var color = GetClickCircleColor();
            Editor.FillEllipse(color, new RectangleF(x, y, d, d));

            // 枠線いるなら書く
            var border = _settings.BorderThickness;
            if (border > 0)
            {
                x -= border / 2f;
                y -= border / 2f;
                d += border;
                var borderColor = _settings.BorderColor;
                Editor.DrawEllipse(borderColor, border, new RectangleF(x, y, d, d));
            }

            // 文字を書く
            if (Args.Clicks > 1)
            {
                var font = Editor.GetFont("Arial", 15);
                Editor.DrawString(Args.Clicks.ToString(), font, Color.Black, new RectangleF(x + 10, y + 10, d, d));
            }
           
            base.Draw(Editor, PointTransform);
        }

少し解像度が上がった気がする。
前半。ArgsのLocationに対して、何かしらフォーマットをかけるにしてもクラス名から考えてマウス位置にでも円を書くのではないかと思う。
後半。ダブルクリックだろうか。わからんが、Clicksの数が2以上なら文字描画。
最後。既定のDraw処理を呼ぶ。
ということで大きく3個に分けられそうではある。xydを使いまわしてるのがちょっといやらしさを感じる。たぶんここの読み込みが肝になると思う。
ぐぬぐぬしてきたけどだいぶ見えてきたので少しテストがかけそう。塊の細部を抽出していく
とりあえずざっくり書いて、Failされることを確認。

    [Collection(nameof(Tests))]
    public class MouseClickStepTests
    {
        /* TODO 
            // 楕円を書く
            var curPos = Args.Location;
            if (PointTransform != null) curPos = PointTransform(curPos);
            float clickRadius = _settings.Radius;
            var d = clickRadius * 2;
            var x = curPos.X - clickRadius;
            var y = curPos.Y - clickRadius;
            var color = GetClickCircleColor();
            Editor.FillEllipse(color, new RectangleF(x, y, d, d));
        */
        [Fact]
        public void aaa()
        {
            Assert.True(false, "");
        }            
    }

gyazo.com
テスト実行すると無事に?エラーということでモリモリテストがかける。

楕円を書くところ。のテストをかく

もう少し詳細に行くと
①ArgsのロケーションからPositionをとる。
②TransformがあるならTransする。
③_SettingsのRadiusをつかって、描画サイズを決める。
④GetClickCircleColor()の結果で円の色を決める。
⑤上の設定でレッツトライ。
の流れ。

対象クラスがPrivateであることに気付く。AssemlyInfoがあれば無理やり公開できるのだけれども。
www.nuits.jp
こちらの通りにやったらうまく公開できたのでこれでいいと思う。

とりあえずということで、FillEllipseで受け取った中身をみて動作を確認する。Moqつかえばよい気がする。というかMoqつかえ案件(記事かいてる最中にきづいた)
テストの内容はひとまずちょっとずつ・・・ということでざっと作ってみた。

        public class _SettingsとArgsのLocationで楕円を書く
        {
            [Fact]
            public void Radiusが10の時はWidthとHeightは20になる()
            {
                var obj = new MouseClickStep(null, null, null, null);
                var actual = new FakeEditor();
                obj.Draw(actual, null);

                Assert.Equal(20, actual.Width);
                Assert.Equal(20, actual.Height);
            }
        }

    public class FakeEditor : IEditableFrame
    {
        public List<object> FillEllipseArguments;
        public void FillEllipse(Color Color, RectangleF Rectangle)
        {
            this.FillEllipseArguments = new List<object> { Color, Rectangle };
        }

んで、ざっと流すとこの調子でエラーをつぶしていけば後はごりっとテスト書いていけると思う・・・先は長そうだ。
gyazo.com