ports で入れた perl で Mac::Growl が使えるようになるまで

By admin | 2009年5月25日

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 で起動させると使えない。
ソース

同一 Action 名の Path Spec を実装するには Chained を使う

By admin | 2009年5月19日

/hoge/*

今まで上記のような Path Spec を実装するときは

sub hoge : Args(1) {
    my $self = shift;
    my ($c, @args) = @_;
}

こんな感じでやってた。

/hoge
/hoge/*
/hoge/*/*

で、今回はこういう 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 :P ath('hoge') :Args(2) {
    my $self = shift;
    my ($c) = @_;
}

sub hoge2 :P ath('hoge') :Args(1) {
    my $self = shift;
    my ($c, @args) = @_;

}

sub hoge3 :P ath('hoge') :Args(0) {
        my $self = shift;
    my ($c) = @_;

}

さらに注意点も教えてもらった。
以下 TL の引用。

  • Pathアクションは同じパスだと後から書いた方が優先されるので、Argsは多い順に定義しないとダメ
  • Args多いのを後から書くとそれに全部持って行かれる
  • さらにちなむと index :P ath とか default :P ath とかはどこに書いても優先されるけど、これは専用のDispatchTypeがあり、Pathアクションではないのです

勉強になった。色々な方法があってやっぱおもしろい。
ありがとうございました〜

Samba を使って TimeMachine の環境を整えたメモ

By admin | 2009年5月18日

なぜいまさら 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 上からはただのフォルダという認識になるためパーティションを
切り直した後に削除すること。
そうしないとディスクユーティリティでサイズの変更ができなくなる。
それにしてもはまり所が多くて困る。

FlashLite で 「FLERR: SWF データ破損エラーです。」と出た時の対処

By admin | 2009年5月2日

タイトルのようなエラーが出たということで少しヘルプした。

状態は CS3 だとエラーが何もでずにコンパイルできて Device Central でも Flash Player でも真っ白くなる。
で、CS4 だと「 FLERR: SWF データ破損エラーです。」ってエラーがでる。
ちなみに Flash8 だとコンパイルでき、正常に表示できた。
なんてカオスっぷり。

これは何が原因かとおっていった結果
CS3 から追加された機能で、illustrator で書いたのをそのままもってきたものを描画した際にやられてたみたい。
対応としては illustrator で書いたものを gif にしてもってきた。

それにしても CS3 で何も表示されないのはちょっと、、、、
はやく全てが Flashlite2 いや、むしろ AIR になっちゃえばいいのにと思う今日この頃。

FileHandle に書き込んでいたデータの出力先を変数にしてくれるIO::Scalar

By admin | 2009年5月1日

タイトルの通り今回したかったのはファイルハンドルを使って
ファイルへ出力していたコードの出力先を変数にしたかった。

そういうことをしてくれる小粋なモジュール 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のキャプチャ

WordPress Themes