header

2014年9月2日火曜日

RustのインストールとEmacs用の設定

Rust に興味があって、インストールした。この記事はそのときにした設定とか迷ったところのメモ

普通に試すだけなら、tar形式でダウンロードするか、rustbyexample ってサイト(tour of Go風)で試すのが一番お手軽っぽい。。。


Rustのインストール

自分は最初はtar形式で試したあとコード補完とかしたいかったのでgit cloneした(自分はghqを使っているのでghq getした)

git clone https://github.com/rust-lang/rust.git

Ubuntu12.04を利用しているので、ビルドするのにgccのバージョンが違かったのでppaからgcc/g++の4.7をインストールした(必要なバージョンは変わるので随時rustのページを確認したほうがいい)
参考: http://mortenvp.com/installing-a-newer-gccg-on-ubuntu-12-04-lts/

コンパイラがupdate alternativesでうまくかえれなかったのでCC, CXXでコンパイラを指定した。あと、clangのオプションをgcc/g++がうまくうけとってくれなかったので、COVERED_SWITCH_DEFAULT変数を書きかえた。

COVERED_SWITCH_DEFAULT=`$CXX -Werror -fsyntax-only -xc /dev/null 2>/dev/null`; CC=gcc-4.7; CXX=g++-4.7; ./configure
make && make install

これでrustcとrustdocコマンドが使えるようになる(はず)。


Emacsの設定

エラーチェックにとくに設定なしでflycheckがつかえた。
Rust用のauto-completeに racer というパッケージがあったので利用した。(この記事を書いていて力つきたのでインストールはリンク先をみてください)
ソースコードのタグジャンプにGNU globalを利用した。


GNU globalの設定

Rust用の設定をするのが結構手間だったので、項をわける。
GNU globalはデフォルトでは、Rustに対応してないのでexuberant-ctagsをパーサーにしてctagsにRust用の設定を追加する方法を利用した。

なので最初にexuberant-ctagsをインストールする
注意点として、自分はctags, etagsをコマンドが存在しているときは、exuberant-ctagsコマンドがうまくインストールされていないようだったのでsudo rm /usr/bin/etags sudo rm /usr/bin/ctagsをしたあとにexuberant-ctagsをインストールした。

# インストールするときはexuberant-ctags、コマンドはctags-exuberant
sudo apt-get install exuberant-ctags

Rust用の設定を ~/.ctags に貼りつける(rustのsrc/etc/にctags.rustという名前で入っている)

