トップ 最新 追記

2009-08-01 [長年日記]

_ iPhone OS のアップデート方法知らんかった

※ 書いている時点で3ヶ月近く前の日記です。

どうも touch 使いの wtnabe です。iPhone OS の脆弱性が見つかってアップデートが出たじゃないですか。

18:17:24 >wtnabe< iPhone OS ってどこから update 入手するんだ?
18:20:35 >wtnabe< アプリのアップデートでもないし…
18:22:17 >wtnabe< touch は無関係ということでいいのかな?
18:22:38 <currycooqoo> @wtnabe iTunesからー
18:23:40 >wtnabe< あ、iTunes の ipod 接続時の [ アップデートを確認 ]
か。
18:23:49 >wtnabe< まぁ無関係っぽいな
18:24:25 >wtnabe< @currycooqoo たぶん分かったと思います。ありがとうご
ざいます
18:25:38 <cxx> @wtnabe 携帯電話SMSの脆弱性の修正だそうなのでtouchは関
係なさそうですね
18:26:09 >wtnabe< @cxx SMSがなんだか分からなくて判断できなかったのです
^^; ありがとうございます。安心しました。

右往左往して無関係だったというオチ。まぁ方法が分かったので次回からは困らないだろう。

Tags: iPod

2009-08-03 [長年日記]

_ ダイソーのシールがやわすぎる

クリアホルダーあるじゃないですか。あの透明でペラペラで数枚の紙を中に入れておけるやつ。こまい仕事をやっつけていくにはいいんですけど、さすがに容量が小さすぎるので、数が増えちゃうんですよね。で、それをまとめるファイルを買ったんですよ。ダイソーで。

そのファイルにダイソーのシールが悪目立ちする感じで貼られてたんではがそうとしたんです。

……。失敗。

09:13:57 >wtnabe< ダイソーのシールは粘着力に対して紙がやわすぎる
09:14:33 >wtnabe< シールはがそうとする -> 紙の方が弱くて途中で破れる
-> いーってなる <- イマココ

その後、延々と消しゴム掛けて丁寧に剥いでいきましたとさ。いくらファイルが安く手に入ってもこの時間のロスを考えるとイマイチな気がしたのでした。

なんかどうも個人的には100円ショップってあんまりうまく活用できないというか、買うとガッカリすることが多い気がします。なんでだろう。いい買い物した!って思うことが少ないんだなー。

Tags: 日々

2009-08-06 [長年日記]

_ FreeBSD 6.4 を MSI U100 w/ VBox 3 にインストールしてみた

またログから昔の日記を書くメソッド。定期的にインストールの勘所が脳から purge されるので、たまに補完しないといけない。

今回も割とハマった。

  • disk1 が boot できない
  • bootonly なら立ち上がる
  • DHCP で IP アドレス取得できない
    • → VBox での NIC の設定を変えたらイケた
  • 全部ネットワークインストールしようとしたけどデフォルトが PASV mode じゃないらしく、ftp の転送でハマる

なんか何回やっても disk1 の digest が合わないのでたぶん壊れている気がする。もしかするとみんな upgrade ばかりで新規インストールしてないのかな?

入れてみただけでまだちゃんと使ってない。今回は netbook ということもあるけど、一般的なホスティング環境に近いのはこっちなんじゃないかな?という予想をして pkg だけでシステムを組んでみることにしている。pkg には pkg で upgrade の仕組みがあるし、典型的な環境を起こすだけならたぶんこっちの方が立ち上げもメンテも楽なんじゃないかという予想。もちろん ports の醍醐味は完全になくなるけど、そこはそれ。割り切っていくつもり。

Tags: FreeBSD

2009-08-09 [長年日記]

_ SDHC へのファイルのコピーに失敗して規格を学ぶの巻

投げ売りの SDHC 買ってきたんですよ。4GB かな。別に自分でガッツリ使いたかったわけじゃなくてデータ入れて「あげる」用なんだけど、そのとき Finder でファイルをコピーしてたらなんかコピーできてないファイルがあるんですよね。何回やってもダメなんで諦めて rsync でコピーしちゃったんですけど、

普通の人は Finder でコピーできなきゃもうどうにもならない

でしょ。これはまずいんじゃないかなぁ、なんでだろうと思ったんだけど SD カードについて調べているうちにその辺の話はどうでもよくなって、なんか知らなかったことがいっぱい出てきて嬉しくなってしまいました。

  • SDHC は FAT32 なので 32GB までイケる

あぁ、SD カードは FAT16 だったのね。

  • FAT32 なのに 32GB までに制限してあるのはなぜかそこまでに制限してある Windows 標準のフォーマッタに合わせてあるのだろう

あの制限、ときどき困るよねぇ。

でも 32GB って半端ですよね。その上の容量が欲しくなったらどうすんだろうというか、HD なムービーが当たり前になってきた昨今では 32GB なんてあっという間なのではとか思ったら exFAT というベツモノが出てきました。

exFAT - Wikipedia

なになに、

  • NTFS の向いていない用途(要するに組み込みか?)向け
  • FAT とは互換性なし
  • これに対応する SD カードの規格は SDXC

FAT と互換性がないんすか。Mac や Linux でも安心して使えるのかなぁ? なんかちょっと不安ですね。

[追記]

「NFTS-3G」のTuxera、「exFAT」の知的所有権で米Microsoftと合意 - SourceForge.JP Magazine

Tags: Disk

2009-08-13 [長年日記]

_ VirtualBox の設定ファイルを簡単にバックアップするツールを作って公開する過程で分かったこと

まとめ

  • bin/ ディレクトリに置いて gemspec の exectables に入れてやれば Rakefile も実行ファイルとしてインストール可能
  • github で gem を公開するには repository の設定で [ Rubygem ] にチェックを入れて gemspec を push するだけ

cutagem 簡単だし依存も少ないし、いいよ! PHP で Pear パッケージ作るより楽だと思うよ!

vbox_tools

wtnabe's vbox_tools at master - GitHub

昨今なんでもかんでも rake でやりたい病の wtnabe です。今回は VirtualBox の設定ファイルのバックアップの取り回しを rake でやります。

背景

