spark系のComboBoxの扱い

MX系とSpark系ではコンポーネントが色々違うが、今回ComboBoxでハマった。

MX系のComboBoxは編集に関するフラグがあるがSpark系はこれが無い。

どうも、editable=falseのComboBoxはDropDownListを使うらしい。

そして、このComboBoxの編集を利用する場合、例えば初期設定で、labelに

りんご、みかん、いちご

と言う3項目を用意しておいて、それを選択しても良いし、直接「ぶどう」と書き込んでも良い様にしておいた場合、この値をDBへ渡す為にはどうしたら良いか?

色々試行錯誤して落ち着いたのが以下の方法
※dataはPHPサービスへ渡すオブジェクトでhoge_comboがComboBoxだ。

var data:Object=new Object;
var temp:*;
    temp=hoge_combo.selectedItem;
    if (temp is String)
    {
     data.hoge_name = hoge_combo.selectedItem;
    }
    else
    {
     data.hoge_name = hoge_combo.selectedItem.label;
    }

つまり、編集して入力した場合と、選択した場合では渡す物が異なるのでこの二通りに対応してく必要があると言うことだ。表示欄のtextのプロパティを用意しておいてくれれば良いのにと思うが何故かこれが無いので、こう言う方法になる。

逆に、今回初めて、「prompt」と言うプロパティがあって、これに「-選択又は入力-」と入れておくと、空の時はこれを表示してくれると言う便利な機能がある事を知った(笑)

習うより慣れろだ。

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

ZendAMFとFlashBuilder

ZendAMFを使ったPHPとFlashBuilderの連携もなんとか手懐けて来た。

結局、データとサービスを利用してデータベースの構造から自動的にPHPサービスを作成する方法は止めた。

これでサービスを作るとわけわからんASのクラスが沢山できるのと、PHP側のスクリプトの出来が悪いからだ。
通常、mySQLを利用する様になっているのだが、自動的に作られるPHPサービスはmysqliを利用するようになっている。
これがイマイチ使い勝手が良くないし、せっかく、ZendFrameworkを利用しているのに、高機能なDB廻りのコンポーネントが利用出来ない。

ということで、自身でZend_DB辺りを使ったPHPサービスを作ったが、これが非常に簡単。
基本的にはZend_Db::factory(‘Pdo_Mysql’,$this->params)と言ったDB関係の初期化を行うクラスを作り、それを継承する形でサービスのクラスを用意すれば良い。
アンダーバーのあるファイル名は駄目な様だ。

このクラスの中に必要なメソッドを書けばOK。
例えば、下の3行でtblで設定したテーブルからデータを検索してくれる。

 public function getAllhoge_Master()
 {
  $sql=’select * from ‘.$this->tbl;
  $this->db->setFetchMode(Zend_Db::FETCH_ASSOC);
  return $this->db->fetchAll($sql);
 }

この様な形でサービスクラスを用意すれば、FlashBuilder側のデータとサービスで新規PHPサービスから利用すれば自動的にAS関係のクラスを用意してくれるので、適当にバインドすれば良い。

以前、WEBORBでRemoteObjectを設定したり、もっと前のPHPOBJECTを利用していた時代を考えると構築の早さと手間は格段に違う。

簡単な動作確認ならばFlashBuilderの「操作をテスト」である程度の事は出来るし、場合によってはPHP側で以下の様なログファイル作成メソッドを用意しておいて必要に応じて渡された変数を確認するなどすれば簡単にデバッグ出来る。

function logMe($var)
 {
  $filename = dirname(__FILE__) . ‘/__log.txt’;
  
  if (!$handle = fopen($filename, ‘a’)) {
   echo “Cannot open file ($filename)”;
   return;
  }
  
  $toSave = var_export($var, true);
     fwrite($handle, “[" . date("y-m-d H:i:s") . "]“);
  fwrite($handle, “\n”);
     fwrite($handle, $toSave);
  fwrite($handle, “\n”);
  fclose($handle);
 }

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

