更新(2018-09-15)
だいたいこれで用が足りるんじゃないかと思う。
要するにTypeKitに入って『TrueTypeフォントパーフェクトコレクション』をどうにか手に入れれば商用PDFへの埋め込みだろうと大丈夫という話です。あとは足りないものがあったらFrutiger->MyriadやFF Meta->Fira Sansで雰囲気だけ真似したり。
macを買うこともかなりの問題を解決するけど、PDF埋め込みに関しては微妙な問題が残りそう。
続きに元記事も残しておきます。
続きを読むだいたいこれで用が足りるんじゃないかと思う。
要するにTypeKitに入って『TrueTypeフォントパーフェクトコレクション』をどうにか手に入れれば商用PDFへの埋め込みだろうと大丈夫という話です。あとは足りないものがあったらFrutiger->MyriadやFF Meta->Fira Sansで雰囲気だけ真似したり。
macを買うこともかなりの問題を解決するけど、PDF埋め込みに関しては微妙な問題が残りそう。
続きに元記事も残しておきます。
続きを読む久しぶりにTeXの環境構築を行ったのでそのメモ。
前回は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
をダウンロードしてインストール。時間はかかるけど詰まるところはない。
pTeXと同等(互換ではない)の環境を目指して、LuaTeX-ja環境が整備されつつある。
\usepackage{luatexja}
LuaTeXではjsclasses
文書クラスは利用できないので、代替としてltjsclasses
が利用できる。
また、確認していないがBXjscls
(BXjscls - 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}
縦書きの文書クラスとして、ltjtarticle.cls
、ltjtreport.cls
、ltjtbook.cls
が利用できる。
ところでluatexja-preset
でexpert
オプションを設定してもダブルクオーテーションはダブルミニュートにならないのだけど、これはどうすればいいのだろうか。
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で対処する」
改訂6版 TrueTypeフォントパーフェクトコレクション (デジタルBOOK)
有名どころのフォントが破格値で手に入るすぐれものです。詳しくはリンク参照のこと。
ちなみに好きな字体はFrutiger、Avenir、Optima、Palatino、Gothamあたりです。Macintoshがほしい。
このフォントをTeXで使うにはTrueType Fonts Perfect Collectionの指示に従えばいい、はずなのだけれど、前の環境でうまくいったこれが今回の環境だとうまくいかない。
サンプルファイルをplatexにかけてdviファイルを作った後、dvipdfmx -f bitstream.map filename
すればpdfはできるのだけれど、何が悪いのだろうか。
http://squeuei.hatenablog.com/entry/2016/08/18/152509squeuei.hatenablog.com
サーボのようなデバイスとAVRの電源はなるべく分けた方がいい。AVRの動作が不安定になる恐れがあるから。
高い電圧を高分解能で取得したいときは、分圧とオーバーサンプリングを使う。 また、AVRの場合はADC以外のクロックを停止することでノイズを低減するADCノイズリダクションスリープモードがあるので、活用すると良い。
オーバーサンプリングは中心極限定理に基づいていて、たとえば10ビットADCで16個のサンプルを取得した後、4で割る(=2ビットシフトする)ことで12ビットの結果が得られる。 nビット余計に欲しいときは、回のサンプリングと回の割り算(=n回のビットシフト)が必要。
オーバーサンプリングは、サンプリング周波数よりもゆっくり変化する信号に対して適用する。 速度、精度、コストはトリレンマだ。 16回のオーバーサンプリングは16倍遅くなるけど2ビット分の精度をただで手に入れられる。 高速で正確なADCが欲しいなら良いADCを買えばいいけど、それにはお金がかかるのだ。
avr/sleep.h
をインクルードして、set_sleep_mode(SLEED_MODE_ADC);
(実はSMCR |= (1 << SM0);
するのと同じ)と、ADCSRA |= (1 << ADIE);
(ADC割り込み有効化)、sei()
をすればよい。ただし、sleepが終わるときにISRが呼ばれるので、EMPTY_INTERRUPT(ADC_vect);
なりしておく必要がある。
ふつうの移動平均では移動平均する数だけメモリを消費する。 また、C言語の除算では切り捨ての問題があるから、なるべく除算の階数を減らしたい。 EWMAなら2つの変数、現在の値と過去の平均値だけでいい。
また、EWMAは最後に一回だけ除算をすればいいので、除算の問題が少ない。 除算するときの一つのテクニックは、割る数の半分を事前に足してから除算を行うこと。
(16+4)/8 = 2
(20+4)/8 = 3
これらを考慮したときのEWMAの式は下記の通り。
http://squeuei.hatenablog.com/entry/2016/08/16/201654squeuei.hatenablog.com
割り込みを扱うときはISR()
を使う。厳密に言うところは関数じゃなくてマクロ。
引数として割り込みベクタを与える。割り込みベクタの定義はio.hに書いてある。
外部割り込みを有効化するときは、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の中でどのピンからの割り込みなのかを判定して処理しないといけない。
割り込みを受けるときは
bit_is_clear(BUTTON_IN, BUTTON)
のようにどのピンからの割り込みなのかを調べる。ISRは引数を取れないので、mainからもISRからもアクセスできるグローバル変数を宣言する。 ただし、その変数はvolataileを付けること。つけないと、一度もmain内で変更されない変数とみなされて、コンパイラが定数に変更してしまうことがある。 空のforループを回すときにも同じ事をする。
タイマにはノーマルモードとCTCモードがある。 ノーマルモードではカウンタがオーバフローするまで動作する。タイマの種類にもよるが255あるいは65535。 CTCモードではOCRnAレジスタで指定した値までカウントする。 ATMega168の場合はTimer1が16bit、そのほかは8bit。現在のタイマーの値はTCNTxに格納されている。
CTCモードの場合はTCCRxA
レジスタでWGM01
を設定する。また、outputモードにする場合はTCCRxA
レジスタでCOMxA0
を設定する。また、outputモードにする場合は
Output Compare Resister OCRxA
ビットに
どのモードにせよ、プリスケーラを設定しなければ、タイマは動作しない。CSx2
、CSx1
、CSx0
の値を、データシートの表にしたがって設定する。
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に内蔵されている特定のモジュールの電源を落とすマクロなども用意されているので、省電力化したい場合には活用すると良い。
まだまだ続く。けど夏休み中に終わらせるのは無理っぽい。
http://squeuei.hatenablog.com/entry/2016/08/15/001834squeuei.hatenablog.com
ボタンスイッチをマイコンのデジタルIOに接続する時は、プルアップ抵抗を使うこと。プルアップ抵抗はボタンがオープンの時にレベルを確実にハイにするために必要な抵抗。ただし、AVRの場合は全てのピンにプルアップ抵抗が組み込まれていて、設定で有効化できる。
Chapter 2で言及したように、DDRxが0(入力)のとき、PORTxはプルアップの設定になる。
LDRを使う際、組み合わせる抵抗は
で決定するのがよい。
アナログ回路設計のグッドプラクティスとしては、高速なスイッチングがあり、スパイクが乗るチップと、性格で安定した値が要求されるADCとで、独立した電源を供給するのが望ましい。特に、小信号や高周波信号を扱う時には重要となる。
上記の設定をしてから、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;
買ってから優に一年間放置していた“Make: AVR Programming”を夏休みに読んでしまおう計画。
http://squeuei.hatenablog.com/entry/2015/08/11/212000squeuei.hatenablog.com
AVRISPmk2を入手しておいたのだけど、こいつは自分で+5Vを供給してくれないので、ACアダプタでブレッドボードに5Vを給電するとかしないといけない。かつ、私の環境ではavrdudeでうまくmake flash
してくれないので、Arduino ISPを活用することにする。ISP買った意味がない。
システムやユーザの環境変数を通すのが嫌だったので、PATHを通すバッチファイルを書いて、そこから操作することにする。
PATH=%PATH%;foo\bar\avr8-gnu-toolchain\bin;hoge\fuga\avrdude_utilities;
cd mado\homu\AVR-Programming
といった内容の.batファイル(ここでは安易にavr.batとした)を作成した後、エクスプローラから
C:\Windows\System32\cmd.exe /k "yui\azu\avr"
というショートカットを作る。フォルダやファイルの場所は各自修正のこと。ショートカットがリンクする先の最後にあるavr
は.batファイルのファイル名にする。拡張子を付けないのが個人的にポイントだった。
このショートカットを開けば、コンパイラとユーティリティへのPATHが通ったコマンドプロンプトが開く。
サンプルコードを書き込む際には、Makefileで
PROGRAMMER_TYPE = avrisp
PROGRAMMER_ARGS = -b 19200 -P com3
などとして、PATHが通ったコマンドプロンプトからmake flash
する。
RAMに変数をつくることと、ピンへの書き込みやピンの入出力設定は同じインタフェース(代入)で行われるけど、これは実際に同じ事をレジスタに対して行っているから。そのレジスタの情報はio.h
に格納されてる。
DDRx : data-direction registers port x
インプットかアウトプットかを決める。
PORTx port x data registers
PINx port x input pins address
デフォルトで全部のピンはインプット。
DDRの設定をせずにPORTを設定してしまうパティーンが多いので気をつけよう。
MOSFETはLEDのGNDとプログラマのGNDをいちいち手で接続したり外したりするのがめんどうなので使う、とのこと。
正直肉眼で見ても全然わからなかったので写真に撮る。
Analog Discovery2のロジアナで見るとこんな感じ。ありがとうAD2。
サイロン (Cylon) は、SFテレビドラマ『宇宙空母ギャラクティカ』に登場する架空のキャラクター。
サイロン - Wikipedia
さすがにわからん。
プリアンプルの#defineは大文字をアンダースコアで区切って書くのが慣例。
UARTのRT/TXの関係はSPIとは違って送り手と受け手で逆になるから気をつけよう。
以下はこの本の著者が用意した便利関数の数々。
initUSARTは、ボードレートの設定、2Xモードの設定、RXTXの有効化、データ長とストップビットの設定を行う。
void initUSART(void) {
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= (1 << U2X0);
#else
UCSR0A &= ~(1 << U2X0);
#endif
UCSR0B = (1 << TXEN0) | (1 << RXEN0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
送信時はUCSR0A(USART Control and Status Register 0 A)レジスタのUDRE0(USART Data Register Empty)が1になるまで待って、それからUDR0(USART Data Register)に送信したいデータを格納する。
void transmitByte(uint8_t data) {
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = data;
}
受信時はUCSR0AレジスタのRCX0(receive-complete bit)が1になるまで待って、それからUDR0の値を読みに行く。
uint8_t receiveByte(void) {
loop_until_bit_is_set(UCSR0A, RXC0);
return UDR0;
}
私が持っていたUSB-RS232C変換ケーブルだと、PCで入力した文字と送信された文字が食い違う現象が発生した。
これもAnalog Discovery 2のロジアナが無ければ、何が起きているのかわからないままだった。ありがとうAD2(2回目)。
そういえばRaspberry Pi2Bを買ったまま死蔵していたなという事を思い出したので、下記サイトを参考に、シリアルコンソールによるログインを無効に設定してから
で接続し、cu -s 9600 -l /dev/ttyAMA0
すると、ちゃんと動作した。
Raspberry PIのGPIO上シリアルとArduinoの通信 - Qiita
RPi2 Model B IO Pins – Raspberry Pi Projects
意外なところで意外なものが役に立つものだなあと、感心することしきりである。
それは、考えなしになるための方法論。
手帳の使い方についていろいろ考えたのでまとめる。
まず何でもいいから、その日あったこと、考えたことを書く。何でも書く。ニュースに頼ってもいいから書く。
放っておいたら何もかもを忘れてしまう。確かにあったはずのことなのに、思い出せないなんてことが許せると思える? 私には無理です。
書くことは最もプリミティブな記録のひとつです。どんな悪文でどんなクソみたいな内容が書かれていても、それがいつかきっとあなたの財産になる(その価値はあなたの頭の中だけにしかないとしても)。 たとえば、レフト式の手帳を使うなら、左ページの余ったスペースにN行日記を書く、というのはいかがでしょう。
本当は電子化したほうが、検索性の上で便利ですが、そこのところは私もどうしたらいいのかはかりかねているところです。
覚えておきたいことを書いておくことは、思い出そうと思った時に思い出せる、ということに他ならなりません(実際にはどうインデックスを作っておくかが問題になるのですが)。
逆に言えば、いつでも思い出せるなら、忘れてしまってもかまわない、ということでもあります。ある事項について、それを忘れてしまえば、そのことについて考えずにすみます。思考のリソースは有限なのです。
六月最終週に新クールの録画予約するということを書いておき、定期的にその記述を確認しておけば、その日まで毎日覚え続けておく必要はないし、それまでに忘れてしまう確率も下がることでしょう。
思いついたやるべきことはすぐに書く。書いたものは定期的に見直す。この合わせ技で、何かをし忘れるということはそれなりに減ります。サボりとかを除けば。
どこでも最低限のメモを残せるように、小さなメモ帳を常に持ち歩くというのもよいでしょう。ダイヤメモとか、すぐメモとか、あるいは野帳とか。これらは、手帳がポケットに入らないくらい大きい、上着の中ポケットに手帳を入れると膨らんでかっこ悪い、などの場合に有利です。
これは、やることを覚えておかなくてもいいようにしたら、次は「これから何をするべきか」を考えることすらしないようになりたい、という怠惰な発想に基づいた行動スキームです。
まず、やるべきことのリストを整理します。これはwikipediaのGTD項を参考にしました。
foreach やるべきことのリスト:
if 行動すべき?:
if 所要時間 <= 2分:
いますぐやる
else if 達成にいくつもステップが必要?:
“プロジェクト”リストへ追加
else if 自分がする必要がある?:
誰かに依頼する
依頼した内容を“連絡待ち”リストへ追加
else if やる日程が決まってる?:
日時を指定して手帳やカレンダーに追加
else:
“次のアクション”リストへ追加
else:
if いつかはやりたい?:
“いつかする”リストへ追加
else if 記録しておく価値がある?:
“資料”リストへ追加
else:
忘れる
重要なのは、具体的で実行可能なステップに分解することです。
「これをするためにはどうすればいいんだろう?」と考えるようではダメです。何も考えること無く書いてあることに従えるようにするのが肝要です。
また、優先度があまりにも異なることを、リストに並べないほうが良いかと思います。締め切りなどで、明確に優先すべきことがあるならスケジュールに入れてしまう方がよろしいかと。
そうしないと「このリストのどれから手を付けよう」と考えなければなりません。思考は敵です。「どれも同じくらいの優先度だから、どれから手をつけても同じ」という状況を作るのです。
私はNOLTYの手帳と手帳専用の補充ノート、それに普通のキャンパスノートを使って、下記の様に整理してます。
基本的には場所毎のアクションへの落とし込みを意図しています。が、これは私にとっても持続不可能なくらい、項目が細かすぎるかもしれませんので、そこは各自うまくやりましょう。
あとは、前のアクションが終わったら、自分のいる場所の“次のアクション”リストを順次実行するだけです。どれも同じ優先度なら、どれから手を付けても、上から下でも、乱択しても、問題ないですよね?
個人的な感覚として、このGTD(もどき)で2番目に大事なのは「具体的で実行可能なステップに分解する」で、1番目は「2分以内にできることはすぐやる」です。
絵に限らず、何事も突然上手くなることはありません。時間で殴る必要があるのです。
レフト式やバーティカル式の手帳を使っているなら、そのための時間を先にalloc
してしまうのです。特に、長期目標の場合には、上記したプロジェクトリストの中身と連携するのが良いのだと思われます。目標から逆算して分解した具体的な行動を、実施する時間を確保しておくことで着実に推進するのです。
実のところ、ここのパートは自分もまだうまくできてないのですが、毎日一定の時間を確保して作業するのは脳にいいって『できる研究者の論文生産術 どうすれば「たくさん」書けるのか』にも書いてあったし、上手くいって欲しいし、上手くいくようになりたい。
tl;dr: 二分以内にできることはすぐやれ、やることリストを作るなら明確で具体的な行動の形で書け、やりたいことがあるなら時間を決めて毎日やれ。
来年にはまた“最高の手帳活用法”を“発見”して書き方変わってる予感しかない。
できる研究者の論文生産術 どうすれば「たくさん」書けるのか (KS科学一般書)