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

2024年4月16日火曜日

purl

Zennのあたりに五万度が一つ落ちていたのでインストールしてみた。

普段は,brew もしくは pip もしくはパッケージでしかインストールしないので,makeするのは久しぶりだ。プログラミング言語は,go でインストールしていたはずだったが見つからないのでbrewで再インストール。Github のcatasuy/purlからソースコードを引っ張ってきて,makeするだけ。.gitがないといわれたので,空の.gitを作ってやり直しているうちに出来ていた。

purl というコマンドだ。sed や grep では正規表現がperl互換ではなくて使いにくいことや,perlのone linerでもいろいろ不都合があるということで開発されたものだ。特徴は,perl 正規表現互換で,OS非依存で,軽量で,オプションがわかりやすいということ。もちろん日本語OKだ。

コマンドの実行例は
(1) purl -replace "@search@replace@" sample.txt 置換確認
(2) purl -overwrite -replace "@search@replace@" sample.txt 置換実行
(3) cat sample.txt | purl -replace "@search@replace@" パイプライン
(4) purl -filter "error" -filter "warning" sample.txt 複数ファイルフィルタ
(5) purl -exclude "debug" -exclude "info" sample.txt 複数ファイル除去

普段の作業は,正規表現を用いて次のように実現できた。

purl -replace "@^.*staff@@" spr.txt > spr0.txt



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年10月17日火曜日

久々のJulia

プログラミングはAIに任せる時代になってしまったので,自分でコードを書くのは棋士の卵が詰め将棋の練習をしているようなことかもしれない。

Homebrewでmacにインストールされているソフトウェアを定期的に更新しているが,jupyterlabは,毎回,手動により brew link jupyterlab をすることを強いるのでうっとうしい。そんなこともあって,しばらくJuliaから足が遠のいていた。

鈴木貫太郎のYouTubeの数学の問題では,しばしば,整数の冪を比較するような問題が登場する。そこで,2^m と3^n が非常に近くなるような整数を探してみようと思った。m,nを1から順に条件を判定しながら増やしていけばよいかと思ったけれど,実際にコードを書いてみると,面倒なロジックは組まずに虱潰しに調べたほうが簡単そうであった。

久々にプログラミングすると,浮動小数点数から整数への変換がどうなっているかなど,基本的なところを忘れてしまっている。困ったものだ。これはconvert(T, x)だと書いてあったのだが,エラーになる。ChatGPTに相談してみたら,floor(T,x)とceil(T,x)を使いなさいとのことだった。その結果が次のコードである。
function dt(N,eps)
# N=1000000
# eps = 1.0e-6
ratio = log(2)/log(3)
    for i in 1:N
        jmin = floor(Int64,i*ratio)
        jmax = ceil(Int64,i*ratio)
        for j in jmin:jmax
            sol = i*log(2) - j*log(3)
            if abs(sol) < eps
                println("  2**",i,"/","3**",j," = ",exp(sol))
            end
        end
    end
end

for k = 1:8
    N=10^k
    eps=1/N
    println("N=",N," eps=",eps)
    @time(dt(N,eps))
end
N=10 eps=0.1
  2**8/3**5 = 1.0534979423868305
  0.000176 seconds (98 allocations: 2.750 KiB)
N=100 eps=0.01
  2**84/3**53 = 0.9979140462573083
  0.000160 seconds (97 allocations: 2.562 KiB)
N=1000 eps=0.001
  0.000003 seconds
N=10000 eps=0.0001
  2**1054/3**665 = 0.9999563468421858
  2**2108/3**1330 = 0.9999126955899699
  0.000351 seconds (207 allocations: 5.609 KiB)
N=100000 eps=1.0e-5
  2**50508/3**31867 = 0.9999927350845753
  0.000408 seconds (103 allocations: 2.656 KiB)
N=1000000 eps=1.0e-6
  2**301994/3**190537 = 1.0000000644940903
  2**603988/3**381074 = 1.0000001289881848
  2**905982/3**571611 = 1.0000001934822835
  0.003297 seconds (311 allocations: 8.562 KiB)
N=10000000 eps=1.0e-7
  2**301994/3**190537 = 1.0000000644940903
  0.027930 seconds (105 allocations: 4.938 KiB)
N=100000000 eps=1.0e-8
  2**85137581/3**53715833 = 0.9999999925494194
  0.264204 seconds (229 allocations: 17.953 KiB)

 いちおうできたことにしておこう。

2023年7月7日金曜日

Bluesky(2)

Bluesky(1)からの続き

いよいよTwitterがややこしくなってきた。7月1日,イーロン・マスク(1971-)はTwitterアカウントの種類に応じて一時的に閲覧回数の制限を設けた。認証済みアカウントは6000件(1万件),未認証アカウントで600件(1000件),作成されたばかりの未認証アカウントで300件(500件)というわけだ(括弧内は7月2日の泥縄的修正値)。制限の理由については,インターネット上のデータ収集や処理における不正な操作の急増に対応するためとしている。

実際には,TwitterがAPI課金を急騰させたことを原因とするウェブスクレーピングの増加だとか,サーバーを運用しているクラウドとの契約の関係だとか,Twitterコードのバグが自分自身に対するDOS攻撃をしたのが原因だとか,諸説がある。いずれにせよTwitterのコントロールがいよいよ効いていないことが明らかになった。

このため,再びTwitterから他のSNSへの流失が進んでいるらしい。その候補の一つはジャック・ドーシー(1976-)がはじめたBlueskyだけれど,招待制の登録者はまだ20万人だ(Twitterは4.5億人)。他に T2 とか MetaのThreads が話題になっている。どうなることか。現在のところ,Twitterに流れる情報の方がまだまだ有用度が高い。

そのBlueskyの歩き方というドキュメントがmd形式で流れていた。pdfに変換しようと考えた。たぶんpandocが使えるはずなのだが,調べてみると一手間必要だった。これをまとめると次のようになる。
$ brew install pandoc ✓
$ brew cask install mactex ✓
~/.zshrc に次の行を追加
export PATH=/usr/local/texlive/2019/bin/x86_64-darwin/:$PATH
$ source ~/.zshrc
$ pandoc bluesky.md -o bluesky.pdf --pdf-engine=xelatex -V documentclass=bxjsarticle -V classoption=pandoc
これをシェルスクリプトにすると
$ cat md2pdf.sh
#!/bin/zsh
# usage mdspdf.sh test
# input test.md output test.pdf
#
pandoc $1.md -o $1.pdf --pdf-engine=xelatex -V documentclass=bxjsarticle -V classoption=pandoc

これで無事にmdファイルをpdfファイルに変換できた。

