企画をClaude.ai に打診してから2週間で実用品として完成

自分が手掛けた場合はこれをゼロから生み出すのに、どんなに早くても3ヶ月。
自力なら Windowsで長年愛用した Claunch 再現には、ひいきめにみて完成まで6ヶ月と覚悟していた。
予想はしていたが、Claudeの実際の開発期間は質疑時間を入れても累計で3日間もかかってないはず。
しかも、これには詳細仕様書の作成期間も、AI システムとしての セッション(トークン)制限の大きな空白時間も含んでいるので、実質的な Claudeの作業時間は思考時間を含めても 30分も要していないと思う。
なんたってAI だもんね。(^。^; しかし、発注側が適切なスキルで適切な指示を出せなければ、時間がかかるわりに成果物はそれなりの(発注者のレベルに見合った)ものしか生まれないという、考えれば当たり前の事実も体験できた。相対的にはキックオフからここまでの完成まで約2週間という結果。
ボタンのタブ超え移動が実現して Ver 2.2 に
前日まででひととおりアプリの登録が終わっていたが、用途に応じたレイアウトとするには、ボタンの移動をこれまでの「同一タブ内」から「タブ超え」に発展させる必要があった。機能としては、
GUI アプリでは出来て当たり前の機能だが、これをゼロから実装するのは大変そうとは想像できる。
「自分でコーディングするならば」だが、依頼相手は Claude である。何の不安もない(^。^)
GUI ツールの「PySide6」がその機能を内包していることは把握していたので遠慮なくClaudeに依頼できた。
とはいえ、それなりに難度の高い機能ではあるので「まずは単一タブ内のドラッグ移動を実装して動作を確認してから」とClaudeから提案があり、その状態で数日間運用していた。そして、やはり不便なので再度依頼したら快諾はされたが、PySide6の仕様を珍しく長考(3分くらい?)した末に修正部分を提示して来た。
セッション制限が相変わらずきついので、機能改良については修正されたスクリプトファイルをダウンロードするのではなく、修正部分を開示して、それを依頼主である自分が修正するという役割分担としていた。
これによって、トークンを大幅に節約することに成功した。
自分も「PySide6」のコードに触れることでシステム開発の醍醐味を実感できるというメリットにもなる。
変更前のコードブロック
# ウィンドウ位置
pos_row = QWidget()
posL = QHBoxLayout(pos_row)
posL.setContentsMargins(0, 0, 0, 0)
self.win_x_spin = QSpinBox()
self.win_x_spin.setRange(0, 9999)
self.win_x_spin.setValue(app.get("window_x", 200))
self.win_y_spin = QSpinBox()
self.win_y_spin.setRange(0, 9999)
self.win_y_spin.setValue(app.get("window_y", 200))
posL.addWidget(self.win_x_spin)
posL.addWidget(QLabel(","))
posL.addWidget(self.win_y_spin)
cap_btn = QPushButton("現在位置を取得")
cap_btn.clicked.connect(self._capture_pos)
posL.addWidget(cap_btn)
posL.addStretch()
form.addRow("ウィンドウ位置(X,Y):", pos_row)変更後
# ウィンドウ位置
# Wayland環境では自アプリが自身の絶対座標を取得・指定できないため
# (Waylandプロトコル側の意図的な制約)、この機能はグレーアウトして無効化する。
pos_row = QWidget()
posL = QHBoxLayout(pos_row)
posL.setContentsMargins(0, 0, 0, 0)
self.win_x_spin = QSpinBox()
self.win_x_spin.setRange(0, 9999)
self.win_x_spin.setValue(app.get("window_x", 200))
self.win_x_spin.setEnabled(False)
self.win_y_spin = QSpinBox()
self.win_y_spin.setRange(0, 9999)
self.win_y_spin.setValue(app.get("window_y", 200))
self.win_y_spin.setEnabled(False)
posL.addWidget(self.win_x_spin)
posL.addWidget(QLabel(","))
posL.addWidget(self.win_y_spin)
cap_btn = QPushButton("現在位置を取得")
cap_btn.clicked.connect(self._capture_pos)
cap_btn.setEnabled(False)
posL.addWidget(cap_btn)
posL.addStretch()
form.addRow("ウィンドウ位置(X,Y):", pos_row)
note_pos = QLabel("※ Wayland環境の制約により、この機能は現在使用できません。")
note_pos.setStyleSheet("color:#888; font-size:8pt;")
form.addRow("", note_pos)こんな感じ。あと4箇所で似たような変更処理を行った。内容は省略。
もちろん変更コードを手入力なんてしてません。労力節約と正確性の担保としてすべてコピペで済ませた。
コピペで済むならお気楽で良いのはたしかだが、空白インデント一個でも間違うとそれだけでアプリが起動しなくなるのでそれなりに緊張感をもっての作業ではあった。(^。^;
結果は、一発解決だった
ボタンを自由自在に動かして再配置出来るというのは想像していたよりはるかに快適。
これが出来なければタブ分類でタイル型のランチャーなんて使いものにならんからね。
「これ全部一発でできたらほめてくれ」と冗談半分でやり取りしてて、本当に一発解決になったので盛大にほめられたのだった。(^。^)

そして小休止のあと、調子に乗ってアプリ設定メニューの機能強化も一気に行った。
カスタムアプリの最後の仕上げは「ラッパースクリプト」
Python で開発しているのはいいが、完成したスクリプトはそのままではコマンドとして扱いにくい。
Zlaunch 以外に家計簿アプリなどもあるが、自力開発手段としてPython用統合開発ツールの PyCharm を使っていたので、完成したスクリプトを起動するのにとんでもないコマンドになってしまっているのである。
#!/bin/bash
/home/hikosama/PycharmProjects/PythonProject/.venv/bin/python3.12 /home/hikosama/appli/kakeibo/Super家計簿.pyスクリプト作成時に「仮想環境」を設定して、その中で Python コーディングしているとこうなる。
「これ何とかならんやろか」と相談すると「ラッパースクリプトでいきましょう」と教えられた。
何だか上級っぽい名称だが、説明されてみたら大したことではなかった。(^。^)
“!/bin/bash”のキーワードを先頭行に書いた「スクリプト」を拡張子なしのテキストファイルに保存すればOK。
保存場所は自分で管理しやすいフォルダで良い。自分の場合は “/home/hikosama/appli/bin/スクリプト名”。
登録するコマンドはそのパス + スクリプトファイル名 となる。

「/home/hikosama/appli/bin/resizer」を起動したところ。








コメント