ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2025年11月24日月曜日

AI対話計数ツール


2022年11月30日にChatGPTが公開されてから,そろそろ3年目を迎える。おかげさまで,このブログがAIとの対話によって侵食されてきた。それを定量的に分析するために,前回ブログ保存ツールで保存したpdfファイルの分析とカウントをするプログラムを作ろう(作らせよう)と考えた。実際の分析は11月の末日を待ってからになる予定。

2日かけて,3回目のリセットでようやく目的のものにたどり着いた。修正を繰り返すとどんどんドツボにハマっていくので,今のレベルでは仕様を再確認してリセット(最初からやり直し)がよい。なお,これは自分専用だ。なぜならば,Q(koshix):,A(ChatGPT):のような構造に準じたものだけをカウントするように設計したためだ。

最初の頃はでき上がったpythonコード(160行ほど)を自分で実行してチェックしていたが,そのうち,あらかじめ正解データを入れて,ChatGPT側でチェックするようにした。途中でOCR機能が必要だとかいいだして実行時間が2桁大きくなってしまったので,それはやめてもらった。ほとんど通常のデバッグ作業のように対話が進んでいく。

Q(koshix):
自分のブログの一月分のデータ(pdfファイル)のテキストを分析したいと思います。
(1) 毎日のブログで,生成AIとの対話を使っているかどうかを調べます。
(2) 当月の1-31日(月末)の各日について,使っていれば○,そうでなければ△のリストを出します。 例えば,以下のような形式のリストのcsvファイルになります。 2023-12 1,○ 2,△ ・・・
(3) 日付の区切りは例えば,2 0 2 2 年 1 2 ⽉ 2 ⽇ ⾦ 曜 ⽇,のようなものになります。 ・pdfファイルは当月の末日から初日に向かって並んでいます。 ・pdfファイルの初日以降に前月分のブログがある場合がありますが無視してください。
(4) 判定条件は以下のとおりです。
・生成AI発言を使っている場合は,Q: A: の構造が段下げの状態で含まれている。 大文字小文字は区別せずに,{Q,Q Users,Users,Q(koshix): }などと対応する{A,A ChatGPT,ChatGPT,A(ChatGPT-5):} など につづくテキストのブロックがある。 ・ChatGPT-5 のところには,ChatGPT,Gemini,Claude,Perplexity,Grok,DeepSeek,Qwenなどの文字列を含んだ各バージョンの名称が入ることがある。 ・それ以外の要素は加味しなくても良い。
(5) これを実行するpythonスクリプト名を ai.py とすれば,コマンドラインで ai.py 2025-10.pdf とかai.py 2024-*.pdf などとすれば,2025年10月分のファイルの分析や,2024年の1月から12月のファイルの分析がワイルドカードでできるようにします。
(6) 上記の例で結果出力は,2025-10.csv,2024-01.csv 〜2024-12.csv (12ファイル) が得られます。複数月を指定した場合は,それぞれの月の○の数を集計したものの 月別リストを summary-2024.txt などとしてまとめ出力してください。
(7) 見本ファイル(2023-05.pdf)とコメント付きの正解のcsvテキストを添付(省略)します。
質問があれば教えてください。

A(ChatGPT-5 Thinking,24秒):
意図:(回答略)
できること:(回答略)
スクリプトと実行例:(回答略)
使い方:(回答略)
実装の要点(抜粋):(回答略)
既知の限界と調整ポイント:(回答略)

追加の検証や、「この月のこの日が××のはず」などの正解表に合わせた誤判定修正(パターン拡張や閾値変更)もすぐ対応します。まずは上記 ai.py と 2023-05 の結果をご確認ください。

Q(koshix):
(1) 28,○ と 30,○ が再現できていません。その理由を教えてください。
(2) csvファイルの末尾に○の数の集計値を与えてください。
(3) 有る年度の複数のpdfファイルを対象にした場合,summary-2023.txtのようなまとめファイルをください。それは,各月名と○の数がならんだcsvファイルです。 2023-01, 5 2023-02, 9 ・・・ 2023-12, 10 などのようなものです。

A(ChatGPT-5 Thinking,17秒):
ありがとうございます。ご指摘の3点、以下の通り対応しました。
(1) 28,○ と 30,○ が再現できていなかった理由(回答略)
(2) CSV の末尾に ○ の集計値を追加(回答略)
(3) 年度まとめファイル summary-YYYY.txt(回答略)
更新済みスクリプト(rev2):
ai.py を差し替え済みです。ダウンロードしてそのままお使いください。
スクリプト:Download ai.py
サンプル出力(今回のPDFに対する再解析結果)
2023-05.csv(末尾に 合計○ を追加済み)
summary-2023.txt(CSVスタイル)
必要なら、Q/Aラベルの追加(例:質問/回答、ユーザ の表記揺れ、モデル名の拡張など)や、「Q→Aの順序」判定の厳格化/緩和(例えば同一行Q/Aを○とみなす等)も即調整します。

Q(koshix):
ほとんどよくなりましたが,どうして6が○になりますか。△のはずですが。

A(ChatGPT-5 Thinking):
ご指摘ありがとうございます。原因の分析と修正を反映しました。
なぜ「6」が誤って○になったのか
誤判定の典型パターンが当たっていました:
「Q&A(イベント案内・章タイトル)」型:本文中に “Q&A” や “Q & A” の語があり、同じ日の本文内に “ChatGPT” 等のモデル名が登場するだけで、「Q→A の対話」と誤認。
ラベルなしの一般語:User(ユーザー)や ChatGPT が見出しや説明文中に現れるだけでも、(緩め過ぎた rev2 の)正規表現が「Q/Aラベル」とみなしてしまう。
つまり 「Q(やUser)+ … + ChatGPT」 の単なる共起を、「行頭の話者ラベルによる Q→A 対話」と誤解するケースがあり、6日が○に転んでいました。
対策(rev3)(回答略)
ダウンロード(回答略)
仕様の最終確認(回答略)

もし「この日も○/△が違う」といった箇所があれば、その日の**短い抜粋(スクショでも可)**をお知らせください。検出器をピンポイントで微調整します。

Q(koshix):
30が○から△に変わりました。これはなぜですか。テキストを添付します(略)。

A(ChatGPT-5 Thinking,9秒):
原因はシンプルです。rev3 で検出条件を“行頭ラベル+コロン必須”に厳格化したため、30日の本文にある
User(単独行、コロンなし)
ChatGPT(単独行、コロンなし)
という**「見出し型の話者ラベル(コロンなし)」**が Q/A ラベルとして認識されなくなったからです。
添付テキストはまさにこの形式で、各ラベルの次の行から本文が始まっています。そのため rev2 では○、rev3 では条件を満たせず△になりました。

どう直せば 30 日が○に戻るか(最小変更)(回答略)
必要であれば、この修正を組み込んだ ai.py (rev4) をすぐにお渡しします。

Q(koshix):
ai.py(rev4)をください。

A(ChatGPT-5 Thinking):
お待たせしました。rev4 を作成して動作確認済みです(5月の○の合計は10に変化:6日=△のまま、30日=○に復帰)。スクリプト本体,検証出力,年次まとめ,rev4の要点など(回答略)
これでほぼできあがり,第3回の所要時間は30-60分ほどだろうか。



図:AIとの対話(Imagenが私の正面写真から生成した横顔)

