Target Triple

Rustのコンパイラソースコードの中で使用されていた"Triple"という言葉の意味がわからなかったので調べた。

Target Triplet - OSDev Wiki

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-plugVimプラグインマネージャー。
今回、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制御

ということで作ってみた。

f:id:ryochack:20150907170728j:plain:w400

GitHubリポジトリ

ryochack/lpc812_usbgpio

何ができる?

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っていうのを後々やりたい。

買ったもの

材料費はマイコン100円+IC変換基板105円+USBシリアル変換アダプタ600円で800円くらい。(他にジャンパや抵抗なんかもあるけれども…)

LPCマイコンの開発環境

LPCマイコンの開発には以下を使用。

Flash Magicの書き込み設定。

f:id:ryochack:20150907175839p:plain:w400

LPC812はPIO0_12をLOWにしながら電源を入れるとISPモードで起動できる。(Boot loaderのversionが13.4より前では、PIO0_1)
ISPモードで起動後、ここのhexファイルをFlash Magicで書き込めばUARTコマンドからLPC812のGPIO制御ができるようになる。

その他参考情報