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に上げてしまうのも一つの手段かと思われます.

8月 24, 2012
admin

開発完了からはじまるお仕事

プロジェクト管理者としてiOSのアプリケーション開発に従事している今日このごろ。お客様と打ち合わせを行って仕様を決めたり、開発チームと打ち合わせを行って方向性や進捗状況や問題を相談したりと、なかなか「小忙しい」日々を過ごしています。

仕様どおりに開発できていることをお客様に確認いただき、納品状態に到達できれば、開発チームは「おつかれさまでした」ということになるわけですが、プロジェクト管理者はそうもいきません。

魔の「AppStore申請作業」が待っています。

まずは、開発が完了したXcodeのプロジェクトを再度チェックしなくてはなりません。

バンドルIDは合っているのか? バージョン番号は? ターゲットのハードウェアは合っているのか? iPhone専用なのにiPhone/iPad向けユニバーサルアプリ設定になっていると大変です。テスト時には気にもしなかったことが、申請段階になると大問題。

さらに今回大変だったのが……英語向け画面の追加を行ったので、説明文の吟味や追加や調整やら。

ふだんはぞんざいに「いんでー」「ふぉとしょー」「いられー」などと呼ばれているシロモノが、「Adobe InDesign」「Adobe Photoshop」「Adobe Illustrator」などなどと、ちゃんとしたお名前でご紹介しないと大目玉をくらいかねないわけで、AppStore上のアプリ紹介文の再チェックも大変です。

AppStore申請作業は一度ミスると、やりなおすのにも時間がかかります。普段はだいたい5営業日ほど待つと審査してもらえるわけですが、却下(リジェクト)されると(問題解決後に)また待ち行列に並び直す必要が……。

お客様とのお約束の日にAppStoreからダウンロードできる状態を作るため、Appleに却下されないよう細心の注意を払わなくてはなりません。Appleのレビューワーに「この機能が付いているけれど、こういう目的のためであって悪意があるわけじゃないよ〜」などと英語で文章を書いてみたりと、涙ぐましい工夫のかずかずかずかず。

開発のためにコードを書いたり、打ち合わせのためにプレゼン資料を作るのは楽しい仕事ですが、このAppStoreへの申請作業は何回やっても心身ともどもすりへります。

また、このやっかいな作業をさらに困難にしているのが、各種申請画面のそっけないWebインタフェース!!! アプリ申請用画面もAppleならではのシンプルさが貫かれています。

なるべく画面上に雑多なボタンやメニューを置きたくない……という美学なりはよく分るのですが、何も「他の言語(外国語)の説明追加を行うのに、ポップアップメニューの中を漁らないと分らない」状態にすることはないんじゃないでしょうか。ものによっては、美学なのか不親切なのか……悩ましいところです。

一番困るのが、申請画面で操作を行っても反応がないケース。

「何か間違ったことをしただろうか?」と悩まされることに。まさか、サーバー側が障害で落ちているなんて! 最初に遭遇したときには半日待ってしまいました。

今日も、画面のスナップショットをアップロードしたら、エラー表示に。画面キャプチャのサイズもフォーマットも色空間もみんな合っているのですが、いっこうに受け付けてもらえません。

これって、ワナですか? それとも、仕様ですか?

7月 18, 2012
U

モトヤコラボレーションフェア 東京2012

先週末7月12日、13日とアキバ・スクエアにて開催されました
モトヤコラボレーションフェア 東京2012
昨年に続いて今年も出展させて頂きました。
ご来場頂いた皆様、誠にありがとうございました。

今年も弊社一押しの開発商品「Before After」を中心にご案内させて頂きましたが、
昨年からお問い合わせ頂き、諸事情で導入できずまだ迷っていると
わざわざご来場の上、ご相談頂いたお客様もいらっしゃいました。

 

機能制限ナシでお使い頂ける評価版のご用意もございます。
デモ説明をして欲しい! 首都圏であれば弊社営業が飛んで参ります!!
どうぞお気軽にお問い合わせください。

マイオペ店長ブログの方にも展示会の記事がございます。
よろしければそちらもご覧ください(U)

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]

5月 28, 2012
admin

