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

2023年5月22日月曜日

Maxima-Jupyter

一月ほど前にyujitachさんが,MathematicaでHopfバンドルの図示をしていて,MathematicaからオープンソースのJupyter Notebook版にできないかと呼びかけていた。

オープンソースというかフリーの数式処理アプリというとMaximaになる。JupyterでMaximaが動くのかと調べてみると,弘前大学の葛西真寿さんによる,Maxima-Jupyterによる数式処理というサイトがあった。

早速,インストールを試みるが途中で挫折。いろいろ調べて,なんとか動くところまできたが,どうも動作がおかしい。原因は,maxima側ではなくて,jupyter側にあった。jupyter labが4回ほどの入力でおかしくなってしまう。GPT-4に尋ねてみると,ブラウザを変えてみたらとのアドバイス。SafariからChromeに変えるとどうにか動いた。なお,Jupyter notebookならSafariでもうまく動作するのである。

Maxima-Jupyterのインストールに関しては,さきほどのページにあるmacOS に Maxima-Jupyter をインストールするによった。maximaを実行した段階でzmq.hが見当たらないとのエラーになり,これを解消するために,Maximaで綴る数学の旅の2022-01-20の記事が役に立った。 
% brew install sbcl gpg zmq gnuplot
% brew edit maxima
% brew install maxima -s

[quicklispをインストール(sbcl起動時の自動読み込みまで設定)]
quicklisp.lispをダウンロード。
% curl -O https://beta.quicklisp.org/quicklisp.lisp
% curl -O https://beta.quicklisp.org/quicklisp.lisp.asc
% gpg --verify quicklisp.lisp.asc quicklisp.lisp

% sbcl
* (load "quicklisp.lisp")
* (quicklisp-quickstart:install)
* (ql:system-apropos "vecto")
* (ql:quickload "vecto")
* (ql:add-to-init-file)
* (quit)

[maxima-jupyterをインストール]
そのgithubレポジトリをクローンし展開したディレクトリに移動
% cd ~/Library
% git clone https://github.com/robert-dodier/maxima-jupyter.git

% cd maxima-jupyter
% export C_INCLUDE_PATH="/opt/homebrew/include/"
% maxima
(%i1) load("load-maxima-jupyter.lisp");
(%i2) jupyter_install();
(%i3) quit();

[jupyterを起動]
% jupyter lab

これで,Maxima-Jupyterは動いたが,Jupyter labのところで引っかかったわけだ。

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

2019年3月25日月曜日

JupyterLab

JupyterLabのすすめ」という記事があったので,JupyterLabをさっそくインストールしてみた。

退職後の4月から非常勤講師としてこれまでと同じような授業を担当する。とりあえず,現在使用しているコンピュータ(MacProやMacBookProなど)を明け渡さなければならないので,MacBookAirに新しい環境を構築して移動作業をしている。その結果,現在の自分の環境は,次のようになっている。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
※mbaの設定
(1) homebrewの導入
    xcode-select —install (コマンドライン開発ツールの導入)
    sudo xcodebuild -license
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
(2) homebrewの練習と基本環境の設定
    brew update
    brew upgrade
    brew doctor
    brew install wget
    brew install nkf
    brew cask reinstall xquartz
    brew install lynx
    brew install w3m
    brew install xxxx (xxxxをインストール)以下適当に繰り返した。
(3) python3環境(jupyterを含む)の設定
    brew install python3
    python3 -V
     Python 3.7.2
    pip3 -V
     pip 19.0.2 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
    python -V
     Python 2.7.10
    ・これで,python3がインストールできた。
    which python
     /usr/bin/python
    which python3
     /usr/local/bin/python3
    ・pip3のアップデート方法
    pip3 install --upgrade setuptools
     Requirement already up-to-date:...
    pip3 install --upgrade pip
     Collecting pip
    ...
     Successfully installed pip-19.0.3
    ・環境設定してその中で作業
    python3 -m venv env
    . env/bin/activate
    (env) … python -V
     Python 3.7.2
    (env) … pip -V
     pip 18.1 from /Users/admin/env/lib/python3.7/site-packages/pip (python 3.7)
    (env) ... pip install --upgrade pip
    (env) ... pip install --upgrade setuptools
    (env) ... pip install numpy
    (env) ... pip install scipy
    (env) ... pip install scikit-learn
    (env) ... pip install matplotlib
    (env) ... pip install Pillow
    (env) ... pip install sympy
    (env) ... pip install jupyter
    (env) ... deactivate
(4) julia環境の設定
    https://julialang.org/downloads/
    からダウンロードすればコマンドラインで実行可能に
    echo 'export PATH=$PATH:/Applications/
Julia-1.1.app/Contents/Resources/julia/bin' >> ~/.bashrc
    source ~/.bashrc
    julia
    julia> using Pkg
    julia> Pkg.add(“IJulia”)
    export PATH=$PATH:/Users/admin/env/bin
    jupyter notebook
    これで,jupyter が起動して,julia 1.1 が使えるようになった。
    versioninfo()
    using Pkg
    Pkg.update()
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(5) jupyterlabの導入と起動は簡単であった。
    pip3 install jupyterlab
    jupyter lab
(付)JupyterLab環境での設定
Settings -> Advanced Settings Editor -> Notebook
codeCellConfigのlineNumbersをTrueにする。
Settings -> Advanced Settings Editor -> Extension Manager -> "enabled": trueにする。

