DoxygenのLaTeX出力で日本語を使う(LaTeXスタイルシートで)

以下のサイトなどを参考にして、DoxygenLaTeX出力のPDFが文字化けするのを回避するためのLaTeXスタイルシートを作成し、GitHub に公開しました。

- DoxygenのLaTeX出力で日本語を使う - イグトランスの頭の中
- DoxygenのLaTeX出力で日本語を使う(2015年版) - イグトランスの頭の中
- LaTeX の「アレなデフォルト」傾向と対策
- hyperref - TeX Wiki
- Doxygenの設定メモ — MindTo01s

参考にしたサイトとの違いは、Doxygenが出力したファイルを編集せずに、Doxygenの設定ファイルDoxyfileにファイル名を書いておくだけで、日本語PDFの文字化けなどを回避できる点です。

同時に、Doxyfile で PDF_HYPERLINKS を YES にしたときに、リンクが有効にならず参照場所から定義場所へのジャンプができない問題も解決するようにしています。

これは、Doxygenのリンクの出力が hyperref.sty パッケージの \hyperlink マクロを使用しているためで、 \hyperref マクロに変更するとジャンプできるようになります。この変更も、この LaTeX スタイルシートで行うようにしています。

Raspberry Pi 3 で ppp を使って IIJ mobile に接続する

Rsapbian jessie で IIJ mobile に 3G モデムを使って接続するのに苦労したのでメモを残しておきます。

  • Raspberry PiRaspberry Pi 3 に Raspbian jessie をセットアップしました。
  • IIJ mobile は、法人向けのモバイルサービスです。

ネットでは、接続する方法は wvdial を使う方法が多く存在しましたが、pppconfig を使って設定した pppd を使用しました。

pppconfig で接続用スクリプトを作成する

  1. Create a connection を選択。
  2. Provider Name にプロバイダ名を入力。ここでは iijmobile としました。
  3. Configure Name Servers (DNS)Dynamic を選択。
  4. Authentication Method for <プロバイダ名> では PAP を選択。
  5. User Name にプロバイダから指定されたユーザ名を入力。
  6. Password にプロバイダから指定されたパスワードを入力。
  7. Speed460800 を入力。
  8. Pulse or ToneTone を選択。
  9. Pone Number*99***1# を入力。
  10. Choose Modem Config MethodNo を選択。
  11. Manually Select Modem Port/dev/ttyUSB2 を入力。
  12. Finished Write files and return to main menu. を選択。
  13. Ok を選択して終了。

/etc/ppp/peers/etc/chatscripts の下に 2. で入力したプロバイダ名の設定ファイルが作成されます。
/etc/ppp/pap-secretsUser Name と Password で入力した内容が保存されます。

chatscript を編集する

/etc/chatscripts/iijmobile# modeminit の次の行を以下のように変更します。
3G モデムは富士ソフトの FS01BU を使っています。

...
# modeminit
'' ATH
OK 'AT+CFUN=1'
OK ATZ
OK 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0'
OK 'AT+CGDCONT=1,"IP","<APN名>"'
# ispnumber
...

peer を編集する

/etc/ppp/peers/iijmobile の最後に以下を追記します。

persist
replacedefaultroute
iijmobile 用の設定を追加する

/etc/ppp/peers/iijmobile の最後に以下を追記します。

IIJ mobiel は PAP で認証しないと IP アドレスを割り振ってくれないようです。Raspbian jessie の pppd 2.4.6 は、なぜか以下の指定をしないと、最初に CHAP での認証を要求します。しかし、IIJ mobile では CHAP でも認証は通ってしまいますが、CHAP でログインすると IP アドレスを割り振ってくれないようです。

また、 オプションで明示的に +pap を指定すると、パスワードが見つからないという pppd のエラーになってしまいます。

そこで PAP 以外の認証方式を使用しないように設定します。

refuse-chap
refuse-mschap
refuse-mschap-v2
refuse-eep

