2018年11月10日土曜日

paiza のスキルチェックをやってみました

いまさら感はありますが、paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。

どうやら時間が短いほど高い評価を得られるようです。普段の業務では保守性や可読性を重視している私としてはジレンマを感じつつも、それでもオブジェクト指向ぽく実装したり、異常系処理を入れたりしているうちに、平均クリア時間を超えていたりします。

他の人が書いたコードを見ることはできないようなのですが、クリア済の問題だけでも見れればいいのにと思います。同じ要件に対して複数の人がコードを書くのは普段の業務ではないことですから。

このブログへは久しぶりの投稿となりました。最近は Qiita へ投稿しています。gRPC にも引き続き取り組んでいますので、よろしければそちらもご覧ください。

2018年8月14日火曜日

C# ETW(Event Tracing for Windows)からログを取得する

ETW (Event Tracing for Windows) は Windows OS のイベントトレースの仕組みです。ETW を使用するとログの出力とログの記録を分離することができ、アプリケーションのパフォーマンス向上などのメリットがあります。ETW からログを取得してみます。


C# ETW(Event Tracing for Windows)へログを出力する


ETW (Event Tracing for Windows) は Windows OS のイベントトレースの仕組みです。ETW を使用するとログの出力とログの記録を分離することができ、アプリケーションのパフォーマンス向上などのメリットがあります。C# アプリケーションから ETW へログを出力してみます。


2018年8月5日日曜日

gRPC 1.14.0 リリース C# インターセプター正式機能へ

gRPC 1.14.0 がリリースされ、C# ではインターセプターが「実験的」機能から正式機能の位置づけに変更されました。


2018年7月22日日曜日

DataReader で null 値を扱いやすくする


ADO.NET の DataReader でフィールドの値を取得するとき、null 値かどうかを考慮する必要があります。
// nullの場合は例外が発生する
int value = reader.GetInt32(0);

// IsDBNullメソッドで判断してから値を取得する
if (!reader.IsDBNull(0))
{
    int value = reader.GetInt32(0);
}

.NET Framework の初期バージョンでは nullable 構造体はありませんでしたので、DataReader には nullable 構造体を用いたメソッドはありません。その後のバージョンアップでもそのような機能は追加されていません。そのため、私は次のような拡張メソッドを定義しています。
public static int? GetInt32OrNull(this IDataRecord record, int index)
{
    if (record.IsDBNull(index)) { return null; }
    return record.GetInt32(index);
}

public static int GetInt32OrDefault(this IDataRecord record, int index)
{
    if (record.IsDBNull(index)) { return 0; }
    return record.GetInt32(index);
}

これらの拡張メソッドを用いると、フィールドの値の取得を簡潔かつタイプセーフに実装できます。
// nullable構造体で受け取る
int? value = reader.GetInt32OrNull(0);

// nullの場合には0が格納される
int value = reader.GetInt32OrDefault(0);


拡張メソッドでなくユーティリティメソッドにする場合は次のようにします。
public static class DataRecordUtility
{
    public static int? GetInt32OrNull(IDataRecord record, int index)
    {
        if (record.IsDBNull(index)) { return null; }
        return record.GetInt32(index);
    }

    public static int GetInt32OrDefault(IDataRecord record, int index)
    {
        if (record.IsDBNull(index)) { return 0; }
        return record.GetInt32(index);
    }
}

// nullable構造体で受け取る
int? value = DataRecordUtility.GetInt32OrNull(reader, 0);

// nullの場合には0が格納される
int value = DataRecordUtility.GetInt32OrDefault(reader, 0);


なぜ今更このような記事を書いたかというと、今でも nullable 構造体が活用されていないソースコードを見かけることが少なくないためです。 .NET Framework 1 時代やそれよりも前(VisualBasic)のソースコードを流用した開発が繰り返され、その間に積極的な改善や工夫が行われないまま今に至っていることが原因にあると考えています。 そのようなソースコードでは null の可能性がある数値や日付を object 型や string 型で表しており、それによって型変換エラーやパフォーマンスの劣化を引き起こしていたりします。

List<T> などのジェネリックコレクションではなく ArrayList が使われ続けていたりするのも同じような原因だと思います。この記事を見て思い当たる節があるプログラマーの方は少し視野を拡げてみてください。その分のリターンは十分に得られると思います。

2018年7月16日月曜日

今一度 ADO.NET について考えてみる

.NET のデータアクセス API である ADO.NET について、私が普段考えていること実施していることをまとめてみます。


2018年5月19日土曜日

gRPC (C#) に追加されたインターセプターの使用方法

「試験的」と銘打たれてはいますが、gRPC C# 1.10 でインターセプターが追加されました。どのように使うのかを確認してみました。

paiza のスキルチェックをやってみました

いまさら感はありますが、 paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。 どうやら時間が短いほど高い評価を得...