ASP.NET Core MVC

仕事で ASP.NET Core MVC を使用しました。
社内では既に実用していたのですが、
プロジェクトの作成や新規で導入を行ったのは、個人的に初めてとなります。

Razor構文やHTML、JavaScriptでwebページや処理を記述する事になるので、
慣れないと少しぎこちない部分もありますが、新鮮でした。
比較的新しいフレームワークなので、
例えばxxxControllerのxxxが、Viewsのxxxフォルダと対応したり、
1つのViewに相当するyyy.cshtmlがyyy()メソッドと対応したりなど、
フレームワーク側のサポートがあって使いやすいと感じました。

このようなサポートはその命名ルールを強制する事になるので、
開発者としては迷いが少なく助かります。
これをきっかけに、Web関連の知識や技術も学んでいければと思います。

社内ライブラリの.net5(.net core系)対応

社内ライブラリを改造し、.net5などの.net core系で動作するようにしました。

社内ライブラリは.net frameworkで作成されています。
本来であれば.net coreに移行するのが良いのですが、それはなかなか大変です。
とりあえずは.net frameworkのままとして、.net coreプロジェクトで使用しても正しく動作するように改造を行いました。

今までの単体テストも全てパスしましたので、とりあえずはこれで当分なんとかはなるだろうと思います。

いずれは、.net coreへの完全移行も考えないと行けないですが、少なくとも長期サポート版の.net6が出てからですね。

カーネルレベル

こんにちは mtjです。

最近カーネルレベルで対策を行うアンチチートソフトが話題になっている。
カーネルとは と思う方はリングプロテクションで調べてみると早いと思う。

今までの権限では監視しきれないから 低層で動かし広い権限で監視を行おうということだと思う。

昔ならばDirectXをフックして色々するチートが合った気がする
アンチチートソフトがバイナリパターンとかの監視をしているので それなら直接DirectXの動作を書き換えてしまおうという感じなのかもしれない。
現代ではそのレベルでなく デバイスドライバレベル、どこかでUEFI BIOSレベルで動いているという記事も見た気がする。
UEFI BIOSならばリング-2か-3のはずなので 本当にカーネルレベルのリング0だと検知できない気がする

そういったチート対策の記事を見てPCが高度化したことにより解析、脆弱性を突く方法もどんどん高度化しているんだなと感じる
コンピューターセキュリティは本当終わりがなさそう

そして、チートは別としてプログラマーとしてはそういった低層で動くプログラムをどういう風に作り どういう風に導入しているか気になる。

プログラミング言語の名称の由来 Part 1

今まであまり考えたことがなかったのですが、
ふとC言語の”C”とは何ぞやと思い、
C言語及び関連言語の名称の由来を調べてみることにしました。

・C言語
B言語の改良した言語、でC言語だそうです。
流石にA, B, C…のCではないだろう、と思ったら似たようなもので驚きました。
そのC言語の由来となったB言語自体の由来は、
BCPL(Basic Combined Programming Language)を元に開発されたため
その短縮形である、という説が一般的なようです。
こちらはA言語が由来ではないのですね。
(BCPLやその元のCPLも同様にA言語由来ではないようです。)
因みにA言語の由来はa programming languageの略だそうです。。。

・C++
Cを一歩進めたものということで、CをインクリメントしてC++, 納得です。

・C#
インフォテックでもメインで使用しているC#ですがその由来は、
C++を更にインクリメント(改善)して C++++

4つ並んだ+が#に見えるので C#
だそうです。
#そのものの意味を含んでいないとは思わず、調べた中で一番驚きました。

その他の言語の由来もいくつか調べてみたのですが、
長くなりそうなので、また別記事に分けて紹介しようと思います。

