ときどきの雑記帖 RE* (新南口)
暗黒からの浮上
モペット
と呼ぶのかわからないけど、 折り畳み自転車くらいの小さな車体の 電動2輪で
- 無灯火
- 二人乗り
- 逆走
- 信号無視
という「満貫」達成しているのに遭遇した。
あ、ナンバープレートもなかったな。 これも一翻だと跳満にはならないけど😄
ガンダム@テレ玉
今週は「オデッサの激戦」
そう言えば元ネタ(?)の「オデッサ」は今は呼び方変わってるんだっけ?
哀・戦士編では削られたのは
- ガイアとオルテガによるマッシュへの葬送のジャイアントバズ
- エルランの裏切り
- 水爆ミサイル
このくらい?
そう言えばオデッサに展開しているジオン軍のトップは マ・クベ「大佐」で、連邦軍はレビル「将軍」(たぶん大将)。 ジオン軍の階級はよくわからん(笑)
あとガンダム&ホワイトベースの存在が大きく戦局に影響している のも哀・戦士編との大きな違い。 哀・戦士編ではハモン隊との戦闘まで含めて 戦域の「端っこ」なのが、 TV版では最前線まで出てきている (ガンダムとGスカイ・イージーだけかもしれないけど)。
ビッグオー@テレ玉
第2クールの始まり。
スカイライダー@MX
飛ぶのは飛ぶんだけど、かなりゆっくりとなんだよねえ。 当時も結構不満に感じていた部分。
AI
開発者がAIコーディングアシスタントから得る恩恵はほとんどない? - YAMDAS現更新履歴
実際のところどうなんですかね。 全く使い物にならないってことはないだろうけど どこまでのものか。 時間が経てば能力が向上するってのもあるだろうし。
ザ・ウルトラマン@MX
そう言えばこの作品のウルトラマン(ジョーニアス)の声は デスラー総統なのだった
0
fn putc(x) ( write(0, x.add(global_get(2)), 1) )
STDINに書き込んでるよう見えますが意図されたものですか?
write等は扱いが難しいのでfwrite等の使用をお勧めします。
ありがとうございます。
恥ずかしながら、これは意図したものではありません。
というより、よくわからず動くまで色々試した結果こうなったので、私自身もなぜ動いているのかよくわかりません…
わからないまま修正するのも怖いので、何か深刻な問題が見つかるまでは現状維持の方針で考えています。
というやり取りがあったので(ry
sxcscript/main.c at main · sxclij/sxcscript
case sxcscript_kind_write:
a1 = sxcscript->mem[sxcscript->mem[sxcscript_global_sp].val - 3].val;
a2 = sxcscript->mem[sxcscript->mem[sxcscript_global_sp].val - 2].val;
a3 = sxcscript->mem[sxcscript->mem[sxcscript_global_sp].val - 1].val;
sxcscript->mem[sxcscript->mem[sxcscript_global_sp].val - 3].val = write(a1, &sxcscript->mem[a2], a3);
sxcscript->mem[sxcscript_global_sp].val -= 2;
break;
確かにwrite(3)に渡すファイルディスクリプターが0になっているっぽいなあ。 クローズやリダイレクトがなかったとして、0番に「出力」するとどうなるんだっけ?
この件とは関係ないけど
sxcscript/main.c at main · sxclij/sxcscript
void sxcscript_tokenize(const char* src, struct sxcscript_token* token) {
struct sxcscript_token* token_itr = token;
*token_itr = (struct sxcscript_token){src, 0};
for (const char* src_itr = src; *src_itr != '\0'; src_itr++) {
if (*src_itr == ' ' || *src_itr == '\n') {
if (token_itr->size != 0) {
token_itr++;
}
} else if (*src_itr == '(' || *src_itr == ')' || *src_itr == ',' || *src_itr == '.') {
if (token_itr->size != 0) {
token_itr++;
}
*(token_itr++) = (struct sxcscript_token){src_itr, 1};
} else {
if (token_itr->size == 0) {
token_itr->data = src_itr;
}
token_itr->size++;
}
}
}
タブや記号類の残りも識別子の一部にみなされてしまう?
新刊近刊
ことばの意味を計算するしくみ
講談社サイエンティフィクさん、ぼくに『ことばの意味を計算するしくみ』を献本するので、本当によかったんですか…(ありがとうございます!) pic.twitter.com/IJcjSZAZ4V
— 専門性・売上・原稿 (@golden_lucky) October 11, 2024
最高の本を買ってしまいました。カリー=ハワード対応やCoqも登場してます。哲学の話題も豊富です。
— 鈴木盲点(Le Point Aveugle) (@cut_elimination) October 11, 2024
見た感じ、自然言語の研究に論理学が貢献できることはまだいろいろありそうで、希望が持てます。 pic.twitter.com/6wwbVIQ9u8
金曜日に某大型書店で見かけてどうしようかと悩んだんだけど その場では買わなかったんだよね。 いずれ買おうとは思っているんだけど 早めに買っておいた方がよいかな
「性格が悪い」とはどういうことか
長年知りたいと思っていたことがそのままタイトルになっていたので秒で買った pic.twitter.com/cYT2qAVZSh
— 岸本佐知子 (@karyobinga) October 12, 2024
面白そうではあるけどいつ出た本だろうと調べてみたら 今年の7月か。
「性格が悪い」とはどういうことか ――ダークサイドの心理学 (ちくま新書 1806) : 小塩 真司: 本
ちくまだけのくくりではないけど、 毎月1~2冊は興味を惹かれる新書のタイトルがある。 が、全然と言っていいほど実際に手を出せていない😓
ある新しめの話題があったときにざっとでも概要を知りたいと思ったときに 重宝する本がわりと見つかるんだよねえ。 「はずれ」もそれなりだけど
awk
gawk
nondecimal
前回のこれのつづき
## 引っかかる
$ awk 'BEGIN{ FS = "," } $1 == 01202 { print $3 }' utf_ken_all.csv
## 引っかからない
$ gawk 'BEGIN{ FS = "," } $1 == 01202 { print $3 }' utf_ken_all.csv
## 引っかかる
$ awk 'BEGIN{ FS = "," } $1 == "01202" { print $3 }' utf_ken_all.csv
まず、これの三番目の awk
って gawk
とすべきところを間違えているような?
まあそれはおいといて、 スライドの別のページ(24ページ) には
$ perl -F, -nale 'BEGIN { $, =" " } print @F[2,6,7,8] if $F[0] eq "01202"' utf_ken_all.csv
というのがあるんだけど、
$F[0] eq "01202"
を
$F[0] == 01202
にすると、gawkのNGパターンと同じ動作になる。
gawkに話を戻して
何が起きているのかというと、
--lint
や--non-decimal-data
といったオプションを付けて実行するとわかりやすい。
$ echo 0123 | gawk '{print $1==0123}'
0
$ echo 0123 | gawk --lint '{print $1==0123}'
gawk: 警告: numeric constant `0123' treated as octal
0
$ echo 0123 | gawk --lint --non-decimal-data '{print $1==0123}'
gawk: 警告: numeric constant `0123' treated as octal
1
$ echo 0123 | gawk '{print $1}'
0123
$ echo 0123 | gawk '{print $1+0}'
123
$ echo 0123 | gawk --non-decimal-data '{print $1}'
0123
$ echo 0123 | gawk --non-decimal-data '{print $1+0}'
83
つまり、0始まりの数値リテラルが8進数と解釈されたのに対して、
入力データはそうではなかったので一致しなかった。ということ、
--non-decimal-data
オプションを付けると入力データについても
同じように解釈されるので一致するようになる(はず)、
んで、この数値リテラルの扱いはgawKの拡張(なので他のawkでは大丈夫だった)
6.1.1.2 Octal and Hexadecimal Numbers
gawk allows the use of octal and hexadecimal constants in your program text. However, such numbers in the input data are not treated differently; doing so by default would break old programs. (If you really need to do this, use the –non-decimal-data command-line option; see Allowing Nondecimal Input Data.) If you have octal or hexadecimal data, you can use the strtonum() function (see String-Manipulation Functions) to convert the data into a number. Most of the time, you will want to use octal or hexadecimal constants when working with the built-in bit-manipulation functions; see Bit-Manipulation Functions for more information.
Octal and hexadecimal source code constants are a gawk extension. If gawk is in compatibility mode (see Command-Line Options), they are not available.
RE_INTERVAL
もうひとつgawkネタ。バランスの取れていない{
がエラーにならない件。
gawk 3.1.5/regex.h
#define RE_SYNTAX_AWK \
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
| RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
| RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
#define RE_SYNTAX_GNU_AWK \
((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
& ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS \
| RE_CONTEXT_INVALID_OPS ))
#define RE_SYNTAX_POSIX_AWK \
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
| RE_INTERVALS | RE_NO_GNU_OPS)
RE_INTERVALS
というのがGNUのregex関数で{n,m}
(とそのバリエーション)を
有効にするフラグなんだけど、見ての通りgawk(3.1.5)では
そのビットを落としている。そして
re.c
void
resetup()
{
if (do_posix)
syn = RE_SYNTAX_POSIX_AWK; /* strict POSIX re's */
else if (do_traditional)
syn = RE_SYNTAX_AWK; /* traditional Unix awk re's */
else
syn = RE_SYNTAX_GNU_AWK; /* POSIX re's + GNU ops */
/*
* Interval expressions are off by default, since it's likely to
* break too many old programs to have them on.
*/
if (do_intervals)
syn |= RE_INTERVALS;
(void) re_set_syntax(syn);
dfasyntax(syn, FALSE, '\n');
}
コマンドラインオプションで{n,m}
が有効にするように
指定された場合にはRE_INTERVALS
ビットを立てている。
RE_INTERVALS
が経っていないときは{
や}
は「ふつー」の文字になるので、
そりゃあバランスが崩れていてもエラーにはなりませんよね。と。
現在(5.3.1)でもほぼ同じだけど(ただしRE_INTERVALはデフォルトで有効)、 いろいろ細かい違いはある
maybe_long
さらにもうひとつgawkネタ。
最近のコミットを眺めていたらこんなのがあった
Add a speedup when a regex match occurs at the end of a buffer. - gawk.git - gawk
diff --git a/re.c b/re.c
index 1e1ab34c..bfd8d02b 100644
--- a/re.c
+++ b/re.c
@@ -333,7 +333,7 @@ make_regexp(const char *s, size_t len, bool ignorecase, bool dfa, bool canfatal)
}
for (i = len - 1; i >= 0; i--) {
- if (strchr("*+|?{}", buf[i]) != NULL) {
+ if (strchr("\\*+|?{}", buf[i]) != NULL) {
rp->maybe_long = true;
break;
}
maybe_long
というフラグ変数(メンバー)が気になったので
ざっと調べてみると
awk.h:194: bool maybe_long; /* re has meta chars that can match long text */
ChangeLog.1:8154: * awk.h (Regexp): New members has_meta and maybe_long.
ChangeLog.1:8163: (rsrescan): Simplify code a bit and use RS->maybe_long.
io.c:3739: * The re->maybe_long member is true if the
io.c:3747: if (RSre->maybe_long) {
re.c:337: rp->maybe_long = true;
2012-04-24 Arnold D. Robbins
* awk.h (Regexp): New members has_meta and maybe_long.
結構前に追加されたものだった。気がつかなった。 で、それを参照しているところでなにをしているかというと
io.c
/* rsrescan --- search for a regex match in the buffer */
static RECVALUE
rsrescan(IOBUF *iop, struct recmatch *recm, SCANSTATE *state)
{
この関数の中で、読み込んだ入力のチャンクからRS(にマッチする部分)を 見つけ出すときに使っていた。 まあ確かにRSが繰り返しを含むパターンだったときに 入力チャンクの末尾にマッチしたとしたら 次のチャンクも見ないといけないとかあるよなあ
Fix undefined behaviour
GNUつながりでcoreutilsのコミットから
iconv_open: Fix undefined behaviour. - gnulib.git - gnulib - GNU portability library
diff --git a/lib/iconv.c b/lib/iconv.c
index 310f4043eb..f7a67798fb 100644
--- a/lib/iconv.c
+++ b/lib/iconv.c
@@ -195,7 +195,10 @@ utf32be_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
{
if (n >= 4)
{
- ucs4_t wc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
+ ucs4_t wc = ((ucs4_t) s[0] << 24)
+ + ((ucs4_t) s[1] << 16)
+ + ((ucs4_t) s[2] << 8)
+ + (ucs4_t) s[3];
if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
{
*pwc = wc;
@@ -237,7 +240,10 @@ utf32le_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
{
if (n >= 4)
{
- ucs4_t wc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24);
+ ucs4_t wc = (ucs4_t) s[0]
+ + ((ucs4_t) s[1] << 8)
+ + ((ucs4_t) s[2] << 16)
+ + ((ucs4_t) s[3] << 24);
if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
{
*pwc = wc;
実際のところ、beの場合のs[0]やleの場合のs[3]の最上位ビットが立つことはないと思うけど そんなのコンパイラーは知る由もないからなあ
FORTRAN Compiler on IBM 704
コメント部分をメインに眺めていると
35
CLA SCRIPL+1,A 4F15217
LBT EXAMINE OP3(S(I))35 4F15218
TRA CP2300 2ND ARG STORED 4F15219
CP2250 TSX CIT00,C 2ND ARG IN MQ 4F15220
---
CLA SCRIPL+1,A 4F15282
LBT EXAMINE OP2(S(I))35 4F15283
TRA CP2900 0... ARG STORED 4F15284
ARS 1 1... ARG NOT STORED 4F15285
---
CLA SCRIPL+1,A CLOSED UNIVARIATE FUNCTION 4F15310
LBT EXAMINE OP2(S(I))35 4F15311
TRA CP3280 0... ARG STORED 4F15312
CP3100 CLA L(SXD) 1... ARG IN ACC 4F15313
---
CLA SCRIPL+1,A CLOSED BIVARIATE FUNCTION 4F15338
LBT EXAMINE OP2(S(I))35 4F15339
TRA CP3450 0... ARG1 STORED 4F15340
CP3390 CLA L(LDQ) 1... ARG1 IN ACC 4F15341
---
CP3450 CLA SCRIPL+4,A 4F15347
LBT EXAMINE OP3(S(I))35 4F15348
TRA CP3490 0... ARG2 STORED 4F15349
TRA CP3280 1... ARG2 IN MQ 4F15350
---
CP3560 CLA SCRIPL+1,A CLOSED MULTIVARIATE FUNCTION 4F15357
LBT EXAMINE OP2(S(I))35 4F15358
TXI CP3820,A,-6 0... ARG1 STORED 4F15359
TXI CP3600,A,-6 1... ARG1 IN ACC 4F15360
---
CP3820 CLA SCRIPL-2,A 4F15383
LBT EXAMINE OP3(S(I))35 4F15384
TXI CP4070,A,6 0... ARG2 STORED 4F15385
CLA DECMI2 1... ARG2 IN MQ 4F15386
CLA SCRIPL+4,A 4F15487
LBT EXAMINE OP2(S(I))35 4F15488
TXI CP4440,0,0 0...EXP STORED 4F15489
TXI CP4490,A,-3 1... EXP IN MQ 4F15490
OPワードのビット35は引数がメモリーにあるか レジスターにあるかを判別するのに使われているようだ
最後のラベルCP3820
の部分、
CLA SCRIPL-2,A
の直後が
EXAMINE OP3(S(I))35
で
CLA SCRIPL+4,A
の直後が
EXAMINE OP2(S(I))35
なので混乱したけど
間のTXI CP4070,A,6
で
インデックスレジスター Aの値が変わっているからか。
とするとこんな感じか
TXI前 | S(I) | TXI後 |
---|---|---|
SCRIPL-5 | OP2 | SCRIPL+4 |
SCRIPL-4 | SCRIPL+5 | |
SCRIPL-3 | SCRIPL+6 | |
SCRIPL-2 | OP3 | SCRIPL+7 |
SCRIPL-1 | SCRIPL+8 |
ロードした直後ではないところで 判定しているケースもあるけど
LGL 2 EXAMINE OP1(S(I))35 4F15422
TQP CP4310 0... BASE STORED 4F15423
LDQ ADSTAR 1... BASE NOT STORED 4F15424
LBT EXAMINE OP1(S(I))35 4F15441
TRA CP4860 0... BASE STORED 4F15442
CP4440 CLA L(LDQ) 1... BASE IN ACC. 4F15443
CP0250 SXD 3QBAR,A 4F15029
LDQ SCRIPL+1,A EXAMINE OP1 (S(I)) 29,30,31,32 4F15030
SCRIPL+4,A
がOP2だったんで
SCRIPL+1,A
はOP1と。
他のビットも
34
LBT EXAMINE OP1(S(I))34 4F15425
LDQ ADPLUS 0... BASE IN ACC 4F15426
STQ CW+2 1...BASE IN MQ 4F15427
これは引数の場所がアキュムレーターかMQレジスターかの判定っぽい
33
CP2650 LGL 20 TEST OPI(S(I))33 4F15270
TQP CP3060 0... LIB. SBRTN 4F15271
CLS CW 1... OPEN SBRTN 4F15272
これは呼び出す関数(サブルーチン)が ライブラリにあるものを呼び出すものか インライン展開(オープンサブルーチン)するものか。かな
32
CLA SCRIPL+1,A 4F15457
ARS 3 4F15458
LBT EXAMINE OP2(S(I))32 4F15459
TXI CP4660,A,3 0... 4F15460
CLA FLFL 1... FLO**FLO 4F15461
LDQ SCRIPL-2,A EXAMINE OP1(S(I))32 TO CHECK 4F15462
RQL 32 FOR MIXED EXPONENTIAL EXPRESSION 4F15463
TQP MC0310+2 ERROR FIX PT BASE, FLOAT EXP. 4F15464
TRA CP4730 4F15465
*'**'
CP4660 LDQ SCRIPL+1,A 4F15466
RQL 32 EXAMINE OP1(S(I))32 4F15467
CLA FXFX 4F15468
TQP CP4730 0...FX**FX 4F15469
CLA FLFX 1... FL**FX 4F15470
CP4730 STO CW+2 4F15471
STO G 4F15472
TSX COMP,B COMPILE TSX FXFX/FLEX/FLFL,4 4F15473
これはべき乗の引数の組み合わせが
- 整数**整数
- 実数**整数
- 実数**実数
のどれなのかを判定。かな。 整数**実数は許されてなかったのだっけ?
ところで最後の行のコメントの
COMPILE TSX FXFX/FLEX/FLFL,4
の
FLEX
はFLFX
の間違いじゃないかと思うんだけど、
元のスキャン画像を見ても
御認識じゃなくて本当にFLEX
のようにしか見えないんだよねえ…
パンチミス?
Hugo メモ
Rust
メモリ安全性の確保をソースレベルですることの効果に関する新しいpostです。Android では新しいコードをRustで書くことでメモリ脆弱性がなんと 76% から 24% に減った。新しいコードだけの移行でなぜここまで効果が出るのか?コードの脆弱性には半減期があるという観測https://t.co/1tGLHHcx37
— Kinuko Yasuda (@kinu) September 28, 2024
メモリ脆弱性の件数がxxx件からyyy件に減った。 じゃなくて、「76%から24%に減った」 というのがよくわからないのだけど
Google Online Security Blog: Eliminating Memory Safety Vulnerabilities at the Source
元記事もそう書かれてるんだよね。
Cコンパイラー
実用的なCコンパイラーを新しく作る場合ってどの部分が一番困難なのかな。GCCのようにターゲットアーキテクチャが多いと単純に作業量が多いけど、技術的な困難とは違うかもしれない。自動ベクトル化のような高度な最適化は素人目でも困難そうだが
— mod_poppo (@mod_poppo) October 7, 2024
「ひねりを加えた」もの、かつ「技術的な困難」ではないけど (glibcなどを使うのではない) 自前の標準ライブラリ。と考えたら
Cコンパイラ、コア言語は割とシンプルだが言われているようなSIMDを含む高速化、libc実装(ターゲットアーキテクチャに関する深い理解が必要)、”世の中の標準Cを逸脱したC言語コードのサポート”(GNU拡張他)あたりをサポート出来ないと実用的と言ってもらえない気がしている https://t.co/Va1gWTsZhg
— arkhe (@arkhe634) October 7, 2024
同じような考えの人がいた😄
リダイレクト
On Linux, I/O redirection is an important shell feature that allows input and output streams (stdin, stdout, stderr) to be redirected to or from files, devices, or other commands. Here are useful examples of I/O redirection on #Linux 😎👇#sysadmin #devops pic.twitter.com/qInunkbonC
— Dan Nanni (@xmodulo) October 6, 2024
この表にはない<>
の使い道がよくわからんのだよねえ
Open File Descriptors for Reading and Writing
The redirection operator:
[n]<>word
shall cause the file whose name is the expansion of word to be opened for both reading and writing on the file descriptor denoted by n, or standard input if n is not specified. If the file does not exist, it shall be created.
変換
せっかく導入したATOKだが、顔料のことを「顔良」にしたがる癖がどうしても直らない。記事書いてるときくらい文醜とふたりでどっか飯でも食いに出かけてほしい。
— bantowblog (@bantowblog) October 9, 2024
祠
祠損壊!高橋君 pic.twitter.com/nL6L8NN4yj
— モハラン (@programsamisii) October 11, 2024
地上空母
Coming soon… pic.twitter.com/vYeIEELupa
— MODEL ART (@ModelArtInc) October 11, 2024
1/2000スケールの地上空母ってどのくらいの大きさになるんだろう?