ichinose

WEB書籍 量子力学入門 前野昌弘、良くわかる光学とレーザーの基本と仕組み 潮秀樹

-----

量子力学入門

前野昌弘 

平成18 2 16  

pdf

http://www.phys.u-ryukyu.ac.jp/~maeno/qm/qm.pdf

 

text

http://www.phys.u-ryukyu.ac.jp/~maeno/qm2006/qm8.html

-----

良くわかる光学とレーザーの基本と仕組み

潮秀樹

https://books.google.co.jp/books?id=mSwmIkpYK54C&pg=RA1-PA126

-----

 

http://www.phys.u-ryukyu.ac.jp/~maeno/qm/qm.pdf

page45-46

6.2 不確定性の意味

「不確定性は、実験機器の責任によって生じるのではなく、物質の波動的性質によって必然的 に生じるものと考えなくてはならない。

by ichinose at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

第32回勉強会は終了しました

Tweet参加のみなさん、手伝ってくれたみなさんありがとうございました。 参加者の皆さんに資料スライドのご案内メールを出しました。 届いてない方はご連絡下さい。 twitterのまとめはこれ➡大阪DTPの勉強部屋 第32 […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

FORCE

meiryo

もう…
BLOGの書き込みに電話するのやめて…笑

 

令和の合字対応のmeiryoは
Version 6.30

 

 

コードは『32ff』
Website_image00310518-191028

 

コレクションは

 

って
事ですわぁ

 


手順的には
1:Office2011の旧フォントを削除 (/Library/Fontsにあります)
2:Office365からフォントを取り出して展開
ですが
許諾違反になります。
Officeアプリ入稿データ等、何か特殊な理由が無い限り
Officeの付属フォントは『別』で考えた方がクライアントのコンプライアンスもあるので無難です。
(時代ですなぁ…)

 

 

ちなみに
最近のメイリオだと以下のバージョンが存在します。

 

Mey

 

 

by Force at 詳細 このエントリーをはてなブックマークへ追加

Perfume

Website_1

 

 

Perfumeが好き
サウンド的には、好きなタイプのサウンドでは無いのだが
(基本的には打ち込みは好きになれない…タイプ)
現場のデザイナー女子に『誰が好きなんですか?』と聞かれるが
『三人揃ってパフュームです』と答え得ている…

 

久しぶりの投稿です。
令和になった…
平成30年を、ど真ん中で暮らして来たわけですが
未来に『希望が持てない』時代だったなぁ…と…
思い返したりしますなぁ…

 

もう、私のような『オッサン世代』は良いから
若い世代が未来に楽観的になれるような時代になってくれたらなぁと
思う今日このごろ…

 



『Office 365』『Office 2019』16.25で令和の合字対応となった
『游ゴシック』がTTC(TrueType® コレクションフォント)となって
『YuGothic』と『YuGothicUI』のコレクションとなった

 

Website_image00310518-172929

 

これは、『メイリオ』の終焉を意味するのかしら…

 

Reiwa

 

Reiwa2

 

 

 メイリオの方が好き

(良い悪いではなく、好き嫌いだからね…) 

 

 

Officeに付属するフォントはOfficeでの利用に対して許諾されているので、AdobeのソフトでOfficeフォントを使うのは許諾違反になる可能性があります…なので…コンプライアンス的には使えないフォントですわなぁ 

 

 

Yugo

by Force at 詳細 このエントリーをはてなブックマークへ追加

ichinose

水を可視化する方法

・均一に塗ったはずの水のムラを可視化する。

・目で見ると湿っていないのに、何処に水が付いているのか可視化したい。

・湿り具合を可視化したい。

などのお悩み。

さてどうするか。

水の吸収波長は、1450nmにある。 O-Hの吸収波長だ。

そこで、λ=1450nmの バンドパスフィルタを付けて画像をスキャンすれば良い。

さっそくやってみた。
 Forblog
上は、λ=550nm(緑色)、 オルソスキャナによる 1200ppi画像。9,746x5,263pixel (5千万画素)
下は、λ=1455nm(近赤外線)、 InGaS(インジウムガリウムヒ素) カメラによる 150ppi画像。1,000 x 512 pixel (51万画素)


InGaSカメラのほうは、まだ シェーディング補正が機能していないので、ちょっとスジっぽいけど
水の吸収波長で画像を撮ると ひと目で 水が最も濃くでていることが判る。

※ InGaSカメラ:波長 0.9〜1.7μmに感度を有する。水は、1.45μmに吸収波長が存在する。

以上

1200ppi

 

追記)
1200ppi とは、0.021mmの分解を意味する。

先の可視画像を拡大すると、ミシンオイルのちょっと上に、糸くずが見える。

視力1.0の人が、300mmで観察する時の分解能が、291ppiくらい。
若い女性でも、至近距離100mmでピントが合うとしても、900ppiくらい。
なので、裸眼では見分けられない光学解像度が、1200ppiだね。

追記ーその2)
紙に付けた水分は、乾燥して消えていたのでは?
可視光と近赤外光の比較になっていないのかも知れない。

ちょっと不安がよぎったので、トドメの実験。

シャーレに、各種液体を3mm深さ注ぎ、スキャン。

まるで、水が醤油のようですね。(笑)

Cmp_1455nm_vs_550nm_gm10

(追記 その3)

太陽光と水吸収波長

 

ハロゲンランプ、タングステンランプの発光分光特性。
色温度 2200Kで、1450nmにピーク。

by ichinose at 詳細 このエントリーをはてなブックマークへ追加

あさうす

face

『#2019アドビ令和の変』 を推察する

#2019アドビ令和の変



ということで、5月9日(USでは5月8日らしいのでそっちが実際の日付っぽいけど)から始まった、Creative Cloudの問題の件について、皆様ご機嫌いかがでしょうか。
……うぉ、石投げないでください、いしー。


ともあれ、あんまりにも具体的な公式発表がないのでいろんな推測しか飛んでないんですが、自分なりにもちと考察しておきます。

by あさうす at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

シン・土曜勉強会

