読者です 読者をやめる 読者になる 読者になる

TeX Live 2016とLuaTeX-jaに関する備忘録

久しぶりにTeXの環境構築を行ったのでそのメモ。

W32TeXからTex Live 2016への移行

 前回はTeXインストーラ3で環境構築を行ったが、今回はTeX Live 2016を用いることにする。
 なお、Tex Live 2017が2017-05-01にリリース予定であり、そちらではLuaTeXが1.0になるようなので、急ぎでないならそちらを待ってからインストールするのがいいかもしれない。

 Installing TeX Live over the Internet - TeX Users Groupからinstall-tl-windows.exeをダウンロードしてインストール。時間はかかるけど詰まるところはない。

LuaTeXでの日本語環境

 pTeXと同等(互換ではない)の環境を目指して、LuaTeX-ja環境が整備されつつある。

\usepackage{luatexja}

ja.osdn.net

 LuaTeXではjsclasses文書クラスは利用できないので、代替としてltjsclassesが利用できる。
 また、確認していないがBXjsclsBXjscls - TeX Wiki)も利用できるようだ。

 フォントについてはluatexja-fontspecを利用して、英文、和文のそれぞれについて指定できる。

\usepackage{luatexja-fontspec}

\setmainfont[Ligatures=TeX]{TeXGyreTermes}
\setsansfont[Ligatures=TeX]{TeXGyreHeros}

\setmainjfont[BoldFont=IPAexGothic]{IPAexMincho}
\setsansjfont{IPAexGothic}

 プリセットも用意されていて、latexja-presetから利用できる。

\usepackage[ipa]{luatexja-preset}

 ルビ、傍点はluatexja-rubyパッケージ。

\usepackage{luatexja-ruby}

LuaTeX-ja環境での縦書き

 縦書きの文書クラスとして、ltjtarticle.clsltjtreport.clsltjtbook.clsが利用できる。

fugenji.org

 ところでluatexja-presetexpertオプションを設定してもダブルクオーテーションはダブルミニュートにならないのだけど、これはどうすればいいのだろうか。

PDF出力時の見開き方向

 Acrobat Readerで見開き表示をするときの綴じ方向を指定するためにはhyperrefパッケージを使う。

\usepackage[pdfdirection=R2L]{hyperref}

個人的な規約

 バックノウハウ感しかない。

------ %ダーシ
\vspace{1em} %空行

% 上下余白調整
\usepackage[top=20truemm,bottom=10truemm]{geometry}

% openright時用の綴じ側余白調整
\setlength{\oddsidemargin}{-1in} %  set real left margin 0pt
\setlength{\evensidemargin}{-1in} % do
\addtolength{\oddsidemargin}{15mm} % odd page 25mm left margin   
\addtolength{\evensidemargin}{25mm}% even page 15mm left margin

\noindent「行頭の括弧はnoindentで対処する」

TrueTypeフォントパーフェクトコレクション』

改訂6版 TrueTypeフォントパーフェクトコレクション (デジタルBOOK)

改訂6版 TrueTypeフォントパーフェクトコレクション (デジタルBOOK)

 有名どころのフォントが破格値で手に入るすぐれものです。詳しくはリンク参照のこと。
 ちなみに好きな字体はFrutiger、Avenir、Optima、Palatino、Gothamあたりです。Macintoshがほしい。

blog.bi3.jp

 このフォントをTeXで使うにはTrueType Fonts Perfect Collectionの指示に従えばいい、はずなのだけれど、前の環境でうまくいったこれが今回の環境だとうまくいかない。
 サンプルファイルをplatexにかけてdviファイルを作った後、dvipdfmx -f bitstream.map filenameすればpdfはできるのだけれど、何が悪いのだろうか。

カシオ MQ-24-1E

 一時期、BRAUNの腕時計が欲しかった。

 BRAUNというのはあの髭剃りや電動歯ブラシで有名なドイツの家電メーカーのBRAUNで、かつては目覚まし時計や腕時計を作っていた。目覚まし時計ではAB1、腕時計ではAW10(初代MR2ではない)が最も知られているだろうか。

Braun AG Armbanduhr.jpg
By Banffy - Own work, CC BY-SA 3.0, Link

 正確に言えば、今もBRAUNブランドの時計は売られている。でもこれはライセンスを受けた別の企業が作っているものだ。