P. S. Blueskyの招待コードが若干余っているので必要な方はメール,TwitterのDM,Facebook Messengerなどでご連絡ください。

2023年6月3日土曜日

合計特殊出生率

奥村晴彦先生が,Rで合計特殊出生率グラフを描いていたのでまね(写経)をしてみた。

厚生労働省の発表では,2022年の合計特殊出生率が1.26となって(前年は1.30),2005年に並んで過去最低を記録した,というのがニュースになったからかな。

写経は成功したが,日本語タイトルが文字化けしていた。ネットで検索すると解決できた。次に,グリッドラインを入れるべく検索したが要領を得ないし,なんだかずれてしまう。GPT-4に相談したところ2回目で正解にたどりつけた。最後に,奥村先生はクリップボードからデータを入力するという高等技術を使っていたので,低レベルのテキストファイル入力に切り替えた。自分で考える力がどんどん喪失されていく・・・

その結果が次のRプログラムと図である。

# X = read.table(pipe("pbpaste"), header=TRUE) (奥村先生のテクニック for macOS)

X <- read.table('/Users/koshi/Desktop/birth.txt', header =TRUE)
par(family = "HiraKakuProN-W3")
plot(X$年, X\$合計特殊出生率, type="o", pch=16, xlab="", ylab="")
t = c(range(X\$合計特殊出生率), X$合計特殊出生率[length(X[,1])])
axis(4, t, t)
title("合計特殊出生率", line=0.5)

# x軸とy軸のメモリの位置を手動で指定
x_ticks <- pretty(X\$年, 11)  # 11個のメモリを生成
y_ticks <- pretty(X\$合計特殊出生率, 9)  # 9個のメモリを生成

# x軸に対してグリッド線を描画
for (i in x_ticks) {
  abline(v = i, col = "lightgray", lty = "dotted")
}

# y軸に対してグリッド線を描画
for (i in y_ticks) {
  abline(h = i, col = "lightgray", lty = "dotted")
}


図:合計特殊出生率の推移(1970-2022)


2023年4月15日土曜日

数独

日本経済新聞の土曜版のクイズ欄では,数独(ナンプレ)が毎週出題されていた。以前は赤で配置可能な数字をメモしながら解くものだと信じていたのだが,ある日電車の隣に座ったおじさんが,メモなしでスイスイ解いているのを見てしまった。それ以降は,簡単なものなら補助メモなしで解けるようになった。なにごとも信念が重要である。

その土曜版のクイズ欄は,4月から漢字クイズに変わってしまった。えぇーっ。せっかく惚け防止のために頭の体操(10-20分)をしていたのに・・・。まあ,数独を含む各種クイズがセットになった日経脳活動クイズのiPhoneアプリ版があるといえばあったけれど消してしまった。紙に書かないと,落ち着かない旧世代なのだ。

それならば,自分で数独の問題を作るプログラムを書けばよい。さっそくGPT-4に聞いてみたら,pythonプログラムを出してきた(ありふれているので学習済みだろう)。さらに,第2案として,sudokuモジュールをインポートする2-3行ですむ簡単な方法が提案された。pip でsudokuをインストールせよとのことだが,それではだめで,py-sudokuならうまくいった。

GPT-4と相談しながら,修正を繰り返し,結果をcsvファイルに格納するプログラムができた。これをexcelで読み込んで出力すればOKだ。

#!/Users/koshi/bin/python

import csv

from sudoku import Sudoku


# Initializes a Sudoku puzzle with 3 x 3 sub-grid and

# generates a puzzle with 75% of the cells empty

puzzle = Sudoku(3).difficulty(0.65)

puzzle.show()


# Convert the puzzle to a list of lists

puzzle_data = []

for row in puzzle.board:

    puzzle_data.append(list(row))


# Write the puzzle data to a CSV file

with open('puzzle.csv', 'w', newline='') as csvfile:

    csv_writer = csv.writer(csvfile)

    for row in puzzle_data:

        # Replace 0 or None with an empty string to represent empty cells

        formatted_row = [str(cell) if cell not in (0, None) else '' for cell in row]

        csv_writer.writerow(formatted_row)

 その結果わかったこと。日経のクイズは超難問の場合でも解けるようにかなり配慮されている。難易度を易しめに設定しても,単純にランダムに消すことで数独問題をつくるとかなり解くのが難しい極値にはまり込むことがあるような気がする。


図:GPT-4と協力して作成したコードの出力例

[1]py-sudoku 1.0.3(pypi.org)

2023年4月10日月曜日

教養強化合宿(6)

教養強化合宿(5)からの続き

外山恒一が,Facebookで今回の8日間の合宿で取り上げた人物のリストを公開していた。その数は約165人。一方,前回のnoteに書いていた教養強化合宿余興で登場した人物の数は,約260人。その和集合をとって,重複したものを◎,後者にのみ含まれたものを●で表した。その中で自分が名前くらいは聞いたことがある人は約200名弱(3/4)だった。✓をつけてある。

このリストをHTML化にするにあたって,GPT-4に作業をさせてみた。例えば,次のような自然言語プログラミングを行うわけだ。
『htmlファイル中に人名リストを埋め込もうとしています。次のような1行のテキストデータを,●会田誠(あいだまこと)✓ このようなhtml形式に変換してほしいのです。●<a href="https://ja.wikipedia.org/wiki/会田誠">会田誠</a>(あいだまこと)✓<br /> 以下にデータを与えますので,すべて同様な変換を施してください。』

入力データサイズや一度に出力できるデータのサイズには制限があるものの,正しい結果が得られる。問題は,時間がかかることだ。GPT-4やChatGPTは対話システムとして公開されているので,そのスピードでしか文字が出力されない。毎秒8文字程度なので,このままでは実用的な仕事にならない。 潜在能力はあるし,将来的に出力をファイル化できればこれは簡単にクリアできる話なのだが。

現時点では,GPT-4に直接実行させるのではなく,それを実行するプログラムを考えさせるのがよい。そこで,さきほどの命令に「これを実現するPerlプログラムを書いてください」としてほぼ思った結果が得られた。少し人間の手を加えてチューニングした結果が次のものだ。実行時間問題はこうして解決される。

#!/usr/bin/perl

use strict;

use warnings;

use utf8;


binmode(STDIN, ':encoding(utf8)');

binmode(STDOUT, ':encoding(utf8)');