なんでこんなもん作ったか。

  • VirtualBox はバージョンアップで xml ファイルに非互換が入る場合がある
  • VirtualBox はバージョンアップするとなんだか分からないけど guest が kernel panic で起きなくなる場合がある。その際、extradata の部分を一度削除して素の状態に戻すると普通に起動できることが多い。
    • 一度新しいバージョンで起動できると extradata を元に戻しても以前と同じように動作する。

という、困った症状が Windows host, MacOSX host 問わず起きることがあります。経験から言うと Windows host の方がトラブルが多い気がします。Linux host では使ったことがありません。

そして設定ファイルのフォーマットに非互換が生まれる場合しか VirtualBox はバージョンアップ時に自動的に設定ファイルのバックアップを取ってくれません。これはちょっと怖いというか何かあったときに面倒くさい。

ということで作りました。

中身は VBoxManage*1 と FileUtils の組み合わせで、そんなに面白いもんじゃないです。苦労したのは設定ファイルなどをエディタに渡して開くところで、最終的に Windows では満足いく動作を得られていません。

Rakefile を gem で bin としてインストールしたい

bin としてインストールするためにやったことは簡単で、

bin/vbox_tools ( <- Rakefile )

に Rakefile を置いてこれを gemspec に exectables として追加するだけ*2。これで gem install すると PATH の通った bin ディレクトリにこの Rakefile を読み込むだけのファイルができあがります。

ただし、開発時にはこのままでは実行できないので shebang を

#! /PATH/TO/rake -f

にしておきます。あ、実際に作ったものは

#! /usr/bin/env rake -f

にしてあるんだけど、これで動くのは *BSD だけかも。

Windowsでは

ただし Windows の場合は事情が違います。Windows で gem install すると bin/vbox_tools が Ruby をインストールした bin ディレクトリ、たぶん C:\Ruby\bin に作られ、さらにこれを ruby で実行するための .bat ファイルが生成されます。

しかしこの自動生成の .bat ファイルはあくまで Ruby で呼び出すことを目的としているので Rakefile を bin としてインストールしたい場合は嬉しくありません。

今回は解決方法が分からなかったので gem の中に予め .bat を用意しておいて、Windows の人は手作業でこの .bat ファイルを C:\Ruby\bin などの中に copy して使ってくれとドキュメントの中に書くことでお茶を濁しました。

何かいい方法あるんでしょうか。

cutagem で github に gem を置きたい

先日のgem 作るには何がいいのという記事には全然反応がありませんでしたが*3、結局依存が少なくて手間の少なそうな cutagem を使うことにしました。

準備

gem source -a http://gems.github.com
gem install genki-cutagem

作業開始

cutagem GEMNAME

すると

  1. 指定した名前のディレクトリがカレントに作成される
  2. その中に skelton がダダっとできる
  3. 何かキーを押すと Rakefile を編集するためにエディタが起きる
    • ここで AUTHOR や EMAIL など必要な情報を入れて閉じる

試しにこの段階の vbox_tools は以下のようなツリーになります

