2008/04/06

iTunesとMac::iTunes

Mac miniのモニタはゲームと兼用で使用しているため、ゲーム中はiTunesの操作ができない。
WindowsのノートからMacのiTunesを操作できれば万事解決すると考え、検索してみるとVNCでどうにかする人が多いようだ。
iTunesだけを操作したいのにVNCは大げさ。
Windows側がへぼいからかVNCのせいかはわからないが、レスポンス悪いし。

Mac同士だとリモート操作用のアプリケーションが出てたりするが、Windows,Mac間となると急に選択肢がなくなった。
結局CPANで検索するとMac::iTunesなるModuleが見つかる。

Mac::iTunesは内部で動的にAppleScriptを生成して、Mac::AppleScriptで実行する実装。
パフォーマンスは高くないが、そもそもそれほど操作する訳でもないのでOK。
Mac::iTunesの作者がApache::iTunesというmod_perlで動くモジュールも公開してたけど、まだAlpha版、すげー遅いって書いてあるので今回はパス。

Term::ReadLineとMac::iTunesで実装してみた。

ショートカットキーやら、表示周りがださいなー。
そして、使ってるうちに日本語の入力が効かないことが発覚。
Macのterminalでは日本語は使えるが、Term::ReadLineを通すとおかしくなる。
WindowsのTera Term経由だとそもそも日本語の入力がおかしい。
まあ、今度考えよう。

一応コードをさらしておく。


#!/usr/bin/perl

use strict;
use warnings;
use Term::ReadLine;
use Mac::iTunes;

our $VERSION = '0.001';

# setup term
my $prompt = 'iTunes> ';
my $term = Term::ReadLine->new($prompt);
my $OUT = $term->OUT || \*STDOUT;
select($OUT);

# setup itunes controller
my $itunes = Mac::iTunes->controller;

my %return_dispatch = (
state => 1,
current_track_name => 1,
pl => 1,
playlist => 1,
get_playlists => 1,
);

my %alias = (
c => 'current_track_name',
p => 'playpause',
s => 'state',
a => 'activate',
q => 'quit',
h => 'help',
pl => 'get_playlists',
playlsit => 'get_playlists',
);

my %show_status = (
p => 1,
play => 1,
stop => 1,
start => 1,
pause => 1,
playpause => 1,
play_track => 1,
);

while ( defined( $_ = $term->readline($prompt) ) ) {
chomp;
my ( $command, @opts ) = split /\x20/, $_;
my $org_command = $command;
$command = $alias{$command} || $command;
if ( $org_command =~ /^(h|help)$/ ) {
help();
}
else {
my $ret = exec_command( $command, @opts );
if ( $show_status{$org_command} ) {
print $itunes->state;
}
my $show_return = $return_dispatch{$command} ? 1 : 0;
$ret = join "\n", @$ret if ref $ret eq 'ARRAY';
print $ret if $show_return;
}
$term->addhistory($_) if /^\S$/;
}

sub exec_command {
my ( $command, @opts ) = @_;
my $ret;
if ( $command eq 'play' and @opts ) {
$command = 'play_track';
unshift @opts, 1;
}
eval { $ret = @opts ? $itunes->$command(@opts) : $itunes->$command; };
warn $@ if $@;
return $ret;
}

sub help {
print << 'HELP';
command list:
a, activate
start itunes if it stopped.
q, quit
quit itunes if it activated.
play [playlist]
start track.
pl, playlist, get_playlists
show list of iTunes playlist.
stop
stop current track.
pause
pause current track.
next
skip current track.
p, playpause
switch play, pause.
c, current_trach_name
show current track name.
h, help
show this message.
HELP
}

2008/03/23

AppleScriptとMacRuby

Matzにっき
http://www.rubyist.net/~matz/20080317.html#p01

MacRubyがObjective-C(or AppleScript)を乗っ取る

タイトルをつけた人の意図はそこにはないとは思うけど、 これは結構ありそう。

もちろん、Objective-Cのすべてを奪うことはありえないけど、 MacRubyレベルでObjective-Cとの融合が進むと カジュアルな利用はRubyで行うというのは予想以上に広まるかも。

また、AppleScriptの英語モドキよりもいっそRubyのような 「普通のプログラミング言語」を使った方がわかりやすい という人も多いだろう。


AppleScriptよりRubyの方が断然わかりやすい。
AppleScriptのわかりにくさ、書きにくさはなんだろうね。
英語圏の人だと書きやすいのかな。

2008/02/13

bluetoothヘッドセットを購入

今までSkypeで使用していたヘッドセットのマイクが不調で、マイクが音を拾ってくれなかったりしたので購入。

買ったのはPLANTRONICSのVOYAGER 510。
Amazonで割と評判がよかったのでこれにした。
一番小さいのにしても、イヤーピースが若干大きい気がするが、音もしっかり拾ってくれるし、音声もまあまあ。
今まで違ってワイヤレスなので快適だ。


話は変わってSpore。
twitter経由で知ったけど、9月に出るそうで。
動くようなPCもってないし、Mac版も出そうなのでMacBook Proが欲しいなー。

2008/01/20

Mac::Growlを使ってみた

MacにはGrowlという色々なアプリケーションに対応したNotiferがあることを知った。
PerlのMac::Growlモジュールを使えば、自分のスクリプトからGrowl経由で通知を出せるようなので、使ってみた。

