« June 2004 | Main | September 2005 »

2005.08.28

WindowsXPでタスクトレイアイコン(インジケータ)が消えた場合の復活方法

 WindowsXPをしばらくの間使っていると、タスクトレイに表示されるはずのアイコンが表示されなくなってしまい、タスクトレイからしかアクセスできない機能が使えなくなり、大変困っていた。
 「ハードウェアの安全な取り外し」のアイコンが消えてしまうと、PCカード類や外付けの機器を正しい手順で外すことができなくなるし、タスクトレイからしかアクセスできないソフトウェアは使いものにならなくなる。

 こういう現象に直面したら、以下の手順で[通知のカスタマイズ] ウィンドウから [過去の項目] リストをクリアすると直る。

1. 過去の項目リストをクリアするには、以下のレジストリ キーから IconStreams 値 および PastIconsStream 値を削除します。

 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify

2. タスクマネージャを起動後、プロセス タブを選択して、プロセスの一覧に表示される explorer.exe をクリックして、プロセスの終了を実行して下さい。

3. タスクマネージャで、ファイルを開いて、新しいタスクの実行を選択して、新しいタスクの作成で、名前に "explorer" を入力して OK を実行して下さい。

何を隠そうMSからのコピペなのだけど、これを知ってとても助かった。
セキュリティも大事だけど、こういう基本的なところが何年経っても直らないのはどうかと思う。

「ハードウェアの安全な取り外し」自体は、下記を実行すると表示されるのは知っている。

rundll32.exe shell32.dll,Control_RunDLL hotplug.dll

|

2005.08.26

[REALbasic]REALbasicでのAppleEventと、そのサンプル

ソースを見たいという人が居たので、最近連綿とやっていたSafariのAppleEventによるコントロールをモジュール化したものを公開してみます。というかSafariStalkerの中の人です。

「AppleEventSample.sit」をダウンロード

実際はSafariだけじゃなくて、System EventsなどにもAEを送ってたりしますけど。

初心者なもんで恥ずかしいですが、国内においては情報のソースがのきなみ数年前のもの、書籍は皆無! っていう風前の灯火状況にあるREALbasic界に、少しでもにぎわいが戻ればという思いを込めて。

REALbasicでAppleEventをやる際には、かの田中求之氏によるドキュメントが、もはや6年近く前のものになるものの、今なお最高の参考資料になります。

>REALbasic で AppleEvent を活用する

>REALbasic で AppleEvent を活用する方法や、AppleScript 対応のアプリケーションの作り方を解説した文書です。
>pratical_use_of_AE_in_RB.sit

↓ドキュメントはここにあります。

http://mtlab.ecn.fpu.ac.jp/webcon_resources.html

このドキュメントを読んだ限りでは、


core¥setd{
data:"http://www.google.co.jp/", //←これ
----:obj {
form:'prop',
want:'prop',
seld:'pURL',
from:obj {
form:'indx',
want:'docu',
seld:1,
from:'null'()
}
},
&csig:65536
}

こういうパターンが出たときにどうしていいのか分からなくて焦りましたが、

ae.StringParam("data") = "http://www.google.co.jp/"

こんな風にAppleEventのStringParamとして渡してやればいいです。

|

2005.08.25

EyeTV 200で録画したファイルをPocket PC(Windows Mobile)で外に持ち出す

EyeTV 200は、MPEG-4をリアルタイムエンコードできる、Mac OS X上において貴重なデジタルTVレコーダー。

録画したファイルをPSP用のMPEG-4に書き出すこともでき、変換は用意されたメニューを実行するだけと簡単。問題無く再生できるが、MPEG-4として録画していても、書き出し時に再エンコードが必要だ。

EyeTV 200でリアルタイムエンコードしたMPEG-4を、再エンコード無しでネイティブ書き出しすることもできる。この場合は書き出しに、ほぼファイルのコピー程度の時間しかかからない。

ファイルを小さくしようとすると、解像度352x240(30fps)、動画512kbps/音声64kbps(44.1kHz)ぐらい(カッコ内は固定)でバランスされるが、これはそのままPocket PC(Windows Mobile)用の動画プレイヤー、TCPMP(旧名BetaPlayer)で再生できた。

