アプリからWindows共有フォルダを作成する方法

先日、ある案件でアプリからWindows共有を作成する必要がありました。

調査しました結果、コマンドラインで以下の2つを実行すれば良いことがわかりました。


net share <共有名>=<共有するフォルダのフルパス> /grant:everyone,full
icacls <共有するフォルダのフルパス> /grant everyone:(OI)(CI)F

C#の場合、これをProcessクラスを使用して実行すれば良いだけです。
案外簡単に出来てしまいます。

ただし、管理者権限が必要なので、それだけ注意です。

ChatGPTを使用して自作ソースコードの説明やサンプルコードを作成

今回は、ChatGPTをソフト開発に活用できないかと考えてみました。
例えば、ソースコード一式を与えて、クラスやメソッドの使い方のサンプルを作成してもらうことはできないでしょうか。
また、単体テストも自動作成してもらうことはできないでしょうか。

ChatGPTに以下の質問をしてみました。


以下のC#コードについて、簡単な説明と、サンプルコードを作成してください。

public static Color Blend(this Color color, Color blendColor, double ratio) {
    if (ratio.IsBetween(0.0, 1.0).Not()) throw new FormatException();
    int a, r, g, b;
    a = color.A + ((blendColor.A - color.A).ToDbl() * ratio).ToInt();
    r = color.R + ((blendColor.R - color.R).ToDbl() * ratio).ToInt();
    g = color.G + ((blendColor.G - color.G).ToDbl() * ratio).ToInt();
    b = color.B + ((blendColor.B - color.B).ToDbl() * ratio).ToInt();

    return Color.FromArgb(a, r, g, b);
}

これに対して、以下の回答になりました。


・拡張メソッドとは、既存のクラスに新しいメソッドを追加する機能です。この場合、ColorクラスにBlendメソッドを追加しています。
・Blendメソッドは、引数として、混ぜる色(blendColor)と混ぜる比率(ratio)を受け取ります。
・ratioは0.0から1.0の範囲でなければなりません。そうでない場合は、FormatExceptionをスローします。
・混ぜる色と元の色の各成分(A, R, G, B)について、比率に応じた加重平均を計算します。例えば、R成分の場合は、color.R + ((blendColor.R - color.R).ToDbl() * ratio).ToInt()となります。
・計算した各成分の値を使って、新しいColorオブジェクトを作成して返します。

static void Main(string[] args)
{
    // 色を作成する
    Color red = Color.FromArgb(255, 0, 0);
    Color green = Color.FromArgb(0, 255, 0);
    Color blue = Color.FromArgb(0, 0, 255);

    // 色を混ぜる
    Color purple = red.Blend(blue, 0.5); // 紫色
    Color yellow = red.Blend(green, 0.5); // 黄色
    Color cyan = green.Blend(blue, 0.5); // シアン色

    // 色を表示する
    Console.WriteLine("Red: {0}", red);
    Console.WriteLine("Green: {0}", green);
    Console.WriteLine("Blue: {0}", blue);
    Console.WriteLine("Purple: {0}", purple);
    Console.WriteLine("Yellow: {0}", yellow);
    Console.WriteLine("Cyan: {0}", cyan);
}

完全にメソッドの内容を理解して説明とサンプルコードを作成しています。すばらしいです。
今回はとても単純なメソッドで試しましたので簡単でしたが、実際の業務のコードはこんなに単純ではないのでこんなにうまくは行きません。
しかし、これらのことが実現できれば、開発工数の削減につながりますし、品質も向上する可能性があります。

ChatGPTはまだ研究段階の技術であり、実際にソフト開発に適用するにはさまざまな課題があります。
例えば、ソースコードの構造や文法を正しく理解できるか、サンプルやテストが正確かつ有用か、セキュリティや著作権の問題はないかなどです。
これらの問題を解決するためには、ChatGPTの性能や限界を詳しく調査する必要があります。

弊社では、ChatGPTをソフト開発に応用するための研究を進めております。今後も最新の情報をお届けしていきます。

ChatGPTに自作ソースコードを与えて色々試す

今回もChatGPTの話です。