[1]pdf2aiのソースコード(2025.10.21)

2025年11月23日日曜日

ブログ保存ツール

しばらく前に一度やりはじめて挫折した件。再度,要求仕様を良く考えてChatGPT-5 Thinking に依頼してみた顛末が以下のとおり。かなり苦労したが目的は一応たっせられた。このブログ記事を月単位でpdfにアーカイブするというものだ。

その過程でわかったことがある。ChatGPT-5の能力を持ってしても,単純な構文エラー([]の数がつり合わない)を生ずることがある。一方で原因不明のトラブルが発生した。これは未解決のままだ。2020年6月分のアーカイブの際に,wkhtmltopdfがうまく機能しないというもの。いちおうの回避プログラムも提案してもらったので,なんとかはなっている。

pythonを使う際には仮想環境にしないといけないのがちょっと面倒だ。

% brew install wkhtmltopdf
% python3 -m venv path/to/venv
% source path/to/venv/bin/activate
(venv) % python3 -m pip install --upgrade pip
(venv) % python3 -m pip install pymupdf requests beautifulsoup4 numpy playwright
(venv) % ./blgpdf 202510 202510
などなど。

Q(koshix):
私は,https://koshix.blogspot.com に2018年12月から毎日ブログを掲載しています。
このデータを月単位でpdfファイルとしてダウンロードしたいと考えています。

例えば https://koshix.blogspot.com/2025/09/ とすれば,2025年9月分のデータにアクセスすることができます。ところで,この場合9月21日までが1ページにまとまって出力されますが,それを越える部分(9月20日以前)は,ページ末の「前の投稿」からたどる必要があります。

これによって,次の1ページで9月1日までのデータにアクセスすることができます。ブログの分量によっては,1月分が1ページで収まる場合もありますが,今のようにそうでない場合もあります。おおむね2ページで収まると考えています。

さて,このような状況で月単位のpdfファイルを取得するのですが,実際に試してみると1ページのpdfの後半には連続したブランクページがたくさん含まれているようです。できればこの空白を取り除いた上で,1ページ目ともしあれば2ページ目(これも空白を取り除く)をつなげた1本のpdfファイルにまとめてほしいのです。ファイル名は例えば,2025-09.pdf などとなります。

このような仕事をコマンドラインから実行するプログラムを作ってください。そのプログラム名を blgpdf とすれば,blgpdf 202506 202509のようにすれば,2025年6月から2025年9月までの4つのファイル(6月,7月,8月,9月)が得られるようにしたいのです。

ここまでで何か質問はありませんか。なければあらためて依頼のゴーサインを出します。

A(ChatGPT-5 Thinking,35秒):
ありがとうございます。要件は把握しました。実装前に最小限だけ確認させてください(全部 “はい/いいえ/短文” で返せます):
1.依存ツール:wkhtmltopdf(HTML→PDF化)+ Python パッケージ PyMuPDF(空白ページ検出と削除)を使ってよいですか?
・macOS(Homebrew)で brew install wkhtmltopdf、pip install pymupdf を想定しています。
2.空白ページの扱い:文中に紛れ込んだ“実質的に真っ白なページ”も削除対象にしてよいですか?(末尾に連なる白紙だけでなく、途中にあっても除去)
3.出力場所:デフォルトは「カレントディレクトリ」に YYYY-MM.pdf を保存でよいですか?(例:./2025-09.pdf)
・もし希望があれば --outdir オプションを付けます。
4.レンダリング待ち:Blogger の遅延読み込み対策として、wkhtmltopdf --javascript-delay 2000(2秒待ち)を入れます。既定で問題なければこの設定で進めます。(必要なら秒数を指示ください)
5.2ページ目URLの検出:月ページ下部の “前の投稿 / Older posts” リンク(search?updated-max= を含む)を自動検出して拾う方式で問題ないですか?(テーマ依存のラベル文言差は無視し、URLパターンで判定します)

OK でしたら、すぐに blgpdf(単一ファイルのPythonスクリプト、CLI)をお渡しします。
例:blgpdf 202506 202509 → 6〜9月を順に取得・白紙除去・結合・保存。

Q(koshix):
1 yes 2 no 3 yes 4 yes 5 yes  これですすめてください。どうぞよろしくおねがいします。

A(ChatGPT-5 Thinking,20秒):
了解です。ご指定どおり進めます。(以下略)

Q(koshix):
空白ページの除去が全くできていないので,2000ページものpdfが出力されていました。 なんとかなりませんか。

A(ChatGPT-5 Thinking,23秒):
原因は、wkhtmltopdf が実体のない要素や印刷用 CSS の影響で“見た目は白紙だが内部的には何かがある”ページを大量に吐き出し、以前の「テキスト/画像/ベクターの有無」判定では白紙と認識できなかったことにあります。(以下略)

Q(koshix):
やはりうまくいかないのですが,dpiを増やしたり閾値を大きくするのは逆効果ではないのですか?

A(ChatGPT-5 Thinking,32秒):
ご指摘のとおり、「DPIを上げる」「閾値(white_ratio)を大きくする」は白紙判定を“厳しく”する方向なので、見えない微小ゴミ(細い罫線・1pxの影・アンチエイリアス・不可視要素のにじみ)を拾ってしまい、白紙とみなせなくなる=逆効果になりがちです。(以下略)

Q(koshix):
だいぶよくなりました。ところが,1ページで収まらない場合に,ページ末尾の「前の投稿」で過去のページを辿る必要があるのですが,ページ末尾の「次の投稿」の方の未来のページを辿ってそれを2ページ目として採用している場合が見受けられます。なんとかなりませんか。

A(ChatGPT-5 Thinking,28秒):
了解です。2ページ目は必ず「前の投稿(= Older posts = 過去方向)」だけを辿るようにロジックを強化しました。(以下略)

Q(koshix):
常に前の投稿へを参照するようになっていませんか。目標月の1日までが1ページ内に収まっていれば,前の投稿へのリンクを辿る必要がない場合もあるのですけど。

A(ChatGPT-5 Thinking,19秒):
助かりました。ご指摘の通り、「1ページ目にその月の1日が含まれている場合は“前の投稿”を辿らない」条件を厳密に入れました。

・・・以下延々と別のエラーコードの修正で格闘を続けた・・・
・・・2020/06 がうまくダウンロードできない状態が続く・・・

