Tech

GNOME端末にSixelが入るかも?

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

awkなしでフィールドを切り出す

スペース区切りの出力から特定のフィールドを取り出す方法といったらだいたい cut か awk ってことになると思うんですが,フィールドを取り出すためだけに awk を起動するのもなー と思う。で,cut を使おうとするが,これが空白の連続に対応できない。 よくあるプログラミング言語の split 関数みたいな感じだなと。 で結論から言うとっていうか結論を言ったらこの投稿は終了なんだけど,以下のようにする。 $ your-command | tr -s ' ' | cut -d ' ' -f2 これでも先頭に空白がある ps の出力とかは謎の 2-index みたいになってしまうけど まあ妥協。変えたかったら sed とかで頑張ればいいと思うけどそこまでやる価値があるのかは不明。 あとオプションと引数をつなげると文字数減らせるハックなど(無駄) $ your-command|tr -s \ |cut -d\ -f2

CMakeのExternalProject

これで良いのかは分からないが,まあ動くっぽいのでヨシッ! 厳密なこと言うといくらでもダメな状況ってのが出てきそう。 cmake_minimum_required(VERSION 3.15) project(ext_sample CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_STANDARD_REQUIRED ON) include(ExternalProject) ExternalProject_Add(zlib_project URL https://zlib.net/zlib-1.2.11.tar.xz CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PROJECT_SOURCE_DIR}/zlib) ExternalProject_Add(libpng_project URL https://download.sourceforge.net/libpng/libpng-1.6.37.tar.xz CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PROJECT_SOURCE_DIR}/libpng) add_library(zlib IMPORTED SHARED) set_target_properties(zlib PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/zlib/lib/libz.so) add_library(libpng IMPORTED SHARED) add_dependencies(libpng zlib) set_target_properties(libpng PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/libpng/lib/libpng.so INTERFACE_INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/zlib/include INTERFACE_LINK_LIBRARIES zlib) find_package(Threads) find_package(Boost COMPONENTS unit_test_framework) add_executable(mcmap) target_include_directories(mcmap PRIVATE ${PROJECT_SOURCE_DIR}/libpng/include ${PROJECT_SOURCE_DIR}/zlib/include) target_include_directories(mcmap PRIVATE ${CMAKE_BINARY_DIR}) target_link_libraries(mcmap PRIVATE zlib libpng ${CMAKE_THREAD_LIBS_INIT}) add_subdirectory(block) add_subdirectory(src) で試しに ldd で見てみる。 $ ldd build/mcmap linux-vdso.so.1 (0x00007fffbf7f6000) libpng16.so.16 => /tmp/foo/libpng/lib/libpng16.so.16 (0x00007f3a7ffea000) libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f3a7ff9c000) libz.so.1 => /tmp/foo/zlib/lib/libz.so.1 (0x00007f3a7ff7b000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f3a7fd9e000) libm.so.6 => /usr/lib/libm.so.6 (0x00007f3a7fc59000) libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f3a7fc3f000) libc.so.6 => /usr/lib/libc.so.6 (0x00007f3a7fa76000) /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f3a8007c000) あといい感じに install を書きましょう(こんな方法が必要なのは Windows でのビルドだけのような気がするが)。 まあ実際に使うときは最初に find_package してみてダメだったらフォールバックする って感じにするかなと。 そういや最近 Windows の winget ってのが発表されましたね。

WindowsでCMakeのプロジェクトをビルドする

Visual Studio 入れて試してみたら簡単だった(今まで MSYS2 入れて UNIX Makefile を生成してビルドしていた). 基本的には root の CMakeLists.txt があるディレクトリを Visual Studio の「フォルダを開く」的な メニュー(プロジェクトを開くに非ず)から開けばいい感じに cmake を実行するところまでやってくれる. ただちょっと困っているのが pkg-config がないことだ. もっとも Windows にはシステムに1つライブラリを入れて多数のアプリから使うという 習慣がなさそうに思われるので,システムに入っているという状況が普通ないというのは理解できるのだが. しかし依存関係しているライブラリを全部 CMake でダウンロードしてビルドして,というのは流石に 面倒臭すぎる.どうにかならないものだろうか. MSYS2 でビルドする場合だと,(あの空間は *nix 的な設計がされているので)pkg-config で依存するライブラリのインクルードパスやライブラリの設定ができた. そして,ldd とかで依存しているライブラリを調べてそれらと一緒に他の環境に持っていけば 問題なく動作させることができた(というのも Windows はライブラリを探すときに最初にその executable があるパスを探すので).

ThinkPad X1 Carbon

買ったの書いてなかった. Lenovo の ThinkPad X1 Carbon (7th Gen) を買った.価格は税込みで 21 万くらいだった. 14インチで1キロ強というのはやっぱり軽くていいなと思う. まあまだ外に持ち出したことないけど. 主な構成 CPU: Intel Core i7 10510U メモリ: 16 GB ストレージ: 512 GB NVMe ディスプレイ: 1920x1080 キーボードは英語(どうでもいいけど何故か金取られるので書かずにはいられない) 正直言ってあまりストレージやメモリを使うことをやってないのでメモリ 16 GB とストレージ 512 GB はオーバースペックな気がするが,まあそこ気づいていないことになっている. で,買った段階では OS が入っていないので(Windows?知らない子ですね)ArchLinux を入れた. 僕は面倒な環境構築はすっ飛ばしたい派なので ArchLinux を入れて面倒くさいことを することを目的としているわけではなくて,単に新しいバージョンのがバイナリ配布で入る 便利ディストロとして ArchLinux を使っている.まあパーディション分けるときに 迷うくらいで構成決まってればインストールそんなに大変じゃないよね. パーティションはめんどくさいので ESP だけ分けて他は1つのパーティションという 雑運用がされている.

iBusのアップデートでGNOMEのIMEの問題が直った

GitHub のプロジェクトのページを見ている感じではリリースは夏ごろかなと思っていたのだが, 今日 ArchLinux でアップデートが来た. Wayland でインプットメソッドが使えない問題も直ったので,Xorg から Wayland に切り替えることができた. Wayland に切り替えて何が嬉しいかというと,割と簡単に小数単位のスケーリングができることだ. 先日,ThinkPad X1 Carbon が届いたのだが,今回はちゃんとフルハイの解像度のを選んだので 画面の表示が小さすぎて辟易していた.それで今日のアップデートで大きく表示できるようになったので 快適になった. ただ,この小数単位でのスケーリングは問題もはらんでいるようで,GNOME のアプリ以外の多くのアプリは の解像度が低いままで拡大されてしまう.たぶん GTK のバージョンの問題だと思うが.

Linux 環境で適当にサンドボックスする

入れる. $ sudo pacman -Ss firejail 再起動する. 試しに Bash を実行する. $ firejail bash 一見普通に Bash が起動したように見えるが, ps aux とかやってみると普通じゃないことが すぐに分かって,他のプロセスが見えない. $ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND kofu 1 1.5 0.0 4952 2612 pts/2 S 22:58 0:00 firejail bash kofu 3 1.5 0.0 9368 4884 pts/2 S 22:58 0:00 bash kofu 5 0.0 0.0 9844 3084 pts/2 R+ 22:58 0:00 ps aux でもこれだとホームディレクトリへの読み書きとかは普通にできる. それが嫌だったら --private をつけてやると,何もない tmpfs がホームディレクトリにマウントされる. おしまい.

PDFやWordファイルのテンプレートでもLaTeXでなんとかする

Word ファイルの場合,仕方ないので Microsoft Word とかで PDF に変換しておく。 LibreOffice とかでも一応 PDF は出てくるけどけっこう崩れる。 で,テンプレートファイルが PDF になったのでこれを1ページ1ファイルに分解する。 $ pdfseparate foo.pdf %d.pdf pdfseparate コマンドがない場合は poppler とかを入れる。 で以下のようにして背景に PDF を埋め込む。 \documentclass[uplatex,dvipdfmx]{jsarticle} \usepackage{wallpaper} \pagestyle{empty} \begin{document} \ThisCenterWallPaper{1}{1.pdf} ここにいろいろ書く \end{document} \pagestyle{empty} でページ番号を消す。 面倒くさいけど \vspace とかでテンプレートに合わせつつなんとかする。 余白が大きすぎる場合は geometry とかで調整する。 jsarticle を使う場合,フォントのサイズを調整すると背景がずれる(縮小して拡大するみたいな実装なので)ので, デフォルトにしておいて必要に応じて \fontsize{12pt}{0pt}\selectfont とかで調整する。

GNOME Shell 3.36 で IBus が使えない対処

IBus が自動起動しない(というか起動はしてるけど使えない)のは Wayland のときだけらしい。 たしかに GNOME on Xorg のセッションにすると問題なく IBus が GNOME Shell から 使えるようになっている。 この原因は,Unix ソケットを作るときに Xorg のときは DISPLAY 環境変数を見て, Wayland のときは WAYLAND_DISPLAY 環境変数を見ないといけないところを, IBus はどちらの場合も DISPLAY を見ているというところにあるらしい。 今まで Wayland でも動いていたということは GNOME Shell の実装が非標準だった ということだろうか(よく分からない)。 https://github.com/ibus/ibus/pull/2195 この PR で直っているみたいなので IBus の次のリリースには GNOME Shell on Wayland でも IBus が動くようになっているはず。 それまでは Wayland じゃなくて Xorg 使うか……。 そういえば ibus-daemon -drx とすれば wayland でも IBus が使えるようになる のだが,なぜか Firefox が既に起動していた場合は Firefox 上だけで IBus が機能しないので実用上問題があった。

LaTeXでカルノーマップを描画する

kvmap というパッケージが TeX Live にもともと入っていて,それを使えば簡単にカルノーマップを描画できる。 基本的な使い方は以下。 \documentclass[uplatex,dvipdfmx]{jsarticle} % カルノーマップの描画に必要 \usepackage{graphicx} \usepackage{kvmap} \begin{document} \begin{kvmap} \begin{kvmatrix}{A,B,C.D} 1 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ \end{kvmatrix} \bundle{0}{1}{1}{2} \end{kvmap} \end{document} ちゃんと例を書くのが面倒なので一箇所しか囲んでいないが, \bundle{x1}{y1}{x2}{y2} とするとその範囲に丸い囲みが描画される。 多分ここは完成した画像貼った方がいいんだろうけど面倒なので省略。 あとcolor=...を与えてやると色を変えたりとかも簡単にできる。 問題はここからで, \bundle[invert=true]{...} ってやると端と端を囲むことができるのだが, 例えば以下のような例だと縦の囲みか横の囲みかで曖昧になる。 \begin{kvmap} \begin{kvmatrix}{A,B,C} 1 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 \\ \end{kvmatrix} \bundle[invert=true]{0}{0}{3}{1} \end{kvmap} その結果下のようなカルノーマップが描画される。