2009/06/02

mixiアプリでFlash(2)

以前公開したガジェットのサンプルの不良を早速見つけました。

以前のサンプルでは、
プロフィールの取得と、

gadgets.util.registerOnLoadHandler(get_viewer_profile);

Flashの表示が、
gadgets.util.registerOnLoadHandler(show_flash);

非同期に行われていた。

そのため、プロフィールの取得が済む前に、先にFlashが読み込まれてしまうことがありえる。
この場合、Flash内では必要な変数(プロフィール)を取得できず困ったことに…

この事態を避けるため、プロフィールの取得がすんだ段階でFlashの表示を行うように、サンプルを改変しました。

sample.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="use Social Data">
<Require feature="opensocial-0.8"/>
<Require feature="flash"/>
</ModulePrefs>
<Content type="html">
<![CDATA[

<script type="text/javascript">
var viewer = new Object(); // globalで必要な変数を宣言

function get_viewer_profile() {
var request = opensocial.newDataRequest();
request.add(request.newFetchPersonRequest(
opensocial.IdSpec.PersonId.VIEWER), "viewer_data");
request.send(function (response) {
var item = response.get("viewer_data");
if (item.hadError()) {
// エラー処理。item.getError() で詳細情報を取得
return;
}

// 実行ユーザのプロフィールを参照
var person = item.getData();

viewer.name = person.getField(opensocial.Person.Field.ID); // ID
viewer.name = person.getField(opensocial.Person.Field.NAME); // 名前
viewer.nickname = person.getField(opensocial.Person.Field.NICKNAME); // ニックネーム
viewer.url = person.getField(opensocial.Person.Field.PROFILE_URL); // プロフィールURL
viewer.icon = person.getField(opensocial.Person.Field.THUMBNAIL_URL); // アイコンURL
viewer.address = person.getField(opensocial.Person.Field.ADDRESSES); // 住所
viewer.age = person.getField(opensocial.Person.Field.AGE); // 年齢
viewer.birthday = person.getField(opensocial.Person.Field.DATE_OF_BIRTH); // 誕生日
viewer.bloodtype = person.getField(mixi.PersonField.BLOOD_TYPE); // 血液型

// Flashの表示
gadgets.util.registerOnLoadHandler(show_flash);
});
}
gadgets.util.registerOnLoadHandler(get_viewer_profile);

function show_flash() {
gadgets.flash.embedFlash(
"sample.swf", "externalContainer", "9.0.0",
{
width : 400, // 幅
height : 300, // 高さ
quality : 'high',
wmode : 'transparent',
allowScriptAccess : 'always' // swfからのaccessを許可
}
);
}

function getMixiPerson(){
return viewer; // 必要な変数を返す
}
</script>

<div id="externalContainer"></div>

<script type="text/javascript">

</script>

]]>
</Content>
</Module>


続き

2009/06/01

mixiアプリでFlash

mixiアプリが開始して久しいですね。
以下は、mixiアプリでFlashを使うための備忘録です。

以下のガジェットをmixiアプリで登録するものとする。

sample.xml

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="use Social Data">
<Require feature="opensocial-0.8"/>
<Require feature="flash"/>
</ModulePrefs>
<Content type="html">
<![CDATA[

<script type="text/javascript">
var viewer = new Object(); // globalで必要な変数を宣言

function get_viewer_profile() {
var request = opensocial.newDataRequest();
request.add(request.newFetchPersonRequest(
opensocial.IdSpec.PersonId.VIEWER), "viewer_data");
request.send(function (response) {
var item = response.get("viewer_data");
if (item.hadError()) {
// エラー処理。item.getError() で詳細情報を取得
return;
}

// 実行ユーザのプロフィールを参照
var person = item.getData();

viewer.name = person.getField(opensocial.Person.Field.ID); // ID
viewer.name = person.getField(opensocial.Person.Field.NAME); // 名前
viewer.nickname = person.getField(opensocial.Person.Field.NICKNAME); // ニックネーム
viewer.url = person.getField(opensocial.Person.Field.PROFILE_URL); // プロフィールURL
viewer.icon = person.getField(opensocial.Person.Field.THUMBNAIL_URL); // アイコンURL
viewer.address = person.getField(opensocial.Person.Field.ADDRESSES); // 住所
viewer.age = person.getField(opensocial.Person.Field.AGE); // 年齢
viewer.birthday = person.getField(opensocial.Person.Field.DATE_OF_BIRTH); // 誕生日
viewer.bloodtype = person.getField(mixi.PersonField.BLOOD_TYPE); // 血液型
});
}
gadgets.util.registerOnLoadHandler(get_viewer_profile);

function getMixiPerson(){
return viewer; // 必要な変数を返す
}
</script>

<div id="externalContainer"></div>

<script type="text/javascript">
function show_flash() {
gadgets.flash.embedFlash(
"sample.swf", "externalContainer", "9.0.0",
{
width : 400, // 幅
height : 300, // 高さ
quality : 'high',
wmode : 'transparent',
allowScriptAccess : 'always' // swfからのaccessを許可
}
);
}
gadgets.util.registerOnLoadHandler(show_flash);
</script>

]]>
</Content>
</Module>


上記のガジェット中のsample.swfは以下のソースをビルドしたものとする。

sample.fla
import flash.external.ExternalInterface;

var mixiPerson = ExternalInterface.call("getMixiPerson"); // JavaScriptのgetMixiPerson関数を呼び出す


このとき変数mixiPersonにはmixi上でそのアプリを閲覧している人の情報が格納される。
あとはご自由に! 続き

2009/05/27

MIXI QUEST


