ときどきの雑記帖 RE* (新南口)
虚無回廊
フラットノート
コクヨのやつ、サイズがひとつで方眼や無地がない?
PSPP
GNUで開発されているものに pspp.git - GNU PSPP というのがあるのだけど、これってSPSSのクローン(?)で、 PGPのGNU版がGPGとなったのと 同じパターンのネーミングぽい。
とすると、もしSASのGNU版があったりしたらその名前はASA?
新刊近刊
最近翻訳本も出たGoの本のC++版ですかね。
100 C++ Mistakes and How to Avoid Them
awk
goawk
Support for network? · Issue #223 · benhoyt/goawk
本題から外れたところで出た話題
@benhoyt I actually wanted to ask next about the ability to add some kind of modules.
So if I understand correctly, I can extend GoAWK to support JSON with Config.Funcs? (when using as lib)
Also thank you for the great project.
You could make some JSON parsing and serialisation functions with Config.Funcs, yes. However, you couldn’t add first-class JSON support that would convert input lines to fields – that’s discussed as a separate feature in #152.
JSON扱えたんか。
Add JSON Lines support · Issue #152 · benhoyt/goawk
Howeverとある通り、いろいろありそうではあるけど
awkコマンドでファイルの行数を使いたい
Qiitaでみかけたこれ awkコマンドでファイルの行数を使いたい #shell - Qiita
awk -v line_count="$(wc -l < sample.txt)" '{
print $0 line_count;
}' sample.txt
こういうスクリプトで 次の入力から
aaa
bbb
ccc
ddd
eee
こういう結果を得たい
aaa 5
bbb 5
ccc 5
ddd 5
eee 5
という話で、wcをサブプロセスで使って… というのはイマイチなのでどうするかなんだけど、 まあでっかいファイルでないなら読み込んだのを保存しておくとか
{
content[NR]=$0
}
END {
for (line=1; line<=NR; line++) {
printf "%s %d\n", content[line], NR
}
}
パイプ経由の入力には対応できないけど 自前で無理やり二度読みして対処するという方法もある (入力ファイルも一つだけしか与えられないと仮定)。
ここで使っているENDFILEやARGINDはgawk固有の機能なので以下略
- 7.1.5 The BEGINFILE and ENDFILE Special Patterns (The GNU Awk User’s Guide)
- 7.5.2 Built-in Variables That Convey Information (The GNU Awk User’s Guide)
BEGIN {
ARGV[ARGC] = ARGV[ARGC-1];
ARGC++;
}
ENDFILE{
if (ARGIND==1)
linecount = FNR;
}
ARGIND==2{
print linecount, $0;
}
ついでにgawk固有の機能を使わないバージョン (ARGCやARGVをいじるのはgawk以外でも有効だったはず)。
BEGIN {
ARGV[ARGC++] = "pass=2";
ARGV[ARGC] = ARGV[ARGC-2];
ARGC++;
pass=1;
}
pass==1{
linecount++;
}
pass==2{
print linecount, $0;
}
xor
今度はzennで見かけた記事
排他的論理和を使って配列から一つのみ含まれている数字を取得する方法
arr = [1, 1, 2, 2, 3]
outcome = 0
for i ∈ eachindex(arr)
global outcome ⊻= arr[i]
end
@show outcome
これって、arrが[1,2,3]
のときoutcome
が0になると思うんだけど、
それが期待通りの動作なんだろうか?
[1,1,1]
も1になるよねえこれ。
C
関数ポインター経由での呼び出しの話の続き
void f() {
return;
}
int main(){
void (*fp)() = f;
f();
fp();
}
こんなファイルを
>gcc -S -O0 funccall.c
でコンパイルするとこんなコードを吐く
>type funccall.s
.file "funccall.c"
.text
.globl f
.def f; .scl 2; .type 32; .endef
.seh_proc f
f:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
.seh_endprologue
nop
popq %rbp
ret
.seh_endproc
.def __main; .scl 2; .type 32; .endef
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
leaq f(%rip), %rax
movq %rax, -8(%rbp)
call f
movq -8(%rbp), %rax
call *%rax
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-posix-seh, Built by strawberryperl.com project) 8.3.0"
関数を直接呼ぶ場合は
call f
だけど、ポインター経由だと
movq -8(%rbp), %rax
としてポインター変数の値を取り出し(dereference)てから
call *%rax
で呼び出している。
呼び出そうとしている名前が関数そのものの名前なのか、 あるいは関数のアドレスを保持している変数の名前なのかを 判断して処理しなければならない ということですね。
pccのソースをちょっと覗いてみると
cgram.y
term: term INCOP
={ $$ = buildtree( $2, $1, bcon(1) ); }
| MUL term
={ ubop:
$$ = buildtree( UNARY $1, $2, NIL );
}
| AND term
={ if( ISFTN($2->in.type) || ISARY($2->in.type) ){
werror( "& before array or function: ignored" );
$$ = $2;
}
else goto ubop;
}
省略
| funct_idn RP
={ $$=buildtree(UNARY CALL,$1,NIL); }
| funct_idn elist RP
={ $$=buildtree(CALL,$1,$2); }
省略
funct_idn: NAME LP
={ if( stab[$1].stype == UNDEF ){
register NODE *q;
q = block( FREE, NIL, NIL, FTN|INT, 0, INT );
q->tn.rval = $1;
defid( q, EXTERN );
}
idname = $1;
$$=buildtree(NAME,NIL,NIL);
stab[idname].suse = -lineno;
}
| term LP
;
とりあえず構文エラーにはなってないぽいすね
(ただし関数名に&
を適用するのはエラーになる)。
というかdmrの例の記事(HOPLの発表で使われたものらしい)によれば
pccはANSI以降のそれと同じく、
関数ポインター経由の呼び出しでも
普通の関数呼び出しと同じ表記でできたらしいので、
v7 UNIXのpccではない方のコンパイラーもみると
/*
* Called from tree, this routine takes the top 1, 2, or 3
* operands on the expression stack, makes a new node with
* the operator op, and puts it on the stack.
* Essentially all the work is in inserting
* appropriate conversions.
*/
build(op)
{
省略
case CAST:
if ((t1&XTYPE)==FUNC || (t1&XTYPE)==ARRAY)
error("Disallowed conversion");
if (t1==UNSIGN && t2==CHAR) {
t2 = INT;
p2 = block(AND,INT,NULL,NULL,p2,cblock(0377));
}
break;
case CALL:
if ((t1&XTYPE) != FUNC)
error("Call of non-function");
*cp++ = block(CALL,decref(t1),p1->subsp,p1->strp,p1,p2);
return;
case STAR:
if ((t1&XTYPE) == FUNC)
error("Illegal indirection");
*cp++ = block(STAR, decref(t1), p1->subsp, p1->strp, p1);
return;
case AMPER:
if (p1->op==NAME || p1->op==STAR) {
*cp++ = block(op,incref(t1),p1->subsp,p1->strp,p1);
return;
}
error("Illegal lvalue");
break;
エラーにしてますね。
ところでディスクに転がってた(?)
pccだと
term
の関数呼び出しのところは
| funct_idn ')' { $$ = doacall($1, NIL); }
| funct_idn elist ')' { $$ = doacall($1, $2); }
だし、funct_idn
は
funct_idn: C_NAME '(' {
struct symtab *s = lookup($1, 0);
if (s->stype == UNDEF) {
register NODE *q;
q = block(NAME, NIL, NIL, FTN|INT, 0, MKSUE(INT));
q->n_sp = s;
defid(q, EXTERN);
nfree(q);
}
if (s->sflags & SINLINE)
inline_ref($1);
spname = s;
$$ = buildtree(NAME, NIL, NIL);
s->suse = -lineno;
}
| term '('
;
みたいになってるんだけど、 どこで入手したものだっけこれ。
Hugo メモ
いい加減使っているバージョンを上げねばと
Release v0.123.8 · gohugoio/hugo · GitHub
に入れ替えて実行すると…
Start building sites …
hugo v0.123.8-5fed9c591b694f314e5939548e11cc3dcb79a79c+extended windows/amd64 BuildDate=2024-03-07T13:14:42Z VendorInfo=gohugoio
WARN The "tweet" shortcode was unable to retrieve the remote data. See "C:\Users\kbk\home\zakkicho\content\post\t2101-4.md:25:1"
You can suppress this warning by adding the following to your site configuration:
ignoreLogs = ['shortcode-twitter-getremote']
WARN The "tweet" shortcode was unable to retrieve the remote data. See "C:\Users\kbk\home\zakkicho\content\post\t2403-5.md:661:1"
You can suppress this warning by adding the following to your site configuration:
ignoreLogs = ['shortcode-twitter-getremote']
ERROR failed to fetch remote resource: Forbidden
WARN The "tweet" shortcode was unable to retrieve the remote data. See "C:\Users\kbk\home\zakkicho\\content\post\t2105-4.md:460:1"
You can suppress this warning by adding the following to your site configuration:
ignoreLogs = ['shortcode-twitter-getremote']
(省略)
Built in 53109 ms
Error: error building site: logged 1 error(s)
なにそれ。
削除されたツイートでエラーが起きているのかと思ったらそうでないものもあり、たとえば
- Xユーザーの新山祐介 (Yusuke Shinyama)さん: 「Cにおける文字列コピー関数は頻繁に議論される話題である。strcpyは明らかに危険だが、strncpyもそれほどよくない。Linuxカーネルでは2003年からstrlcpyが使われているが、現在ではstrscpyに徐々に置き換わりつつある。将来的にstrlcpyは完全に消えるかもしれない。 https://t.co/kC3UFtZ83e」 / X
- Xユーザーの高梨陣平さん: 「C23でtrue/falseがkeywordに。 K&Rの宣言が遂に亡くなった。foo()は引数無しの関数で確定。 - “\U12967849” is illegal (too-big for 21 bit code point)」 / X
- Xユーザーのyoh2さん: 「そういや今の rm は / の削除を基本的に嫌がるようになってるみたいだけど、意味的にはルートだけど // とか ../../../../../(繰り返し)../ とかの場合ってどうなるんだろう。」 / X
- Xユーザーの専門性・売上・原稿さん: 「なんとなく1ツイート以内で書いてみた。 /Courier findfont 20 scalefont setfont 1 { dup dup dup dup dup 0 exch 20 mul 840 exch sub moveto 3 mod 0 eq { (Fizz) show pop () exch } if 5 mod 0 eq { (Buzz) show pop () } if 3 string cvs show 40 gt { exit pop } { 1 add } ifelse } loop https://t.co/QGxS4kLgZc」 / X
この辺。
これまで使っていたバージョンに戻すとエラーにはならない。 ということで途中のどこかで入った変更(or 修正)が影響してそうな感じだけど 特定するのも面倒くさい😓
元データを手直しするのも数が多くて大変なので 今日のところは古いバージョンに戻して作業することにした。
武蔵中原
【ローソン武蔵中原駅北口店跡地に牛丼「松屋」とんかつ「松のや」併設店が2024年4月オープン決定】 #武蔵中原
— 武蔵小杉ライフ公式 (@musashikosugi) March 6, 2024
https://t.co/D39fGiubl5 pic.twitter.com/A43cE4iFLX
しばらく行ってないなあ>中原
あそこのローソン閉店してたのか。 そういや駅からちょっと行ったところにあったコメダはまだあるんだろうか
急行
【小田急小田原線】土休日に代々木上原駅7:20発の「急行 新宿行」を新たに設定します。#2024春ダイヤ改正
— とれいんふぉ + (@Trainfo_Update) March 8, 2024
代々木上原発新宿行きの急行…なんのため?
自動販売機
大森駅に日本で1台の「モスバーガーの自動販売機」が設置されました pic.twitter.com/CJv9PsvNho
— 自動販売機マニア(石田健三郎) (@jido__hanbaiki) March 8, 2024
大森か。あまり行かないところだな😓
君の名は
ふらっとやって来て何年も居着いてしまった猫様。名前を呼ぶとやってきてくれるけれど、名前とは違う言葉をしゃべってもやってきてくれる。
— ゲームショップ1983 (@g1983) March 8, 2024
最近はちょっと変化があり、アレクサと呼んでも来なくなったのは喜ばしい。違うと認識したようだ。