UWSC用のコード生成AIを実現してみる

# はじめに
下記の質問があったので、挑戦してみました。
>UWSC用のプログラム生成ＡＩを探しているのですが、
>良いものがありましたら教えてもらえませんでしょうか？
[UWSC 仮 掲示板](https://www3.rocketbbs.com/601/siromasa.html)

自然言語を入力することでUWSCのコードを生成して欲しいわけですよね。
今回、プログラム生成AIを実現するのに使用するのは、今話題の`claude 3`となります。

## UWSC とは
UWSC（作者うみうみ）は、Windowsのマウスとキーボードの操作をスクリプト形式で記録し、再生することができるフリーソフトウェアです。RPAの先駆け的ソフトウェアですね。

[uwscの作者umiumiさんの消息は？](http://itot.blog.jp/archives/21432032.html) によれば既にうみうみさんは逝去されているようです。

UWSCの後継としてRust製のUWSCRが stuncloud さんにより開発されています。

https://qiita.com/advent-calendar/2023/uwscr

## claude 3 とは
claude 3(クロード・スリー)は、Anthropic社が開発し、2024年3月4日にリリースされた大規模な言語モデルファミリーで、OpenAI社のGPT-4に比肩すると言われています。

https://edgehub.jp/wordgenerationai/howclaude3.html

無料版の「Sonnet」でも、長文テキストやpdfをペーストで読ませることが出来ます。

# 準備
`claude 3`の導入方法は前述したリンク先で自分は行いました。`claude 3`が既に使用できる状態を前提とします。

準備を何もしないままだと、`claude 3`を「UWSCとは、ユニヴァーサル・ウェブ・サイエンス・コンピューターの略称だと思われます。」と認識しています。

## 注意点
あまり、やり過ぎると無料の制限を超えてしまいます。
![スクリーンショット 2024-03-30 17.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/020fb177-2d41-4bc6-8ba5-446119fa8ae7.png)

:::note info
1日に送信できるメッセージ数に具体的な上限が設けられていますが、残念ながらその正確な数値は公開されていないようです。
:::

## チャット履歴の削除
Claudeのチャット履歴を削除するには、個別チャットを表示して上部にあるチャットタイトル部分をクリックして表示されるメニューから「Delete」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/c8010ad9-93e0-1c27-714f-668f833418dc.png)

# 実施
下記２パターンでやってみました。

* 長文テキスト ・・・ 基本構文のみの読み込み
* PDF ・・・ 基本構文 と 各関数の読み込み

## 長文テキスト版
下記サイトの基本構文から最後の方までテキスト選択してコピーします。

https://bgt-48.blogspot.com/2020/09/uwsc.html

`claude 3`にて、ペーストした後に、下記のプロンプトを入力します。
```
UWSCでフィボナッチ数列のスクリプトを作成してください。
```
![スクリーンショット 2024-03-26 21.32.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/261efc5c-73eb-184f-d647-b4a0252e8f70.png)

実はこのままでは動作しません、この後に2つのプロンプトを入力しました。
```
ソースコードにコメントを追加してください。
関数は一番最後に記述してください。
```

```text:最終結果
// フィボナッチ数列を出力する値を10に設定
DIM n = 10

// 0 から n までの範囲でループ
FOR i = 0 TO n
   // i番目のフィボナッチ数を計算し、出力
   PRINT "Fibonacci(" + i + ") = " + fibonacciSeries(i)
NEXT

// フィボナッチ数列のn番目の値を計算する関数
FUNCTION fibonacciSeries(n)
   // 基底ケース: n が 0 または 1 の場合、n をそのまま返す
   IF n <= 1 THEN
       RESULT = n
   ELSE
       // n-1 番目とn-2番目のフィボナッチ数の和をnの値として返す
       RESULT = fibonacciSeries(n-1) + fibonacciSeries(n-2)
   ENDIF
FEND

```

動作しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/abe9f098-6eb7-2983-2ddb-09ce14262e1b.png)

※`UWSC`の後継である`UWSCR`では、関数が先頭に定義されていても動作しました。

:::note warn
記事を書くためにトライアンドエラーをしているため、学習したことで最初から上記のように出来ないかも知れません。初期の頃は、Visual Basicに記法が似ているため、コメントがシングルクォーテーションだったり、文字列結合が & になっていたりしました。
:::