pon で接続

$ sudo pon iijmobile

poff で切断

$ sudo poff

起動時などに自動的に PPP 接続するための設定

Raspberry Pi の起動時や、3G モデムが挿入された時に自動的に接続するための設定を行います。

/etc/network/interfaces に以下を追加して、仮想のネットワークインタフェース wwan0 を用意し、PPP 接続と紐づけます。

allow-hotplug wwan0
iface wwan0 inet ppp
    provider iijmobile
手動でネットワークインタフェースを ifup/ifdown して接続テスト

wwan0 ネットワークインタフェースを ifup することで、PPP 接続が開始します。

$ sudo ifup wwan0

wwan0 ネットワークインタフェースを ifdown することで、PPP 接続が終了します。

sudo ifdown wwan0

デバイスが挿入された時に PPP 接続を開始する

/etc/udev/rules.d/40-fs10bu.rules に以下を記述します。

KERNEL=="ttyUSB*",\
  GROUP=="usb",\
  ATTRS{../idVendor}=="1c9e",\
  ATTRS{../idProduct}=="6801",\
  ATTRS{bNumEndpoints}=="02",\
  ATTRS{bInterfaceNumber}=="02",\
  SYMLINK+="ttyFS01BU",\
  ENV{SYSTEMD_WANTS}+="ifup@wwan0"

接続を開始するようのと同時に、3G モデムを認識した時にそのデバイスファイルに ttyFS01BU と言うシンボリックリンクを作成するようにしています。

これは、FS01BU 以外の USB シリアルデバイスが挿入されている時に、ブート時の認識順によってデバイスファイル名が変わってしまう場合に対応するためです。

/etc/ppp/peers/iijmobile のシリアルポート名を /dev/ttyUSB2 から /dev/ttyFS01BU に変更しておくと良いでしょう。

Android Studio で Hamcrest の closeTo マッチャーを使いたい

モジュールの build.gradle ファイルの dependencies に以下を追加する。hamcrest.org からライブラリをダウンロードするまでもありません。

dependencies {
  // ...
  testCompile 'junit:junit:4.12'
  testCompile 'org.hamcrest:hamcrest-library:1.3'
}

もう一つの方法(追記)

「File > Project Structure」で開いたダイアログでモジュールの設定の Dependencies タブを選択し、「+」ボタンをクリックして「1 Library dependency」を選択すると「Choose Dependency」ダイアログが表示されます。そこで org.hamcrest を検索するとライブラリがリストアップされるので、そこから選びます。

そして、モジュールの build.gradle ファイルの dependencies に挿入された org.hamcrest の行の先頭を compile から testCompile に変更します。

なぜ closeTo を使いたいのか

JUnit4 で浮動小数点の比較をするアサーションを書くとします。

    assertThat(2.32 * 3, equalTo(6.96));

とすると、成功するように見えて失敗します。浮動小数点の演算で「2.32 * 2」が 6.95999999999 となってしまうためです。
そこで、ある程度の誤差を見込んで:

    assertTrue(Match.abs((2.32 * 3) - 6.96) < 0.0005);

のようにすることもできます。が、これでは失敗したときのメッセージも分かりにくくなります。
そこで Hamcrest の closeTo() というマッチャーを使えば:

import static org.hamcrest.number.IsCloseTo.*;
    // ...
    assertThat(2.32 * 3, closeTo(6.96, 0.0005);

と書けるようになります。

ANKER 2-port Turbo Car Charger

だいぶ前に買ったはいいものの、使わずにいて部屋の片隅に放置していたもの。
まあ、普段から車も乗らないので、いざという時のために買ったンだけどね。

最近の ANKER の Car Charger だと、 Power IQ という機能が搭載されていて、接続している機種を自動的に識別できるようだけど、これは古いタイプなので接続する機種によってポートが分かれてる。 Power IQ 搭載のものは次のものみたい。