2011/01 |
2011/02
|
2011/03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2011/01 |
2011/02
|
2011/03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(実機(EXPERIA)をスクリーンキャプチャすると、全体的に何か青っぽいね)
QRコードを生成するAndroidアプリですが、まだまだ完成を見ない。(笑 単にかなりスローペースなだけなんやけど…。で、作ってるアプリにはできあがったQRコードを外部のアプリにエクスポートする機能を付けるべく実装してて、最初、以下のようなコードで外部インテントの起動を行っていた。
Intent intent = new Intent(Intent.ACTION_SEND, null);
intent.setType("image/png");
intent.putExtra(Intent.EXTRA_STREAM, image); // PNG形式データが入ったbyte[]を渡す
intent.putExtra(Intent.EXTRA_TEXT, text); // テキスト(EXTRA_TEXTを起動したIntentが受け取る場合)
startActivity(Intent.createChooser(intent, this.getText(R.string.button_export)));
エミュレーターでは、SMSのメッセージアプリしかないようで、テストをしようにもアプリの選択画面にはならず直接SMSアプリが開いてしまう。しかも、画像が添付されてほしいのに添付されない。何が問題かが分からないから、結局実機で試さざるを得ないことに。エミュレーターにFBアプリとか好きなアプリをインストールするにはどうしたらええんやろう。
ということで、実機でもやってみたんやけど、アプリの選択画面になっていろんなアプリを選べるようになったものの画像の添付はされなかった(Facebookアプリを選択)。
改めて調査を進めていくと、Send an Image, ACTION_SEND(ref. Android Forums)で、Intent.FLAG_GRANT_READ_URI_PERMISSIONが必要っぽいことを知り、そしてIntent.ACTION_SENDとIntent.EXTRA_STREAMの説明をもう一度読み直してみたら…byte[]を引数で取るオーバーロードがあるのに、Uriでないとダメなようなことが書いてある。ヤラレタ。というわけで書き換え(sms_bodyはおまけ)。
Intent intent = new Intent(Intent.ACTION_SEND, null);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // ファイルを読み込む権限を与える
intent.setType("image/png");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(path));
intent.putExtra(Intent.EXTRA_TEXT, text); // テキスト(EXTRA_TEXTを起動したIntentが受け取る場合)
intent.putExtra("sms_body", text); // 起動するIntentがSMSの場合のメッセージ本文
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(Intent.createChooser(intent, this.getText(R.string.button_export)));
このようにコードを変えることで、無事、Exportボタンから別のIntent(↓の場合はFacebookアプリ)へ画像を渡すことができた。
投稿者 ただ : 23:36 | トラックバック (1) カテゴリー ; プログラミング単語帳 , プログラミングとか
HTML5 x Android アプリ開発ハッカソン (A3に応募しよう)に参加してみました。主催の神戸支部側の人間としては、まぁ出ないといけないのかなーというノリで行ってみたんですが。
ちなみに、ハッカソンとやらのに参加するのは初めてです。
今回のハッカソンでは、HTML5-WEST.jpの方との共同開催ということで開発するネタはAndroidに限定されずHTML5を使ってもOK。1チーム5人程度のグループで開発を行います。というわけで、普段はAndroid(Java)を触っているわけやけども今日はHTML5を見てみようかなーと思ってました。せっかく、全然知らない人と何かを作る機会ですから。
で、JQuery MobileとHTML5を使って何かしてみようというグループに参加してみた。Android神戸チームを尻目に。そしたら、みんなハッカソンが初めての人やった…(笑。あいさつを済ませた後、実際に開発をする前にアイデアソンで何を作るかを決める。実際の開発時間って、6時間ぐらいしかないのでそんなに大きなものは作れない…。
個人的にFacebookのAPIを触ってみたかったので、今日が絶好のチャンスだと思いとりあえず「いいね!」の数を取ってきて表示するアプリはどうかと提案してみたら、特に異論もなく受け入れられてしまった…。
ちなみに、まぁ敢えて書かなくても分かるかもしれないですが、Facebook上では「いいね!」というリンクをクリックすることである投稿に対して「○○さんが「いいね!」と言っています」といった感じにどの友達が興味を持っていてくれてるか分かる仕組みがあります。Facebookを使い始めて、まずぶち当たる戸惑いのうちの1つがこの「いいね!」の使い方なのですが、それはそれとして。
この「いいね!」に着目し、今回は自分の投稿に対して「誰が」「どれだけ」の「いいね!」をしてくれているかを可視化することにした。
こんなグラフ(ref. HTML5 gallery)が描けるっぽいのは前の日にちらっと調べてみて分かっていたので、ノード部分にアイコンを描くことと、「いいね!」の数に応じてアイコンの大きさを変えることをひとまず提案。
まぁ、「いいね!」の数を集計してくれたり、友達のつながりをグラフで描いてくれるアプリなんかはたくさんあるわけで、そんなに目新しいことじゃないけど、HTML5(Canvas)を使うってことなので、その点ではあまり見ないアプリになるかなと。そしてさらに、node.js、WebSocketを使ってリアルタイムの書き換えにも対応できるような仕組みにも…。
というわけで、開発開始。
最初の数時間は、せっかくnode.jsを使うわけだからJavascriptで完結できないかなーとnode.jsをちょっと触ってみたりしてたんやけど、結局、PHPでデータを取ってくることに。参考にしたところは↓。
AKB48で学ぶFacebookアプリとファンページの連携方法 (ref. web探検隊)
これで、localhostからFbAPIを叩いて自分の友達やら、自分の投稿、ウォールの内容、とかとかを取って来れることを確認。最初に認証する画面(↓)が出てきて、確立されたセッションのaccess_tokenをコピる。
そして、ごにょごにょして、自分の投稿+「いいね!」してくれた人の名前とIDを取得(↓)。取ってきたデータを、表示する側に受け渡すところまで、僕の担当分は終わり。
…えっ、JQueryは?? …残念ながら僕はサーバーサイドの担当だったので表示側は別の方が…とりあえず、ダミーのデータで表示ができるようにHTML組んでくださってました。そして、Canvasでの表示も紆余曲折があったもののダミーデータでは表示できてました。
しかし、時間が足りなかった。データを流し込むことができなかった…くやじい。
いやまぁ、でも初めて会って、みんな初めてのハッカソンで、意外と頑張れた方ではないかなぁと心の中では思っているのですが、結果が伴ってないのでちょっと残念。個人的にはAPI触れたので満足やけどね…。
ハッカソン後の発表も初めてやったから、どんなふうに発表すればいいのかわからなかったけど、今回見て理解した。最初にどれだけ話を膨らまし、そしてどれだけ駄目だったのかをアピールすればいいのだと。プールの飛び込み台の高いところまで行けばいくほど、飛び込んだ時のウケがいい。(笑 どれだけ笑いが取れるかが印象につながるんだなーと…いや、きっと普通にいいアプリができて、いい感じに動いていればそれはそれは素晴らしい成果になるんでしょうが、半日未満の時間しかないハッカソンでそれができたら超人集団でしょうと(作業時間の見積もりとか、マネジメント部分も含めてという意味ですよ)。
いい経験できました本当に。みなさんありがとうございました。
…と、帰ってきてから、もう一回アクセスしたらこんな画面に…(涙
な、なんで!?
(2つ上の画像も実は再現できなくて、IFrame方式でやって撮った)
投稿者 ただ : 23:00 | トラックバック (0) カテゴリー ; お出かけ , プログラミングとか
さて、前回家に帰ってからうまくいかなくなってしまったAPIでのアクセス、とりあえずできるようになったので。AKB48で学ぶFacebookアプリとファンページの連携方法 (ref. web探検隊)を参考にしたことは、書いた通り。
<?php
require_once 'facebook-php-sdk/src/facebook.php';
// Create our Application instance.
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxx',
'cookie' => false,
));$session = $facebook->getSession();
if (!$session) {
$url = $facebook->getLoginUrl(array(
'canvas' => 0,
'fbconnect' => 0,
'next' => 'http://localhost/h/', // 遷移先(ここではlocalhost)
// offline_accessオフラインでのアクセス許可
'req_perms' => 'offline_access,user_status,read_stream,user_likes,friends_likes'
));
// アプリ未登録ユーザーなら facebook の認証ページへ遷移
echo "<script type='text/javascript'>top.location.href = '$url';</script>";
exit();
}$me = $facebook->api('/me');
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>php-sdk</title>
<style>
body {
font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
}
h1 a {
text-decoration: none;
color: #3b5998;
}
h1 a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<h3>You</h3>
<img src="https://graph.facebook.com/<?php echo $me['id']; ?>/picture">
<?php echo $me['name']; ?><h3>Your User Object</h3>
<pre><?php print_r($session); ?></pre></body>
</html>
http://localhost/h/index.phpを↑のようにすると、最初にhttp://localhost/h/にアクセスしたときに認証を求める↓のようになる。
ここで、作業を落ち着いてできるように、そして今後バックグラウンドで処理することを考慮して、オフラインでのアクセス許可(offline_access)を要求するPermissionに含めておく。すると、画面上では赤で囲んだように出てくる。
許可すると、今後アクセスするために必要となるaccess_tokenを含むセッション情報が画面に表示されるのでコピる。
<?php
require_once 'facebook-php-sdk/src/facebook.php';
// Create our Application instance.
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxx',
'cookie' => false,
));// さっき取ってきたアクセストークン
$access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";// FB APIで友人の配列を取得
$friends = $facebook->api('/me/friends','GET',array('access_token'=>$access_token));
// FB APIで自分の投稿を取得
$myposts = $facebook->api('/me/posts','GET',array('access_token'=>$access_token));$like_users = array();
$like_user_ids = array();?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>php-sdk</title>
<style>
body {
font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
}
h1 a {
text-decoration: none;
color: #3b5998;
}
h1 a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<h3>You</h3>
<img src="https://graph.facebook.com/<?php echo $me['id']; ?>/picture">
<?php echo $me['name']; ?><h3>Your posts</h3>
<?php foreach ($myposts['data'] as $post) { ?>
<h4><?php echo $post['id']; ?> : <?php echo $post['message']; ?></h4>
<pre>
<?php
// FB APIで投稿についての「いいね!」しているユーザーを取得
$likes = $facebook->api($post['id']."/likes",'GET',
array('access_token'=>$access_token));
foreach ($likes['data'] as $like) {
if (!$like_users[$like['name']]) {
$like_users[$like['name']] = 1;
$like_user_ids[$like['name']] = $like['id'];
} else {
$like_users[$like['name']]++;
}
echo $like['name']." ";
} ?></pre>
<?php } ?></body>
</html>
新しくPHPファイルを↑のように作ることで、↓のようなアクセス結果が得られる、と(これを前回出したかった!!)。
そして、$like_usersには(name => like数)、$like_user_idsには(name => user_id)が格納されるので、あとはこいつらを利用すると。けど…これは意外と遅い。そりゃ、投稿ごとに1回1回API呼び出してるんやから、意外というほどのことでもないけど。
まぁ、とりあえずこれで目的は達成したので今回はここまで。
前回のエラーののち、どうやって復旧させたかについて、メモ。どうも、Facebook APIでは、一度確立しているセッション($facebook->getSession())は、$facebook->getLogoutUrl(array('session_key' => $session['session_key']))とかやっても、セッションをリセットできないらしい…何度やっても、オフラインアクセスを有効にしている状態では同じアクセストークンが返ってきてしまうという、なんという仕様(FBアプリのシークレットコードを変更しても無駄だった)。
なので、アクセストークンをリセットするためには、ユーザー側でアプリを削除しないといけなかった。しかもその場所がややこしい。
左から、「アカウント>プライバシー設定」、「アプリ・ゲーム・ウェブサイト」、「利用しているアプリ」、赤で囲んだところをクリックしていくと見れるわけやけど…これ絶対見つけにくい。ここから、自分で作ったアプリを削除すると、セッション情報がきれいさっぱりなくなる。
投稿者 ただ : 21:02 | トラックバック (1) カテゴリー ; PinMarch Samples , プログラミング単語帳 , プログラミングとか
前回(Erbe 11.02.09)、自分の投稿に対して「いいね!」してくれている友達(とその数)の一覧を取得するコードを書いてみたけど、それぞれの投稿について「いいね!」をしているユーザーを取得するAPIを発行しているので、時間がかかってしまう。
というわけで、この「いいね!」している友達を取得する処理を全部サーバー側でやってしまおうかと。
そこで使うのがFQL。Facebookのデータベースに対してSQLっぽい文法を使ってクエリーを発行して、結果を取得することができる。そうすれば処理時間は短くなる、はず。
FQLをPHPで使うには、$facebook->api()で、array('method'=>'fql.query', 'query'=>QUERY, 'access_token'=>$access_token)を渡します。それに気づくのにどんなけかかったことか。検索すると、普通に旧版のPHPライブラリでの使用法しか出てこないし…。
上記のfql.queryメソッドでは、SQLのように結合ができない仕様になっているので、一気に関連テーブルの内容を取得したりということができないようになっています。重い処理はできるだけしないような仕組みなので仕方ないでしょう。代わりに、複数のFQLをまとめてバッチ処理のように投げることができるようになっています。fql.multiqueryメソッドを使い、$facebook->api()で、array('method'=>'fql.multiquery', 'queries'=array(QUERY-hash), 'access_token'=>$access_token)を渡します。
例えば、アクセストークンを取得した後のコードとHTMLを以下のように置き換える。
$access_token = $facebook->getAccessToken();
$result = $facebook->api(array('method'=>'fql.multiquery',
'queries'=>array(
'q1' => 'SELECT post_id,message FROM stream WHERE source_id = me()',
'q2' => 'SELECT post_id,user_id FROM like WHERE post_id IN (SELECT post_id FROM #q1)',
'q3' => 'SELECT id,name,url,pic FROM profile WHERE id IN (SELECT user_id FROM #q2)'),
'access_token'=>$access_token));...
<body>
<tt>
<?php print str_replace(array("\r","\n","\r\n"), "<br/>",
str_replace(" ", " ", print_r($result, true))); ?>
</tt></body>
すると、↓のように結果が表示される。"q1"に"SELECT post_id,message FROM stream~"、"q2"に"SELECT post_id,user_id FROM like~"、"q3"に"SELECT id,name,url,pic FROM profile~"の結果が代入されて、一連のクエリーでは"#q1"などとすると副問い合わせと同じ効果を得られると。
Array
(
[0] => Array
(
[name] => q1
[fql_result_set] => Array
(
[0] => Array
(
[post_id] => 100001407076553_167495089964651
[message] => さあ、がんばって書かねば。
)[1] => Array
(
[post_id] => 100001407076553_181279925247277
[message] => \これぞ!/
)[2] => Array
(
[post_id] => 100001407076553_188070427894601
[message] => きょうは控えめに。
)[3] => Array
(
[post_id] => 100001407076553_178593435517046
[message] => I ♡
)
...
さあ、この結果をあとはJQuery mobileとかで画面に出力する…と。
投稿者 ただ : 23:32 | トラックバック (0) カテゴリー ; PinMarch Samples , プログラミング単語帳 , プログラミングとか
福井県までカニ食べに行ってきました。最初、僕がカニを食べたいと言い出したのが始まりで、城崎とか香住ぐらいで食べたいなーと漠然と思っていたら、気がついたら福井県で食べることになってた。(爆
まぁ、なんでそうなったかというと、今回行くところには有名人 -名物女将の「ムキムキみっちゃん」- がいるのです。
今回はみっちぃ氏とあさこさん、まさし、たなか。氏、あやちゃんと行ったわけですが、ルートの選定がまためんどかった。(笑 合流する場所とか、いろいろヒドかったごめん(大津SA、敦賀IC)。
しかしまぁ、土曜日日帰りの予定を立ててて、天気予報を見る限り吹雪とか竜巻とか、不穏な言葉ばっかりなもんで、正直行けるかどうかさえ怪しかった。金曜日なんて、阪高がスリップ事故多発で大阪周辺が完全に止まるとか有り得んかったからなぁ。四国に至っては高速がほぼ死滅。
いやでもしかし、天候に恵まれ(?)北陸道に入ったときにちょっと雪を被ったぐらいで目的地まで行くことができた。神戸を朝6時すぎに出発して、かれこれ5時間半が経過しようとしてたけど。
13時半過ぎに到着し、そこからご飯。ご飯といってもほぼカニ、炭水化物どこ? 状態。寒ブリの刺身とウニを食べつつ、カニ刺しをかきこむ。みっちゃんにカニを割ってもらうのも見れて、大体満足。料理は満足というか、カニばっかりで結構キツかった。カニ食べたわーと思ったらまだ目の前には火がついてない鍋が2つもあったり、お粥が出てきたり、なかなかのご馳走。でもカニはうまい。
カニを食べて次はお風呂。ウーロン茶風呂に入った。珍しかったから入っておきたかったんよねー。食事とお風呂をいただいて、清算が終わったらこんなものをいただいた。
割引券! しかも回数重ねるごとに割引額が上がる‼ テンションあんま上がんねー!(笑
いやまあ、多少なりとも安くなることは嬉しいんやけど、もうしばらくカニいいわってなってるところに割引券が出てきても、ということで。次回来るときがあれば是非使いたい。
帰り、実は初対面だったかもしれない(?)あやちゃんとたなか。氏に意外な接点があることも判明。これはリアルに「知り合いかも?」(Facebook)がほんまに知り合いやったというなかなか感動もの。
そして、帰路はまともに雨と雪にまみれ。北陸道は雪が降ってても大丈夫やったけど、派手に敦賀ICを通り過ぎるというアクシデントに見舞われた。(笑 雪でフロントが全然見えなくて、それでなんやけど、同じことを福井北ICに入り損ねるというアクシデントでもやらかしてる。(爆
結果、神戸に帰り着いたのは23時回った後やったな…。
でも楽しかったし面白かった、みなさんおつかれ&ありがとう。
投稿者 ただ : 23:26 | トラックバック (0) カテゴリー ; お出かけ
気がついたら、その事件は起こってた。朝起きて、ケータイでメールを確認していたら件名に"Application has been disabled"という不穏な文字列が。
どうやら、「何らかの」理由で個人のアカウントが停止させられたということのよう。このメールが来てたのが朝8時だったので、気がつくのが早かった方なのかもしれない。
念のため、ログインしてみようとするとこんな画面に…。
噂に聞いていた、アカウント停止の画面。ちなみに、ずっとログインしっぱなしだったVM上のブラウザにはこんな風にダイアログが…。
はまちちゃんの件といい、事前にいくつか情報があったのでそれらを参考にしました。
まみぺこさんの記事を参考に、http://www.facebook.com/help/contact.php?show_form=disabledから問い合わせ。
すると、あっさりと問答無用で名前を強制変更されて解放されました。実際には問い合わせたのが土曜の朝11時ごろで、アカ停解除が日曜の朝5時なので18時間ぐらい停止期間がありましたが…。
しかし、この名前変更、とても不思議なのです…。(続く)
投稿者 ただ : 22:07 | トラックバック (0) カテゴリー ; mein Erbe
前回(Erbe 11.02.20)、名前が強制的に変更されたところまで書きましたが、その「不思議」なところについて。
まみぺこさんや僕なんかは、あっさりと名前変更だけされてポイと放り出された感じですが、はまちちゃんのほうは、なぜかあのようなことになってました。
なんででしょう…(笑 Asiajinの記事にまでなってしまってます。
“I’m A Russian-Japanese.” – Facebook Beset On Japanese Nickname Judgement
これは、おそらくはまちちゃんの本名が(検索可能な範囲に)どこにもなかったためと考えるのが自然のような気がします。そしてまた、FB社は自動的に抽出していると主張していますが、かなりの確率で通報ベースでBANが行われていることと想像できます。通報があっても本人に名前を修正する気がなかったので、論点をあれこれ変えて修正を迫った。
まみぺこさんも、確認はしてないですがどこかに本名があったため書き換えられたと想像できます。
しかしAsiajinでも指摘されていることですが、
Then, it is possible for some people to rethink, “If they resume IDs without authentic papers, how can they know the new name is real name?”
「証明書がないのにFBがIDを再開している場合、FBはどうやって新しい名前が本名だと分かるのか」、僕は実際に証明書をFBに提出したわけではないです。しかしFBは勝手に名前を変更(アルファベットに)しました。合っている保証もない名前を付けたわけです。この名前は変更できません、1択です。(※ 通常、名前=実名欄の変更は数回程度可能なようになっていて、また姓名の入れ替えも可能です)
これも想像ですが、おそらく通報時に名前が一緒に添えてあったのか、FB側でちまちまと検索をして引っ張り出してきたかのどちらかです。しかし、僕がWeb上に出している名前が本当にその名前かどうかは、実際に僕と顔を突き合わせているか、何か具体的な用事で連絡を取っている人以外に知っている人はいませんし、検索しても有名じゃないのでそう簡単に出てこないと思います。
つまり、ほぼ、検索から僕の名前を導き出すのはほぼ不可能、ということです。
無理やり引っ張ってくるとすれば、個人情報の不正取得(参考)で、個人情報保護法違反(個人情報の保護に関する法律第十七条)になります(罰則はないですが)。
私がネット活動を「ネットの実名」で行わなければならない理由(ref. もとまか日記)
上のリンク先での主張はもっともだと思っています。ただ個人的な主張に偏っている面もありますが…。実名・本名でなきゃいけない、そんな実名至上主義・原理主義者さんたちに伝えたいことがあります。どんな名前であっても、その人(名前)がちゃんと人格を持ち、その名前で犯罪行為を行っていないのであれば人権が保証されるべきではないでしょうか。勝手な独善的行動で平和に過ごしているその人を不幸にするのは止めませんか、そしてその不幸を笑うのは止めませんか。
友達でそういったことに加担してる人はきっといないだろう、と信じたいです。
投稿者 ただ : 21:55 | トラックバック (0) カテゴリー ; mein Erbe
ごめん何も捻ったタイトルが思い浮かばなかった。
本日は昼から日本Androidの会 関西支部 発表部屋に参加して(聞くばっかりやったけど)、夜はFBのオフ会に出た。関西支部の方の懇親会(新年会)もあったけど、それを知ったのはオフ会に出ると決めた後やったから、気になるけどそこは仕方ない…。
発表部屋は面白かった、ずっと大部屋の方にいたけど小さい方にも行きたかった…。しもださんのLL(Python)をAndroidで使う話、支部長の正装、京都GTUG山下さんの興味深い告知の話、丹羽さんの試験が差し迫っているというすごい大変な時の渾身のGoogleサービスのtokenネタ、HTML5-WEST.jpの村岡さんによるIE6対応別料金キャンペーンとie6-alert.jsの話も面白かった。
あと極め付けは最後のLTタイムでのかけなびさんの超絶抱腹ネタ(どうしておくとばさんは改名したか)、ありゃりゃまさんの今年から封印していた眼鏡ネタ全開トーク。5分なのに5分間とは感じられない‼
特に面白いと思ったものをリンク張っておきました。すぎもてさんの植物工場の話とか、女子部の話とか興味が合ったけど、聞けんくて残念…。
その後のFBオフ会も、今回初対面の方も増えて賑やかやったわ…プログラマーになりたいって言ってる、デザインやってるという女の子がPHPをやってると言ったり。その子がまたすごいリアクションが面白くて。
いやほんま楽しかった。
投稿者 ただ : 23:01 | トラックバック (0) カテゴリー ; お出かけ