解像度352x240がEyeTV 200で録画できる最小サイズなので、Pocket PC(Windows Mobile)の液晶の解像度より少し大きくなってしまい、再生時にリサイズをかけると画面の崩れが気になるが、TCPMPでは原寸再生にも対応しており、あまった分を外に逃がせる。若干左右が切れてしまうことになるが、気になるほどではない。

つまり、最初からMPEG-4の低ビットレートな設定で録っておけば、ほぼファイルコピーだけの手間でPocket PC(Windows Mobile)にて再生可能ということ。

このEyeTV 200ネイティブなMPEG-4、残念ながらPSPでは再生できない。
Zaurusのmplayerでも一応再生できるが、なぜかガタガタで見られたものではなかった。

一応蛇足ながら書いておくと、EyeTV 200が保存した書き出し処理前のファイルにも拡張子.mpgが付いているが、これは一般的な形式のMPEGファイルではないらしく、これをQuickTime PlayerやVLC、MPlayer OSXで再生しようとしても無理。一度は「書き出し」の処理を経由しないと一般的な動画プレイヤーで再生することはできないようだ。

|

2005.08.24

Safariの文字コード自動判定補助ユーティリティ「SafariStalker Ver.0.2」

SafariStalker
Ver.0.2
(Freeware)

■これは何か?

 Safariは日本語のテキストエンコーディングの自動判定が弱く、charsetの指定が無いと、文字化けしてしまいがちです。
 その日本語のテキストエンコーディングの自動判定を補うソフトウェアです。
 charset指定が無いテキストファイルの場合でも、ほぼ正確に判定します。

 テキストエンコーディングを自動判定したら、Safariのテキストエンコーディングを自動的に切り替えます。
 これによって文字化けを防止します。

SafariStalker02

「SafariStalker0.2.sit」をダウンロード

一応、Panther + Safari1.3でも動くようにしたはず。

おまけ機能(Up Dirボタン)も搭載。
押すと、最前面で表示しているページの、一つ上の階層を表示します。

http://www.orz.org/current/



http://www.orz.org/

■履歴

2005/08/24 Ver.0.2

・表示URLが切り替わると無差別にテキストエンコーディングを切り替えていたものを、実際にテキストエンコーディングに変化があったときだけ切り替えるように。

・おまけ機能「Up Dir」を実装

・Panther + Safari1.3の環境で、「Default」ボタンが効いていなかったのを修正。

|

2005.08.22

Safariの文字コード自動判定補助ユーティリティ「SafariStalker Ver.0.1」

SafariStalker
Ver.0.1
(Freeware)

「SafariStalker0.1.sit」をダウンロード

SafariStalker01

■これは何か?

 Safariは日本語のテキストエンコーディングの自動判定が弱く、charsetの指定が無いと、文字化けしてしまいがちです。
 その日本語のテキストエンコーディングの自動判定を補うソフトウェアです。
 charset指定が無いテキストファイルの場合でも、ほぼ正確に判定します。

 テキストエンコーディングを自動判定したら、Safariのテキストエンコーディングを自動的に切り替えます。

■Safariの文字化け

 Safariの文字化け問題はいろいろあるようですが、このソフトウェアでフォローするのは、テキストエンコーディングの自動判定だけです。

 例えば、テキストファイルを直置きしているようなリンク先なんかの場合は、まず化けずには済まないでしょう。
 見るページの傾向にもよるかもしれませんが、やむにやまれず、自分でテキストエンコーディングを選択する局面が結構あるものです。
 また、一度デフォルト以外に設定すると、以降、そのテキストエンコーディングでしか表示してくれないので、いちいちデフォルトに戻したりを繰り返す必要があるのも、ストレスの一因になっています。

 これがほとほと嫌んなって作りました。

■使い方

 Safariといっしょに起動して使います。

 ウインドウが、Safariがアクティブなときのみ表示されるGlobalFloatingWindowに設定されています。
 自分自身がアクティブなときも非表示なのがオマヌケですが。

・「Auto Detect」ボタン

 Safariの一番前にあるウインドウで表示中のページのテキストエンコーディングを自動判定して、テキストエンコーディングを切り替えます。

 1回押せば、1回判定、1回切り替えします。

・「Default」ボタン

 Safariの一番前にあるウインドウで表示中のページのテキストエンコーディングを「デフォルト」に戻します。