Mathematicaノートブックを長らく使ってきたので,Jupyter Notebook(この記事もWikipedia中文はあるが日本語はない・・・)はすんなりと馴染むことができた。JupyterLabはJupyter Notebookの後継で,今後はこれに移行するのだそうだ。まだ違いがよくわからないが,Jupyter Notebook のことだってそれほどわかっていたわけではない。ぼちぼちやっていくことにしよう。

2019年6月3日月曜日

ウルフラムとペレス

辰己さんが,Jupyterの発音は,ジュパイターではなく,ジュピターじゃないのとFacebookでつぶやいていた。これに対して中野さんは,普通はジュピターでしょと。あれ・・・,pythonオリジンだからジュパイターだと思い込んでいた私はどうしよう・・・

ということでさっそくYouTubeに尋ねてみると,いきなりIPythonJupyterの開発者のフェルナンド・ペレス2017年のJupyterConの講演にぶちあたった。はい,正解はジュピターでした。Project Jupyterにもちゃんと Jupyter=/ˈdʒuːpɪtər/ と書いてある。

ところで,そのペレスは,Pythonの対話型環境であるIPythonを,Wolfram Notebookにインスパイアーされて開発したとある。つまり,ノートブック型インターフェースの始まりは,スティーブン・ウルフラムによるMathematicaであった。その後,IPythonからスピンオフしたプロジェクトがJupyterを創り出す。Jupyterの意義は単に特定の言語の対話型環境をつくることではなく,「Project Jupyterは,オープンソースソフトウェア,オープンスタンダード,そして何十ものプログラミング言語にわたるインタラクティブコンピューティングのためのサービスを開発するために存在します」であった。Jupyter+Julia+α連合軍をみて,Wolfram言語も開放政策に舵をきったのではないか。

スティーブン・ウルフラム(1959-)はイギリス生まれで,17歳でオックスフォードに入学し,ゲルマンに誘われて18歳でカリフォルニア工科大学に入り,1979年に20歳でPh. D.をとる。専門分野は素粒子物理学の理論であったが,1981年にはMathematicaの前身のSMP(Symbolic Manupilation Program)を商業化し,複雑系の物理学の研究(Celuller Automata)を進めた。

一方,フェルナンド・ペレスはコロンビア生まれで,コロンビアのアンティオキア大学で物理学を学び,コロラド大学で素粒子物理学(格子QCD理論)のPh. Dをとる。それ以前には,フラクタル,半古典カオスなども研究しているようだ。2008年にはカリフォルニア大学バークレー校に移り,ソフトウェア開発に主軸を置くことになる。

なんだかよく似たところがある2人である。

2021年12月1日水曜日

Julia 1.7.0

11月30日にJulia 1.7.0がリリースされた。普段は,しばらく様子を見てからインストールするのだけれど,macOS Apple Siliconにネイティブ対応したようなので,早速試してみる。

メジャーバージョンアップの際には,いつも困ってしまうのだが,今回もすんなりとはいかなかった。とりあえず手順を書いてみるが,何度もやり直しているので,ヒステリシスがあるかもしれない。

 (1) julia 1.7.0 packege ダウンロード&インストール
 (2) .zshrcのパス変更 % cat .zshrc
export PATH=/Applications/Julia-1.7.app/Contents/Resources/julia/bin
 (3) ln -s /Applications/Julia-1.7.app/Contents/Resources/julia/bin/julia julia
 (4) julia -> using Pkg -> Pkg.add(“IJulia”) -> Pkg.build(“IJulia”)
 (5) brew install jupyter
 (6) jupyter kernetspec list -> jupyter kernetspec uninstall julia1.6.0
 (7) jupyter notebook -> OK
 (8) pip3 uninstall jupyterlab -> pip3 install jupyterlab
 (9) jupyter lab build -> OK


とりあえず,jupyter notebook も jupyter lab も動いたが,パッケージの整合性などからか,これまでのコードがすべてそのまま動くというわけにはいかなかった。ボチボチ様子見よう。

P. S. とりあえず,Plots 周りの不整合はなんとかなった。たいした処理をしていなくても,ときどきカーネルが死んでしまうのが問題だ。

2019年5月26日日曜日

Wolfram Engine

MathematicaWolfram|Alphaでおなじみのウルフラム(昔はウルフラム・リサーチだった)が,それらのコアになる計算エンジンをWolfram Engineという名前で,開発者向けに無償で開放した。すごい。pythonやC++で開発するアプリにライブラリとして組込むことができ,Wolfram Knowledgebaseへのアクセスができるとのこと。

各プラットフォーム用に3GB程度のアプリケーションをダウンロードし,Wolfram IDを取得すれば使用ライセンスが得られる。Mathematicaをコマンドラインから利用できるだけでなく,jupyter notebookから使える。これらのノートブック・インターフェースも元々は,Mathematica Notebook に習ったものではないかと思う。

さて,twitterで教えてもらったjupyterを使えるようにする手順は次の通り。まずWolfram Engineをインストール,ライセンスを取得しコマンドラインで起動することを確認する。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
git clone github.com/WolframResearch/WolframLanguageForJupyter.git
cd WolframLanguageForJupyter
./configure-jupyter.wls add
jupyter notebook
 または
jupyter lab
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

黒木さんの「Free Wolfram EngineをJupyterで使う方法」が例題紹介も含めて詳しい。


2023年12月22日金曜日

astropy

Pythonで太陽系の天体位置を描画してみる」というのを見つけた。python上の天文学統合データ処理環境であるastropyというライブラリを使うものだ。

jupyter lab を起動して,さっそく試してみると,いきなりmatplotlibが見つからないというところでつまづいた。以前に試したpythonのコードでは,matplotlibを読み込んでちゃんと作図がでてている。その古いコードでもエラーがでてきた。

