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} その結果下のようなカルノーマップが描画される。

TikZで論理回路を描く

TikZ を使い始めて間もないのであまりきれいに書けていないかもしれない。 ゲートを自分でゴリゴリ描く必要はなくて,そういった図形は提供してくれている。 プリアンブルに以下を書く。 \usepackage{tikz} \usetikzlibrary{shapes.gates.logic.US} で回路図を書くのは以下。 \begin{tikzpicture} \path (2, 3) node[or gate US,logic gate inputs={inverted,inverted},draw](A1){} (2, 2) node[or gate US,logic gate inputs={inverted,inverted},draw](A2){} (4, 2.5) node[and gate US,logic gate inputs={normal, normal},draw](A3){} (5.5, 1) node[or gate US,logic gate inputs={normal,inverted},draw](O1){}; \draw (A1.input 1) -- ++(-1.5, 0) ++(-0.2, 0.1) node {A} (A1.input 2) -- ++(-1.5, 0) ++(-0.2, -0.1) node {B} (A2.input 1) -- ++(-1.5, 0) ++(-0.2, 0.1) node {C} (A2.input 2) -- ++(-1.5, 0) ++(-0.2, -0.1) node {D} (A1.output) -- ++(0.5, 0) |- (A3.input 1) (A2.output) -- ++(0.5, 0) |- (A3.input 2) (A3.output) -- ++(0.5, 0) |- (O1.input 1) (O1.input 2) -- ++(-5.05, 0) ++(-0.2, 0) node {E} (O1.output) -- ++(1, 0) ++(0.2, 0) node {Y}; \end{tikzpicture} 入力を反転することもできて,inputs に inverted を入れれば良い。 また,縦に描画したい場合は rotate=270 とかする。 各入力と出力には名前がついていて,ゲートに付けた名前.input 入力の順番 と言った感じで 入力,出力からの線を簡単に描画できる。

環境のメモ

どうでもいいけど今の環境 ThinkPad X1 Carbon Arch Linux GNOME 以下,思いついたら追記する。 入れる このへんは base-devel make gcc automake その他 clang cmake Emacs(ビルド) vim(設定いじる時用。あと xxd 目当てで) ninja(mozc のビルドにいる) mozc(自分のリポジトリからビルド) texlive-langjapanese, texlive-latexextra, texlive-pictures poppler-data(poppler とセットで入らない意味がよくわからない) firefox-developer-edition(署名せずに拡張機能使いたい) thunderbird コピーして引っ越さないといけない系 ~/Documents (TeX のゴミファイルは消した方がいいかも) ~/source 以下ゴソッと。~/source/aur はいらない。 ~/.ssh セットアップ SSH 鍵 dotfiles を clone して install .emacs.d を clone 他の設定 gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:nocaps']" gsettings set org.gnome.desktop.wm.preferences button-layout 'close,minimize,maximize:appmenu' Firefox, Thunderbird の言語を日本語に && Wayland を使うことにする。ウェイウェイ いらない desktop entry がたくさんあるので ~/.local/share/applications に /dev/null への symlink をたくさんつくって消す /etc/default/grub をいじって起動時のログを冗長にする GRUB じゃなくて systemd-boot 使えばいいや ibus が起動してくれなかったらなんとかする PHP で SQLite が使えるように設定ファイルを足す(ファイル名は何でもいいけど /etc/php/conf.d/sqlite.ini とかに) 置くやつ on Gist

アクセスログ見たら脆弱性突いてくるアクセスがかなりきていた

アクセスログ見たら脆弱性突いてくるアクセスがかなりきていた。 このサイトはページを返す上で CGI の類いは動いていないのでアプリケーションサーバーであること を前提とした攻撃に対して脆弱性が発生することはないが,これが Linux カーネルや Nginx の脆弱性を突くものだったらと考えるとセキュリティ対策の重要性を思い知らされる。 セキュリティとは別の話にはなるが,聞いたこともないようなクローラもたくさん来ていて クローラが乱立しているなと思う。まあデータマイニングとかその周辺の技術が流行ってるからなあ。

ファイルの読み込みの方法によっては脆弱性が発生しうる

ちゃんと考えれば分かる話なんですが。 struct stat statbuf; if (stat (filename, &statbuf) != 0) { /* stat できなかったら終了 */ return; } if ((statbuf.st_mode & S_IFMT) == S_IFREG) { /* regular file じゃなかったら終了 */ return; } char *buf = malloc (statbuf.st_size); if (buf == NULL) { /* malloc できなかったら終了 */ reutrn; } int fd = open (filename, O_RDONLY); if (fd < 0) { /* open できなかったら終了 */ return; } char tmpbuf[4096]; ssize_t nread; size_t off = 0; while ((nread = read (fd, tmpbuf, 4096)) > 0) { memcpy (buf + off, tmpbuf, nread); off += (size_t)nread; } close (fd); って書くと脆弱性を埋めます(自戒を込めて)。 どこかというと,stat してから open するまでの間にファイルが変更されているかもしれないので, バッファオーバーランやメモリ領域を初期化せずに使うとかいうことになります。