2017年9月17日日曜日

BibLaTeX で参考文献の表示をカスタマイズする

 最近原稿の参考文献は pBibTeX ではなく Biber+BibLaTeX を使うようになりました。
BibLaTeX はスタイルファイルを書き換えなくとも表示がカスタマイズできるところが美点です。そこで最近やったカスタマイズについてメモを残します。

前提として,ACM のスタイルファイルで \bibliographystyle{abbrvnat} を使ったときに表示を近づけようとしています。そこで,パッケージの設定は次の通り。
\usepackage[backend=biber,style=trad-abbrv,natbib=true]{biblatex}

doi や URL を表示しない

私は Mendeley を文献管理に使っており,なるべく得られた情報はすべてデータベース化しておきたいという考えの持ち主でもあるので,doi や PDF の URL も記録しているのですが,その全てを原稿中で表示したいわけではないため,次のようにしました。

会議名の先頭に In Proc. of を付けたい

会議名は会議名として記録・分類したいので,会議名の頭に In Proc. of とか In Proceedings of を付けて周るようなマネはしたくありません。とはいえ,それは Mendeley での管理の話で,原稿の中では会議の名前にだけ In Proc. of というのを付けたいです。しかし,このスタイルのデフォルトだと会議でも論文誌でも In Booktitle となるようなので,今回は \renewbibmacro{} を使い in: という bibmacro を変更します。

会議名と会議の略称の体裁

最後に,これは私固有の問題ですが,Mendeley で会議名を Proc.Title,略称を Series に入れて管理していると,BibTeX ファイルにはそれぞれが booktitle と series に入れられます。これは,
Book Title, Series,
と表示されますが,これを
Book Title (Series),
にしたいので,$TEXMF/tex/biblatex/biblatex-trad/trad-standard.bbx にある定義を参照しました。これによると,inproceedings の時の会議名の表示は series+number:emphcond という bibmacro で定義されていたので,エントリのタイプが inproceedings の時だけ表示を変え,そうでないときは元の定義をそのまま使うようにしました。

以上より,次のような結果を得られます。

元の表示

あふたー

2017年9月7日木曜日

QEMU のイメージファイルの特定のパーティションをホストにマウントする

こういうときだいたいみなさんlosetupコマンドで loopback device にして mount すると思います。raw ディスクだとそれでも良かったりしますが,qcow2 の 3 番目のパーティションをマウント,とかやろうとすると少し厄介。

これは次のようにして解決できます。
# modprobe nbd
# qemu-nbd --connect=/dev/nbd0 ./target.qcow2
まずこれで /dev/nbd0 がブロックデバイスとして使えるようになります。ここで,
# fdisk -l /dev/nbd0
Disk /dev/nbd0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x97d8dd27

Device Boot Start End Sectors Size Id Type
/dev/nbd0p1 * 2048 206847 204800 100M 83 Linux
/dev/nbd0p2 206848 1202175 995328 486M 82 Linux swap / Solaris
/dev/nbd0p3 1202176 16777215 15575040 7.4G 83 Linux
これで 3 番目のパーティションは 1202176 セクタ目から開始していて,セクタサイズが 512 bytes であることが読み取れるので,3 番目のパーティションは 1202176 * 512 = 615514112 byte 目から始まることがわかります。
従って,
# mount -o offset=615514112 /dev/nbd0 /mnt
これでマウントができます。
ここまで書いて気がついたがfdiskを実行してから offset を指定するまではシェルスクリプトで自動化できそうですね。
例えば 3 番目のパーティションの offset byte を知りたい場合,
expr \
$(fdisk -l /dev/nbd0 | grep -A 10 'Device\s*Boot' \
    | sed -n '3p' | awk '{print $2}') \
\* \
$(fdisk -l /dev/nbd0 | grep 'Sector size'
    | cut -d' ' -f 4)
これで求まりますね。


ちなみに,/dev/nbd0 からイメージを取り外す時は,
# qemu-nbd --disconnect=/dev/nbd0