vbox_tools
|-- ChangeLog
|-- README
|-- Rakefile
|-- lib
|   `-- vbox_tools.rb
`-- test
    |-- test_helper.rb
    `-- vbox_tools_test.rb

Rakefile がありますね。早速

rake

と叩くといきなりテストが動いて、当然何もコードがないので RED になります。いいですね、TDD です*4。こういう環境がお膳立てされるのはゼロから自分でテストツールの使い方を調べて導入して…とやっていくより断然楽ちんなので、すぐにスタートを切ることができます。

で、今回は github の話なので

作ったディレクトリで git init

を忘れずに。

cutagem にできること

rake -T
rake clean            # Remove any temporary products.
rake clobber          # Remove any generated file.
rake clobber_package  # Remove package products
rake clobber_rdoc     # Remove rdoc products
rake debug_gem        # Show information about the gem.
rake gem              # Build the gem file vbox_tools-0.0.1.gem
rake gemspec          # Update gem spec
rake package          # Build all the packages
rake rdoc             # Build the rdoc HTML Files
rake release          # Package and upload the release to rubyforge.
rake repackage        # Force a rebuild of the package files
rake rerdoc           # Force a rebuild of the RDOC files
rake rubyforge        # Publish to RubyForge
rake test             # Run tests for test

今回使うのは gemspec, test だけです。

作る

省略。

rake で test しまくって目的の動作を実現してください。

実行ファイルを gemspec の exectables に追加

skelton の bin/ ディレクトリの中に実行バイナリとしてインストールしたいファイルを置くだけでは gem install したときにはインストールされません。

cutagem で作った Rakefile の中に

BIN_FILES         = %w()

という行がありますので、ここを書き換えます。vbox_tools の場合は

BIN_FILES         = %w( vbox_tools )

としました。

gem を公開するまで

いちばん簡単に書くと

repository 側の準備が

  1. github 上にアカウントを取って repository を作成する
  2. repository admin で [ Rubygem ] にチェックを入れる

で ok. 手元の作業としては

  1. rake gemspec
    • .gemspec を生成します。lib/ 内の VERSION の値が自動的に使われるので、gem のバージョンを上げる場合はこの値を変更します。
  2. git commit
  3. git push

で、おしまいです。github では gemspec が生成、更新されたタイミングで gem を生成するらしいので、動作が安定するまで gemspec は放置で、必要に応じて rake gemspec してあげればよいということになります*5。なるほどよくできてる。

実際には今回自分は Windows と MacOSX 両方での動作を確認するために

  1. rake gem で gem を生成
  2. Dropbox 経由で Windows に転送
  3. Windows, MacOSX で gem install XXX.gem を実行して、生成した gem をローカルでインストールし、動作を確認
  4. 必要に応じて修正

という作業を行っていました。Dropbox 内のファイルって別ドライブとしてコピーされるんじゃなくて、移動になるんですね。初めてまともに使った。便利だ。

ハマったところ

github 上で gem が生成されるのは

  • repository の [ Rubygem ] にチェックが入った状態で
  • gemspec ファイルが生成されたか更新されたタイミング

のようです。

私は

  1. Rubygem のチェックを忘れたまま gemspec を上げていた
  2. 忘れていたチェックを入れて gemspec のバージョンを上げてみたけど反映されなかった
  3. 一度消して( rm -> push )、これを戻した( revert -> push )ら、あっという間に生成された

という経緯でした。ま、新しいことをやってみるんだから一度や二度ハマるのは想定の範囲内ってもんです。

special thanks

以下の発言、記事に助けられました。ありがとう!

*1 VirtualBox付属のCLI管理ツール

*2 cutagem を使った例を後述します。

*3 あれは書いたのは昨日で、実際に調べたのがあの日付なのです

*4 テスティングフレームワークは標準の Test::Unit です。依存が多くないところも GOOD

*5 当然 .gemspec ファイルは git add されてないとだめだよ!


2009-08-16 [長年日記]

_ iTunesのメディアファイルの扱い方

序章

Mac 上の iTunes の中の一部のデータを Windows に持って行こうと思った。

07:27:35 >wtnabe< iTunes でライブラリ情報の一部を移動ってできるのかな。
それがプレイリスト?
08:06:36 >wtnabe< iTunes のプレイリストを Win <-> Mac 間で直接読み込ん
だりできないよね?
08:06:57 >wtnabe< パスの情報が全然合わないもんなぁ

プレイリストに含まれるファイル名の問題

Mac の iTunes でプレイリストを吐き出してみる。

08:29:32 >wtnabe< あーーーーーーーーーーーーーーーーーーーーーーーーー
08:29:46 >wtnabe< また濁点の問題かorz  面倒くせぇんだよ。
08:41:45 >wtnabe< 昔は mccc 使えば ok だと思ってたけど、mccc 使ったらむ
しろ化け化けだ…。
08:48:09 >wtnabe< 結局日常的な問題なのに正面から取り組んでないからいざ
というとき苦労する
08:50:45 >wtnabe< 結局この濁点の問題はなんていうのが正確でどう対処すれ
ばいいのか。言葉を知らないがゆえの無力。
08:53:01 >wtnabe< nkf で UTF8-MAC の入力には対応してるらしいんだがなぁ
09:01:19 >wtnabe< そもそも書き出されたものが UTF-8-MAC ではなく UTF-16
でかつ濁点が分離しているのである。
09:26:32 >wtnabe< ややこしそうなのでまずメシにする

Mac のファイル名は UTF8-MAC じゃないんですよね。UTF8 で取り出すこともできるだけで中は UTF8 じゃないんです。Windows のファイル名が Shift_JIS じゃないのと一緒です。で、iTunes は UTF8 に変換せずに取り出してプレイリストを作るらしいことに今さら気づいたのでした。

13:27:32 >wtnabe< プレイリスト話の続き。Macで日本語ファイル名という話だ
とよくUTF8-MACという情報を目にするが、UTF8-MACはそういうAPIを通して見た
ときにその形式に変換してくれるだけ。本来はUTF-16で格納されている。
13:28:27 >wtnabe< そしてiTunesでプレイリストを作成するとバッチリUTF-16
でリストを作成してくれる。UTF8-MACに対応しているよ、と言っているエンコー
ディング変換ツールではこれに対応できない。

つーことなのです。

プレイリストは諦めてメディアファイルを丸ごとコピーした

実は、iTunes のデータはバックアップ&リストアとかややこしいことをしなくても、基本的には中のファイルを丸ごとコピーするだけで大丈夫です。以前から mp3 のオーディオファイルに関してはこの方法で数台の PC を渡り歩いてきてます。この先も大丈夫だと思います。ただし、ビデオの場合はちょっとややこしいことになります。

13:10:29 >wtnabe< 非常にややこしい事態であることが分かった。
13:12:46 >wtnabe< iTunes のビデオについて、ライブラリからドラッグして取
り出したものを別な機械に持って行った場合、ムービーの種類などの iTunes
固有の情報は残らない。
13:14:09 >wtnabe< mp3 などのメディアファイル自体が保持できる情報は残っ
ている場合と残っていない場合がある。iTunes で生成した m4v ファイルの場
合は他の機械に楽曲データだけ持っていってもそれらの情報は残っていない。

まとめると、こういうことです。

情報の種類 移動後
いわゆるID3タグ残る
ムービーの種類 残らない

mp3 は大丈夫。aac は詳しくないんでよく分からないけど m4v とかを iTunes で作ってる場合はたぶんダメです。

今回自分の移動したファイルは iTunes ではなく Handbreak でエンコードしたうえで iTunes で情報を追加したものなので、基本的な情報は残っていました。ただし、次節のように AirTunes スピーカーを利用することはできませんでした。

ムービーのエンコーダと AirTunes スピーカー

また、iTunes でエンコードしたミュージックビデオは AirTunes スピーカーを利用できることに初めて気づきました。AirTunes スピーカーを利用している場合はビデオじゃなくてオーディオとしての再生になるんですけど。

13:15:02 >wtnabe< ただし、iTunes で生成した m4v ファイルは AirTunes ス
ピーカーに対応している。AirTunes スピーカーを選んだ場合はビデオとしては
再生されない。
13:16:01 >wtnabe< 他のツールで生成した mp4, m4v ファイルは AirTunes ス
ピーカーを選んでいても問答無用でビデオとして再生され、コンピュータに接
続されているスピーカーから音を出す。
13:17:46 >wtnabe< その代わり、他のツールで生成した mp4, m4v ファイルの
場合はメディアファイル自体の保持できるメタデータをそのまま他の機械に持っ
ていくことができる。

まさにあちらを立てればこちらが立たず。

iPod を使った同期は試さなかった

最近は iTunes -> iPod という一方通行ではなく iTunes <-> -iPod という双方向でのコピーができるらしいという情報をどこかで見かけた気がするんだけど、自分の環境では iPhone/iPod touch を Windows 環境でフルに活用できないので諦めた。

13:20:01 >wtnabe< プレイリストを使って同期すればこの辺の問題は解消でき
ると思うんだけど、ビデオの名前に日本語を使っているとMacの日本語ファイル
名の濁点問題でとてもややこしいことになる。
13:23:14 >wtnabe< iPodを使って同期する方法も最近はあるっぽいんだけど、
Windowsは一部でApple Mobile Deviceなどのサービスが悪さしてiTunes自体が
動かなくなる環境がある。(うちのAMD64+Vista環境がそう)
13:31:09 >wtnabe< ということで今回はプレイリストでの同期は諦め、メディ
アファイルを丸ごとコピーしてみた。結果、ほとんどのファイルはiTunesで生
成したものではないのでmp3の保持できるデータはそのまま渡すことができた。
でもこれは知ってたわけじゃなくてたまたま。

おまけ - 改行コード

正直、どうせ iTunes という独自のアプリ同士でしか交換できない情報ならプラットフォームネイティブとか気にしないでいいんじゃないかとか乱暴なことを思ったけど、意外に行儀よくできていた。

08:16:40 >wtnabe< iTunes プレイリストは Win と Mac で改行コードが違うの
か。
08:19:17 <popona> @wtnabe 改行コードって、もともとWinがCRLFで、MacがCR
でしたっけ
08:21:44 >wtnabe< @popona CRはClassic時代ですね。OSXアプリならフツーは
LFです。
08:24:15 >wtnabe< しかしiTunesプレイリストはCRなのであった。
08:25:17 <popona> うわぁ、ぽぽなの知らないうちにそんな変化があったとは…
RT @wtnabe: @popona CRはClassic時代ですね。OSXアプリならフツーはLFです。
08:25:54 >wtnabe< まぁiTunesも今思うと古いアプリだよね

考えたら iTunes は MacOS 9 の頃からあるので改行コードは CR で当たり前ですな。CR なデータは CLI のツールで扱いにくいからきらいだな。

Tags: iPod iTunes

2009-08-17 [長年日記]

_ Godで初めてのプロセス監視

Ruby 製のプロセス監視ツール、God を試してみた。(書いてる時点より5ヶ月前…。)

モダンに監視したい

なぜなら TIG が落ちるから(笑)

実は Un*x 系の OS なら素朴な監視は割と簡単にできる。

  • ps
  • grep
  • /etc/rc.d/* とか /etc/init.d/* とか
  • sendmail

辺りで事足りる。要するに

定期的に ps を叩いて、この文字列のパターンがない場合はこのプロセスが落ちてるから mail 投げて起動スクリプトを呼ぼう

ってだけ*1。これだけでプロセスが落ちてたらまた起動し直すということが可能なので、知らん間にサーバ落ちててオレ涙目っていう状態を減らすことはできる。少なくともすでに上の道具が使えているなら新しいことを覚える手間はないので、どうしてもすぐ監視を始めたい場合にはこれだけでも十分有効だと思う。

でも効率が良くない。ちょっと複雑なことを考え始めると fork の嵐になって*2地球に優しくないし、cron で回すのもタイミングによっては大きな負荷になる。(朝方とか。)

それに sh スクリプトは処理の部品化も一苦労。できれば凝ったものはあまり書きたくない。

なんで daemontools や runit, monit じゃないの?

  • どれも知らない
  • どれも独自の文法で設定を書かなきゃいけない
  • djbware はメンドウというもっぱらの噂

だったらどれ使っても一緒。でも

ツールに入っていない機能(通知方法とか)を使いたいと思うときがきっときて、そのときの拡張しやすさは Ruby 製の God の方が上だと思う

というか

Ruby が好き

だから。使ってみての比較ではないのでそういう意味では参考にならない。

参考

なぜ daemontools を使うのか - kazuhoのメモ置き場

こんな意見もある。これと比べると

  • ログのローテート機能はない

んだけど、それは logrotate や rotatelogs を使えばいいんじゃないかという気がしている。特に困ったことがないのはヌルい使い方しかしてないからかもしれないので鵜呑みにはしないでね。

Ruby でやって、重くないの?

kqueue や netlink_handler を使っているので監視部分のコストは高くないっぽい。Ruby 本体とスクリプト分メモリを食うのはしょうがない。

Windows には対応していないので悪しからず。

サイト

インストール

拡張ライブラリがあるので ruby-devel や ruby-dev とかのパッケージも入れておこう*3

$ sudo gem install god

で ok.

使ってみる

god の gem にも example はあるんだけど、もうちょっと試しやすいように

を git clone するか Download Source のリンクから丸ごと取得する。

どれでもいいんだけど、leaky.god を試してみる。leaky.god の中身はこんな感じになっている。

God.watch do |w|
  w.name            = "leaky"
  w.interval        = 5.second
  w.start           = 'ruby ' + File.dirname(__FILE__) + '/scripts/leaky.rb'

  w.start_if do |start|
    start.condition(:process_running) do |c|
      c.running = false
    end
  end

  w.restart_if do |restart|
    restart.condition(:memory_usage) do |c|
      c.above = 2.megabytes
    end
  end

end

細かい説明はしないけど、

  • leaky.rb が起動していなかったら起動する
  • 消費メモリが2MBに達したら再起動する

という動作をする。

god -c leaky.god

と打って god を起動し、Activity Monitor や後述の topless, watch などを使って Ruby プロセスの様子を確認してみると、God 自身が使っているプロセスと、どんどんメモリが増えていって 2MB に達したら再起動するプロセスを確認することができる。

試しに再起動をくり返しているプロセスを手動で強制終了してもやはり帰ってくる。

設定を変える

手動で強制終了と言っても2MBにはあっという間に達してしまうので、あっという間に再起動が掛かって強制終了できない、と思うかもしれない。そこで God が監視する interval を延ばしてみよう。先ほどの leaky.god の

  w.interval        = 5.second

ここを書き換える。15.second くらいあれば十分だろう。書き換えたら leaky.god を保存して

god load leaky.god

すると今の変更が反映される。これで手動で強制終了しやすくなった。

当然監視の間隔が延びたので、設定容量である 2MB を越えてしまったり、強制終了後の再起動までに掛かる時間も延びてしまうが、そこは仕方がない。あくまで実験なので。

終了する

さてこれで leaky.rb は普通の方法では終了することができなくなった。じゃあどうやって終了するのかというと、

god stop leaky

と打つ。この leaky は watch のところで定義してある name を反映している。god ファイルの名前じゃないので注意。God そのものを終了したければ

god quit

ただし監視しているプロセスのことは気にせず終了してしまうので、

god terminate

を使うようにしておいた方がいいと思う。詳しくは

god --help

と打てば確認できる。

Growl への通知を追加してみる

God は標準でも mail だけでなく twitter や各種 webhook への通知が可能になっているが、試しに Growl への通知を追加してみた。動いたときの Twitter への POST がこれ。

Twitter / wtnabe: できたできた。http://bit.ly/bD38Z ...

まずは

gem install ruby-growl

RubyForge: ruby-growl: Project Info

をインストール。そして

god_extension/
|-- god_growl.rb   <-- 追加
god_examples/
|-- README.textile
|-- leaky.god
|-- lib/
|-- pids/
|-- rails/
|-- scripts/
|   |-- crashy.rb
|   |-- leaky.rb
|   `-- stable.rb
|-- simple.god
`-- sinatra.god

ディレクトリの構造はこんな感じで、god_gworl.rb というファイルを以下の内容で作る。

simple.god を以下のように Growl を利用するように書き換えて、

Growl がネットワーク越しに通知を受け取れるようにして

god -c simple.god

で実行。

ここから実行される crashy.rb は次々 crash するんだけど、それが God に捕捉されるたびに Growl に通知が来る。なかなか面白い。

その他、気づいたこと

基本的に God 1プロセスで複数のプロセスを監視することになる。その場合、当然監視対象ごとに設定ファイルを分けた方が読みやすいので

God.load /path/to/GOD_CONFIG

で設定ファイルを読み込む処理を書いた設定ファイルを

god -c

で指定して立ち上げることになる。

もし監視する God そのものを増やす場合は God と通信するためのポートもその分必要になる。

監視対象プロセスの起動順に関する疑問

例えば TIG のあとに tiarra、といった具合に起動する順番が大切になっているものを希望通りに立ち上げるにはどうしたらいいんだろう。

  1. 順番に load を書いていく
  2. よくある感じで設定ファイルの名前を数字始まりにしてまとめて読む

やっぱ 2 なのかな。

*1 OP25B とかは考えてない

*2 sh スクリプトだからしょうがない。

*3 OSXで標準のRubyを使ってる人はどうなるのかは知らない


2009-08-19 [長年日記]

_ topless で Activity Monitor もどき

背景

Activity Monitor の動作例

MacOSX には Activity Monitor というツールがあります。Windows 使いにはタスクマネージャのようなもの、Un*x 使いには top みたいなものと言えば通じるかなと思います。しかし自分が思うに、これらのツールと違って Activity Monitor には決定的に優れている点があります。それは

プロセスの様子をモニタリングする際にフィルタが掛けられること

です。

スクリーンショットは自分の立ち上げている zsh プロセスだけをモニタリングしている様子です。タスクマネージャ*1ではソートはできても抽出まではできませんし、top でも特定の owner のプロセスは抽出できてもその中でプロセスの名前でフィルタを掛けることはできません。

これ、他の環境でもできたら便利だなぁと以前から思っていたのです。

21:57:04 >wtnabe< activitymonitor みたいに top を grep できたら便利なん
                  だがなー

できました。

topless

06:36:38 >wtnabe< 昨日の夜つぶやいていた activitymonitor みたいなやつは
                  ps, grep. topless でできた。例えば ruby 関係のプロセ
                  スは topless 'ps ax | \grep ruby | grep -v "grep
                  ruby"' で出せる。
06:40:39 >wtnabe< toplessは名前だけ知ってたけどこれ後藤大地さんか(*BSD
                  使いじゃない人向けに「漢のzsh」の中の人)。shスクリプ
                  トだしパッケージになくてもtarball落としてくればかなり
                  の環境で動くはず。
07:06:14 >wtnabe< インストールには make と pod2man が必要だけど、インス
                  トールしなくても動くし。ものすごく便利!!!ってわけじゃ
                  ないけど、持っておくとよさげだ。
                  http://codezine.jp/article/detail/67,
                  http://people.freebsd.org/~daichi/src/
07:12:00 >wtnabe< ちなみにインストールは古式ゆかしく make && make
                  install
07:31:00 >wtnabe< activitymonitor 代わりに使うときには ps よりも top の
                  batch mode と組み合わせると便利。ただし OSX 10.5 の
                  top には batch mode なかった。

後藤大地さん作の topless というツールはとにかくどんなコマンドでも top 風に定期的にリフレッシュしながら表示し続けてくれます。驚いたことに sh スクリプトで書かれており、Unix-like なシステムに標準で入っているコマンドだけを組み合わせて動作します。

インストール

FreeBSD なら ports にありますが、MacOSX, Linux は多くの場合パッケージにはありません。でも大丈夫、make と Perl と install があればインストールできます。tarball を紐解いて

make && make install

で ok. それも man が roff ではなく pod で書かれていて pod2man が必要ってだけなので、man が要らなければ topless というファイルをコピーするだけで構いません。

topless --help

と打てばだいたい使い方は分かります。

使い方

例えば

topless 'ps ax | grep zsh | grep -v "grep zsh"'

と打つと最初の Activity Monitor の例と同じように自分の zsh プロセスだけ抜き出すことができます。

本当に Activity Monitor のような情報が欲しければ

top -b

で top を batch mode で実行した結果を topless に渡すとそれっぽくなります。ただし -b オプションの batch mode は FreeBSD と GNU top では確認しましたが OSX の top にはありませんでした。まぁ、OSX では Activity Monitor 使えばいいんですけどね。今回の目的はまさにそれですから。

え。htop 入れればいいじゃん? な、なんだってー。

[追記] Linux だと watch かなと教えてもらいました。

Twitter / Hirofumi Saito: topless で Activity Monitor ...

Tags: Unix Sysadmin

*1 少なくとも Windows Vista までは


2009-08-20 [長年日記]

_ PubSubHubbub を知る

※ 例によって 2ヶ月前の日記を書いています。

ブックマークだけしてあってよく分からない記事があったのでリアルタイム人力検索(Twitter)に投げてみた。返事が返ってこないことが多いが、今回はかなり正確に検索できた。

10:56:49 >wtnabe< 【急募】PubSubHubbubを140文字以内で説明してくれる人
11:10:31 <rytich> @wtnabe Publisher(公開者)がSubscripter(購読者)に対し
てプッシュで更新を通知するためのhubだバブー (Pubはwebhookでhubに更新を
通知するようです)
11:13:10 >wtnabe< .@rytich あーえーと Web サービス型の RSS リーダの更新
が早くなるよってことですか。なんかそんな気がする。
11:16:05 >wtnabe< Subscriber に POST するってことは少なくとも
Subscriber は常にそれを受け取る準備してなきゃいけないわけで。
11:16:36 <rytich> @wtnabe たぶんそうだと思います! あとRSSリーダは 定期
的に見に行ったりしなくてよくなるので 楽になりそうです
11:20:13 >wtnabe< 乱暴に言うと update ping を集積してクロールの無駄を省
いてくれる hub かな? Publisher はやっぱ hub を認識できてないと早くなら
ないよね。
11:23:06 >wtnabe< えーとそれが livedoor Blog が対応しましたって話か。
blog と reader 両方を持ってるところはそら対応するに決まってますがな、っ
てわけか。

えーと確認のために PubSubHubbub の登場人物を整理すると

  1. Publisher は要はブログ(だけじゃないけど)
  2. Subscriber はフィードリーダ
  3. これの間を取り持つ Hub

で、PubSubHubbub とはこの Hub を定義するプロトコル(?)のことで、Publisher と Subscriber の両方が Hub に「対応」することでかなりリアルタイムに近い通知が可能になるというものらしい。

update ping という言葉はたぶん古くなっちゃってて最近は webhook という言葉に集約されつつあるのかな? いろんなサービスに機能が増えてきているみたい。

ブログとフィードリーダという言葉は分かりやすさのために使っているだけで、こういう形態のサービスに限らずに使えそうな気がする。今後 Publisher の対応は進んでいくだろうから、例えば定期的に scrape して情報を更新する泥臭い作業も Hub -> Subscriber の POST を受け付ける URI があれば無駄がなくなるし速くなるし一石二鳥。*1

ということで、いろいろ調べているうちに今回の1つの新しい知識と一緒に2つの疑問が増えた。

  • webhooks
  • reversehttp

今後の課題ということで。ぼんやーりとは想像つくんだけど。

_whyたん

ちなみにこの頃、_why ショックが駆け巡っていた。

11:29:43 >wtnabe< えっ。_why たん。

RSSCloud

[追記]

RSSCloud というものもあって、これと対比させるとより分かりやすいみたい。

個人的には RSSCloud は RSS 2.0 の中に収まっちゃってるのが嬉しくない。RSS 1.0 や Atom にも対応できるのかなぁ?

Tags: Web Feed

*1 scrape の必要な情報源が Publisher として Hub に対応してるの?という疑問は当然あるけど、feedに含まれる情報で満足できない場合には重宝すると思う。いっとき feed へのアクセスはちゃんと考えてやれよ(304に対応しろ)という話題もあったしね。


2009-08-22 [長年日記]

_ iTunesムービーのオプションと同期

オプション

ムービーとミュージックビデオ

今回初めて iPod にムービーを取り込んでみて気がついたことが、

アルバム単位にまとまってくれない

ってこと。不便だ。不便すぎる。と思っていたら Twitter で教えてもらった。

08:07:40 <hsbt> @wtnabe ビデオの種類をミュージックビデオにしてプレイリ
ストかするんだ
08:08:03 >wtnabe< @hsbt おぉ。あざっす。帰ったらやってみるっす!

iTunesのビデオのオプション

とは言っても実際はこれ8月6日の話。

ムービーの [ 情報を見る ] -> [ オプション ] の中で

  • メディアの種類

を変更する。

再生位置の記憶

先ほどの画像を見てもらうと分かるけど、

  • 再生位置を記憶する

というオプションもこの中に入っている。どうやらデフォルトでは再生位置を記憶してしまうらしい。映画とか長いビデオならともかく、普通の楽曲よりも短いくらいのビデオの再生位置を覚えられるとかえって邪魔なので外しておく。

メタデータだけの変化は同期対象にならないらしい

Twitter / wtnabe: 全部同期やめて消して、もう一度同期取るようにして転送 ...

一回同期設定をオフにして全部消して、もう一回同期し直したらちゃんと転送された。面倒くさいというか、これちょっとバグくさい気がするなぁ。

※ 最新の iTunes 9.x 以降では試していないので動作変わってるかも。

Tags: iPod iTunes

2009-08-23 [長年日記]

_ gem server が簡単すぎてビビる件

さて先日cutagemのおかげでグイグイgemが作れるようになったわけですが、せっかく作った gem が手元にだけあっても仕方ないわけです。gem 化するメリットはインストールが楽、つまり deploy が楽ということだと思っています。

まぁ公開しているものなら rubyforge や github*1 に置けばいいわけですけど、公開できないものだっていっぱいあるわけです。というかイントラでこそきちっとパッケージ管理したいと最近はよく思うわけです。

というわけで、まず基本はるびまですな。今さらながらるびまが便利すぎる。ありがとうございます。マジで。

Rubyist Magazine - シリーズ パッケージマネジメント 【第 2 回】 RubyGems (2)

ここに gem server というのが出てきますが、よく読むとこれ WEBRick を使っている。えー、WEBRick の管理なんかしなきゃいけないの?と思ったらどうも話が違うようで、ちょっと長いけど引用すると、

webrick のインスタンスを個別にに走らせる代わりに既にある自前のウェブサーバを使いたいかもしれない。問題ない。

$ ssh chad@mywebserver.com
password:
mywebserver$ cd /web/server/document/root
mywebserver$ mkdir gemserver
mywebserver$ cd gemserver
mywebserver$ mkdir gems
mywebserver$ scp chad@myotherhost.com:/home/chad/some_cool_lib-0.0.1.gem gems/
chad@myotherhost.com's password:
some_cool_lib-0.0.1.gem                              100%   11KB  11.0KB/s   00:00

全て準備できた。お預けだった gem server の話に戻ろう。

$ generate_yaml_index.rb
$ ls
gems  yaml  yaml.Z

これだけ! これでインターネットに繋がっているコンピューターならどこからでもインストールできる:

ん?

んん?

これって要するに

DOCUMENT_ROOT 以下に package 本体と index がただ置いてあるだけ

じゃないのか? マジか。ステキすぎる。gem の server ってこんな簡単に作れるのか。てゆーか Web サーバがすでに動いている場合は実際には server 作ってないよな。index を作ってるだけだ。

すげぇ。簡単すぎる。

毎度毎度こういう言い回しに飽き飽きしてる人も多いかもしれないけど、pear の channel-server に爪のアカ飲ましてやりたい。確かに gem の場合はクライアントサイドの負荷が高いけど、pear の channel-server は MySQL を要求するとか準備がやたら面倒くさいうえにいつまでもバージョンが上がっていかず、本当にセットアップしていいんかすげー不安にさせる。結果、URI package という、package をポンと置くだけの仕組みに流れちゃったりするんだけど、そうなると install も upgrade も downgrade も直接 URI を指定しなきゃいけない、つまりクライアントサイドからは新しいバージョンがあるのかどうかも全然分からないというダメダメな状況になっちゃう。

でも gem はこの URI package と同じ仕組みで package の検索も upgrade も自動化できてる。

これでいいじゃん。

実際にはるびま本文中に出てきた generate_yaml_index.rb というものはすでになくて、代わりに

gem generate_index

というコマンドができているのでこれを使うといいです。使いやがれ。

これは便利だ!

cf.

Tags: RubyGems Ruby

*1 今なら gemcutter.org


2009-08-24 [長年日記]

_ CentOS 5 で pecl zip の build 失敗

2009-08-24 時点で

  • 最新の CentOS 5
  • 最新の pecl zip パッケージ 1.10.2

の組み合わせだと build に失敗する。1.8 系の最新である 1.8.10 なら動くのでこれで ok ということにしよう。

Tags: Linux PHP

2009-08-27 [長年日記]

_ DVD共有のまとめ

DVD ドライブの壊れた Mac に DVD を使うアプリをインストールする要求が発生。そういやぁ、MacBook Air の登場と同時に DVD 共有の機能が入ったんじゃなかったか?と思い出してあれこれ試してみた。

しかし結局これはうまくいかなかった。なぜならクライアントになる DVD ドライブの壊れた Mac もサーバになる DVD ドライブの健康な Mac も 10.4 だったから。

DVD共有の可能な組み合わせは下のバージョン以降らしい。

ホスト クライアント
10.4以降10.5以降

この組み合わせで、クライアントの側で以下のようにコマンドを打ってやると DVD 共有を利用できるようになる。

別のMacのCD/DVDドライブを、自分が今使っているMacにマウントするにはどうすればいいですか。

絶対これ 10.4 でもクライアントとして動きそうな気がするんだけど、MacBook Air の登場に合わせているので Air に載っていた 10.5 の縛りを入れたんだろうなぁ。あーもう。

まぁ DVD 共有が利用できなくても伝統的な共有方法でなんとかなるっちゃなるんだけどね。ドライブそのものの共有じゃなくてメディアに対する共有になるのが面倒だけど仕方ないか。

Tags: OSX

2009-08-29 [長年日記]

_ 文字コード混在環境で正しく lgrep する

2年前のEmacs の M-x grep をマルチエンコーディングにで文字コードの混ざった環境でも日本語で検索できるようになって便利って話をしたんだけど、実はこれ、手元の環境では emacs -nw でしかちゃんと動いてなかった。

普段 Emacs を Emacs らしく使う際のほとんどの時間は -nw で使っているんだけど、ViewSourceWith や It's All Text を使って Firefox や Thunderbird から、あるいは日本語の文字幅の問題から直接 CarbonEmacs を window で使うこともある。数ヶ月前に初めて気づいたんだけど、以前の設定で lgrep を呼び出すと日本語検索で余計なものが引っかかったり、必要なものが引っかからなかったりしてまったく使いものになっていなかった。

twitter で何度もつぶやいてたりあれこれ検索していたんだけど、該当する現象で困っている人はいないらしく、役に立ちそうな情報はなかなか見つからなかった。当初は emacs の設定の方を見ていたんだけど、もしかすると lgrep かなぁと思って設定をいじっていたら以下の方法で正しく検索できるようになった。

lgrep -Au8 -Ia

どうも lgrep -K で渡すはずの keyboard coding system が期待通りでなかったらしい。

OPTIONS
       -A
              Set all coding systems to coding-system.

       -I
              Set input coding system to coding-system.

       -K
              Set  keyboard coding system to coding-system.  If it is not set,
              output coding system will be applied to it.

を見ると -Ou8 が書いてあればデフォルトでは -K にも u8 が渡るような感じがするけど、CarbonEmacs から lgrep を呼び出すときに u8 じゃない値が渡ってしまっているようだ。

ということで今、手元の設定は以下のようになっている。

(setq grep-command "find . -type f
                    -a ! -regex '.*\\.svn.*'
                    -a ! -regex '.*\\.git.*'
                    -a ! -regex '.*\\.hg.*'
                    -a -print0 | xargs -0 lgrep -nk -Au8 -Ia ")

うむ。やっとまともな状態になった。

こういう問題は CarbonEmacs だけじゃなくて Meadow なんかでも起きそうなのでちゃんと日記に書き起こしておくことにした。

Tags: Emacs

2009-08-30 [長年日記]

_ shlauncher で自作スクリプトの管理を簡単に(できるかも)

wtnabe's shlauncher at master - GitHub

こんなものを作ってみました。基本的には単純なもので

  1. rake を使って
  2. script/ 以下のスクリプトをリストアップして
  3. 目的のスクリプトを実行
  4. script/ 以下を含めたセットに名前を付けて gem 化できる

ものです。

もし似たようなコンセプトの似たツールが既にあったらニヤニヤしてください。

[2009-10-04 追記]gem化以外には rake を使わなくなりました。rake を使っていたバージョンはややこしい事情により OSX + zsh という非常に狭い環境でしか動きませんでしたが、ruby スクリプト化したことで Ruby の入っている Un*x 系プラットフォームならまずどこでも動くようになったと思います。

sh script が散乱してなんだか分からない

そもそも sh script を呼び出して実行するだけのことをなぜわざわざ rake にやらせようと思ったかと言いますと、

どんなスクリプトをそのシステム用に用意したか覚えていない

ということが発端だったりします。

最近は rake が好きなので割と何でもかんでも rake を使って作ることが多いのですが、以前作ったものは sh script やフツーの ruby script が圧倒的に多いです。でもこの形で作業用のスクリプトを増やすと、どういう作業にどういう名前のスクリプトを用意したのか忘れちゃって、「はて、このシステムでこれこれの作業をやるには何をどうすればいいんだっけ?」となってしまうことが増えてきました。*1

まぁドキュメントを整理してあればある程度はなんとかなるんですけど、ドキュメントは書くのも探すのもコストだし、いろいろ面倒くさくなって似たようなものをもう一度作った方がはえー、なんてこともあるわけです。

これはいけない。

そこでできるだけドキュメントを書かなくても何ができるのか分かるようにする方法を考えました。思いついたのが「rake に task として登録してあれば、たった一つのアプリの起動だけ覚えておけば、何ができるか一覧にできるじゃないか」ということです。

本来は rake は -T を付けないとタスク一覧は出してくれませんが、一覧を出す task を default で定義しておけばいいだけです。

システム固有のスクリプトの置き場所とバージョン管理問題

もう一つ、これも以前から悩んでいたのが、

そのシステム固有のスクリプトの置き場所とバージョン管理システムの相性

です。

伝統的にはこれらは

/usr/local/bin
/usr/local/sbin

などに収まるものだと思います。置くのはいいんです。でもそのまま直置きしてしまうと「バージョン管理しにくい」です。さすがにこれらのディレクトリを丸ごと working copy にしてしまうのはなんか変だなと思いますし、じゃあどっか別な場所に置いて make install とか毎回やるの? *2

そこでいま採用しているのは「スクリプト実行用のユーザーを一人用意して、そこにスクリプトを展開してしまう」方法です*3。この方法は複数あるスクリプトを一気に deploy するのが楽になります。しかし同時にこれらのスクリプトは system wide な PATH 上には置かれていないので、実行するユーザーが増減すると面倒なことになります。要するに覚えていないと呼び出せないスクリプトの、さらに置き場所まで分かっていないといけない、という高コストな方法なのです。

そこで rake task を gem 化できればインストールしやすく、かつスクリプトの修正はどのユーザーでも行うことができる状態になるんじゃないかと思ったわけです。

プラットフォーム固有のパッケージシステムの問題

パッケージングだけの問題であれば rubygems を採用する必要はありません。プラットフォーム固有のパッケージシステムを使えば済むからです。rpm, deb, ports, ... 様々なパッケージシステムが各プラットフォームにあります。

逆に問題は各プラットフォームにパッケージシステムがあることです。プラットフォームが複数にまたがった瞬間、煩雑さがどんどん増していきます。実際いま運用しているシステムは複数のプラットフォームにまたがっていますので、プラットフォーム固有のパッケージシステムの採用は避けたいところです。

全部解決できそうな rake + rubygems 方式

そこで出た結論が rake + rubygems 方式です。

  • rake で散乱する script をまとめ
  • gem でインストールしやすくする

で、これらを適当なバージョン管理システムに突っ込んでしまえばよいわけです。

しかも gem 化するにはバージョン番号を決める必要がありますので*4、ちゃんと最新の状態になっているかどうかの確認もしやすくなるはずです。

おまけ

今回のツールは script/ 以下のスクリプトを task としてリストアップして実行する機能を持っていますが、おまけとして script/ 内にディレクトリを掘っている場合、ディレクトリ名を task として指定するとその中のスクリプトを全部順番に実行するという機能を用意してあります。

これは以前

などで触れた、複数のスクリプトをまとめて実行する機能を独自に実装したものです。中を読めばビックリするほど簡単で実装なんて呼ぶのもおこがましい状態ですが、これが run-parts や periodic を使わずにできるようになったことも個人的には大きな収穫です。

仕様と既知の問題

  1. rake task としてリストアップするために、スクリプト内には必ず何らかのコメントが必要
  2. 引数を取る sh script は今のところ登録できない

1 は仕様です。最低限のコメントをすぐに閲覧できるように強制することで、運用の際に迷うことがないようにした方がよいという判断です。

2 はちょっと解決の方法を思いつきません。rake task は引数を取ることができるし、sh script に引数を渡すことも可能だと思いますが、任意の数の引数を自由にやり取りする方法が分からないのです。お手紙待ってます。

[2009-10-04 追記]task の実行の際に rake の利用をやめたので引数はほぼ自在に渡せます。

cutagem(と、あといろんなもの)に感謝

最後に、cutagem の作者、cho45 氏、genki 氏に感謝します。cutagem がなければ gem 化しちゃえばいいじゃんなんて、今の自分が軽々しく発言することはなかったと思います。それくらい cutagem は簡単に使え、十分に自分の目的を満たしてくれます。rubygems の作り方を自分が初めて delicious にブックマークしたのはもう2年以上前の話です。そこからたいした理由もないままウダウダと実際にやってみることを避けてきたボンクラな自分でも、「cutagem なら簡単だ!」と思わせてくれました。本当にありがとうございます。

関連つぶやき

twitter落ち穂拾い。基本的には mirroring で再現しにくいサーバを手早く起こすことを目的に語っています。ほとんど同じ仕事をするサーバを増やす(スケールアウト)ためのセットアップの簡略化は Web 上でよく見かけますが、そういう要求ばかりじゃないんだよーということが言いたいようです。

PHP をどうしても dis っちゃうのはクセみたいなもんですね。脱線するからよくないんだけど、マルチプラットフォームのパッケージシステムの例として出すのは一応間違ってないと思っています。

*1 トシのせいだけではありませんよ? :-)

*2 あれ?前に Capistrano 持ち上げてなかった?と思い出した人はいい記憶力をしていますが、その話はとりあえず置いといてください。

*3 よく考えると ~/bin に全部突っ込んでいるのと大差ないです。

*4 ありますよね?