ときどきの雑記帖 RE* (新南口)
カリフォルニア・コネクション
今週のしずえさん
今週は実質二日しかないのでしずえさんに遭遇できるか 心配だったけど一日目で二回(行きと帰りの両方)見ることができた。 「外れ」の日も少なくないのになんだそれは。
で、今週のお題。
ラーメンのダシをとるのに使う鶏ガラの足をとくに何と呼ぶか?
(答: もみじ)
你們好
この言葉自体は蒼天航路で(前世紀に)知ったのだけど、 なぜかそれを「你好」の丁寧な言い回しだとずっと思っていたのね😅
で、最近ようやくそれが勘違いであったことに気づいたという。
重箱の隅(InfoQ)
Netflixは迅速なアプリケーション開発のためにGraphQLマイクロサービスを擁した
Netflixエンジニアリングは先頃、どのようにNetflixが迅速なアプリケーション開発のために GraphQLマイクロサービスを擁したかを詳述したブログ投稿を公開した。
「擁する」ってこういう使いかたしたっけ?
Netflix Embraces GraphQL Microservices for Rapid Application Development
Netflix engineering recently published a blog post detailing how Netflix embraced GraphQL microservices for rapid application development.
ふむ。embraced → 擁した? でもそんな訳あったかなあ。
ん、google で「embrace」を検索したら、トップにその訳語として「擁する」ってでてきたけどなにこれ?
8 → 16 → 32 → 64
思えば遠くへきたもんだ(違
- [B! windows] 64bitへのWindowsの流れ。そして、32bit版Windowsの終焉 | ハーバー・ビジネス・オンライン
- 64bitへのWindowsの流れ。そして、32bit版Windowsの終焉 | ハーバー・ビジネス・オンライン
そう言えば32bit版サポートの話ではこういうものも Rの32bit版WindowsのサポートはR 4.1.xまで - Technically, technophobic.
glob
v7 のシェルのソースコードはここ v7unix/v7/usr/src/cmd/sh at master · v7unix/v7unix 辺りで。
名前からしてそれっぽいという理由でこのファイルから。
v7unix/expand.c at master · v7unix/v7unix
#
/*
* UNIX shell
*
* S. R. Bourne
* Bell Telephone Laboratories
*
*/
#include "defs.h"
#include <sys/types.h>
#define DIRSIZ 15
#include <sys/stat.h>
#include <sys/dir.h>
/* globals (file name generation)
*
* "*" in params matches r.e ".*"
* "?" in params matches r.e. "."
* "[...]" in params matches character class
* "[...a-z...]" in params matches a through z.
*
*/
お、当たりをひいたっぽい😄
そして続きを見ると、このファイルには四つの関数
- INT expand(as,rflg)
- gmatch(s, p)
- LOCAL VOID addg(as1,as2,as3)
- makearg(args)
がある。後述のソースコードも含め K&R形式かつ例のマクロを使っているのでアレなのはソレ。
PROC VOID addg();
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);
}
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
}
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(args)
REG STRING args;
{
args->argnxt=gchain;
gchain=args;
}
なんかlibcに関数があるような処理も直に書いている部分があるけどなんでだろう (オーバーヘッドを嫌ったとか、当時はそういう関数がなかったとか)?
それはそれとして、ここに至るまで通っているのはこの辺り。
- v7unix/main.c at master · v7unix/v7unix
- v7unix/cmd.c at master · v7unix/v7unix
- v7unix/xec.c at master · v7unix/v7unix
- v7unix/service.c at master · v7unix/v7unix
さて、どの部分から説明するのが良いですかね。 と書きつつ力尽きたので今回はここまで。
Racket
新しいのがリリースされた Racket v8.1 ということで、何の気なしに Download Racket を見てみるとこんな記述があるのに気づいた。
About sources for Windows and Mac OS:
To build from source for Windows or Mac OS, download and build a Minimal Racket distribution (see More Installers and Checksums) instead of a Racket distribution, then (when on Windows) install the racket-lib package with
raco pkg update –auto racket-lib
and then (on both Windows and Mac OS) install packages with
raco pkg install -i main-distribution
前からこうだっけ? まあそれはともかく、Minimal Racket distribution がちょっと気になる。
T_PAYLOAD
ちょっと気になったのでメモ。 ruby-coreは(まだ)登録して読んでいるけどあまり熱心には見ていないので こういう情報も見落としがちで、こうやってまとめてもらえるのはありがたい (が、特に知って何をする(活用する)というわけではないのだけど)。
ruby-trunk-changes 2021-05-07 - ruby trunk changes
[8bbd319806] Matt Valentine-House 2021-03-30 12:34:14 UTC
オブジェクトの種類に T_PAYLOAD というのを追加して、ここを先頭にして(?) heap 内の連続した slot をまとめて確保するというのに使っているようです。 struct RPayload の先頭メンバーの flags の一部のビット範囲を使って確保する slot 数を持つようにしています。 Ractor 毎の slot 範囲を事前に予約する実装のために導入したのかな。複雑になってきたなぁ。 ただし USE_RVARGC というマクロが定義された時だけ有効になるようにしているようです。
Rubyのウラガワ
Rubyの内部的な構造の話と言えば、ささださんの連載も最終回だそうで。
Rubyのウラガワ ── Rubyインタプリタに学ぶデータ構造とアルゴリズム
【最終回】クラス階層の実現 ……メソッド探索のしくみと高速化……笹田 耕一
この連載、加筆の上一冊の本として出版…とかいう話はないのだろうか。
if/ifdef
ruby-trunk-changes 2021-05-05 - ruby trunk changes
_MSC_VER
may not be defined by xtkoba · Pull Request #4453 · ruby/rubyUSE_WIN32_MUTEX
may not be defined by xtkoba · Pull Request #4452 · ruby/ruby__LITTLE_ENDIAN
may not be defined by xtkoba · Pull Request #4456 · ruby/ruby__FreeBSD_version
may not be defined by xtkoba · Pull Request #4458 · ruby/ruby- Fix some compiler errors by peterzhu2118 · Pull Request #4457 · ruby/ruby
ABI
- The Day the C++ Standard Library Died | Hacker News
- (1) The Day The Standard Library Died : cpp
- The Day The Standard Library Died | cor3ntin