Glide Note

glidenote's blog

開発環境の情報共有会でDash,SourceTree,Alfredの話をした

社内で開発環境についての情報を共有する会を開催した。 参加者全員が発表のスタイルで、ただ聞いてるだけの人がいないようにしたら いろいろな情報を共有出来て大変参考になった。

私は1日のほとんどをターミナル上で過ごすので、ここ数年GUIアプリにはあんまり関心が 無かったんですが、最近導入して便利だったやつを共有したら好評だったのでまとめておく。

Dash

ドキュメントブラウザ、スニペット管理ツール。ドキュメントをローカルにダウンロードして 利用するので高速。今日(2014/03/29)時点で130以上のドキュメントとAPIに対応していて、 プログラミング言語に加えて、MySQL、MongoDB、Puppet、Vagrantなどのドキュメントもある。 自作ドキュメントを追加することも可能。

有償アプリですが、一部機能制限のかかった無料版でも特に問題なし。 単独でももちろん便利なんですが、後述するAlfredと組み合わせると大変便利。

Alfredだけでなく下記のように様々なアプリと連携出来るようになっている。

私はスニペット管理にはoscardelben/sheetを使っているので、 ドキュメントブラウザとしてだけ使ってます。

SourceTree

MercurialとGitのGUIクライアント。普段gitはコマンドラインからしか使わないし、コミット履歴もtigで 見ているので、GUIのクライアントは不要だと思っていたんですが、使ってみると画面が見やすくて、 1日の終わりにSourceTreeでコミット履歴を眺めてると、どういう変更が入ったか把握出来て良い。

1日の終わりに自分の関わっているプロジェクトのコミット履歴を見返す習慣が付いたのも良かった。

Alfred

ランチャーはずっとLaunchBar 5を使っていて、 Alfredと併用していたんですが、Workflowが大変便利なので、昨年完全に乗り換えた。

情報共有会ではAlfredをランチャーとして使っている人は結構いたんですが、 有償版で利用出来るWorkflowを使っている人がいなかったので、どんな感じで使っているのか実演してみた。

やってることを簡単に説明すると下記のような感じ。早送りしている訳でなく実際もこのくらい軽快に動いてます。

  1. Puppetのhieraのドキュメント呼び出し
  2. RubyのFileUtilsのドキュメント呼び出し
  3. Vagrantのsshのドキュメントを呼び出し

今回の共有会はAlfred + Dashの布教のためにやったような感じ。

便利なAlfred workflow

他にも便利なWorkflowがあるので一部紹介。

私はPinboardのヘビーユーザなので、alfred+pinboardも下記のような感じで多用してます。

情報共有会で出てきた情報を列挙

出てきた情報をメモった順で箇条書き

当日参加していた同僚が作ったCastoが非常に素晴らしかった。

便利なアプリでも有料アプリだと買う価値があるのか迷うと思うので、 こういう情報の共有をすると良いと思う。

余談になりますが、今回スクリーンキャストの録画にはQuickCastを使ってみたけど、かなり使い勝手が良かった。

参考

tmux 1.9aの挙動が怪しかったので1.8に戻した

一昨日対応したのでメモとして残しておく。

tmuxが落ちまくって、開いてるウィンドウが一斉に無くなってストレスフルな状態に。 作業しているMacのtmuxのバージョンを確認したら1.9aというやつにいつのまにか上がっていた。 (brew upgradeとかやってたのが原因だけど)

homebrew使っているので、homebrewを使って古いバージョンに戻す。

brew versions tmuxでtmuxのバージョンを確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
brew versions tmux

