ときどきの雑記帖 RE* (新南口)
人として軸がぶれている
あけおめ
今年もよろしく。
宿題
昨年の振り返りだとか今年の抱負といったものは華麗にスルーして、 昨年からの持越しになっているネタをとりあえず列挙してみる。
- glob bash編
- git のソースコード読み
- SectorLisp のソースコード読み
- sectorForth のソースコード読み
- isjhira, isjkana等のja_jpなlocale固有のcharacter classの実装方法
こんなところかな。
ボチボチ片づけていきます(たぶん)。
旦
まーじーでー。
先週のしずえさんはまさにそれ(地平線から太陽が昇る形) を解答にしていた(し、自分もそう記憶していた)わー。
Wolfram Cloud Basic とか Mathematica Online とか
昨年暮れに無料で使えるプランがWolfram Cloud にあると知り、 ちょっと調べたが何がどのくらい使えるのか正直よくわからん。
Wolframサポート よくある質問: Wolfram Cloud Basicプランの使用に際しての制約
Wolfram Cloud Basicは,Wolfram Cloudへの無料の基本アクセスを提供しますが,団体でご利用になることはできません.
この基本のWolfram Cloudプランでは以下が利用できます.
- 200MBのクラウドストレージ
- 1ヶ月につき5,000のCloudクレジット(詳細はこちらのページをご覧ください)
- 一時的なファイルの保存と配備(ファイル,配備,APIは60日後に無効になります)
Mathematicaをインターネットで無料で使う方法 | 右に曲がりし呟き という記事もあったりするのだけど Wolfram Cloud:計算,知識,配備の統合 や Wolfram Mathematica Online: Mathematicaをクラウドで活用 を見るとMathematicaは無料では使えないような気もするんだよなあ。
一応有料プランもチェックしておくと、個人対象のものでは
家庭・趣味向けのMathematicaの価格:個人ライセンスオプション
- 2400JPY / Month
- 23200JPY / Year
といったところが下限のようだ。 無料でなきゃ使わないとは言わないし、 これぐらいなら(一年分まとめてはちょっと悩むが) 何か明確な目標があるなら出してもいいよなあ。
ということで何か考えよう。
京大のアレ(続)
年も改まったのでみんな次の話題(ってなんだろう)に移っているだろうけど ネチネチと調べ続けていたりするのであった😄
そう言えばいくつかのFOSSの「アーキテクチャ」を詳細に解説していた本があって、 その中にbashもあったような。ということを思い出した。 ブックマークなどはしていなかったので検索する手間はあったけど すぐに見つかった→The Architecture of Open Source Applications。
ページの最初の方に 500 Lines or Less や The Performance of Open Source Applications というのがあるけど、そこからさらに下の方にスクロールしていくと The Architecture of Open Source Applications Volume I、 The Architecture of Open Source Applications Volume II がある。 その Volume Iの方にbashの章 The Architecture of Open Source Applications: The Bourne-Again Shell があった。のだけど検索しているときに翻訳されたものも見つかった (The Bourne-Again Shell (bash) - オープンソースアプリケーションのアーキテクチャ (翻訳)) のでまずはそこから。
ざっと読んでいくとこんな記述にあたった。
非対話入力処理
readline を使わない場合、bash は stdio または独自のバッファ入力ルーチンを使って入力を取得します。 ただしシェルが対話モードでないときには、 stdio ではなく bash 独自の入力パッケージを使うことの方が望ましいです。 というのも、Posix には入力の読み込みについて奇妙な制限があるからです。 シェルが入力を読み込むときにはコマンドにパース必要な分だけが読み込まれ、残りの部分は実行されるプログラムに回されます。 シェルは入力をいくらでも読むことができますが、それをしてよいのはパーサーが最後に処理した文字までファイルをロールバックできるときだけです。 つまりこの読み込み処理を実装するとなると、パイプのようなシーク不可能なデバイスの場合には文字を一文字ずつ読んで バッファにコピーしなければならないのです。一方で、最初からバッファを使えばファイルの内容を自由に飛ばしながら読み込むことができます。
以上の細かいことを置いておけば、非対話入力時におけるシェルが行う処理の出力は readline を使った場合と同じです。 つまり、末尾に改行の付いた文字列のバッファが出力されます。
ちょっと意味が取りづらいと感じた部分があったので原文も同様に。
The Architecture of Open Source Applications: The Bourne-Again Shell
3.3.2. Non-interactive Input Processing
When the shell is not using readline, it uses either stdio or its own buffered input routines to obtain input. The bash buffered input package is preferable to stdio when the shell is not interactive because of the somewhat peculiar restrictions Posix imposes on input consumption: the shell must consume only the input necessary to parse a command and leave the rest for executed programs. This is particularly important when the shell is reading a script from the standard input. The shell is allowed to buffer input as much as it wants, as long as it is able to roll the file offset back to just after the last character the parser consumes. As a practical matter, this means that the shell must read scripts a character at a time when reading from non-seekable devices such as pipes, but may buffer as many characters as it likes when reading from files.
These idiosyncrasies aside, the output of the non-interactive input portion of shell processing is the same as readline: a buffer of characters terminated by a newline.
ポイント(と思えるの)はここ
シェルが入力を読み込むときにはコマンドにパース必要な分だけが読み込まれ、残りの部分は実行されるプログラムに回されます。
(the shell must consume only the input necessary to parse a command and leave the rest for executed programs. )
つまり、「シェルスクリプトを事前に丸ごと読んで解析木を構築してから処理するようなことをしてはいけない」 ように解釈できる? ということで、POSIXになんかあるのかとOpen Groupのサイトでシェルに関する記述を確かめる。 が、どうもそのものズバリが書かれているわけではないようでちょっと悩んだ
そういった中で関係ありそうに思えたのは sh のこの部分、
STDIN
When the shell is using standard input and it invokes a command that also uses standard input, the shell shall ensure that the standard input file pointer points directly after the command it has read when the command begins execution. It shall not read ahead in such a manner that any characters intended to be read by the invoked command are consumed by the shell (whether interpreted by the shell or not) or that characters that are not read by the invoked command are not seen by the shell. When the command expecting to read standard input is started asynchronously by an interactive shell, it is unspecified whether characters are read by the command or interpreted by the shell.
If the standard input to sh is a FIFO or terminal device and is set to non-blocking reads, then sh shall enable blocking reads on standard input. This shall remain in effect when the command completes.
こういうのを踏まえていくつかのシェルのソースコードを読み返してみると なるほどと思える部分があるのだけど、これをまとめるのは面倒だな (なのでたぶんやらない)。
bashでない普通のshやkshでは起きない。もしくは*BSD系tcshでも起きない。バイナリであってもi-nodeのリンクカウントが0に成るだけで元のファイルは残っててそれが実行される。cronから呼ばれる時は/var/spool/cron/の下にスクリプトがコピーされて実行される。今回の挙動はSysVやLinux系だけでは?
— だよもんフレンズは在宅BSD仕事したい (@daemon1995) December 29, 2021
readシステムコールで毎回改行までだけ読むというのは効率的には実装できないので、stdio関数を使っていたらなおさら適当な境界まで読み、同一inode上書きでも行ごとには発生しなそう。bashの場合は子プロセス実行のたびに意図的にsync_buffered_stream()が逆シークしてfdを巻き戻し読みなおしてますね
— 技師長 (@gishicho) December 30, 2021
いえなんかしつこくてすいませんw
— 技師長 (@gishicho) December 30, 2021
/bin/sh だと 8K 読んでおしまいなので、実行中の書き換え時の挙動も sh と bash で違うと言えるのではないかなと思います(今回初めて知りました)
まあそんなことするな、ってのがそもそもではありますが pic.twitter.com/mjVRLMAGrx
The Architecture of Open Source Applications: The Bourne-Again Shell の記述を信じるならば、 ふつー(ってなんですか)のシェルであれば 今回の現象が起きる可能性を抱えているような気がしてしまうのだけど、 ↑などで「起きなかった」というのは 「起こる可能性が全くなくて実際起きなかった」 のか、あるいは 「何か条件が足りなくてたまたま起きなかった」 のか引っかかるところではある (が、面倒なので(ry)。
ソースコードを細かく追いかけている元気はないので 簡単にseekで検索してみると、v7のシェルでもzshでも使ってますね。 どういう局面でなんのために呼び出しているかまではわからないけど、 (POSIX等の縛りを考えなければ) ふつーは必要になりそうとは思えんよなあ。
name.c:124: IF lseek(0,0L,1)==-1
name.c:148: lseek(0, (long)(f->fnxt-f->fend), 1);
service.c:57: THEN lseek(fd, 0L, 2);
builtin.c:4466: ((fseek(FOUT, 0L, SEEK_SET) == 0) && !(BUF[count] = '\0')) && \
exec.c:6048: (len = lseek(fd, 0, 2)) != -1) {
exec.c:6056: lseek(fd, 0, 0);
hist.c:2651: fseek(in, lasthist.fpos, 0);
hist.c:2726: fseek(in, 0, 0);
hist.c:2825: lck.l_whence = SEEK_SET;
input.c:498: fseek(in, 0, 2);
input.c:500: fseek(in, 0, 0);
parse.c:3213: if (lseek(fd, o, 0) == -1 ||
parse.c:3349: (flen = lseek(fd, 0, 2)) == -1) {
parse.c:3360: lseek(fd, 0, 0);
parse.c:3842: lseek(fd, ((h->start * sizeof(wordcode)) +
watch.c:172: fseek(in, 0, 2);
watch.c:174: if (fseek(in, ((first) ? -1 : -2) * sizeof(WATCH_STRUCT_UTMP), 1)) {
八算
昨年末にとある雑誌を買いにいったときに
が目に入ってきて、「数学者たちのこころの中」というタイトルが気になったので一緒に買ってしまった。
数学史にまつわる著書・訳書を数多く手掛けてきた著者による、人が何かを学ぶことについても深く考えさせられる、ユニークな数学者列伝。
一.和算文化:算額
二.ピュタゴラスの定理は誰のもの:ピュタゴラス
三.論証数学の始まり:エウクレイデス『原論』
四.すべてはアラビア数字から始まる:フワーリズミーとオマル・ハイヤーム
五.商人から数学へ:ピサのレオナルド
六.「神は数学者」:ケプラー
七.世俗と信仰の中で:パスカル
八.バロックの万能人:ライプニッツ
九. 魔女から聖女へ:アニェージ
十.女性数学雑誌:『レイディーズ・ダイアリー』と数学愛好者たち
十一.熱き数学者:フーリエ
十二.東欧から生まれた幾何学世界:ボヤイ・ヤーノシュ
十三.数の魔術師:ラマヌジャン
で、その第一回が昨日(1/2)にあったのだけど 当然のように放送を聞き逃したので(土曜日の夕方に再放送もあるけど) 配信で聴いた こころをよむ - NHK
今回の話ででてきた「八算」というのが興味深かった。
算額も話題に出てきたけどまだあるのかな>福徳神社
- 【終了しました】大型連休企画「おうちで和算―算額の問題を解こう―」 | 祈願・お参りは東京都中央区日本橋の福徳神社
- 『算額を見に』by Sisyphus|福徳神社 (芽吹稲荷)のクチコミ【フォートラベル】
- 福徳神社さん (@fukutoku_mebuki) / Twitter
2022
2022ってどっか既視感ある数字だなと思ってたけど
— mkuroki (@mkuroki24sp) January 1, 2022
お前だったか、ISO-2022-JP……
【全ての始まり】1月3日は『機動戦士ガンダム』で一年戦争が勃発した日
— ライブドアニュース (@livedoornews) January 2, 2022
スペースコロニーであるサイド3が、突如ジオン公国を名乗り独立を宣言。地球連邦政府に対し宣戦布告した。その後、ジオンによりコロニー落としが遂行され、地球人口の半数が死亡する未曾有の災禍がもたらされる。 pic.twitter.com/8n1lXtMj3Y