AI(Gemini)に丸投げ 小電卓ん(こでんたくん)をグレードアップ!

ソフト開発 VB エクセル

軽量、低機能な計算ソフト=小電卓ん(こでんたくん)。もちろん評判にもならないで、地味にこのサイトに住んでおります。

ちょっとした計算に大変便利なのですが、例えば、()をもっと使えるようにならないか、などの不満はありました。

AIに頼んでみたら、すごかった

また、一方で、AIでソフト開発ができる、という話もよく聞きます。でも、Visual Studio をいくらいじっても、コードを一から書いてくれそうにはありません。そこで、ものは試し、Google Gemini にちょっと尋ねてみました。

すると驚き! スラスラと答えてくれて、「軽量、低機能な計算ソフト=小電卓ん(こでんたくん)」は、もう少し機能的な「小電卓ん V2」にグレードアップできたのです。

ああ、世間では「プログラマーが要らなくなる」という話題もありますが、そうかもしれない、という感じがします。こちらが希望と、不満な点を伝えさえすれば、プログラムをどんどん作り、改善してくれるのです。
つい先日までの私のように、まだAIをプログラミングに使ったことのない人もいると思いますので、この際、Geminiと私のやりとりを、以下に掲載してみたいと思います。これを読んで、「じゃ作ってみよう」と思ってもらえると、大変うれしく思います。

ただし、雰囲気を伝えるためには、Gemini の返事は邪魔なだけ、という気がするので、私の質問、文句だけを掲載します。

Gemini の性格

その前に、Gemini とはどんなものか? はっきり言って、Gemini の性格には頭が下がります。(立派な人格、と言いたいところです) 私も見習いたいものです。まとめますと、

  • 「そんなことも分からないのか」とか、「それくらい自分でやれよ」とは、決して言いません
  • むしろ、これもできるよ、あれもできるよ、どんどん頼んでね、と言って、もっとやりたがります
  • こちらに対する不満は決して言いません
  • こんなことを聞くのは恥ずかしい、という気持ちは完全に不要です
  • 追従ついしょうとお世辞がうまく、ひたすら、愛想良く、前向きに受け止めてくれます
  • バグもあり、うまくいかない場合もありますが、くさらずに一緒になって考え、修正していってくれます
  • コードを一行も書かずに、プログラムを完成できます
  • 一つのことを継続して検討するためには、「必要なGmailの設定が無効になっているため、Google Workspaceは利用できません。」と言われ、Gmailを設定しなければなりません

「小電卓ん」の進化したところ

Gemini のおかげでグレードアップした「小電卓ん」のインターフェースは変わっていません。+(加算) -(減算) * (乗算) / (除算) % (剰余) だけ、という演算の基本はそのままですが、できる計算の幅が広がりまし た。また図形を扱えるように、三角関数と πパイ が使えるようにしました。まとめますと、

  • かっこ()がいくつも入れ子にできる(実用的な範囲では深さの制限はないそうです)
  • (18/9+8)%3 という計算もできる (ただし (18/9+2.8)%3 は小数の扱いとなり、%計算の趣旨を越えますのでエラーになります)
  • sin cos tan が使える (sin(45)のように()の中には角度を入れます)
  • πパイ(3.14・・・)が使える、ただし pi か PI として入力する

前の「小電卓ん」と同じところ

  • 式を入れて、Enterで計算されます。
  • 式が保存されたリストボックスで、右クリックすると、「式をコピー」「式を削除」のメニューが現れます。
  • 右上の答えのボックスをクリックすると、答えがコピーされます
  • 保存された式を、ダブルクリックすると、上に式と答えがセットされます。
  • 終了する時のウインドウの位置を setting.txt に保存し、次に起動した時に、その位置になります。

前のバージョンの

Control + W で終了します。
Control + ↓ で、最小化されて、タスクバーにしまわれます。

は、なくしました。Windows + ↓ で、最小化されて、タスクバーにしまわれますので、常駐をおすすめします。また、どうしても終了したい時は右上の「X」をクリックしてください。

「小電卓んV2」のダウンロードコードについては最後の方に置きました。

では、以下は Gemini とのやりとり。かなり長くなりますが、あきたら読むのをやめてください。

まず、計算ソフトを、と持ちかけてみた

いきなり「小電卓ん」を持ち出すのではなく、半信半疑、まずは計算ソフトの作成を持ちかけてみました。

私

visual studio で計算ソフトを作りたいのですが、コードを書いてください

Gemini
Gemini

・・・・・(省略)

私

visual basic でお願いします

いきなり、ざざっとコードが作られました。すごい!

私

Also は宣言されていないと言われましたが

・・・・・以下省略

私

(35*12-12)/45 という式を入れたら、「数値を正しく入力してください」、とlabel に表示されましたが