macbook air の環境は,基本的にはhomebrew で更新しているので安心できるのだが,問題は,python環境である。python は3.9〜3.12までの複数のバージョンが同居することになっている。これは基幹ソフトなので,下手に古いものを消してしまうとややこしいのだ。そこで,一般には,python環境を指定するpyenvとかvenvで仮想環境を設定した上で,様々なライブラリを加えていくことになる。

が,ですね,それはそれで面倒なので,アドホックにバージョンアップを繰り返しながら,pip install ホゲホゲをつづけているために,わけわかめ状態になっている今日この頃なのだ。jupyterlabもバージョンが上がるたびに,見えなくなってしまうので,毎回 brew link jupyterlabを繰り返す始末だ。70歳になると,自分の体の中のDNA情報システムだけでなく,外の電子情報システムまで老化が進んでくるということだ。

まあ,macOSの場合は,機種更新の際に新規インストールすればそれなりに,なんとかなるかもしれないけれど,複雑な記録や認証情報を引き継ぐのは厄介だ。特に,iOSでは,指紋認証を含め,現金が動く認証アプリがウヨウヨいるので,次期機種更新のことを考えただけで気が遠くなりそうだ。


話を戻して,astropyについて。jupyter環境でpython kernelを立ち上げているところから,!エスケープで!pip listをやってみると,matplotlibは存在している。!pip install matplotlib でも致命的エラーはでない。ChatGPTに相談してみると,カーネルがどうなっているか確認せよとのこと。
 jupyter kernelspec list
  python3              /opt/homebrew/Cellar/jupyterlab/4.0.9_2/libexec/lib/python3.12/site-packages/ipykernel/resources
  julia-1.9            /Users/koshi/Library/Jupyter/kernels/julia-1.9
  maxima               /Users/koshi/Library/Jupyter/kernels/maxima
  wolframlanguage12    /Users/koshi/Library/Jupyter/kernels/wolframlanguage12
はいはい,表に見えていたのは python3.11.6だったけれど,実は,python.12.1が使われており,ここにはmatplotlibが入っていませんでした。さっそく,このポイントで,matplotlibとかscipyとかastropyとかpytest-astropyとかをpipでインストールした。別の参考資料に指示があった,astropyが正しく導入できているかどうかのテストも,試行錯誤の後にOKとなった。

   cd /opt/homebrew/Cellar/jupyterlab/4.0.9_2/libexec/bin

   ./pip install astropy

   ./pip install ephem

import astropy as ap
>>> ap.test()
platform darwin -- Python 3.12.1, pytest-7.4.3, pluggy-1.3.0

Running tests with Astropy version 6.0.0.
Running tests in lib/python3.12/site-packages/astropy.

Date: 2023-12-19T22:26:53
Platform: macOS-14.2-arm64-arm-64bit
Executable: /opt/homebrew/Cellar/jupyterlab/4.0.9_2/libexec/bin/python
Full Python Version: 
3.12.1 (main, Dec  7 2023, 20:45:44) [Clang 15.0.0 (clang-1500.0.40.1)]
encodings: sys: utf-8, locale: UTF-8, filesystem: utf-8
byteorder: little
float info: dig: 15, mant_dig: 15

Package versions: 
Numpy: 1.26.2
Scipy: 1.11.4
Matplotlib: 3.8.2
h5py: not available
Pandas: not available
PyERFA: 2.0.1.1
Cython: not available
Scikit-image: not available
asdf-astropy: not available

Using Astropy options: remote_data: none.

rootdir: /opt/homebrew/Cellar/jupyterlab/4.0.9_2/libexec
plugins: astropy-0.11.0, remotedata-0.4.1, hypothesis-6.92.1, cov-4.1.0, filter-subpackage-0.1.2, astropy-header-0.2.2, anyio-4.1.0, mock-3.12.0, doctestplus-1.1.0, arraydiff-0.6.1
collected 28085 items / 5 skipped  

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
========== 27425 passed, 425 skipped, 240 xfailed, 80 warnings in 184.56s (0:03:04) ===========
<ExitCode.OK: 0>
ところが,やっぱりもとの太陽系の天体位置描画が動かない。最後に,Animation関数中のblit=False をblit=Trueにしてようやく何か表示されてほっとしたが,そこまでで内部にエラーがあるとのメッセージが出て異常終了してしまった。チーン。


図:ここまでは出たけれどアニメーションにはなっていなかった残念な図

astropyはイメージ処理やデータ処理を本業とした,プロ用の本格的なシステムだった。

2023年1月17日火曜日

Pythonのタートルグラフィックス

Π角形からの続き

Pythonで同じようなタートルグラフィックスが使えないかと調べると,turtleという呼ばれるライブラリがあらかじめ用意されており,楽勝かと思われた。

お絵書きでPythonを学ぶというページにしたがって,コマンドラインで実行してみると,画像が出ない。どうやら,pythonからtcl-tkへのつなぎが必要らしい。brew install python-tk とごそごそやっていたらすぐ動くようになった。

落とし穴があった。インタラクティブな実行ではなく,プログラムファイルを作って一括処理を試みたときだ。見本のファイル名をturtle.pyとしたのがまずくて,循環参照のエラーが出てしまった。その原因がわからなくて踠いていたが,こういうときはエラーメッセージで検索するのが一番である。ファイル名をkame.pyとして事無きを得た。