Q(koshix):
(venv) koshi@mba2020 ~ % ./blgpdf 202006 -v
 File "/Users/koshi/./blgpdf", line 248
 dil = ( ^ 
SyntaxError: '(' was never closed

A(ChatGPT-5 Thinking,17秒):
ごめん、私の括弧ミスでした(dil = ( 行)。膨張処理のところをシンプルに書き直して、構文エラーを解消した完全版を置いておきます。これに差し替えてください。

・・・結局 2020/06 の問題の方は解決しなかった・・・
・・・ChatGPTでも単純なプログラムのミスを犯すのだった・・・


P. S.  10/21 brew upgrade にエラーが出ていたので,ChatGPT-5 の指示を受けながら,brew cleanup, brew update, brew upgrade, brew doctor を繰り返してエラーを潰していった。その過程でwkhtmltopdf が使えないことがわかり,代替として提示された chromium もだめだといわれた。仕方がないので再び ChaatGPT-5 に相談して上記プログラムの修正を図ったところ,brew とは関係なしに,python -m pip install playwright pymupdf requests beautifulsoup4 と python -m playwright install chromium の環境を使った修正版が使えることになった。こちらの方が数式が保持されていてうれしい。


[1]blgpdf のソースコード(2025.10.21版)

2025年11月20日木曜日

元素周期表3D

物理の日からの続き

橋本大也さんといえば,読書家であり海外の本を原語で読み漁っていた。ところが最近では,AIによるバイブコーディングの伝道師と化している。Claude(が一押しらしい)の周期表ウェブアプリが,たった5つのメッセージだけでできたというので追試した経緯が以下。

(1) Claudeにて
【元素表を作って】
【各元素をクリックすると、その元素の用途の解説とイラスト(ピクトグラム)が表示されるようにして】
【詳細情報を下部ではなくてホバー表示させる。視覚効果を7つ追加】
【ホバー表示した詳細情報は音声読み上げする】
Three.jsで回転可能な原子構造を表示する】

いちおうCaludeの画面上のインタラクティブ元素周期表はできたのだけれど,自分の環境ではどう移植すればよいかわからない。というのもThree.js という3Dライブラリを使う必要があるからだ。仕方がないので,ChatGPTに相談することにした。

(2) ChatGPTにて
最初はThree.jsを含む環境設定方法を聞いたのだけれど,自分が最新のウェブアプリ開発について何もわかっていない素人なので,答えを聞いてもチンプンカンプンである。そこで,Claudeの作ったWebアプリコードを直接入力して,自分のローカル環境で実行したいとお願いした。最初からそうすれば良かった。以下の段取りを指示された。
Next.jsプロジェクトを作る
 % npx create-next-app@latest periodic-table-app
・Tree.jsをインストールする
 % cd periodic-table-app
 % npm install three
・コンポーネントファイルを作成(nanoは単なるエディタ)
 % mkdir -p app/components
  nano app/components/PeriodicTable.tsx
・トップページから呼び出すように設定
 % app/page.tsx を編集(Reactコンポーネントの拡張子らしい)
・開発サーバを起動して確認
 % npm run dev
 ⇒ http://localhost:3000 でアプリが立ち上がる。
Q(koshix):
ありがとうございます。 node も npm もbrew でインストールされていました。 自分は初心者であり,htmlとかcssとかjavascriptは何となくわかりますがnode, npm, mpx, Next.js + React + TypeScript + Tailwind + Three.js何を意味しているかを概念的に把握できていません。申し訳ないのですが,よくわかるようにこれらの要点や注意点を解説していただけませんか。

A(ChatGPT-5):
(長々と説明された後)
あなたのための短いアナロジー
HTML → 家の骨組み
CSS → 壁紙・装飾
JavaScript → 家の仕掛け(自動ドア・照明)
Node.js → 家を作る工場のようなもの
npm → 工場で使う工具や材料(React / Next / Three のパッケージ店)
React → 家の“部品”をモジュール化して大量生産
Next.js → 部品を組み合わせて「街」を作るシステム
Tailwind → スタイルを一瞬で貼る装飾セット
Three.js → 3D ホームシアター設備
わかったようなわからないような。とりあえず,あれこれ相当試行錯誤してローカル環境で周期表アプリは動いた。ががが・・・さらに修正を繰り返しているうちに ⇒ 「思考が停止しました。」(私がではない,ChatGPTがである)
次の日にやり直したものの,途中で再びエンストしたまま動かない。(大丈夫か)

(3) Geminiにて
昨日までに作られた PeriodicTable.tsx,elements.ts,PeriodicTableJSON.json の3つのファイルをインプットしてやり直しをお願いした。ChatGPT-5と違ってスイスイと話が進んでいく。もしかすると,プログラミング能力についてはChatGPTよりGeminiの方が優れているのではないか。ChatGPTにあっさり断られた 元素の発見者(発見年)や存在比などにも柔軟に対応してもらえた。その上親切にも元素発見の歴史を表す周期表の動画まで紹介してくれた。

さらに,これをさくらインターネットの公開サーバに移植する方法を尋ねたところ,
・設定ファイルの変更
 % next.config.ts
・ビルド(書き出し)の実行
 % npm run build
 ⇒ out フォルダにNext.js アプリを公開する際に最も簡単で確実な「静的エクスポート(Static Export)」という機能を用いた結果が生成された。
・サーバーにアップロード
 outフォルダのディレクトリ構造全体をsftpで転送すればよい。
に結果(正確性は保証していませんので注意してください)が得られた。橋本さんの言うように5行でOKとは行かず,足掛け2日がかりだった。しかし,生成AIがなければ,1ヶ月勉強した上の1週間仕事だろう。



図:周期表ウェブアプリの表紙

P. S. まあ,3Dの怪しい電子軌道の絵にはあまり意味がないと思うんですけど。

P. P. S. なにやら新しいグーグル検索機能が追加されたようなので試してみた。


2025年10月8日水曜日

関数電卓ウェブアプリ


気の迷いで関数電卓ウェブアプリを作らせてみようと思った。ChatGPT-5とGemini 2.5 Proを組み合わせてあれこれ試した結果,画面と機能の設計がかなり面倒だということがわかった。そこで,出発点としてiPhoneの計算機アプリを使うことにする。その画面と裏画面(2nd関数で表示されるもの)をキャプチャーしてこのようなものとChatGPT-5 Thinkingにお願いした。
Q(koshix):
Appleの計算機を参考に関数電卓のウェブアプリを作ってください。 2つ画像があるのは1st関数リストと2nd関数リストを表現しています。
 (1) 背景は薄い空や海のような自然で流れるような水色にしてください。
 (2) 本体のボディはシルバーにして,ボタンとの違いをはっきりさせます。
 (3) 表示部分は液晶的な背景にモダンな文字デザインにします。
 (4) 有効数字は別列スイッチで6桁(単精度)と12桁(倍精度)の切り替え式に。 
 (5) 同様に角度の単位のラジアンと度のも別列スイッチで切り替え式に。 
 (6) %キーはやめてバックスペースキーBSにしてください。
   BSは一つずつ順に前の計算/入力状態に戻していくキーになります。
 (7) mc m+ m- mr はMC M+ M- MR と表示して区別できる薄緑色にしてください。
 (8) Rand は rnd と表示します。
 (9) EEキーは数字キーと同じ色に,Degキーは先ほどの%を盛ってきます。
 (10) 2nd ボタンは色を変えて,押した状態では 1st と表示するようにして下さい。
 (11) 計算式が薄いグレーの小文字で計算結果表示の上に出続けるようにしてください。
 (12) 最上段の選択ボタンと関数電卓型のボタンは不要です。
 ココまでの指示内容でで質問があればお願いします。よければ了解としてください。
 その後,こちらで進めてくださいという指示を出します。

400行くらいのHTMLファイル(javascriptプログラム)がでてきて,動作確認の粘り強い往復やり取りをしながら一日かかって,570行くらいのプログラムができた。まだバグがたくさん残留している模様。とりあえず 関数電卓ウェブアプリ を公開しておく。



図:関数電卓ウェブアプリの画面


javascriptの文法やprograminngの仕組みを知らなくても,論理的で正確な日本語表現で,デザインや機能に対する要件を伝えることや,AIからのフィードバックを検証してみる過程を繰り返しながら完成に近づけていくということを学習できそうではある。

その前段階として,簡単なjavascriptを出力するような課題をあたえ,その結果を読解するような演習がありうる。そんなこんなで生成AIを自由に使える環境さえあれば,これまでのものとは一味違うプログラミング教育は可能だと思う。むしろバイブコーディングの方が如何に適確に相手に要望を伝えるかという訓練ができるのではないか。


2025年8月22日金曜日

プログラミング教育2025

放送大学にチャンネルを合わせると,中川一史さんと文科省の折笠史典さんがでている「小学校プログラミング教育(導入編)」をやっていた。2019年のものかな。生成AI登場以前だ。それはそうとしても,なんだかなぁと感じたのでそのあたりをChatGPT-5の助けをかりて言語化してみた。「わかりやすく」とか言わないほうが面白い結果が得られる。

Q(koshix):
小学校のプログラミング教育において重要なことは「プログラミング的思考」を育成することだといわれています。 ところが,その定義が手続き型プログラミング言語の仕組み の表層をなぞるようなものでしかありません。具体的な実践例も 子供たち創造力を引きだすようなものにはなっていないと思います。 
問題はコンピュータの利用において,これを単なる受け身の メディア再生機(YouTubeとゲーム)でなくて主体的に創造するための「ツール」として活用することにあるのではないかと思います。 プログラミング教育はその一部を構成できると思いますが, 一方でプログラミングなしで,通常のアプリケーションの 活用だけでも同等のことが実現できるのではないでしょうか。 この論点のついての分析と評価をお願いします。

A(ChatGPT-5):(回答略)

Q(koshix):
私の問題意識は,プログラミング的思考を育成するという目標設定それ自身がおかしいのではないかということです。目標はあくまでも創造的な「ツール」としてコンピュータを活用できるようになることです。そのなかにプログラミングという要素があることには全く依存がありません。アプリ中心であることにこだわっているわけでもありません。AI時代を迎えるにあたっての基本的な考え方の問題です。その辺があなたにうまく伝わっていないような気がします。

A(ChatGPT-5):(回答略)

Q(koshix):
いやここまでで結構です。どうもありがとうございました。 放送大学の「小学校プログラミング教育(導入編)」という授業の内容を徹底的に批判してほしいのですが,たぶんあなたはそれにアクセスできないでしょうから無理ですね。

A(ChatGPT-5):(回答略)

Q(koshix):
(添付ファイル:koshix.blogspot.com の「小学校プログラミング教育」から)
小学校プログラミング教育とプログラミング的思考についてのこのブロガーの記事を年代順に把握理解してその主張を報告してください。

A(ChatGPT-5):(回答略)

Q(koshix):
「教育政策の批判軸」 と 「創造的活用へのシフト」 という2本の柱で整理し、論説の形で分かりやすく説得的な日本語の文書にしてください。

A(ChatGPT-5):(回答略)

Q(koshix):
添付のテキストの内容も加味して,教育関係者向けの提言書スタイルのわかりやすく説得的で詳しい文章にまとめてください。

A(ChatGPT-5):(回答略)

Q(koshix):
分かりやすさを優先したためか,文章の深みに欠けています。箇条書きはなるべく減らした上で,深く思考を紡いだ長めの文によって論理を尽くして問題点をえぐり出してください。

A(ChatGPT-5):

提言書(ChatGPT-5 + koshix)

「プログラミング的思考」から「創造的コンピュータ活用力」へ——AI時代の小学校情報教育を設計し直す

小学校へのプログラミング教育導入は、「プログラミング的思考」という新奇だが曖昧な標語のもとに制度化された。だが、この標語は教育の最上位目的を示す理念としては脆弱で、しばしば“手段の目的化”を招き、現場に形式主義をもたらしている。むしろ目標は、子どもがコンピュータを自らの創造のための道具として使いこなし、情報を構想・生成・編集し、社会に働きかける力を培うことに置かれるべきである。この観点は、当初の政策決定過程のねじれや、現場で観察された実践の限界、そしてAIの到来によって一層鮮明になった。

1.概念輸入のねじれと制度文言の劣化
コンピューテーショナル・シンキング(CT)」の輸入に端を発する議論は、当初、学習の設計・分解・抽象化といった広い知的実践を射程に入れていた。しかし政策化の局面で、用語は「プログラミング的思考」へと統一され、その意味内容は「意図した処理を実現するために、動きの組合せを記号で設計し、改善する」といった、手続き型プログラミングの表層に引き寄せられてしまった。ここで理念は二重に脱力する。第一に、目標を「思考法」に格下げすることで、子どもが道具を握って世界に関わるという行為のダイナミズムが霧散する。第二に、学ぶべき思考の実体がプログラミング言語の構文・制御構造の擬似体験に化け、学びの “中身” が希薄化するのである。このねじれは、政策文言の可搬性(どの学校でも言い回しだけは一致させられる)を優先した結果でもあったが、その代償として、子どもの創造的な営みを正面から扱う大胆さを失わせた。

2.形式主義が生む現場の負担と不均衡
「思考の育成」という抽象目標は一見、現場の裁量を広げるように見える。だが実際には、汎用教材で短時間に達成度を “見える化” する設計が横行し、キャラクターを一定の手順で動かすことが “学習の証拠” へとすり替わる。こうした授業で子どもが得るのは、コードの意味理解やシステム設計の経験ではなく、与えられたブロックの正しい並べ替えにすぎない。制度はその “達成” を評価しやすく、教員は達成形式を整えるための下準備に追われる。設備や研修のリソースが乏しい学校ほど、形式主義に依存する傾向は強まり、結果として教育機会の格差は拡大する。制度化の当初から、この副作用は鋭く指摘されていたし、現場感覚としても重くのしかかってきた。

3.教育目標の取り違え——“思考”という名の空洞化
決定的な問題は、「プログラミング的思考」という語が、手段の記述様式(記号列・制御構造)を “思考” に見立て、学習目標を手段側へ引き倒してしまったことである。子どもが学ぶべきは、コンピュータを介して世界に関わるための “作る・直す・伝える” というプロセスの統御であり、その中にプログラミングという選択肢が含まれるかどうかは、課題や道具選択の問題であって本質ではない。現行定義は、まさにこの順序を逆転させる。したがって、「手続き型の表層をなぞる定義では創造性が引き出されない」という批判は、的確であるだけでなく、政策の前提に遡る根本的な再審を促す。そしてこの批判は、単なる理念論にとどまらない。実際の授業は「迷路を解く」「キャラクターを動かす」といった課題に収束しやすく、子どもの関心や社会的文脈に接続されにくい。ここで子どもが体験するのは、世界に向けて “何かを成し遂げる” ための設計ではなく、正規解に収斂する “模倣の段取り” である。

4.反証としての実践——Scratchが示した“道具としての広がり”
他方、同じプログラミングの枠内でも、Scratchの拡張機能群とIoT連携は、授業が閉じた画面内の模倣から、音・身体・空間・外部データへと開かれうることを示した。ここでは、プログラミングは “コードを書く行為” というより、表現や探究のための “場づくり” として機能しうる。つまり、子どもの手に渡る道具箱が十分に多様で、課題が生活世界や学びの他領域に接続されているとき、プログラミングは創造のための媒介となる。この経験は、当初の懐疑を訂正し、目標が “思考のラベル” ではなく “創造の実践” であるべきことを、実証的に裏づけた。重要なのは、ここで価値を生んでいるのが「プログラミング的思考」なる抽象ではなく、道具の拡張性と課題設計の社会的・表現的接地だという点である。

5.AI時代が要請する転回——命令記述から振る舞い誘導へ
生成AIの普及は、コンピュータとの関わり方を「手続きの逐語的記述」から「振る舞いの誘導・評価・統合」へと劇的にシフトさせた。ここでは、プロンプトという高位の仕様を投げ、出力を批判的に吟味し、他のツールと組み合わせて目的の表現や解決に仕立て直すことが核心となる。つまり “作る” ことの意味が、コードの細部に宿るのではなく、道具の選択・役割分担・検証・再設計の循環に宿る構造へと変わったのである。したがって、教育の目標は「プログラミング的思考」の育成ではなく、「コンピュータを創造のために使いこなす統合的能力」の涵養に再定義されねばならない。そして、この能力はプログラミングを必須としない。ローコードやノーコードの環境、さらにはアプリの高度な機能だけで、十分に同等の学びが成立する局面は多い。鍵は、ツールの等価的な編成と批判的運用にあり、どの記法を採るかは従属的な決定である。

6.政策言語を書き換える——“道具としての創造”を最上位目的に
以上を踏まえると、政策文書は次のように言い換えられるべきだ。すなわち、「小学校段階では、子どもがコンピュータとAIを創造のための道具として主体的に活用し、情報を収集・生成・編集・表現する一連の営みを設計・実行・省察できるようにする」。この目標のもとでは、プログラミングは “取りうる手段の一つ” として位置づけられ、課題の性質と子どもの発達段階に応じて、アプリ、センサー、生成AI、データ可視化、メディア編集などと等価に選択される。評価も「正しく動くコード」から離れ、課題設定の妥当性、ツール選択の理由、失敗の記録と修正、成果の社会的・表現的意義といったプロセスの可視化へと移行する。こうして初めて、授業は “やったこと” のチェックから、“何を成し遂げたか”  “どう変えたか” の探究へと質的転換を果たす。

7.実装への視座——授業設計・評価・教員支援
実装の要は三つある。第一に、課題を生活世界の問題や他教科の学びに接地させ、アウトプットを “誰かに届く表現” として設計すること。第二に、AIと人間の役割分担を明示化し、出力の根拠・限界・改変の痕跡を残すことで、子どもに “作ることの説明責任” を教えること。第三に、教員の専門性を「コード知識」ではなく「学習のオーケストレーション」に振り向け、ローコード/ノーコード教材やプロンプト例、失敗事例集を共有資産として整備することである。これらは、リソース差を埋め、形式主義に陥りやすい学校ほど “実質” へと近づけるための制度投資でもある。

結語
私たちが守るべき順序は単純である。第一に目的、次に手段。目的は、子どもがコンピュータを用いて世界に働きかける創造の主体になること。手段は、プログラミングであれ、アプリであれ、AIであれ、課題に応じて選び、組み合わせ、検証し、やり直すこと。いま必要なのは、「プログラミング的思考」という抽象の上塗りではなく、“道具としての創造” を最上位に置く政策言語への転換である。そこに立ち返るとき、授業は再び、生きた学びになる。子どもは、手続きの模倣者ではなく、技術と表現を編む設計者として教室に現れるだろう。

2025年8月7日木曜日

政党マップ(2)

政党マップ(1)からの続き

米国ではエプスタイン問題で大騒ぎらしい。トランプが煽ったエプスタイン陰謀論でMAGA信者は多いに湧き上がっていた。それが一転し,トランプ自身に火の粉が及びそうになって,エプスタイン陰謀論を否定隠ぺいし始めた。これにMAGAの一部が激怒しているとのことだ。これまでのトランプ政権最大の危機だといわれている。このMAGA騒動のおかげで日米関税交渉が妥結したという話がある。トランプはMAGAポピュリズムから逃走しているらしい。本当かどうか。

図:MAGAから逃走するトランプ(よしログから引用)


参院選も終ったことなので,上図の2次元マップにならって日本の政党を分類してみることにした。その結果を以下に示す。座標値はChatGPTが考えたものである。ただし,チームみらいのy座標は符号をこちらで変えた。彼らはポピュリズムじゃなくてエリート主義だろう。
Q(koshix):
参議院議員選挙の後の日本の政治状況を2次元グラフで表現したいと思います。
x軸正方向を右派,負方向を左派とします。
y軸正方向をエリート主義,負方向をポピュリズムとします。
各政党をその得票数に比例した面積に比例する円で表わします。政党のシンボルカラーで各政党の円を塗りつぶします。各政党の政策やニュース情報でそれぞれの政党の立ち位置を定めてください。

参考イメージとして米国の政治主張を例とした2次元グラフを添付します。(上図)

A(ChatGPT o3):
(注:フォント設定部分だけはこちらで修正している)
import math
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.font_manager as fm
from matplotlib import rcParams

# フォントの設定
font_path = '/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc'  # 適切な日本語フォントファイルを指定してください
font_prop = fm.FontProperties(fname=font_path)
rcParams['font.family'] = font_prop.get_name()


# --- データ(比例代表の得票率、Wikipedia「政党色」準拠の色) ---
data = [
    # 政党, 略称, x(右派+ 左派-), y(エリート+ ポピュリズム-), 比例得票率(%), 色(Template:政党色)
    ("自由民主党", "自民",  0.55,  0.65, 21.64, "#3CA324"),
    ("公明党",     "公明",  0.15,  0.55,  8.80, "#F55881"),
    ("立憲民主党", "立民", -0.35,  0.35, 12.50, "#184589"),
    ("国民民主党", "国民",  0.25,  0.10, 12.88, "#F8BC00"),
    ("日本維新の会","維新", 0.60, -0.25,  7.39, "#6FBA2C"),
    ("参政党",     "参政",  0.90, -0.75, 12.55, "#D85D0F"),
    ("日本保守党", "保守",  0.85, -0.50,  5.04, "#0A82DC"),
    ("日本共産党", "共産", -0.70, -0.05,  4.84, "#DB001C"),
    ("れいわ新選組","れいわ",-0.55,-0.45, 6.56, "#E4027E"),
    ("社会民主党", "社民", -0.60,  0.15,  2.06, "#01A8EC"),
    ("チームみらい","みらい",0.05, 0.30, 2.56, "#66FFCC"),
    ("NHK党",      "NHK",   0.50, -0.60,  1.15, "#F8EA0D"),
]

df = pd.DataFrame(data, columns=["政党","略称","x","y","比例得票率(%)","色"])

# 円の面積を得票率に比例させる(matplotlib の s は半径ではなく面積に相当)
SCALE = 1000  # 視認性のための調整係数。お好みで。
df["size"] = df["比例得票率(%)"] * SCALE

# 確認用にCSV出力
df.to_csv("party_positions_2025.csv", index=False, encoding="utf-8-sig")
print(df[["政党","略称","比例得票率(%)","x","y"]])

# 描画
plt.figure(figsize=(8,8), dpi=200)
plt.axhline(0, color="black", linewidth=1)
plt.axvline(0, color="black", linewidth=1)
plt.xlim(-1.05, 1.05)
plt.ylim(-1.05, 1.05)
plt.xlabel("← 左派      右派 →")
plt.ylabel("ポピュリズム ↓      エリート主義 ↑")
plt.grid(True, linewidth=0.3, alpha=0.4)

for _, r in df.iterrows():
    plt.scatter(r["x"], r["y"], s=r["size"], c=r["色"], alpha=0.35,
                edgecolors="black", linewidths=0.6)
    plt.text(r["x"], r["y"], r["略称"], ha="center", va="center",
             fontsize=9, fontweight="bold")

plt.title("2025年参議院議員選挙後の日本政治 2軸配置(比例得票率で面積・試案)")
plt.tight_layout()
plt.savefig("japan_political_2d_2025.png", bbox_inches="tight")
plt.show()

 


図:比例区得票率に比例する面積で表わした日本の政党の2軸配置

2025年7月23日水曜日

Jupyterつまづく

Jupyterからの続き

Mathematica ノートブックにインスパイアされて登場したJupyterは,自分のpythonやJuliaの実行環境になっている。とても便利だ。

ところが,homebrew で jupyterlab4.4.5に更新したところ,jupyter lab や jupyter notebook が動かなくなってしまった。困ったぞ。

いろいろ調べてみると,悪さをしているのはSafari のようだ。どうも最近「この接続は安全ではありません」というhttpsにかかわる警告が多いと感じていた。ChatGPT o3に聞いてみると,それが原因だった。
A(ChatGPT o3): 
(前後略)
Safari 18 以降(macOS Sonoma/iOS 18 ベータなど)には 「HTTP はブロックして常に HTTPS だけ許可」 という新機能があります。これが有効になっていると、たとえ localhost(127.0.0.1)でも http://… へのアクセスは遮断され、画像のようなエラー
Navigation failed because the request was for an HTTP URL with HTTPS‑Only enabled (WebKitErrorDomain: 305)
が表示されます。ローカル開発サーバや Jupyter Lab は既定で HTTP を使うため、Safari が弾いてしまうわけです。
解決方法も教えてくれたのだけれど,SSLの証明書を設定するところがどうもうまくいかない。困った。デフォルトのブラウザをSafari から Chrome にスイッチすると,Chrome では jupyter lab が起動したのでとりあえずはOKだが,それはそれで面倒な気もする。

四苦八苦してChatGPT o3を問いただした結果,次のようにすればよい。
Step 1 : Jupyter Lab を HTTP で起動
ターミナルを開く
つぎのコマンドを実行
# 証明書オプションを付けずに純粋な HTTP で起動
jupyter lab --port 8889 --ip 127.0.0.1 --no-browser

起動ログに
http://127.0.0.1:8889/lab?token=dfbc5bbd50a3b13f317435a1bfa1245684e3f0afd315ba96
が表示されれば サーバは準備完了(緑色の [I ... ServerApp] 行が目印)。

このURLをブラウザに直接貼付けたところうまくいったので,これでよしとする。

2025年6月27日金曜日

Ruby

プログラミング言語のRubyである。

日経夕刊の人間発見,今週(注:先月の)はプログラミング言語「Ruby」開発者のまつもとゆきひろ(Matz, 松本行弘)さんだ。日本人で唯一,2011年のフリーソフトウェアアワードを受賞している。

そういえば,リチャード・ストールマンは,2000年ごろに,横浜パシフィコかどこかでの集会でみたことがあるような気がするけれど,誰にも知られずポツンと何かを物販していた。


図:Rubyの公式アイコン(Rubyホームページから引用)

自分のプログラミング遍歴(1)(2)でも書いたように,Rubyはほとんどさわったことがない。これも何かの因縁かとちょっとインストールしてみようと思った。手元のMacbookには,/usr/bin/ruby (ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin24])という古いものが入っていた。homebrewのほうは,/opt/homebrew/opt/ruby/bin/ruby (ruby 3.4.4 (2025-05-14 revision a38531fd3f) +PRISM [arm64-darwin24]) だった。面倒だ。

そこで,相変らず評判が高い Claude 4.0 Sonnet にきいてみる。

Q(koshix):
macbook でrubyを使いたいのです。homebrew で新しいバージョンはインストールしています。その他の実行環境はどうやって使うのかよくわかりません。どうしたらいいですか。

A(Claude Sonnet 4):
MacBookでRubyの実行環境を整えるには、いくつかの方法があります。Homebrewで新しいバージョンをインストール済みということですが、より柔軟にRubyのバージョンを管理できるツールを使うことをお勧めします。

1.推奨される方法
rbenvを使うのが最も一般的で安定した方法です:
bash
# rbenvをインストール
brew install rbenv
# シェルの設定に追加(bashの場合)
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# zshの場合
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
# 設定を反映
source ~/.bash_profile  # または source ~/.zshrc

2.Rubyのインストールと切り替え
bash# インストール可能なバージョン一覧を確認
rbenv install -l

# 特定のバージョンをインストール(例:3.2.0)
rbenv install 3.2.0
# グローバルで使うバージョンを設定
rbenv global 3.2.0
# 現在のバージョンを確認
ruby -v

3.プロジェクトごとの設定
bash# プロジェクトディレクトリで特定のバージョンを指定
cd your-project
rbenv local 3.1.0

4.その他の選択肢
rvm: 古くからある管理ツール
asdf: Ruby以外の言語も管理できる万能ツール

rbenvが最もシンプルで安定しているので、まずはこれから始めることをお勧めします。インストール後はgem install bundlerでBundlerも入れておくと、プロジェクトの依存関係管理が楽になります。
何か具体的な問題が出てきたら、またお聞かせください。
これにしたがって,きれいにインストールできた。次に,練習してみようと思って,Geminiに「macosにrbenv をいれてrubyを使えるようにしました。この環境でのruby入門のサイトはありませんか。」と尋ねていくつか推薦してもらったが,途中から有料だったりして役に立たない。

京都女子大学の小波秀雄さんがRubyの授業をやっていたのを思い出したが,残念なことに,フリーのテキストはなくて「新しいプログラミング」というインプレスの印刷本になっていた。

そんなこんなで調べているうちに,もうRubyの時代はほぼ終ったという説もみかけた。どうやら世の中はほとんどpythonで埋められているようだ。ということで,Rubyの学習計画は頓挫した。

2025年6月6日金曜日

合計特殊出生率(3)

合計特殊出生率(2)からの続き

2024年に生まれた「日本人の子ども?」の数が1899年に統計をとり始めてから初めて70万人を下回って68.6万人となったとNHKが報じていた。合計特殊出生率も1.20から0.05減って1.15になった。NHKでは婚姻数の減少に問題を帰着させようとしていた。
「国立社会保障・人口問題研究所がおととし公表した将来予測では、日本人の出生数が68万人台になるのは2039年と推計していて、想定より15年ほど早く少子化が進行しています。」

前回に続いて奥村先生のRコードでグラフを描かせよう。としたら,エラーが出てしまった。showtextを読ませてもうまくいかない。そこで,元のコードやエラーメッセージを入れ,ChatGPT o3に尋ねるとちゃんと教えてくれた。
(1) CRAN ミラーを指定して showtext を入れる bash<br>R -q -e "install.packages('showtext', repos='https://cran.yu.ac.kr', dependencies = TRUE)"
※ インタラクティブ R から install.packages("showtext") でも可
(2) 同じライブラリに入ったか確認 bash<br>R -q -e "print(.libPaths())"
ここに /opt/homebrew/lib/R/4.5/site-library が含まれていれば OK。
(3) Rscript でもロードできるかテスト bash<br>Rscript -e "library(showtext); cat('loaded\n')"
エラーが出なければ成功。

前回のRのスクリプトを実行して(Rscript tfr.r),合計特殊出生率のグラフを出力した。なお,使用した データbirth.txtは以下のとおり。

年    出生数      合計特殊出生率

1953 1868040           2.70

1954 1769580           2.48

1955 1730692           2.37

1956 1665278           2.22

1957 1566713           2.04

1958 1653469           2.11

1959 1626088           2.04

1960 1606041           2.00

1961 1589372           1.96

1962 1618616           1.98

1963 1659521           2.01

1964 1716761           2.05

1965 1823697           2.14

1966 1360974           1.58

1967 1935647           2.23

1968 1871839           2.13

1969 1889815           2.13

1970 1934239           2.13

1971 2000973           2.16

1972 2038682           2.14

1973 2091983           2.14

1974 2029989           2.05

1975 1901440           1.91

1976 1832617           1.85

1977 1755100           1.80

1978 1708643           1.79

1979 1642580           1.77

1980 1576889           1.75

1981 1529455           1.74

1982 1515392           1.77

1983 1508687           1.80

1984 1489780           1.81

1985 1431577           1.76

1986 1382946           1.72

1987 1346658           1.69

1988 1314006           1.66

1989 1246802           1.57

1990 1221585           1.54

1991 1223245           1.53

1992 1208989           1.50

1993 1188282           1.46

1994 1238328           1.50

1995 1187064           1.42

1996 1206555           1.43

1997 1191665           1.39

1998 1203147           1.38

1999 1177669           1.34

2000 1190547           1.36

2001 1170662           1.33

2002 1153855           1.32

2003 1123610           1.29

2004 1110721           1.29

2005 1062530           1.26

2006 1092674           1.32

2007 1089818           1.34

2008 1091156           1.37

2009 1070036           1.37

2010 1071305           1.39

2011 1050807           1.39

2012 1037232           1.41

2013 1029817           1.43

2014 1003609           1.42

2015 1005721           1.45

2016  977242           1.44

2017  946146           1.43

2018  918400           1.42

2019  865239           1.36

2020  840835           1.33

2021  811622           1.30

2022  770759           1.26

2023  727277           1.20

2024  686061           1.15



図:合計特殊出生率(1953-2024)

P. S. 自分が生まれた1953年の出生数は186.8万人(男95.7万人,女91.1万人),合計特殊出生率は2.69

[1]人口動態調査(厚生労働省)
[2]人口動態調査 出生(e-Stat)年次別にみた出生数・出生率(人口千対)・出生性比及び合計特殊出生率


2025年4月1日火曜日

バイブコーディング

これまでも生成AIでプログラムをつくることはあった。しばらく前にそれがバイブコーデイングVibe coding)という看板を与えられた。