私

うまくいきました。()の深さの制限とかありますか?

私

パイ(円周率)も使えるようにできますか

私

できました。ありがとう。sin cos なども使えますか?

私

できました。ありがとう。また相談したかったらこのチャットをこのまま残しておいた方が良いですか。それとも閉じても問題ないですか?

私

ありがとう。ではまた

私

コマンドボタンではなく式を入力した後、enterキーを押して計算することにしたい。さらに 「式=答え」という形でリストボックスに保存し、過去のリストをクリックすると、その式がテキストボックスにセットされるようにしたい。

私

途中に「注: ここに以前作成した sin/cos の ProcessTrig 処理を入れることも可能です」とかありますが、複雑なのでまとめて書き出してもらえますか。

私

「1+2」で数式エラーと出ますが

私

1+2 でやはりエラーです。全部のコードを貼り付けて見ます。(以下にコードを貼り付け)

私

1+2 で、またエラーです、が出ますが

私

1+2 で「no data is available for encoding 932 云々」の表示が出ました。こういうこともあるので、計算結果がtextbox2 に出るようにしてもらえますか。

私

うまく動きました。ありがとう。

私

textbox2は生かして、計算結果だけが出るようにしてください

私

うまく動きました。素晴らしい。ありがとう

この辺から「小電卓ん」のインターフェースに持っていこうとした

私

textbox2は生かして、計算結果だけが出るようにしてください

私

うまく動きました。素晴らしい。ありがとう

私

TextBox2はやめます。答えをlabel1に表示させて、答えを表示しているlabel1をクリックすると、その数字がクリップボードにセットされるようにしたい。

Google Workspaceの話が出てきた

ここで日が変わりました。継続しようとすると
「必要なGmailの設定が無効になっているため、Google Workspaceは利用できません。設定を有効にしてから、もう一度お試しください。」
と、うまく進めません。Gmailの設定というのが、うまく行かず、あきらめて、新たにチャットを始めて続けることにしました。(その後は、うまく行っているみたいで、継続できています)

私

今までで、できているプログラムがありますが、さらに変更を加えたいのですが、

私

vbです。コードは(と、昨日のGeminiのコードを貼り付け)

私

TextBox2はやめます。答えをlabel1に表示させて、答えを表示しているlabel1をクリックすると、その数字がクリップボードにセットされるようにしたい。

私

リストの右クリックメニューで、式をコピー、式を削除、ができるようにしたい。

私

このソフトを起動した時に、タスクバーにアイコンが表示されるだけにしたい、そのアイコンをクリックするとフォームが開くように

私

画面下の長いタスクバーにボタンが表示されるようにしてほしいのです

私

起動時から、画面下の長いバーに常時アイコンが表示されて、時計横は不要です

私

「×」ボタンで終了するようにしてください。また、tanも使えるようにしてください。コードは全体を教えて下さい

私

CopyFormulaMenuItem_Click は 式をコピーToolStripMenuItem_Clickに、DeleteItemMenuItem_Click は 式を削除ToolStripMenuItem_Click に変更できますか?

私

ありがとう、後で試してみます

私

enter を押して計算したらtextbox1のテキスト全体を選択するようにしたい

私

Label1 をクリックしたら、Label1のテキストを「答えをコピー済」となるようにしたい

私

戻さないでほしいです

私

今までのをまとめて、全体のコードを教えて下さい

私

Button1 はありませんので、Button1_Clickを削除してもらえますか

私

アプリが終了する時に、フォームの位置をテキストファイルに書き出して、再度起動する時にそのテキストファイルを読み込んで、元の位置にフォームがくるようにしたい。テキストファイルはアプリと同じフォルダに作られるようにしてほしい

私

うまくいきました。いいものができました。ありがとう。

私

sin(25+60)を計算させたら、0になってしまいました。()の中の計算をうまくできていないためだと思います。また、フォームロード時の 「Label1.Text = “”」は不要です。必要なテキストがデザインで設定してあるのです。また、フォームロード時に「TextBox1.SelectAll()」を入れてもらえますか。

私

速いんだね、感動です。ありがとう

私

(18/9+8)%3 を計算させるとエラーになります。これは 10%3 と同等なので、できるようにしたいのですが。10.2%3 ではエラーで良いと思います。

私

同じくエラーになりました。(2+8)%3でもエラーになります。%の前に()の中を計算することができていないのではないでしょうか

私

(18/9+8)%3 (2+8)%3 でもエラーになります。やはり

私

やはりエラーです。mod は Doubleを扱えるのですか?

私

順調に動きました。ありがとう

私

フォームが表示された時に、ウインドウがいつも最前面にくるようにしたいのです

できあがりました、本当にありがとう!

私