日付計算の落とし穴

久しぶりにプログラミングについて書きます。
近頃は主にPHPを使って開発する機会が多いのですが、
便利な関数を使っていると思いがけない落とし穴(?)に
遭遇する事があります。
PHPは非常に使い勝手の良い言語で、日付の計算をする場合も
strtotime関数という直感的にイメージしやすい引数を渡せるものがあります。
しかし、その使い勝手の良さ故にバグを誘発することも
時として起こります。

例えば、このstrtotime関数を使用して1か月後の日付を取得したい場合、
引数の1番目に”next month”という様に英単語を渡すと
簡単に取得できるように思えます。

実行環境:PHP version 5.2.6

[php]

<?php

print("2012/01/29の一か月後→".GetNextMonth("2012/01/29")."<br>");
print("2012/01/31の一か月後→".GetNextMonth("2012/01/31")."<br>");
print("2012/02/29の一か月後→".GetNextMonth("2012/02/29")."<br>");
print("2012/03/31の一か月後→".GetNextMonth("2012/03/31")."<br>");
print("2012/04/30の一か月後→".GetNextMonth("2012/04/30")."<br>");
print("2012/05/31の一か月後→".GetNextMonth("2012/05/31")."<br>");
print("2012/06/30の一か月後→".GetNextMonth("2012/06/30")."<br>");
print("2012/07/31の一か月後→".GetNextMonth("2012/07/31")."<br>");
print("2012/08/31の一か月後→".GetNextMonth("2012/08/31")."<br>");
print("2012/09/30の一か月後→".GetNextMonth("2012/09/30")."<br>");
print("2012/10/31の一か月後→".GetNextMonth("2012/10/31")."<br>");
print("2012/11/30の一か月後→".GetNextMonth("2012/11/30")."<br>");
print("2012/12/31の一か月後→".GetNextMonth("2012/12/31")."<br>");

function GetNextMonth($pDate){
$wkTimeStamp = strtotime(‘next month’,strtotime($pDate));
$wkDate = date("Y",$wkTimeStamp)."/".date("m",$wkTimeStamp)."/".date("d",$wkTimeStamp);
return $wkDate;
}

?>
[/php]

しかし、2012年の1,3,5,8,10月の場合、月末の日付を渡すと
翌々月の日付を取得してしまいます。

出力結果:

2012/01/29の一か月後→2012/02/29
2012/01/31の一か月後→2012/03/02
2012/02/29の一か月後→2012/03/29
2012/03/31の一か月後→2012/05/01
2012/04/30の一か月後→2012/05/30
2012/05/31の一か月後→2012/07/01
2012/06/30の一か月後→2012/07/30
2012/07/31の一か月後→2012/08/31
2012/08/31の一か月後→2012/10/01
2012/09/30の一か月後→2012/10/30
2012/10/31の一か月後→2012/12/01
2012/11/30の一か月後→2012/12/30
2012/12/31の一か月後→2013/01/31

恐らくは、
2012/03/31の一か月後

2012/04/31は存在しない

存在する日付まで進める

2012/05/01 という流れをもって
翌々月の日付を取得していると思われますが、直感的に見て
若干違和感を覚える挙動をしています。

既存のプログラミング言語の機能でも、
便利さに目を奪われると思いがけない落とし穴に出くわす事があります。
便利なものこそ、時と場合に応じて本当に有効かどうか確かめる必要がある、
と思いました。

5月 21, 2012

コンピュータの悲鳴

コンピュータは、HDDや放熱ファン、光学ドライブなど物理的な運動を伴う部品を含んでいるため、これらの部品が壊れた場合には部品交換……運が悪ければ買い替えということになってしまいます。

いきなり壊れるという場合は少なく、何らかの「予兆」はあります。

 例:HDDから異音がする(とくにカンカンといった普段鳴らない音)
 例:放熱ファンから異音がする(ひっかかるような音)

これら以外にも、季節による傾向もあります。冬場にデスクトップ機が壊れるケースが多いような気がします。

過去には、水冷タイプのPowerMac G5が派手な水を吹いておなくなりになられたケースや、HDDがトンでしまった事例などがあり、これらの「コンピュータの悲鳴」的な現象を事前に感じ取ることができれば、いきなり「悲しいお別れ」にならなくて済むのではないでしょうか。

