[memo]twitter上での継続目標管理ツールを作りたい

こういうtwitterアプリを作りたいと思った。
### 継続目標管理ツール
* 毎日5kmジョギングする
* 1週間に1冊本を読む
* 3日に1回ジムに行く
などの継続目標を支援するアプリ。「体重を○kg落とす」などの最終目標は知らない。最終目標に向かって各自が設定する日々のマイルストーンを支援する。
### 使い方
* twitterアプリのポータルサイトより利用登録をする。アプリと利用者のtwitterアカウントが連動する
* 目標とその内容・間隔(24時間・168時間(1週間))・継続期間を登録する
* 例:腕立て伏せを毎日30回・二の腕の筋肉をつけるため、腕立て伏せをがんばる!・24時間・30日
* twitterアプリのアカウント宛てに@を飛ばし『「目標」を実行した』と投稿する。
* 例:@mokuhyoapli 「腕立て伏せを毎日30回」を実行した
* 仮に指定間隔内に投稿がなかった場合、**ユーザーのTLに目標を達成できなかった旨を投稿する**
* 例:@user は「腕立て伏せを毎日30回」を実行しませんでした。
* 目標を実行しなかった意志の弱いカス野郎とか書くようなオプションを用意してもいいかもしれない。
* 継続期間に休みなく目標を達成した場合、@mokuhyoapiiアカウント上で表彰する
* 例:. @userは「腕立て伏せを毎日30回」を24時間間隔で30日間実行した神!
* アプリのポータルサイトに過去に達成された目標一覧ページとかつくってもいいかもしれない。
#### その他案(追記予定)
* 継続期間があまりに短いと意味がないので、7日以上しばりにするといいかもしれない
* けどここらへんはユーザーが考える事だからまぁいいか。
* 1人あたりの目標数の制限を導入する?
* 少数の目標に全力投球して欲しい、という意味で
* まぁこれも最初は制限しなくていいかもしれない
### Q&A
* 別に嘘つけますよね?
* 嘘をつけますが、毎日意識させるだけで全然違うし、目標を達成した!と毎日嘘をつく自分に空しくなってくるはずです。
* 途中で目標達成が困難になった場合はどうするのですか?
* 継続目標とは「がんばれば達成できるレベル」のものを設定するべきなので、達成困難になったのもユーザーの責任です。
* よって目標を断念するときは1200字(原稿用紙3枚分)の反省文を提出し、その上で目標断念ボタンを押せるようにします。
* 反省文はポータルサイトに公開されます。
* 冠婚葬祭など公にし辛い理由の場合は?
* それ用に緊急停止ボタンをつくります。ただし緊急停止ボタンを使いすぎると強制的に登録解除され、一定期間経たないと再登録できないようにします。おばあちゃんの急病が何回も使えないのと同じです。
### 登録解除周りの話
* OAuth周りの事とか調べてないけど、目標実行中にいきなり登録解除はできないようにしたい。
* 登録解除するには今実行中の目標を達成・断念・緊急停止してから登録解除できるようにしたい
* 最悪、「不正なルートで登録を解除しました」とか投稿できるように。
* まぁここらへんはそういうユーザーが増え始めてから考えればいい話か。
### まとめ
何事も継続しないと意味がない。諸行無常なtwitterでは「このpostがRTされただけ腹筋する」などというものがあるが、本来なら毎日継続して・集中して腹筋するのが一番効果的。継続を支援するアプリ。

twitterに投稿されたゲレンデ写真を纏めたサイト+その他の技術情報

