« 2012年4月 | メイン | 2012年6月 »

2012年5月28日

WindowsとVMWare開発においてpbcopy的なやつ

僕は最近のWeb開発者にしては珍しくメインマシンがWindowsで、開発は全てVMWareのLinuxにputtyで繋いでやっています。

そうなると、やっぱクリップボードと連携したいとかそういう時があります。screenのペーストバッファをWindowsでも使いたいとか。

これまではマウスで選択して貼り付けてとかやってたんですが、screen縦分割とかしてると矩形選択モードに切り替えないといけないけどやり方忘れたりするし、何よりダサい。

Macにはpbcopy/pbpasteという便利なコマンドがあり、それと同じようなことが出来れば万事解決です。

解決策は簡単で、WindowsとVMは普通にTCP通信ができる(当たり前!)ので、Windows側にサーバーを立てて、クリップボードの読み書きが出来るAPIを提供すれば良い。

僕はWeb屋でPerl屋なので、plackでHTTPサーバー立てて、REST APIを提供するのが楽。

てことで作りました。

WinPB

Windows側のどこかに適当に落としてきて、winpb.batをダブルクリックするだけでとりあえず動くと思います。(動作にはPerlとPlackとRouter::Simpleが必要で、app.psgiをそのまま使う場合は、Plack::Middleware::Auth::QueryStringも必要です。)

上手いこと、起動したら、以下にアクセスしてみてください。

http://localhost:52225/?key=change_on_install

クリップボードの中身が見えたら成功です。

とりあえずそのままだと危険なので、タスクマネージャーからwperl.exeのプロセスを探して停止して下さい。

config.plを設定して認証keyの設定をしたり、plackupの引数で、VM用のnat側のIPアドレスしかlistenしないようにするなどすると良いでしょう。ひととおり設定したら、もう一度、winpb.batを起動。念のためブラウザでも確認してみて、OKならばスタートアップにも登録しておくと良いでしょう。

Windows側の設定は以上です。

あとは、VM側のLinuxの設定ですが、以下の様なスクリプトをパスの通ったところに置いておくと良いと思います。単にcurl使ってるだけです。

pbcopy

#!/bin/sh
. ~/.pbcopyrc
if [ -p /dev/stdin ];then
  PASTE=`cat -`
else
  echo 'usage: echo "hoge" | pbcopy';exit
fi
curl --silent http://$PBHOST/?key="$PBKEY" --data-urlencode "pb=$PASTE" > /dev/null

pbpaste

#!/bin/sh
. ~/.pbcopyrc
curl --silent http://$PBHOST/?key="$PBKEY"

設定ファイル~/.pbcopyrcに変数PBHOSTとPBKEYの設定をしています。

ちなみに、curlの--data-urlencodeオプションはPOSTデータをurlencodeしてくれる便利なオプションですが最近のcurlにしかないようです。CentOS5.5に入れようとしたら依存ライブラリ等の解決が色々めんどかったので、別途urlencodeしたりしました。

$ echo hoge | pbcopy

とかやって、ちゃんとWindowsのクリップボードにhogeが反映されるのを確認したら、以下のように.screenrcに追記すれば Esc-pでスクリーンのペーストバッファがクリップボードに入るようになって胸熱です。

bufferfile '.screen-exchange-file'
bind p eval 'writebuf' 'exec sh -c "cat .screen-exchange-file | pbcopy"' 'echo "paste to remote"'

すごく簡単な話です。なんで最近まで思いつかなかったのか。これまでWindows側にサーバーを立てるとかそういう発想があまりなかった。

ちなみに、Win32::ClipboardのUnicode対応がイケてなくて、残念ながらcp932領域の文字列しかWindows側に送ることができません。逆にWindows側でコピーしたUnicodeテキストはちゃんとutf8で取得できるようになっています。

00:17

2012年5月27日

Plack::Middleware::Auth::QueryString

http://search.cpan.org/~songmu/Plack-Middleware-Auth-QueryString-0.01/