次により大きな罠が控えていた。jupyter環境でpythonを実行させるほうが便利だろうと,kame.pyのコードをjupyter lab で実行させたところ,_tkinterが見つからないエラーで一歩も進めない。ネットの記事にはpyenvコマンドを駆使して,pythonを一回アンインストールしてからtcl-tkをインストールした上で,再度pythonをインストールすればよいとある。

その手順通りのままには進めずに四苦八苦したものの,指示通りにコマンドラインからtcl-tkを使ったライブラリが正しくインストールできたようには見えた(これは最初の段階と本質的には変わっていない)。それでもjupyterでは同じエラーが出てだめなのだ。どうやら,jupyterのpythonではturtleが使えないということになっているらしい(未確認)。

ProcessingのプログラムをPythonに移植したものを次に示す。

#!/opt/homebrew/bin/python3

# usage ./kame.py m n 

import turtle

import sys


m = float(sys.argv[1])

n = float(sys.argv[2])

r = 0

g = 0

b = 0

turtle.colormode(255)


turtle.begin_fill()

for i in range(255):

    r = (r+3) % 25

    g = (g+5) % 255

    b = (b+7) % 255

    turtle.pencolor(r,g,b)

    turtle.forward(200)

    turtle.left(360/m*n)

turtle.end_fill()


turtle.done()

pythonのトレーニングをしたと思うことにする。コマンドラインでm,nは入力しているが,簡単な有理数でないものを入れたい場合は,m=3.1415926 n=1 を代入すればよい。

図:pythonのΠ角形タートルグラフィックスの途中

2021年5月18日火曜日

MacBook Air M1(4)

 MacBook Air M1(3)からの続き

4月18日にMacBook Air M1 がやってきてからちょうど1ヶ月になる。このところCPU負荷がつねに30-40%を越えて,CPU温度が70-80℃となっていた。Apple シリコンのM1チップを搭載したMacは発熱が少ないのが特徴だったはずなのになぜだ。すべてのアプリを終了させてスリープした状態で一晩寝かせ,朝を迎えてもパームレスト部分が暖かいのである。

さすがにおかしいと思って,アクティビティモニタで調べてみると,なんとアンチウィルスのSophosが非常に大きなCPUタイム消費の原因だった。さっそくこれを取り除いた。ウィルス対策は,ClearnMyMacのアンチウィルス機能に頼ることにする。おかげで,CPU負荷は5%,温度は35℃前後まで下がった。やれやれ。

なお,MacBook Air M1(2)で書いていた「jupyterlabが動かない問題」はしばらく前に以下のようにして解決した。これで残ったのは pythonの機械学習ライブラリ scikit-learn が動かないことくらいである。

/opt/homebrew/opt/python@3.9/bin/python3.9 -m pip install --upgrade pip
pip3 install jupyterlab
jupyter lab -> error
jupyter lab build -> error
brew install node.js
jupyter lab build
jupyter lab

2021年5月21日金曜日

Rをjupyterで

 ラベル付き散布図を描きたいのだ。なかなかうまく探しきれず,Rが一番手っ取り早そうなので,Rをjupyterから使えるようにすることを試みた。

とりあえず,brewでRをインストールすると最新のarm版だった。

brew install R
R —version
R version 4.1.0 (2021-05-18)
次にコマンドラインでRを起動し,R環境の中で3つのコマンドを実行する[1]。
>install.package(“devtools”) … CRAN ダウンロードは Japan/Tokyo 47 から

1つ目のコマンド(上記)で次のエラーが出てしまった。

>1: install.packages("devtools") で:
> installation of package ‘gert’ had non-zero exit status
>2: install.packages("devtools") で:
> installation of package ‘usethis’ had non-zero exit status
>3: install.packages("devtools") で:
> installation of package ‘devtools’ had non-zero exit status
>> Configuration failed to find libgit2 library. Try installing:
> * brew: libgit2 (MacOS)

そこで,brewでlibgit2をインストールしてから再挑戦する。
brew install libgit2
R
> install.packages("devtools")
> devtools::install_github("IRkernel/IRkernel")
> IRkernel::installspec()
jupyter lab … これで OK!
これでうまくいった。

写真:jupyterlabの起動画面

2021年5月22日土曜日

ラベル付き散布図

Rをjupyterでからの続き 

ラベル付き散布図と格闘している。

(1) Excel が一番簡単そうで,調べるとすぐに事例が見つかった。しかし,これはWindows版の場合であり,残念ながらMac版(Microsoft Office 2019 Home & Student)にはその機能がなかった。

(2) Rは統計グラフがお手の物のはずなので多分あるだろう。そこでRをjupyter上に持ってきた。これも簡単に事例が見つかった。見本通りにやってみると,

#今回使うライブラリ
library(maptools)
#データの準備
CC <- c("CAN","DNK","FIN","FRA","DEU","ITA","JPN","KOR","NLD","POL","SWE","GBR","USA")
PAR <- c(13.7,15.7,16.6,16.6,20.2,20.1,22.1,10.3,14.9,13.5,17.6,15.6,12.8)
SE <- c(3.8,7.4,8.6,11.5,8.5,12.2,9.3,1.9,5.4,8.9,9.4,6.2,5.5)
sample <- data.frame(PAR, SE)
rownames(sample) <- CC
以下のerrorが出て(これは例題に対しては実害はなかったが)日本語も化けてしまう。

Checking rgeos availability: FALSE
Note: when rgeos is not available, polygon geometry computations in maptools
depend on gpclib, which has a restricted licence. It is disabled by default;
to enable gpclib, type gpclibPermit()

ただ,日本語文字化けを避けるには(エラーは残るものの),次のようにすればよかった。
par(family= "HiraKakuProN-W3")
plot(sample$PAR, sample$SE, xlab="65歳以上人口比率(%)", ylab="対GDP比高齢者向け社会支出(%)")
pointLabel(x=sample$PAR, y=sample$SE, labels=rownames(sample))
図 R on jupyter のラベル付き散布図の例

(3) juliaではラベル付き散布図の例が探せなかったが,labelled scatter をキーワードとするといとも簡単に解が見つかってしまった。こちらは日本語もすんなり通ってくれる。

2023年5月23日火曜日

JuliaのPyCallとSymPy

Maxima-Jupyterからの続き

Mathematicaの代替となるフリーの数式処理言語として,Maximaが候補にはなったが,やはり何となく使いにくい。Jupyter上のmaximaで終端記号のコロンを忘れるだけで毎回大量のエラーメッセージが出るのにも閉口する。

とすれば,Juliaで数式処理ということになる。標準的な手法としては,Pythonの数式処理モジュールであるSymPyを使えばよいが,先日からPython 呼び出しのPyCallとSymPyがエラーになっている。実害がなかったので放置していたけれど,再度見直してみた。

これまでは,googleで問題解決を図っていたが,必要な情報にたどり着くまではいくつものサイトを渡り歩く必要があった。そこに登場したChatGPTはかなりよい仕事をしてくれるので助かる。問題は,PyCallにあったので,エラーコードを与えて尋ねてみた。
Q:User
Juliaで,PyCallとSymPy がうまく動きません。
例えば,
(中略)
Error building `PyCall`: 
どうしたらいいでしょう。

A:ChatGPT
問題は、おそらく libpython が見つからないために発生しているようです。以下の手順で問題を解決してみてください。

Julia REPLを終了して、再度起動してください。

次に、次のコマンドを実行して、PyCallを再構築し、環境変数を設定してください。
julia
Copy code
ENV["PYTHON"] = "/Users/koshi/.julia/conda/3/bin/python"
import Pkg
Pkg.build("PyCall")

もしまだ問題が解決しない場合、次の手順を試してください。
(中略)
もしまだ問題が解決しない場合、PYCALL_DEBUG_BUILD 環境変数を設定して、デバッグ情報を取得してみてください。
(中略)

これで、エラーが発生している理由に関する追加情報が得られるはずです。その情報を使用して、問題を特定し、解決策を見つけることができます。

SymPyの問題が解決しない場合、まずPyCallが正常に機能していることを確認してください。その後、SymPyの再構築を試みてください。

これらの手順のいずれかが、PyCallとSymPyの問題を解決するはずです。それでも問題が解決しない場合は、エラーメッセージとともに質問してください。

で最初のPYTHON環境変数を /opt/homebrew/bin/python3.11 に置き換えて(だったかな?) なんとかクリアすることができた。

2026年2月14日土曜日

コンピュータ環境



図:コンピュータ環境整備を支援するAI(ChatGPTによる)

【事例1】
MacBook Air M1を使っているが,1TBのSSDの使用領域は半分ほどだった。ところが先日,気がつくと,残量が100GBを切ったという警告が出てきた。えっ。となって,あれこれ不要アプリなどを消したものの,残量は150GBくらいにしかならない。仕方がないので,ChatGPTに相談してみた。
Q(koshix):
MacBook Air M1 (macOS 26.2)の ~/Library/Application Support/Microsoft/EdgeUpdater が 20 GB 近くもあって,ディスクを占有しているのですが,削除して構いませんか。Excel Word PowerPoint などのMicrosoftアプリはそのまま使い続けたいです。

Q(koshix):
~/Library/Group Containers が 16 GBもあって,消したいのですけれど,どうですか。
du -h -d 1 "$HOME/Library/Containers" | sort -h | tail -n 30 などで次々と問題点が芋蔓的に見つかった。怪しい部分を個別撃破しようとしたが,そのうち,もっと本質的な問題があったことが発覚した。
Q(koshix):
SSD領域 1 TB のうち,システムデータで 400 GB,自分のローカルで350 GBつかっているのですけど,システムデータはこんなものですか?

A(ChatGPT):
400GB の「システムデータ」は 普通ではないです。よほど特殊な使い方(巨大な仮想マシン/開発環境/動画編集のキャッシュ/iCloud・写真のローカル保持/Time Machine スナップショットが大量)でない限り、1TB Mac でシステムデータが 400GB は“異常に大きい側”に入ります。
あらら,そうですか。あれこれ,指示された情報をいれていくと,TimeMachineのスナップショットが主犯であることがわかって,無事にスリム化が完了した。

【事例2】
macOS26.2では,Homebrew でフリーソフトパッケージを管理している。毎朝,brew cleanup; brew update; brew upgrade; brew doctor を実行するのが日課だ。いつからか,jupyterlab だけ,追加の brew link jupyterlab という操作を要求されるようになったが,そのままにしていた。これはどうも不可避のようで,いやならpipx でいれなさいということなのだが,自動で更新してくれないので,ここはパスする。

もうひとつは,このjupyter 環境におけるpythonの利用だ。jupyterlabがバージョンアップすると,毎回 cd /opt/homebrew/Cellar/jupyterlab/4.5.4/libexec/bin で移動して,./python3.14 -m pip install --upgrade pip 以下各モジュールの入れ直しが発生していた。これもなんとかならないかとChatGPTに相談したところ(早く聞けば良かった),次の代替案が提案された。

