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. とか言っててよく意味が分からん。これ

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 つくらいあって、 バイト数 コードポイントの数 見た目の文字数 (サロゲートペアとかを考慮した結果の) 下に行

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

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 つ履歴を遡るとこれになる。 特に騒がれてないということはロケールとかフォント依存だったりするのかな……。 コード読んたりするのは明日以降に…。 と

HugoのMinify

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