BRAUN(ブラウン)公式サイト|腕時計・クロック

 オリジナルを買い逃した私は、数年越しのBRAUNブランド復活に大いに喜んだ。でも、アキヨドのショーケースを何度も眺めたにも関わらず、私がそれらを買い求めることはなかった。
 現代風にアレンジされたコレクションは全体的に大きくなっていた。デザインに関しても、どこか好みから外れてしまったという思いが拭えなかったのだ。


 話は変わって。最近、腕時計を買った。
 買ったのはカシオのMQ-24-1E。好みを優先して国内モデルにない色を選んだけど、それでもAmazon.co.jpから簡単に入手できる。

 そうして思ってしまったのだ。腕時計、これでいいのでは?

 確かにこの時計には高級感のかけらもない。
 ケースもバンドもただの樹脂だ。タイマーも時報もストップウォッチもカレンダーさえついてない。ただの3針時計。精度に関しても、セイコーシチズンが誇る年差クォーツのようにはいかないだろう(ところでこの時計はシチズン系列であるミヨタのムーブメントを使っているらしい。サプライチェーンは複雑怪奇なり)。
 でもそれは当たり前だ。なにせ2000円でお釣りがくる値段しかついていないのだから。 

 私は腕が細い。腕周りで言うとおそらく15 cm程度しかない。一般的な38 mmの腕時計でさえ大きすぎる。近年の主流である40 mm以上なんてもってのほか。そのような人間にとって、直径33 mmに過ぎないケースは小さすぎる、という批判はまったく当てはまらない。
 小さい、薄い、軽い。一応防水していて、なにより壊しても惜しくない、使い捨ててしまってもいいんじゃないかと思えるくらいの気楽さ。
 そして、何よりこれ以上切り捨てることも難しいほどにシンプルなミニマルデザイン。この時計を眺めていると、BRAUNの時計でなくても、これでいいんじゃないかって思ってしまう。そんなデザイン音痴なことを言ってるとDietrich LubsやDieter Ramsに殴られるのでは?

 そういうわけで私は最低クラスの価格帯で売られているこの時計を結構気に入ってしまったのだ。
 使い捨てだなんてとんでもない、壊れるまでは付き合ってみたいと、今のところは思っている。
 でもまあ、5万円以上する腕時計なんて持ったことがないし、持ったら持ったで、またその時にこの気持ちはいとも簡単に変わってしまうのだろう。

広告を非表示にする

CUDAスタート以前いろいろ

つまらないことしか書いてないです。

Windows PC編

CUDA SamplesをビルドするためにVisualStudioをインストールするとき

 調子こいてVS2017をインストールしてはならない。現時点ではVS2015までがサポート対象。

Installation Guide Windows :: CUDA Toolkit Documentation

VisualStudioでCUDA Samplesをビルドするとき

 プロジェクトのプロパティからターゲットをReleaseにすることを(必要であれば)忘れないようにする。

Jetson編

JetPack 3.0でflash-OSができないとき

 調子こいてホストにUbuntu 16.04 LTSなどをインストールしてはならない。現状14.04 LTSだけがサポート対象。

NVIDIA JetPack Documentation - JetPack L4T

 ただし、OSのflashをしなければ、ホストが16.04 LTSであっても、CUDAなどの転送は可能。

JetPack 3.0でCUDA Samplesがmakeできないとき

 現時点ではcommon/inc/helper_gl.hを下記のように変更する。

- #if !defined(GLX_EXTENSION_NAME) || defined(__arm__) || defined(__aarch64__)
+ #if !defined(GLX_EXTENSION_NAME) || !defined(GL_VERSION_1_3)

JetPack - Compiling oceanFFT on TX2 - NVIDIA Developer Forums

EliteBookとUbuntu 16.04 LTS

HP EliteBook 820 G1にUbuntu 16.04 LTSをインストールした。

precondition

EliteBook 820 G1 F9D92PP#ABJ

めちゃくちゃ安いときに買ったのでメモリ増設費用込でも10万円は超えてない。

  • Core i5-4300U
  • 4 GB SO-DIMM DDR3L-1600 -> 8 GB x 2 SO-DIMM DDR3L-1600
  • 256 GB SSD
  • 12.5 inch LCD, 1366×768

