ときどきの雑記帖 RE* (新南口)
ここから、ここから
今週のしずえさん
「仏の顔も三度」
刻む
某スポーツイベント関連の番組を見ていたら 出演者が『歴史「を」刻む』といった感じのフレーズを連発していて気になった。
刻んでどうすんのよ>歴史
『歴史「に」(名を)刻む』だったらまあ。
Midnight Commander
そういやこれも「元ネタをひねった名前」だった
- Midnight Commander Tips and Tricks | Hacker News
- Midnight Commander Tips and Tricks
- Midnight Commander - Wikipedia
- Norton Commander - Wikipedia
glibc
2.35がリリースされていた。
- GNU C Library - News: The GNU C Library version 2.35 is now available [Savannah]
- GNU C Library 2.35 : programming
- Unicode 14に対応した「GNU C Library 2.35」が公開 | OSDN Magazine
redditの反応にもあったけど今までなかったんだ>C.UTF-8
Ubuntsuなどで従来からC.UTF-8があったのはディストリビューター側で追加していたかららしい。
C.UTF-8ロケールのサポートも加わった。
Support for the C.UTF-8 locale has been added to glibc.
Finally! Hopefully we can kill the mess that is the C locale management soon
minimum(x, y) is x if x<y, y if y<x, and a quiet NaN if either operand is a NaN, according to 6.2. For this operation, −0 compares less than +0. Otherwise (i.e., when x=y and signs are the same) it is either x or y.
(興味深い)BUG
- Bug #18578: Hash#shift を繰り返していると ruby が無応答になる。 - Ruby master - Ruby Issue Tracking System
- st.c: Do not clear entries_bound when calling Hash#shift for empty hash by mame · Pull Request #5539 · ruby/ruby
メモ:entries_bound は使用中のビン(DELETEDになったビンを含む)の数に(ほぼ)対応していて、 これをみてテーブルをリビルドしている(rebuild_table_if_necessary)。 空のハッシュに対する Hash#shift はなぜか entries_bound を 0 にしているので、リビルドすべきタイミングを逃し、 ビンがすべて使用中になった状態で空きビンを探そうとするので無限ループに陥っていた(find_table_bin_ind)。
c
v7unix/v7/usr/src/cmd/c at master · v7unix/v7unix
日経Linux
2/8発売の日経Linux2022年3月号に掲載の シス管系女子でシェルスクリプトのあの動作を取り上げていた (次回もそうらしい)。
Byte
例によって波が過ぎさってからボソッと。
- [B! 歴史] 「1Byteが8bitに決まったワケ」についての長い話 まずは「バベッジの階差機関」から
- [B! テクノロジー] 「1Byteが8bitに決まったワケ」についての長い話 まずは「バベッジの階差機関」から(要約)
- [B! あとで読む] 「1Byteが8bitに決まったワケ」についての長い話 まずは「バベッジの階差機関」から
- [B! togetter] 「1byteはなぜ10bitでなく8bitなのか」に即答できないのはIT素人」説を受けてベテランが「なぜ8bitに収束したのかわからん」と苦悩する世界
- 「1byteはなぜ10bitでなく8bitなのか」に即答できないのはIT素人」説を受けてベテランが「なぜ8bitに収束したのかわからん」と苦悩する世界 - Togetter
そもそもなぜSystem/360が1バイト8bitになったのか。360に先立つEBCDICが8bitコードである主な理由について、1979年に書かれた書籍(著者はIBM)は2点挙げていて
— Kazuho Oku (@kazuho) February 1, 2022
* 1960年代の想定では計算機の想定用途の75%が数値計算でpacked BCDによる空間効率向上が文字コードの非効率性よりも重要
追記「1文字6bitじゃ足りなくなってきたというのは些細な話。そうではなく上記2点の根本的理由から、Syste/360で1バイト8bitにすると決め、その結果として文字数を増やしたんだ」とも、はっきり書いてある
— Kazuho Oku (@kazuho) February 1, 2022
なぜ1バイトが8ビットに、というのはさておき 「1Byteが8bitに決まったワケ」についての長い話 まずは「バベッジの階差機関」から(7/7 ページ) - ITmedia NEWS のコメント欄に興味深いものが。
IIJIMA,J.
ID: 8902d7 byte という文字列の語源がなんであるかを調査すべきです。
コンピュータが扱う(記録したり計算するための)情報の基本的な幅が、6bit,7bit,8bit,9bit などであった歴史があります。 (現在、この幅は、ほとんど 8bit です。この bit は、binary digitの省略形です。)
この基本的な幅を byte と呼ぶことがあるということで、この記事が書かれているようです。しかし、なぜ byte という綴りなのでしょうか。私の記憶によれば、byte は、by tetrad の省略形です。tetrad は、4つ組や4です。by は bicycle, binary などの頭に使われている bi- と同じで 2とか2倍を表す使い方と聞きました。(辞書を引いてみたのですが、直接そのような記述は見つかりませんでした。 発音が同じなので、ちょっと違った綴りにしたかったのかもしれません。) というわけで、byte は、2×4で 8 です。
IIJIMA,J.
ID: 8902d7
by tetrad –> byte の補足です。
この話を聞いたのは、1960年代で、このころは、byte と名付けた人たちもまだ活躍されていたのだろうと考えています。 たぶん、名付けた理由を書いた文書も残っているのではないかと思います。
これは初耳。とは言え(遠い過去の話ということもあるのだろうけど) 検索しても類似の情報すらも見つからないので信憑性は低そう?。
にしても「調査すべき」とはずいぶんな物言いじゃなかろうか。
bite
byteのつづりはbiteからちょっと変えて作ったものとは 色々なところで見かけるけどなあ(jargon fileとか)。 まあ確かに、「一次資料」のそれはみたことないか。
byte: /bi:t/, n.
(略)
Historical note: The term was coined by Werner Buchholz in 1956 during the early design phase for the IBM Stretch computer; originally it was described as 1 to 6 bits (typical I/O equipment of the period used 6-bit chunks of information). The move to an 8-bit byte happened in late 1956, and this size was later adopted and promulgated as a standard by the System/360. The word was coined by mutating the word ‘bite’ so it would not be accidentally misspelled as bit. See also nybble.
The term byte was coined by Werner Buchholz in June 1956,[4][13][14][b] during the early design phase for the IBM Stretch[15][16][1][13][14][17][18] computer, which had addressing to the bit and variable field length (VFL) instructions with a byte size encoded in the instruction.[13] It is a deliberate respelling of bite to avoid accidental mutation to bit.[1][13][19][c]
Another origin of byte for bit groups smaller than a computer’s word size, and in particular groups of four bits, is on record by Louis G. Dooley, who claimed he coined the term while working with Jules Schwartz and Dick Beeler on an air defense system called SAGE at MIT Lincoln Laboratory in 1956 or 1957, which was jointly developed by Rand, MIT, and IBM.[20][21]
http://archive.computerhistory.org/resources/text/IBM/Stretch/pdfs/Buchholz_102636426.pdf p.40
Byte denotes a group of bits used to encode a character, or the number of bits transmitted in parallel to and from input-output units. A term other than character is used here because a given character may be repre- sented in different applications by more than one code, and different codes may use different numbers of bits (i.e., different byte sizes). In input- output transmission the grouping of bits may be completely arbitrary and have no relation to actual characters. (The term is coined from bite, but respelled to avoid accidental mutation to bit.)
binary digit eight
さらに検索するとこういうのも見つかったけど、 いくらなんでもそれはないだろう>8個のビット
byteの語源 -現在1byte=8bitというのが主流になっていますが、- | OKWAVE
こちらでは、語源は、「8個のビット」(binary digit eight)や 「2進法の表」(binary table)など諸説あると紹介されていますが どれが正しいかは判断がつきませんね。
バイトは、IBMが大型コンピューターで使っていた用語が広まったとされる。ただし、その語源は、 「8個のビット」(binary digit eight)や「2進法の表」(binary table)など諸説あって定かではない。
ビット・バイトの由来について。 -コンピュータの基本単位のビットは、おそら- | OKWAVE 経由で [ IP Network Skill - No. 0174 - ] [IP Network Skill] - メルマ!
【コラム】bitとbyteの語源
先日初めて知りました。 bitという単位の語源は「BInary digiT (2進数)」から取ったようです。 またbyteという単位の語源は「BInary digiT Eight」、つまり2進数で8桁 というところから最初biteだったのが崩れてbyteになった、ということです。 byteに関してはbinary termの略という説もあるようです。
I am way behind in my work, but I just cannot resist trying to answer your question on why a “byte” has eight bits.
The answer is that some do, and some don’t. But that takes explaining, as follows:
ん? bi-tetrade → bite → byte ?
langinfo
Linux における日本語ロケールに関する指針 Chapter 4. ロケール定義 に
可能ならば以下のクラスを追加する。
- jdigit
- jhira
- jkata
- jkanji
- jspace
とあり、
opengroupの Locale をみると
charclass-name
Define characters to be classified as belonging to the named locale-specific character class. In the POSIX locale, locale-specific named character classes need not exist.
If a class name is defined by a charclass keyword, but no characters are subsequently assigned to it, this is not an error; it represents a class without any characters belonging to it.
The charclass-name can be used as the property argument to the wctype() function, in regular expression and shell pattern-matching bracket expressions, and by the tr command.
という記述があるので、 こんなやっつけプログラムを書いて試してみる。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wctype.h>
const char *ctnames[] = {
"alpha",
"digit",
"jdigit",
"jhira",
"jkata",
"jkanji",
"jspace",
NULL,
};
const wchar_t wchars[] = {
0x30,
0x3042,
0x30A2,
0xFF10,
0x4E00,
0x58F1,
WEOF,
};
int
main(int argc, char *argv[])
{
setlocale(LC_CTYPE, "");
for (const char **pp = ctnames; *pp; pp++) {
printf("%s %s\n", *pp, wctype(*pp) ? "Yes" : "No");
}
for (const wchar_t *pwc = wchars; *pwc!=WEOF; pwc++) {
for (const char **pp = ctnames; *pp; pp++) {
printf("%C %s %d\n", *pwc, *pp, iswctype((wchar_t)*pwc, wctype(*pp)));
//printf("%0x %s %d\n", *pwc, *pp, iswctype((wchar_t)*pwc, wctype(*pp)));
}
}
}
まずは実行環境のlocaleをチェック。
kbk@toybox4:/mnt/c/Users/kbk$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
その状態のまま、先ほどのプログラムを(もちろんコンパイルしてから)実行すると
kbk@toybox4:/mnt/c/Users/kbk$ ./a.out
alpha Yes
digit Yes
jdigit No
jhira No
jkata No
jkanji No
jspace No
0 alpha 0
0 digit 1
0 jdigit 0
0 jhira 0
0 jkata 0
0 jkanji 0
0 jspace 0
あ alpha 1
あ digit 0
あ jdigit 0
あ jhira 0
あ jkata 0
あ jkanji 0
あ jspace 0
ア alpha 1
ア digit 0
ア jdigit 0
ア jhira 0
ア jkata 0
ア jkanji 0
ア jspace 0
0 alpha 1
0 digit 0
0 jdigit 0
0 jhira 0
0 jkata 0
0 jkanji 0
0 jspace 0
一 alpha 1
一 digit 0
一 jdigit 0
一 jhira 0
一 jkata 0
一 jkanji 0
一 jspace 0
壱 alpha 1
壱 digit 0
壱 jdigit 0
壱 jhira 0
壱 jkata 0
壱 jkanji 0
壱 jspace 0
となる。 次にlocaleをja_JP.utf8にして実行
kbk@toybox4:/mnt/c/Users/kbk$ LC_CTYPE=ja_JP.utf8 ./a.out
alpha Yes
digit Yes
jdigit Yes
jhira Yes
jkata Yes
jkanji Yes
jspace Yes
0 alpha 0
0 digit 1
0 jdigit 0
0 jhira 0
0 jkata 0
0 jkanji 0
0 jspace 0
あ alpha 1
あ digit 0
あ jdigit 0
あ jhira 1
あ jkata 0
あ jkanji 0
あ jspace 0
ア alpha 1
ア digit 0
ア jdigit 0
ア jhira 0
ア jkata 1
ア jkanji 0
ア jspace 0
0 alpha 1
0 digit 0
0 jdigit 1
0 jhira 0
0 jkata 0
0 jkanji 0
0 jspace 0
一 alpha 1
一 digit 0
一 jdigit 0
一 jhira 0
一 jkata 0
一 jkanji 1
一 jspace 0
壱 alpha 1
壱 digit 0
壱 jdigit 0
壱 jhira 0
壱 jkata 0
壱 jkanji 1
壱 jspace 0
こうなった。 まあほぼ予想通りか。
ところで
kbk@toybox4:/mnt/c/Users/kbk$ LC_ALL=C ./a.out
alpha Yes
digit Yes
jdigit No
jhira No
jkata No
jkanji No
jspace No
0 alpha 0
0 digit 1
0 jdigit 0
0 jhira 0
0 jkata 0
0 jkanji 0
0 jspace 0
kbk@toybox4:/mnt/c/Users/kbk$
これにはちょっと焦ったが、落ち着いて考えればこういうものかと納得。
さて、iswctype((wchar_t)*pwc, wctype(*pp))
のようにして
jhiraなどに属するものかをチェックしているわけだけど、
このwctype
が返しているものはなにかというと
wctype.c / wctype_l.c
glibc/wctype.c at 895ef79e04a953cac1493863bcae29ad85657ee1 · lattera/glibc
wctype_t
__wctype (const char *property)
{
const char *names;
unsigned int result;
size_t proplen = strlen (property);
size_t i;
names = _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS_NAMES);
for (result = 0; ; result++)
{
size_t nameslen = strlen (names);
if (proplen == nameslen && memcmp (property, names, proplen) == 0)
break;
names += nameslen + 1;
if (names[0] == '\0')
return 0;
}
i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_CLASS_OFFSET) + result;
return (wctype_t) _NL_CURRENT_DATA (LC_CTYPE)->values[i].string;
}
weak_alias (__wctype, wctype)
や
wctype_t
__wctype_l (const char *property, locale_t locale)
{
const char *names;
unsigned int result;
size_t proplen = strlen (property);
size_t i;
names = locale->__locales[LC_CTYPE]->values[_NL_ITEM_INDEX (_NL_CTYPE_CLASS_NAMES)].string;
for (result = 0; ; result++)
{
size_t nameslen = strlen (names);
if (proplen == nameslen && memcmp (property, names, proplen) == 0)
break;
names += nameslen + 1;
if (names[0] == '\0')
return 0;
}
i = locale->__locales[LC_CTYPE]->values[_NL_ITEM_INDEX (_NL_CTYPE_CLASS_OFFSET)].word + result;
return (wctype_t) locale->__locales[LC_CTYPE]->values[i].string;
}
weak_alias (__wctype_l, wctype_l)
にあるようにwctype_t
で表される何か。そしてこの短い関数を見ても
なにやら見慣れない名前(マクロ、定数、メンバー名等々)がいくつかあるので
あわせて調べていくことにする。
- wctype_t
- _NL_CURRENT
- _NL_CTYPE_CLASS_NAMES
- _NL_CURRENT_WORD
- _NL_CTYPE_CLASS_OFFSET
- _NL_CURRENT_DATA
- _NL_ITEM_INDEX
- locale_t
- __locales[]
- values[]
wctype_t
まずはwctype_t
から。
glibc/wctype-wchar.h at 895ef79e04a953cac1493863bcae29ad85657ee1 · lattera/glibc
/* Scalar type that can hold values which represent locale-specific
character classifications. */
typedef unsigned long int wctype_t;
と、無符号の整数となってはいるが、
関数から返しているのが(キャストがついてるけど)
_NL_CURRENT_DATA (LC_CTYPE)->values[i].string
や
locale->__locales[LC_CTYPE]->values[i].string
なので、どうも何かのポインターっぽい?
localeの型locale_t
から辿ると
#include <bits/types/__locale_t.h>
typedef __locale_t locale_t;
struct __locale_struct
{
/* Note: LC_ALL is not a valid index into this array. */
struct __locale_data *__locales[13]; /* 13 = __LC_LAST. */
/* To increase the speed of this solution we add some special members. */
const unsigned short int *__ctype_b;
const int *__ctype_tolower;
const int *__ctype_toupper;
/* Note: LC_ALL is not a valid index into this array. */
const char *__names[13];
};
typedef struct __locale_struct *__locale_t;
となり、__locale_data
は
glibc/localeinfo.h
/* Structure describing locale data in core for a category. */
struct __locale_data
{
...省略
union locale_data_value
{
const uint32_t *wstr;
const char *string;
unsigned int word; /* Note endian issues vs 64-bit pointers. */
}
values __flexarr; /* Items, usually pointers into `filedata'. */
};
のようにvaluesを抱えていて そのvaluesの型を見ると
union locale_data_value
{
const uint32_t *wstr;
const char *string;
unsigned int word; /* Note endian issues vs 64-bit pointers. */
}
ようやくstringが登場。
そしてそれはconst char *
なので
ポインターですね。と。
銀河の歴史がまた一ページ
宇宙暦799年2月9日11時 ビッテンフェルト艦隊が行動を開始した。#本伝5巻 #神々の黄昏戦役 #ランテマリオ星域会戦
— 今日は何の日@銀英伝bot (@logh_today) February 9, 2022
宇宙暦799年2月9日11:20 戦場のエネルギー流を「渡河」したビッテンフェルト艦隊に向け、自由惑星同盟軍が一斉に砲門を開いた。#本伝5巻 #神々の黄昏戦役 #ランテマリオ星域会戦
— 今日は何の日@銀英伝bot (@logh_today) February 9, 2022
宇宙暦799年2月9日昼~夜 ヤン艦隊がランテマリオ星域に到着し、それと前後してランテマリオ星域会戦が終結した。#本伝5巻 #神々の黄昏戦役 #ランテマリオ星域会戦
— 今日は何の日@銀英伝bot (@logh_today) February 9, 2022