「InDesign JavaScript教室」はここを考えてます

InDesign JavaScript教室」2日目が終わりました。この日はフローチャート、分岐構文、繰り返し構文がメインだったんですが、理解できてる人とちんぷんかんぷんぽい人に分かれてしまって、この後が非常にやりにくいです。困りました。

受講者の方からの提案で、構文を何度も書いて訓練できる問題集を作成しました。ただレベルの差が大きいので、どのレベルの方でも解き甲斐のある問題を入れておこうとしたら、75問になってしまいまして。受講生の皆さん、必ずしも全部解かなきゃいけないわけではないですよ。期限もないですし。講座日程終了後でも全然問題ないです。時間を掛けてじっくり理解してください。いくつかの問題は最後に説明します。


さて、この講座を行うにあたって考えたことは「とにかく脱落者を出したくない」ということです。なので、毎回挫折しそうなポイントを重点的に教えるようにしています。

初回はエラーメッセージの見方。ESTKでよくあるエラー(スペルミス、ターゲット指定ミス)に伴うエラーメッセージを見てエラーを解決する方法を教えました。2日目のおとといも、指導中にスペルミスやターゲット指定ミスを見せて、エラーなんて怖くないよ、と指導しました(と書くと、わざとミスしたと思われそうですがわざとではありません。ちくしょう)。実はプログラム初心者か否かは、プログラムミスをするかしないかではなく、ミスに気付いてリカバリできるか否か、なんですね。

前回は繰り返し構文につきものの、無限ループとインクリメントで回すことのきない事例の説明を行いました。無限ループは次の文です。

while (true) {alert("無限ループ中");}

これを各自に実行してもらって、プログラムを停止する訓練を行いました。最悪パソコンの電源を切ってもよいように、他のソフトを全部終了してもらって。

インクリメントで回すことのきない事例は次のような問題です。

あらかじめ長方形がいくつか作成されているドキュメントを開いて、1つずつ、すべての長方形を削除してください

forで1つずつ削除すればいいんだけど、よくある書き方だと最後までは削除できない。ありがちなんだけどハマる問題です。これは説明したんだけど何人かは理解できていないんだろうなあ。そのために問題集も作ったんですが。

次回は、小数を含む数値の演算誤差をやります。もうこれは、受講者が実際に作る段階になって「先生が言っていたのはこのことだったのか」ぐらいの理解の低さを覚悟してます。

あとハマるポイントとしては「正規表現の最長一致の原則で予想しない文字列がマッチする問題」「変数のスコープの理解不足でグローバル変数に意図しない値が入る問題」があるんですが、これは時間の関係で説明できそうにないので、「教科書を読んでください」になりそうです。


では問題集の内容を紹介します。基本的には条件文・繰り返し構文を理解してもらうためのものですが、ついて来れていないかもしれない人のために、教科書に書いてあることがそのまま答えになるものも書いてあります。

最初の問題はこちら。

InDesignで新しいドキュメントを作成しなさい

これは最初に教えるし、教科書そのままなので問題ないでしょう。次の問題。

InDesignで新しいドキュメントを2つ作成しなさい

これは教えていない。けれど、結果的に新しいドキュメントが2つ開かれていればいいので、非常に簡単。

の筈なのですが、もしかすると「そんなの習ってない。ドキュメントを一度に2つ作成する方法なんてあるのか」とネットを探し始める人がいたらどうしよう。

そのため最初に「ネットに答えはありません。すべて教科書に書いてあります」と書いたんだけど。ちょっと心配な人がちらほら。そうじゃないんですよ、あなたが普段使っているコ〇ペでいいんですよ。


最後の問題はおまけの問題、解けなくても全然問題ないです。もう脳トレというか、解けなくても考えるだけで脳にいいんです問題。

事前に定規の単位をミリメートルにしておいてください。新しくドキュメントを作成し、A4サイズにします。ページ全体25mm×25mmの正方形で覆いつくしなさい。正方形がはみ出していても構いません

普通for文を入れ子にして四角形を敷き詰めると思うんですが、実はこの講座では四則演算はまだ教えていない(次回の予定)。なので、足し算・引き算などが使えない。教えているのはドキュメントオブジェクト、長方形オブジェクトとそのプロパティ・メソッド、条件文・繰り返し構文(付属する比較式も)なので、その中で実現しましょうということです。

実はこれInDesign、Illustratorだとできます。geometricBoundsプロパティがあるから。これが、「x, y, w, h」で四角形の情報を持っているアプリケーションだと、必x+wという計算式が発生するので不可能なんです。geometricBoundsをうまく使って四角形を敷き詰めていってください。move()メソッドduplicate()メソッドも教えてますので、好きな方を使ってください。計算ができないので必然的for文は使いません。

実行結果の例です。よかったらやってみてね。