もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

Automatorでエラーメッセージを表示したい

Automator内に書いたシェルスクリプトでなんか都合の悪いことが起きた場合、戻り値を0以外にすることでワークフローをエラー終了させることが出来ます。

しかしながら、表示されるエラーメッセージはAutomator標準のもので、制作者がエラー要因をユーザに伝えることは出来ません。
(開発時ならstderrに要因を書いておけばエラー欄に出るんだけどね。)

f:id:moguno:20130120225951p:plain

それでは何とも使えないので、任意のエラーメッセージを出すアクションを書いてみました。

前のアクションの出力の1行目が***error***の場合、2行目以降をメッセージボックスに表示してエラー終了します。
そうじゃない場合は前のアクションの出力をそのまま次のアクションに渡します。

on run {input, parameters}
	
	if item 1 of input is equal to "***error***" then
		set message to ""
		set msglist to rest of input
		
		repeat with linex in msglist
			set message to message & linex & return
		end repeat
		
		display dialog message buttons {"OK"} with icon 0
		error
	else
		return input
	end if
end run

これでOK。

例えば、前のアクションがstdoutが

***error***
cueファイルをドロップしてください

だった場合、こんなメッセージボックスが出ます。

f:id:moguno:20130120225552p:plain

ばっちり。
(その後、前述のAutomatorのエラーが表示されるのが格好悪いですが・・・)

しっかし、Apple Scriptって文法が冗長であんま好きじゃないなぁ。

Macでmikutter起動用のアイコンを作る

あなたがこのエントリを読む頃には、僕はもうtwitter上にはいないでしょう。
何しろ、Macでmikutterを動かしてしまったのですから。


それはmikutterでの最大の禁忌。


間もなく僕は最寄りのておくれにtwitterアカウントを八つ裂きにされ、この(ネット)人生を終えることになるでしょう。


僕に残されたこのわずかな時間。
なんとかこのTipsをあなたにお伝えしたいと思います。

Macってショートカット無いの?

わっふー!無事マイMacでmikutterが動作するようになったぜ。
作者にもなし得なかったことを成した背徳感!たまんねえ!!


さて、お次はコマンドラインからじゃなくてFinderとかDockのアイコンで起動してやるぜ!


しっかし、Rubyスクリプトをクリックしてもプログラムを実行してくれないのよね。
Windowsならショートカットを作ればいいだけなのだけれど、Macの類似機能であるエイリアスではどうもそれが出来そうにない。


拡張子が.commandのシェルスクリプトはFinderから起動できるけど、ターミナルが開いちゃうのでかなりイマイチ。


さてどうしましょ?

Automatorで作ってみた


そう言えば昔、Automatorを使えば任意のコマンドを実行できると読んだことがあるぞ?
と、思って、ちょっと作ってみました。


f:id:moguno:20130114005225p:plain


内容は単純。「シェルスクリプトを実行」でコマンドを実行するだけ。

nohup rubyのフルパス mikutter.rbのフルパス > /dev/null 2>&1 &

"nohup 〜 &"は親プロセスが死んでも子プロセスがそのまま生き続けるためのおまじない。
これがないとmikutter起動中、タスクトレイ?にずっとAutomatorの実行中を示す歯車が表示されてうざいです。


後、stdoutをどっかにリダイレクトしとかないとmikutterがSIGPIPEで落ちるので、stderrもろとも/dev/nullに捨ててます。
(普通は自動的にnohup.outにリダイレクトされるはずなんだけどなあ。)


こうして出来たアプリケーションにmikutterアイコンをセットしてやれば・・・


f:id:moguno:20130114010253p:plain


よっしゃ!いっちょまえのMacアプリっぽくなりました。


でも、WindowsとかLinuxの各種DEで当たり前に出来ることがMacで出来ないって言うのも不思議な話で。
なんか他にやり方があるんだろうか?


ぴんぽーん♪


・・・おや、誰か来たみたい。

2015年6月20日追記

mikutterのデーモンモードを使えば、nohupとか駆使しなくても大丈夫でした。

rubyのフルパス mikutter.rbのフルパス -d

RaspbmcのAirPlayでハマったでござる


MacBook Airを買ったぜわっしょい!


