ときどきの雑記帖 RE* (新南口)
虹色の地獄
今週のしずえさん
「100万ドルの夜景」
「シールクラス」
以前ちょっと触れた sealed classの日本語表記の話。
ここ(の翻訳)も相変わらずですねえ…
Sealed Classes (シールドクラス)
キーワード permits を完全に省略して、すべてのシールドクラス定義をクラス自体と同じファイルに次のように保持することもできます:
に関連して。
早売りでゲットした WEB+DB PRESS Vol.127の「見直そう!モダンJavaの流儀」にこんな記述があるのを見つけた。
シールクラス
シールクラスは継承の制限を行うために使用されるクラスで、Java 17で導入されました。シールクラスは英語ではSealed Classです。Sealとはペタペタ貼るシールと同じで、 封印するという意味です。継承を封印されたクラスということなのでしょう。本来ならば シールドクラスと書くべきなのかもしれませんが、盾の意味のシールドと間違えやすい こともあり、シールクラスと表記されるようです。
確かに元が進行形や過去分詞だったのを原形にしてそれをカタカナ書きにしたり 日本語にしたりする(「検査例外」とか)手法はこれまでもあったわけだけど 「シール」にしたって 英単語のそれの意味がすぐに連想されるかというと (sealの意味・使い方・読み方|英辞郎 on the WEB) ちと疑問。
- シール・クラス
- シールクラス(Java15プレビュー版)メモ(Hishidama’s sealed class Java15 preview Memo)
- シールクラスで継承可能なクラスを制限する (sealed class) | まくまくKotlinノート
- Javaシールクラスメモ(Hishidama’s Java sealed class Memo)
- Java 15の新機能(1)ー「シールクラス」 – JY情報システムズ
Oracleのサイトのページでこう書かれたってことは これで確定?(やだなあ…)
新宿駅西口
秋葉原asterisk(*)α : 新宿駅西口ががらりと変わっていた件(2022/02/12)
あのビル解体されたのか。 あの辺りからよくスキーバスに乗ったなあ。
Julia本
新刊入荷しました
— 書泉_MATH (@rikoushonotana) February 14, 2022
『天才プログラマー タンメイが教えるJulia超入門』菅原宏治/訳(東京化学同人)
Julia環境の導入と構築/変数と外部入力/条件分岐と繰返し/配列と辞書/関数/エラーと例外の処理/パッケージ管理/ファイルの読み書き/機械はどのように学習するのか/次のステップと情報) pic.twitter.com/3voyAANRA6
天才プログラマー タンメイが教えるJulia超入門 - 株式会社東京化学同人
この本、Amazonで見つからんのだよねえ (そういうのもあるのは知っていたが)。
と思ったらあった。 いつの間に。
もっとも、Amazonで買おうと思っていたわけではなくて、 どんな本なのか気になってググってもAmazonのリンクは出てこなかったし さらにAmazonにアクセスして検索しても見つからなかった。ので気になっていたと。
某大型書店(書泉ではない)で見かけたので パラパラと中を見てみたけど、うーん……
Perl code that is syntactically correct only on Fridays
金曜日にだけ文法的に正しくなる(それ以外の曜日ではsyntax errorになる)Perlモジュール...らしい。https://t.co/mWYqur6tuO
— 新山祐介 (Yusuke Shinyama) (@mootastic) February 17, 2022
実は新山さんのツイートを見るよりも先にredditで見つけていたのだけど それはさておき。
- Perl code that is syntactically correct only on Fridays : programming
- jwilk/perl-friday: Perl code that is syntactically correct only on Fridays
問題のコードはどんなものかというと
perl-friday/friday.pm at master - jwilk/perl-friday · GitHub
# general idea shamelessly stolen from Randal L. Schwartz:
# https://www.perlmonks.org/index.pl?node_id=44722
use Time::Piece;
BEGIN {
*f = (localtime->wdayname eq 'Fri')
? sub() {}
: sub {};
}
f/1;#/+
こんなの。
型グロブを駆使して金曜日に実行されたかそれ以外の曜日に実行されたかで fという名前のサブルーチンの定義を微妙に変えることで、 構文エラーを起こしたり起こさなかったりすると。
冒頭のコメントにあるOn Parsing Perl を見ると解説があるのだけど、
sub() {};
sub {};
という二つの定義があったとき、前者は引数をとらないサブルーチンになり
後者は引数をとるサブルーチンになる。
Cでいうところの func(void)
と func()
の違いですね
(って「最近」変わったんだっけ?(調べない))。
で、
>cat hoge.pl.1~
sub f {
}
f/1;#/+
>perl -c hoge.pl.1~
syntax error at hoge.pl.1~ line 4, at EOF
hoge.pl.1~ had compilation errors.
>cat hoge.pl
sub f {
}
f/1;#/
>perl -c hoge.pl
hoge.pl syntax OK
サブルーチンf
が引数をとらない場合は
f/1;
とそれに続くコメント#/+
と解釈される(のでエラーにはならない)が、
引数をとる場合は /1;#/+
を正規表現リテラルと
それに後続する加算演算子とみて
エラーになる。と。
tiny/small/medium/compact/large/huge
また面白いことやってんなあ😄…と読んでみたら 色々と気になることが。
makeでエラーやら警告が出ているんだけど
$ make
make[1]: Entering directory '/home/----------/lua/lua-5.4.4/src'
/bin/sh: 1: dos: not found
Guessing
/bin/sh: 1: dos: not found
なんじゃこれ。と思ってMakefile(の差分)を確かめたら
diff --git a/src/Makefile b/src/Makefile
index 1907381..ed8375e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,9 +4,9 @@
# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
# Your platform. See PLATS for possible values.
-PLAT= guess
+PLAT= dos
-CC= gcc -std=gnu99
+CC= ia16-elf-gcc
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_3 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS)
@@ -14,13 +14,13 @@ LIBS= -lm $(SYSLIBS) $(MYLIBS)
AR= ar rcu
RANLIB= ranlib
RM= rm -f
-UNAME= uname
+UNAME= dos
SYSCFLAGS=
SYSLDFLAGS=
SYSLIBS=
-MYCFLAGS=
+MYCFLAGS= -mcmodel=medium
MYLDFLAGS=
MYLIBS=
MYOBJS=
uname(1)を指定しているところを、コマンドとして存在しないdos
って文字列にしちゃってるのね。
んで、なんでまたミディアムモデル(-mcmodel=medium
)なんかにしているんだろう?
まあ、スモールモデルにはコードが収まらなかった。くらいだろうか。
ia16-elf-gcc -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -mcmodel=medium -c -o lapi.o lapi.c
In file included from lapi.h:11:0,
from lapi.c:19:
lapi.c: In function ‘lua_topointer’:
llimits.h:123:23: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
#define cast(t, exp) ((t)(exp))
^
llimits.h:126:23: note: in expansion of macro ‘cast’
#define cast_voidp(i) cast(void *, (i))
^~~~
lapi.c:482:27: note: in expansion of macro ‘cast_voidp’
case LUA_VLCF: return cast_voidp(cast_sizet(fvalue(o)));
^~~~~~~~~~
llimits.h:134:23: note: in expansion of macro ‘cast’
#define cast_sizet(i) cast(size_t, (i))
^~~~
lapi.c:482:38: note: in expansion of macro ‘cast_sizet’
case LUA_VLCF: return cast_voidp(cast_sizet(fvalue(o)));
^~~~~~~~~~
lapi.c: In function ‘lua_getiuservalue’:
lapi.c:812:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (n <= 0 || n > uvalue(o)->nuvalue) {
^
ia16-elf-gcc -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -mcmodel=medium -c lcode.c
ia16-elf-gcc -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -mcmodel=medium -c -o lctype.o lctype.c
ia16-elf-gcc -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -mcmodel=medium -c -o ldebug.o ldebug.c
ia16-elf-gcc -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -mcmodel=medium -c -o ldo.o ldo.c
In file included from lapi.h:12:0,
from ldo.c:19:
ldo.c: In function ‘luaD_callnoyield’:
lstate.h:112:14: warning: overflow in implicit constant conversion [-Woverflow]
#define nyci (0x10000 | 1)
^
ldo.c:627:28: note: in expansion of macro ‘nyci’
ccall(L, func, nResults, nyci);
^~~~
ポインターとintegerのサイズが違っている(16ビットコンパイラーだから16ビット長だよね、たぶん)のを
放置しているのはちょっとやばそう。
そして16ビットに収まってないじゃん>#define nyci (0x10000 | 1)
何のフラグがわからないけど16ビット目を参照しているところで破綻しそう。
ltable.c: In function ‘luaH_realasize’:
ltable.c:260:19: warning: right shift count >= width of type [-Wshift-count-overflow]
size |= (size >> 16);
^~
あー。
/usr/lib/x86_64-linux-gnu/gcc/ia16-elf/6.3.0/../../../../../ia16-elf/bin/ld: /usr/lib/x86_64-linux-gnu/gcc/ia16-elf/6.3.0/../../../../../ia16-elf/lib/medium/libc.a(lib_a-signal.o): in function `_raise_r':
(.fartext.f.signal.c.34216$+0xc9): undefined reference to `_getpid_r'
/usr/lib/x86_64-linux-gnu/gcc/ia16-elf/6.3.0/../../../../../ia16-elf/bin/ld: R_386_OZSEG16 or R_386_OZRELSEG16 for symbol with no output section
/usr/lib/x86_64-linux-gnu/gcc/ia16-elf/6.3.0/../../../../../ia16-elf/bin/ld: lua.exe(.fartext.f.signal.c.34216$): relocation "_getpid_r+0x0 (type R_386_OZSEG16)" returns an unrecognized value %x
/usr/lib/x86_64-linux-gnu/gcc/ia16-elf/6.3.0/../../../../../ia16-elf/bin/ld: (.fartext.f.signal.c.34216$+0xd3): undefined reference to `_kill_r'
/usr/lib/x86_64-linux-gnu/gcc/ia16-elf/6.3.0/../../../../../ia16-elf/bin/ld: R_386_OZSEG16 or R_386_OZRELSEG16 for symbol with no output section
/usr/lib/x86_64-linux-gnu/gcc/ia16-elf/6.3.0/../../../../../ia16-elf/bin/ld: lua.exe(.fartext.f.signal.c.34216$): relocation "_kill_r+0x0 (type R_386_OZSEG16)" returns an unrecognized value %x
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:64: lua.exe] Error 1
make[3]: Leaving directory '/home/----------/lua/lua-5.4.4/src'
make[2]: *** [Makefile:144: dos] Error 2
make[2]: Leaving directory '/home/----------/lua/lua-5.4.4/src'
make[1]: *** [Makefile:99: guess] Error 2
make[1]: Leaving directory '/home/----------/lua/lua-5.4.4/src'
make: *** [Makefile:55: guess] Error 2
----------@ysgmbp01:~/lua/lua-5.4.4$
これ、signal.cで参照している_getpid_r
や_kill_r
がみつからないってことなんだけど
Luaのソースにsignal.cってないんだよねえ…。
ってよくみたらia16-elf/lib/medium/libc.a(lib_a-signal.o): in function
_raise_r’`とありますわな。
んで、そのライブラリはNewlibらしいんだけどなぜにこういう状態になってるのかはよくわからんな。
The included standard library is not GNU libc but rather Newlib, “a C library intended for use on embedded systems,” version 2.4.0 (released 2016-03-29).
- newlib/syscalls.c
- newlib/signalr.c
- newlib/reent.h
- sourceware.org Git - newlib-cygwin.git/blob - newlib/libc/signal/signal.c
まあこれ以上深追いする元気もないしこの辺でいいか😄
Hugoメモ
フロー図入れたりするのに便利そうなので。
mermaid
- Hugoでmermaidを使う | blue271828’s misc :-)
- Hugoでショートコードを使わずにmerimaidを利用する - y_megane.log
- Hugoにmermaidを組み込んでみた - Qiita
- mermaid.js で Markdown 中に UML 図を埋め込む | まくまくHugo/Goノート
- 给 Hugo 博客添加 mermaid 短代码支持 :: /dev/ttyS3 — 回首向来萧瑟处 也无荒野也无灯
- Hugo集成mermaid