Target Triple
Rustのコンパイラのソースコードの中で使用されていた"Triple"という言葉の意味がわからなかったので調べた。
Target Triplets describe a platform on which code runs and are a core concept in the GNU build system. They contain three fields: the name of the CPU family/model, the vendor, and the operating system name.
サポートするターゲットを表す表現方法を Target Triple
と呼んでいる。
ターゲットの指定が以下の3つのフィールドから成っていることが、Tripleと呼ぶ理由らしい。
- CPU family/model
- Vendor
- OS
具体例としては、以下のようなターゲット指定が挙げられる。(よく見るやつ)
なお、clangのドキュメントでは以下のようにフィールド指定が定義されている。
Cross-compilation using Clang
The triple has the general format
<arch><sub>-<vendor>-<sys>-<abi>
, where:
Arch Linux上にRe:VIEWをインストールする
書籍執筆支援システムRe:VIEWの環境構築のメモ。
依存パッケージのインストール
Re:VIEWを使うために必要なパッケージをインストールする。
$ sudo pacman -S ruby ruby-rubyzip texlive-most texlive-langjapanese poppler-data
dvipdfmxのフォントのエラー対策
Re:VIEWからpdfを生成する際(後述のreview-pdfmaker
実行時)にデータに日本語を含んでいると、以下のエラーが出る場合がある。
kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 2+180/600 --dpi 1380 uphgothr-h mktexpk: don't know how to create bitmap font for uphgothr-h. mktexpk: perhaps uphgothr-h is missing from the map file. kpathsea: Appending font creation commands to missfont.log. dvipdfmx:warning: Could not locate a virtual/physical font for TFM "uphgothr-h". dvipdfmx:warning: >> There are no valid font mapping entry for this font. dvipdfmx:warning: >> Font file name "uphgothr-h" was assumed but failed to locate that font. dvipdfmx:fatal: Cannot proceed without .vf or "physical" font for PDF output...
対策として、/etc/texmf/dvipdfmx/dvipdfmx.cfg
を編集する。
%% Put additional fontmap files here (usually for Type0 fonts) f cid-x.map
上記変更を反映するために以下を実行する。
$ sudo updmap-sys $ sudo texconfig rehash $ updmap $ texconfig rehash
Re:VIEWのインストール
AURにあるRe:VIEWパッケージは若干古いようなので、gitからインストールする。
$ git clone https://github.com/kmuto/review.git
clone後、展開されたreview/bin/
にPATHを通す。
始め方
$ review-init ${document_name}
${document_name}/
以下に${document_name}.re
が生成されているので、これを編集する。
各フォーマットで出力する
- PDF出力
$ review-pdfmaker config.yml
- EPUB出力
$ review-epubmaker config.yml
- HTML出力
$ review-epubmaker config.yml
参考
vim-plug: プラグインがインストール済みかどうかを判定する
追記: 以下の記事にfunction! s:plug.is_installed(name)
としてプラグインの存在確認方法が載っていました。
おい、NeoBundle もいいけど vim-plug 使えよ by @b4b4r07 on @Qiita
例として、プラグインの存在確認をするための関数を定義してみます。vim-plug ではプラグインのリストがグローバル変数 g:plugs に辞書として格納されているので、これをうまく利用します。
vim-plugはVimのプラグインマネージャー。
今回、NeoBundleからvim-plugへ乗り換えたので、その時にしたことをメモ。
vim-plugにはNeoBundleのneobundle#is_installed({bundle-name})
に相当する関数がないため、プラグイン依存の設定をvimrcに書きたいときに少し不便。
そこで、以下のような関数is_plugged({plugin-name})
を書いて、プラグインがインストール済みかどうかを判定する。
" check the specified plugin is installed function s:is_plugged(name) if exists('g:plugs') && has_key(g:plugs, a:name) && isdirectory(g:plugs[a:name].dir) return 1 else return 0 endif endfunction
以下のように、neobundle#is_installed({bundle-name})
と同じように使用できる。
" w3m plugin setting if s:is_plugged("w3m.vim") let g:w3m#external_browser = 'open' let g:w3m#download_ext = [ 'zip', 'lzh', 'cab', 'tar', 'gz', 'z', 'exe' ] let g:w3m#search_engine = 'http://www.google.co.jp/search?ie=' . &encoding . '&q=%s' nmap <Space>w :W3m endif " vim-go plugin setting if s:is_plugged("vim-go") let g:go_bin_path = expand("~/.vim-go") endif
参考
bit置換
ある値のn bit目からn+m bit目までを別の値で置き換えたい、という時がある。
例えば、以下のような値a
,b
があったとして
uint8_t a = 0b01010101; // 0x55 uint8_t b = 0b10101010; // 0xAA
a
の値の2〜4bit目をb
の値で置き換えた値c
を求めたい。
a
,b
が上記の値だった場合、c
の値は0x49
になる。
a: 01010101 (0x55) b: ***010** ------------ c: 01001001 (0x49)
これを行うbit演算はこうなる。
uint8_t offset = 2; uint8_t len = 3; uint8_t mask = (~(0xFF << len)) << offset; uint8_t c = (a & ~mask) | (b & mask);
以前に書いたものをまた使う機会があったのでメモとして残しておく。
テストコードはGistに。
LPC812マイコンでUSBシリアルからGPIO制御
組み込み開発の自動テスト化検討のためにUSBGPIO8とか買ってみようかと思ったけど、マニュアル読むと単にPCからUARTコマンド送ってGPIO制御するだけっぽい
— ryochack (@ryochack) September 2, 2015
これならUARTがあるマイコンとUSBシリアル変換モジュール買えば、1000円以内で作れるな
— ryochack (@ryochack) September 2, 2015
UARTが付いているってのを最低条件にして、PICとAVRとNXPのマイコンの価格調べたらNXPのLPC812が一番安かった
— ryochack (@ryochack) September 2, 2015
ということで作ってみた。
GitHubリポジトリ
何ができる?
PCからのUARTコマンドでLPC812のGPIOを制御できる。(LPC812の電源供給はUSBから行う)
それだけ。
(UARTコマンドについてはGitHubのリポジトリを参照)
ただし、PIO0_0〜PIO0_17のうち、以下のGPIOポートはUART、もしくはRESETに割り当てているので使えない。
- PIO0_0 : RXD
- PIO0_4 : TXD
- PIO0_5 : RESET
これとJenkinsと連携させて、コミットがあったら開発デバイスの電源を入れて自動テスト、テストが完了したら電源をOFFっていうのを後々やりたい。
買ったもの
- LPC812マイコン 100円
- IC変換基板(20ピン・SOP) 524円/5枚 -> 105円/枚
- USBシリアル変換アダプタ
- VCC出力を5V/3.3Vで切り替え可能のもの。今回は既に持っていたこちらを使用。 1,512円
- VCC出力は5V固定だがこちらはとても安い。3.3Vに降圧する必要あり。 600円
- http://akizukidenshi.com/catalog/g/gM-08461/
材料費はマイコン100円+IC変換基板105円+USBシリアル変換アダプタ600円で800円くらい。(他にジャンパや抵抗なんかもあるけれども…)
LPCマイコンの開発環境
LPCマイコンの開発には以下を使用。
Flash Magicの書き込み設定。
LPC812はPIO0_12をLOWにしながら電源を入れるとISPモードで起動できる。(Boot loaderのversionが13.4より前では、PIO0_1)
ISPモードで起動後、ここのhexファイルをFlash Magicで書き込めばUARTコマンドからLPC812のGPIO制御ができるようになる。