--langdef=Rust
--langmap=Rust:.rs
--regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/
--regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/
--regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?static[ \t]+([a-zA-Z0-9_]+)/\2/c,consts,static constants/
--regex-Rust=/^[ \t]*(pub[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\2/t,traits,traits/
--regex-Rust=/^[ \t]*(pub[ \t]+)?impl([ \t\n]*<[^>]*>)?[ \t]+(([a-zA-Z0-9_:]+)[ \t]*(<[^>]*>)?[ \t]+(for)[ \t]+)?([a-zA-Z0-9_]+)/\4 \6 \7/i,impls,trait implementations/
--regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/

この時点でctags-exuberantを試すにはrustのsrcディレクトリ以下で以下のようにする。(あとから思いだしながらかいてるので、あってないかも。。。)

# cd path/to/rust-lang/src/
ctags-exuberant -e -f TAGS.emacs --language-force=Rust -R ./

たぶん、TAGS.emacsというのができてるのでなかをみればrustの関数の情報が入っていれば成功

GNU global はapt-getではなくリンク先のdownloadからtarを解凍したものを利用した。
GNU globalのplugin-factory/PLUGIN_HOWTOに書いてあるが、configureオプションにちょっと追加した。ctagsにはemacsのものもあるけど–with-exuberant-ctagsにはctags-exuberantを指定した。

./configure --with-exuberant-ctags=/usr/bin/ctags-exuberant
make
sudo make install

GNU globalのルートディレクトリにgtags.confがあるのでこれをコピペして.globalrcとして$HOMEにはりつけた。
その貼りつけた.globalrcのexuberant-ctagsの設定の中にRust用のlangmap, gtags_parserを追加した。(下のRustに関係ある行だけ追加した)

exuberant-ctags|plugin-example|setting to use Exuberant Ctags plug-in parser:\
...
:langmap=Ruby\:.rb.ruby:\
:langmap=Rust\:.rs:\
:langmap=Scheme\:.SCM.SM.sch.scheme.scm.sm:\
...
:gtags_parser=Ruby\:/usr/local/lib/gtags/exuberant-ctags.la:\
:gtags_parser=Rust\:/usr/local/lib/gtags/exuberant-ctags.la:\
:gtags_parser=Scheme\:/usr/local/lib/gtags/exuberant-ctags.la:\
...

Rustのソースコードがcppとrust自体のコードが混在していて、gtagsコマンドを実行した場合、混ざったものがでてきてしまったので.globalrcにRust用のラベルを作った。ほかにいい方法があればおしえてください。。。

default:\
:tc=native:
native:\
:tc=gtags:tc=htags:
user:\
:tc=user-custom:tc=htags:
ctags:\
:tc=exuberant-ctags:tc=htags:
rust:\
:tc=common:\
:langmap=Rust\:.rs:\
:gtags_parser=Rust\:/usr/local/lib/gtags/exuberant-ctags.la:

bashrcとかzshrcに以下を貼りつける。GTAGSCONFは設定ファイルの場所、GTAGSLABELはデフォルトのパーサーの設定なのでGNU globalのgtags.confを貼り付けていればctagsを設定しておけばctags-exuberantに対応する言語にも対応できるようになる。
GTAGSLIBPATHは:区切りでディレクトリを指定でき、globalで検索するソースを追加できる。Rustにしかglobalを使わないのであればしたの設定でいいかもしれないけど、Emacsからmajor-modeごとに変更したほうがよさそう。環境変数の説明のため(自分のメモとしても)に書いたので、これは別に設定しなくても大丈夫です。

export GTAGSCONF=$HOME/.globalrc
export GTAGSLABEL=ctags
export GTAGSLIBPATH="$HOME/.ghq/github.com/rust-lang/rust/src"

これで通常のRustのソースコードはそのソースのルートディレクトリで

gtags

でそのままタグファイルがつくれるはず。。ただ上でちょこっと書いたとおりRustのソースはcppとrustのコードが混ざってるので、rust用のラベルを指定してタグを作った

cd path/to/rust/src/
gtags --gtagslabel rust

EmacsからGNU globalを使う

自分が調べた感じだと、Emacsでglobalを使うなら以下のがよさげだった。

ggtags.el
helm-gtags.el

Githubのページの機能をみるとggtags.elはglobalで作ったタグから、eldocに表示できる機能があるらしい。試してみたがRustは表示できなかった。(他の言語は試してない)時間がたったら違う言語でまた試してみたい。

helm-gtags.elはglobalの結果をhelmでいい感じに表示してくれる。

まだあんまり試してないけど、下のようにしたらrust-modeの時helm-gtags-dwimで
Rustのソースコードも見れるようなった。

(require 'cl-lib)
(defadvice helm-gtags-dwim
(around update-libpath activate)
(setenv "GTAGSLIBPATH"
(cl-case major-mode
(rust-mode (file-truename
;; rustのソースコードへのパスを指定する
"~/.ghq/github.com/rust-lang/rust/src"))
(t nil)))
ad-do-it)

Rustを試してみた

普通にquickrunで実行できた。(quickrunすごい!)

type Rune = u8;
fn main () {
for c in range('a' as Rune, 'z' as Rune + 1) {
print!("{}", c as char);
}
}
// => abcdefghijklmnopqrstuvwxyz

まだRustそんな理解してないけど、基本的なところは書きやすそう。


おわり

なんか読みかえすと、GNU globalの導入記事っぽくなってる。。。


2014年8月21日木曜日

helm-ghqとhelm-for-filesを組み合わせたらすごい便利になった

もともとhelm-ghqでも便利なんだけど、helm-ghqとhelm-for-filesを組み合わせたらすごい便利になった。以下はその設定とか


その前にhelm-for-filesとは

helm用のファイルを探すのに特化したhelmの関数で、デフォルトで表示されるhelm-for-filesでの候補はbufferのリストとrecentf、file-cache、現在のディレクトリのbufferのリストとhelm-source-bookmarksとhelm-source-locateというもの(最後の2つはよくわからないし、重複しそうなので自分は使っていない)
まぁhelm-miniの重いバージョンみたいな認識


helm-ghqとは

簡単にいうとghqのリストをhelmで開く拡張。ディレクトリを開いたあとさらにそのディレクトリのなかを探してくれる。

作者さんのブログ http://masutaka.net/chalow/2014-06-22-1.html
GitHub : https://github.com/masutaka/emacs-helm-ghq


注意

もしかしたらhelm-for-files用のソース変数を追加するpull requestを送ったので今回紹介する設定をする前にhelm-ghqをアップデートしたほうがいいかもしれない。


設定

みてて思ったがブログに書くほどのことでもないかもしれない。。。(まぁいいか)

下のハイライトの無効化はお好みで。たぶん候補がめちゃめちゃ多いなら無効化しとくのが無難。

(require 'helm-files)

;; 重くなるのでhelm-for-filesだけハイライトを無効化する
(defadvice helm-for-files
(around helm-for-files-no-highlight activate)
"No highlight when using helm-for-files."
(let ((helm-mp-highlight-delay nil))
ad-do-it))

(require 'helm-ghq)
;; helm-for-filesのソースにhelm-ghqのソースを追加
(add-to-list 'helm-for-files-preferred-list 'helm-source-ghq)

上のadd-to-listの行は下のようにも設定できる(というか自分の設定)

(defconst helm-for-files-preferred-list
'(helm-source-buffers-list
helm-source-recentf
helm-source-file-cache
helm-source-ghq
helm-source-files-in-current-dir
;; comment out this is too heavy for me.
;; helm-source-bookmarks
;; helm-source-locate
))

これもお好み設定だけど、file-cache-add-directory-listの引数にディレクトリのリストを渡すとそのディレクトリのファイルがhelm-for-filesの候補に追加される。
じつをいうとこれがhelm-for-filesの候補で一番気に入っている。
ghqはバージョン管理しているディレクトリ単位だけど、こっちは関係ない。
自分のようにホームディレクトリをバージョン管理していて特定のディレクトリのファイルだけ候補にいれたい場合便利かもしれない。

(require 'filecache)
(file-cache-add-directory-list '("~/" "~/.emacs.d/"))
(setq file-cache-filter-regexps
(append file-cache-filter-regexps
;; 無視したいファイルの正規表現を指定もできる
'("\\.cache$")))

2014年8月9日土曜日

AndroidのAVDの高速化を試してみた

昔AndroidのAVDを試してけどめちゃくちゃ遅くて使う気がしなかったけど、高速化する方法があるらしいので、なんとなくやってみた。途中で(自分のなかで)はまりポイントがあったので、記事として書いておく。

自分の環境:

ubuntu12.04LTS
64bit環境
SSD

(関係ないけどawesome window managerも使ってる)

参考サイト:
http://my-clip-devdiary.blogspot.com/2013/01/android64bit-ubuntu-12041lts.html
http://saku-java.be-ourselves.jp/2014/05/18/intel-x86-android-emulator-setting/

どうやら、intel x86設定にするのとSnapshotを使うといいらしい。

昔設定したので、SDKやandroidコマンドは普通に使えた。

以下のコマンドでSDKはアップデートできた。-uをつけるとno-uiになるらしい。
(sdkだけ)

android update adb
android update sdk

適当にavdを作る

android avd

上のコマンドでavdマネージャを開いたあとCreateボタン、そのあとCPU/ABI設定でintel x86を選択し。(そのまえにandroid update sdkで対象のintel x86をインストールする)必要なavdを作る。

avdのイメージができたので起動してみた。

-[10598]% emulator-x86 -avd nexus4intel
emulator: ERROR: Could not load OpenGLES emulation library: libOpenglRender.so: cannot open shared object file: No such file or directory
emulator: WARNING: Could not initialize OpenglES emulation, using software renderer.
emulator: emulator window was out of view and was recentered

http://qt-project.org/forums/viewthread/29747

libOpenglRender.soが読めないらしいので、ググったところLD_LIBRARY_PATHにパスを追加するほうがいいということで、

locate libOpenglRender.so

で調べたら、sdk/tools/libディレクトリに入っていた。

とりあえず、パスを通してもういっかい挑戦してみたら、

-[10602]% emulator-x86 -avd nexus4intel -port 5554
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
emulator: emulator window was out of view and was recentered

のようなエラーがでた。

libGL.soがどうせ足りないんだろって思って調べた
(もしかしたら、apt-get install ia32-libsが必要かも?)

-[10659](1)% locate libGL.so
/usr/lib/i386-linux-gnu/mesa/libGL.so.1
/usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.0
/usr/lib/x86_64-linux-gnu/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0

x86_64版のlibGL.soのほうでパスを通しても、

Failed to load libGL.so
error libGL.so: wrong ELF class: ELFCLASS64
Failed to load libGL.so
error libGL.so: wrong ELF class: ELFCLASS64

というエラーがでるので、/usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.0の
symbolic link libGL.soをつくってパスを通すようにしたら
エラーはでなくなった。

最終的にはemulatorの起動は下のようなshell scriptにした

#!/bin/sh
SNAPSHOTNAME="default"
PORT=5554
LIBGL="/usr/lib/i386-linux-gnu/mesa/"
export LD_LIBRARY_PATH=$ANDROID_SDK_HOME/tools/lib/:$LIBGL:$LD_LIBRARY_PATH
echo "accessing the avd: telnet localhost ${PORT}"
# I couldn't save snapshot if I use just "emulator"(I chose intel86)
emulator-x86 -avd nexus4 -port $PORT -snapshot $SNAPSHOTNAME &
# or without snapshot
# emulator-x86 -avd nexus4 -port $PORT &

環境変数に32bit版のをまぜるのは、よくないのでemulator使うときだけまぜる
ようにした。
-avdの名前やport番号は適当にかえてください。(port番号については
emulator -help-portをいちどみたほうがいいかも)

libGL.soのディレクトリもシンボリックリンクを作ったところへかえてくださ
い。

他にはまったところとして、最初はemulatorの起動コマンドをemulatorにして
いましたが、この場合snapshotがうまく保存されませんでした。
理由はよくわかりませんが、emulator-x86を利用するとtelnetからsnapshotの
保存が可能でした。

telnet localhost port-number
# after connected to android
avd snapshot save snapshot-name

ただsnapshotといっても
saveした画面がでるのが7秒後くらい、操作うけつけるのが1分10秒後くらいで、
ん?って感じ。
試しにsnapshotなしで起動した場合でみたら、26秒くらいで操作できるようになった。

参考サイトの動画みると20秒くらいで操作できるようになってたから、普通に起動する分には成功してるっぽい。ただsnapshotは謎、どなたか見識のあるかたコメントいただければ。。。


Popular Posts

Blogger templates

Blogger news