Warning: brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
  1.9a     git checkout 7bec702 Library/Formula/tmux.rb
  1.9      git checkout fcb3161 Library/Formula/tmux.rb
  1.8      git checkout c356bf7 Library/Formula/tmux.rb
  1.7      git checkout 2de0838 Library/Formula/tmux.rb
  1.6      git checkout f4a0f44 Library/Formula/tmux.rb
  1.5      git checkout 1ffde14 Library/Formula/tmux.rb
  1.4      git checkout 2e82661 Library/Formula/tmux.rb
  1.3      git checkout 0a56d33 Library/Formula/tmux.rb
  1.2      git checkout 585ee08 Library/Formula/tmux.rb
  1.1      git checkout af6d133 Library/Formula/tmux.rb
  1.0      git checkout a82e823 Library/Formula/tmux.rb

1.9aの前に何を使っていたのか全く覚えていないけど、長く使っていた覚えのある1.8に戻してみる。

1
2
3
4
brew remove tmux
cd /usr/local/
git checkout c356bf7 Library/Formula/tmux.rb
brew install tmux

解決した。

1.9aの挙動かなり怪しい感じなので要注意。

参考

dotenvを利用して環境ごとでVagrantfileの設定値を変更してみる

tcnksmさんのブログを見てて

おー、便利そうと眺めていたらdotenvで実現出来るとのやりとりを目撃。

私もdotenvを知らなかったので、Vagrant+dotenvがどんな感じで使えるのかやってみた。

Vagrantからdotenvが使えるようにインストール

何故かvagrant plugin installにはvagrant-*みたいなのしかインストール出来ないと勝手に勘違いしてたんですが、 普通にgem installしているだけなので、下記でdotenvが導入出来る。 (saharaが普通にそうだったし、~/.vagrant.d/gems/gems/の中を見れば普通にプラグインに依存してるgemが入ってるのも分かる)

1
vagrant plugin install dotenv

.envを用意

dotenvはディレクトリ内にある.envというファイル中身を参照するので、 環境ごとで変更する値を.envに下記のように記載。

1
2
3
4
VM_HOSTNAME     = 'dev001.foovar.com'
DO_CLIENT_ID    = 'my_client_id'
DO_API_KEY      = 'my_api_key'
DO_SSH_KEY_NAME = 'my_ssh_key_name'

Vagrantfileから.envの内容を呼び出す

.envの内容を呼び出すにはDotenv.loadVagrantfileに記載して、${ENV['HOGE']}みたいな感じで呼び出す。 私が普段使ってるDigitalOcean用のVagrantfileで使ってみると下記のような感じ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dotenv.load

Vagrant.configure('2') do |config|
  config.vm.hostname              = "#{ENV['VM_HOSTNAME']}"
  config.vm.provision "shell", inline: "test -e /etc/yum.repos.d/epel.repo || rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm"
  config.vm.provision "shell", inline: "test -e /etc/puppet || yum -y install puppet"

  config.vm.provider :digital_ocean do |provider, override|
    provider.client_id            = "#{ENV['DO_CLIENT_ID']}"
    provider.api_key              = "#{ENV['DO_API_KEY']}"
    provider.ssh_key_name         = "#{ENV['DO_SSH_KEY_NAME']}"

    override.ssh.private_key_path = '~/.ssh/id_rsa'
    override.vm.box               = 'digital_ocean'
    override.vm.box_url           = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"

    provider.image                = 'CentOS 6.4 x64'
    provider.region               = 'Singapore 1'
    provider.size                 = '512MB'
    provider.ca_path              = '/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt'
  end
end

vagrant upしてみる。

1
vagrant up --provider=digital_ocean

ちゃんと動いた。

Vagrantfileを共通化して、環境毎で個別に設定を変更したい場合や特定の値は公開したくない場合などはdotenv使えば良さそう。

(Vagrant+dotenvについては以前Vagrantのissueに提案されてましたPackerのuser variablesを使えと一蹴されてた。)

GitHubとかに公開する場合は誤って.envを公開しないよう.gitignoreに追加をお忘れ無く。

参考

トルネの外付けHDDがぶっ壊れたのでRAID1化した話