Tweet             テーマは「DTP作業を効率化するTips」 Illustratorがメインの人もInDesignを使ってIllustrato […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

DTPの勉強会

【DTPの勉強会 特別編・第6回】参加受付

DTPSExtra6_icon.jpg
DTPの勉強会 特別編・第6回の参加申込の受付を開始いたします。

■開催概要
日時:令和元年6月8日(土)13時00分〜16時45分(予定)
 受付開始:12時30分 会場クローズ:17時
場所:東京都立産業貿易センター台東館 会議室A
定員:25名を予定
参加費:4,000円(当日支払)
 ※通常開催とは会場・開始・終了などが異なりますのでご注意ください

スピーカーや概要についてはこちらのエントリをご覧下さい。
※よくお読みになった上で申し込みお願いします。

終了後、近くの居酒屋にて懇親会を開催いたします
 (店舗については参加者の方に別途ご案内いたします)
参加希望の方は「懇親会参加」欄の「する」を選択して下さい。

ということで…お待たせしました
DTPの勉強会 特別編・第6回のお申し込みはこちら

今回の参加は開催案内に記載の条件、および、申込時の内容を考慮してのご参加になりますこと、ご了承ください。
(申込者が少ない場合には全員参加の可能性はございます)

参加申し込み後、まずは自動返信が行われますので、Gmailを受信できるようにしておいてください。
その後、個別に「参加受付」関連のメールを返送いたします。

今回は開催自体が特別編になり、少々特殊な内容になります。
そのためメール返信なども少々お時間いただくことになりますが、できるだけ早く対応できるようにいたします。
(状況次第では進捗メール等を一斉送付させていただきます)

皆さまの参加お申し込みをを、心よりお待ちしております。

by DTPの勉強会(東京) at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

シン・隔週金曜勉強会

Tweet             テーマは「DTP作業を効率化するTips」 Illustratorがメインの人もInDesignを使ってIllustrato […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

DTPの勉強会

【DTPの勉強会 特別編・第6回】6月8日開催のお知らせ

DTPSExtra6_icon.jpg
DTPの勉強会 特別編・第6回を2019年6月8日(土)に開催します。
今回は2名の講師をお招きしての、少人数でのスクリプト勉強会になります。

■開催概要
日時:令和元年6月8日(土)13時00分〜16時45分(予定)
 受付開始:12時30分 会場クローズ:17時
場所:東京都立産業貿易センター台東館 会議室A
 東京都台東区花川戸2-6-5 地下鉄/東武浅草駅より徒歩5分
定員:25名を予定
参加費:4,000円(当日支払)
 ※通常開催とは会場・開始・終了などが異なりますのでご注意ください

■内容(予定)
  • 講義:Adobe製品における自動化の手段と特徴
  • 講義:JavaScriptとして抑える基本の考え
  • 実習:IllustratorのJavaScriptを実際に書いてみよう(文字列検索・置換)
  • 実習:InDesignのJavaScriptを実際に書いてみよう(簡易コンタクトシート)
今回は「初心者」の方を対象にしたうえで「実際にPCを用いてJavaScriptを動作させる実習を行います。そのため、参加者の方がバッテリー駆動のノートパソコンを持ち込み、そこにIllustratorとInDesign(Creative Cloudでの利用対応バージョンが望ましい)がインストールされていることと、その基本操作ができることを前提とします。
また内容や時間の都合上、申込時にご提示している選択肢の内容を見て、今回の参加条件に適正と思われる方を優先させていただきます。
条件合致の場合でも、応募者多数の場合は抽選とさせていただきますので、ご了承ください。

[スピーカー]
Ten A さん(CC Labo
「自動化できるところは機械に丸投げして浮いた時間でクリエイティブを追求しよう」がテーマの手抜き/CC Laboの中の人です。
自動処理関連技術が認められAdobe Community Professionalになりました。

したたか企画 さん(したたか企画
フリーランスの図版制作・イラストレーター。おもに教科書や学習参考書・ICT教材に関わり,フラスコ・地球・世界地図などを描く。
AppleScript・ExtendScript・XDプラグイン・Keyboard Maestroマクロなど,さまざまな手段で機械の力を引き出す。

■懇親会
勉強会終了後、近くの居酒屋にて開催します。
場所は追ってご案内します。

■お申し込み
5月10日(金)午後12時から参加受付を開始します。

皆様の参加を心からお待ちしております。

by DTPの勉強会(東京) at 詳細 このエントリーをはてなブックマークへ追加

ichinose

論文 「光ファイバーを用いる三次元蛍光スペクトルによる日本古来の浮世絵版画に使用された着色料の非破壊同定」 下山進、野田裕子、藤原伸也 (1988)

論文紹介

立原位貫さん 

蛍光分析を行い顔料を特定した論文:(藤原伸也さんが、立原さんの本名です。) 

https://www.jstage.jst.go.jp/article/bunsekikagaku1952/47/2/47_2_93/_pdf 

「光ファイバーを用いる三次元蛍光スペクトルによる日本古来の浮世絵版画に使用された着色料の非破壊同定」

下山進、野田裕子、藤原伸也

分析化学,vol47, No.2, pp93-100(1988)

公式ホームページ: 

http://inuki-art.com/index.html

サックス奏者だった藤原さん。浮世絵の世界に惹かれて彫り師になってしまった。

(早世無念)

〜〜・〜〜・〜〜

サックス奏者だった藤原さんは、浮世絵の世界に惚れ込み現代の彫り師になった。

分析化学のプロ(下山進、野田裕子 )とタッグを組み微細領域の非接触原料分析に挑み浮世絵の微細な顔料の組成分析に成功した。

浮世絵は歌舞伎役者の演目の記録資料を根拠に、どの時代に刷られたか正確に把握が可能。

このことから、日本にいつのタイミングに新しい顔料が入ってきたのか時代考証が可能。

下山進さん 裕子さんが立原さん(藤原さん)との出会いを振り返って書いた論文:

 

https://kiui.jp/pc/bunkazai/kiyo14/08_shimoyama_pp63-74.pdf

浮世絵の色材研究

-浮世絵非破壊分析法の開発研究と浮世絵研究者との出会-

下山進・下山裕子

文化財情報学研究 第14号, pp63-74

 

by ichinose at 詳細 このエントリーをはてなブックマークへ追加

DTPの勉強会

【DTPの勉強会 過去回】資料頒布のご案内

DTPの勉強会では、過去に開催した回の資料頒布を行っております。
ご希望の方は下記のメールフォームよりお申し込みください。

■概要
収録内容:セッションの動画(mp4形式)・資料
配布形式:DVD(Mac/Windowsハイブリッド)・ダウンロード
頒布価格:500円〜(送料込)
お支払方法:銀行振込(手数料はご負担ください)
お届け方法:普通郵便

■開催内容と価格
開催内容と頒布価格は下記の通りです。リストに無い回は頒布を行っておりません。セッションの詳しい内容については右サイドバーの過去回バナーをご覧ください。

第30回(Illustrator/価格:1500円)
第29回(+DESIGNINGのできるまで/価格:1500円)
第28回(Win環境・フォント/価格:2000円)
第27回(カラマネ/価格:2000円)
第26回(スクリプト/価格:2000円)
第25回(印刷用PDF・ショートセッション17/価格:2000円)
第24回(Photoshop・色補正/価格:2000円)
第23回(ショートセッション2016/価格:500円)
第22回(日本語組版/価格:2000円)
第21回(データ作成/価格:2000円)
第19回(デザイン本出版記念/価格:1500円)
第18回(AiとInDの便利機能/価格:2500円)
第17回(Illustrator/価格:2000円)
特別編・第4回(Glyphsハンズオン/価格:3000円)
第16回(ショートセッション2015/価格:2000円)
第15回(InDesign/価格:2000円)
第14回(Acrobat・Bridge/価格:2000円)
第13回(InDesign/価格:1500円)
第12回(製版・印刷/価格:1500円)
第11回(Photoshop/価格:2000円)
第10回(和欧混植/価格:2000円)
第9回(ショートセッション2013/価格:2000円)
第8回(カラーマネージメント/価格:2000円)
第7回(Illustrator2/価格:2000円)
第6回(タグ付きテキスト/価格:2500円)
第5回(欧文組版/価格:2000円)
第4回(Illustrator/価格:2000円)
特別編・第2回(InDesignとJavascript/価格:2500円)
第3回(文字コードとフォント/価格:0円・※単独頒布不可)

■お申し込み方法
こちらのメールフォームに必要事項を記入の上、お申し込み下さい。
なお、以前の回(第3回〜)のお申し込みも同時に承ります。各回のDVD頒布をご希望の方は希望する回にチェックを入れてお申し込みください。各回の概要については「過去アーカイブ」をご参照ください。
お申し込み確認後、振込先を記載したお申し込み受付メールを送信させていただきますので、お振り込みをお願いいたします。複数回をご希望の方は合計金額のお振り込みをお願い致します。
入金確認後、郵送にてDVDを発送、もしくはダウンロードURLをご案内させていただきます。ある程度まとめて用意する都合上、お届けまでは7~10日程度のご猶予をいただきます。
※お預かりした個人情報は厳正に管理し、発送以外の目的では決して使用いたしません。

by DTPの勉強会(東京) at 詳細 このエントリーをはてなブックマークへ追加

mottainaiDTP

InDesignで折れ線グラフの座標から値テキストを生成するスクリプト

DTP作業者にとっての難易度 ★☆☆☆☆(1) 前回は<a href="http://mottainaidtp.seesaa.net/article/465262161.html" target="_blank">「InDesignで棒グラフの寸法から値テキストを生成するスクリプト」</a>を作成しましたが今回は折れ線グラフ版です。各頂点が示す値が分からなくなっていても、このスクリプトで値テキストを生成することができます。値テキストがあれば<a href="http://mottainaidtp.seesaa.net/article/445867249.html" target="_blank">「JavaScriptでInDesign上に折れ線グラフを描く」</a>でグラフを好きな寸法でいつでも新規作成できることになります。※折れ線グラフをIllustratorで作成していた場合、座標軸や折れ線のパスをInDesignドキュメントにペーストすれば値を抽出できます(InDesignドキュメントを保存してからスクリプトを実行してください)。 <a href="http://mottainaidtp.up.seesaa.net/image/0421a.png" target="_blank"><img border="0" alt="0421a.png" src="http://mottainaidtp.up.seesaa.net/image/0421a-thumbnail2.png" width="530" height="230"></a> スクリプトの使用方法は棒グラフの時と同様です。以下、動画をご覧ください。 <a href="https://www.youtube.com/watch?v=cVst6_n7noE&amp;external_video_config=width%3D480%26height%3D320">折れ線ラフから値テキストを生成</a> 使用のための準備 グラフが描かれたInDesignドキュメントを開いて折れ線のオブジェクトを漏れなく選択します(折れ線以外のオブジェクトは選択しないようご注意ください)。 選択内にグループが含まれるとスクリプトは実行できません。グループを解除するか、ダイレクト選択ツールでオブジェクト群を選択してください。 なお、すべての折れ線オブジェクトに同じ数のアンカーポイントが存在しないと正しいテキストは生成できません。アンカーポイントが足りない場合、ダミーのアンカーポイントを追加してからスクリプトを実行してください(不自然なほど大きな寸法にすることをおすすめします。動画を参照ください)。 スクリプトの実行 スクリプトを実行すると5つの項目を入力できるダイアログが表示されます。【1】最大目盛り、【2】最小目盛り、【3】最大目盛りY座標、【4】最小目盛りY座標、【5】折れ線本数、を設定して実行してください。 値のテキストデータはInDesignドキュメントと同階層に生成されます。 いつものことですが、業務に使用される際は充分にテストされるようお願いします。 サンプルデータはこちら《<a href="http://mottainaidtp.up.seesaa.net/image/g2t_oresen_2019_0421a.zip">g2t_oresen_2019_0421a.zip</a>》です。<a></a>
DTP作業者にとっての難易度 ★☆☆☆☆(1)

前回は「InDesignで棒グラフの寸法から値テキストを生成するスクリプト」を作成しましたが今回は折れ線グラフ版です。各頂点が示す値が分からなくなっていても、このスクリプトで値テキストを生成することができます。値テキストがあれば「JavaScriptでInDesign上に折れ線グラフを描く」でグラフを好きな寸法でいつでも新規作成できることになります。

※折れ線グラフをIllustratorで作成していた場合、座標軸や折れ線のパスをInDesignドキュメントにペーストすれば値を抽出できます(InDesignドキュメントを保存してからスクリプトを実行してください)。


0421a.png


スクリプトの使用方法は棒グラフの時と同様です。以下、動画をご覧ください。


使用のための準備


グラフが描かれたInDesignドキュメントを開いて折れ線のオブジェクトを漏れなく選択します(折れ線以外のオブジェクトは選択しないようご注意ください)。

選択内にグループが含まれるとスクリプトは実行できません。グループを解除するか、ダイレクト選択ツールでオブジェクト群を選択してください。

なお、すべての折れ線オブジェクトに同じ数のアンカーポイントが存在しないと正しいテキストは生成できません。アンカーポイントが足りない場合、ダミーのアンカーポイントを追加してからスクリプトを実行してください(不自然なほど大きな寸法にすることをおすすめします。動画を参照ください)。

スクリプトの実行


スクリプトを実行すると5つの項目を入力できるダイアログが表示されます。【1】最大目盛り、【2】最小目盛り、【3】最大目盛りY座標、【4】最小目盛りY座標、【5】折れ線本数、を設定して実行してください。

値のテキストデータはInDesignドキュメントと同階層に生成されます。

いつものことですが、業務に使用される際は充分にテストされるようお願いします。

サンプルデータはこちら《g2t_oresen_2019_0421a.zip》です。

by 照山裕爾 at 詳細 このエントリーをはてなブックマークへ追加

DTPの勉強会

【DTPの勉強会 第29回・第30回】資料頒布のご案内

vol29_1020.jpg vol30_0406.jpg
DTPの勉強会 第29回DTPの勉強会 第30回の資料頒布を開始します。
ご希望の方は下記のメールフォームよりお申し込みください。

■概要
【DVD版】
収録内容:セッションの動画(mp4形式)・資料
※セッションの内容については第29回・開催概要第30回・開催概要をご覧ください。
フォーマット:Mac/Windowsハイブリッド
頒布価格:各1,500円(送料込)
お支払方法:銀行振込(手数料はご負担ください)
お届け方法:普通郵便

【ダウンロード版】
収録内容・頒布価格:DVD版と同じ

■お申し込み方法

こちらのメールフォームに必要事項を記入の上、お申し込み下さい。

なお、過去の回(第3回〜)のDVDのお申し込みも同時に承ります。各回のDVD頒布をご希望の方は希望する回にチェックを入れてお申し込みください。各回の概要については「過去アーカイブ」をご参照ください。

お申し込み確認後、振込先を記載したお申し込み受付メールを送信させていただきますので、お振り込みをお願いいたします。複数回の頒布をご希望の方は合計金額のお振り込みをお願い致します。
入金確認後、郵送にてDVDを発送、もしくはダウンロードURLをご案内させていただきます。ある程度まとめて用意する都合上、お届けまでは7~10日程度のご猶予をいただきます。

※お預かりした個人情報は厳正に管理し、発送以外の目的では決して使用いたしません。

by DTPの勉強会(東京) at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

シン・隔週金曜勉強会

Tweet             テーマは「DTP作業を効率化するTips」 Illustratorがメインの人もInDesignを使ってIllustrato […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

mottainaiDTP

InDesignで棒グラフの寸法から値テキストを生成するスクリプト

DTP作業者にとっての難易度 ★☆☆☆☆(1) 2017年に書いた<a href="http://mottainaidtp.seesaa.net/article/446870134.html" target="_blank">「JavaScriptでInDesign上に集合棒グラフを描く」</a>と<a href="http://mottainaidtp.seesaa.net/article/447894319.html" target="_blank">「JavaScriptでInDesign上に集合棒グラフ(横方向)を描く」</a>は、値を記録したテキストデータからInDesign上に棒グラフを作成するものでした。 各部の寸法を数値でコントロールしやすく便利だと思うのですが、先日ある方から「毎年棒グラフを更新(最新年の分のみ追加)するのだが、以前の値が記録されたテキストデータが残っていないのでこのスクリプトを使うのは難しい」というお話を伺いました。 そこで今回は既存の棒グラフのオブジェクト(の座標と寸法)から値テキストを生成するスクリプトを書いてみました。InDesignで使用するものですがIllustratorで描かれた棒グラフから値テキストを生成するためにも使えそうです。 <a href="http://mottainaidtp.up.seesaa.net/image/0419a.png" target="_blank"><img border="0" alt="0419a.png" src="http://mottainaidtp.up.seesaa.net/image/0419a-thumbnail2.png" width="530" height="215"></a> 以下、動画をご覧ください。 <a href="https://www.youtube.com/watch?v=6G9FeMwLlyE&amp;external_video_config=width%3D480%26height%3D320">グラフから値テキストを生成</a> 使用のための準備 グラフが描かれたInDesignドキュメントを開いて棒グラフのオブジェクト群を漏れなく選択します(棒以外のオブジェクトは選択しないようご注意ください)。 選択内にグループが含まれるとスクリプトは実行できません。グループを解除するか、ダイレクト選択ツールでオブジェクト群を選択してください。 なお、棒が存在しない箇所があると正しいテキストは生成できません。だいたいの位置で構いませんのでダミーの棒を描いてからスクリプトを実行してください(不自然なほど大きな寸法にすることをおすすめします。動画を参照ください)。 スクリプトの実行 スクリプトを実行すると5つの項目を入力できるダイアログが表示されます。【1】最大目盛り、【2】最小目盛り、【3】最大目盛りY座標(X座標)、【4】最小目盛りY座標(X座標)、【5】グループ内の棒グラフ本数、を設定して実行してください。 値のテキストデータはInDesignドキュメントと同階層に生成されます。 いつものことですが、業務に使用される際は充分にテストされるようお願いします。 サンプルデータはこちら《<a href="http://mottainaidtp.up.seesaa.net/image/g2t_2019_0419c.zip">g2t_2019_0419c.zip</a>》です。<a></a>
DTP作業者にとっての難易度 ★☆☆☆☆(1)

2017年に書いた「JavaScriptでInDesign上に集合棒グラフを描く」「JavaScriptでInDesign上に集合棒グラフ(横方向)を描く」は、値を記録したテキストデータからInDesign上に棒グラフを作成するものでした。

各部の寸法を数値でコントロールしやすく便利だと思うのですが、先日ある方から「毎年棒グラフを更新(最新年の分のみ追加)するのだが、以前の値が記録されたテキストデータが残っていないのでこのスクリプトを使うのは難しい」というお話を伺いました。

そこで今回は既存の棒グラフのオブジェクト(の座標と寸法)から値テキストを生成するスクリプトを書いてみました。InDesignで使用するものですがIllustratorで描かれた棒グラフから値テキストを生成するためにも使えそうです。

0419a.png

以下、動画をご覧ください。

使用のための準備


グラフが描かれたInDesignドキュメントを開いて棒グラフのオブジェクト群を漏れなく選択します(棒以外のオブジェクトは選択しないようご注意ください)。

選択内にグループが含まれるとスクリプトは実行できません。グループを解除するか、ダイレクト選択ツールでオブジェクト群を選択してください。

なお、棒が存在しない箇所があると正しいテキストは生成できません。だいたいの位置で構いませんのでダミーの棒を描いてからスクリプトを実行してください(不自然なほど大きな寸法にすることをおすすめします。動画を参照ください)。

スクリプトの実行


スクリプトを実行すると5つの項目を入力できるダイアログが表示されます。【1】最大目盛り、【2】最小目盛り、【3】最大目盛りY座標(X座標)、【4】最小目盛りY座標(X座標)、【5】グループ内の棒グラフ本数、を設定して実行してください。

値のテキストデータはInDesignドキュメントと同階層に生成されます。

いつものことですが、業務に使用される際は充分にテストされるようお願いします。

サンプルデータはこちら《g2t_2019_0419c.zip》です。

by 照山裕爾 at 詳細 このエントリーをはてなブックマークへ追加

ichinose

ブラックホールの写真を何故撮れたのか。

今年4月に入ってからのビッグニュースに「ブラックホールの画像撮影」という快挙がありました。 

http://www.nao.ac.jp/news/science/2019/20190410-eht.html

~~・~~ 

国立天文台 

地球からM87中心ブラックホールへのズームイン映像 

Zooming in to the Heart of Messier 87 

https://www.youtube.com/watch?v=UWcKmjMcqdU 

~~・~~ 

 ノーベル賞受賞にも匹敵すると話題にされ、そのドーナツ状のオレンジの画像をニュースでご覧になった方も多かったと想います。「地球上の8つの電波望遠鏡を結合させた国際協力プロジェクト」「地球の直径サイズの望遠鏡を作った。」と解説番組でイラストを目にしました。 

 現在、TMTというプロジェクトが動いています。直径30メートル(Thirty Meter Telescope)の天体望遠鏡を作ろうというプロジェクトです。30メートルの望遠鏡をこれから作ろうという時に、地球の直径サイズの望遠鏡を作れたのは何故か。 

 そのポイントは、2つあるのではないでしょうか? 

 (1)観測に使用した光の波長は、 1.3mm の電波であったこと。 

 (2)世界同時観測の、その「同時」の精度に原子時計が使われたこと。 

この2点です。 

 髪の毛の太さが約0.07mmですので、髪の毛20本分の寸法の波長の光を観測に使ったことになります。すなわち、今回の快挙の影に隠れた技術のポイント一つは、「時計」だと想いました。 

 私は高校生の時、15mmほどの分厚いガラス円板を2枚入手し、それを研磨砂で磨いて反射望遠鏡の鏡を作り、反射式の天体望遠鏡を作ったことがあります。口径10cmと口径15cm2台の反射望遠鏡を作りました。反射鏡の製作は、まず「完全なる球面」を目指します。最後に鏡の中央を球面よりも僅かに深掘りして、放物面(パラボラ)にします。 

 ここで、目標とする表面精度ですが、可視光波長の1/4とか、1/8の精度で磨き上げます。λ/4とか、λ/8という表記をします。可視光を555nm(緑)とすれば、100nm01μm=0.0001mm程度の精度を狙って削る。反射望遠鏡の鏡の精度は、観測に使う波長の1418程度の精度が必要。これがまず覚えておくべき重要な数字です。 

 ~~・~~・~~ 

 波長1.3mmの光の14は、約0.3mmです。よって、波長1.3mmの光で観測する望遠鏡の製造精度は、0.3mmの寸法精度で、表面の形状を厳密に製造する必要があります。では、「世界同時に観測する」ためには、何がポイントか? それは、「世界同時観測する観測所で使用する時計の精度は、光が0.3mm進む時間よりも短いこと。」です。そこで、次に計算してみましょう。ぜひご一緒にトライしてみてください。 

Q:光が0.3mm進むために必要となる時間は何秒か。1/10xxxx。とゼロがいくつ並ぶかを計算してみてください。 

 

<計算> 

光は、1秒間に地球を7周半回る。地球の直径は、14万キロメートルでしたね。

 よって、30万キロメートル。次に、単位を揃えます。問いは、[0.3mm]ですので、30万キロメートルもミリメートルの単位に変えます。30km = 30 ×10,000 km = 30 x 10,000 x 1,000 [m] ゼロが多い時は、その数を数えて表記します。3×10^8 [m]、問いの単位は、mmですので、更に1000倍(ゼロ3つ増やす)します。 

3×10^11[mm]、さて、これで準備が整いました。 

Q:光が0.3mm進むために必要となる時間は何秒か。時間は、距離、割る、速度で得られますので、0.3/3×10^11 を求めます。0.3/3×10^11 = 3/3x10^12=1/10^12=10^(-12)。ゼロが12ケで、1兆です。よって、1兆分の1秒が答えです。 

 ちなみに、原子時計の精度は、現在、10^(-15)  ~ 10^(-11) の範囲にあるとのことです。「高精度のものは3000万年に1秒程度、小型化された精度の低いものでも3000年に1秒程度の誤差である。」(Wiki)だそうです。 

 いつか、今回のブラックホール可視化の仕掛け人、本間希樹教授のプログラムが公開される。世界中に0.3mmの精度で電波望遠鏡を作る人が溢れる。安価な原子時計モジュールが発売される。波長1.3mm電波の安価なセンサが発売される。さて、そんな個人が趣味でブラックホールを撮影する時代はやって来るのでしょうか。 

関連記事: 

2019219日、 原子時計が、小型低消費電力に。https://bit.ly/2NkLwt3 

2.2×10-12の長期周波数安定度を達成した。「この開発品は、5年後を目途に販売開始を目指す。」

 

(追記)

ALMA プレスリリース

https://alma-telescope.jp/news/press/eht-201904

イベント・ホライズン・テレスコープを構成する各望遠鏡は、物理的に直接つながっているわけではありませんが、非常に精密な原子時計によってデータが正確に同期されています。

今回の観測は20174月に行われ、波長1.3mmの電波が観測されました。

イベント・ホライズン・テレスコープの各望遠鏡は1350テラバイトという膨大なデータを生み出し、ヘリウムガスが充填された高性能なハードディスクに蓄積されました。

これらのデータは、マックスプランク電波天文学研究所とマサチューセッツ工科大学ヘイスタック観測所にある専用の高性能スーパーコンピュータ(相関器)に運ばれ、処理されました。

処理されたデータをもとに、研究者たちは苦心して自分たちで作ったソフトウェアを使って画像化を行いました。



1日350テラバイトかぁ。

by ichinose at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

第32回勉強会

Tweet               今回のテーマは「Photoshopの最新情報」 村上(やも)さんの話を大阪で聞ける貴重な機会。 前回に続いて大 […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

あさうす

face

Mac版のCorelDrawがいつの間にか出ている。

ということでですね……ちょっと調べてたらそんなものがありまして。

CorelDRAW Graphics Suite 2019 For Mac



いつ出たんだよと。

by あさうす at 詳細 このエントリーをはてなブックマークへ追加

mottainaiDTP

InDesignの検索/置換用「GREP」フォルダをスクリプトで切り換える

DTP作業者にとっての難易度 ★☆☆☆☆(1) InDesignでは検索/置換設定をクエリとして保存することができます(正規表現検索/置換であれば「Find-Change Queries」フォルダの「GREP」フォルダに保存)。しかし複数の仕事が並行する時などクエリの数が多くなりプルダウンメニューから選択するのが面倒になります。これを解決するために検索/置換用「GREP」フォルダを切り換えるスクリプトを書いてみました。 <a href="http://mottainaidtp.up.seesaa.net/image/cg2.png" target="_blank"><img border="0" alt="cg2.png" src="http://mottainaidtp.up.seesaa.net/image/cg2-thumbnail2.png" width="530" height="150"></a> ※元としたのは以前<a href="http://mottainaidtp.seesaa.net/article/462789209.html" target="_blank">「フォルダ内のGREPクエリをスクリプトで一括実行する[InDesign]」(http://mottainaidtp.seesaa.net/article/462789209.html)</a>で作成したスクリプトです。応用すれば簡単だろうと思っていましたがケース分けがややこしく、思いのほか難航してしまいました。 スクリプト使用のための準備このスクリプトはフォルダ名を書き換えるものです。想定していなかった作業により誤ってフォルダを削除するなどのトラブルが発生することがあるかもしれません。バックアップのため、使用の前に「Find-Change Queries」フォルダ全体を複製しておくことをお勧めします。いや、必ずバックアップをとっておいてください。 クエリを収めたフォルダは「GREP_テスト」など「GREP」から始まる名称とし「Find-Change Queries」フォルダの第一階層(「GREP」フォルダと同階層)に置いてください。※「Find-Change Queries」の場所については<a href="https://helpx.adobe.com/jp/indesign/kb/cpsid_84488.html" target="_blank">アドビのサイト</a>を参照してください。スクリプトを実行する前にInDesignを起動しておきます(起動していないとスクリプトは動きません)。 スクリプトの流れ①スクリプトをスタートすると「GREPとして使用するフォルダを選択してください」と表示されます。ここでフォルダを選択すると確認のため「『○○○○』をGREPフォルダとします。」と表示されます。 ②次に「今まで使っていた「GREP」フォルダについては別名保存します。」という入力ダイアログ(プロンプト)が表示されますので任意の名称を入力します。 実行すると①で選択したフォルダの名称が「GREP」と変更され、今まで使っていたGREPフォルダは②で設定した名称に変更されます。 ※「GREP」フォルダ内には「folderName.txt」というテキストファイルが保存されます。これは①の時点(名称を変更する前)のフォルダ名を記録しておくためのものです。これが存在すると後ほど更に切り換えをおこなう際、②の入力ダイアログに「folderName.txt」の内容が自動的に反映されます。※「folderName.txt」は誤って削除しても問題ありません。「GREP」フォルダ内に「folderName.txt」が存在しない場合、②の入力ダイアログには「GREP_temp_yyyy_mm_dd」(「yyyy_mm_dd」は作業年月日)という名称が表示されます。以下、動画をご覧ください。【2019.4.8追記】GREPフォルダを変更したら検索/置換ダイアログを一度閉じてから開き直してください(開いたままだとプルダウンメニューにクエリが反映されないようです)。<a href="https://www.youtube.com/watch?v=BhTZx4D3BFs&amp;external_video_config=width%3D480%26height%3D320">GREPフォルダを切り換える</a>最後に、繰り返しになりますが必ずバックアップをとった上でお試しください。 サンプルデータはこちら《<a href="http://mottainaidtp.up.seesaa.net/image/minimum_2019_0403a.zip">minimum_2019_0403a.zip</a>》です。<a></a>
DTP作業者にとっての難易度 ★☆☆☆☆(1)

InDesignでは検索/置換設定をクエリとして保存することができます(正規表現検索/置換であれば「Find-Change Queries」フォルダの「GREP」フォルダに保存)。しかし複数の仕事が並行する時などクエリの数が多くなりプルダウンメニューから選択するのが面倒になります。これを解決するために検索/置換用「GREP」フォルダを切り換えるスクリプトを書いてみました。

cg2.png

※元としたのは以前「フォルダ内のGREPクエリをスクリプトで一括実行する[InDesign]」(http://mottainaidtp.seesaa.net/article/462789209.html)で作成したスクリプトです。応用すれば簡単だろうと思っていましたがケース分けがややこしく、思いのほか難航してしまいました。


スクリプト使用のための準備

このスクリプトはフォルダ名を書き換えるものです。想定していなかった作業により誤ってフォルダを削除するなどのトラブルが発生することがあるかもしれません。バックアップのため、使用の前に「Find-Change Queries」フォルダ全体を複製しておくことをお勧めします。いや、必ずバックアップをとっておいてください。
クエリを収めたフォルダは「GREP_テスト」など「GREP」から始まる名称とし「Find-Change Queries」フォルダの第一階層(「GREP」フォルダと同階層)に置いてください。

※「Find-Change Queries」の場所についてはアドビのサイトを参照してください。

スクリプトを実行する前にInDesignを起動しておきます(起動していないとスクリプトは動きません)。

スクリプトの流れ

①スクリプトをスタートすると「GREPとして使用するフォルダを選択してください」と表示されます。ここでフォルダを選択すると確認のため「『○○○○』をGREPフォルダとします。」と表示されます。
②次に「今まで使っていた「GREP」フォルダについては別名保存します。」という入力ダイアログ(プロンプト)が表示されますので任意の名称を入力します。
実行すると①で選択したフォルダの名称が「GREP」と変更され、今まで使っていたGREPフォルダは②で設定した名称に変更されます。

※「GREP」フォルダ内には「folderName.txt」というテキストファイルが保存されます。これは①の時点(名称を変更する前)のフォルダ名を記録しておくためのものです。これが存在すると後ほど更に切り換えをおこなう際、②の入力ダイアログに「folderName.txt」の内容が自動的に反映されます。

※「folderName.txt」は誤って削除しても問題ありません。「GREP」フォルダ内に「folderName.txt」が存在しない場合、②の入力ダイアログには「GREP_temp_yyyy_mm_dd」(「yyyy_mm_dd」は作業年月日)という名称が表示されます。

以下、動画をご覧ください。

【2019.4.8追記】GREPフォルダを変更したら検索/置換ダイアログを一度閉じてから開き直してください(開いたままだとプルダウンメニューにクエリが反映されないようです)。

最後に、繰り返しになりますが必ずバックアップをとった上でお試しください。
サンプルデータはこちら《minimum_2019_0403a.zip》です。

by 照山裕爾 at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

シン・隔週金曜勉強会

Tweet             テーマは「DTP作業を効率化するTips」 Illustratorがメインの人もInDesignを使ってIllustrato […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

シン・隔週金曜勉強会

Tweet             テーマは「DTP作業を効率化するTips」 Illustratorがメインの人もInDesignを使ってIllustrato […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

mottainaiDTP

Excel上でセル結合された表組みをInDesignに反映する

DTP作業者にとっての難易度 ★☆☆☆☆(1)※2019.3.20(19:00頃)データを更新/結合されたセルが空欄だった場合も処理できるように修正しました。※2019.3.21(3:30頃)データを更新/全ての行を対象とするかヘッダ・フッタを対象外とするかを選択するよう修正しました。Excelで作られた表組みをInDesignに反映する機会は少なくありません。「ファイル」→「配置」(「アンフォーマットテーブル」など)では大きな問題はありませんがコピー&ペーストを使用する時は「セル内改行」と「セルの結合」が問題になります。これをマクロ(Excel側)とスクリプト(InDesign側)で処理する方法を考えてみました。 <a href="http://mottainaidtp.up.seesaa.net/image/0320.png" target="_blank"><img border="0" alt="0320.png" src="http://mottainaidtp.up.seesaa.net/image/0320-thumbnail2.png" width="530" height="390"></a> Excelでの処理Excelではマクロで以下の処理をおこないます。・セル内改行を「≪≫」に置換・セル結合(横方向)は分割後の空セルに「⊂」を入力・セル結合(縦方向)は分割後の空セルに「∩」を入力 <a href="https://www.youtube.com/watch?v=_5H7agm9ylQ&amp;external_video_config=width%3D480%26height%3D320">Excel マクロ</a>※マクロ作成にあたってはhttps://www.excelspeedup.com/ketsugoukaijyoshiteumeru/を参考にさせていただきました。 InDesignでの処理InDesignではスクリプトで以下の処理をおこないます。・セル内容が「⊂」の場合は左隣のセルと結合(結合後改行と末尾の「⊂」は削除)・セル内容が「∩」の場合は左隣のセルと結合(結合後改行と末尾の「∩」は削除)・「≪≫」を改行に置換※スクリプト実行前に結合セルが存在すると処理できません。※2019.3.21の3:30版では適切にセルを選択している時はアラートが表示されないようにしました。また「⊂」「∩」は最後にまとめて削除することにしました。<a href="https://www.youtube.com/watch?v=E-xBw2ARLQU&amp;external_video_config=width%3D480%26height%3D320">InDesign スクリプト</a> ※お試しになる際は事前によくテストをされるようお願いします。また、かならずバックアップをとってからご使用ください。 サンプルデータ(2019.3.20の19:00版)はこちら《<a href="http://mottainaidtp.up.seesaa.net/image/minimum_2019_0320b.zip">minimum_2019_0320b.zip</a>》です。 サンプルデータ(2019.3.21の3:30版)はこちら《<a href="http://mottainaidtp.up.seesaa.net/image/minimum_2019_0321a.zip">minimum_2019_0321a.zip</a>》です。 <a></a>
DTP作業者にとっての難易度 ★☆☆☆☆(1)

※2019.3.20(19:00頃)データを更新/結合されたセルが空欄だった場合も処理できるように修正しました。

※2019.3.21(3:30頃)データを更新/全ての行を対象とするかヘッダ・フッタを対象外とするかを選択するよう修正しました。

Excelで作られた表組みをInDesignに反映する機会は少なくありません。「ファイル」→「配置」(「アンフォーマットテーブル」など)では大きな問題はありませんがコピー&ペーストを使用する時は「セル内改行」と「セルの結合」が問題になります。これをマクロ(Excel側)とスクリプト(InDesign側)で処理する方法を考えてみました。

0320.png

Excelでの処理

Excelではマクロで以下の処理をおこないます。
・セル内改行を「≪≫」に置換
・セル結合(横方向)は分割後の空セルに「⊂」を入力
・セル結合(縦方向)は分割後の空セルに「∩」を入力

※マクロ作成にあたってはhttps://www.excelspeedup.com/ketsugoukaijyoshiteumeru/を参考にさせていただきました。


InDesignでの処理

InDesignではスクリプトで以下の処理をおこないます。
・セル内容が「⊂」の場合は左隣のセルと結合(結合後改行と末尾の「⊂」は削除)
・セル内容が「∩」の場合は左隣のセルと結合(結合後改行と末尾の「∩」は削除)
・「≪≫」を改行に置換

※スクリプト実行前に結合セルが存在すると処理できません。

※2019.3.21の3:30版では適切にセルを選択している時はアラートが表示されないようにしました。また「⊂」「∩」は最後にまとめて削除することにしました。


※お試しになる際は事前によくテストをされるようお願いします。また、かならずバックアップをとってからご使用ください。


サンプルデータ(2019.3.20の19:00版)はこちら《minimum_2019_0320b.zip》です。

サンプルデータ(2019.3.21の3:30版)はこちら《minimum_2019_0321a.zip》です。


by 照山裕爾 at 詳細 このエントリーをはてなブックマークへ追加

ichinose

Kodak コダック カラーセパレーションガイド&グレースケール Q-13 8インチ 1527654

KODAK Gray Scale チャート

(c) Eastman Kodak Company,1994

Kodak コダック カラーセパレーションガイド&グレースケール

Q-13

8インチ

1527654


Color Separation Guide and Gray Scale (Large)

Color Separation Guide and Gray Scale (small)


- パッチサイズ

        17.7 x 30 mm

        10パッチで、7インチ、3パッチで約2インチでした。

 全体のサイズは、349 x 75 mm^2 です。

 ちっこいgrayScaleもあります。

 こちらの全体のサイズは、197 x 56 mm^2 です。

- 濃度番号

        A , 1 , 2 , 3 , 4 , 5 , 6 , M , 8 , 9 , 10 , 11 , 12 , 13 ,

        14 , 15 , B , 17 , 18 , 19

 で、B1.6OD相当でした。

ちなみにColor Tron でのデータは、(1回測定、平均処理無し)

色の名前 Status T濃度 [ C / M / Y / K ]

#A      0.015   0.017   0.025   0.017

#1      0.124   0.128   0.133   0.126

#2      0.245   0.250   0.248   0.248

#3      0.343   0.349   0.346   0.346

#4      0.429   0.439   0.437   0.434

#5      0.536   0.542   0.536   0.539

#6      0.640   0.650   0.644   0.645

#M      0.743   0.749   0.744   0.746

#8      0.841   0.849   0.840   0.845

#9      0.948   0.954   0.944   0.951

#10     1.042   1.050   1.037   1.045

#11     1.144   1.151   1.134   1.147

#12     1.236   1.244   1.220   1.239

#13     1.332   1.335   1.310   1.333

#14     1.410   1.434   1.414   1.420

#15     1.519   1.520   1.489   1.518

#B      1.606   1.618   1.579   1.612

#17     1.706   1.724   1.678   1.714

#18     1.819   1.849   1.809   1.828

#19     1.909   1.923   1.888   1.909

--------------------

初出 Nifty-serve 1996/08/31 09:16


by ichinose at 詳細 このエントリーをはてなブックマークへ追加

シェーディング補正機能の魅力

シェーディング補正機能の魅力

http://imeasure.cocolog-nifty.com/blog/2011/…/post-2818.html
相変わらず この記事が 閲覧トップだ。
何故なんだろうか。

■双眼鏡という視力拡大装置

裸眼の視力1の眼は、角度分解能1’(分)

つまり、1度の1/60を分解できる。

両眼で、110度を一度に見ていると仮定して、
注目箇所に眼の最も解像度の高い場所を向けたとしたら、
裸眼は、一度に

110度*60=6600画素
を眺めていることになる。

だから、8K放送のマイクロLEDのディスプレイが、
体育館のステージ長くらいの幅で映像を映していると
視力的には、恐らく、本物のステージを目の前にしているのとさして変わらない印象を受けることになる。

欲を言えば、もう2倍(16K)まで欲しいけど。

〜〜・〜〜・〜〜

観光地に行くと、眺めの良いところに有料の双眼鏡が置いてある。
どんなに視力の良い人でも、視力2だから、角度1度を120分割するのがやっとってことだ。
そこで、特定の方位を双眼鏡で拡大して眺めると、裸眼では見えない映像を見ることができる。
これは、空間分解能を上げる道具であると言える。

■濃度拡大装置
Photoshop のレベル補正、ImageJのBrightness/Contrast

次に、階調の話。

素朴な疑問:

 肉眼は 一度に どのくらいの範囲で 明暗(輝度差)を 見分けている のか?

こないだライカのデジカメが、ラティチュード13絞りと発表して、
ISO感度を見ると、50〜50000と書いてあった。

つまり、1000倍の感度設定範囲がある時に、13段と言っているわけで、
2^13=8192の輝度差を撮影できるセンサを使って、13段撮影可能カメラと言っている。
ってことは、適正露光で、8192/1000=8.2倍程度の輝度差を一度に撮れれば由としている。

と考えられる。3絞り分だね。
OD=-LOG(1/8)=0.9 つまり、濃度0.9くらいを最も黒いと見る。
これは、新聞のカラー写真程度だ。(光学濃度0.9)

一般的には、裸眼は、5ビット程度、つまり、32階調程度を一度に見ていると言われる。
最も明るい所に、裸眼の絞り(虹彩)を合わせた時に、
1/32を黒として認識する、ということになる。

反射率 1/32=3.1% ってのは、光学濃度で 1.5。
この1.5というインキ濃度は、一般的な印刷物の濃度である。
印画紙の最大濃度で、2.3くらい。
インクジェットプリンタが頑張って、2.0くらい。
オフセット印刷物の一般的な濃度が、1.5

以上をまとめると、だいたい、普段の裸眼で、階調 32くらいを見ている。
~~・~~・~~
これに対して、8bitのスキャナで、256階調。
16bitのスキャナで、65536階調。を得ることができる。

そこで、丁度さっきの空間分解能(視力)を補助する双眼鏡のように、
階調を見分ける能力を補助する「階調ズーム」の機能を使うと、
裸眼では見えない微妙な濃度差を裸眼でも見分けることができるようになる。

それが、

Photoshop のレベル補正

ImageJのBrightness/Contrast、ですね。

いわゆるヒストグラムを部分拡大する機能だ。

~~・~~・~~
しかし、ここに落とし穴がある。
例えば、再生紙を作る製紙メーカーが、仕上がった紙の濃度ムラを計測しようとする。
紙の反射率が、A4紙、A3紙、A2紙の全面で、反射率が均一かどうかを調べようとするときに、16bitのカメラを使って撮影した画像のヒストグラムを拡大して、ムラを顕在化しようとする。

その時に見えてくるのは、実は、照明装置の照明ムラだ。
そこで、シェーディング補正が重要な機能になる。

(A)光源の照明ムラ。
(B)レンズの周辺減光のムラ。
(C)センサの画素ごとの感度ムラ。
これらを全て較正(キャリブレーション)する。

すると、シェーディング補正した後の、16bit画像は、
計測したい対象物の微妙な反射率のムラが見事に可視化できる。

そうやって、いままで、高額な濃度測定機を使って、
1箇所づつ、点で濃度を計測していても、
うまく見えなかった微妙なムラが、
いとも簡単に2次元の画像として可視化できる。

これが、シェーディング補正を使った16bitスキャナが持つ、「濃度ズーム」の威力だ。この能力を知ったアナリスト(分析屋)は、イメージスキャナの持つ魅力に惹かれる。

(了)

by ichinose at 詳細 このエントリーをはてなブックマークへ追加

ichinose

赤外線画像で測る、赤外線画像で解析する

近赤外線領域には、物質由来の吸収波長があります。

例えば、メロンの糖度の検量線をあらかじめ作成し、特定波長で得た画像の濃度から、メロン切断面の糖度分布を得ることができます。
これは、撮影に使用した特定の波長が、糖分の成分に由来した吸収がなされると推定されます。

スキャン波長は、糖度と逆相関のある 676nm

スキャンした生画像:

■検量線を作成して、糖度を可視化した画像 〜〜・〜〜・〜〜
〜〜・〜〜・〜〜
■ マルチバンドイメージスキャナによる解析
現在、製造はしておりませんが、スキャニングサービスを提供している製品にマルチバンドイメージスキャナ MBS-5593があります。
このスキャナは、以下の特徴を有しています。
=====
○光学解像度:32マイロメートル( 800ppi)
○有効波長: 555nm〜930nm
※結像は、λ= 500nm 〜 1020nm まで可能です。
○階調:16bit (65536階調)
○ガンマ:専用ソフト iMeasureScan.exe を使うことで 反射率に比例した値を16bitで得ることができます。光学濃度 ( Optical Density ) 最大 4.8 まで定量可能です。OD = -1 * LOG(スキャン値/65535)
○デジタル増感:専用ソフト iMeasureScan.exe を使うこと加算平均を実施し、暗部ノイズを低減可能です。実績で、OD5.2まで識別可能。
○タイムラプス撮影:可能。専用ソフト iMeasureScan.exe を使用。

○レンタル可能なバンドパスフィルタ波長一覧。
この一覧は現在弊社に在庫のあるフィルタです。
※別途、ご注文により、λ=10nm単位での波長が選択可能です。
=====
■より高度な使い方
例)動脈と静脈を際立たせる。
血管の静脈に吸収を持つ波長(λ1)
血管の動脈に吸収を持つ波長(λ2)
どちらにも吸収を持たない波長(λ3)
これら3つの波長で得た画像を演算します。
・演算をする理由
イメージスキャナは、校正する機能(シェーディング補正)を持っているため、被写体の反射率に比例した忠実な反射画像を得ることが可能です。
紙状の平面物であれば、この機能が有効ですが、相手が立体的な対象物の場合、照明に依存した影が生じます。
この影は、1チャンネル(1波長)の画像のみを解析する場合は、材料(素材)の吸収によって黒いのか、照明光による影によって黒いのか判断がつきません。
その場合、2種類の波長で得た画像があれば、その画像同士で演算することで、光源による影の影響をキャンセルする(校正する)ことが可能となります。

by ichinose at 詳細 このエントリーをはてなブックマークへ追加

大阪DTPの勉強部屋

シン・隔週金曜勉強会

Tweet             今年もシン・隔週金曜勉強会を始めます。 テーマは「DTP作業を効率化するTips」 Illustratorがメインの人もIn […]

by えむ at 詳細 このエントリーをはてなブックマークへ追加

DTPの勉強会

【DTPの勉強会 第30回】4月6日開催のお知らせ

vol30_0406.jpg
DTPの勉強会 第30回を2019年4月6日(土)に開催します。
今回は「+DESIGNING VOLUME 47」の発売記念として、巻頭特集に関わった3名をお招きしての勉強会となります。
※3月21日9時、定員に達しましたので以降のお申し込みはキャンセル待ちとさせていただきます。
※3月25日1時、キャンセル待ちの方が20名に達しましたので受付を終了させていただきます。


■開催概要
日時:平成31年4月6日(土)13時30分〜18時30分(予定)
 受付開始:13時・会場クローズ:19時
場所:エッサム神田ホール2号館3階・大会議室(2-301)
定員:120名(先着順・要事前申込)
参加費:3,000円2000円(当日支払)
※当日資料として+DESIGNING vol.47を使用することがあるかもしれませんので、会場にお持ちになることをお勧めします。なお、会場での書籍の販売はありません。

【メインセッション】(90分×2セッション)
+DESIGNING VOLUME 47 発売記念①
「Back to CC Basics・Illustrator編」
Des47.jpg
[概要]
Creative Cloudの登場から5年、毎年バージョンアップが行なわれており、すでに6バージョンがリリースされました。その間、さまざまな機能強化や新機能が搭載され、使いかたも大きく変わろうとしています。
今回はIllustrator CCの登場以降に搭載された新機能や新UIについて解説し、Creative Cloud時代の効率的な使い方を紹介します。

[スピーカー]
1AT0SGIFYFGEBCCHB4SNROUEC0WFFF.png
カワココさんイラレラボ
ほぼ千葉な東京都在住。名古屋出身。デザイナーの職についてはや二十数年めです。
カタログやらパンフレットのアナログ時代を経験しつつDTPへ移行。
食品メーカーでパッケージデザイン等も経験し、ウェブデザインも黎明期から着手(まだネスケがvar.3.0だった頃から)、一時流行ったCD-ROMコンテンツ、eラーニングなどの制作なども経て、現在はフリーランスでウェブデザインとイラストを主に生計を立ててます。
得意分野はきっちりかっちりしたクリーンなデザインと、タッチが豊富なイラストの作成。
専門学校での講師や、勉強会、企業でのセミナーで壇上に立たせていただいたりもしています。

1AR1SK0PEA13WZ3SG0MYO3YNK31EFF.png
hamko(はむこ)さん
2010年より、DTPオペレーター・イラストレーターとしてフリーランスで活動中。
DTP・イラスト制作両方の観点から、見た目も構造も美しく、「後工程に迷惑をかけないデータ」を目指して日々模索しています。

【サブセッション】(30分)
+DESIGNING VOLUME 47 発売記念②
「Illustratorで作るワイヤーフレーム」

[内容]
Webでよく使われるワイヤーフレームですが、元々出版などで台割りや版下指定で長く使われてきました。今回はIllustratorのアピアランスを組み合わせてワイヤーフレームを作ってしまおうという、+DESIGNINGに掲載した1ページを30分に拡張して解説。さらに「できませんできませんイラレではこんなことできません。→できました」をデモします。

[スピーカー]
higuchi_photo.jpg
樋口泰行さん
グラフィックデザイナー。「さいたまデザインDTP勉強会」というワークショップ形式の勉強会を不定期で開催しています。色々な学校で講師をしたりセミナーをやったりもしています。令和元年5月にはTooさんの東京、仙台、札幌、大阪でセミナーに登壇予定です。 https://www.too.com/event/y2019/adobe_1905/

■懇親会
勉強会終了後、近くの居酒屋にて開催します。
場所:やきとりセンター 神田東口店
時間:19時〜22時(3時間・飲み放題)
会費:4,000円(勉強会当日に徴収させていただきます)

■お申し込み
3月12日(火)午後12時から参加受付を開始します。
皆様の参加を心からお待ちしております。

by DTPの勉強会(東京) at 詳細 このエントリーをはてなブックマークへ追加

ajabon

InDesign:段落群に定位置のタブストップを追加するやつ

ひとかたまりの段落群にまとめてタブストップを追加するスクリプトを書きました。 みんなで使いましょう。 場面ごとにタブ位置が異なり、段落スタイルではいちいち設定しきれない、する意味がない、 みたいなやつに便利かと思います。 […]

by AJABON GRINSMITH at 詳細 このエントリーをはてなブックマークへ追加

chalcedony

InDesignの索引をCSVに書き出す(CS2〜CS4)

駆け込み寺の掲示板でこんなスレがあって……
InDesign の索引作成について - DTP駆け込み寺 新掲示板 (リニューアル後のページにリンクしてます)
索引の生成時に、入力した読みがなを一緒に書き出せないかという要望でした。
ちょうど索引あたりをいじりまわす勉強中だったので、ごにょっとスクリプト書いて貼り付けてみるなどしたのですが、グループ化したオブジェクトや入れ子になってるテキストフレームに索引マーカーがある可能性を完全に忘れ去っていました(;´д`)ゴメンネ スレ主

というわけでリベンジなのです

(function(){

  var sepChar = "," // CSV用セル区切り文字(任意)
  var pageNumSepChar = " "; // ページ番号の区切り文字(任意、2文字以上でもOK)

  var tmpIndex = app.activeDocument.indexes[0];
  tmpIndex.update(); // 一度索引を更新してページ数などをソート

  var str = ""; // 書き出すテキスト

  // 索引項目すべてについて処理
  for (var i = 0, t_len = tmpIndex.topics.length; i < t_len; i++) {

    var tmpTopic = tmpIndex.topics[i];
    str += tmpTopic.name + sepChar;
    str += tmpTopic.sortOrder + sepChar;

    // 参照先すべてのページ番号を取得していく
    for (var j = 0, ref_len = tmpTopic.pageReferences.length; j < ref_len; j++) {

      // とりあえずマーカーのあるテキストフレームの親を取得してみる
      var tmpObj = tmpTopic.pageReferences[j].sourceText.parentTextFrames[0].parent;

      // PageオブジェクトじゃなかったらPageオブジェクトが得られるまでさかのぼる
      // グループ化したオブジェクトや入れ子のテキストフレームに対応するため
      while (tmpObj.constructor.name != "Page") {
        if (tmpObj.parent.constructor.name != "Story") {
          tmpObj = tmpObj.parent;
        }
        else {
          tmpObj = tmpObj.parentTextFrames[0].parent;
        }
      }

      str += tmpObj.name;

      // 参照先がまだ残っていたらページ番号区切り文字を入れる
      str += (j != ref_len-1) ? pageNumSepChar : "";
    }

    str += "\n"; // 改行

  } // 項目ループここまで

  // テキスト書き出し(ファイル名を指定して保存)
  var file = File.saveDialog("ファイル書き出し","CSVファイル:*.csv");
  if (file) {
    file.open("w");
    file.write(str);
    file.close();
  }

  return;

})();

Windows XP SP2、InDesign CS4でのみ確認。CS2〜CS4までは動くと思います。たぶん。CSは索引関係かなり違うので無理です。
グループ化とか、入れ子とか、表とかもこれで大丈夫なはず。たぶん。whileがちょっと怖いので、万が一使うときはESTK上で動かしたほうがいいかも(無限ループになっても止められるから)。
しかし、なんていうか……変数名ってみんなどうやって決めてるのかなー?

ページ数が倒せない

「あるオブジェクトが配置されているページ」を得るのが結構たいへんなのですね。なんでだろう。
テキストフレームのparentプロパティがPageオブジェクトになるということがわかったので、索引マーカーのあるinsertionPointを含むテキストフレームを探して一つずつループしています。
参考にしたのはこちら(CS用っぽい)。試行錯誤したあとで発見したのだけど、よく見たらまんまだわ……。
(DTPtechNote:1253) [AS Indesign CS] print-current-page.as

そーいえば

Fileオブジェクトまわりはまた今度まとめよう、とか言ったきりなのを思い出した(;´д`)
ていうか私の環境がCS4に移りつつあってやる気が、その、そのうち……。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

InDesign単体でも白オーバープリント

もしかして常識だったらどうしよう。まあ、自分メモとして書いておくことにしよう。
Windows版しかわからないのだけど、Macだとどうなんだろう?

InDesign単体なら大丈夫のはず

InDesignは白や紙色のオブジェクトにオーバープリント属性を設定できません。プリント属性パネルのチェックが触れなくなるし、もともと別の色でオーバープリントが設定されているのを白に変えると自動でチェックが外れます。CS2までは線と塗りの入れ替えによってオーバープリント属性が残ってしまう問題(参考:DTP-Sブログ-ひねもすデジタルビヘイビア: InDesignでも発生する白のオーバープリント)があったのですが、CS3からはその点も修正されています。

と思ったら、段落境界線に罠が

以下、Windows XP SP2、InDesign CS4(6.0.3)でやってます(CS1でも同様になります)。
私はこんな感じの囲み線を使った見出しをよく作ります。段落前境界線に色を設定し、段落後境界線を白にしてうまいこと重ねるとできます。(参考:2005-08-19 - 遠近法ノート
f:id:chalcedony_htn:20090702175753p:image
上に重ねる白い線の設定はこんな感じ。ちゃんとオーバープリントのチェックは触れなくなっています(なんか中に■があるけど、まあ、いいか)。
f:id:chalcedony_htn:20090702175754p:image
ここからが問題。たとえば配色に悩んでいて、いろいろいじっている間になぜかオーバープリントに設定してしまったりして……
f:id:chalcedony_htn:20090702175755p:image
やっぱ白でしょ、と色の設定を白に戻します。
f:id:chalcedony_htn:20090702175756p:image
オーバープリントのチェックは触れなくなり、最初の設定と同じ状態に見えます。
でも、ここでオーバープリントプレビューに切り換えてみると……
f:id:chalcedony_htn:20090702175757p:image
あばばばばば。真っ青です。

他にも

下線や取り消し線の色、あとは段落スタイル・文字スタイルの文字カラーなどでも同じようなことが起きています。文字カラーのほうはもっと恐ろしくて、チェックが完全に外れているように見えるのにオーバープリントになっています。
設定のON/OFFに関わらずパネルで同じように見えるっていうのは明らかにおかしいと思うんですけど、なんにしろオーバープリントまわりはやっぱり怖い((( ゚Д゚)))
CS4だとライブプリフライト機能で簡単に発見できるのが救いです……*1
やっぱり、よっぽどの理由がない限りオーバープリントは触っちゃだめってことですね。

*1:ただしデフォルトだとそこまで警告してくれない

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

Illustrator 10で、正規表現にマッチする文字が連続してるときだけトラッキングをかけるJavaScript

タイトル長い。

★追記:激重だったので修正版作りました!

どうにも入りきらないテキストをむりくりスペースに収めたいとき、かなの間だけ詰めたりすることがよくあります。それを自動でやろうっていうスクリプトです。俺得です。
Illustrator 10はダイアログを出したりできない(ぽい)ので、文字やトラッキング量の指定はスクリプトを書き換えて行います。10じゃなければ、「イラストレーターで正規表現とテキストの変形 - なにする?DTP+WEB」でもっとずっと高性能なものが配布されています。いいなあこれ使いたいなあ……。

// 正規表現にマッチする文字が並んでるときだけ指定量トラッキング
// 選択したテキストオブジェクト(TextArtItem)について処理します。複数選択対応。
// 下の例だと、「正規表現にマッチする」を処理した場合は
// 「マ」「ッ」に-20のトラッキングがかかります。
// すでにトラッキングが設定されている場合は現状から増減します。

(function(){

// ----------------------------

  var amount = -20
  var charClass = "[ァ-ン]"; // エスケープとかは自分でやってね

// ----------------------------

// 以下本体 =================================================

  if ( selection.length == 0 ) { alert("何か選択してください"); return; }

  var sel = selection;
  var rex = new RegExp(charClass,"g");
  var rex2 = new RegExp(charClass);

  for ( var i = 0, len = sel.length; i < len; i++ ) {
    var tmp = sel[i];

    if ( tmp.typename != "TextArtItem" ) {
      alert("テキストじゃないので飛ばします");
      continue;
    }

    tmp = tmp.textRange(); // textRangeオブジェクトに変更

    var contents = tmp.contents;
    var characters = tmp.characters;

    var m = [];
    while ( m = rex.exec(contents) ) {
      var index = m.index;

      if ( index == characters.length - 1 ) { break; } // 最後の文字ならループ抜ける

      var tc = tmp.characters[index];
      var nc = tmp.characters[index + 1];

      if ( !nc.contents.match(rex2) ) { continue; } // 次が違う文字クラスだったらパス

      tc.tracking += amount; // ★

    } // whileループここまで

    rex.lastIndex = 0; // 検索開始位置リセット

  } // 選択オブジェクトループここまで

  alert("おしまい!");

})();

例によってエラーとかまじめに気にしてないです。

★のついてる行を書き換えれば、文字単位の属性にはいろいろ使いまわせる(んじゃないかな)と思います。
ちなみにトラッキングでなくカーニングを使いたい場合(あるんかな)には注意が必要で、

tc.kerning += (amount / 1000); // ★

と書き換えないととんでもない量になります。文字パレットと単位が違うんですね……。
この単位の違い、リファレンスを見る限りCS2から解消されています。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

(修正版)Illustrator 10で、正規表現にマッチする文字が連続してるときだけトラッキングをかけるJavaScript

まさかの2日連続投稿ですが、ただの続きです。

昨日のスクリプトですが、せっかく正規表現を使っているのになぜか一文字ずつ検索していました。あほか。
一応動くとはいえ文字が多くなると激重だったので、勉強もかねて書き直したものが下です。パフォーマンスの改善に加えて、せっかくなので相対値だけじゃなくて絶対値指定? もできるようにしました。

// 正規表現にマッチする文字が並んでるときだけ指定量トラッキング
// 下の例だと、「正規表現にマッチする」を処理した場合は
// 「マ」「ッ」に-20のトラッキングがかかります。

// 09.08.06修正
// ・一文字ずつ現在値から増減するか、全文字を指定した値に変更するか、選べるようにしました
// ・動作が劇的に速くなりました

(function(){

// ----------------------------

  var amount = -20
  var charClass = "[ァ-ン]"; // エスケープとかは自分でやってね
  var relative = true; // true: それぞれ現在値から増減 false:すべて指定した値に変更

// ----------------------------

// 以下本体 =================================================

  if ( selection.length == 0 ) { alert("何か選択して!"); return; }

  var sel = selection;

  charClass += "+"; // 量指定子追加
  var rex = new RegExp(charClass,"g");

  for ( var i = 0, len = sel.length; i < len; i++ ) {
    var tmp = sel[i];

    if ( tmp.typename != "TextArtItem" ) {
      alert("テキストじゃないので飛ばします");
      continue;
    }

    tmp = tmp.textRange(); // textRangeオブジェクトに変更

    var contents = tmp.contents;

    var m = [];
    while ( m = rex.exec(contents) ) {
      var index = m.index;

      if ( index == contents.length - 1 ) { break; } // 最後の文字ならループ抜ける

      var range = tmp.textRange(index, rex.lastIndex -2); // 見つかった文字列の、最後から2番目の文字まで

      // 相対指定かどうかで処理を分ける。
      // relativeがtrueのときは現在の値を増減するので一文字ずつ処理する
      if ( relative ) {
        var chars = range.characters;
        for ( var j = 0, c_len = chars.length; j < c_len; j++ ) {
          chars[j].tracking += amount;
        }
      }
      else {
        range.tracking = amount; // 絶対量ならいっぺんにいける
      }

    } // whileループここまで

    rex.lastIndex = 0; // 検索開始位置リセット

  } // 選択オブジェクトループここまで

  alert("おしまい!");

})();

要するに、量指定子を使ってトラッキングをかける範囲をダイレクトに取得するようにしたってことです。おかげで次の文字がどうとか判定する必要もなくなり、RegExpオブジェクトを一つにしぼれました。うーん、昨日の自分が何を考えていたのかわからない。
相対値でなく全部同じ値にする場合はtextRangeオブジェクトのtrackingプロパティを使えば一文字ずつ処理する必要がなくなるので、より速くなります(よほど大量にヒットしなければ大差ないですが)。
ただ、一つの状況に最適化すると応用が利かなくなるというわけで、characterオブジェクトにあってtextRangeオブジェクトにないプロパティを操作したい場合にはいろいろ書き換えが必要になってしまいますね。たいしたことないけど。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

正規表現の先読みと後読みはどっちがどっちだかわかりにくいんだよ!(追記あり)

といつも思うので、自分用にメモすることで覚えようという魂胆です。
以下はInDesign CS4の正規表現について記述します(たしかCS3から使えたような気がする)。

結論から

名前 英語で 位置 演算子
後読み lookbehind マッチパターンよりの部分 (?<=) 肯定
(?<!) 否定
先読み lookahead マッチパターンよりの部分 (?=) 肯定
(?!) 否定

肯定の場合はパターンの前が「=」、否定の場合は「!」。
英語を見ると「後読み」「先読み」の訳語も納得できそうな気はするのですが、やっぱりわかりにくいです。背後と前方……とか言うとまた混ざるし!
「つぎの電車」と「こんどの電車」はどっちが早く発車するかみたいな感じに似ていますな。
別に演算子さえ覚えてしまえば名前は意識しなくてもよさそうなのですが、せっかくInDesignには正規表現の記述支援機能がついてるので、どうにか慣れておきたいところです。

先読みと後読みは便利

テキストデータがあって、あるパターンをもった文字列を探したいけど、その中でも「後ろに/前に決まったパターンの文字列がある場合だけ」マッチさせたい、みたいなときに活躍します。
例えば「2009年9月7日19時00分〜9月17日8時30分」とかいうテキストがあって、「○時」の数字だけ取り出したい場合は「直前に『日』があって、直後に『時』がある1桁以上の数字」を検索できればOK。
これを正規表現で書くと

(?=日)\d+(?=時)

こうなります。

(?=日) 後読み部分
\d+ マッチ部分
(?=時) 先読み部分

ですね。

先読みと後読みは便利その2

先の例、検索で場所を探したいだけなら、実は後読みだの先読みだの考える必要もなかったりします。

日\d+時

だけでも検索には引っかかる。
ただし、そのときのマッチ文字列は「日19時」と「日8時」。一方先読み/後読みを使った場合、マッチ文字列は「19」「8」になります。先読み/後読みの部分は除外されてます。
この差は大きいです。例えば見つけた数字の修正をしたい場合でも、前者だと数字のところまでカーソルを動かさなければなりませんが、後者ならそのまま数字を打ち込めばいいわけです。
もしくは、数字の部分だけに文字スタイルを適用したい場合も、後者ならば置換文字列に「$0」(「見つかったテキスト」)を入力して、置換形式のところで文字スタイルを指定して置換すればいいだけ。いちいち数字部分を選択しなおしてスタイル適用、が必要ありません。

あと、例のアレ

CS4の「正規表現スタイル」。これを使うときはスタイルを設定したい文字列だけを厳密に取り出す必要があるので、先読み/後読みの使いこなしが前提になりますね。
正規表現スタイルは非常に気に入っている機能*1なので熱く語りたいところですが、まあ、いつかそのうち。

これだけ書けば

いい加減私のスカスカな脳ミソでも覚えただろう(`・ω・´)

『後読みが前、先読みが後ろ!』 ……やっぱりわかりにくい!! ><

追記(2009/09/08)

id:seuzoさんからコメントをいただいて、もうちょっとだけわかった気がしたので追記しておきます。

「後読み」のことを「戻り読み」ともいいます。

(?=re)先読み指定があると、
まだ読んでいない部分を先読みしてマッチしたら全体のマッチを成功させます。
(?=re)後読み指定があると、
マッチ部分の後ろまで戻って、マッチしたら全体のマッチを成功させます。

       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
    /  `´  \
     ('A`)
     ノヽノヽ
       くく

こうかな?
f:id:chalcedony_htn:20090908181152j:image
マッチ部分を基準にして、データ処理の流れの「先を読む」か「後ろに戻る」か。
やっぱり英語のほうがわかりやすい気がするけど*2、これでなんとか覚えられそうです。日本語ムズカシネー

*1:実を言えばCS4導入の一番の動機がコレ

*2:日本語の場合「先手」「後手」という言葉もあるし、って自分で混乱させているな

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

InDesignのセクションマーカーを一括登録するJavaScript(CS〜)

セクションマーカーを入力していく手間をちょっとだけ省きます。すでにセクションは作成されていることが前提です。
自分の作業で使うために作ったので汎用性は微妙ですが、あまりにブログを書いてないのでたまには更新しようと思い立った次第。

実行するとこんなダイアログが出るので、カンマ区切りで入力します。
f:id:chalcedony_htn:20091112205933p:image
数が足りないと怒られます。
動作確認はWindows版CS4でしかしていませんが、たぶんCS以降なら動くんじゃないかと……

(function(){

  var defaultArrStr = "1,2,3,4,5,6,7,8,9";

  var secs = app.activeDocument.sections;
  var secsLength = secs.length;

  var dlg = app.dialogs.add({name:"セクションマーカー一括設定"});
  var col = dlg.dialogColumns.add();
  
  col.dialogRows.add().staticTexts.add({staticLabel:"セクションマーカーを入力してください。"});
  col.dialogRows.add().staticTexts.add({staticLabel:"半角カンマ区切りで " + secsLength + " 個以上必要です。"});
  var textbox = col.dialogRows.add().textEditboxes.add({editContents:defaultArrStr,minWidth:200});

  var getArr = function(){
    if( dlg.show() ) {
      var arr = textbox.editContents.split(",");
      if ( arr.length < secsLength ) {
        alert("マーカーの数が足りません!");
        getArr();
      }
      else {
        return arr;
      }
    }
  }

  var markerArr = getArr();

  if ( !markerArr ) { return; }

  for ( var i = 0, len = secs.length; i < len; i++ ) {
    secs[i].marker = markerArr[i];
    alert("セクション「" + secs[i].marker + "」 : " + secs[i].pageNumberStart + "ページから");
  }

  dlg.destroy();

})();

コメント入れるのサボってます。

最初のdefaultArrStrの値を変えると、ダイアログにあらかじめ入力されてるテキストが変わります。
このあたりもうちょっとまじめに作りこんだら使い勝手が良くなる気がします……特定のスタイル(見出しなど)のついたテキストを自動で放り込むとか。そもそもそのスタイルついてたらセクションを自動で作成するとか。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

せっかくだから2009年を振り返ってみる

ほんとは年内にあと一回くらい更新しようと思っていたけど、ぐずぐずしてたら大晦日になってしまいました。


今年はアウトプットの年にしようと突然思い立ち、このブログをはじめたりTwitterでつぶやいたりソーシャルブックマークでコメントを書いたり(これは前からやってたけど)してみました。
そうやってWeb上で活動をはじめたのをきっかけに、DTP Boosterなどの勉強会に参加したりオフ会に行ったり飲みに行ったりと、Webで知り合った人たちと会う機会が多くなりました。実はこれは引きこもり気質の私には予想外の展開で、今でもわりと信じられません。
たぶん一年前の私が今の私を見たら「あんた誰だ」って言うに違いない……


こうして振り返ってみると、アウトプットしようと思って活動をはじめた結果、むしろインプットが非常に多くなった年でした。
書くためにいろいろ調べたり、勉強会に出たり、飲みに行ったりして非常にたくさんの知識を得た……のは確かなのですが、実はそれだけではなくて。
この一年でインプットされた一番大事なものは、「意欲」だと感じています。
私のモチベーションに火をつけてくださった方々、直接お会いできた方もこちらが一方的に知っているだけの方もいますが、本当に感謝いたします。


ちゃんと勉強してみると知らないことばかりで恥ずかしくなり、もっと早くこのやる気が出ていればーとか今まで何してたんだーとか何年無駄にしたんだーなどと思うばかりですが、考えても仕方ないので今はこのまま突っ走ります。




……ということで、来年はもうちょっとまじめにこのブログでのアウトプットを増やそうかな……。まだはてダ市民にさえなれてないよ!

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

InDesignで複数のスウォッチの色を一括で切り替えるJavaScript

たくさんあるスウォッチの色を頻繁に切り替えたいとき、手作業や別ドキュメントからの読み込みをするのがものすごく面倒になった*1ので作りました。
ScriptUIを触ってみたかったのでCS3/CS4のみ対応です(たぶん)。動作確認はWindows XP SP3 InDesign CS4(6.0.4)でしか行っていません。

(function(){

  if ( app.documents.length == 0 ) { alert("ドキュメントが開かれていません"); return; }

  // スウォッチの設定セットをつくる
  var colorSetArr = [
    { name  : "見出し1用",
      cmyk  : [  0,100,100,  0],
      black : [  0,  0,  0,100],
      set3  : [ 20, 20, 20,100] },

    { name  : "見出し2用",
      cmyk  : [  0,  0,100,  0],
      black : [  0,  0,  0, 50],
      set3  : [ 10, 10, 10, 40] },

    { name  : "見出し3用",
      cmyk  : [100,  0,100,  0],
      black : [  0,  0,  0, 60],
      set3  : [ 10, 10, 10, 50] },

    { name  : "見出し4用",
      cmyk  : [100, 50,  0,  0],
      black : [  0,  0,  0, 70],
      set3  : [ 10, 10, 10, 60] },

    { name  : "見出し5用",
      cmyk  : [ 50,100,  0,  0],
      black : [  0,  0,  0, 60],
      set3  : [ 10, 10, 10, 50] }
  ];

  // モード識別準備
  var mode = "";

  // ダイアログの内容を作成
  var dlg = new Window("dialog", "モード選択");
  dlg.add("statictext", undefined, "どの設定に変換しますか?");
  dlg.btn1 = dlg.add("button", undefined, "カラー");
  dlg.btn2 = dlg.add("button", undefined, "モノクロ");
  dlg.btn3 = dlg.add("button", undefined, "設定3");
  dlg.btn1.onClick = function(){ mode = "cmyk"; dlg.close(); }
  dlg.btn2.onClick = function(){ mode = "black"; dlg.close(); }
  dlg.btn3.onClick = function(){ mode = "set3"; dlg.close(); }

  // ダイアログを表示
  dlg.show();

  // キャンセルされてたらここで処理終了
  if ( mode == "" ) { return; }

  var actDoc = app.activeDocument;

  // 各スウォッチの色設定をモードに応じて変更する処理
  for ( var i = 0, len = colorSetArr.length; i < len; i++ ) {
    var tmpSet = colorSetArr[i];
    try {
      var targetColor = actDoc.swatches.item(tmpSet.name);
      targetColor.colorValue = tmpSet[mode];
    } catch(e) {
      alert("スウォッチがみつかりません: " + tmpSet.name); // エラー処理(手抜き)
    }
  }
  
})();

f:id:chalcedony_htn:20100323195343p:image
↓↓↓
f:id:chalcedony_htn:20100323195342p:image
スウォッチは名前で識別しています。
処理するスウォッチの数やモードの数は増やすことができます。外部に設定ファイルを作ってそれを読み込んで……とかも考えたのですが、それはそれで面倒なので直打ちで。
設定を変更したいときに修正する箇所をもっと減らす方法はないかなあ。

2010.3.24 追記:スクリプトの38行目、「staticText」→「statictext」に修正しました。ご指摘下さったmilligrammeさん、ありがとうございました。

そういえば

今年最初のエントリでした。あけましておめでとうございます?
前回あんなことを言っておいてこの体たらくですが、一応、オンラインブックマーク等でコメントは積極的にしているのです……でも100のブクマより1のブログエントリ、という気もしています。

*1:3回くらい繰り返したあたりで(早

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

InDesignのスウォッチ色設定切り替えスクリプトをウィンドウにしてみる

こないだのスクリプトをちょっと改造してみました。
実行のたびにダイアログを生成するのではなく、一度実行したら(閉じない限り)InDesignを終了させるまでずっと表示されたままになるウィンドウを作ります。その他、ちらほら修正など。
例によって動作確認したのはWindows XP SP3 InDesign CS4(6.0.4)のみです。

#target "InDesign"
#targetengine "changeSwatchColor"

(function(){

  if ( app.documents.length == 0 ) { alert("ドキュメントが開かれていません"); return; }

  // スウォッチの設定セットをつくる
  var presetColorArr = [
    { name  : "見出し1用",
      cmyk  : [  0,100,100,  0],
      black : [  0,  0,  0,100],
      set3  : [ 20, 20, 20,100] },

    { name  : "見出し2用",
      cmyk  : [  0,  0,100,  0],
      black : [  0,  0,  0, 50],
      set3  : [ 10, 10, 10, 40] }

    // 長いので省略
  ];

  // ダイアログ(ウィンドウだけど)の内容を作成
  var dlg = new Window("window", "スウォッチ色変更");
  dlg.add("statictext", undefined, "どの設定に変更しますか?");
  dlg.add("button", undefined, "カラー").onClick = function(){ changeColor("cmyk"); }
  dlg.add("button", undefined, "モノクロ").onClick = function(){ changeColor("black"); }
  dlg.add("button", undefined, "設定3").onClick = function(){ changeColor("set3"); }

  // ダイアログを表示
  dlg.show();

  // 各スウォッチの色設定をモードに応じて変更する処理
  // ボタンを押すと、この関数が実行される
  var changeColor = function(mode){
    var actDoc = app.activeDocument; // ボタンを押した時点のアクティブドキュメントを処理するのでココ
    for ( var i = 0, len = presetColorArr.length; i < len; i++ ) {
      var tmpSet = presetColorArr[i];
      try {
        var targetColor = actDoc.swatches.item(tmpSet.name);
        targetColor.colorValue = tmpSet[mode];
      } catch(e) {
        alert("スウォッチがみつかりません: " + tmpSet.name);
      }
    }
  }

})();

私が使うときには複数のファイルに同じ設定をどんどん適用していくことになるので、いちいちダイアログを呼び出すのは面倒だなーって思ってこの形になりました*1
あと、せっかく覚えたのでウィンドウを作ってみたかった。これだったら、最初の起動時にスウォッチの設定セットを書いた外部ファイルを読み込むようにするのもありかもしれない。

ウィンドウの使用にはtargetengineの指定が必要です。最初の文はそれ。このスクリプトをESTKで実行するにはちょっと注意が必要ですね。
参考:Double-talk Publisher お手元系スクリプト考

ところで、applicationオブジェクトからたどって作るダイアログは使い終わったら破棄(destroy)すべしと言われてるけど、ScriptUIで作る場合はどうなんだろう?
そのへんよくわからないで作っています。(だめじゃん……)

*1:開いてるすべてのドキュメントに一発で適用してもいいけど、1ファイルずつ確かめながら実行したいんだ……

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

DTP Booster 013に行ってきた

Adobe CS5の発売にあわせて表参道で行われているイベント群、その中で3日連続で開催されたDTP Boosterの最終日のセミナーを受講してきました。
テーマは「スクリプト(入門)」。
私もなんとかスクリプトを自作するところまでは来ているので、自分のためというよりは「スクリプトの有用性をどう伝えるか」っていうところを知りたくて参加しました。……こう書くと偉そうだな! 自分のためでもありましたよもちろん!
セミナーの詳しい内容については、リアルタイムで配信されていたUstreamの録画映像がありますのでこちらで。いい時代ですなあ*1

IllustratorJavaScriptでつくるおしゃれアートワーク(秋葉 秀樹氏)

タイトルはIllustratorですが、まずはCS5からInDesignにも対応するようになったAdobe Configuratorの紹介から入っていました。以前東京DTPの勉強会第0回で樋口 泰行氏が紹介されていたものです。2.0にバージョンアップして、メニュー名などが日本語になったそうです。
Adobe Configuratorの何がいいって、とにかく「作りやすい」ことだと思います。いつも使っている機能をポイポイとドラッグ&ドロップしてボタンの形で配置すれば、それだけで便利なパネルが作成できてしまう。「アプリケーションをデフォルトのまま使うのではなく、自分用にカスタマイズする」という行為のとっかかりとしては最適じゃないでしょうか。更にスクリプトFlashの知識があればもっと便利な物が作れるわけだし。
問題は今のところ最新のCS5でもPhotoshopInDesignのみ対応ということですね。むしろこれIllustrator向きの機能じゃないかと思ったりするのですが、予定は未定だそうです。

そして予告されていたIllustratorでのランダムちりばめ系スクリプトの作成について。実際にコードを書きながら、実行しながらの解説でした。
ランダムな数を返す関数を自分で作ってそれを利用したりとか、イチから覚えようとしたらそこそこ難しいところじゃないかと思うんですが、そこをさらりと流して難しさを感じさせず、「何が出来るか、何が起こるか」を見せてくれていたと思います。
セッションの最後で実演された、たくさんの種類のシンボルをちりばめて「おもちゃ箱をひっくりかえしたような」オブジェクト群を作るところでは、(私も含めて)会場のあちこちから歓声が上がりました。あの技はそのままデザインにも使えそうです、というか明日さっそく使う気満々です。ちょうど使えそうな仕事があるんだこれが。ラッキー(・∀・)

とにかく進行のスムーズさが印象的でした。あれだけよどみなく説明しながらコード書けるとか凄い。詳しく説明しないことでわかりやすくなるってこともあるんだなあと非常に勉強になりました。真似は出来そうにないけど!

DTP作業を楽にするスクリプト入門(たけうちとおる氏)

まず怒濤のスクリプト紹介から始まりました。InDesignIllustratorを対象に、テキスト処理系、画像配置系、パス描画系、面付け系と多岐にわたるスクリプト群を次々に実演。
いろんなことできるよなあ……と感心しつつ、私が気になったのはInDesignスクリプトパネルにフォルダに分けて収められた大量のミニスクリプトでした。たとえば(実演にも含まれていましたが)表組の線幅を決められた値に変更するためだけのものとか。確かに実際自分で使うときは、GUIでいちいち数値を設定して実行ボタンを押すよりも、数値などの設定を決め打ちにした小さなスクリプトを必要に応じて選んで実行するほうが手間が少なかったりします*2。単機能のものなら作るのも楽だし。

その後は、楽しみにしていたスクリプト作成の実演。事前に出ていたお題*3「PDF書き出しスクリプト」を試行錯誤しながら作るという内容です。
要件を整理し、わかるところから書き始め、わからないところはオブジェクトモデルビューアを使用したりネットで検索したりしながら書いていく。ある程度まとまったところまで書いたら実行してみて、エラーが出たらその内容を見て修正、さらに書き進める、という、まさに試行錯誤の過程をそのまま見せてくださいました。
実は、講義を聴く前に私もこのお題に挑戦していました。エラーばかり出て思った以上に苦労したのですが……今日の講義を聴いてみてびっくり。私がわからなくて調べた箇所、書く順番、やらかしたエラー、それらがほとんど同じだったのです。ちょっと嬉しかったですね。
自動処理系の本に書いてあるスクリプトやネットで検索して見つかるスクリプトは、たいていの場合すでに整理されてそのままコピーすれば使えるようになっています。そのおかげで便利に使えるわけですが、真似して書いてみよう! と思う学習者からすると、模範解答があまりに完成されている場合「これ、どっからどう書いたらいいんだろう。そもそもどこから読めば……」と思ってしまったりすることがあります。その意味で今回のセッションはとても参考になる、そしてとても勇気づけられるものでした。失敗しながらでいいんだ!

ついでに、せっかくだから

次の記事で、たけうちさんの出された「お題」に対する私の回答を発表しようと思います。それもただ書くだけではもったいないと思い、作成過程で何を考え何をやらかしたかすべて書き留めておいたものを、そのまま。いわば実況形式です。
後出しジャンケンのようですが、実際書いた時のまま無編集で載せますのでOKということにしてください。
……しかし、書いてたときは意図も想像もしてなかったことだけど、セッションの内容とダダ被りなんだよなあ。あんまり意味がないかもー(´・ω・`)

*1:Ustでの公開と参加費負担についてはなかなか難しい問題なのでしょうが……

*2:ただ、Illustratorの場合はスクリプトパネルが用意されてないので……

*3:私は勝手にInDesignだと思いこんでいて実際その通りだったのですが、実は対象アプリケーションについては明記されていなかったらしいです

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

DTP Booster 013の予習:スクリプト作成過程を実況してみた

注:この記事の内容は、アップの数日前(DTP Booster 013受講前)に書かれたものです。アップするかどうか受講後に悩みましたが、結局貧乏性(モッタイナイ)に負けて載せてしまうことにしました。


参加予定のDTP Booster 013(Omotesando/100602)スクリプトがテーマ。
事前に講師のうちのお一人であるたけうちとおる氏がブログでお題を出されていたので、せっかくだから先に挑戦してみることにしました。
いい機会なので、以前からやってみたいと思っていた「スクリプト作成過程の公開」をしてみます。なんのために? もちろん自分のために。アウトプットは人のためならず。
セミナー前に書いておいて、セミナー後に無編集でアップする予定です。調べたり考えたり失敗したり、とにかく全部書きとめていくので凄まじく長いです。結果だけ見たいという場合はここから飛べます。

JavaScriptで、InDesign CS4で動くことを目指して作成します。動作確認はWindows XPInDesign 6.0.5のみで行います。

まずは、お題を読む

「開いているドキュメントをすべてPDF書き出しする」スクリプトを作って下さい。

DTP Booster 13のお題 - たけうちとおるのスクリプトノート

シンプルだ。そして実用的。
たぶんスクリプト書く人ならとっくに自分で作っていそうな気がするし、作らない人でもWebで公開されている数々のありがたいスクリプトを利用しているのではないかと思う。私は一つずつドキュメントを確かめながら書き出していくから使ってなかったけど。
っていうかそもそもたけうち氏のブログに置いてなかったっけ、と思って調べたら案の定ありました。ダイアログの出る親切設計。でもお題なので、今だけ見なかったことにしよう。

この時点で、この処理を実現するには「PDFを書き出す処理を」「開いているドキュメントすべてに対して繰り返し行う」という形のスクリプトになるなあとぼんやり考える。
繰り返し処理は基本なので簡単。開いているドキュメントをすべて取得する方法もわかる。あとはPDF書き出し処理か……どうやって書くんだっけかな。一度調べようとしたことがあるはずだけど、もう完全に忘れ去りましたね。

お題をさらに読む

書き出すPDFの設定その他について追記がありました。

書き出されるPDFはドキュメントと同じファイル名で(拡張子が.pdfになる)同一階層に保存されるとします。

とりあえず、処理するドキュメントのファイル名(と、たぶんパス)を取得する必要があるっぽい。

PDF書き出しプリセットは「PDFx/1-a」です。

たぶん書き出しするメソッドにプリセットを指定する引数があるんだな……などと、普通はリファレンス見てから知ることだけど今回はヒントのおかげで知る。でも具体的な指定方法はやっぱり調べないとね。

PDFを書き出したドキュメントは保存せずに閉じます。

ふむ。これはとりあえず書き出しが終わった後のことだから後で考えよう。

20行以内で出来ると思います。
多少のエラー処理はしなくて結構です。

行数指定きたー。でもあんまり気にしないでおこう。ただの目安と思っておく。
多少のエラー処理っていうのは、たぶんドキュメントがひとつも開かれていない場合とかそんな感じのことだろう。お言葉に甘えてそのへんはざっくり省略することに。

わかるところから書き始めてみる

なんとなく方向性がみえたところでおもむろに書き始めます。
まずは骨組みとしてドキュメント取得と繰り返し処理の部分を用意。後で必要になる処理をコメントで書き込んでおこう。

var docs = app.documents; // 現在開いているすべてのドキュメントを得る

// ドキュメントの数だけループ
for( var i = 0, docLen = docs.length; i < docLen; i++ ) {
  var tmpDoc = docs[i]; // 今処理してるドキュメント

  // ★ドキュメントのPDF書き出しを実行

  // ★ドキュメントを閉じる(保存しない)

} // ここまでループ

forループのときに繰り返す回数を変数に入れておくのは癖のようなもの。処理中のオブジェクトを変数に入れておくのも同じ。プロパティへのアクセスは結構時間がかかるものなんだとWebな人たちから聞いたので。この程度だと大して変わらない気がするけど。

あとは、★のついたところを埋めていくだけだな!

PDF書き出し処理はどう書くの

というところがわからないので、ここでリファレンスの出番です。ESTK付属の「オブジェクトモデルビューア」を起動。表示するオブジェクトモデルで「InDesign CS4(6.0)」を選ぶのを忘れずに。
「書き出し」ってくらいだからたぶんexportとか検索したら出てくるんじゃないの、と試しに検索してみたところ、

検索結果が多すぎます。検索内容を絞ってください。

(ノ`Д´)ノ彡┻━┻

……気を取り直して続ける。
「ドキュメントを」PDFファイルに書き出すって動作をすることになるので、たぶんDocumentクラス(クラスでいいのかな*1)のあたりにそういうメソッドが用意されてるんじゃないかと予想を立てる。このへんはただの勘のようなもので、なぜそう思ったか説明できない……ちなみに、この予想が外れたりそもそも見当がつかなかったりした場合は潔くぐぐります。

ともかく、まずはDocumentクラスを調べてみる。オブジェクトモデルのブラウザでDocumentを選び、下に出てくるメソッド群からexportっぽいものを探す。ありました。「exportFile」メソッド。

Document.exportFile (format, to, showingOptions, using, withGrids, versionComments, forceSave)


Exports the object(s) to a file.

オブジェクト(この場合はドキュメント)をファイルに書き出す。そのままだ。
あとは引数の正体を調べる。

引数 引数の型 意味
format - 書き出すファイルの形式。
to File 書き出すファイル。
showingOptions Boolean オプション。書き出しのときダイアログを出すかどうか。デフォルトはfalse。
using PDFExportPreset オプション。書き出し方式。ここがPDFの書き出しプリセットっぽい。
withGrids Boolean オプション。グリッドを書き出すかどうか。デフォルトはfalse。
versionComments String オプション。このバージョンのためのコメント?
forceSave Boolean オプション。強制的に上書き保存するかどうか? デフォルトはfalse。

最後のほう適当ですがあんまり関係なさそうなので……というか、普段こんなきっちり考えない。使いそうな引数だけ拾い読みですよ。英語だし。

ということで、このメソッドを実行するときにPDF形式を選べるようだ。「ファイル名」と「プリセット」も設定できそう。

PDF形式で書き出す指定

引数formatのところでPDF形式で書き出すよう指定するらしい。リファレンスには「Can accept: ExportFormat enumerator or String.」と書いてある……文字列で指定できるようだけど、きっと適当に「PDF」とか書いてもダメなんだろうな。
とりあえず「ExportFormat」をオブジェクトビューアで検索して、同名のクラスに「PDF_TYPE」ってプロパティがあるのを発見。たぶん、これを書けばいいんだと思う。やってみてダメだったらぐぐろう。

Fileオブジェクト?

出たな妖怪! いや妖怪じゃないけど、個人的にいまだに理解しきれない領域、それがFileとFolder。
書き出しメソッドの引数toには、書き出すファイルのFileオブジェクト(Fileクラスのインスタンス? っていうの?)を用意しなきゃならないらしい。
Fileオブジェクトを生成する方法は、

var fileObj = new File("ファイル名まで含んだパスの文字列");

でいいはず。この場合に必要な文字列は、「ドキュメントのファイルパスから拡張子を取り除いた文字列」+「.pdf」。
というわけで、まずは処理中のドキュメントのフルパスを取得しなければ。

var tmpDocFileObj = tmpDoc.fullName; // tmpDocは処理中のドキュメント

fullNameプロパティの値はFileオブジェクトらしいのでそのままでは使えない。さらにこのファイルのフルパスを取得。

var fileStr = tmpDocFileObj.fullName; // tmpDocFileObjはさっき取得したFileオブジェクト

さっきと同じfullNameって名前のプロパティだからややこしいけど、これで処理中のドキュメントのファイルパスが文字列で取得できたことになる。
でもって、これだと変数fileStrには拡張子「.indd」までついているはず。なのでそれを取っ払って、拡張子「.pdf」をくっつけてやらないといけない。
後ろ5文字削ってから足してもいいけど、ここは正規表現置換といこうじゃないか。*2

// 行末にある「.(なんでもおk)」を「.pdf」に置換
fileStr = fileStr.replace(/\.[^.]*$/,".pdf");

これでやっと、書き出すPDFファイルのFileオブジェクトを作ることができる。

var fileObj = new File(fileStr); // fileStrは(以下略

せっかくだからここまでの過程を一行にまとめてみよう。

// tmpDocは処理中のドキュメント
var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));

このfileObjを、書き出しメソッドの引数として使えばいいはずだ!

さっきかららしいとかはずとかばっかり。手探りでやってるから仕方ない。
でも正直、今書いている過程でちょっと理解が進みました。とりあえず今回の妖怪は退治できた……かな?

PDF書き出しプリセット

最後の大物、書き出しプリセットの指定。例によって「PDFExportPreset」をオブジェクトモデルビューアで検索してみる。どうでもいいけどこの検索窓、テキストのペーストがうまくいかないですね。いちいち手打ち……
Applicationオブジェクトのプロパティに「pdfExportPresets」を発見。複数形ってことはたくさんあるプリセットが全部ここにまとまって入ってるんだろう。その中から目的のプリセット「PDFx/1-a」を取り出して使う。
オブジェクトのコレクション(っていうの?)から目的のオブジェクトだけを取得する方法はいくつかあるけど、今回は名前をキーにして取得することになる。

var preset = app.pdfExportPresets.item("PDFx/1-a");

このへんの書き方はどのクラスでもたいてい同じ。itemメソッドの引数はインデックスの数字でも名前の文字列でもOK。他にitemByNameってメソッドもあって、そちらは名前の文字列だけが使えるんだけど……itemメソッドで充分な気がするのに、なんで用意されてるんだろう? まあいいか。

材料が揃ったので

PDF書き出し処理のところを書いてはめ込んでみよう。
あ、忘れてたけどshowingOptions(書き出すときダイアログを出すかどうか)の値はfalseにしておくことにします。それ以外の必須でない引数は省略。

var docs = app.documents; // 現在開いているすべてのドキュメントを得る

// ドキュメントの数だけループ
for( var i = 0, docLen = docs.length; i < docLen; i++ ) {
  var tmpDoc = docs[i]; // 今処理してるドキュメント

  // 今回追加した部分ここから ------------------------------

  // 書き出すファイルのFileオブジェクトを作成
  var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));
  // プリセットのオブジェクトを取得
  var preset = app.pdfExportPresets.item("PDFx/1-a");

  // ドキュメントのPDF書き出しを実行!
  tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, false, preset);

  // 今回追加した部分ここまで ------------------------------

  // ★ドキュメントを閉じる(保存しない)

} // ここまでループ

ドキュメントを閉じるのは後回しで、とりあえずこれが動くかどうかやってみよう(`・ω・´)
ESTKに貼り付けて、適当なinddドキュメントを4つくらい作って開いて実行!

イベント 'exportFile' のパラメータ 'using' の値が無効です。予想される値は PDFExportPreset ですが、値 nothing を受け取りました。

( ゚д゚)...

なにか間違えたようです。

修正しよう

エラーメッセージを見るに、プリセットのあたりで間違えているらしい。スペルミスはないと思うんだけど。
実際に処理が止まってしまった(エラーで赤く染まった)行は、書き出し実行のところ。ということは、プリセットがきちんと取得できてなかった(ので、変数presetの値がnothingだった)ということだろう。その原因は……あっさり判明。

( ´д`)...プリセットの名前、違うじゃん。

お題で指定されたのは確かに「PDF/X-1a」だけど、私の環境ではInDesignにこの名前のPDF書き出しプリセットはなかった。そりゃあ動かないわ。お題に従うならこのコードであってるけど、とりあえず動かすには修正しなくちゃ*3
ということで、InDesignのPDF書き出しプリセットメニューを見て、(デフォルトで用意されてる)PDF/X-1aで書き出すプリセットの名前を調べる。「[PDF/X-1a:2001 (日本)]」、これだな(Win版InDesign CS4の場合)。

var docs = app.documents; // 現在開いているすべてのドキュメントを得る

// ドキュメントの数だけループ
for( var i = 0, docLen = docs.length; i < docLen; i++ ) {
  var tmpDoc = docs[i]; // 今処理してるドキュメント

  // 書き出すファイルのFileオブジェクトを作成
  var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));
  // プリセットのオブジェクトを取得
  var preset = app.pdfExportPresets.item("[PDF/X-1a:2001 (日本)]"); // ← ココ

  // ドキュメントのPDF書き出しを実行!
  tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, false, preset);

  // ★ドキュメントを閉じる(保存しない)

} // ここまでループ

今度こそ、と実行ボタンぽちっ。

キタ.*・゜゚・*:.。..。.:*・゚ヽ(゚∀゚)ノ ゚・*:.。. .。.:*・゜゚・*ー!!!!!

ドキュメントと同じフォルダに、PDFがきっちり書き出されました。
これでほぼスクリプトは出来上がったようなものではないだろうか。一気に完成させてしまおう。

あとはドキュメントを閉じるだけ……のはず

これはもう何度も書いたことある処理なので悩むところはないと思う。でも一応、リファレンスを確認しておこうかな。Documentクラスのcloseメソッドだよね。

Document.close (saving, savingIn, versionComments, forceSave)


Close the Document

引数 引数の型 意味
saving SaveOptions オプション。閉じる前に保存するかどうか。デフォルトはSaveOptions.ASK。
savingIn File オプション。保存するファイル。
versionComments String オプション。バージョンコメント?
forceSave Boolean オプション。強制的に上書き保存するかどうか?

ん、SaveOptionsってなんだ。trueかfalseで指定するわけじゃないのか。とりあえずオブジェクトモデ(ryで検索する。

SaveOptions.ASK 変更を保存するかどうかのプロンプトを表示する。
SaveOptions.NO 変更を保存しない。
SaveOptions.YES 変更を保存する。

今まで作ってきたスクリプトでは、保存するかどうかはデフォルトのままにしていました。それがSaveOptions.ASKで、今回は保存しないのでNOを指定すればいいようです。

var docs = app.documents; // 現在開いているすべてのドキュメントを得る

// ドキュメントの数だけループ
for( var i = 0, docLen = docs.length; i < docLen; i++ ) {
  var tmpDoc = docs[i]; // 今処理してるドキュメント

  // 書き出すファイルのFileオブジェクトを作成
  var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));
  // プリセットのオブジェクトを取得
  var preset = app.pdfExportPresets.item("[PDF/X-1a:2001 (日本)]");

  // ドキュメントのPDF書き出しを実行!
  tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, false, preset);

  // 今回追加した部分ここから ------------------------------

  // 保存せずにドキュメントを閉じる
  tmpDoc.close(SaveOptions.NO);

  // 今回追加した部分ここまで ------------------------------

} // ここまでループ

残っていた★の行も埋まって、これで完成だ! ということでもう一度ESTKに貼り付けて、ドキュメントを4つ開いて実行してみる。

順調に書き出し→ドキュメント閉じる、という処理が進んでいく……と思ったら、3つ目のドキュメントの処理中になぜかストップ?

オブジェクトが無効です

(;゚Д゚)...アレ?

なんで?

エラーが出たのは書き出すファイルのFileオブジェクトを作成している行。でも、2つ目のドキュメントまでは一切引っかからずきちんと進んでる。なんでだ。なんでだ! エラーならエラーでいいけどもう少し教えてくれよー!

まず疑うべきは、追加したばかりの「ドキュメントを閉じる処理」のところだろう。ここを追加する前は4つのドキュメントをすべて書き出せたんだから。ただ、2つ目までは閉じることに成功して次のループに入ってる。この行の書き方を間違えたわけじゃなさそうな気がする。試しにドキュメントを閉じる処理をコメントアウトしてみたら、ちゃんと4つのPDFが書き出せました。
閉じる処理をすることで何かが起きてるらしいけど……と、ふと思い立ってエラーで処理が止まったままのESTKで「データブラウザ」を開いてみたところ、
f:id:chalcedony_htn:20100603184309p:image
なんでdocs.lengthが2になってるの……

つまり、こういうこと。自分の理解のためにクドい説明をしますよ。
最初にドキュメントを4つ開いたとき、app.documents(このスクリプトではdocsで参照してる)のlengthは4で、0〜3のインデックスがつけられています。

index ドキュメント
0 ひとつめ.indd
1 ふたつめ.indd
2 みっつめ.indd
3 よっつめ.indd

でもって、1つ目のドキュメントまで処理し終わった段階で、「ひとつめ.indd」は閉じられる。そうすると、app.documentsのindexは新たに振りなおされるのだ。

index ドキュメント
0 ふたつめ.indd
1 みっつめ.indd
2 よっつめ.indd

ここでiが1増えて、i == 1の状態で処理が行われる。つまりここで処理されるのは「みっつめ.indd」。閉じる処理まで終わったときには次の状態になります。

index ドキュメント
0 ふたつめ.indd
1 よっつめ.indd

ここでiが1増えるとどうなるか? i == 2だけど、docs[2](つまりapp.documents[2])は存在しない。だから「オブジェクトが無効です」というエラーが発生する!

こ、これは恥ずかしい。わかってみれば簡単なんだけどこんなことに気づかなかったとは。最初に得意げにループを書いた時点でこういう問題が起きることが決まっていただなんて!
ていうかこれ読んでる人はきっとわかってて、いつ気づくかなー(・∀・)ニヤニヤとか思ってたんだろうなー! あああ……orz

修正しよう・2

まあ、原因がわかってしまえばあとは簡単。0番目から処理するせいでドキュメントを閉じたときにインデックスが前にずれてしまうわけだから、最後から逆に処理していけばいいのだ。

var docs = app.documents; // 現在開いているすべてのドキュメントを得る

// ドキュメントの数だけループ
for( var i = docs.length - 1; i > -1; i-- ) { // ★
  var tmpDoc = docs[i]; // 今処理してるドキュメント

  // 書き出すファイルのFileオブジェクトを作成
  var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));
  // プリセットのオブジェクトを取得
  var preset = app.pdfExportPresets.item("[PDF/X-1a:2001 (日本)]");

  // ドキュメントのPDF書き出しを実行!
  tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, false, preset);

  // 保存せずにドキュメントを閉じる
  tmpDoc.close(SaveOptions.NO);

} // ここまでループ