pre-install

Ubuntu Desktop 日本語 Remixのisoをダウンロードし、rufusUSBメモリに書き込み。
UEFI(w/o Legacy)/Secure Boot環境のまま、デフォルト設定でインストール

post-install

 することがない。Wi-Fiもホットキーの類もほとんどデフォルトで動作する。
 apt installで好きなアプリをインストールしていけば良い。

# homeフォルダ内のフォルダ名を英語に変更する
LANG=C xdg-user-dirs-gtk-update
# 電源管理 
sudo apt install tlp-rdw
# gitとJDKは入ってなかったようなので入れた
sudo apt install git default-jdk
# Noto Sans CJKを入れた
sudo apt install fonts-noto-cjk
# アプリケーションのメニューを常時表示するように設定した 
gsettings set com.canonical.Unity always-show-menus true

 Chromebookを使ったことがあればわかるように、消費することしか能のないインターネッターにとって、モダンなウェブブラウザーさえあれば他に必要なものはほとんどない。故に、FirefoxGoogle Chromeがあれば日常生活で不便することはそうない。
 足が短い、液晶の質が低いなどの欠点はあるが、これはWindowsの時と変わりない。
 あまりにスムーズに進みすぎて書くことがない記事になってしまった。

reference

Make: AVR Programming pt.04

squeuei.hatenablog.com

Chapter 10

タイマを使うときのチェックリスト

  1. どのタイマを使うか決める。8bitでよければTimer 0か2、16bitが必要ならTimer 1。
  2. どのモードが必要なのかを決める。TCCRnAのWGMn0とWGMn1、TCCRnBのWGMn2をセットする。
    1. 数えたかったりタイミングを作りたいのならNormalモード(設定の必要なし)
    2. 時間の基準や周波数を作りたいのならCTCモードを使う。WGMn1をセットする。
    3. PWMを使いたいならfast PWMモード。WGMn0とWGMn1をセットする。PWM周波数を変えなくてもいいならWGMn2もセットする。
  3. 直接出力するならTCCRnAのCOMxAとCOMxBをセットする。
  4. 分周を決めたらTCCRnBのCSnxビットをセットする。
  5. 比較する数値を使うならOCRnAやOCRnBにデフォルトの値を設定する。PWMを使うならDDRの出力設定も忘れないこと。
  6. タイマで割り込みを使う?
    1. Normalモードならカウンタオーバフロー割り込みを有効にするため、TIMSKnのTOIEnをセットする。
    2. PWMやCTCモードなら比較での割り込みを有効にするため、TIMSKnのOCIEnAとOCIEnBをセットする。
    3. sei()するのを忘れないように。

Chapter 11

サーボのようなデバイスとAVRの電源はなるべく分けた方がいい。AVRの動作が不安定になる恐れがあるから。

Chapter 12

高い電圧を高分解能で取得したいときは、分圧とオーバーサンプリングを使う。 また、AVRの場合はADC以外のクロックを停止することでノイズを低減するADCノイズリダクションスリープモードがあるので、活用すると良い。

オーバーサンプリング

オーバーサンプリングは中心極限定理に基づいていて、たとえば10ビットADCで16個のサンプルを取得した後、4で割る(=2ビットシフトする)ことで12ビットの結果が得られる。 nビット余計に欲しいときは、{2^{2^n}}回のサンプリングと{2^n}回の割り算(=n回のビットシフト)が必要。

オーバーサンプリングは、サンプリング周波数よりもゆっくり変化する信号に対して適用する。 速度、精度、コストはトリレンマだ。 16回のオーバーサンプリングは16倍遅くなるけど2ビット分の精度をただで手に入れられる。 高速で正確なADCが欲しいなら良いADCを買えばいいけど、それにはお金がかかるのだ。

0~5V以外の信号を計りたいときは

1V以下のものを計りたいときはAREFを内蔵の1.1Vリファレンス電源にすればよい。 1V~5Vのものを計りたいときはAREFを内蔵の1.1Vリファレンス電源にして、その上で信号を分圧すればよい。 5V以上のものを計りたいときは信号を分圧すればよい。

スリープ