while (my \$line = <>) {

    chomp \$line;

    if (\$line =~ /([●◎○])(.+?)((.+?))(.+?)([✓_])/) {

        my \$kigou = \$1;

        my \$name = \$2;

        my \$name_kana = \$3;

        my \$prop = \$4;

        my \$check = \$5;

        my \$url = "https://ja.wikipedia.org/wiki/\$name";

        print "\$kigou<a href=\"\$url\">\$name</a>(\$name_kana) \$prop \$check<br />\n";

    }

}

なお,リンク先はWikipediaとしたが,2-3名以外はすべてこれでカバーすることができている。自分が普段書くような簡単なプログラムは,文法を確認しながらロジックを考えるのが面倒だから,GPT-4まかせになってしまうのがほぼ確定だ。で,プログラミング教育とは何?
 外山恒一教養強化合宿の登場人物リストを参照の上編集
会田誠(あいだまこと) 画家 ✓
青島幸男(あおしまゆきお) 放送作家 ✓
赤尾敏(あかおびん) 大日本愛国党 ✓
あがた森魚(あがたもりお) 赤色エレジー ✓
秋田明大(あきためいだい) 日大全共闘 ✓
秋山祐徳太子(あきやまゆうとくたいし) 現代美術家 ✓
アグネス・スメドレー(あぐねすめどれー) 中国共産党 _
浅羽通明(あさばみちあき) 評論家 ✓
東浩紀(あずまひろき) ゲンロン ✓
足立正生(あだちまさお) 日本赤軍 _
天野恵一(あまのけいいち) 評論家 _
雨宮処凛(あまみやかりん) 反貧困ネットワーク ✓
網野善彦(あみのよしひこ) 歴史学者 ✓
荒畑寒村(あらはたかんそん) 社会主義者 ✓
アレクサンドル・ソルジェニーツィン(あれくさんどるそるじぇにーつぃん) 収容所群島 ✓
アレン・ギンズバーグ(あれんぎんずばーぐ) 詩人 _
アンジェイ・ワイダ(あんじぇいわいだ) 映画監督 ✓
アンディ・ウォーホル(あんでぃうぉーほる) 現代美術家 ✓
アントニオ・グラムシ(あんとにおぐらむし) イタリア共産党 _
家永三郎(いえながさぶろう) 教科書裁判 ✓
イサドラ・ダンカン(いさどらだんかん) 舞踏家 ✓
石川一雄(いしかわかずお) 狭山裁判 ✓
石原莞爾(いしわらかんじ) 満州事変 ✓
石牟礼道子(いしむれみちこ) 苦海浄土 ✓
磯部浅一(いそべあさいち) 粛軍に関する意見書 _
五木寛之(いつきひろゆき) 作家 ✓
いとうせいこう(いとうせいこう) タレント ✓
伊藤律(いとうりつ) 日本共産党 ✓
伊藤野枝(いとうのえ) 婦人解放運動 ✓
井上嘉浩(いのうえよしひろ) オウム真理教 ✓
忌野清志郎(いまわのきよしろう) ロック歌手 ✓
宇井純(ういじゅん) 公害問題 ✓
植垣康博(うえがきやすひろ) 連合赤軍 ✓
上杉慎吉(うえすぎしんきち) 君権学派 _
上田耕一郎(うえだこういちろう) 日本共産党 ✓
内田裕也(うちだゆうや) 樹木希林 ✓
ウディ・アレン(うでぃあれん) 映画監督 ✓
宇野弘蔵(うのこうぞう) 宇野経済学 ✓
江田三郎(えださぶろう) 社会市民連合 ✓
江藤淳(えとうじゅん) 評論家 ✓
衛藤晟一(えとうせいいち) 全国学協 ✓
エドガー・スノウ(えどがーすのう) 中国の赤い星 _
榎美沙子(えのきみさこ) 中ピ連 ✓
大島渚(おおしまなぎさ) 映画監督 ✓
太田竜(おおたりゅう) 第四インターナショナル ✓
大塚英志(おおつかひでし) マンガ評論家 ✓
大宅壮一(おおやそういち) 評論家 ✓
岡田嘉子(おかだよしこ) ソ連逃避行 ✓
岡留安則(おかどめやすのり) 噂の真相 ✓
岡林信康(おかばやしのぶやす) 友よ ✓
岡本公三(おかもとこうぞう) テルアビブ事件 ✓
小川紳介(おがわしんすけ) 三里塚シリーズ ✓
奥田愛基(おくだあき) シールズ ✓
小熊英二(おぐまえいじ) 社会学者 _
小倉千加子(おぐらちかこ) フェミニスト ✓
小沢開作(おざわかいさく) 小沢征爾 ✓
小畑達夫(おばたたつお) 日本共産党スパイ事件 _
笠原和夫(かさはらかずお) 仁義なき戦い _
柏崎千枝子(かしわざきちえこ) ゲバルトローザ _
片山潜(かたやません) 社会主義者 ✓
加藤登紀子(かとうときこ) ひとり寝の子守歌 ✓
加藤直樹(かとうなおき) 九月,東京の路上で ✓
椛島有三(かばしまゆうぞう) 日本青年協議会 ✓
神近市子(かみちかいちこ) 婦人運動家 ✓
ガヤトリ・スピヴァク(がやとりすぴゔぁく) 文芸評論家 _
萱野茂(かやのしげる) アイヌ文化 _
香山リカ(かやまりか) 精神科医 ✓
川上音二郎(かわかみおとじろう) オッペケペー ✓
川口大三郎(かわぐちだいざぶろう) 早稲田構内リンチ事件 ✓
川田龍平(かわたりゅうへい) 薬害エイズ ✓
川本三郎(かわもとさぶろう) 評論家 ✓
菅孝行(かんたかゆき) 反天皇制運動連絡会 _
管野スガ(かんのすが) 女性新聞記者 _
樺美智子(かんばみちこ) 60年安保 ✓
カール・リープクネヒト(かーるりーぷくねひと) ローザ・ルクセンベルグ _
木下ちがや(きのしたちがや) こたつねこ ✓
木村三浩(きむらみつひろ) 一水会 _
清義明(せいよしあき) フリーライター ✓
金賢姫(きむひょんひ) 大韓航空機爆破事件 ✓
ギー・ドゥボール(ぎーどぅぼーる) アンテルナシオナル・レトリスト _
熊沢天皇(くまざわてんのう) 皇位僭称者 _
倉橋由美子(くらはしゆみこ) パルタイ ✓
蔵原惟人(くらはらこれひと) 評論家 ✓
栗本慎一郎(くりもとしんいちろう) 経済人類学 ✓
鴻上尚史(こうかみしょうじ) 劇作家 ✓
江青(こうせい) 文化大革命 ✓
荒岱介(あらたいすけ) ブント戦旗派 _
古賀政男(こがまさお) 明治大学マンドリン倶楽部 ✓
粉川哲夫(こがわてつお) 批評家 ✓
小阪修平(こさかしゅうへい) 東大全共闘 ✓
児玉誉士夫(こだまよしお) ロッキード事件 ✓
五島勉(ごとうべん) ノストラダムスの予言 ✓
小林よしのり(こばやしよしのり) ゴーマニズム宣言 ✓
コンスタンチン・スタニスラフスキー(こんすたんちんすたにすらふすきー) 演出家 ✓
権藤成卿(ごんどうせいきょう) 農本主義思想家 _
今野晴貴(こんのはるき) POSSE _
西光万吉(さいこうまんきち) 水平社宣言 ✓
斎藤幸平(さいとうこうへい) 人新世の資本論 ✓
堺利彦(さかいとしひこ) 社会主義者 ✓
坂口恭平(さかぐちきょうへい) 建築家 _
坂口弘(さかぐちひろし) あさま山荘事件 ✓
桜井大造(さくらいたいぞう) 風の旅団 _
桜井誠(さくらいまこと) 在日特権を許さない市民の会 ✓
佐々淳行(ささあつゆき) 警察官僚 ✓
笹川良一(ささがわりょういち) 日本船舶振興会 ✓
佐藤悟志(さとうさとし) 青狼会 ✓
サミュエル・ベケット(さみゅえるべけっと) 劇作家 ✓
沢木耕太郎(さわきこうたろう) ノンフィクション作家 ✓
椹木野衣(さわらぎのい) 美術評論家 _
ジェリー・ルービン(じぇりーるーびん) シカゴ・セブン _
塩見孝也(しおみたかや) 赤軍派議長 ✓
重信房子(しげのぶふさこ) 日本赤軍 ✓
島成郎(しましげお) 全学連書記長 ✓
島田雅彦(しまだまさひこ) 作家 ✓
清水幾太郎(しみずいくたろう) 社会学者 ✓
清水丈夫(しみずたけお) 中核派 ✓
シモーヌ・ヴェイユ(しもーぬゔぇいゆ) 哲学者 ✓
ジャック・ケルアック(じゃっくけるあっく) 小説家 _
ジャニス・ジョプリン(じゃにすじょぷりん) ロック歌手 ✓
ジャン・リュック・ゴダール(じゃんりゅっくごだーる) 映画監督 ✓
正力松太郎(しょうりきまつたろう) 読売新聞社 ✓
ジョニー・ロットン(じょにーろっとん) パンクロック _
ジョルジョ・アガンベン(じょるじゅあがんべん) 哲学者 _
ジョルジュ・ソレル(じょるじゅそれる) 哲学者 _
ジョン・リード(じょんりーど) レッズ ✓
ジョージ・ハリスン(じょーじはりすん) ビートルズ ✓
ジョーン・バエズ(じょーんばえず) フォーク歌手 ✓
白井聡(しらいさとし) 白井克彦 ✓
菅野完(すがのたもつ) 日本会議の研究 ✓
鈴木忠志(すずきただし) 演出家 ✓
スチュアート・ホール(すちゅあーとほーる) 文化理論家 _
ストークリー・カーマイケル(すとーくりーかーまいける) 差別撤廃闘争指導者 _
スラヴォイ・ジジェク(すらゔぉいじじぇく) 哲学者 ✓
大道寺将司(だいどうじまさし) 東アジア反日武装戦線 ✓
高田渡(たかだわたる) フォーク歌手 ✓
高野実(たかのみのる) 高野猛 ✓
高畠素之(たかばたけもとゆき) 国家社会主義 _
滝田修(たきたおさむ) 新左翼活動家 ✓
宅八郎(たくはちろう) タレント ✓
武井昭夫(たけいあきお) 全学連初代委員長 _
竹中労(たけなかろう) ルポライター ✓
田嶋陽子(たじまようこ) フェミニスト ✓
橘孝三郎(たちばなこうざぶろう) 農本ファシスト _
立松和平(たてまつわへい) 作家 ✓
田中清玄(たなかせいげん) CIAフィクサー ✓
田中美津(たなかみつ) ウーマン・リブ _
谷川雁(たにがわかり) 詩人 ✓
谷口雅春(たにぐちまさはる) 生長の家 ✓
田宮高麿(たみやたかまろ) よど号事件 ✓
筑紫哲也(つくしてつや) ジャーナリスト ✓
知花昌一(ちばなまさかず) 平和運動家 _
千葉雅也(ちばまさや) 哲学者 ✓
チャンドラ・ボース(ちゃんどらぼーす) インド独立運動 ✓
チャールズ・マンソン(ちゃーるずまんそん) マンソンファミリー _
陳独秀(ちんどくしゅう) 中国共産党 _
つかこうへい(つかこうへい) 劇作家 ✓
津田大介(つだだいすけ) ツダる ✓
堤清二(つつみせいじ) 辻井喬 ✓
鶴見済(つるみわたる) 完全自殺マニュアル _
ティモシー・リアリー(てぃもしーりありー) 心理学者 _
峠三吉(とうげさんきち) 原爆詩集 ✓
唐十郎(からじゅうろう) 状況劇場 ✓
頭山満(とうやまみつる) 国家主義者 ✓
戸川純(とがわじゅん) 女優 ✓
徳田球一(とくだきゅういち) 日本共産党 ✓
戸村一作(とむらいっさく) 三里塚芝山連合空港反対同盟委員長 ✓
トルーマン・カポーティ(とるーまんかぽーてぃ) 小説家 ✓
仲井戸麗市(なかいどれいいち) RCサクセション ✓
中川敬(なかがわたかし) ソウル音楽家 _
永田洋子(ながたようこ) 連合赤軍 ✓
中野重治(なかのしげはる) 小説家 ✓
中野正剛(なかのせいごう) ジャーナリスト ✓
永山則夫(ながやまのりお) 無知の涙 ✓
ナジ・イムレ(なじいむれ) ハンガリー動乱 _
ナンシー関(なんしーせき) コラムニスト ✓
ナンシー・スパンゲン(なんしーすぱんげん) セックスピストルズ _
難波大助(なんばだいすけ) 極左活動家 ✓
西尾幹二(にしおかんじ) 新しい歴史教科書を作る会 ✓
西部邁(にしべすすむ) 保守思想家 ✓
蜷川幸雄(にながわゆきお) 演出家 ✓
沼正三(ぬましょうぞう) 家畜人ヤプー ✓
野坂参三(のさかさんぞう) 日本共産党 ✓
野田秀樹(のだひでき) 劇作家 ✓
野間易通(のまやすみち) レイシストをしばき隊 ✓
野村秋介(のむらしゅうすけ) 民族派活動家 ✓
萩尾望都(はぎおもと) 漫画家 ✓
萩原朔美(はぎはらさくみ) 映像作家 _
パティ・スミス(ぱてぃすみす) クイーンオブパンク _
花田清輝(はなだせいき) 文芸評論家 ✓
埴谷雄高(はにやゆたか) 小説家 ✓
浜田幸一(はまだこういち) 政治家 ✓
日比野克彦(ひびのかつひこ) アーティスト ✓
ヒューイ・ニュートン(ひゅーいにゅーとん) 公民権運動 _
平岡正明(ひらおかまさあき) 評論家 ✓
平田オリザ(ひらたおりざ) 劇作家 ✓
ビリー・ホリデイ(びりーほりでい) ジャズ歌手 ✓
広瀬隆(ひろせたかし) 東京に原発を ✓
ピート・シーガー(ぴーとしーがー) フォーク歌手 ✓
福田和也(ふくだかずや) 文芸評論家 _
福田恆存(ふくだつねあり) 評論家 ✓
福本和夫(ふくもとかずお) 経済学者 ✓
藤岡信勝(ふじおかのぶかつ) 新しい歴史教科書を作る会 ✓
船本洲治(ふなもとしゅうじ) 革命思想家 _
フランシス・フクヤマ(ふらんしすふくやま) 政治経済学者 ✓
古田重二良(ふるたじゅうじろう) 日本大学理事長 _
不破哲三(ふわてつぞう) 日本共産党 ✓
別役実(べつやくみのる) 劇作家 ✓
ベルトルト・ブレヒト(べるとるとぶれひと) 劇作家 ✓
某Fラン政治学者(五○井郁○) (○の○○○お) 政治学者 ✓
ボブ・マーリー(ぼぶまーりー) レゲエ歌手 ✓
本多勝一(ほんだかついち) 作家 ✓
本島等(もとしまひとし) 長崎市長 ✓
真島昌利(ましままさとし) ギタリスト _
松崎明(まつざきあきら) 革マル派副議長 ✓
松沢呉一(まつざわくれいち) コラムニスト ✓
松下竜一(まつしたりゅういち) 作家 ✓
松本治一郎(まつもとじいちろう) 部落解放同盟 ✓
松本哉(まつもとはじめ) 素人の乱 ✓
マハリシ・ヨギ(まはりしよぎ) 超越瞑想 _
黛敏郎(まゆずみとしろう) 作曲家 ✓
マルコム・マクラレン(まるこむまくられん) セックスピストルズ _
マルセル・デュシャン(まるせるでゅしゃん) ダダイスト ✓
三上卓(みかみたく) 青年日本の歌 _
三上寛(みかみひろし) フォーク歌手 ✓
ミサオ・レッドウルフ(みさおれっどうるふ) 首都圏反原発連合 _
道浦母都子(みちうらもとこ) 歌人 ✓
南伸坊(みなみしんぼう) イラストレーター ✓
宮﨑勤(みやざきつとむ) 連続幼女誘拐殺人事件 ✓
宮崎滔天(みやざきとうてん) 社会運動家 ✓
宮崎学(みやざきまなぶ) 評論家 ✓
宮崎龍介(みやざきりゅうすけ) 白蓮事件 _
宮沢章夫(みやざわあきお) 劇作家 ✓
宮武外骨(みやたけがいこつ) ジャーナリスト ✓
宮本百合子(みやもとゆりこ) 作家 ✓
向井孝(むかいたかし) 社会運動家 _
森達也(もりたつや) ドキュメンタリーディレクター ✓
森田必勝(もりたひっしょう) 三島由紀夫事件 ✓
森田実(もりたみのる) 政治評論家 ✓
森恒夫(もりつねお) 連合赤軍 ✓
安岡正篤(やすおかまさひろ) 思想家 ✓
柳原白蓮(やなぎはらびゃくれん) 歌人 ✓
矢部史郎(やぶしろう) 思想家 _
山岡強一(やまおかきょういち) 映画監督 _
山口二矢(やまぐちおとや) 浅沼稲次郎暗殺 ✓
山崎博昭(やまざきひろあき) 第1次羽田事件 ✓
山下洋輔(やましたようすけ) ドバラダ門 ✓
山田塊也(やまだかいや) コミューン運動“部族” _
山本太郎(やまもとたろう) れいわ新選組 ✓
山本夜羽音(やまもとよはね) 漫画家 ✓
山本義隆(やまもとよしたか) 東大全共闘 ✓
湯浅誠(ゆあさまこと) 社会活動家 ✓
吉本隆明(よしもとりゅうめい) 擬制の終焉 ✓
ラモン・メルカデル(らもんめるかでる) 暗殺者のメロディ _
劉少奇(りゅうしょうき) 文化大革命 ✓
林彪(りんぴょう) 中国共産党 ✓
ルイジ・ピランデルロ(るいじぴらんでるろ) 劇作家・小松左京  ✓
レニ・リーフェンシュタール(れにりーふぇんしゅたーる) 映画監督 ✓
ろくでなし子(ろうでなしこ) 漫画家 ✓
ロバート・ジョンソン(ろばーとじょんそん) ブルースギター _
渡辺京二(わたなべきょうじ) 逝きし世の面影 ✓

