2009年10月23日金曜日

mixiアプリについてのサルメモ3 Persistence API(永続化データ)について

Persistence API(永続化データ)について

・valueにマルチバイトが使えるようになったらしい(最初の頃はダメだった)。

・keyは大文字、小文字を区別するらしい。

・valueにHTMLタグを入れるとエスケープされるらしい。

・valueに禁止文字はないらしい。
確認した限りではカンマ、シングルクォーテーション、ダブルクォーテーション、セミコロンがダイジョブだった。

・keyに使える文字は英数字、アンダーバーのみ。記号、スペース、マルチバイトは不可。数字の「0」1文字だけもダメ。「00」はダイジョブ。

マルチバイトのバグがいつのまにか修正されて使いやすくなりました。HTMLタグのエスケープもXSSとか気にしないで済むので助かります。応答速度も悪くないです。

2009年8月7日金曜日

mixiアプリについてのサルメモ2

ユーザがマイアプリからアプリを削除してもPersistence APIで永続化したデータは消えないらしい。

ユーザがマイアプリからアプリを削除するとアクティビティは消えるらしい。
マイアプリにもう一度登録してもアクティビティは戻らないらしい。

Mini messageを使うにはGadget XMLに
<Require feature="minimessage" />
が必要。

2009年7月31日金曜日

mixiアプリについてのサルメモ

mixiアプリを作ることになったのでサルのための備忘録

●Contentタグのview属性でcanvas、home、profileを指定。

<Content type="html" view="canvas"><![CDATA[
ここに書いたHTMLがアプリ画面に表示される。
(アプリトップから「アプリを開く」で表示される画面)
]]></Content>

<Content type="html" view="home"><![CDATA[
ここに書いたHTMLがアプリオーナーのホーム画面に表示される。
]]></Content>

<Content type="html" view="profile"><![CDATA[
ここに書いたHTMLがアプリオーナーのプロフィール画面に表示される。
(オーナー以外の人が見るオーナーの画面)
]]></Content>


●キャッシュ防止のOptionalタグはModulePrefsタグ内に書く。
※mixiアプリではサポートしない。
http://developer.mixi.co.jp/news/2009081301

<ModulePrefs title="hoge">
<Optional feature="content-rewrite">
<Param name="expires">86400</Param>
<Param name="include-urls"></Param>
<Param name="exclude-urls">.*</Param>
</Optional>


●Ajaxはgadgets.io.makeRequestを使う。

jQueryで書くと下記のような感じだったのが

$.post("hogeURL",{fuga : 7},function(response){
$("#hogeDOM").html(response);
});


gadgets.io.makeRequestを使うと下記のようになる。

var params = {};
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
var post_data = {fuga : 7};
params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(post_data);
gadgets.io.makeRequest("hogeURL", function(response) {
var feed = response.data;
$("#hogeDOM").html(feed);
},params);

2009年6月5日金曜日

Facebookアプリを作ってみたいサル FQL編

FQLとはFacebookアプリで使えるSQLライクなDSL(ドメイン固有言語)です。
ほぼSQLの文法でかけますがテーブル結合は出来ないっぽい。でもサブクエリは使える。

FQLについての公式wiki
サンプルFQL
http://wiki.developers.facebook.com/index.php/Sample_FQL_Queries
テーブル一覧
http://wiki.developers.facebook.com/index.php/FQL_Tables

公式wikiを読んでも欲しいデータがどこにあるのかわからないので実際にクエリを投げてテーブルの内容を確認してみた。
下記テーブル名とフィールド名。

*の付いたフィールドはインデックスあり。そしてWHERE区でインデックスのついたフィールドを指定しないと結果が返ってこないようです。

■テーブル名: album
*aid: アルバムID
*owner: アルバム所有者のユーザID
*cover_pid: アルバムの表紙になっている画像のpid
name: アルバムの名前
created: 作成時間 UNIXタイムスタンプ
modified: 更新時間 UNIXタイムスタンプ
description: 要約
location: 場所
size: アルバムに登録されている画像の数
link: アルバムのURL。http://www.facebook.com/album.php?aid=***&id=***
visible: アルバムの公開状況
modified_major: 最後にアルバムに写真の追加とかをしたときのUNIXタイムスタンプ

■テーブル名: photo
*pid: フォトID
*aid: アルバムID
owner: 画像所有者のユーザID
src_small: 小画像のURL
src_big: 大画像のURL
src: 画像URL
link: アルバムの中の画像を指定した状態のURL
caption:
created: UNIXタイムスタンプ
modified: UNIXタイムスタンプ

photoテーブルはownerにインデックスがないのでownerを指定した検索が出来ない!パフォーマンスを考慮してのことなんでしょうけどちょっと不便です。ownerを指定して検索するときは下記のようにサブクエリを使います。

ユーザIDを指定してphotoテーブルから画像URL一覧を取得するFQL
SELECT src FROM photo
WHERE aid IN (SELECT aid FROM album WHERE owner = $ユーザID)

■テーブル名: friend
*uid1: uid2と友達なユーザのID
*uid2: uid1と友達なユーザのID

