目次: 射的
スピードシューティングを始めてから2年半が経ちました。11月には3回目の参加を予定しているJTSA Limited(リミティッド - 一般社団法人日本トイガン射撃協会JTSA)が開催されます。
以前と変わらず、基本的に練習は週1回のみです。たまに練習以外のシューティング系イベントにも行きますが、記録を見る限りタイム上達とは関係なさそうです。2023年の結果はこんな感じでした。
記録は横ばいで80秒台からタイムが早くなる様子がなく、週1回の練習ならこんなもんか?と諦めていました。ところが2024年の夏から70秒台のタイムが出るようになりました。何が起きたのかわかりません。謎です。
今日は初の69秒台のタイムが出ました。とはいえ各ステージのタイムのゆらぎを見る限り、全ステージが偶然早いタイム側に寄っただけの偶然の産物です。実力は75秒くらいでしょうか。
ここ1か月は最近は1発目を早く撃てるように頑張りましたが、その前からなぜか早くなっていたし、何が良くなったのかイマイチわからないです。この後良くなるのか悪くなるのかわからないですね……。
今の企業は公式サイトを持っていなほうが珍しいと思いますが、ドメイン名の使い方は各社でバラバラで面白いです。特にグローバル企業は日本だけでなく世界各国向けに公式サイトを構築する必要があるため、迂闊に「会社名.co.jp」みたいなドメインを使うと海外展開時に困ってしまいます。
解決方法はいくつかパターンがあるみたいです。
一番良く見かけるタイプでオーソドックスな解決方法だと思われます。gTLD(generic Top Level Domain)である.comドメインのあとに地域名や国名を表すパスが続きます。ドメインを増やさずに各国地域対応が可能で、スマートですね。
亜流としてNECのように、.comドメイン&ドメイン先頭(www部分)が地域名になる会社もありました。.comドメインだけどパス名の代わりにドメインの先頭を使うんですね。これはこれでスマートです。
もう一つはccTLD(country code Top Level Domain、つまり汎用JPドメインなど)を使う会社です。一貫性がありますね。
亜流として日本だけ属性JPドメイン(.co.jp)、他国はccTLDドメインを使う会社もあります。日本だけ違うのは過去の互換性のためでしょうか?
珍しいパターンとしては企業名ドメインもありました。このタイプのドメインの名称が良くわからないんですが、企業名がトップレベルドメインになっています。でも他国向けはccTLDでした。謎の作りですね。
日産やホンダは.co.jpを使っていますが、.jpはアドレス解決ができないところから使っていないように見えます。.jpドメインはどうなっているんでしょうか?Whois情報を見ると、
$ whois nissan.jp Domain Information: [ドメイン情報] [Domain Name] NISSAN.JP [登録者名] 日産自動車株式会社 [Registrant] Nissan Motor Co., Ltd. [Name Server] [Signing Key] [登録年月日] 2001/03/26 [有効期限] 2025/03/31 [状態] Active [ロック状態] DomainTransferLocked [ロック状態] AgentChangeLocked [最終更新] 2024/08/06 16:25:46 (JST)
見慣れない"DomainTransferLocked"と"AgentChangeLocked"が設定されています。これはドメイン名移転申請ロック、指定事業者変更ロックのことだそうでJPRSのサイト(指定事業者変更ロック - JPドメイン名のルール - JPドメイン名について - JPRS)に解説があります。
企業と関係のない登録者に勝手に使われないように申請を弾いてくれる仕組みですね。こんな機能があるとは知らなかったです、なるほど便利だ。
目次: ゲーム
書くの忘れてました。放置してたshapezを夏ごろにレベル100まで進めました。レベル27から納品物がランダムになるので「何でも作れる機構」を構築しないとレベル100達成はしんどいです。
実績は41/45まで取りました。取り逃しは、取る気が元々ないスピードラン系3つ+操作ミスで取り逃した「King of Inefficiency」です。
レベル100程度ならさほど納品速度は要求されませんが、高レベルになると作成したShapeを納品する場所(ハブ)に超高速で納品しなければならないです。何でも作れる機構+倉庫に大量のShapeをためて、たまったら一気に流し込む機構が必要です。
レベル100までやってみた感想ですけど、総合的には面白かったです。効率的な機構を考え付いたときが爽快です。個人的な面白さのピークは「何でも作れる機構」を作りレベル30くらいを突破する辺りでした。そのあとはコピペ感が強くなってやや盛り下がるのはシステム上仕方ないですね。
近々shapez2がリリースされる(今はearly access版)みたいですが、さらに複雑になっているようで買うかどうか微妙です。やると疲れるんで……息抜きには向いてないです。
メモ: 技術系の話はFacebookから転記しておくことにした。
Microsoft Office 2016のまま8年間ほったらかしにしてきましたが、ついにMicrosoft Office 2024に買い替えました。Amazonで31,000円くらいでした。うーん、高い。Office 2024もきっと8年くらい使うでしょう。買い替えるモチベーションがほとんどないし……。
買い替えのきっかけはOffice 2024 Homeです。今年からMicrosoftが改心してOffice 2024 Home(かつてのPersonal相当と思われる)からOutlookを消してPowerPointを入れてくれました。私が欲しいのはPowerPointとExcel(Wordはあってもなくても良い)だったので、これはありがたい変更でした。
従来のOffice 2021はPowerPointとExcelが安価に購入できるパッケージが存在しないことが悩みどころで、前回は仕方なくOffice Personal 2016とPowerPoint 2016の2つを買いました。ただでさえ高いのにバラバラに買うと余計高いし、Outlookも無用の長物で非常に嫌な構成でした。
Office 2024をインストールした直後、謎のディレクトリ「Microsoft OneNote Namespace Extension for Windows Desktop Search」がデスクトップに生成されました。しかも誰かが使っているのか移動もできません。
しかも調べているうちにディレクトリごと消滅しました。謎ですね。一体なんだったんでしょうか……。
Officeが全部使えるMicrosoft 365ならばPowerPointのあるなしに悩むことはなくなりますが、問題点は異常に高いことです。サブスクリプション契約1年で15,000円もします、2年で永続パッケージが買えてしまいます。
Office製品は家庭でヘビーユースしませんし、年15,000円払うほどの価値を感じません。月500円(年6,000円)くらいなら良かったんですけどね……。
目次: OpenPilot
最近はOSSの運転支援ソフトウェアOpenPilotのコードを見ています。今日はOpenPilotのビルドと実行方法について調べます。ソースコードはGitHubから入手できます(リンク)。
OpenPilotは全自動運転とはいかないまでもADAS+αの機能を実現するシステムです。OpenPilot用のデバイスが市販されており、既存のADASシステム搭載車のCAN通信回線に割り込ませる形で後付します。自動運転レベルでいえばレベル2(常に人間が見ている前提)だと思います。突然止まっても害はありませんし、OpenPilotがおかしな制御信号を出しても既存ADASシステムが受け付けないはずです。たぶん……。
ソースコードの他にUbuntuの環境、Pythonの環境のセットアップが必要です。私はDebian Testingで試しましたが、特にこだわりがなければUbuntu 24.04 LTSを使うと良いと思います。
$ cd openpilot $ git submodule update --init --recursive $ ./tools/install_ubuntu_dependencies.sh $ python3 -m venv .venv $ source .venv/bin/activate $ ./tools/install_python_dependencies.sh $ scons -j8
主にPythonとC++で実装されています。車用と銘打ったソフトウェアがPythonを使っているのは割と驚きでした……。
ビルドできましたが我が家には専用デバイスもありませんし、車も古いのでADAS付きではありません。そんな私はどうしたら良いのでしょうか?大丈夫、デモモードがあります。デモモードを動作させるには端末を2つ使います。
#### 1つ目の端末 $ ./tools/replay/replay #### 2つ目の端末 $ ./selfdrive/ui/ui
なぜかreplayはCUIで、uiはGUIです。まあそれはどうでも良いとして、replay側はこのような表示になるはずです。
デモモードではあるもののデータ自体は実際の車で走行したデータを再現しているはずです(たぶん)。しばらくするとCar Fingerprint: TOYOTA COROLLA TSS2 2019と出ますから、カローラと接続してこのデータを作ったのでしょう。もう一方のui側はこのような表示になるはずです。
アメリカのどこかのハイウェイ?でしょうか。しばらく見ていると車線変更を行ったりする様子が見えると思います。
デモモードでは全ての機能が動作する訳ではありませんが、特殊な機器なしでもある程度動作させることができるため、内部を解析する際の手助けになるでしょう。なかなか便利ですね。
目次: Linux
先日(2024年10月1日の日記参照)のUbuntu 22とxrdpの組み合わせで起きるエラーですが、Ubuntu 20で再現できるかやってみました。グラフィクスは種類が違いますがAMDのGPU(Radeon RX 6900 XT)です。条件は同様でgdm3は終了させてxrdpのみ起動しています。
結論から言うと再現しました。以下が通常時のログです。正常に画面が表示されます。
gnome-session-binary[2712263]: DEBUG(+): Enabling debugging gnome-session-binary[2712263]: GLib-DEBUG(+): posix_spawn avoided (fd close requested) gnome-session-binary[2712263]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’ gnome-session-binary[2712263]: WARNING: Error creating FIFO: File exists
ログにはデバッグ有効であること以外は特に何も出ません。FIFOが作れない警告が出ます、これは何だろう?まあいいか。
次にcard0とrenderD128をリネームしてアクセスできないようにして試しました。画面は真っ黒になってすぐに切断されます。Ubuntu 20.04 LTSでも再現するんですね。ログは下記のようになりました。
gnome-session-binary[2712010]: DEBUG(+): Enabling debugging gnome-session-binary[2712010]: GLib-DEBUG(+): posix_spawn avoided (fd close requested) gnome-session-is-accelerated: No hardware 3D support. gnome-session-check-accelerated: GL Helper exited with code 256 amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1) amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1) ** (gnome-session-check-accelerated-gles-helper:2712146): WARNING **: 14:44:50.573: eglInitialize() failed gnome-session-check-accelerated: GLES Helper exited with code 256 gnome-session-binary[2712010]: DEBUG(+): hardware acceleration check failed: Child process exited with code 1 gnome-session-binary[2712010]: GLib-DEBUG(+): setenv()/putenv() are not thread-safe and should not be used after threads are created gnome-session-binary[2712010]: GLib-DEBUG(+): posix_spawn avoided (fd close requested) gnome-session-is-accelerated: No hardware 3D support. gnome-session-check-accelerated: GL Helper exited with code 256 amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1) amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1) ** (gnome-session-check-accelerated-gles-helper:2712203): WARNING **: 14:44:55.610: eglInitialize() failed gnome-session-check-accelerated: GLES Helper exited with code 256 gnome-session-binary[2712010]: WARNING: software acceleration check failed: Child process exited with code 1 gnome-session-binary[2712010]: CRITICAL: We failed, but the fail whale is dead. Sorry....
前回も見かけたamdgpu_get_auth()のエラーが出て止まりました。AMDのGPUの場合、エラーが起きると止まってしまう疑いが強まりました。本当はエラーが起きたらソフトウェアレンダリングにフォールバックしてほしいんですけど、そうならないようです……。
デバイスファイルが/dev/driに全く存在しなくてもamdgpu_get_auth()が怒ってくるところを見ると、X.orgはPCのグラフィクスの種類(VirtualBoxなのかAMDのGPUなのか)を最初から決め打ちにしているんですね。
目次: Linux
昨日(2024年10月1日の日記参照)のUbuntu 22とxrdpの組み合わせで起きるエラーですが、VirtualBox 7.0.18で再現できるかやってみました。グラフィクスはVMSVGAを選択しています。VMSVGAは/dev/driの下にcard0とrenderD128が生成されるようです。ちなみにgdm3は終了させてxrdpのみ起動しています。
ちなみに結論から言っておくと再現しません。以下が通常時のログです。正常に画面が表示されます。
gnome-session-binary[2774]: DEBUG(+): Enabling debugging gnome-session-binary[2774]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’
ログにはデバッグ有効であることと、libEGLが何かしら見つけて反応しています。それ以外は特に何も出ません。
次にcard0とrenderD128をリネームしてアクセスできないようにして試しました。しかし正常に画面が表示されます。えぇー?ログは下記のようになりました。
gnome-session-binary[4319]: DEBUG(+): Enabling debugging gnome-session-check-accelerated: GL Helper exited with code 512 libEGL warning: DRI2: failed to authenticate gnome-session-check-accelerated: GLES Helper exited with code 512 gnome-session-binary[4319]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’
AMDのGPUでも見かけたfailed to authenticateが出ています。が、エラーは無視されるんでしょうか?謎の動きですね。
目次: Linux
WindowsからUbuntu 22.04 LTSのxrdpに接続すると真っ黒な画面しか出ず、すぐに接続が切断されてしまう問題に遭遇しました。どこでクラッシュしているか調べるため、xrdpがGNOMEを起動するところまでを追いかけると下記のようになっていました。
/etc/xrdp/startwm.sh exec /bin/sh /etc/X11/Xsession /etc/X11/Xsession.d/99x11-common_start /usr/bin/ssh-agent /usr/bin/im-launch x-session-manager /usr/bin/x-session-manager /usr/libexec/gnome-session-binary
スクリプトx-session-managerを書き換えてgnome-session-binaryの引数に--debugを足すと、GNOMEはより詳細なメッセージを出力します。メッセージはホームディレクトリの.xsession-errorsに記録されます。GNOMEのエラーメッセージは下記です。
** (gnome-session-check-accelerated-gles-helper:3301100): WARNING **: 13:50:04.884: eglInitialize() failed gnome-session-check-accelerated: GLES Helper exited with code 256 gnome-session-binary[3300977]: DEBUG(+): hardware acceleration check failed: Child process exited with code 1 gnome-session-binary[3300977]: GLib-DEBUG(+): setenv()/putenv() are not thread-safe and should not be used after threads are created gnome-session-binary[3300977]: GLib-DEBUG(+): posix_spawn avoided (fd close requested) gnome-session-is-accelerated: No hardware 3D support. gnome-session-check-accelerated: GL Helper exited with code 256 ★★ここでエラーが発生している amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1) amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1) ** (gnome-session-check-accelerated-gles-helper:3301174): WARNING **: 13:50:09.927: eglInitialize() failed gnome-session-check-accelerated: GLES Helper exited with code 256 gnome-session-binary[3300977]: WARNING: software acceleration check failed: Child process exited with code 1 gnome-session-binary[3300977]: CRITICAL: We failed, but the fail whale is dead. Sorry....
エラーメッセージ曰くamdgpu_get_auth()が失敗しています。関数名から推測するにAMDのGPUが装着されているマシンでしか発生しないエラーなのかもしれません。この関数は何者なのかDRMのソースコード(Mesa/libdrmのソースコードリポジトリへのリンク)を見ると、
// drm/amdgpu/amdgpu_device.c
/**
* Get the authenticated form fd,
*
* \param fd - \c [in] File descriptor for AMD GPU device
* \param auth - \c [out] Pointer to output the fd is authenticated or not
* A render node fd, output auth = 0
* A legacy fd, get the authenticated for compatibility root
*
* \return 0 on success\n
* >0 - AMD specific error code\n
* <0 - Negative POSIX Error code
*/
static int amdgpu_get_auth(int fd, int *auth)
{
int r = 0;
drm_client_t client = {};
if (drmGetNodeTypeFromFd(fd) == DRM_NODE_RENDER)
*auth = 0;
else {
client.idx = 0;
r = drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client); //★★エラーを返すのはこの関数だけ★★
if (!r)
*auth = client.auth;
}
return r;
}
// drm/xf86drm.c
/**
* Call ioctl, restarting if it is interrupted
*/
drm_public int
drmIoctl(int fd, unsigned long request, void *arg)
{
int ret;
do {
ret = ioctl(fd, request, arg); //★★drmIoctl()はioctl()が返すエラーをそのまま返す★★
} while (ret == -1 && (errno == EINTR || errno == EAGAIN));
return ret;
}
ソースコードから推測するにグラフィクス系のデバイスファイルにioctl()しようとして失敗しているものと思われます。
XのグラフィックスはDRI(Direct Rendering Infrastructure)と呼ばれるインタフェースを経由してGPUを使用します。Xとカーネルの間にはlibDRMがおり、libDRMはLinuxカーネルのDRM(Direct Rendering Manager)を使用してGPUにアクセスします。DRMのデバイスファイルは/dev/driディレクトリの下にありますが、名前がDRIだったりDRMだったりして謎ですね。グラフィクス周りはあまり詳しくなくて理由はわかりません……。
# ls /dev/dri/* -la crw-rw-rw-+ 1 root video 226, 0 4月 30 15:00 /dev/dri/card0 crw-rw-rw-+ 1 root render 226, 128 4月 30 15:00 /dev/dri/renderD128
上記のようにキャラクタデバイス/dev/dri/card0と/dev/dri/renderD128のパーミッションを0666にしたところエラーが出なくなりました。今回はこの2つのデバイスファイルで解決しましたが、他のデバイスファイルにもアクセスしていた場合はさらに調査が必要かもしれません。グラフィクス系のエラーは簡単に調べる方法がないのが辛いですね。
ちなみにこの症状はQEMUだと再現しません。card0のパーミッションを0000にするとlibEGLがエラーになるのですが、なぜかGNOMEはエラーを無視して起動してしまいます。AMDのときだけなんで止まるんでしょうか。いまいち釈然としません……。
< | 2024 | > | ||||
<< | < | 10 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | - | - |
合計:
本日: