L3キャッシュエラーが出た

たまたまdmesgを見てたら、L3キャッシュのエラーが10分おきくらいで出てた。 そんなのどうやって検出してるんだろうか? お高いメモリみたいにECCとかなんとかついてる物なのか?

[ 2298.847337] mce: [Hardware Error]: Machine check events logged
[ 2298.847351] [Hardware Error]: Corrected error, no action required.
[ 2298.847365] [Hardware Error]: CPU:0 (19:44:1) MC15_STATUS[Over|CE|MiscV|AddrV|-|-|SyndV|CECC|-|-|-]: 0xdc204000000c011b
[ 2298.847405] [Hardware Error]: Error Addr: 0x00000001f7cea280
[ 2298.847412] [Hardware Error]: IPID: 0x0000009600050f00, Syndrome: 0x000001ff0a240701
[ 2298.847424] [Hardware Error]: Unified Memory Controller Ext. Error Code: 12
[ 2298.847428] [Hardware Error]: cache level: L3/GEN, tx: GEN, mem-tx: RD

ポケットチェンジ退職

2025年3月で株式会社ポケットチェンジを退職しました。理由はお察し下さい。

6年半の在籍中、前半は電子マネーの入金筐体を開発したり設置で出張したり、後半は電子マネーのサーバーサイドを開発してた。 少人数でWebサービス開発してた都合上React書く場面も多々あったが、人がそろってきた最後数年はCommon Lispを100%書けて非常にいい経験ができた。

次の会社では再びHPC関連ソフト開発をやる予定(10年ぶり2回目)

C-Meraを使ってみる

Cライクな言語でLispマクロを使えるC-Meraを使ってみる。 GitHub - kiselgra/c-mera: Next-level syntax for C-like languages :)

インストールしてみたがうまく動かない

c-meraにrosスクリプトがあるので、とりあえずroswellからインストールしてみる。 対象のバージョンはこれ https://github.com/kiselgra/c-mera/commit/7a39cda824563e02ab8a0ee1b7a8df5f08c17d28

ros install kiselgra/c-mera

コマンド実行してみる。

cm c++
Unhandled undefined-function in thread #<sb-thread:thread tid=18979 "main thread" running
                                          {10015E81D3}>:
  The function cm-c++::c++-processor is undefined.

