Archive for 2月, 2012

2012/02/29 Excel 2011で現在表示中のウィンドウのすべてのタブのズーム倍率を変更する

Excel 2011で現在表示中のウィンドウのすべてのシートのズーム倍率を変更するAppleScriptです。

Windowsユーザーの方からExcelの書類をメールでいただいたりすると……表示倍率が75%だったり50%だったりで、そのままMacBook Pro 17インチの1920×1200ドットの本体画面で表示すると、小さすぎて……見えません。

下手にタブ(シート)が大量に存在していたりすると、表示倍率を変更するのがうっとおしいことこの上ありません。そこで、すべてのシートを順次表示させて表示倍率を変更するAppleScriptを書いてみました。

Excelのファイルオープンの動作すべてをトラップして、ファイルオープン後に必ずこの処理を加えたくなるほどです。PFiddleSoft(旧称:PreFab Software)の「UI Actions」を併用して、メニュー項目にフォルダアクションよろしくScriptを仕掛けて、「ファイルを開く」メニュー項目の実行後に本Scriptを実行できるとよいのですが……

スクリプト名:Excel 2011で現在表示中のウィンドウのすべてのタブのズーム倍率を変更する
set zoomNum to 150 –表示倍率(10〜400)

tell application “Microsoft Excel”
  
  
tell window 1
    set curSheetNum to entry_index of active sheet –あとでこのシートの表示状態に戻す  
  end tell
  
  
tell workbook 1
    set sList to every sheet
    
repeat with i in sList
      set j to contents of i
      
      
–表示対象のWorksheet(タブ)を切り替える
      
tell j
        activate object
      end tell
      
      
–現在表示中のExcelのウィンドウの表示倍率を変更する
      
changeZoomOfCurrentExcelWindow(zoomNum) of me
    end repeat
  end tell
  
  
tell workbook 1
    activate object worksheet curSheetNum –初期表示状態に戻す
  end tell
  
end tell

–Excel 2011で現在表示中のウィンドウのズーム倍率を変更する
on changeZoomOfCurrentExcelWindow(aZoomPercent)
  tell application “Microsoft Excel”
    tell window 1
      set zoom to aZoomPercent
    end tell
  end tell
end changeZoomOfCurrentExcelWindow

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

2012/02/28 tellブロックの書き方いろいろ

Mac OS X 10.5以降、tellブロックの書き方が拡張され、いろいろと柔軟性を持たせたAppleScriptを書けるようになりました。日常的には、Mac OS X 10.4で動かすケースを考えると積極的には採用してこなかったところですが、以下のように書けるようになっています。

スクリプト名:tell block
–Mac OS X 10.5以降で可能なtell文の記述方法の一覧

tell application “Address Book” –通常パターン
  set mCard to my card
  
set aP to properties of mCard
end tell

tell application id “com.apple.addressbook” –Bundle ID指定パターン
  set mCard to my card
  
set aP to properties of mCard
end tell

tell application “/Applications/Address Book.app” –フルパス指定パターン
  set mCard to my card
  
set aP to properties of mCard
end tell

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

Mac OS X標準搭載のアプリケーションが、バージョンアップ時に名称変更になることは、ごくまれにあります。身近な例では、Script EditorがAppleScript Editorに変更になったりしました。

この夏にやってくるOS X 10.8では、OS標準添付アプリもiOSに合わせて微妙に名称変更してくることが予想されます。すでにきな臭いところでは、iChatがMessagesに変わることは間違いありません。

これまでに作った(膨大な)AppleScriptを書き換える必要があるかといえば、アプリケーションのBundle IDが変わっていなければ大丈夫だろうかといったところ。System Eventsでプロセス一覧を取得して特定アプリケーションの起動をプロセス名称で確認する、とかいった処理「以外」はそれほど書き換える必要はないものと見ています。

ただ、冒頭で紹介したtellブロックのうち、フルパスを指定するタイプは書き換えが必要になります。そもそもファイル名が異なるので、書き換えなくてはなりません。

AppleScript EditorをAppleScriptからコントロールして、絶対パスでアプリケーションを指定している箇所があれば、自動で書き換える……といったことも、それほど難しくはないため作っておいてもよいでしょう。

2012/02/26 AppleScriptで正規表現(regexp)を

AppleScriptの基本文法に正規表現はありません。それでも、AppleScriptネイティブの機能で文字列加工などは普通にやっているわけですが、正規表現が使えないことに不満を感じているユーザーもいるようです。

でも、AppleScriptで正規表現が「使えない」なんて誰が決めたんでしょう? 標準命令セットに存在していないだけなのに。

(A)OSAXを追加
AppleScriptでは、命令などを追加するプラグイン機構「Scripting Additions」とか「OSAX」と呼ばれる仕組みがあります。

そもそも、標準命令自体が「Standard Additions」OSAXで提供されているほど。昔から正規表現を提供するOSAXは流通しており、使いたい人はインストールして使っているという状態。

ただし、どのユーザー環境にもインストールされているわけではないので、Scriptを配布して広く使ってもらうためには敷居が高いところです(自分専用のScriptであれば、問題はないでしょう)。

有名なところでは、仏Satimage Softwareの「Satimage OSAX」があります。

(B)正規表現を使えるアプリケーションを制御
正規表現を使えるアプリケーションをコントロールすれば、正規表現の使用は可能です。テキストエディタなど、対応しているものは多々あります。

