development

VTE で Sixel が使えるようになった

久しぶりに vte のリポジトリを見に行ったら HEAD で Sixel が使えるようになっていたので、 その導入方法を……。 適当に調べた感じだと GNOME 端末 3.37 とかでもサポートされてるっぽいです。 まだリリースされていないので HEAD を取ってくる必要があります。 なんかサーバ遅い気がするので --depth 1 をつけて履歴を取ってこないようにした方がいいかもしれません。 $ git clone https://gitlab.gnome.org/GNOME/vte.git ソースのディレクトリに入り、Meson で Ninja などなどを生成 & ビルドします。 sixel はデフォルトだと無効なのでここで有効化してやります (-D は Make とか CMake にあるような、ビルドのオプションを変えるというオプション)。 $ meson . _build -Dsixel=true && cd _build && ninja ビルドに成功したらインストールします。ld.so.conf とかで /usr/local/lib を

GObjectについて

この記事では C++ とか Java とかを触ってる人が、 それと同等のコードを GObject 上に構築するにはどうしたらいいのかという視点で解説していきたいと思います。 ただし、一部にそれらの内部実装に関する知識を要する部分があるので、 使ったことがあるというだけでは理解が難しい部分があるかもしれません。 GObject 使おうとしても意外と Web 上に情報がなく…… (これは単に調べるのが下手という説もある)。 GObject とは GObject は C で書かれたユーティリティライブラリである GLib の一部で、 主に GTK の構築に使われているオブジェクトシステム (オブジェクト指向ぽくコード書くフレームワーク) です。 オブジェクト関連の言語機能がない C で簡単に OOP できます。 ……ということになってる (

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

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

Socket Activation

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