SNSならではのテーブル。あるレコードのuid1とuid2が友達関係にあることを示します。
ユーザを指定してそのユーザの友達の名前一覧を取得するFQLはこんな感じ。
SELECT name FROM user
WHERE uid IN (SELECT uid1 FROM friend WHERE uid2 = $ユーザID)

■status
*uid: 投稿したユーザのユーザID
status_id:
time: 投稿した時刻のUNIXタイムスタンプ
source: 投稿に使われたアプリを表しているようだが???
message: 投稿内容

statusというテーブル名にだまされそうだけど「今なにをしていますか?」から投稿したコメントが入ってます。ユーザIDを指定してコメントを取り出します。

とりあえずこの辺で了。続きはそのうち。

2008年7月17日木曜日

PHP-Barcodeを使ってみたサル

バーコードとか作ってみようと思いライブラリを探しました。で見つけたのがPHP-Barcode。
http://www.ashberg.de/php-barcode/

動かすまで15分ぐらいかかった。バージョンは0.3pl1。
使い方は適当なディレクトリに配置してimgタグのsrcでパラメータつけるだけ。

<img src="barcode.php?code=4901480070278&scale=2&mode=png&encoding=EAN">

しかしバーコードが出てこない。というかPHPスクリプトが実行されていない。ソースを見たらPHPの開始タグが「<?」になっていたので「<?php」に修正(barcode.php、encode_bars.php、php-barcode.php)。無事バーコードが出てきました。

しかしバーコードの下部に表示されるはずのEAN(JAN)の数字が出てこない。もう一度ソースを見てみたらフォントのパスを指定している部分があやしい(php-barcode.phpの59行目と69行目)。パスの指定に$_SERVER["PATH_TRANSLATED"]というのを使っているけど値を取得できていないようなので、フォントを同じディレクトリに配置して59行目と68~70行目をコメントアウトし、$font_loc="フォントファイル名"と一行追加。無事動きました。

ずいぶん昔に書かれたソースなのかなと思ったら2004年製だってさ。4年前って大昔だなと思ったら4年後が恐くなってきた。

※フォントって何気なく使ってるけどライセンス要確認。なんだか複雑なことになってるようです。調べたけど良くわからんかった。サルはフリーフォントを使いましょう。

2008年7月14日月曜日

JavaScriptでホイール操作(拡大縮小)を実現したいサル

Googleマップ等で実現されているマウスホイール操作をやってみたくなってトライ。クロスブラウザ対応が大変手間で、マウスホイールをどっちに回転させたかまでは取得できたが、ここから先がムリ。サルが考えていたのはユーザがドラッグ操作で自由に配置した要素たちを、位置、サイズ、フォント等全てホイール操作で拡大縮小したかったんだけど難しい。今までFirefoxを素敵なブラウザと思っていたけど、今回はやられた。style属性のwidthやheightの値を除算したあと乗算したらもとの値に戻らない。style属性の値として有効な値と端数処理がブラウザごとに違う様子。もう一度チャレンジする気になれなさそうなので、誰かが素敵なライブラリを作ってくれるのを待つ。

<div id="hoge" style="border: 1px solid; width: 300px;height: 300px;"></div>

<script language="javascript">

function wheel(event){

var zoom = 0;

if (!event) event = window.event;

if (event.detail)
zoom = -event.detail / 3;
else if (event.wheelDelta)
zoom = event.wheelDelta / 120;
else zoom = 0;

var elem = document.getElementById('hoge');
elem.innerHTML = "zoom = " + zoom;
}

var hoge = document.getElementById('hoge');
if (hoge.addEventListener) hoge.addEventListener('DOMMouseScroll', wheel, false);
hoge.onmousewheel = hoge.onmousewheel = wheel;

</script>

2008年7月10日木曜日

cometについて続きを話すサル

HTTPの同時接続数には制限があるらしい。ということはもちろんAjaxセッションも。cometはセッションを一つ占有し続けるのでこれは重要な問題です。チャットしながら別のAjaxセッションを使いたい時もあるだろうし、複数のチャットルームにログインする場合とか。で前回作ったチャットプログラム(7月9日の2-1、2-2)でブラウザ毎にテストしたところ下記のようになっておりました。数字が同時接続数。

FireFox 2
Opera 4
Safari 4
IE8beta 6

同時接続数の制限は一つのブラウザから一つのドメインに対してらしいので、これを回避するにはサブドメイン等を使うとよろしいということになっているようです。

そしてcometではAjaxセッションを保持し続けるわけですが、SafariではAjaxセッションは2分で切れてしまうようです。つまりチャットやってて2分発言がないと落ちてしまう!これを回避する方法は不明。他のブラウザは少なくとも30分は大丈夫でした。

さらにcometを実装したサーバがどれくらいのセッションを捌けるのかという問題もあります。なにしろ接続しっぱなしですから。手元のマシンで前述のチャットプログラムを使ってテストしたところ、同時接続数20で発言時にCPU使用率3~7%(発言の長さによる)、待機時は1%未満、メモリ使用量はほとんど影響受けず。100セッションぐらいだったらテキトーなサーバでもけっこういけるんじゃないでしょうか。1Kとか10Kとかなったら多分無理。

以上なんかよくわかってないことについて書いてしまったので突っ込みあったらお願いします。