2023年4月9日日曜日

アニメーション

GPT-4に次のようなプロンプトを与えた。
・プログラミング言語のprocessingを知っていますか?
・簡単なアニメーションで,マウスで操作できるカラフル(淡いパステルカラー)でかわいい見本プログラムのコードを書いてもらえますか。
・ありがとうございます。マウス操作は必要ないので,100個ぐらいの小さなボールが動きまわるような見本に修正してもらえますか。
・どうもありがとうございます,とてもすてきですね。ところでこのボールは領域の境界で反射してますが,ボール同士の衝突は考慮されておらずそのまま透過しているようです。衝突するボールが反射するようにできますか。ボールの円の境界で反射方向を決定するのが面倒ならば,ボールの中心座標で代替する近似を使うことも検討してください。

その結果,次のようなコードが生成された。パラメタを少し修正して,tifファイルに書き出した。これを使ってProcessingのツール/ムービーメーカーでアニメーションGIFに変換した。よくある例題だから,学習済みなのだろうけれど,なかなかのものだ。


図:GPT-4で生成したProcessingアニメーション

2023年4月8日土曜日

マインドマップ

へのへのもへじからの続き

画像生成AIは引き続き進化中だ。一方,GPT-4を用いて画像を生成する方法がいくつか考えられる。(1) アスキーアートの文字列を出力,(2) SVGのコードを出力,(3) 画像描画が簡単なプログラミング言語等のコードを出力(Processing,Javascript,Python,Mathematica,PlantUML,LaTeXのTikZ)するなどだ。

