OBS StudioにWaylandのスクリーンキャプチャが入ったので試してみた

前 Wayland のスクリーンキャプチャの Pull Request 入りたがってたなとか 思ってリポジトリ見に行ったら、認識していたものは Close されてたんだけど、 他の Pull Request がマージされてて Wayland でもスクリーンキャプチャできるようになってた。 試してみたのが下の動画。 こういう部分あんまり知らんのでよく分からないんだけど PipeWire を使うと取れるらしい。 一応方法を。 OBS の HEAD を clone してきてビルドする。Browser Source 用っぽいところでコケたら -DBUILD_BROWSER=OFF で無効にしてやればおk。 install する。適当なパスでいい。 インストール先の lib ディレクトリを LD_LIBRARY_PATH に足す。 環境変数 OBS_USE_EGL を設定してから開く。こういうハックが必要なのは GNOME 上だけかも (Qt は GNOME 上での Wayland のサポートを意図的に無効化しているので)。 あと必要なパッケージをインストールする。

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 行のプロンプト見にくくてあんまり好きじゃないのでなんとか解消したいんだよなぁ。 まあ太字にするのやめればいいんだけど。

HugoのMinify

Hugo に --minify というオプションがあるのに気づいて、しばらく使ってたけど あんまり良くなさげ。 改行は半角スペースに置き換えられるっぽいけど、これ日本語にもそのまま適用すると 変なところに空白入るんだよな……。 というかブラウザはどういうアルゴリズムで空白入れる入れないを決めてるんだろう。 愚直にテーブルとか?

GNOMEのスクリーンキャストがTwitterに上げられない問題をなんとかする

ffmpeg で適当に変換すると上げられた (可変フレームレートだと上げられないのか・・・?)。 あと webm はそもそも対応している形式に入ってなかった気がするのでそこも適当に対処してやる。 $ ffmpeg -i in.webm -r 30 out.mp4 -r だと固定フレームレートにはなるっぽいけど厳密にはいろいろおかしいみたいなのをどっかで見た気がするけど そういう動画オタクな世界にはついていけないのであった……。

Socket Activation

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

CMakeのedit_cacheが使えるという話

CMake で Makefile とか生成したときにできる edit_cache ターゲットが実は便利なやつだったと 気づいた。 edit_cache すると、すでにビルドディレクトリとして CMake を走らせたディレクトリの オプションをいろいろ編集できる。 これまでは適当に CMakeCache.txt を直接編集してたけど、このツールだともっと楽で安全に編集できるっぽい。 make edit_cache とかで起動する。 するとデフォルトだと CMAKE_INSTALL_PREFIX と CMAKE_BUILD_TYPE が出るっぽい。 まあ現実的に変えたそうなやつだし妥当だと思う。 なぜか Boost を find_package のした結果設定された変数が出てるけどなんでなんでしょうね (にっこり)。 あと CMakeLists.txt の中で option(...) コマンドを使ってると、これで設定してる変数も出る。便利。 でカーソルキーとか J/K とかで項目選んで Enter 押すと編集。bool だと ON と OFF が切り替わる。 PATH とかだとそこが編集可能になるんだけどカーソル一番後ろにしといて欲しかった。