avr/sleep.hをインクルードして、set_sleep_mode(SLEED_MODE_ADC);(実はSMCR |= (1 << SM0);するのと同じ)と、ADCSRA |= (1 << ADIE);(ADC割り込み有効化)、sei()をすればよい。ただし、sleepが終わるときにISRが呼ばれるので、EMPTY_INTERRUPT(ADC_vect);なりしておく必要がある。

EWMA(Exponentially Weighted Moving Averages)

ふつうの移動平均では移動平均する数だけメモリを消費する。 また、C言語の除算では切り捨ての問題があるから、なるべく除算の階数を減らしたい。 EWMAなら2つの変数、現在の値{x_t}と過去の平均値{y_{t-1}}だけでいい。

{\displaystyle y_t=\frac{1}{16}x_t+\frac{15}{16}y_{t-1}}

また、EWMAは最後に一回だけ除算をすればいいので、除算の問題が少ない。 除算するときの一つのテクニックは、割る数の半分を事前に足してから除算を行うこと。

(16+4)/8 = 2
(20+4)/8 = 3

これらを考慮したときのEWMAの式は下記の通り。

{\displaystyle 16y_t=x_t+16y_{t-1} -\frac{(16y_{t-1}-\frac{16}{2})}{16}}

Make: AVR Programming pt.03

squeuei.hatenablog.com

Chapter 8

割り込みを扱うときはISR()を使う。厳密に言うところは関数じゃなくてマクロ。 引数として割り込みベクタを与える。割り込みベクタの定義はio.hに書いてある。

外部割り込み

外部割り込みを有効化するときは、2段階ある事を忘れないようにする。

  1. 使いたい割り込みベクタを有効化する
  2. 割り込みシステム全体をsei()で有効化する。

普通は割り込みに入るときにglobal interrupt enableがオフになるので、割り込み中に更なる割り込みが発生することは無い。それを許可したい場合は、ISRのなかでsei()を呼ぶか、ISR_NOBLOCKでISRを定義するかのどっちかにする。

割り込みを生じさせたくない場合はcli()を使ってglobal interrupt enableをオフにする。再開したいときはsei()を。

ピン変化割り込み

Pin-Change InterruptではPxyPCINTxが対応する。ただしxはアルファベットと数字で対応してるのでややこしい。PByはPCINT0,PCyはPCINT1、PDyはPCINT2みたいに。 割り込みベクタは全部のピンで共通なので、ISRの中でどのピンからの割り込みなのかを判定して処理しないといけない。

  1. 制御レジスタ(PCICR)で使いたい割り込みを有効化する。
  2. 使いたいピンをピンマスクレジスタで設定する。
  3. global interrupt enableをsei()で有効化する。

割り込みを受けるときは

  1. 同じバンクの複数のピンからトリガを受ける場合にはbit_is_clear(BUTTON_IN, BUTTON)のようにどのピンからの割り込みなのかを調べる。
  2. 同じバンクに一つしかトリガを受けない場合には、立ち上がりと立ち下がりの両方に反応することに注意。どちらなのかを確認する必要がある。

ISRで変数を操作したいとき

ISRは引数を取れないので、mainからもISRからもアクセスできるグローバル変数を宣言する。 ただし、その変数はvolataileを付けること。つけないと、一度もmain内で変更されない変数とみなされて、コンパイラが定数に変更してしまうことがある。 空のforループを回すときにも同じ事をする。

Chapter 9

タイマ

タイマにはノーマルモードとCTCモードがある。 ノーマルモードではカウンタがオーバフローするまで動作する。タイマの種類にもよるが255あるいは65535。 CTCモードではOCRnAレジスタで指定した値までカウントする。 ATMega168の場合はTimer1が16bit、そのほかは8bit。現在のタイマーの値はTCNTxに格納されている。

CTCモードの場合はTCCRxAレジスタWGM01を設定する。また、outputモードにする場合はTCCRxAレジスタCOMxA0を設定する。また、outputモードにする場合は Output Compare Resister OCRxAビットに

どのモードにせよ、プリスケーラを設定しなければ、タイマは動作しない。CSx2CSx1CSx0の値を、データシートの表にしたがって設定する。

CPUスピード

CPUスピードを変える方法には“ヒューズ”を書き換える方法と、ソースコードの中で設定する方法の2つがある。