修正したのは★の行。iの初期値を「ドキュメントの数-1」にする。これが最後のドキュメントのインデックスで、そこから1ずつ減らしていくことで0番目のドキュメントまで処理できる。
今度こそ何も問題はないはずだ! 例によって4つドキュメントを開いて実行!

Execution finished.

ヤッタ.*・゜゚・*:.。..。.:*・゚ヽ(;∀;)ノ ゚・*:.。. .。.:*・゜゚・*ー!!!!!
最後まできちんとPDFを書き出して、ドキュメントもすべて閉じました。ドキュメントを一部修正してから実行した場合でも、PDFにはその修正が反映され、元のドキュメントは保存せず閉じられています。ドキュメントの数を増やしても減らしても問題なし。やっと完成! です! やったー!

完成!

試しにコメントを取っ払ってみたところ、8行になりました。

var docs = app.documents;
for( var i = docs.length - 1; i > -1; i-- ) {
  var tmpDoc = docs[i];
  var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));
  var preset = app.pdfExportPresets.item("[PDF/X-1a:2001 (日本)]");
  tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, false, preset);
  tmpDoc.close(SaveOptions.NO);
}

20行よりはだいぶ少なくて済みましたね。ただ、やっぱりドキュメントを1つも開いてないときのチェックくらいは入れてもいい気がしてきます。ついでに、無名関数でくるんでしまおう。