まずMac::Growlをインストール。
sudo cpan
install Mac::Growl


使い方
まずは、Growlにアプリケーションを登録する。
use Mac::Growl qw(RegisterNotifications);

RegisterNotifications(
$appname, # 登録するアプリケーション名
['alert', 'note', 'info'], # 登録したアプリケーションで使用する通知の種類。
# 自分が分かりやすい名前にしておくといいと思う
['note'] # デフォルトで使用する通知の種類。なんで複数の値を渡せるのかは知らない
);


んで、実際に使用するスクリプトにGrowl用のコードを埋め込む。
use Mac::Growl qw(PostNotification);

PostNotification(
$appname, # 先ほど登録したアプリケーション名
'alert', # 通知の種類。登録してあるalert, note, infoのうちのどれかを渡す。
$title, # 表示されるタイトル。日本語を渡す場合は、
# Encode等を使用して、UTF-8にしてあげる必要があるようだ。
$description, # 表示される内容。
);


PostNotificationには他にもいくつか引数を渡せるが、とりあえずこれでOK。

時間がかかるスクリプトに仕込んでおけば、結構便利だった。

2007/11/13

自宅でのプログラミングでもSVNを使おうと思った

別に職場でコード書くのに使ってる訳じゃないんだけどね。
~/binがぐちゃぐちゃになってきたので、SVNとか使ってみようかなと思った次第。
次使うとき忘れるとめんどいのでメモ。

svnはportでinstallして終了。
sudo port install subversion


手順のメモ
1. リポジトリを集めとくディレクトリをとりあえず作成する
2. svnadminコマンドで実際のリポジトリを作成
3. SVN_EDITORにお気に入りのエディタを指定しておく。自分の場合はvim。.zshrcあたりに書いとけ
4. ~/binにあったファイルをimport
5. ~/binに/Users/yoshi/svn_reps/binからcheckout
6. 開発用ディレクトリを作成して、そこにもcheckoutする
(LISTタグが巧く効かないぞ! 日本語は駄目って落ちなのか?)

mkdir svn_reps
cd svn_reps
svnadmin create bin
svn import ~/bin file:///Users/yoshi/svn_reps/bin
cd ~/bin
rm -rf *
svn co file:///Users/yoshi/svn_reps/bin



とりあえずこんな感じ。
ソースのバージョン管理に使ったことないから、適当にやってしまったが開発用ディレクトリとかいるのかな?

2007/09/26

Event::Libで遊ぼうと思った

とりあえずCPANからinstallしようとして、ほっといたらエラーでこけた。
~/.cpan/buildにEvent-Libがあるので、そこにおりて行ってperl Makefile.plを実行してみるとevent.hがないと言われる。
よく考えたらまっさらな状態でinstallしたばっかりのDebianにlibeventが入っているはずもなく。
公式サイトhttp://monkey.org/~provos/libeventに行って、最新版をダウンロード。
./configure;make;make installですんなりインストール完了。

気を取りなして
perl Makefile.pl
make test
make install
無事に入った。
しかしもう1時になるのでここで終了。

2007/09/24

Synergyって便利だ

以前使ってた机は、こっちのアパートにはでかくて入らなかったので机が狭くなった。
小さい折りたたみのテーブルを机代わりに使用している。

ここで問題が一つ。
狭いんです。
Mac用のキーボードとThinkPadを横に並べておけない。
どうにも使いづらくて困っていたんだけど、Synergyっていうソフトウェア切り替え機があることを知って導入してみた。
大変便利です。
Windows用の方は最新ので問題なかったけど、Macの方に問題が発生。
どうもIntelMacだとBus errorで止まってしまう。
結構メジャーな話らしくて、調べると色々出てきた。

最新のver 1.3.1じゃなくて1.3.0でIntelMac用にhackした人見つけた。
masuidrive on rails IntelMacでSynergy2を動かす

 ソースを追ってみたら、lib/platform/COSXKeyState.cppの中でgetKeyMapでKCHRを取得する所でコケている様なので、356行のgetKeyMap(keyMap, g, kchr);をコメントアウトしてみたら、動いた。多分UCHRを取得してるから問題ないと思うんだけどな。とりあえず使ってみて、おかしい所があったら考えよう。


次に気になったのが、クライアント側からサーバ側にマウスポインタを移動させたとき、クライアント側のポインタの位置が画面中央なこと。
これも調べてみると修正している人が居た。
qootas.org/blog synergy で leave したときのマウス位置を 0x0 に

synergy で操作していると leave したときに画面のど真ん中にマウスカーソルがくるのが邪魔。0x0 に変更した。以下は 1.3.1 のコードに対する diff。lib/platform/COSScreen.cpp の COSXScreen::leave() で fakeMouseMove(m_xCenter, m_yCenter) しているところを fakeMouseMove(0, 0) に変えるだけの簡単なお仕事です。


この二つを組み込めば、快適なはず。

documentを読むと、OSXでも./configure;make;make installでよいらしいが、初めてXCodeを使ってみる。
buildを実行するとSDKが存在しない2.8.sdkだかを指定していて、エラーが出てこけた。
とりあえず、4u.sdkを指定してみると警告は大量に出たがコンパイル完了。
documentではbuildに作成したのができるとあったが、gen/build/Deploymentに作成された。
これをとりあえず/usr/local/binにコピーして終了。

bus errorも出ないし、ポインタの位置も左上にきた!