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 するまでの間にファイルが変更されているかもしれないので, バッファオーバーランやメモリ領域を初期化せずに使うとかいうことになります。

GNOME 3.36 に更新したら ibus-mozc が動かなくなったので対処した

ibus-daemon(1) が起動していないことが原因らしい。 ビルドし直せば治るかなと思って GNOME の設定から mozc を消してしまったので デバッグできなくなっていた。 とりあえず,これが解消するまでは自分で systemd のユニットファイルを作って 自動起動してやることにした。 ちゃんと起動するようになったらバグるかもしれんが, まあそのときはなんとかして disable すればなんとかなるやろ。 https://gist.github.com/kofuk/4ef7b0baec48f1af2e6f5561fda89f98

マップ画像生成の最近の更新など

最近全然書いてなかったけど,いろいろ変えたのでまとめておくことにしました。 最近の更新はおおまかに分けて次の3点です。 パフォーマンスの改善 処理のパイプライン化 その他機能追加 パフォーマンスの改善 やることを減らすってのが一番の高速化の方法なので,いろいろ処理を省けるようにしました。 最初の愚直な実装から4つくらいやることを減らしています。 1つ目が更新していないチャンクを再描画しないというもので,これはチャンクの LastUpdate というタグを見て判定しています。LastUpdate の値を region ファイルごとに ファイルにダンプしておいて,次の再描画の時に LastUpdate の値がそれよりも 大きくなっていたら再描画して,そうでなかったら省くという感じになっています。 前の描画内容に上書きするために,もとのファイルを読むという処理が追加されているので, PNG のデコードとか走るんですが,チャンクを再描画するほうがずっと遅いので 問題ないです。あと,更新されているチャンクがあって初めてもとのファイルを開く ことにしているので,画像の範囲の中で更新されているチャンクが1つもない場合は 画像ファイルに触りもしないということになっています。