いつ変わったんだよ?

以前からAIRのオートアップデートを試みているのだが実行されない。
リリースの方を優先して、AIRのトップ画面に更新情報を表示して、そこをクリックすると新しいバージョンのファイルがあると言う処理で逃げていたが、釈然としなかった。

リリース関係で忙しかったが、少し時間が取れたので、調べてみた。

初めは、
appUpdater.isCheckForUpdateVisible=true;

として、何やらエラーが表示されるのを見ると、以下の様なオートアップデートのエラーリストに表示されないエラーが表示されている。

here was an error checking for updates. error# 16831

これをキーワードに検索したら、更新をアップしているサーバに設定しているupdate.xmlの記述方法が変っていることを知った。

部分的に紹介するがupdate.xmlの中の以下の部分

<update xmlns=”http://ns.adobe.com/air/framework/update/description/2.5″>
<versionNumber>1.1</versionNumber>

と言う具合に
<version></version>の記述方法が
<versionNumber></versionNumber>と言う具合に変更となっていた為だった。

ちなみに

ネットで見た情報ではdescriptionのバージョンが1.0では無く2.5(これは2.6だと駄目)とあったが、これは1.0でも動作した。

全くいつ変わったんだよ?と言いたいが、問題はまだあった。

こんな感じで自動更新があった場合に表示されるパネルが英語なのだ。

update.xmlの <description>で日本語が使える様だが、パネルのタイトルで「Update available」とか「An updated version of the application is available for download.」等と表示されても、「?」と言う状態のユーザが殆どなので困る。

何か特別な設定をする必要があるのか?と思ったが、これ以前のバージョンのオートアップデートを紹介しているサイトを見ると日本語対応となっているし、Adobeのオートアップデートも当然日本語だ。

もしかするとこのオートアップデートのバージョンが日本語未対応??

それなら仕方ないので、前のバージョンを探すのも面倒だし、オートアップデートの更新チェックのイベントで、更新があったら「更新があります。」と言う表示を出してサイトへ飛ぶパネルでも作ろうかと思うが、取り敢えず、こんな時に頼りになる「FXUG」=「Flex User Group」へ投稿してみた。
僕なんかより遥かに優れたユーザが山ほど居て、一人で仕事をしている僕としては非常に役に立っている。

カテゴリー: 未分類 | コメントは受け付けていません。

これってコンポーネントのバグなんじゃないの??

良くある、DateFieldコンポーネントの日付設定。

グリッドを選択した時にその行の内容やら日付やらを表示する処理を作った。
たいていはこんな感じでsplitで元のDBのフォームをバラして

_val=col.rp_date.split(“-”);

こんな感じで最設定する
_date.selectedDate=new Date(_val[0]+”/”+_val[1]+”/”+_val[2]);

しかし、ちゃんと設定される時とされない時(日付が変更されない)場合がある。

されない時と言うのは、その前にDateFieldを開いて何処かの日付を選択した後。

原因が分からずに暫くネットでそれらしい話を探したが情報がない。

あれこれやってみて偶然だが、日付を選択した後に、他のコンポーネントを触って同様の処理をやったらちゃんと設定された!

つまりDateFieldへフォーカスがある間は、プログラムでselectedDateを行なっても設定されない様なのだが、グリッドをクリックする段階で既に自身からフォーカスがグリッドへ移っているはずなのだが、そうはならない様だ。

もしかすると、グリッドのデータ選択のイベントで処理している間はFocusの移動は後回しにされている可能性がある。

この辺がシングルタスクの悲しいところだ。

そこで、試しにDateFieldの_changeHandlerイベントで、次の項目へ強制的にsetFocus()してみたら、ちゃんと設定されるようになった(-_-)

う~ん。。でも、なんかこれってコンポーネントのバグなんじゃないの??

カテゴリー: Flash Builder, 仕事 | コメントは受け付けていません。

バージョンが変わると使えない

今、ZendAMFをベースとして、MySQLのラージオブジェクト(BLOB)へ画像の保存と出力をやっている。
以前はPostgresだったので、ラージオブジェクトの管理方法そのものが全く違っていて取り敢えず、AIRアプリケーションから登録と表示は出来るようになった。