プロンプト工学を駆使せずに簡単にできる範囲で試してみた。左はうさぎのアスキーアート,右は,植物と鳥のイメージということだった。前者の入力は「アスキーアートを知っていますか。ひとつ例をかいてみてください」(中略)「その例は20-30文字程度ですね。100文字には到達していません。もう少し複雑なものを書いてください」。後者は,「植物の絵を表すsvgコードを出力し下さい」「なかなかいい感じですね。もっと複雑にするとともに,同じ程度複雑な動物を隣に描いてください」の結果だ。

図:GPT-4にかかせたアスキーアートとSVG

さて,ChatGPTにマインドマップを書かせるという例題があったので,自分でも試してみた。昨年の9月に,PlantUMLというツールをインストールしていた。すっかり忘れていた。このPlantUMLは,マインドマップを書かせる機能も備えている。

そこで,次のようなプロンプトを与えた。「スマホのアプリ開発を機種(OS)やクラスプラットホーム別に整理した(開発環境とブログラム言語)マインドマップを出力するPlantUMLコードを書いてください」その結果をUMLファイルとして保存し,PlantUMLにかけると次の画像ファイルができた。


図:GPT-4が生成したマインドマップ

2023年3月26日日曜日

へのへのもへじ

ネット上で誰かが,「へのへのもへじ」より「へめへめくつし」がいいねといった。ホウ,そんなものがあったのか,と一瞬思ったけれど,そういえば昔いろいろと試していたような気もする。それほどビックリする話題ではない。