ただ、これもすべてのユーザー環境にインストールされているわけではないので、Scriptを配布して広く使ってもらうという目的には合致していません。

(C)他の言語処理系を呼び出す
他の、正規表現の機能を持つ言語処理系をdo shell script命令で呼び出せば、使えることになります

一見、ゲテモノっぽい印象がありますが、どのユーザー環境にもPerlの処理系は入っていたりするので、どのユーザー環境でも使えるというメリットがあります。サブルーチン化しておくと、再利用性も高くなることでしょう。

2012/02/25 自然言語による相対日付指定v13

2012/02/24 【ご注意】www.apple.co.jpでApple Webサイトが見えなくなった

数日前から、www.apple.co.jpでAppleの日本語サイトが見えなくなりました。これまで、www.apple.co.jpにアクセスするとwww.apple.com/jpにフォワードされていたのですが、その機構がストップしたという状態。

cojp.jpg

目下、日本語サイトはwww.apple.com/jpに移行したので、とくに問題はないそうです(アップル社内的には、ぜんぜん問題ないそうで、、、)。

そもそも、アップルの日本法人は「株式会社」から「合同会社」に移行したので、別に「co.jp」ドメインを維持しなくてもよくなった、ということもあるかもしれません(適当)。

co.jpドメインを手放したわけではないようですが、近い将来「www.apple.co.jp」のURLではWebサーバーが(まったく)応答しなくなるなどの現象が発生する可能性もあります。

AppleScriptのプログラムで、インターネット接続確認のためにapple.co.jpにpingを実行するといったものも見られるため、そのような処理を行っているものがあれば、いまのうちに書き換えておく必要があるものと思われます。

インターネット接続確認用のping先URLとしては、Web上でサービスを停められないGoogleあたりがおすすめです。

2012/02/23 Excel 2011ですべてのタブのデータを取得して1つにまとめる v3

Excel 2011で現在オープン中の書類のすべてのタブのデータを取得して新規ドキュメントで1つにまとめるAppleScriptの改良版です。

最初のバージョンでは、すべてのタブを順次表示しながらデータを集めていましたが、別にデータを集めるだけなら表示を切り替える必要はまったくないので、表示を切り替えるのをやめたのがこのバージョンです。

元のバージョンから比べると、かなり速くなっています(見てわかるほどに)。

スクリプト名:Excel 2011ですべてのタブのデータを取得して1つにまとめる v3
–アクティブなExcelワークブック(書類)中のすべてのワークシートの内容を取得して、新規作成したワークブック(書類)にまとめる

global aList, aList_r

set aList to {}
set aList_r to a reference to aList

tell application "Microsoft Excel"
  
  
–最前面のドキュメント中の各シート名を取得
  
tell active workbook
    set sList to name of every worksheet
    
set aCount to count every item of sList
  end tell
  
  
–各ワークシートの呼び出しループ
  
repeat with i from 1 to aCount
    set aList to aList_r & getCurrentSheetData(i, 100, "C", "L") of me –これ以上は存在していない筈の行数
  end repeat
  
end tell

–新規ワークシートを作成してそこに連結したデータを入れる
set dataLen to (length of aList)
tell application "Microsoft Excel"
  set newWS to make new workbook
  
tell newWS
    tell active sheet
      set tmpRangeStr to "A2:L" & ((dataLen + 1) as string)
      
set tmpRange to range tmpRangeStr
      
set value of tmpRange to aList
    end tell
  end tell
end tell

–現在表示中のワークシートから、データの入っている範囲を求めて中のデータを返す
on getCurrentSheetData(workSheetIndex, maxRowNum, checkColumnStr, endColumnStr)
  –Excelからデータを取得する
  
using terms from application "Microsoft Excel"
    tell application "Microsoft Excel"
      tell active workbook
        tell sheet workSheetIndex
          
          
set tmpRange to checkColumnStr & (maxRowNum as string)
          
set a to range tmpRange –B列にはかならずデータが入っている & 100行もデータは存在していない
          
set b to get end a direction toward the top
          
set endRow to first row index of b
          
          
set aRangeStr to "A2:" & endColumnStr & (endRow as string) –1行目には凡例が入っているためスキップ
          
set aRangeObj to range aRangeStr
          
          
set rangeDat to string value of aRangeObj
          
          
return rangeDat
          
        end tell
      end tell
    end tell
  end using terms from
end getCurrentSheetData

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

2012/02/23 Mac App Store公開アプリのSandbox対応義務化 期限が6/1に延期

Mac App Store公開アプリは必ずSandbox対応を義務化します…………期限は3月1日ですよ! という無茶な話が、6/1延期になりました(そこかしこのBlogで話題になっています)。

まさか、この極端なBlogしか見ていないという人もいないとは思いますが、補足までに。

補足:タイトルが「Sadbox」になっていたのを「Sandbox」に修正しました。

2012/02/21 Excel 2011で現在オープン中の書類の選択中のシートをCSV書き出し

Excel 2011のCSV書き出しのサンプルを探していたら、現在オープン中の書類(Workbook)中のすべてのシート(Worksheet)をCSV書き出しするAppleScriptを見つけました。

そこまでの処理は必要なかったので、逆に機能を切り捨てて、最低限の機能に絞り込んでサンプルコードとして掲載しておくことに。

