主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

MongoDBでオートインクリメントを・・・という話をほんの少し先まで

                
tags: C# mongoDB
MongoDBでドキュメントの任意のフィールドをオートインクリメントにしたい・・・というサンプルは本家にある。
https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/

関数を使うわけだが、その時点で開いてるターミナルを閉じたらその関数は消える。なので永続化として下記のように保存、保存したものを呼び出して使える。
db.system.js.save({_id:'nextSeq',
value:function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
} );
return ret.seq;
}
});

db.system.js.findOne({_id:"nextSeq"}).value("userid");


C#ではストアしたJavaScriptはBsonJavaScriptとして取得できる。だけどどう実行するの・・・ドキュメントでもサンプルでも使用例が見つからない。なのでストアされたものを使わずに自分で書く。
var fooCollection = db.GetCollection("foo");
var d = new BsonDocument
{
{ "a", new BsonJavaScript("(function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
});
return ret.seq;
})('entry_id')")
}
};
fooCollection.InsertOne(d);
スポンサーサイト



C#: 時間のかかる処理を実行しつつもGUIでのインプットを受け付ける

                
 スクリーンキャプチャからGIFアニメを作るアプリをちょいと作っておきたかった。
 やり方としてスクショを一定時間ずつ撮ってGIFにして、それをGIFアニメの形式になるようにファイルに加えていって。そういうわけでGUIに中断ボタンをつけておき、ボタンクリックによってある変数がfalseになったらスクショ撮りをやめてGIFアニメを作るということがしたい。中断ボタンが押されるまでは(もちろんメモリ容量の限界があるのでフレーム数の限度も設けておくが)一定の時間間隔でスクショを撮り続ける。一定の時間間隔で撮り続けるということを実行するため、ループを回しその中での処理が特定の時間間隔になるように、一時停止を入れなければならない。
while (screenCap_continue)
{
Thread.Sleep(delayTime); //GetScreenが一定の時間間隔で行われるように調整
GetScreen();
}


 上記のような時間間隔の調整を別スレッドを立てたりせずに同期実行すると、Sleepによって処理が止まる。処理が止まるというのはGUIでのインプット待ちという処理までとまるということ。つまり変数screenCap_continueが書き換えられずに無限ループ。そこでGUIのインプット待機を続行するために非同期処理をこのあたりに適用した。Taskとasync、awaitを使うことで非同期処理の導入が楽になっている。

private void CaptureScreen()
{
while (screenCap_continue)
{
Thread.Sleep(delayTime); //GetScreenが一定の時間間隔で行われるように調整
GetScreen();
}
}

private async void MakeGifAnime()
{
await Task.Run(() =>
{
CaptureScreen();
}
}

private void CancelButtonPressed(object sender, EventArgs e)
{
screenCap_continue = false;
}

C#: オブジェクトイニシャライザで手短にコードを書く

                
 基本的にコードはなるべく短くして可読性を上げるようにする。C#にはそれを達成する手段の一つとして”オブジェクト初期化子”なるものがある。

 通常、クラスの初期化はnew修飾子を使う。そして必要なメンバーを次の行からいじっていく。
WPFを使った例
var window = new Window();
window.Width = 300;
window.Height = 300;


 サイズが300×300のウィンドウを作るには上記のように3行必要となる。これを一行にまとめて書けるのがオブジェクトイニシャライザである。
var window = new Window {Width = 300, Height = 300};

Windowの初期化に特別な引数は必要ないので丸かっこを省略し、代わりにブレースでWidthとHeightに値を渡す式を書いている。WidthとHeightはWindowクラスのプロパティに存在しているものなので、インスタンス作成時にそのまま値をセットできるわけだ。便利。

 通常、クラスのプロパティに値をセットしたい場合、明示的にコンストラクタを呼び出す必要があった。だから一部が同じプロパティを持つインスタンスの作成をコピペで作るのに若干の手間があった。
var grid1 = new Grid();
grid1.Width = 300;
grid1.Height = 300;

var grid2 = new Grid();
grid2.Width = 300;
grid2.Height = 300;

var grid3 = new Grid();
grid3.Width = 300;
grid3.Height = 300;


 オブジェクト初期化子を使うと、コピペでのインスタンス作成が楽になるという利点がある。
var grid1 = new Grid {Width = 300, Height = 300};
var grid2 = new Grid {Width = 300, Height = 300};
var grid3 = new Grid {Width = 300, Height = 300};


 コードがシンプルになるし、そのおかげでコピペも楽になる。使うべきオブジェクト初期化子。

C#: 近年のC#

                
tags: C#
つぶしの効く言語やりたきゃC#を学ぶのもすごく有効だろうという話。



プログラミングは言語ごとにある程度の立ち位置を持っている。ゲーム作りたきゃC++、WebやりたきゃRailsがあるRubyが良い、もしくはPHP + MySQL、PythonはWebのほかにもいろいろ、ウィンドウズアプリならC#などなど。

年月が経てばこのあたりはいろいろ変わってくる。最近のC#はウィンドウズアプリを超え、LinuxやMacで動作するアプリ、クロスプラットフォームでのゲームや、iOSやAndroidでのタッチアプリ(これはXamarinのライセンス購入しなきゃならんけど)開発まで可能になっている。かなりつぶしのきく言語となった。

世間にはC#がウィンドウズと強く結びついているイメージがある。これはC#が動く基盤となっている.NET Frameworkという実行環境が、当初はWindowsOS向けにのみリリースされたことによるんだろう。この実行環境の仕様は公開されている。そのためこの実行環境をつくる人がMicrosoftの外に現れ、.NET FrameworkをLinux、Macにまで対応させたMonoを作った。このMonoの登場によってC#はWindowsOSを出て、LinuxやMacでも動くようになった。ゲーム開発環境であるUnityもこのMonoを利用している。Monoのリリース後も開発者は手を休めることなく、iOSやAndroidにも対応を広めている。
http://www.atmarkit.co.jp/news/200901/29/mono.html

Objective-Cを開発に使うのはMacOSかiOSがほとんど。JavaはAndroidで圧倒的に強いしいろんなプラットフォームで動く。C#はWindowsOSで圧倒的に強いしいろんなプラットフォームで動くようになった。つぶしの効く言語としてC#を学ぶのもいいんじゃないだろか。

WPF: WindowStateとフルスクリーン

                
WPFウィンドウをタスクバーをおおい隠してフルスクリーンにするには、WindowStyle, WindowState, ResizeModeのプロパティをいじる順番が大切なようだ。以下の順番で実行しても、ウィンドウはフルスクリーン化されない。
ResizeMode = System.Windows.ResizeMode.CanResizeWithGrip;
WindowState = System.Windows.WindowState.Maximized;
WindowStyle = System.Windows.WindowStyle.SingleBorderWindow;


WindowStateをMaximizedにすることでフルスクリーン化したければ、先にResizeModeをNoResizeに、WindowStateをNoneにしておく必要がある。
ResizeMode = System.Windows.ResizeMode.NoResize;
WindowStyle = System.Windows.WindowStyle.None;
WindowState = System.Windows.WindowState.Maximized;
プロフィール

h

Author:h

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon