入れててよかったVimプラギンとか設定とか

この記事はCPS Lab Advent Calendar 2015 - Adventarの14日目の記事になります。後輩向けに書きました。

Elixirのこと書こうと思ってたんですが、まだまだひよっこなのでまた後日。
Vimも自分でプラギン書かないひよっこですが、始めたばかりの人の役に立てそうなレベルのこと書きます。

入れててよかったVimプラギン

今回はとりあえず入れてみたけど助かってるなぁと感じたVimプラグイン(設定)を紹介しようと思います。
プラグイン入れることが全てではないですが、先人がベンリなものを作ってくれてるのでありがたく使わせてもらいます。
NeoBundle使ってるvimrcをそのまま切り貼りしてるのでたまに出てきますが、適宜読み替えて貰えれば幸いです。

lexima.vim

github.com

ソースコード書いてると良く""()で文字列を囲みますがその入力を助けてくれるプラグインです。 IDEっぽい感じになります。
自動で""{}を入力してくれるのでほぼ閉じ忘れがおきません。 文字で表現してもわかりづらいと思うので、githubgifを見てください。

" lexima.vim {{{
if neobundle#is_sourced("lexima.vim")
  let g:lexima_no_default_rules = 1
  call lexima#set_default_rules()
endif
" }}}

incsearch.vim

github.com

マッチするものが全てハイライトされるインクリメント検索ができます。 それがとても良いのです。

f:id:norikakip:20151214225206p:plain f:id:norikakip:20151214225250p:plain

" incsearch {{{
map / <Plug>(incsearch-forward)
map ? <Plug>(incsearch-backward)
map g/ <plug>(incsearch-stay)
" }}}

eskk.vim

github.com

Terminal環境によってはIMEが使えなくなってしまって困ることがあります。
そんな時に活躍します。skkの入力方式は癖がありますが、IMEなしで日本語が入力できるのはとてもありがたいです。
よく環境をお引越しする人にオススメです。

"eskk設定 {{{
let g:eskk#directory = '~/.eskk'
let g:eskk#dictionary = {
      \     'path' : "~/.skk-jisyo",
      \     'sorted' : 0,
      \     'encoding' : 'utf-8',
      \}
let g:eskk#large_dictionary = {
      \     'path' : "/usr/share/skk/SKK-JISYO.L",
      \     'sorted' : 1,
      \     'encoding' : 'euc-jp',
      \}
let g:eskk#enable_completion = 1
" }}}

プラギン以外

知ってると少しうれしい機能です

keywordprg

Vimではカーソル下のキーワードを調べる仕組みが用意されています。
デフォルトではK(Shift + k)でカーソル下のキーワードをmanを使ってしらべますが、 言語によってはドキュメントを検索するツールを指定したいです。その時にkeywordprgを使います。

autocmd FileType ruby call s:ruby_filetype_settings()
function! s:ruby_filetype_settings()
  setlocal tabstop=2 shiftround shiftwidth=2
  setlocal completeopt-=preview
  setlocal keywordprg=ri
endfunction

これでRubyのコードを書くときにKを押せばriでドキュメントを参照してくれるようになります。

vimのコマンド実行について

Vimではコマンドが一意に定まるとき、最後まで入力せずともコマンドが実行できます。タブで補完する必要もありません。

どういうことかと言うと、実行できるコマンドにExciteTranslateExploreがあったとして、

:Explore

これを

:Exp

に省略することが出来ます

自分でコマンドを書く際にこれを意識すると、とても入力効率が上がると思います。
下のscriptは現在開いているbufferのディレクトリにcdするコマンドです。

command! CDCurrent call s:CDCurrent()
function! s:CDCurrent()
  if isdirectory(expand('%:h'))
    cd %:h
  endif
endfunction

:CDで始まるコマンドは僕の入れているプラグインと被っていないので、これだけでbufferのディレクトリに移動できます。
なるべく被らないコマンドを定義して指を休めてください。

Vimはautocmdとmapだけですごく楽ができるので、慣れたらガシガシいじってください。

その他ポインタ

