PMPというプロジェクトマネジメントの資格を持っているが、この資格「一度取ったらオシマイ」ではない。3年間で更新するのだが、その際、60PDUという単位のポイントを取得しておく必要があるのだ。

PDUは、どうやれば取得できるのか?
ビックカメラやsuica、最近出てきたエコポイントと等価交換、などなら苦労はしない。PMP試験を実施している、PMIという団体が認めた研修なりを受講しないとポイントにならないのだ。それも1PDUを獲得するには1時間かかる。
そんなもの、せいぜいPMI東京フォーラムのポイントだけだ。今年9月に更新だから、PDUが足りない!

なんとか「安く」「空いた時間で」できるものはないか。そんな都合の良いもの、あったら誰も苦労しないよ、と思いつつ探したら、ありました!

http://www.netlearning.co.jp/itpm/course/itpm/index.asp

20~35PDUの教材が、約4万円。期間限定で30%オフなので、28,000円くらい。これで35PDUを取得できるのなら非常に有り難い。

早速申し込んでみることにする。
JavaScriptからFlash内のコントロールに値を渡したりしている処理をテストしているのだが、値を設定しても思い通りの値にならない項目がある。コンボボックスのselectedIndexに値を設定しているはずなのに・・。

Alertで値を見ると、間違いなく正常な値を渡している。

しばらく放心状態を経て、気を取り直してポイントごとにAlertを埋め込む。気になるのは、値を設定していないにもかかわらずコンボボックスの値が選択されていることがあること。いつそれが行われるのか、追いかけていくと、実行中にFlashのコントロールに値を設定したことにより、Flashでイベントが発生し、そのイベントを受け取っているのではないか?と気づいた。
そこで、Flashからのイベントが起動されているかもAlertで確認すると、メインのJavaScript実行中(他のAlertを出している最中)にFlashからのイベントを受け取ってAlertを出した。そう、処理がパラレルに動いていたのだ。

原因さえ分かれば、あとは調整だ。
まず、初期処理中はイベントを実行しないように、フラグで制御するようにした。しかし、これでもダメであった。
そこで使ったのが JavaScriptのsetTimeour関数。この関数、どういう動きをするのか説明が難しいが、ちょっと書いてみると、setTimeout("[関数名]",[ミリ秒])で、ミリ秒後に、他の処理が動いていなければ、指定した関数名が動き出す、というもの。setTimeoutに後続の処理は、この処理の終了を待たずに流れていき、終わった頃に実行される。更に言うと、[ミリ秒]に0を指定しても無意味ではなく、とにかく「いったんお待ち」状態になるようだ。
フラグを初期処理が終わった状態にする処理を、このsetTimeoutを使ってちょっと保留させることで、イベントで呼ばれた処理を先に実行(でも、初期処理中だから終了するのだが)させることが可能になり、まっとうに動くようになった。

VBAなんかだとこのように流れることはない。今思いつく例外として、VBA内部だけであればモードレスフォームを使ったとき、くらいだろうか。外部プログラムを呼ぶ場合、例えばDOSの呼び出しなんかは非同期だったな、と思い出す。
そう考えれば今回は暴走なんかではない。JavaScriptから外部プログラムを制御をしているのだがら、非同期であることは当然考慮されていなければならなかったのだ。この後、類似のエラーがあるかもしれない。テスター仲間で情報を共有しておこうと思う。

この話の続き

今までの回答は「調査したが分からない」「AdobeではActionScriptの質問を受けてくれない」「技術的に無理ではないか」などなど、ずっと言い張ってきた。
で、(ActionScriptに関しては業務としてやったことのない)こちらでちょろっと調べたら、サンプルページまで簡単に見つかる・・それを週末に紹介してあげると、週明けには「それなりの」ものができてきた。ただしまだ不十分なところはあるが。

・・どうしてこれしきのことで、解決まで1ヶ月以上もかかるのかな??
・・どうしてこちらで探してすぐ見つかるのに、先方では見つけられなかったのかな??

よくも調べもせず、堂々と主張してきたものだ。簡単にばれる嘘は信用を著しく低下させる、ということを分かっていないのだろうか?

当方のチームの共通認識は「もうこの会社に仕事を発注することはない」である。