ときどきの雑記帖 RE* (新南口)
Heart of Madness
逓信総合博物館
昔話シリーズ(謎)
紙テープでデバッグするわけないじゃん - いろいろやってみるにっき
紙テープに穿孔されるのはビット列なので覚えてしまえば読めるけど(オレも読めた)、
その昔大手町に逓信総合博物館 (逓信総合博物館 - Wikipedia) てのがあって、 文字(アルファベットだけだったかな?)をポチポチ入力すると それに応じた穴が開けられた紙テープが出力される機械が置かれていたのよ。
出力されたテープを手に内容が読める振りしたりね (自分が入力したものだからわかるのは当然) 😄
ところでいつごろまで紙テープを読む表現はあったのだろう? 記憶をたどるとガッチャマンにはあったような気がするけど 新マンはなかったような。
そういえば紙テープじゃなくてカードの話になるけど 通っていた大学の計算機センターにメインフレーム(H社製の「互換機」)があって、 カードリーダーもあったのね、 カードを読み込むところを何度か見たけどなかなか壮観だった。 「故障したらもう直せないからね」とかおどかされてた代物だったけど 本当のところどうだったのかは知らない😄
- 通信の話(通信研修草案)その10 : からくり箱 保守記録
- 「ウルトラマンシリーズに見る、初期のコンピュターのイメージ」カエル好きのブログ | カエル好きのページ - みんカラ
- 『昔の映画とか機械から出てきた紙テープだけ見て大喜びするじゃないですか』『今でも読めるよ』鑽孔テープの読み方と当時の思い出 - Togetter
100
歩数や距離よりも大事なのは「3歩目」…ウォーキングのプロが教える"歩くだけでやせる歩き方" ほとんどの人は「適正歩幅」で歩けていない | PRESIDENT Online(プレジデントオンライン)
「理想歩幅」とは健康的に正しく歩くための歩幅で、専門学的には身長の45%とされていますが、 それではすぐに計算できないので、私は適正歩幅を「身長マイナス100センチ」としています。
身長 | -100 | 45% |
---|---|---|
150 | 50 | 61.5 |
160 | 60 | 72 |
170 | 70 | 76.5 |
180 | 80 | 81 |
「理想」と「適正」だから違っててもいいんだって話かもしれないけど 近似値として使うには無理なくね?
Kindle 本
Kindle本を眺めていたら
Cプログラミング言語: Cによる設計プログラム | ジャック・バトラー | 工学 | Kindleストア | Amazon
彼は、自分の作曲がより多くの群衆を襲うと信じて、クリスチャンクラスのために明示的に作曲しないことに決めました。
初心者のためのJavaプログラミング言語: Javaプログラミングの簡単な紹介 | アルバートロビン | 工学 | Kindleストア | Amazon
退屈したい場合は、別の本を購入してください。しかし、Javaを理解したいのであれば、この本はあなたにぴったりです。
という説明のよくわからない本に遭遇。 買ってないから中身はわからん😄
ほかにもいくつか同様と思われるものが。
- ウェブサイトの構築と設計の方法を学ぶ: JavaScript、HTML5、CSS3 | アレックスジャクソン | 工学 | Kindleストア | Amazon
- コンピューターのハッキング: 初心者のためのハッキングガイド | ジョンソン大麦 | 工学 | Kindleストア | Amazon
- MATLABの紹介 初心者 | アレックス ジャクスソン | 工学 | Kindleストア | Amazon
- プログラミング言語のルール: モデリングと言語の会計プロセス | アレックスジャクソン | 工学 | Kindleストア | Amazon
Gレコ IV
まだ観に行けてない…
マイナビ
フィルターやスライサーを活用したピボットグラフ - 作り方で変わる!Excelグラフ実践テク(65) | TECH+
このシリーズわりと楽しみに読んでたんだけど 先週分から
Members+ 会員限定記事
となったらしく全部読むには会員登録が必須になった模様。 それはまあいいんだけどさあ、 登録時に要求される項目見てて 「こりゃダメだ(登録する気にはなれん)」 となった。
(ぴー)とか(ぴー)とかもそうだけど そんなに勤務先の詳細な情報が欲しいのかねえ。
実物大スコープドッグ
これは観に行かねば😄
【イベント告知】
— 稲城市観光協会🫡 (@inagi_life) July 25, 2022
稲城市のスコープドッグ右肩を赤く塗ります❕
〇日時
8月1日(月)予定〜10月31日(月)
詳しくはこちらをご覧ください。https://t.co/LQWvtwV9Tu
※画像はイメージです。#装甲騎兵ボトムズ#スコープドッグ#レッドショルダー#稲城市観光協会 pic.twitter.com/hzuM2U3Wzg
- 稲城市スコープドッグの右肩を赤く塗ります❢ | 稲城市観光協会
- 「そいつの肩は赤く塗らねえのかい?」、稲城市の「ボトムズ」のスコープドッグ、8月1日より「レッドショルダー」仕様に! - HOBBY Watch
xnor
if,else問題(演算子) police_trouble - Qiita
で
- 第一引数aと第二引数bどちらの証言も真(true)であれば、Trueを出力すること - 第一引数aと第二引数bどちらの証言も偽(false)であれば、Trueを出力すること - 第一引数aと第二引数bで証言の真偽が一致しない場合であれば、Falseを出力すること
とあってそれに対するスクリプトが
def police_trouble(a, b)
if (a && b) || (!a && !b)
puts "True"
else
puts "False"
end
end
police_trouble(true, true)
police_trouble(false, false)
police_trouble(true, false)
ということらしいのだけど
x
T F
y T T F
F F T
のようになればいいわけだから、xorの否定をとればいいような。
>ruby -rpp -e '[true, false].repeated_permutation(2).each{pp _1; puts not(_1[0] ^ _1[1])}'
[true, true]
true
[true, false]
false
[false, true]
false
[false, false]
true
ところで^
はbitwise xorぢゃあないのか?という
話もあるみたいなので(ry
さてソースコードでtrueとfalseのクラスを調べると
ruby/object.c at master · ruby/ruby
rb_cTrueClass = rb_define_class("TrueClass", rb_cObject);
rb_cTrueClass_to_s = rb_fstring_enc_lit("true", rb_usascii_encoding());
rb_gc_register_mark_object(rb_cTrueClass_to_s);
rb_define_method(rb_cTrueClass, "to_s", rb_true_to_s, 0);
rb_define_alias(rb_cTrueClass, "inspect", "to_s");
rb_define_method(rb_cTrueClass, "&", true_and, 1);
rb_define_method(rb_cTrueClass, "|", true_or, 1);
rb_define_method(rb_cTrueClass, "^", true_xor, 1);
rb_define_method(rb_cTrueClass, "===", case_equal, 1);
rb_undef_alloc_func(rb_cTrueClass);
rb_undef_method(CLASS_OF(rb_cTrueClass), "new");
rb_cFalseClass = rb_define_class("FalseClass", rb_cObject);
rb_cFalseClass_to_s = rb_fstring_enc_lit("false", rb_usascii_encoding());
rb_gc_register_mark_object(rb_cFalseClass_to_s);
rb_define_method(rb_cFalseClass, "to_s", rb_false_to_s, 0);
rb_define_alias(rb_cFalseClass, "inspect", "to_s");
rb_define_method(rb_cFalseClass, "&", false_and, 1);
rb_define_method(rb_cFalseClass, "|", false_or, 1);
rb_define_method(rb_cFalseClass, "^", false_xor, 1);
rb_define_method(rb_cFalseClass, "===", case_equal, 1);
rb_undef_alloc_func(rb_cFalseClass);
rb_undef_method(CLASS_OF(rb_cFalseClass), "new");
のようにTrueClass、FalseClassにちゃんと(?) メソッドとして「生えて」いて、 その実装はというと
ruby/object.c at 55c771c302f94f1d1d95bf41b42459b4d2d1c337 · ruby/ruby
*
* call-seq:
* true ^ obj -> !obj
*
* Exclusive Or---Returns <code>true</code> if <i>obj</i> is
* <code>nil</code> or <code>false</code>, <code>false</code>
* otherwise.
*/
static VALUE
true_xor(VALUE obj, VALUE obj2)
{
return rb_obj_not(obj2);
}
ruby/object.c at 55c771c302f94f1d1d95bf41b42459b4d2d1c337 · ruby/ruby
/*
* call-seq:
* false ^ obj -> true or false
* nil ^ obj -> true or false
*
* Exclusive Or---If <i>obj</i> is <code>nil</code> or
* <code>false</code>, returns <code>false</code>; otherwise, returns
* <code>true</code>.
*
*/
#define false_xor true_and
ruby/object.c at 55c771c302f94f1d1d95bf41b42459b4d2d1c337 · ruby/ruby
/*
* call-seq:
* true & obj -> true or false
*
* And---Returns <code>false</code> if <i>obj</i> is
* <code>nil</code> or <code>false</code>, <code>true</code> otherwise.
*/
static VALUE
true_and(VALUE obj, VALUE obj2)
{
return RBOOL(RTEST(obj2));
}
ということなのでヨシ!
irb(main):001:0> 1 ^ 2
=> 3
irb(main):002:0> true ^ 2
=> false
irb(main):003:0> 1 ^ true
Traceback (most recent call last):
5: from C:/Ruby30-x64/bin/irb.cmd:31:in `<main>'
4: from C:/Ruby30-x64/bin/irb.cmd:31:in `load'
3: from C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
2: from (irb):3:in `<main>'
1: from (irb):3:in `^'
TypeError (true can't be coerced into Integer)
irb(main):004:0> true ^ 0
=> false
irb(main):005:0* false ^ 0
=> true
irb(main):006:0> true ^ nil
=> true
irb(main):007:0>
あ、Rubyのバージョン上げとかないとだわ。
Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 3.1 リファレンスマニュアル)
GNU Hello
6月のアップデート状況 June GNU Spotlight with Amin Bandali: Twelve new GNU releases! — Free Software Foundation — Working together for free software を見ていると GNU Hello があったので 更新するような理由があったんだろうか と不思議に思って調べてみた。
つーてもNEWSファイルの記述を確かめただけだけど。
* Noteworthy changes in release 2.12.1 (2022-05-30) [stable]
Fix a minor documentation typo and update the translations.
* Noteworthy changes in release 2.12 (2022-01-31) [stable]
Fix a minor documentation typo.
Make tests introduced in 2.11 more portable.
* Noteworthy changes in release 2.11 (2022-01-05) [stable]
Remove -h and -v short options.
Various code tidying, including avoiding forward declarations, removing dead
code, new test for multibyte strings, better use of gnulib, update to more
recent gnulib and add git hooks from coreutils.
2.11でのオプションの削除はともかく 他の二件はドキュメントの修正?
- Hello - GNU Project - Free Software Foundation
- hello.git - hello - GNU greeting package
- hello.git - hello - GNU greeting package
- NEWS - hello.git - hello - GNU greeting package
FORTRAN Compiler on IBM 704
算術IF
今回追いかけているソースコードはFORTRAN IではなくFORTRAN IIなのだけど IからIIで何が変わったかというと、 うぃきぺ Fortran - Wikipedia によればこう。
FORTRAN II
IBM’s FORTRAN II appeared in 1958. The main enhancement was to support procedural programming by allowing user-written subroutines and functions which returned values with parameters passed by reference. The COMMON statement provided a way for subroutines to access common (or global) variables. Six new statements were introduced:[24]
- SUBROUTINE, FUNCTION, and END
- CALL and RETURN
- COMMON
Over the next few years, FORTRAN II would also add support for the DOUBLE PRECISION and COMPLEX data types.
Early FORTRAN compilers supported no recursion in subroutines. Early computer architectures supported no concept of a stack, and when they did directly support subroutine calls, the return location was often stored in one fixed location adjacent to the subroutine code (e.g. the IBM 1130) or a specific machine register (IBM 360 et seq), which only allows recursion if a stack is maintained by software and the return address is stored on the stack before the call is made and restored after the call returns. Although not specified in FORTRAN 77, many F77 compilers supported recursion as an option, and the Burroughs mainframes, designed with recursion built-in, did so by default. It became a standard in Fortran 90 via the new keyword RECURSIVE.[25]
ユーザー定義の関数や手続き(サブルーチン)はIの時点では存在していなかった。 ということですか。 一瞬、文関数は? と思ったけど調べてみるとさらに後になって導入されたものらしい。
同じくうぃきぺ Simple FORTRAN II program からFORTRAN IIのサンプル。
C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION
C INPUT - TAPE READER UNIT 5, INTEGER INPUT
C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
C INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING
READ INPUT TAPE 5, 501, IA, IB, IC
501 FORMAT (3I5)
C IA, IB, AND IC MAY NOT BE NEGATIVE OR ZERO
C FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLE
C MUST BE GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOO
IF (IA) 777, 777, 701
701 IF (IB) 777, 777, 702
702 IF (IC) 777, 777, 703
703 IF (IA+IB-IC) 777, 777, 704
704 IF (IA+IC-IB) 777, 777, 705
705 IF (IB+IC-IA) 777, 777, 799
777 STOP 1
C USING HERON'S FORMULA WE CALCULATE THE
C AREA OF THE TRIANGLE
799 S = FLOATF (IA + IB + IC) / 2.0
AREA = SQRTF( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
+ (S - FLOATF(IC)))
WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
601 FORMAT (4H A= ,I5,5H B= ,I5,5H C= ,I5,8H AREA= ,F10.2,
+ 13H SQUARE UNITS)
STOP
END
よく見るとIFの後に来る式が(名前からしてそうだけど)ふつーの算術式なんですな。 そしてその式の評価結果が負、0、正で三分岐すると。 ここではたと気がついたのだけど、 FORTRAN 77でおなじみだった
- .AND.
- .OR.
- .NOT.
- .EQV.
- .NEQV.
- .GE.
- .GT.
- .LE.
- .LT.
- .EQ.
- .NE.
という演算子が見当たらない(以前取り上げた「辞書」にない)のも当然だなと。
「論理IF文」が導入されたのはFORTRAN IVらしいので、 それとFORTRAN IIとの間にあったFORTRAN III にはまだ(論理IF文は)なかったということですね。
さすがに77以前のFORTRANは知らんがな。
CAS
ところで704にはCPUの命令自体に三方向分岐する命令があるのですが、 算術IF文の仕様はここから決まった?
問題の命令(CAS Compare Accumulator with Storage)の詳細な説明はたとえば Coding_for_the_MIT-IBM_704_Computer_Oct57.pdf のp.40にあって、 そこの説明ではこう。
The Skipping Type Control Instructions
(8) Compare Accumulator with StorageCAS A if C(AC)>C(A), go to the next instruction if C(AC)=C(A), skip one instruction if C(AC)<C(A), skip tow instruction
なかなか面倒なことをする命令ですな。 続くp.41にはサンプルコードもあって
Example 3:
Let us write another little program to compute min (C(A), C(B)) and put 1t in R:CLA A C(A)→C(AC) CAS B CLA B if C(B)<C(AC) then C(B)→C(AC) NOP they are equal STO R atore the minimum HPR A Arguments B R Result
ふむ。
メモリ位置 Aの内容とメモリ位置Bの内容を比較
(CAS B
)し、Bの方が小さければ(アキュムレーターにあるAの方が大きければ)
アキュムレーターにBの内容をロードする。
等しければ何もしない(NOP
)。
Bの方が大きければ(アキュムレーターにあるAの方が小さければ)
アキュムレーターの内容をRにストア。
これだとBの方が小さい場合には
NOP
とSTO R
も実行するのでわかりづらいけど
CAS
の後三つの命令をジャンプ命令(TRA
など)
にすれば見慣れた比較命令+条件ジャンプ命令のように使える?
linss
- Index of /pdf/ibm/704
- http://bitsavers.org/pdf/ibm/704/FORTRAN_paper_1957.pdf
- Transcription of Smithsonian IBM 704 Fortran II source code. ? Software Preservation Group
- 704 FORTRAN II - Software Preservation Group
- Assembly listing of transcription - Software Preservation Group
C23
C23では#embed指令が仕様に追加されることが決定。これを使うと、プログラムの中に直接バイナリを埋め込むことができる:
— 新山祐介 (Yusuke Shinyama) (@mootastic) July 23, 2022
static const char sound[] = {#embed <jump.wav>
};https://t.co/yGOImGUQb5
そんなの提案にあったっけ? と思って調べたら
- N2470 2019/01/05 Meneide, Preprocessor embed - Binary Resource Inclusion
- N2499 2020/03/08 Meneide, Preprocessor embed - Binary Resource Inclusion, r2
- N2592 2020/11/01 Meneide, Preprocessor embed
- N2725 2021/05/30 Meneide, Preprocessor embed, revision 4
- N2898 2022/02/13 Meneide, Preprocessor Embed - Binary Resource Inclusion, revision 5
- N2967 2022/04/15 Meneide, Preprocessor embed - Binary Resource Inclusion (r5)
- N3000 2022/06/22 Meneide, Preprocessor embed, r8
- N3017 2022/06/28 Meneide, Preprocessor embed, r7
気がつきませんでした。はい。
Cool stuff that got into C23 this week:
— Robert C. Seacord (@rcs@hachyderm.io) (@RCS) July 22, 2022
- nullptr
- typed enumerations
- improved normal enumerations
- Comma omission and comma deletion
- constexpr
- auto
- TIME_MONOTONIC
- bit-precise bit-fields
- relaxed requirements for variadic parameter lists
- embed
xz
xz圧縮形式は貴重なデータを長期保存するには使うべきではない。xzの仕様は完全に文書化されておらず、しかも仕様と異なる実装が存在する。またxz形式は拡張可能性が高すぎて結果の予測が不可能。さらにxzのエラーチェック機構は不完全でデータ改ざんの危険性がある。https://t.co/41fWaLxPYu
— 新山祐介 (Yusuke Shinyama) (@mootastic) July 24, 2022
Xz format inadequate for long-term archiving
なんか見覚えのある記事だなと思ったら やっぱり以前に言及していた。
.lz を使うようになった経緯については Xz format inadequate for long-term archiving lzip_talk_ghm_2019.pdf にあるようなので後で読む。
tar
もうひとつ新山さんのツイートから
GNU tar形式は実は展開するのにファイル数 nに応じたO(n^2)の時間がかかるアルゴリズムになっている。これは ".." をパス名に含むシンボリックリンクが悪用されて無関係な位置のファイルが改ざんされるのを防ぐため。.tarファイルが信頼できる場合は、-Pをつけると速くなる。https://t.co/qU8sYrE73l
— 新山祐介 (Yusuke Shinyama) (@mootastic) July 24, 2022
..
とシンボリックリンクがらみの脆弱性が
以前報告されてたような…
で調べてみると
GNU TAR : List of security vulnerabilities の中の CVE-2001-1267 : Directory traversal vulnerability in GNU tar 1.13.19 and earlier allows local users to overwrite arbitrary files during かな? ずいぶんと前のものだけど。
I’m absolutely certain that it’s possible to make GNU tar extract in O(n) without –absolute-paths by replacing the linked list with a hash map. But that’s an adventure for another time.
とかありますな。
Packt
Motorola 88000 RISC CPUのバイナリを吐くLLVMのバックエンドを開発されたとの話。作者は "Learn LLVM 12"という名のO'reillyの本の著者樣で本の内容に変更を加えて実装をされているとの話。 https://t.co/ZlqcUkHilr
— 高梨陣平 (@jingbay) July 24, 2022
そんな本(「Learn LLVM 12」)があったのか と思ったのでAmazonで探してみると
出版社 : Packt Publishing (2021/5/28)
…あれ?
ということで、HNの記事からさらに元記事をたどると…
redstar/llvm-m88k: LLVM backend for m88k architecture
The code is based on the example from my book “Learn LLVM 12” (see O’Reilly, Packt or Amazon). It differs in the following ways:
これを「『O’reilly』の本」としちゃうのは違うんでないかい?