- ベストアンサー
Applescriptでの文字表示と音楽同期アプリ作成方法
- xcodeを使用し、Applescriptを使った文字表示と音楽同期アプリの作成方法について説明します。
- プログラムはシェルスクリプト(bash)で書かれており、同期にはrsyncを使用しています。
- また、実行中のシェルスクリプトの標準出力を表示させる方法や、NSTextViewでの文字の追記方法についても説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こちらでも試してみましたが同じように読み込みで止まってしまい進みませんね。(同じくOSX10.6です) やり方が悪いのかと思ってRubyでも同じやり方を書いて実行しいましたが正常に動きました。 filename="pipe" File.delete(filename) if File.exist?(filename) system "mkfifo #{filename}" system "(for i in 1 2 3 4 5 ; do echo $i; sleep 1; done) > "+filename+" 2>&1 &" open(filename) do |fn| while s=fn.gets puts s end end puts "EOF : Exit loop" File.delete(filename) ファイルを作らない方法でも問題はありませんでした。 open("|(for i in 1 2 3 4 5 ; do echo $i; sleep 1; done)") do |fn| while s=fn.gets puts s end end puts "EOF : Exit loop" AppleScriptではこの方法はだめなのかなあ。
その他の回答 (2)
- ki073
- ベストアンサー率77% (491/634)
No.1の訂正です。 >同時に実行するもう一つのプロセスで一行ずつ(あるいは一文字ずつ)読み込んで順次表示すればできるはずです。 このプロセスはAppleScriptでやるところですね。ファイル(mkfifoで作ったもの)を開いて普通に1行ずつ読みんでその都度表示すればできます。rsyncの出力が終わればeofを返すはずですので、普通のファイルと同じ扱いで同期してくれます。
お礼
回答ありがとうございます。 名前付きpipe は初めてだったので、 見よう見まねで下記のサンプルを試しましたが、 うまくいきませんでした。 set textFile to "Macintosh HD:Users:username:temp:pipe" set ptextFile to POSIX path of textFile do shell script ("if [ -e " & ptextFile & " ] ; then /bin/rm " & ptextFile & "; fi") do shell script "/usr/bin/mkfifo " & ptextFile do shell script "(for i in 1 2 3 4 5 ; do echo $i; sleep 1; done) > " & ptextFile & " 2>&1 &" try set fn to (open for access textFile without write permission) on error display dialog "Couldn't open file" end try repeat try set txt to (read fn until ASCII character (10)) as string #before return も using delimiter returnも何故か使えず display dialog txt on error number errNum if errNum = -39 then -- End of file error display dialog "EOF : Exit loop" exit repeat else display dialog "Error : Couldn't read file" end if end try end repeat close access fn display dialog "Closed file" do shell script ("if [ -e " & ptextFile & " ] ; then /bin/rm " & ptextFile & "; fi") シェルコマンド(for i in ....)をバックグランドで走らせているのですが、 ここから先には進みません。 ターミナルを別途開き「cat pipe」 を実行する事で、 スタックしていた applescript は一応動き出しますが、 それでもデータは読めませんでした。 pipe をapplescript上で使う場合、 「open access for」では無い読み込み方法があるのでしょうか?? また、insertTextについても情報ありがとうございます。 まだあまり試せていませんが、 textView's insertText_("example text") としても、うまくいきませんでしたが、 もう少し勉強してみます。
- ki073
- ベストアンサー率77% (491/634)
まず最初質問ですが、パイプを使えばできるはずです。 shellスクリプトだとnamed pipeを使うのが簡単なように思います。 まずmkfifoで名前付きのパイプを作りバックグラウンドでrsyncからそれに書き込みます。 同時に実行するもう一つのプロセスで一行ずつ(あるいは一文字ずつ)読み込んで順次表示すればできるはずです。 rubyなどだと普通のパイプで可能です。この方法がshellスクリプでできるかはわかりません。 open("|rsync ?????"){|fi| while s=fi.gets sをNSTextViewに書き出す end で1行ずつ順次書き出されます。 後の質問ですが、insertTextでできるはずです。 参考 http://homepage.mac.com/mkino2/cocoaProg/AppKit/NSTextView/NSTextView.html#structure 最近はAppleScriptではなくruby+rubycocoaを主に使っているので、少し勘違いしているところも有るかもしれませんがご参考に
お礼
わざわざ試してくださったんですね。 ありがとうございます。 やはりダメみたいですね。 cocoa-Application(Objective c)の方でも 名前付きpipeやpopenはコマンドが終わってからの出力でしたが、 今回の目的の為のクラスが用意されており、こちらではうまくいきました。 ちょっと古いですが一応、http://developer.apple.com/library/mac/#samplecode/Moriarity/Introduction/Intro.html NSTextView::insertTextの方は、Applescript内での記述方法が分かりませんでしたが、 こちらも、Objective cの方ではうまくいきました。 いろいろと楽しく勉強させてもらいました。 ありがとうございました。