検索キーワード「Jupyter」に一致する投稿を日付順に表示しています。 関連性の高い順 すべての投稿を表示
検索キーワード「Jupyter」に一致する投稿を日付順に表示しています。 関連性の高い順 すべての投稿を表示

2025年9月21日日曜日

9月20日(2)

Juliaの日時処理からの続き

5年前の国勢調査の記事がないかと調べていたら,それはなくて5年前の自分の誕生日の記事が発掘された。誕生日の曜日を調べるJuliaプログラムの話だ。5年も経っているからもう一度実行してみようと,Jupyterではすぐ動いたが,コマンドラインでどうするのか迷った。

プログラムを実行形式にchmodして,頭に#!/usr/bin/env julia(あるいはjuliaの絶対パス)を書けばいいだけなのだけれど,!に気がつかず,シェルスクリプトのコメントと解釈されてエラーがでた。しかし耄碌しているのですぐに原因に気付けずChatGPT-5にたよることになる。

そんなこんなで,過去の習作コードをChatGPT-5に投げてバイブコーディングして得られたのが次の結果とコードである。プログラミングとはAIとの対話のことだった。

 koshi@mba2020 ~ % ./birth.jl

【基礎情報】

今日                : 2025年9月21日(日曜日)

誕生日              : 1953年9月20日(日曜日)


【差分と年齢】

生誕からの経過日数 : 26299日

満年齢              : 72歳


【年ごとの誕生日一覧】(*は日曜)  ※最終年:2025年

1953年9月20日(日曜日)  0歳  *

1954年9月20日(月曜日)  1歳  

1955年9月20日(火曜日)  2歳  

1956年9月20日(木曜日)  3歳  

1957年9月20日(金曜日)  4歳  

1958年9月20日(土曜日)  5歳  

1959年9月20日(日曜日)  6歳  *

1960年9月20日(火曜日)  7歳  

1961年9月20日(水曜日)  8歳  

1962年9月20日(木曜日)  9歳  

1963年9月20日(金曜日)  10歳  

1964年9月20日(日曜日)  11歳  *

1965年9月20日(月曜日)  12歳  

1966年9月20日(火曜日)  13歳  

1967年9月20日(水曜日)  14歳  

1968年9月20日(金曜日)  15歳  

1969年9月20日(土曜日)  16歳  

1970年9月20日(日曜日)  17歳  *

1971年9月20日(月曜日)  18歳  

1972年9月20日(水曜日)  19歳  

1973年9月20日(木曜日)  20歳  

1974年9月20日(金曜日)  21歳  

1975年9月20日(土曜日)  22歳  

1976年9月20日(月曜日)  23歳  

1977年9月20日(火曜日)  24歳  

1978年9月20日(水曜日)  25歳  

1979年9月20日(木曜日)  26歳  

1980年9月20日(土曜日)  27歳  

1981年9月20日(日曜日)  28歳  *

1982年9月20日(月曜日)  29歳  

1983年9月20日(火曜日)  30歳  

1984年9月20日(木曜日)  31歳  

1985年9月20日(金曜日)  32歳  

1986年9月20日(土曜日)  33歳  

1987年9月20日(日曜日)  34歳  *

1988年9月20日(火曜日)  35歳  

1989年9月20日(水曜日)  36歳  

1990年9月20日(木曜日)  37歳  

1991年9月20日(金曜日)  38歳  

1992年9月20日(日曜日)  39歳  *

1993年9月20日(月曜日)  40歳  

1994年9月20日(火曜日)  41歳  

1995年9月20日(水曜日)  42歳  

1996年9月20日(金曜日)  43歳  

1997年9月20日(土曜日)  44歳  

1998年9月20日(日曜日)  45歳  *

1999年9月20日(月曜日)  46歳  

2000年9月20日(水曜日)  47歳  

2001年9月20日(木曜日)  48歳  

2002年9月20日(金曜日)  49歳  

