.NET 5
アンパンマンDB4の開発に集中していて気付かなかったんですが、.NET 5リリースされてたんですね。
早速Visual Studioアップデートして、.NET 5対応環境に更新しました。
.NETのバージョンを上げると動かなくなるライブラリがあったりするので油断はできないですが、折を見て既にあるソフトとかも.NET 5対応させていきたいですね。
一緒にC# 9も有効になるみたいですが、これも機会があれば試してみたいところです。
アンパンマンDB4の開発に集中していて気付かなかったんですが、.NET 5リリースされてたんですね。
早速Visual Studioアップデートして、.NET 5対応環境に更新しました。
.NETのバージョンを上げると動かなくなるライブラリがあったりするので油断はできないですが、折を見て既にあるソフトとかも.NET 5対応させていきたいですね。
一緒にC# 9も有効になるみたいですが、これも機会があれば試してみたいところです。
DLLで提供されるライブラリにドキュメントコメントを反映させるテストも兼ねて、アップデートしました。
今回は、何もプログラムには手を付けず、本当にドキュメントだけの更新です。
必要だった設定は、csprojファイルに以下の1行。
<GenerateDocumentationFile>true</GenerateDocumentationFile>
C#の参照型のNullableをちょっと体験。
ライブラリなら.NET Standard 2.1、アプリなら.NET Core 3.0で使用可能。
ちょっと既存のコードだとNULLの存在を前提としている部分が多くて結構難儀な様子。
.NET Frameworkでクリップボードにコピーされたファイルを得るのにはClipboard.GetFileDropList()を使うといいのを知った。
System.Windows名前空間とSystem.Windows.Forms名前空間にあるが、効果は同じ模様。WPFかFormsかという違いだろうか。
実際にファイルがコピーされているかどうかはClipboard.ContainsFileDropList()で知ることができる。
コピーされていなくても、Clipboard.GetFileDropList()は長さ0のコレクションを返す。
履歴カテゴリ機能がほぼできた。
これで移行予定のないもの以外は一応置き換えられるようにはなった。
まだ細々とした修正は必要になりそう。
throw null;は実際にはNullReferenceExceptionを投げるらしい。
自分で使うことが多いのはArgumentNullExceptionだけど、拡張メソッドとかでは使えそう。
??=演算子が新設らしいことを知った。
あれば便利だけどなくても全然困らない系。
無料で使える?何ができる?
TGWSDQX用のURL取得プログラムをUWPで書き直していました。
UWPにもウェブブラウザ的なコントロールは最新のEdge仕様になって搭載されていたのですが、従来のWebBrowserとはいろいろ勝手が異なっていて大変でした。
やっぱり非同期処理と、ソースの取得が難関でした。
非同期処理は、async、await、Dispatcher、AutoResetEventをバリバリ使うことで一応解決。
ソースの取得は、そのままではできないので、JavaScriptの任意のコードを実行できるevalをUWP側から呼んで解決。
source = await wb.InvokeScriptAsync("eval", new string[] { "document.documentElement.outerHTML;" });
C#をブラウザ上で動くJavaScriptにコンパイルするDuoCodeなんてのを見つけました。
JavaScriptではあまり大きなものを作る気は起きないし、もともとC#で作っていたものをWebアプリ化するのには便利そうですね。
というわけで、昨日言っていた便利なクラスのひとつ、SafeClipboardを公開しました。
やってる内容はほんっとにくだらないんですけど、これはこれで結構楽になるのです。
ついでに、ダウンロードページのカテゴリの分け方を一部変更しました。
なんだかListViewのSortの挙動が怪しかったので、Array.Sortを使って自前で並び替えを実装しました。
そして今度は一度読み込んだログの破棄を実装してみました。
そうそう、最近NeoMuplもC#で作り直そうとたくらんでいます。
別に現在のVB版では致命的な問題があるわけではないのですが、どうにもセーブデータのいじるのが果てしなく面倒なのですよ。
いえ、果てしなくというほどでもないのですが、新要素の追加は行いたいのですが、それに伴う色々な部分の細かい改変が面倒なんですよ。
機械的な作業なのに自動化できなくて、面倒なだけの入力が続き、こういうのがつまらないミスを生み出して、つまらないがゆえに、もっとすごいところでミスしているのだろうと思い、見当違いなところばかり探す羽目になって、無駄な苦労を増やすばかりになってしまうのです。
で、そういうところを自動化するようなプログラムはVBではなかなか書きにくいので、他の言語に移そうということなのです。
特に曲の情報の入力フォームの統一は今のプログラムでは非常にやりにくいので、ユーザーコントロールを簡単に作れるVisualC#で開発したいということなのです。
ふにゃさんが一区切りついたのでナマライザ作ってました。
ListViewでもDataBindingが使えるかなと思ったのですが、どうにもDataBindingが適用できるのはどうでもいいプロパティばかりで、肝心のItemsプロパティには適用できなかったようです。
おかげで自分で表示を更新するプログラムを書かねば…って、本来これが当たり前なんですけどね。
まあ、表示そのもののプログラムは、表示するべきデータを用意するプログラムと比べればずっと単純で楽な作業であるはずなのでいいと思うんですけどね。
まずはC#とGDI+の組み合わせを試してみました。
それが今日の画像です。
この拡大方式、自然画や写真などには威力を発揮するのですが、ドット絵に使うにはちょっと絵の端っこが問題となりそうです。
これはこれで全体としてはある意味見栄えがするので工夫次第で何とかなりそうだし、もしかしたらオプションをつけてもっといい拡大方法が選べるのかもしれないので、もう少し調べてみてもよさそうです。
あとyaneSDK.NETも一応…。
マイクロソフトの「よく寄せられる質問 : Visual Studio と Windows Vista」を見ていました。
何せWindowsXPとは全く異なるOSがもうすぐ出るっていうときに、開発に時間がかかり、なおかつ長い間プレイしてほしいゲームをWindowsXPで作ろうとしているのですから、気になるってものです。
これを見てまず驚いたのが、WindowsVistaでもまだ現役としてVisualBasic6.0が使えるということ。
こうなったのは修得の容易さからVB6を使う人が未だ多いためにしぶしぶといったところだそうですが、もうすぐ本格的にVB6とはお別れしなければいけないと思っていたところなのでちょっぴりうれしい気持ちです。
もっとも、VB6以外については、最新のVS2005と極端に変わらないと言う理由でVistaからはサポートしなくなるそうですが。
ただ、VB6やVS2005がWindowsVistaで使えるようになるのは2007年第1四半期からだそうで、そうなるとWindowsVistaの導入もそれにあわせて4月以降になってしまいそうです。
もちろん導入できればの話ですが。
WindowsVistaでは、.NET2のプログラムがそのまま動かせるそうで、また、WindowsXPでも.NET2をインストールすれば使えるということで、今後の開発は.NET2が中心になっていきそうです。
次のバージョンの.NET3も.NET2を完全にサポートするようですし。
それで気になるのが、今から作ろうとしているBomber丸Worldです。
まだ作り直しはききますし、C++からC#への移行はある程度容易です。
しかし今現在の状況では、開発環境が重い、ウィンドウ切り替え直後の再描画がなぜか遅い、などの欠点がありますし、そもそもVC#2005での本格的なゲームの開発経験は皆無です。
しかしその代わり、標準ライブラリは確実にVC6よりは充実していますし、開発環境も重くなった分やはり圧倒的に強力になっています。
すでに1割を切った古いウィンドウズの利用者を切り捨てて自分だけさっさと先に行ってしまうか、将来動くかどうかわからないプログラムをそのまま作り続けるべきか、悩みどころではあります。
それはそうと、今日はナマライザのファイル読み込みを作りました。
テスト用の小さなファイルで動作を確認したのですが、とりあえず現状ではうまく動いていそうです。
実はコピーして一部変更しなければならなかったコードをコピーだけして変更しないという初歩的なミスを犯したりしていたのですが。
System.Collections.Generic.SortedListって遅い!!
なんちゅう遅さだ!!
O(n)で要素を追加できるからx個のデータの中からn個をを追加するならO(xn)ですむはずなのにものすごく遅い!!
他のSortedDictionaryも同様。
私が欲しかったのは要素の追加が(logn)程度で行える、整列された、値の重複を許さない、値のコレクションだったのですが、どうにもなさそうだったので普通の配列で頑張ってみることにしました。
string[] outArray = new string[1];これ、O(n2)の処理なんですがもう感動的な早さです。
int count = 0;
bool found;
foreach (string data in inArray)
{
found = false;
foreach (string item in outArray)
{
if (item == data)
{
found = true;
break;
}
}
if (!found)
{
if (count >= outArray.Length) Array.Resize(ref outArray, count * 2);
outArray[count] = data;
count++;
}
}
Array.Resize(ref outArray, count);
Array.Sort(outArray);
VisualC#、どちらかというと―IDEの影響が大きいかもしれませんが―VisualC++6よりははるかにVisualBasic6に近い感じがします。
ちょっとコードの一部を出してみると、
pnlInfoUpper.Height = cmbName.Height * 3;
lblName.Left = lblGame.Left = lblInfo.Left = 0;
lblName.Height = lblGame.Height = lblInfo.Height = lblGame.Top = cmbGame.Top = cmbName.Height;
lblInfo.Top = cmbName.Height * 2;
lblGame.Width = cmbName.Left = cmbGame.Left = lblName.Width;
data.Load();
ChangeView(ViewMode.ABC);
LayoutInfo();
プロパティを指定してコントロールの大きさを変更してるあたり、いかにもVBです。
他にもVBと同じ仕様のforeachがあったり(本当にVBのFor Eachに括弧をつけただけです)、refをつけて明示的に参照渡しにしたり(VBではByRef)、VBをC言語風の見た目にしたような感じでした。
ファイルの読み書きについてはJavaに似ていて、System.IO名前空間のクラスを使って読み書きします。
StreamReaderはテキスト読み込みクラスで、
sr = new StreamReader(filename, Encoding.GetEncoding(932));
でテキストファイルを開き(Encoding.GetEncoding(932)はシフトJIS)、ReadLine()メソッドで一行ずつ読み込めます。
もしかしたら変な予備知識がない分VB.NETやC++.NETより使いやすいかもしれません。
いや、だからこそC#にしたんですけど。
そうそう、コーディング中にもガンガンエラーを出したりヒントを出したりしてくれるので下手にヘルプを引くよりまずは何かを入力してみるというのが結構有効です。
そして、ヘルプは、大して速くもない自分のパソコンを使うよりも、Googleで検索したほうが圧倒的に早く、正確な情報が得られます。
う~む、C#のコントロールによるレイアウトはJavaのように自然な大きさに調整されるとかそういうのはないみたいです。
でもまあレイアウト関連はVBとかに比べるとやっぱり自動的にやってくれる部分が多くて助かります。
えっとですね。C#。どっちかというとIDEも含めればVBに近いです。
VBをC風の文法でかけるようなものです。
オンラインヘルプがあまり当てにならないのがつらいところですがメンバ自動表示や、ツールチップなどで機能を簡単に説明してくれたりするのでそっちで補えそうです。
そうそう、ミディビ更新しましたよ。
内容はバグ修正のみ。プログラミングコーナーも更新です。
しかしVC++.NETを触ってみた感想、.NETにあわせてC++が結構拡張されてるみたいです。
^って何よ。
下手したらMFC以上にタチ悪いかも??
^というのはどうにもオブジェクトのハンドルらしいです。
gcnewで生成したオブジェクトを代入しているあたり、どうもガーベジコレクタが働いて、使われなくなったら自動的に解放されるらしいです。
しかし、後付けの機能が増えるに従い際限なく複雑化するC++がいい加減嫌になってきたので.NETはC#にすることにしました。
VC++2005はWindowsネイティブもできるから選んだというのに色々面倒なステップが必要な上にRADツールもつかずSDKは英語ということで、とても実用に堪えるものではなく、騙された気分でした(VC6があるので)。
というわけでVC#を導入。
なんかこれはこれでライセンス登録が必要らしいです。
でも少なくとも.NETに無理矢理C++を当てはめたVC++.NETよりは見通しがよさそうな気はします。
「ByteEdit」で、バイト列の挿入・削除処理を作りました。
この二つを組み合わせればすぐにでも置換処理ができるようになります。
これで削除ができるようになりました。
次は入力処理ですが、これについては既に構想ができているのでこれまたすぐにでもできそうな予感です。
今必要な機能の中で、一番難しそうなのは選択範囲の反転ですが、これができたら一気に切り取り・コピー・貼り付け・選択範囲の削除・すべて選択ができるようになります。
ま、10月までには完成させますよ。(・_・)v
しかし、これを作ってみてつくづく思ったんですが、オブジェクト指向ができないVB6ってこういうのにはあまり向きませんね。
一応クラスを作ってそのメンバにいろいろやらせればできそうな気もしますが、無意味にも思えます。
というわけで、オブジェクト指向言語「C#」をフリーの開発環境「SharpDevelop」で使ってみることにしました。
とりあえずは練習も兼ねて「ByteEdit」の拡張版「BytesEdit」を作ることにしました。
しかしC#って、見れば見るほどJavaに似てますね。
「バイオハザード2」で、「Extreme Battle」をやりました、例によって弟が。
一応目的を伝える程度にストーリーはありますが、本編のストーリーとの直接的な繋がりはありません。
で、恐ろしいことに、リッカー(中ボス)がたくさんいたり、タイラント(裏ボス)が二人でウロウロしていたり、G(ラスボス!)がどうでもいい場所に現れます。
しかもなぜか1のクリスが使えたり。
1~3時限があって4時限が無く、5時限が英語…
開いた1時間50分、どうしてくれよう…
ということで、生協の本屋で.NET関連の本を立ち読みしていました。
2冊しか見つからなかったのですが、そのうちのひとつ、C#についての本:
「C++でベタベタコードを作るのはだめだ」とか、「DoEventsをたくさん入れて上から下へプログラムが進むVBはよくない」とか、「C言語しか知らないVC++プログラマがどうたら」とか、ほかの言語のことをボロカスに書いてあって、前書きだけで不愉快になりました。
.NETに対する興味が半減、個人的意見をあたかも一般論のように語る筆者を恨む。
一方、VB.NETの本:
「VisualBasic6はWindowsプログラミング言語のひとつの完成体」、まあこれはVBプログラマを喜ばせる以外に何の意味も持ちませんが、その続き、「インターネットが進歩してきたのでVBもそれに合わせて変更する必要が出てきた」、確かにその通りで、周りが進歩するなら、それに付随するツールも進歩しなければ宝の持ち腐れなのです。
ところで、.NETのプログラムの起動が遅いのは、実行時にコンパイルしているからだそうですね。