むしろ,テレビで外国人の平熱が37度台であると知ったことの方が驚きだ。これは筋肉が多い人について成り立つらしく,日本のボディビルダーに体温がやはり37度台であることを検証していた。どこまで正しいかわからないけれど。

そこで,へのへのもへじ出力プログラムを作ってみた。最初は,TeXのTikZで書いた。こんな感じ。ベジェ曲線が手軽に使えるのがありがたい。

\begin{tikzpicture}
\draw[gray, step=1, dotted] (0,0) grid (6,6);
\draw (2,5) node[below]{\Huge \${〜}\$};
\draw (2,4) node[below]{\Huge \${め}\$};
\draw (4.2,5) node[below]{\Huge \${〜}\$};
\draw (4.2,4) node[below]{\Huge \${め}\$};
\draw (3,3) node[below]{\Huge \${く}\$};
\draw (3.3,1.9) node[below]{\Huge \${つ}\$};
\draw [ultra thick] (1,5.5) .. controls (0.5,2) and (1.25,0.75)  ..(2,0.5);
\draw [ultra thick] (2,0.5) .. controls (3,0) and (5,0)  ..(5.5,2);
\draw (5.5,3) node[below]{\Huge \${々}\$};
\end{tikzpicture}


図1:LaTeXのTikZで書いたへのへのもへ字

これだと,文字を入れ替えるたびにコードを書き換えることになる。そこで,pythonで作り直そうとしてGPT-4に聞いてみたら,ほぼ1発で正しいコードが得られた。macOSのフォントの場所だけを指定すれば良かった。さらに,コマンドラインからひらがなを入力して文字に分解するところもGPT-4に教えてもらった。これからのプログラミング教育はどうなるのだろう?

問題は,pythonのpillowライブラリにはベジェ曲線がないことだ。おまけに,最初の結果は顔の輪郭は直線4本で表され,顔に被ってしまっていた。GPT-4はそこまで賢いわけではない。仕方がないので,自力でもがいて作った折れ線グラフで代用している。プログラミング教育って絶対にこうなるから。論理的ではない部分が多すぎる。

#! ~/bin/python


from PIL import Image, ImageDraw, ImageFont

import sys


def generate_henohenomoheji(brow: str, eye: str, nose: str, mouth: str, file_name: str):

     

    # 背景画像を作成

    image = Image.new('RGB', (600,600), (255, 255, 255))

    draw = ImageDraw.Draw(image)


    # フォントの設定

    font_size = 80

    font = ImageFont.truetype("/Users/koshi/Library/Fonts/BIZUDGothic-Regular.ttf", font_size)


    # へのへのもへじの要素を描画

    draw.text((160, 120), brow, font=font, fill=(0, 0, 0))  # 眉毛

    draw.text((340, 120), brow, font=font, fill=(0, 0, 0))  # 眉毛

    draw.text((180, 200), eye, font=font, fill=(0, 0, 0))   # 目

    draw.text((330, 200), eye, font=font, fill=(0, 0, 0))   # 目

    draw.text((240, 290), nose, font=font, fill=(0, 0, 0))  # 鼻

    draw.text((250, 380), mouth, font=font, fill=(0, 0, 0)) # 口

    draw.text((480, 240), "〃", font=font, fill=(0, 0, 0))  # 濁点


    # 顔の輪郭(ベジェ曲線ではない)

    contour = [

        (100, 100), (110, 150), (110, 200), (100, 250), (100, 300),

        (110, 340), (120, 380), (140, 410), (160, 440), (180, 460),

        (200, 480), (220, 490), (240, 500), (260, 505), (280, 505),

        (300, 500), (320, 500), (340, 495), (360, 495), (370, 490),

        (390, 480), (410, 470), (430, 460), (450, 440), (470, 410),

        (480, 380), (480, 360), (475, 340), (470, 310), (470, 280),

    ]

    draw.line(contour, width=5, fill=(0, 0, 0), joint="curve")


    # 画像の表示と保存

    image.show()

    image.save(file_name, "PNG")


moji = list(sys.argv[1])

brow = moji[0]

eye = moji[1]

nose = moji[2]

mouth = moji[3]

print(brow,eye,nose,mouth)

generate_henohenomoheji(brow,eye,nose,mouth, "heno-mohe.png")

図2:PythonのPillowによるへのへのもへ字

2023年3月7日火曜日

プログラミング遍歴(2)

プログラミング遍歴(1)からの続き

(4) Mathematica:
Mathematicaについては既に書いているので,少し捕捉しておく。物理数学だったか計算物理だったかの授業で,Mathematicaを何年か授業で教えていたことがある。情報処理センターでは,キャンパスライセンスが導入されていて,実習室のMac(一時 Silicon Graphics のIndigo?)を使って,一通りの基礎的文法から微分方程式までをカバーしていた。

