0

mixiアプリで情報をjsonで永続的に保存する方法

opensocialのデータの保存方法は、Key-Valueペアの文字列情報になります。
非常に高速に単純明快で扱いやすいのですが、とたんに扱いにくくなりコードが冗長化しがちです。

mixiアプリはjavascriptなんでそんな時jsonで保存しとくとラクチンです。
幸いな事にopensocialにはjson化するメソッドが既に備わっています。
下記がarrと言う名前のJSONデータが作成を保存する方法です。

情報の永続化

var user_id = opensocial.IdSpec.PersonId.VIEWER;
 
var arr = {};
arr['title'] = "hoge";
arr['rank1'] = "rank1";
arr['rank2'] = "rank2";
arr['rank3'] = "rank3";
 
// エンコードしてjson化
var jsonvalue = gadgets.json.stringify(arr);
  
var req = opensocial.newDataRequest();
req.add(req.newUpdatePersonAppDataRequest(user_id, "jsonvalue", jsonvalue));

永続化された情報の取得

var user_id = opensocial.IdSpec.PersonId.VIEWER;
 
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(user_id), "viewer");
var fields = [ "jsonvalue" ];
 
req.send(function(response) {
if (response.hadError()) {
alert(response.getErrorMessage());
} else {
var myId = response.get("viewer").getData().getId();
var data = response.get("viewer_data").getData();
 
var str = data[myId]["jsonvalue"];
str = gadgets.util.unescapeString(str);
var arr = gadgets.json.parse(str);
 
// hogeが出力される
alert(arr.title);
}
});

0

wordpressでexec-phpが対応がmoreで反応しない件

wordpressで本文でphpのコードが実行できるexec-phpというプラグインがあります。
これを本文を分割する<!–more–>と一緒につかうと、phpが実行されずコードがそのまま表示されます。

詳しくはみてないけど、moreの部分をWPで処理するするのにタグをエスケープしていて、その際<?phpもタグみなしてエスケープしてる為です。
しかもエスケープの仕方が<?php → < ?phpとなってしまいます。

formatting.phpに該当するコードがあるのでこれを置換したら元通りphpが実行されます。
wp-includes/formatting.phpの989行目くらい。

$newtext = str_replace("< ?php","<?php",$newtext);

0

mixiアプリでのキャッシュの無効処理

無効処理と言う程でもないけど、mixiアプリはアプリ自体は自前のサーバーにアップします。
そのアプリをmixiから呼び出して実行する仕組みです。
毎回mixiから自前サーバーへの接続があるのも面倒な話なんで、アプリはmixiのキャッシュサーバーに取り込まれます。
これはこれでいいんだけど、開発時やデバッグ時にはかなり厄介です。
で、このキャッシュを除去するには、URLの後に下記のパラメーターを付与します。

&nocache=1

これで毎回修正を加えたアプリを取得しにいきます。

ただこれでもxmlの中に
<script type="text/javascript" src="http://hoge.com/mixiapp/opensocial-jquery.js"></script>
のように外部ファイルを読み込む記述があるとこれは引き続きキャッシュを読み込みます。

これを除去するのは、使い古されたやり方だけどURLの後ランダムな文字列(Math.random())を付与します。

0

mixiアプリでownerがviewerであるかの判別

var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest('OWNER'), 'owner');
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), 'viewer');
req.send(function(data) {
var owner = data.get('owner').getData();
var oid = owner.getField(opensocial.Person.Field.ID);
var viewer = data.get('viewer').getData();
var vid = viewer.getField(opensocial.Person.Field.ID);
var viewer = data.get("viewer").getData();
if(vid == oid){
//viewerがownerである時
$("#owner").show();
$("#viewer").hide();
m.getContents();
}else{
//viewerがowner以外の時
$("#owner").hide();
$("#viewer").show();
v.getContents();
}
});

0

mixiアプリでユーザー情報を取得

mixiアプリを仕事ですることになったのでメモ。
ユーザー情報をとってくるサンプルです。
特定のユーザー(243944402)からプロフィールURLを取得します。

profile URL is <span id="target"></span>
<script type="text/javascript">
function init() {
var params = {};
params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [
opensocial.Person.Field.PROFILE_URL,
];
// ユーザーIDを指定
var uid = "243944402";
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(uid, params), "spec");
req.send(function(data) {
var viewer = data.get("spec").getData();
var profileUrl = viewer.getField(opensocial.Person.Field.PROFILE_URL);
document.getElementById("target").innerHTML = profileUrl;
});
} 
gadgets.util.registerOnLoadHandler(init);
</script>

特定のユーザー(243944402)のマイミクのプロフィールURLを取得します。
複数のデータがとれるのでeachでまわす。

<div>profile URL is <span id="target"></span></div>
<script type="text/javascript">
function init() {
// ユーザーIDを指定
var uid = "243944402";
var user_info = {};
user_info[opensocial.IdSpec.Field.USER_ID] = uid;
user_info[opensocial.IdSpec.Field.GROUP_ID] = "FRIENDS";
var idSpec = opensocial.newIdSpec(user_info);
var params = {};
params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [
opensocial.Person.Field.PROFILE_URL,
];
var req = opensocial.newDataRequest();
req.add(req.newFetchPeopleRequest(idSpec, params), "friends");
req.send(function(data) {
var friends = data.get("friends").getData();
friends.each(function(friend) {
var prof = friend.getField(opensocial.Person.Field.PROFILE_URL);
document.getElementById("target").innerHTML += prof + '<br>';
});
});
}
gadgets.util.registerOnLoadHandler(init);
</script>

このアプリをインストールした人のプロフィールを取得したい場合は、opensocial.IdSpec.PersonId.OWNER、
このアプリを今使ってる人(ユーザー自身)のプロフィールを取得したい場合は、opensocial.IdSpec.PersonId.VIEWER
をそれぞれuidに指定。

uidのユーザーIDはintとして扱うとエラー吐くので注意。

0

phpで前月の日付を表示

phpで前日とか前月の日付を取得するのにこんなやり方もあったんや。
date("Y年m月d", strtotime("-1 day"));
date("Y年m月d", strtotime("-1 month"));
date("Y年m月d", strtotime("-1 year"));
date("Y年m月d", strtotime("-1 week"));

今までmktime使って取得してたけど、こっちの方がきれい。
phpのこの緩さが他の言語使いからしたら許せんところやろうな。

0

PHPのタイムゾーン

しらんかった。
phpのdate関数がアメリカの時間を取得していたので、てっきりec2に突っ込んだfedoraのタイムゾーンがアメリカだからと思い込み下記のような修正を行いました。
# mv /etc/localtime /etc/localtime.org
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

これでfedoraのタイムゾーンが変わったからいけると思ったけどそれでも無理。

で調べるとphp.iniを修正するとのこと。
date.timezone=”Asia/Tokyo”

これで無事、日本時間が取得できます。