自分が作成したソースコードをChatGPTに与えてどのようなことが出来るか試しました。
本家ChatGPTとBingChatで試しています。

(1)XMLコメントを作成

質問内容

以下のC#コードのXMLコメントを日本語で作成して

public static Color Blend(this Color color, Color blendColor, double ratio) {
    if (ratio.IsBetween(0.0, 1.0).Not()) throw new FormatException();
    int a, r, g, b;
    a = color.A + ((blendColor.A - color.A).ToDbl() * ratio).ToInt();
    r = color.R + ((blendColor.R - color.R).ToDbl() * ratio).ToInt();
    g = color.G + ((blendColor.G - color.G).ToDbl() * ratio).ToInt();
    b = color.B + ((blendColor.B - color.B).ToDbl() * ratio).ToInt();
    return Color.FromArgb(a, r, g, b);
}

結果 ChatGPT

結果 BingChat

ちゃんとコードを理解してXMLコメントを作成できています。
すばらしいです。

(2)サンプルコードを作成
質問内容

以下のC#のBlendメソッドの使用例を作成して

public static Color Blend(this Color color, Color blendColor, double ratio) {
    if (ratio.IsBetween(0.0, 1.0).Not()) throw new FormatException();
    int a, r, g, b;
    a = color.A + ((blendColor.A - color.A).ToDbl() * ratio).ToInt();
    r = color.R + ((blendColor.R - color.R).ToDbl() * ratio).ToInt();
    g = color.G + ((blendColor.G - color.G).ToDbl() * ratio).ToInt();
    b = color.B + ((blendColor.B - color.B).ToDbl() * ratio).ToInt();
    return Color.FromArgb(a, r, g, b);
}

結果 ChatGPT

結果 BingChat

これも完璧です。

—–

このようなことが出来るのであれば、自力でドキュメントやサンプルコードなどを用意しなくても良くなるので、今よりも開発に専念できます。
とりあえずは、ChatGPTを使用して自動でXMLコメントを挿入するVisualStudioプラグインを作成したいですね。

bingのチャット検索(ChatGPT)

bingのチャット検索(ChatGPT)が流行っているので試してみました。

■C#でSQLiteを使用するコードを依頼
コードだけではなく、必要なライブラリやコネクション文字列の例も教えてくれました。

■上記の質問のあとに、他のコード例を依頼
ちゃんと続きの会話と理解してSQLiteのコード例を教えてくれました。

■上記コードをVB.netに変換
コード変換を行うWEBサイトを使用して変換してくれました。

■結果
今回のチャット内容は簡単なものなので実際にはどれほど役に立つかはまだわかりませんが、ちょっとした調べ物などをお願いして開発の労力を減らせそうに思います。
良い開発パートナーになりそうです。

WPFのBinding時のインテリセンスなど

WPFでBindingを使用した時にインテリセンスで候補は出て来ないし、定義元に移動も出来ないし、使いにくいと思っていたのですが、最近見たサイトでd:DataContextにデータモデルを設定すれば解決することが分かりました。

通常は、WindowタグやUserControlタグにd:DataContextを追加し、データモデルクラスを設定すればOK。
ControlTemplateタグを使用している場合は、その下のコントロールにもd:DataContextしないといけないです。

これにより改善するのは、
・XAMLにインテリセンスで候補が表示されるようになる。
・XAMLから定義元に移動できるようになる。
・定義されていないメンバを使用した場合にXAMLにエラーの赤線が表示される。

これでも改善しないのは、
・C#コードからXAMLのBinding参照先を検索できない。
・定義されていないメンバを使用した場合にコンパイルエラーが発生しない。

改善しない点もあるが、それでも今までより楽になりました。

RSSを自動生成するWEBサービス

私は普段、RSSを使用して情報系サイトの最新記事をチェックしています。

IT関係の多くのサイトはRSSを提供しているので問題ないのですが、一部個人のサイトなどでRSSを提供していなかったりするので、そのようなサイトは長らく自分で巡回していました。
しかし最近、RSSを自動生成するWEBサービスを見つけました。
[Happyou Final Scraper] https://happyou.info/fs/

