ときどきの雑記帖 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
お、これ欲しいと思ってたやつなので後で良く読まねば。