昨年末nasneの外付けHDDが壊れたのに続いて、先週トルネに接続していた外付けのHDDが壊れて 録画データが全飛びしたので、RAID1でミラーリングしたものを取り付けるようにした。 (私はそんなにテレビを観ないし、観たらすぐ消すスタイルなので正直ぶっ壊れてもいいと思っていたのですが、 奥さんはそうでは無かったので…)

ラトックシステム USB3.0/2.0 RAIDケース(HDD2台用) RS-EC32-U3R

買ったHDDケースはこれ。7千円ちょっと。Mac用のRAIDユーティリティだと細かい設定が出来ず単にRAID1を組んだだけ。 RAID組んだ後に、MacのディスクユーティリティでFAT32にフォーマットして終わり。 デグレードしたら、本体の前面ランプとブザー音で教えてくれる模様。

windows用のユーティリティだと FAN制御とか、メールでアラート飛ばしたりとか設定出来るらしい。


DT01ACA200 [2TB SATA600 7200]

トルネはFAT32で、2TBまでしか利用できないので、東芝のHDDで2TBのものを2個購入で1万6千円弱。 製造ロットで不具合抱えてたりする可能性を考えると、本当は別メーカーでRAID組んだ方がいいんだろうけど、 ベンダーからサーバ買ったときとか、HDD同じ型番だしまあ2台同時に死亡するのは過去の経験から RAIDコントローラー丸ごとなので、HDD別メーカーにしてても対処出来ない。


かかった費用は2万3千円くらい(高い…)。4〜5日使った印象だと音も静かで、録画も特に問題無し。

MacはTime Machine、自宅サーバはetckeeper+bitbucketやrsyncでVPSに毎日バックアップ取ってるから、 基本的にデータ全飛びみたいなのは基本無いんだけど、トルネはバックアップ意識してなかったので、 バックアップとかみんなどうしているのか気になる。

レコトルネ対応のBDレコーダー買って、保存するやつはBDに書き出せばいいだけの話かな-

ssh接続したリモートサーバの出力を手元Macのクリップボードに送る

今までsshしたリモートサーバ上でコマンド実行したときの結果出力とかは、 tmuxのコピーモードとかを駆使して、Macのクリップボードに送ってたんですが もっと手軽に出来る方法があったのでGitHubにまとめてみた。

仕組みの説明

  1. Mac上で、受け取った内容をクリップボード(pbcopy)に渡すLaunchAgentを作って起動
  2. リモートサーバ上の出力を受け取るスクリプトrpbcopy(nc)に渡す
  3. sshのRemoteForwardを利用して、リモートサーバでrpcopy(nc)に渡された内容をMac上のLaunchAgentに渡す
  4. Mac上のLaunchAgentが受け取ったデータをMacのpbcopy(クリップボード)に入れる
  5. pbpasteなどで貼り付けが出来る

図にすると下記のような感じ

1
2
3
4
5
6
7
8
+ - - - - - - - - -+                       +- - - - - - - - - - - - - - - - -+
' Remote Server:   '                       ' Mac:                            '
'                  '                       '                                 '
' +--------------+ '  ssh(RemoteForward)   ' +--------------+     +--------+ '
' | rpbcopy(nc)  | ' --------------------> ' | LaunchAgent  | --> | pbcopy | '
' +--------------+ '                       ' +--------------+     +--------+ '
'                  '                       '                                 '
+ - - - - - - - - -+                       +- - - - - - - - - - - - - - - - -+

導入方法

動作検証環境

  • リモートサーバ CentOS 6.4、Fedora 19
  • ローカルMac OS X 10.9.1

glidenote/rpbcopyに各種ファイルをまとめているので、 cloneしてくるのが早いです。

1
git clone https://github.com/glidenote/rpbcopy

Mac側の設定

LaunchAgentを起動

2224ポートで待ち受けて、受け取った内容をクリップボードに渡すLaunchAgentを用意。 同梱のpbcopy.plist~/Library/LaunchAgents/pbcopy.plistに設置して、下記で起動

1
launchctl load ~/Library/LaunchAgents/pbcopy.plist

停止する場合は下記

1
launchctl unload ~/Library/LaunchAgents/pbcopy.plist

~/.ssh/configの設定

リモートサーバの2224ポートをフォワーディングするので、 ~/.ssh/config

1
RemoteForward 2224 127.0.0.1:2224

を追加。

~/.CFUserTextEncodingの設定

必ず必要な作業ではありませんが、UTF-8の内容を送ると文字化けが発生する場合、転送が上手くされない場合は 同梱の.CFUserTextEncoding~/.CFUserTextEncodingに設置することで回避出来ると思います。

~/.CFUserTextEncodingを編集することで他に影響が及ぶ場合があるので、 必ずバックアップを取り、自己責任で編集お願いします。

リモートサーバ(CentOS)側の設定

ncの導入

nc(netcat)が無いと使えないのでncを導入。(ncのバージョンが古いと-Cオプションが存在しない場合があります。)

1
sudo yum -y install nc

rpbcopyスクリプトの設置

同梱のrpbcopy~/bin/rpbcopyなどPATHが通っている場所に設置して権限を付与

1
chmod a+x ~/bin/rpbcopy

使い方

リモートサーバにsshログイン。 手元Macのクリップボードに送りたいファイルやコマンドの出力を、リモートサーバ上で

1
2
3
4
5
6
7
8
9
10
11
# 転送が出来るかテスト
echo "hello" | rpbcopy

# 日本語が転送が出来るかテスト。駄目な場合はMac側の `~/.CFUserTextEncoding`を設定する必要あり
echo "こんにちは" | rpbcopy

# fileの中身を手元Macのクリップボードにコピー
cat fileneme | rpbcopy

# リモートサーバのhistoryの内容を手元Macのクリップボードにコピー
history | rpbcopy

という感じでrpbcopyに渡すと、手元のMacのクリップボードに渡されるので Mac側でpbpasteや貼り付けが出来る。

補足

~/.bash_profile~/.zsh_profileなどに

1
alias pbcopy='~/bin/rpbcopy'

とaliasを追加して、pbcopyでも使えるようにしておけば、 リモートサーバとローカルサーバを意識せずに利用出来る。

トラブルシューティング

導入の際にハマったところをまとめておく。

Mac側

launchctl load/unloadを実行するとCould not open job overrides database at: /private/var/db/launchd.db/com.apple.launchd/overrides.plist: 13: Permission deniedと出る。

tmuxを起動している状態でlaunchctl load/unloadを実行するとPermissionのエラーが出てしまうことがあるようです。ChrisJohnsen/tmux-MacOSX-pasteboardを利用することで回避出来る模様。

LaunchAgentは動作しているか、2224ポートは開いているか確認

1
nc -vz 127.0.0.1 2224

LaunchAgent => pbcopy とデータが渡っているか。

Macのncの場合オプションは-cなので注意

1
2
echo "hello" | nc -c 127.0.0.1 2224
pbpaste

LaunchAgent => pbcopy と日本語のデータが渡っているか。

Macのncの場合オプションは-cなので注意.

1
2
echo "日本語のテスト" | nc -c 127.0.0.1 2224
pbpaste

駄目な場合は、~/.CFUserTextEncodingを同梱のものに入れ替えるてどうか確認。

CentOS側

ncが入っているか

1
type nc

2224ポートと疎通が出来ているか。SSH RemoteForwardが出来ているか

1
nc -vz 127.0.0.1 2224

SSH RemoteForward経由でMacのpbpasteにデータを渡せているか

1
echo "hello" | nc -c 127.0.0.1 2224

mac側でpbpasteを実行してみてどうか。


普段私が常用しているmoshだとこれが利用出来ないので、いい方法がないか思案中。
とりあえず、ターミナル作業用のmosh接続とは別でrpbcopy専用のssh接続を作っておくことで利用してる。

参考