2003年9月20日(土曜日)  50歳  

2004年9月20日(月曜日)  51歳  

2005年9月20日(火曜日)  52歳  

2006年9月20日(水曜日)  53歳  

2007年9月20日(木曜日)  54歳  

2008年9月20日(土曜日)  55歳  

2009年9月20日(日曜日)  56歳  *

2010年9月20日(月曜日)  57歳  

2011年9月20日(火曜日)  58歳  

2012年9月20日(木曜日)  59歳  

2013年9月20日(金曜日)  60歳  

2014年9月20日(土曜日)  61歳  

2015年9月20日(日曜日)  62歳  *

2016年9月20日(火曜日)  63歳  

2017年9月20日(水曜日)  64歳  

2018年9月20日(木曜日)  65歳  

2019年9月20日(金曜日)  66歳  

2020年9月20日(日曜日)  67歳  *

2021年9月20日(月曜日)  68歳  

2022年9月20日(火曜日)  69歳  

2023年9月20日(水曜日)  70歳  

2024年9月20日(金曜日)  71歳  

2025年9月20日(土曜日)  72歳    

ChatGPT-5 Thinking が提案してきたコードは以下のとおりである。かなり修正してもらった。

#!/usr/bin/env julia

# birth.jl


using Dates


# --- ヘルパ ---

const WDAY_SHORT = ["月","火","水","木","金","土","日"]

const WDAY_LONG  = ["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"]


fmt_date_ja(d::Date; long_wday::Bool=true) = string(

    Dates.format(d, dateformat"yyyy年m月d日"), "(",

    (long_wday ? WDAY_LONG : WDAY_SHORT)[dayofweek(d)], ")"

)


# 引数: [YYYY MM DD [ENDYEAR]]

function parse_args()

    if length(ARGS) == 0

        return Date(1953, 9, 20), year(Dates.today())

    elseif length(ARGS) == 3 || length(ARGS) == 4

        b = Date(parse(Int, ARGS[1]), parse(Int, ARGS[2]), parse(Int, ARGS[3]))

        lasty = (length(ARGS) == 4) ? parse(Int, ARGS[4]) : year(Dates.today())

        return b, lasty

    else

        error("使い方: ./birth.jl  または  ./birth.jl YYYY M D  [ENDYEAR]")

    end

end


function list_birthdays(birth::Date, last_year::Int)

    last_year = max(last_year, year(birth))  # 下限は誕生年

    for y in year(birth):last_year

        d = Date(y, month(birth), day(birth))

        age = y - year(birth)

        star = (dayofweek(d) == 7) ? "*" : ""   # 7 = 日曜

        println(fmt_date_ja(d; long_wday=true), "  ", age, "歳  ", star)

    end

end


# --- 本体 ---

birthday, list_until = parse_args()

today = Dates.today()


println("【基礎情報】")

println("今日                : ", fmt_date_ja(today; long_wday=true))

println("誕生日              : ", fmt_date_ja(birthday; long_wday=true))


println("\n【差分と年齢】")

days_elapsed = Dates.value(today - birthday)

age_years = year(today) - year(birthday) - (Date(year(today), month(birthday), day(birthday)) > today ? 1 : 0)

println("生誕からの経過日数 : ", days_elapsed, "日")

println("満年齢              : ", age_years, "歳")


println("\n【年ごとの誕生日一覧】(*は日曜)  ※最終年:", list_until, "年")

list_birthdays(birthday, list_until)

2025年9月6日土曜日

辞任確率

サントリー新浪のニュースに干渉して行方不明になっている自民党の総裁選前倒し圧力の話。石破がこけてもその周りに見える景色が微妙なのだ。我が奈良二区のあの方が参政党と日本維新の会を両手に引き連れて颯爽と登場するのだけはやめてほしい。

