DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

InDesign JavaScript教室、いよいよ明日が最終日です

f:id:uske_S:20180618100038p:plain

かねてよりお伝えしていた通り、お〜まち(大間知聡)さんが主催されている標題の教室にスタッフとして参加しております。
講義も残すところ明日の1回のみとなりました。

プログラムの勉強の難しいところ

第一回、第二回に参加して感じたことは、やはりプログラミングは(特に基礎知識なしからだと)決して簡単ではないことと、ひとりではとっつきにくいということです。

前者については、参加者のみなさんが普段業務で使って慣れているInDesignだからこそ、InDesignGUI的に操作しようとしてしまうようです。
後者については、何から勉強したらいいのかわからない、最終的な正解が何なのかわからない、そして開発に躓いても基本的には自分で解決しなければならない。そういう部分が継続的に勉強を続けることの障害になりやすいのかなと思いました。

プログラム的な考え方

InDesignで行う手作業をスクリプトで再現しようとする場合、根本的に違うのは、インターフェースを介して作業しないということです。
グラフィカルユーザーインターフェースGUI、要するに画面を見ながら操作する)では、例えばオブジェクトに色を付けたいという場合、そのオブジェクトを選んで、スウォッチから何色を選んで、という作業をたどることになります。
しかしスクリプトにはそういった「マウスポインタをオブジェクトの上に重ねてクリックして選択状態にする」みたいなインターフェースがありません。その「色を付けたいオブジェクトはどれか」をプログラムとして明確に伝えてあげなくてはいけません。言い方を換えると、色を付けたいのがどのオブジェクトかがはっきりと伝えられれば=プログラムとしてオブジェクトを厳密に指定できれば、それがプログラムとして「オブジェクトを特定した状態」であるとも言えます。

GUIでは「このオブジェクトを操作したい」という場合のオブジェクトを決めるために「選択」という行為が必要になりますが、スクリプトでは「プログラムとしてオブジェクトを特定する」という記述のしかたになります。
数あるオブジェクトの中からどうやってそのオブジェクトを見つけ出して特定するのか。それを制御構文(for文やif文)と用意されたオブジェクトのプロパティなどを使って特定していく作業が必要なのです。
そういうプログラミング独特(別に独特ではないけど敢えてこう書きます)の言い回しならぬ書き回しは、外国語と同じで、たくさんインプットして慣れるしかないのだと僕は思います。むしろ慣れてさえしまえば、特別に意識することなく書けるようになるはずです。

モチベーションの維持

ひとりで勉強を続けるというのもなかなか難しくて、やはり一人ひとりモチベーションの上げ方は違うし、スクリプトを学ぶ理由も、目標とする到達点も違うはずです。だからこればっかりは、自分が楽しんで続けられるような小さな目標をたくさん立てたり、一緒に勉強する仲間を作ったり、いかにモチベーションを保つかということに腐心したほうがいいでしょう。
まったく参考にならないと思いますが、僕の場合はコーディング自体が楽しいし、自分の書き上げたスクリプトInDesignを操作できることが面白くて、ゲームする感覚で毎日のようにスクリプトを書いてましたw いまでも、仕事中に眠くなってきたら「ちょっとゲームして目を覚ますか」くらいの感覚でスクリプトを書いたりしますからねw

変数という概念とオブジェクトモデル

それはさておき、プログラムの基本である制御構文とあわせて、ドキュメントオブジェクトモデル(DOM、オブジェクトがどのような階層構造で規定されているか)を理解することもかなり難しいようです(実際に、僕もこのオブジェクトモデルの理解がとても難しかったです)。
あえて何かに例えて説明するとすれば、オブジェクトモデルは「住所」のようなものです。

app.documents[0].rectangles[1].fillColor;