(function(){
  var docs = app.documents;
  if( docs.length == 0 ) { alert("ドキュメントが開かれていません。"); return; }
  for( var i = docs.length - 1; i > -1; i-- ) {
    var tmpDoc = docs[i];
    var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));
    var preset = app.pdfExportPresets.item("[PDF/X-1a:2001 (日本)]");
    tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, false, preset);
    tmpDoc.close(SaveOptions.NO);
  }
})();

ドキュメントの数が0だったときはエラーメッセージを出して、returnで処理を終了してしまうようにしています。returnが使えるのは全体を関数にしてしまったおかげ。
行数は増えましたが、その分ちょっとだけ親切になりました。普通に使うにはこれで充分かな。

蛇足:ループの書き方を変えてみる

ドキュメント数が減るのに対応するためにforループを逆転してみたけど、減っていくとわかっているならwhileでも書けると思ったので、せっかくだから書いてみる。

(function(){
  var docs = app.documents;
  if( docs.length == 0 ) { alert("ドキュメントが開かれていません。"); return; }
  while( docs.length != 0 ) { // ★1
    var tmpDoc = docs[0]; // ★2
    var fileObj = new File(tmpDoc.fullName.fullName.replace(/\.[^.]*$/,".pdf"));
    var preset = app.pdfExportPresets.item("[PDF/X-1a:2001 (日本)]");
    tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, false, preset);
    tmpDoc.close(SaveOptions.NO);
  }
})();