この時に画像のテンポラリファイルを作るのだが、以下の様にパスを抜くのに使っていたsplitがPHP5.3以降ではエラーを吐くようになっていた。多分、注意レベルだろうがZendAMFを利用していると「channel disconnected channel disconnected before an acknowledgement was received」が出てエラーとして処理されてしまう。

$data = split(“/”,$url); 

PHP側では処理はちゃんとやってエラーとので、何故エラーを吐くのか原因が分からない。
色々調べているうちにこれが原因と言うのが分かり

$data = explode(“/”,$url);

へ変更した。

カテゴリー: 未分類 | コメントは受け付けていません。

自分と同じレベルで考えるな

リモートサーバーでのサービスをなんとかデプロイして※リリースしたAIRアプリケーション。

※結局、FlashBuilderの問題だった様で、上手く行かなかった翌日に、想定していたURLの箇所を変更しただけで、難なく出来た。
どうやらPCをリセットしなければならなかったようだ。ちなみにFlashBulider側のservicesフォルダーはリモートサーバー用とXamppを使ったローカルサーバ用を二通り作って開発時は切り替えるようにした。

話を戻すが、このAIRアプリケーションはログイン画面があるのだが、僕はログイン出来ない場合は、IDとパスワード欄をクリアするのみで特にメッセージを表示する機能を入れてなかった。

企業内のイントラで使うもので、IDとパスワードも特定の数しか発行されない。
まあ、そんなもの間違えるはず無いだろうし、何らかのヒントになるメッセージを表示することで不正ログインされる可能性もある。
パスワードを表示して入力するように出来る機能も入れているので、自分が間違ってると思うだろうと考えたが、そうでは無かった。

リリースした二日後に
「会社指定のIDとパスワードを入力したのですがログインできません。入力してログインアイコンをクリックすると入力したID欄、パスワード欄が消えてしまうだけです。どのようにすればよいのでしょうか」
と言う問い合わせのメールが来て、ハタと思った。

ユーザは自分と同じレベルではない。それは、技術と言う意味ではなく、システムに関する信頼性だ。

使ってるのが僕なら当然、システムの問題ではないと思って自分の入力を疑うが、使い始めたばかりのユーザだと、自分の入力が間違っているとは思わず、システムを疑う。

なるほど。

すぐに、IDとパスワードが間違っている時は「IDかパスワードが間違っています」と言うアラートを表示するようにした。

ユーザから教えられることは多い。

ちなみに、あとで聞いた話ではID+パスワードを、IDやパスワードへ入れていたらしい。
そりゃログイン出来ない筈だが、自分と同じレベルで考えるなと言うことだ。

カテゴリー: 未分類 | コメントは受け付けていません。

そんな事あるのね

現在開発中のAIRアプリも開発終了に近くなったので、そろそろ本格的にリモートサーバーへデプロイしようとしているが上手く行かない。

先に書いた方法で、デバッグレベルではリモートサーバでの利用が可能なのだが、リリースビルドの段階で引っ掛かる。

あれこれやってるうちに

プロセスが予期せず終了しました。
invalid application descriptor: invalid application identifier

なんてのが出るので、調べたら

<!– A universally unique application identifier. Must be unique across all AIR applications.
 Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. –>
 <id>hoge_Application</id>

のように、IDへアンダースコアを使うとエラーが出ると言う情報があった。

よく見ると確かに「DNS-style name」とある。。

アンダースコアはファイルを作る時に良く使うのだが、 Wikipedeiaを見ると「アンダースコアはWindowsで構築されたシステムで一般に使われるが、RFC952によれば許容されない。」とあった。

いやぁ~基本的な事なのだが、普段意識して無いので、とんだところで引っ掛かってしまった。。

それにしても、未だ、リリースビルドでのリモートサーバへのビルドが良く分からない。

カテゴリー: Flash Builder, 仕事 | コメントは受け付けていません。

ドラッグ可能なウインドウの時の工夫と注意

良く、検索画面や設定画面でTitleWindowなどを使ってポップアップウインドウを利用する。

この場合、ウインドウの位置をドラッグしながら他の操作も出来るようなウインドウの場合困ることがある。

