HEY

5月22日にメールを送っていたが,僕のところにもおとといくらいに invitation が来た。 まだ使うか分からないけれどアカウントを作っておいた。メールアドレスが魅力的だなと思って アカウントを作ったが,IMAP などを提供しないということなので UI が気に入らなかったら辛いな。

LaTeXのenumerateで使う文字を変更する

深さNのところをi, ii, iii,… というふうにしたいならば, \renewcommand{\labelnumN}{\roman{enumN}} \romanの部分は選べる。 なまえ すたいる \alph a, b, c,… \Alph A, B, C,… \arabic 1, 2, 3,… \roman i, ii, iii,… \Roman I, II, III,… プリアンブルに書くと文書全体これになるので,一箇所だけに適用したければ enumerate 環境の中で \renewcommand する。おわり。

自然言語で木を表現する

のって難しいよなあ,と。形式的には箇条書きで書くという方法があるけどまともな文章を 書こうとすると書きたいことが高い木っぽくなってると修飾関係が訳わかんなくなる。 たぶん書きたいことがちゃんとまとまっていて,整理するのに十分な推敲しようという気があれば まとめられるんだろうけど箇条書きにするには長くてちゃんと推敲するほど重要でない場合 には文の並べ方がわからなくなる (というのも括弧を乱用するのもなんだかな,と思うので (LISP みたいになって 可読性 (括弧の対応がわかりにくい) が落ちる) (いっそ LISP みたいに(この場合トップレベルをどうするか迷う)書くか))。

WindowsにCMakeのプロジェクトを移植する

UNIX で Makefile 生成してビルドしていたような CMake のプロジェクトを Windows に移植する。 ここでは Visual Studio について言及するとき Visual Studio 2019 を前提とする (というか試せる環境がそれしかない)が多分そこにはそんなに依存していないはず。 とりあえず言えることは,CMake で Visual Studio のプロジェクトを生成する方法は Make を使ったプロジェクトとビルドシステムの設計というか思想が違いすぎてその差異を CMakeLists.txt で吸収するのは無理だと思う(たぶん単純なプロジェクトだと大丈夫だけど凝ったことをしようとすると すぐ詰む)。書くの面倒臭いので飛ばすけど Visual Studio は CMake では Multi-config という扱いになって Makefile とはちょっと違う環境になるので。 というわけで,NMake の Makefile を生成するのが簡単な方法だと

Gitで一部の変更だけをコミットする

全ファイルコミットできる単位でコミットしろよ←わかる 全ファイルをコミットする 一番簡単。だいたいこれでやってる気がする。 $ git add -A 一部のファイルだけコミットする 普通。 $ git add foo.c bar.c baz.c 一部の hunk だけコミットする $ git add -p ってやると hunk を stage するか聞かれるので stage したい hunk で y と答える。 hunk の一部だけコミットする 変更がくっついていると違う内容の変更が 1 個の hunk に入ってしまったりする。 $ git add -p した後に追加したい変更が入っている hunk で e と答える(え?) するとテキストエディタが起動して,diff を編集しろと言ってくる。 で,これは編集しろと言ってくるファイルにも書いてあるが, - で始まる行(削除した行)をなかったことにしたかったら -

Waylandで動いているかXWaylandで動いているか見分ける

小数単位でのスケーリングをしていたら XWayland のアプリケーションは ぼやけているので自明な感じはあるが,面白い(かつ見た目が良い?)見分け方を 見つけたので。 xeyes を起動する。 マウスを動かしてみる。 簡単ですね! マウスをいろんなウィンドウの上に動かしてみて目が動くウィンドウは XWayland, 目が動かないウィンドウは Wayland で動いている。 参考 https://medium.com/@bugaevc/how-to-easily-determine-if-an-app-runs-on-xwayland-or-on-wayland-natively-8191b506ab9a xeyes のソースコード: https://gitlab.freedesktop.org/xorg/app/xeyes

Firefox on Wayland