内容
mixiアプリに挑んでみました!
マイミクと一緒に戦ったり、
マイミクを倒したりするRPGです。
以下の問題に関しては、mixiアプリAPIが将来的に拡張されれば、対応する予定…
・所属するコミュニティが技として登場しますが、効果が適当
・味方パーティの負け判定がない
やり方
・←→↑↓…移動・選択
・スペースキー…決定

http://mixi.jp/run_appli.pl?id=1941
※上のURLにアクセスしてください。
続き

2008/12/03

CQL Library Manual

CQLの基本的な説明を示します。
また、その使い方のサンプルを示します。

select文
引数の条件(where文)に合致したデータベースのレコードを
2次元配列(第1添え字は行番号、第2添え字はカラム名)として返す。
引数がない場合、テーブルの値をすべて返す。

select(String  $wheres)


insert文
引数(第1カラムの値、コンマ、第2カラムの値、コンマ、…)を
レコードとしてデータベースに格納する。
insert(String  $values)


update文
第2引数の条件(where文)に合致したデータベースのレコードの値を
第1引数(カラム名=値)の指定に従い、更新する。
第2引数がない場合、テーブルの値をすべて更新する。
update(String $set,  String $wheres)


delete文
引数の条件(where文)に合致したデータベースのレコードの値を
削除する。
引数がない場合、テーブルの値をすべて削除する。
delete(String $wheres)


SAMPLE
cql.phpと以下の2ファイル(cqltest.php, table.csv)を同ディレクトリに置き、cqltest.phpを実行する。

cqltest.php
<?php
include 'cql.php';


$cql = new CQL("./table.csv");


echo "<br/><br/>全部<br/>";
print_r($cql->select());

echo "<br/><br/>番号が3以下<br/>";
print_r($cql->select("
no<=3
"));

echo "<br/><br/>名前がochi<br/>";
print_r($cql->select("name=ochi"));

echo "<br/><br/>性別が男<br/>";
print_r($cql->select("sex=m"));
echo "<br/><br/>番号が3以上で性別が男<br/>";
print_r($cql->select("
no>=3
_AND_sex=m
"));

$cql->insert("6,kome,m");
echo "<br/><br/>番号6,名前kome,性別mを挿入<br/>";
print_r($cql->select());

$cql->update("name=hero","no<=4_AND_sex=m");
echo "<br/><br/>番号が4以下の男の名前をheroに更新<br/>";
print_r($cql->select());

$cql->delete("name=hero");
echo "<br/><br/>名前がheroを削除<br/>";
print_r($cql->select());

?>


table.csv
no,name,sex
1,ochi,m
2,ochiyuki,f
3,ochigames,m
4,yuki,f
5,games,m


実行結果
全部
Array ( [0] => Array ( [no] => 1 [name] => ochi [sex] => m ) [1] => Array ( [no] => 2 [name] => ochiyuki [sex] => f ) [2] => Array ( [no] => 3 [name] => ochigames [sex] => m ) [3] => Array ( [no] => 4 [name] => yuki [sex] => f ) [4] => Array ( [no] => 5 [name] => games [sex] => m ) )

番号が3以下
Array ( [0] => Array ( [no] => 1 [name] => ochi [sex] => m ) [1] => Array ( [no] => 2 [name] => ochiyuki [sex] => f ) [2] => Array ( [no] => 3 [name] => ochigames [sex] => m ) )

名前がochi
Array ( [0] => Array ( [no] => 1 [name] => ochi [sex] => m ) )

性別が男
Array ( [0] => Array ( [no] => 1 [name] => ochi [sex] => m ) [1] => Array ( [no] => 3 [name] => ochigames [sex] => m ) [2] => Array ( [no] => 5 [name] => games [sex] => m ) )

番号が3以上で性別が男
Array ( [0] => Array ( [no] => 3 [name] => ochigames [sex] => m ) [1] => Array ( [no] => 5 [name] => games [sex] => m ) )

番号6,名前kome,性別mを挿入
Array ( [0] => Array ( [no] => 1 [name] => ochi [sex] => m ) [1] => Array ( [no] => 2 [name] => ochiyuki [sex] => f ) [2] => Array ( [no] => 3 [name] => ochigames [sex] => m ) [3] => Array ( [no] => 4 [name] => yuki [sex] => f ) [4] => Array ( [no] => 5 [name] => games [sex] => m ) [5] => Array ( [no] => 6 [name] => kome [sex] => m ) )

番号が4以下の男の名前をheroに更新
Array ( [0] => Array ( [no] => 1 [name] => hero [sex] => m ) [1] => Array ( [no] => 2 [name] => ochiyuki [sex] => f ) [2] => Array ( [no] => 3 [name] => hero [sex] => m ) [3] => Array ( [no] => 4 [name] => yuki [sex] => f ) [4] => Array ( [no] => 5 [name] => games [sex] => m ) [5] => Array ( [no] => 6 [name] => kome [sex] => m ) )

名前がheroを削除
Array ( [0] => Array ( [no] => 2 [name] => ochiyuki [sex] => f ) [1] => Array ( [no] => 4 [name] => yuki [sex] => f ) [2] => Array ( [no] => 5 [name] => games [sex] => m ) [3] => Array ( [no] => 6 [name] => kome [sex] => m ) ) 
  続き

CQL Library


内容
CQLをPHPから、利用するためのライブラリ。
CQL(Comma Query Language)とは、SQLに近しい操作でcsvファイルを操作するクラスのこと。(私の造語)
やり方
CQL Library Manual(http://ochigames.blogspot.com/2008/12/cql-library-manual.html)参照。

http://sites.google.com/site/ochiyuki/cql.zip
※上のURLにアクセスしてください。
続き