・「Keep Watch」チェックボックス

 チェックボックスをONにすると、Safariの一番前にあるウインドウで表示中のページのテキストエンコーディングを自動判定して、テキストエンコーディングを切り替えます。
 「Auto Detect」ボタンとの違いは、常にSafariのSafariの一番前にあるウインドウで表示中のページのURLを監視していて、切り替わったとほぼ同時に1回判定、1回切り替えすることです。

 これをONにしておきさえすれば、基本的に文字化けとはおさらばできることになりますが、ページが切り替わることにリロードされることになるので、ちょっとウザいかも。

■注意

 運悪く、ページに適当なcharset指定が無いと、独自にページをダウンロードしてきてテキストエンコーディングを判定するので、非ブロードバンドではちょっと無理臭いです。
 Safariから渡されるページのSourceがUTF-16になってしまっているから、これはしょうがないみたいです。

■動作確認環境

 Mac OS X Tiger (10.4.2) + Safari2.0 (412.2.2)で動作確認しました。
Mac OS X Panther (10.3) + Safari1.3なら動いてもおかしくない。
動かなかった……。多分、OSバージョンの判定がまずい。
 ※OSがUI Scriptingに対応してないといけないので、10.3以前は無理です。

■履歴

2005/08/22 Ver.0.1

■免責

 何の責任も取りません。

■著作権

 moyashiにあります。
 放棄しません。

 http://moyashi.air-nifty.com/hitori/

■再配布

 相応な理由が無い限り、しちゃいけません。

|

2005.08.19

[REALbasic]続・SafariをREALbasicからAppleEventで操る

なんでか、以下のAppleEventの返り値はUTF16になっていて、これをhttpSocketクラスのGetメソッドに直接渡すとハングしてしまう。

ReplyStringで返ってきたものをTextConverterでUTF8に直してからGetに渡すとうまくいく。
くそー、足かせ一つ追加。ASCII文字列もエンコーディング関係あるんだっけ?

■Safariから最前面のウインドウで表示中のページのURLを取ってくる

Dim ae As AppleEvent
Dim obj As AppleEventObjectSpecifier
Dim c As TextConverter

obj=GetIndexedObjectDescriptor("docu", Nil , WinNum)
ae = NewAppleEvent("core","getd","sfri")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(obj, "pURL")

If ae.send() Then
c = GetTextConverter(Encodings.UTF16, Encodings.UTF8)
Return c.convert(ae.replyString)
End If

------------------------------

よーし、大物きたー。

■Safariのテキストエンコーディングのメニュー選択

Dim ae As AppleEvent
Dim objT, objU, objV, objW, objX, objY, objZ as AppleEventObjectSpecifier
Dim c As TextConverter
c = GetTextConverter(GuessJapaneseEncoding("テスト"), Encodings.MacJapanese)

//SafariをActivate
ae = NewAppleEvent("misc","actv","sfri")
if ae.send() then
end if

//メニューを選ぶ
ae = NewAppleEvent("prcs", "clic", "sevs")
objZ = GetNamedObjectDescriptor("pcap", Nil, "Safari")
objY = GetIndexedObjectDescriptor("mbar", objZ, 1)
objX = GetNamedObjectDescriptor("mbri", objY, c.convert("表示"))
objW = GetNamedObjectDescriptor("menE", objX, c.convert("表示"))
objV = GetNamedObjectDescriptor("menI", objW, c.convert("テキストエンコーディング"))
objU = GetNamedObjectDescriptor("menE", objV, c.convert("テキストエンコーディング"))
objT = GetNamedObjectDescriptor("menI", objU, c.convert("日本語(ISO 2022-JP)"))
ae.ObjectSpecifierParam("----") = objT

If ae.send() then
end if

GetIndexedObjectDescriptorで表現する場合は、ObjectDescriptorの部分が次のようになる。

objZ = GetNamedObjectDescriptor("pcap", Nil, "Safari")
objY = GetIndexedObjectDescriptor("mbar", objZ, 1)
objX = GetIndexedObjectDescriptor("mbri", objY, 5)
objW = GetIndexedObjectDescriptor("menE", objX, 1)
objV = GetIndexedObjectDescriptor("menI", objW, 14)
objU = GetIndexedObjectDescriptor("menE", objV, 1)
objT = GetIndexedObjectDescriptor("menI", objU, 5)

