Test::Continuous に興味がわいたので
さわってみようとしたらMac::Growl が必要とのこと。
いれようとしたら Foundation.pm 等がないためちゃんと test に通らなかった。
どうやら ports でいれたのには Foundation の ラッパーモジュール がないらしい。
variants で調べて +darwin を足していれなおしたけどなかった。
というわけでいいのかわからないけど、デフォルトに入ってるのにシンボリックリンクを貼って
その場をしのいだ。
以下、説明。
mac 独自に bundle されたモジュール類(Foundation.pmとか)は
/System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level 以下にあります。
Foundation.pm が PerlObjCBridge.pm と CoreFoundation.pm にも依存していたので忘れなく貼ること。
自分の環境だと以下のパスに貼った。
sudo ln -s /System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level/Foundation.pm /opt/local/lib/perl5/5.10.0/darwin-2level/Foundation.pm
sudo ln -s /System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level/CoreFoundation.pm /opt/local/lib/perl5/5.10.0/darwin-2level/CoreFoundation.pm
sudo ln -s /System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level/PerlObjCBridge.pm /opt/local/lib/perl5/5.10.0/darwin-2level/PerlObjCBridge.pm
perl のバージョンが 5.10 だけど 5.8.8 からのシンボリックリンクでも現状、一応動いてる。
ただ、Mac::Growl が utf8 で文字を渡しても文字化けする始末。
というわけで Net::Growl や GNTP::Growl も試してみたが
残園なことにNet::Growl は何もおこらない。
GNTP::Grwol は IO::Socket::INET でコネクションできない感じ。
IO::Socket::INET: connect: Connection refused at /opt/local/lib/perl5/site_perl/5.10.0/GNTP/Growl.pm line 44, line 1.
うむぅ〜困った。
追記 2009/08/29 20:17:22
snow leopard にしたら Mac::Growl が使えなくなった。
どうやら Carbon 系が 32bit でしか使えないみたい。
64bit で起動させると使えない。
ソース
今まで上記のような Path Spec を実装するときは
sub hoge : Args(1) {
my $self = shift;
my ($c, @args) = @_;
}
こんな感じでやってた。
で、今回はこういう Path Spec を実装したかったので
同じようにだけでできるかと思ってやったら
dispatch されなくなってできなかった。
sub hoge : Args(0) {
my $self = shift;
my ($c) = @_;
}
sub hoge : Args(1) {
my $self = shift;
my ($c, @args) = @_;
}
sub hoge : Args(2) {
my $self = shift;
my ($c, @args) = @_;
}
で、それを sasata299 が解決してくれた。GJ
Chained を使えばいいらしい。
sub chain : Chained('/') PathPart('') CaptureArgs(0) {
my $self = shift;
my ($c) = @_;
}
sub hoge1 : Chained('chain') PathPart('hoge') Args(0) {
my $self = shift;
my ($c) = @_;
}
sub hoge2 : Chained('chain') PathPart('hoge') Args(1) {
my $self = shift;
my ($c, @args) = @_;
}
sub hoge3 : Chained('chain') PathPart('hoge') Args(2) {
my $self = shift;
my ($c, @args) = @_;
}
chained の使い方については sasata299 が
まとめてくれているので分かりやすかった。
CatalystのChainedアクションを使いこなすための3つのルール
また CatalystのChainedアクションの連鎖を止める方法 このエントリーも併せてみとくといいかも。
多謝多謝
追記 2009-05-19 12:50:11
id:typester さんに Path アクションでやる方法を教えてもらった。(TL)
sub hoge1
ath('hoge') :Args(2) {
my $self = shift;
my ($c) = @_;
}
sub hoge2
ath('hoge') :Args(1) {
my $self = shift;
my ($c, @args) = @_;
}
sub hoge3
ath('hoge') :Args(0) {
my $self = shift;
my ($c) = @_;
}
さらに注意点も教えてもらった。
以下 TL の引用。
- Pathアクションは同じパスだと後から書いた方が優先されるので、Argsは多い順に定義しないとダメ
- Args多いのを後から書くとそれに全部持って行かれる
- さらにちなむと index
ath とか default
ath とかはどこに書いても優先されるけど、これは専用のDispatchTypeがあり、Pathアクションではないのです
勉強になった。色々な方法があってやっぱおもしろい。
ありがとうございました〜
なぜいまさら TimeMachine を使おうとしだしたかというと OS アップデート中に停電。
そして OS の挙動がおかしくなり、システムをいれなおすも変にメモリリークおこす始末。
で、環境構築しなおすはめに。めんどくさくてしたくないから TimeMachine を導入してみた。
これで安心。やっぱりバックアップは大切ね。
何箇所かハマったので、それのメモ。
実際の作業は分かりやすくまとめているサイトがあるのでそれらを見てもらえればと。
ネットワーク越しTimeMachineをセットアップ
Samba を使って TimeMachine の環境を構築する
一連の流れだけまとめとくと
ディスクユーティリティで空の新規イメージを作成。
その際に容量は 100M で作り、smb に移動した後にサイズ変更。
あとはボリュームを mac 側にマウントし TimeMachine を実行。
大体こんな感じ。
ただ言葉だけだと簡単やけどハマり所はいっぱいあったんで、下記まとめ。
-
defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1
これを Terminal.app から入力するとネットワーク越しのボリュームが確認できるようになる。
-
バックアップ用のイメージは [Macのコンピュータ名]_[en0のMACアドレス] でファイルを作ること
このコンピューター名が /etc/hostconfig で設定している名前でなくて
「環境設定」->「共有」で設定されている名前。
MACアドレスは Terminal.app から ifconfig en0 とうった ether の項目。
ちなみに : の記号は削除した12文字の英数字。
間違えていると「バックアップディスクイメージをマウントできません」ってエラーがでる。
-
Samba はパスワードロックをかけていても問題なし。
-
Intel mac の場合は「空の新規イメージ」を作る際のパーティションを「単一パーテーション・GUIDパーテーションマップ」を使った方がいいらしい。
これであとは TimeMachine を実行すると数時間後に完了される。
あと毎回 smb をマウントするのめんどくさいので、マウントされたボリュームを
「アカウント」->「ログイン項目」にドラドロしとけば起動時に自動的にマウントされる。
あと、ふと思ったけど TimeMachine でバックアップとっていっとけば新しいマシンも
TimeMachine のデータから復元すれば新しいマシンのセットアップが速攻で終わるんじゃないかと思った。
できたら相当便利なんだけどなー。
MAC アドレスみてるからきっと無理なんだろうなとは思うけど。
参考資料
SambaボリュームからTimeMachineで復元する
追記 2009/05/18 AM 03:41
一度 TimeMachine でバックアップをとると、イメージファイルがマウントされっぱになる。
こいつをアンマウントしてやらないと次回のバックアップの開始する際に
「バックアップディスクイメージをマウントできません」ってエラーで死ぬので要注意
追記 2009/08/02 PM 07:02
「バックアップディスクイメージをマウントできません」というエラーがでて
/var/log/system.log 以下に Failed to mount disk image と出てた場合、
バックアップ先の ._[Macのコンピュータ名]_[en0のMACアドレス].sparsebundle を削除すればマウントできた。
ただし、これを削除すると Finder 上からはただのフォルダという認識になるためパーティションを
切り直した後に削除すること。
そうしないとディスクユーティリティでサイズの変更ができなくなる。
それにしてもはまり所が多くて困る。
タイトルのようなエラーが出たということで少しヘルプした。
状態は CS3 だとエラーが何もでずにコンパイルできて Device Central でも Flash Player でも真っ白くなる。
で、CS4 だと「 FLERR: SWF データ破損エラーです。」ってエラーがでる。
ちなみに Flash8 だとコンパイルでき、正常に表示できた。
なんてカオスっぷり。
これは何が原因かとおっていった結果
CS3 から追加された機能で、illustrator で書いたのをそのままもってきたものを描画した際にやられてたみたい。
対応としては illustrator で書いたものを gif にしてもってきた。
それにしても CS3 で何も表示されないのはちょっと、、、、
はやく全てが Flashlite2 いや、むしろ AIR になっちゃえばいいのにと思う今日この頃。
タイトルの通り今回したかったのはファイルハンドルを使って
ファイルへ出力していたコードの出力先を変数にしたかった。
そういうことをしてくれる小粋なモジュール IO::Scalar を使って対応しました。
これがまた便利で、数行書き換えるだけでよくてパフォーマンスは使う前と後で、それほど差異はありませんでした。
通常の FileHandle を使ったコード
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, '>', 'file' or die $!
print $fh 'hoge'; #この時点で file とう名前のファイルがカレントディレクトリにつくられます。
1;
IO::Scalar を使って出力先を変数にしたコード
#!/usr/bin/perl
use strict;
use warnings;
use IO::Scalar;
my $file;
my $out;
{
my $fh = IO::Scalar->new(\$out);
local *F = $fh;
$file = *F;
print $file "hoge\n";
}
warn $out;
1;
で、調べていくと IO::String というモジュールも同じようなことをしてくれることを知った。
ちょっと試してみたけどインターフェースはさほどかわりない感じ。
というわけでベンチ。
Rate IO_STRING IO_SCALAR
IO_STRING 210/s -- -44%
IO_SCALAR 373/s 77% --
見た通り IO::Scalar の方がはやいですね。
試したコードはこれ。
#!/usr/bin/perl
use strict;
use warnings;
use IO::String;
use IO::Scalar;
use Benchmark qw/cmpthese/;
my @data = map { int rand 1000 } 1..1000;
cmpthese(10000, {
IO_STRING => \&with_io_string,
IO_SCALAR => \&with_io_scalar,
});
sub with_io_scalar {
my $output;
my $ios = IO::Scalar->new(\$output);
local *STDOUT = $ios;
print $_ for @data;
# warn $output;
}
sub with_io_string {
my $output;
my $ios = IO::String->new(\$output);
local *STDOUT = $ios;
print $_ for @data;
# warn $output;
}
1;
参考資料
IO::Scalarで色々
IO::scalarでIOのキャプチャ