A(ChatGPT 5.2 Thinking):
(前略)
方案A(おすすめ):“固定の venv” を作って、その Python を Jupyter のカーネルにする。
Homebrew で JupyterLab を更新しても、カーネル側の Python 環境は不変にできます。
ポイントは「Cellar の python じゃなく、別場所の venv を使う」こと。

1) venv を作る(例: ~/venvs/jlab)
python3 -m venv ~/venvs/jlab
source ~/venvs/jlab/bin/activate
> python -m pip install -U pip 
> pip install matplotlib japanize_matplotlib pandas reportlab
> pip install cartopy geopandas
> pip install ipykernel

 ということで,こちらのほうは無事に解決できた。

2026年4月21日火曜日

ヒマワリ

ひまわりからの続き


図1:黄金比がつくる向日葵の種のシミュレーション


放送大学の自然科学の授業で,岸根順一郎さんが向日葵の種の配列のシミュレーションを見せていた。自然は黄金比を選んでいるというわけだ。バラメタを少し変えるといろいろな模様が出現する。

自分でも試してみたくて,バイブコーディングに走る。ChatGPT Auto で試したところ,Juliaに慣れていないせいか,なかなかエラーが消えない。しょうがないので,ChatGPT Thinking-5.4 でリセットしてからお願いする。プロンプトは以下のとおり。
Q(koshix):
Jupyter環境で,次のJulia プログラムをつくってください。 向日葵の種(塗りつぶした色つき小円でよい)の分布が 1粒ずつ内側から充足されていくインラインアニメーション。 これで意味が分かりますか? なるべく簡素で高速なものにしてください。

種の大きさや色相,パラメタの変更機能などを注文すると,「Julia で毎回 GIF や mp4 を作るより、Jupyter セル内に HTML/JavaScript の小さな UI を埋め込む 方がずっと軽くて速いです。」ということで,修正版ができた。饅頭の薄皮だけJuliaで中身の餡子はすべてJavascriptというよくわからないけど,よくあるパターンらしい。

最後に,Gemini Pro に投げてコード全体を簡素化してもらったところ,少しスッキリした。黄金比の部分を変えると,様々なパターンが現われる。

この中からJavascriptのコードを含むhtmlを取り出して,独立で動くように修正し,角度係数αを,1.60〜1.83まで0.01刻みで変化させた結果を合成した画像も,ほとんどそのまま出力してくれた。プロンプトを0.1刻みと間違えて入力しても,正しく解釈してくれる。



図2:α = 1.60〜1.83までの向日葵パターンの変化



using UUIDs

function sunflower_simulator()
    uid = "sf_" * replace(string(uuid4()), "-" => "")

    html = """
    <div id="$uid" style="font-family: sans-serif; line-height: 1.4;">
      <div style="margin-bottom: 0.6em;">
        <label>角度係数 α (2π/α): <input id="$(uid)_alpha" type="number" value="1.61803398875" step="0.0001" style="width: 8em;"></label>
        <span style="margin-left:1em;"></span>
        <label>粒数 N: <input id="$(uid)_N" type="number" value="500" step="50" style="width: 5em;"></label>
        <span style="margin-left:1em;"></span>
        <label>速度: <input id="$(uid)_step" type="number" value="5" step="1" min="1" style="width: 4em;"></label>
        <span style="margin-left:1em;"></span>
        <button id="$(uid)_run">実行</button>
      </div>

      <div style="margin-bottom: 0.5em; color: #444; font-size: 0.95em;">
        α を黄金比 φ ≈ 1.618 にすると、回転角 2π/α ≈ 222.5° になります。<br>
        ひまわり配列でよく使う黄金角 137.5° とは、向きが逆なだけで本質的に同じです。
      </div>

      <canvas id="$(uid)_canvas" width="520" height="520" style="border:1px solid #ddd; background:white;"></canvas>
      <div id="$(uid)_info" style="margin-top:0.5em; color:#333;"></div>
    </div>

    <script>
    (function() {
      // DOM要素の取得を簡素化
      const get = id => document.getElementById(`$(uid)_\${id}`);
      const [alphaIn, nIn, stepIn, runBtn, canvas, info] = ["alpha", "N", "step", "run", "canvas", "info"].map(get);
      const ctx = canvas.getContext("2d");
      let animId = null;

      function runOnce() {
        if (animId) cancelAnimationFrame(animId);
        
        const alpha = parseFloat(alphaIn.value);
        const N = Math.max(1, parseInt(nIn.value));
        const step = Math.max(1, parseInt(stepIn.value));

        if (!isFinite(alpha) || alpha === 0) {
          info.textContent = "α は 0 でない数を入れてください。";
          return;
        }

        info.textContent = `α = \${alpha.toFixed(6)}, 回転角 = \${(360 / alpha).toFixed(3)}°, 粒数 = \${N}, 速度 = \${step}`;

        // シード配列の生成 (Array.from でスッキリ記述)
        const angle = 2 * Math.PI / alpha;
        const seeds = Array.from({length: N}, (_, i) => {
          const k = i + 1;
          const r = Math.sqrt(k);
          return {
            x: r * Math.cos(k * angle),
            y: r * Math.sin(k * angle),
            color: `hsl(\${25 + 55 * (k / N)}, 90%, 59%)` // HSV(h, 78%, 96%) とほぼ同等のHSL色
          };
        });

        const W = canvas.width, H = canvas.height;
        const scale = 0.48 * Math.min(W, H) / (Math.sqrt(N) + 1);
        const rad = Math.max(0.9, 140 / Math.sqrt(N + 20));

        let k = 0;
        
        // 描画とアニメーションループを統合
        function tick() {
          k = Math.min(k + step, N);
          
          ctx.clearRect(0, 0, W, H);
          ctx.save();
          ctx.translate(W / 2, H / 2);
          
          for (let i = 0; i < k; i++) {
            ctx.beginPath();
            ctx.arc(seeds[i].x * scale, seeds[i].y * scale, rad, 0, 2 * Math.PI);
            ctx.fillStyle = seeds[i].color;
            ctx.fill();
          }
          ctx.restore();

          if (k < N) animId = requestAnimationFrame(tick);
        }
        
        tick();
      }

      runBtn.onclick = runOnce;

      // Enterキーでの実行イベントをまとめる
      [alphaIn, nIn, stepIn].forEach(el => 
        el.addEventListener("keydown", e => e.key === "Enter" && runOnce())
      );
    })();
    </script>
    """

    display("text/html", html)
