ときどきの雑記帖 RE* (新南口)
秋の魔術
衣替え
なんか週の半ばからぐっと気温が下がるらしいので、 何着か長袖のシャツを出し 交代で半袖のシャツを(一部) しまうなど。
北斗の拳@tvk
時間帯移動ではなく拡大だったらしい?
ミロード
新宿駅の小田急百貨店 3日から解体へ 新宿ミロードも来年3月に一部閉業 - ライブドアニュース
まあそうなるよねえ。 あそこにはちょっとした思い出があったりするのだけどそれはまあ。
TRILLION CREDIT SQUADRON
Amazonで
を見つけたのだけど(いい値段だ)
The author cannot do math
という
カスタマーレビュー
(Amazon.co.jp:カスタマーレビュー: TRILLION CREDIT SQUADRON)
を読んで中身が気になった。
どこがどうかわったのやら。
それをチェックするためだけに買う気は…ないな😄
Lua
配列の添え字を1から始めることについて
Using 1 as the initial position for an array makes sense when you’re talking like a human.
と書いててちょっとウケた。
__FORTIFY_SOURCE
bsearch_sの引数の並びの話 について 今回も情報をいただくなど (感謝。ただ参照されている過去記事が参照しているわたしのところの記事がなくなっている んだけどどうしたもんか(容量の問題で削除した))
それはそれとして最近HNで見かけた Safeclib (GitHub - rurban/safeclib: safec libc extension with all C11 Annex K functions) という C11 Annex K implementationなものについてのスレッド Safeclib - C11 Annex K implementation | Hacker News にこんなやりとりが
Could someone explain why glibc doesn’t include Annex K?
I recently integrated clang-tidy at work, and we use snprintf() fairly regularly. clang-tidy by default tells you to use snprintf_s() which just doesn’t exist in glibc. Does it exist in other libcs?
I don’t understand the history behind Annex K. Note that I write C every day, so I do know what it is trying to accomplish.
The glibc maintainers think that the mandatory Annex K bounds-checking is rubbish compared to their optional __FORTIFY_SOURCE. Note that safeclib does the very same optional compile-time checking, just again at run-time also.
They also think that extensions by getenv() are more secure than extensions by callbacks.
The real problem is that Annex K came from Microsoft, and people hated that.
そういや(偶然)最近見かけたなあ
__FORTIFY_SOURCE、
とか
people hated that
に「あー」となるとか。
- musl - Re: C Annex K safe C functions
- c - Why didn’t gcc (or glibc) implement _s functions? - Stack Overflow
- N1967 — Field Experience With Annex K — Bounds Checking Interfaces
- C言語の最新事情を知る: C11の仕様-脆弱性対応に関連する機能強化点 - Build Insider
- string.c source code [linux/lib/string.c] - Codebrowser
- strscpy.c source code [ClickHouse/contrib/libuv/src/strscpy.c] - Woboq Code Browser
Bash 5.2
なんか新しいのが出たらしいので。
https://tiswww.case.edu/php/chet/bash/NEWS の
- New Features in Bash
から個人的に興味をひかれた部分を書いておく。
a. The bash malloc returns memory that is aligned on 16-byte boundaries.
e. Here-document parsing now handles $’…’ and $"…" quoting when reading the here-document body.
r. The `printf’ builtin has a new format specifier: %Q. This acts like %q but applies any specified precision to the original unquoted argument, then quotes and outputs the result.
ee. The `globbing’ completion code now takes the `globstar’ option into account.
最後のが特に気になるな。 あとで(いつ?)ちょっと見てみよう。
それとこれは5.1→5.2での変更点ではなく 5.0→5.1でのものだけど
d. There are new loadable builtins: mktemp, accept, mkfifo, csv, cut/lcut
g. `read -e’ may now be used with arbitrary file descriptors (`read -u N’).
あたりも気になるところ。
rms
rmsの例の本の修正具合をたまに見ているのだけど
c-intro-and-ref.git - GNU C Language Intro and Reference
Explain non-ASCII chars in identifiers better.
ふと、こんなコミットログが残されているのに気がついた。
どんな変更だろうと c-intro-and-ref.git - GNU C Language Intro and Reference を見ると
--- a/c.texi
+++ b/c.texi
@@ -1479,19 +1479,20 @@ kind.
In principle, you can write the function and variable names in a
program, and the comments, in any human language. C allows any kinds
-of characters in comments, and you can put non-ASCII characters into
-identifiers with a special prefix. However, to enable programmers in
-all countries to understand and develop the program, it is best given
-today's circumstances to write identifiers and comments in
-English.
-
-English is the one language that programmers in all countries
-generally study. If a program's names are in English, most
-programmers in Bangladesh, Belgium, Bolivia, Brazil, and Bulgaria can
-understand them. Most programmers in those countries can speak
-English, or at least read it, but they do not read each other's
-languages at all. In India, with so many languages, two programmers
-may have no common language other than English.
+of Unicode characters in comments, and you can put them into
+identifiers with a special prefix (@pxref{Unicode Character Codes}).
+However, to enable programmers in all countries to understand and
+develop the program, it is best under today's circumstances to write
+all identifiers and comments in English.
+
+English is the common language of programmers; in all countries,
+programmers generally learn English. If names and comments in a
+program are written in English, most programmers in Bangladesh,
+Belgium, Bolivia, Brazil, Bulgaria and Burundi can understand them.
+In all those countries, most programmers can speak English, or at least
+read it, but they do not read each other's languages at all. In
+India, with so many languages, two programmers may have no common
+language other than English.
If you don't feel confident in writing English, do the best you can,
and follow each English comment with a version in a language you
English is the one language that programmers in all countries generally study.
が
English is the common language of programmers; in all countries, programmers generally learn English.
に変わっている辺りがなんとも
(コミットの本題のidentifierとはあまり関係ないけど)。
FORTRAN Compiler on IBM 704
特にここを、というのではなく 漫然とFORTRAN IIのソースコードを眺めていたら あることに気がついた。
REM C0180,2/ CALLS=C0190,DIAG. CALLERS=C0100,C0200,C0300,C0400, 4F10512
REM C1000,C1100,C1200,C1400,C1500,C0150. 4F10513
REM C0180 CONVERTS SUCCESSIVE NUMERICS STARTING IN THE MQ T0 4F10514
REM BINARY, PLACES RESULT IN 1G, AND LEAVES 1ST NON-NUMERIC IN 4F10515
REM THE AC. 1ST NUMERIC IS ASSUMED TO BE ALREADY IN THE AC. 4F10516
C0180X TSX C0190,4 * OBTAIN 1ST NUMERIC IN THE AC. 4F105165
C0180 STO 1G PLACE 1ST NUMERIC IN 1G. 4F10517
TSX C0190,4 * EXAMINE NEXT NON-BLANK CHARACTER, 4F10518
CAS L(9) AND IF NON-NUMERIC, THEN 4F10519
TRA 1,2 * RETURN TO CALLER. 4F10520
↑の最初の行、CALLSやCALLERSは以前にも言及したことがあるけれども
今回気になったのはREM
の直後/
までの部分。
この例の場合C0180,2
となっているのだけど
同じく上記のコードで呼び出しているC0190
はこう。
REM C0190X,4/ CALLERS=CD000,CB000,CC000,C0300,C3300. 4F10532
REM C0190X INITIALIZES C0190 TO OBTAIN 1ST WORD OF FORMULA IN F. 4F10533
呼び出すときに使用するインデックスレジスターも書かれている?
REM SR6DC1,1/ CALLS=DIAG. CALLERS=CA000,SS000. 4F11006
REM SR6DC1 CONVERTS UP TO 6 BCD DIGITS TO THEIR BINARY EQUIV. 4F11007
SR6DC1 SXD SR6XR2,2 SAVE THE C(XR2), AND 4F11008
のようにインデックスレジスターの部分が1のものもあった。 これも
3D0002 CLA E+14,4 CONVERT ADDENS (BCD TO BINARY)= 4F11197
SLW G STRIP OFF 4F11198
LDQ G SIGN. 4F11199
TSX SR6DC1,1 * CONVERT ADDENDS IN E+11,12,13, 4F11200
LXD CTRAD,2 REDUCE COUNTER 4F11881
TIX C0216,2,1 CTRAD 4F11882
C0216 SXD CTRAD,2 BY 1. 4F11883
CTRAD TXI CA010,0,250 * EXIT TO PROCESS NEXT STATEMENT. 4F11924
のように実際に呼び出している箇所と表記が一致している。
さらにラベルだけでインデックスレジスターが書かれていないものもあって、 これは単なるジャンプ先として参照されているようだ。
REM C0200/ CALLS=GETIFN,DIAG,TEST..,C0190,C0180,TET00,C0160, 4F11846
REM CIT00,SS000(CSA000). 4F11847
REM C0200 PROCESSES GO TO STATEMENTS. 4F11848
ということで簡単にgrepで抜き出してみると
>grep -e 'REM [^ ]*/' fort1.asm
REM COMMON/1-WORKING STORAGE, BUFFERS, AND TABLE PARAMETERS= 4F10059
REM INTET/ TABLE PARAMETERS USED BY TET00, WHERE 4F10094
REM ....IX/ TABLE PARAMETERS USED BY DRTABS, WHERE 4F10178
REM COMMON/2-CONSTANTS USED BY SECTION ONE= 4F10306
REM COMMON/3-SUBROUTINES USED BY SECTION ONE* 4F10451
REM C0150,2/ CALLS=C0190,DIAG,C0180,C0160. CALLER=C0100. 4F10455
REM C0160,2/ CALLS=C0190,DIAG. CALLERS=C0100,C0200,C1000,C1200, 4F10479
REM C0180,2/ CALLS=C0190,DIAG. CALLERS=C0100,C0200,C0300,C0400, 4F10512
REM C0190,4/ CALLERS=CD000,CB000,CC000,C0100,C200,C00300,C0400, 4F10556
REM CIT00,4/ CALLERS=C0200,C0400,C0900,C1000,C1100,C1300,C1600, 4F10581
REM DIM.SR,4/ CALLS=DIAG. CALLERS=C1200,SS000,CMA. 4F10621
REM DRTABS(,4)/ CALLS RDRX,DIAG. CALLERS=C1200,SS000,ROYCNV,CMA, 4F10695
REM GETIFN,4/ CALLERS=C0100,C0200,C1000,C1100,C1600,C3200. 4F10847
REM JIF(GIF),4/ CALLERS=RDC,EFT,LPR,SPC,CMA,EMK,INPUT(OUTPUT), 4F10856
REM MTR000/ MONITOR ROUTINE FOR CALLING STATES FROM DRUM. 4F10871
REM RA000,4/ CALLERS=LPR,ARITH. 4F10909
REM SR6DC1,1/ CALLS=DIAG. CALLERS=CA000,SS000. 4F11006
REM SS000,4/ CALLS=C0190,DIAG,SR6DC1,DIM,SR,DRTABS,TET00,TESTFX. 4F11033
REM SUBSTR/ CONTROL TRANSFERS FOR SUBSCRIPT SCAN= 4F11105
REM SUBX00,4/ CALLERS=C3000,C3300. 4F11305
REM TESTFX,1/ CALLERS=SS000,C3000,IFFIX. 4F11323
REM TEST..,4/ CALLS=DIAG. CALLERS=C0100,C0200,C0300,C0400,C1000, 4F11334
REM TET00,1/ CALLERS=CA000,CC000,C0100,C0200,C0300,C1300,C1400, 4F11391
REM STATEA/1-ASSEMBLE AND CLASSIFY ALL STATEMENTS= 4F11637
REM CA000/ CALLS=CA100,SR6DC1,TET00,DIAG. 4F11641
REM CD000/ CALLS=C0190X,C0190,DIAG. 4F11681
REM CB000/ CALLS=C0190X,C0190,DIAG. 4F11733
REM CC000/ CALLS=CC500,C0190X,DIAG,C0190,TET00. 4F11766
REM STATEA/2-PROCESS CONTROL AND SPECIFICATION STATEMENTS= 4F11800
以下略
ふむ。
awk
ebanさんの
簡単に言うと
— eban (@eban) October 1, 2022
awk 'BEGIN{print 1.0==1}'
だからですね。#シェル芸
というツイートが流れてきたのだけど、 メンションもなく前後関係がわからなかったので ちょっと手間取ったものの これが発端かな?
onetrueawk読んだら謎が解けた
— かとう (@kat0h) October 1, 2022
どうしてこの実装にしたのかは知らん
簡単に言うと
— eban (@eban) October 1, 2022
awk 'BEGIN{print 1.0==1}'
だからですね。#シェル芸
文字列で比較するんだけど、
— eban (@eban) October 1, 2022
文字列化の時点で1.0は1になってしまう。
awk 'BEGIN{print 1.0""}'#シェル芸
— かとう (@kat0h) October 1, 2022
ちがうのかな
— かとう (@kat0h) October 1, 2022
> Comparisons (with the '<', "<=", "!=", "==", '>', and ">=" operators) shall be made numerically if both operands are numeric, if one is numeric and the other has a string value that is a numeric string, or if one is numeric and the other has the uninitialized value.
— かとう (@kat0h) October 1, 2022
https://t.co/QhNeUUf7Nz
— かとう (@kat0h) October 1, 2022
自分はPOSIXの仕様(nawk?)を読んで、片方が数値かつもう片方が数値として解釈できる数の場合、数値として解釈されると理解してましたhttps://t.co/shY44MRooX ここでは両方が数値かどうかをチェックしているぽいので腑に落ちていないのですが、解説していただけませんか? pic.twitter.com/6g4J8Wv0rD
— かとう (@kat0h) October 1, 2022
やっぱり自分の英語が弱いだけじゃないですか!!!!!!!!!!!!!!!!!
— かとう (@kat0h) October 1, 2022
POSIXと矛盾しているように見えるの結局なんなんだろう
— かとう (@kat0h) October 1, 2022
当人含めなんとなく納得しているみたいだけど さらなる混乱のタネ(になるかもしれない) を播いておく😄
$ echo 1.0 |mawk '1.0=="1.0"'
$ echo 1.0 |gawk '1.0=="1.0"'
$ echo 1 |gawk "1==$0"
1
$ echo 1 |gawk "1.0==$0"
1
$ echo 1 |mawk "1.0==$0"
1
$ echo 1.0 |gawk "1.0==$0"
1.0
$ echo 1.0 |mawk "1.0==$0"
1.0
「種明かし(謎解き)」は 気が向いたら 書く😄
ところで元ツイートの発言主の他のツイートを見て知ったのだけど。 Rustでawk(っぽいもの)を書いているみたいですね。
そして
該当箇所は読んでないし調べてもないけど、一般論として、POSIXにそう書いてあったとしても、実装はそれに従う必要はないし、単に実装してないだけかもしれないし、そもそもPOSIXの方が間違っていることもあるので、よくある話。だからPOSIXがあるからといってどこでも動くようにならない。 https://t.co/3kdFBI5ps0
— Koichi Nakashima (@ko1nksm) October 1, 2022
この人も定常運転だなあ (このあと フォローのツイート もしてるけど)