development

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 ドメインソケットの話してるけど、ソケットのファイルの管理は 地味にめんどい (ファイル残ってると次回起動するときに面倒くさいので消したいとか パーミッションを

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 が切り替わる

CMake on Windows (ライブラリの解決関係)

zlib とか libpng とかをビルドして、適当に C:\usr とかに配置してたら CMake が認識してくれなかった。 -DCMAKE_PREFIX_PATH で C:\usr を指定してやれば解決。 > cmake -DCMAKE_PREFIX_PATH=C:\usr .. このパスが複数ある場合 (例えばライブラリごとにインストールされているパスが違う場合) は CMake のリスト (セミコロン ; で区切る) で渡せばよい。 参考 CMAKE_PREFIX_PATH — CMake 3.20.0-rc1 Documentation

シェルのプロンプトが壊れる

端末が完全に壊れるので困ってる。 数ヶ月この状態が続いていて、僕が .bashrc の中で変なハックをしてるのが悪いのかなとか いろいろ考えていじくり回してたんだけどどうしようもない。 というかこれが vte のバグか readline のバグか分かってなかったんだけど、 termtosvg で録画してもこれになるということは readline のバグである可能性が高いということか。 master ブランチとかを取ってきてビルドすれば直ったりするかな・・・? 追記 この件はこの記事の方法で解決しました。

カジュアルにブラウザ拡張を作ってWebサイトを快適にする

この記事は「ョョョねこ Advent Calendar 2020」 12日目の記事です。 「ョョョねこ Advent Calendar」なのにねこも VRChat も関係ない記事でいいのかなと 思いつつ、説明見た感じだと記事のテーマは割となんでもいいっぽかったので (言い訳) 12日目を 担当することにしました。 とか言ってたら 3 日も過ぎてました。すみません……。 突然ですが、いつも使っていた Web サイトに突然いらない機能が追加されて「あー、この表示消したいなー」 とか思うことありますよね。(え?ない?) そういうときに適当にブラウザ拡張を作って Web ページを勝手にカスタマイズしてしまおうというのがこの 記事の趣旨です。 多少の JavaScript の知識を前提として書きますが、JavaScript が

DBusのEmacs Lispバインディング

Emacs の scratch バッファで DBus のメソッドを叩いたりできるので便利。たぶん。 DBus 便利じゃんね。(分かってない) 準備 require する。M-x describe-function すると勝手に内部で require するようなので 忘れていたが、当然といえば当然。 (require 'dbus) Introspection プロパティとかインターフェースを眺めるやつ。 GNOME Shell のスクリーンショットのインターフェースを眺めてみる。 XML でなくて S 式で表示される。 (dbus-introspect-xml :session "org.gnome.Shell" "/org/gnome/Shell/Screenshot") メソッドを叩く 適当に introspection で見えた通りに引数を詰め込んでウィンドウのスクリーンショットを撮ってみる。 コマンドラインの dbus-send だと型の指定が面倒だが(まあ 1 と "1" の区別つかないのでそれはそう) Emacs だと Lisp での型が適当に DBus の型にマッピングされていて割と楽。 あと引数が一致しなかったりしたら Emacs Lisp の例外

WebKitGTK+でインスペクタを表示する方法

調べたら普通にドキュメントが出るけどメモ。 まず WebSettings というのを変更して enable-developer-extras というのを有効にしてやって、 WebKitSettings *settings = webkit_web_view_get_settings (WEBKIT_WEB_VIEW(web_view)); g_object_set(G_OBJECT(settings), "enable-developer-extras", TRUE, NULL); それから inspector を開くという感じ。 WebKitWebInspector *inspector = webkit_web_view_get_inspector(WEBKIT_WEB_VIEW(web_view)); webkit_web_inspector_show(WEBKIT_WEB_INSPECTOR(inspector)); 実行してやるといつも F12 で開いてる感じの画面が別窓で出てくる。 全体像 #include <gtk/gtk.h>#include <webkit2/webkit2.h> static void on_destroy(GtkWidget *widget, GtkWidget *window) { gtk_main_quit(); } static gboolean on_close_web_view(WebKitWebView *web_view, GtkWidget *window) { gtk_widget_destroy(window); return TRUE; } int main(int argc, char **argv) { gtk_init(&argc, &argv); GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(main_window), 800, 600); gtk_window_set_title(GTK_WINDOW(main_window), "Browse"); WebKitWebView *web_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); gtk_container_add(GTK_CONTAINER(main_window), GTK_WIDGET(web_view)); g_signal_connect(main_window, "destroy", G_CALLBACK(&on_destroy), NULL); g_signal_connect(web_view, "close", G_CALLBACK(&on_close_web_view), main_window); WebKitSettings *settings = webkit_web_view_get_settings (WEBKIT_WEB_VIEW(web_view)); g_object_set(G_OBJECT(settings), "enable-developer-extras", TRUE, NULL); webkit_web_view_load_uri(web_view, "https://www.chronoscoper.com/"); WebKitWebInspector *inspector = webkit_web_view_get_inspector(WEBKIT_WEB_VIEW(web_view)); webkit_web_inspector_show(WEBKIT_WEB_INSPECTOR(inspector)); gtk_widget_grab_focus(GTK_WIDGET(web_view)); gtk_widget_show_all(main_window); gtk_main(); } このキャプチャはインスペクタを表示して、ソースコード眺めてたら目についた console.screenshot() というのを 呼んでみたところ。 どうでもいいけど WebKit のソースいじったりしていろいろやろうと思っている(思いつき)。

Firefoxで署名していないアドオンをインストールする

最初の設定は最初しかしない(当たり前)のですぐ忘れる。 これをせずに未署名のアドオンをインストールしようとすると壊れているとか文句を言われる。壊れてねーよ。 Firefox Developer Edition を入れる。Stable とかだと署名していないアドオンをインストールできるようにできない。まあこれは常識。 about:config で xpinstall.signatures.required を false にする。 おしまい。 これで壊れていると言われたら多分本当に壊れている(欠けているファイルがあるとか)。 今日ハマったのとしては,zip にするときに zip extension.zip * ってやったことでサブディレクトリが zip に入ってなかった。 zip extension.zip ** ってやれば解決。 あと applications.gecko が必要なのかよく分かってないけど前うまくいかなかった気がするので追加。 "applications": { "gecko": { "id": "{9e13ea3f-fe6d-4246-88f9-00a9836d9816}" } }, id のところ

KASLRを無効化する

Linux カーネルには Kernel address space layout randomization という仕組みがある(別に Linux カーネルじゃなくてもあると思うが)。 これはカーネルのコードが置かれる仮想アドレスを起動するたびにランダムにするというもので, 悪意のあるソフトウェアのカーネルへの攻撃を難しくしている。ってのはまあどうでもいい話。 で,これ,セキュアになるのはいいんだけどあんなことやこんなことをする時(つまり自分が悪意のある側, とまではいかないが何かの手段としてそれに近いことをしようとした場合)に 面倒臭いことがあって,かといって自分で無効化してコンパイルし直すのもなということでメモ。 nokaslr をカーネルパラメータに追加する1だけ。終了。 一応これをデフォルトにするのは良くない