kidoOooOoooOOom

ゲーム開発やってます

INI LIKEフォーマットをparse

node.jsのプログラムから、ansibleのinventory に記載した hosts情報を使ってごにょごにょしたいような場合、INI フォーマットをparseする ini モジュールを使えば簡単。

iniファイル

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

iniモジュールで parseして出力

var ini = require('ini');

var output = ini.parse(fs.readFileSync('/ansible/inventory/nodejs/web-dev', 'utf-8'));
console.log(output);

出力結果

{ webservers: { 'foo.example.com': true, 'bar.example.com': true },
  dbservers: 
   { 'one.example.com': true,
     'two.example.com': true,
     'three.example.com': true } }

複数ホスト、ファイルを同時にtailできるmultitailコマンド

複数ホストにまたがるログファイルを同時にtail できるコマンドがあったのでメモ。

yum install multitail

でインストールするだけ。
ホストAのログファイルXとホストBのログファイルをYを連結してtailfする場合は下記のようなコマンド。

multitail -l "ssh username@hostA tail -f /var/log/XXX.log" -L "ssh username@hostB tail -f /var/log/YYY.log"

ウインドウを分けて表示する場合は、二つ目のオプションの "-L"を"-l"にすればおk。
"-e"オプションを使えば、正規表現で出力内容をフィルタリングできる。

nodeでファイルの拡張子を厳格に指定して読み込み

nodeのプロジェクトで、/lib/service/index.js などのファイルから、同ディレクトリ配下のjsファイルを一括してexportsさせるケースがある。例えば下記のようなコード。

var fs = require('fs');
var path = require('path');
var _ = require('lodash');

_.forEach(_.filter(fs.readdirSync(__dirname), function (name) {
  return ('index.js' !== name);
}), function (name) {
  var basename = path.basename(name, suffix);
  exports[basename] = require('./' + basename);
});

これでうまく動いていたが、ある日突然nodeが死亡するケースが起きた。
原因を調べてみると、この index.jsのexports処理で不正なファイルを読み込もうとして落ちていた。
この不正なファイルというのが、「hoge.js.swp」といった vim でファイルを開いた時に自動で作られるswapファイルだった。

というわけで、余計なファイルを読み込まないように pathモジュールのextname()関数を用いて厳格にファイル拡張子を指定すれば問題なくなった。

path.extname(filename) === .'js'

http://nodejs.org/api/path.html#path_path_extname_p

macのterminal.appを環境別に色分け設定して共有

tmuxで各環境(dev, stg, prdなど)別のコンソール設定を作成できたので、次は環境別にコンソールの色を変えてみたい。
Macのターミナルappの[環境設定]-[設定]で + を押して新規プロファイルを作成する。


適当にウインドウの色や大きさの設定をし、[シェル]の設定でtmuxを立ち上げるコマンドを実行するようにしておく。

このプロファイルをドラッグ&ドロップでデスクトップなどに保存し、ターミナルから

open 保存したファイル

を実行すると設定したターミナルプロファイルでtmuxが立ち上がる。

tmuxのconf

いくつかのtmux設定記事を参考にして、適当な設定を自分向けに書いたのでメモ。
https://github.com/kidooom/tmux/blob/master/.tmux.conf

よく使うキーバインドとしては、(prefixはCtrl+aに変更してます)
C-a ? : ヘルプ
C-a [0-9] : window移動
C-a o : pain移動
C-a x: pain終了
C-a - : 水平分割
C-a | : 垂直分割
C-a d: デタッチ
tmux a: 最後にデタッチしたセッションにアタッチ

tmuxとtmuxinatorで開発環境別のコンソール環境整備

dev環境で作業やログ調査をする際に、webサーバをsshで開いてlogをtailして dbサーバをsshで開いてlogをtailしてmanagerサーバを(略)するのが面倒なので、tmuxとtmuxinatorを使ってコマンド一発でこの環境が開くようにする。

  • tmuxのインストール
$ brew install tmux
  • tmuxinatorのインストール
$ gem install tmuxinator
$ echo ' [[ -s $HOME/.tmuxinator/scripts/tmuxinator ]] && source $HOME/.tmuxinator/scripts/tmuxinator ' >> ${HOME}/.bashrc
$ source ${HOME}/.bashrc

$ echo 'export EDITOR=/usr/bin/vim' >> ${HOME}/.bashrc
$ echo 'export SHELL=/bin/bash' >> ${HOME}/.bashrc
$ source ${HOME}/.bashrc

// 動作確認
$ mux doctor


tmuxinatorのプロジェクトを作成する

mux new hogehoge

実行すると $EDITOR に設定したエディタで ~/.tmuxinator ディレクトリ以下に作成された yml ファイルが開くので、下記のような設定をした。

# ~/.tmuxinator/hoge.yml

name: hoge
root: ~/

windows:
  - web:
      layout: main-vertical
      panes:
        - ssh $SSH_USERNAME@hogeweb
        - ssh $SSH_USERNAME@hogeweb -t tailf /var/log/error.log
        - ssh $SSH_USERNAME@hogeweb -t tailf /var/log/api.log
  - db:
      layout: main-vertical
      panes:
        - ssh $SSH_USERNAME@hogedb
        - ssh $SSH_USERNAME@hogedb -t mongo
  - redis:
      layout: main-vertical
      panes:
        - ssh $SSH_USERNAME@hogeredis

layoutなどは適当なので、今後調節していく。
このconfファイルを社内のリポジトリに登録しておけば、チーム内でコンソール環境を共有できて良さげ。


ターミナルマルチプレクサ tmux 入門

ターミナルマルチプレクサ tmux 入門

Jenkinsジョブをリモートからビルド実行

管理ツールなど外部サーバからJenkinsのジョブを実行したい場合、Jenkinsのジョブ設定にある下記のリモートビルドの設定を行えばOK.

後は、外部サーバから設定したtoken付随のURLを叩くとjobが実行される。