コンピュータからデータをバックアップしておく「遺産相続」や、設定値をメモしておく「遺言書の作成」などなど、事前に手を打っておけば仕事が停滞することも少なくなるはずです。

ときに、自分のメインマシンで前述の2症状が発生しているのですが、これは夢でしょうか。夢であってほしいと思います。

4月 12, 2012
admin

ブラウザの設定・・・侮れません!

先日、お客様のWebシステムに機能追加をしたところ、
特定のブラウザの一バージョンだけが一部、体裁が崩れる。
という困った現象が発生しまた。

以前から、IE7とかIE8とか、特定のブラウザにだけ動作に
不具合が出るとか、ブラウザやバージョンの違いには
苦労してきたのですが、
更に、弊社端末では出なくてお客様環境では発生する。
という状況も重なり、調査は難航。

おかげでリリースも止まり、スケジュールにも影響します。
開発側としては「環境的要因」ということで、対処したくなる
部分もあるのですが、理由が環境であれ、端末であれ、
アプリが正常に動かないことには解決にはなりません。

そんな折、今まで不具合が出ていた箇所と、平行して改修を
進めていた別の機能でも新たに体裁崩れが発生。
困ったな…と思いつつ、担当者の調査を待っていたわけですが、
不幸中の幸い?今回は別の機能でも不具合が出たことが
逆に解決の糸口に繋がりました。

体裁が崩れるというのは、結局のところ、ブラウザの設定で、
メニューからの設定がオンかオフか、それだけでした。
(この設定というのは「互換表示」というものです)
端末環境やデフォルト設定、ネットワーク状況等は会社様に
よって違いますので、出たり出なかったりというのもそれが
原因のようです。

解ってしまえば、なんだそれだけか…ですが、
ブラウザの設定やブラウザの種類によって、表示や動作が
違う部分が出てしまうと、原因特定するまでが結構大変。
やはりまずアプリの不具合か!?と疑ってしまいます。
しかも、不具合が出るとやはり不具合部分に目が行きがちです。

別の視点、視野を変えて…と、普段から気を付けてはいても、
実際、障害対応をしているとそれが中々難しく、
改めて、気を付けなくてはと思い直しました。

無事に不具合が解決出来て、無事にリリース、お客様、
ユーザー様にシステムを使って頂くことが出来て良かったと
思いながら、しかし、ブラウザの設定、侮れません・・・。

(shigi)

3月 30, 2012
kamata

InDesignの電子書籍化では正規表現スタイルは通常スタイルに置換し直す

3月末にしてようやく春を感じられるようになってきました。
こざくら商店街のコザクラも週末に開花の予感がします。

さて、弊社でもいろいろな電子書籍化を行っています。その中で、InDesignから電子書籍化をすることも多いのですが、正規表現スタイルが適用されている場合、文字スタイルに置換しなおす作業をしています。例えば、

佐藤 今晩は、本日は鈴木さんをお招きしました。
鈴木 こんばんは、よろしくお願いします…

のような対談で用いられるスタイルですが、人名スペースお話の内容…..の場合、
行頭からの最初のスペースを判定して前をゴシックに、後ろを明朝にするといいう、正規表現スタイルが適用されていたりします。

この場合、これらの箇所をテキスト化しても(HTML書出ししても)、
<p style=”段落スタイル”>佐藤 今晩は、本日は鈴木さんをお招きしました。</p>

のようになってしまいます。
人名がゴシックだよという情報は書き出されません。
この表現は段落スタイルに吸収されてしまっています。

折角の正規表現スタイルですが、電子書籍化には昔ながらの文字スタイル、段落スタイルで行ったほうが、抽出しやすいということです。
ですので、このケースでは正規表現スタイルを、段落スタイルは明朝にして、スペースの前半はゴシックの文字スタイルに検索置換する前処理が必要になってきます。
この作業は面倒ではありません。IDの検索置換は便利なので、こうした前処理も正規表現検索置換を使って簡単に済ますことができます。

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
ページ:«1...891011121314...21»