報道19:30でもスシローなんかがでてきて石破おろしに向けた印象操作に必死だった。他の政治記者たちも本当に政局屋的な発言しかしない。が,たまにはエコーチェンバーの外の空気を吸わないと自分の目がどんどん曇っていくし・・・。もう一押しで臨時総裁選がスタートしそうな相転移前のゆらぎが感じられる今日この頃。

そこで,もう少し客観的な分析をChatGPTにお願いしてみた。

Q(koshix):
最新の日本の様々な政治経済文化状況を幅広く分析し,石破総理の辞任確率を時間の関数として推定してグラフにして表現してください。期間は2025年9月から1年間でお願いします。この間に様々な政治・外交イベント等も予定されているはずなのでそれらも考慮してください。

A(ChatGPT-5,2m57s):
(回答略,1年後の累積辞任確率は約60%)

Q(koshix):
情報源が英語なので,日本のメディアの政治担当の生々しい声があまり反映されていないような印象を受けました。石破がやめることにメリットを感じている旧安倍派や麻生派や茂木グループの動向,衆議院議員と参議院議員の違い,参政党,国民民主党,日本維新の会,立憲民主党などと自民党の各グループの関係,石破政権首脳陣が退任した場合の人事の可能性などの情報も含めて,再度考慮してみてください。結果は先ほどと同様にグラフのcsvでいただければありがたいです。

A(ChatGPT-5 Thinking,3m44s):
(図を与えるpythonコード,略)
まず前提と考え方を共有します。今日は2025年9月3日(日本時間)です。直近の事実として、7月20日の参院選で自公が過半数を失い、党四役(森山幹事長、鈴木総務会長、小野寺政調会長、木原選対委員長)が相次いで辞意を表明。麻生派は総裁選の前倒し要求を正式に打ち出し、茂木グループ(旧茂木派)も公然と退陣論を展開。石破首相は当面続投の意向を明確にしています。これらの日本メディアの政局報道を核に、衆参の制度差・与野党関係・派閥力学を織り込み、月次ハザード(当該月の辞任条件付き確率)を設定し、累積辞任確率を算出しました。

1.いま起きていること(日本メディア中心)
(1) 党四役の「ドミノ辞意」。森山幹事長は「進退は首相に一任」と表明。石破首相は「しかるべき時期に判断」と続投姿勢。
(2) 麻生派:研修会で麻生太郎氏が総裁選の前倒し要求を明言。派内結束を背景に“石破おろし”を押し上げる材料。
(3) 旧安倍派の再起模索と“石破おろし”の駆け引き:解散報告会後も党内で影響力を残し、前倒し論の中核の一角。
(4) 茂木グループ:茂木敏充氏が退陣を公然要求。「ポスト石破」名乗りの先頭格の一人。
(5) 与野党の“実利”関係:
・2025年度予算は「自公+維新」で修正・年度内成立(現憲法下で初の参院修正→衆院同意)。維新は高校無償化等で実利を獲得。一方で、恒常的な連立には後ろ向き。
・企業・団体献金を巡っては自公国で「5万円超公開」などの合意形成が進み、国民民主は個別案件での接近余地を残すが、連立入りは否定的なトーンが続く。
・立憲民主は主導的野党として対決色を強め、労組側(連合)も自民との大連立を牽制。
・参政党は参院で存在感を拡大し与党に圧力(政策争点が右派色に寄る)を与えるが、与党安定化のパートナーではない。
(6) 衆参の制度差:不信任は衆院のみ(可決で総辞職か解散)。参院は問責の政治的圧力が強く、会期末戦術の焦点。衆院の優越・予算先議など制度要因が政局ハザードの山を作る。

2.「いつ危ないか」の山(イベント × 力学)
・9月:四役辞意、麻生派の前倒し要求、8日前後の意思確認などでハザード急騰。
・10–11月:APEC釜山(10/31〜)・G20南ア(11/22–23)。外交大型日程は“凍結圧力”が働きがちだが、前倒し総裁選が走れば10月も高止まり。
・1–3月:通常国会の予算審議(とくに2–3月の山場)。少数与党ゆえに審議停滞・スキャンダル・問責/不信任の仕掛けが集中しやすく、最大の崖。

