Home > Tags > ActionScript
ActionScript
AIR: Webサーバ、Socketの接続状況を検知 - URLMonitor、SocketMonitorクラス
- 2008-12-24 (水)
- Flex & AIR
任意のアドレスのWebサイト[サービス]のネットワーク状況を検知するURLMonitorと、任意のサーバ+ポートに接続可能か否かを検知するSocketMonitorクラスの動作サンプルを下記に示します。
ソースコード
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
applicationComplete="startup()">
<mx:Script>
<![CDATA[
import air.net.SocketMonitor
import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;
private var SERVER_URL:String = "http://www.yukun.info/";
private var SOCK_ADRR:String = "yukun.info";
private var PORT:int = 6667;
private var INTERVAL_TIME:int = 3000; // ms
private var serviceMonitor:URLMonitor = null;
private var socketMonitor:SocketMonitor = null;
private function startup():void {
var endpoint:URLRequest = new URLRequest(SERVER_URL);
serviceMonitor = new URLMonitor(endpoint);
serviceMonitor.addEventListener(StatusEvent.STATUS, onStatusEvent);
serviceMonitor.pollInterval = INTERVAL_TIME;
serviceMonitor.start();
socketMonitor = new SocketMonitor(SOCK_ADRR, PORT);
socketMonitor.addEventListener(StatusEvent.STATUS, onSocketStatusChange);
socketMonitor.pollInterval = INTERVAL_TIME;
socketMonitor.start();
}
// ネットワークサービスの状態の検知
private function onStatusEvent(e:StatusEvent):void {
var date:Date = new Date();
trace(date.toLocaleTimeString());
trace(SERVER_URL + "に" + (serviceMonitor.available ? "接続可" : "切断中"));
}
private function onSocketStatusChange(e:StatusEvent):void {
trace(SOCK_ADRR + "のポート" + PORT + "は" +
(socketMonitor.available ? "接続可" : "切断中"));
}
]]>
</mx:Script>
</mx:WindowedApplication>
実行結果
http://www.yukun.info/に接続可 yukun.infoのポート6667は切断中
URLMonitorはネットワーク状況を検知する為にサーバへGETリクエストを送出して、レスポンスのステイタスコードを確認して判断しているようです↓。
リファレンス
- Comments: 0
- Trackbacks: 0
AIR: SQLiteでデータの挿入と検索 - SQLConnection、SQLStatementクラス
- 2008-12-22 (月)
- Flex & AIR
AIRアプリケーションからSQLiteのDBにアクセスするには主にSQLConnectionとSQLStatementクラスを用います。基本的な処理の流れは、
- SQLConnection#openAsync(<Fileオブジェクト>, <モード>)でDBに接続
- SQLStatement#textプロパティにSQL文を代入しexecute()で実行
- その際、フィールド値はSQLStatement#parameters["@<定義されたパラメータ>"]で代入する
- SELECT文の検索結果データははSQLStatement#getResult()で取得
- 結果データの型はSQLResultで、データそのものはdataプロパティ(Array型)に入っている。e.g. <SQLResult>.data[i].<フィールド名>
下のプログラムはDBに接続してテーブルの作成、レコードの追加、検索を行うサンプルです。
ソースコード
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" creationComplete="dbConnect()">
<mx:Script>
<![CDATA[
import flash.data.SQLConnection;
import flash.filesystem.File;
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
private var conn:SQLConnection;
private var dbFile:File;
private var sql:SQLStatement;
// DBに接続
private function dbConnect():void {
conn = new SQLConnection();
conn.addEventListener(SQLEvent.OPEN, onDBOpen);
conn.addEventListener(SQLErrorEvent.ERROR, onDBError);
dbFile = File.desktopDirectory.resolvePath("test01.db");
trace("フィアルは存在" + (dbFile.exists ? "します。:" : "しません。") + dbFile.nativePath);
conn.openAsync(dbFile, SQLMode.CREATE);
}
// 接続完了
private function onDBOpen(e:SQLEvent):void {
trace("Connect DB");
conn.removeEventListener(SQLEvent.OPEN, onDBOpen);
conn.removeEventListener(SQLErrorEvent.ERROR, onDBError);
createTable(); // テーブルを作成
}
private function onDBError(e:SQLErrorEvent):void {
trace("Can't connect DB: " + e.error.message);
trace("Error detals: " + e.error.details);
}
// テーブルを作成する関数
private function createTable():void {
sql = new SQLStatement();
sql.sqlConnection = conn;
var sqlTxt:String = "CREATE TABLE IF NOT EXISTS addresses " +
"(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
sql.text = sqlTxt;
sql.addEventListener(SQLEvent.RESULT, onCreate);
sql.addEventListener(SQLErrorEvent.ERROR, onCreateError);
sql.execute();
}
// テーブル作成完了
private function onCreate(e:SQLEvent):void {
trace("Can create table");
sql.removeEventListener(SQLEvent.RESULT, onCreate);
sql.removeEventListener(SQLErrorEvent.ERROR, onCreateError);
insertData(); // データを挿入
}
private function onCreateError(e:SQLErrorEvent):void {
trace("Can't create table: " + e.error.message);
trace("Error details: " + e.error.details);
}
private function insertData():void {
sql = new SQLStatement();
sql.sqlConnection = conn;
var sqlTxt:String = "INSERT INTO addresses (id, name, age) " +
"VALUES (@id, @name, @age)";
sql.text = sqlTxt;
sql.parameters["@id"] = 1;
sql.parameters["@name"] = "名無し";
sql.parameters["@age"] = 18;
sql.addEventListener(SQLEvent.RESULT, onInsert);
sql.addEventListener(SQLErrorEvent.ERROR, onInsertError);
sql.execute();
}
// データ挿入完了
private function onInsert(e:SQLEvent):void {
trace("Can insert data");
sql.removeEventListener(SQLEvent.RESULT, onInsert);
sql.removeEventListener(SQLErrorEvent.ERROR, onInsertError);
selectData(); // データを検索
}
private function onInsertError(e:SQLErrorEvent):void {
trace("Can't insert data: " + e.error.message);
trace("Error details: " + e.error.details);
}
private function selectData():void {
sql = new SQLStatement();
sql.sqlConnection = conn;
var sqlTxt:String = "SELECT * FROM addresses";
sql.text = sqlTxt;
sql.addEventListener(SQLEvent.RESULT, onSelect);
sql.addEventListener(SQLErrorEvent.ERROR, onSelectError);
sql.execute();
}
// 検索結果を取得完了
private function onSelect(e:SQLEvent):void {
trace("Can select data");
sql.removeEventListener(SQLEvent.RESULT, onSelect);
sql.removeEventListener(SQLErrorEvent.ERROR, onSelectError);
var result:SQLResult = sql.getResult();
var num:int = result.data.length;
var id:int;
var name:String;
var age:String;
for (var i:int = 0; i < num; i++) {
var row:Object = result.data[i];
id = row.id;
name = row.name;
age = row.age;
var str:String = "id=" + id + ", name=" + name + ", age=" + age;
trace(str);
}
}
private function onSelectError(e:SQLErrorEvent):void {
trace("Can't select data: " + e.error.message);
trace("Error details: " + e.error.details);
}
]]>
</mx:Script>
</mx:WindowedApplication>
実行結果
フィアルは存在しません。/Users/yukun/Desktop/test01.db Connect DB Can create table Can insert data Can select data id=1, name=名無し, age=18
リファレンス
- Comments: 0
- Trackbacks: 0
AIR: テキストファイルに書き込み - openAsync()、writeMultiByte()
- 2008-12-18 (木)
- Flex & AIR
AIRコンポーネントではローカルのファイルにアクセスすることができます。下記のコードは日本語を含むマルチバイトの文字列をテキストファイルに書き込む処理をします。
処理の手順
- FileStream#openAsync()かopen()メソッドの引数にFileインスタンスとFileModeのプロパティを設定して実ファイルのパイプに接続
- FileStream#writeMultiByte()でファイルに書き込み
- FileStream#close()でストリームを閉じる
ソースコード
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="シンプルテキストメイカー">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private var choDir:File = File.documentsDirectory; // ダイアログの初期ディレクトリ
private var saveFile:File;
private var stream:FileStream;
private function onSaveFileBut():void {
choDir.addEventListener(Event.SELECT, onSelectSaveFile);
choDir.browseForSave("テキストファイルに保存");
}
private function onSelectSaveFile(e:Event):void {
saveFile = e.target as File; // 選択されたファイル
choDir.removeEventListener(Event.SELECT, onSelectSaveFile);
try {
stream = new FileStream();
stream.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorWriteFile);
stream.openAsync(saveFile, FileMode.WRITE); // 書き込みmodeで開く(フツーのopen()でもOK)
var str:String = txtArea_.text;
// 改行文字と文字コードをOS標準のものに置き換えて書き込み
str = str.replace(/\n/g, File.lineEnding);
stream.writeMultiByte(str, File.systemCharset); // 実際に書き込み
} catch (err:IOError) {
progLab_.text = "IOError : " + err;
} finally {
if (stream != null) {
stream.close();
}
}
}
// ファイル書き込みに失敗した場合
private function onIOErrorWriteFile(e:IOErrorEvent):void {
Alert.show("ファイルの書き込みに失敗", "エラー", Alert.OK, this);
if (stream != null) {
stream.close();
}
}
]]>
</mx:Script>
<mx:VBox x="0" y="0" height="100%" width="100%">
<mx:HBox width="100%">
<mx:Button label="ファイルに保存" id="saveBut_" click="onSaveFileBut();"/>
<mx:Label id="progLab_"/>
</mx:HBox>
<mx:TextArea width="100%" height="100%" id="txtArea_"/>
</mx:VBox>
</mx:WindowedApplication>
リファレンス
- Comments: 0
- Trackbacks: 0
AIR: テキストファイルを非同期に読み込む - openAsync()、readMultiByte()
- 2008-12-17 (水)
- Flex & AIR
AIRコンポーネントではローカルのファイルにアクセスすることができます。下記のコードは日本語を含むマルチバイトのテキストファイルを読み込み、画面い表示する処理を行います。
大まかな手順
- FileStreamのコンストラクタの引数に対象のファイルへのパスが設定されたFileインスタンスを渡す。
- FileStream#openAsyncで実ファイルへのパイプ接続。
- この時、非同期の読み込み完了/エラーを取得するためにイベントを登録しておく。
- 実際の文字の読み取り(どれだけ読むか、文字コードの変換など)はFileStream#readMultiByteで行う。
- ストリームのインスタンスには接続時にpositionプロパティ(何処読んでいるかのポインタみたいなもの)からファイル末尾までのサイズ(bytesAvailable)を取得してるので、読み込みサイズにそれを指定。
- FileStream#close()でストリームを閉じる
ソースコード
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
title="テキストビュワー">
<mx:Script>
<![CDATA[
import flash.filesystem.*;
import mx.events.*;
import mx.controls.Alert;
private var choDir:File = File.documentsDirectory; // 開くディレクトリを指す
private var curFile:File; // 選択されたファイル
private var stream:FileStream;
private function onOpenFileBut():void {
choDir.addEventListener(Event.SELECT, onSelectFile);
choDir.browseForOpen("開く"); // ファイル選択ダイアログの表示
}
// ファイルが選択されたイベント
private function onSelectFile(e:Event):void {
txtArea_.text = "";
stream = new FileStream();
curFile = e.target as File;
stream.addEventListener(Event.COMPLETE, onCompleteReadFile);
stream.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorReadFile);
stream.addEventListener(ProgressEvent.PROGRESS, onProgReadFile);
stream.openAsync(curFile, FileMode.READ); // 非同期読み込み
curFile.removeEventListener(Event.SELECT, onSelectFile);
}
private function onCompleteReadFile(e:Event):void {
try {
// OS標準の文字コードで読み込み
var str:String = stream.readMultiByte(stream.bytesAvailable, File.systemCharset);
// OS標準の改行文字への変換
var pat:RegExp = new RegExp(File.lineEnding, "g");
str = str.replace(pat, "n");
txtArea_.text = str; // テキストエリアに表示
stream.removeEventListener(Event.COMPLETE, onCompleteReadFile);
stream.removeEventListener(IOErrorEvent.IO_ERROR, onIOErrorReadFile);
stream.removeEventListener(ProgressEvent.PROGRESS, onProgReadFile);
} catch (err:Error) {
progLab_.text = "IOError: " + err;
}
finally {
// パイプのクローズ
if (stream != null) {
stream.close();
}
}
}
private function onIOErrorReadFile(e:IOErrorEvent):void {
Alert.show("ファイルを読み込み不可", "Error", Alert.OK, this); // 第4引数には親オブジェトを渡す
if (stream != null) {
stream.close();
}
}
private function onProgReadFile(e:ProgressEvent):void {
progLab_.text = "Progress: " + e.bytesLoaded + " / " + e.bytesTotal + " bytes";
}
]]>
</mx:Script>
<mx:VBox x="0" y="0" height="100%" width="100%">
<mx:HBox width="100%">
<mx:Button label="ファイルを開く" id="openBut_" click="onOpenFileBut();"/>
<mx:Label id="progLab_"/>
</mx:HBox>
<mx:TextArea width="100%" height="100%" id="txtArea_"/>
</mx:VBox>
</mx:WindowedApplication>
リファレンス
- Comments: 0
- Trackbacks: 0
AmazoCluster: 一発で納得のいくものができればいいけれどね・・・
- 2008-12-15 (月)
- ActionScript
Demo(Uncompleted): http://www.yukun.info/labs/flex/AmazoCluster01/
- これは何?
- どうやって使うの?
- 商品画像をダブルクリックすると類似商品の画像が表示されます。またその画像をダブルクリックすると・・・以下ループ。
- 画像をドラッグすると線で結ばれた類似商品も納豆の糸のようについてきます。
- 今後直したい/追加したい機能は?
- 商品の検索フォーム
- 商品-類似商品間の距離調整だけでなく類似-類似間の調整も行う
- 各イベントによる処理のタイミングの調整
- ドラッグ中の商品とその関連商品を結ぶ線の色と画像のサイズを変更
- 関連の深さによって色合いとサイズが変化
- 商品をクリック/マウスオーバーしたときのアクションを増やす
- タイトル等の商品の詳細情報を表示
- Amazonページへのリンク
- 関連度合いによるエフェクトの区別
- 3D表示:Z軸への意味付け(時間軸、ここでは出版年度なんかは最適かも?)
- それができたら使うメリットはある?
- そういえば、なんで作ろうと思ったの?
- 作って勉強になったことは?
- 最近ブログ書いてないね。
Amazon.co.jpの任意の商品の類似商品を線で結び関連付けを視覚化するアプリ。(見にくいね。まだ未完成だけど、暇を狙って完成させる)
たぶん色々とある。作る前から作るべき明確なメリットを定義して作り始めるのがベターというかマストだけど。どちらにせよ仮説と検証の試行錯誤は必要。
以前授業の課題で書いたX11でフラクタル描くコードと卒研のコードを読み直していたら今回のアプリを想像して「ん?これくらいならサクッと書けるかも」と思ったのが発端。また、「検索行動の典型」=「フォームにキーワードをスペースはさんで入力→ポチっ→ページのリストから選択」とはひと味変った検索のメリットを見出したい、というのがメタ動機。その一例(にできればいいね)。
一応作ることで、以前よりクラスの役割付け(機能の結合度合い)とデザパタの適応を以前よりスムーズにこなせるようにはなった。おおまかな設計→コーディングの速度も少し上がった(気のせい)。でもそれ以外は・・・うーん、今後の課題。
今回はAmazonの商品を線で繋げたけれど、それをTwitter(つぶやき-つぶやき中のキーワード間、ユーザ-フレンド間)やDelicious(タグ-ブックマーク間、ユーザ-フレンド間)、WordPressブログ(タグ-記事間)に変更しても基本UIの部分はわずかな修正でいけるクラス群だと思う。もちろん、場合によっては類似度を算出する部分も用意する必要がある。
卒研とバイトその他で詰まっているのは理由としては身も蓋もナフサ。単に私の生活の中でブログのプライオリティや使い道が変化してきているのかも。
- Comments: 0
- Trackbacks: 0
Home > Tags > ActionScript


