blog.ikekou.jp

Google Never Reader

Google Readerの増えすぎた購読フィードを整理したい。がどれを解除していいか判断がつかない僕のために。

僕は今でもできるだけ毎日Google Readerに目を通しているのだけど、どうにも効率が低下している気がしていた。
基本的に登録はするが削除はしないのでそのせいかもしれない。

そこでふとGoogle ReaderのAPI(非公認)があったのを思い出して、使ってみたかったというのもあって、購読解除してもいいかもしれないフィードを見つけるコードを書いてみた。ついでにTwitter Bootstrapも使ってみたかったので使ってみた。

とはいっても、Google Readerの既読アイテム直近1000件(ほんとはもっと取得したかったのだけど1000件以上取得する方法がぱっとわからなかった)から単純に既読数とスター数の割合で、たくさん読んでるのにちっともスターがついてないフィードはもしかしていらないんじゃない?という風に並べているだけ。かっこいいアルゴリズムとかは現状ない。

Google Reader上に「トレンド」というやつがあってスター率が高いフィードなんかは見れるのだけどその逆は見れない。

ちなみに今やTwitterやFacebookでおなじみOAuthは実装されていないので昔ながらのID/Passwordを入力する方法しかなく、OAuthに慣れた人間からしたら怪しいことこの上ない。もし自分だったらあんまり入力したくない、、、がGoogleが実装していない以上しょうがない。
もちろん悪用する気はないし保存もしてないしセッションにすら入れてない(それはただやらんかっただけだけど)けどそこは信用してもらうしか術がない気がする。市井のサービスはそこってすごい壁だな。それかもしかしたらまだ案外気にせず入力してしまう人も多いのか。

使うとこんな感じ。
僕の場合Newsweekを読んでるけど全然ふぁぼってないから、賢い気分になる自己満足はやめて購読解除しちゃえば?ってことになる。キャプチャだとスターが0ばっかりだけどそれは見えてないだけでもうちょっと下に行くとほんとはある。

Google Never Reader

ちなみに削除ボタンを押すと購読解除して見た目上も削除するけど、データソースとして使っている既読アイテムの履歴からは削除されないからリロードするとまた舞い戻ってしまう仕様。一週間に一度とか都度いらなそうなフィードを削除して最適化していくといいかもしれない。
仕様はそのうちなんとかするかもしれない。

アプリはこちら。Neverの使い方が微妙に間違ってないか、とかは知らない。
Google Never Reader

Categories : Development
Comments : 0

iOS URL Scheme Tips

iOSとAndroidで、メールに書いたURLから特定のアプリの特定のページを開きたい。
Facebookに関して必要があって調べた。Facebookページのイベント一覧を開きたかった。
それに関しては、結論としては無理だったんだけど。そもそもスマホ版のFacebookアプリ(ブラウザ版にもだけど)のFacebookページにイベント一覧がなかった。
以下メモ。

iPhoneAppのURLスキーム – 俺wiki – livedoor Wiki(ウィキ)
http://wiki.livedoor.jp/h_yoshiaki/d/iPhoneApp%A4%CEURL%A5%B9%A5%AD%A1%BC%A5%E0
色々なアプリのURLスキーム一覧、詳細には書いてない

Facebook Pages Can Now Be Opened in Facebook’s iOS Apps Via fb://page URL Scheme Links
http://www.insidefacebook.com/2011/10/21/facebook-url-scheme-pages/

FacebookのiPhoneアプリケーションで使えるURL Schemeのまとめ – ふぃすたぶろぐ
http://d.hatena.ne.jp/penpen-0704/20110711/1310375357
日本語での概要

iPhone/AndroidでURLスキームを利用したアプリ起動[to-R]
http://blog.webcreativepark.net/2011/03/09-041450.html
“Androidにはインテントというすばらしい機能があるのですが、ブラウザからの操作はできなさそうです。”とある。
Androidでは同様のことは無理なのか、、、。

手持ちアプリのURLスキームを調べる方法 iExplorer – W&R : Jazzと読書の日々
http://d.hatena.ne.jp/wineroses/20111112
iExplorerで.plistを読む。

