ときどきの雑記帖 RE* (新南口)
Legacy of Llylgamyn
翻
いつものおなじみJR東車内で流れるニュースで知ったのだけど 中国語では倍増を翻番のように書くらしい。
翻番の翻って麻雀の点数計算にも出てきて、 一翻増えると点数が倍になる(満貫以上は別) のだけどそういうことだったのか。
電動滑板
これもJR東車内のニュースから。 電動キックボードを中国語で電動滑板 と表記していた。
電動キックボード、7月1日から免許とヘルメット不要に–時速6km以下で歩道走行も - CNET Japan
数日前、歩道を堂々と走っていたのに遭遇した。 スピードはそれほどでもなかったけど 薄暮の時間帯だったのでちと焦った。
しかし車道の交通量が多いわけでもなかったのになぜ歩道を通っていたんだろう?
南武線ホームドア
JR東日本が「南武線」ホームドアの稼働を延期する理由|ニュースイッチ by 日刊工業新聞社
そういや某駅のホームもホームドア設置のための作業が進んでいるような。
ポイント
とある本を読んでいて知った。
パーセントポイント (percent point) またはパーセンテージポイント (percentage point) とは、パーセント (%) で表された2つの値の差を表す単位である。
日本語では単にポイントと呼ばれることが多い。例えば、ある値が40パーセントから44パーセントになった場合は「4ポイントの増加」という[1]。
Good Code, Bad Code
Amazonではまだのようだけど表紙が公開されてた。 原著そのままのようですね。
1月28日、新刊『Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考』発刊!|株式会社秀和システムのプレスリリース
メモ
- 「聖戦士ダンバイン」富野由悠季×「装甲騎兵ボトムズ」高橋良輔が対談、色紙も当たる(動画あり) - コミックナタリー
- pythonのバイナリパッケージなぜwheelというのか説明できるやつ0人説 - Qiita
複合リテラル
前回書いたGNU grepの話 に関連して、
for (int i = 0; i < UCHAR_MAX; i++)
if (0 <= strcoll (((char []) {i, 0}), ((char []) {i + 1, 0})))
return false;
ふと↑のコードはどんな出力になるのか気になったので
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main()
{
for (int i=0; i<16; i+=1)
printf("%d\n", srtcoll(((char []) {i, 0}), ((char []) {i + 1, 0})));
return 0;
}
こんなコードでgcc -S
してみた(しかしだいぶ古いバージョンですわね > 8.3.0)。
出力(最適化指定なし)
.file "comp.c"
.text
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "%d\12\0"
.text
.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
movl $0, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
addl $1, %eax
movb %al, -8(%rbp)
movb $0, -7(%rbp)
movl -4(%rbp), %eax
movb %al, -6(%rbp)
movb $0, -5(%rbp)
leaq -8(%rbp), %rdx
leaq -6(%rbp), %rax
movq %rax, %rcx
call strcoll
movl %eax, %edx
leaq .LC0(%rip), %rcx
call printf
addl $1, -4(%rbp)
.L2:
cmpl $15, -4(%rbp)
jle .L3
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"
.def strcoll; .scl 2; .type 32; .endef
.def printf; .scl 2; .type 32; .endef
なるほど。
ところで今回の話とは関係ないけど ちょっと疑問な部分もありますねこの出力。
ということでgcc -O2
すると…
出力(最適化あり)
.file "comp.c"
.text
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "%d\12\0"
.section .text.startup,"x"
.p2align 4,,15
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
pushq %rdi
.seh_pushreg %rdi
pushq %rsi
.seh_pushreg %rsi
pushq %rbx
.seh_pushreg %rbx
subq $56, %rsp
.seh_stackalloc 56
.seh_endprologue
leaq .LC0(%rip), %rsi
xorl %ebx, %ebx
call __main
leaq 46(%rsp), %rbp
leaq 44(%rsp), %rdi
.p2align 4,,10
.L2:
leal 1(%rbx), %eax
movq %rbp, %rdx
movq %rdi, %rcx
movb %bl, 44(%rsp)
movb %al, 46(%rsp)
addl $1, %ebx
movb $0, 47(%rsp)
movb $0, 45(%rsp)
call strcoll
movq %rsi, %rcx
movl %eax, %edx
call printf
cmpl $16, %ebx
jne .L2
xorl %eax, %eax
addq $56, %rsp
popq %rbx
popq %rsi
popq %rdi
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-posix-seh, Built by strawberryperl.com project) 8.3.0"
.def strcoll; .scl 2; .type 32; .endef
.def printf; .scl 2; .type 32; .endef
だいぶ変わりましたね。 rbp, rsi, rdiの使い方が面白い。
FORTRAN Compiler on IBM 704
C0190
前回の補足的に。
C190サブルーチンのコード
REM C0190,4/ CALLERS=CD000,CB000,CC000,C0100,C200,C00300,C0400, 4F10556
REM C0900,C1000,C1100,C1200,C1400,C1500,C1600,C3000,C3100,C3200, 4F10557
REM C3300,C3400,C0150,C0160,C0190,SS000,ROYCNV,RSC,LPR. 4F10558
REM C0190 OBTAINS IN AC THE NEXT NON-BLANK CHARACTER OF FORMULA. 4F10559
C0190 SXD C0194,1 SAVE THE C(XR1), AND 4F10560
LXD CHCTR,1 SET XR1 = CHARACTER COUNT. 4F10561
LDQ RESIDU PICK UP ANY REMAINING CHARACTERS. 4F10562
C0191 TIX C0193,1,1 IF NONE, 4F10563
LXD FWA,1 PICK UP NEXT FORMULA 4F10564
LDQ 0,1 WORD FROM F-REGION, 4F10565
TXI C0192,1,-1 AND INCREASE 4F10566
C0192 SXD FWA,1 FORMULA WORD ADDRESS BY 1. 4F10567
LXA L(6),1 RESET XR1 FOR 6 NEW CHARACTERS. 4F10568
C0193 PXD ,0 EXAMINE 4F10569
LGL 6 NEXT CHARACTER 4F10570
CAS BLANK AND COMPARE WITH A BLANK. 4F10571
C0194 TXI C0195,0,** IF BLANK, 4F10572
CHCTR TXI C0191,0,** GO EXAMINE NEXT CHARACTER. 4F10573
C0195 SXD CHCTR,1 IF NOT BLANK, RESET CHAR COUNT, 4F10574
STQ RESIDU SAVE ANY REMAINING CHARACTERS, 4F10575
LXD C0194,1 RESTORE THE C(XR1), AND 4F10576
TRA 1,4 * RETURN TO MAIN ROUTINE. 4F10577
REM END OF PROGRAM C0190. 4F10578
に日本語のコメントをつけてみた(元のコメントをそのまま日本語にしたわけではない)、
C0190 SXD C0194,1 XR1の値を保存
LXD CHCTR,1 CHCTRの内容をXR1にロード
LDQ RESIDU MQレジスターにロード
C0191 TIX C0193,1,1 XR1の内容が1以下ならラベルC0193へ
そうでなければXR1をデクリメント
LXD FWA,1 XR1にFWAの内容をロード
LDQ 0,1 XR1の示すアドレスの内容をMQレジスターにロード
TXI C0192,1,-1 XR1をデクリメント(指すアドレスとしてはインクリメント)
C0192 SXD FWA,1 デクリメント後の値をFWAに保存
LXA L(6),1 XR1に6をロード
C0193 PXD ,0 Accをゼロクリア
LGL 6 Accに6ビット取り出す
CAS BLANK Accの内容が空白か?
C0194 TXI C0195,0,** 空白以外ならラベルC0195へ
CHCTR TXI C0191,0,** 空白ならラベルC0191 へ
C0195 SXD CHCTR,1 空白以外ならラベルC0195へ
STQ RESIDU MQレジスターの内容を保存
LXD C0194,1 XR1の値を復帰
TRA 1,4 呼び出し元に戻る
XR1 インデックスレジスター1
Acc アキュムレーター
そして今回はSR6DC1を。
SR6DC1
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
LXA L(6),2 SET TO COUNT 6 CHARACTERS. 4F11009
STZ SR6WRK INITIALIZE OUTPUT CELL TO 0. 4F11010
SR6DC2 PXD ,0 OBTAIN NEXT CHARACTER 4F11011
LGL 6 IN AC AND 4F11012
CAS ABLANK TEST FOR BLANK. 4F11013
SR6XR2 TXI SR6DC3,0,** IF NOT BLANK, 4F11014
ENDWRD TIX SR6DC4,0,-1 (DECR= END OF PROBLEM INDICATOR) 4F11015
SR6DC3 CAS L(9) TEST FOR NUMERIC. 4F11016
TSX DIAG,4 * IF NON-NUMERIC - GO TO DIAGNOSTIC. 4F11017
NOP NOP IF NUMERIC, 4F11018
STO SR6WRK+1 SAVE DIGIT, AND 4F11019
CLA SR6WRK MULTIPLY PREVIOUS PARTIAL 4F11020
ALS 2 RESULT BY 10, 4F11021
ADD SR6WRK AND ADD IN 4F11022
ALS 1 CURRENT DIGIT, SAVING 4F11023
ADD SR6WRK+1 NEW PARTIAL RESULT. 4F11024
STO SR6WRK THEN ADJUST COUNT, AND 4F11025
SR6DC4 TIX SR6DC2,2,1 WHEN 6 CHARS HAVE BEEN TREATED, 4F11026
CLA SR6WRK LEAVE OUTPUT IN AC, 4F11027
LXD SR6XR2,2 RESTORE THE C(XR2), AND 4F11028
TRA TRA 1,1 * EXIT TO MAIN ROUTINE. 4F11029
REM END OF PROGRAM SR6DC1. 4F11030
変換対象をMQレジスターに入れてこのサブルーチンを呼び出すと
結果がアキュムレーターで返される。
CAS ABLANK TEST FOR BLANK.
で参照している ABLANKはこんな定義。
ABLANK SYN BLANK 4F15879
BLANK OCT 60 0000000000060 4F10339
このサブルーチンで行っている空白のチェック、
変換対象の終端かどうかを見ているのではなく
1 2 3
のようなものの空白の読み飛ばしのためっぽい。
文番号に空白が挟まっていても可ということか。
SR6DC2 PXD ,0 OBTAIN NEXT CHARACTER 4F11011
LGL 6 IN AC AND 4F11012
PXD ,0
でアキュムレーターをゼロクリアし、
つづくLGL 6
で
MQレジスターの最上位6ビットがアキュムレーターの最下位6ビットに入る。
- LGL Logical Left
- LLS Long Left Shift
- LRS Long Right Shift
そして
SR6DC3 CAS L(9) TEST FOR NUMERIC. 4F11016
TSX DIAG,4 * IF NON-NUMERIC - GO TO DIAGNOSTIC. 4F11017
NOP NOP IF NUMERIC, 4F11018
STO SR6WRK+1 SAVE DIGIT, AND 4F11019
でアキュムレーターにある「文字」が数字かどうかを判定しているのだけど、 BCD (character encoding) - Wikipedia にあるように0から9はコードの先頭にあるので、 9以下かどうかをみれば数字かどうか判定できる。
そしてASCIIなどとは違って たとえば「数字の0(のコード)」は「数値の0」と同じなので、 ASCIIでやるような0x30をひいて… という手間をかけずにそのまま計算。
このサブルーチンを呼び出しているところは何か所かあるけど たとえばCA000からだとこう。
CAL F-1 Accに1~6桁目の内容をロードする
CAS 5BLANS すべてが空白か?
TRA CA015 NO
TRA CD000 YES 次のサブルーチンへ
CA015 LRS 35 NO Accの内容をMQに転送する
TSX SR6DC1,1 SR6DC1を呼び出す
STA EIFNO 戻り値をEIFNOに格納する
Hugoメモ
0.110.0
Release v0.110.0 · gohugoio/hugo
dir
「でぃれ」って読んで「えっ」って言われた
— _ko1 (@_ko1) January 19, 2023
大昔(前世紀)の話なんだけど、 英語のネイティブスピーカーと会話してて 「だー」 と言われてしばらく意味が取れなかった経験がある>dir
それがその人だけなのか一般的なものなのかはわからなかったけど。
impediment
スクラム界隈ってなじみがない用語が多いよね。
— あきやま🎿 (@akiyama924) January 19, 2023
今日は、「インペディメントデータ」を覚えました。
「ゴールへ向かう歩みを止める障害情報」というような意味っぽいです。
へーと思って適当なつづりで英和辞典をひくと
impedimentの意味・使い方・読み方|英辞郎 on the WEB
なるほど。
Clascal
Computer History Museum が Apple Lisa のソースコードを公開している。ほとんどは Pascalか MC68k asmで書かれており、40万行程度ある。ダウンロードにはライセンスへの合意が必要。https://t.co/d8oSogvkOh
— 新山祐介 (Yusuke Shinyama) (@mootastic) January 20, 2023
HNで
- An Introduction to Clascal (1984) [pdf] | Hacker News
- http://www.bitsavers.org/pdf/apple/lisa/toolkit_3.0/Package_2_Examples/02_An_Introduction_To_Clascal_Jul84.pdf
というのがあって、なんでまた? と思ったらこれ(Lisaのソースコード公開)があったからか。
Lisa Source Code Release | Hacker News
Clascal, the predecessor from Object Pascal, used on Mac OS.
The Lisa: Apple’s Most Influential Failure - CHM
十進浮動小数点数
C言語の次期標準には十進浮動小数点数型_Decimal32, _Decimal64, _Decimal128が入る(※)ので、プログラミング入門に胸を張ってC言語をおすすめできる時代が(一周回って)来る(※必須とは言ってない)
— mod_poppo (@mod_poppo) January 16, 2023
知らんかった。どういう内部表現なんだろ。 https://t.co/EBBG5bQepE
— Hidemoto Nakada (@hidemotoNakada) January 16, 2023
IEEE754 のdecimal32/decimal64/decimal128ってあまり知られてないんですかね。 それこそx64あたりで使えるようにならんと無理?
- Decimal floating point - Wikipedia
- 10 進浮動小数点組み込み関数 - IBM Documentation
- IEEE 754 - Wikipedia
- Densely packed decimal - Wikipedia
$ ruby -e 'puts (0.1 + 0.2) == 0.3'
— りひにー (@noqisofon) January 16, 2023
false
$ raku -e 'say 0.1 + 0.2 ~~ 0.3;'
— りひにー (@noqisofon) January 16, 2023
True
$ raku -e 'say 0.1 + 0.2;'
— りひにー (@noqisofon) January 16, 2023
0.3
$ ruby -e 'puts (0.1 + 0.2)'
0.30000000000000004
raku(perl6)はこの辺何か特別な処理をしていたような。
別の話として、プログラミング言語入門本(ないし比較的最初の段階)で「2進小数故に出てくる誤差」の話、いれなきゃいかんのはなんか間違ってる気がするんですよね。
— kmizu (@kmizu) January 16, 2023
低レベルへの理解として内部表現の理解はどうせ必要にはなってくるんですが、リソースがそれなりに潤沢な今、
↓
Scratchで、子供たちからいつも報告されるScratchの「バグ」がこれです。私自身は実装を10進演算に変えてよいように思います。 https://t.co/yWReNqPjV2 pic.twitter.com/olcxkObguG
— アベ先生 (CV: 阿部和広) (@abee2) January 16, 2023
真に「普通の人」が使いやすいプログラミング言語考えるならCOBOLの仕様は案外見直されてもいいのかも。小数は十進小数デフォルトの方がいいんでない?とか含めて。
— kmizu (@kmizu) January 16, 2023
decimal64やdecimal128が簡単に使えるようになれば… というのは典型的な「鶏と卵」ですかね。 ソフトウェアでエミュレーションだとどのくらいの性能になるか。