Archive for the 'Satimage' Category

2012/07/06 Satimage OSAXでテキストを指定エンコーディングでファイルに書き込み

テキストを指定エンコーディングでファイルに書き込むAppleScriptです。

どうしても、UTF-16BE(Big Endian)でファイル書き込みをしなくてはならず、(作っているのが)どうせwrite binary命令のためにSatimage OSAXの使用を解禁しているAppleScriptだったため、テキストの書き込み命令もSatimage OSAXに入っているものを使えばいいや、どうせ入っているだろうし……と、考えました。

writestring.png

……やはり、当然のようにwritetext命令があり、「UTF-16」でファイルに書けることはAppleScript用語辞書に記載されているのですが、UTF-16BEについては明記されていません。

ただ、AppleScript用語辞書内の書き方が「デフォルトはUTF-8だけどだいたいIANAで決められている文字セット名なら通るよ〜ん」という感じだったので、「UTF-16BE」をおもむろに指定してみたところ、問題なくUTF-16BEで書き込めました。

stringout1.png

stringout2.png

ああ、本当にSatimage SoftwareをAppleが買収したらいいのに!! 

ただ、あまりに便利なSatimage OSAXに慣れてしまうと、自分で作ったAppleScriptを広く配布しようとしたときに問題が発生するので、同様の処理をAppleScriptObjCで記述できるようにしておくことが重要になってくるのでしょう。

スクリプト名:Satimage OSAXでテキストを指定エンコーディングでファイルに書き込み
–Caution !! This AppleScript require “Satimage OSAX” from Satimage Software
–http://www.satimage.fr/software/en/downloads/downloads_companion_osaxen.html

set a to choose file name

set aText to “ABCDEFG”
set bText to “あいうえお”

writetext aText to a encoding “UTF-16BE” with append
writetext bText to a encoding “UTF-16BE” with append

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/06/30 Satimage OSAXを使ってバイナリ書き込みを行う

Satimage OSAXを使ってAppleScriptの命令を拡張し、Satimage OSAXのファイルへのバイナリ書き込み命令を使ってバイナリ書き込みを行うAppleScriptです。

AppleScriptはOSAXと呼ばれるプラグインをインストールすることにより、命令を拡張することができるようになっています。高速なソートや関数演算機能などよりどりみどりの機能がサードパーティのOSAXにより提供されています(多くの場合、フリー配布)。

Satimage OSAXは、世界でもトップクラスの豊富で高レベルの命令を備えるOSAXであり、これをインストールしただけでまるっきり別世界。三角関数だの高速なソートだの、高度な機能が山のように入っています。

OSAXを多用すると、たしかに楽で便利にはなるのですが……自分で作ったものを広く配布するような場合に問題があります(使用はフリーであっても、必ずしも再配布を無制限かつフリーで行えるわけではないので)。

また、Mac OS Xも数年に一度、大規模な環境の変化がありました。Classic Mac OSからの移行、Carbonからの脱却、PowerPCからIntelへの移行、32ビットから64ビットへの移行、新たなセキュリティ機構への対処などなど……簡単に思いつくだけでも(OSのメジャーアップデートに対応するのも大変なのに)、さまざまな試練が発生。

これらの試練を乗り切ったOSAXだけがいまも継続して提供されていますが、乗り切れないものもあったわけです。Mac OS X時代に入ってOSAXへの依存度を(個人的に)減らした理由がここにあります(AppleScript StudioによるGUIベースのアプリ開発、配布をにらんでのことでもあります)。

そのため、いつもギリギリまでOSAXを使わずに標準機能だけでプログラムを書いていますが、バイナリの読み書きなどAppleScriptの標準命令だけではなんともできない用途には、あっさりあきらめてOSAXを用いたほうが得策です。

AppleScript標準の「write」命令を使って0〜255までのバイナリデータをファイル書き込みを行おうとすると、127以上のデータが置き換えられてしまいます(92=0×5Cも変わってしまっています。Thanks!! > dreirossさん)。

スクリプト名:指定ファイルにバイナリで1バイト書き込む
–未遂(これはダメなサンプルです)

set aFileName to choose file name

repeat with i from 0 to 255
  write_to_file_1byte(i, aFileName, true) of me
end repeat

–指定ファイルにバイナリで1バイト書き込む
–追記データ、追記対象ファイル、boolean(trueで追記)
on write_to_file_1byte(oneByteData, target_file, append_data)
  
  
set aClass to (class of oneByteData) as string
  
if aClass is not in {“integer”, “number”, “real”} then return false
  
  
set oneByteDataBin to string id oneByteData
  
  
try
    set target_file to the target_file as text
    
set open_target_file to open for access file target_file with write permission
    
    
if append_data is false then set eof of open_target_file to 0
    
    
write oneByteDataBin as string to open_target_file starting at eof for 1
    
–write oneByteData to open_target_file starting at eof for 1
    
    
close access open_target_file
    
return true
  on error error_message
    try
      close access file target_file
    end try
    
return error_message
  end try
end write_to_file_1byte

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

dump1.png
▲標準命令の「write」で127以上の数値を書き込もうとするとダメ

この問題を解決できるのが、Satimage OSAXの「write binary」命令です。

satimageosax.png

AppleScriptエディタを終了させてSatimage OSAXをインストールすると、すぐにSatimage OSAXの命令が使えるようになります(再起動不要)。一度インストールすれば、何度もインストールする必要はありません(バージョンアップは、新バージョンのOSAXのインストーラの実行によって行います。つまり、自動でアップデートチェックはしてくれません)。

スクリプト名:Satimage OSAXを使ってバイナリ書き込みを行う Sub
set aFile to choose file name with prompt “バイナリファイル書き込みを行うファイルを指定”

repeat with i from 0 to 255
  writeBnary(aFile, i) of me
end repeat

–Caution !! This AppleScript require “Satimage OSAX” from Satimage Software
– http://www.satimage.fr/software/en/downloads/downloads_companion_osaxen.html
on writeBnary(aFile, aData)
  set ref_num to open for access aFile with write permission
  
write binary ref_num with data aData as byte
  
close access ref_num
end writeBnary

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

dump2.png

▲Satimage OSAXを用いて、正しく0〜255までの数値をバイナリ書き込みできた