Tech

Firefoxでマイク使用中のポップアップを表示しない方法

Firefox でマイクとか画面共有とかを使ったときに出てくるこいつを消す1方法。 一応これは安全のために出ているので、専用のプロファイルを作って使用することをおすすめする。 (使用自体おすすめできないのでは?) about:config で toolkit.legacyUserProfileCustomizations.stylesheets を true にする (いつの間にか消えてそうな名前だなぁ)。 /.mozilla/firefox/<プロファイル> の中に chrome というディレクトリを作る。 その中に userChrome.css を作り、以下の内容を書く。 #webrtcIndicator { display: none; } もしくはマウスカーソル合わせたときだけ隠すとか。 ところで Firefox ってときどき Chrome という名前が内部的に使われてる2けど 何なんですかね。 参考 Is it possible to disable this overlaying microphone icon? : firefox どうでもいいこと リンク貼るためにタイトルをコピーしようと思って Reddit でブラウザのコンソール開いたら何やら視線を感じた。 ちなみに仕事中 Reddit 見てないです。

OBS StudioのPipeWireキャプチャが古いリリースでも動くようにしてみた

今リリースされているバージョンの OBS Studio では Wayland 上で画面キャプチャができない。 OBS の master ブランチには PipeWire を使用した画面キャプチャが入っているので、 それを今のリリースされているバージョンに読ませて画面キャプチャできるようにしてみた。 これを /usr/lib/obs-plugins に置けば使えるはず。 (そのままビルドしただけでは動かないので適当に下みたいなパッチを当てた。) ビルドした linux-capture.so (消えてるかも) sha256: 693caf89788be465dfb813fd2c4662280fa2fbe218900dad3ad6111eec2926a6 適当に新しいやつのソース取ってきてビルドすればいいやんという話ではある。

dbus-glib

https://gitlab.freedesktop.org/dbus/dbus-glib 非推奨だったのか………。GDBus を使えって書いてある。 dbus-send の補完がなんかバグってるなと思ったので直していて、 Merge Request 投げる直前くらいに気づいた (でもせっかくなので投げた)。 https://gitlab.freedesktop.org/dbus/dbus-glib/-/merge_requests/5 dbus-send は DBus の一部なのになぜか Bash completion はこれの一部なのはわけが分からないが、 でもこれが死ぬと dbus-send の補完がなくなってしまうというのはマイナスだなと思った。 (まあなんかいろいろ補完がおかしかったりするのでいろいろ修正した方がよさそうではあるけど。) てなわけで 5 個くらいたまっていた TODO が一応 1 個捌けてよかったと思う。

sha256sumを書いてみた

Wikipedia に sha256 の疑似コード載ってるじゃん1ってことで sha256sum を書いてみた。 sha256.c あと出力されたバイト列見てもどこが間違ってるのか分からないので割と苦労した。 一応気づきとしては、coreutils に入ってる sha256sum コマンドは 相当速くて、かなり頑張ってチューニングしたんだろうなと思った。 どのくらい速いかというと、疑似コード真似しただけのコードだと 1 GiB のファイルの ハッシュに 40 秒強かかるところを、coreutils のそれだと 500 ms くらいで終わる。 coreutils 速いのは知ってるけどここまで歴然とした差があるとかなりびっくりする。 一応 coreutils の sha256sum は gnulib から引っ張ってきてるっぽいので そこへのリンクを。 http://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/sha256.c?id=591f00666450e5e70514d457846af2c8d301af9b FIXME: see sha1.c for a better implementation. とか言っててよく意味が分からん。これでも best ではないらしい。

Arch LinuxでWindowsの起動USBを作る方法

Windows のイメージは Microsoft のサイトからダウンロードできるが、 クソデカファイルが含まれているので、そのまま焼いても (USB の作成は成功したように見えるが) 壊れた起動 USB ができている。 FAT32 は 1 ファイルのサイズには 4 GiB の制限があるが、ISO ファイルには 5 GiB 超の ファイルが入っているのでそのまま焼くことができない。 このクソデカファイルを分割することで、この制限を突破することができるので、 その方法で起動用の USB を作成する。 1. USB を FAT32 でフォーマットする 普通。コマンドでやるなら下みたいな感じかな。 # parted /dev/sdb (parted) mklabel msdos (parted) mkpart primary fat32 0% 100% (parted) q # mkfs.fat -F32 /dev/sdb1 sources/install.wim 以外をコピーする ダウンロードしてきたイメージをマウントし、中のファイルをコピーする。 cp でやるなり rsync 使うなりお好みで。

UTF-8メモ

UTF-8 でマルチバイトになる場合について、実装するときいつも調べてる気がするので メモしておこうかなと。 バイト数 1 バイト目 2 バイト目 3 バイト目 4 バイト目 1 0xxxxxxx - - - 2 110xxxxx 10xxxxxx - - 3 1110xxxx 10xxxxxx 10xxxxxx - 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx Unicode のコードポイントは 1 バイト目から順番に x の部分を連結したものになる (一応順番的にはビッグエンディアン)。 規格上は 6 バイトまで考慮されてるらしいが、現状で存在するのは 4 バイトまでっぽい。 絵文字とかあからさまにコードポイント節約しに来てる感あるしな (知らんけど)。 文字数 UTF-8 で文字数と言ったときに僕の理解でも指す概念が 3 つくらいあって、 バイト数 コードポイントの数 見た目の文字数 (サロゲートペアとかを考慮した結果の) 下に行くほど判定が面倒臭くて、見た目の文字数を数えるには文字種を見て 連結する条件のテーブル引く必要がある。絵文字で J と P 並べたら日本の国旗になるとか。

