C#9.0 record

C#9.0でrecord型が追加されました。
まだ実務では使用していませんが、
今後C#でとても重要な機能になると思っています。

最も活躍できるのが、DDDのValueObjectでしょうか。
今まではそれらしい事をするには等値性を表現する為に、
Equals()やGetHashCode()をoverrideする必要がありましたが、
record型はコンパイラが自動で行ってくれます。

そして定義がとても簡単に行えます。
Microsoftの説明を引用すると、

public record Person {
 public string LastName { get; }
 public string FirstName { get; }
 public Person(string first, string last) => (FirstName, LastName) = (first, last);
}

と同じことが、

public record Person(string FirstName, string LastName) { }

と書けます。とても簡潔ですね。

現在実行しているメソッドを取得

C#で現在実行しているメソッドを取得するプロパティを作ってみました。
何かと役に立ちそう。
インライン化されないようにMethodImpl(MethodImplOptions.NoInlining)を指定するのがポイントです。

public static class Current {
    public static MethodBase Method {
        [MethodImpl(MethodImplOptions.NoInlining)]
        get {
            var stackFrame = new StackFrame(1);
            return stackFrame.GetMethod();
        }
    }
}

2020年お世話になりました。

mgcです。

気が付けば2020年も残り10日となってしまいました。
今年も多くの企業様に大変お世話になりました。
誠にありがとうございました。

ありがたいことに私自身はコロナ禍でも大変忙しくさせていただいておりました。
2021年にはコロナ収束を願い、より一層気を引き締めていこうと思いますので
宜しく願い致します。

それでは皆様くれぐれもお体にはご自愛くださいませ。

プログラミング言語の変化

こんにちはmtjです

プログラミングは基本勉強し続けていくものというのは大体のプログラマが思っている事だと思います。

自分のメインとしているC#も2012年頃と比べるとかなり書き方が違います。(バージョンでいうと5.0から8.0or9.0)

しかし、.Netの互換性等もあり最新のOS向けのプログラムは最新Verで作らないといけないわけではないので
10年前のC#でも現代で動かすことが可能です。
勉強をやめてしまっている人でもプログラムを書くことは可能ですが古い書き方になってしまい
最新の書き方で書かれているものならば理解自体が難しくなってしまうと思います。

言語が進化していれば自ずと勉強していくものですが 言語自体が古く進化がない言語だと勉強が止まってしまうので
その場合はかなり努力が必要だと思います。

そういう意味でも若い人がCobol、VB6等を頑張って保守するのでなく現在の流行りの言語を行わせ
年配者が古い言語を保守すべきなのではないかと感じました。
古い言語を勉強すること自体は幅も広がり悪いことでは無いと思いますが 古い言語を専門にしては先細りの分野なので
将来性が薄いと感じてしまいます。

リファクタリング

既存のソースコードに新しい機能や変更を加えようとするとき、
まず既存のコードをリファクタリングします。
そして切り出したり共通化したクラスやインターフェースなどを、
ソリューションやプロジェクト内のどこに記入するべきか考える必要があります。

全体の設計思想や、選択したフレームワークによって、
適切な場所があるはずですが、なかなか上手く収まらない事もあります。

そのような場合は、自分が全体の設計思想に対する理解が足りていないか、
ソリューションやプロジェクトが上手く構成できていない事がうかがえます。

リファクタリングは基本的には必要な時に行いますが、
例えばテストファースト開発のように、
開発サイクルの中で常時行う方法もあります。

年末の大掃除と同じように、まとめて後でやろうとすると大変です。
普段から少しずつ行っていればリスクも少なく、
ソリューションやプロジェクトの構成もより明確になってゆくものだと思います。

リファクタリングであまり悩むことが無いよう、
安心して開発できる環境を目指したいと思います。

HTMLからPDFに変換

あるC#案件でHTMLからPDFファイルに変換する必要があった時の話。

C#で使用できるPDFライブラリを探し、PdfSharpにたどり着きました。
少し面倒だが日本語フォントにも対応できます。
しかし、PDFドキュメントの作成方法がGraphicsオブジェクト並のローレベルな描画メソッドなので、HTMLから変換するのは手間がかかりすぎ。

次に見つけたのが、HtmlRenderer.PdfSharp。
これは今回したいHTMLからPDFをそのまま実現できるライブラリ。ありがたい。
ですが、日本語フォントの出力方法が不明。
内部的にPdfSharpを使用しているが、バージョンが古いため日本語フォントを使用する方法が異なり、方法がわからない。

他に良いライブラリも無く、どうしたものかと思っていたが、別に変換が出来れば方法は何でも良いので、
コマンドラインでHTMLからPDFに変換できるソフトを探し、wkhtmltopdfを見つけました。
日本語フォントにも対応でき、正しくPDFに変換できました。

実装がC#なので、C#から使用できるライブラリを探しましたが、こだわる必要が有りませんでした。

制御の柔軟性

mgcです。

機械を制御するプログラムであるからこそラダーは柔軟な対応ができるように
設計を行うべきだと感じる事が多々あります。

設計段階で追加改造のことなど考えるのは難しいですが
ある程度頭の中で、[もしかするとこの動作だと難しいかもしれない。]というように
機械の動きを想定しながら最終改造となりそうな箇所を予想して
その分の領域をバッファしておくのも制御屋の力量なのではないかと思います。

設計がうまくできていないと
領域にバッファが無くなり最終的に一括置換でデバイスをずらさなければいけない等の
手間が生じます。
こういった手間を防ぐためにも設計はしっかりと行いたいものです。

PCパーツの変化

こんにちは mtjです。

GPUのRTX3090が販売されました。
以前のRTX2080を軽く超えるものらしいです。
シェーダー処理のFLOPSで言うと2080が11TFLOPSで3090は36TFLOPSらしいです

現状自分は1080tiなのでレイトレーシングすらまともにできないのでどちらでも欲しいのですが
2080の2倍以上という性能は魅力的です。
3090は欲しいのですが価格も20万超えと圧倒的なので悩んでいるところです。

あと数十年もすればこの性能がタブレット等携帯端末になっているかもしれないと考えると本当技術の進化は圧倒的です。

自分たちプログラマもハードの性能を発揮できるように勉強も必要になっていくと思います。
現状でも大量のCPUコアを扱えるので非同期処理等をうまくできないとコアを遊ばせてしまう状態です。

プログラムの変化もそうですが扱うPCの性能、進化を知るのも大事だと感じました。

デザインパターン

GoFの23のデザインパターンを学習しています。
デザインパターンの多くは、
抽象的な概念を抽象クラスやインタフェースで定義して、
継承や実装により、実クラスで表現する手法を取ります。

デザインパターンを知ると設計の幅が広がるとともに、
ソースコードを読むときの理解の助けにもなると思いました。

例えばiPhoneで使われるviewには、
Observerパターンが使われているものがあります。
Observerパターンを知っていればすぐに理解できますが、
知らないと概念の理解に少し苦しみます。

チームで開発を行う場合でも、
「ここはSingletonパターンを使おう」など、
言語を問わずに共通の概念を共有することができるので、
連携がスムーズにできそうですね。

忙しくなりました。

コロナ禍の影響による案件停滞も落ち着き、反動で急激に忙しくなりました。
手が空いている間に進めていました評価用画像処理ソフトは一旦置いといて、納期がある通常業務の開発を進めています。
なんとか前倒しして、評価用画像処理ソフトの開発を進めたいところです。