IPhone URL Schemes – akosma wiki
http://wiki.akosma.com/IPhone_URL_Schemes
詳しく載ってる。
はずだったんだけど、今開くと「This Account Has Been Suspended」てなってて見れない。コピペしておいてよかった。謎である。

Facebookに関してはこれだけあるらしい

fb://profile – Open Facebook app to the user’s profile
fb://friends – Open Facebook app to the friends list
fb://notifications – Open Facebook app to the notifications list (NOTE: there appears to be a bug with this URL. The Notifications page opens. However, it’s not possible to navigate to anywhere else in the Facebook app)
fb://feed – Open Facebook app to the News Feed
fb://events – Open Facebook app to the Events page
fb://requests – Open Facebook app to the Requests list
fb://notes- Open Facebook app to the Notes page
fb://albums – – Open Facebook app to Photo Albums list
This “works” but, then again, doesn’t:
fb://post/(post_id)
fb://album/%@
fb://album/(aid)
fb://album/(aid)/cover
fb://album/(initWithAID:)
fb://album/(initWithAID:)/cover
fb://album/new
fb://albums
fb://birthdays
fb://birthdays/(initWithMonth:)/(year:)
fb://birthdays/(month)/(year)
fb://chat/(fbid)
fb://chat/(initWithUID:)
fb://chat/(user.fbid)
fb://contactimporter
fb://contactimporter/invites
fb://contactimporter/legalese
fb://contactimporter/modal
fb://event/%@
fb://event/%llu
fb://event/(event.fbid)/members/(rsvpStatus)
fb://event/(fbid)
fb://event/(fbid)/members/attending
fb://event/(fbid)/members/declined
fb://event/(fbid)/members/not_replied
fb://event/(fbid)/members/unsure
fb://event/(fbid)/rsvp
fb://event/(initWithEventId:)
fb://event/(initWithEventId:)/members/(rsvpStatus:)
fb://event/(initWithEventId:)/rsvp
fb://events
fb://events/
fb://faceweb/(initWithURL:)
fb://facewebmodal/(initWithURL:)
fb://feed
fb://feed/%@
fb://feed/(filter.filterKey)
fb://feed/(initWithFilterKey:)
fb://feedfilters
fb://findfriends
fb://findfriends/legalese
fb://findfriends/modal
fb://friends
fb://friends/picker
fb://friends/sync
fb://friends/sync/(removeData:)
fb://friends/sync/disconnect
fb://friends/sync/legalese
fb://group/(fbid)/members
fb://group/(initWithGroupId:)/members
fb://groups
fb://launcher
fb://mailbox
fb://mailbox/(folder)
fb://mailbox/(initWithFolder:)
fb://mailbox/(initWithFolder:)/(tid:)
fb://mailbox/(mailbox.folder)/(tid)
fb://mailbox/compose
fb://mailbox/compose/(fbid)
fb://mailbox/compose/(initWithUID:)
fb://map
fb://messaging
fb://messaging/(folder)
fb://messaging/(initWithFolder:)
fb://messaging/(initWithFolder:)/(tid:)/participants
fb://messaging/(initWithFolder:)/thread?tid=(tid:)
fb://messaging/(mailbox.folder)/(urlEscapedTid)/participants
fb://messaging/(mailbox.folder)/thread?tid=(urlEscapedTid)
fb://messaging/compose
fb://messaging/compose/(fbid)
fb://messaging/compose/(initWithUID:)
fb://messaging/original_message?mid=(commentId)
fb://messaging/original_message?mid=(initWithMessageId:)
fb://nearby
fb://note/%@
fb://note/(initWithNoteId:)
fb://note/(initWithNoteId:)/edit
fb://note/(noteId)
fb://note/(noteId)/edit
fb://note/compose
fb://notes
fb://notifications
fb://online
fb://online#offline
fb://online#online
fb://pages
fb://photo/%@/0/%@
fb://photo/(album.user.fbid)/(album.aid)/(pid)
fb://photo/(album.user.fbid)/(album.aid)/(pid)/feedback
fb://photo/(fbid)/profilepic
fb://photo/(initWithProfilePicturesUID:)/profilepic
fb://photo/(initWithUID:)/(aid:)/(pid:)
fb://photo/(initWithUID:)/(aid:)/(pid:)/feedback
fb://photosapp
fb://place/%@
fb://place/(initWithPageId:)
fb://place/(targetId)
fb://place/addfriends
fb://place/addphoto
fb://place/create
fb://places
fb://places/%lld/%lld
fb://places/(initWithCheckinAtPlace:)/(byUser:)
fb://places/legalese/tagged/%lld/%lld
fb://places/legalese/tagged/(initWithTaggedAtPlace:)/(byUser:)
fb://post/%@
fb://post/%@_%@
fb://post/(initWithPostId:)
fb://post/(initWithPostId:)/tagged
fb://post/(postId)
fb://post/(postId)/tagged
fb://post/(postId)/untagSelf
fb://post/(untagSelfFromPostWithId:)/untagSelf
fb://profile
fb://profile/
fb://profile/%@
fb://profile/%lld
fb://profile/(addFan:)/addfan
fb://profile/(fbid)
fb://profile/(fbid)/addfan
fb://profile/(fbid)/addfriend
fb://profile/(fbid)/fanpages
fb://profile/(fbid)/fans
fb://profile/(fbid)/favorite
fb://profile/(fbid)/friends
fb://profile/(fbid)/info
fb://profile/(fbid)/menu
fb://profile/(fbid)/mutualfriends
fb://profile/(fbid)/photos
fb://profile/(fbid)/poke
fb://profile/(fbid)/removefriend
fb://profile/(fbid)/wall
fb://profile/(initWithFBID:)/menu
fb://profile/(initWithFansUID:)/fans
fb://profile/(initWithFriendsUID:)/friends
fb://profile/(initWithInfoUID:)/info
fb://profile/(initWithMutualFriendsUID:)/mutualfriends
fb://profile/(initWithPhotosUID:)/photos
fb://profile/(initWithUID:)
fb://profile/(initWithUID:)/addfriend
fb://profile/(initWithUID:)/fanpages
fb://profile/(initWithUID:)/poke
fb://profile/(initWithUID:)/removefriend
fb://profile/(initWithWallUID:)/wall
fb://profile/(toggleFavorite:)/favorite
fb://profile/(user.fbid)/fans
fb://profile/(user.fbid)/friends
fb://profile/(user.fbid)/mutualfriends
fb://profile/0
fb://publish
fb://publish/mailbox/(initWithFolder:)/(tid:)
fb://publish/mailbox/(mailbox.folder)/(tid)
fb://publish/photo/(album.user.fbid)/(album.aid)/(pid)
fb://publish/photo/(initWithUID:)/(aid:)/(pid:)
fb://publish/post/(initWithPostId:)
fb://publish/post/(postId)
fb://publish/profile/(fbid)
fb://publish/profile/(initWithUID:)
fb://publish/profile/(owner.fbid)
fb://requests
fb://root
fb://upload
fb://upload/%@/album/%lld/%@
fb://upload/%@/checkin/%lld
fb://upload/%@/profile/%lld
fb://upload/(initWithSource:)/album/(uid:)/(aid:)
fb://upload/(initWithSource:)/checkin/(checkinId:)
fb://upload/(initWithSource:)/profile/(uid:)
fb://upload/actions
fb://upload/actions/album/(initWithUID:)/(aid:)
fb://upload/actions/album/(user.fbid)/(aid)
fb://upload/actions/checkin/(checkinId)/
fb://upload/actions/checkin/(initWithCheckinId:)
fb://upload/actions/newalbum
fb://upload/actions/profile/(fbid)
fb://upload/actions/profile/(initWithUID:)
fb://upload/actions/resume
fb://upload/album/(showUploadMenuWithUID:)/(aid:)
fb://upload/album/(user.fbid)/(aid)
fb://upload/checkin/(checkinId)
fb://upload/checkin/(showUploadMenuWithCheckinID:)
fb://upload/discard
fb://upload/profile/(fbid)
fb://upload/profile/(owner.fbid)
fb://upload/profile/(showUploadMenuWithUID:)
fb://upload/resume
fb://userset
fb://video/%@
fb://video/(playVideoWithId:)
fb://video/(videoId)
fb://page/(fbid) will work to open to a specific page.
and fb://place/(fbid) will take you to a location page