OpenCL

GPU が乗ったマシンを買ったので、OpenCL で Device が取得できるのを見て 自己満足に浸るなどしていた (on Arch Linux)。 てか GPU って某 N 社が勝手に読んでる名前なんだっけ?忘れたけど。 インスコ: opencl-clhpp (OpenCL の C++ バインディング) opencl-mesa (乗ってる GPU に合わせたパッケージが必要な筈) ocl-icd (ローダー) あんまり関係ないけど compile_commands.json を生成してくれるのが便利なので 最近はどうでもいいコードでも CMake のプロジェクトを作っている。 で、コード: #include <iostream> #include <vector> #define CL_HPP_TARGET_OPENCL_VERSION 300 #include <CL/opencl.hpp> auto main() -> int { std::vector<cl::Platform> platforms; cl::Platform::get(&platforms); for (auto const &p: platforms) { std::vector<cl::Device> dev; p.getDevices(CL_DEVICE_TYPE_ALL, &dev); for (auto const &d: dev) { cl_device_type ty = d.getInfo<CL_DEVICE_TYPE>(); std::string type; switch (ty) { case CL_DEVICE_TYPE_CPU: type = "CPU"; break; case CL_DEVICE_TYPE_GPU: type = "GPU"; break; case CL_DEVICE_TYPE_ACCELERATOR: type = "Accelerator"; break; default: type = "unknown"; break; } std::cout << type << '\n'; std::cout << d.getInfo<CL_DEVICE_NAME>() << '\n'; std::cout << d.getInfo<CL_DEVICE_VENDOR>() << '\n'; std::cout << d.getInfo<CL_DEVICE_MAX_COMPUTE_UNITS>() << '\n'; } } } んで、その出力 GPU Radeon RX 5500 (NAVI14, DRM 3.40.0, 5.11.4-arch1-1, LLVM 11.1.0) AMD 22 今日はとりあえずコンパイル通って動いたので良し。後日いろいろ計算とかさせていきたいね。

プロンプトが壊れる件について

readlineのバグだったとか寝言言ってたけど違った。君のせいにしてごめんよ。 ソースコード読んでみて分かったんだけど、readline はエスケープシーケンスを考慮して文字数計算するみたいなことは もともとやってくれない。そのかわりに、文字数の計算で無視したい部分を ここ で定義してある RL_PROMPT_START_IGNORE (\001) と RL_PROMPT_END_IGNORE (\002) ではさむことによって プロンプトが崩れないようにする。 Bash のプロンプトを設定するときにはそれぞれ \[ と \] で挟むとこれらの文字に置き換えてくれるっぽい (これは挙動から推測しているだけで、正確には Bash のソースコードを読んでいないので分からない)。 これはちゃんと Bash の Manual page にも書いてある。 \[ begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt \] end a sequence of non-printing characters man 読みましょうね。 …といっても readline は色付けのエスケープシーケンス無視する機能くらい持っててもいいと思うんだ……。

readlineのバグだった

注意: この記事の内容は間違っています。 こちらを参照してください。 この記事 で Bash のプロンプトが壊れるとか いろいろ言っていたが、いまさらながら調査した。 その結果、プロンプトにエスケープシーケンスが含まれていると、その文字数だけ履歴が残ったり 行の途中で折り返してしたりすることが分かった。 たぶんプロンプトから残りの文字数を計算する部分でエスケープシーケンスが処理されていない? 以下 PoC。 #include <stdio.h> #include <readline/readline.h> #include <readline/history.h> int main(void) { for (;;) { char *line = readline("\033[1mfoobar\033[0m"); if (line == NULL) { break; } add_history(line); } } これで 22222... の行まで入れたあとに 2 つ履歴を遡るとこれになる。 特に騒がれてないということはロケールとかフォント依存だったりするのかな……。 コード読んたりするのは明日以降に…。 というか今日プロンプトを2行にしてワークアラウンドしたんだけど、 2 行のプロンプト見にくくてあんまり好きじゃないのでなんとか解消したいんだよなぁ。 まあ太字にするのやめればいいんだけど。

Socket Activation

systemd の Unit ファイルっぽいものにはいろいろ種類があって、 一番よく見かける .service のやつの他にも .socket とか .mount とかいろいろある。 その中で、ソケット関連を systemd がよしなにやってくれる socket activation というやつが 便利そうだったので適当に触ってみた。 service と socket について socket の方を enable しておくと、systemd が指定したソケットを見ておいて、 必要なときに対応する service の方を起動してくれる。 んで仮に service を止めたとしても、socket の方が残ってればまた 接続があったときによしなに service を起動してくれる。 完璧に Unix ドメインソケットの話してるけど、ソケットのファイルの管理は 地味にめんどい (ファイル残ってると次回起動するときに面倒くさいので消したいとか パーミッションをいろいろやりたいとか) のでそのへんを自動でやってくれるのは便利だなと思いました。