ときどきの雑記帖 RE* (新南口)
やっぱり猫が好き
解体キングダム
タワークレーン回ということで楽しみにしているのだけど
10月4日放送の「解体キングダム」は諸事情により延期いたします。
次回の放送は、10月11日になります。
なんですと。
キングダム
キングダムと言えばいつものJR東の車内ニュースで 中文タイトルが出てきて へー、と思ったのだけど どういうタイトルだったか忘れた (いつもならメモしていたんだけど)😓
坂
この日は雪谷大塚でなかなかの激坂を見つけた。急すぎて車両通行止めになったらしい無名の坂。 登ってみたいという欲求に駆られたが、脚が売り切れそうなので遠慮した。日を改めて再訪しよう。
たぶんあそこだ。
しばらくあの辺りには行ってないので 細かいところまでは覚えていないけど やたらときつい坂があったのはよく覚えている。
簿記
ちょっとした用事があって平日の午前中に家にいたときに、 Eテレをみていたら 情報I | 高校講座 という番組があるのを知った。 前回放送の「第10回 情報デザイン」てのは観たかったな。 今回の放送の内容はというと…
ところでこの情報Iの次の次の番組が 簿記 | 高校講座 で、え、今の高校生は商業高校でなくても簿記やるの? とびっくりしたのだけど、 そうではないらしい。
Rust
日経ソフトウエアで特集されててびっくり(本日2度目)。 実は今回は前後編の後編で、 前号にも特集記事があったらしい (気がつかなかった)。
GoやScala、Kotolinなんかは特集という形で 取り上げられたことはなかったように記憶しているので (間違っている可能性あり)、 注目度が違うのかねえ と思ったり。
ナンバープレート
とあるところに駐車しているクルマのナンバープレートに アルファベットがあるのに気がついて なんだこれは? と思ったのだけど少し前から3桁の分類番号の 最下位桁に使われるようになっていたらしい。
ナンバーに「31A」や「30H」などアルファベットが入っているのはなぜ?【くるま問答】
え
- Richard Stallman reveals he has cancer in the GNU 40 Hacker Meeting talk | Hacker News
- rms-gnu40.webm
リチャード・ストールマンが癌を患っているそうだ。本人がGNU 40周年の会合で語ってる https://t.co/qIh4dF48Yl
— Shuji Sado (佐渡 秀治) コロナで背骨を骨折ニキ (@shujisado) September 29, 2023
動画で見たストールマンに驚いた(本日3回目)
awk
semicolon
と書き出すと長くなりそうなので詳しくは次回(以降)!
あと、ざっと見たところでは別に2個の並びを特別扱いしているのではなく 文法上2個以上の並びを受け入れるような定義に なってんじゃないかな。これ。
と前回書きましたが、記事の本文を読むと ko1nksm氏は「2個以上」と正しく認識していますね。 たぶん斎藤さんがメールのタイトルに引きずられて「2個」 が強調されちゃったのかな。
- 問 awk をワンライナーで書く時のアクション区切りの「;」の数は0個? 1個? 2個? + こぼれ話 - Qiita
- [B!] 問 awk をワンライナーで書く時のアクション区切りの「;」の数は0個? 1個? 2個? + こぼれ話 - Qiita
まずはgawkのマニュアルから。 以前は少し違った記述だったような気がしたのだけど 過去のバージョンのものをみてみたら どうも自分の記憶違いであったらしい。
@quotation NOTE
The requirement that states that rules on the same line must be separated with a semicolon was not in the original @command{awk} language; it was added for consistency with the treatment of statements within an action.
@end quotation
手元にあった大昔のバージョンでの結果。
>gawk --ver
GNU Awk 3.1.6(Jan 13 2009)
Copyright (C) 1989, 1991-2007 Free Software Foundation.
本プログラムはフリー・ソフトウエアです。Free Software Foundation 公表の
GNU General Public License(バージョン2、または、これ以後のバージョン)
に従い再配布、及び/または、変更を加えることができます。
本プログラムは、利用価値があることを期待して配布されていますが、
これは、特定目的に使用可能であること、及び、商用目的に使用できる
ことを暗示するものではなく、いかなる保証も一切ありません。
詳しくは、GNU General Public License を参照してください。
本プログラムには、GNU General Public License が添付されているはずです。
もし、本プログラムと一緒に GNU General Public License を入手しなかった
場合には、
http://www.gnu.org/licenses/ にアクセスしてください。
>echo hello | gawk "BEGIN {print \"start\"} /./{print} END{print \"end\"}"
start
hello
end
>echo hello | gawk "BEGIN {print \"start\"} /./{print} ; END{print \"end\"}"
start
hello
end
>echo hello | gawk "BEGIN {print \"start\"} /./{print} ;; END{print \"end\"}"
gawk: 各ルールにはパターンまたはアクション部が必須です。
>echo hello | gawk "BEGIN {print \"start\"} /./ END{print \"end\"}"
gawk: BEGIN {print "start"} /./ END{print "end"}
gawk: ^ syntax error
エラーメッセージから判断すると、
;;
の間に(構文上許されない)空のルール(パターンとアクションの組(いずれかを省略可能))
があるとみなしているようですね。
みんな大好きyacc(bison)用の定義ではこう。
program:
| program rule
略
rule:
| pattern action
{ $$ = node($1, Node_rule_node, $2); yyerrok; }
| action
{ $$ = node((NODE *) NULL, Node_rule_node, $1); yyerrok; }
| pattern statement_term
略
action
: l_brace statements r_brace opt_semi opt_nls
{ $$ = $2; }
| l_brace r_brace opt_semi opt_nls
{ $$ = NULL; }
;
略
opt_semi
: /* empty */
{ $$ = NULL; }
| semi
;
semi
: ';' { yyerrok; }
;
たしかに終端のセミコロンは高々ひとつ。となってますな。
で、POSIX的にはどうなのかというと
新しい方 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html で
item_list : /* empty */
| item_list item terminator
;
terminator : terminator NEWLINE
| ';'
| NEWLINE
;
こうなっているものが以前の https://pubs.opengroup.org/onlinepubs/7908799/xcu/awk.html では
item_list : newline_opt
| actionless_item_list item terminator
| item_list item terminator
| item_list action terminator
;
terminator : terminator ';'
| terminator NEWLINE
| ';'
| NEWLINE
;
となっていて、この定義だとタミさん(terminator)は二つと言わず いくらでも繋げられますな。
One True awkはどうかというと
awk/awkgram.y at master · onetrueawk/awk
pst:
NL | ';' | pst NL | pst ';'
;
以前のPOSIXのものと同じ。
で、メーリングリストの投稿をちょっと追いかけてみた。 gawkのメーリングリストに投稿されたものは 先の記事にあるものも含めて以下の通り
- [bug-gawk] use of ;; as terminator, request for grammar help
- Re: [bug-gawk] use of ;; as terminator, request for grammar help
- Re: [bug-gawk] use of ;; as terminator, request for grammar help
- Re: [bug-gawk] use of ;; as terminator, request for grammar help
そして発端となった(?) Austin Groupでのやりとり
0000226: Questions on awk grammar - Austin Group Defect Tracker
[bug-gawk] use of ;; as terminator, request for grammar help
Remember, the grammar specified inPOSIX states:
terminator : terminator ';' | terminator NEWLINE | ';' | NEWLINE ;
which allows two ‘;’ in a row, and nothing else in the normative text mentions that an empty statement must be rejected.
定義の問題にきちんと言及してますね。
- Based on existing implementations, there is consensus that the POSIX grammar is overly restrictive, and that we should change it to permit:
awk '{print} {print}'
and:
awk '/foo/; {print}'
後者の方を把握するのにちょっと手間取ったけど、 (古い)POSIXの構文定義だと確かに構文エラーになる(はず)。
Re: [bug-gawk] use of ;; as terminator, request for grammar help
こう変更すれば…という話。
Re: [bug-gawk] use of ;; as terminator, request for grammar help
Arnold登場。
Re: [bug-gawk] use of ;; as terminator, request for grammar help
満を持して(?)カーニハン大先生降臨。
Should multiple semicolons should be legal between pattern-action statements? They are legal in my current version of Awk, but it’s entirely an artifact of implementation; I’m pretty sure that Al and Peter and I would never have written an Awk program to use that flexibility. And it seems unlikely that typical Awk programmers would write code that way either; one semicolon seems like just the right number.
The FIXES note from 1988 makes it clear that we were very uneasy about allowing an optional separator at the time; if I were faced with the same decision today, I would require a single semicolon.
ここではtermintor
ではなくseparator
になってますね。
じゃあ古のawkでどうだったのか v7unix/v7/usr/src/cmd/awk/awk.g.y at master · v7unix/v7unix をみると
pa_stats:
pa_stats pa_stat st { PUTS("pa_stats pa_stat"); $$ = linkum($1, $2); }
| { PUTS("null pa_stat"); $$ = nullstat; }
| pa_stats pa_stat {PUTS("pa_stats pa_stat"); $$ = linkum($1, $2); }
;
ルールの間にセミコロンがなくてもエラーにならなかったり
awk '/foo/; {print}'
がエラーになるのもここが原因(たぶん)。
複数のセミコロンに関しては
st:
NL
| ';'
;
とここでは「無限増殖」しないようになっているなあ。 1988年の変更がされる前のnawkも確かめたいところだけど どこかにあるんだろうか?
ついでに 元記事の
# One True Awk(BSD 系 OS や macOS)の場合は動作する
# 「1」は「1{print}」の省略形
echo foo | awk '1 END{print "end"}'
foo
end
# GNU awk の場合のエラー
gawk: cmd. line:1: 1 END{print "end"}
gawk: cmd. line:1: ^ syntax error
も定義を確かめてみたけど (ただしOTAとgawkだけ)、 確かにそうなるなあというものだった。 というかOTA(古いものも含めて)の yacc記述が他ではあまり見ないような スタイルに思えるもので その辺に今回の諸々の原因があったんじゃないかなあ という気もする。
余裕があったら改めてそのことについて書くかもしれない😄
数値変換
前回の続きというか補足。
one true awkの場合
lib.c
/* strtod is supposed to be a proper test of what's a valid number */
/* appears to be broken in gcc on linux: thinks 0x123 is a valid FP number */
/* wrong: violates 4.10.1.4 of ansi C standard */
#include <math.h>
int is_number(const char *s)
{
double r;
char *ep;
errno = 0;
r = strtod(s, &ep);
if (ep == s || r == HUGE_VAL || errno == ERANGE)
return 0;
while (*ep == ' ' || *ep == '\t' || *ep == '\n')
ep++;
if (*ep == '\0')
return 1;
else
return 0;
}
という、変換対象の文字列に余計なものがついていないかをチェックする関数があるのだけど
Awkfloat getfval(Cell *vp) /* get float val of a Cell */
{
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "read value of");
if (isfld(vp) && donefld == 0)
fldbld();
else if (isrec(vp) && donerec == 0)
recbld();
if (!isnum(vp)) { /* not a number */
vp->fval = atof(vp->sval); /* best guess */
if (is_number(vp->sval) && !(vp->tval&CON))
vp->tval |= NUM; /* make NUM only sparingly */
}
dprintf( ("getfval %p: %s = %g, t=%o\n", vp, NN(vp->nval), vp->fval, vp->tval) );
return(vp->fval);
}
その判定結果によってエラーになることはないし、 結果そのものがユーザーの知るところになることもないのでした(たぶん)
他の言語では
ruby
>ruby -e "puts '123e'.to_f"
123.0
>ruby -e "puts '123e3wow'.to_f"
123000.0
>ruby -e "puts '123e3wow'.to_i"
123
python
>>> int("123x")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123x'
>>> float("123e3")
123000.0
>>> float("123e3wow")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: '123e3wow'
PHP
true
自分は最初-1
に馴染んだところで
Cに入門してそこで1がtrue
(いろいろ省略しているけど賢察を乞う)
というのに遭遇して(ry
Why True is -1 and not 1? : vba
昔は FALSE が 0 としか取り決めがなかったためですね。プログラム的な解釈だと 0b00000000 は全ての bit 反転すると 0b11111111 になるので、10進数で -1 になります。人間的な解釈だと 0 か 1 かになります。混乱が起きたためか、その後の言語で true は 1 として定義されました。…という経緯です。
— 内藤 時浩 (@NAITOTokihiro) September 28, 2023
ゼロフラグが立っていたらジャンプとか染みこんでいると、Cでtrueがゼロじゃないのがキモいです。
— Shoichi Ito (@kopene) September 28, 2023
そう言えば真偽値とビットパターンっていつ頃からの話なんだろう? true/falseの初出って 例によって(謎)ALGOLなんだろうか。
正誤表
紙本が入手困難になっている『型システム入門』、主に正誤情報があった非公式サポートページも今月に入って閲覧不能状態でご心配おかけしてましたが、こちらは訳者陣と協力して必須と思われる部分のみGitHubベースで復活させました! 引き続きproofcafeでホストいただいてます https://t.co/RIWuWxjyid
— 専門性・売上・原稿 (@golden_lucky) September 28, 2023
Lisp
The Lisp Badge LE is a self-contained low-power computer with its own display and keyboard that you can program in Lisp: https://t.co/hbGQfyME1a pic.twitter.com/R6yk6HhhF0
— Technoblogy (@technoblogy) September 27, 2023
ゼッケン
君のゼッケン、Excelで作ってるよね? pic.twitter.com/mj5CbX07Vr
— 筒井.xls@エクセル関数擬人化本著者 (@Tsutsui0524) September 28, 2023
冬のマラソン中継なんかでは 「ナンバーカード」とかいう(ぴー)な 呼び方に変わって久しいけど 学校ではまだゼッケン呼びなんだろうか
円谷アワー
「本物とミニチュアの区別がつかない」といえば「怪奇大作戦」
— 津久田重吾 (@rockpeek) September 28, 2023
放映時、ロケ地となった寺には檀家からの電話が殺到したとか。
>RP pic.twitter.com/noim7RVGi4
復活してくれないかなあ。MXの円谷アワー。
Rudy Rucker
While we're at it, here's some Japanese covers, for Soft, Wet, and Freeware, also for Hollow Earth. Please remind me again of this wonderful artist's name. Also I'll throw in a link for the Wares. https://t.co/tVAC0BUqMq pic.twitter.com/01dZdmK1KI
— Rudy Rucker (@rudytheelder) September 28, 2023
Twitter(とかつて呼ばれていたなにか)やってたんだ。 これを機会にSF文庫のラッカーの本を復刊してもらえないすかねえ。 読もう(読み返そう)と思ったら 手元からはなくなっていて 絶版状態で 図書館にもない ときて以下略な状態
ビジネス用語
若手の社会人へ🙏
— サキ@外資IT女戦士 (@saki_itsales) September 28, 2023
これらの言葉はオジサン用語ではなく、脈々と引き継がれているビジネス用語なので、知らない方が恥です。使えると社会人力が上がりますので使っていきましょう😇
22世紀まで伝えてねw
一丁目一番地、寝技、エイヤ、座組み、ポンチ絵、よしなに、仁義を切る、鉛筆なめる、空中戦、etc
そう言えば今週、某社で入社以来初めて 「鉛筆なめなめ」 を聞いて、 今でも使う人いたのかと(ry