忍者ブログ
 >admin |  >entry |  yukku++Blog 
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


とりあえずライブラリを使わせてもらおうと思います。
一番上の OAuth - AS3/Flex OAuth Library が作りこまれてそうなので選択。
PR
引き続き、Yahoo! APIを利用する練習。名前空間に引っかかったり、うまくDataGridに渡せなかったりと
トラブル続きだったが何とか一通りの手順はおk。

Yahoo! Auction の検索結果をDataGridにセットする。



// その他の処理を省略 _y.resultSet に結果XMLが返ってきている前提
// Yahoo! APIからXMLの取得が完了した時
private function onReturnRequest(ev:Event):void {
// 名前空間を設定
default xml namespace = new Namespace('urn:yahoo:jp:auc:search');
// dataGridに渡す配列
var _dataList:Array = new Array();
// 結果XMLから必要な値だけ取り出して配列に格納
for (var i:int; i < _y.resultSet.Result.Item.length(); i++ ) {
_dataList.push(
{
AuctionID: _y.resultSet.Result.Item[i].AuctionID,
Title: _y.resultSet.Result.Item[i].Title,
CurrentPrice: _y.resultSet.Result.Item[i].CurrentPrice,
EndTime: _y.resultSet.Result.Item[i].EndTime
}
);
}
// データグリッドに渡す
this.grid.dataProvider = _dataList;
}


<!-- 省略 以下のようなデータグリッドを配置する -->
<mx:DataGrid id="grid">
<mx:columns>
<mx:DataGridColumn width="80" headerText="AuctionID" dataField="AuctionID" />
<mx:DataGridColumn width="240" headerText="Title" dataField="Title" />
<mx:DataGridColumn width="80" headerText="CurrentPrice" dataField="CurrentPrice" />
<mx:DataGridColumn width="160" headerText="EndTime" dataField="EndTime" />
</mx:columns>
</mx:DataGrid>

取り出した値をセットしたオブジェクトのラベルがdataFieldと一致する列に格納されていく。
あぁ、次はOAUTHのログイン処理だ。
ASDoc の使用
後で見たときにも、公開するとき(あんまりないけど)にもドキュメントが整ってた方がカッコイイよね。
仕事でも使うかもしれないし、書き方くらいはチェキチェキ。
http://www.adobe.com/jp/devnet/flash/articles/ac3_performance.html
FLASH OOP for ActionScript 3.0を読んでいたら、
AVM(Actionscript Virtual Machine)上で最適化されるコードの書き方なぞがあったのでメモ。
公式にはより詳細な情報があった。
なるほどー、基本的には配列アクセス演算子は使わない方が良いね。
ただ文字列でアクセスしたい場合は使うしかない。使わないような設計もテクニックってことか?

そこで、少し面倒でもそのためのクラスを定義すると、プロパティのデータ型が指定できます。さらに、型指定により処理が最適化されるので、プロパティへのアクセスは速くなります。

確かに動的に割り当てた Object のプロパティは型指定できないからリンク先で言う弱参照になる。
よほどの数の変数でなきゃそれ専用の値格納用クラスを作ったほうがいいかも。
でも連想配列とか書きづらくなるなぁ。
カラーの反転色または補色への変更

反転
カラーの各構成要素をカラースケール上の反対側の値に変更します。例えば、RGB カラーの R の値が 100 の場合に「反転」コマンドを実行すると、R の値は 155 に変更されます(255 - 100 = 155)。

補色
カラーの各構成要素を、選択したカラーの最大の RGB 値と最小の RGB 値の合計を元にして、新しい値に変更します。現在のカラーの RGB 値のうち最大と最小の値が合計され、その値から各構成要素の値を引いて、新しい RGB 値が生成されます。例えば、RGB 値がレッド 102、グリーン 153、ブルー 51 であるカラーを選択したとします。この場合、まず最大値である 153 と最小値である 51 を合計して 204 という値が算出されます。この値から既存のカラーの RGB 値がそれぞれ差し引かれます。つまり、新しいレッドの値は 204 - 102(現在のレッドの値)= 102、グリーンの値は 204 - 153(現在のグリーンの値)= 51、ブルーの値は 204 - 51(現在のブルーの値)= 153 となり、新しい補色の RGB 値が生成されます。
Yahoo! APIで取得したXMLをXMLオブジェクトにしたのにXML演算子でアクセスしようとしても
値が存在しないとエラーになってしまった。
アクセス方法も間違ってないし、XMLもちゃんと読み込めてるのになぁと調べると
名前空間が指定されている場合はそれも考慮してアクセスする必要があるとのこと。
んで、三つの方法があるようだ。

  1. 名前空間オブジェクト経由(この方法)

  2. default xml namespace でディフォルト名前空間の書き換え

  3. 名前空間の指定(xmlns="hoge")を削除する


