Tech

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つもない場合は 画像ファイルに触りもしないということになっています。

比較演算の結果の値

C の比較演算の結果で,true の場合は 1 で false の場合は 0 っていうのが常識的な 挙動のような気がするけど,未規定とかじゃなくてちゃんと決まっているのか, 前から気になっていたのでちゃんと調べた。 素直に検索しても出なかったけど,ちゃんと規格(に近いもの)を見に行ったら 簡単に書いてあるのが見つかって,どうやら true が 1 で false が 0 になるってのは 決まってるっぽい。 つまり,以下のコードは環境に依存せずに 2 を出力する。 #include <stdio.h> int main(void) { int num = (0 == 0) + (0 == 0); printf ("%d\n", num); return 0; } あと,結果の型は int。 参考 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

C で Hello, world!

なんじゃこりゃ %:include <stdio.h> int main(void) <% char str<::> = "Hello, world!"; printf("%s\n", str); return 0; %> これが $ gcc main.c コンパイルすると $ ./a.out Hello, world 動いてしまう。 <:, :>, <%, %>, %:, %:%: の6つのトークンは, [, ], {, }, #, ## と同じように解釈されるらしい。 なんじゃそりゃ。 参照 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

SVG でターミナルを録画できる termtosvg

いろんなワードで pacman -Ss してみて眺めていたら,termtosvg というやつを 見つけたので試してみた。 結論:すごい。ただ alternative screen buffer ができないみたい。 ソース見たら CSS で表示位置をずらしてアニメーションしているように見せているっぽい? よくわからぬ。