一番簡単なのはウインドウ上でマウスダウンやアップするイベントを取り、dragStartを仕掛ける方法だが、ウインドウの中にTextIpnutなどの入力コンポーネントをはじめ、コンポーネントを配置しておいて操作するとそれを操作してもドラッグされてしまう。

この場合、TitleWindowの上端部にGroupなどの空のコンポーネントを置いて、そこでマウスダウンするとドラッグスタートと言う具合にする方法を使うと、他のコンポーネントの操作には影響されない。

問題は、その時に、その場所に来たらカーソルの形状を変えて手の形のハンドカーソルへ変えてユーザにパネルが移動できると知らせたりするとわかりやすいが、これはuseHandCursor=”true”だけでは実現できない。

これ以外に、buttonMode=”true”    mouseChildren=”false”と言う二つのプロパティを設定する必要がある。 

意外に、忘れていて「?」となってしまう。

カテゴリー: 未分類 | コメントは受け付けていません。

帳票の悩み

業務用のWEBアプリをやると必ず「印刷」と言う要求が出てくる。

今開発中のアプリは、現状、客先がやっているのはWordの差し込み印刷と言うやつなので、それに対応するデータを出力すると言う方法を選択する予定だ。

これはこれで客がフォームを自由に作る事ができるので悪く無いと思うが、標準で自身のアプリから印刷と言う事を考えるとやはりPDFを利用するというのが最も簡単だろう。

以前はPDFlibを使っていたのだが、運良く僕はまだ安い時代だったから良かったが、ある時期から人の足元を見るように非常に高額な金額となってしまった。

その為、エンジニアはフリーのツールを探しているのだが、単にPDFで印刷と言っても決まったフォームで印刷したい場合、PDFlibで言う所のPPSが簡単なのだが、フリーでこれを実現できているのは無さそうだ。
PPSを利用するとAcrobatの拡張機能で既定のテンプレートPDFに対して位置を決めた出力範囲を設定して、その場所を名前で特定してPHPなどから出力できる為コードがシンプルになる。

座標系で出力する。と言うところまで我慢すれば、テンプレートを読み込めるものがある様で、今、調べているのがTCPDF+FPDIと言うもの。フリーだとこれが良さそうだが、これまでPDFlibのPPSを使ってきた経験からすると、座標系で管理するのは若干面倒と言う気がする。
座標系の場合、縦横の座標を指定して出力させるので、出力場所が多い場合などコードがわかりにくくなる。

PDFlibほど高価では無いが、PPSと同じことが出来そうな、Field Reportsと言うLL言語専用のPDF帳票開発ツールがあるようだ。価格からするとサーバへインストールするタイプで1/5程度の様だ。

この手のライブラリはそれぞれ使い方が違うので、一つ使いこなす為に調査・ノウハウを習得したら、他へはそう移行したくない。

フリーを使いこなすか、有償のツールを使うか悩むところだ。

これ以外にもExcelで出力する等、様々なアプローチはあるのだが、例えばAIRアプリから印刷する事を考えると完全にサーバへ依存するのも避けたい。

出来れば、スタンドアロンで印刷したいが、このAIRの印刷機能が、多少マシになったとは言え、まだまだ業務ユースで使えるレベルではない。

せっかく、PDFリーダーの定番のAcrobatを提供しているAdobe社の製品なのだから、この辺の機能が充実したらAIRももっと業務ユースで利用が広がるのにと思うのは僕だけだろうか。

カテゴリー: 未分類 | コメントは受け付けていません。

selectionChangeの罠

DataGridなどでいずれかの行を選んで修正したり削除したりする場合、selectionChangeイベントを利用するが、処理をキャンセルした場合、行の選択状態もキャンセルしておかないと、データが1行しか無い場合に一度選択してキャンセルを行いもう一度選ぶと、当然だが、selectionChangeは発生しない。

その為、処理をキャンセルした場合は必ず selectedIndex=-1と言う具合に選択も解除しておく、これならば必ずselectionChangeは発生する。

うっかりしておくと見逃す処理だ。

カテゴリー: Flash Builder, 仕事 | コメントは受け付けていません。

