beer2011のブログ

田舎の日常、釣りや、ネット、Apple関係などの内容をカキコします。(特に)プログラミング関係はど素人ですので、あまり当てにされませぬように・・。(^^;) 「次ページ」や「過去記事」などのリンクは、下の方にあります。

LLM(大規模言語モデル)と、このところあまり戯れていないなぁ・・、などと

決して飽きたと言うことはなくて、ただ単に少し前のような時間の余裕がなくなっているということかな・・。
こんな面白いものに飽きてしまうと言うことは、今のところ考えられない。(^^

最近、ふと思い立ち、それほど複雑ではないExcelの作表にGoogleさんのAGアプリ(Antigravity)を利用してみたが、かなり使えることがわかった。

実は、私はExcelでそれなりの大きさのまともなものを作ったことがないので、特に関数や数式関係についてはほぼ素人と言っていい程度の知識しかない。

特に複雑な計算式などを作る場合、目を凝らして数式バーと睨めっこするが、そのうち、何が何だかわからなくなってくる。こう言ったことは、私以外の人達も結構「あるある」なのではないだろうか?

ここしばらくはGENIMI関連のエコシステムのみしか使っていないので、他の環境はよくわからないけど、LLM(AI)はもう”とんでもない”ことになっている。
(YoutubeやSNSなどでは、こういうふうにAIなどに驚くことを「驚き屋」と呆れているようだが、こちとら、本当に驚いているのだからしょうがない ^^;)

「LLMに依頼して欲しい回答がもらえない、なんか頼りない」と感じる場合、LLM自身の問題というよりも質問を投げかける人間側の指示内容に問題があることがほとんどなのではないか?とさえ、最近は思っている。

しからば、自分が夢想したこと(目標とか希望とか)が可能かどうかを自分だけで判断するのは、この時代においては「愚か」と言っていいのではないだろうか? 勿体無いように思う。 他人に聞きずらいのならば、少なくともLLMにちょっと尋ねてみるくらいはした方がいいのではないか?などと考えている。
もちろん、これは自分自身への戒め、でもあるのだけど・・。

田植えが終了

天気にも恵まれて、今年の田植えも終わった。

予定通り苗が届いた。さっそく田んぼまで運び、準備。

田植え機も特に問題なく動いてくれたので、トラブルも特になく1枚目が終了。

2枚目の田んぼも終了。

3枚目の田んぼは深い部分があり、ちょっとスタックしそうな場面もありヒヤッとしたが、そこをやり過ごしてからはほぼ順調に終わった。

米の値段が上がったと昨年あたり騒がれてはいるが、うちの場合はほぼ自家用なので特に儲かると言うこともない。
損得で言ったらとっくにやめた方がいいに違いないだろう。
なので、「趣味の米作り」なのだと自覚している。(^^;

「ナンバーリンク」解法スクリプトを爆速実行できた!

またまた、ナンバーリンク解法スクリプト関係です。
今回は、Luaではなく、Pythonを使います。いくつかのサイトを確認すると、Pythonの処理速度がここしばらく、かなりの向上を見せているとのこと。
以前、作成したPythonを使ったスクリプトがあるので、それを使ってみることにしました。

GEMINIさんに軽く尋ねてみると、Pandasと同等以上の機能・速度を持っているPolars(ポーラス)というライブラリを使ってみるのもいいのでは?、という回答が来ました。
その後、初めて"uv"というツールを利用して、インストールがなんとかできました。ここまでは、GEMINIさんにおんぶに抱っこで、色々教えてもらいました。

その後、せっかく以前にインストール済みなので、GoogleさんのAIエージェントの「Antigravity」(以下、AG)に、高速化する方法について尋ねると、意外な回答が来ました。(^^;;

結論から申し上げますと、Polarsライブラリのデータフレーム機能を利用しても、問題解決の時間は短縮されず、逆に劇的に遅くなる可能性が極めて高いと判断できます。
その理由は以下の通りです。

  1. 処理の性質がデータフレームと合っていない
    numlink_4_0.py のアルゴリズムは「1マス進めてみて(set_val)、ダメなら戻る(バックトラック・再帰呼出)」という処理を1マス単位で数百万回〜数千万回と繰り返す性質(スカラー演算・状態変化の連続)を持っています。 これに対し、Polars(やPandas)のようなデータフレームは、「巨大な縦横の表データ(カラム配列)に対して、一括で同じ計算(ベクトル化演算)や集計・結合を行う」ことに特化したライブラリです。

  2. コンポーネントへのアクセス(読み書き)のオーバーヘッド
    Pythonの標準のリスト(現在の M_RAW のような2次元配列)は、特定の1マス M_RAW[r][c] を読み書きする速度が非常に高速です。 一方データフレームは、特定の1つのセルだけをピンポイントで書き換えたり読み込んだりするように作られておらず、その操作を行うたびに内部データ構造の再構築や型チェックなどが走り、リストの何千倍ものアクセス負荷(オーバーヘッド)が発生してしまいます。

本当に時間短縮(高速化)を目指す場合のアプローチ
もし現在のPythonスクリプトをさらに高速化したい場合は、データフレームを導入するのではなく、以下のようなアプローチが有効です。

JITコンパイラの利用 (PyPy環境での実行)
コードを一切書き換えずに、実行環境を python から pypy に変えるだけで、このような純粋なループ・再帰処理は数倍〜10倍程度高速化する可能性があります。

Numba や Cython の導入
関数に @numba.njit デコレータを付けるなどして、事前にC言語ネイティブに近い実行コードにコンパイルしてしまう手法です(ただし再帰や辞書型などをNumbaが解釈しやすい形(1次元配列など)へ書き直す必要があります)。

1次元配列への変換 (ビット演算・フラグ管理)
現在 [r][c] でアクセスしているものを [r * WIDTH + c] のような 1次元リスト(あるいはC言語の配列である array モジュール)にまとめたり、探索済みのマス(visited)をセット(集合)ではなくビットフラグで持つように工夫すると、探索効率が上がります。

まとめ: ナンバーリンクの経路探索のような「細かい状態分岐と書き換えを繰り返すパズル探索」においては、Polars等のデータ処理ライブラリは不向きです。現在のPython標準リストを用いた実装の方が、アプローチとしては理にかなっています。

それではということで、AGさんにスクリプトを"pypy"コマンドで実行してもらうと、驚きの結果でした。

結果の比較
標準のPython環境(コード内の記録): 約 1560秒(約26分)
今回のPyPyでの実行結果: 約 326秒(約5分26秒)
コードを1行も書き換えることなく、uv のコマンド一つで 約4.8倍もの高速化 に成功しました。 ...

スクリプトは全く変えず、実行方法を変えただけで、これほど劇的な結果が出るとは!
こういう方法があることを知らなかった私にとっては、驚き😳 です。
興味のある方は、お試しください。

Pythonスクリプトは、->こちら、から、どうぞ。

P.S.
2026/04/01 はてなブログに、「斜め読み」機能が追加されたようです。単純に面白いのでお試しを。(^^
      エイプリルフールのネタだったようです。ですので、この後は表示されないかも。

今年も、ぼちぼち始まった・・。

なんか、気分が乗ってこないこともあり、手をつけていませんでした。
しかしながら、さすがに、この時期に何もしないのは”まずい”と思い、少しづつ田んぼ作業を始めました。

小さな堤に年季の入ったポンプを設置したり、”あらごなし”などを試してみました。
なんだかんだ言っても、やはり、自然の中で適度に体を動かすことは気持ちいいものです。
今年も春が来てくれたことに感謝かな。

オタマジャクシの卵が見えるかな?

こちらの田んぼから始めてみました。

「ナンバーリンク」問題作成アプリをバージョンアップ。

ちょっとした改善です。
前回のスクリプトをターミナルで実行すると、問題と回答をテキスト形式で表示できましたが、追加処理として画像形式(SVG)でも出力できます。

SVG形式は、ブラウザアプリなどでも表示できるとのことで、作成についても他のアプリへの依存度も少ない形式とのことです。 いろいろな用途に流用しやすいと思いますし、そもそも表示がカラフルになり以前よりちょっぴり楽しいです。

今回もAntigravityアプリにプロンプトで依頼しました。途中、3〜4回ほど、動作承認を尋ねられましたが、結果、うまくいったようです。今回も私はノーコードです。(^^;

修正後のスクリプトは->こちら、です。興味のある方は、どうぞ。
出力結果は以下のようになります。

「ナンバーリンク」の問題を作成するアプリ(スクリプト)ができた

とはいえ、汎用的なものではなく、6x6の大きさのもの限定です。
Luaスクリプトで作られていて、ターミナルで実行することで、数秒で1つの問題と解をテキスト表示します。
シンプルですが、何度も繰り返して問題を作成すれば、それなりに名問題が見つかるかもしれません。
ナンバーリンクについて*1

今回、初めてGoogleのAntigravityアプリ(以下、AGと短縮します)をMacで使ってみました。
相変わらず、私は「ノーコード」です。 WebのGEMINI3の画面と、AGの画面を同時に表示して、GEMINI3で確認や基本的な操作を尋ねて、AGの画面で操作するという、よくわからない方法で試行錯誤しました。

あくまでも素人なりの理解と使い方しかできてません。
現状、AGを評価するような立場ではないので、まともな解説などはできませんが、AIを使ってローカルのファイル処理ができることを実感しました。
ちょっとばかり、新しい世界を垣間見たような感じですね。(^^

興味のある方は、->こちら->こちら をチェックしてみてください。
今回は、2つのスクリプトが必要になります。
以下は、出力例です。

% lua unique-generator.lua
6x6 充填率100% かつ ユニーク解を持つナンバーリンク問題の探索を開始します...
盤面生成試行中... 回数: 3  

★ ユニーク問題の生成に成功しました! ★
--- 問題 (Problem) ---
 .  .  .  4  3  . 
 .  2  .  .  1  . 
 .  .  .  4  .  . 
 .  .  .  .  .  3 
 .  .  .  .  2  1 
 .  .  .  .  .  . 
----------------------------
--- 正解 (Answer) ---
 1  1  1  4  3  3 
 1  2  1  4  1  3 
 1  2  1  4  1  3 
 1  2  1  1  1  3 
 1  2  2  2  2  1 
 1  1  1  1  1  1 
----------------------------
総処理時間: 4.575 秒

*1:「ナンバーリンク」は、パズル制作会社である株式会社ニコリ(Nikoli)の登録商標(登録第4045374号、4054544号)です。

Robloxで動作する、ペントミノ風アプリができた

実は、ずっと前から、「ペントミノ」パズルには興味を持っており、いつか形にしてみたいと考えていました。
8bitパソコンを使っていた頃からですから、かなり以前からですね。
さっさと作ればよかったのにと言われそうですが、結局、力不足だったということなんでしょう、多分?

今回、Robloxの素晴らしい環境と、GEMINI3の力を借りて、とりあえず動作する形のあるものができました。
(今回も、私は「ノーコード」です。一部のプロパティの操作や動作確認はもちろんしています。)
プロトタイプ的なものですので、ご了解を・・・。でも、一応、遊べますよ。

興味のある方は->こちらからどうぞ。