Backtrace for: #<SB-THREAD:THREAD tid=18979 "main thread" RUNNING {10015E81D3}>
0: ("undefined function" NIL)
1: (ROS.SCRIPT.CM.3700387292::MAIN #<unavailable &REST argument>)
2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (APPLY (QUOTE ROS.SCRIPT.CM.3700387292::MAIN) ROSWELL:*ARGV*) #<NULL-LEXENV>)
3: (SB-INT:SIMPLE-EVAL-IN-LEXENV (ROSWELL:QUIT (APPLY (QUOTE ROS.SCRIPT.CM.3700387292::MAIN) ROSWELL:*ARGV*)) #<NULL-LEXENV>)
4: (SB-EXT:EVAL-TLF (ROSWELL:QUIT (APPLY (QUOTE ROS.SCRIPT.CM.3700387292::MAIN) ROSWELL:*ARGV*)) NIL NIL)
5: ((LABELS SB-FASL::EVAL-FORM :IN SB-INT:LOAD-AS-SOURCE) (ROSWELL:QUIT (APPLY (QUOTE ROS.SCRIPT.CM.3700387292::MAIN) ROSWELL:*ARGV*)) NIL)
6: (SB-INT:LOAD-AS-SOURCE #<CONCATENATED-STREAM :STREAMS NIL {10000347B3}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading")
7: ((LABELS SB-FASL::LOAD-STREAM-1 :IN LOAD) #<CONCATENATED-STREAM :STREAMS NIL {10000347B3}> NIL)
8: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<FUNCTION (LABELS SB-FASL::LOAD-STREAM-1 :IN LOAD) {7428527FF5DB}> #<CONCATENATED-STREAM :STREAMS NIL {10000347B3}> NIL #<CONCATENATED-STREAM :STREAMS NIL {10000347B3}>)
9: (LOAD #<CONCATENATED-STREAM :STREAMS NIL {10000347B3}> :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST :ERROR :EXTERNAL-FORMAT :DEFAULT)
10: ((FLET ROSWELL::BODY :IN ROSWELL:SCRIPT) #<SB-SYS:FD-STREAM for "file /home/gos-k/.roswell/bin/cm" {1000033603}>)
11: (ROSWELL:SCRIPT "/home/gos-k/.roswell/bin/cm" "c++")
12: (ROSWELL:RUN ((:EVAL "(ros:quicklisp)") (:SCRIPT "/home/gos-k/.roswell/bin/cm" "c++") (:QUIT NIL)))
13: (SB-INT:SIMPLE-EVAL-IN-LEXENV (ROSWELL:RUN (QUOTE ((:EVAL "(ros:quicklisp)") (:SCRIPT "/home/gos-k/.roswell/bin/cm" "c++") (:QUIT NIL)))) #<NULL-LEXENV>)
14: (EVAL (ROSWELL:RUN (QUOTE ((:EVAL "(ros:quicklisp)") (:SCRIPT "/home/gos-k/.roswell/bin/cm" "c++") (:QUIT NIL)))))
15: (SB-IMPL::PROCESS-EVAL/LOAD-OPTIONS ((:EVAL . "(progn #-ros.init(cl:load \"/home/gos-k/.local/etc/roswell/init.lisp\"))") (:EVAL . "(ros:run '((:eval\"(ros:quicklisp)\")(:script \"/home/gos-k/.roswell/bin/cm\"\"c++\")(:quit ())))")))
16: (SB-IMPL::TOPLEVEL-INIT)
17: ((FLET SB-UNIX::BODY :IN SB-IMPL::START-LISP))
18: ((FLET "WITHOUT-INTERRUPTS-BODY-3" :IN SB-IMPL::START-LISP))
19: (SB-IMPL::%START-LISP)

unhandled condition in --disable-debugger mode, quitting

動かなかった。 これパッケージ名が cm-c++ だけど関数名は cxx-processor だからrosスクリプトの呼び出しがあってない。

ということで直したのがこれ Fix ros script processor name · gos-k/c-mera@a38bfe0 · GitHub

使ってみる

READMEには cm c++ 入力ファイル で動くと書いてあるが動かない。 parse-cmdlinenet.didierverna.clon:remainder がそれを想定してそうだがとれてない。 あとこれなんでマクロで書いてるんだろ?

入力ファイルを -i で指定すると動く。

cm c++ -i tests/cxx.class.00.lisp
#include <iostream>

class A
{
private:

...略...

    delete fb1;
    bar *fb2 =  = new bar();
    delete fb2;
    return 0;
}

とりあえずコード生成できるところまで確認できた。

FlutterのUUID v4が衝突する問題

FlutterでUUID v4が衝突するという問題に遭遇したので調べた。

UUID生成はこのパッケージが一般的。書いている時点ではバージョン4.4.0

uuid | Dart package

このパッケージはいくつかの乱数生成方法があるが、READMEにある通りにやると、MathRNGが使われる。

dart-uuid/lib/rng.dart at main · daegalus/dart-uuid · GitHub

MathRNGのコードを見ると、Dartの標準ライブラリMath.Randomが使われている。

sdk/sdk/lib/math/random.dart at main · dart-lang/sdk · GitHub

3.5.0時点でのRandomの実際の実装はおそらくこれ。

sdk/runtime/vm/random.cc at main · dart-lang/sdk · GitHub

multiply with caryという32ビット周期のアルゴリズム、らしい。

それなりに使われてる言語の標準ライブラリはmersenne twisterかそれより何かいいやつなんだろうと勝手に思っていたが、現在でもそうじゃないのあるのか。os側の乱数生成器を使うオプションとか用意してるから気にしてない?

乱数としては何となく短そうな気がしないでもないが、UUID v4生成1回に128ビット消費してるから30ビット周期で約10億回で衝突する?

そこまで大量に生成してる気もしないが、これで衝突してるのかなあ。

キックボクシングに関する事

プロでも何でもなく趣味でキックボクシングの練習をしていたが、やってない人にはよく分からない事とかたまに人に説明することがある。 やめてから気がつけば数年経過したので最近色々忘れてきている。

地域やらジムやらによっても言い方や意味が異なる事もあると思うが、自分が神奈川と東京の3つのジムを転々とする間に見聞きしたキックボクシングに関連する、ちゃんとした本には書かれなそうなスラングとかカタカナだけど英語と表現が違うとかも含むメモ。

キックボクシング

キックボクシングとは何かという明確な定義は恐らくないが、パンチ、キック、肘打ち、膝蹴り、首相撲辺りが有効な、リングでボクシンググローブをつけてやるのが大体キックボクシング。 キックボクシングは身近ではないので、知らない人にたまに「キックボクシングだからパンチないんでしょ?」とか言われたりもすがそんなことはない。 1970年辺りだとテレビのゴールデンタイムに何個かの地上波テレビ局が試合中継してたので、70代とかの年齢の人々は知ってたりする。

打倒ムエタイ

日本ではキックボクシングと一緒に語られるムエタイというのがあるが、呼び方としてタイ式ボクシングとかタイ式キックボクシングと呼ばれるのも同じ物。 元々キックボクシングという言葉自体が日本生まれの言葉で、日本人空手家(だけじゃないみたいだが)対タイ人ムエタイ戦士の異種格闘技戦イベントとしてやったのがキックボクシングという言葉の始まりとされる。 その時に日本人側はほとんど負けてしまったため、その昔から「打倒ムエタイ」という言葉が使われる事がある。

キック

キックボクシングにおいてキックという言葉が単独で使われた場合はキックボクシングという競技の略称として使われ、足での攻撃は蹴りと言われる。 なのでパンチとキックではなく、(なんか気持ち悪い感じがするが)パンチと蹴りと言われたりする。 ミドルキックなど接頭語がつくこの場合には足での攻撃としての意味でキックが使われる。 パンチ限定のスパーリングに対して、キック有りではなく蹴り有りスパーリング、と言ったりする。(この文脈だとキック有りといっても普通に通じると思うが)

練習方法

キックボクシングの練習方法について。

シャドー

一人空中に対して攻撃したり防御したりする練習方法。 フォームを鏡で確認しながらやる。

サンドバッグ

天井から吊るしてある円筒形のものを実際に殴ったり蹴ったりの練習。 外側は革で出来ている。 日本語ではサンドバッグと呼ぶが、英語だとpunching bagとかboxing bagとかheavy bagとかtraining bagと呼ぶ。 中に砂は入っておらず、布とかスポンジの切れ端が積めてある事が多い。 ごくまれに軽くて柔らかい、綿が入ってるんじゃないかと思うバッグもある。

ミット打ち

ミット打ちとはトレーナーが手にミットを持ち、それに向かって攻撃を行う練習方法。英語ではpad work。 ミットを担当しているトレーナーの事をミット持ちと呼んだりする。

スパーリング

スパーリングとは二人で行う自由に攻撃防御を行う練習。マウスピース、ヘッドギア、グローブ、レガース、ファールカップ等安全装備を付けて行う。 略してスパーと呼ばれる事も。 今時のキックボクシングジムでは初心者がやらされることはない、というかやりたいといっても多分やらせてくれない。 スパーリングにも色々種類があり、二人でやるもののシャドーと同じように空中に向かって攻撃する程度で実際には当てないマススパーリングとか、軽く当てるとされるライトスパーリング、本気の威力で攻撃するガチスパーリングなどがある。 マスとかライトとか言ってるのに結構強く当ててくる人とかもいる。 日本語のガチスパーリングは英語だとhard sparring。

ロー、ミドル、ハイ

それぞれローキック、ミドルキック、ハイキックの略で、それぞれ頭、胴、脚に対する回し蹴り。 キックボクシングでの回し蹴りとは、弧を描くようにして足の甲や足首、脛辺りを当てる蹴り方。 ボディーとミドルって本来場所的に同じなはずだが、ボディーといった場合には腹を殴ること、ミドルといったら胴に回し蹴りをすることを意味する。 ミドルパンチとかボディキックとかはあまり言わない。

道具

グローブ

いわゆるボクシンググローブ。 キックボクシングやムエタイ向けとして売っているものもあり、手の開き具合とか親指の角度とか手首回りの形とかが違うらしいが、それ自体は比べると分かるけどなんでそうなってるのかはよく分からない。 グローブには大きくパンチンググローブと何とかオンスグローブがあり、前者はミットとかバッグとかで使う物で、薄かったり材質が固かったりする事による相手への安全面からスパーリングでは使わない。 何とかオンスグローブは8オンスから16オンスくらいまであり、一番大きい16オンスは練習で人間を殴るときに使うが、10オンスとかはプロが試合で使ったり、パンチンググローブのように使ったりする。

バンテージ

拳や手首に巻いて保護する長い布。 英語だとhand wrap。

マウスピース

マウスピースとは口の中に入れる防具で、顔面に攻撃を受けた場合に、頬の内側が歯に当たって切れたり、上下の歯が直接当たって割れたり、と言うような口まわりの怪我防止の為に使われる物。 日本語だとマウスピースだが、英語だとmouth guard。

レガース

レガースとは足先から膝下くらいまでの防具。別名シンガード。 キックボクシングでは足の甲だけでなく足首上の脛で蹴ったり、膝下の脛で蹴りを受けたりするので、人を蹴る練習で使う。アマチュアは試合でもつける。

ヘッドギア

当てるスパーリングを行う場合に頭部につける防具。 頭から鼻まで守るもの、頭から頬までまもるもの、頭だけまもるものとかバリエーションが色々ある。

difftasticをCommon Lispで使ってみる

Difftastic, a structural diffCommon Lispで使ってみた。

cargoでインストールする。

cargo install --locked difftastic
(略)
  Installing /home/gos-k/.cargo/bin/difft
   Installed package `difftastic v0.53.1` (executable `difft`)

以下の2ファイルを比較してみる。

(defun alfa (bravo)
  (charlie delta))
(defun alfa ()
  (delta (charlie)
         echo))

通常の diff で比較した場合。

difftasticの difft で比較した場合。

括弧を考慮しつつ変更部分を色分けしてくれる。 便利そう。

roswell2をインストールする

Lisp Advent Calendar 2023 - Adventar の6日目の記事です。

以前からCommon Lispの処理系マネージャ(?)である roswell は存在していたが、新に roswell2 が出てきたので使ってみる。 roswellとroswell2の大きな違いは、roswellが複数OSへの移植性を考慮して下位層がC上位層がCommon Lispで書かれていたのに対し、roswell2では全てをCommon Lispで書き直している。

動作確認したバージョン

インストール

ビルド用にaptでOS側のパッケージをインストールする。

sudo apt install -y git make docker.io
sudo gpasswd -a $USERNAME docker

docker関連でgroupを設定したので再ログインする。

githubからroswell2をもらってくる。

git clone git@github.com:roswell/roswell2.git

ubuntu上でのビルドなのでlinux-buildでmakeを行う。

cd roswell2
make linux-build

最終的にこんな感じに出力されたら成功。

...
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
[undoing binding stack and other enclosing state... done]
[performing final GC... done]
[defragmenting immobile space... (fin,inst,fdefn,code,sym)=883+953+18675+20067+26865... done]
[saving current Lisp image into bin/lisp:
writing 0 bytes from the read-only space at 0x50000000
writing 896 bytes from the static space at 0x50100000
writing 33308672 bytes from the dynamic space at 0x1000000000
writing 2064384 bytes from the immobile space at 0x50200000
writing 12984320 bytes from the immobile space at 0x52a00000
done]

ローカルディレクトリにインストールする。

PREFIX=$HOME/.local make install

最終的にこんな感じに出力されたら成功。

echo 9820c6a Mon Nov 6 18:03:20 2023 +0000 > lib/commit
mkdir -p /home/roswell2/.local/bin
cp -f bin/lisp /home/roswell2/.local/bin
mkdir -p /home/roswell2/.local/lib/roswell
cp -r lib/* /home/roswell2/.local/lib/roswell

元々 .local/bin がなくてパスが通ってないので再ログインする。

何かをリビルドする。 コマンド名が、roswellでは ros だったが、roswell2からは lisp に変更になっているので注意。

lisp rebuild

最終的にこんな感じに出力されたら成功。

...
To load "roswell2.cmd.version":
  Load 1 ASDF system:
    roswell2.cmd.version
; Loading "roswell2.cmd.version"

To load "roswell2/config.default":
  Load 1 ASDF system:
    roswell2/config.default
; Loading "roswell2/config.default"

とりあえず実行してみる。

lisp run -L sbcl

最後に * が出たらreplの起動成功なので普通にlispコードを実行してみる。

* (remove-duplicates '(:alfa :alfa :bravo :bravo))
(:ALFA :BRAVO)

roswell2のインストールが出来た。