カスタムイベント

今更ながらだが、Flash Builderのカスタムイベントの使い方がわかってきた。

一般的にアプリケーションの構造が大きくなるとコンポーネント別に作っていき、ViewStack等を使って、機能別にコンポーネントを表示して動かすが、その場合、カスタムイベントを利用すると、子どものコンポーネント内の処理を他のコンポーネントや自身の次の処理へ繋げるなど、任意の処理のイベント終了を管理する事ができる。

例えば、Aと言うコンポーネントで、A1と言う処理(例えばデータベースのデータの更新)を行った後、Bと言うコンポーネントの別の処理、B1(例えばデータベースのリスト更新)を行いたいと言う場合に有効だ。

Aのコンポーネントのメタタグで
<fx:Metadata>
  [Event(name="A1_END", type="flash.events.Event")]
 </fx:Metadata>

と言うイベントを用意しておき、Aの中で必要な時に呼べば良い。

データベースの更新等場合、通常はCallResponderなどで戻りの処理を書くが、その場所で
protected function  A1_END_Handler(event:GridSelectionEvent):void
   {
    var eventObject:Event=new Event(“A1_END”);
    dispatchEvent(eventObject);
   }

とすれば、これでデータベス更新が終わったイベントを親へ伝える事が出来る。

親から見れば、Aのメタタグで、A1_ENDと言うカスタムイベントを作成すると

<local: A1 id=”Child_A1″ A1_END=”Child_A1_A1_END_Handler(event)”></local:driver_list> 

と言う感じでA1_ENDと言うイベントが参照出来るので、これに対して任意のハンドラを当てて、その中でBコンポーネントのB1と言う処理を行うメソッドを呼び出せば良い。

実際の処理はBコンポーネント内で書けば良い訳で、親は全体の管理をするだけで良い。

特にFlashBuilderの様に、イベントドリブンで非同期なアプリケーションの場合は何かの処理が終わる事を確実に把握しないと、値を読みに行った時まだ処理が終わってなくてエラーと言う場合が多々ある。
それも、テストの時は良かったけど、実機になると入っていた筈の値が入ってないと言う現象になったりする。

特に、データベス関連の処理をする場合は、一度の呼び出しで処理が終わら無い場合もあり、前の処理が終わって、次の処理をすると言う事が良くあるし、連続して他の処理を行いたい場合もある。

データを追加した後の、件数の更新などは一度で出来るが、リストの更新となるとその更新から戻ったタイミングでやる必要がある。

コンパイラ系のプログラムだと、その辺を気にしないでプログラム出来るのだが、この辺がFlash系のプログラムの面倒なところで、コンパイラ系から変わって少し複雑なプログラムを書く時に最初に戸惑う部分だ。

そう言う意味で、このカスタムイベントと言うのは、複数のコンポーネントに分けるような大きなプログラムを書く場合、非常に便利で、これを使うことで複雑な処理もスッキリ書ける。

カテゴリー: Flash Builder, 仕事 | コメントは受け付けていません。

spark系ComboBox 補足

その後、このsparkのComboBoxに textInputがある事を発見!

と言うのも登録済みのデータを修正したい場合に、データベースからのデータをこのComboBoxへ設定する為にはどうしたら良いのか?とハタと困ったわけだ(笑)

このsparkのComboBoxと言うのはどうやら、文字をテンプレート的に設定したい場合に使う様な意図があるらしい。

基本的には通常のtextInputコンポーネントの感覚で使い、幾つか文字列をリストへ仕込んでおけば、それを参照して、textInputへ設定してくれると言うものらしく、これは僕の使いたい方法と一致している。

一方で、DropDownListの場合は、これまでのComboBoxと同じ感覚で、「その選択肢の中から選びなさい」と言う場合に使う為の物で、検索などに利用する場合でコードと対応している様な物の場合はこの方が良い様だ。

修正の場合、このtextInput.textへ値を設定すれば良いなら、そもそもの登録の時も、これが空かどうかを参照すれば良さそうだが、データベースへの値の設定は上記の処理でも問題無いので確認してない。

カテゴリー: Flash Builder, 仕事 | コメントは受け付けていません。