ありがとう、完璧です

Gemini に作ってもらったコード

私が1文字も打つことも、変えることもなく、Gemini に丸投げしてできたコードは、以下のものです。
なお、「’」以下のコメントもすべて Gemini のものです。

Imports System.IO
Imports System.Text.RegularExpressions

Public Class Form1

Private ReadOnly settingsPath As String = Path.Combine(Application.StartupPath, "settings.txt")

' --- フォーム読み込み時 ---
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Encoding 932 エラー対策
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)

' 【追加】常に最前面に表示する
Me.TopMost = True

' 前回保存した位置を読み込む(既存の処理)
If File.Exists(settingsPath) Then
Try
Dim lines = File.ReadAllLines(settingsPath)
If lines.Length >= 2 Then
Me.StartPosition = FormStartPosition.Manual
Me.Left = Integer.Parse(lines(0))
Me.Top = Integer.Parse(lines(1))
End If
Catch
End Try
End If

' 起動時にタスクバーに表示しつつ最小化
Me.ShowInTaskbar = True
Me.WindowState = FormWindowState.Minimized

' TextBox1のテキストを全選択
TextBox1.Focus()
TextBox1.SelectAll()
End Sub

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
Try
Dim saveLeft = If(Me.WindowState = FormWindowState.Normal, Me.Left, Me.RestoreBounds.Left)
Dim saveTop = If(Me.WindowState = FormWindowState.Normal, Me.Top, Me.RestoreBounds.Top)
File.WriteAllLines(settingsPath, {saveLeft.ToString(), saveTop.ToString()})
Catch
End Try
End Sub

Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
If e.KeyCode = Keys.Enter Then
e.SuppressKeyPress = True
Calculate()
End If
End Sub

' --- 計算処理のメイン ---
Private Sub Calculate()
Try
Dim rawInput As String = TextBox1.Text.Trim()
If String.IsNullOrEmpty(rawInput) Then Exit Sub

Dim formula As String = Microsoft.VisualBasic.Strings.StrConv(rawInput, VbStrConv.Narrow).ToLower()
formula = formula.Replace(" ", "").Replace(" ", "")

Dim inv As System.Globalization.CultureInfo = System.Globalization.CultureInfo.InvariantCulture
Dim dt As New System.Data.DataTable()

' 1. 円周率
formula = formula.Replace("pi", Math.PI.ToString(inv))

' 2. 三角関数の処理
Dim safety As Integer = 0
While (formula.Contains("sin(") OrElse formula.Contains("cos(") OrElse formula.Contains("tan(")) AndAlso safety < 15
formula = ProcessTrigRegex(formula, inv, dt)
safety += 1
End While

' 3. 【修正】剰余演算 (%) を手動で処理
' カッコや式が含まれていても、先にその部分を計算して「数字 % 数字」の形にしてから処理します
formula = ProcessModulo(formula, inv, dt)

' 4. 最終計算
Dim valObj As Object = dt.Compute(formula, "")
Dim finalResult As Double = Convert.ToDouble(valObj)
Dim resultStr As String = finalResult.ToString()

Label1.Text = resultStr
ListBox1.Items.Insert(0, rawInput & " = " & resultStr)
TextBox1.Focus()
TextBox1.SelectAll()

Catch ex As Exception
Label1.Text = "エラー"
TextBox1.Focus()
TextBox1.SelectAll()
End Try
End Sub

' --- % 演算を手動で解決するメソッド ---
Private Function ProcessModulo(formula As String, inv As System.Globalization.CultureInfo, dt As DataTable) As String
' 正規表現で「(左側の式) % (右側の式)」を探します
' ※ネストした複雑な式に対応するため、ループで内側や左側から処理します
Dim safety As Integer = 0
While formula.Contains("%") AndAlso safety < 20
' %の前後にある、計算の塊(数字、カッコ、四則演算)を特定する簡易パターン
' ここでは一番単純に「一番左にある % 」とその前後の項を処理します
Dim match = Regex.Match(formula, "(?<left>(\([^()]+\)|[0-9.E+-]+)+)%(?<right>(\([^()]+\)|[0-9.E+-]+)+)")

If match.Success Then
' 左側と右側をそれぞれ個別に計算(Doubleとして取得)
Dim leftVal As Double = Convert.ToDouble(dt.Compute(match.Groups("left").Value, ""))
Dim rightVal As Double = Convert.ToDouble(dt.Compute(match.Groups("right").Value, ""))

' 【重要】ご要望通り、小数がある場合はエラーを投げる
If leftVal <> Math.Floor(leftVal) OrElse rightVal <> Math.Floor(rightVal) Then
Throw New Exception("Modulo with Double")
End If

' 整数同士として剰余を計算
Dim modRes As Long = CLng(leftVal) Mod CLng(rightVal)