変更したのは★のついた2行。ドキュメントの中で最初のものを処理の対象にして(★2)、処理が終わったら閉じる。それをドキュメントの数が0になるまで繰り返す(★1)、という感じ。毎回0番目に来てるドキュメントを対象にするので、ドキュメントが閉じてインデックスがずれても問題ありません。
でもよく考えてみると、この形のループは「うっかりドキュメントが閉じられなかった場合」に無限ループに陥る危険がある気がします(docs.lengthがいつまでたっても0にならないから)。最初に処理したいドキュメントの数は決まるのだから、forで回すほうが安全かもしれないです。

さいごにひとこと

こんなに苦労するはずではなかったんですけどね! 考えが甘かったです。最後まで読んでくださった方、いるかどうかわかりませんがありがとうございました。ツッコミ大歓迎です。
いろんなエラーが出て、原因を突き止める過程まで書き留めつつ修正していったおかげで完成まで諦めずに済みましたし、なんとなく修正してなんとなくできあがるよりも理解が深まった気がします。時間はかかったけど。あと、だいぶ恥ずかしいけど。
今後また機会があったら実況風に書き留めてみたいなと思います。

……でもこれ、たぶんPlanetDTP@jpに全文載っちゃうんじゃないかしら。載せてくれるのはありがたいことだけど、長くてクドくてすいません!(今更……

*1:JavaScriptから入ったクチだからか、クラスとかインスタンスとかいうのがよくわかっていません

*2:たぶん指定文字数削って足すほうが速いんだろうけど

*3:修正の方向としては「PDF/X-1a」という名前のプリセットを自分で作るっていうのもありなんだけど

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

InDesignで配置実行前にデフォルトの文字スタイルを[なし]にする(CS3〜)

お久しぶりですこんばんは。主にやる気の問題でご無沙汰しておりました。

InDesignのタグ付きテキスト配置にありがちなこと

タグ付きテキストを[配置]で流し込むとき、タグで指定していないはずのスタイルが適用されてしまうことがあります。デフォルト状態(アプリケーション上で何も選択していない状態)のときにパネルで選んでおいたスタイルが、タグでスタイルを明示していない部分のテキストに適用されるためです。
うまく使えば便利なときもあるかもしれませんが、うっかりやらかしたときはがっくり来ますorz
……ありがちとか言ったけど、私だけだったらどうしよう。まあいい。

うっかり防止隊をつくろう

というわけで、やらかしそうになったときにInDesignが防止してくれるスクリプトを作りました。
具体的には、[配置]を(メニューからでも、ショートカットからでも)実行するときに、デフォルトの文字スタイルを[なし]に設定してくれるというものです*1 *2
メニューやイベントを使っているため、InDesign CS3以降でしか動きません。いつものことですが、動作確認はWindows XP(SP3)、InDesign CS4でのみ行っています。

// 配置前にデフォルト文字スタイルを[なし]にする

#targetengine "noDefaultCharaStyle"

(function(){

  // [配置...]メニューのbeforeInvokeイベントが起きたときに実行する処理を設定
  app.menuActions.item("$ID/Place...").addEventListener("beforeInvoke", function(event){

    // ドキュメントはイベント発生時に都度確認する
    var actDoc = app.activeDocument;

    // すでにデフォルト文字スタイルが[なし]のときは何もせず終了
    if( actDoc.textDefaults.appliedCharacterStyle.index == 0 ){ return; }

    // デフォルト文字スタイルを[なし]に変更
    actDoc.textDefaults.appliedCharacterStyle = actDoc.characterStyles[0];

  }); // イベントハンドラ設定ここまで

})();

だいたいコメントの通りですが、[配置]が選択されて実行される直前(beforeInvoke)に毎回デフォルトの文字スタイルを確認し、[なし]になっていなかったら変更する処理を行うよう設定します。
このスクリプトを実行しただけでは何も起きません(起きたように見えません)が、InDesign側ではうっかり防止隊が結成されています。Scriptsフォルダの下のStartup Scriptsフォルダ(なかったら自分で作る必要あり)に入れておいて、InDesignの起動時に毎回実行されるようにしておくと便利かもしれません。
そうそう、このスクリプトExtendScript Toolkitから実行すると動きませんので、使うときはファイルに保存してスクリプトパネル上から実行する必要があります*3

うっかり防止隊はInDesignが終了した時に解散になります。InDesignを終了させずにこの設定を解除したいときは、

// 配置実行前の処理を消去する

#targetengine "noDefaultCharaStyle"

(function(){
    var listeners = app.menuActions.item("$ID/Place...").eventListeners;
    for( var i = listeners.length -1; i > -1; i-- ){
        if( listeners[i].eventType == "beforeInvoke" ){ listeners[i].remove(); }
    }
})();

これを実行すればOKです*4

うっかり防止隊をちょっと親切にしてみる

最初のスクリプトだと、文字スタイルで[なし]以外を選んだまま配置したいときには一度設定を解除しなければなりません。それはそれで、逆うっかりをやらかす可能性があります。
なので少し改良して、配置するときに文字スタイルを[なし]にするかどうか訪ねるダイアログが出せるようにしてみました。

// 配置前にデフォルト文字スタイルを[なし]にする

#targetengine "noDefaultCharaStyle"

(function(){

// ★変更前に毎回確認のダイアログを出すかどうか設定する
// (true:確認する false:確認しない)
// ----------------------------------

  var askBefore = true;

// ----------------------------------


  // [配置...]メニューのbeforeInvokeイベントが起きたときに実行する処理を設定
  app.menuActions.item("$ID/Place...").addEventListener("beforeInvoke", function(event){

    // ドキュメントはイベント発生時に都度確認する
    var actDoc = app.activeDocument;

    // すでにデフォルト文字スタイルが[なし]のときは何もせず終了
    if( actDoc.textDefaults.appliedCharacterStyle.index == 0 ){ return; }

    // 毎回確認する設定(askBeforeがtrue)ならダイアログを出す
    if( askBefore ){
      var dlg = new Window("dialog", "うっかりしてませんか!");
      dlg.add("statictext", undefined, "デフォルト文字スタイルを[なし]にしますか?");
      dlg.bGroup = dlg.add("group");
      dlg.bGroup.orientation = "row";
      dlg.bGroup.add("button", undefined, "はい", {name:"OK"});
      dlg.bGroup.add("button", undefined, "いいえ", {name:"Cancel"});
      if( dlg.show() != 1 ){ return; } // 「はい」ボタン以外なら何もせず終了
    }

    // デフォルト文字スタイルを[なし]に変更
    actDoc.textDefaults.appliedCharacterStyle = actDoc.characterStyles[0];

  }); // イベントハンドラ設定ここまで

})();

★のところの変数askBeforeをtrueにしておくと、配置ダイアログが出る前に文字スタイルを変更するかどうかのダイアログが出るようになります。こんなの↓
f:id:chalcedony_htn:20100909013325p:image
falseにすれば確認なしで変更します。
もちろん、確認ダイアログが出るのは[なし]以外の文字スタイルが選択されているときだけです。うっかり防止を名乗るならこうでなくてはね!
なお、これを解除したいときにもさっきの削除用スクリプトが使えます。

これさえあれば

タグ付きテキストの配置で延々待たされたあげくに「見つからない字形の保護」とか言われて orz ってなることもなくなるはずだっ!

*1:配置するのがテキストかどうかは判定しない(できない)ので、画像を配置したいときにも処理が行われます

*2:段落スタイルをタグで明示しないことはあんまりないと思うので、今回は無視しています

*3:tergetengineの指定が必要なだけなので、正確に言えば初回だけファイルから起動すればInDesignの再起動まではESTK上からでも動きますが……ていうか名前がてきとうすぎる

*4:ただしこれだと[配置]のbeforeInvokeイベントハンドラが全部消えます、手抜きです

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

ライブラリのアイテムを自動で配置する(InDesign CS3〜)

とってもお久しぶりです。最近アウトプット減ってて*1インプットも滞っています。
スクリプトもまとまったものはあまり書いてないんですが、久しぶりに汎用っぽいのができたのでおすそわけ。すでに書いてる人がいたらすいません……

ライブラリの各アイテムを自動でまとめて配置する

たとえばコンピュータ関連の解説書とかで「Ctrl+Pを押します」なんて書いたりして、それぞれのキーを絵で表現したりするようなとき。
f:id:chalcedony_htn:20110704183249p:image
フォントを作っちゃうのも手なんですが、そこまでする数じゃないような場合はライブラリを使うと便利。
f:id:chalcedony_htn:20110704183250p:image
ただ、ひとつずつD&Dして配置するのはめんどくさいです。私なら3つくらいやったとこでイラッと来ます。
というわけでこんなのを書きました。テストはWinXP SP3、InDesign CS4でのみ行っています。
f:id:chalcedony_htn:20110704183251p:image
↓↓↓
f:id:chalcedony_htn:20110704183248p:image
「#(半角英数のアイテム名)」という文字列が選択範囲内に見つかったら、指定したライブラリ内の同名アイテムで置換します。何も選択していない場合はドキュメント全体を処理します。
配置したオブジェクトはインラインオブジェクトになります。インラインオブジェクトの各種テキストスタイル属性は置換元の最後の文字(「#name」なら「e」)と同じになります。

// 選択部分が対象
var target = app.selection;
// 何か選択されていたらその中だけ。選択してなければドキュメント全体が対象
target = (target.length > 0) ? target[0] : app.activeDocument;

// ライブラリから読み込み。ファイル名を指定。InDesign上で開いてないとだめです
var lib = app.libraries.itemByName("keylib.indl"); // ★

// 検索条件(「#半角英数」の最長一致)
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "#[0-9A-z]+";

// 検索実行
var f = target.findGrep();

// 検索で引っかかった部分を後ろから順番に処理
// 置換によって文字数が変わる処理なので前からやると泣きを見ます
for(var i = f.length-1; i > -1; i--){
  var name = f[i].contents.substr(1); // 検索された文字列をアイテム名として扱う。substrは「#」を取り除く処理
  var asset = lib.assets.itemByName(name); // 名前からライブラリのアイテムを特定

  try {
    asset.placeAsset(f[i].insertionPoints[-1]); // 配置(検索された文字列の最後にくっつける)
    f[i].characters.itemByRange(0, -1).remove(); // 検索された文字列を削除(最後にくっつけたアイテムは残す)
  } catch(e){
    // エラーが起きたらスルー
  }
}

注意点は画像に書いたとおり。正規表現検索の使えるCS3以上が対象、アイテム名に半角英数以外は(記号も)使えません。
使うときは★をつけた行でライブラリ名(ファイル名)を指定してください。

場合によるとは思うけど

実際使うときは、元の「#アイテム名」のテキストに文字スタイルをつけておいて、その文字スタイル限定で検索するようにしたほうが安全じゃないかと思います。
検索条件のとこに

app.findGrepPreferences.appliedCharacterStyle = "ほげほげ文字スタイル名";

とか追加したり。処理後のインラインオブジェクトに文字スタイルが残るので、あとでまとめて検索もしやすいです。

以下、蛇足

せっかくなので勉強がてらちょっぴり修正してみます。

名前を発見するたびにいちいちライブラリを見に行くのは効率悪い気がしたので、最初にアイテムをリストアップしてアイテム名をキーとするオブジェクトに格納してしまうことにしました。
ついでに、いちいち選択解除するのがめんどくさいので、テキストカーソルを立ててるだけの状態のときはドキュメント全体を処理するようにします。あとコメント消したり無名関数でくるんでしまったりその他もろもろまとめ書きして……

(function(){
  var libname = "keylib.indl";

  var target = (app.selection.length > 0) ? app.selection[0] : app.activeDocument;
  target = (target.constructor.name == "InsertionPoint") ? app.activeDocument : target;

  var assets = {};
  var lib = app.libraries.itemByName(libname);
  for(var i = 0, alen = lib.assets.length; i< alen; i++){
    var tmp_a = lib.assets[i];
    assets[tmp_a.name] = tmp_a;
  }

  app.findGrepPreferences = NothingEnum.nothing;
  app.findGrepPreferences.findWhat = "#[0-9A-z]+";

  var f = target.findGrep();
  for(var i = f.length-1; i > -1; i--){
    var tmp_f = f[i];
    try {
      assets[tmp_f.contents.substr(1)].placeAsset(tmp_f.insertionPoints[-1]);
      tmp_f.characters.itemByRange(0, -1).remove();
    } catch(e){}
  }
})();

こんな感じ。

で、よーしと思って大量に配置するサンプルを用意して処理速度を計ってみたら……ほとんど変わんなかったorz
ネックはどこにあるのかな*2。ドキュメントを描画なしで開いて処理したら速そうな予感はあるけど、心折れたので試してません。

さらに蛇足(未解決)

最初に書いたとき、置換処理は次のように書いてました。

// ~~~~~~~~~~
  var asset = lib.assets.itemByName(f[i].contents.substr(1)); // fはfindGrep()の戻り値
  try {
    asset.placeAsset(f[i].texts[0]);
  } catch(e){}
// ~~~~~~~~~~

検索で引っかかったテキスト部分をplaceAssetで上書きしてしまえばいいと思ったのです。
実際それでもうまくいっていたんですが、「#name#name」など検索対象が連続しているときに不具合が出ました(前のほうの#name、つまりあとに処理されるほうが置換されない)。
いろいろ調べた結果、二回目の(つまり前のほうの)f[i].contentsに直後のインラインオブジェクトまで含まれてしまうからということがわかりました。それで「『name(オブジェクト)』なんて名前のアイテムはない」と処理がスキップされたようです。
f[i].toSpecifier()すると範囲は5文字ぶんのはずなのに、f[i].lengthをとると6が出て、f[i].contentsを表示してみると最後にオブジェクトが入っているという謎現象。私の理解がへんなのかなあ?
……とりあえず回避するため、textを扱うのは危険ということで文字単位で追加、文字単位で削除という形にしたのでした。
うーん?

*1:ついったー? あれはアウトプットとは言えん、少なくとも私の場合は……

*2:無名関数とかやめたり、思いつく限りいろいろ削ってみたけど大差なしだった

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

DTPの勉強会に出ます

ぼやぼやしていたら、今年も半分過ぎたどころかもう8月ですって。今年まだ何もしてない気がします……
というわけで9月ごろがんばります。東京のDTPの勉強会 特別編でしゃべることになりました。すでに参加受付開始してます。

DTPの勉強会 特別編・第2回
日時:平成23年9月17日(土)13時30分(13時より受付開始)〜18時(予定)
場所:大橋会館 201教室
[テーマ]
InDesignJavaScriptでコントロールする

なんとあのたけうちとおるさんと一緒ですよ。つまり私はオマケなのですが*1、いまだに実感がわきません。どうすればいいんだー。
詳しい内容は告知ページでご覧ください。
入門ということでシンプルな課題がいくつか出ていますが、これを解けるのが参加の前提条件というわけではありません。当日は解説をしながら作成、そしてその場でさらに改造し、もう少し複雑な処理ができるようになるまでをお話ししていきます。
あとお題がちょっと曖昧なのでそのうちフォロー入れます。

InDesignJavaScriptでコントロールする」

ってタイトルの通り、そしてお題を見てわかる通り、今回のテーマは「スクリプト使うとこんなすげーことできるぜヒャッハー!」というものではありません。むしろ地味です。時間かけてスクリプトをひねり出すよりは手作業でやったほうが早いかもしれない、くらいのことをあえてやろうとしてます。
なぜかというと、「書けるようになる」が目標だからです。
大規模で複雑なワークフローがきっちり出来上がってるのでもない限り、実際の作業で自動化したい処理って意外とシンプルなものじゃないでしょうか。手作業でも多少時間をかければ終わる。でもめんどくさいその時間が惜しい。手作業ではミスが出るかも。そんなときにサクッとスクリプトが書けたら便利、という。一からは難しくても、サンプルやネットで公開されてるスクリプトを読んで少し改造すれば作れるとか。
私は実際そこからはじめて、今は一応業務で使える程度になっています。手作業よりは早く書けるようになってる……かな?
というわけで、いきなり書けるようになるのは難しくても、そのきっかけになれたらいいなと思います。

今回のコンセプトについては、勉強会主催者のあかつきさんが詳しい記事を書かれていますので、そちらもどうぞ。

実を言えば

私がふだん書いてるスクリプトってわりと偏ってまして、ほとんどがテキスト周りの処理です。これは業務がそっち側に偏っているからなんですが、問題は今回の課題がオブジェクトの位置とかから始まっていることで……自分で課題を解くために、しょっぱなからぐぐったりサンプルコード見たりしております。
こんなのがしゃべっていいのかと若干不安になりつつ、がんばりますのでお手柔らかに。

*1:前にWindowsネタでしゃべったときもオマケでしたね

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

InDesignでスクリプトから挿入した索引マーカーの位置がずれる問題

ご無沙汰しております。

長々と前置きはしないことにして

淡々とInDesignの(たぶん)バグ報告します。
InDesignの索引作成時は見出し語の位置にマーカーを入れていくのですが、これをスクリプトからやろうとすると、ある条件下で挿入位置がずれるというバグがあります。JavaScriptVBScriptで確認。

  • 見出し語と同じストーリー上に表が入っている
  • その表が見出し語より前にある
  • その表が複数行ある(列の数は関係ない模様)

CSまでは起きなかった問題です。CS4では起きるのを確認しました。CS2あたりからおかしくなってきたらしいと聞いたことがありますが、情報元のページが消えててわかんなくなったorz

というわけで実験してみました。InDesign CS5.5、言語はJavaScript、もちろんWindows版です。

f:id:chalcedony_htn:20120627175403p:image

見事にずれてます。実験に使ったスクリプトは以下のもの。

var doc = app.activeDocument;
var idx = (doc.indexes.length>0) ? doc.indexes[0] : doc.indexes.add();
idx.topics.add("見出し語","よみがな").pageReferences.add(app.selection[0]);

文書内の「→←」の間にカーソルを立てては実行、を繰り返すこと7回でさっきの画像の状態になりました。順不同にやっても変わらず。
索引を実際に追加してるのは3行目です。topics.add()で項目を追加し、pageReferences.add()で現在選択してる箇所(挿入点、またはテキスト)を参照先として指定しています。
ちなみに、リファレンス見るかぎりCS2〜CS5.5で動くはずです。CS6はまだ触ったことないです。

これのせいで

外部テキストに用意したリストを読み込んで一発で索引登録できるスクリプト*1とか、テキスト選択して実行すると読みがなを自動解析して索引に登録するスクリプト!とか、そういうのが作りづらくなってるんで何とかして欲しいです。
しかし、索引って使ってる人少ないのかなあ……。

*1:これはディザInDesignのお〜まちさんが作ってらっしゃいますね。表さえ入ってなければCS5.5でもばっちり便利に使えてます。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

livedoor ClipがなくなったのでPinboardはじめました

はいこんばんは。
ちょっと前からですが、メインのソーシャルブックマークサービスPinboardに乗り換えましたはてなのほうは継続利用中です。
これだけで完了するような話ですが、せっかくだからいろいろ書いておきます。

さようならlivedoor Clip

愛用していたソーシャルブックマークサービスlivedoor Clip」がお亡くなりになってしまったので、泣く泣く新しいサービスへ移行しなければならなくなりました。かなしい……
どうやらクリップでなじみの面々の多くははてなブックマークに移行したようなのですが……今までのブックマークを移行して長ったらしいコメントが途中でちょん切れるのは絶対に避けたかったため、他のサービスを探すことに。

ソーシャルな部分はいまとなってはTwitterで十分なところがあるので、機能面を重視して選びました。
具体的に言うとコメント文字数と速度、それからある程度メジャーで今後のサービス継続が期待できるもの。
ブックマーク支援ツール(Firefoxアドオンの「Tombloo」を使用)が対応しているかどうかも大事なところです。あ、あと日本語対応か。

こんにちはPinboard

いろいろ比較した結果、何人かがおすすめしてくれたPinboardに決定。なんとコメント文字数無制限*1なのです。桃源郷はここにあったんやー!
他の機能についてはツアーを参照。
面白いと思ったのは「to read」設定ですね。いわゆる「あとで読む」。このフラグが付けられたブックマークは「未読一覧」みたいな形で一覧表示できて、読み終えたしるしに「mark as read」リンクをクリックするまで非公開になるというものです。
たしかに、読んでみるまではブクマしたことを知られたくないってのはありますし。通常の非公開設定と分けてあるところが、使うシーンをきっちり考えてるなーって思います。まあ個人的には非公開とかまず使わないんですけど。

Pinboardは有料のサービスなのですが、月額とかではなくて1回支払えばOKということでさくっと登録。金額が登録の時期によって(つまりユーザー数が増えて維持費が上がるに従って)だんだん高くなっていくらしくて、それもちょっと面白いと思いました*2

ちなみに

LDC時代のブックマークはエクスポートしてPinboardのほうにぶちこんであります。エクスポートしたXMLをPinboard用に変換するのにえらい苦労したのですが、そのときのメモはうっかり意図的に消したので省略。
なお、ミスって日付情報がすべて吹っ飛んだため、移行した分のエントリはいつのものかさっぱりわからない状態です。細けぇ事はいいんだよ!

*1:システム上の上限はあるでしょうけどね

*2:金額据え置きで無理した結果破綻するよりよっぽどいいと思う

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

INDD 2013 Tokyo(spring)に行ってきた(第3セッション感想)

はいこんばんは。

先週の土曜日はInDesignの祭典、INDD 2013 Tokyo (spring)に行ってきました。セミナーのレポートとか最近サボり気味なんですが、今回は自分の業務にダイレクトにつながる内容だったので、せっかくだから俺は赤い扉を選感想など書いてみようと思います。他の2セッションについても書こうと思ったのですが力尽きましたごめんなさい……
感想なので、内容のまとめではありません。内容については当日のTwitterの様子がまとめられたTogetterがあるのでそちらを。
http://togetter.com/li/464817
うわっ……私のpost、多すぎ……?(例の顔で

第3セッション:多ページ作成でのInDesignテクニック

テクニカルドキュメント、いわゆる「トリセツ」を日々制作されている西村さんが、あかねさんを相棒に多ページのドキュメントを大量に処理する場合のテクニックを解説してくれるセッション。
立場や仕事量などもろもろ違いますが、私も主な業務は同じくテクニカルドキュメントの制作です。この種の作業の特徴としては、スライドで挙げられていた

  • ページ数が多い
  • ファイル数も多い
  • レイアウトはシンプル
  • テキストがメイン

に加え、

  • ほかのページへ誘導する記述が大量にある(X章のXを参照、XXページを参照、など)
  • ページ増減が頻繁にある(途中のページに記述がどっさり追加され、以降の改ページ位置などがすべて変わる)
  • 改訂が多く、データが長年引き継がれ続ける
  • 改訂サイクルが早い(ことがある)

などが挙げられると思います。
下版した次の日から改訂作業開始とかざらにあったり。逆に5年も前のデータを掘り起こしたり。最近は時代の流れか紙のトリセツも減りまして、最終的な出力がPDFでWeb掲載だったりすると、数百ページあるのに作業期間は1〜2日とかね。ありますね。
数百ページのドキュメントにちりばめられた「詳しくはXXページを参照してください」って記述を手作業で検索して参照元と引き合わせて違ってたら手で数値打ち直して……とか、ページ増減で内容とずれてしまった柱テキストを目視確認してちまちま修正して……とか、「テキスト修正だからそんなに時間かからないでしょ? PDFだし、できたらすぐちょうだい」、と、か……考えただけでSAN値*1ががりがり削れていきます。

そんな作業をInDesignで(正気を保ちつつ)効率的に行うためには、どんな機能をどう使ったらいいのか? というのが今回のセッション。
その内容ですが……いやー、濃かったですね! ものっすごいボリューム。

  • テキスト変数
  • 箇条書き
  • 相互参照
  • アンカー付きオブジェクト
  • ブック
  • 目次
  • 索引
  • (条件テキスト)

まさに普段業務で使っている機能ばかりで嬉しくなってしまいました。
逆に、初めて「この機能ってこういう時に使うのか」と知った人もいるんじゃないでしょうか? Adobeのヘルプではそれぞれ別の箇所に記述されていて、こんなふうに逆引き的に関連付けてまとまってはいないんですよね。機能の存在と概要を知らないと調べようがない。そもそも自動番号が箇条書きってどういうことなの……とかね。
セッションでは、取り上げたそれぞれの機能について、何がどう効率化できるのか、どう設定したら使えるのか、使うときの注意点は何か、を丁寧に説明していました。
この「注意点」のところが実はセッションの目玉だったんじゃないかと。ものすごく実践的で、「あるある!!」と何度も何度もうなずきながら聞いてたり、もちろん初めて知るものもたくさんあったり。単なる機能紹介や公式のヘルプでは絶対出てこないですよね、箇条書きの自動番号で51番目以降は丸数字が使えないとかw
設定方法についても、普段使ってる部分以外はあいまいにしか理解していなかったのできっちり復習できました。索引の参照形式とか、アンカー付きオブジェクトの位置オプションとか。後者はスライドで視覚的にまとめられていてわかりやすかったです。今まで回りくどいやり方をしていなかったか、チェックしてみるいい機会になりました。


実を言えば、これらの機能は日々使っているものの、他の環境ではどんなふうに使われているんだろう……といつも思っていたんですよね。よそで制作したデータを見ることが一切ないので。Webで検索してみても、実践的な内容はなかなか出てこないですし。
もっと効率的なやり方があるのではないか? むしろ根本的に機能を勘違いしていたりしないか? と不安を抱いていたのですが、今回ピンポイントでテクニカルドキュメントの例を見ることができ、おおむね方向性は間違っていないとわかって心底ほっとしました。そのテンションの結果があのpost数だよ*2


改めて今回紹介されていた機能を俯瞰してみると、何をおいてもまずは「ドキュメントを(データ上で)構造化すること」がはじめの一歩になるんだなあと思います。変数、相互参照、箇条書き、目次などなど、「テキストに適切なスタイルが設定されている」からこそ使えるんですよね。
逆にこれらの機能をフルに使いたいなら、それを前提にしたスタイルの設計をする、というのも必要になってくると思います。「見出しだから文字を大きくする段落スタイルを付けよう」ではなくて、「見出しとして使いたい段落だから見出しという段落スタイルを付けて、見た目でも見出しとわかるように文字を大きくしよう」という感じ。
データを構造化しておくと、さらに進んだ自動処理(たとえばスクリプトを使うとか)をしやすくなったり、Eなんとか形式にするときにもたぶん比較的スムーズだったりと、メリットは多いと思います。


あとひとつ、大事だと思ったのは、最後のまとめにあった「自動だからと安心しないでチェックは必ずしよう」です。
各機能の注意点を見返してみるとわかりますが、自動更新されたりされなかったり、テキスト量によってオブジェクトが重なってしまったり、自動挿入されるテキストが手動で修正できてしまったりと、落とし穴も結構あります。相互参照まわりとかちょいちょい怪しいし*3
自分の仕事では、修正作業に時間がかからない分、チェックは念入りに……というつもりでやっています。
終了まぎわに西村さんがぽそっと言ってた、「あくまで入力支援ですからね」という言葉を肝に銘じておきたいですね。

というわけで

InDesignかわいいよInDesign
横見出し機能搭載はよ
貴重な話を聞かせていただいてありがとうございました! 姐さん、よければ次は条件テキストも教えてください!

*1:正気度

*2:参照元と参照先を間違えてるところがあって赤面

*3:相互参照、便利でかわいいやつだけどダメなところもたくさん知ってます。こちらのBlogに詳しいです→ InDesignerの悪あがき ブログ内検索で「相互参照」を検索するといろいろ出てきます。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

なんとなく、使っているツール(フリーウェア)を晒してみる

はいこんばんは。

4GBパッチというものの存在を知ってちょっと調べていたのですが、その過程でこの記事を見かけまして。
4GBパッチは効果がある!  & 個人的使用ツール
せっかくなので自分の愛用しているソフトウェアをいくつか晒してみたいと思います。
当然すべてWindows用です。

テキストエディタ

サクラエディタUnicode

メモ書きから置換処理、Grep検索、ちょっとしたスクリプト書きまでこれ一つで済んでしまいます。マクロもあるよ。
設定項目が膨大にあるけど、その分かゆいところをゴリゴリカスタマイズできて好きです。デフォルトでも十分使えますけどね。
昔は内部がShift-JISだったのですが、いまはUnicode版もあります。

ファイルリネームツール

お〜瑠璃ね〜む

http://beefway.sakura.ne.jp/dl-allrename.html
仕事しはじめて最初に使ったのがこれで、そのまま使い続けてます。正直ほかのやつ使ったことないので、どこがいいとかアピール難しい……
一通りの機能が揃っていながら、あんまり悩まずに直感的に使える素直さが魅力ですかね。リネーム前のプレビューが見やすいので、致命的なミスも回避できます。
開発はちゃんと継続されていて、たまにバージョンアップされてます。

CopyExt(拡張コピー)

http://www.htosh.com/software/freesoft/copyext.html
エクスプローラ拡張。ファイルやフォルダの右クリックメニュー(コンテキストメニュー)から、

  • リネームしつつコピー
  • 特定のフォルダにコピー
  • タイムスタンプを比較してコピー
  • まとめて選択して、フィルタを通ったものだけをコピー

などなど、いろんな方法でファイルコピーを行えます。設定をプロファイルで保存しておけば、複雑なコピーも一発で実行できたり。
たとえば私は、「1つ以上のファイルを選択した状態で、マウス右ボタンを押しながらドラッグ→表示されるコンテキストメニューで[ここに拡張コピー]をクリックすると“backupXX_(元ファイル名)”という名前でそれぞれ複製される」という設定で使っています。XXは連番で、すでに同じ名前のファイルがある場合だけ番号が増えていきます。所要時間1.5秒。
これでぽいぽいバックアップ取っていけば万が一の時も安心。エクスプローラ拡張なので、ファイルの保存ダイアログ上でも有効。別名保存時に新しい日付のファイル名をつけるのでなく、古いファイルのバックアップを取ってから上書き、という感じで使ってます。
ファイルが壊れる恐怖と日々戦うDTPerにとっては強い味方であります。けどMacAutomatorのほうが便利じゃね?

圧縮・解凍ツール

Cube ICE

いろんなの使ってきましたが、今はこれを使用中。MacのFinderデフォルトで圧縮されたzipファイルも文字化けせず解凍できます。
使用感はごく普通。標準的なアーカイブ形式にはだいたい対応してると思います。
圧縮時・解凍時に不要ファイルを任意でフィルタリングできるのが精神衛生上よいです。Thumbs.db爆発しろ。
インストール時に謎ツールバーをインストールするかどうか聞かれますので注意。

7-zip

普段使うことはありませんが、後述する比較ツールWinMergeアーカイブ比較機能を使うために入れています。

Explzh for Windows

ライセンスの関係で仕事用PCには入れてないですが、こちらもMacのデフォルトで圧縮したzipファイルを解凍できます。個人用PCではこちらを主に使っていますね。

ランチャー

CLaunch

パネル型のランチャー。有名どころだと思います。
タブ分けできるのである程度整理ができます。しかしだんだん登録アイテム数が増えてきてパネル自体が巨大に……
デスクトップのダブルクリックで呼び出すようにしているので、普段Adobeのアプリケーションとか使う時はあえて最大化せず、端っこ数ピクセルのスキマを作って(ダブルクリックできるようにして)います。

ファイラー(エクスプローラ拡張)

QTTabBar

Windowsエクスプローラをタブ型にするツール。たぶん似たようなのは山ほどありますが、最近は新しいのを開拓してないです。
いわゆるタブ型アプリケーションに求める機能はだいたい入っていると思います。動作のカスタマイズも細かくできます。
タブの横幅が可変で長いフォルダ名でも省略せず表示してくれること、タブをたくさん開いても多段表示できるので一覧性が損なわれないこと、あたりが個人的に好みですね。

データ比較ツール

WinMerge

定番中の定番。ファイルやフォルダを比較、テキストデータならその場でマージや編集もできます。
プラグインを入れればWordやExcel、PDFも比較可能。圧縮ファイルも解凍なしでそのまま中身を比較できます(要7-zipプラグイン)。
TortoiseSVNと連携させてリビジョン間の差分確認にも使っています。
InDesignのデータは直接比較できないけど、IDML書き出して拡張子をzipに変えたらWinMergeで修正箇所の割り出しができると最近気づきました。たまに便利。

ファイルバックアップ

BunBackup

定番。自動バックアップ、ミラーリング、フィルタ指定、上書き条件指定、世代管理などとりあえず欲しい機能が揃っています。これもカスタマイズ次第でかなり自分好みの設定を作れる。
作業データのバックアップ方法は今後変わりそうだけど、ちょっとしたデータのバックアップには使い続けるつもり。

Subversionクライアント

TortoiseSVN

最近使い始めたばかりのニューフェイス。作業データのバージョン管理を画策していまして、絶賛修行中なのです。
Windows用のGUIクライアントとしては定番どころか鉄板っぽい。エクスプローラを拡張するのはわかりやすいし便利なんだけど、ちょっと動作が重くなる気がしないでもない……
「とーたすえすぶいえぬ」、かるせど覚えた。

その他

WinCDEmu

CD/DVDのイメージファイル(isoとか)を開くと、空いているドライブレターが割り当てられ、通常のCD/DVDドライブと同じ感覚で扱うことができるようになる仮想ドライブツール。ドライブレターに空きがある限りいくつでも開けます。
なにも考えずイメージファイルをダブルクリックするだけで使えて、ドライブの解放も同じくダブルクリックでできます。仮想ドライブを右クリックして[取り出し]でもOK。このシンプルさが普段使いに便利。
例によって最初に出会ったのがこれだっただけで、他にもたくさんあるはず。

M電卓

http://www.vector.co.jp/magazine/softnews/080311/n0803113.html
電卓です。個人的には起動の速さと邪魔にならない小さいウィンドウが魅力かなあ。高機能らしいんだけど、関数電卓とか使わないし……
あと便利なのが16進数での演算。10進数で計算した結果がリアルタイムで16進数表示できたり、その逆もできたり。途中で切り替えもできます。16進数と10進数を混ぜて計算したいとき、たとえば文字コード連番でここから20文字分、とかによく使います。
ちなみに単位換算機能もあるのですが、ポイントがアメリカンポイントなので使ってないというオチ付き。

pinz

http://www.vector.co.jp/soft/win95/util/se343088.html
任意のウィンドウを最前面固定にしてくれるシンプルなツール。常駐型ですが邪魔にはならないです。
タスクバーから固定用アイコンをドラッグ→目的のウィンドウにドロップするだけで使えます。解除も同じく解除用アイコンをドロップだけでOK。
テキストエディタなりファイラーなり、それぞれに最前面固定機能は備えていると思いますが、私くらいになるといちいち個別に設定するのも(設定方法を覚えるのも)めんどくさいですからね。愛用してます。

などなど

思いつくままにいろいろ書いてみました。ほぼ毎日使うものだけに絞った*1のであんまり数なかったですね。
似た機能を持つフリーソフトがたくさんあって選択肢が多いのがWindows界のいいとこなので、「そういう使い方ならこっちのが便利だよ」というのがあったらぜひ教えてくださいー。

*1:諸事情で書かなかったやつもある

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

選択した文字列を索引項目に登録するJavaScript(読み仮名自動入力、CS3〜)

はいこんばんは。

InDesignで索引項目を追加するときはソートのために読み仮名を入力しなくてはならないのですが、手打ちするのがあまりにもめんどくさいので自動的に取得するスクリプトを作りました。
読み仮名の取得にはみんな大好きYahoo!のテキスト解析WebAPIを利用しています。

これを
f:id:chalcedony_htn:20130703213940p:image

こうします
f:id:chalcedony_htn:20130703213941p:image


あくまで自分用に作ったものなので、

  • 参照形式はデフォルトの「現在のページ」のみ
  • 項目のレベルは設定できない(すべてレベル1になる)

という仕様になっています。
あと、APIのアプリケーションIDは消してありますので、もし使用する場合は自分のアプリケーションID(ランダムな英数字になってます)を取得して、「◆◆◆ココにアプリケーションIDを書く◆◆◆」のところに入れてください(1箇所だけです)。YahooのIDを作れば誰でも取得できます。
ちょっと試してみたいという人にはだいぶ不親切ですがご了承ください><


このスクリプトを書くにあたって、2つの記事を大いに参考にさせていただいています。


動作確認は、WinXP + CS4、WinXP + CS5.5、Win7 + CS5.5、MacOSX 10.7.5 + CS3、MacOSX 10.5.8 + CS3、MacOSX 10.5.8 + CS4で行いました。Macでの動作確認にご協力いただいたお二方、ありがとうございました! 遅れてすいません!


■使用前の確認事項

  • なにが起きても泣かないようにデータのバックアップを取りながら使用してください(最重要)。
  • インターネットへアクセスできる環境が必要です。
  • Yahoo!の「日本語形態素解析API」を使用しています。サービスが終了した場合、スクリプトも使用できなくなります。
  • 選択中の文字列をインターネット経由でYahoo!のサービスへ送信します。機密情報などが漏洩した場合でも責任は持ちません。
  • アクセスログなどを見れば、どんな文字列を送信したか誰でもわかります。
  • 記号類は読み仮名から削除されます。


■使用中の注意事項

  • APIが期待通りの読み仮名を返してくるとは限らないので、必ず1件ずつ確認しながら登録してください。
  • 登録直後は索引項目のページ数が表示されません。索引パネルのメニューから[プレビューを更新]を実行すると直ります。
  • 索引登録時、ドキュメントの最初のページ付近にダミーのテキストフレームが作られます。通常は自動的に削除されますが、スクリプトが途中で止まった場合などに残る可能性があります。ひととおり登録したら、フレームが残っていないか確認してください。あったら消してね。
  • なにが起きても泣かないようにデータのバックアップを取りながら使用してください(念押し)。
// 索引登録支援ツール(InDesign CS3〜)
// Yahoo!のテキスト解析APIを利用して索引の読み仮名入力を自動化します。
// http://developer.yahoo.co.jp/webapi/jlp/
//
// 以下の記事をパク^H^H大いに参考にさせていただいています。
// kmutoさん
// via http://d.kmuto.jp/20120912.html
// CLさん
// via http://d.hatena.ne.jp/C_L/20081012/indesign_socket_http
//
// v0.9 2013/04/03
// v1.0 2013/06/03  デフォルトスタイルの初期化処理追加、自分で使用開始
// v1.1 2013/06/17  初期化処理をやめてダミー文字のサイズだけ指定する形に変更
// 
// NYSL http://www.kmonos.net/nysl/
// ==============================================================================


main();


// メインの処理
function main(){

  //Yahoo!APIのアプリケーションID
  var myAppID = "◆◆◆ココにアプリケーションIDを書く◆◆◆";

  // 選択状態チェック(テキストオブジェクトを選択してる状態のみ動作)
  if(app.selection.length == 0 || !app.selection[0].constructor.name.match(/^(Text|Word|Character|Paragraph|Line|TextColumn|TextStyleRange)$/)){
    alert("索引登録可能なテキストを選択してください。");
    return false;
  }

  var actDoc = app.activeDocument;
  var idx = (actDoc.indexes.length > 0) ? actDoc.indexes[0] : actDoc.indexes.add();

  var targ = app.selection[0]; // 選択中のテキスト
  var title = targ.contents;   // 索引項目になる文言

  // APIリクエスト
  var yapiObj = new YAPIReading();
  yapiObj.appid = myAppID;
  var reading = yapiObj.getReading(title); // 読みがなになる文言

  // 表示ダイアログ準備
  // ダイアログで読みがなを修正可能
  var dlg = createDialog();
  dlg.tf.text = title;   // 索引項目欄に入力
  dlg.rf.text = reading; // 読みがな欄に入力
  // 読みがなが空文字(APIがエラー返してきてる)だったらメッセージを上書きする
  if(reading == ""){ dlg.info.text = "読みがなの自動取得に失敗しました。直接入力してください。"; }

  // ダイアログ表示から登録実行
  // 登録ボタンを押すと、その時点の読みがな欄のテキストを読みがなとして登録
  if(dlg.show() == 1){
    title = dlg.tf.text;
    reading = dlg.rf.text;

    try{
      embedIndex(idx, targ, title, reading); // 登録実行
    } catch(e) {
      alert("登録に失敗しました。\n索引項目または読みがなに使えない文字がないか確認してください。");
      arguments.callee();
    }

    return true;
  }

  return false; // 登録しなかったらfalse返すことにしておく(なんとなく)
}





// ***************************************************************************
//
// 以下、関数・オブジェクト定義など
//
// ***************************************************************************


// 索引を追加する関数 ********************************************************
// kmutoさんのアイディア(マーカーのコピペ)を拝借
// via http://d.kmuto.jp/20120912.html
// ***************************************************************************
function embedIndex(index, target, title, reading) {

  // ダミーのテキストフレームを作って★マークとか入れておく
  var dummyFrame = index.parent.pages[0].textFrames.add();
  dummyFrame.geometricBounds = [0, 0, 50, 50]; // サイズは適当
  dummyFrame.insertionPoints[0].pointSize = 1; // 文字あふれ対策にサイズを小さくしておく
  dummyFrame.contents = "★";

  // 項目追加
  // ダミーの★マークのところに索引マーカーを入れる
  index.topics.add(title, reading).pageReferences.add(dummyFrame.characters[0]);

  // マーカー文字をカット&ペーストして正しい位置に移動
  dummyFrame.characters[0].select();
  app.cut();
  target.insertionPoints[0].select();
  app.pasteWithoutFormatting(); // フォーマットなしでペースト

  // ダミーのフレームを始末
  dummyFrame.remove();
}



// ダイアログオブジェクトを作って返す関数 ************************************
// あとで部品にアクセスしやすいようにショートカット作ってある
// dlg.tf   : 項目入力欄
// dlg.rf   : 読みがな入力欄
// dlg.info : 情報欄
// ***************************************************************************
function createDialog(){
  var dlg = new Window("dialog", "索引登録");
  dlg.orientation = "row";
  dlg.alignChildren = "top";

  var inputG = dlg.add("group");
  inputG.orientation = "column";
  inputG.alignChildren = "left";
  var infoLabel = inputG.add("statictext", undefined, "読みがなを修正してください。キャンセルすると登録を中止します。");

  var inputTitle = inputG.add("group");
  inputTitle.orientation = "row";
  var titleLabel = inputTitle.add("statictext", undefined, "索引項目:");
  var titleField = inputTitle.add ("statictext", undefined, undefined);
  titleLabel.characters = 9;
  titleField.characters = 35;

  var inputReading = inputG.add("group");
  inputReading.orientation = "row";
  var readingLabel = inputReading.add("statictext", undefined, "読みがな:");
  var readingField = inputReading.add ("edittext", undefined, undefined);
  readingLabel.characters = 9;
  readingField.characters = 35;

  var buttonG = dlg.add("group");
  buttonG.orientation = "column";
  buttonG.add("button", undefined, "登録", {name: "ok"});
  buttonG.add("button", undefined, "キャンセル", {name: "cancel"});

  // ショートカット定義
  dlg.tf = titleField;
  dlg.rf = readingField;
  dlg.info = infoLabel;

  return dlg;
}



// 読みがな取得用クラス定義 **************************************************
// アプリケーションIDはインスタンス側で設定する
//
// var hoge = new YAPIReading();      // インスタンス作成
// hoge.appid = "★★アプリケーションID★★"; // 自分のアプリケーションIDを指定する
// var title = "僕の妹は漢字が読める";     // 読みたい文言
// var reading = hoge.getReading(title);     // 解析結果を取得
//
// ってする
// 記号類はfilterで除去。これも変更可能
// 読みがな部分の抽出はテキストそのまま正規表現でぶっこぬき。XML解析なにそれおいしいの
// ***************************************************************************
function YAPIReading(){
  this.appid    = "";
  this.filter   = "1|2|3|4|5|6|7|8|9|10|11|12";
  this.response = "reading";
  this.results  = "ma";

  this.rex = /<reading>(.*?)<\/reading>/g; // <reading>要素を見つける正規表現(gオプション付き)

  this.getReading = function(sentence){
    var reading = "";

    var requestURI = 'http://jlp.yahooapis.jp/MAService/V1/parse?'
                   + 'appid=' + this.appid
                   + '&ma_filter=' + this.filter
                   + '&response='  + this.response
                   + '&results='   + this.results
                   + '&sentence='  + encodeURI(sentence);

    var lwp = new Lwp();
    var result = lwp.get(requestURI);

    // gオプション付きRegExpオブジェクトのexecループ
    // <reading>要素を見つけるたびに中身のテキストを足していく
    var m;
    while (m = this.rex.exec(result)) {
      reading += m[1];
    }
    return reading; // リクエストに失敗した場合はreadingタグがないので空文字になってるはず
  }
  return this;
}


// HTTPアクセス(GET)用クラス定義 *******************************************
// CLさんのモジュールを微改造
// via http://d.hatena.ne.jp/C_L/20081012/indesign_socket_http
// prototypeをやめてUser-Agentをそれっぽくしただけ
// ***************************************************************************
function Lwp() {
  this.userAgent = "InDesign/" + app.version + " (InDesign " + app.version + "; " + $.os + "; ja)";
  this.uri = function(uri) {
    var rex = new RegExp('http://([^:/]+)(?::(\d+))?(.+)');
    // via http://pc11.2ch.net/test/read.cgi/php/1015692614/57
    var urlObj =[];
    if ( uri.match(rex) ) {
      urlObj.host = RegExp.$1;
      urlObj.port = RegExp.$2 ?RegExp.$2 :80;
      urlObj.path = RegExp.$3;
    }
    return urlObj;
  }
  this.get = function (uri) {
    var conn = new Socket;
    var urlObj = this.uri(uri);
    if ( conn.open(urlObj.host + ':' + urlObj.port, 'UTF-8') ) {
      conn.write ("GET " + urlObj.path + " HTTP/1.0\n" + "Host: " + urlObj.host + "\n" + "User-Agent: " + this.userAgent + "\n\n");
        var reply = conn.read(999999);
        conn.close();
      return reply.substring(reply.indexOf("\n\n") + 2);
    }
  }
  return this;
};

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

JavaScriptの条件演算子(三項演算子)

PCの中身を整理したので、お蔵出しシリーズと称して、昔自分のために書いた文章を供養していこうと思います。たぶんあんまり続かない。
今回は2008年2月に書いたらしいものに加筆修正しました。

基本(条件演算子の記法)

if(条件式) {
  条件式が真(true)の場合の処理
}
else {
  条件式が偽(false)の場合の処理
}

っていう文と同じ処理をする式を、

(条件式) ? 条件式が真の場合に評価する式 : 条件式が偽の場合に評価する式

と書くことができる。


?:を条件演算子という。JavaScriptでは唯一、項(被演算子)が三つの演算子なので、三項演算子とも呼ばれる。


条件式のカッコ()は可読性のために入れただけで、必須ではない。同じくスペースも必須ではない。

  • それぞれの項はすべて式である
  • 全体が一つの式になっている
  • 式なので全体をカッコ()でくくってもよい

という点に注目。といってもこれは演算子が作る式ならすべてに当てはまるのだけど。

条件式 ?
条件式が真の場合に評価する式 :
条件式が偽の場合に評価する式

とかなんとか、途中で改行してもOK。

式の評価結果

全体で一つの式になっているので、全体で一つの値を返す。
返す値は最後に評価された式の値になる。


たとえば、変数aに(xの値に応じて)bまたはcを代入したい場合、if文を使うとこんな風になる。

x = 10;
if(x == 10) {
  a = b;
}
else {
  a = c;
}
// 結果:aにbが代入される

これを省略して

x = 10;
(x == 10) ? a = b : a = c;
// 結果:aにbが代入される

と書けて、さらに省略して

x = 10;
a = (x == 10) ? b : c;
// 結果:aにbが代入される

と書ける。
演算子の優先順位にもとづき、代入演算子=より条件演算子?:のほうが先に評価されるので、「(x == 10) ? b : c」という式の値がaに代入される。


最後の書き方は個人的によく使ってる。変数に代入するという目的が目に見えやすい気がするので。


あとは、たとえば「引数が条件に合うかどうかを真偽値で返す関数」が

function hoge(huga) { return (huga == piyo) ? true : false; }

とか書けたりする。
if文が増えないからすっきり。でもこっちはやり過ぎるとたぶんあとで読めない。

応用1:入れ子にもできる

全体が式なので、入れ子にもできる。たとえば

if(x < 10) {
  y = a;
}
else if(x < 20) {
  y = b;
}
else if(x < 30) {
  y = c;
}
else {
  y = d;
}

は、

y = (x < 10) ? a : (x < 20) ? b : (x < 30) ? c : d;

と書ける。改行もできるので

y = (x < 10) ? a :
    (x < 20) ? b :
    (x < 30) ? c :
    d;

とか書いてもいい。
素直にifかswitchで書いたほうが、条件分岐ってことがわかりやすくていいと思う。人の書いたコードで見つけたときに面食らわない程度におぼえておく。

応用2:配列/ハッシュの添え字にもできる

くどいようだが式なので、配列やハッシュの添え字にもできる。

var arr = new Array("あ","い","う","え");
var x = 10;

alert(arr[(x==10)?1:3]); // 結果:「い」

使う必要ないと思う。役に立つのはブックマークレットを作るときくらいかな。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

JavaScriptのループ文まとめ

お蔵出しシリーズ2。2008年2月に書いたらしいものに加筆したら原型がなくなりました。

ループ文とは

通常は上から下に処理が進んでいくプログラムを、一定条件に当てはまるあいだだけ繰り返し処理する制御文。

for文

初期値、条件、増減式を設定して、条件が真であるあいだ、一定の処理を繰り返す命令。
正確に言うと条件が偽になったら処理をしないでループを抜ける、ってことになる。


ループ用の変数に初期値(数値)を代入して、それを増減してループ回数を制御する。なので、主にループ回数が開始前に設定できる場合に使う。

for( 式1 ; 式2 ; 式3 ) {
  繰り返したい処理
}
式1
初期値を設定する式。ループ開始前に一度だけ評価される。
式2
条件式。毎回のループの最初に評価され、もしも偽(false)だったら{}内の処理を行わずにループを抜ける。
式3
ループ用の変数の値を増減する式。後処理。毎回のループの最後に評価される。式2が偽になった場合はその時点でループを抜けてしまうので、この式は実行されない。


ちなみに、式1と式3には複数の式を書くことができる。その場合は式をカンマ , で区切ること。*1
例えば「配列arrの要素を順番にすべて書き出す」みたいな処理をしたい場合、

var arr = [10, 20, 30, 40];
for( var i = 0 ; i < arr.length ; i++ ) {
  alert( arr[i] );
}
// 結果:「10」「20」「30」「40」

って書いてもいいんだけど、これだと式2にあたる「 i arr.length 」の評価時にいちいち配列の要素数を調べることになる。

var arr = [10, 20, 30, 40];
for( var i = 0 , arr_len = arr.length ; i < arr_len ; i++ ) {
  alert( arr[i] );
}
// 結果:「10」「20」「30」「40」

こうすれば、要素数を調べる処理はループ開始前の一回だけで済む。ループ回数が最初に固定できる場合は、採用すると処理が早くなるかも。

while 文

条件を設定し、それが真である間、一定の処理を繰り返す命令。

while( 条件式 ) {
  繰り返したい処理
}

初期値の設定や後処理がないので、ループ内で条件を変更するか、break(後述)とかでループを抜ける必要がある。でないと無限ループになる。

while(true) {
  breakがなければ無限ループされる処理
}


forのところで書いた「配列arrの要素を順番にすべて書き出す」処理をwhile文でやる場合、

var arr = [10, 20, 30, 40];
var i = 0, arr_len = arr.length;
while( i < arr_len ) {
  alert( arr[i] );
  i++;
}
// 結果:「10」「20」「30」「40」

って書くと、for文とまったく同じことができる。


もうちょっと抽象化すると、

for( 式1 ; 式2 ; 式3 ) {
  繰り返したい処理
}

式1;
while( 式2 ) {
  繰り返したい処理
  式3;
}

が同じということ。
でもwhileでこれをやるくらいなら素直にfor使えばいいと思う。


whileの場合、たとえばarrを破壊してしまってもいいなら以下のようなことができる。

var arr = [10, 20, 30, 40];
while( arr.length ) {
  alert( arr.shift() );
}
// 結果:「10」「20」「30」「40」

Array.shift()は配列から最初の要素を取り除き、その要素を返す。
ループのたびに配列arrから要素がひとつずつ減っていって、要素がなくなったら次のループ開始時には条件式「 arr.length 」が0(真偽値に変換するとfalse)になるので、ループを抜ける。
複数行にわたる文字列を取得して、一行ずつ最後まで処理したい場合なんかに使える。

do-while 文

while文と似てるけど、これは一度は必ず一定の処理を行い、その後、条件が真のあいだだけ同じ処理を繰り返す場合に使う命令。

do {
  一度は必ず行うけど、もしかしたら繰り返したいかもしれない処理
} while( 条件式 )

for文やwhile文の場合、条件式が最初からfalseだったらその時点でループを抜けてしまうので、{}内の処理は一度も行われない。
do-while文では、条件式は{}内の処理が行われた後に評価される。なので条件式の結果がどうであっても、とりあえず一度は必ず処理が行われる。

つっても、今までこれ使う機会は一度もなかったんだが……

break文、continue文

ループの途中で処理の流れを中断したい場合に使う命令文。
breakの場合は処理を中断し、直ちにループを抜け、次の処理に移る。

for( var i = 0 ; i < 10 ; i++ ) {
  if( i==5 ) {
    break; // forループを脱出
    alert( "ここは処理されない" );
  }
  alert( "i = " + i );
}
alert( "ループ外 i = " + i );
// 結果:「i = 0」「i = 1」「i = 2」「i = 3」「i = 4」「ループ外 i = 5」

breakでループを抜けた場合、ループ終了時の処理(「i++」の部分)は行われていない。

continueの場合は、直ちにその回のループ終了処理を行う

for( var i=0 ; i<10 ; i++ ) {
 if( i==5 ) {
    continue; // ループ1回分をここで終了する
    alert( "ここは処理されない" );
  }
  alert ( "i = " + i );
}
alert( "ループ外 i = " + i );
// 結果:「i = 0」「i = 1」「i = 2」「i = 3」「i = 4」「i = 6」「i = 7」「i = 8」「i = 9」「ループ外 i = 10」

while文の場合は、条件の変更前にcontinueを置いてしまうと無限ループになるので注意。

for-in文

for-in文はfor文から派生した構文。
配列の各要素……というか、オブジェクトの各プロパティにアクセスして、同じ処理を繰り返す場合に使う。

var arr = [10, 20, 30, 40];
for( var i in arr ) {
  alert( arr[i] );
}
// 結果:「10」「20」「30」「40」すべての要素を列挙

ちなみに i にはオブジェクトのプロパティ名(文字列)が入る。

var arr = [10, 20, 30, 40];
for( var i in arr ) {
  alert( i + " : " + typeof i );
}
// 結果:「0 : string」「1 : string」「2 : string」「3 : string」

数値に見えるけど文字列。


例は配列で書いたけど、実はfor-inは配列に使わないほうがいい。
以下は理由。わからなければ「使っちゃいけないのねフーン」でいいと思う(よくないけど)。


for-in構文は「オブジェクトのプロパティ」にアクセスするので、例えば他のところでArrayオブジェクトが拡張された場合、そのプロパティまで列挙してしまう。

Array.prototype.hoge = function(){ alert("ほげー"); }; // Arrayオブジェクトを拡張
var arr = [10, 20, 30, 40];

for( var i in arr ) {
  alert( arr[i] );
}
// 結果:「10」「20」「30」「40」「function(){ alert("ほげー"); }」最後のはhogeの中身が見えてる

オブジェクト(インスタンス)自身が持っているプロパティだけを列挙したいときは、都度hasOwnProperty()で判定すればOK。

Array.prototype.hoge = function(){ alert("ほげー"); }; // Arrayオブジェクトを拡張
var arr = [10, 20, 30, 40];

for( var i in arr ) {
  if(arr.hasOwnProperty(i)){
    alert( arr[i] );
  }
}
// 結果:「10」「20」「30」「40」hogeはarrが持っているプロパティじゃないのではじかれる
var arr = [10, 20, 30, 40];
arr.hoge = function(){ alert("ほげー"); }; // arrに対してhogeメソッドを追加

for( var i in arr ) {
  if(arr.hasOwnProperty(i)){
    alert( arr[i] );
  }
}
// 結果:「10」「20」「30」「40」「function(){ alert("ほげー"); }」hogeも列挙される

for-inのループはプロパティを定義した順番で行われる(正確には、プロパティに値を代入した順番)。
また、プロパティの値が定義されていないものは無視される。

var obj = new Object;
obj.age;               // 宣言だけはしたけど未定義(undefined)
obj.name = "権兵衛";
obj.age  = "20";       // ここで値を代入
obj.addr = "ちば";
obj.hobby;             // 宣言だけはしたけど未定義(undefined)
for( var i in obj ) {
  alert( i + " : " + obj[i]);
}
// 結果:「name : 権兵衛」「age : 20」「addr : ちば」hobbyは出てこない


疲れたのでこの辺で切り上げ。

*1:正確に言うと、式1〜式3のそれぞれが式であればいいので、複数の式をカンマ演算子でつないで一つの式にしているというだけ。式2も同じことができるけど、評価後の値によって分岐するので順番が大事になる。ループ毎に処理したいものは素直に式3に書いたほうがいい。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

JavaScriptのArray.sort覚え書き

お蔵出しシリーズ3。いつだか忘れたけど昔書いて、2013年5月にリライトしたらしいものをほぼそのまま。どうでもいいけどこのシリーズ、タイトルを統一しようとする気持ちがまったく見受けられませんね。

基本

array.sort(比較関数);

配列arrayの要素を、比較関数(省略可)に基づいて並べ替える。並べ替えは破壊的に行われる、つまり配列array自体が並べ替えられて、元の順番は保存されない。

比較関数を省略した場合

配列arrayの各要素を文字列として比較し、辞書順に並べ替える。

たとえば以下のように処理される。

var array = [10,9,5,15,60];
array.sort();

alert(array); // [10,15,5,60,9] ←数値順ではない
alert(typeof array[0]); // number ←要素としてはnumberのまま

数値順に並べ替えたい場合、あるいはもっと複雑な比較を行って並べ替えたい場合は、比較関数の指定が必要。

比較関数

比較関数には2つの要素が引数として渡され、戻り値に応じてその要素の順序が入れ替えられる。仮に比較関数の第一引数をa、第二引数をbとしたとき、

戻り値 0 aが前に来るように並べ替えられる
戻り値 == 0 保証なし(順序を入れ替えないことになっている)
戻り値 > 0 bが前に来るように並べ替えられる

という処理が行われる。

function compare(a, b){
  if(aがbより小) {
    return -1; // 負の数であればなんでもいい
  }
  if(aがbより大) {
    return 1;  // 正の数であればなんでもいい
  }
  return 0;
}

array.sort(compare);

compareを別に定義せず、sortメソッド実行時に指定してもよい。無名関数でもOK。

array.sort(function(a, b){
  if(aがbより小) { return -1; } // 負
  if(aがbより大) { return 1;  } // 正
  return 0;
});

要するに、「こういう基準で要素を並べ替えてね」というのをsortメソッドに教えるためのもの。

例:数値の配列を数値として小さい順に並べ替えたいとき
var array = [10,9,5,15,60];

array.sort(function(a, b){ return a - b; });

alert(array); // [5,9,10,15,60] ←数値順

aとbどちらも数値であれば減算できる。aがbより小さければ式「a - b」の結果は負の数になるので、そのまま戻り値にしている。

例:オブジェクトの配列を、各オブジェクトのプロパティ「value」の値が大きい順に並べ替えたいとき
array.sort(function(a, b){
  if(a.value > b.value) { return -1; } // a.valueが大きければ負
  if(a.value < b.value) { return 1;  } // a.valueが小さければ正
  return 0;
});

これだけ覚えろ


aをbよりに置きたいときは戻り値をにする

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

parseIntとparseFloatの覚え書き

前フリが思いつかない件について。
この記事の主旨は一言で言うと「parseIntには第2引数で基数を指定しよう」です。

基本

parseIntとparseFloatは、どちらも引数として渡された文字列をパースして数値に変換するグローバル関数。
parseIntは整数、parseFloatは小数と整数の両方(浮動小数点数)を扱える。

parseInt("100")    // 100
parseInt("3.14")   // 3

parseFloat("100")  // 100
parseFloat("3.14") // 3.14

パース方法とNaN

parseIntとparseFloatは、どちらも引数の文字列を先頭から1文字ずつ確認し、数値と解釈できない文字が見つかった時点で、その直前までの部分を数値として返す。
一文字も数値にできなかった場合はNaN(数値ではないことを表す数値型の値)を返す。

わかりにくいので例を。

parseInt("100pt")     // 100
parseInt("-3.14pt")   // -3
parseInt("314e-2")    // 314
parseInt("hoge123")   // NaN

parseFloat("100pt")   // 100
parseFloat("-3.14pt") // -3.14
parseFloat("314e-2")  // 3.14
parseFloat("hoge123") // NaN

parseFloatが数値と解釈できるのは、正負符号(+/-)、0〜9の数字、小数点、指数(e)。
parseIntはそこから小数点を除いたもの……ではなくて、実はもうちょっと複雑。

parseIntの第2引数(基数)

parseIntの引数として、パースしたい文字列のほかに、「何進数として解釈するか」という基数を渡すことができる。
基数は文字列でなくて数値で渡すことに注意。

parseInt("15", 10) // 15
parseInt("15", 8)  // 13
parseInt("15", 16) // 21

同じ"15"という文字列を、10進数、8進数、16進数でパースした値が返ってくる。

基数の指定によって、数として解釈できる文字は変わってくる。ちょっと複雑と言ったのはこのこと。

parseInt("19e", 10) // 19("e"はパース不可)
parseInt("19e", 8)  // 1 ("9e"はパース不可)
parseInt("19e", 16) // 414

基数を省略した場合、通常は10進数でパースされる。のだけど、省略するとけっこう危険だったりする。

基数を省略した場合

もしくは、基数に0を指定した場合、自動的に以下のように解釈されることが多い。

  • "0x"または"0X"で始まる文字列が渡された場合、基数は16(16進数)と解釈される。
  • "0"で始まる文字列が渡された場合、基数は8(8進数)と解釈される。
  • その他の文字で始まる文字列が渡された場合、基数は10(10進数)と解釈される。
parseInt("0x15") // 21(16進数として解釈)
parseInt("015")  // 13(8進数として解釈)※実装による
parseInt("15")   // 15(10進数として解釈)


16進数はともかく、この8進数がなかなか厄介で……

parseInt("015")  // 13(8進数)※実装による
parseInt("019")  // 1 (8進数、"9"はパース不可)※実装による
parseInt("08")   // 8 (8進数だとNaNになるので10進数で解釈)※実装による


あるでしょう、ノンブルとかで先頭をゼロで埋めてるやつ。
それをうっかりparseInt(textframe.contents)なんてやってしまうと、ページによって変な数値が返ってくる可能性があるということ。

余談

先頭の文字列が"0x"なら16進数、というのは、JavaScript(というか、ECMAScript)の仕様として規定されている。しかし実は先頭が"0"の場合は、「8進数にしてもいいよ(どっちかいうと10進数でやってね)」ということになっていた。
実装では8進数を採用したものが多いけど、確実ではないらしい。つまり実行する環境によって結果がまちまちということ。さっきから※実装によるって書いてるのはそういうことです。

いちおう現在の最新の仕様では、"0x"と"0X"を16進数とするのを除けばデフォルトは10進数、と定められている。けど実装のほうは今のところほとんど追いついてないらしい。AdobeのESTKでも8進数になるしね。

というわけで、この記事の主旨


parseIntには第2引数で基数を指定しよう


大事なことなので2回いいました。ちなみにparseFloatは常に10進数で、基数指定はできません。

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加

PhotoshopドキュメントをJavaScriptで別名保存する

たまにはアプリケーションに特化したことを書こうのコーナーです(今考えた)。

いわゆる「別名保存」はDocment.saveAs()メソッドを使うんだけど、オプション類をいちいち調べるのが嫌になったのでまとめます。
なお、以下はPhotoshop CS6 Javascript Scripting Reference(リンク先PDF)を信用して書いたものです。ESTK付属のオブジェクトモデルビューアよりずっと使いやすいのでおすすめ。

Document.saveAs() 書式

Document.saveAs(saveIn[, options][, asCopy][, extensionType]);
引数 説明
saveIn File 必須。保存先になるFileオブジェクト。ここで拡張子つけても無視してpsd形式にされる。他の形式にしたい場合はオプションで指定する必要がある。
options varies
(いろいろ)
保存オプション。ファイル形式、および保存時のオプションを指定する。ファイル形式ごとにオブジェクト(クラス)が異なる。詳しくはあとで。
asCopy boolean 複製として保存するかどうか。オプション。
extensionType Extension 拡張子の書式。オプション。

Extension.LOWERCASE 小文字
Extension.NONE 拡張子なし
Extension.UPPERCASE 大文字

保存先Fileオブジェクト

var fileobj = new File("ファイルパス");

とかして作ればいいんじゃないですかね(投げやり)。

保存オプション

オプションは保存形式ごとに別々のクラスが用意されている。ふつうにGUIで保存するときもそうだけど、形式によってオプションがまるで違うからだと思う。
例えばjpg形式なら、

var saveOptions = new JPEGSaveOptions;
saveOptions.embedColorProfile = true;
saveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
saveOptions.quality = 12;
// 他、各プロパティを設定

app.activeDocument.saveAs(fileobj, saveOptions, false, Extension.LOWERCASE)

って感じでオブジェクトを作ってから、saveAs()実行時に引数として渡す。

とりあえず順番にいきましょう。これ使うの?ってのもあるけど。

BMP

BMPSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。たぶん32bitのときだけ。
depth BMPDepthType ビット数。

BMPDepthType.ONE 1bit
BMPDepthType.FOUR 4bit
BMPDepthType.EIGHT 8bit
BMPDepthType.SIXTEEN 16bit
BMPDepthType.TWENTYFOUR 24bit
BMPDepthType.THIRTYTWO 32bit

詳細モードだともっとあるけど略
flipRowOrder boolean 行の順序の反転。osTypeがWindowsのときだけ動作。
osType OperatingSystem ファイル形式。

OperatingSystem.OS2 OS/2
OperatingSystem.WINDOWS Windows
rleCompression boolean RLE圧縮するかどうか。osTypeがWindowsでdepthが4bitか8bitのときだけ動作。
typename string オブジェクトのクラス名。readonly。"BMPSaveOptions"
DCS 1.0

DCS1_SaveOptions

プロパティ 説明
dCS DCSType プレビュー用ファイルの形式。

DCSType.COLORCOMPOSITE カラープレビュー
DCSType.GRAYSCALECOMPOSITE グレースケールプレビュー
DCSType.NOCOMPOSITE プレビューなし
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
encoding SaveEncoding エンコーディング形式。

SaveEncoding.ASCII ASCII
SaveEncoding.BINARY バイナリ
SaveEncoding.JPEGLOW JPEG(低画質)
SaveEncoding.JPEGMEDIUM JPEG(標準画質)
SaveEncoding.JPEGHIGH JPEG(高画質)
SaveEncoding.JPEGMAXIMUM JPEG(最高画質)
halftoneScreen boolean ハーフトーンスクリーンを保持するかどうか。
interpolation boolean プレビューに画像補間方式(バイキュービック)を適用するかどうか。
preview Preview EPSプレビュー形式。

Preview.EIGHTBITTIFF 8bitTIFF
Preview.MACOSEIGHTBIT Mac 8bitTIFF
Preview.MACOSJPEG Mac JPEG
Preview.MACOSMONOCHROME Mac 1bitTIFF(モノクロ)
Preview.MONOCHROMETIFF 1bitTIFF(モノクロ)
Preview.NONE なし
transferFunction boolean トランスファー関数を保持するかどうか。
typename string オブジェクトのクラス名。readonly。"DCS1_SaveOptions"
vectorData boolean ベクターデータを保持するかどうか。
DCS 2.0

DCS 1.0のプロパティに加えて、以下のプロパティがある。typenameは当然"DCS2_SaveOptions"になる。
DCS2_SaveOptions

プロパティ 説明
multiFileDCS boolean カラーチャンネルを複数ファイルとして出力するかどうか。falseで単一ファイルになる。
spotColors boolean 特色チャンネルを保持するかどうか。
EPS

ほとんどDCSとかぶってるけど改めて全部書いておく。
EPSSaveOptions

プロパティ 説明
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
encoding SaveEncoding エンコーディング形式。

SaveEncoding.ASCII ASCII
SaveEncoding.BINARY バイナリ
SaveEncoding.JPEGLOW JPEG(低画質)
SaveEncoding.JPEGMEDIUM JPEG(標準画質)
SaveEncoding.JPEGHIGH JPEG(高画質)
SaveEncoding.JPEGMAXIMUM JPEG(最高画質)
halftoneScreen boolean ハーフトーンスクリーンを保持するかどうか。
interpolation boolean プレビューに画像補間方式(バイキュービック)を適用するかどうか。
preview Preview EPSプレビュー形式。

Preview.EIGHTBITTIFF 8bitTIFF
Preview.MACOSEIGHTBIT Mac 8bitTIFF
Preview.MACOSJPEG Mac JPEG
Preview.MACOSMONOCHROME Mac 1bitTIFF(モノクロ)
Preview.MONOCHROMETIFF 1bitTIFF(モノクロ)
Preview.NONE なし
psColorManagement boolean PostScriptカラーマネジメントを有効にするかどうか。
transferFunction boolean トランスファー関数を保持するかどうか。
transparentWhites boolean 白色部分を透明として扱うかどうか。モノクロ二階調時(document.modeがDocumentMode.BITMAPのとき)のみ有効。
typename string オブジェクトのクラス名。readonly。"EPSSaveOptions"
vectorData boolean ベクターデータを保持するかどうか。
GIF

GIFSaveOptions

プロパティ 説明
colors number 表示色数。
dither Dither ディザ方式。

Dither.DIFFUSION 誤差拡散法
Dither.NOISE ノイズ
Dither.NONE なし
Dither.PATTERN パターン
ditherAmount number ディザの適用量(1〜100)。誤差拡散法の適用時のみ有効。
forced ForcedColors 使用しているかどうかに関わらず強制的にパレットに含む色。
ForcedColors.BLACKWHITE 白黒
ForcedColors.NONE なし
ForcedColors.PRIMARIES レッド、グリーン、ブルー、シアン、マゼンタ、イエロー、黒、白
ForcedColors.WEB Webセーフカラー
interlaced boolean インターレースを有効にするかどうか。
matte MatteType マット。透明部分(不透明度が100%でない箇所)の背景色を塗りつぶす色の設定。transparencyプロパティがtrueの場合は完全な透明部分(不透明度0%の箇所)には適用されない。

MatteType.BACKGROUND 背景色
MatteType.BLACK 黒
MatteType.FOREGROUND 描画色
MatteType.NETSCAPE ネットスケープグレー
MatteType.NONE なし
MatteType.SEMIGRAY 50%グレー
MatteType.WHITE 白
palette PaletteType パレットの設定。

PaletteType.EXACT 使用中の色をすべて割り付ける
PaletteType.LOCALADAPTIVE ローカル(割り付け)
PaletteType.LOCALPERCEPTUAL ローカル(知覚)
PaletteType.LOCALSELECTIVE ローカル(特定)
PaletteType.MACOSPALETTE Mac
PaletteType.MASTERADAPTIVE マスター(割り付け)
PaletteType.MASTERPERCEPTUAL マスター(知覚)
PaletteType.MASTERSELECTIVE マスター(特定)
PaletteType.PREVIOUSPALETTE 前回と同じ
PaletteType.UNIFORM ?
PaletteType.WEBPALETTE Web
PaletteType.WINDOWSPALETTE Windows
preserveExactColors boolean 同一色の保持。ディザの設定が誤差拡散法の場合、カラーテーブルに含まれる色を保護するかどうか。
transparency boolean 透明箇所を維持するかどうか。
typename string オブジェクトのクラス名。readonly。"GIFSaveOptions"
JPEG

JPEGSaveOptions

プロパティ 説明
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
formatOptions FormatOptions JPEGフォーマット。

FormatOptions.OPTIMIZEDBASELINE ベースライン(最適化)
FormatOptions.PROGRESSIVE プログレッシブ
FormatOptions.STANDARDBASELINE ベースライン(標準)
matte MatteType マット。透明部分(不透明度が100%でない箇所)の背景色を塗りつぶす色の設定。

MatteType.BACKGROUND 背景色
MatteType.BLACK 黒
MatteType.FOREGROUND 描画色
MatteType.NETSCAPE ネットスケープグレー
MatteType.NONE なし
MatteType.SEMIGRAY 50%グレー
MatteType.WHITE 白
quality number 画質。1〜12の数値。
scans number プログレッシブ形式のスキャン数(完全に表示されるまでの段階の数)。3〜5の数値。
typename string オブジェクトのクラス名。readonly。"JPEGSaveOptions"
PDF

PDFSaveOptions
多すぎ。プリセット作って適用するのがいいと思う。

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
annotations boolean 注釈を保持するかどうか。
colorConversion boolean カラー変換するかどうか。
convertToEightBit boolean 16bit画像を8bit画像に変換するかどうか。
description string 保存オプションの説明文。
destinationProfile string 出力先カラープロファイル。文字列で指定。
downgradeColorProfile boolean (非推奨)
downSample PDFResample ダウンサンプル方式。

PDFResample.NONE なし
PDFResample.PDFAVERAGE ダウンサンプル(バイリニア法)
PDFResample.PDFBICUBIC ダウンサンプル(バイキュービック法)
PDFResample.PDFSUBSAMPLE サブサンプル(ニアレストネイバー法)
downSampleSize number 画像ダウンサンプル後の解像度。ppiで指定。
downSampleSizeLimit number 画像ダウンサンプルを行う対象になる解像度(この値を超えたら適用)。ppiで指定。
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
embedFonts boolean (非推奨)
embedThumbnail boolean サムネイルを埋め込むかどうか。
encoding PDFEncoding 画像の圧縮形式。

PDFEncoding.JPEG JPEG(画質を数値で指定可能)
PDFEncoding.JPEG2000HIGH JPEG2000最高
PDFEncoding.JPEG2000LOSSLESS JPEG2000 ロスレス
PDFEncoding.JPEG2000LOW JPEG2000最低
PDFEncoding.JPEG2000MED JPEG2000
PDFEncoding.JPEG2000MEDHIGH JPEG2000
PDFEncoding.JPEG2000MEDLOW JPEG2000
PDFEncoding.JPEGHIGH JPEG最高
PDFEncoding.JPEGLOW JPEG最低
PDFEncoding.JPEGMED JPEG
PDFEncoding.JPEGMEDHIGH JPEG
PDFEncoding.JPEGMEDLOW JPEG
PDFEncoding.NONE なし
PDFEncoding.PDFZIP ZIP8bit
PDFEncoding.PDFZIP4BIT ZIP4bit
interpolation boolean (非推奨)
jpegQuality number 画質。1〜12の数値。encodingプロパティがPDFEncoding.JPEGの時のみ有効。
layers boolean レイヤーを保持するかどうか。
optimizeForWeb boolean Web表示用に最適化するかどうか。
outputCondition string PDF/Xの出力条件。
outputConditionID string PDF/Xの出力条件ID。
PDFCompatibility PDFCompatibility PDFの互換バージョン。

PDFCompatibility.PDF13 1.3
PDFCompatibility.PDF14 1.4
PDFCompatibility.PDF15 1.5
PDFCompatibility.PDF16 1.6
PDFCompatibility.PDF17 1.7
PDFStandard PDFStandard PDF/X規格。

PDFStandard.NONE なし
PDFStandard.PDFX1A2001 PDF/X-1a:2001
PDFStandard.PDFX1A2003 PDF/X-1a:2003
PDFStandard.PDFX32002 PDF/X-3:2002
PDFStandard.PDFX32003 PDF/X-3:2003
PDFStandard.PDFX42008 PDF/X-4:2008
preserveEditing boolean 編集機能を保持するかどうか。
presetFile string PDF書き出しプリセット(名前)。指定すると他のプロパティよりプリセットの設定が優先される。
profileInclusionPolicy boolean プロファイルを埋め込むかどうか。
registryName string PDF/Xのレジストリ名。
spotColors boolean 特色を保持するかどうか。
tileSize nunber 画像の圧縮形式がJPEG2000の場合のタイル数。encodingプロパティがPDFEncoding.JPEG2000の時のみ有効。
transparency boolean (非推奨)
typename string オブジェクトのクラス名。readonly。"PDFSaveOptions"
useOutlines boolean (非推奨)
vectorData boolean (非推奨)
view boolean 保存後にPDFを表示するかどうか。
PSD

PhotoshopSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
annotations boolean 注釈を保持するかどうか。
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
layers boolean レイヤーを保持するかどうか。
spotColors boolean 特色を保持するかどうか。
typename string オブジェクトのクラス名。readonly。"PhotoshopSaveOptions"
PICTファイル

PICTFileSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
compression PICTCompression 圧縮形式。

PICTCompression.JPEGHIGHPICT
PICTCompression.JPEGLOWPICT
PICTCompression.JPEGMAXIMUMPICT
PICTCompression.JPEGMEDIUMPICT
PICTCompression.NONE なし
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
resolution PICTBitsPerPixels bit数。

PICTBitsPerPixels.EIGHT
PICTBitsPerPixels.FOUR
PICTBitsPerPixels.SIXTEEN
PICTBitsPerPixels.THIRTYTWO
PICTBitsPerPixels.TWO
typename string オブジェクトのクラス名。readonly。"PICTFileSaveOptions"
PICTリソース

Photoshopでは読み込み専用(書き出せない)。
PICTResourceSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
compression PICTCompression 圧縮形式。

PICTCompression.JPEGHIGHPICT
PICTCompression.JPEGLOWPICT
PICTCompression.JPEGMAXIMUMPICT
PICTCompression.JPEGMEDIUMPICT
PICTCompression.NONE なし
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
name string PICTリソースの名前。
resolution PICTBitsPerPixels bit数。

PICTBitsPerPixels.EIGHT
PICTBitsPerPixels.FOUR
PICTBitsPerPixels.SIXTEEN
PICTBitsPerPixels.THIRTYTWO
PICTBitsPerPixels.TWO
resourceID number PICTリソースのID。
typename string オブジェクトのクラス名。readonly。"PICTResourceSaveOptions"
PXR

PixarSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
typename string オブジェクトのクラス名。readonly。"PixarSaveOptions"
PNG

PNGSaveOptions

プロパティ 説明
compression number 圧縮設定。0〜9の数値? デフォルトは0
interlaced boolean インターレースを有効にするかどうか。
typename string オブジェクトのクラス名。readonly。"PNGSaveOptions"
RAW

RawSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
spotColors boolean 特色を保持するかどうか。
typename string オブジェクトのクラス名。readonly。"RawSaveOptions"
SGIRGB

標準ではインストールされない形式らしい(知らない)。
SGIRGBSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
spotColors boolean 特色を保持するかどうか。
typename string オブジェクトのクラス名。readonly。"SGIRGBSaveOptions"
TGA(Targa)

TargaSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
resolution TargaBitsPerPixels 色数。

TargaBitsPerPixels.SIXTEEN 16bit
TargaBitsPerPixels.TWENTYFOUR 24bit
TargaBitsPerPixels.THIRTYTWO 32bit
rleCompression boolean RLE圧縮するかどうか。
typename string オブジェクトのクラス名。readonly。"TargaSaveOptions"
TIFF

TiffSaveOptions

プロパティ 説明
alphaChannels boolean アルファチャンネルを保持するかどうか。
annotations boolean 注釈を保持するかどうか。
byteOrder ByteOrder バイト順序。

ByteOrder.IBM IBM PC
ByteOrder.MACOS Macintosh
embedColorProfile boolean カラープロファイルを埋め込むかどうか。
imageCompression TIFFEncoding 圧縮形式。

TIFFEncoding.JPEG JPEG
TIFFEncoding.NONE なし
TIFFEncoding.TIFFLZW LZW
TIFFEncoding.TIFFZIP ZIP
interleaveChannels boolean ピクセルの順序。trueでインターリーブになる。
jpegQuality number 画質。1〜12の数値。encodingプロパティがPDFEncoding.JPEGの時のみ有効。
layerCompression LayerCompression レイヤーの圧縮形式。layersプロパティがtrueの時のみ有効。

LayerCompression.RLE RLE圧縮
LayerCompression.ZIP ZIP圧縮
layers boolean レイヤーを保持するかどうか。
saveImagePyramid boolean 画像ピラミッドを保存するかどうか。
spotColors boolean 特色を保持するかどうか。
transparency boolean 透明部分を保持するかどうか。
typename string オブジェクトのクラス名。readonly。"TiffSaveOptions"


以上!! つかれたー!!!!

by chalcedony_htn at 詳細 このエントリーをはてなブックマークへ追加