pageに関してはfb://page/(fbid)のfbidは固有URLじゃだめで、数字のほうのちゃんとしたfbidじゃないとだめだった。

Categories : Development
Comments : 0

音声合成・認識・入力Tips

音声関係のメモ。合成・出力・認識・入力とか。

入力

x-webkit-speech

音声入力ができる、HTML5の「x-webkit-speech」を試してみた | IDEA*IDEA
http://www.ideaxidea.com/archives/2011/03/x-webkit-speech.html

発音チェッカー
http://termat.sakura.ne.jp/javascript/20110327sample.html

音声入力APIを試してみた – おし、プログラミング
http://d.hatena.ne.jp/ichhi/20110428/1303986170

ファン猛のブログ – Chrome限定で多言語音声認識入力フォームを作ってみた。
http://fantakeshi.blog50.fc2.com/blog-entry-40.html
input要素にlang=”ja”を指定するとよい

Chromeはgoogleのサーバーに投げて認識するから精度いいんだけど、
逆に単語として解釈しようとして頑張ってしまって、叫びとか無意味な言葉をそのまま取りたい場合には向いてない。

Julius

Julius で音声認識させてみた – 凹みTips
http://d.hatena.ne.jp/hecomi/20120111/1326296629

C# で日本語合成音声・音声認識をやってみよう。 – お前の血は何色だ!! 4
http://d.hatena.ne.jp/rti7743/20111215/1323965483

