<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[サトー™ @sator_imagingさんのフィード]]></title><description><![CDATA[Zennのサトー™ @sator_imagingさん（@sator_imaging）のRSSフィードです]]></description><link>https://zenn.dev/sator_imaging</link><image><url>https://static.zenn.studio/user-upload/avatar/3e005f7c24.jpeg</url><title>サトー™ @sator_imagingさんのフィード</title><link>https://zenn.dev/sator_imaging</link></image><generator>zenn.dev</generator><lastBuildDate>Sat, 13 Jun 2026 17:14:45 GMT</lastBuildDate><atom:link href="https://zenn.dev/sator_imaging/feed" rel="self" type="application/rss+xml"/><language><![CDATA[ja]]></language><item><title><![CDATA[某リィンカーネーションについて]]></title><description><![CDATA[露見していないだけで、閉じた Discord コミュニティー内などで似たような事例はあると思いますが、今回は解析方法やその他諸々が丸々残っているという、攻撃者側を理解する上でめちゃくちゃ状態の良いサンプルだったので AI を使って調査を行いました。

 雑感
調査結果で弱いと言われている部分は、クライアントの端末にアプリをインストールするという運用の場合、完璧な対策を行うことは不可能なモノが多いです。
端末にアプリがあるので攻撃者は自由に解析を行うことが可能で、通信手段とその内容を暗号化していようといまいと、デバッガーその他の方法で通信直前／直後の内容を見ることに成功すればそこで終わりで...]]></description><link>https://zenn.dev/sator_imaging/articles/af6ca856fae068</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/af6ca856fae068</guid><pubDate>Sun, 19 Apr 2026 07:33:48 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--wQgoulZI--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E6%259F%2590%25E3%2583%25AA%25E3%2582%25A3%25E3%2583%25B3%25E3%2582%25AB%25E3%2583%25BC%25E3%2583%258D%25E3%2583%25BC%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3%25E3%2581%25AB%25E3%2581%25A4%25E3%2581%2584%25E3%2581%25A6%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[Nix 事始め]]></title><description><![CDATA[
 はじめに
Nix は様々なモノの集まりです。

純粋関数型のパッケージマネージャー
スクリプト言語
等々…

（色々あり過ぎて正直まだ良く分かっていません）
本投稿では Nix の様々な機能の中から「パッケージマネージャーのマネージャー」としての側面を見ていきます。

 マネージャーのマネージャー
パッケージマネージャーのマネージャーとは何なのかと言うと、

.NET を使うから dotnet-sdk をインストール
TypeScript を使うから tsc Node.js をインストール
Python を使うから python3 uv をインストール

brew go cargo（...]]></description><link>https://zenn.dev/sator_imaging/articles/ded2ef90152e38</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/ded2ef90152e38</guid><pubDate>Thu, 16 Apr 2026 14:26:55 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--8DrA2Ak2--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_72:Nix%2520%25E4%25BA%258B%25E5%25A7%258B%25E3%2582%2581%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[マインスイーパーをドメイン＋プレゼンテーションで作る]]></title><description><![CDATA[先日のコチラの投稿の補足として、
https://zenn.dev/sator_imaging/articles/c7bfba5b18db08

理想論的なアーキテクチャは大作／大規模開発のゲームでもちゃんと通用する
開発の進め方自体を変えたほうが良いのでは？

の２つがあります。
本投稿では後者に焦点を当てます。

以降は AI を使ってざっくり作った際のプロンプトのリプレイです。ウォールタイムはたしか３０分弱だった気がします。突発的に始めたので Unity 版はコンパイルは通るけどゲームとしては未完成状態です。




完成したもの
アーキテクチャ図









&nbsp;
...]]></description><link>https://zenn.dev/sator_imaging/articles/8d3fe2edbc6238</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/8d3fe2edbc6238</guid><pubDate>Fri, 03 Apr 2026 00:48:29 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--Z-xohywS--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2583%259E%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2582%25A4%25E3%2583%25BC%25E3%2583%2591%25E3%2583%25BC%25E3%2582%2592%25E3%2583%2589%25E3%2583%25A1%25E3%2582%25A4%25E3%2583%25B3%25EF%25BC%258B%25E3%2583%2597%25E3%2583%25AC%25E3%2582%25BC%25E3%2583%25B3%25E3%2583%2586%25E3%2583%25BC%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3%25E3%2581%25A7%25E4%25BD%259C%25E3%2582%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[Unity の MVP を理解する為の補助線]]></title><description><![CDATA[
 はじめに
「良い／悪い」「合ってる／間違ってる」という話ではない点よろしくご理解ください。

本稿の前提として「ゲーム画面は副作用」であると捉えます。
MVP で設計しているはずなのに責務の判断に迷う人向けです。
この文章は「MVP を否定する話」ではなく「UI とドメインの分離をどう捉えるかの整理」です。

MVP は戦術、プレゼンテーション／ドメインは戦略。


問題は Presenter という層の存在ではなく、その中身が設計として定義されていないことです。

AI による三行まとめ

思想は強い
正しい
でも少し“喧嘩腰に見える”（編注： 正しくは「Unity-MVP が大嫌...]]></description><link>https://zenn.dev/sator_imaging/articles/c7bfba5b18db08</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/c7bfba5b18db08</guid><pubDate>Mon, 30 Mar 2026 00:56:25 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--zJMZK7ix--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Unity%2520%25E3%2581%25AE%2520MVP%2520%25E3%2582%2592%25E7%2590%2586%25E8%25A7%25A3%25E3%2581%2599%25E3%2582%258B%25E7%2582%25BA%25E3%2581%25AE%25E8%25A3%259C%25E5%258A%25A9%25E7%25B7%259A%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[【Tween】ライセンスが明瞭なトゥイーンライブラリ【イージング】]]></title><description><![CDATA[
 なぜ再発明が必要なのか
イージング関数と言えばコチラ[1] などが有名かと思います。有名ですがライセンスが GPL-3.0 です。
数学的アルゴリズムそのものに著作権は無いようですが、ソースコードをコピーして C# に変換という行為は地味にグレー、最悪組み込んだアプリのソースコード含めて一般に公開する必要が出てきます。
「こんなんで著作権主張すんなや」の精神でコピーするのは簡単ですが、そこそこの矜持を持っている場合は上記のウェブサイトを見た記憶を消す、またはソースコードのコピペをせずにゼロから書き起こす必要があります。
そんなこんなで float double 精度の明確化と、ついで...]]></description><link>https://zenn.dev/sator_imaging/articles/f42e0cb1d8c778</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/f42e0cb1d8c778</guid><pubDate>Mon, 23 Mar 2026 04:04:52 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--pNkjU-XA--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%2590Tween%25E3%2580%2591%25E3%2583%25A9%25E3%2582%25A4%25E3%2582%25BB%25E3%2583%25B3%25E3%2582%25B9%25E3%2581%258C%25E6%2598%258E%25E7%259E%25AD%25E3%2581%25AA%25E3%2583%2588%25E3%2582%25A5%25E3%2582%25A4%25E3%2583%25BC%25E3%2583%25B3%25E3%2583%25A9%25E3%2582%25A4%25E3%2583%2596%25E3%2583%25A9%25E3%2583%25AA%25E3%2580%2590%25E3%2582%25A4%25E3%2583%25BC%25E3%2582%25B8%25E3%2583%25B3%25E3%2582%25B0%25E3%2580%2591%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[lock/volatile/Interlocked 無しでスレッドセーフを実現]]></title><description><![CDATA[dotnet/runtime の PR を斜め読み[1]していたらコチラ[2]を見つけました。

 抜粋
以下が PR 適用後のソースです。更新時のみロックを行う流れになっています。
何故大丈夫なのか。
private static DynamicWinsockMethods[] s_methodTable = [];
private static readonly Lock s_methodTableLock = new();

private bool Matches(AddressFamily addressFamily, SocketType socketType, Protoc...]]></description><link>https://zenn.dev/sator_imaging/articles/47611b807bc2b4</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/47611b807bc2b4</guid><pubDate>Tue, 03 Mar 2026 01:06:59 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--J5IU_RH9--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:lock%252Fvolatile%252FInterlocked%2520%25E7%2584%25A1%25E3%2581%2597%25E3%2581%25A7%25E3%2582%25B9%25E3%2583%25AC%25E3%2583%2583%25E3%2583%2589%25E3%2582%25BB%25E3%2583%25BC%25E3%2583%2595%25E3%2582%2592%25E5%25AE%259F%25E7%258F%25BE%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[C# でマクロを使う]]></title><description><![CDATA[MacroDotNet は既存のパターンだけではなく、今後登場するであろう面倒な実装／デザインパターンにも完全に対応した C# 向けマクロです。
マクロはソースジェネレーターとして実装されているので、Reflection と違ってコンパイル時に型チェックを受けます。なのでランタイムでは型安全かつオーバーヘッドゼロで使えます。当然ネイティブ AOT にも対応しています。
👇 .NET / Unity 2022+ で使えます。


 マクロの構文
説明不要、見たまんまのテキストテンプレートです。生成されたコードは型安全で実行時のオーバーヘッドは完全にゼロ。
[Macro(...)] に書いた...]]></description><link>https://zenn.dev/sator_imaging/articles/0ac6bf76bafe2a</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/0ac6bf76bafe2a</guid><pubDate>Mon, 02 Mar 2026 00:32:16 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--c82Jhelz--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:C%2523%2520%25E3%2581%25A7%25E3%2583%259E%25E3%2582%25AF%25E3%2583%25AD%25E3%2582%2592%25E4%25BD%25BF%25E3%2581%2586%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[【C# 最適化】dotnet/runtime のコードレビュースキル]]></title><description><![CDATA[@prozolic さん作の PR Digest.NET[1] を眺めていたら Copilot が賢そうに見えたので SKILL.md[2] を読んでみました。
後半部分（Correctness &amp; Safety）は AI のプロンプトとしてはあまり良くないんじゃないか？ と思いますが、C# のパフォーマンスや最適化絡みで有名な stephentoub 氏が書き下ろしたモノだったので AI 翻訳しました。
（前半もモチロン為になります）
感想文
dotnet/runtime には凡ミス[3]があったりして面白いですね。
こういう時は意図通り賢く見える一方[4]でゼロベース[5]だ...]]></description><link>https://zenn.dev/sator_imaging/articles/628625956abc18</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/628625956abc18</guid><pubDate>Sun, 15 Feb 2026 02:46:22 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--iio4Jrkk--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%2590C%2523%2520%25E6%259C%2580%25E9%2581%25A9%25E5%258C%2596%25E3%2580%2591dotnet%252Fruntime%2520%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%25BC%25E3%2583%2589%25E3%2583%25AC%25E3%2583%2593%25E3%2583%25A5%25E3%2583%25BC%25E3%2582%25B9%25E3%2582%25AD%25E3%2583%25AB%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[Runtime Async 撮って出し]]></title><description><![CDATA[.NET 11.0 Preview 1[1] がリリースされました。Runtime Async 触っていきます。

 遅くなってるじゃん！
うおーークッソ速くなってる！ と思ったらナノ秒からマイクロ秒になってました。今はまだ「とりあえず動くようにしました」って感じでしょうか。

なんとなく「Runtime Async は速度を求めるモノじゃないよ。速度が欲しいなら Native AOT ビルドしてね？」って感じになりそうな予感。

.NET 10.0.3



Method
Mean
Error
StdDev
Gen0
Allocated




RuntimeAsync
804.9 n...]]></description><link>https://zenn.dev/sator_imaging/articles/9b3943a0dd4b59</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/9b3943a0dd4b59</guid><pubDate>Fri, 13 Feb 2026 01:39:54 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--7hEMhjG4--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Runtime%2520Async%2520%25E6%2592%25AE%25E3%2581%25A3%25E3%2581%25A6%25E5%2587%25BA%25E3%2581%2597%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[コレクション式撲滅委員会]]></title><description><![CDATA[何も考えずにコレクション式の提案をプロジェクト全体に適用すると Linq は以下の様になります。
int[] values = x.Where(x =&gt; x &gt; 0)
                .Where(x =&gt; x &gt; 0)
                .Where(x =&gt; x &gt; 0)
                .ToArray();

// 👇 折り返しの行数次第で改行を維持するかしないか決めるっぽい

int[] values = [.. x.Where(x =&gt; x &gt; 0)
                ...]]></description><link>https://zenn.dev/sator_imaging/articles/9887f642406518</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/9887f642406518</guid><pubDate>Thu, 12 Feb 2026 03:55:10 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--T2pKyjxV--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2582%25B3%25E3%2583%25AC%25E3%2582%25AF%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3%25E5%25BC%258F%25E6%2592%25B2%25E6%25BB%2585%25E5%25A7%2594%25E5%2593%25A1%25E4%25BC%259A%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[GC を理解し使いこなす【ガベコレ】]]></title><description><![CDATA[最後の方にベンチマークがありますが、プロンプトから滲み出る「仮説／導き出したい結論」におもねる結果なんでは？ と思わなくもありません。上手いこと踏まえた上でご覧ください。

 まず結論

※ 諸説あります／アプリ次第です


 Unity の場合

Unity の Incremental GC は .NET の「次世代 GC[1]」と同じ設計思想

世代の概念が無いので「定期的に Gen 2 を回収させる」とかしなくて良い
とは言え不要な長命オブジェクトは無い方が良いので、アウトゲームのタイミングで解放したほうが良さそう？

特に総数が読めないオブジェクトプール




Incremen...]]></description><link>https://zenn.dev/sator_imaging/articles/8c0309fc59a088</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/8c0309fc59a088</guid><pubDate>Sun, 08 Feb 2026 03:11:45 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--WpRHBziz--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:GC%2520%25E3%2582%2592%25E7%2590%2586%25E8%25A7%25A3%25E3%2581%2597%25E4%25BD%25BF%25E3%2581%2584%25E3%2581%2593%25E3%2581%25AA%25E3%2581%2599%25E3%2580%2590%25E3%2582%25AC%25E3%2583%2599%25E3%2582%25B3%25E3%2583%25AC%25E3%2580%2591%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[.NET 10.0 時代の最適化戦略]]></title><description><![CDATA[マイクロベンチマークが多いのでその点ご理解の上よろしくお願いします。
Unity については

逆をやれば最適化になる
「これはやらなくて良い」は Unity ではやった方が良いということ

です。

 はじめに
ベンチマークに使う構造体はコチラ。


readonly ナシ（最適化されづらい）
インターフェイス型を返す GetEnumerator のみ

※ 配列の GetEnumerator もインターフェイスを返すが最終的な型は構造体



public struct MyStruct&lt;T&gt; : IEnumerable&lt;T&gt;
{
    public T[]...]]></description><link>https://zenn.dev/sator_imaging/articles/0d4b18d8615269</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/0d4b18d8615269</guid><pubDate>Thu, 05 Feb 2026 04:52:09 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--U2s2EpfY--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:.NET%252010.0%2520%25E6%2599%2582%25E4%25BB%25A3%25E3%2581%25AE%25E6%259C%2580%25E9%2581%25A9%25E5%258C%2596%25E6%2588%25A6%25E7%2595%25A5%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[スレッドセーフを保証するクラス]]></title><description><![CDATA[Swift の actor[1]、defer[2] を C# で再現してみました。

 Atom&lt;T&gt;

C# 版の actor は DSL っぽい構文です。コレは Swift っぽくしたかったというよりは、スレッドセーフを強制する為に仕方なくという感じ。
var atom = new Atom&lt;int&gt;();

atom.Set = 42;
atom.Update = v =&gt; ++v;  // 43

atom.Set = 310;
atom.Read = v =&gt; Console.WriteLine(v);
読み取りのスレッドセーフをシンプルな構...]]></description><link>https://zenn.dev/sator_imaging/articles/ed6dac717f5038</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/ed6dac717f5038</guid><pubDate>Wed, 04 Feb 2026 12:58:56 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--WfV_T53f--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2582%25B9%25E3%2583%25AC%25E3%2583%2583%25E3%2583%2589%25E3%2582%25BB%25E3%2583%25BC%25E3%2583%2595%25E3%2582%2592%25E4%25BF%259D%25E8%25A8%25BC%25E3%2581%2599%25E3%2582%258B%25E3%2582%25AF%25E3%2583%25A9%25E3%2582%25B9%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[C#er が使うなら Rust より Swift では？]]></title><description><![CDATA[Linux のカーネルやコアツールなど低レベル界隈では Rust が躍進していますが、正直言って構文、特に後置の await と ? とかキモすぎてどうなの？ というのが私の結論です。
そんな中で最近 Swift が気になっています。元々は Apple が開発し後にオープンソース化されたプログラミング言語で、Rust と同じ LLVM-IR のフロントエンド言語です。
LLVM なので Rust の代わりに[1] クロスプラットフォームかつマルチターゲットな取り回しの良い低レベルライブラリラッパーになる可能性（注：現時点では Rust / Go 程じゃない）、得た知識をそのまま Appl...]]></description><link>https://zenn.dev/sator_imaging/articles/a5d419867ff981</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/a5d419867ff981</guid><pubDate>Tue, 03 Feb 2026 10:40:15 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--90m6IGYu--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:C%2523er%2520%25E3%2581%258C%25E4%25BD%25BF%25E3%2581%2586%25E3%2581%25AA%25E3%2582%2589%2520Rust%2520%25E3%2582%2588%25E3%2582%258A%2520Swift%2520%25E3%2581%25A7%25E3%2581%25AF%25EF%25BC%259F%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[C# 難読化２０２６年版]]></title><description><![CDATA[
 はじめに
PC でアプリを開発できるという事は、作ったアプリのデバッグが出来るという事です。そしてデバッグが出来るという事はアプリ内部で何が起きているのか分かるという事です。デバッグの対象には他者が作ったアプリも含まれるため、調べれば調べるほど、技術的な意味で難読化には意味がないという結論になります。
本投稿では「とは言え簡単にダウンロードできるアプリでワンクリック解析されるのは避けたい」という技術的側面と、加えて意義的なところを掘り下げてみたいと思います。
アプリに埋め込まずクラウドに置くのがベストと言っても？
👇 PS5 なんかもそうですが、基本的にユーザー側の端末やアプリから一...]]></description><link>https://zenn.dev/sator_imaging/articles/a9ed908f38b5f8</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/a9ed908f38b5f8</guid><pubDate>Sat, 31 Jan 2026 03:51:55 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--y8DRIc0l--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:C%2523%2520%25E9%259B%25A3%25E8%25AA%25AD%25E5%258C%2596%25EF%25BC%2592%25EF%25BC%2590%25EF%25BC%2592%25EF%25BC%2596%25E5%25B9%25B4%25E7%2589%2588%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[【難読化】ソースジェネレーター２選【列挙型】]]></title><description><![CDATA[FGenerator SDK v2.0.5 で作ったソースジェネレーターです。

 EnvObfuscator

.env ファイルの内容をコメントで貼り付ければ難読化したプロパティーが生成されるという、もの凄く単純な難読化ソースジェネレーターです。
/*
# ◆ .env ファイル形式（仕様上コメントとして埋め込む必要がある）
API_KEY=...
HimitsuTheSecret=...
*/
[Obfuscate]  // シード値を指定しなければ毎回ランダム（非決定的なバイナリに出来る／なってしまう）
static partial class ENV
{
    // 👇 生成...]]></description><link>https://zenn.dev/sator_imaging/articles/87b508f8ced0a8</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/87b508f8ced0a8</guid><pubDate>Mon, 26 Jan 2026 01:29:39 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--UImHmmaW--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%2590%25E9%259B%25A3%25E8%25AA%25AD%25E5%258C%2596%25E3%2580%2591%25E3%2582%25BD%25E3%2583%25BC%25E3%2582%25B9%25E3%2582%25B8%25E3%2582%25A7%25E3%2583%258D%25E3%2583%25AC%25E3%2583%25BC%25E3%2582%25BF%25E3%2583%25BC%25EF%25BC%2592%25E9%2581%25B8%25E3%2580%2590%25E5%2588%2597%25E6%258C%2599%25E5%259E%258B%25E3%2580%2591%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[静的 DI コンテナー]]></title><description><![CDATA[この記事は Unity Advent Calendar 2025 25日目の記事です。

 静的（AOT）DI コンテナーとは
まず、静的 DI コンテナーがどんなモノなのかを簡単に説明すると、例えば以下のような MonoBehaviour があった場合、
using UnityEngine;
using UnityEngine.UI;

public class CSharpScript : MonoBehaviour
{
    [SerializeField] Button m_SubmitButton;
    [SerializeField] Slider? m_Optiona...]]></description><link>https://zenn.dev/sator_imaging/articles/9e5c963298fbf1</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/9e5c963298fbf1</guid><pubDate>Sat, 27 Dec 2025 06:45:28 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--AOjvBSWd--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E9%259D%2599%25E7%259A%2584%2520DI%2520%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2586%25E3%2583%258A%25E3%2583%25BC%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[非同期メソッド内で Unity オブジェクトを正しくハンドリングする]]></title><description><![CDATA[
 何が問題なのか
細かいですが、await を超えた後は別フレームの可能性が高いので再チェックが必要だという話です。
public class DestroyTest : MonoBehaviour
{
    public async void OnEnable()
    {
        await TestAsync(this.destroyCancellationToken);
    }

    async Task TestAsync(CancellationToken ct)
    {
        try
        {
            if (c...]]></description><link>https://zenn.dev/sator_imaging/articles/a6f332a06ca1d8</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/a6f332a06ca1d8</guid><pubDate>Sat, 27 Dec 2025 04:50:02 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--j4scdLEv--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E9%259D%259E%25E5%2590%258C%25E6%259C%259F%25E3%2583%25A1%25E3%2582%25BD%25E3%2583%2583%25E3%2583%2589%25E5%2586%2585%25E3%2581%25A7%2520Unity%2520%25E3%2582%25AA%25E3%2583%2596%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E3%2582%2592%25E6%25AD%25A3%25E3%2581%2597%25E3%2581%258F%25E3%2583%258F%25E3%2583%25B3%25E3%2583%2589%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0%25E3%2581%2599%25E3%2582%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[WSL をサンドボックス環境にする]]></title><description><![CDATA[
 発端
コーディングエージェントの CLI ツールでサンドボックスを使う場合、Windows は不遇職です。
他の環境がコマンドラインオプションでサクッと実現できることを、Windows では Docker を使ってアレコレすることになります。

多くの場合、公式が出来上がったコンテナイメージを公開しているんですが、基本的に C# プロジェクトは対象になっていないことが多いので自作する必要があります。

最近まで C# 絡みで馬鹿正直にやってたんですが、CLI ツールの更新頻度が高く、毎回そこそこ時間のかかるコンテナイメージの作り直しが面倒になりました。

 断念）Docker を逐次...]]></description><link>https://zenn.dev/sator_imaging/articles/b7552ccbde9038</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/b7552ccbde9038</guid><pubDate>Sun, 21 Dec 2025 04:38:54 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--xzXqwx0H--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:WSL%2520%25E3%2582%2592%25E3%2582%25B5%25E3%2583%25B3%25E3%2583%2589%25E3%2583%259C%25E3%2583%2583%25E3%2582%25AF%25E3%2582%25B9%25E7%2592%25B0%25E5%25A2%2583%25E3%2581%25AB%25E3%2581%2599%25E3%2582%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item><item><title><![CDATA[AI の出力するコードが分かり辛い理由]]></title><description><![CDATA[「Public メソッドはオーケストレーションを心掛けよ」等々、何かしらの用語やパターンの定義がありそうですが浅学にして。

 分かり辛いコード例
AI が度々出力する以下のようなコードが分かり辛い。
早期リターンによって「ネストが深くならない」という、割とどうでも良いことが達成されているだけ。
public void DoSomething(int foo, int bar, int baz)
{
    if (foo...) throw new...
    if (bar...) throw new...

    // 何かしらの処理を行うコードが数行
    // ...

...]]></description><link>https://zenn.dev/sator_imaging/articles/7417a909d35dd8</link><guid isPermaLink="true">https://zenn.dev/sator_imaging/articles/7417a909d35dd8</guid><pubDate>Fri, 19 Dec 2025 01:24:44 GMT</pubDate><enclosure url="https://res.cloudinary.com/zenn/image/upload/s--fsgvvtm6--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:AI%2520%25E3%2581%25AE%25E5%2587%25BA%25E5%258A%259B%25E3%2581%2599%25E3%2582%258B%25E3%2582%25B3%25E3%2583%25BC%25E3%2583%2589%25E3%2581%258C%25E5%2588%2586%25E3%2581%258B%25E3%2582%258A%25E8%25BE%259B%25E3%2581%2584%25E7%2590%2586%25E7%2594%25B1%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2582%25B5%25E3%2583%2588%25E3%2583%25BC%2520%2520%2540sator_imaging%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYXZhdGFyLzNlMDA1ZjdjMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACMTiAE" length="0" type="false"/><dc:creator>サトー™ @sator_imaging</dc:creator></item></channel></rss>