参考:
[1] C言語(C language)とは – IT用語辞典 e-Words(https://e-words.jp/w/C%E8%A8%80%E8%AA%9E.html
[2] B言語(https://ja.wikipedia.org/wiki/B%E8%A8%80%E8%AA%9E
[3] A言語(https://ja.wikipedia.org/wiki/APL
[4] C++言語とは – IT用語辞典 e-Words
https://e-words.jp/w/C-_-_%E8%A8%80%E8%AA%9E.html
[5] C#(C Sharp)とは – IT用語辞典 e-Words(https://e-words.jp/w/C-.html

C# オブジェクト初期化子でプロパティのプロパティを初期化

C#でオブジェクト初期化子という構文があります。
オブジェクトの作成時にアクセス可能なプロパティやフィールドに値を割り当てるもので、
例えば次のように書きます。

var person = new Person() {
    Name = "Taro",
    Id = 1,
};

これは以下と同等です。

var person = new Person();
person.Name = "Taro";
person.Id = 1;

メリットは初期化の内容が1箇所に集まることで、
初期化中に間違って別の処理が混入することが無いことです。
なので積極的に利用すべきですね。

初期化できるのはアクセス可能なメンバーに限定されるので、
例えば以下のケースはコンパイルエラーとなります。

var parent = new Parent() {
    Person = new Person(),  //Person プロパティはsetできないのでコンパイルエラー
};
class Parent {
    public Person Person { get; } = new Person();
}

class Person {
    public string Name { get; set; }  //プロパティ
    public int Id;  //フィールド
    public List<int> RelatedId { get; }

    //コンストラクタ
    public Person() {
       RelatedId = new List<int>() { 1 }; //要素"1"で初期化
    }
}

Parentオブジェクト初期化子内で、
Personプロパティのプロパティを設定したい場合は以下のように書きます。

var parent = new Parent() {
    Person = { Name = "Taro", Id = 1 }
};

ではList<int>に値を指定した場合はどうなるでしょうか?

var parent = new Parent() {
    Person = { Name = "Taro", Id = 1, RelatedId = {10, 20}}
};

RelatedIdはコンストラクタで初期化された値に値が追加され、
この場合、要素が{1, 10, 20}の要素数3のコレクションとなるようです。
あまり使いどころは無いかもしれませんが、覚えておくとどこかで役に立つかもしれません。

PostgreSQL

今進めている案件で初めてPostgreSQLを使用しました。

いつもはSQLServerを使用することが多いので、下調べから始めましたがなんとか使用できるようになりました。
管理ソフトはHeidiSQLを使用しています。特に問題なしです。
C#のライブラリはEntityFramework6.Npgsqlを使用しています。EntityFrameworkはシンプルで良いですね。

思っていたより敷居が低くで良かった。

プログラムの勉強について

こんにちはmtjです。

プログラムの勉強について プログラムを勉強しようとして本を読むと大体挫折してしまうと思います。
IF文、For文という文章を読んだとしても分岐、繰り返し処理をするものだとわかってもそれを使う場面が想像できないと只詰め込むだけになってしまうためです。

プログラムの勉強はインプットとアウトプットが合わさって初めて物になると自分は思います。
繰り返し、分岐の話もそれを元に何が作れるかを考えると勉強も捗ると思います。

例えば繰り返しで簡単な時計を作ろうとします。
Forループでは固定回数しか動かせないので時計は途中で止まってしまいます。
そこでWhile等の無限ループを覚え、無限ループをするとメインスレッドが止まってしまうので別スレッドの動き等を学んだりします。

上記のように何かを作ろうとすれば付随していろいろな事も勉強できます。

プログラムを教える人達(主に学校で)がそういう意識を持つことでもっとプログラムの面白さ、簡単さを伝えられるのではないのかなと思いました。
プログラムの難しさはプログラム自体じゃなく勉強の仕方自体にあると自分は思います。

Visiual Studioの右クリック時メニューに項目を追加する方法

先日、Visual Studioでコードエディタ上を右クリックした際のメニュー*に、
上部メニュー内の項目(ビルドなど)があると良いな~と思うことがありました。
* コンテキストメニューと言うそうですね

少し調べてみたら方法がわかったので、備忘録も兼ねて以下に記載します。

1. 上部メニューのツールからカスタマイズを開く

2. カスタマイズのコマンドタブで
2-1. コンテキストメニュー:エディタコンテキストメニュー|コードウィンドウを選択

2-2. コマンドの追加を開き、目的のコマンドを追加

以上の手順により、コードエディタ上で右クリックした際のメニューに目的の項目(コマンド)を追加できました。

頻繁に使うわけではないけれども上部メニューから一々実行するのは手間な場合に、
ショートカットキーと違って覚えておく必要のない、
今回のコンテキストメニューへの追加が便利なのかな、と思います。

参考にさせていただいたのは以下のサイトになります。
ありがとうございました。
Sunday Programmer’s Report: Visual Studio のコンテキストメニューに「Blend で開く」を追加する

ソフトウェアの完成

製作しているソフトウェアが完成すると嬉しいものです。
でも完成のタイミングとはいつなのでしょうか?
実装が全て完了して、
仕様を満たしているか、動作は問題無いか等の確認を行い、
全て合格した場合に完成となります。

ただ動作テストの時にいろいろ気付くこともあり、
そのときに「この部分は使い勝手が悪い」「もっとこうしたほうが良い」など、
特にUI(ユーザーインターフェース)周りで改善案が浮上します。
私の場合はこの時点で挙がった改善案をtodoとして、
それらを解決した時点で完成としています。

デザインやUIの部分は、想定する使い方が変わると、
「使いやすさ」を実現する方法も変わってしまいます。
これらの全て実装すると開発期間やコストをオーバーしてしまいますので、
まずは普通の使い方で不便を感じない実装が重要だと考えています。

それでも「期待以上だった」とお客様に言って頂けるような、
そんなソフトウェアを目指しています。

PLINQ(Parallel LINQ)の結果の要素順

以前にPLINQ(Parallel LINQ)の実行速度を調査し、簡単にLINQを並列化して速度改善できることが分かりました。

しかし、PLINQを使用した場合、結果の要素順はどうなるのでしょう?
本来なら元の要素順に取り出したいのですが、並列化されているので順不同なのでしょうか?
調べてみた結果、PLINQを使用しても元の順番通りに要素が取得できました。すばらしい。

詳しくは調査していませんが、PLINQのメソッドの戻り値はParallelQuery型になっており、たぶんこのクラスか、これを継承したQueryOperatorクラスあたりでうまいこと取出し順序を調整しているのでしょう。