ReSharperのInlay Hints機能の表示切り替え

3カ月ほど前からVisualStudioに拡張機能のReSharperを導入しました。
リファクタの提案をしてくれたり、スニペットを登録できたりと、何かと便利に感じています。

そのReSharperなのですが、デフォルトで型推論varの実際の型であったり、
引数のパラメータ名であったりを表示してくれる機能 Inlay Hints があります。
この機能、他者が書いたコードを読む際には大変便利なのですが、
下記例のように1行が長くなってしまい、逆に不便に感じることがしばしばあります。

a
Inlay Hintsで冗長になる例

そこで、任意のタイミングでInlay Hintsの表示/非表示を切り替える方法があれば良いのにと思い調べてみたところ、
ReSharperの公式マニュアル[1]に記載されていました。
以下の方法でできるようです。

1. スクロールバー上部アイコンを右クリックして表示したコンテキストメニューから切り替える
2. エディタ上で Ctrl+Shift+Alt+5 ショートカットキーを押す
3. ResharperのOptions -> Environment -> Inlay Hintsで、
Enableのチェックを外す or visibilityをShowAlwaysから別の項目に変更する


1. InlayHintsコンテキストメニュー


3.-ReSharperのOptions

2は押すキー数が多く、3はOptionsウィンドウを開くのに一手間かかるので、
この中だと個人的には 1のコンテキストメニューが一番手軽だと感じました。

マニュアルには、visibilityをPush-To-Hintにすることで、
Ctrlキー長押し?やCtrlキー2回押しで表示を切り替えれる旨の記載があるのですが、
こちらは上手く再現ができませんでした。
圧倒的にこちらの方が手軽なので、VisualStudioにて再現できた方がいれば、
その手順など教えていただけると嬉しいです。

[1] インレイヒント | ReSharper: https://pleiades.io/help/resharper/Inline_Parameter_Name_Hints.html

初級ソフトウェア品質技術者 資格試験

11月に、初級ソフトウェア品質技術者 資格試験を受けました。
ソフトウェアの品質技術を身につけ、品質の向上を目的とした試験で、
ソフトウェアの品質向上に関する知識を体系的に学ぶ為に受験しました。

試験に関しては、初級試験の合格率は40%前後なので、きちんと学習しないと合格は難しいようです。
また今回の試験から新しいシラバス(Ver.3.0)となっており、出題範囲も広くなっています。
私の場合はシラバスの用語をピックアップしながら、テキストを読み進めるスタイルで学習しました。
実務で品質を扱っていないと用語や概念が難しい部分もありますが、
ソフトウェアのライフサイクル(企画~廃棄まで)を意識して、
今はどのプロセスの内容の事を指しているのかを把握する事が重要だと感じました。

学習した内容を生かして、
今後は社内のプロセス改善や品質向上に役立てていきたいと思います。

macでの開発

iPhoneアプリの開発を今後行っていくため、初めてmacをさわりました。
今までほぼWindowsしか扱ってこなかったので、これまでの常識とは異なることが多く大変ですね。

どうにかこうにかテレワークで開発が行える所まで準備ができ、少しずつ慣れていっているところです。

新しいことを学ぶのは大変ではあるものの楽しくて良いです。
時間が無限にあれば良いのですが、そうは行かないのでまずは既存の開発を前倒しして、早いことiPhone開発を初めたいところです。

自作PC

こんにちは mtjです

今回自分の使用しているPCをAMDからintel12世代にしました。
CPUの交換は約3年ぶり IntelCpuは10年ぶりぐらいになります。
DDR5+intel12世代で色々と快適になりました。

久しぶりのCPU交換だったので色々失敗
AMDCPUは交換時にすっぽんしてしまったのでマザボにダメージがあるかもしれません。
CDドライブの電源コネクタにエアーをしなかったので内部でショートしたのかCDドライブも動かなくなりました。

CDドライブはだめになりましたが intelCpuもCPUクーラーも簡易水冷にしましたが問題なく動いています。
消費電力は高負荷時で約500Wぐらいでした。
PCは満足な状態になったのでいい買い物だったと思います。

簡易水冷をつけて思いましたがPCケースが大分狭いと感じました。
時代の流れでグラボ等色々巨大化してるので10年前のPCケースではもうそろそろ限界かもしれません。
今度大きい変更のときにPCケースも新しくするべきかもしれません。

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

大変遅くなりましたが、言語の由来Part2です。

・Java
断定はされていないようなのですが、
言語ロゴがコーヒーカップであるようにコーヒーが由来のようです。
ジャワコーヒー(Java Cofee)のJavaではないかということのようですね。

・Python
イギリスのコメディ番組「空飛ぶモンティ・パイソン」から取られたようです。
わかりやすく特徴的なだけにこの由来は有名かもしれませんね。
開発者は短くて個性的で少し不思議な名前を付けたいと思っていたようなので、
印象に残りやすいのも納得です。

・Rust
植物に寄生するさび菌に由来するようで、堅牢(Robust)の部分文字列でもあるそうです。
開発者チームに自転車好きが多かったためロゴは歯車になった、とどこかで見かけていたため、
てっきり金属の錆のことだと思っていました。

・Dart
最近名前を見聞きする、クロスプラットフォームフレームワークのFlatterで使用される
Dartの名称の由来はググり力が足りず調べても見つかりませんでした。
どなたか知っておられる方がおりましたら教えていただけますと幸いです。

他にもいくつか調べたのですが、書くのにあまり時間をかけ過ぎてもアレなのでこの辺で。
こうやって言語の由来を調べてみると、開発者のことが垣間見える感じがして良いですね。
皆さんも息抜きに自身の好きな言語の由来を調べてみるのはいかがでしょうか。

[1] Java – Wikipedia: https://ja.wikipedia.org/wiki/Java
[2] General Python FAQ — Python 3.10.0 documentation:
https://docs.python.org/3/faq/general.html#why-is-it-called-python
[3] Internet archaeology: the definitive, end-all source for why Rust is named “Rust”:
https://www.reddit.com/r/rust/comments/27jvdt/internet_archaeology_the_definitive_endall_source/

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のコレクションとなるようです。
あまり使いどころは無いかもしれませんが、覚えておくとどこかで役に立つかもしれません。