ときどきの雑記帖 RE* (新南口)
LUCIFER'S HAMMER
銀英伝@ウルジャン
「あの回」だった。
エイトマン
祝放送60周年!アニメ「エイトマン」YouTubeで初の全話無料配信決定 | マイナビニュース
アニメ「エイトマン」が今年で放送60周年を迎えたことを記念し、本日10月18日から2026年1月6日までの期間、 YouTubeのエイケン公式チャンネルで初の全話無料配信が実施される。
エイケン公式チャンネルでは、10月18日18時に第1話を配信開始。その後も各日18時に配信が行われ、各話2週間ずつ視聴できる。
これか。
【公式】エイトマン 第1話「エイトマン登場」<期間限定> - YouTube
J[aO]BOL
このふたつって別物? どちらもぐぐっても碌な情報が見つからないので 本当に使われているものなのかもよくわからん。
- COBOLをやめても消えない“亡霊”「JOBOL」とは何なのか:それでも「COBOL」は生き残る【第1回】 - TechTargetジャパン システム開発
- 「JaBOL」を否定する理想論では何も解決しない、未来に向けた体制づくりが肝 | 日経クロステック(xTECH)
- IBMが生成AIでモダナイズ、COBOLを「JaBOL」ではなくネーティブJavaへ変換 | 日経クロステック(xTECH)
LINE
なんかアカウント作らないといけないかもな 流れではあるんだけど
【LINEスタンプ発売中】太田記念美術館では、公式twitterのアイコンにもなっている不思議な生き物「虎子石」のLINEスタンプを発売中!→https://t.co/6cfwSd0b1h………虎子石がゆるく日常に溶け込んでくれる、味わい深いスタンプです。虎子石について詳しくはこちらから→https://t.co/6DOMuK9FPh pic.twitter.com/B9zMjmu1l9
— 太田記念美術館 Ota Memorial Museum of Art (@ukiyoeota) October 21, 2023
こういうの(スタンプ)を使う機会はたぶんない。
CO2モニター
意外に高いのね。
GNU sed
devcontainer の sed コマンドで Permission denied が発生する という記事で
devcontainer で sed コマンドを実行すると Permission denied が発生したので解決します。
sed のバージョンを 4.8 にあげることで解決します。
とあったのが??だったので ちょっと調べた。
まずはバージョンアップの履歴を見ると
Savannah Git Hosting - sed.git/summary
tags | ||
---|---|---|
11 months ago | v4.9 | sed 4.9 |
3 years ago | v4.8 | sed 4.8 |
4 years ago | v4.7 | sed 4.7 |
4 years ago | v4.6 | sed 4.6 |
Savannah Git Hosting - sed.git/log の変更履歴をざっと見てもよくわからなかったけど、 記事にあったメッセージなどでぐぐると VirtioFS is not handling permissions as expected. All mount permissions are owned by root regardless of chown. · Issue #6243 · docker/for-mac というのが見つかった。 GNU sedのバージョンを4.8にして解決というのも同じ。
んで改めて GNU sed - News: sed-4.8 released [stable] [Savannah] を見ると
NEWS
* Noteworthy changes in release 4.8 (2020-01-14) [stable]
** Bug fixes
“sed -i” now creates temporary files with correct umask (limited to u=rwx). Previously sed would incorrectly set umask on temporary files, resulting in problems under certain fuse-like file systems. [bug introduced in sed 4.2.1]
まさにこれのようだ。
Savannah Git Hosting - sed.git/commit から実際の変更箇所をみると
Savannah Git Hosting - sed.git/blobdiff - sed/utils.c
--- a/sed/utils.c
+++ b/sed/utils.c
@@ -181,7 +181,7 @@ ck_mkstemp (char **p_filename, const char *tmpdir,
/* The ownership might change, so omit some permissions at first
so unauthorized users cannot nip in before the file is ready.
mkstemp forces O_BINARY on cygwin, so use mkostemp instead. */
- mode_t save_umask = umask (0700);
+ mode_t save_umask = umask (0077);
int fd = mkostemp (template, 0);
umask (save_umask);
if (fd == -1)
ふむ。 この修正は前にも見た(確かめた)覚えがあるな。
新刊近刊
12月発行予定の新刊『Efficient Linuxコマンドライン ―開発と自分に磨きをかけるLinuxのテクノロジー』の情報をAmazonおよび楽天ブックスで公開開始しました!https://t.co/xLaMbGgJiKhttps://t.co/QngvKjYQt0
— O'Reilly Japan (@oreilly_japan) October 19, 2023
MEAP
タイトルにピクっときたが
Learn statistics by analyzing professional basketball data! In this action-packed book, you’ll build your skills in exploratory data analysis by digging into the fascinating world of NBA games and player stats using the R language.
題材がこれだからか。
awk
gawk
使うTexinfoのバージョンが 7.1になったことで ドキュメント作成の流れがちょっと変わった。
one true awk
awk: regular expression too big: out of space in set_gototab...
・ Issue #199 ・ onetrueawk/awk- Correctly reset the goto table for a state. by millert ・ Pull Request #200 ・ onetrueawk/awk
つづき。
--- "awk-20230909\\awk.h" 2023-09-10 08:56:40.000000000 +0900
+++ "awk-2ndEdition\\awk.h" 2023-09-11 23:17:08.000000000 +0900
@@ -78,6 +78,8 @@
extern Awkfloat *RSTART;
extern Awkfloat *RLENGTH;
+extern bool CSV; /* true for csv input */
+
extern char *record; /* points to $0 */
extern int lineno; /* line number in awk program */
extern int errorflag; /* 1 if error has occurred */
@@ -225,7 +227,8 @@
/* structures used by regular expression matching machinery, mostly b.c: */
-#define NCHARS (256+3) /* 256 handles 8-bit chars; 128 does 7-bit */
+#define NCHARS (1256+3) /* 256 handles 8-bit chars; 128 does 7-bit */
+ /* BUG: some overflows (caught) if we use 256 */
/* watch out in match(), etc. */
#define HAT (NCHARS+2) /* matches ^ in regular expr */
#define NSTATES 32
@@ -236,12 +239,19 @@
int i;
Node *np;
uschar *up;
+ int *rp; /* rune representation of char class */
} lval; /* because Al stores a pointer in it! */
int *lfollow;
} rrow;
+typedef struct gtt { /* gototab entry */
+ unsigned int ch;
+ unsigned int state;
+} gtt;
+
typedef struct fa {
- unsigned int **gototab;
+ gtt **gototab;
+ int gototab_len;
uschar *out;
uschar *restr;
int **posns;
UTF-8対応バージョンと直前のバージョンとの比較(その1)。
NCHRAS
の大きさも違うし、
正規表現で使うオートマトン用の構造体もちょっと違う
(当然と言えば当然)。
コードの差分はそこそこ大きいのでかいつまんで。
--- "awk-20230909\\b.c" 2023-09-10 08:56:40.000000000 +0900
+++ "awk-2ndEdition\\b.c" 2023-09-11 23:17:08.000000000 +0900
@@ -131,12 +166,13 @@
f->posns = p3;
for (i = f->state_count; i < new_count; ++i) {
- f->gototab[i] = (unsigned int *) calloc(NCHARS, sizeof(**f->gototab));
+ f->gototab[i] = (gtt *) calloc(NCHARS, sizeof(**f->gototab));
if (f->gototab[i] == NULL)
goto out;
f->out[i] = 0;
f->posns[i] = NULL;
}
+ f->gototab_len = NCHARS; /* should be variable, growable */
f->state_count = new_count;
return;
out:
@@ -231,7 +267,7 @@
if ((f->posns[2])[1] == f->accept)
f->out[2] = 1;
for (i = 0; i < NCHARS; i++)
- f->gototab[2][i] = 0;
+ set_gototab(f, 2, 0, 0); /* f->gototab[2][i] = 0; */
f->curstat = cgoto(f, 2, HAT);
if (anchor) {
*f->posns[2] = k-1; /* leave out position 0 */
@@ -546,19 +635,25 @@
return(1);
do {
/* assert(*p < NCHARS); */
- if ((ns = f->gototab[s][*p]) != 0)
+ n = u8_rune(&rune, p);
+ if ((ns = get_gototab(f, s, rune)) != 0)
s = ns;
else
- s = cgoto(f, s, *p);
+ s = cgoto(f, s, rune);
if (f->out[s])
return(1);
- } while (*p++ != 0);
+ if (*p == 0)
+ break;
+ p += n;
+ } while (1); /* was *p++ != 0 */
return(0);
}
int pmatch(fa *f, const char *p0) /* longest match, for sub */
{
int s, ns;
+ int n;
+ int rune;
const uschar *p = (const uschar *) p0;
const uschar *q;
以前は一文字1バイトで決め打ちだったので
f->gototab[s][*p])
のように書いていた(書けていた)部分を
n = u8_rune(&rune, p)
と
get_gototab(f, s, rune))
の
組み合わせにしたりその他諸々。
yapc
やばい
— ゴリラ - 自然に帰りたい (@gorilla0513) October 20, 2023
yapcのこれぶっ飛んでて好きw pic.twitter.com/cpoYdDRRxy
ひょっとしてと思ってリポジトリ yammerjp/awkblog: weblog implimentation by awk を見に行ったら予想通りだった。
awkblog/src/entrypoint.awk at main · yammerjp/awkblog
BEGIN {
pgsql::createConnection()
query = "SELECT count(id) as ids FROM posts;"
pgsql::exec(query)
rows = pgsql::fetchRows()
logger::info("Database Healthcheck: count(posts.id) (rows:" rows ") ... " pgsql::fetchResult(0, "ids"))
router::register("GET", "/", "controller::get")
router::register("GET", "/test", "controller::test__get")
router::register("GET", "/login", "controller::login__get")
router::register("GET", "/oauth-callback", "controller::oauth_callback__get")
router::register("GET", "/authed", "controller::authed__get")
router::register("GET", "/authed/posts/new", "controller::authed__posts__new__get")
router::register("GET", "/authed/posts", "controller::authed__posts__get")
router::register("POST", "/authed/posts", "controller::authed__posts__post")
router::register("GET", "/*", "controller::_account_id__get")
router::register("GET", "/*/posts/*", "controller::_account_id__post__get")
router::register("GET", "/static/*", "controller::static__get")
router::register_notfound("controller::notfound")
logger::info("Start awkblog. listen port " PORT " ...")
http::initializeHttp();
while(1) {
http::receiveRequest()
router::call(http::getMethod(), http::getPath())
}
}
awkblog/src/lib/pgsql.awk at main · yammerjp/awkblog
@load "pgsql"
@namespace "pgsql"
function exec(query, params, response, numberOfFields, col, numberOfRow, row, logstr) {
logDebug("pgsql::exec() query: " query)
response = awk::pg_execparams(Connection, query, length(params), params)
logDebug("pgsql::exec() response: " response)
delete RESULT
RESULT[0] = ""
delete RESULT[0]
if (response ~ /^OK/) {
awk::pg_clear(response)
return 1
}
if (response ~ /^TUPLES /) {
numberOfFields = awk::pg_nfields(response)
for (col = 0; col < numberOfFields; col++) {
columns[col] = awk::pg_fname(response, col)
o }
numberOfRows = awk::pg_ntuples(response)
for (row = 0; row < numberOfRows; row++) {
for (col = 0; col < numberOfFields; col++) {
RESULT[row][columns[col]] = (awk::pg_getisnull(response,row,col) ? "<NULL>" : awk::pg_getvalue(response,row,col))
}
}
logstr = "\n"
for(i in RESULT) {
logstr = logstr " " i ":\n"
for (columnName in RESULT[i]) {
logstr = logstr " " columnName ": " RESULT[i][columnName] "\n"
}
}
logDebug(logstr)
awk::pg_clear(response)
return 1
}
awk::pg_clear(response)
return 0
}
function createConnection( param) {
param = "host=" awk::POSTGRES_HOSTNAME " dbname=" awk::POSTGRES_DATABASE " user=" awk::POSTGRES_USER" password=" awk::POSTGRES_PASSWORD
if (awk::POSTGRES_SSLMODE) {
param = param " sslmode=" awk::POSTGRES_SSLMODE
}
if (awk::POSTGRES_OPTIONS) {
param = param " options=" awk::POSTGRES_OPTIONS
}
if ((Connection = awk::pg_connect(param)) == "" ) {
logError("pgsql::createConnection(): pg_connectionect failed: " ERRNO)
return 0
}
logInfo("created a postgres connection")
logError("pgsql::createConnection(): Connection: " Connection)
return 1
}
function fetchRows() {
return length(RESULT)
}
function fetchResult(row, columnName) {
return RESULT[row][columnName]
}
function logInfo(message) {
logger::info(message, "pgsql")
}
function logDebug(message) {
logger::debug(message, "pgsql")
}
function logError(message) {
logger::error(message, "pgsql")
}
gawk固有の拡張をバリバリ(死語)つかったものを 「awkでつくった」 というのはいかがなもんかと。
FORTRAN Compiler on IBM 704
STATE C をちまちま眺めていて気がついた。 ここでもテーブル引き(参照)をしているのだけど
REM DICTIONARY OF OPEN SUBROUTINES FOLLOWS 4F14907
OPSUB OCT 672122626060 XABS 4F14908
OCT 212262606060 ABS 4F14909
OCT 673145636060 XINT 4F14910
OCT 314563606060 INT 4F14911
OCT 674446246060 XMOD 4F14912
OCT 444624606060 MOD 4F14913
OCT 674421670060 XMAX0 4F14914
OCT 442167016060 MAX1 4F14915
OCT 674421670160 XMAX1 4F14916
OCT 442167006060 MAX0 4F14917
OCT 674431450060 XMIN0 4F14918
OCT 443145016060 MIN1 4F14919
OCT 674431450160 XMIN1 4F14920
OCT 443145006060 MIN0 4F14921
OCT 264346216360 FLOAT 4F14922
OCT 672631676060 XFIX 4F14923
OCT 623127456060 SIGN 4F14924
OCT 676231274560 XSIGN 4F14925
OCT 672431446060 XDIM 4F14926
OCT 243144606060 DIM 4F14927
BSS 10 4F14928
こういうテーブル(組込み関数の名前が並んでいる)を次のようなコードで参照している
PL0470 CLA SCRIPL+2,A NOT AN FS NAME 4F14607
LXA L(0),B 4F14608
PL0480 CAS OPSUB,B 4F14609
TXI PL0520,B,-1 4F14610
TRA PL0650 4F14611
TXI PL0520,B,-1 4F14612
PL0520 TXH PL0480,B,-20 4F14613
STATE BのCTESTとは逆に、若い番地から比較を始めている。 テーブルを後ろ(番地の高い方)に伸ばす可能性がある(BSS 10がそのための領域) から。だろうか?
ワープロ
「#科学戦隊ダイナマン」にワープロの怪人が居たなんて、若い世代は信じてくれないだろうなぁ😅#ワープロアルマジロ #ワープロ記念日 pic.twitter.com/VUkqFZPvq6
— 鋼鉄サンボ (@koutetusanbo) September 26, 2023
— AoiMoe a.k.aしお兄P (@AoiMoe) October 17, 2023
++++
C系の言語で i++ に対応する i += 2 が無いの不便。むしろ、評価値は足される前であってほしかった…。
— きくちゃん (@kikuchan98) September 21, 2023
C++だったら自前で
(operator ++(int)
でごにょごにょすれば)
定義できなくもない?
と思ったが無理か。
Hugo メモ
ふと気になって ここで使っているHugoのテーマのページ Ananke Gohugo Theme | Hugo Themes を見るとそれなりに変更されていってますな。
そろそろ更新するなり 別のテーマに変えるなりするかねえ。