入れててよかったVimプラギンとか設定とか
この記事はCPS Lab Advent Calendar 2015 - Adventarの14日目の記事になります。後輩向けに書きました。
Elixirのこと書こうと思ってたんですが、まだまだひよっこなのでまた後日。
Vimも自分でプラギン書かないひよっこですが、始めたばかりの人の役に立てそうなレベルのこと書きます。
入れててよかったVimプラギン
今回はとりあえず入れてみたけど助かってるなぁと感じたVimのプラグイン(設定)を紹介しようと思います。
プラグイン入れることが全てではないですが、先人がベンリなものを作ってくれてるのでありがたく使わせてもらいます。
NeoBundle使ってるvimrcをそのまま切り貼りしてるのでたまに出てきますが、適宜読み替えて貰えれば幸いです。
lexima.vim
ソースコード書いてると良く""
や()
で文字列を囲みますがその入力を助けてくれるプラグインです。
IDEっぽい感じになります。
自動で""
や{}
を入力してくれるのでほぼ閉じ忘れがおきません。
文字で表現してもわかりづらいと思うので、githubのgifを見てください。
" lexima.vim {{{ if neobundle#is_sourced("lexima.vim") let g:lexima_no_default_rules = 1 call lexima#set_default_rules() endif " }}}
incsearch.vim
マッチするものが全てハイライトされるインクリメント検索ができます。 それがとても良いのです。
" incsearch {{{ map / <Plug>(incsearch-forward) map ? <Plug>(incsearch-backward) map g/ <plug>(incsearch-stay) " }}}
eskk.vim
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ではコマンドが一意に定まるとき、最後まで入力せずともコマンドが実行できます。タブで補完する必要もありません。
どういうことかと言うと、実行できるコマンドにExciteTranslate
とExplore
があったとして、
: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章をやってて引っかかったところのメモ
メモメモ
development.rb:1:in `<top (required)>': undefined method `configure'
解決法
config/environments/development.rb内の
Rails.application.config
を
DemoApp::Application.config
に書き換える参照
gem - Error launching Rails server: undefined method 'configure' - Stack Overflow
dynamic_matchers.rb:22:in `method_missing': undefined method `raise_in_transactional_callbacks='
解決法
config/application.rb内の
config.active_record.raise_in_transactional_callbacks = true
の記述を消す参照
ERROR RuntimeError: You must set config.secret_key_base in your app's config.
解決法
Gemfile内のrailsのバージョンを
4.0.5
から4.1.0
に書き換えてbundle update
参照
You must set config.secret_key_base in your app's config. エラー解決 - がんばります。
ejabberdをCentOS(v6.5)で動かす
XMPPサーバを立てる必要があったのでejabberdをCentOSにインストールして自動起動するようになるまでのあれこれ。
とりあえず動くようになったという状況なので、適切な状態ではないかもしれません。
今回の目的はきちんとした形での起動ではなくクライアントソフトウェアのための実験サーバなので動く状態でよかったのが主な理由でだいぶ適当です。
ejabberdが更新されればfixされると信じて…!
環境
- CentOS 6.5
- ejabberd 15.03
ejabberdのインストール
Installing ejabberd | ejabberd Installation and Operation Guide
基本的には公式ドキュメントに従いインストールします。
英語が読みたくなくて日本語のリソースを探して途中まで参考にしました(๑╹ڡ╹๑)
インストール自体はとっても簡単、インストーラを落としてきて走らせると質問形式でインストールが進んでいきます。
システム上にインストールするためrootアカウントで作業した。
ejabberd関連のファイル一式は/opt/ejabberd-15.03
にインストールされました。
ejabberd ユーザを作る
ドキュメントを読み進めて行くとWindowsとLinux(もしくはUnix)によって作業がわかれます。
読みづらいので見出しを付けて欲しい…
- 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ユーザで動かしてね♡的な事を言われれます。
何を言っているんだ……と思い色々試しますが動かず。
ejabberdctl
、start
、stop
は動くことから、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がデフォルトゲートウェイとして使われるようになり問題は解決。やったぜ。
Ubuntu14.04でgem install rmagickが出来ない
aptでimagemagickを入れたのにgemでrmagickを入れようとするとエラー
```
sudo apt-get install pkg-config
sudo apt-get install libmagickwand-dev
```
いつも忘れてしまう…