VimのCTRL-X補完について - daisuzu's notes

vim-jp » Vimのユーザーと開発者を結ぶコミュニティサイト

Vim Advent Calendar 2015 - Qiita

時間切れだぁ(・ัω・ั)

Railsチュートリアル2章をやってて引っかかったところのメモ

メモメモ

  1. development.rb:1:in `<top (required)>': undefined method `configure'

  2. dynamic_matchers.rb:22:in `method_missing': undefined method `raise_in_transactional_callbacks='

  3. ERROR RuntimeError: You must set config.secret_key_base in your app's config.

ejabberdをCentOS(v6.5)で動かす

XMPPサーバを立てる必要があったのでejabberdをCentOSにインストールして自動起動するようになるまでのあれこれ。
とりあえず動くようになったという状況なので、適切な状態ではないかもしれません。 今回の目的はきちんとした形での起動ではなくクライアントソフトウェアのための実験サーバなので動く状態でよかったのが主な理由でだいぶ適当です。
ejabberdが更新されればfixされると信じて…!

環境

ejabberdのインストール

Installing ejabberd | ejabberd Installation and Operation Guide

基本的には公式ドキュメントに従いインストールします。
英語が読みたくなくて日本語のリソースを探して途中まで参考にしました(๑╹ڡ╹๑)
インストール自体はとっても簡単、インストーラを落としてきて走らせると質問形式でインストールが進んでいきます。
システム上にインストールするためrootアカウントで作業した。
ejabberd関連のファイル一式は/opt/ejabberd-15.03にインストールされました。

ejabberd ユーザを作る

ドキュメントを読み進めて行くとWindowsLinux(もしくはUnix)によって作業がわかれます。
読みづらいので見出しを付けて欲しい…

CentOSなのでLinux向けの作業をする。具体的には、

  • ejabberd システムユーザの作成
  • ejabberd ユーザのホームディレクトリを /opt/ejabberd-15.03にする
# groupadd -r ejabberd
# useradd -g ejabberd -p ejabberd -r ejabberd 
# usermod -d /opt/ejabberd-15.03 ejabberd

これで/opt/ejabberd-15.03/bin/ejabberctlが使えるようになりました。
(上記作業を行わなくてもroot権限で使用することはできる)
ここから先が長かった…

binのstopスクリプトが動作するようにする

なぜか/opt/ejabberd-15.03/bin/stopがうまく動作しない…
メッセージを読むと同じbinにあるはずのepmdが見つからないとのことでした。
パスが通っていないらしい。

ぐぐって見つかったFixに従ってejabberdctlに以下の行を追加しました。

EPMD="$ROOT_DIR"/bin/epmd
INSTALLUSER=root

+# The problem is epmd isn't in the path of the ejabberdctl script.
+# The (quick fix) is at the top of bin/ejabberdctl, add in here!
+# See: https://www.ejabberd.im/node/5748
+
+PATH=$PATH:$(dirname $(readlink -f $0))

# check the proper system user is used if defined
if [ "$INSTALLUSER" != "" ] ; then

これで/opt/ejabberd-15.03/bin/stopが動かせるようになりました。やったぜ。

ejabberdの自動起動

あとは公式ドキュメントの通り、binの中にあるejabberd.initをinit.dにコピーします。 不安だったのでその前に動かせるかどうか試してみました。

# /opt/ejabberd-15.03/bin/ejabber.init start

動きません。しかもrootユーザで動かしてね♡的な事を言われれます。
何を言っているんだ……と思い色々試しますが動かず。

ejabberdctlstartstopは動くことから、initスクリプトがおかしいだろうとあたりをつけました。

スクリプトを開くと、結局ejabberdctlを実行している……

suコマンドの引数として与えられてるユーザをrootユーザに変更すると動きました。 変数を後続のスクリプトに受け継いでいるようなのが少し気になりますがとりあえずスルー。

chkconfigで自動起動する

initスクリプトは動くようになったので、あとはchkconfigで起動時に立ち上がるようにするだけ!
chkconfig用に追記して、iptablesでポートを開いてreboot
無事動作していることを確認しました。成し遂げたぜ。