http://example.com/?key=yourpasswordhere 的な認証を提供するミドルウェアです。

当然Publicなサービスでは使いものにならない(使ってはいけない!)ですが、ローカルに通信用のHTTPサーバー立てた時に気分的に適当にちょっとした認証をかけたい時に使うと良いと思います。

基本的な使い方はSYNOPSISにも書いてありますが、passwordのマッチングはスマートマッチを使っているため、Array Referenceやサブルーチンを受け付けることが可能です。

enable "Auth::QueryString", password => [qw/passa passb passc/];
enable "Auth::QueryString", password => sub {
   ...
};

スマートマッチを使っていることから分かるように、perl5.10.0以降でしか動かない適当モジュールです。OAuth2の最後の部分だけを切り出したとも言えます。

実際、スマートマッチはこういう用途にすごく向いているし、そこを狙って仕組みでもあるんだろうけど、正直理解しきれないし、false value絡みで意図せぬ挙動も多いので、配列の存在チェックくらいにしか使わないのが賢明でしょう。

あと、cpantestersでv5.16.0 RC0のテストがこけていて謎い...。

23:46

シェルスクリプトで標準入力をパイプ経由でのみ受け付ける

ファイル演算子 -p を使って、標準入力がパイプ経由かどうかで調べることが出来る。`cat -`で標準入力をそのまま飲み込むことが可能。

#!/bin/sh
if [[ -p /dev/stdin ]];then
  VAR=`cat -`
else
  echo 'usage: echo "hoge" | command';exit
fi
echo $VAR

23:30

Windows上でdos窓開かずにPerlプログラムを実行する方法

定期的に実行するスクリプトが起動した時に一瞬Dos窓が開いたり、常駐プロセスでDos窓が開きっぱなしになってしまうのを回避する。

ActivePerlだとwperl.exeってのが同梱されているので、それ経由でperlスクリプトを実行すれば良い。plackupも可能なので適当なサーバープロセスを立てたい時に重宝する。

wperlで起動したプロセスを止めたい時は、タスクマネージャーのプロセス一覧からwperlを探して停止するしか無いと思う。

ちなみに、psgiアプリをWindows起動時に起動させたい場合は、以下の様に記述したbatファイルをpsgiファイルが置いてあるディレクトリに準備して、そのショートカットをスタートアップに登録しておけば良い。

start C:\Perl64\bin\wperl.exe \Perl64\site\bin\plackup

最近はWindowsでもカジュアルにplackupできるので胸熱ですね。あんまそういう発想がなかったんですが、実はWindwos側に色々立てておけばVMとのやりとりが色々捗る。

23:22

2012年5月26日

perlbrewのperlをrsyncでばら撒くときの注意点

結論:なにも考えずに--updateオプションをつけているとハマる。--updateは付けちゃダメ!絶対!

perlbrewでインストールしたPerlをrsyncでばら撒くという運用をしているところは多いと思うんですけど、そこで最近一点ハマりました。

cpanモジュールをインストールした時にpmファイルのタイムスタンプは、tar ballの中身のファイルのタイムスタンプがそのまま保持されています。

ただし、コアモジュールのタイムスタンプはPerlインストール時のものになります。

そして、コアモジュールをupgradeした場合は、タイムスタンプはtar ballの中身のタイムスタンプになるので、タイムスタンプが古くなります。以下例。

$ perl -MTime::Piece\ 999
Time::Piece version 999 required--this is only version 1.15_01.
BEGIN failed--compilation aborted.
$ ls -l Time/Piece.pm
-r--r--r--  1 app app 22729 May 10 15:00 Time/Piece.pm # <- 今年の5月10日
$ cpanm Time::Piece
...
$ perl -MTime::Piece\ 999
Time::Piece version 999 required--this is only version 1.20.
BEGIN failed--compilation aborted.
$ ls -l Time/Piece.pm
-r--r--r--  1 app app 23506 Mar 17  2010 Piece.pm      # <- 2010年!?

つまり、5月10日にインストールしたPerlのTime/Piece.pmのタイムスタンプはその時のものになってるんですけど、cpanmでupgradeしたら、2010年のタイムスタンプになってしまいます。

これは、一台で動かす分には特に問題は起きません。

ただ、別のサーバーにrsyncをかけているような場合に、--updateオプションを有効にしてると、タイムスタンプが古いファイルは転送されないという困った事態が起こりえます。

なので、perlbrewのperlをrsyncする場合は--updateオプションは付けないようにしましょう。

ちなみにArcher::Plugin::Rsyncだと、updateオプションがデフォルト有効になっているのでハマりました。

15:24

Kyoto Tycoonでmemcachedプロトコルの圧縮オプションを有効にすると捗る

最近、セッションストレージはKyoto Tycoonを使っています。ゲームだとFlash生成時の情報をセッションに突っ込んだりするので、セッションデータが大きくなりがちです。それをユーザーごとに頻繁にGet/Setされると結構バカにならないトラフィックになったりulogがすごい勢いで溜まったりします。

Kyoto Tycoonはmemcachedプロトコルで使うことが多いでしょう。実はmemcachedプロトコルには、データを圧縮して通信するオプションがあり、Kyoto Tycoonでもそれを使うことが可能です。

Cache::Memcached::Fastだとこんな感じで指定できます。

my $kt = Cache::Memcached::Fast->new({
    servers   => [...],
    compress_threshold => 500,
    compress_ratio     => 0.9,
});

この例だと500byte以上のデータを圧縮してくれます。ただし、圧縮してもデータサイズが90%以下にならない圧縮効果が薄いデータは圧縮しないという設定です。

凄いのが圧縮・非圧縮のデータが混在しても大丈夫だということ。つまり、既に稼働しているKyoto Tycoonに対して、途中から圧縮を有効にすることが可能なのです!

実際、某サービスで途中から圧縮オプションを有効にして問題なく稼働しております。

この辺の情報は全て@fujiwaraに教えてもらったもので、基本的にfujiwara無双であります。

15:21

2012年5月 3日

GWに読むと良い技術書4冊という釣りタイトル

有隣堂ヨドバシAkibaで「IT・WEB業界に入るならこれを読んでおいて損はない!」という技術評論社の特選フェアをやっています。同僚のtypesterが推薦した本も並んでいますので、興味のある方は行ってみると良いと思います。僕も行きたいです。

その流れで弊社のエンジニア陣でも4冊推薦図書を出してみようという話の振りがあり、僕も4冊出してみたのですが、それをここにも載せておこうと思います。

珠玉のプログラミング(Programming Pearls)

"Programing Perl"のタイトルの元ネタ。ソートや2分探索などの基礎的なアルゴリズム等、コード例を交えて分かりやすく面白い。

アルゴリズム入門書と思いきや、奥の深い一冊。

リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法

ご存知「達人プログラマー」著者による一冊。「脳」のことを「ウェットウェア」と呼び認知科学や神経科学の領域にまで言及。

如何に効率良く達人プログラマとなるか、より実践的に踏み込んだ一冊。

まつもとゆきひろコードの世界

表紙があれだが何気に良書。

オブジェクト指向・デザパタ・JavaScriptとWebプログラミング・Ruby・正規表現・文字コード・正規表現・セキュリティ・関数型言語等のトピックに分かれ、広く・深めに網羅されている。

教養書として若手に読ませたい一冊。

心の社会

人工知能の大御所、MITの人工知能研究所設立者マーヴィン・ミンスキーによる、心と人工知能に関する考察が書かれた読み物。

細かいプロセス(エージェント)が相互作用することにより心が生じるという考え方。つまり「心はプログラミング可能」だと論じている。

あまりに衝撃的な内容だったため「コンピュータには何ができないか―哲学的人工知能批判」という反論書まで出版された。(これも名書)

自己考察やそのプログラム可能性にまで踏み込んだ、ぞくぞくするような一冊。


次点は以下。

   


16:23