ブラウザに影響されるphpPgAdmin

PostgreSQLからMySQLへデータベーステーブルのを移行する為、phpPgAdminからエクスポートでCreateTableを表示させようとすると、これが表示しない。

なんでやねん?と思って調べると、標準はFireFoxで、IEではエラーになる場合があるなんて書いてある。

んな、アホな。。前は出てたやん。と思いつつ、FireFoxでやるとちゃんと表示するでは無いか!

何か設定ファイルをいじると良いと言うのもあったが、面倒なのでこのままFireFoxでやる。

これだからブラウザに影響されるレアなWEBアプリは嫌いだ(;´Д`)

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

FlashBuilderで「データとサービス」機能を利用した場合のデプロイ

ローカルのXampp環境では稼働する様になったのだが、リモートのCentOS上へサーバサイドのサービスをデプロイしてAIRで稼働させる方法が良く分からない。

恐らく、サービススクリプト内(src.service以下にある_Superの付いたスクリプト)の以下のendpointのlocalhostをリモートサーバへ書き換えれば良いだろうと言うのは想定が付いたが、FlashBuilderで設定する「Flexサーバ」項目の「サーバの場所」にある「WEBルート」「ルートURL」との関連が分からない。
 _serviceControl.endpoint = “http://localhost/hoge_app/gateway.php

色々調べると、結果的に、このWEBルートやルートURLと言うのはローカル環境での設定に関する事で、どうも「開発には必ずこの環境が必要なんだから、用意しておけ。」と言う意味で、ローカルの設定をしておけば良くて、実際のデプロイとは全く関係ない様だ。

上記のendpointと自動的に作られるamf_config.ini内のwebrootをコメントアウトして、自分がデプロイした場所を指定したものをリモートサーバへアップロードしたらちゃんとリモートサーバ上のPHPスクリプトがリモートのMySQLへ接続して動作した。

;webroot =C:/xampp/htdocs/hoge_app
webroot =/var/www/html/hoge_app

当然だがローカルのMySQLと本稼働しているMySQLのユーザやDB名などを統一しておけば、ローカルとリモートの切り替えは上記の2点を変更するのみで良さそうだ。

取り敢えずこれでデータとサービスを利用した開発の流れが理解できた。

しかし、リモートでサービスを動かしていると「操作をテスト」や「更新」をやると
java.net.ConnectException: Connection refused: connect
のエラーが出る。
なんとなく分からんでもないので、これは放置。

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

MySQLの文字化け

僕はFlexでデータベースを扱う場合、これまで実稼動の場合、PostgreSQLしか扱ってこなかった。
これまでは、DB関係はオリジナルのDBサービスを利用してPHPOBJECTやWEBORBを使っていたが、今回、FlashBuilderとZendAMFへサービスを切り替えるために色々試行錯誤している。
一つは、ZendFrameworkを利用する事で、DBだけでなく他のコンポーネントも利用出来ると言う事。
もう一つはFlashBuilderのデータとサービス機能を利用して、データベースアクセス関係のコンポーネントを自動作成させて開発効率を上げたいと言う事なのだが、問題はこのZendAMFによる接続データベースが標準がMySQLだということ。
MySQLはPostgreSQLと共に人気のあるFreeのデータベースなのだが、日本語の文字化け問題があれこれ発生する。
これが嫌でこれまでこのMySQLを利用してこなかったのだが、仕方ない。

今回も、取り敢えずローカル上へインストールしたXampp上のMySQLへFlashBuilderのデータとサービスで作ったデータアクセスコンポーネントで接続しているのだが、例によって日本語が文字化けする。

 一般的な文字化けの話はすぐに見つかるのだが、このFlashBuilder関連のものは情報が少ない。

やっと発見したのが、これだ。

public function __construct() {
    $this->connection = mysqli_connect(
          $this->server, 
          $this->username, 
          $this->password,
          $this->databasename,
          $this->port
         );

  $this->throwExceptionOnError($this->connection);
  mysqli_set_charset($this->connection, “utf8″);
 }

PHP側のコンストラクタの一番最後に
mysqli_set_charset($this->connection, “utf8″);
を付け加えると言うもの。これで解決した。

後は、これを実稼動サーバへデプロイするのはどうしたら良いかって事だが、これも情報が殆ど無い。

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

WEBアプリケーションでシリアル通信を考える

AIRやFLEXと言うのはコンパイラ系のアプリケーションと異なりできないことが多い。
特にハードウエアに関わることは得意では無い。

工業系の仕事では時々、シーケンサー(PLC)との通信が必要となる場合がある。
このような場合、大抵、RS232c(COM)と言われる昔ながらのシリアル通信をする事になるが、デスクトップアプリケーションと言う事になっているAIRでもこれは出来ない。

例えば、Gainerなどの制御をする場合もシリアル通信で制御するが、Funnel やserial_proxyと言ったProxyサーバを通じて行う必要がある。

今回検討した案件は、ネットワーク上のPCでアプリケーションが同期しながら(つまり、現場のPC含めて、ネットワーク上のどのPCで操作しても動作する様にしたいと言う事)、現場にあるシーケンサー(PLC)の制御を行う必要がある為、現場にローカルサーバを立ててそのサバー内でFlexによるWEBアプリケーションを動かして、RED5で同期を取ると言う方法を考えたが、肝心のFlexからRS232Cをどうやって制御するかで悩んだ。

現場のローカルサーバでAIRアプリケーションを立てて、他のFlexアプリケーションとRED5で同期を取りながら、serial_proxyを通じて通信すると言う案を最初に考えたが、これはどうもスマートではない。

もう一つは、以前やったが特定のPLCとシリアル通信が出来るコンポーネントを積んだExcelアプリケーションをProxyサーバとして、MySQLデータベースを経由してAIRと通信すると言う方法。
データベースへパラメータ用のテーブルを作り、そこへパラメータやフラグをセット、リセットしながら、Excelと同期を取ると言う訳だ。
この場合、Excelアプリケーションに色々仕込めるのだが、これもWEBアプリケーション直接では無いので、スマートではない。

結果的にPHPにシリアル通信を行う拡張モジュールがあると言う事を知り、それをインストールして、FlexからPHPへWEBORB経由で接続してこれを利用すると言うアイデアを思いついた。
これならPHPはFlexのクラスオブジェクトとして利用できるので、シンプルだ。

まあ、Flex系の物は割り込みなどが利用できないので、PLCからの受信データなどは基本ポーリングで読み込む必要があり面倒だが、これなら、特定のProxyサーバを立ち上げること無く、Webアプリケーションでシリアル通信が可能となる筈だ。

現場に設置するローカルサーバ一台に様々な技術が詰まっているのでそれなりの金額になるのだが、どうも概算を伝えると難色を示されたので、予算を聞くと、30万くらいでと言う事だった(笑)

内容からすると土台無理な話なんだが。。

まあ、このアイデアは他の機会に使えるかもしれないので、暇な時に実験しておきたい。
取り敢えずサーバ環境やモジュール等はインストールしたが、モジュールの読み込みなどは問題ない様だ。

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

ドラッグドロップでハマる

ドラッグ&ドロップが容易に出来るのがFLEXの良いところなのだが、何故か、ドロップ出来る時と出来ない時がある。

処理に問題があるのか悩んだが、結局、ドラッグをスタートしたリストを表示しているパネルを自由に移動(ドラッグ)出来るようにしていたのだが、相手先のリストと距離が近い場合、ドラッグ中のアイテムが両方に重なった場合に、ドラッグ元のリストでドロップ禁止しているとその影響を受けるらしい。

つまり、アイテムの項目が長いと両方にかかってる場合が発生して、ドロップできない状態となっていた様だ。

色々考えたが、結局、ドラッグスタートのイベントで、ドラッグ元のパネルを小さくするエフェクトを入れて、ドラッグ元へ掛からない様にした。

ドロップ後に元のサイズへ戻すことで、結果的にドラッグ中のウインドウの可視範囲も広がると言う一石二鳥となった。

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

明日は何日?

FlexなどのACTIONSCRIPT系の言語をやってると意外な事が出来ない事に困惑する。

例えば、今日から一週間分のカレンダーを作ると言う時、今日の日付はわかるが、明日は、二日後は何日?と言うのをすぐに計算する関数が無い。

Adobeの日付に関するページを読むと方法が書いてあった。

http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f10.html

結局、こういう定数を一旦設定してそれを加算して利用するらしい。
 public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;

一週間のカレンダーを作成するなら
var day:Array = new Array(“日”,”月”,”火”,”水”,”木”,”金”,”土”);  
var today:Date; 

for(var c:int=0;c<7;c++)
{
    today = new Date();
    today = new Date(today.getTime() + (c * millisecondsPerDay));
   [ 設定したい対象]=String(today.month+1)+”月”+String(today.date)+”日(“+day[today.getDay()]+”)”;
   }
となる様だ。

又、例えば、二つの日付の差が何日あるのか?
と言う場合は、何れの日付も、一端1970 年 1 月 1 日(UTC)からの経過ミリ秒数として取得するgetTime() メソッドを使用してミリ秒へ変換して差を計算して、その後、先のmillisecondsPerDayで割ると日数が計算できる。

あ~面倒臭い。

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

Flexとオブジェクト

Flexの様な便利なツールで開発をしていると、つい基本的な事を忘れてしまう。

先日、ArrayCollectionを参照するAdvancedDataGridを扱っていて、ArrayCollectionの値を更新して反映させると言う事をやっていた。

AdvancedDataGridの側ではAdvancedDataGridRendererProviderのrendererに対して、ClassFactoryを使って独自のDataRendererを当てると言う微妙に複雑なことをやっていたのだが、更新した筈なのに、更新する都度何故か同じデータで全てが更新されてしまう。

これは開発中のシステムなので、全く違う例えで説明するが、例えば、既にAさんの出身地に福岡県と言う情報がある場合、Bさんの情報に対して佐賀県という出身地を追加して更新すると言う感じだ。

この時に、Bさんは当然佐賀県となるのだが、Aさんも佐賀県と設定されてしまっている。

更新対象の検索に関する部分を調べたがバグは無さそうなので、DataRenderer辺りにバグがあるのかと思い調べていたがこちらもバグらしいものは無くハマっていた。

結局、原因は、追加しているオブジェクトにあった。

実は追加する情報は出身地だけではなく他の情報、好きな食べ物、生年月日等いくつかあって、これをオブジェクトとして1固まりの情報として追加していたのだが、このオブジェクトを作るときにうっかり new Object()をやって初期化していなかったのだ。

内容はAさんBさんの都度変更していても、元のオブジェクト(箱)が同じなので、後から変更される情報に全て変更されてしまう筈だ。

このオブジェクトは他からも参照するので、宣言のスコープを広くしていたが、宣言の時にnew Object()はしていても、内容を変更する時にはやってなかった。

僕はてっきり、Aさんの情報を保存するオブジェクトとBさんの情報を保存するオブジェクトはそれぞれ異なる宣言をしている(異なる箱を確保している)ので、単にそこにデータを追加しても、その時点で縁が切れる(出身地などの情報がコピーされて、その箱に入る)絶対アドレスだと思っていたが、そうでは無く、最終的に追加する為のオブジェクトを参照している相対アドレスだと言う事を知らなかった。

つまり、出身地などの情報が入る箱は一つで、Aさんの情報を保存している箱の中にはその箱の場所だけが入っていたと言う事だ。
それなら、参照している情報は1つしか無いので参照先も情報も変わる筈だ。

こんな事はCなんかやっていた時は常に意識していた事なのだが、今更初歩的なバグで恥ずかしい限りだった。

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

集団山みせ

博多山笠のフィナーレ追い山まで後二日。
今日は山笠が福岡市まで入る「集団山みせ」だ

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