バイブコーディングは,従来のようにプログラマがコードを直接記述するのではなく,自然言語によって生成AIに対話的指示を与え,それによって生成されたコードでプログラミング開発サイクルを進める。エラーが出ればそれをそのまま生成AIに投入する。このためには要求仕様をなるべく正確に言語化しなければならない。プログラミング能力=自然言語能力というわけだ。


動機:TBSの報道特集でも話題になったクラウドワークス問題。グレイゾーンの隙をみて,原理的には違法な選挙ビジネスが横行している。その仕事依頼ガイドラインは放送直後に改訂されてごまかしを図っている,その新旧対照表をつくろうと考えた(菅野完のチャンネルでクラウドワークスの出した新旧対照表を紹介していた)。

さっそくバイブコーディングを意識して,ChatGPT o3-mini-high でプログラミングしてみた。最初は新旧の仕事依頼ガイドラインのテキストの差分をdiffコマンドでとったもので試したがうまくいかなかった。次に,データグレンジングのためガイドラインのすべての項目に条番号をつけて章でまとめることにした。それが以下の報告である。ただし3ターン目かな。なお,Gemini 2.0 Flash,DeepSeek,Qwen2.5-Max などはうまくいかなかった。

Q(koshix):
各種の規程案で,新旧対照表というものがあります。 新旧の2列が対照できるように並んだ表であり, (1) 第一条から通し番号で番号付けされた条文ごとに, 新規程では新設部分(新設項目や修正後表現)にマーク(強調)がされ, 旧規程では削除部分(削除項目や修正前表現)にマーク(取り消し線)がされて, 新旧条文の比較対照ができるようになっているものとします。 (2) 条文番号以外に内容変更がない項目は新規程の欄に条文番号と内容を 記述し旧規程側は,旧規程の条文番号をつけて(同上)とします。 この場合,新規程側には強調マークがつきません。 (3) ある番号の条文全体が新設された場合は,旧規程側に条文番号 なしで「(新設)」と表記されます。つまり,条文番号は同期しないことが あります。 (4) ある番号の条文全体が削除された場合は,新規程側に条文番号 なしで「(削除)」と表記されます。つまり,条文番号は同期しないことが あります。 (5) 章番号と章名は,変化がない場合でも, 新旧両方ともそのまま記述してください。

 これを実現するpythonプログラムは次のように考えています。 (1) 入力は条文番号付きの新と旧のテキストファイルです。 (2) 図表や文字の修飾情報などは含まれません。 (3) 出力はmarkdownであり,強調と取り消し線の情報を含めます。 (4) 内容が同一というのは完全に文言が一致することを指します。 (5) 条文間の対応に関する指示はありませんので,出現する表現の一致度から 適当なアルゴリズム(difflibなど)を用いて条文の対応関係を判断する必要が あります。ただし,章をまたいで対応する条文はないものとします。 (6) 章内の条文の順序は入れ替わっていることもあるので,対応関係を 探す際のアルゴリズムには工夫する必要があるかもしれません。

 参考となる新ファイル,cw1.txtの一部はつぎのとおりです。 「クラウドワークス仕事依頼ガイドライン 第1条 仕事依頼ガイドラインでは、利用規約に基づき本サービスにおける依頼の順守事項および利用条件を定めています。 第2条 本サービスでは、以下のような行為や依頼を禁止しています。これに違反した場合、投稿の削除やアカウントの利用制限などの対応をおこなう場合があります。 第1章 公序良俗に反する仕事 第3条 社会規範に反する内容や、道徳観念から外れた行為など、一般的な公序良俗に反する内容への賛同・助長につながるような仕事の依頼を禁止しています。 第4条 一般社会通念上、明らかに第三者に嫌悪感・不快感を与えるような文面や画像、暴力的な表現、猥褻な表現やデータなどを閲覧する必要がある、または意図せずに閲覧してしまうよう公開している、あるいはそれらを作成する依頼質問があればお願いします