スクリプト名:Excel 2011で指定書類の現在のワークシートをCSV書き出し
–オリジナル作者および引用元:
– Excel Spreadsheet to CSV Files
– by Scott Wilcox <scott@dor.ky>
– https://github.com/dordotky/applescripts
– https://github.com/dordotky/applescripts/blob/master/Excel%20Worksheets%20to%20CSV.applescript

– CSV ファイルを書き出すフォルダを選択
set outFol to (choose folder with prompt "CVSファイルの書き出し先フォルダを選択:")

tell application "Microsoft Excel"
  activate
  
  
tell active sheet
    set wName to name
    
    
– Save the worksheet as a CSV file
    
set theSheetsPath to outFol & wName & ".csv" as string
    
save as filename theSheetsPath file format CSV file format with overwrite
  end tell
  
  
close every workbook saving no –クローズ
  
end tell

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

2012/02/21 PhotoshopでRGB→CMYK、CMYK→RGB変換

PhotoshopでRGB⇄CMYKの色変換を行うAppleScriptです。

choose colorで選択した色を、Photoshopを用いてRGB⇄CMYKの色変換を行うものです。PhotoshopをAppleScriptから制御して画像フォーマットを変換させるのは「よくある使い方」ですが、Mac OS X 10.6でColorSync Scriptingが廃止されたいまとなっては、色空間の変換を行う処理エンジンとして使うケースもけっこうあります。

CMYKへの色変換を行う機能がまともにないOS向けに、RGB⇄CMYK変換のテーブルを作成するさいの処理エンジンとして使ってみたりと、割と大活躍しています。InDesignと違って、AppleScriptから連続してコントロールしてもクラッシュしにくい、というのもいいところです。

スクリプト名:PhotoshopでRGB→CMYK、CMYK→RGB変換
–色選択
set {rCol, gCol, bCol} to choose color

–16ビット値→8ビット値 変換
set rCol to rCol div 256
set gCol to gCol div 256
set bCol to bCol div 256

set aCMYK to retCMYKfromRGBnumList(rCol, gCol, bCol) of me
–> {0, 82, 82, 0} –結果は選択した色によって異なります。返ってくる値が4つの数字で構成されることを示しています

copy aCMYK to {cNum, mNum, yNum, kNum}

set bRGB to retRGBfromCMYKnumList(cNum, mNum, yNum, kNum) of me
–> {154, 192, 57}–結果は選択した色によって異なります。返ってくる値が3つの数字で構成されることを示しています

–与えられたテキストをRGBデータと評価してCMYK値を返す
on retCMYKfromRGBnumList(rNum, gNum, bNum)
  
  
tell application "Adobe Photoshop CS3"
    set myCMYKColor to convert color {class:RGB color, red:rNum, green:gNum, blue:bNum} to CMYK
    
    
set cyanNum to cyan of myCMYKColor
    
set magentaNum to magenta of myCMYKColor
    
set yellowNum to yellow of myCMYKColor
    
set kuroNum to black of myCMYKColor
  end tell
  
  
set cyanNum to round cyanNum rounding as taught in school –四捨五入
  
set magentaNum to round magentaNum rounding as taught in school –四捨五入
  
set yellowNum to round yellowNum rounding as taught in school –四捨五入
  
set kuroNum to round kuroNum rounding as taught in school –四捨五入
  
  
return {cyanNum, magentaNum, yellowNum, kuroNum}
  
end retCMYKfromRGBnumList

–与えられたCMYKデータをRGBに変換して返す
on retRGBfromCMYKnumList(cNum, mNum, yNum, kNum)
  
  
tell application "Adobe Photoshop CS3"
    set myRGBColor to convert color {class:CMYK color, cyan:cNum, magenta:mNum, yellow:yNum, black:kNum} to RGB
    
    
set redNum to red of myRGBColor
    
set greenNum to green of myRGBColor
    
set blueNum to blue of myRGBColor
  end tell
  
  
set redNum to round redNum rounding as taught in school –四捨五入
  
set greenNum to round greenNum rounding as taught in school –四捨五入
  
set blueNum to round blueNum rounding as taught in school –四捨五入
  
  
  
return {redNum, greenNum, blueNum}
  
end retRGBfromCMYKnumList

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

2012/02/19 AppleriptObjCベースのCocoaアプリケーションのSandbox化は可能か?

Sadbox化(Sandboxing)とは、アプリケーションを実行する際に、「保護された環境下でプログラムを実行し不正処理を防ぐセキュリティモデルの一種」

2011年末に「2012年3月以降、Mac AppStoreではSandbox対応したアプリケーションでないとリジェクト(却下)する」らしいよ、という噂が流れました。

Sandbox対応すると、ファイルの読み書きについて指定フォルダ以下のみに限定されたり、AppleEventによる通信も(開発時に)指定されたアプリケーションに限られるなど、アプリケーションが「できること」が制限されます。また、実行コードの同一性を保証するための「コード署名」の機構が用意され、コードの書き換えを禁止しています。

AppleScript業界的にいえば、AppleScriptのアプレットについては……プロパティを書き換えただけで実行ファイルが変更されてしまうわけで、Sandbox対応になじみません。AppleScript Studioアプリもモデルが古いのでMac AppStoreに提出しても通らないだろうというところ。