XWayland だとスケーリングしたときにぼやける問題があるので,Wayland を使うようにする。 今の段階だと MOZ_ENABLE_WAYLAND=1 という環境変数があった場合は Wayland を使う ようになっている。毎回端末から実行すれば当然できるが,それは面倒なのでアイコンをクリックしたときでも Wayland を使う設定で普通に起動するようにしたい。 同じ方法で Thunderbird にも Wayland を使わせることができる。 方法1: .bashrc とかに書く 一番簡単。でも僕はむやみに環境変数足したくない派(全然関係ないプロセスからアプリケーション固有の 設定が見えるのが無駄な感じがする)なのでこの方法はあまり好きじゃない。 方法2: デスクトップエントリーをいじる /usr/share/applications/firefox.desktop を ~/.local/share/applications/ に コピーしてきて Exec の行のコマンドの先頭に env MOZ_ENABLE_WAYLAND=1 を追加す

型ごとの上限・下限

一応型ごとの大きさは規格では決まってない(最小限のビット数はあるけどこれを書いても意味がない) けど x86_64 だったら普通同じになるはず。 Type Bits Max Min signed char 8 -128 127 unsigned char 8 0 255 signed short 16 -32768 32767 unsigned short 16 0 65535 signed int 32 -2147483648 2147483647 unsigned int 32 0 4294967295 signed long int 64 -9223372036854775808 9223372036854775807 unsigned long int 64 0 18446744073709551615 signed long long int 64 -9223372036854775808 9223372036854775807 unsigned long long int 64 0 18446744073709551615 コード #include <iostream>#include <limits>using namespace std; #define LIMIT(type) cout << "`" #type "` | " \ << sizeof(type) * numeric_limits<unsigned char>::digits << " | " \ << +numeric_limits<type>::min() << " | " \ << +numeric_limits<type>::max() << endl; int main() { cout << "Type | Bits | Max | Min" << endl; cout << "-----|------|-----|----" << endl; LIMIT(signed char); LIMIT(unsigned char); LIMIT(signed short); LIMIT(unsigned short); LIMIT(signed int); LIMIT(unsigned int); LIMIT(signed long int); LIMIT(unsigned long int); LIMIT(signed long long int); LIMIT(unsigned long long int); } 浮動小数点数 10進での桁数 type num float 6 double 15 long double 18

LinuxではメモリはCOWになっている(今更)

んだなぁ,と試してて思った。 以下のようなプログラムだとすぐメモリがあふれて死にそう(というか OOM Killer にやられる) な気がするけど実際そうならない。 #include <stdlib.h>#include <stdio.h> #include <unistd.h> int main(void) { size_t alloc = 0; for (;;) { char *mem = malloc(1024 * 1024 * 1024); ++alloc; printf("%zd GiB allocated\n", alloc); sleep(1); } } で,実行して top で見てみてもメモリ使用量はいっこうに増えない。 これを下のように編集すると状況が変わって,リアルにメモリを食い始める。 #include <stdlib.h>#include <stdio.h>#include <string.h> #include <unistd.h> int main(void) { size_t alloc = 0; for (;;) { char *mem = malloc(1024 * 1024 * 1024); memset(mem, 0, 1024 * 1024 * 1024); ++alloc; printf("%zd GiB allocated\n", alloc); sleep(1); } }

GNOME端末にSixelが入るかも?

知らんけど。 なんか今作業中っぽいやつを適当に clone してきてビルドして使ってみた。 ビルドしてインストールされてる GNOME 端末で使う方法を適当に紹介。 ライブラリとかは適当に入れてください。僕は gobject-introspection と vala を追加で入れる必要があった。Ubuntu とかだとヘッダファイルも 入れないといけない気がする。 ソースを落としてくる。僕はここから持ってきた。 https://gitlab.gnome.org/hansp/vte/-/tree/sixel-v5-hpj (けどこれはマージされてもマージされなくても消えるはず) meson _build とかしてビルド用のディレクトリに ninja でビルドするファイルを生成する。 ninja -C _build -j8 でビルド。-j オプションはコア数に合わせるとたぶん良い。 なんかエラーが出たので適当にエラーが出ないように修正。フォーマット文字列と型が一致しな