AppleEventに固執するのはよくないけど、あのベンチ結果を目の当たりにすると粘りたくもなる。

|

2005.08.18

[REALbasic]AppleEvent VS. AppleScriptどっちが速い?

AppleEventで実装した処理と、AppleScriptをプロジェクトに埋め込んだ場合とで、どれほどパフォーマンスに差が出るのか、簡単に調べてみた。

比較した処理は、Safariから表示ページのsourceを取ってきて、EditFieldに表示するというもの。

■AppleScript陣営

dim s1 as double
dim s2 as double

s1 = microseconds
EditFIeld1.Text = getsource
s2 = microseconds
editfield3.seltext = "AppleScript:" + chr(9) + str(s2 - s1) + chr(10)

※getsource.scrptの内容

on run {}
tell application "Safari"
tell document 1 to source
end tell
end run

■AppleEvent陣営

Dim ae as AppleEvent
Dim obj as AppleEventObjectSpecifier

Dim s1 as Double
Dim s2 as Double

s1 = microseconds

obj=GetIndexedObjectDescriptor("docu", nil , 1)
ae = NewAppleEvent("core","getd","sfri")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(obj, "conT")

If ae.send() then
s = ae.replyString
EditFIeld1.Text = s
end if

s2 = microseconds
editfield3.seltext = "AppleEvent: " + chr(9) + str(s2 - s1) + chr(10)

----------------------------------
結果発表(数字が大きい方が遅い)

Case1. ちょっと重めのページを表示させた状態

 AppleEvent: 210,350
 AppleScript: 309,295

 AppleScriptはAppleEventの1.4倍遅い

Case2. めちゃ軽いページ

 AppleEvent: 10,188
 AppleScript: 44,691

 AppleScriptはAppleEventの4.38倍遅い

(それぞれ30回の平均値)

やはりAppleEventを直接発行した方が速い。
重い処理ほど差が少なくなっている結果が出ている。
データの転送量が問題にならない処理では、もっと差が広がるだろう。

一応、試してみた。ウインドウの数を返す処理においては、AppleScriptはAppleEventの7倍遅かった。
コンディションによっては、10倍差が開くこともあった。

AppleEventで返り値のあるイベントを発行する場合、AppleEventの場合は返り値が型付きなので、例えばIntegerとして利用する場合は返り値が全部StringになってしまうAppleScript経由の取得より、キャストが必要無い分、さらにパフォーマンスの差が広がるものと思われる。

これに加えてAppleEvent直発行の方が安定性が高いのだから、いやー、もうこりゃ使い捨てじゃない処理はみんなAppleEventで実装って感じかね。AppleScriptは好きですが。

|

[REALbasic]特定のアプリケーションプロセスの存在の有無をAppleEventで確認する in Mac OS X

AppleEventを送る際、SystemEventの送信先が居ないとハングするっぽいので、対象プロセスが居るかどうか確認する必要がある。
それっぽいメソッドが見つけられなかったので、やっぱりAppleEventで実装。トホホ。

ScriptDebuggerで以下のスクリプトを実行。

tell app "finder" to exists application process "Safari"

AppleEventのログを見ると、Finder(MACS)からは値を返しておらず、System Eventsに下請けに出しており、そこから値が返ってきていることが分かる。Mac OS Xになってからは、Finderではプロセス管理をやらなくなっているようで、AppleEventは、最初からSystem Eventsに送信する必要がある。FinderにAppleEventを送っても、System Eventsへの引き継ぎはやってくれずnullとか0とかしか返してこない。

ScriptDebuggerのログでは、AppleEventの送信対象を記録してくれないので、ちとハマった。System Eventsのクリエータタイプってどうやって調べんのよ(笑)。

"/System/Library/CoreServices/System Events.app"に実体があることが分かったので、
"System Events.app/Resources/SystemEvents.scriptSuite"に、AppleEventCodeの記載があることを確認。めでたく"sevs"にAppleEventを送ればいいことが分かった。Cocoaでscriptableなアプリはこの手で調べられるみたい。Carbonアプリは、旧来の手法が使えるはず。