AppleScriptObjCアプリになって、はじめてMac AppStore上で流通できるアプリケーションを作成し得るだろう、という見方があったわけですが……ちょっと待て、そもそもAppleScriptObjCアプリってSandbox化できるのか? といった議論がありました。

実際、2011年末のTwitter界隈では一種パニック状態に陥っているんだか、声高に騒いでいる人が大勢(海外に)いました。この騒ぎについてはリアルタイムにキャッチしていたのですが、事実関係が把握できないと、怒っていいのか安心していいのか分りません。まずは、情報の収集と分析を行っていました。

そんな中、実際にBEN WALDIEによって検証記事が掲載され、これを1か月ほど後になって見つけました。

「Sandboxing a Cocoa-AppleScript (AppleScriptObjC) Application」 2011/10/13

結論をいえば、AppleScriptObjCアプリのSandbox化はできるということで、ひとまずは安心してよいということになります。ただ、いろいろ試行錯誤は必要なんだろうなと思われるところです。BEN WALDIEの記事にはSandbox化したAppleScriptObjCのXcodeプロジェクトのアーカイブがリンクされており、参考になると思います。

2012/02/18 AppleScriptObjC Explorer 2 v2.2

AppleScriptObjCの世界をほぼ1人で引っ張っている感のある、Shane StanleyによるAppleScriptObjCに特化したスクリプトエディタが「AppleScriptObjC Explorer 2」です。

exp1.jpg

▲構文色分けがまったくできていないXcode 4(左)と構文色分けに対応しているAppleScriptObjC Explorer(右)

exp2.jpg
▲インデントも正確なAppleScript Explorer 2

まだ使い始めて日が浅いのですが、その特徴を紹介すると……

・Xcode 4ではまったく効かない「AppleScriptの構文に応じた色分け」ができる(これはでかい! というか、Xcode 4がダメすぎ)
・Xcode 4ではまったくダメな「インデント」が正確(Xcode 4、本当にダメすぎ)
・Xcode 4では絶望的な、ログ表示機能を備える
・単体で動作可能なAppleScriptObjCベースのアプリケーションを作成可能
・Xcode 4の外部エディタとして動作可能(XcodeでScriptのファイルを選択して、コンテクストメニューから「Open With External Editor」を実行。あらかじめFinder上で拡張子とアプリケーションの関連を変更しておく必要がある)

exp3.jpg

・定番の処理(Arrayを作るとか、ソートするとか)はメニューからScript本文中にInsert可能

exp4.jpg

exp5.jpg

・Script文中で入力補完機能を利用可能(ここだけ、まだ試していない)

といったところでしょうか。AppleScriptObjCが使えるMac OS X 10.6/10.7で動作します。

構文色分けができないとプログラミング効率が悪すぎるのと、インデントが正確でないXcode 4にシビレを切らしてAppleScriptObjC Explorerを購入(5,000円……為替レートの変動で変わる??)。

ただ、デバッグ機能についてはアプリケーション起動時に呼ばれる「applicationWillFinishLaunching_」イベントハンドラの中で実行されるコードしかデバッグできなさそうなので、デバッグ機能に期待して購入すると、期待外れになってしまうかもしれません。

総合的には……残念ながら、値段の割には……と、感じる点が多々あります。

AppleのCocoaについてのヘルプからAppleScriptObjC用のヘルプとして変換して表示するとか、既存のObjective-Cのコードをプロジェクトにインポートすると、その呼び出し用のAppleScriptObjCコードがScript本文中に展開されるとか……そういう機能を期待したいところです。

いまの段階では、ちょっと気の利いた構文色分けエディタ、というレベルです。それ以上でもそれ以下でもありません(Shane Stanleyへのお布施、という意味ではとても意義があるかもしれない)。

とりあえず30日間は試用ができるため、Xcode 4にブチ切れまくっている方は試してみるとよいでしょう。

2012/02/17 OS X 10.8 Mountain Lion発表。Messages Beta

OS X 10.8「Mountain Lion」が発表になり、その特徴のうちのひとつである「Messages」のOS X 10.7用 Betaの配布が開始されました。

Messagesは、iChatとFaceTimeを一緒にしたアプリケーションで、iChatを置き換えるものになるようです。

messages.jpg

msg1.jpg

さっそく、10.7.3環境のMacBook AirにMessagesをインストール。AppleScript用語辞書を調べてみると、なぜか「iChat」の辞書としてオープンされました。

それもそのはず。アクティビティ・モニタで見る限りは「メッセージ」という名前で見えますが、psコマンドで見ると「iChat」。System Events経由でプロセス名を確認するとやはり「iChat」。Info.plistのBundle Nameが「Messages」になってはいるものの、これはやはりiChat。

msg2.jpg

msg3.jpg

OS X 10.8の登場は2012年夏とか。登場が予想よりあまりに早いので、いろんな意味で悩ましいところですが、Siriが載ってくるんだろうなとかCarbonが削られたりするんだろうなとか、いろいろ考えてしまうわけですが……目下Lionでいろいろ不満が集まっている仕様が直ることを期待したいところです。

2012/02/14 Google Chromeでpresentation modeを開始、終了

Google Chromeでpresentation mode(全画面表示モード)に移行するAppleScriptです。

chrome1.jpg

Google Chromeの新バージョン(17.x)が出ていたので、アップデートしたところAppleScript用語辞書の内容が追加されており、実際に動くかどうか試してみました。