さっそく今までヨダレ垂らして指くわえて見てたステキ機能を堪能するぜ!
まずはAirPlayだ!手元の動画をRegzaで見るぜ!
ああ、でもAppleTV持ってないぞ。でもきっとオプソ界にはニートな解が転がってるはず!


パスっ!タスタスタス!(SpotlightでWeb検索)


よし、Raspberry Pi向けのXBMC(Raspbmc)はAirPlayがしゃべれるぞ!!!


と、言うわけでRaspbmc導入スタート!

ダメでした

むぅ、iTunesのAirPlayデバイスにはRaspbmcが表示されてるんだけど、クリックしても「接続中です」がずっと出て接続が確立しない。。。


暇だからちょっと調査してみますか。

通信の状況を調べる

まずはMBAとRaspbmcの通信の状況を確認してみる。
まずはhomebrewでtcpdumpを・・・ってデフォルトで入ってるの!?
何このOS!超いいじゃん!

Alicia:~ moguno$ sudo tcpdump | grep raspbmc
・・・
18:36:41.308272 IP6 alicia.local.49174 > raspbmc.local.36666: Flags [S], seq 105655457, win 65535, options [mss 1440,nop,wscale 4,nop,nop,TS val 744813686 ecr 0,sackOK,eol], length 0
18:36:41.312502 IP6 raspbmc.local.36666 > alicia.local.49174: Flags [R.], seq 0, ack 105655458, win 0, length 0


ポート36666に対してコネクションしようとしてるけど拒否られてる。
てことは、Raspbmc側で必要なサーバが起動してないってことか。

ほーらやっぱり・・・あれ?

と、言うわけでRaspbmc側でポートが開いてないことを確認。
(ちなみにRaspbmcはRaspbianと同じく、ユーザ名:pi、パスワードraspberryでsshログイン可能です。)

pi@raspbmc:~$ netstat -a | grep LISTEN
・・・
tcp        0      0 *:36666                 *:*                     LISTEN     
tcp        0      0 *:36667                 *:*                     LISTEN     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN 
・・・


あれ?開いてるじゃん??

繋がる・・・だと?

一旦MBAに戻って、telnetを汎用TCPクライアントとして導通確認をば。
このMBAさん、telnetもばっちりデフォルトで完備です。
sshも入ってないのにtelnet消しちゃった某OSに、りんごのヘタを煎じて飲ませてやりたいですよ。

Alicia:~ moguno$ telnet raspbmc.local 36666
Trying 192.168.11.14...
Connected to raspbmc.local.
Escape character is '^]'.

RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 

^]
telnet> quit
Connection closed.

えー、なんで繋がるん???

IPv6だ!

よく分からなくなってきたので、もっかいtcpdumpログを見なおしてみる。

18:36:41.308272 IP6 alicia.local.49174 > raspbmc.local.36666: Flags [S], seq 105655457, win 65535, options [mss 1440,nop,wscale 4,nop,nop,TS val 744813686 ecr 0,sackOK,eol], length 0
18:36:41.312502 IP6 raspbmc.local.36666 > alicia.local.49174: Flags [R.], seq 0, ack 105655458, win 0, length 0


IP6・・・だと?

tcp        0      0 *:36666                 *:*                     LISTEN     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN 


あー、ポート36666はIPv4のINADDR_ANYにしかバインドされてない!これだ!!


つまり、こういうことでした。


・RaspbmcはIPv4IPv6両方のアドレスを持つので、avahiで両方のアドレスが他のノードにアナウンスされる。
・でも、RaspbmcはIPv4の36666ポートしか接続を受け付けない。
MBAIPv6を優先でIPv6の36666ポートにアクセスしに行くけど、RaspbmcはIPv4の36666ポートしか見てないから繋がない。

お兄ちゃん!いつまで寝てるの!!

と、言うわけでこの話のオチ。
RaspbmcのIPv6を無効にすることで対処しました。

pi@raspbmc:~$ sudo vi /etc/sysctl.d/ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1


そしてリブート・・・


通った。(エルクゥ風に)


256MB版Raspberry Piだけども、動作は超良好。
AirPlayサーバが欲しいだけならRaspberry Piで十分だわ。