Dim ae as AppleEvent
Dim obj As AppleEventObjectSpecifier
ae = NewAppleEvent("core","doex","sevs")
obj = GetNamedObjectDescriptor("pcap", nil, "Safari") //プロセス名で探す
obj = GetPropertyObjectDescriptor(obj, "pvis") //Visible = Trueのみに
ae.ObjectSpecifierParam("----") = obj

If ae.Send() Then

If ae.ReplyBoolean = True Then
editfield1.text = "起動中"
Else
editfield1.text = "起動してない"
End If
End If

ちなみに、リファレンスのGetOrdinalObjectDescriptorに載っているサンプルコードも、Mac OS Xではもはやobsoleteで動かないはず。以下に書き換えればOK。

Dim a as AppleEvent
Dim i, count as Integer
a = NewAppleEvent("core", "cnte", "sevs")
a.MacTypeParam("doex") = "prcs"
a.ObjectSpecifierParam("----") = GetOrdinalObjectDescriptor("prcs", nil, "all ")
If a.Send then
count = Val(a.ReplyString)
End if
editfield1.text = str(count)

|

[REALbasic]Mac OS Xでは、GlobalFloatingWindowのFloaterProcessが有効にならない問題

Safariがfrontmostのときだけウインドウを表示しようと思って、WindowをGlobalFloatingWindowに設定し、WindowクラスのFloaterProcessを指定したところ(下記をOpenなどのイベントに書いておけばいいはず)、これが有効にならない。

Window1.FloaterProcess = "sfri"

何か自分が変なことをしているのかもと調べたところ、以前から解決されていないREALbasicのバグだと知る。

http://support.realsoftware.com/listarchives/realbasic-nug/2004-09/msg00226.html←ここで話題が出ている。

しょうがないので、Timerでpollingすることに。またAppleEventか。

■Safariがfrontmost(最前面のウインドウ)かどうか問い合わせる

Dim ae as AppleEvent
Dim obj As AppleEventObjectSpecifier
ae = NewAppleEvent("core","getd","macs")
ae.ObjectSpecifierParam("----") = GetNamedObjectDescriptor("pcap", Nil, "sfri")

//SafariのfrontmostがTrueだったらWindow1を表示。そうでなければ隠す。
//むろん、ApplicationのOpenか、Window1のOpenにme.hideとかしとく。
If ae.Send() Then
If ae.ReplyBoolean = True Then
Window1.Show
Else
Window1.Hide
End If
End If

|

2005.08.17

[REALbasic]SafariをREALbasicからAppleEventで操る

Safariのやることを常時監視したい。
パフォーマンスや安定性が重要になるので、REALbasicからのコントロールは、ダイレクトにAppleEventで実装することにする。
AppleEventのログを取るのにもScriptDebuggerが活躍してくれた。
やってみた感じ、パスパスとデータを取ってきてくれて結構速い気がする。AppleScriptを埋め込んだ場合とmicrosecondsを取って比較してみようかな。

■システムのバージョンを得る(GUI Scriptingのため)

Dim ae as AppleEvent
ae=NewAppleEvent("fndr", "gstl", "sevs")
ae.StringParam("----") = "sysv"
if ae.send() then
if ae.replyInteger >= 4144 then
editfield1.text = "OS Version Check OK"
end if
end if

■UI ScriptingがEnableかどうか

Dim ae as AppleEvent
ae=NewAppleEvent("core", "getd", "sevs")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(nil, "uien")
if ae.send() then
if ae.replyBoolean then
editfield1.seltext = "UI Scripting Enable"
else
editfield1.seltext = "UI Scripting Disable"
end if
end if

■SafariをActivateする(GUI Scriptingのため)

Dim ae as AppleEvent
//SafariをActivate
ae = NewAppleEvent("misc","actv","sfri")
if ae.send() then
end if

■ウインドウの数を取ってくる

Dim ae as AppleEvent

ae = NewAppleEvent("core","cnte","sfri")
ae.macTypeParam("kocl")="docu"

If ae.send() then
EditFIeld1.Text = str(ae.replyInteger)
end if

■前面のドキュメント中のURLを取ってくる(8.19訂正)

Dim ae As AppleEvent
Dim obj As AppleEventObjectSpecifier
Dim c As TextConverter

obj=GetIndexedObjectDescriptor("docu", Nil , WinNum)
ae = NewAppleEvent("core","getd","sfri")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(obj, "pURL")