「enter presentation mode」で全画面モードに入り、「exit presentation mode」で全画面表示を終了します。

About画面からアップデートを行おうとするとサーバーと接続できない、と表示するところは相変わらず。お間抜けさ加減も健在です。

chrome2.jpg

スクリプト名:Google Chromeでpresentation modeを開始、終了
tell application “Google Chrome”
  tell window 1
    enter presentation mode
    
–exit presentation mode
  end tell
end tell

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

2012/02/14 Excel 2011ですべてのタブのデータを取得して1つにまとめる

Excel 2011で最前面のドキュメント中のすべてのワークシートの内容を新規書類にまとめるAppleScriptです。

最前面のドキュメント(workbook)内のすべてのワークシート(worksheet)のデータ存在行範囲を(C列のデータをもとに)検出して、横方向にはA〜Lまでのデータを取り出します。

ex1.jpg

すべてのワークシート内のデータを取り出したあと、Excelで新規書類を作成して、そこにまとめたデータを入れます。

Excelで書類に大量のワークシート(タブ)を作って、快調にデータを入力していたところ、ワークシートに別れているのでデータの見通しがきかなくなって……手作業でまとめるのがいやだったので、その場でAppleScriptを組んでまとめさせるようにしてみました。

スクリプト名:Excel 2011ですべてのタブのデータを取得して1つにまとめる
–アクティブなExcelワークブック(書類)中のすべてのワークシートの内容を取得して、

global aList, aList_r

set aList to {}
set aList_r to a reference to aList

tell application "Microsoft Excel"
  
  
–現在表示中のワークシートのindex番号を取得する
  
tell window 1
    set curSheetNum to entry_index of active sheet –あとでこのシートの表示状態に戻す
  end tell
  
  
–最前面のドキュメント中の各シート名を取得
  
tell active workbook
    set sList to name of every worksheet
    
set aCount to count every item of sList
  end tell
  
  
repeat with i from 1 to aCount
    tell workbook 1
      activate object worksheet i –★★ 表示切り換え用の変な命令
    end tell
    
    
set aList to aList & getCurrentSheetData(100) of me –これ以上は存在していない筈の行数
    
  end repeat
  
  
–表示状態を元に戻す
  
tell workbook 1
    activate object worksheet curSheetNum –初期表示状態に戻す
  end tell
  
end tell

–新規ワークシートを作成してそこに連結したデータを入れる
set dataLen to (length of aList)
tell application "Microsoft Excel"
  set newWS to make new workbook
  
tell newWS
    tell active sheet
      set tmpRangeStr to "A2:L" & ((dataLen + 1) as string)
      
set tmpRange to range tmpRangeStr
      
set value of tmpRange to aList
    end tell
  end tell
end tell

aList

–現在表示中のワークシートから、データの入っている範囲を求めて中のデータを返す
on getCurrentSheetData(maxRowNum)
  –Excelからデータを取得する
  
using terms from application "Microsoft Excel"
    tell application "Microsoft Excel"
      tell active workbook
        tell active sheet
          set tmpRange to "C" & (maxRowNum as string)
          
set a to range tmpRange –B列にはかならずデータが入っている & 100行もデータは存在していない
          
set b to get end a direction toward the top
          
set endRow to first row index of b
          
          
set aRangeStr to "A2:" & "L" & (endRow as string)
          
set aRangeObj to range aRangeStr
          
          
set rangeDat to string value of aRangeObj
          
        end tell
      end tell
    end tell
  end using terms from
end getCurrentSheetData

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

2012/02/14 iPhoneアプリで指定されているサイズのアイコンをPhotoshopで機械的に作成する

iPhoneアプリ用の各種サイズ/各種ファイル名のPNG書類を作成するAppleScriptです。

iPhoneアプリの作成用には、iPhoneアプリ/iPadアプリ/iPhoneとiPadのUniversalアプリとで、数種類のサイズのアイコンを用意する必要があり、それぞれ決められたファイル名で保存する必要があって、けっこうダルい感じです。

画像のリサイズといえば、ぼかしフィルタをかけてからリサイズ、リサイズ後にシャープネスフィルタをかけるなど、いろいろやり方はありますが、ここでは単に機械的にリサイズするだけです。

Photoshop(もしくはElements)で縦と横のピクセル数が同じ画像をオープンしておいて、本Scriptを実行すると出力先のフォルダをきいてきます。フォルダを選択すると、各サイズにリサイズして指定ファイル名で保存します。

例によって、Photoshop CS3とPhotoshop Elements 6で動作確認していますが、Photoshop CS4/5/5.5やPhotoshop Elementsの新しいバージョンでも動くはずです。

スクリプト名:iPhoneアプリで指定されているサイズのアイコンをPhotoshopで機械的に作成する
–iPhoneアプリで指定されているサイズのアイコンを機械的に作成する
–元画像は512 x 512以上のサイズであることを前提としている(ただし正方形であること)
–元画像をオープンした状態で本AppleScriptを実行する

–参考資料:
–https://developer.apple.com/library/ios/#qa/qa1686/_index.html

–iPhoneアプリに必要な各アイコン用PNGファイルのサイズとファイル名
set sizeList to {{512, 512, "iTunesArtwork"}, {57, 57, "Icon.png"}, {114, 114, "Icon@2x.png"}, {72, 72, "Icon-72.png"}, {29, 29, "Icon-Small.png"}, {50, 50, "Icon-Small-50.png"}, {58, 58, "Icon-Small@2x.png"}} –iPhoneアプリ