A(ChatGPT 03-mini-high):
(内容の問い合わせ,略)

Q(koshix):
(1) 出力は Markdown の「表形式」で作成してください。 (2) 新設部分は太字で,削除部分は取り消し線で (3) 差分検出アルゴリズムの類似度50%以上で一致と判断します。 (4) 変更箇所だけを強調(新規程側)・取り消し線(旧規程側)にする形でお願いします。 (5) 各条文は最初の2つを除いて,各章に包摂されます。 (6) 1つの条文は1行で収まります。 (7) 章内で条文の順序が入れ替わるので,マッチングの際は章単位で処理します。 (8) 新旧で部分的に変更がある場合は,新規程側の変更箇所のみ強調、 旧規程側の変更前部分のみ取り消し線という解釈でOKです。 (9) UTF-8です。macOSのテキストファイルです。 (10) 結果は標準出力にお願いします。

A(ChatGPT 03-mini-high):
(内容の確認,略)

Q(koshix):
OKなので進めてください。

A(ChatGPT 03-mini-high):
(実装の流れとコードとプログラムの使い方)

Q(koshix):
ほぼ期待どおりです。ありがとうございました。 新規程側の条文順はそのままの維持された形で出力してください。 最後に条文と同じように制作年月日の新旧の欄を作ってください。