CではJuliusってのがデファクトのよう
win版とlinux版ある

出力

Web音声配信システム:vds
http://www.vdsapi.ne.jp/
Web API。使いやすくてデモは簡単に作れる。だけど無料アカウントの登録は終了しちゃった。
個人的には昔とったアカウントがあるからデモはそれで作れる。

KATAKOTO – wonderfl build flash online
http://wonderfl.net/c/tfRL
自分で作ったやつだけど、google translateを利用してしゃべらせる。
音声認識には文字を分解するフェーズとしゃべらせるフェーズがあって、
分解にはYahoo形態素解析APIを使ってる。

AquesTalk – テキスト音声合成ミドルウェア
http://www.a-quest.com/products/aquestalk.html
日本語音声出力界ではデファクトな感じ。
個人が趣味で使うなら無料、でもライセンス取得の手続きは必要。
法人なら商用非商用問わず有料。諸々相談可。
AquesTalk2なら声が数種類から選べる。
Win,Mac,Linux,iOS,Android等OS大体対応してる。

Categories : Development
Comments : 0

console.logのブラウザ別動作検証

Chromeで確認しながらJS開発してたらconsole.logの出力ではまったので検証とメモ。

目的

console.logを実装している各ブラウザにおける、console.logの動作の違いを検証・理解する。

方法

以下は検証した方法。

環境

検証ブラウザは
Chrome 16.0.912.75
Firefox 9.0.1
Safari 5.1.2
である。

コード

検証コード。

console.log('#test1 start ----------');
var arr=[];
for(var i=0; i<3; i++){
	console.log('i = '+i.toString());
	arr.push(i);
	console.log('arr = '+arr.toString());
	console.log(arr);
}

console.log('#test2 start ----------');
var arr2=[];
for(var j=0; j<3; j++){
	alert('');
	console.log('j = '+j.toString());
	arr2.push(j);
	console.log('arr2 = '+arr2.toString());
	console.log(arr2);
}

仮説

このコンソール出力は感覚的にはこうなりそう。

#test1 start ----------
i = 0
arr = 0
[0]
i = 1
arr = 0,1
[0, 1]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0]
j = 1
arr2 = 0,1
[0, 1]
j = 2
arr2 = 0,1,2
[0, 1, 2]