end

sunflower_simulator()

2026年5月6日水曜日

アレコレたいへん

iCloudもたいへんからの続き


図:アレコレたいへんのイメージ(ChatGPTによる)


今日は今日とて,また一日ややこしい作業に振り回された。それというのも,なまじ生成AI(LLM)が賢いからだ。彼らは簡単にコードを作るだけでなく,ソフトウェアやコンピュータ回りの設定や環境についても,膨大な知識を持って具体的に助言・提案してくれる。

こちらは,エラーメッセージや問題点を丸投げコピペするだけで,解決に近づいていく。まあ,ときどき間違ったこともいうのだが,ほとんど自宅に学生アルバイトのコンサルタントが常駐しているのと同じなのである。これをちゃんと使いこなせれば,老人のIT設定どうしましょう問題も多少改善しそうだが,普通は生成AI(LLM)の設定のところで詰んでしまう。


iCloudの山を越えたことに油断して,MacBookAir M1 の掃除に着手した。自分のホームディレクトリがゴミだらけだったので,そのディレクトリリストを丸投げして助言してもらった。特にhomebrewで次々と実験的にインストールしたソフトウェア断片を何とかしたかったからだ。

アドバイスに従って,作業していくとかなりきれいになったつもりだったが,肝腎のjupyter lab でjuliaやpythonを動かそうとするとこけてしまった。調子に乗ってよけいなものまで捨ててしまったからだ。いや,ChatGPTは注意してくれていたのですよ。それを無視して勝手に暴走した自分が悪い自己責任なのだけど,暴走させたのは彼らだ(それは責任転嫁・・・)。

なんとか復活し,ディスクの使用量が55%からおよそ50%まで削減することができた。まあいっか。

2019年5月9日木曜日

スリンキーの自由落下(1)

@sekibunnteisuu @irobutsu @Yh_Taguchi @Hal_Tasaki @genkuroki などで以前から話題になっていたスリンキーの自由落下をようやくいまごろ目にした。最も簡単な力学モデルについて,田口さんがすでにQiitaに書いているのだけれど,自分でもやってみた。黒木さんのjuliaの計算は凄いし,田崎さんの物理的説明もわかりやすいし,前野さんの動画もおもしろいのだった。

質量$m_1$の粒子1と質量$m_2$の粒子2が,自然長 $L$,バネ定数 $k$ の軽いバネの両端に取り付けられている。粒子1を原点に置いて支えながら,鉛直下方に静かにバネを垂らすと粒子2は $x=L+m_2 g /k $の位置で静止する。時刻 $t=0$ で粒子1の支えを静かに取り去ると,2つの粒子は重力とバネの弾性力によって運動を開始する。

運動方程式と初期条件は,
\begin{equation}
\begin{aligned}
m_1 \ddot{x} _1 &= m_1 g + k (x_2 - x_1 - L)\\
m_2 \ddot{x} _2 &= m_2 g - k (x_2 - x_1 - L)\\
x_1(0) &= 0, \quad \dot{x}_1(0)=0\\
x_2(0) &= L+\frac{m_2 g}{k}, \quad \dot{x}_2(0)=0
\end{aligned}
\end{equation}
 ここで,重心座標 $x_G=(m_1 x_1 + m_2 x_2 )/M$ と相対座標 $x=x_2-x_1$ を導入する。ただし,全質量を $M=m_1+m_2$ ,換算質量を $\mu = m_1 m_2 /M $ とする。

運動方程式と初期条件は,
\begin{equation}
\begin{aligned}
M \ddot{x}_G &= M g \\
\mu \ddot{x} &=  - k (x - L)\\
x_G(0) &= \frac{m_2}{M} (L+\frac{m_2 g}{k}), \quad \dot{x}_G(0)=0\\
x(0) &= L+\frac{m_2 g}{k}, \quad \dot{x}(0)=0
\end{aligned}
\end{equation}これを解くと,$\omega = \sqrt{k/\mu}$として,
\begin{equation}
\begin{aligned}
x_G(t) &= g t^2 /2 + \frac{m_2}{M} (L+\frac{m_2 g}{k})\\
x(t) &= L+ \frac{m_2 g}{k} \cos \omega t\\
x_1(t) &= g t^2/2 + \frac{m_2 g}{k}(\frac{m_2}{M} - \frac{m_2}{M} \cos \omega t)\\
x_2(t) &= L+ g t^2/2 + \frac{m_2 g}{k}( \frac{m_2}{M} + \frac{m_1}{M} \cos \omega t)
\end{aligned}
\end{equation}

これをMathematicaでグラフ化すると,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
x1[t_] := g/2 t^2 + m2 g/k 
(m2/(m1+m2) - m2/(m1+m2) Cos[Sqrt[(m1+m2)k/(m1*m2)]t])
x2[t_] := L + g/2 t^2 +  m2 g/ k

