ImageMagickでExif情報からGPS情報を取る

Exif 情報を表示するには: $ identify -verbose image.jpg これで出力される情報のうち、exif:GPS から始まる行が GPS 情報になっている。 exif:GPSLatitude, exif:GPSLongitude は 度, 分, 秒 表記になっているので、 さらにそれぞれ割り算して実際の座標を求める感じになっている。 例えば 31/1, 34/1, 71/25 とかだと、31°34'2.84" になる。 Google マップに持っていって表示したい場合は、検索欄に 度 分 秒N, 度, 分, 秒E といった具合に 打ち込めばその座標にピンが表示される。

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

ImageMagick の image stack operator

ImageMagick のコマンドラインオプションはスタックに画像を積み上げていって、 その画像に対してなんかやるみたいな体系になっている。 そのスタックの操作についてメモ。 ( 新しくスタックを作る。 スタック作っただけじゃあんまり意味なくて、何か画像を乗っけることで他のオペレータにも スタックが使われるようになるっぽい (このへんの挙動がよく分からん)。 ) 今いるスタックに乗っかってる画像をメインのスタックに乗っける。複数の画像がいた場合は全部乗る。 -delete スタックから、指定したインデックスの画像を消す。負数を指定すると後ろから。 ハイフンで範囲指定もできる。 -insert スタックの一番上の画像のインデックスを指定したインデックスに変える。 負数だと後ろから。

lighttpd でローカルでいろいろやる場合のテンプレート

あけましておめでとうございます (社交辞令) ってことで、lighttpd で適当にローカルにサーバ立てたりする場合のテンプレートをメモ (新年とか関係ないけどそのくらいのもの)。 Python の http.server モジュールとかでも静的なファイルを見せるとかとおまけの CGI くらいの機能ならあるんだけど、なんかいろいろ足りなかったりするので。 コマンドラインでいい感じになるように起動する デフォルトだとデーモンになってしまってウザい (は?)。 $ lighttpd -D -f path-to-conf.conf FastCGI server.port = 8000 server.document-root = "<適当>" server.modules += ( "mod_fastcgi" ) server.error-handler-404 = "/" fastcgi.server = ( "/" => ( ( "socket" => "<ソケットへのパス>", ) ) ) WebDAV ずっと立てておくわけではないので認証とかはいらないものとする。 server.port = 8000 server.modules += ( "mod_fastcgi", "mod_cgi", "mod_webdav" ) server.document-root = "<見せたいディレクトリ>" webdav.activate = "enable" # ro にしたい場合 #webdav.is-readonly = "enable" これでファイルマネージャとかで dav://localhost:8000 ってやると自分のところにあるファイルが WebDAV 越しに見えて嬉しい (別に嬉しくない)。

readlineの前のリリースとdiff取ってみたり

したけど readline って新機能入ったりしてるのね。 コミュニティが活発な感じは全然しないが……。 ここで見たのは readline-8.0 と readline-8.1 の diff。 見た感じ bracketed paste のサポート強化が目玉機能っぽい。あとはバグ修正とか。 結構修正されてる。 bracketed paste てのは端末が対応してると普通にキーボードから入力されたか クリップボートから貼り付けるられたかを中で動いてるアプリケーションから区別できる機能っぽい。 貼り付け部分の前後にエスケープシーケンスがくっついてくるとかとか……。 最近クリップボードから貼り付けると貼り付けた部分の色が反転する (選択してるみたいになる) なぁ〜と思ってたけど、それはこれが動いてるからな気がする。 最近の端末はリッチだなぁ〜 (なお、そんなに昔は知らん)。 ちなみに手元の GNOME 端末だとこれまた端末を破壊されていて、入力した部分が二重に出たりする。 別の端末で試す気があまりないのでこれもどこがバグってるのか分からんけど。

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

端末が完全に壊れるので困ってる。 数ヶ月この状態が続いていて、僕が .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 の例外が上がる。 (dbus-call-method :session "org.gnome.Shell" "/org/gnome/Shell/Screenshot" "org.gnome.Shell.Screenshot" "ScreenshotWindow" t t nil "/tmp/foo.png") elisp の型とのマッピングだとうまくいかない場合やマッピングされていない型を使っているメソッドを叩く場合、キーワードパラメータで手動で指定できる。

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 のソースいじったりしていろいろやろうと思っている(思いつき)。

Linux on ThinkPadのバッテリー設定をいい感じにする

僕は ThinkPad X1 Carbon の 2019 年モデルを使っていて,少なくとも僕が学生の間は買い換えないつもりでいる。 そこでちょっと気になるのがバッテリーの劣化という面。ThinkPad はバッテリーが取り出せないので 工夫して使わないとバッテリーをいじめる結果になってしまいそうだと思う。 で,ACアダプタにつないだときにバッテリーに充電する閾値を設定する方法。 入れる。 $ sudo pacman -S tlp acpi-call を入れることを薦められたりするが,これはバッテリーの内部ゲージのリセットとかをしようと しない限り必要ないようだ。 tlp-stat というユーティリティも同時にインストールされるので次のような感じで現在の設定値を確認できる。 $ sudo tlp-stat -b まあ確認するだけなら適当なファイル(/sys/class/power_supply/BAT0/* とか)を見れば分かる気がするが。