• ビット文学

現在のWindows 11 Ver.23H2では、Windows Copilotと呼ばれるAI機能が利用できる。適当な質問文を入れることで、Copilotが回答してくれる。回答には少し時間がかかるが、Windows 11を使っているならタダでAIが利用できる。

筆者は、自分の仕事をAIに任せたいとは思っていない。というのも、AIに仕事をやらせてみたとしても、その責任を持つのは自分なので、結局、全部を検証しなくてはならない。遠い未来、検証が不要な生成AIも登場するかもしれないが、おそらく筆者は仕事していないだろうから、いまからAIに仕事をさせるような準備も不用である。

しかし、実際に使ってみると便利な点もある。たとえば、インターネット検索の代用として利用できる。インターネット検索を直接行うのと比べて、ノイズが少ないというのが筆者の印象である。

たとえば、特定の言語でのループや条件判断についての質問「××のループ構文」などでインターネット検索を行うと、初心者向けの長い解説記事などが先頭に多数列挙される。筆者などは、単刀直入に文法だけを知りたいのだが、先頭に表示されるページの多くは冗長で、肝腎のところにいくまでに何回もスクロールが必要になる。筆者としては、たとえばPythonがちょっと不慣れなので、ループ構文を全部知りたいのだが、そもそもループとは? から始まり、延々とfor文を解説しているページには用がない。また、言語の公式マニュアルページなどは、逆に整理されすぎていて、forやWhileといった個々のステートメントのページに分かれているなど、一覧性に欠けることがある。

こうしたとき、Copilotだと、複数のページから要約した回答を出してくれる。これで、趣味の楽しい時間なのに、インターネット検索して、「あー、こんなページ見たくもねぇよ」なんてイライラせずに済む。

もう1つは、面倒な関数やAPIの使い方を調べる場合だ。C#から、Win32APIを呼び出すのには、P/Invokeと呼ばれるものを使う。Win32APIの関数がどのDLLにあり、引数はどうなっているのかを記述することで、.NET環境(マネージ環境と呼ばれる)からWin32API(同アンマネージ環境)の関数を呼び出せる。そもそも、Win32APIは、C/C++からの呼び出しを想定しており、.NET環境とはメモリの使い方も関数の呼び出し方法も異なる。C/C++からなら複雑な構造体でも宣言するだけで済む。しかし、メモリが管理されているC#では簡単ではないことがある。有名な関数なら、インターネット検索でも簡単に調べることができるのだが、著名でない関数を使おうとすると、かなり面倒なことになることがある。

こうしたものにHidP_GetButtonCaps関数HIDP_BUTTON_CAPS構造体がある。なぜ、これが面倒なのかというと、構造体の中にunion(共用体)があり、構造体の中の値を使って、共用体のどちらを使っているのかを切り替えて扱う必要がある。これをP/Invokeで直接表現することは難しく、インターネット検索すると、アンマネージメモリ領域を確保して渡す、構造体の要素の個々にオフセット値を設定するなどの方法しか見つけることができなかった。しかも、どれもうまくいかなくて、筆者は、苦労した上で、共用体の要素の名前が違うだけで要素のタイプはまったく同じことに気がついた。何のことはない、共用体を使わなくてもいいのである。

試しにCopilotに「Win32APIのHidP_GetButtonCapsをC#から呼び出すにはどうしたらいいですか」という質問をしたら、あっさりと共用体を使わない構造体定義を使う方法を提案してきた(写真01)。筆者は、この方法をインターネット検索では見つけることができず、試行錯誤の上見つけた。しかも、このソースコードに関しては公開もしていない。

  • 写真01: 簡単な質問で、Win32APIをC#から使う方法を提案してくれる。Copilotが提案したHIDP_BUTTON_CAPS構造体の定義は、共用体(Union)を含まず、これによりC#での定義、利用が簡単になる

また、以前、この連載で紹介したLocalDirServer(窓辺の小石(159) 忘却の惑星も、「node.jsを使って、HTTPプロトコルでURLから指定されたローカルフォルダをエクスプローラーで開くプログラムを作ってください」と質問したら、筆者の作成したプログラムと似たようなものが出てきた(写真02)。こちらはローカルパスを指定するのにクエリーを使い「?folder=<パス>」と指定するURLを使い、筆者の作成したものとは少し異なる。

  • 写真02: 以前の記事で紹介したプログラムを作らせてみた。さすがにエラー対策まではしてくれないが、基本的なコードの流れは、筆者が書いたものと同じ。しかし、ローカルパスを渡すのにクエリーを使うところが異なる

Copilotが追記する参考Webページには、直接、この方法を記述したページもない。このやり方がインターネット内に絶対存在しないとは断定できないが、少なくともCopilotは、質問が理解できれば、適切と思えるコードを提案できるようだ。

そういうわけで、最近では、インターネット検索する前に、まずCopilotに「お伺い」をたてることにしている。

今回のタイトルネタは、スタニワフ・レムの「『ビット文学の歴史』第一巻 ジュアン・ランベレーほか」から取った。この作品は、「虚数」(Wielkość urojona. 1973年。邦訳 国書刊行会1998年)に含まれている。同書は、存在しない本の前書き、序文などを扱った作品てある。ビット文学とは、人間以外の書き手による文学のことである。