3.ハザードモデル(2025年9月〜2026年8月)
・月次ハザード(当該月に辞任する条件付き確率)を設定し、累積辞任確率を算出。ロジックは上記イベント群+衆参制度差+党内派閥インセンティブ(旧安倍派・麻生派・茂木グループ)と、維新・国民民主との“案件ベース協力”の持続可能性で重み付け。
・巨視的整合性:参院選敗北後の“石破おろし”が強い9–10月、会期と予算政治で2–3月を第二の山、外交大型日程の11月と年末の12月はやや低めに設定。
・CSVとグラフを作成しました:(略,下図参照)

4.主要ドライバー(日本の「政治部の肌感」を反映)
・旧安倍派:解散後も復権を模索。裏金問題の“けじめ”を石破側に迫る力学。石破続投よりも“保守再結集”の絵を描ける後継(高市・茂木・小泉ら)を歓迎しやすい。
・麻生派:首長経験者を含む選挙巧者の塊。次の衆院選で「勝てる顔」を求め、前倒し総裁選での主導権狙い。
・茂木グループ:茂木氏が公然と退陣要求。“政高党低”の修正や経済再建で「自分がやる」構図を作る動機が強い。
・衆議院 vs 参議院:衆は不信任→(解散or総辞職)という“実弾”があり、衆院議員は次の解散に敏感。参は問責の政治的効果で「国会出席止め」など実務を止めやすく、会期末の圧力手段。
・維新・国民:
→維新は予算で与党と合意形成も、連立は回避の構え。是々非々の“スイッチ”が政局の天秤。
→国民は政治資金透明化などで与党側と合意形成の実績あり。ただし連立は労組(連合)サイドも含め慎重。
・参政党:右派色の強い争点設定で保守票を分散させ、与党の議会戦術を難化させる“外圧”。

5.人事の見取り図(四役退任時の観測)
・幹事長後任の軸:解散・選挙を読む選挙管理能力、派閥横断の調整力、カネと人事の“火消し”。“旧安倍派ど真ん中”は世論的逆風を受けやすく、(1)非スキャンダル系実務家、(2)衆院の当選回数重ねた重鎮、(3)参院は党運営の要職で配し衆院優先が基本線。
・「ポスト石破」:党内世論・世論調査で名前が挙がるのは高市早苗、小泉進次郎、茂木敏充ら(順不同)。路線は対中・防衛・成長戦略で差があり、誰が四役を握るかで政権色がガラリと変わる。※ここは各社観測記事の範疇であり、確定情報ではありません。

6.感度分析(こう動けば確率はこう変える)
・総裁選の前倒しが正式決定 → 10月の月次ハザードを+0.05程度上方修正。
・維新が2026年度予算で“反対”に転じる/是々非々が崩れる → 2–3月のハザードを+0.05程度上方修正。
・国民民主が恒常的協力を明確化 → 1–3月のハザードを−0.03程度下方修正。
・参院で問責→実務停滞が深刻化 → 2–3月のハザードを+0.03上振れ。


必要なら、週次分解や「イベント日ベース」の滑らかなハザード(例:9/8、10/31、11/22、1/召集日、2–3月予算ピークなど)に拡張してCSVを再出力します。
日本メディアの“政治部の肌感”をより強く反映した追加補正も可能です(例えば、特定選挙区の補選や知事選の潮目を入れる等)。



図:石破総理の辞任確率の推移(ChatGPT-5による)

上図は,ChatGPT-5 Thinking が出力したコードを手元のjupyterで実行し,エラーをGeminiやChatGPTで潰しながら手動で修正したものである。エラーコードに適確に対応してくれる安心感はたいへんありがたいけれど,これでプログラミングの経験や知識がいらなくなるわけではない。

