AIR/Flex: 2009年3月アーカイブ

ActionScript3 で RSS リーダーを作成したのだが、ある特定のサイトの RSS フィードを受信すると、

var feed:IFeed = FeedFactory.getFeedByString(loader.data);
var items:Array = feed.items;
for each(var item:IItem in items){
    RssTitle.push(item.title);
    RssLink.push(item.link);
    RssDate.push(item.date);
}

と、item.date を参照しているところで、

Error: Unable to parse the string [2009-03-11T112033] into a date. The internal error was: Error: This date does not conform to W3CDTF.

というエラーを出して落ちる。

世の中に出回っている他の RSS リーダーでは問題なく処理されているフィードなので、こちらのプログラムに問題があるのかと悩んだが、どうも、メッセージどおりに、このフィードの作成日付(例:<dc:date>2009-03-11T112033</dc:date>)が正しく W3CDTF 形式になっていないのが悪いと結論づけていいようだ。

W3C のサイトで W3CDTF 形式をチェックしたが、
http://www.w3.org/TR/NOTE-datetime

   Year:
      YYYY (eg 1997)
   Year and month:
      YYYY-MM (eg 1997-07)
   Complete date:
      YYYY-MM-DD (eg 1997-07-16)
   Complete date plus hours and minutes:
      YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
   Complete date plus hours, minutes and seconds:
      YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
   Complete date plus hours, minutes, seconds and a decimal fraction of a second:
      YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)

ということで、明らかに「2009-03-11T112033」という書き方は間違いだ。正しくは、「2009-03-11T11:20:33+09:00」だね。

ということで、当方で作成した RSS リーダー側の挙動で基本的に問題はないようだが、他の RSS リーダーで上記のような「中途半端に W3CDTF 形式に似た形式」を処理してるのに、うちのプログラムでは落ちるというのも仄かな悔しさが漂うなあ・・・(^^;

取りあえず、今回の形式だけは、DateUtil.as を修正して「強引に」対応しておいた。
(具体的には、DateUtil.as 中の parseW3CDTF 関数に、以下の記述を追加)

var nonColTime:RegExp   = /^(\d{2})(\d{2})(\d{2})/s;
var matchText:Object    = nonColTime.exec(offsetStr);
if (matchText != null) {
    timeStr  = offsetStr;
    hour     = matchText[1];
    minutes = matchText[2];
    seconds = matchText[3];
    offsetHours = 0;
    offsetMinutes = 0;
}

あんまり良い手だとも思わないけど、取りあえずね、取りあえず。

AIR1.jpg

透過した AIR アプリを作る方法。

■ADFファイル

<initialWindow> タグ内の、<systemChrome>タグと<transparent>タグを以下のように設定。
<systemChrome>none</systemChrome>
<transparent>true</transparent>

※<transparent>を true に設定したら、<systemChrome>は必ず none に設定しないとエラーになる。

■MXMLファイル

<mx:WindowedApplication>タグ内で、backgroundAlpha属性を"0.0"("0"でも可)に設定。これで背景が透ける。(alpha属性はアプリ全体の透過設定なので、"0"にするとAIRアプリがまったく表示されない。透過させるのは背景のみだからbackgroundAlpha属性を設定ね)

一応、例をのせとく。

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="absolute" width="151" height="245"
 mouseDown="stage.nativeWindow.startMove();"
 backgroundAlpha="0.0"
 showStatusBar="false"
 showTitleBar="false"
 borderStyle="solid" borderColor="#151921">

この例では、 showStatusBar="false"、showTitleBar="false"の設定で、タイトルバーなどを消しているので、アプリを掴んで動かすことが出来なくなる。そこで、アプリ上でマウスのボタンが押されたら、Window の移動処理(ドラッグ)がスタートするよう、mouseDown="stage.nativeWindow.startMove();"の設定を行っている。

で、こういう設定をした上で、透過PNGや透過GIFファイルをイメージとして配置すれば、透けた AIR アプリのできあがりである。

分かり易いようにボーダー表示をした状態で、Vista のガジェットの上に置いてみた。
透けてますなあ~(笑)

値のセットされていない配列をチェックしたかったので、

if (!a[i].exists) {

とかやってたら、ホントは

if (a[i] == undefined) {

だった。

はまった・・・

ファイルの存在有無は、

var file:File = File.desktopDirectory.resolvePath(ファイルパス);
// ファイルが存在しているか?
if (file.exists) {
    trace("存在してる!");
}
else {
    trace("存在してない!");
}

で、いいんだけどね。

初めて ActionScript を組むプログラマに説明するために、以前「複数の文字列を延々スクロール」というエントリに貼り付けてたソースを Flex Builder に持ってきて説明しようとしたら・・・

「1084: シンタックスエラー : rightbrace が 0 の前に必要です。」

というエラーが出やがんの。

'}' の数が合ってないってことだろうなあ。いやいや、'}' の数は合ってるぞ。
そういえば以前、化け文字がソースの途中に入ってて、こんなエラーになったことがあったなあ・・・と見てみたけど、やっぱおかしいところはないぞ・・・

その場では結局何が悪いのかわからず、別のサンプルを使って説明。

実は、つまらないミスでした。
該当の行がこれ。

TextIndex   = 0;    # 最初の配列

そう。
コメントの始まりは、'#' じゃなく '//'。

TextIndex   = 0;    // 最初の配列

これでOK。

いやぁ、日頃、自分でプログラミングするのはほとんど Perl ばかりなので、ついつい・・・

C とか Java とか VB なんかをメインとしているプログラマにはあり得ないミスでしたな。面目ない。(^^;

このアーカイブについて

このページには、2009年3月以降に書かれたブログ記事のうちAIR/Flexカテゴリに属しているものが含まれています。

前のアーカイブはAIR/Flex: 2009年2月です。

次のアーカイブはAIR/Flex: 2010年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら