シングルトンインスタンスのゲッタを工夫してみる

あすかです。

シングルトンインスタンスについて、
巷ではこういう書き方をよく見かけます。

public static Class Instance => _instance = _instance ?? new Class();
private static Class _instance;

でも、これって、Instanceを取得する時、毎回必ず_instanceに代入するわけですよね。
コンパイルの時にこういう展開をされるわけです。

var newInstance = _instance;
if (newInstance == null)
{
  newInstance = new Class();
}
_instance = newInstance;    // このあたりがオーバーヘッド?
return _instance;

_instanceがnullでないときにも、必ずこの代入文が実行されるわけです。無論不要です。
このオーバーヘッド、実際は数ナノ秒にも満たないものだと思うし、こんなのを気にする暇があったらもっと他に気にするところがいくらでもあるんですが、一度気になったらやっぱり引っかかりますね。

それで一つ思いついたんですが

public static Class Instance => _instance ?? (_instance = new Class());
private static Class _instance;

これは、_instanceがnullでないときに代入を行いません。
こういうイメージです。

if (_instance != null)
{
  return _instance;
}
else
{
  _instance = new Class();
  return _instance;
}

要するに、やってることが必要最低限になるのでなんとなくすっきりする‥‥のかな(´・ω・`)
ああでも、演算子の優先順位がなんだで代入文をかっこで囲む手間が発生しますね。このあたりはやっぱ好みなのかな。

冬コミ/コミティア123での技術本頒布中止のお知らせ

あすかです。

タイトルのとおりです。

現在、仕事が今までで一番忙しくなっていまして、
次回イベントで出す予定だった本は2冊あるのですが、
共倒れにならず確実に新刊を出すためにも、
技術本を切って、漫画(18禁)のほうだけを頒布することにしました。

仕事の都合で趣味の活動がここまで制限されることは初めての経験です。
今回は、前回の夏コミのように誰かに誘われたからついでにではなく
自分でしっかり本を企画して印刷所も探してスケジュールも立てて、と
締め切りを意識していろいろ準備を進めていた初めてのイベントでもあります。
それだけに、仕事があれほど忙しくなるのは完全に計算外でした。

仕事にも波があるし、他にもっと忙しいプロジェクトがたくさんあるし、自分が今までしていた仕事はぬるいほうだというのはわかっているのですが、
個人的に、初めてだからと上記のようなモチベーションで頑張っていたこともあって、はっきり言ってタイミングが悪いです。
こうなったことはかなりショックです。
技術本のページ数が多すぎたから、少しでもスケジュールが狂ったらこうなることは分かってたんですが。

まずは、新刊ゼロという状況はなんとしても避けたいので、漫画(18禁)のほうを確実に完成させます。
漫画については当ブログの趣旨と関係ないので詳細は案内しません。ピクシブを参照してください。詳細な進捗については、マストドンに逐次書き込んでいます。

技術本については、分量的には7~8割方まで進んでいるのですが、一部高度な内容や、私の個人的な意見の陳述も含まれますので、内容の正確性についての検証に時間がかかります。
来年夏には技術本を出せるようがんばります。

5000兆年ぶりにReactive Extensions再入門

あすかです。

2週間前にこういう記事を書いていたブログがあったらしいのですが、

kmycode.hatenablog.jp

ちょっと調べてみたら、
これと同じというか、もっと便利なことまでできる方法があったんです。

www.nuget.org

ReactivePropertyというライブラリに入っている
ReactiveCommandというものを使えばいけるみたいです。

・・・ところで、Reactive Extensionsってなんでしたっけ?
あすか、1年前にちょこちょこ触ったきりで使ってないんですよねRx。

というわけでいろいろ調べて、Rx再入門してみました。
話的には遠回りになっちゃいますが、まずそこからいきます。

続きを読む

RelayCommandで使えそうなアレを作ってみた

あすかです。

冬に出す同人本、180ページまで進みました。
技術本の他にも漫画(18禁)を一緒に出す予定もあって、いろいろ忙しいけど頑張ってます。
とりあえず、本の中から使えそうな部分をちょいちょいしてきます。

まずは冒頭のオブジェクト指向の話!・・・はいきなりだとちょっと重いので、
RelayCommandでなんか作ってみた話をします。

RelayCommandのCanExecute、使ったほうがいいとはわかってるけど設定するのがめんどくて結局使ってないんですよね。
なので、モデルのイベントをCanExecuteChangedに繋げる処理を抽象化するメソッド書いてみました。

続きを読む

8月30日JUXG初心者LTの資料

あすかです。

8月30日のJUXGで発表さしていただきました。
ご清聴くださり、ありがとうございました。
発表にご協力くださった田淵さん、会社の先輩にお礼申し上げます。

発表に使用したpptxはこちらからダウンロードできます。(直リンク)
github.com

SlideShareにも載せてます。お手軽に見たいならこちらからどうぞ。
www.slideshare.net

続きを読む

CLIP STUDIO PAINTのプラグインをC#で書きたい!(2)

あすかです。

前回投稿から1ヶ月がたってしまいました。。
この1ヶ月、夏コミにサークル参加するので、その準備(コピー本とかコピー本とかコピー本とか)をしてたりしました。
やっと一段落つきましたが、今度は冬コミ‥もとい来年2月のコミティアに向けて、技術本を書くことにしました。
技術本については、冬コミコミティアのどちらかに当選次第、またこのブログで案内しますね。
というわけで、このブログの更新がしばらく雑になります。

さて、前回どういう話でしたっけ‥ああ、CLIP STUDIO PAINTプラグインで使う関数をC#から呼び出す話でしたね。

kmycode.hatenablog.jp

マネージドコードからアンマネージドコードの関数を呼び出す時はDLLImportの利用が一般的ですが、
今回、SDK内の関数の定義を見るに、今回生成するC++のDLL内で関数が定義されているわけではないので、DllImportは使えません。

じゃあどうすればいいのでしょうか。C++で、SDKの関数を呼び出すラッパ関数を作っておいて、その関数のポインタを.NETに渡すことにします!
ただ、C++の関数のポインタをそのままマネージドコードに取り込むことはできないので、.NETのデリゲートというものを使います。

続きを読む

CLIP STUDIO PAINTのプラグインをC#で書きたい!(1)

あすかです。

我ながら言うのもあれですが、今回はちょっと狂気のある内容です。
もちろん、本当はやってはいけないことです。
本記事の内容を読んで作ったものは、インターネット上には公開せず、個人としての利用にとどめてください。

概要

今回は、グラフィックソフト「CLIP STUDIO PAINT」のプラグインを、C#で作ってしまおうというおはなしです。
(※自作プラグインの適用は、CLIP STUDIO PAINT EXのみの機能です

f:id:kmynews:20170723120440p:plain

CLIP STUDIO PAINT(以下クリスタ)の詳細は別のサイトに委ねるとして、「漫画やイラストを制作するためのグラフィックツール」くらいの認識でOKです。
そのクリスタは、プラグインを作って機能拡張することができます。
そのSDKも公開されていますよー!

www.clip-studio.com

でも、SDKC++のやつしかないです。C++以外でプラグインを開発する方法は用意されていないです。
そもそもグラフィックツールって、画像処理を何回もしますから、当然重い処理が何度も入ってきます。C++くらい高速でないと無理です。無理ですよね。

無理なのはわかってるんですが、いっぺんC#で作ってみたい!ってことで作ってみます。

続きを読む