P. S. 9月7日に石場首相は辞任の意向を表明した。まあそんなものである。

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をブラウザに直接貼付けたところうまくいったので,これでよしとする。

2024年7月11日木曜日

サイコロの雌雄

70年以上生きていても知らないことがたくさんある。サイコロには雌雄がある(普通のサイコロは雌)というのだ。まあ,いわれてみれば,サイコロの鏡像は自分自身とは重ならない。学部の4回生のセミナーでLeeとYangのパリティ非保存の論文をさんざん読み込まされた割には,自らの不明を恥じるしかない。

さっそく,図示するため生成AIに頼るのだが,これが一筋縄では行かない。最近,巷で流行る石○構文のようなもので,空気が読み切れない部分的に論理的な無駄なやりとりの行き違いが山のように蓄積していく。ときどき一発で正解がでることもあるが,ちょっと相手の機嫌を損ねると,三途の河原送りで石を積み上げ続ける羽目に陥る。
Q(koshix):
立方体のサイコロの展開図を描画するpythonプログラムを下さい。
展開図は6つの正方形の面が接して並ぶものです。
各面には1〜6の数が適当は大きさの小丸(ドット)で表現されます。
展開図を組み立てたときに向かいあう面の数の和が7になるように配置されます。
1の面の小丸は少し大きい赤色ですが,他の面の2-6の小丸は黒です。 
A(Claude 3.5 Sonnet):
→SVGファイルが生成されて保存されるはずが失敗
→画面にも表示されないので,pngファイルに変更
→画面に出力された(OK)ので,雌雄を判定させる。

Q(koshix):
以下の定義からこのサイコロの展開図の雌雄を判定してください。

サイコロの目の割り振りは、ほぼ「天一地六東五西二南三北四」(雌サイコロ)と決まっている。これは、日本だけの特徴ではなく、世界的な共通点である。ただし、「南三」でなく「北三」になっているサイコロもあり、「南三」を雌サイコロ、「北三」を雄サイコロと呼ぶこともある(異性)。サイコロの雌雄の見分け方は、1・2・3の面が集まる頂点を正面に置き、1→2→3の順に見たときに時計回りになるのが雄サイコロ、反時計回りになるのが雌サイコロである。

→ただしく雌であると判定できた,エライ
→雌雄の両方の展開図を上下に出力させる
→日本語ラベルが文字化けしているので修正させる
→なかなか修正できず何度も失敗する
→こちらから日本語設定のサンプルコードを与える
→できた!日本語ラベルと展開図が重なっているので右シフトを依頼
→Claude 3.5 Sonnetの無料制限オーバーで停止,PROへの移行を勧められる

ChatGPT-4oに移動
Q(koshix):
サイコロの雌雄の展開図を表示する以下のpythonプログラムで,日本語ラベルと展開図が少し重なっているので,展開図を少し右に動かしてください。
Q(koshix):
今度は,展開図の右側が画面からはみ出して欠けてしまいました。なんとかなりませんか。
Q(koshix):
雄サイコロの方は向かいあう目の数の和が7になっていないところがあります。
4の目と5の目を入れ替えてください。
Q(koshix):
いや、そうではなくて,1,2,3の配置は元のままでよかったのです。それらと6はそのままで,4の目と5の目だけを入れ替えてという意味です。
Q(koshix):
雄のサイコロの2の目と3の目も入れ替わりましたよ。そこは元のままなのです。
Q(koshix):
雄サイコロはまだ直っていませんよ
この辺で,人間のほうが力尽きてしまったので,自分で修正したのが以下のコードである。賢いような・・・そうでもないような・・・プログラミングにおいて人間に最も必要とされるのは忍耐強い対話力だ。いわゆるプログラミング的思考力や論理的思考力ではない。

from PIL import Image, ImageDraw, ImageFont
from IPython.display import display
from matplotlib import rcParams
import matplotlib.font_manager as fm