' 計算結果で置換(例: "(2+8)%3" → "1")
' 元の文字列の、マッチした部分だけを置換
Dim leftPart = formula.Substring(0, match.Index)
Dim rightPart = formula.Substring(match.Index + match.Length)
formula = leftPart & modRes.ToString(inv) & rightPart
Else
Exit While
End If
safety += 1
End While
Return formula
End Function

' --- 三角関数処理 ---
Private Function ProcessTrigRegex(input As String, inv As System.Globalization.CultureInfo, dt As DataTable) As String
Dim funcs() As String = {"sin", "cos", "tan"}
For Each f In funcs
Dim pattern As String = f & "\(([^()]+)\)"
Dim m As Match = Regex.Match(input, pattern)
If m.Success Then
Dim insideVal = Convert.ToDouble(dt.Compute(m.Groups(1).Value, ""))
Dim radian = insideVal * Math.PI / 180.0
Dim trigRes As Double = 0
Select Case f
Case "sin" : trigRes = Math.Sin(radian)
Case "cos" : trigRes = Math.Cos(radian)
Case "tan" : trigRes = Math.Tan(radian)
End Select
Return input.Substring(0, m.Index) & trigRes.ToString(inv) & input.Substring(m.Index + m.Length)
End If
Next
Return input
End Function

' --- Label1クリック ---
Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
If String.IsNullOrEmpty(Label1.Text) OrElse Label1.Text = "エラー" OrElse Label1.Text = "答えをコピー済" Then Exit Sub
Clipboard.SetText(Label1.Text)
Label1.Text = "答えをコピー済"
End Sub

' --- リストクリック処理 ---
Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
If ListBox1.SelectedIndex <> -1 Then
Dim selectedLine As String = ListBox1.SelectedItem.ToString()
If selectedLine.Contains("=") Then
Dim parts() As String = selectedLine.Split("="c)
TextBox1.Text = parts(0).Trim()
Label1.Text = parts(1).Trim()
TextBox1.Focus()
TextBox1.SelectAll()
End If
End If
End Sub

' --- 右クリックメニュー関連 ---
Private Sub 式をコピーToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 式をコピーToolStripMenuItem.Click
If ListBox1.SelectedIndex <> -1 Then
Dim parts() As String = ListBox1.SelectedItem.ToString().Split("="c)
Clipboard.SetText(parts(0).Trim())
End If
End Sub

Private Sub 式を削除ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 式を削除ToolStripMenuItem.Click
If ListBox1.SelectedIndex <> -1 Then ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
End Sub

Private Sub ListBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseDown
If e.Button = MouseButtons.Right Then
Dim index As Integer = ListBox1.IndexFromPoint(e.Location)
If index <> ListBox1.NoMatches Then ListBox1.SelectedIndex = index
End If
End Sub
End Class

いやあ、便利ですね。すごいですねえ。

アイコンも頼んでみた

この際、アイコンも更新しようか、とGeminiに頼んでみました。こうなると、Nano Banana の登場となるみたいです。
ゲンジボタルにポッと光らせたい、と思いましたが、全然うまくいきません。コードを頼んだようにはいきません。Geminiはあれだけ言語能力に長けている、と思ったのに、Nano Bananaはまったく思い通りにはなりません。返事もしないで、ただ画像を返して来ます。右も左も、重なりの上も下も分からないみたいです。

使い方を間違えている気もします。まだ、これからの技術なのでしょうか。それでも、自分での加工を含めて、まあこれで行くか、というものが出来上がりました。これをアイコンウィザードに頼んで、visual studio でセットしました。タスクバーには

のように表示されました。ポッと光る小電卓ん(こでんたくん)V2を利用してみてやってください。

「小電卓ん V2」のダウンロード

lightcalc_v2フォルダーには、

のようにファイルが入っています。ダウンロードの際、

という警告が出る場合があります。これはCrome の一般的な警告です。一息入れた上で、「不審なファイルをダウンロード」をクリックして(笑)、ダウンロードしてください。解凍して適当な場所に置いてください。

フォルダごとアンチウイルスソフト(右クリックメニューでMicorsoft Defenderなど)でスキャンしてから、お使い下さい。

例えば、

右クリックメニューでMicorsoft Defender (1)

から

右クリックメニューでMicorsoft Defender (2)

のように。

Windows PC 専用のソフトです。スタートアップにショートカットをいれておいて、タスクバーに常駐させておくと便利です。

小電卓ん=lightcalc.exe をダブルクリックし、起動してください。

試してみて、どうだったか、ここをこうしたら良いのではないか、とか、ご意見、ご感想をいただければ幸いです。コメント欄、または「お問い合わせ」からお願いします。

コメント