でもならない。

結果

以下ブラウザの結果。

Firefox

#test1 start ----------
i = 0
arr = 0
[0]
i = 1
arr = 0,1
[0, 1]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0]
j = 1
arr2 = 0,1
[0, 1]
j = 2
arr2 = 0,1,2
[0, 1, 2]

Safari

#test1 start ----------
i = 0
arr = 0
[0, 1, 2]
i = 1
arr = 0,1
[0, 1, 2]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0, 1, 2]
j = 1
arr2 = 0,1
[0, 1, 2]
j = 2
arr2 = 0,1,2
[0, 1, 2]

Chrome

#test1 start ----------
i = 0
arr = 0
[0, 1, 2]
i = 1
arr = 0,1
[0, 1, 2]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0]
j = 1
arr2 = 0,1
[0, 1]
j = 2
arr2 = 0,1,2
[0, 1, 2]

なんということでしょう。結果が全部違う。

ポイントをあげると

Firefox

・Firefoxの結果は一番感覚的にしっくりくる。
・ただしObjectを文字列として出力してるから中身は辿れない

Safari

・Objectの出力が、あとから更新されている
・そのためfor文で出力したArrayの内容が、全ての箇所で最後の状態になっている
・Objectの中身のObjectの中身も見れる
・でもやっぱり違和感がある
・バグだ!といいたいが仕様なのかもしれない(フォーラム漁ってない)

Chrome

・Objectの出力が、あとから更新されている
・そのためfor文で出力したArrayの内容が、全ての箇所で最後の状態になっている
・Objectの中身のObjectの中身も見れる
・というところまではSafariと一緒である
・ただ、console.logの合間にalertを挟むとFirefoxっぽく 結果が変わる

考察

参照を出力した場合の話は、Chromeに関してはChromiumのフォーラムを見ると
Javascript console.log does not log object instantly
にこの報告があがっていて、2011/8/1のものなんでしばらくこの状態だったみたい。全然気づかなかった。
また書き込みによるとどうやらバージョン13以降この仕様らしい。

確かに中身が見れる仕様だと、console.logのたびにディープコピーしまくらないといけないから難しいのかな?
そういう意味では、参照の出力が後から書き変わってしまうのは感覚的には違和感があるが仕様かもしれないし、あとSafariもそうなのでしかたないのかもしれない。

だが、上記仕様をやむをえないとするとしても、Chromeだけがalert挟むと結果が変わるのは、バグだろうと言いたい。

感想

フォーラムにあるように、自分でtoString()すればいいし、ブラウザごとのこの違いをあらかじめ知っていれば問題はそんなにないと思うが、僕は今まで知らなかったので何時間か悩みました。
あー。

と、ふと卒論を思い出して仮説検証型論文ぽく(見出しだけだけどw)した。

Categories : Development
Comments : 0

FacebookのWallに固定の画像をポストする

Facebookのウォールにあらかじめ決まった、サーバー上に置いてある画像をポストするコード。
なにげに作るににちょっと手間取ったのでメモ。
(ググっても、フォームからユーザーが画像をアップするのばっかり出てきた)
できてしまうと一切なんということもないのだけれど・・・。

//Facebook PHP SDK
require_once 'facebook/facebook.php';

$appId='Your App Id';
$appSecret='Your App Secret';

$fb = new Facebook(array(
	'appId'  => $appId,
	'secret' => $appSecret
));

$user=$fb->getUser();

//OAuthは必要
if(!$user){
	$loginUrl=$fb->getLoginUrl(array(scope => 'publish_stream'));
	header('Location: '.$loginUrl);
}

$image='http://example.com/example.png';

$res=$fb->api(
	'/me/feed',
	'post',
	array(
		'message'=>'This is test message.',
		'picture'=>$image
	)
);

var_dump($res);

/me/feedの、message,picture以外のパラメータについては下記参照。
http://developers.facebook.com/docs/reference/api/user/#posts

Categories : Development
Comments : 0
Olders 
Copyright © kouseiikeda All Rights Reserved. Powered by WordPress 3.2.1.