def create_dice_face(draw, x, y, size, number):
    # 正方形を描画
    draw.rectangle([x, y, x + size, y + size], outline="black", width=2, fill="white")
    
    dot_positions = {
        1: [(0.5, 0.5)],
        2: [(0.25, 0.75), (0.75, 0.25)],
        3: [(0.25, 0.75), (0.5, 0.5), (0.75, 0.25)],
        4: [(0.25, 0.25), (0.25, 0.75), (0.75, 0.25), (0.75, 0.75)],
        5: [(0.25, 0.25), (0.25, 0.75), (0.5, 0.5), (0.75, 0.25), (0.75, 0.75)],
        6: [(0.25, 0.25), (0.25, 0.5), (0.25, 0.75), (0.75, 0.25), (0.75, 0.5), (0.75, 0.75)]
    }    
    dot_size = int(size * 0.15) if number == 1 else int(size * 0.1)
    dot_color = "red" if number == 1 else "black"
    
    for px, py in dot_positions[number]:
        cx, cy = int(x + px * size), int(y + py * size)
        draw.ellipse([cx - dot_size//2, cy - dot_size//2, cx + dot_size//2, cy + dot_size//2], fill=dot_color)

def create_dice_net(draw, start_x, start_y, size, is_female):
    # 展開図の配置: 
    #     [4]
    # [2][1][5][6]
    #     [3]
    faces_female = [
        (4, size, 0),        # 上面
        (2, 0, size),        # 左面
        (1, size, size),     # 前面
        (5, size * 2, size), # 右面
        (6, size * 3, size), # 後面
        (3, size, size * 2)  # 下面
    ]    
    faces_male = [
        (5, size, 0),        # 上面(4と5を入れ替え)
        (3, 0, size), # 左面
        (1, size, size),     # 前面
        (4, size * 2, size), # 右面(4と5を入れ替え)
        (6, size * 3, size), # 後面
        (2, size, size * 2)  # 下面
    ]    
    faces = faces_female if is_female else faces_male
    
    for number, x, y in faces:
        create_dice_face(draw, start_x + x, start_y + y, size, number)

def create_both_dice_nets(size=100):
    # フォントの設定
    font_path = '/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc'  # 適切な日本語フォントファイルを指定してください
    font_prop = fm.FontProperties(fname=font_path)
    rcParams['font.family'] = font_prop.get_name()
    
    # PILで使用するフォントを設定
    pil_font = ImageFont.truetype(font_path, 20)

    # 展開図の全体サイズを設定
    img_width, img_height = size * 5, size * 7 # 高さを2倍+余白に
    img = Image.new('RGB', (img_width, img_height), color='white')
    draw = ImageDraw.Draw(img)
    
    # 雌サイコロの展開図を描画
    create_dice_net(draw, 50, 20, size, True)
    draw.text((10, 10), "雌サイコロ", fill="black", font=pil_font)
    
    # 雄サイコロの展開図を描画
    create_dice_net(draw, 50, 20 + size * 3 + 50, size, False)  # 50ピクセルの余白を追加
    draw.text((10, size * 3 + 60), "雄サイコロ", fill="black", font=pil_font)
    
    return img

# 画像を生成し、Jupyter Notebookに表示
both_dice_nets = create_both_dice_nets(size=100)
display(both_dice_nets)

# PNG画像として保存(オプション)
both_dice_nets.save("both_dice_nets.png")
print("both_dice_nets.png が生成されました。")


図:サイコロの雌雄(雌 1→2→3 反時計回り,雄 1→2→3 時計回り)

P. S. 上記の配置はサイコロキャラメルで確認した。実際には,2の目,3の目,6の目の配置がそれぞれ2パターンあるので,1つの性別に対して8パターンの配置がある。普通のサイコロは,1-2-3の頂点から見て,2や3の目が頂点から放射状に配列するのではなく,頂点のまわりを取り囲むように配列していることになる。