もぐてっく

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

Macでもmikutterに喋ってもらうためのプラグインを作ったよ

誰かが言ってた。


「Macにはaplayコマンドが無いからmikutterが喋らないけど、afplayって類似コマンドがあるよ。」


なんだけど、微妙にコマンドラインオプションが違うのでシンボリックリンク程度では、まだmikutterは僕をガン無視。

なのでcoreにあるalsa.rbをちょっと改造してプラグインを作ったっす。

下記をafplay.rbってファイル名でプラグインフォルダに置くと良いよ。

# -*- coding: utf-8 -*-
# afplayコマンドで音を鳴らす

Plugin.create :afplay do

  on_play_sound do |filename, &stop|
    if command_exist? "afplay"
      SerialThread.new {
        bg_system("afplay", filename) if FileTest.exist?(filename) }
      stop.call end end
end

テスト方法

Debianとつぶやきましょう。

「りついーと!」

mikutterがしゃべります。

Automatorでアプリケーションにファイルを開かせる

やっぱり、Macのアプリをコマンドライン引数でファイルを指定して起動させる方法は無いみたい。
UNIX的なアプローチを取れば行けるんだけど、まぁダサいよねと。)

じゃあ、アプリにファイルをドラッグアンドドロップする操作を模擬出来ればいいんじゃね?と、たどり着いたのが以下のコード。
「開く」コマンドをスクリプトから叩いてる感じですね。

on run {input, parameters}
	
	tell application "XLD"
		activate
		open item 1 of input
	end tell
	
	return input
end run


多分AppleScripterの方々には常識なんでしょうが、自分的備忘録として。

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って文法が冗長であんま好きじゃないなぁ。