Browsing articles in "AppleScript"
6月 9, 2015
admin

InDesignフォント収集ツール「FonTori」のお知らせ

年初こんなツールを作っていますと、お知らせいたしました、InDesignフォント収集ツール ですが、「FonTori」という名称でリリースいたしました。

詳細については、弊社ホームページをご参照ください。
デモ版は、弊社ダウンロードサイトより、取得できます。

よろしくお願いします

1月 6, 2015
kamata

2015年の新ツール、InDesignフォント収集ツールのご紹介

新年おめでとうございます、CTE鎌田です。
本年もまた引き続き、よろしくお願いいたします。

弊社の新しい製品として、InDesignフォント収集ツールを作っています。
新年のご挨拶も兼ね、ご連絡させていただきたいと思った次第です。

どんなものかというと、InDesignドキュメントを開く際、フォントが無ければ、
「環境に無いフォント」が表示されます。そのフォントを収集しないといけません。

私は、この作業が苦痛で苦痛でしかなく、何とかしたいと思っておりました。
昨年8月に、この自動収集できる社内向けツールを作りました。
(こざくらラボの記事 http://www.web-cte.co.jp/kozakuralab/?p=1659

社内での評判が良いので、本年製品化を考えております。
こんな感じで収集します。

InDesignフォント収集ツール動作ムービー

弊社はいろいろなDTP制作会社のデータを扱いますので、
フォントを収集する時間を短縮することが、生産性のアップにつながります。
自社内だけの制作環境の場合や、フォント管理ルールがしっかりしていれば、
このツールは不要かもしれませんね。

もし、ご興味いただき、詳しい説明や導入をご検討いただけるのであれば、
是非、ご連絡をいただければと思います。

よろしくお願いいたします

8月 11, 2014
kamata

【AppleScript】InDesignフォント収集ツールを作りました

①IDを開くと、フォントがないと言われる

②ツールを起動する。コピー先を指定する

③ツールが環境に無いフォントを表示した

④フォントがコピーされ、ドキュメントに反映された。瞬間で完了!

InDesignを開くと、「環境にフォントが無い」ということで、フォントのあるところ(サーバーとか特定フォルダ)からフォントを収集しなくてはいけない。
モリサワとかメジャーなところなら直ぐ集められるのだが、メーカーによってはフォント名称とファイル名称が分かりやすい関係とはなっていないので、収集には10分とか平気でかかってしまう。
DTPオペが一日10分収集時間かかっているとして、年間50週行うと、10分(日) x 5日 x 50週= 2500分 ÷ 480分(8時間) = 5.2 日。つまりDTPオペは年間の内、1週間はフォント収集に費やしていることになる。

2年前に、このツールを作ろうとしたのだが、フォント名称とフォントファイル名称の関係を掴めず、ペンディングしていた。
昨年、IDMLの変換ツールを作る際に、フォントの知識をかなり得ることができたので、改めて挑戦したしだいだ。

このツールによって、弊社では、フォントを収集する苦痛から解放されつつある。時間短縮、生産性向上が期待できる。

参考資料
http://www.adobe.com/jp/devnet/opentype/afdko.html
http://blogs.adobe.com/CCJKType/files/2012/06/afdko-mhattori-20120625.pdf

※このツールを使ってみたい方は、連絡ください。

12月 1, 2013
kamata

【AppleScript】MavericksでSecurity API failed with error -60008

弊社製品、PDF検版ツールBeforeAfterは、AppleScriptで作られていて、10.5〜10.8まで、問題なく動作しています。ところが、10.9 Mavericksで動作させたところ、問題が発生しました。

4, 5ページの処理では問題ありませんが、8ページ位で処理で止まってしまいました。
調査をすると、do shell scriptの連続処理の箇所で、8ページ程度処理するとSecurity API failed with error -60008 が発生します。

この発生タイミングがよく分かりません。少し修正し、30ページの処理が上手く行き、これで大丈夫だろうと思って、160ページの処理を行うと、また発生するといった具合です。いろいろと試行錯誤を繰り返しました。

処理途中の状況を見るため、あるdo shell scriptの前に、display dialog を入れると、なぜかこのdo shell scriptのコマンドでエラーは発生しなくなりました。
いちいちダイアログを表示させるわけにもいかないので、どうしたものかと考えました。delay 1 ではだめでした。

で、シスログを書き出すよう、下記のようなコマンドを、do shell scriptの前に挿入しました。

do shell script “logger -p user.notice -t BeforeAfter @message”

これで、エラーが発生しなくなったのです。1000ページの処理を行っても問題が出なくなりました。

何故、Mavericks で Security API failed with error -60008 が発生するようになったのか? 何故 display dialog やシスログで回避できるのか? 原因は不明なのだが、とにかくこれで乗り切ったので報告しておきます(この調査〜対策まで3日もかかりました〜)。

11月 13, 2013
kamata

【python】弊社ツールサイトにopenCVポータブルを登録しました

弊社のツールサイト、www.web-cte.co.jp/tools/ にLIB_openCVという名称で登録しました。

取得可能となっております。OS10.7〜10.9で動作を確認しています。

OpenCV-2.4.2.tar と 動作させるAppleScriptを同梱しています。

11月 5, 2013
kamata

【python】openCVをportable化する

OS10.7〜10.9のpythonは2.7でnumpyもインストール済であった。
なので、openCVをportable化して、どのOSXからでもopenCVを使えるようにしたいと思った。

AppleScriptで、コーディング0行で、appを作ります。LIB_OpenCV.appとします。
アプリケーションフォルダの直下に配置します。
Contentsフォルダの下に、Libraryフォルダを作り、そこにopenCVをインストールします。

cmakeのパラメータは、こんな感じ
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/Applications/LIB_OpenCV.app/Contents/Library \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D PYTHON_LIBRARY:FILEPATH=/System/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib \.

PREFIXを/Applications/LIB_OpenCV.app/Contents/Libraryにしてるだけです。

さて、実行してみます。デスクトップにOpenCV-2.4.2を解凍したフォルダを置き、
その中のsamples > python2 > edge.pyを実行します。

AppleScriptは、こんな感じ

set cmnd1 to “export PYTHONPATH=/Applications/LIB_OpenCV.app/Contents/Library/lib/python2.7/site-packages; ”
set cmnd2 to “export PKG_CONFIG_PATH=/Applications/LIB_OpenCV.app/Contents/Library/lib/pkgconfig:$PKG_CONFIG_PATH; ”
set cmnd3 to “export DYLD_FALLBACK_LIBRARY_PATH=/Applications/LIB_OpenCV.app/Contents/Library/lib:$DYLD_FALLBACK_LIBRARY_PATH; ”
set cmndPy to “python ” & “/Users/yukio/Desktop/OpenCV-2.4.2/samples/python2/edge.py”
set theCmnd to cmnd1 & cmnd2 & cmnd3 & cmndPy
do shell script theCmnd

実行するとこんな感じ

作った、LIB_OpenCV.appは、弊社ツールサイトからダウンロードできるようにします(ちょっと待ってくださいね)

実はこうしてポータブル化したものに、ImageMagick、mecab、OpenJTalk、xpdfがあります。
これらも近々、弊社ツールサイトからダウンロードできるようにします(ちょっと待ってくださいね)

8月 27, 2012
inomoto

【InDesign】InDesignのバグ2点

今回は、仕事中に発見したInDesignのバグを2点ご紹介します。
1点は解決方法がありますが、もう1点は解決方法がありません。
もしこれから同じような処理を行う予定の方はご注意下さい。

1 CS5〜限定 bottom right corner optionのバグ&回避方法

 CS5から、text frameやrectangleの角丸の設定の仕様が変更され、4つの角を別々に制御できるようになりましたが,バグを1点発見しました。4つ角のプロパティは下記の通りです。

・top left corner option     角のシェイプ左上
・top left corner redius    角のサイズ左上
・top right corner option    角のシェイプ右上
・top right corner redius    角のサイズ右上
・bottom left corner option   角のシェイプ左下
・bottom left corner redius   角のサイズ左下
・bottom right corner option   角のシェイプ右下
・bottom right corner redius  角のサイズ右下

このうちの、「bottom right corner option」だけが、スクリプトエディタ上に入力することができません。コンパイルできなくなってしまいます。
Adobeのフォーラムを検索したところ、「«property pcO4»」と入力すると、「bottom right corner option」にコンパイルされるようです。
(参照:http://forums.adobe.com/thread/829997)

ですが、このままだとコンパイルのたびに「bottom right corner option」を「«property pcO4»」に打ち直ししなければならず、正直仕事になりません。

そこで、テキストをスクリプトとして評価するという方法でこの現象を回避してみようと思い、下記のルーチンを作成しました。

[applescript]
–bottom right corner optionを取得
on getBottomRightCornerOption(frameID, appName)
set aScript to "
tell application \"" & appName & "\"
tell document 1
tell text frame id " & frameID & "
set bottomRightCornerOption to «property pcO4»
end
end
end" as string
set aResult to run script aScript
return aResult
end getBottomRightCornerOption

–bottom right corner optionを設定
on setBottomRightCornerOption(frameID, bottomRightCornerOption, appName)
set aScript to "
tell application \"" & appName & "\"
tell document 1
tell text frame id " & frameID & "
set «property pcO4» to " & bottomRightCornerOption & "
end
end
end" as string
set aResult to run script aScript
end setBottomRightCornerOption
[/applescript]

上がプロパティの取得用、下が設定用です。
取得用ルーチンに渡すパラメータは、

1 オブジェクトのID
2 アプリケーション名

設定用ルーチンに渡すパラメータは、

1 オブジェクトのID
2 取得用ルーチンで取得した値
3 アプリケーション名

です。アプリケーション名を渡すことにしてあるのは、CS5以降のverでも使用できる可能性を考えてのことです。CS5.5を調べてみたところ、修正されていないようでしたので……。

これで、面倒な作業なしに開発に集中できるようになりました.

2 CS5まで? anchored object settingsのバグ(回避方法なし)

アンカーオブジェクトのあるプロパティの設定が、GUIからできることとスクリプトからできることが異なる、という現象です。
親文字からの間隔を「カスタム」にすると、アンカー付き位置の「Y基準」を設定できるようになりますが、ポップアップメニューからは下記の列挙値が取得できると思います。

・行(ベースライン)
・行(キャップハイト)
・仮想ボディの上
・仮想ボディの中央
・仮想ボディの下
・行(行送りの先頭)
・列枠
・テキストフレーム
・ページマージン
・ページ枠

これらと、AppleScriptの辞書で定義されている列挙値を比較すると、以下のようになります.

・行(ベースライン)  line baseline
・行(キャップハイト) capheight
・仮想ボディの上    (値なし)
・仮想ボディの中央   (値なし)
・仮想ボディの下    (値なし)
・行(行送りの先頭)  top of leading
・列枠         column edge
・テキストフレーム   text frame
・ページマージン    page margins
・ページ枠       page edge
・(値なし)      line Xheight
・(値なし)      line ascent

このなかで特に困るのが、仮想ボディ関係のプロパティです。大概の自動処理系の作業は、手作業でのデータやテンプレートがまずあって、それにあわせて仕様を設定するということが多いと思いますが、そこでこれらの値が使用されている場合、スクリプトで対応できなくなってしまいます。同じような作業を行う際はご注意ください。

ちなみに、こちらはCS4でも同じ現象が見られますので,それ以前も同様の可能性があります(確認はしていません).CS5.5では修正されているようです。許されるならば5.5に上げてしまうのも一つの手段かと思われます.

6月 28, 2012
inomoto

Illustrator CS4でのfile pathの取得&perlで索引の連続ノンブルをまとめる

今回はバグ(?)報告とPerlのルーチンを投稿します.

1 Illustrator CS4でのfile pathの取得結果が,OSのバージョンによって変わる

この現象は下記の経緯で発見されました.

1 Mac OSX 10.4 & Illustrator CS4の環境で,リンク画像のパスを取得するスクリプトを作成
2 その後,Mac OSX 10.7 & Illustrator CS4での動作も求められる
3 動かしてみると,予期せぬ箇所でエラーが発生している
4 調査の結果,下記の事実が判明する
 「file pathを取得すると,10.4と10.7とでは得られる結果が異なる」

スクリプトエディタのログのキャプチャを掲載します.

10.4での挙動がこちら.
10.7での挙動がこちら.
10.4では,Unicode textにキャストする前後で同じMacintosh形式のパスが帰ってくるのに対し,10.7では,Unicode textにキャストする前はバイナリのようなdata形式になってしまっています.
バグなのか仕様なのかは不明ですが,このような混乱の素が放置されているのは困りますね…….

2 索引の連続ノンブルをまとめる perl ver.

市川せうぞー様がrubyでのルーチンをblogに掲載してらっしゃいますが,ちょっとrubyが使用できない環境にあったので,perlで作成してみました.
かなり力技なので,美しくないです(^^;).もっといい方法があったら教えてください.
また,あまりテストをしていないので,バグがでるケースもあるかもしれません.その場合もご指摘いただけると幸いです.
[perl]
#———————————————-
#ノンブルの配列中の連続した部分をハイフンで連結した文字列にして返す
#(「1,2,3,4,5,8,9,10」の配列を「1-3,4,5,8-10」にする)
#———————————————-
sub GetSuccess {
my @in = @_;
my @arr;

#配列の要素が2つだけならカンマで連結して返す
my $len = @in;
if ($len == 2) {
return join(",", @in);
}

#3つ以上の場合
my @result;
my @serial;
my $prev;
for(my $i = 0; $i < @in; $i++) {
my $num = $in[$i];

#最初の要素はリストに入れるだけ
if ($i == 0) {
$prev = $num;
push (@serial, $prev);
next;
}

#ノンブルが続いている箇所を固まりにして配列に入れる
if ($num – 1 == $prev) { #続き要素なら
push (@serial, $num); #続き要素用の配列に入れる
} else { #ノンブルが飛んだら
push (@result, [@serial]); #続き要素の配列をリファレンスにして結果配列に入れる
@serial = (); #続き要素用の配列をリセット
push (@serial, $num);
}
$prev = $num; #直前の番号を更新
}
push (@result, [@serial]);

#結果配列の内容を走査
my @retArr;
foreach my $r(@result) {
my @r = @$r;
my $cnt = @r;
my $val;
if ($cnt >= 3) { #3以上の配列なら最初と最後をハイフンで連結
$val = join("-", $r[0], $r[-1]);
} else { #2以下ならカンマで連結
$val = join(",", @r);
}
push (@retArr, $val);
}

# print join(",", @retArr), "\n";
return join(",", @retArr);
}
[/perl]

2月 24, 2012
inomoto

【Excel2008】スクリプト2件ご紹介

今回はExcel用のAppleScript2件です.

お客様からいただいたCSVやTSVを加工して色々する作業が多いのですが,もとの値がどうなっていたかを確認するために,それらをExcelで開いて確認することが多いです.
そのとき,それぞれの列に適した列幅を設定したり,オートフィルタで整理した状態にしたりと色々するのですが,ファイルが多いとそれも大変です.

1 コラム幅を設定し,適用する
setWidthPrefList内に入力した設定の通りに,列幅を変更します.
setWidthPrefList内のリストは,列のインデックスも合わせて入力する仕様なので,順番通りでなくても大丈夫です.

サンプルでは,
・1〜4列目はオートフィット
・5列目は100
・6列目は設定なし
となっています.

[applescript]
tell application "Microsoft Excel"
tell active workbook
set widthPrefList to setWidthPrefList() of me –コラム幅設定用のリストを作成
setColumnWidth(widthPrefList) of me –設定リストに従いコラム幅を設定

end tell
end tell

–設定リストに従いコラム幅を設定
on setColumnWidth(widthPrefList)
set aConstant to 2.5142281 –変換用定数
tell application "Microsoft Excel"
tell active workbook
tell active sheet
repeat with aData in widthPrefList
set {aNum, aWidth} to aData
tell column aNum
if aWidth is "auto" then
autofit
else
set aWidth to aWidth / aConstant
set column width to aWidth
end if
end tell
end repeat
end tell
end tell
end tell
end setColumnWidth

–コラム幅設定用のリストを作成
on setWidthPrefList()
set widthPrefList to {} –定義

(*{インデックス, 幅}で設定,"auto"でautofit.数字はダイアログに入力する数字*)
set the end of widthPrefList to {1, "auto"}
set the end of widthPrefList to {2, "auto"}
set the end of widthPrefList to {3, "auto"}
set the end of widthPrefList to {4, "auto"}
set the end of widthPrefList to {5, 100}

return widthPrefList
end setWidthPrefList

[/applescript]

この状態が

こうなります.

2 オートフィルタを設定する

シートにオートフィルタを設定し,指定の列の指定の値でフィルタをかけます.

サンプルでは,2列目を「野菜」でフィルタしています.

[applescript]
tell application "Microsoft Excel"
tell active workbook
tell active sheet
setAutofilter() of me
setCriteria(2, "野菜") of me –オートフィルタのフィルタ内容を変更

end tell
end tell
end tell

–オートフィルタのフィルタ内容を変更
on setCriteria(aNum, c1)
tell application "Microsoft Excel"
tell active workbook
tell active sheet
tell used range
if c1 is not "" then
autofilter range field aNum criteria1 c1
else
autofilter range field aNum –第2パラメータが空なら全てを表示
end if
end tell
end tell
end tell
end tell
end setCriteria

–used rangeにオートフィルタを設定
on setAutofilter()
tell application "Microsoft Excel"
tell active workbook
tell active sheet
set enable autofilter to true
tell used range
autofilter range
end tell
end tell
end tell
end tell
end setAutofilter
[/applescript]

この状態が

こうなります.

2月 18, 2012
kamata

xml構造をリアルタイムでチェックする

InDesignCS5からeventにafterSelectionChangedが追加された。
例えばテキストを触って選択状態が変更すると、eventを発行する。

CS2の頃からやってみたかったことがあった。
IDでxmlを扱うとき、オペレータが誤ってxml構造を壊してしまうことがある。
オペ中にリアルタイムで構造チェックをしたかった。
(積極的にxmlの組版をしてこなかった理由もこんなところにある)

このeventを使えば、構造をオペ中にチェックできるのではないか? と思った次第。

サンプルのxmlはこんな感じ。




	

		Harry Potter and the Philosopher's Stone .
		日本語版単行本 ISBN 4-915512-37-1(1999年12月1日発売)
		日本語版携帯版 ISBN 4-915512-49-5(2003年発売)
	
	

		Harry Potter and the Chamber of Secrets
		日本語版単行本 ISBN 4-915512-39-8(2000年発売)
		日本語版携帯版 ISBN 4-915512-54-1(2004年発売)
	

dtdはこんな感じ。






タイトルは1つ無くてはいけない。ここを消すとアラートを出すようにしたい。

まず、イベントを発生させるスクリプトは、

tell application "Adobe InDesign CS5"
	make event listener with properties {event type:"afterSelectionChanged",handler:"SnowLeopard:Users:yukio:Desktop:xmlValidationCheck.applescript"}
end tell

テストなのでhandlerの場所指定は、デスクトップ(SnowLeopard:Users:yukio:Desktop:)にxmlValidationCheck.applescriptという名称で置いています。
そのhandlerのスクリプトは、

tell application "Adobe InDesign CS5"
	tell document 1
		set validErrors to validate XML element 1
		if (length of validErrors) > 0 then

			set errMessage to ""
			set errCnt to 0

			repeat with anvalidError in validErrors
				set errCnt to errCnt + 1
				tell anvalidError
					tell element
						set errTag to name of markup tag
						select XML content
					end tell
					set errMessage to errMessage & (errCnt as text) & "<" & errTag & ">" & error message & return
				end tell
			end repeat
			display alert errMessage
		end if
	end tell
end tell

動作はこんな感じになる。クリックするとムービー始まります。


全てのeventを削除するのは、

tell application "Adobe InDesign CS5"
	repeat with myCounter from 1 to (count event listeners)
		delete event listener 1
	end repeat
end tell
ページ:123»