–set sizeList to {{512, 512, "iTunesArtwork"}, {72, 72, "Icon-72.png"}, {50, 50, "Icon-Small-50.png"}, {29, 29, "Icon-Small.png"}} –iPadアプリ

–set sizeList to {{512, 512, "iTunesArtwork"}, {57, 57, "Icon.png"}, {114, 114, "Icon@2x.png"}, {72, 72, "Icon-72.png"}, {50, 50, "Icon-Small-50.png"}, {29, 29, "Icon-Small.png"}, {58, 58, "Icon-Small@2x.png"}} –iPhone/iPad Universaslアプリ

tell application "Adobe Photoshop CS3"
  
  
–最前面のドキュメント(処理対象)を取得する
  
set aDoc to document 1
  
tell aDoc
    set curRes to resolution
  end tell
  
  
–出力先フォルダを求める
  
set outFol to choose folder with prompt "ファイルの保存先フォルダを取得"
  
  
–単位を取得
  
set oldUnits to ruler units of settings
  
set ruler units of settings to pixel units
  
  
–最前面のドキュメント(処理対象)を取得する
  
set aDoc to document 1
  
tell aDoc
    set curRes to resolution
    
set {origX, origY} to {width, height}
  end tell
  
  
–縦横サイズが同一でない場合へのエラー警告
  
if origX is not equal to origY then
    display dialog "縦横のドット数が異なるため、処理後に縦横比がゆがむ可能性があります。調整したのちに再度おためしください。" with title "エラー" buttons {"OK"} default button 1 with icon 1
    
return
  end if
  
  
–コピー、リサイズ、保存の処理ループ
  
repeat with i in sizeList
    
    
set xSize to contents of item 1 of i
    
set ySize to contents of item 2 of i
    
set fileName to contents of item 3 of i
    
    
–コピー
    
set dupDoc to (doc duplicate aDoc)
    
    
–リサイズ
    
tell dupDoc
      resize image width xSize height ySize resolution curRes resample method bicubic –bicubic/bicubic sharper/bicubic smoother/bilinear/closest neighbor/none
    end tell
    
    
–保存
    
set newFilePath to (outFol as string) & fileName
    
set myOptions to {class:PNG save options, interlaced:false}
    
save dupDoc in newFilePath as PNG with options myOptions appending lowercase extension with copying
    
close dupDoc saving no –リサイズ保存したPhotoshop Documentを破棄(保存したので不要になった)
    
  end repeat
  
  
–単位を元にもどす
  
set ruler units of settings to oldUnits
  
end tell

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

スクリプト名:iPhoneアプリで指定されているサイズのアイコンをPhotoshop Elementsで機械的に作成する
–iPhoneアプリで指定されているサイズのアイコンを機械的に作成する
–元画像は512 x 512以上のサイズであることを前提としている(ただし正方形であること)
–元画像をオープンした状態で本AppleScriptを実行する

–参考資料:
–https://developer.apple.com/library/ios/#qa/qa1686/_index.html

–iPhoneアプリに必要な各アイコン用PNGファイルのサイズとファイル名
set sizeList to {{512, 512, "iTunesArtwork"}, {57, 57, "Icon.png"}, {114, 114, "Icon@2x.png"}, {72, 72, "Icon-72.png"}, {29, 29, "Icon-Small.png"}, {50, 50, "Icon-Small-50.png"}, {58, 58, "Icon-Small@2x.png"}} –iPhoneアプリ

–set sizeList to {{512, 512, "iTunesArtwork"}, {72, 72, "Icon-72.png"}, {50, 50, "Icon-Small-50.png"}, {29, 29, "Icon-Small.png"}} –iPadアプリ

–set sizeList to {{512, 512, "iTunesArtwork"}, {57, 57, "Icon.png"}, {114, 114, "Icon@2x.png"}, {72, 72, "Icon-72.png"}, {50, 50, "Icon-Small-50.png"}, {29, 29, "Icon-Small.png"}, {58, 58, "Icon-Small@2x.png"}} –iPhone/iPad Universaslアプリ

tell application id "com.adobe.PhotoshopElements" –Photoshop Elements
  
  
–最前面のドキュメント(処理対象)を取得する
  
set aDoc to document 1
  
tell aDoc
    set curRes to resolution
  end tell
  
  
–出力先フォルダを求める
  
set outFol to choose folder with prompt "ファイルの保存先フォルダを取得"
  
  
–単位を取得
  
set oldUnits to ruler units of settings
  
set ruler units of settings to pixel units
  
  
–最前面のドキュメント(処理対象)を取得する
  
set aDoc to document 1
  
tell aDoc
    set curRes to resolution
    
set {origX, origY} to {width, height}
  end tell
  
  
–縦横サイズが同一でない場合へのエラー警告
  
if origX is not equal to origY then
    display dialog "縦横のドット数が異なるため、処理後に縦横比がゆがむ可能性があります。調整したのちに再度おためしください。" with title "エラー" buttons {"OK"} default button 1 with icon 1
    
return
  end if
  
  
–コピー、リサイズ、保存の処理ループ
  
repeat with i in sizeList
    
    
set xSize to contents of item 1 of i
    