tmux や NeoVim に U+001B [2 q や U+001B [6 q が出現する

表題通り。
色々あって GNOME Extension の Drop-down terminal じゃなくて Guake に戻してみたらヘンなモノが出てきて戸惑った。

これは,
NVIM_TUI_ENABLE_CURSOR_SHAPE not respected when using neovim within tmux · Issue #4541 · neovim/neovim
https://github.com/neovim/neovim/issues/4541
この問題を解決するためにかつて tmux.conf に次のような設定を加えていたせいだった。
set -g -a terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
たしかに [2 q とか書いてますね……。

P.S.

escape character (001B) in prompt · Issue #6041 · neovim/neovim https://github.com/neovim/neovim/issues/6041
関連しそうな Issue。
$NVIM_TUI_ENABLE_CURSOR_ を 0 にしてる。

2017年9月6日水曜日

Pandoc で日本語を含む Markdown から PDF を生成することをラクにしようとした

ちょっとした議事録とかメモをプレインテキストでサクっと取るのには Makrdown はそこそこ便利である。
ただプレインテキストのままだた読みづらいので PDF にしたい。
とはいえ,がっつり手をかけてするほどのことはしたくない。
そういうときに,どうするか。

Pandoc というプロダクトを使えば,内部で LaTeX エンジンを噛ませるものの,簡単に PDF producing が可能である。
ただし Pandoc は海外プロダクト,日本語はそのままでは対応しないため,pandoc コマンドに --latex-engine オプションで XeLaTeX や LuaLaTeX を指定することで,日本語対応させる。

すると次には,フォントを Latin Modern と IPA フォントではなく,もうちょっとマシなものにしたいというのが人情。
しかし,Pandoc Markdown ではそれをするために,
---
- header-includes:
    - \usepackage{luatexja-otf}
    ...
---
などと Markdown の先頭に yaml 形式で TeX のプリアンブルをずらずらと書く必要がある。
Markdown に書き込まず別に TeX ファイルを用意し,pandoc コマンドに -H オプションで渡すという手段も存在する。
が,目的は小さな重要度の低い Markdown を PDF にすることであって,手の込むことはしたくない。
フォントの設定のコマンドはたいした量じゃないとはいえ毎度 Markdown の先頭に書く,これもよろしくない。

そこで解決策,次のようなシェル関数を用意して,ログインシェルの rc ファイルに書いておきました。

これでちょっと幸せになった気がする。

sgi のワークステーションは DB13W3 という形式の VGA プラグを使うので困った話

2 年前から温めたままブログに書きそびれてたネタです。

@syuu1228 せんせーから sgi の Octane を譲ってもらったのだが,ディスプレイに接続するのに特殊なプラグが必要だった。
DB 13W3 と言うらしい。
https://en.wikipedia.org/wiki/DB13W3

この 13W3,Sun のワークステーションと sgi のワークステーションでピンアサインが違うらしい。
そして,オークションにでは Sun 用の 13W3 to VGA ケーブルしか見かけない。そこで,

c.f.) http://phaq.phunsites.net/2006/08/25/using-a-sun-13w3-vga-adaptor-on-a-sgi-indy/
この通り,1, 2, 4, 5, 6, 7 番の pin を接続できないようにすれば良いらしい。
また,このワークステーションは通常 Sync-on-Green といい,映像同期信号が緑の映像信号に重畳されてるので,VGA に変換するには同期信号を取り出して変換する回路が必要である。
そのためには,LM1881N という IC がひとつあれば,同期信号がどうやら取り出せるようであった。しかし回路をつくるのは面倒である。 ここで運の良いことに,
なんと譲ってもらったワークステーションに結構なグラフィックボードが積んであり SoG ではなく普通に同期信号が出ていた。便利……。

pipe と fd のフラグ

さいきんブログを書いていないと思ったら今年に入ってから更新をしていなかった。
覚えている部分からとりあえず気がついたことをメモしておこうと思う。

今回は pipe と fd のフラグについて。

Linux ほか *nix のシステムではpipe(2)というシステムコールでプロセス間通信用の fd を作成できる。

このパイプの fd にはO_NONBLOCKというフラグを立てたり消したりすることが可能である。
つまり,パイプはノンブロッキングに読める。
手元の ArchLinux で Linux 4.12,glibc 2.25 を使ってるとデフォルトでこのフラグが立ってたっぽくて予想してない挙動に気がつかなくてハマった。

フラグの確認方法は,
#inlude <fcntl.h>
...
fcntl( fd, F_GETFL );
この返却値を調べれば良い。
逆にフラグをセットするならば,
#include <fcntl.h>
...
fcntl( fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK );
のように取得したフラグに立てたいフラグを追加すれば良い。
フラグの消去もまた同様。




O_NONBLOCKが立てられていた場合について。
この場合,fd をread(2)で読むと,まだ何もデータが到着していない場合,read(2)は -1 を返却する。
なので,
while( read( fd, buf, sizeof(buf) ) > 0 ) {
...
などという手抜きコードを書いているとread(2)はブロックしないので何も読まずに終わることがある。
この場合,
for(;;) {
    ssize_t read_size = read( fd, buf, sizeof(buf) );
    if ( read_size < 0 ) {
        if ( errno == EAGAIN ) { continue; }
        else { break; }
    } else {
...
という風にread(2)の返却値が正の値じゃない場合かつerrnoEAGAINが入っていた場合もきちんとフォローしましょう。
ただ,この例のように continue するだけならそもそも読み出しでブロックさせとけば良いので,元よりフラグを消しておけば済む話である。

これに気がつかずにわりとハマりました。