Q(koshix):
入力ファイルの末尾に改訂年月日の記述があるので,制作年月日というところをそれで置き換えてください。これには条文番号が付いていないので注意してください。 なお,新規程の条文番号順に出力するというミッションは達成されていません。

Q(koshix):
新規程のファイル末尾の2行は,以下のとおりです。 第117条 その他、特に弊社が不適切と判断する内容を含む依頼 令和7年3月14日改訂 この「令和7年3月14日改訂」というテキストをmarkdownファイルの最終行の項目として加えてほしいという希望なのですが,わかりますか?

Q(koshix):
そういうことです。どうぞよろしくお願いします。

Q(koshix):
旧規程側にも同様の行があって,同じように対応することを希望していたのですけれど,大丈夫ですかね。

A(ChatGPT 03-mini-high):
(大丈夫です,最終コードが完成する)

cw1.txt:クラウドワークスの仕事依頼ガイドライン(令和7年3月14日改訂)の整形版
cw2.txt:クラウドワークスの仕事依頼ガイドライン(令和6年12月18日改訂)の整形版
no2m.py:ChatGPTが出力したpythonコード(上記のVibeコーディングで作成したもの)
cw4.md:no2m.py cw1.txt cw2.txt > cw4.md で出力したmarkdownファイル
cw5.docx:pandoc cw4.md -f markdown -t docx -o cw5.docx で出力した修飾済み新旧対照表