この本のサンプルコードに付属するMakefileではmake set_fast_fuseすることで8MHz動作に変更される。戻すときはmake set_default_fuses。 そのほかにもAVRDUDEで設定変更ができるけど、例えばSPIEN-enable fuse bitを変更してしまうとSPIでのプログラミングができなくなったり(設定を戻すこともSPIではできない!)、CPUクロックソースを外部クロックに設定してしまったり(こっちはクロックや他のマイコンから1MHzの信号を印可してやればよいので、まだ対処しやすい)するので、注意が必要。

ソースコードで設定する場合には、Clock Prescalar Change Enableビットをセットしてから4クロック以内にプレスケーラの値を変更しないと行けない。これはけっこうやっかいなので、avr/power.hにクロック変更用のマクロがすでに用意されている。

#include <avr/power.h>
clock_prescale_set(clock_div_1);

などとすればよい。 power.hにはAVRに内蔵されている特定のモジュールの電源を落とすマクロなども用意されているので、省電力化したい場合には活用すると良い。

Make: AVR Programming pt.02

まだまだ続く。けど夏休み中に終わらせるのは無理っぽい。

squeuei.hatenablog.com

Chapter 6

ボタンスイッチをマイコンのデジタルIOに接続する時は、プルアップ抵抗を使うこと。プルアップ抵抗はボタンがオープンの時にレベルを確実にハイにするために必要な抵抗。ただし、AVRの場合は全てのピンにプルアップ抵抗が組み込まれていて、設定で有効化できる。

Chapter 2で言及したように、DDRxが0(入力)のとき、PORTxはプルアップの設定になる。

プッシュボタンを使うときのチェックリスト

  1. DDRxレジスタを入力にする。
  2. プルアップのために抵抗素子を使わない時は、PORTxで内蔵のプルアップを有効にする。
  3. コードの中でボタンの電圧を読む。
  4. ボタンが押されてる間に何かをしたいのか、ボタンが押されたときに何かをしたいのかをヨーク考える。
  5. ボタンが押された時に何かをしたいのなら、デバウンシングすることを考える。たとえば一度押されたことを確認して、さらに一定時間後にも押されてたら、そのとき初めて何かを実行する、のような。

Chapter 7

LDRについて

LDRを使う際、組み合わせる抵抗は

{\displaystyle
\mathrm{R} =\sqrt{
\mathrm{R}_{\mathrm{LDR}\mathrm{bright}}\cdot\mathrm{R}_{\mathrm{LDR}\mathrm{dark}}
}
}

で決定するのがよい。

ADCを使う時の注意

アナログ回路設計のグッドプラクティスとしては、高速なスイッチングがあり、スパイクが乗るチップと、性格で安定した値が要求されるADCとで、独立した電源を供給するのが望ましい。特に、小信号や高周波信号を扱う時には重要となる。

  1. AVCCに給電した? システムのVccからの差は0.3 V以内でなきゃダメ。
  2. ADMUXのREFSxを設定した? デフォルトではAREFの外部電圧を基準とする。AVCCを基準にしたいのならREFS0をセットしないといけない。
  3. ADCのプレスケーラを設定した? ADCにはクロック源が必要。
  4. ADENを設定してADCを有効化した?
  5. マルチプレクサで正しいchを選択した? 設定はbitじゃなくてbinaryだよ?
  6. 最後に、ADCの値を別々に読むときはADCL(下位ビット)から読み込んでる? 10bit読むときはADCLを読み込んでからじゃないとADCH(上位ビット)は更新されないよ?

上記の設定をしてから、ADCSRAのADSCを設定することで、ADCは変換を開始する。 ADCSRAのADATEを有効にしてフリーランニングを使う時も、最初の一回はプログラマがADSCを設定しなきゃいけない。

ADLAR=0のときはADCHの下位2ビットとADCLの8ビットがADCの出力となる。 ADLAR=1のときはADCHの8ビットとADCLの上位2ビットがADCの出力となる。

ADMUXでマルチプレクサを設定するときは、上位4ビットの値を保ったまま、下位4ビットを設定しなきゃいけない。 よくやるのはこんな感じ。

ADMUX = (0xf0 & ADMUX) | channel;