If ae.send() Then
c = GetTextConverter(Encodings.UTF16, Encodings.UTF8)
Return c.convert(ae.replyString)
End If

■前面のドキュメント中のhtmlを取ってくる

Dim ae as AppleEvent
Dim obj as AppleEventObjectSpecifier

obj=GetIndexedObjectDescriptor("docu", nil , 1)

ae = NewAppleEvent("core","getd","sfri")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(obj, "conT")

If ae.send() then
EditFIeld1.Text = ae.replyString
end if

■前面のドキュメント中のウインドウ名(title)を取ってくる

Dim ae as AppleEvent
Dim objA as AppleEventObjectSpecifier

objA=GetIndexedObjectDescriptor("docu", nil , 1)

ae = NewAppleEvent("core","getd","sfri")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(objA, "pnam")

If ae.send() then
EditFIeld1.Text = ae.replyString
end if

■開いているすべてのウインドウ名(title)を取ってくる

Dim ae as AppleEvent
Dim i As Integer
Dim objA as AppleEventObjectSpecifier

objA = GetOrdinalObjectDescriptor("docu",NIL,"all ")

ae = NewAppleEvent("core","getd","sfri")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(objA, "pnam")

If ae.send() then
ListBox1.DeleteAllRows
for i = 1 to ae.replyDescList.count
ListBox1.addrow ae.replydescList.stringItem(i)
next
end if

|

Mac OS X用AppleScript/Perlの開発環境「Script Debugger3.0」「Affrus1.0」

 Late Night Software Ltd.の「Script Debugger 3.0」と「Affrus 1.0」を買った。バンドルキャンペーンをやっていたからだ。二つで$239。これを高いと見るか安いと見るか。

lns

 いずれも、Mac OS Xにおいて貴重な開発環境。「Script Debugger 3.0」はAppleScriptの、「Affrus 1.0」はPerlの開発環境で、それぞれデバッガが付いているところに価値がある。

 その昔は「Script Debugger」に日本語版が存在したので取りざたされることも多かったようだけれども、国内での販売をやめてからは存在は忘れられがちのようだ。

 デバッガの機能である、ステップ実行、ブレークポイントの設定、変数モニタは開発環境の基本とはいえ、便利過ぎ。これ無しでのスクリプティングは、もはや考えられないほど。
 小規模なスクリプト、相手が小さいスクリプトなら標準の「スクリプトエディタ」でもいいんだけど、オブジェクト構造が複雑怪奇なAdobeアプリなんかだと、もうスクリプトエディタなんかではやってらんない。

 properties of someObject

みたいなことをして、ログを見てプロパティの項目や中身を調べるようなことは日常的にやるけれども、これが整理されて表示されるというだけでもありがたい。

 「Script Debugger 3.0」の魅力はもう一つある。というか、デバッガよりこっちに真の魅力があるといってもいいほどなんだけど、それは「Explorer」機能。これは、tell対象となるアプリケーションの、そのときのすべてのオブジェクトとプロパティを、地引き網よろしくしらみつぶしに調べてきて、階層構造にして表示してくれるもの。
 初めてスクリプティングをするアプリケーションでも、スクリプティングの方針は、これを見れば一撃。
 「Shrink your workload and expand your productivity」といううたい文句はダテではない。

 「Explorer」機能の有用性はこれにとどまらない。「Update」ボタンを押すと、この階層表示されたオブジェクト、プロパティ群を最新の状態にしてくれるのだけど、変更があったプロパティに赤く色が付く! ものすごく複雑なオブジェクトの、どこに目当てのプロパティがあるのか皆目見当が付かない場合でも、アプリケーションを操作して、その結果を 「Explorer」で見れば、変化のあったところが指し示されるのですぐ分かってしまう。

 まるでラピュタの位置を光条で知らせる飛行石のような機能だと表現してみようか。

 おっと、「Affrus」のことを忘れていた。これは、Perl版「Script Debugger」とでもいうべきもので、しかも使用感はエディタのように手軽。あまりPerlを知らないのだけど、これがあれば覚えも早いだろうし、Mac OS X環境においては貴重なPerlのデバッガ付き開発環境で、前から気になっていたので、いっしょに買ってみた。
 EclipseのepicはMac OS Xでも動くのだけれど、肝心なデバッガがWindows専用で悲しい思いをした。
 多分、Mac用のPerlのデバッガ付き開発環境としては唯一? perl -dはありますけどね……。

