Archive for 7月, 2012

2012/07/27 AppleScriptの標準命令でバイナリ書き込み

AppleScriptの標準命令だけでファイルにバイナリ書き込みを行うAppleScriptです。

サードパーティのSatimage OSAXなどを一切使わず、Mac OS Xに標準で用意されている命令だけでファイル書き込みを行います。

コメント欄でdreirossさんから教えていただいたとおり、AppleScriptのRaw Codeを扱う機能を用いて変数へのバイナリデータの保持を行い、通常のwrite命令でファイル書き込みを行います。

AppleScriptのRaw Code指定機能は、アプリケーション側のAppleScript対応度が低いところを無理やりAppleEventを指定して動かしたり、アプリケーション側のAppleScript用語辞書の間違いに左右されずに目的の命令を実行したいケースに使われてきた場合が多く、いわば「奥の手」ともいえる機能。

最近は、そこまでやっかいなScriptingを行うケースもないので、すっかり忘れていましたが……こんな使い方ができたとは。

filebinary.png

本サンプルでは8ビット(0〜255)の間のデータをループでファイルに書き込んでいますが、16ビットや32ビットの値も書き込み(バイナリ変換&書き込み)できるのか試しておきたいところです。

スクリプト名:AppleScriptの標準命令でバイナリ書き込み
set aFile to choose file name with prompt “バイナリ書き込みを行うファイルを指定”

repeat with i from 0 to 255
  –Decimal Number –> Hex String –> AppleEvents Raw Code
  
set oneByteDataHex to aNumToNthDecimal(i, 16, 2, {“0″, “1″, “2″, “3″, “4″, “5″, “6″, “7″, “8″, “9″, “A”, “B”, “C”, “D”, “E”, “F”}, false) of me
  
set oneByteDataBin to run script «data rdat” & oneByteDataHex & » –ここが重要!!
  
  
–File Writing
  
write_to_file(oneByteDataBin, aFile, true) of me
  
end repeat

–10進数をn進数文字列に変換する
–origNum:変換対象の数字
–nTh: n進数のn
–stringLength: 出力指定桁(上位桁のアキはゼロパディングされる)
–zeroSuppress: 上位桁がゼロになった場合に評価を打ち切るかのフラグ、ゼロパディングを行わない(ゼロサプレスする)場合に指定
on aNumToNthDecimal(origNum, nTh, stringLength, stringSetList, zeroSuppress)
  set resString to {}
  
repeat with i from stringLength to 1 by -1
    if {origNum, zeroSuppress} = {0, true} then exit repeat
    
set resNum to (origNum mod nTh)
    
set resText to contents of item (resNum + 1) of stringSetList
    
set resString to resText & resString
    
set origNum to origNum div nTh
  end repeat
  
return (resString as string)
end aNumToNthDecimal

