コンテンツ自動生成プログラム

GWに趣味で、パターン画像を再帰的に描画するプログラムをC#とOpenCVで実装しました。
フラクタル図形描画プログラムのようなものです。
遠出している最中に処理を考え、その日の内に処理の流れだけ実装し、別日に本実装をしたのですが、
すんなり動くものが実装できて良かったです。
素直に書いたら5重ループになったので、計算量削減には若干手間がかかりました。
人力でも作成可能な画像ではあるのですが、
気が遠くなるような時間がかかるところをPC性能や再帰回数次第ですが数分で描画できます。
自分の代わりに何かコンテンツを自動生成してくれるプログラムは、万能感を感じることができるので好きです。

最近はお絵描きAIがどちらかと言えば悪い意味で話題になっていて、
データを学習しない自動生成プログラムまで叩かれるのではないかと少し不安になりますね。
データを学習するしないに関わらず、法的・倫理的に他者の権利を侵害しない範囲で、
自動生成技術が進歩して行くと良いなと思います。

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をソフト開発に応用するための研究を進めております。今後も最新の情報をお届けしていきます。

アミューズメント系のコントローラー

こんにちは mtj です。

アミューズメント系で長らく進化していないものとして コントローラーがあると思います。
特に家庭用の物はファミコンぐらいから同じようにボタンと十字キーではないでしょうか

色々機能がついたりはしていますが何十年経っても基本は同じかと思います。
キーボードで遊んだり コントローラーで遊んだりと行き来はよくしますが
やはりコントローラーのほうが直感で動かしやすいですね よくできていると思います。

次世代のコントローラーが何になるのかは楽しみです。
VR機器ではハンドジェスチャーでの操作が 追加機器なしでできたりします
それも新しいかと言われればそうでもなく XBOXのKinectあたりからある物です。

よく言われるのが脳波のコントローラーですが そこまでくるとアミューズメント系のシステム自体、設備が大きく変化しているような気がしますね

ChatGPTは思考力を奪う?

ChatGPTに質問を入力すると質問の回答を返してくれます。

自分で調べたり考えたりしなくても、ChatGPTが情報や答えを与えてくれるのです。

ChatGPTは人間の思考力を低下させる、という話を聞いたことがありますが、
正直「そんなことはないだろう」と思いました。

ChatGPTはインターネットにあるテキストを学習データとしており、その学習データの内容が常に正しいものであるとは限りません。また、2021年9月までの情報しか学習していないために最新の情報はインプットされていません。
そのため、ChatGPTは間違った情報や古い情報を出力してしまう可能性があります。
本来ならばChatGPTが出力した情報が正しいか、また古い情報でないかは人の手できちんと検証する必要があり、そのような検証を行う習慣を身に付けていれば思考力が衰えることはないだろうと思いますが、ChatGPTが出力した情報を何でもかんでも鵜呑みにしていると思考力が衰えてしまうでしょうね。

ユーザビリティの考慮

自分はまだ仕様の整理やプログラムの設計・実装に精一杯で、
ユーザの使用環境を考慮したソフトの使いやすさに気が回らないことが多いです。

例えば最近の失敗だと、お客様からの要望仕様通りではあるのですが、
作業者にキーボードのない小型タッチパネルPCにて
書類ファイル(Wordなど)の入力・登録を強いるような機能仕様としてしまっていました。

ユーザの使用環境を正しく想定できていれば、そのような作業内容は現実的でないため、
後から別のPCにて入力・登録できるようにするといった改善仕様を考えられたのだと思います。

中々難しいですが、ユーザビリティを考慮したソフトを作るようにしたいです。

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プラグインを作成したいですね。

AIの活用

こんにちは mtj です。

AIの活用についてですが
現在AIは社会の色々な部分に活用されています

普通の人が目にする機会があるとすればエンターテイメント向けが多いでしょうか
最近ではChatGPT等のAIチャットが流行っているかと思います。

AIは正確性があまり必要の無いところで使うとよく言われます。
正確性の高い所で使用する場合は使用者に知識が求められます

プログラムの生成もAIで生成できますが、それの成否、バグの有無、コード使用箇所のリソース等を元に
正しいか判断し使用する必要があります。
上記の通り判断する必要があるのでAIが生成するコードを理解、改造できるぐらいの知識は当たり前に必要になると思います。

仮にそういった判断に疎い人が作成し何かが発生した場合は何も対処ができない、改造、改善もできない可能性がでるかもしれません。
AI絵の問題でもそうですが そういった専門家以外の人、もしくは疎い人がAIを活用し始めるのがちょっと怖くもありますね

スマートフォン依存症

スマートフォンは今の私たちの生活に欠かせないものとなっています。
反面、スマートフォンにはインターネットやゲーム、動画サイト、SNSなどの楽しくて依存しやすいコンテンツがたくさんあり、スマートフォンを長時間使ってしまい、学業や仕事がおろそかになることが起こり得ます。
また、スマートフォンを使うのをなかなかやめられない、
いつもスマートフォンに関することを考えてしまい、つい触ってしまうなど、「スマホ依存」の状態になることも起こり得ます。[1]
今や誰もが当たり前のようにスマートフォンを持つ時代であり、スマホ依存症は誰にでも起こり得るものなので、十分注意していきたいものですね。
私もついついスマホを触りすぎてしまうので気をつけたいものです。

[1]「大森病院 メンタルヘルスセンター(イルボスコ) スマホ依存について」https://www.lab.toho-.ac.jp/med/omori/mentalhealth/mental/smartphone_dependence/index.html 

設計の重要性

最近ソフトウェアのある1機能の開発を行ったのですが、想定よりも工数が多くかかってしまいました。
工数がオーバーした原因を考えると、
全体の設計がぼんやりとした甘い状態からコードを書き始めてしまったために、
実装時の迷いや構造の見直しによる手戻りが生じたりしてしまったからではないかと思われます。

プログラムもそれ以外のものでも、
何かを作る際に全体が曖昧なまま個々の詳細から作り込むと、
最終的にそれらを整合性を保ちながら結合させるのは難しく、
結果として辻褄を合わせるはめになり、時間がかかったり構造が歪になってしまう気がしています。

そうならないためにも、全体を曖昧に設計した後、
まずは徐々に全体設計の詳細を詰めて行き(抽象度を下げて行き)、
中盤以降に詳細を作り込み始める(プログラムだとコードを書き始める)のが良いのだと思います。

今回の場合だと、設計は処理の流れと曖昧なクラス設計のみだったのですが、
社内メンバーからの助言を盛り込むと、
データの流れも考えた上で、クラス設計の最低限上位の部分まではしっかり設計してから、
コードを書き始めるべきだったのかと思います。

手を動かさないと何も進めていないように感じたり思われたりするかもしれませんが、
その時間をかけることで結果的に工数を削減できるのではないかと思われるので、
時間に上限は設けた上でしっかり設計を行うようにしたいです。

bingのチャット検索(ChatGPT)

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

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

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

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

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