その経験があったので,卒業生の杉木君が尼崎小田高校のSSHの担当のときに,柏原キャンパスで高校生対象の1-2日のMathematica実習を実施した。尼崎小田高校では出前授業でMathematica/Excel?を使ったケーキカップの落下実験をとりあげたこともある。

(5) Perl:
インターネットの教育利用についてをテーマとするようになったのは,1994年からだ。1995年から7年ほどの黎明期に,インターネットと教育という教育利用サイトのリンクリストを運営していたが,それと連動して,全国の学校に対するアンケート調査を実施していた。今ならば絶対にアウトになりそうなやつだ。

まだ,数が少なかった学校のウェブページをクロールして,何階層かをダウンロードする。そこからメールアドレスをとり出して,ここに年1回アンケートを送り付ける。この処理にperlを用いた。wgetやlynxで入手したHTMLファイルからメールアドレスを切り出して,ユニークなものにすること。メールアドレスのデータをまとめて自動的にメール送信すること。こうした処理には,当時はPerlが最適任だったのだ。

(6) Julia:
もう退職が近づいてきたころに出会ったのがJuliaだった。スーパーコンピュータでガリガリの並列計算をするような仕事には縁遠くなってしまったので,Julia程度の軽快で高機能なプログラミング言語は大変有難かった。Mathematicaほどの自由度にはかけるが,手続き的プログラミングでは,Juliaの方が使いやすいので,現在はこの両者を使いわけている。COVID-19のシミュレーションはJuliaで,北朝鮮ミサイルのシミュレーションはMathematicaでという具合だ。



2023年3月6日月曜日

プログラミング遍歴(1)

(1) FORTRAN:
高校理数科のとき,試験にも出たFORTRANは座学だけで学んだ,というか聞きかじった程度。参考書というわけでもないが,興味があって自分で買ったのが電子計算機と人間だったけれど,これを読んでもさっぱり分からない。テレビでは,森口繁一(1916-2002)のNHKコンピュータ講座フォートラン入門をやっていたが,これもたまにチラ見する程度で何が何だかやっぱりよく分からない。

阪大の物理学科に入ると,初年次セミナーというのがあった。意欲的な同級生らは,バークレーの統計力学やFORTRAN入門にエントリーしていた。自分は億劫でどれにも参加しなかったが,学籍番号が隣の越湖直人君が,FORTRANのプログラミングで,銀河系形成のシミュレーションをやっていると聞いた。残念ながら最終結果を得るにはリソースが足りなかったようだ。

さて,その森口繁一のJIS FORTRAN入門の第2版上下を買ってしばらくしてから,大学4年の村岡光男先生の数値計算法で,はじめてのFORTRANプログラミングを体験することになる。文法の説明が数回あった後に,課題に取り組んだ。豊中データステーションの様子は以前に書いたとおりだ。いくつかの課題があって,そのうち2つを選択してレポートとして提出すれば単位がもらえる。

最初の課題は単純な四則演算の組み合わせだったのでそれを選択したものが多かった。それではつまらないと思い,5次方程式の解法と行列の対角化の2課題に取り組んだ。それぞれについて結果を出した自信があったが,後で考えるとどうも答えが間違っている。実際,村岡研に進んだ楠本君から,当時の成績が悪かったらしいと聞くことになる。

そんなわけで,大学院に進学して修士論文に取り組み始めてからも,なかなか研究がはかどらない。業をにやした大坪先生が,簡単なルンゲクッタ法のプログラムを作ってみるように指示し,教育的配慮でほめてくれたので,それをきっかけに,FORTRANプログラミングへの抵抗はなくなった。

こうして,修士課程以降は2000年ごろまでは,普通にFortran77を研究に使っていた。1990年代には京大の総合人間学部(旧教養部)の科目の非常勤でFortran77の実習も担当した。そんなわけで,Macを使うようになっても,長らくabsoft Fortranのライセンスを維持していたけれど,実際にはほとんど使うことはなかった。absoft Pro Fortranは2022年の8月に販売終了していた

(2) BASIC:
大阪教育大学に勤めてまもなく研究室に導入したパーソナルコンピュータが,NECのPC-9801だった。これにはN88BASICがROMでプレインストールされていて,OSのように使われた。アプリケーションソフトもまだ高額だったので,BASICがなければパソコンが使いこなせない。学生の卒論もBASICで計算していたし,授業や公開講座などでも良く使った

もっとも,最初に,BASICに出会ったのは,1980年ごろに阪大附属図書館でアルバイトをしていたときに,図書館2Fの事務室に導入されたOKIのif800のBASICだった。チラッと眺めたけれど,四則演算は分かるがグラフィックスが皆目見当がつかない。同じアルバイトで1-2学年下の化学の学生が,スラスラと図形を表示させているのにビックリしてしまった。

さて,そのNECのBASICである。BASICコンパイラなども使ったけれど,自分の研究のための計算をすることはほとんどなかった。卒論にもそれほど使い込んだ記憶がない。そうこうしているうちに,8087に対応したTurbo Pascal 3.0 がやってきたからだ。非常に快適なプログラム作成環境で,コンパイルのスピードにほれぼれしていた。これは,斎藤昌久君が,グラフ作成ツールなどを作ってくれて重宝した。

BASICではないが,PC-9801に8087数値演算プロセッサを積んだころ,その能力を活かそうと,8080+8087のアセンブリ言語プログラミングに取り組んだ。当時のパソコン雑誌にはこうした記事がたくさんあったので,素人でも簡単に手を出すことができた。Clebsh Gordan係数やRacah係数のコードを作り,BASICと組み合わせて連立方程式の計算を高速で実行するというあたりで,若松正志さんにそれで何をしますかと聞かれて,そうですね・・・と終了を迎えることになった。

(3) C:
C言語は,カーニハン・リッチーのプログラミング言語C石田晴久訳)を買って少しだけ勉強した。そのころは,Lattice CLightSpeed C/Think CTurbo C など,あまたのC言語処理系が乱立していた。Oh PC にはCとアセンブリ言語の中間のようなコンパクト言語なども掲載されている時代だ。で,さきに述べたように,ポインタのあたりでつまづいてサンプルプログラムを越えるものは作れなかった。


2023年3月5日日曜日

UNIX時間(6)

UNIX時間(5)からの続き

世界で活躍し『日本』を発信する日本人の一人にも選ばれている,まつもとゆきひろ(松本行弘)さんが作った ruby(1995-)は,日本発のオブジェクト指向スクリプト言語だ。ウェブアプリケーションフレームワークのRuby on Rails まで進めば御利益が多そうだけれど,近づいたことはないので,小波英雄さんが京都女子大のプログラミング教育で使っていたPerlの後継言語といった印象を持っていた。