1.だと階層が深くなると面倒そう。子の取り出し方次第で工夫できそうだけど。
2.がアクセスが楽になるし、XMLソースに影響与えないから一番使いやすいかな。
3.は強引な手だけど、干渉さえしないなら問題無。ソースの書き換えがどうかはあるけど。
webとの連携で名前空間の処理は必須なことを学べた。
ってかこれに引っかかってぜんぜん進めなかったorz。

// --- 省略 ---
var urn:Namespace = new Namespace('urn:yahoo:jp:auc:search'); // XML中の名前空間オブジェクト作成
_xml = _y.resultSet.urn::Result.urn::Item[0].urn::Title; // 検索結果のタイトル

見ればわかるようにいちいち名前空間経由でアクセスする必要があるので冗長になりがち。

2.の方法
default xml namespace ディレクティブ

default xml namespace = new Namespace('urn:yahoo:jp:auc:search'); // XML中の名前空間オブジェクト作成
_xml = _y.resultSet.urn::Result.urn::Item[0].urn::Title; // 検索結果のタイトル

何故かサンプルのように、Namespaceオブジェクト作ってからやると変数が定義されていないって出る。
何か勘違いしてるかなぁ。とりま今回はおkとしておく。

3.の方法
Remove Annoying XML Namespaces in Flex/AS3

_xml = removeNs(_xml);
public function removeNs(_xml:XML):XML {
var _smlStr:String = _xml.toString().replace(new RegExp("(xmlns|xsi)[^\"]*\"[^\"]*\"", "gi"), "");
return new XML(_smlStr);
}

こんな感じでとにかく xmlns="hoe" とか xsi="hau" を消してしまえばよいだけ。
private に設定したプロパティに対して、外部から代入や取得を行いたい場合、

private var _foo:int = 128;
private var _bar:int = 256;

// foo の値を返すメソッド
public function getFoo():int {
return this._foo;
}

// bar の値に引数を代入するメソッド
public function setBar(_val:int):int {
this._bar = _val;
}

のように直接変数にアクセスしないでメソッド経由で行うようにするのがOOPのお作法。
JAVAなんかはこの書き方を推奨している。

as3では getter / setter キーワードが用意されている。

private var _foo:int = 128;
private var _bar:int = 256;

// foo の値を返すメソッド
public function get foo():int {
return this._foo;
}

// bar の値に引数を代入するメソッド
public function set bar(_val:int):int {
this._bar = _val;
}

function の後ろに set / get を付け加えただけです。
これで外部からは foo / bar を使って public感覚でアクセスできる。
上記が記述されているクラスhoeがあったとして、

var hoe:Hoe = new Hoe();

// get/set が無ければ private なのでアクセスできない
trace(hoe.foo); // 128

Hoe.bar = 512; // private の _bar に代入される

コレでアクセサーメソッドをpublic変数にアクセスするような方法で使える。
引数の数が決まらない(複数の引数を渡す場合がある)ような場合に可変長引数が使える。


hoge('ま', 'み', 'む', 'め', 'も');

function hoge(...args:*):void {
// argsに各値はArray型に格納される
for each(var _s:String in args){
trace(_s);
}
}


入ってくる型が甘くなるからIS演算子等でうまいことやってあげたほうがよさそう。
引数の数で挙動がわかるオーバーロード風にも出来るし。
as3ってjavaみたくはオーバーロードできないのね。ってことも今回知った。
[1]  [2]  [3]  [4]  [5]  [6]  [7
プロフィール
Name :
yukku
カレンダー
08 2024/09 10
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
ブログ内検索
Twitter
Ads
アクセス解析
忍者ブログ [PR]