–ファイルの追記ルーチン「write_to_file」
–追記データ、追記対象ファイル、boolean(trueで追記)
on write_to_file(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to open for access file target_file with write permission
    
if append_data is false then set eof of the open_target_file to 0
    
write this_data to the open_target_file starting at eof
    
close access the 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

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

2012/07/25 TidBitsがMountain Lion上のAppleScriptのルール変更について解説

TidBITSが「How Mountain Lion Changes the Rules for AppleScript」と題して、OS X 10.8 Mountain Lion上でのAppleScriptの変更点について記事を掲載しています。筆者はShane Stanley。いま、AppleScript界で最もネームバリューのある御仁です。

さらにShaneは、www.macosxautomation.com上でも記事を補足する解説を行っています

OS X 10.8では、Scriptもアプリケーションも記録方式が変更になり、AppleScriptのコードが中間コード変換前の状態で格納されているとのこと(気づかなかった!)。

よって、アプリケーションから元のAppleScriptのコードを取り出すこともできるようになったわけで……そのコード取り出しアプリケーション「Read My Scripts.app」について紹介しています。

# 追記 これを実機で何度も確認したのですが、コンパイル済みアプリからソースを抜き出せるといった話ではないようです。いいかげん、Appleからリリースノートが出ないと、正確なところがよく分からなくて困ります

例によって例のごとく、AppleScriptのリリースノートはOSのリリース直後には掲載されず、数日後に(Apple.comのサイト上ではなく)www.macosxautomation.com上にしれっと掲載される見込みです。

2012/07/25 Photoshopでパスごとに各パス名称でJPEG画像書き出し

大きめの画像から、いくつもの小さな画像を切り出すような場合に、画像の上に名前付きのパスを切っておくとパスを認識して個別のJPEG画像に書き出し、パス名をファイル名として付けるAppleScriptです。

ps10.png

Photoshopで1枚ものの画像から、手でいくつもの画像に切り出すような場合に……作業に慣れている人であれば、手際よくコピー&ペーストで画像を作成するのでしょうけれども、その手の作業に不慣れな人間にとってはひたすら苦痛でしかありません。

そこで、あらかじめ切り取る範囲をパスで囲っておき、パスに付けたパス名でJPEG書き出しするようにAppleScriptを作ってみました。

切り出し箇所をパスで囲うときには、ざっくり(ギリギリのところまで寄せるとか、キレイな四角形にするとかしなくても)適当に囲んでおけば、AppleScript側で適当に処理してくれるようにしてみました。

ps11.png

▲わりとざっくり、4点のみ指定してパス作成

ps12.png

▲パスごとに書き出し時のファイル名を指定(複数レイヤー化の必要なし)ここで、いずれかのパスを選択したままの状態で実行しないこと

ps13.png

▲パスごとに指定ファイル名で書き出されたところ(Finder上の表示)

……本当は、何らかのツールを併用して(OpenCVとか?)自動で図形の認識を行ってPhotoshopで切り出せるとよいのですが、そちらの方は明るくないので、いろいろ調べてみる必要がありそうです。すでに21世紀に突入して10年以上経ったわけですし、そこんとこもうちょっと賢く画像処理できたほうがよいでしょう。

本Scriptは、さすがにパスを作成する必要があるので、パス付加のためのインタフェースを持たないPhotoshop Elementsでは「パス付きのデータ」を作成すること自体が無理ですが、すでにパスが設定されているデータであれば、Photoshop Elementsで切り抜き処理はできるはずです。

スクリプト名:パスごとに各パス名称でJPEG書き出し
set outFol to choose folder with prompt “画像書き出し先のフォルダを選択”
set outFolstr to outFol as string

tell application “Adobe Photoshop CS3″
  activate
  
  
set myOptions to {class:JPEG save options, embed color profile:true, format options:progressive, quality:12, scans:3}
  
  
–単位を取得
  
set oldUnits to ruler units of settings
  
set ruler units of settings to pixel units
  
  
tell document 1
    set pList to every path item
  end tell
  
  
if pList = {} then return –パスが存在しない場合
  
  
repeat with i in pList
    tell document 1
      
      
set j to contents of i
      
      
–set tmpClip to make clipping path i
      
create selection j operation replaced
      
      
set outName to name of i –パス名=画像書き出し時のファイル名
      
      
set {x1, y1, x2, y2} to bounds of selection
      
      
delay 0.5
      
      
copy
      
    end tell
    
    
    
    
set xWidth to x2 - x1
    
set yHeight to y2 - y1
    
set aDoc to make new document with properties {width:xWidth, height:yHeight, initial fill:white}
    
    
delay 0.5
    
    
with timeout of 600 seconds
      tell aDoc
        paste
        
        
trim basing trim on top left pixel with top trim, left trim, bottom trim and right trim
        
        
set outFullPathStr to outFolstr & outName & “.jpg”
        
save aDoc in file outFullPathStr as JPEG with options myOptions with copying
        
close saving no
        
        
      end tell
    end timeout
    
  end repeat
  
  
  
  
  
–単位を元にもどす
  
set ruler units of settings to oldUnits
  
end tell

pList

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

2012/07/23 Numbersで指定範囲を高速に埋める

Numbersで指定範囲を高速に埋めるAppleScriptです。

指定範囲を「同じ値」で埋める方法であれば、このように書けば実行できることは分かっていました。

スクリプト名:Numbersで指定範囲を高速に同じ値で埋める
tell application “Numbers”
  tell document 1
    tell sheet 1
      tell table 1
        tell every cell of range “A1:A1000″
          set value to “aaa”
        end tell
      end tell
    end tell
  end tell
end tell

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

しかし、一般的に「同じ値で埋める」のではあまり有用性はありません。指定のリストなどで埋めるのがベストです。

そうはいっても、NumbersのAppleScript用語辞書にそのような便利な命令は存在していません。どこまで行っても、使えない命令がリストアップされています。

そこで発想の切り替えを。Numbersの標準命令で指定範囲を選択させておき、クリップボードにデータを入れて、GUI Scriptingでペーストしてみました。

これなら、実用的なスピードで処理できそうです。以下のScriptを実行するのに、MacBook Pro 2010 Core i7 2.66GHzで2秒ちょっとです。

スクリプト名:Numbersで指定範囲を高速に埋める
set aList to “”
repeat with i from 1 to 1000
  set aList to aList & i & return
end repeat

set the clipboard to aList

tell application “Numbers”
  tell document 1
    tell sheet 1
      tell table 1
        set selection range to range “A1:A1000″
      end tell
    end tell
  end tell
  
  
activate
  
end tell

tell application “System Events”
  keystroke “v” using {command down}
end tell

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

2012/07/21 OmniGroup、Omni Graffle 5.4.1でAppleScript系のバグを修正

omnigraffle.png

OmniGraffleを駆使し、AppleScriptでワークフローを自動化して効率的に作業をしていたところに、バグ入りのOmniGraffle 5.4が公開され、しばらくその手の作業がストップしていました(仕事にならない)。

いいかげんしびれを切らして、Beta版でも公開されていないかとOmniGroupのWebを見に行ったところ……

OmniGraffleの5.4.1Betaが(ページの下の方に)ダウンロードできるようになっていました。同ページ上の修正点(Version 5.4.1 Release Candidate Bug Fixes)を読むと、

・Fixed a typo in the AppleScript Dictionary.
・Fixed a regression where the text:size attribute was not being respected in AppleScript.
・Fixed a regression where it was no longer possible to use AppleScript to save as various filetypes.

とあり、無事なんとかワークフローの自動化を復旧できそうです。

ちなみに、上記の修正点のうちTypoというのは、

omni2.png

のことです(左:5.4、右:5.4.1rc)。この件に関していえば、Scriptingに実害はありません。

v5.4.1は、おそらくOS X 10.8 Mountain Lionのリリースと同時に公開されるものと思われます。

2012/07/21 Photoshop Elementsでオープン中のEPSのクリッピングパスを検出して選択範囲を作成してコピー v2

「Photoshopでオープン中のEPSのクリッピングパスを検出して選択範囲を作成してコピー v2」をPhotoshop Elementsで動くかどうか、ほんの一部(アプリ名)だけを書き換えて動作確認したものです。

……動きますね(汗) 動かないとばかり思って試したのですが…………。

Photoshop Elementsにクリッピングパスどころか、パスの機能も付いていないんですけれど、

pele2.png
▲Photoshop Elementsの「ウィンドウ」メニューに「パス」は存在していない

AppleScriptからクリッピングパスに添った選択範囲を作らせてコピー&ペーストで新規画像にそのままペーストすると、Photoshopと同じ動作をします。

ただ、PhotoshopとPhotoshop Elementsの差別化のためか、Photoshop ElementsにCMYKの色モードが存在していないので、CMYKモードのEPSを開かせようとすると、

pele1.png

と、ダイアログで警告されます。CMYK→RGB変換ができるということは、実はCMYKのプロファイルとか変換機能などはElements内に入っているということで、カラー値のRGBとCMYKの相互変換までAppleScriptから呼び出せるわけです(同ScriptはElements上での動作確認ずみ)。

考えようによっては、(例によって)安価なMac mini上でPhotoshop Elementsを動かしておいて、自動で画像のクリッピングパス沿いの切り抜きやらリサイズを黙々と行わせておく、といった運用はかなり実用的だといえそうです。

おおきなおともだちのみなさまには、Photoshop Elementsが「ガワだけ取り換えたフルセットのPhotoshop」であることは明々白々。今後も、ぜひこの路線を堅持していただきたいものです。

OS X 10.8の環境用にAdobe Photoshop Elements 10 Editorを買ってもいいかな、と思わせるものがあります(確認していませんが、Scriptableだと信じています。AppStoreに「Scriptableだ」と書いておいてもらえるとよいのですが……)。

スクリプト名:Photoshop Elementsでオープン中のEPSのクリッピングパスを検出して選択範囲を作成してコピー v2
detectClippingPath() of me

on detectClippingPath()
  –クリッピングパス指定済みのEPSをPhotoshopでオープンした状態で呼び出すこと
  
tell application id “com.adobe.PhotoshopElements” –Photoshop Elements
    
    
activate –必須。Photoshopの仕様による
    
    
set myOptions to {class:JPEG save options, embed color profile:true, format options:progressive, quality:12, scans:3}
    
    
–単位を取得
    
set oldUnits to ruler units of settings
    
set ruler units of settings to pixel units
    
    
    
tell document 1
      set pList to every path item
      
if pList = {} then return –パスが存在しない場合
      
      
set targPath to “”
      
repeat with i in pList
        set j to contents of i
        
set aKind to kind of j
        
if aKind = clipping then
          set targPath to j
          
exit repeat
        end if
      end repeat
      
      
if targPath = “” then return –clipping pathが存在しない場合(pathはあるらしい)
      
      
create selection j operation replaced –ここが最重要。クリッピングパスから選択範囲を作成する
      
      
set {x1, y1, x2, y2} to bounds of selection
      
set xWidth to x2 - x1
      
set yHeight to y2 - y1
      
set aRatio to yHeight / xWidth
      
      
      
copy
      
      
close saving no
      
    end tell
    
    
–新規ドキュメント(背景色=白)を作ってそこにペースト
    
if aRatio > 0.6 then –縦横比が縦長から4:3までの処理
      set aDoc to make new document with properties {width:xWidth, height:yHeight, initial fill:white}
    else
      –ものすごく横長の画像への対処
      
set newHeight to (xWidth / 3) * 2.5
      
set aDoc to make new document with properties {width:xWidth, height:newHeight, initial fill:white}
    end if
    
    
–ペースト動作。画像が巨大な場合に時間がかかるケースがある
    
with timeout of 600 seconds
      tell aDoc
        paste
      end tell
    end timeout
    
    
    
–単位を元にもどす
    
set ruler units of settings to oldUnits
    
  end tell
  
end detectClippingPath

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

2012/07/21 取得された縦横比を度数分布にプロット

取得された画像の縦横比のデータ(aList of spd)を度数分布でプロット(テキストで展開)するAppleScriptです。

画像の縦横比の計算値を求めておいて(0.0〜2.0の範囲)、0.1刻みでプロットしてみました。画像の縦横比の分布状況から画像処理の傾向を把握しようとして作成したものです。

とくに、この数値データが「画像の縦横比」である必要性も、データの範囲が0.0〜2.0に限定されている必然性もないので、自由に手直しして再利用してみてください。

dosuu.png

スクリプト名:取得された縦横比を度数分布にプロット
script spd
  property aList : {}
  
property bList : {}
end script

set bList of spd to {{0.0, 0}, {0.1, 0}, {0.2, 0}, {0.3, 0}, {0.4, 0}, {0.5, 0}, {0.6, 0}, {0.7, 0}, {0.8, 0}, {0.9, 0}, {1.0, 0}, {1.1, 0}, {1.2, 0}, {1.3, 0}, {1.4, 0}, {1.5, 0}, {1.6, 0}, {1.7, 0}, {1.8, 0}, {1.9, 0}, {2.0, 0}}

set aList of spd to {0.549718574109, 0.630523177013, 0.479835390947, 0.565149136578, 0.761083743842, 0.771822980106, 1.010796221323, 0.97065462754, 1.1223977028, 0.689932885906, 0.684151785714, 0.97065462754, 1.071137026239, 0.754406580494, 0.833692142088, 1.002254791432, 0.75581996896, 0.782258064516, 1.30492898914, 2.036295369212, 0.577416819492, 0.97065462754, 1.1223977028, 1.141904184354, 1.146311970979, 1.206075533662, 1.319401122895, 1.303258145363, 1.369506726457, 0.848938826467, 0.798200514139, 0.657777777778, 0.65, 1.123910939013, 0.937394247039, 1.071137026239, 2.040050062578, 0.577405857741, 0.890530557421, 1.319401122895, 0.839593460009, 0.865294667914, 1.071137026239, 0.771822980106, 1.124153498871, 1.147432024169, 0.907993966817, 0.833592534992, 0.995382031906, 0.848484848485, 0.808135072909, 1.319401122895, 0.710172744722, 0.491280817799, 0.755027422303, 2.040050062578, 0.771019677996, 1.124153498871, 0.886289190454, 0.725793650794, 0.833592534992, 0.907993966817, 0.792689891491, 0.764007910349, 0.658678756477, 1.319401122895, 0.549718574109, 0.918806384455, 1.303258145363, 0.630523177013, 0.577416819492, 2.036295369212, 0.765111346766, 0.794050343249, 0.764982373678, 1.60593654043, 0.780769230769, 0.751031636864, 0.784375, 0.618957088539, 1.305613305613, 0.579112681586, 0.641711229947, 0.791540785498, 0.925925925926, 0.960244648318, 0.615069195284, 1.136666666667, 0.852472089314, 0.567715458276, 0.583293894936, 0.572783871924, 0.773913043478, 0.550251256281, 0.647058823529, 0.733680746023, 1.358024691358, 1.104864864865, 0.70349519118, 0.857425742574, 1.418439716312, 0.748936170213, 1.011804384486, 0.479835390947, 1.30492898914, 1.369506726457, 1.437322515213, 1.113070539419, 1.466895958727, 1.498069498069, 1.466895958727, 1.60593654043, 0.477759009009, 0.848484848485, 0.808135072909, 0.732656978338, 1.098089171975, 0.650984682713, 0.843028624192, 0.747513389441, 0.739700374532, 0.63751317176, 0.72667638484, 1.756218905473, 0.556640123298, 0.651480637813, 0.667984189723, 0.794050343249, 0.771019677996, 1.321912919343, 0.733201581028, 1.946428571429, 0.667319749216, 0.952570921986, 0.764705882353, 0.251184834123, 0.946322067594, 1.505580357143, 1.965403624382, 0.78765060241, 0.566946778711, 0.880062917814, 1.04476093591, 0.777660695469, 1.218421052632, 0.994891443167, 0.985854858549, 0.697641509434, 0.686094538779, 0.712143928036, 0.867938931298, 0.84537037037, 0.680807389668, 0.704974271012, 0.334767305436, 0.936305732484, 1.023897058824, 0.878288182175, 0.764982373678, 1.083545377439, 0.833073322933, 0.906344410876, 1.305613305613, 1.125319693095, 0.733680746023, 1.09954058193, 1.319401122895, 0.84537037037, 1.409239384041, 1.303258145363, 0.754360465116, 0.91985428051, 1.27972027972, 1.124153498871, 1.688137412775, 1.553921568627, 1.522625559423, 1.656852791878, 0.842245989305, 1.30492898914, 0.710172744722, 0.491280817799}

repeat with i in aList of spd
  set j to contents of i
  
set j to ((j * 10) as integer) + 1
  
  
set aData to contents of (item 2 of item j of bList of spd)
  
set aData to aData + 1
  
set (item 2 of item j of bList of spd) to aData
  
end repeat

set textS to “”

repeat with i in bList of spd
  set anHour to (item 1 of i)
  
set anHour to retZeroPaddingText(anHour, 3) of me
  
set timesDat to makeRepeatChar(“*”, item 2 of i) of me
  
set textS to textS & anHour & ” : “ & timesDat & return
end repeat
textS

on makeRepeatChar(aChar, timesNum)
  set aText to “”
  
repeat timesNum times
    set aText to aText & aChar
  end repeat
  
return aText
end makeRepeatChar

–数値にゼロパディングしたテキストを返す
on retZeroPaddingText(aNum, aLen)
  set tText to (“0000000000″ & aNum as text)
  
set tCount to length of tText
  
set resText to text (tCount - aLen + 1) thru tCount of tText
  
return resText
end retZeroPaddingText

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

2012/07/21 Photoshopでオープン中のEPSのクリッピングパスを検出して選択範囲を作成してコピー v2

クリッピングパスを設定したEPSに対して、Photoshop CS3でクリッピングパスに添って選択範囲を作成して新規画像にペーストするAppleScriptです。

処理対象はEPSでもPhotoshop形式データでもOKですが、あらかじめ対象をPhotoshopでオープンした状態で実行してください。また、処理対象以外の画像はオープンしておかないでください。

ここでは、Photoshop CS3をコントロールしていますが、CS4以降でも動くものと思われます(未確認)。Mac OS X 10.7や10.8での検証もしていませんが、たぶん大丈夫です。

後半で画像の縦横比にしたがって条件分岐していますが、これはフィニッシュサイズを横160pixel x 縦120pixelとしていたためで、このFinish Sizeに合わせて試行錯誤した結果です。ただ……結果からいえば条件分岐しなくてもよさそうな感じです。

ps1.png
▲クリッピングパスを設定した画像をオープンしておいて実行

ps2.png
▲クリッピングパス

ps3.png
▲画面(GUI)から操作した場合にはこのような操作になります(1/2)

ps4.png
▲画面(GUI)から操作した場合にはこのような操作になります(2/2)

スクリプト名:Photoshopでオープン中のEPSのクリッピングパスを検出して選択範囲を作成してコピー v2
detectClippingPath() of me

on detectClippingPath()
  –クリッピングパス指定済みのEPSをPhotoshopでオープンした状態で呼び出すこと
  
tell application “Adobe Photoshop CS3″
    
    
activate –必須。Photoshopの仕様による
    
    
set myOptions to {class:JPEG save options, embed color profile:true, format options:progressive, quality:12, scans:3}
    
    
–単位を取得
    
set oldUnits to ruler units of settings
    
set ruler units of settings to pixel units
    
    
    
tell document 1
      set pList to every path item
      
if pList = {} then return –パスが存在しない場合
      
      
set targPath to “”
      
repeat with i in pList
        set j to contents of i
        
set aKind to kind of j
        
if aKind = clipping then
          set targPath to j
          
exit repeat
        end if
      end repeat
      
      
if targPath = “” then return –clipping pathが存在しない場合(pathはあるらしい)
      
      
create selection j operation replaced –ここが最重要。クリッピングパスから選択範囲を作成する
      
      
set {x1, y1, x2, y2} to bounds of selection
      
set xWidth to x2 - x1
      
set yHeight to y2 - y1
      
set aRatio to yHeight / xWidth
      
      
      
copy
      
      
close saving no
      
    end tell
    
    
–新規ドキュメント(背景色=白)を作ってそこにペースト
    
if aRatio > 0.6 then –縦横比が縦長から4:3までの処理
      set aDoc to make new document with properties {width:xWidth, height:yHeight, initial fill:white}
    else
      –ものすごく横長の画像への対処
      
set newHeight to (xWidth / 3) * 2.5
      
set aDoc to make new document with properties {width:xWidth, height:newHeight, initial fill:white}
    end if
    
    
–ペースト動作。画像が巨大な場合に時間がかかるケースがある
    
with timeout of 600 seconds
      tell aDoc
        paste
      end tell
    end timeout
    
    
    
–単位を元にもどす
    
set ruler units of settings to oldUnits
    
  end tell
  
end detectClippingPath

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

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/07/04 HTMLコードのRGB 16進数コードを数値リストに変換

HTMLコード中のRGB色指定の16進数文字列を{red, green, blue}の数値リストに変換して返すAppleScriptです。

スクリプト名:HTMLコードのRGB 16進数コードを数値リストに変換
set a to "8C2318" –HTMLのRGBカラー文字列
set aList to rgbHex2nunList(a) of me
–> {140, 35, 24}

–HTMLコードのRGB 16進数コードを数値リストに変換
on rgbHex2nunList(aHexStr)
  –エラーチェック
  
if length of aHexStr is not equal to 6 then return {}
  
  
set {rStr, gStr, bStr} to {text 1 thru 2 of aHexStr, text 3 thru 4 of aHexStr, text 5 thru 6 of aHexStr}
  
  
set bList to {}
  
repeat with i in {rStr, gStr, bStr}
    set j to contents of i
    
set the end of bList to aHexStrToNum(j) of me
  end repeat
  
  
return bList
  
end rgbHex2nunList

–16進数文字列を10進数数値に変換する
on aHexStrToNum(hexStr)
  set hStr to "0123456789ABCDEF"
  
  
set aNum to 0
  
set aLen to length of hexStr
  
  
repeat with i from aLen to 1 by -1
    
    
set aCon to contents of character i of hexStr
    
set aVal to (offset of aCon in hStr) - 1
    
set aNum to aNum + aVal * (16 ^ (aLen - i))
    
  end repeat
  
  
return aNum as integer
  
end aHexStrToNum

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

2012/07/04 16進数文字列を10進数数値に変換する

16進数文字列を10進数の数値にデコードするAppleScriptです。

スクリプト名:16進数文字列を10進数数値に変換する
set a to "9AC"
set b to aHexStrToNum(a) of me
b
–> 2476

–16進数文字列を10進数数値に変換する
on aHexStrToNum(hexStr)
  set hStr to "0123456789ABCDEF"
  
  
set aNum to 0
  
set aLen to length of hexStr
  
  
repeat with i from aLen to 1 by -1
    
    
set aCon to contents of character i of hexStr
    
set aVal to (offset of aCon in hStr) - 1
    
set aNum to aNum + aVal * (16 ^ (aLen - i))
    
  end repeat
  
  
return aNum as integer
  
end aHexStrToNum

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