という住所には、前面ドキュメントの2番目の四角形の塗り色、という情報が置かれています。この住所は必ず、appdocuments[0]→…と順を追ってドット演算子.)で書き連ねていかなくてはいけません。間違った住所を記述したり、省略した住所ではそこにある情報にアクセスできません。
例えば「東京都北区赤羽1丁目」に行きたいのに、東京都を省略してしまうと「北区? 何県の北区だ?」となってしまって、正しい目的地が定まりません。
手紙を出す場合は現実には7桁の郵便番号を書きますよね。変数とはつまりこういうことなのです。
7桁の番号「1150045」という名前の変数に、「東京都北区赤羽」が代入されているというイメージです。続けて番地を書けば手紙が届きます。
郵便番号の場合は住所を符号化して管理しているから番号なわけですが、プログラムでは任意に変数名を付けて管理できるので、もっと分かりやすい名前をつけることができます。また、その住所の区分(都道府県と市区町村など)を結びつけるのがドット演算子.です。

var myDoc = app.documents[0];  //東京都.北区
var myRec = myDoc.rectangles[1]; //(東京都.北区).赤羽
var myFillColor = myRec.fillColor; //(東京都.北区.赤羽).1丁目 みたいなイメージ

これでも先のコードと同じオブジェクトのfillColorにアクセスできます。
このやり方のいいところは、

var myFillTint = myRec.fillTint; //(東京都.北区.赤羽).2丁目 みたいな?

というように、違う住所へのアクセスのショートカットに使えることです。途中まで同じ住所が入っている変数を使って、欲しい情報にさくっとアクセスできます。

また、実は東京都北区ではなく、大阪府大阪市北区に正しい情報があった…という場合も、変数で住所を管理していれば少ない手間でプログラムを修正できます。

var myDoc = app.documents[1];  //これを仮に大阪市.北区とすると、
var myRec = myDoc.rectangles[1]; //このmyDocも(大阪市.北区)になる -> (大阪市.北区).梅田 みたいな?
var myFillColor = myRec.fillColor; 

という感じで、理に適った変数の利用は、その後の修正を楽にしてくれます。

以上をまとめると、変数に持たせる役割は、

  • プロパティやメソッド(住所)へのアクセスをしやすくする
  • プログラムの柔軟性を高める

ということが言えるかもしれません。
多少の語弊はあるでしょうが、なんとなーく理解してもらえたなら嬉しいです。

次で最後です

さてさて、そんなこんなでこの教室もあと1回となりました。理解度は人それぞれかと思います。
この前の講義で追いつけていないなと思った方はしっかりテキストを復習していただき、改めて演習問題、そして問題集にトライしてみてください。結局のところ、時間と労力をかけて「やったもん勝ち」です。やらなきゃ身につかないのは技術なので当然です。
分からないところがあればお〜まち先生に直接メールをしたり、自分のコードにコメントを付けて送ってみたりしてはどうでしょうか。
微力ながら、僕にお手伝いできることがあれば積極的にお手伝いしたいと思っています。

もくもく会の宣伝

さて最後に、講義中にお〜まちさんが紹介してくださったもくもく会についても宣伝しておきます!

dtpmkmk.connpass.com

会の趣旨は以下のような感じです。

スクリプトを書いてる人、書きたいと思っている人が集まって、勉強できる場として立ち上げました。 参加者同士で教えあったり、議論したり、もくもくしたり、わいわいしましょう。

基本的な文法を習得していると他の参加者の方の話が理解できると思いますので、ご自身が楽しいと思います。 まったくわからないという方は、書籍なりを持ち込んでいただいて、自身で写経などしつつ、周囲に質問すると理解が早まると思います。 参加者の方にメンターとして初心者をサポートしていただけるような会を目標にしています。

詳しくはもくもく会のイベントページをご覧ください。
また、次回は7/21(土)開催です! ご興味のある方はお問い合わせください。
今回のお〜まちさんの教室を公式にフォローアップしているわけではありませんが、発起人のこうちゃん氏と主催者の自分が教室のスタッフとして参加しているので、初心者の方でも教室に参加されたなら少しは参加してもらいやすいのかな…と思います^^;;
何より、先に書いたように、ひとりでモチベーションを維持するのはとても大変です。隔月で継続的に開催しているので、モチベーションの維持や勉強のペースメーカーとして利用してもらえれば嬉しいです。 せっかくの機会ですので、ぜひぜひよろしくお願いします〜!