ときどきの雑記帖 RE* (新南口)
𝄇
今週のしずえさん
「新鮮なコーヒー」とは、「何をして」からの時間があまり経っていないもの?
歯医者
ここ数回は歯周病などの検査と歯石除去くらいですんでいたのだけど、 ちょっと前に以前治療したところの詰め物(被せ物?)が取れてしまったので 今回はそれも。
そう言えば世の中では3Dスキャンと3Dプリンターでこの種のモノを作れるようになって 「型を取ってから一週間」とか待たなくてもすむようになりつつあるのだとか。
歴史もの
歴史上の出来事をベースにした作品の、これは創作だろうという部分を 歴史的な事実のように書く(司馬遼太郎作品からのアレとか)手合いと言うのは 大嫌いなんだけど (いやまあそれをそれと知らない可能性もあるけれど)、 とある本(特にタイトルを秘すが、現状分析と将来への提言が書かれた本。たぶん)を読んでいたら もろにそういう下りが出てきて一気に興味が失せた(笑)
別にアニメやら特撮、マンガなどからセリフなり設定なりを 「引用」するのは構わないけど、フィクションとそうでないところは きちんと「線引き」しておいて欲しいよなあ。
という書き方ではたぶん自分が何に「引っかかった」のかは通じないと思うけど まあそれはそれ。
aibo
aiboの良くない点 - 北海道苫小牧市出身の初老PGが書くブログ
そう言えば前述の本で、aibo(のサブスクリプション)をほめてたような。
モータル・コンバット
ある映画を観に行ったんですけどね、 その本編上映前の予告編で「モータル・コンバット」のそれが出てきてびっくりしたんですよ。 アレを映画にしたんかと。
予告編は面白そうだったが、さて。
Excelのなぞ
一、二、三、第をソートしたらどんな結果になると思います?
ひょっとしたらバージョンによるのかもしれないけど、 Excel 2016とMicrosoft 365のExcelではなんとこうなった。
| 文字 | Unicode | 
|---|---|
| 一 | 4E00 | 
| 三 | 4E09 | 
| 第 | 7B2C | 
| 二 | 4E8C | 
なにこれ。
テーブルの右のカラムは参考のためのUnicodeでのコードポイントなのだけど 「三」と「二」はまあそういう(「ニ」のコードポイントの方が大きい)ものだからしょうがないとして、 なぜに「第」がそこにくるの?
念のため右のカラムをキーにしてソートすると
| 文字 | Unicode | 
|---|---|
| 一 | 4E00 | 
| 三 | 4E09 | 
| 二 | 4E8C | 
| 第 | 7B2C | 
だよねえ。
検索すると「ふりがな」のデータがあるとソート結果が 「おかしくなる」という事例が散見されるのだけど、 そんなものはなかったりする (他で入力してテキストとしてコピーした)
ためしに Google spreadsheet でもやってみたけどこちらは「期待通り」の結果だった。
ううむなんじゃこれ。
追記
解説をいただいた Not only is the Internet dead, it’s starting to smell really bad.:2021年06月19日分
プレスコットのピクルスの原理
SES企業はやめた方がいいですか? - komagataのブログ
で出てきた「プレスコットのピクルスの原理」というのに興味をひかれたので ちょっと調べてみた。
ワインバーグ「プレスコットのピクルスの原理:漬け水がキュウリに漬かるよりは、キュウリが漬け水に漬かるほうが早い。」ふむ。原理の続報「一度漬かったキュウリはほかの漬け水に漬かりづらい」か?
— ken nakano (@ken_na) August 29, 2011
- 心に留めておきたいこと
 - ピクルス原理を誤用(応用)する - komagataのブログ
 - コンサルタントの秘密・法則対応表 - HifeLacks - serenista@wiki - atwiki(アットウィキ)
 
うーむ、ワインバーグ先生の本は読んでいたはずなんだが。 それはともかくこのピクルスの原理がどういうものかの説明を読んでいたら
を連想したという次第。
glob(そのn+7)
v7unix/v7/usr/src/cmd/sh at master ・ v7unix/v7unix
exfile
  + execute
  |   + cmd
  |      + list
  |          + term
  |              + word
  |              + item
  + getarg
  |   + split
  |       + expand
  |           + addg
  + scan
  |
  + execa
     + execs