twitterに投稿された(略 をどうやって作成したかという技術メモ。
### 作成手順
以下の3ステップで作成しています。
1. twitterAPIを利用して#snowJPの検索結果を収集する。
2. 収集した検索結果を加工してRSS化する。
3. 指定したRSSを自動投稿するプラグインをwordpressに導入し、2で加工したRSSを登録する。
1、2で使ってるプログラムは最後に紹介するとして。3はFeedWordPressというプラグインを利用します。
[FeedWordPressでマルチブログする – [Mi]みたいなもの](http://d.hatena.ne.jp/mitaina/20090711/1247273446)
これでRSSさえ作ってしまえば、最後のアウトプット先をWordPressにすることができます。普通こういうWebサービスは自分で”ガワ”をデザインするのですが
* 自分のデザイン能力の低さ
* wordpressの使いやすさ
* 携帯やiPhone対応への手間(wordpressには携帯・iPhoneビュー用のプラグインもある)
など考えると、wordpressを使うのがベストかな、と判断しました。
ということで、後はRSSを作るだけ!スクレイピングもRSS作成も得意だからすぐだよね!…とはいかず。
### 苦労した点
#### 1. twitterAPIのパース
twitterではスクレイピングを規約で明示的に禁止しているので、APIを使って情報を取得します。提供形式はjson、atomの2種類で慣れているatomを選んでrubyのrssライブラリでパースしよー♪…と思いきや、なぜか対応できないと跳ねられる。しかたないのでREXMLを使ってXML文章としてパースしたんだけど、**REXMLの使い方をすっかり忘れていて**パースするだけなのにめちゃ苦労しました。
#### 2. RSS1.0と2.0の仕様の違い
1.で情報は取得できたので、それをRSSに流し込むだけ。…流し込むまでは良かったのですが**RSS1.0では画像の展開ができない**という制限を知らなかったので、RSS1.0で作ってしまい画像が表示されませんでしたとさ
#### 3. FeedWordPressとrubyのrss/makerの仕様制限
RSS2.0で作成してFeedWordPressに読み込ませた!…のだけど、今度は改行が反映されないorz 調べたところ、どうやらFeedWordPressがRSS2.0を読み込む場合、
1. 「content:encoded」があれば本文として使う。
2. 「content:encoded」がなければ「description」として使う。ただし改行は反映されない。
仕様らしく、僕が作成したRSS2.0は「description」しか作ってなかったので改行コードが反映されなかったと。んじゃ「content:encoded」を作ればいいじゃん、というところですが、rss/makerライブラリの仕様でRSS2.0作成時には「content:encoded」を利用できない!
仕方ないのでRSS2.0を作成し文字列として読み込んだ後、「description」の下に1行挿入し「content:encoded」とする超泥臭い作り方で乗り切りました。うーん、RSSライブラリは完璧じゃないよなぁ…。
### ということでコード公開
“twitterに投稿されたゲレンデ写真を纏めたサイト+その他の技術情報” の続きを読む

twitterに投稿されたゲレンデ写真をまとめたサイト+その他を作りました。

タイトル通り、twitterに投稿されたゲレンデ写真を纏めるサイトを作りました。
[twitterゲレンデ写真まとめサイト(仮)](http://exco.sakura.ne.jp/twit_snow/)
※今は1つも写真投稿がないので、後述する「スノーボード関係の言葉が含まれた発言を検索しRSS」も合わせて投稿するようにしています。
#### どんなサイト?
以下の条件に引っかかる投稿を抽出し、画像サイトへのURLを変換し画像を直接表示します。
1. ハッシュタグ「[#snowJP](http://twitter.com/#search?q=%23snowJP)」を含む
2. 投稿内に「携帯百景」「はてなフォトライフ」「twitpic」のURLを含む
wordpress使ってるので携帯・iPhoneからも見れます。ハッシュタグ「#snowJP」を使ってどんどん雪山写真を投稿しよー!
#### サイトを作成した経緯
> 妄想開始。雪山好きのtwitterユーザーのためのポータルサイトがあればいいと思った。内容は雪山関係のpostをしているtwitterユーザー一覧(近々リリースされるtwitterのlist機能を使用)、ハッシュタグを利用したリアルタイム積雪&渋滞情報。[12:22 AM Oct 2nd](http://twitter.com/teraco/status/4526918331) Tweenで
>
> というか#09-10snowみたいなハッシュタグを流行らせたい。毎週土日に各地のゲレンデ写真が集まるだけで相当価値が出てくると思う。雪山ユーザーってゲレンデを略称で書いちゃっうから検索しにくい。それにmixiやら個人ブログやら情報が分散しすぎている。 [12:26 AM Oct 2nd](http://twitter.com/teraco/status/4527001669 “12:26 AM Oct 2nd”) Tweenで
>
> これをハッシュタグ一つで纏められる。ハッシュタグで纏められたポータルサイトが知名度を持ち始めれば、非twitterユーザーも注目する→雪山好きのtwitterユーザーが増える→俺のTLが充実するという一石三鳥。妄想終了。[12:26 AM Oct 2nd](http://twitter.com/teraco/status/4527003115) Tweenで
毎週土日に最新の雪山写真がずらっと並んでるって最高じゃね!?
#### 今後のロードマップなど
1. #snowJPまとめサイトを立ち上げる ←今ここ
2. 初期メンバーが#snowJPをつけてゲレンデ写真を投稿する
3. twitterユーザーで雪山好きの人に#snowJPの存在を宣伝する
4. 徐々に#snowJPへのゲレンデ写真への投稿が増える
5. 毎週土日の朝は[buzztter](http://buzztter.com/ja)で#snowJPがバズる
6. 「twittetってなんか雪山情報充実してるらしぜー」とmixiから人が流れてくる。
7. ますます#snowJPへのゲレンデ写真の投稿が増える
8. ゲレンデの中の人も#snowJPの影響力を無視できなくなり、twitterアカウントを作成して#snowJP宛に最新のゲレンデ写真を毎日投稿する
9. なんかすごい事になる
buzztterはともかく8が実現できたら最高ですよね。1つのサイト(ハッシュタグ)をチェックするだけで、例えば白馬エリア全ゲレンデのゲレンデ写真が確認できる。便利で楽しい!


### これだけではしょぼいので。
ロードマップとか書いてみたけど、今は#snowJPの使用者が少ないので写真も少なくお寒い感じ。なので#snowJPが盛り上がるよういろいろ作ってみました。
#### 1.#snowJPの全投稿をRSS配信
[http://prius.cc/twit_snow_rss/snowJP.rss](http://prius.cc/twit_snow_rss/snowJP.rss)
普通に[#snowJP](http://twitter.com/#search?q=%23snowJP)でチェックすりゃいいじゃん、という話ですが、僕がRSSリーダー好きなので作ってみました。これはただのついで。重要なのは次から。
#### 2.スノーボード関係の言葉が含まれた発言を検索しRSS配信(以下、雪山RSS)
[http://prius.cc/twit_snow_rss/snowJP_All.rss](http://prius.cc/twit_snow_rss/snowJP_All.rss)
twitterの全投稿の中からボード関係の言葉が含まれるものを検索し1日1回RSS配信します。今は「スノーボード、イエティ、かぐら」が含まれる投稿を検索し、配信します。
#### 3.スノーボード関係の言葉が含まれた発言を検索しRSS配信(新規雪山好きユーザー発見専用)
これは作成予定。
雪山RSSから既に#snowJPの存在を知ってるっぽいユーザーの発言を省いたRSSです。例えば@teracoや@winter_fanはNGユーザーリストに入っておりこのRSSには表示されません。NGユーザーリストは最初手動更新でtwitterのlist機能が正式リリースされたら雪山ユーザーのlistを作成→含まれてないユーザーの発言のみ表示して精度を上げようと思います。
2と3の雪山RSSはロードマップの3番**「twitterユーザーで雪山好きの人に#snowJPの存在を宣伝する」ために作りました。**今考えてるのは、
1. この新規ユーザー発見専用RSSを購読する
2. 新規ユーザーを発見したら@teraco_snowからハッシュタグ「#snowJP」の案内postを送る。
3. 一度案内を送ったユーザーは3のリストから外す
という方法で、漏れなく重複なく#snowJPの普及活動を進めていく予定です。…となると、3を読むのは僕だけでいいのかなー。複数のユーザーから案内行ってもウザいだけだし…。
が、スキー・ボードの事について言及したユーザー全員に案内を送るべきかどうか?となると微妙。僕の本音としては**#snowJPが有名になるとか投稿が増えるとかはどうでもよくて、#snowJPへの写真の投稿が増えてほしいだけなので、**写真を投稿した人へは100%案内を送るけど、ただスキー・ボードの事について言及してるだけの人に案内送ってもなーと。当面は**写真付きの投稿した人は案内送る・それ以外の人には送らない**ことにします。それ以外の人にも#snowJP案内送るなら、重複しないように#snowJP使ってる人と相談かなぁ。
とりあえず2のRSSは登録してみててください。読んでるだけでも楽しいと思うので。
#### Q&A
Q.twitterゲレンデ写真まとめサイトのデザインがしょぼいのですが?
A.すいません。やっつけで作ったのでそのうち改善予定です。wordpressのデザインなら俺/私に任せろ!という方は@teracoまでご連絡ください。
Q.雪山写真の地域別に表示を分けた方がいいのではないか?
A.今後投稿が多くなり、目的の地域を見つけにくくなれば考えます。
Q.#snowJPと別のハッシュタグを使ったほうがいいのではないか?(例:#snowJPPhotoなど)
A.当初そう考えましたが、携帯端末からの入力のしやすさ、#snowJPの認知度を高めるという意味で#snowJPに相乗りさせてもらおうと思います。複数のハッシュタグに分散するより1つに統一した方が信頼度が高まると思うので。今後投稿が増えて問題が発生したら or #snowJPが十分に周知されたらハッシュタグの分離も考えます。
Q.雪山RSSに、雪山と関係のない発言が含まれるのですが?
A.例えば「カムイ」で検索した場合、映画の「カムイ外伝」に関する発言も引っかかってしまいます。こういう場合は、以下のどちらかの対応を取ります。
1. 検索ワードの精度を高める:例 「カムイ御坂」「カムイ竜ヶ崎」を使う
2. 関係のないユーザーを非対象ユーザーとして今後発言を収集しない。
なるべく1の対応を取りたいと思ってます。
Q.雪山RSSに検索ワードを追加・削除してほしい
A.[@teraco](http://twitter.com/teraco)までご連絡ください。
その他、何かあれば[@teraco](http://twitter.com/teraco)までお気軽に。
最後に。何かと関東圏のユーザーが優遇されるtwitter界ですが、**#snowJPでは日本全国の雪山ユーザーの投稿が集まるといいなーと思ってます!**
技術情報に興味のある方は[こちら。](http://prius.cc/d/20091018_twitsnow2.html)

GJ!の新着拍手を表示するRSSを作成する。

先日導入したWeb拍手”GJ!”し、結構気に入って使ってるのですが欠点が一つ。**拍手されたかどうかはGJ!の管理者ページを見に行かないと分からない。**ということで、GJ!の新着拍手があればRSSを更新するスクリプトを作成してみました。PHPできないのでrubyで作成。
[WordPressにWeb拍手”GJ!”を導入してみた。](http://prius.cc/d/20090510_wp_gj.html “WordPressにWeb拍手”GJ!”を導入してみた。”)
[ruby]
require ‘rubygems’
require ‘hpricot’
require ‘open-uri’
require ‘kconv’
# 出力するRSSファイル名決定
fname = "gj_new.rss"
f = File.open(fname, "w")
# GJ!の管理者ページ設定
url = ‘http://prius.cc/gj/gj.php?mode=show&[GJ!で設定したパスワード]&new’
#
elemarr = Array.new
doc = Hpricot(open(url))
(doc/%Q[//tr]).each do |elem|
elemarr << elem
end
#
arr1 = Array.new
arr2 = Array.new
2.upto(21) do |i|
(elemarr[i]/%Q[//td]).each do |elem|
arr2 << elem.inner_text
end
arr1 << arr2
arr2 = Array.new
end
arr1.transpose
# RSS作成
# 「rss/maker」ライブラリを利用します
require ‘rss/maker’
# RSSのバージョンを指定してRSSオブジェクトを生成します
rss = RSS::Maker.make("1.0") do |maker|
#適用するスタイルシートを指定します
xss = maker.xml_stylesheets.new_xml_stylesheet
xss.href = "./rdf.xsl"
# 記事を配信しているページに関する情報を設定します
maker.channel.about = "http://prius.cc/"
maker.channel.title = "GJ_RSS"
maker.channel.description = "GJ_RSS"
maker.channel.link = "http://prius.cc/"
# RSSのitemを更新日が新しい順番にソートする機能を有効にする
maker.items.do_sort = true
# 以下では記事に関する情報を指定します
arr1.each do |elem|
item = maker.items.new_item
item.title = elem[3]
item.link = "http://prius.cc/gj/"
item.dc_subject = elem[3]
item.description = elem[2] + "からのコメント:" +elem[1]
item.date = Time.parse(elem[0])
end
end
# RSSを出力します
f.puts rss
[/ruby]
作成時間は40分です。。。
参考:[Kazuhiro’s Weblog: RubyでRSSを自作してみよう](http://kazuhiro.ty.land.to/blog/2007/01/rubyrss.html)
で、これを運用するにはcronの動かせるサーバを立てなければいけない。やっぱ拍手をトリガーにしてサーバサイドでRSS作る仕組みの方が(構成的に)簡単だなぁ。GJ!の次バージョンで導入されればいいなぁ…。

OpenSocial周りのWebの盛り上がりについて。

[前エントリ](http://prius.cc/d/20090627_opensocial-host.html)で
> 正直、参加者の大半が課題作れなかったのは意外だった。…と他人事のように書いて俺も出来なかったわけだがw、おそらく主催者のwillnetさんはこれくらい簡単にできると思ってたんじゃないかな?
と書いたわけだけど、これはマジで意外だった。
実は俺が思ってるより課題([こちら](http://d.hatena.ne.jp/willnet/20090626)を参照)が難しかったのかもしれないけど、やる事と言えば
1. Todoリストの完了ボタンにユニークなid属性を付与する
2. 完了ボタンを押すとid情報をJavaScript APIに渡し、Todo情報を削除するようにする
くらいだから、やはりこれくらいは簡単にできる想定だったんだろう。つまり**昨日の参加者はJavaScriptに不慣れだった**と勝手に決め付けて話を進めるが、俺は勉強会=ある程度は出来る人の集まりというイメージを持ってたし参加者もWeb系の人がほとんど(だったと思う)ので、この結果には驚いてしまったのである。という事で考察。
#### 1. 普段JavaScriptを書いてない人が興味を持ってる
まぁ俺ですが、普段Webアプリも作らないくせにmixiアプリに興味を持ってOpenSocial勉強会に参加した人。けどこれは少数派。会場に来てたと思われるWeb系の人はどうなの?となるが、Web系だからと言ってJavaScript書いてるとは限らないのである(学生時代のWeb系会社バイト経験より)。
参加者の中にドリコムの人がいて彼はバリバリmixiアプリ作ってそうだったけど、ドリコムは「なるべくJavaScriptを書かずmixiあぷりを作れるような」フレームワークを構築してるらしい。
実際俺も**「JavaScriptって書くの面倒っぽくてクライアント環境に依存する割に大したことできねーし」**と思って今まで勉強しなかったわけだし、Web系会社に勤めていても「毎日JS書いてます!」という人は少ないのかもしれない。
#### 2. 普段JavaScriptを書いている人が興味を持っていない
ポイントはこっちかな。毎日JS書いてそうなWeb上での有名人がOpenSocialに食いついてない気がする。これも勝手に考えると、
1. 技術的には面白くない
2. ソーシャルってのが気に喰わない
3. 検証環境を作るのが面倒。
のかなぁと。OpenSocialといってもmixiの情報使えるだけで後はJavaScriptで書くだけ。普段からJS使ってる人はあまり目新しいと思わないのかも。もう一つが、mixiアプリ作ってもmixiの中でしか使えないこと。俺は[このエントリ](http://prius.cc/d/20090515_mixiapp.html)で書いたとおり**友達が使ってくれるだけでもいいじゃん**と思うんだけど、Webアプリを作ってURL一発でリーチしてる人なら、mixiだけのためにアプリ作るなんてアホらしいのかもしれない。会員制サイト否定派も多いしねー。
最後はおまけだけど、いちいちファイルアップしてmixiアプリにアクセスするのが面倒という説。普段使ってる環境使えないとストレス溜まります。[OpenSocial Development Environment](http://mixiapp.rash.jp/wp/?p=15)は使えるけど、eclipseインストールするのめんどいという人もいる。
以上3つの理由で食いつきが悪いのかな、と思います。


そう考えると、mixiアプリの作成者属性ってiPhoneアプリ作成者と被るところはあるのかも。面白半分、利益半分。普通のWebアプリに比べて法人割合が高い。
ただ言えることは、現時点で**mixiアプリを自在に作れる人は少数**だということ。勉強会に来るメンバーがこのくらいの習熟度ということは、今のうちにノウハウ積み上げれば正式版スタートしてから手をつける人に差をつけることができるかも…!
### とはいえ
前途多難だなー。プラットフォームが不安定で検証もままならねーし、JavaScriptっていっても昔流行ったステータスバーの表示をちょろっと変えるレベルじゃないからね。実際、[この本](http://www.amazon.co.jp/JavaScript-%E4%B8%AD%E7%B4%9A%E8%AC%9B%E5%BA%A7-~Ajax%E3%82%92%E5%AD%A6%E3%81%B6%E5%89%8D%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E8%97%A4%E6%9C%AC-%E5%A3%B1/dp/4774132349/ref=pd_sim_b_6)を120ページくらいまで読んだけど、mixiアプリのコード例で使われてる書式なんて全然出てきませんからね>< Web2.0時代のJavaScriptにはまだ遠いわー。

OpenSocial Host勉強会に行ってきたよーvv

26日(金)は第1回「[OpenSocial Host勉強会](http://atnd.org/events/819)」でした。
JavaScript初心者の俺ですが、OpenSocialに興味があったので参加してみました。…どのくらい初心者かというと**勉強会に参加決めてから初めてJSの参考書を買ったくらい**です。まぁ締切効果を利用してJS勉強できたので良かったっちゃあ良かった(ぉ
※参考:[OpenSocialというかmixiアプリは実は簡単に作れそうな話。](http://prius.cc/d/20090515_mixiapp.html “OpenSocialというかmixiアプリは実は簡単に作れそうな話。”)
ちなみにOpenSocialというのは今ベータテスト期間中の[mixiアプリ](http://developer.mixi.co.jp/appli)で採用されている技術で、これを学べば自分でmixiアプリを作って友達に使ってもらったり、PV増やして収益上げたりできるかもしれない。まだ知名度は低いけど、将来的にiモードみたいに一般的なものになる…かも?といった段階です。
### OpenSocial Hostとは?
今回はOpenSocial Host(以下OSH)の勉強会でした。OSHは[株式会社ハートレイルズ](http://www.heartrails.com/)さんが提供しているOpenSocailのアプリ開発を支援するサービス。
OpenSocialを作るためにはプログラムファイルを置くサーバが必要。けどレンタルサーバは有料だったりするので**OSHがファイル置き場を無料で提供します**、というのがまず1点(※)。とはいえ、普通のエンジニアはサーバの1つや2つ持ってるのでこれだけではメリットにならない。ポイントは外部サーバのDBに簡単に書き込みできるAPIを提供している事だと思う。
※ 無料プランで1アプリにつき100ファイル、1ファイル10MB、合計500MBまで。
### OpenSocialアプリと外部サーバの関係
仮にOpenSocialアプリ(mixiアプリ)で外部サーバにデータを保存しない場合でも、「永続化データ」という手法を使ってOpenSocial側(mixiのサーバ)にデータを保存することができます。ただこれが
1. データ保存個数が限られる。gooホームの場合、1アプリに付き10個までしか保存できない。
2. 同じアプリを入れてる人同士だと、お互いのデータが丸見え。
3. 永続化データはユーザー毎に独立した領域に保存される。
とめちゃくちゃキツい制約あり。
例えば閲覧者の住んでいる場所を取得して明日の天気を返すだけのアプリならいいけど、日記アプリを作ろうとすると、
1. 11個以上日記が書けない。
2. 秘密の日記が書けない
3. コメントの実装が大変でシステムリソースを食う。
となる。3については「永続化データはユーザー毎に独立した領域に保存される」制約が作用していて、例えばAさんの日記にBさんがコメントをつけたとしても、そのコメントはAさんのデータ領域に保存されない。つまり**Aさんの日記にコメントがついているかどうか調べるために、Aさんのマイミク(で日記アプリ使ってる人)を全員調べないといけない。**日記一覧を表示してコメント数を表示するだけでも、大変なりソースを消費してしまうわけで。
んじゃ外部サーバにデータ保存するしかないよね、って話になるけど、OpenSocailアプリからのデータを受信するプログラムを別途書いたりしないといけないのでJS以外の知識も必要になる。
### そこでOpenSocial Host
OSHならJavaScript API(※)でOSHのサーバにデータを書き込めてしまう。しかもデータに細かい権限設定ができるので秘密の日記なども作成可能。加えてアクセス解析機能も充実していて、例えばユーザーID単位でPV/UU集計できるので**「あいつにアプリ紹介してやったのに全然見てねーわ」**とかも分かっちゃう><
※ API使用回数:5,000,000回/月まで無料
OSHを使ったデモとして[円グラフ日記](http://platform001.mixi.jp/view_appli.pl?id=3045)を見せてもらいました。簡単そうに見えますが、最新の円グラフは永続化データで保存してHOMEビューに表示、円グラフについたコメントはOSHに保存という作りで開発には1週間かかったみたい。ただデータ保存部分をOSHで代用しなければもっと長くかかったんじゃないかな?と思います。
あと(なんでもそうですが)1個作れば使いまわして類似アプリを作れるので苦労するのは最初だけ!早いとこ自分の”フォーム”を確立しないとなーと思いました。
### OpenSocial Hostで何か作ってみよう!
残り時間でOSHを使ったmixiアプリを作ってみよう!ということで、参加者みんなでOSHに登録した後、[id:willnet](http://d.hatena.ne.jp/willnet/)さんの用意した[雛形](http://d.hatena.ne.jp/willnet/20090626)を使ってmixiアプリ登録→ちょこっと改造という流れ。
…だが「ボタンを押したらTodoリストを消す」という最初の課題もできない。いーよいーよ、どうせJS始めたててでDOMとかも分かってねーし(その割には各Todoにidを付与するとこまではできた)とふて腐れてたんだが、1時間経って課題を作れた参加者は2名だけでしたとさ。うーん。ここらへんは次のエントリあたりで補足予定→[補足した。](http://prius.cc/d/20090627_opensocial.html)
### OpenSocial Host 今後の予定
* mixiモバイル対応:7月末~8月頭目標。PCもモバイルも”なるべく”同じソースを使えるように検討中。
* データベース/ログのインポート/エクスポート機能
* JavaScriptAPIの拡充
** 複数コンテナ(mixi⇔goo⇔orkut)/アプリケーション間の連携支援API
** 写真や動画などのマルチメディアファイルの投稿/取得API
* アプリの雛形となるソースの提供


### 感想いろいろ
#### まずはOSHの感想から。
正直外部サーバにデータ保存するところまでmixiアプリ作れてなかったのでOSHに興味なかったけど、永続化データの制約知った+登録簡単ですぐに使い始められるOSHはなかなかいいなぁと思いました。
あとは雛形のソースコードを充実させてほしいかな。。。例えば、普通の人がmixiアプリ作って外部サーバにデータ保存しようとした場合、まず[mixi Developer Center](http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/require_servers “mixi Developer Center (ミクシィ デベロッパーセンター) ≫ 外部サーバを呼び出してみよう”)見たり、実際にソース公開してる人探したりすると思います。
参考:[mixiアプリからの署名付きリクエストの受け側を作る – プログラマー、再起動中](http://d.hatena.ne.jp/naoto5959/20090526/1243348685)
んで、そのやり方で作れちゃうとOSHイラネってなってしまうので、OSHを使ったmixiアプリのソースを解説付きで公開してくれるとありがたいです。**まぁ僕が参考にしたいだけなんですけどね!**
その他。
* アクセス解析はいいなぁと思いました。自分で実装するの面倒だしこれに慣れるとOSHから離れられないとかありそう。有料プランなら時間も取れるとか機能強化もできるし。
* GoogleAppEngineでmixiアプリできるよーvvという記事がいくつか上がってるので、圧倒的なブランド力に押されてtwitterに対するもごもご/wassr的な位置づけにならないか心配です。
#### OpenSocial周りのWebの盛り上がりについて。
これは[次のエントリ](http://prius.cc/d/20090627_opensocial.html)で。
#### 初めての勉強会感想
オフ会の延長線って感じかな。違うのは、仲良くするのが目的じゃなく勉強/情報交換がメインなこと。例えば
* 出欠確認なし
* 参加者同士の自己紹介はなし
* 名札なし
* 名刺交換なし
って感じ。昨日だけでは判断できないけど、技術で会話するエンジニアにとってはオフ会よりやりやすい…かもしれません。けど正直1人参加は勇気がいるね。オフ会と違って普段からネットで仲良くしてる人って訳じゃないし、行ったら行ったで内輪気味な会かもしれない(昨日は違ったけど)。例えば参加者のブログ読んどいて「あの記事面白かったですね!」からきっかけ作ればいいけど、なかなかタイミングがないし(そもそもお互いの名前知らない)。
やっぱり懇親会なのかな?技術レベルが違いすぎる+Web系の人ばっかりっぽかった(私服多かった)ので参加しなかったけど、そういう所で仲良くなれれば次へのきっかけになるかもしれない…と**帰ってから思った。**例えばmixiアプリ作ってる人とブログやtwitterで交流する→勉強会で初顔合わせなら盛り上がったかもしれないなー。
課題出来なかった事も含めてやや不完全燃焼でしたが、mixiアプリと合わせてOSHの情報も追っかけていきたいと思います。

OpenSocialというかmixiアプリは実は簡単に作れそうな話。

mixiアプリというmixi上で自分の作ったWebアプリを動かせる仕組みが始まるようです。これは面白そうだな、と思いました。なぜなら、**mixi上で動作する=マイミクの友人に使ってもらえるので、初期の集客力と開発モチベーションが全然違うからです。**
Web2.0時代では、自作Webアプリをインターネットに公開しても
* 開発者が有名
* 開発会社が有名
* アイディアが素晴らしい
* 開発速度が速い
など、よほどの事がない限り注目されません。僕も以前NEWSING BOOSTERというWebサービス(のようなもの)を作りましたが、1日30アクセスくらいで**はてブも8ブクマ**しかつきませんでした。
その点、mixiアプリは作った瞬間からマイミクの何割かがユーザー登録してくれるわけです。マイミク100人なら20人~30人くらい。フィードバックも必ず貰えるので開発モチベーションも維持できる。人間、自分のためより他人のための方がより努力できる。
また、どこかのコミュニティに特化したアプリを作って、そのコミュニティのメンバーに使ってもらう手もあります。マイミクより使用率は低くフィードバックも少ないでしょうが、10000人のコミュで1%が使ってくれれば100人の初期ユーザーです。
ということでこれは是非開発しようと思って仕様書を読んでみました。
### OpenSocialとか聞きなれない言葉を使わないで下さい><
「mixiアプリはOpenSocialに対応している」これを聞いて「また新しい言語を覚えないといけないのか…」と思いましたがこれは間違いでした。OpenSocialというのはアプリ利用者の
* 友達一覧
* 参加しているコミュニティ一覧
* 住んでいる姓・名・地域などプロフィール
* アイコン
などを、**OpenSocialに対応しているサイトなら同じのコマンドで呼び出せるようにしたもの。**だからmixiで作ったアプリをOpenSocialに対応しているgooホームなどにコピペすればそのまま動きます。ただしmixiミュージックでの再生履歴など、他のSNSになさそうor少なそうな機能はコピペで動きません(※)。
それにしても「友達一覧」とか「コミュニティ一覧」ってのは、mixiでもGREEでもSNSには必ず存在する要素だもんな。それを共通言語化するなんて…よく考えたなぁ。感心します。
※ OpenSocialのバージョンは0.9で基本的な機能しか実装していない。将来的には各SNS独自の機能もOpenSocialに盛り込まれる可能性がある。ちなみに例に挙げただけで、mixiミュージックの再生履歴は取得できません。
### mixiアプリの実体はHTMLとJavaScript
ということで、OpenSocialではプロフィール情報を取得するだけ。その後はJavaScriptで動かします。こう考えると、**mixiアプリ=mixiの情報を取得して使えるJavaScriptアプリ**と同じです。mixiの情報を取得する所はOpenSocailの書式を新たに覚える必要があるけど、[mixi Developer Center](http://developer.mixi.co.jp/appli “mixi Developer Center (ミクシィ デベロッパーセンター) ≫ mixiアプリ”)のGadget XMLとJavaScript APIのページの例をコピペすればよし。
### 具体的な構成
e784a1e9a18c
こんな感じです。mixiアプリ画面で自前サーバのXMLファイル(OpenSocailのGadget XML)を指定します。
e784a1e9a18c2
XMLファイル1つで完結する簡単なアプリでもいいし、画像ファイルやCSS、別出しJavaScriptファイルを使ってもOK。ここらへんは自作Webアプリと同じです。
…という感じで、特に身構えず気軽に作れるものだな、と思いました。
### 参考文献
* [ウェブ開発の次なる主戦場、Open Social](http://www.slideshare.net/FITEA/open-social-1320004 “ウェブ開発の次なる主戦場、Open Social”)
スライドショー形式で長いが、内容は一番分かりやすかった。中でmixiアプリが不安定と書いているが、これは4月18日時点のもので現時点では不安定とは感じなかった。
* [mixi Developer Center (ミクシィ デベロッパーセンター) ≫ mixiアプリ](http://developer.mixi.co.jp/appli “mixi Developer Center (ミクシィ デベロッパーセンター) ≫ mixiアプリ”)
実際の作成にあたっては公式が一番役に立つ。特にGadget XML・JavaScript API・外部サーバの呼び出しの項は必読。
* [タグ「mixiアプリ」を含む新着エントリー – はてなブックマーク](http://b.hatena.ne.jp/t/mixi%E3%82%A2%E3%83%97%E3%83%AA?sort=hot&threshold=3 “タグ「mixiアプリ」を含む新着エントリー – はてなブックマーク”)
最新情報のチェックはこれでOK。
その他まだ読んでないけど有用そうなリンク。
* [フラスコ ≫ はじめてのflashなmixiアプリ](http://flash-scope.com/?p=482 “フラスコ ≫ はじめてのflashなmixiアプリ”)
* [mixi アプリ制作に欠かすことのできない便利な開発環境 OSDE のインストール方法をご紹介 | mixi アプリ 大全集](http://mixiapp.rash.jp/wp/?p=15 “mixi アプリ制作に欠かすことのできない便利な開発環境 OSDE のインストール方法をご紹介 | mixi アプリ 大全集”)
* [はじめての mixi アプリ – IT戦記](http://d.hatena.ne.jp/amachang/20090408/1239206152 “はじめての mixi アプリ – IT戦記”)
* [「mixiアプリを作ってみよう!」連載開始 – V.S.A. III – TYZOH(タイゾウ)](http://www.tyzoh.jp/community/ikarashi/2009/05/11_081414.html “「mixiアプリを作ってみよう!」連載開始 – V.S.A. III – TYZOH(タイゾウ)”)
### ここで問題点が。
俺、JavaScript書けません。

[N★B]フィルタ機能をリリースしました。

NEWSING★BOOSTERnewsingの特定の記事をフィルタした上で新着記事を表示する機能をリリースしました。■残念ながらフィルタされちゃった人たち。…

NEWSING★BOOSTER

newsingの特定の記事をフィルタした上で新着記事を表示する機能をリリースしました。

■残念ながらフィルタされちゃった人たち。

まずは言わずと知れたOhmynews。最近ウザいAskビデオ。そして名誉セルピカーwのfuwarinzさん(※1)は他のセルピクさんとは別扱いとさせて頂きました(けどフィルタ対象w)。セルピクリストは気づき次第追加していきます(※2)。Ohmynewsなんかは善意の人がpickするときもあるので、sunagimoさんの場合だけ除外するのでもいいですかねー。セルコメさんは除外するか迷いましたが、これも自推に近いものがあるなぁ…と思い隔離。

※1 いや…。記事の内容はいいと思うんですが。自推っていのうは俺の中で信頼性が低いんですよ(これについては別の機会に説明したい)
※2 そういや日常刺激ジャーナルの人、アカウント削除されちゃいましたね。

■困っていること

フィルタはフィルタでOKなのですが、当初は

「fuwaさんの記事はフィルタ。けど200pt以上の記事は表示」

みたいな事をやろうと思っていました。で、これは技術的にはできるのですが問題点があります。記事公開から時間が経って200ptを超えても表示されるのは後ろの位置なので結局気づかないのです。対策としては

「200ptを超えた時間を投稿時間とする」

ことで、擬似的に新着に表示させることはできますが、保存されているデータをいじらないといけないし今後の事を考えると付け焼き刃過ぎる対応かなぁと思いまして…。何か抜本的にな対策ないですかね?

■まぁ取りあえず

公言していた機能は全部実装しましたが、まだやりたいことあるので鋭意開発がんばりたいと思います。

…つーか自宅のクライアントPCでデータ取得してるのでたまにデータ取得できてない時があります。てごめんなさい。

■独自ptについての補足

N★Bの独自ランキングに使っている独自ptですが、今のところ

pt = 100pt+newsingのpoint/3+○コメント×30+×コメント×20
pickerが1stコメントの場合-80
n = (60×60×24-投稿時刻から経過した秒数/60×60×24)^2

として

pt×n

で出してます。nで使っている60×60×24というのは1日の秒数です。つまり記事が投稿してから1日経つと必ず人気エントリーから消えます。x軸を時間に取った1-x^2のグラフのイメージですね。

最初は48時間でやってたんですが同じ記事がTOPに残りすぎるので24時間にしました。ただ24時間だとnewsing側でコメントが伸びてるのにN★Bからは消えちゃうとかあるので、もうちょっと長いほうがいいかなぁ。今考えてるのはアクセスの少ない0時~8時は時間を進ませないようにすること。こうすれば24時間+8時間で32時間になるのでバランスがよくなりそうです。

Webの情報が軽量言語で溢れているのは、所属メンバーの優先順位が高いから

F’s Garage:rubyとかPHPとかPerlとか。とかgnarlの日記 – webで事情に詳しくなれるのはweb業界のほんの一部だけ(それでも凄いことなんだけどさ)に関連…

F’s Garage:rubyとかPHPとかPerlとか。とかgnarlの日記 – webで事情に詳しくなれるのはweb業界のほんの一部だけ(それでも凄いことなんだけどさ)に関連して。優先順位=情熱or割合と置き換えてもらってもいい。

■Web業界の人は

perlやruby最高!ついでにMS氏ねとか思ってる。ネットでもリアルでもオンでもオフでもそういう環境で暮らしているので自然と頭の中で占める割合が多くなっていく。それがブログでの情報発信に繋がる。軽量言語が彼らにとって「話題」だから。

対してJavaやASP使いはそれらを仕事で扱っているだけであって特別な感情はない。プライベートで仕事の事を好んで発信する人は少ない。

これはWinとMacの話にも置き換えられて、大半のWin使いに取ってWinというのはただの道具。しかしMac使いはLoveMac、ジョブズ様のapple教。だからWeb上はシェアが低いにも関わらずMacの情報で溢れている。

■他の事にも置き換えられる

例えば創価学会。目に入ってきたネットニュースを見て一瞬だけ「創価ウザい」と思うだけでは、人生をかけて学会に尽くしている集団を止められない。対抗するためにはこちらも「反創価学会」にかける割合を増やさないといけない。本気で創価学会を嫌だと思うなら。

従軍慰安婦問題もそう。本気でなかったと思うなら、日本語のブログで仲良しごっこするだけじゃなく英語を勉強して世界に発信するべきだ。英語版wikipediaの編集合戦に勝つべきだ。

■結局

総人数じゃなくて総熱量なのである。よって(ネットに限らず)口コミを参考にする時はそこらへんを考慮する必要がある。

N★B後日談

NEWSING★BOOSTERをリリースして5日ほど経ちましたが、おかげさまでなんとか正常に動作しております。前のエントリーではリリースに伴うお知らせ…

NEWSING★BOOSTERをリリースして5日ほど経ちましたが、おかげさまでなんとか正常に動作しております。前のエントリーではリリースに伴うお知らせがメインだったので、ここではもうちょっと砕けたお話をさせて頂こうかと。

■アクセス数とか

  • 水 350
  • 木 238
  • 金 182
  • 土 95

って感じです。ぶっちゃけ思ったより少なくてがっかり25%+助かりました75%。自分自身完璧じゃないと分かっていたので、荒捜しされたりはてブで「これはひどい」とかつけられたら嫌だなぁと思いつつ、500人/dayくらいいくとは思ってたのですが…。まぁnewsingのヘビーユーザーに「こんなの作ってる」とアピールできたので先行者利益は確保できた?とか思ったり。

■データ取得の話

これは目に見えない不具合なんだけど、自宅PCでnewsingからデータ取得をしそれをFTPで転送しています。(だってサーバ上でやると一定時間でプロセス切られちゃうんだもん…)。で、何が不具合かというとPCつけっぱなしにしてるので部屋がうるさいということですね(笑)幸い、遊んでるMacMiniがあるので落ち着いたらそこに記事取得ロジックを移管。さらに知識を付けてレンタルサーバ上で記事取得ができるロジックを調査したいと思います。

■N★B作成裏話

実はこれが初めての自作CGIです。人力検索はてなでhtmlやcssの仕事をしてきた人が、プログラミング、DBの知識を付けて早起き生活みたいなサイトを作れるまでどれくらいかかりますか?という質問に対して、「週40時間と仮定して半年」「1年~1.5年」という回答がありました。

でまぁ俺は3/21(水)にボードで肩を脱臼し、3/24(土)からN★Bの作成を開始して4/4(水)にリリースしました。かかった時間は考える時間が10時間+手を動かすのに20~30時間くらいだと思います。

まぁ何が言いたいかというと別に俺が天才とかいうのでは全くなく、今までプログラミングの役に立たないと思っていたIT系の知識が今回のCGI作成に生かされた、ということです。具体的にどことは言えないけど「あーここはこの知識知らないと詰まるだろうなぁ」という箇所がいくつもありました。俺はプログラミングの知識がなかった。けどITの仕組みに対する概念理解はペーペーの頃よりも成長していたようです。

※まぁ俺の場合、一応大学でCを勉強してたし、バイトでWeb製作に関わった事もあるので全くの未経験ではなかったですが。

■スポーツに例えると

  • 小学校の頃はサッカー部で練習しててもリフティングが10回できなかったりしたけど、高校になると基礎体力や判断能力が向上して50回くらいは簡単にできるようになる。

とか。

■ちょっと調子乗ると

新しい言語を開発したり未開の分野を切り開くなら兎も角、今ある技術を習得するのはITエンジニアとしての人間的能力をアップさせるよりも断然ハードルが低いと考えます。

■またまたスポーツに例えると

  • テニスでは、教科書的な技術を習得するのは3~4年である程度できる。問題はそれを試合で生かせる判断力とメンタル力がつくかどうか。
  • スノーボードではある程度トリックができるようになったら、空中で自分なりのスタイルを出さないと一流と認めてもらえないし大会でも入賞できない。

とかとか。

■ということで、

本職には何の関係もないですが、Web系の知識もがんばって身につけようと思います。自分の限界を決めたら終わりです。100歳のおばあちゃんも言ってました。「60歳でバイオリンを始めていたら、今頃キャリア40年だったのに。」と。