development

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

カジュアルにブラウザ拡張を作って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だけ。終了。 一応これをデフォルトにするのは良くない

LISPでFizzBuzz

ふと FizzBuzz を LISP 的に書くとどうなるんだろうと思って調べてみた。 ループで書くのは LISP 的にはダサいはず(適当)なので末尾再帰とかだろうかと 思っていたら,1 から 100 までのリストを作って map していくという感じらしい。 ほんまか? (letrec ((print-all (lambda (l) (when (pair? l) (print (car l)) (print-all (cdr l)))))) (print-all (map (lambda (n) (cond ((= (remainder n 15) 0) "FizzBuzz") ((= (remainder n 3) 0) "Fizz") ((= (remainder n 5) 0) "Buzz") (else (number->string n)))) (iota 100 1)))) てことで Scheme で書いてみた。一応手元の環境の Gauche 0.9.9 では動いた。 出力する部分のせいでかなりごちゃごちゃになったが,FizzBuzz のリストを作ること自体は 簡単にできる(僕は LISP はまともに書けないのでこのコードは LISP の人から見ると一笑に付す ようなものだろうが)。 しかしなんというかメモリが潤沢な前提の贅沢な考え方だなぁ……。

Linuxの一般ユーザではどうしようもない失敗に対処する

面倒臭い失敗をしてしまった(戻せるのでセーフ) pic.twitter.com/GSo48SZ9Vw — kofuk (@man_2_fork) August 17, 2020 覚えていたのでパッと対処できたけど忘れないとも限らないのでメモ。grub じゃない環境での方法は分からない。 再起動する。 GRUB のメニューが表示されたら eを押すと起動のコマンドを編集できる。 linux から始まる行での後ろに init=/bin/bash と書き加える。 Ctrl-x で起動する。 Bash が起動しているので何でもアリの無法地帯。 終わったら exec /sbin/init して起動する。 init を起動せずに Bash から exit すると kernel panic するので注意。

Emacs 27.1の面白そうな変更

開発者ではなく一ユーザーとして。メジャーリリースでいろいろ変更があるようだ。 NEWS.27 のファイルに変更の長いリストがある(visible changes って書いてあるので 内部的にはもっといろいろ変わっているということだが)。 JSON のパースがネイティブになる LSP が広がったことで JSON をパースすることが多くなり,高速化を図ったのだろう。 設定ファイルをホームディレクトリに直接置く必要がなくなった 今までは設定ファイルは .emacs.d の中に設定ファイルを置いていたが, $XDG_CONFIG_HOME/emacs に置けるようになる。 多分デフォルトの XDG_CONFIG_HOME であれば ~/.config/emacs になると思う。 ホームディレクトリが散らからないので良い(ドットファイルだったのでさほど問題ではなかったが)。 package-initialize する必要がなくなった init.el