規約と活字

告知事項

私は法律家ではない/これは法的な助言ではない

tl;dr

  • myFontsやfonts.comで買ったり月額課金したりした欧文書体の大半は、フォントを埋め込んだPDFを商用利用することができない。
  • OSやOffice添付のフォントは個別フォントのEULAが公開されておらず曖昧にぼかされているけど、厳密に言えばおそらく駄目
  • TypeKitや一太郎プレミアム、Designcuts、TrueTypeフォントパーフェクトコレクション で買ったフォントはライセンス上安全。
  • SIL OFLでライセンスされたフォントもたぶん安全。
  • LaTeXのライセンスもきっとだいじょうぶ。
続きを読む

Chromebook flip C100PAでArch Linux ARM (mainline kernel編)

目的

 約300ドル+税+送料で買える1 kgを切ったラップトップASUS Chromebook flip C100PAは、プレインストールされたChrome OSに加えcroutonArch Linux ARMによってLinux環境を利用することができる。

 中でもArch Linux ARMは、Chrome OS上からchrootを用いるcroutonとは異なり、Chrome OSから完全に独立したLinux環境を構築できる利点を有している。しかしながら、かつてはメインラインカーネルにおけるハードウェアのサポートが不足しており、結局はChrome OSにて用いられているカーネルを利用する必要があった。

 そして現在、無数のコントリビューターの貢献によってメインラインカーネルでのサポートは充実したものとなり、Chrome OSカーネルを使わずとも実用的になってきたと思われる。以上の経緯から、パワーアップしたCPUやUSB-C給電などを特徴とするASUS Chromebook flip C101がComputexにて展示された今、あえて一年前の記事をアップデートするものである。

f:id:squeuei:20170609160819p:plain

インストール

 相変わらず親切な公式ガイドの通りにインストールすれば特に詰まるところはない。

 ちなみに、Wi-Fiにさえ接続してしまえば、Ctrl-Alt-→(=Ctrl-Alt-F2)で入れるコンソールからrootユーザでログインすることで、Googleアカウントを用意せずともGoogle利用規約に同意することなくArch Linux ARMのダウンロードおよびインストールをすることができる。USBスティックなどで別途アーカイブを用意すればWi-Fiへの接続も不要である。

初期設定

 インストール後、新しいユーザを作る前に、rootでいる間にやったこと。

locale

vi /etc/locale.gen
# Uncomment:
# en_US.UTF-8
# ja_JP.UTF-8
# 
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf
export LANG=en_US.UTF-8

hostname

vi /etc/hostname

時刻

timedatectl set-timezone Asia/Tokyo

pacman初期化

Arch Linux ARM • View topic - Pacman 5.1.0 and Package Signing

pacman-key --init && pacman-key --populate archlinuxarm
pacman -Syu

ユーザ追加

# Root Password
passwd

# New User
useradd -m -G wheel username
passwd username
pacman -S sudo

visudo
# Uncomment:
# Defaults env_keep += "HOME"
# %wheel ALL=(ALL) ALL
#

 一般ユーザalarmは好みで消してよさそう。

userdel alarm

デスクトップ環境

xorg

sudo pacman -S xorg-server xorg-apps xterm xorg-xclock xorg-twm xorg-xinit
sudo cp /etc/X11/xinit/xinitrc ~/.xinitrc

xfce4 / lightdm環境の構築

 GNOMEは一度試してみて重かったのでXfceに変更。

sudo pacman -S xfce4 xfce4-goodies
sudo pacman -S lightdm lightdm-gtk-greeter
sudo systemctl enable lightdm
sudo pacman -S xarchiver zip unzip p7zip cpio unrar

xfce4のパネルをデフォルト設定に戻したいとき

xfce4-panel --quit
pkill xfconfd
rm -rf ~/.config/xfce4/panel
rm -rf ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
xfce4-panel

mw.hatenablog.jp

日本語関連

 fcitx-mozcはあるけどmozcがないので使えない。

sudo pacman -S fcitx-anthy fcitx-im fcitx-configtool
sudo pacman -S otf-ipafont adobe-source-han-sans-jp-font adobe-source-han-serif-jp-font
vim ~/.xprofile
# add:
# export GTK_IM_MODULE=fcitx
# export QT_IM_MODULE=fcitx
# export XMODIFIERS=@im=fcitx
#

 日本語が入力できずに困ったときは診断ツールを使うと原因がわかりやすい。だいたいはIM MODULEの設定。

fcitx-diagnose

ハードウェア関連

サウンド

 スピーカのミュートを解除すると音が出る。

sudo pacman -S alsa-utils
amixer -c 0 sset "Right Speaker Mixer Right DAC" unmute
amixer -c 0 sset "Left Speaker Mixer Left DAC" unmute
sudo alsactl store
sudo gpasswd -a username audio
speaker-test -c 2

 下手にalsamixerをいじるとスピーカーを破損する恐れがあるので注意、とのこと。

pulseaudio

 Xfceのためにpulseaudioを入れる。

sudo pacman -S pulseaudio pavucontrol pulseaudio-alsa
sudo vi /etc/pulse/default.pa
# add:
# load-module module-alsa-sink device=sysdefault
# 

キーボード

 Chromebook用のキーマップが用意されているので切り替える。

 FnキーやCaps Lockを使うときは右altキーと同時押しする。

localectl set-x11-keymap us chromebook

WiFi

 btsdioブラックリストすることでサスペンド復帰後にWi-Fiが使えなくなることを回避できる、らしい。

sudo vim /etc/modprobe.d/blacklist-btsdio.conf
# add:
# blacklist btsdio
#

Wi-Fiの自動接続

sudo wifi-menu -o
sudo pacman -S wpa_actiond
systemctl enable netctl-auto@wlan0.service

yaourt環境の構築

sudo pacman base-devel make git

git clone http://aur.archlinux.org/package-query
cd package-query
makepkg -s
sudo pacman -U package-query-x-y-armv7h.pkg.tar.xz

git clone http://aur.archlinux.org/yaourt
cd yaourt
makepkg -s
sudo pacman -U yaourt-x-y-any.pkg.tar.xz

 mozcやvscodeのビルドを試したかったけど/tmpが足りなくて失敗。tmpfsを使わないようにしてからビルドすればいける?

 adobe flash playerのpepper pluginもすぐにインストールする方法は見つからない。

余談

  • USBメモリへインストールするとちょっと遅いかも?
  • InstallingDebianOnのAsus C201の項目を試してもうまくいかないのはなんで。

参考文献

欧文フォントインパーフェクトコレクション

更新(2018-09-15)

だいたいこれで用が足りるんじゃないかと思う。

gist.github.com

要するにTypeKitに入って『TrueTypeフォントパーフェクトコレクション』をどうにか手に入れれば商用PDFへの埋め込みだろうと大丈夫という話です。あとは足りないものがあったらFrutiger->MyriadやFF Meta->Fira Sansで雰囲気だけ真似したり。

macを買うこともかなりの問題を解決するけど、PDF埋め込みに関しては微妙な問題が残りそう。

squeuei.hatenablog.com

続きに元記事も残しておきます。

続きを読む

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はできるのだけれど、何が悪いのだろうか。

Make: AVR Programming pt.04

http://squeuei.hatenablog.com/entry/2016/08/18/152509squeuei.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

http://squeuei.hatenablog.com/entry/2016/08/16/201654squeuei.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

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

http://squeuei.hatenablog.com/entry/2016/08/15/001834squeuei.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;