参考にしたサイト一覧

Installing ejabberd | ejabberd Installation and Operation Guide
Service doesn't start automatically in CentOS
"epmd: command not found" after Ejabberd installation
CentOS 6 に ejabberd をインストールする方法 - だいたいおっけぇ

Edisonにubilinuxを入れたらRead-Only file systemで困った話

Edisonをそのまま使おうとしたが少し使い勝手が悪いためubilinuxを入れました。

起動してssh越しにログインしてapt-get updateすると

W: Some index files failed to download. They have been ignored, or old ones used instead.
W: Not using locking for read only lock file /var/lib/dpkg/lock
E: Unable to write to /var/cache/apt/
E: The package lists or status file could not be parsed or opened.

と出て、パッケージの更新ができませんでした。 chmodやremountも意味なしで困っていたところ、解決方法はRead-only file system | Intel Communitiesにありました。

e2fsck /dev/root

実行するとインタラクティブにいくつかの質問に答えることになります。自分の環境にあわせて質問に答えます。
(おそらく全部yでも問題ないと思います。僕はlost+foundだけnにしました)

その後rebootして無事パッケージ更新ができるようになりました。やったぜ。

Linuxで特定のIPへの通信に特定のインタフェースを使う

Rasberry PiでEthernetで繋いだネットワークとUSB Ethernetアダプタで繋いだネットワークを別々のセグメントに接続し、いざ通信しようとするとうまく行かないことがありました。

状況は、

  • eth0はグローバルへ出るためのIFでIPはDHCPで取得
  • eth1は特定機器との通信用でありIPは静的かつグローバルに出られない

この状態でブートすると、ping 8.8.8.8等グローバルの通信ができず。eth1がホストに到達できないと答える。 route -nで調べてみるとデフォルトゲートウェイがeth1とその所属するセグメントに取られていた。

調べてみると解決法はいくつかあるようですがディストリビューション特有のものもある……、今回は自分の機材ではないのでわかりやすくしたい。 ということで、一つのファイルを見ればわかるよう/etc/network/interfacesをいじって解決しました。

sudo vim /etc/network/interfaces

auto lo eth0

iface io inet loopback

iface default inet dhcp

iface eth0 inet dhcp

allow-hotplug eth1
iface eth1 inet static
address 172.31.40.24
netmask 255.255.255.0
network 172.31.40.0
broadcast 172.31.40.255
gateway 172.31.40.254
up route add -net 172.31.40.19/32 gw 172.31.40.19 dev eth1
up route del default gw 172.31.40.254

下2行が問題解決のために記述した設定です。

up route add -net XXX.XXX.XXX.XXX/ZZ gw YYY.YYY.YYY.YYY dev [Interface]

1行で特定機器への通信のためにeth1を使用するようにしました。XXX/ZZはどのnetwork宛の通信にInterfaceを使うかで、YYYはそのInterfaceのデフォルトゲートウェイのIPです(自分の場合はeth1)。

up route del default gw QQQ.QQQ.QQQ.QQQ

2行でおそらくdhcpでIPをもらう前に定義されてしまったであろうデフォルトゲートウェイを削除しました。 完璧にデフォルトゲートウェイを更新するのであれば新しいデフォルトゲートウェイを書いてやる必要があるかと思いますが、今回はせっかくDHCPでIPを取得しているので、放置することで正しいルートを見つけ出してくれることを期待して祈りながらリブートしました。 無事eth0がデフォルトゲートウェイとして使われるようになり問題は解決。やったぜ。

makeが終わらないのはntpで時刻合わせしてないのが原因でした

linuxボードでRubyを使うためにrbenv install 2.1.5するも一向にビルドが終わらない。 処理能力のせいかと思ってしばらくは放置してたんですがもう全く持って終わらない。 (結果的に6時間もボードの前で待ってました)。

気になってlogを読むとそこにはbuild may be incompleteと。
時刻合わせができておらずmakeがループしてました……

sudo apt-get install ntp

nictのntpサーバを指定することで無事Rubyインストールできました。疲れた……