このWEBサービスでRSS化したいWEBサイトを指定すると、WEBサイトを解析して自動でRSSを生成してくれます。
もちろんWEBサイトが更新されればRSSも再生成されます。
これでRSSを提供していないサイトの更新もRSSリーダで観覧できるようになりました。

近畿のツーリスト会社の予約システムバグ

数日前、近畿のツーリスト会社の予約サイトで旅行予約を行った時に強烈なバグに遭遇しました。
一般ユーザ向けのWEBサービスでバグを見つけたのは初めてです。
バグの内容的に予約を行った一般ユーザ側が損をしたり旅行が残念な結果になる内容でした。

バグ発生の手順は以下の通りの簡単な方法です。
(1) 普通に予約処理を進め、支払い手前の最終確認ページまで進める。
(2) (1)の最終確認ページは置いておいて、ブラウザの別タブを開いて新規に予約処理を再度進め、支払い手前の最終確認ページまで進める。
(3) (1)の最終確認ページで申込みボタンをクリック。
この手順で進めると、(1)の予約ではなく、(2)が予約されてしまいます。
再現テストも2回行い、計3回同じバグが発生したので間違いないです。

たぶん、予約情報がユーザアカウントに紐づいて1つだけサーバに格納されており、(1)の申込みボタンをクリックすると、(2)の予約情報で予約されるのでしょう。

しっかり実装するのであれば、予約情報とユーザアカウントを紐づけではなく、予約情報とユーザアカウント+一時トークンを紐づけですね。

とりあえず暫定で対応するならば、予約情報が変化していたら申込みボタンクリック後にエラー発生ですね。
これで間違った予約はされないですが、ユーザからすると不便なので大きな機会損失になるでしょうね。

今回、全国割の結果が最終確認ページまで進まないと分からないので、同じバグに遭遇している人は多いはず。

よくありそうなバグなので、自分も気をつけなあかんなという思いです。

この内容はすぐにツーリスト会社に連絡し、再現PDFも送付しました。
ツーリスト会社からシステム開発会社に確認依頼中で、まだ結果は出ていないです。
キャンセル料無しで取り消ししてくれるだろうと思っていますが、結果どうなるのかはまた記載します。

[追記]
ツーリスト会社から連絡があり、症状の確認が出来たのでキャンセル料無しで取り消しを行ってもらえるとのことでした。よかった。
予想通り予約情報が上書きされていたとのことでした。
同じバグで被害に合っている人が全員対応してもらえるのだろうか。気になります。
とりあえず解決です。

PowerToysのスクリーンルーラー

PowerToys(マイクロソフト製のWindows便利ユーティリティ)を以前から使用しております。

最近、「スクリーンルーラー」という機能が追加されました。
これがなかなかGUIのデザイン作成時などに役立ちそう。

C#でCPUパフォーマンス解析

作成したアプリの各処理のCPU使用量を知りたい場合、VisualStudioがインストールされている環境ではパフォーマンスプロファイラを使用すれば良いのですが、本番環境の本番運用ではそうはいきません。

というわけで、C#でCPUパフォーマンス解析を行う機能を実装しました。

詳細は記載しませんがざっくり説明すると、ProcessThreadインスタンスのTotalProcessorTimeプロパティでプロセッサを使用した時間の合計値が取得できるので、各処理開始から終了までのTotalProcessorTimeの差を積算していき、
各処理ごとのCPU使用量を集計することで実現できます。

この集計結果を定期的にログファイルに出力しておけば、問題発生時や性能改善時の役立ちそうです。

Windows11の小さいタスクバー

Windows11では残念なことに「小さいタスクバー」表示が設定から出来なくなりました。
ノートPCなどでは限られたデスクトップ領域を広く使用したいので小さくしたいですよね。

レジストリを直接弄れば小さく出来るのですが、日時やアイコンがはみ出ていてブサイクです。

どうにか出来ないかと調べていると、フリーソフトのTClockを使用すると改善できることが分かりました。
助かりました。
※似たソフトにTTClockというものがありますが、これは全く別のソフト。