ときどきの雑記帖 RE* (新南口)
Blade Runner Blues
インターフェース
手帳が付録につくのは次号だったでござる。
メモ
The Origins of Python | Lambert Meertens | Inference
GIGAZINE
Windows版Firefoxの「メモリ不足によるクラッシュ」を70%減らした手法とは? - GIGAZINE
Windowsを含む各種OSは、メモリが不足した際にスワップファイルを作成してシステムの動作を継続させようとします。 この時、Windowsでは「仮想メモリをコミットする」という動作を行い、「コミット済みのメモリ」上にスワップファイルが作成されます。 このため、「コミット済みのメモリ」が不足している状況ではスワップファイルが作成されず、メモリの割り当てが失敗してしまいます。
「『コミット済みのメモリ』上にスワップファイルが作成されます」 とは?
MOV EDI,EDI
Windowsでは、すべての関数の先頭に MOV EDI, EDIという何もしない2バイトの命令が入っている。これは関数にパッチを当てるためのもので、パッチ時はこれをJMP $-5に置き換え、さらに別の5バイトでフルジャンプを実行する。NOP×2個にしなかったのは、このほうが実行が速いためhttps://t.co/z4VGujNdGd
— 新山祐介 (Yusuke Shinyama) (@mootastic) July 26, 2022
ちょっと引っかかるものがあったので 元記事 Why do Windows functions all begin with a pointless MOV EDI, EDI instruction? - The Old New Thing を見たら
September 21st, 2011
ずいぶんと昔の記事からか (HNでも過去の記事が取り上げられることはままあるので不思議はない)。
ところでこれ、64ビット版Windows だとどうなってるんだろう?
こういうことを書いていたのだけど、最近書かれた Why don’t Windows functions begin with a pointless MOV EDI,EDI instruction on x86-64? - The Old New Thing にその回答があった、
Some time ago, we investigated why Windows functions all begin with a pointless MOV EDI,EDI instruction. The answer was that the instruction was used as a two-byte NOP which could be hot-patched to a jump instruction, thereby allowing certain types of security fixes to be applied to a running system. (Those which alter data structures or involve cross-process communication would not benefit from this.)
But you may have noticed that on 64-bit Windows, these pointless instructions are gone. Is hot-patching dead?
No, hot-patching is still alive. But on 64-bit Windows, the hot-patch point is implemented differently.
で元記事のこの後に64ビットWindowsでのお話が。
んがきちんと読解できたかあまり自信がない😓 (ので詳細は書かない😄)
bash
これもまた 前回のつづき。
にあった話(バグ?)が興味深かったのでちょっと追いかけてみた。
リファレンスマニュアルにはなにか書かれていないかと見てみると、 ヒアストリングそのものの記述はあっさりとしたものだった。
3.6.7 Here Strings
A variant of here documents, the format is:
[n]<<< word
The word undergoes tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, and quote removal. Filename expansion and word splitting are not performed. The result is supplied as a single string, with a newline appended, to the command on its standard input (or file descriptor n if n is specified).
word
に対してtilde expansion
をはじめ色々やるとか
しかしfilename expansion
とword spliting
は行わないとある。
この中でword spliting
は気になったので
そこを読んでみる。すると
3.5.7 Word Splitting
(略)
Explicit null arguments ("" or ‘’) are retained and passed to commands as empty strings. Unquoted implicit null arguments, resulting from the expansion of parameters that have no values, are removed. If a parameter with no value is expanded within double quotes, a null argument results and is retained and passed to a command as an empty string. When a quoted null argument appears as part of a word whose expansion is non-null, the null argument is removed. That is, the word -d’’ becomes -d after word splitting and null argument removal.
といった記述があった。
ここでふと思い至ったのが、 「先頭に空白が追加されるようになった」のではなく 「先頭にあった空文字列が削除されないようになった」 (ので要素間に挟み込まれる空白が増えたように見える) のではないか? ということ。
で、
kbk@toybox4:~$ bash --version
GNU bash, version 5.0.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
kbk@toybox4:~$ arr=("" "a" "b" "" "c")
arr=("" "a" "b" "" "c")
kbk@toybox4:~$ echo ${arr[@]}
a b c
kbk@toybox4:~$ echo "${arr[@]}"
a b c
kbk@toybox4:~$ for i in "${arr[@]}" ; do echo $i; done
a
b
c
kbk@toybox4:~$ bash -c 'arr=("" "a" "" "B"); tee -a <<< "${arr[@]}" | hexdump -C'
00000000 20 61 20 20 42 0a | a B.|
00000006
kbk@toybox4:~$ bash -c 'arr=("" "a" "" "B"); tee -a <<< ${arr[@]} | hexdump -C'
00000000 61 20 42 0a |a B.|
00000004
ふむ。
FORTRAN Compiler on IBM 704
ソースコードを眺めていたらふと気になった(気がついた)ことがあった。
前回も見たCA000
を例にとって説明すると
コメントの始まりに*
があるものとないものがあり、
*
がついているものに注目すると
サブルーチンの外にジャンプしたり
他のサブルーチンを呼び出す部分がそうなっているように思える。
REM STATEA/1-ASSEMBLE AND CLASSIFY ALL STATEMENTS= 4F11637
ORGA ORG 1824 4F11638
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *4F11639
REM 4F11640
REM CA000/ CALLS=CA100,SR6DC1,TET00,DIAG. 4F11641
REM CA000 ASSEMBLES STATEMENT IN THE F-REGION AND ASSIGNS AN IFN.4F11642
CA010 LXD ENDWRD,4 IF THE FINAL STATEMENT HAS BEEN 4F11643
TXL DIAG,4,0 * PROCESSED, THE GO CALL DIAGNOSTIC. 4F11644
LXD EIFNO,1 KEEP INTERAL FORMULA NUMBER 4F11645
TXI CA013,1,1 (DECR PART OF EIFNO) 4F11646
CA013 SXD EIFNO,1 UP TO DATE BY ADDING 1. 4F11647
CAL FT OBTAIN HOLLERITH CODED 5-DIGIT 4F11648
ARS 6 EXTERNAL FORMULA NO IN ACC. 4F11649
SLW F-1 AND RETAIN IN F-01. 4F11650
LXD DCF,1 INITIALIZE INDEX A TO COMPL OF F. 4F11651
CA018 LXA L(11),2 SET UP LOOP FOR 11 CYCLES. 4F11652
CA019 LDQ FT+12,2 MOVE WORD FROM REGION FT 4F11653
STQ 0,1 TO REGION F. 4F11654
TIX CA020,1,1 KEEP F-REGION ADDRESS UP-TO-DATE. 4F11655
CA020 TIX CA019,2,1 TEST END OF LOOP. 4F11656
TSX CA100,4 * GO READ NEXT NON-BLANK CARD. 4F11657
CAL FT TEST RIGHTMOST CHARACTER OF 4F11658
ANA L(63) FIRST WORD FOR CONTINUATION MARK, 4F11659
TZE CA021 IF ZERO OR BLANK, 4F11660
SUB ABLANK DISCONTINUE READING, 4F11661
TNZ CA018 OTHERWISE CONTINUE. 4F11662
CA021 CLA BLANKS BEGIN SCANNING REGION F BACKWARDS 4F11663
CA022 CAS -1,1 TO FIND FIRST NON BLANK WORD. 4F11664
TRA CA023 NOT BLANK. 4F11665
TXI CA022,1,1 BLANK, SO CONTINUE SCAN. 4F11666
CA023 LDQ 36ONES PLACE BINARY ONES IN FIRST WORD 4F11667
STQ 0,1 FOLLOWING RIGHTMOST NONBLANK WORD. 4F11668
CAL F-1 PICK UP EXTERNAL FORMULA NUMBER AND4F11669
CAS 5BLANS COMPARE WITH /0 /. 4F11670
TRA CA015 NOT COMPARE. 4F11671
TRA CD000 * TAKE EXTFORMNO, IF ANY AND 4F11672
CA015 LRS 35 GO TO CONVERSION SUBROUTINE AND 4F11673
TSX SR6DC1,1 * RETURN HERE WITH RESULT IN ACC. 4F11674
STA EIFNO STORE RESULT IN ADDRESS OF EIFNO. 4F11675
TSX TET00,1 * GO TO PROGRAM TET TO ENTER EIFNO 4F11676
PZE 0 INTO TABLE TEIFNO (TABLE O). 4F11677
REM END OF PROGRAM CA000. 4F11678
ということで
grep -e "^.\{7\}[^R].\{27\}\*" fort1.asm
とか
grep -e "^.\{7\}TSX" fort1.asm
で調べてみると、*
がついているものは推測が当たっているようだったけど
サブルーチン呼び出し(TSX)でも*
がついていないものもあって🤔
Hugo メモ
0.105 → 0.106 → 0.107 と、0.105、0.106ではマイナーバージョン未満のリリースはなし。 特に気になるような大きなバグフィックスもなかったよう。
0.107のリリースノートにはこんな記述が。
This release is mostly interesting if you do code highlighting. We fixed a bottle neck which should show a significant performance boost for sites using code highlighting. Hugo’s gohugo.io docs site builds ~20% faster. Also, Chroma, the highlighting library, is upgraded to v2.4.0 with new lexers and lots of improvements.
ふむ。上げてみようかな(まだ0.104.3を使っている)。
coalesce
SQLを書いているとよく遭遇する COALESCE のスペルを覚えるために語源を知ろうと調べたら、ラテン語だったのでいまいちピンとこない🙄
— Junya Ogura (@junya) November 24, 2022
"語源はラテン語の ”co-(ともに) alescere(成長する)”"https://t.co/GaDu2mvx12
「null合体演算子」とかいう(ぴー)な訳語になっているアレの 元の名前で使われてる単語すね>coalesce