set ySize to contents of item 2 of i
    
set fileName to contents of item 3 of i
    
    
–コピー
    
set dupDoc to (doc duplicate aDoc)
    
    
–リサイズ
    
tell dupDoc
      resize image width xSize height ySize resolution curRes resample method bicubic –bicubic/bicubic sharper/bicubic smoother/bilinear/closest neighbor/none
    end tell
    
    
–保存
    
set newFilePath to (outFol as string) & fileName
    
set myOptions to {class:PNG save options, interlaced:false}
    
save dupDoc in newFilePath as PNG with options myOptions appending lowercase extension with copying
    
close dupDoc saving no –リサイズ保存したPhotoshop Documentを破棄(保存したので不要になった)
    
  end repeat
  
  
–単位を元にもどす
  
set ruler units of settings to oldUnits
  
end tell

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

2012/02/07 iTunesのMobileアプリをコピーしてすべて展開する

このAppleScriptは、iTunesに入っているiPhone/iPadのアプリを指定フォルダにコピーして、アーカイブを展開して、さらにアプリケーションバンドルを「ただのフォルダ」に変えるものです。

iTunesをコントロールして、iOSアプリの情報を取得しようとしても……iTunes上でアプリの情報を取得するための機能は(iTunesのAppleScript用語辞書には)一切用意されていません(selectionすら取得できないのには意図的なものを感じる)。でも、アプリの情報にアクセスするのに、iTunesの力は必要ありません。ファイル・アクセスだけで十分です。

iosap1.jpg

iOSのアプリは拡張子「.ipa」のファイルであり、このファイルはZipアーカイブの拡張子を変えただけのものなので、簡単に展開できます。

iosap2.jpg

展開すると「Payload」フォルダ内にiOSアプリケーションが展開されます。さらに、このiOSアプリの拡張子「.app」を外します。

iosap3.jpg

iOSアプリのアプリケーションバンドル中に入っている各種データをSpotlightでキーワード検索して探し出すことが可能になります。

iosap4.jpg

一度走らせれば一括処理できるので、2度目を実行する必要性はかなり低いのですが……。処理が簡単で、GUIアプリをコントロールしていないですし、処理を行ったMacBook Proでは4コアのCPUのほとんどが空いており……並列処理にはもってこいの内容です(が、使い捨ての処理なのでそこまでは……)。

とりあえず、EULAの文章などのサンプルを取り出すために、他の用件を片付けている間にAppleScriptを走らせて処理できました。予想外だったのは、すべてのアプリのアーカイブを展開したら容量が増えてHDDの空き容量が減って危ない目に……。

スクリプト名:iTunesのMobileアプリをコピーしてすべて展開する
–iTunesのデータフォルダを求める
set mFol to path to music folder
set mFolStr to mFol as string
set mFolStr to mFolStr & “iTunes:Mobile Applications:”

–home:Music:iTunes:Mobile Applicationsフォルダ内のipaファイルの一覧を取得する
try
  tell application “Finder”
    tell folder mFolStr
      set appList to (every file whose name ends with “.ipa”) as alias list
    end tell
  end tell
on error
  display dialog “Mobile Applicationsフォルダが存在しないか、Mobileアプリが存在しません。” buttons {“OK”} default button 1 with icon 1
  
return
end try

–ipaファイルを処理するループ
set appProcTmp to choose folder with prompt “iOSアプリケーションを展開する作業フォルダを指定”

set aCount to 1 –フォルダ名のカウンタ

repeat with i in appList
  –ipaからzipにリネーム
  
set j to contents of i
  
  
tell application “Finder”
    
    
–新規フォルダ作成
    
set newFolder to (make new folder at appProcTmp with properties {name:aCount as string})
    
set newFolder to newFolder as alias
    
    
–ipaファイルをコピー
    
set anAppFile to (duplicate j to newFolder)
    
set anAppFile to anAppFile as alias
    
    
–ipaファイルをzipにリネーム
    
set aName to name of anAppFile
    
set bName to retNameFromFilenameStr(aName) of me
    
set bName to bName & “.zip”
    
    
set name of anAppFile to bName –rename
    
  end tell
  
  
–unzipを実行してzipアーカイブを展開
  
set tmpFolPath to POSIX path of newFolder
  
set tmpPathPOSIXfull to POSIX path of anAppFile
  
try
    do shell script “cd “ & quoted form of tmpFolPath & ” && unzip “ & quoted form of tmpPathPOSIXfull
  on error erMes
    return {false, erMes}
  end try
  
–展開ここまで
  
  
  
–展開後のアプリケーションバンドルをただのフォルダに変える
  
tell application “Finder”
    tell folder (newFolder as string)
      tell folder “Payload”
        set appFileList to (every file whose name ends with “.app”)
        
set appFile to (contents of first item of appFileList) as alias
        
        
set tmpName to name of appFile
        
set newAppName to retNameFromFilenameStr(tmpName) of me
        
set name of appFile to newAppName
      end tell
    end tell
  end tell
  
  
  
set aCount to aCount + 1
  
end repeat

–ファイル名文字列から拡張子を外して返す
on retNameFromFilenameStr(fileNameStr)
  set fLen to length of fileNameStr
  
set revText to (reverse of (characters of fileNameStr)) as string –逆順テキストを作成
  
set anOffset to offset of “.” in revText
  