前回までで executeから word、itemへと潜っていく流れを終えたので 今回はgetargから。
getarg はとても短い。
/* Argument list generation */
INT	getarg(ac)
	COMPTR		ac;
{
	REG ARGPTR	argp;
	REG INT		count=0;
	REG COMPTR	c;
	IF c=ac
	THEN	argp=c->comarg;
		WHILE argp
		DO	count += split(macro(argp->argval));
			argp=argp->argnxt;
		OD
	FI
	return(count);
}
getarg の引数 acの型は、と言うと名前にPTRとついていることから見当がつくように
v7unix/mode.h at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
STRUCT comnod	*COMPTR;
要するにポインター。それが指す型を詳しく見ると
v7unix/mode.h at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
struct comnod {
	INT	comtyp;
	IOPTR	comio;
	ARGPTR	comarg;
	ARGPTR	comset;
};
こう。
二番目の IOPTR comio がちょっと気になるけどとりあえず忘れる。
getargから呼び出している macroとsplitは以下の通り。
v7unix/macro.c at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
STRING	macro(as)
	STRING		as;
{
	/* Strip "" and do $ substitution
	 * Leaves result on top of stack
	 */
	REG BOOL	savqu =quoted;
	REG CHAR	savq = quote;
	FILEHDR		fb;
	push(&fb); estabf(as);
	usestak();
	quote=0; quoted=0;
	copyto(0);
	pop();
	IF quoted ANDF (stakbot==staktop) THEN pushstak(QUOTE) FI
	quote=savq; quoted=savqu;
	return(fixstak());
}
こちらは(今回の件については)「なんかやってるなー」くらいでスルーしてヨシ。 で、もうひとつのsplitはこう
v7unix/service.c at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
LOCAL INT	split(s)
	REG STRING	s;
{
	REG STRING	argp;
	REG INT		c;
	INT		count=0;
	LOOP	sigchk(); argp=locstak()+BYTESPERWORD;
		WHILE (c = *s++, !any(c,ifsnod.namval) && c)
		DO *argp++ = c OD
		IF argp==staktop+BYTESPERWORD
		THEN	IF c
			THEN	continue;
			ELSE	return(count);
			FI
		ELIF c==0
		THEN	s--;
		FI
		IF c=expand((argp=endstak(argp))->argval,0)
		THEN	count += c;
		ELSE	/* assign(&fngnod, argp->argval); */
			makearg(argp); count++;
		FI
		Lcheat(gchain) |= ARGMK;
	POOL
}
この split の方で、以前調べたexpandがようやく登場。 ということで改めてexpandの中身を見るとこう。
v7unix/expand.c at ed636a47207476db76d53b7869447889dee3bbad · 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 */
	/* 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
	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
	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);
		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);
}
ちょっと長めだけど、肝となるのは あるディレクトリにあるファイルの名前がパターンにマッチしているか調べて マッチしたものを「登録」していくところで、要するに
IF gmatch(entry.d_name, cs)
THEN	addg(s,entry.d_name,rescan); count++;
FI
この部分。addgも以前見ていたと思うけど短いので再度
v7unix/expand.c at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
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));
}
ポイントは最後のmakearg(endstak(s2));で、
v7unix/expand.c at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
makearg(args)
	REG STRING	args;
{
	args->argnxt=gchain;
	gchain=args;
}
まあlinked listに繋いでいくということですね。 addgで引数に使っているsが最初はどうなっているかというと
v7unix/expand.c at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
s=cs=as; entry.d_name[DIRSIZ-1]=0; /* to end the string */
/* 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
LOOP	IF cs==s
	THEN	s=nullstr;
		break;
	ELIF *--cs == '/'
	THEN	*cs=0;
		IF s==cs THEN s="/" FI
		break;
	FI
POOL
s は nullstr ("")か、"/“か、あるいは /で終わる文字列のいずれかで、
globパターンに/が含まれていない場合は
nullstrになる。
ということは、パターンにマッチするファイルが見つからなかった場合は addgが呼ばれない→linked listはnullstrだけ→ 空文字列に置き換えられる。という流れになる。
ということで Bourne shellの巻、完。
VS Code
- Visual Studio CodeでGitHubリポジトリを「読む」のに便利な拡張機能が登場 - 窓の杜
 - VS Code で GitHub 上のリポジトリを直接参照できる「Remote Repositories」を試してみた | DevelopersIO
 
これ、早速入れようとしたのだけど Remote Repositories: Open Repository コマンドなるものが候補に出てこないのだけどなぜーっ
Hugo メモ
を見ていたら config.toml の設定で
pygmentsCodeFences = true
pygmentsUseClasses = true
というのがあったのだけどどうも見覚えがない。
pygmentsCodefencesにtrueをセットするとSyntax Highlightingが有効になります。pygmentsCodefencesのみ有効にした状態では、 preタグにstyle属性が追加されます。pygmentsUseClassesを有効にすると、次に作成するcssのスタイルを適用することができます。
シンタックスハイライト自体は今でも使えてるのだけどなんだろう (markdownパーザーの変更と何か関係が?)
PygmentsCodeFences—how to choose themes? - support - HUGO
コードブロックにタイトル
上記のことを調べているときにみつけたもの。
HugoのコードブロックにQiitaのようなTitleをつける | AABrain
お、これ欲しいと思ってたやつなので後で良く読まねば。