一方のRust(2010-)は,評判だけ耳にしていた。この度改めて一からインストールして試してみた。日曜プログラマがちょっと遊んでみるには敷居が高いのかもしれない。C++代替を目指している現代的なプログラミング言語で,プロの評判は一番だけれど習得しにくさもトップレベルという面倒なやつ。

BingChatに,「rustを使って次の内容を実行する1つのプログラムを書いてください。 (1) 現在時刻をミリ秒単位まで取得して年月日時分秒の形式で表示する。 (2) (1) の結果をUNIX時間へ変換して表示する。 (3) UNIX時間=0に対応する年月日時分秒を表示する。 (4) UNIX時間=2**31-1(or 2^31-1)に対応する年月日時分秒を表示する。」と指示したところ,次のまともに動作するプログラムが出力された(コメントのみ手を入れている)。


#!/usr/bin/ruby
require "time"

## msec単位の現時刻
tn =  Time.now
tm = tn.iso8601(3)
p tm
## 年月日時分への変更
t = Time.now.to_i
d = Time.at(t).strftime("%Y/%m/%d %H:%M:%S")
p d
## UNIX時間への変更
t =  Time.parse(d).to_i
p t
## UNIX基準時
t = 0
d = Time.at(t)
p t,d
## 2038年問題
t = 2**31-1
d = Time.at(t)
p t,d



use std::time::{SystemTime,UNIX_EPOCH};
use chrono::{DateTime,Utc,Local};

fn main() {
// 現在日時の取得(ミリ秒)
//    let datetime = DateTime::<Utc>::from(now);
    let now = SystemTime::now();
    let datetime = DateTime::<Local>::from(now);
    println!("現在時刻: {}", datetime.format("%Y-%m-%d %H:%M:%S%.3f"));
// UNIX時間への変換
    let unix_time = now.duration_since(UNIX_EPOCH).expect("Time went backwards").as_millis();
    println!("UNIX時間: {}", unix_time);
// UNIX基準時
    let zero_time = UNIX_EPOCH;
    let zero_datetime = DateTime::<Utc>::from(zero_time);
    println!("UNIX時間=0: {}", zero_datetime.format("%Y-%m-%d %H:%M:%S%.3f"));
// 2038年問題
    let max_unix_time = UNIX_EPOCH + std::time::Duration::from_secs((2u64.pow(31)) - 1);
    let max_unix_datetime = DateTime::<Utc>::from(max_unix_time);
    println!("UNIX時間=2^31-1: {}", max_unix_datetime.format("%Y-%m-%d %H:%M:%S%.3f"));
}

Rustは次のようにインストールした。Cargoというビルドシステム兼パッケージマネージャを使うのが普通らしい。

% brew install rustup-init
% rustup-init
% source "$HOME/.cargo/env"
% which rustup
~/.cargo/bin/rustup
% rustup --version
rustup 1.25.2 (2023-02-01)
% which rustc
~/.cargo/bin/rustc
% rustc --version
rustc 1.67.1 (d5a82bbd2 2023-02-07)
% which cargo
~/.cargo/bin/cargo
% cargo --version
cargo 1.67.1 (8ecd4f20a 2023-01-10)
% cargo new hello_rust
% cd hello_rust
% cargo run
   Compiling hello_rust v0.1.0 (~/code/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.64s
     Running `target/debug/hello_rust`
% cargo install cargo-edit
% cargo install cargo-watch
% rustup component add rustfmt
% rustup component add clippy
% rustup component add rls rust-src rust-analysis
% rustup update stable
$ rustup doc
file://~/.rustup/toolchains/stable-aarch64-apple-darwin/share/doc/rust/html/rust-by-example/index.html


2023年3月4日土曜日

UNIX時間(5)

UNIX時間(4)からの続き

いつの間にか,Python(1991-)がプログラミング言語の主役に躍り出ていた。Jupyterでも使えるので,環境は整っている。一方のPerl(1987-)は,今ではオブジェクト指向のRuby(1995-)に取って代わられたのかもしれない。

最初に,Pythonという言葉を耳にしたのは「インターネットと教育」祭の最終段階のころだったか。誰かが,Zope(1999-)というPythonで書かれたすごいシステムがあって何でもできるような話をしていたころだ。それがどこかでCMSのPlone(2001-)につながるのだが,そのデザインに引かれて,自分でもポータルサイトに使いかけていたことがあった。


#! /Users/koshi/bin/python
#
import datetime
import pytz
import time
#
# 現在のUNIX時間を出力
unix_time = int(time.time())
print(unix_time)
print(datetime.datetime.fromtimestamp(unix_time))
# UNIX時間に変換
ud = datetime.datetime(1973, 9, 20, 6, 0, 0, 0)
tz = pytz.timezone("Asia/Tokyo")
ud = tz.localize(ud)
ut = ud.timestamp()
print(ut)
# 年月日日時分に変換
ud=datetime.datetime.fromtimestamp(ut)
print(ud)
# UNIX基準時
n = 0
print(n)
print(datetime.datetime.fromtimestamp(n))
# 2038年問題
n = 2**31-1
print(n)
print(datetime.datetime.fromtimestamp(n))




#!/usr/bin/perl
#
use strict;
use warnings;
use Time::Local 'timelocal';
use Time::HiRes 'gettimeofday';
my $ut = 0;
my ($msec, $sec, $min, $hour, $day, $month, $year) = shift;

# 現在時刻の取得
($year, $month, $day, $hour, $min, $sec, $msec) = getCurrentTimeStr();
printf("JST: %04d/%02d/%02d %02d:%02d:%02d.%003d\n", $year ,$month, $day, $hour, $min, $sec, $msec);
# UNIX時間への変換
$ut = timelocal($sec, $min, $hour, $day, $month-1, $year);
print($ut,"\n");
# 年月日時分秒への変換
getDateTimeStr($ut);
# UNIX基準時
$ut = 0;
print($ut,"\n");
getDateTimeStr($ut);
# 2038年問題
$ut = 2**31-1;
print($ut,"\n");
getDateTimeStr($ut);
exit 0;

sub getCurrentTimeStr {
    my ($epochSec, $microSec) = gettimeofday();
    my ($sec, $min, $hour, $day, $month, $year) = localtime($epochSec);
    $year += 1900;
    $month++;
    return ($year,$month,$day,$hour,$min,$sec,$microSec)
}

sub getDateTimeStr {
($sec, $min, $hour, $day, $month, $year) = localtime($ut);
$year += 1900; $month += 1;
printf("JST: %04d/%02d/%02d %02d:%02d:%02d\n", $year ,$month, $day, $hour, $min, $sec);
}