ときどきの雑記帖 RE* (新南口)
星空のディスタンス
北斗の拳@tvk
銀河鉄道999が最終話まできたので後番組はどうなるのかと思ったら、 これまで2100からの放送だった「らんま1/2」が 999を放送していた時間帯(2300~)に移り、 さらに2130~の放送だった 北斗の拳が2100からの放送になるらしい。
BS12のアニメ映画の枠と被るからその移動は止めてほしかったorz
と思ったらこれも時間帯が被るのか アニメ「不滅のあなたへ」Season2 公式サイト
John Ousterhout
チェックはしていてもあまり聴いていない Maintainable のゲストにJohn Ousterhoutが登場。 これは聴かねば
John Ousterhout - It’s Not You, It’s the Codebase | Maintainable
John Ousterhoutって誰?という向きはこの辺を。
ドイツ語版がO’reillyの本になってて吃驚だ。
イメルト回顧録
GE帝国盛衰史の話を書いたせいか(それはない) ジェフ・イメルトの回顧録が新刊で出ているのに遭遇した。 帯の(原著に対する)書評にちょっと苦笑。
文庫
書店で遭遇したと言えば ホモ・デウスの文庫もそうだな。
先に出たサピエンス全史が文庫になってないのは 単行本の売れ行きの差とかだろうか。
とか書いていてまだどれも読んでいないんだけどな😄
ちょっと前にハラリの著作(特にサピエンス全史)に対する 批判記事が出てたと記憶しているんだけど その後なんかあったんだろうか。
シブヤニアファミリー
新刊繋がり。 そろそろじゃなかろうかとチェックしたらビンゴ。
新マン
2nd seasonのKVだかで見たときに なんかごついのがいるけど消去法で考えると 新マン(「ジャック」とは意地でも呼んであげない)だろうか と思っていたのだけどやっぱりそうだったか。
ヒーローズ「ULTRAMAN」 ムービーモンスターシリーズ JACK | ULTRAMAN 趣味・コレクション | バンダイナムコグループ公式通販サイト
まあ初代と区別つけにくいのはわかるけどねえ。
マスコット
DeNA、無失点リレー 石田が6回無失点で6勝目 - サンスポ
なんか見慣れないのがいるなあと思って調べたがこいつら?
キャラクター紹介 │ キャラクター │ I☆YOKOHAMA
CHAPYがそれっぽいな。
LET
以前どこかで、javascriptの変数宣言にも取り入れられたlet
の元祖は?
という話題があって、そこから
変数宣言ではないがキーワードとしてのlet
の初出はBASICか?
という話があったように思うのだけど
そのBASICより古そうなものを発見したので書いておく。
COBOL絡みで
を調べていたら
https://web.archive.org/web/20060903201804/http://hopl.murdoch.edu.au/showlanguage.prx?exp=158&language=FORMAC にあるサンプルコードにこんなものが
Example
Partial program for calculating f and g.
$IBFMC TS02
SYMARG
DIMENSION F(100), G(100), OUTPUT(22)
C FORMAC DATA DECLARATIONS.
ATOMIC MU, SIGMA, EPSI, T
DEPEND (MU, SIGMA, EPSI/T)
LET F(1) = 1.
LET G(1)=0.
DO 13 I=l, 100
C CODE TO GENERATE F(I+l) AND G(I+l) FROM F(I) AND G(I).
5 LET F(I+l) = SUBST FMCDIF(F(I),T,l)-MU*G(I), LIST
LET F(I+1) = EXPAND F(I+1) 10 LET G(I+l) = SUBST(FMCDIF(G(I),T,l)+F(I)), LIST
10 LET G(I+l) = EXPAND G(I+l)
LIST PARAM (FMCDIF(MU,T,S), -3. *MU*SIGMA), (FMCDIF(SIGMA,T,l), EPSI-2. *SIGMA**2), (FMCDIF(EPSI,T,l), -SIGhlA*MU-SIGMA*2. EPSI)
13 CONTINUE
前回話題に出したHOPLにもFORMACはあって(paperを書いたのはJean Sammet)、
その資料にあったサンプルコードにもしっかりLET
があった。
column major
これも前回書いたcolumn major絡み(西亭新九郎大活躍だな)で。
Flat indices for arrays in R/Rcpp | R-bloggers でcolumn majorの話題。まあRもcolumn majorの言語だしね。
The solution generalized to the $n$-dimensional case can be expressed as:
$[x_1, x_2, x_3, ..., x_n] = x_1 + \sum_{i=2}^{n}x_i\prod_{j = 1}^{i-1}d_j$
where $x_i$ means i-th index and $d_i$ i-th dimension size. This solution takes into account the 1-based indexing which is used in R.
Example
Suppose we have an array with the same dimesnions as shown above: $(20, 7, 5)$. We’d like to access an element at index $(11, 3, 2)$.
example <- array(0, c(20, 7, 5)) example[11, 3, 2] <- 7
We calculate the flat index according to the aforementioned schema.
flat_idx <- 11 + (3 - 1) * 20 + (2 - 1) * 20 * 7 example[flat_idx] ## [1] 7
結論(式)は前回わたしが書いたものと同じ。より一般化されてるけど。
続・なぞのすくりぷと
問題文をよく読むと、最後の注意書きに 最後は出発地点に戻ると書かれていたので修正。
「やっつけレベル」の上がったやっつけスクリプト。
require 'pp'
Inf = Float::INFINITY
tbl = [
[ 0, 10, 20, 12, 15, Inf, Inf, Inf, Inf],
[ 10, 0, Inf, Inf, 10, Inf, Inf, Inf, Inf],
[ 20, Inf, 0, 10, Inf, 25, 20, 30, Inf],
[ 12, Inf, 10, 0, 15, Inf, Inf, 20, Inf],
[ 15, 10, Inf, 15, 0, Inf, Inf, 15, 18],
[Inf, Inf, 25, Inf, Inf, 0, 5, Inf, Inf],
[Inf, Inf, 20, Inf, Inf, 5, 0, 35, Inf],
[Inf, Inf, 30, 20, 15, Inf, 35, 0, 12],
[Inf, Inf, Inf, Inf, 18, Inf, Inf, 12, 0]]
result = [*1..8].permutation.filter do |root|
root.unshift(0)
root.push(0)
ans = root.each_cons(2).inject(0) do |acc, t|
acc += tbl[t[0]][t[1]]
#break Inf if acc==Inf
end
ans==Inf ? false : root.unshift(ans)
end
pp result.sort_by{ _1[0] }
[[137, 0, 3, 2, 5, 6, 7, 8, 4, 1, 0], [137, 0, 1, 4, 8, 7, 6, 5, 2, 3, 0]]
これ、二通り出ているけど実質一つ? (互いが相手の「逆回り」になっている)
CA
Shift_JIS の CSV を読み込もうとしたらエラー
※ 日本語を含む 250MB 程のファイル
他のツールだと問題なく読み込める
とあるけどエラーメッセージ
Could not parse the input. Please make sure to set the proper -w input-wrapping parameter for your input, and that you use the proper input encoding (-e). Error: ‘utf-8’ codec can’t decode byte 0xca in position 293: invalid continuation byte
をよく見ると
‘utf-8’ codec can’t decode byte 0xca in position 293: invalid continuation byte
とあるし(UTF-8の後続バイトに0xcaが出てくることはない)、 ほかの手段で変換したものを食わせると問題ない ということはこのツール内部でのUTF-8への変換でしくじってそうな。
ということでツールの配布サイトやらを見ていくと Python標準のライブラリを使っているっぽいけど どうなんだこれ。
position 293
あたりの元データがわかれば話は早いんだけど
しらみつぶしに調べていくのもめんd(ry
FORTRAN Compiler on IBM 704
TXI
704にはTXI
という命令がありまして。
DIM1SR SXD DMSR00,4 SAVE THE C(XR4) FOR RETURN, 4F10625
LXD DIM1IX-3,4 SET XR4 = NUMBER OF ENTRIES IN DIM14F10626
CLA ORGDM1 AND PICK UP 1ST ADDRESS 0F DIM1 TO 4F10627
DMSR00 TXI DMSR01,0,** GO SET DRUM ADDRESS. 4F10628
REM DIM2SR= ENTRY POINT FOR 2 DIMENSION TABLE. 4F10629
DIM2SR SXD DMSR00,4 SAVE THE C(XR4) FOR RETURN, 4F10630
こんな感じの使われ方をしている。
DMSR00 TXI DMSR01,0,**
の**
は前回書いたような
「自己書き換え」用のもので、
ここではSXD DMSR00,4
で呼び出し元のアドレスを保存するのに使ってる
(SAVE THE C(XR4) FOR RETURN
)。
このTXI (Transfer with Index Increment) は本来
Example 4. We rewrite example 1 to illustrate these points.
LXA COUNT, 1
LOOP LDQ VECTA +3, 1
FMP VECTA +3, 1
FAD ANSWER
STO ANSWER
TXI TEST, 1, -1
TEST TXH LOOP,1,0
HPR
COUNT PZE 3
ANSWER
のようにループを構築するために用意された命令と思われるのだけど
p.170
If β=O, I=0. If β=l, 2 or 4 a single Index Register is selected. If β = 3, 5, 6. or 7 more than one Index Register is selected and I is formed by a Boolean “OR” of the contents of these registers. If the operation loads the Index, then the same number is placed in each index selected.
インデックスレジスターの指定部分を0にすると 単なるジャンプ命令と変わらなくなる(操作対象のレジスターがないから)。 そのためか
CA010
TRA CA010 * GO BEGIN STATE A OF SECTION ONE. 4F11541
TXI CA010,0 * EXTI TO PROCESS NEXT STATEMENT. 4F11842
CTRAD TXI CA010,0,250 * EXIT TO PROCESS NEXT STATEMENT. 4F11924
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12133
TXI CA010,0 * EXIT TO PROCESS NEXT STATMENT. 4F12186
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12200
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12224
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12260
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12270
TXI CA010,0 * OTHERWISE, EXIT TO CA000. 4F12317
TXI CA010,0 * IF ENDMK, EXIT TO CA000. 4F12331
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12377
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12423
TXI CA010,0 * EXIT TO PROCESS NEXT STATEMENT. 4F12439
TZE CA010 * EXIT TO PROCESS NEXT STATEMENT. 4F12677
TZE CA010 * EXIT TO PROCESS NEXT STATEMENT. 4F13021
こういう使われ方をされてもいる。 ここで挙げたもののコメントをみるに CA010が「文」の解析の先頭みたいすね。
そのCA010の辺りを見ると
REM STATEA/1-ASSEMBLE AND CLASSIFY ALL STATEMENTS= 4F11637
ORGA ORG 1824 4F11638
REM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *4F11639
STATEA BSS 0 4F11640
REM CA000/ CALLS=CA100,SR6DC1,TET00,DIAG. 4F11641
REM CA000 ASSEMBLES STATEMENT IN THE F-REGION ANO ASSIGNS AN IFN.4F11642
CA010 LXD ENDWRD,4 IF THE FINAL STATEMENT HAS BEEN 4F11643
TXL DIAG,4,0 * PROCESSED, THEN GO CALL DIAGNOSTIC.4F11644
LXD EIFNO,1 KEEP INTERNAL 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 REG1ON 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 T0 FIND FIRST NON BLANK WORD. 4F11664
TRA CA023 NOT BLANK. 4F11665
TXI CA022,1,1 BLANK, SO CONTINUE SCAM. 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
ということでこの辺から潜り始めましょうかね。
オマジナイ
1984年発行のPC雑誌見てたら草 pic.twitter.com/e3q13NC6XX
— hakase329 (@hakase329) September 23, 2022
MASM(4.0あたり)のディレクティブやらなんやらは 「オマジナイ」のレベルだったよなあ。 8086のセグメントのわかりづらさの何割かはアレのせいだったんじゃないかという気もする😄