ときどきの雑記帖 RE* (新南口)
かもめが翔んだ日
油壷マリンパーク
- 「京急油壺マリンパーク」閉館へ 53年の歴史に幕 消えていく鉄道会社のレジャー施設 | 乗りものニュース
- 京急油壺マリンパークの閉館について | お知らせ | 京浜急行電鉄(KEIKYU)
- 53年続いた「京急油壺マリンパーク」が9月で閉館 跡地は都市近郊リゾートとして開発 | World Transit Maps [WTM]
たぶん片手で数えられるくらいの回数しか行ったことがないし、特にこれという思い出の場所でもないのだけど 閉館するのかあ。一番最近だと4年位前に行ったけど、何というか行くのがなかなか大変ではあったな。 そういやどこかで水族館としては八景島の方が交通の便が格段に良いしという意見も見かけたな。
まあ、閉館前にもう一度行くのはなかなか無理そうではある。
水族館について
で、「水族館」については色々ともやもやするものを常々感じているのだけど 今回はそこには触れないでおく(きちんと書き出すの面倒)。
なくなると言えば
ここもか。
丸善ジュンク堂書店どうなるの?
今週のしずえさん
トマトケチャップとかビールとか。
sha256
どう読んで(発音して)いますか?
Sealed
さすがにカタカナ書きにはできなかった模様>Sealed
動詞を原形にしてそれをカタカナ書き…ってのもこれは無理そうだなあ😄
git
コード読み進んでねーっと思っていたらこんな記事が
git gc の仕組みを原理から理解してサイズを 136MB → 7.2MB(95%減)まで削減した時の勉強メモ
記事の内容とは直接関係ないけど、 「GitHub トレーニングチームから学ぶ Git の内部構造」に行ってきました #githubjp - 若くない何かの悩み こういうイベントもあったそうで(2013年)。
glob
こっちもあんま進んでないす。
とりあえず、前回丸ごと貼り付けた v7unix/expand.c at master · v7unix/v7unix をもうちょっと詳しく。
INT expand(as,rflg)
STRING as;
{
INT count, dirf;
BOOL dir=0;
STRING rescan = 0;
REG STRING s, cs;
ARGPTR schain = gchain;
struct direct entry;
STATBUF statb;
IF trapnote&SIGSET THEN return(0); FI
s=cs=as; entry.d_name[DIRSIZ-1]=0; /* to end the string */
各変数の型、特に全部大文字で書かれたそれが具体的にどういったものなのかは いったん脇によけておいて。
schain = gchain;
で出てくるgchainというのはその名にgがついていることから
見当がつくように、グローバル変数。
ということはここに来るまでに初期化されていたり、
ここを含め色々な関数で操作されたりするわけだけどこれもとりあえず忘れる。
/* check for meta chars */
BEGIN
REG BOOL slash; slash=0;
WHILE !fngchar(*cs)
DO IF *cs++==0
THEN IF rflg ANDF slash THEN break; ELSE return(0) FI
ELIF *cs=='/'
THEN slash++;
FI
OD
END
ここで出てきた fngchar
というのは実際にはマクロで
#define fngchar(c) (((c)"E)==0 ANDF _ctype2[c]&(T_FNG))
こういった定義。ここでQUOTE は0200(0x80)で、 要は8ビットデータの最上位ビット。 今では考えられないけど、こうやって「文字」の最上位ビットをほかの用途に使っちゃう (さらには引数を書き換えちゃう) ことは、8ビット目を使う「文字」が広く使われるようになるまでは割とあった。
そして、T_FNGというのは「文字」の分類を表すもので具体的にはこの三つ。
#define _SQB (T_FNG)
#define _AST (T_AST|T_FNG)
#define _QU (T_DEF|T_FNG|T_SHN)
それぞれ、_SQB はSQuare Bracket、 _AST は Asterisk、 _QU は Question mark の略(だと思う)。
にしても FNG ってなんの略だ?
LOOP IF cs==s
THEN s=nullstr;
break;
ELIF *--cs == '/'
THEN *cs=0;
IF s==cs THEN s="/" FI
break;
FI
POOL
IF stat(s,&statb)>=0
ANDF (statb.st_mode&S_IFMT)==S_IFDIR
ANDF (dirf=open(s,0))>0
THEN dir++;
FI
ここでディレクトリをopen(2)して(後続の部分ではさらにそこから読み込みをして)いますが、UNIXなのでそういうものです。 openしたあとは
count=0;
IF *cs==0 THEN *cs++=0200 FI
IF dir
THEN /* check for rescan */
REG STRING rs; rs=cs;
REP IF *rs=='/' THEN rescan=rs; *rs=0; gchain=0 FI
PER *rs++ DONE
WHILE read(dirf, &entry, 16) == 16 ANDF (trapnote&SIGSET) == 0
DO IF entry.d_ino==0 ORF
(*entry.d_name=='.' ANDF *cs!='.')
THEN continue;
FI
IF gmatch(entry.d_name, cs)
THEN addg(s,entry.d_name,rescan); count++;
FI
OD
close(dirf);
read(2)で読み込むと。 今なら readdir(3) Man page of READDIR を使うところですね、
読み込んだデータに対して、d_ino == 0
iノードの番号が0かどうかの判定をしていますが
はて、0番とは? と思い調べてみると
未使用部分を表すのに使われていた(る)らしい?
c - Why do inode numbers start from 1 and not 0? - Stack Overflow
i ノードリストは、i ノード 2 から順番にチェックされます (i ノード 0 と i ノード 1 は予約済み)。
ext2のinode取得 - Linuxの備忘録とか・・・(目次へ)
(inode番号の最初は0でなく1のようです。)
inodeにはs_first_inoというメンバーがあります。通常(?)は11のようで、11からユーザプロセスで作成したファイルに割り当てられるようになっています。 1から10までは予約となっていて、ext2では下記のようになっています。
脱線
readdir っていつからあるのだろうと調べたら
opendir(), readdir(), telldir(), seekdir(), rewinddir(), closedir() および dirfd() の各関数は BSD 4.2 で登場しました。
この辺らしいです(BSD 4.2のリリース時期は各自の宿題ということで)。
それとこんなのも。あー、なんか見覚えが>readdir_r は使ってはいけない
- 【C言語】readdir() vs readdir_r() - Qiita
- 革命の日々! readdir_r は使ってはいけないという話
- readdir_r は使ってはいけないという話 : 革命の日々 その2
さらにさらに 革命の日々! 効率的なdirectry readingコードについて
そもそも some_pathを足してopenする事自体がracyでダメ。パスをたぐってる間に別プロセスがリンクを張り直したりできるよ。 セキュリティーホールになるよ。openat()を使うべし
とあったので(知らなかった>openat)調べたら
openat() や “at” が後ろに付いたその他の同様のシステムコールは、 2 つの理由により提供されている。
faccessat(2), fchmodat(2), fchownat(2), fstatat(2), futimesat(2), linkat(2), mkdirat(2), mknodat(2), open(2), readlinkat(2), renameat(2), symlinkat(2), unlinkat(2), mkfifoat(3), path_resolution(7)
なるほど。
gchain
脱線はこのくらいにして話を戻すと
IF rescan
THEN REG ARGPTR rchain;
rchain=gchain; gchain=schain;
IF count
THEN count=0;
WHILE rchain
DO count += expand(rchain->argval,1);
rchain=rchain->argnxt;
OD
FI
*rescan='/';
FI
FI
BEGIN
REG CHAR c;
s=as;
WHILE c = *s
DO *s++=(c&STRIP?c:'/') OD
END
return(count);
}
最初に出てきた gchain
がまたここで登場。
なんとなーく、linked list の操作をしているように見えますな。
gmatch
与えられたパターンとファイル名がマッチするかをチェックする関数。 これもイマドキであれば Man page of FNMATCH とかありますね。
gmatch(s, p)
REG STRING s, p;
{
REG INT scc;
CHAR c;
IF scc = *s++
THEN IF (scc &= STRIP)==0
THEN scc=0200;
FI
FI
SWITCH c = *p++ IN
case '[':
{BOOL ok; INT lc;
ok=0; lc=077777;
WHILE c = *p++
DO IF c==']'
THEN return(ok?gmatch(s,p):0);
ELIF c==MINUS
THEN IF lc<=scc ANDF scc<=(*p++) THEN ok++ FI
ELSE IF scc==(lc=(c&STRIP)) THEN ok++ FI
FI
OD
return(0);
}
default:
IF (c&STRIP)!=scc THEN return(0) FI
case '?':
return(scc?gmatch(s,p):0);
case '*':
IF *p==0 THEN return(1) FI
--s;
WHILE *s
DO IF gmatch(s++,p) THEN return(1) FI OD
return(0);
case 0:
return(scc==0);
ENDSW
}
STRIP は 0x7f(0177)。つまり8bitデータの最上位ビットを落とすためのマスクですね。 最上位ビットを色々なフラグとして使っているようで、 この辺も書かれた時代をうかがわせますね。
その他は再帰を使っているぐらいで特に難しい部分はないかと (そう言えば初期の正規表現ライブラリにもこんな感じに再帰を使っているのがあったような)。
addg
addgはこんな。
LOCAL VOID addg(as1,as2,as3)
STRING as1, as2, as3;
{
REG STRING s1, s2;
REG INT c;
s2 = locstak()+BYTESPERWORD;
s1=as1;
WHILE c = *s1++
DO IF (c &= STRIP)==0
THEN *s2++='/';
break;
FI
*s2++=c;
OD
s1=as2;
WHILE *s2 = *s1++ DO s2++ OD
IF s1=as3
THEN *s2++='/';
WHILE *s2++ = *++s1 DONE
FI
makearg(endstak(s2));
}
短い関数だけど
- locstack
- endstak
- makearg
辺りがどういったものなのかよくわからない (なんとなく推測はできるけど)ので、 次回はここからにすることにしておく。
PCRE
JITコンパイルやら色々追加されているらしいので 改めてちょいと追いかけてみようかなと。
PCRE - Perl Compatible Regular Expressions
Versions
There are two major versions of the PCRE library. The current version, PCRE2, first released in 2015, is now at version 10.36.
The older, but still widely deployed PCRE library, originally released in 1997, is at version 8.44. Its API and feature set
are stable—future releases will be for bugfixes only. Any new features will be added to PCRE2, and not to the PCRE 8.x series.
後藤弘茂のWeekly海外ニュース https://t.co/6mFQa99DOa
— 愉快な生活送り太郎 (@hassyX) April 14, 2021
2021年から更新が一切無くなったので調べてみると、どうやらSNSもスッパリ辞めて関係者ですら後藤さんと連絡が取れなくなってるらしい。ここ↓の1:29:00から西川善司氏が話してる。https://t.co/XIwO0sU7jd
ref. 後藤弘茂のWeekly海外ニュース 2020年 記事一覧 - PC Watch
echo
Mac上でHaMLetをMLtonでビルドすると標準出力に何も出てこないんだけど何がいけないんだ(Linux上だとうまくいくしMLton以外のコンパイラーだとうまくいく)
— mod_poppo (@mod_poppo) May 14, 2021
Macだと
— mod_poppo (@mod_poppo) May 15, 2021
/bin/echo ‘foo\cbar’
の出力が
foo[改行なし]
になる。何これ?
— mod_poppo (@mod_poppo) May 15, 2021
昔なにかのUNIX本で、「echoの正しい仕様とは」みたいなのを読んだのを思い出した。 本じゃなくてネット上の記事だったかもと調べてみると The UNIX and the Echo - Everything2.com にこんな記述があった。
In the book, “The UNIX Programming Enviroment” dating back as far as to 1984, I came across a rather interesting text. On pages 78 and 79 there is a short story entitled ‘The UNIX and the Echo’
あ、たぶんこの本(“The UNIX Programming Enviroment”)だ。 もちろん実際に読んだのはその翻訳本だけど。
そして上記の引用に続いている部分がその内容かな? ところどころ記憶に引っかかる記述が。 翻訳本をまだ持っているはずだけどすぐに出せないので確かめられんなあ。
- echo コマンドの違いと移植性の問題 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog
- echoコマンドの使い方: UNIX/Linuxの部屋
鍵RT プログラミング入門書の前書きとは思えない素晴らしい前書きだった。 pic.twitter.com/60bOgnsS0a
— ぼたもち (@kbtyskvit) May 14, 2021
_why の名前(why the lucky stiff)が出ているし、その頃(いつ?)のRuby関連の本だろうかと思ったらつい最近出たJavaScriptの本だった模様。
あんどうやすしさんの『ハンズオンJavaScript』ですね
— Masayoshi Takahashi (@takahashim) May 15, 2021
_why について知らない人や忘れてしまった人もいるだろうから 一応参考に(名前でググればすぐに見つかるけどね)
気を利かせて次の祝日を教えてくれるボンドルド#メイドインアビス pic.twitter.com/fB2ncnlXGV
— ドゥビドゥバ (@gerogero00001) May 9, 2021