図:整形後のcw5.docx の一部見本



2025年3月4日火曜日

整数のべき乗の下二桁

オイラーの定理・Grok からの続き

問題がわかったようなわからないような場合は,プログラムに落とし込んでもらうほうがありがたい。

Q(koshix):
f(n,m)=mod(n^m,100) と定義します。(n=2,3,...,m=2,3,...)
この関数は最小の出発点をm_0(n)として,最小周期T(n)を持つことがわかっているとします。つまり,f(n,m_0+T(n))=f(n,m_0) です。このとき,m_0(n)とT(n)をnの式で表わすことができますか。できる範囲で構いませんけど。

A(ChatGPT o3-mini-high):
(57秒推論,たぶん正解,以下出力省略,m=2,3,...というのはこちらの入力ミスで,m=1,2,... でなければならないのだけれど,そのあたりは勝手に斟酌して話を進めてくれている。
出発点:m0(n) = ...
周期:T(n) = ...

Q(koshix):
n,mを入力したときに,m0(n)とT(n)を求めるプログラムを作ってください。

A(ChatGPT o3-mini-high):
(できた!)

Q(koshix):
(1) n=0を入れるまで繰り返して入力を促すようにしてください。
(2) 2^2=4, ... 2^22=...4 のように,周期に対応する部分の結果もあわせて出力するようにしてください。

A(ChatGPT o3-mini-high):
(できた!)

import math

def ord25(n):
    """
    n と 25 が互いに素な場合に、25 を法とする乗法群における n の位数を返す。
    すなわち、最小の正整数 k で n^k ≡ 1 (mod 25) となる k。
    可能性のある値は 1, 2, 4, 5, 10, 20(φ(25)=20より)です。
    """
    if n % 5 == 0:
        return None  # n が5の倍数の場合、この関数は使いません
    for k in [1, 2, 4, 5, 10, 20]:
        if pow(n, k, 25) == 1:
            return k
    return 20  # 理論上ここには来ないはず

def compute_m0_T(n):
    """
    与えられた n に対して、f(n, m) = n^m mod 100 の
    出発点 m0(n) と周期 T(n) を計算する関数です。
    
    ・モジュロ4について:
      - n ≡ 2 (mod 4) の場合は、m0,4 = 2(m>=2から定常)
      - それ以外は m0,4 = 1
    ・モジュロ25について:
      - 5で割れるが25で割れない場合は m0,25 = 2(m>=2から0になる)
      - それ以外(すなわち 5と互いに素または25で割れる場合)は m0,25 = 1
      
    最終的な出発点は m0(n)=max(m0,4, m0,25) として計算します。
    
    周期は、各合同式での周期の最小公倍数として
      T(n) = lcm(T4(n), T25(n))
    とし、モジュロ4では
      - 奇数かつ n ≡ 3 (mod 4) の場合は T4 = 2、それ以外は T4 = 1
    また、モジュロ25では
      - n と 25 が互いに素なら ord25(n) を、5で割れる場合は T25 = 1 とします。
    """
    # モジュロ4での出発点
    m0_4 = 2 if n % 4 == 2 else 1

    # モジュロ25での出発点
    m0_25 = 2 if (n % 5 == 0 and n % 25 != 0) else 1

    m0 = max(m0_4, m0_25)

    # モジュロ4での周期 T4:
    T4 = 2 if (n % 2 == 1 and n % 4 == 3) else 1

    # モジュロ25での周期 T25:
    if n % 5 == 0:
        T25 = 1
    else:
        T25 = ord25(n)

    T = (T4 * T25) // math.gcd(T4, T25)
    return m0, T

def main():
    while True:
        try:
            n = int(input("整数 n を入力してください (終了するには 0 を入力): "))
        except ValueError:
            print("整数を入力してください。")
            continue
        
        if n == 0:
            break
        
        m0, T = compute_m0_T(n)
        print(f"\nn = {n} のとき:")
        print(f"  出発点 m0({n}) = {m0}")
        print(f"  周期 T({n}) = {T}")
        print("周期に対応する部分の結果:")
        # m0 から m0+T まで(両端を含む)で f(n, m) = n^m mod 100 の値を出力
        for m in range(m0, m0 + T + 1):
            result = pow(n, m, 100)
            print(f"  {n}^{m} = {result}")
        print("-" * 40)
    
    print("終了しました。")

if __name__ == "__main__":
    main()

======================================================
(出力結果)

整数 n を入力してください (終了するには 0 を入力):  16

n = 16 のとき:
  出発点 m0(16) = 1
  周期 T(16) = 5
周期に対応する部分の結果:
  16^1 = 16
  16^2 = 56
  16^3 = 96
  16^4 = 36
  16^5 = 76
  16^6 = 16
----------------------------------------
整数 n を入力してください (終了するには 0 を入力): 

 

Q(koshix):
このプログラムを利用して,T(n)のn=1...100 までのリスト,m0(n)の1...100までのリストを出力してください。

A(ChatGPT 03-mini-high):
(125秒考察の後,コードとその実行結果のリストを出力してくれた。微妙に欠損していたので,もとのコードを自分で改変して修正出力した。)

図:T(n)とm0(n)のリストプロット(n=1...100)