(m2/(m1+m2) + m1/(m1+m2) Cos[Sqrt[(m1+m2)k/(m1*m2)]t])
k = 5; m1 = 1; m2 = 1; g = 10; L = 1;
Plot[{-x1[t], -x2[t], -x2[t] + L}, {t, 0, Pi/4}]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


[1]積分定数:ばねの落下(togetterまとめ)https://togetter.com/li/1345873
[2]前野昌広:コイルバネの落下 https://twitter.com/irobutsu/status/1125581991645081600
[3]田口善弘:ばねの落下 https://qiita.com/Yh_Taguchi/items/e0d82f28447a8d5a2726
[4]W. G. Unluh:(堀田さん紹介)The Falling Slinky https://arxiv.org/abs/1110.4368
[5]田崎晴明:ばねでつながれた粒子の運動 http://www.gakushuin.ac.jp/~881791/mathbook/pdf/slinky20190509.pdf
[6]黒木玄:落下するバネ https://nbviewer.jupyter.org/gist/genkuroki/e317b4b2dd5c19e6b228b75f420aa699

スリンキーの自由落下(2)に続く

2021年4月24日土曜日

MacBook Air M1(3)

 MacBook Air M1(2)からの続き

前回,Processingが動かないと言ったが,正しいJDKが入っていなかったからなのかもしれない。arm対応のJDKが,AZULから入手できた。OpenJDK Runtime Environment Zulu16.28+11-CA (build 16+36) ということで,Processing 4.0α3をインストールしたところ無事に動作した。

その他は次のとおり

(1) Wolfram Engine 12の導入ができた。これをjupyterで実行したところ,無事にMathematicaが動作したが,バージョンが12.2かどうかはわからなかった。これが起動している状態では,カーネルの動作数が制限を越えたということで,元々インストールしていた Mathematica 12.0は動かなかった。

(2) iPad Proを sidecar で繋ぐことができた。ミラーリングでも別ディスプレイでも動くことは動くのだけれど,なぜか想像していた動作とは違うのと,本体の解像度が勝手に変わったりして微妙に使いにくい。macOSX用の GoodNotes 5 があるので,なんとかタブレット代わりには使えるとは思うが,AirDrop が優秀なのでつながなくても十分に使えてしまう。

(3) Time Capsuleのタイムマシンが動いた。無線でつながっている上に,2TBのハードディスクが遅いので,フルバックアップに10時間ほどかかるがそれでも一応の安心感は得られる。

(4) Apple USB スーバードライブがつながった。ドライブが空の状態ではデスクトップにアイコンが表示できないのでどうかと思ったが,ディスクを入れると無事に認識してアイコンが表示された。

(5) iPhone SE2 のバックアップができた。このためMacBook Air M1の1TBストレージの使用量は330GB,残量は700GBを切った。

(6) 環境設定のキーボードで指定した後も,標準の日本語入力で\と¥の入れ替えがうまくいかないような気がしたが,今日は正しく動作している。なんだったのか?



2023年2月23日木曜日

wolframscript

Wolfram Engine からの続き

ChatGPTは,因数分解ができないので,Wolfram Alphaと連携すればよいという話について。

ChatGPT数学が苦手である。Stephen Wolframもそう言っている。BingChatに聞いてみると,WolframAlphaのAPIを使う必要があるようだ…というかそんなことは先刻承知。それにはライセンスが必要なので少々ためらう。何か他の方法はないものかと眺めていると,wolframscriptというWolfram言語のコマンドライン版が見つかった。

とりあえずインストールしてみようと(すでに当初の目的から話がずれつつある),確かめてみれば,自分のMacBook Air M1には既にインストール済みだった。以前,JupyterでWolfram言語を使うためにWolfram Engineを導入した時にインストールしていたらしい。うかつなことだ。

最近,Mathematica本体を立ち上げるのが億劫な場合,コマンドラインでフリーのMathicsを使うことが多かった。ただ機能はかなり制限されている。今回,はじめて wolframscript を実行してみると,Mathicsよりは大分制限が少ないというか,インストール済みのMathematica 12.0 の機能がフルに使えるのかもしれない。そこで次のような単独で実行可能なスクリプトも組めるのだった。拡張子は .wls である

#!/usr/local/bin/wolframscript


(* ::Package:: *)


n=ToExpression[$ScriptCommandLine[[2]]]

Print[RandomInteger[{1,6},n^2]]

コマンドライン引数(文字列変数)が,$ScriptCommandLine[[2]]以下で取得できる。これを整数型に変換するために,ToExpression[] 関数を使った。これで,プログラム外から与えた変数に対して,Wolfram言語での処理が可能になる。

[2]WolframScript(Wolfram言語&システム ドキュメントセンター

2019年1月14日月曜日

Juliaにおける変数のクリア

Jupyter 上の Juliaでいろいろな作業をしていると,使用している変数や関数の名前が重なってしまうことがある。Ver. 0.6には,workspace() というコマンドがあって,変数のバインディングをクリアできたようだが,Ver. 1.0ではこの機能がなくなっている。対処法を調べてみたのだが・・・

(1) Revise.jl を用いる。ちょっと違うような感じ。

(2) a=nothing  とする。ちょっと違うような感じ。

(3) 以下のコードを実行する(Startup.jl に導入),ちょっと違うような感じ。

function workspace()
 atexit() do
  run(`$(Base.julia_cmd())`)
 end
 exit()
end

これならば,Kernelの再起動でよいのか。


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)