2010/05/25

叫び

内容
今日もまた、思いついて。
体の次は顔をかいてみたくなりました。

続き

2010/05/24

夕方ランナー

内容
そろそろ寝ようとおもってたところ、思い立ってはじめてアニメを作成。
テーマは、夕方ひたすら走る様子です。

続き

2010/01/15

はてなハイクからTwitterへの移行

この期に及んで気づいたことがある。
はてなハイクはTwitterに負けた。
iPhone App Storeを眺めていてもTwitterクライアントは唸るほどあるのに、はてなハイクのそれは見たことがない。

そのため、Twitterへの移行を決意した。
ただ、これまでの財産(ハイク)を無駄にしたくはない…。
そこで、ハイク→ツイート ツールを作成することにする。

今回はクロスドメインなど面倒なことを考慮したくないので、サーバーサイドで作成する。

まず、ハイクを取得する。

ハイク 取得 モジュール

from google.appengine.api import urlfetch
from django.utils import simplejson
import urllib

def readContents(user):
if user == "":
return ""

url = "http://h.hatena.ne.jp/api/statuses/user_timeline/" + user + ".json?count=200"

try:
result = urlfetch.fetch(url)
array = simplejson.loads(result.content)
except:
array = [0]
array[0] = {"text": "not found user", "created_at": ""}

return array


昨今は何でも便利だ。
・関数urlfetch.fetch(url)にて、変数urlに対するリクエストが行われる
・変数urlに対するリクエストのレスポンスに、変数userのハイクがjson形式で返る

以下がサンプル。
http://ochigames.appspot.com/tst_readhatenahaiku

次回はツイートを投稿するモジュールを作成する。 続き

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上でそのアプリを閲覧している人の情報が格納される。
あとはご自由に! 続き