|

2005.08.16

Mac OS X用PSP/PocketPC向け動画エンコード補助ツールffmpegFrontEndを作ろうかな

 ガスガス見て捨てる使用スタイルに合ったPSP/PocketPC向け動画のエンコード補助ソフトウェア(Mac OS X用)を作ってみる気になった。
こういうのは、少しでも操作が面倒だと続かない。EyeTVで録画した動画ほか動画ソースを上流に、下流であるPSP/PocketPCへの動画のインストールまで一直線でないとダメだ。

ffmpegfrontend

 とはいっても実体はffmpegのフロントエンドで、携帯動画変換君みたいなのがMac OS X向けにもほしいということ。
 Windows用のソフトウェアである携帯動画変換君は操作が簡単で使いやすい。すばらしい。Mac OS X上にもぜひほしい。なぜなら、うちにあるPC/AT互換機は800MHzのPentium IIIマシンだけだから(涙)。
 基本機能のほか、PSPの動画ディレクトリからの動画削除と、フラッシュの容量を計算しながらの弾倉フォルダからの再装填、ftpサーバへの自動アップみたいなのを考えている。
 といっても、ソフトウェアの開発を始めたのは昨日今日のことなので、いろいろ調べまくり。
 とりあえず動くようになったけれど、問題は山積。公開できるのはいつになることやら?
 公開するにしても、ffmpegと関連ライブラリをいっしょに配布することにどんな問題があるのか調べなきゃいけないのだけど、それが一番やっかい。
 フロントエンドは配布するけど、ffmpegはXcode入れてmakeしてね、っていうんじゃ、普通の人はきついだろうからね。
 「Mac OS Xにいいエンコード用のツールが無い」ってよく聞く文句も、ffmpegをmakeすれば済む話なのに、それができていない人がほとんどだということの証だし、明確に「ffmpegは難しくてよく分からないのでそれ以外で」というご指定がある場合も多い。

 iBukkomiは気が向くまで放置。
 スリープからの自動起動後、EyeTVがスリープを妨げることがあるようなので、処理中のものがあるかどうか、一定時間内に始まる予約が無いかを見て、システムをスリープさせる睡眠補助機能とか、自動巡回機能、RD-X??向けのメールを飛ばす機能とかを考えていたけど、今の僕の手続き型バリバリ&アドホックなコーディングスタイルだと全体像が見えづらくてキツいので、コードをクラスやモジュールに分割できるようになってからでいいや。

|

2005.08.12

[REALbasic]REALbasicでシェルコマンドのフロントエンドを作る

REALbasicで、シェルコマンドのフロントエンドを作りたい。なおかつ、システムにデフォルトでは存在しないコマンドなので、そのシェルコマンドもバイナリの中にバンドルしたいと思って以前2ちゃんねるで聞いてみたところ、「できない」というのがその場での結論だった。

しかし、その後方法を見つけた(みんな知っているの?)ので書いておこう。そういうニッチなことを簡単に解説しているサイトも日本には無いようだし。

REALbasicは、Mac OS Xにおいて、ビルドするバイナリの形式をいろいろ選べる。
Mac OS Xのみ互換のMach-O形式を指定すると、例の拡張子が.appのパッケージの形態を取ることになる。

.appの実態はフォルダなので、中に簡単にバンドルするファイルを入れておくことができる。
ここまで分かれば、後はやることが決まったも同然だ。


dim f as folderItem
dim a as new application
dim s as new shell

//実行ファイルの参照を取得
//(MyApplication.app:Contents:MacOS:MyApplication)
f = a.executableFile

//実行ファイルがあるフォルダの参照を取得
//(MyApplication.app:Contents:MacOS)
f = getfolderItem(f.absolutePath).parent

//実行ファイルがあるフォルダのPOSIXパスを取得。
//さらにバンドルしたシェルコマンドまでのパスを末尾に結合し、
//(MyApplication.app/Contents/MacOS/unison)
//実行する。
s.execute(f.shellPath + "/unison")

//コマンドからの標準出力を取得
editField1.text = s.result