set fRes to text 1 thru (fLen - anOffset) of fileNameStr
  
return fRes
end retNameFromFilenameStr

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

2012/02/03 近似式によるRGB→CMYK/CMYK→RGB変換

AppleScriptでRGBの色データをCMYKの色データに変換する手段といえば、Color Sync Scirpingを用いるのが常套手段だったのですが、これがMac OS X 10.6で廃止になりました(残念!)。

・OS X 10.7, LionのRelease Noteに書かれていない変更点
http://piyocast.com/as/archives/1751

ほかに、色データの変換を行う手段といえば、安直にPhotoshopに計算してもらうというものもあります。こちらは、現在でも(Photoshopが入っている環境であれば)利用できます。

・与えられたテキストをPhotoshopでRGBデータと評価してCMYK値を返す
http://piyocast.com/as/archives/1898

ほかには、AppleScriptObjCが使えれば、NSColorのgenericCMYKcolorSpaceを用いて変換することも可能です。genericなCMYKcolorSpaceだけでなく、出力デバイス名を指定して出力特性を反映させて変換を行うことも可能です(genericしか試してないけど)。

……で、これらの手段が使えない場合にどうするかといえば、RGB→CMYK/CMYK→RGBの変換を行う「近似式」があるため、それを使うのが一般的です。

・ISP imaging-developers-色変換式集 - CMYK
http://image-d.isp.jp/commentary/color_cformula/CMYK.html

この近似式を用いた(Objective-Cで書かれた)プログラムの処理結果が思わしくないということだったので、AppleScriptで近似式を用いて相互変換の処理を書いてみました。

RGB→CMYK変換では、黒に近い色(というか黒)を与えると0による除算が発生したり、マイナスの値になったりするケースが見られたため、try〜end tryでエラーをキャッチしたりするなど、地道な補正を加えています。

本Scriptでは、choose colorコマンドで指定した色(RGB)を一度CMYKに変換し、変換したCMYK値を再度RGB値に変換してchoose colorコマンドで色プレビューを行っています。

RGB→CMYKの変換時に発生する一種の「くすみ」がなく、見たまんまそのまま変換されてしまうので、分る人が見るとウソだと分るのですが、単に変換したいだけという場合には割と使えるという感触です。

スクリプト名:指定色をRGB→CMYK→RGB変換プレビュー
–色選択
set aCol to choose color

set {rNum, gNum, bNum} to aCol

set rNum to rNum div 255
set gNum to gNum div 255
set bNum to bNum div 255

–RGB→CMYK変換
set {cNum, mNum, yNum, kNum} to approximateRGBtoCMYKconvert(rNum, gNum, bNum) of me

–CMYK→RGB変換
set {rNum2, gNum2, bNum2} to approximateCMYKtoRGBconvert(cNum, mNum, yNum, kNum) of me

set rNum2 to 65535 * rNum2
set gNum2 to 65535 * gNum2
set bNum2 to 65535 * bNum2

–色プレビュー
choose color default color {rNum2, gNum2, bNum2}

–近似式ベースのRGB→CMYK変換
–参照資料:
–http://image-d.isp.jp/commentary/color_cformula/CMYK.html
on approximateRGBtoCMYKconvert(r, g, b)
  
  
set rNum to r / 255
  
set gNum to g / 255
  
set bNum to b / 255
  
  
set nList to {1 - rNum, 1 - gNum, 1 - bNum}
  
  
set kNum to minimumFromList(nList) of me
  
  
–kNum(Black)がマイナスになるケースがあるため、値を補正
  
if kNum < 0 then set kNum to 0
  
  
  
–0による除算が発生した場合の算術エラーに対処
  
try
    set cNum to (1 - rNum - kNum) / (1 - kNum)
  on error
    set cNum to 0
  end try
  
  
–0による除算が発生した場合の算術エラーに対処  
  
try
    set mNum to (1 - gNum - kNum) / (1 - kNum)
  on error
    set mNum to 0
  end try
  
  
–0による除算が発生した場合の算術エラーに対処  
  
try
    set yNum to (1 - bNum - kNum) / (1 - kNum)
  on error
    set yNum to 0
  end try
  
  
  
–C/M/Yがマイナスになるケースがあるため、値を補正
  
if cNum < 0 then set cNum to 0
  
if mNum < 0 then set mNum to 0
  
if yNum < 0 then set yNum to 0
  
  
  
return {cNum, mNum, yNum, kNum}
  
end approximateRGBtoCMYKconvert

–近似式ベースのCMYK→RGB変換
–参照資料:
–http://image-d.isp.jp/commentary/color_cformula/CMYK.html
on approximateCMYKtoRGBconvert(c, m, y, k)
  
  
set rNum to 1 - (minimumFromList({1, c * (1 - k) + k}))
  
set gNum to 1 - (minimumFromList({1, m * (1 - k) + k}))
  
set bNum to 1 - (minimumFromList({1, y * (1 - k) + k}))
  
  
return {rNum, gNum, bNum}
  
end approximateCMYKtoRGBconvert

–最小値を取得する
on minimumFromList(nList)
  script o
    property nl : nList
  end script
  
  
set min to item 1 of o’s nl
  
repeat with i from 2 to (count nList)
    set n to item i of o’s nl
    
if n < min then set min to n
  end repeat
  
return min
  
end minimumFromList

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