## pdf版
基本構文以外のコマンドなども追加したいと思った時、ネット情報からの切り貼りが面倒です。何かいい方法がないかと思案したところ、UWSCのマニュアルファイル　`uwsc.chm`がありました。これを`pdf`に変換すればいい。早速、下記オンラインサイトで`chm`ファイルから`pdf`ファイルに変換できました。

https://topdf.com/ja/chm-to-pdf

これを、`claude 3`にペーストしたところ、多過ぎるとエラーになりました。128ページあるため、削る必要があります。下記オンラインサイトで`pdf`のページを削除することが出来ます。

https://smallpdf.com/jp/delete-pages-from-pdf#r=organize-remove

11ページ目の「スクリプトについて」からは必要なので、1〜10ページは削除しました。後半の102ページ以降も削除しました。他にも適当に不要そうなのを削除し最終的に50ページまで削りました。
もしかしたら、サンプルソースを残した方がいい結果をもたらすかも知れませんね。

`claude 3`にて、`pdf`ファイルをペーストした後に、下記のプロンプトを入力します。

```
UWSCでフィボナッチ数列のスクリプトを作成し、メモ帳に答えを出力してください。
```
![スクリーンショット 2024-03-30 11.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/22108294-c5fa-8793-c6f9-723c92fe3368.png)

このままでは動作しませんので、この後にプロンプトを入力しました。
```
文字列結合を & を + に変更してください。
関数は一番最後に記述してください。
```

```text:変更結果
// メモ帳に出力するためのウィンドウIDを取得
notepadID = GETID("無題 - メモ帳")

// フィボナッチ数列の20項目までを計算して出力
FOR i = 0 TO 20
  fibNum = FIB(i)
  SENDSTR(notepadID, fibNum + "<#CR>")
NEXT

// フィボナッチ数列を計算する関数
FUNCTION FIB(n)
  IF n <= 1 THEN
    RESULT = n
  ELSE
    RESULT = FIB(n-1) + FIB(n-2)
  ENDIF
FEND
```

メモ帳を起動してから`UWSC`で動かしてみたのですが、このままでは動きませんでした。
`Windows 11`によるメモ帳アプリの変更で、GETID("無題 - メモ帳")では取得できないためです、そこはGETID("メモ帳") にすることで動作しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/82f19b2a-2276-fd62-d891-1503797753f0.png)

改行コード "<#CR>" を指定しているのに改行されないのは、メモ帳アプリの変更による影響と思われます。

```
SENDSTRは最後の答えのみ必要です、ループの外にしてください。
```
```text:変更結果
// 配列を初期化
DIM fibArray[21]

// フィボナッチ数列の20項目までを計算して配列に格納
FOR i = 0 TO 20
  fibArray[i] = FIB(i)
NEXT

// メモ帳に出力するためのウィンドウIDを取得
notepadID = GETID("無題 - メモ帳")

// 配列の値を結合して一度にメモ帳に出力
SENDSTR(notepadID, JOIN(fibArray, ","))

// フィボナッチ数列を計算する関数
FUNCTION FIB(n)
  IF n <= 1 THEN
    RESULT = n
  ELSE
    RESULT = FIB(n-1) + FIB(n-2)
  ENDIF
FEND
```

先程と同様にGETID("メモ帳")のみ書き換えて、UWSCで動かしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/441ff0fd-b969-0d9e-c8d3-a809cb6736df.png)

最後にカンマが1個多いのは、配列の定義 fibArray[21] が1つ多いからですね。
やはり、VBの影響が大きい。

これを`UWSC`の後継である`UWSCR`で動かしてみたのですが、`SENDSTR`が機能しないので`KBD`に変更しました。
```
// SENDSTR(notepadID, JOIN(fibArray, ","))
KBD(JOIN(fibArray, ","))
```

`UWSCR`で、`Windows 11`のメモ帳アプリによる`SENDSTR`が機能しない件については、`Discord`にて作者に報告済みです。

UWSCR Ver.0.16.0 の段階では下記方法なら出力されました。

```
CTRLWIN(notepadID , ACTIVATE)
SENDSTR(notepadID, JOIN(fibArray, ","), 0, 0, 1) // ACC指定だと入力される
```

# 最後に
コード生成AIはメジャーなプログラム言語ならそのまま使用できますが、UWSCのように世界的にはマイナーなスクリプト言語は、基本構文を読ませてコード生成すれば、それなり近い状態で書き換えてくれます。
流石に完璧なコードは生成してくれないものの、各関数とか覚えなくても自然言語で近いものを生成してくれればアシスト的な使い方としては有効です。