こんなコードを書いてビルド。できたアプリケーションをControl + Clickして「パッケージの内容を表示」。
Contents、MacOSとフォルダをたどって、そこに(MacOSフォルダの中に)シェルコマンドを入れておく(例ではunison)。
このShellPathというFolderItemのプロパティはマニュアルに無いんだけど、何なんだろう? AppleScriptの「POSIX path of 」みたいなのを探して、外人が使っているのを見て初めて知った。
このほか、マニュアルに記載の無いFolderItemのプロパティにPathTypeShellというのがあるけど、これは/shallow/deep/destfileという形式で与えられた引数をFolderItemとして扱うためのもののようだ。コンソールアプリを作るときに役に立つ。ちょっと話がそれた。

http://rbgazette.com/?p=238

後はこれの応用だけど、困るのはデバッグ。
ただ単にシェルコマンドをプロジェクトウインドウに放り込んでおくだけでは、Resourcesフォルダにリソースとして保存されてしまう。リソースをシェルコマンドとして実行するメソッドは無いようだ。

こうなると、ビルドの度にMyApplication.debug/Contents/MacOSフォルダの中にシェルコマンドをコピーしてやらないといけない。そのこと自体はシェルスクリプトを組むなり何なりで自動化は可能だけど、ほかに方法があるのではと思う次第。

|

2005.08.11

EyeTV 200用番組登録ユーティリティ「iBukkomi Alfa 0.0.3」

今更ですが、フリーウェアです。
複数選択して、一気に番組予約が可能なようにアップデートしました。
その他諸々。

・IME制御を組み込んで、リストのところでキー操作がいつでもできるように
・検索結果が表示されると同時に、リストにフォーカスをジャンプするように
・Ctr + G、もしくはEscで検索窓に戻れるように
・ダイアログによる告知がうざいので無くした(ウインドウ上のテキストで表現)
・複数選択に対応
・ウインドウのサイズ保存、復帰

「iBukkomi-a003.sit」をダウンロード

ibukkomia003

|

2005.08.10

EyeTV 200用番組登録ユーティリティ 「iBukkomi Alfa 0.0.2」

# Alfa 0.0.1は尺計算がアホだったので削除しました。

Mac OS X用のテレビキャプチャボックスEyeTV 200に、番組登録をするアプリを作ってみた。
Yahoo!TVから番組検索をして、それをリストアップ。カーソルを合わせて、Command + I とやると、確認無しでEyeTVに番組が登録される。

何が便利かというと、とにかく手っ取り早い。
複数選択して一括登録が……はまだできないけど、できるようにする予定。

ただ、ほぼ自分専用にものすごく適当に作ったアルファ版なので、使おうという物好きな人は覚悟よろしくね。

「iBukkomi_a002.sit」をダウンロード

ScreenShot を掲載してみた。

iBukkomi

今のところ、東京限定。局名を投げるだけではダメで、チャンネル数(1chとか3chとか)を投げないとEyeTVがよろしくしてくれない。Yahoo!TVからはチャンネル数情報は得られない。だとすると、地域別の局名とチャンネル数のテーブルをiBukkomi側で持たないといけないので、現実的でないということ。

iEPGのファイルにはチャンネル数情報は記述されていないので、本来のiEPGファイルを介した処理では、EyeTVに設定されたチャンネル数と局名との対応を確認して登録しているようだけど。

と、考えていて思いついた。EyeTVそのものにチャンネル数と局名との対応を問い合わせればよいのか。

しかし、今度はYahoo!TVのWeb上の局名表記と、iEPG記載の局名表記の食い違いが問題になる。東京に限っていえば、例えばWeb上は「NHK総合」、iEPG上は「NHK総合」となっていて、全角と半角の変換をすればいいのだけど、全国的にはどうか。各番組のiEPGファイルを取得してきて、それを元に予約情報を作ればいいけど、面倒だし、件数が多い場合速度が問題になるだろう。

ユーザーから予約が指示されたときにiEPGファイルをダウンロード?

参考URL

http://350ml.net/format/iepg.html

うーむ、時間計算はこんな簡単でいいのか。いちいちdateクラスでやってた。どんどんバカになっていってて、最近足し算すら怪しい。
http://hoop.euqset.org/archives/000002.html

|

« June 2004 | Main | September 2005 »