投稿

当分の間投稿休みます

毎週C#記事を書いていくということでやってきましたが、引っ越しの都合で忙しく時間が取れないことから、当分の間記事の投稿はお休みします。

時間ができたらGoogle Homeとかのレビューする予定ですのでそれまでお待ちください。

[C#]MvvmLightとReactivePropertyでMVVMしてみる① - MvvmLightのテンプレプロジェクトを作るまで

イメージ
今週からは勉強もかねてMvvmLight+ReactivePropertyでMVVMプロジェクトを作ってみようと思います。

ReactivePropertyでMVVMはしたことあるのですが、ReactivePropertyだけでは比較的軽量のためMVVMするにはUnity(DIのほう)などを入れたり自作でヘルパーを作ってやる必要性が出てくることもありました。そこで、MvvmLightも取り込んだプロジェクト編成について今週から何回かに分けて考えて行こうと思います。

MVVMとはなんぞや?などについては解説を省きます(そのうち記事化するかも)ので、別途構成と役割などは把握する必要があるかと思います。


そこで、今週はMvvmLight環境の用意までをやってみます。

まず、Visual Studio 2017にこちらのテンプレートをインストールします。

インストールが終わったらソリューション作成またはプロジェクト追加でMvvmLightのAndroidテンプレートプロジェクトを追加してください(Androidアプリケーションを作成するだけなのでUWPでもiOSでもOKです)。



ついでに動作確認のためNuGetからReactivePropertyも入れておきましょう。最新は4.2.1のようですね。

プロジェクトが作成し終わったら、ModelやViewModelフォルダに見知らぬクラスが作られていたりすると思います。(これに関しては来週の記事にしようかな)

VSのツールバーからデバッグなしで起動をし、無事アプリケーションが起動できたら今週の記事の内容は完了です。



(蛇足)Hyper-vを有効化するとHyper-vのほうでAndroidのエミュレータを起動するかHyper-vを無効化しないとエミュレータのパフォーマンス悪くなるようなんですね。。。以前Hyper-v無効化してる時よりすごく遅くなった()

C# 8.0に追加されそうな小さな機能候補

今週はネタに困ったのでcharplangでC# 8.0に追加されそうな小さな機能でも紹介しようと思います。
ちなみに、C# 8.0で追加されそうな機能の一覧はここで見れます。

Champion "Null-coalescing assignments" 日本語で直訳するとNull合体割り当てですが、意味的にはNull合体代入という感じでしょうか。
int? x = null; // 提案されている構文 x ??= 10; // 既存のコードにするとこうなる x = (x ?? 10); ??の仲間を増やそう見たいな感じです(てきとう)。ただ、あったら便利だけどなくてもいいような感じがする品物。

objectValue?.x = 10; 個人的には上のような構文があったらいいなとは思いますが、もちろん提案はされています(採用されるとは言っていない)。

Champion "Negated-condition if statement" 否定条件if文です。Swiftならguard、Rubyならunlessでしょうかね。
こちらはかなり議論が紛糾しています。否定条件バージョンのif文の追加ぐらいすぐできるのでは?言語設計が悪いの?と思われるかもしれませんが、むしろその逆で言語設計がいいから議論が紛糾しているとも言えます。
それで議論が紛糾している原因ですが、C#で機能追加が行われる場合、既存のコードとの互換性も考慮に入れなければいけませんが、guardやunlessなどの構文を追加してしまうと、既存のコードでそのような名前のメソッドが定義されていたりすると、キーワードと衝突する問題が発生します。(あらかじめ予約語としてとっておけばこんなこともなかったですが)。
現在提案されている構文はif文の拡張みたいな感じで収まっていたりします。 if !(x == 1){} if not(x == 1){}
どうなるか楽しみではありますが、private protectedみたいに延期される気配も感じますね。

C# 8.0では非Null許容参照型の導入で破壊的な変更も加えられる予定なので、この際unlessのような予約語を追加してもいい気はします。

Champion "Null-conditional await" 日本語ではNull…

Stellaris 2.0.1 植民スパムプレイ

イメージ
さっそくですが、友達との3日がかりのマルチプレイ終わりました。

銀河設定は中サイズ(600)、リング2、中盤の危機75年早く、終盤の危機100年早く、技術・伝統コスト0.5倍、難易度普通って感じでした。

そして、自分のプレイングは機械帝国植民スパム、友達は内向き牧歌でした。
最終的な国力としては機械帝国植民スパムのほうが強く、序盤から中盤は内向き牧歌のほうが強かったです。

機械帝国植民スパム はい、前回も言いましたが2.0から植民スパムゲーです。2.0.2からは前哨地維持費がかかるようになり更なる植民スパムゲーにもなりそうです。
植民スパムするからには、まぁロボットか機械帝国って感じなんですが、今回はゲーム進行が速い設定なので機械製造速度アップにガン振り帝国にしました。生産はエネルギー重視で、直轄地に鉱物惑星・研究惑星があるような感じにしました。
それでも、機械帝国は序盤の成長が遅く、鉱物を大量に消費するので、周りの帝国との不可侵条約はかかせません。直轄地6惑星(母星・エネルギー、エネルギー、研究*3、鉱物)の発展が終われば、今度はセクターの開発です。 まぁ、セクターの開発なんか物資さえ送り込めば勝手にやってくれるのでいいですが、エネルギー重視の生産なので鉱物の面倒は見てやらないとダメです。
帝国所有惑星が20ぐらいになれば、まぁ中銀河(サイズ600)なら敵なしですかね。あとは軍拡するだけです。
中盤の危機と終盤の危機 前述の通り危機はかなり早く発生するようにしたのですが、なんと中盤の危機がいっこうに発生しませんでした。発生したのは終盤の危機に立ち向かってるとき…おい()
終盤の危機は機械帝国プレイだったのでもちろんのようにコンティンジェンシー、中盤の危機は機械の反乱でした。
中盤の危機に関しては機械帝国プレイなので自分はどうでもよかったのですが、終盤の危機はがんばらないとまずかったです。コンティンジェンシーなので機械の生産-40%補正がつくので、スペシャルプロジェクトで解除(自分の研究力500ぐらいでは50か月ぐらいでした)しない限り国力が持ちません。
コンティンジェンシーは艦隊戦力が300k+100k*2の集団が4つほど湧いて100k艦隊は時間とともに増え続けるので急がないといけませんが、解除さえすればあまり余る国力で殴り続けるだけでしたね。終盤の危機の間に…

ReactivePropertyにプルリク出した話

今週のC#はReactivePropertyにプルリク出した話にします。

まず、プルリク出すまでの経緯ですが、前々からReactivePropertySlimの軽さについて調査してみようと思っていたので(怠慢で予定より3週間遅い)、今週こそは!とXamarin.Androidプロジェクトで軽い模擬アプリを作ってみたのですが、あまりオブジェクト数が多くなく(2*100個ぐらい)GCの頻度がフル機能版と全く変わらなく断念><
その際、SetBinding拡張メソッドがReactivePropertySlimに対応していなかったのでプルリクしたという形になります。

まぁ、作業は簡単でReacitivePropertyとReactivePropertySlimはお互いにIReactivePropertyインターフェースを実装しているので、拡張メソッドの引数を変えるだけでした。ReadOnlyバージョンも同じです。
あと、ついでにAsyncReactiveCommand向けのSetCommand拡張メソッドも生やしておきました。

実はAsyncReactiveCommandは追加された当初から使っており、SetCommand拡張メソッドがないのには気づいていたんですよね。その時には、誰かが追加するだろ~ってことでプルリクしていなかったんですが、1年ぐらい経った今も追加されてなかったのでついでに生やしておいたってことです。すいません、僕の怠慢ですね。

どうやらXamarin.Android向けにはあまり日ごろの整備がされていないようなので、これからは気づいたら自分がプルリクでも出しておきましょうかね。
(プルリク英語で建てて、日本語の追加情報書いたらご丁寧に英語と日本語で返信してくれて、最初から日本語で建てておけばよかった…)

Stellaris ver2.0 Apocalypse プレイ感想

イメージ
タイトルの通り大型アプデ後での友人とのマルチプレイでのプレイ感想です。

変更内容に関してはこちらのサイトで日本語訳された内容が公開されています(本当に助かりました)
Simulationian.com - 「Stellaris」開発日記#105――2.0「チェリイ」パッチノート

使用した帝国について 細かい設定は覚えていませんが(確認するのもめんどくさい)、有機生命体で狂信権威・平和主義で国是にアップデート内容の生まれた生命(Life-Seeded)を選択しています。 狂信権威について アップデートにより帝国の領域を増やすには星系ごとに影響力(1回限りに支払い)を使い前哨地を建てていく必要がありました。そこで狂信権威を選択したのですが、プレイスタイルが悪いのか、よく奴隷が不満を抱えストライキ?を起こしてしまいました。これに関しては防衛設備を地上に建て防衛軍を増やすことで対処できますが、タイルを無駄に消費している感じがすごいあります。 影響力が毎月4増えるのは領域を増やすのに好都合でしたが、Life-Seededとの相性が微妙でした(後述)。 Life-Seededについて 自分の種族がガイア型惑星にしか住めなくなるが、母星がガイア型25でスタートします。使用感想としては初期ブーストはいいかな?って感じです。ただ、アップデート後の環境ではプレイスタイルを頑張らなければ弱いかなと。その理由としては、まずアップデート後は研究コスト補正にPOP数が関係なくなり領域星系数が関係あるようになりました。つまり領域が大きければ大きいほどコストが高くなるということ。星系の資源はプレイヤーではどうしようもならない固定資源のようなものですから、それに頼って領域を大きくし過ぎると研究コストがすごいことになってしまいます。植民地を確保して賄おうにもガイア型にしか住めないのでかなり増やしにくいです。 ガイア型にしか住めないというのは、有機生命体であってロボットなら他のタイプの惑星に植民できるというのであれば、Life-Seededはロボットプレイをするしかないのかもしれないですが、これに関しては未検証です。
プレイスタイルについて 今回自分がとったプレイスタイルは要塞でガン守りキメるガチ芋戦略です。アップデートで要塞関連が変わり結構使えるものになったらしいので。 防衛プラットフォームを上限まで…

[C#]拡張メソッドでboolにNot()を生やすとどの程度パフォーマンスに影響があるのか調べてみた

イメージ
はい、昨日書いた記事(if(flag == true)はありなのか?なしなのか?)で気になったので調査してみました。

ベンチマークには前々から使ってみたかったBenchmarkDotNetを使います。

同じプログラムの相対比較なのでマシンスペックには影響されないと思いますが、いちおうマシンスペック:
Windows 10 procore i7 6700GTX970RAM 16GB
比較したいものはこちら
public static class BoolExtension { public static bool Not(this bool b) { return !b; } } // ~~~~ // こいつらを比較したい if(!flag){} // おそらくこっちは最適化されずにほんの少しパフォーマンス悪いはず if(flag.Not()){}
はい、そうです答えはもう予測で来てるんですよね。拡張メソッドNot()は最適化されずにメソッド呼び出しのオーバーヘッドでほんの少しパフォーマンス(速度)悪いと。
それで、知りたいのはどれほどパフォーマンスに影響するか、です。

計測コード貼っておきます。
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes.Jobs; using BenchmarkDotNet.Running; namespace BoolBenchmark { public static class BoolExtension { public static bool Not(this bool b) { return !b; } } [ClrJob] public class Program { static void Main(string[] args) { BenchmarkRunner.Run(); } private bool canNotCount = false; [Benchmark] …