ホーム > タグ > プログラミング
プログラミング
twitterに投稿されたゲレンデ写真を纏めたサイト+その他の技術情報
- 2009-10-18 (日) 17:05
- カテゴリ:やったこと、行った所
twitterに投稿された(略 をどうやって作成したかという技術メモ。
作成手順
以下の3ステップで作成しています。
- twitterAPIを利用して#snowJPの検索結果を収集する。
- 収集した検索結果を加工してRSS化する。
- 指定したRSSを自動投稿するプラグインをwordpressに導入し、2で加工したRSSを登録する。
1、2で使ってるプログラムは最後に紹介するとして。3はFeedWordPressというプラグインを利用します。
FeedWordPressでマルチブログする – [Mi]みたいなもの
これで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を読み込む場合、
- 「content:encoded」があれば本文として使う。
- 「content:encoded」がなければ「description」として使う。ただし改行は反映されない。
仕様らしく、僕が作成したRSS2.0は「description」しか作ってなかったので改行コードが反映されなかったと。んじゃ「content:encoded」を作ればいいじゃん、というところですが、rss/makerライブラリの仕様でRSS2.0作成時には「content:encoded」を利用できない!
仕方ないのでRSS2.0を作成し文字列として読み込んだ後、「description」の下に1行挿入し「content:encoded」とする超泥臭い作り方で乗り切りました。うーん、RSSライブラリは完璧じゃないよなぁ…。
ということでコード公開
Web拍手&はてブ
下のボタンを押すと拍手を送ることができます。同時にメッセージも送れます。はてブはこちら。
- Comments: 0
- Trackbacks: 0
twitterに投稿されたゲレンデ写真をまとめたサイト+その他を作りました。
- 2009-10-18 (日) 17:01
- カテゴリ:やったこと、行った所
タイトル通り、twitterに投稿されたゲレンデ写真を纏めるサイトを作りました。
※今は1つも写真投稿がないので、後述する「スノーボード関係の言葉が含まれた発言を検索しRSS」も合わせて投稿するようにしています。
どんなサイト?
以下の条件に引っかかる投稿を抽出し、画像サイトへのURLを変換し画像を直接表示します。
- ハッシュタグ「#snowJP」を含む
- 投稿内に「携帯百景」「はてなフォトライフ」「twitpic」のURLを含む
wordpress使ってるので携帯・iPhoneからも見れます。ハッシュタグ「#snowJP」を使ってどんどん雪山写真を投稿しよー!
サイトを作成した経緯
妄想開始。雪山好きのtwitterユーザーのためのポータルサイトがあればいいと思った。内容は雪山関係のpostをしているtwitterユーザー一覧(近々リリースされるtwitterのlist機能を使用)、ハッシュタグを利用したリアルタイム積雪&渋滞情報。12:22 AM Oct 2nd Tweenで
というか#09-10snowみたいなハッシュタグを流行らせたい。毎週土日に各地のゲレンデ写真が集まるだけで相当価値が出てくると思う。雪山ユーザーってゲレンデを略称で書いちゃっうから検索しにくい。それにmixiやら個人ブログやら情報が分散しすぎている。 12:26 AM Oct 2nd Tweenで
これをハッシュタグ一つで纏められる。ハッシュタグで纏められたポータルサイトが知名度を持ち始めれば、非twitterユーザーも注目する→雪山好きのtwitterユーザーが増える→俺のTLが充実するという一石三鳥。妄想終了。12:26 AM Oct 2nd Tweenで
毎週土日に最新の雪山写真がずらっと並んでるって最高じゃね!?
今後のロードマップなど
- #snowJPまとめサイトを立ち上げる ←今ここ
- 初期メンバーが#snowJPをつけてゲレンデ写真を投稿する
- twitterユーザーで雪山好きの人に#snowJPの存在を宣伝する
- 徐々に#snowJPへのゲレンデ写真への投稿が増える
- 毎週土日の朝はbuzztterで#snowJPがバズる
- 「twittetってなんか雪山情報充実してるらしぜー」とmixiから人が流れてくる。
- ますます#snowJPへのゲレンデ写真の投稿が増える
- ゲレンデの中の人も#snowJPの影響力を無視できなくなり、twitterアカウントを作成して#snowJP宛に最新のゲレンデ写真を毎日投稿する
- なんかすごい事になる
buzztterはともかく8が実現できたら最高ですよね。1つのサイト(ハッシュタグ)をチェックするだけで、例えば白馬エリア全ゲレンデのゲレンデ写真が確認できる。便利で楽しい!
これだけではしょぼいので。
ロードマップとか書いてみたけど、今は#snowJPの使用者が少ないので写真も少なくお寒い感じ。なので#snowJPが盛り上がるよういろいろ作ってみました。
1.#snowJPの全投稿をRSS配信
http://prius.cc/twit_snow_rss/snowJP.rss
普通に#snowJPでチェックすりゃいいじゃん、という話ですが、僕がRSSリーダー好きなので作ってみました。これはただのついで。重要なのは次から。
2.スノーボード関係の言葉が含まれた発言を検索しRSS配信(以下、雪山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の存在を宣伝する」ために作りました。今考えてるのは、
- この新規ユーザー発見専用RSSを購読する
- 新規ユーザーを発見したら@teraco_snowからハッシュタグ「#snowJP」の案内postを送る。
- 一度案内を送ったユーザーは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の対応を取りたいと思ってます。
Q.雪山RSSに検索ワードを追加・削除してほしい
A.@teracoまでご連絡ください。
その他、何かあれば@teracoまでお気軽に。 最後に。何かと関東圏のユーザーが優遇されるtwitter界ですが、#snowJPでは日本全国の雪山ユーザーの投稿が集まるといいなーと思ってます!
技術情報に興味のある方はこちら。
Web拍手&はてブ
下のボタンを押すと拍手を送ることができます。同時にメッセージも送れます。はてブはこちら。
- Comments: 0
- Trackbacks: 0
GJ!の新着拍手を表示するRSSを作成する。
先日導入したWeb拍手”GJ!”し、結構気に入って使ってるのですが欠点が一つ。拍手されたかどうかはGJ!の管理者ページを見に行かないと分からない。ということで、GJ!の新着拍手があればRSSを更新するスクリプトを作成してみました。PHPできないので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])<br />
end
end
# RSSを出力します
f.puts rss
作成時間は40分です。。。
参考:Kazuhiro’s Weblog: RubyでRSSを自作してみよう
で、これを運用するにはcronの動かせるサーバを立てなければいけない。やっぱ拍手をトリガーにしてサーバサイドでRSS作る仕組みの方が(構成的に)簡単だなぁ。GJ!の次バージョンで導入されればいいなぁ…。
Web拍手&はてブ
下のボタンを押すと拍手を送ることができます。同時にメッセージも送れます。はてブはこちら。
- Comments: 0
- Trackbacks: 0
OpenSocial周りのWebの盛り上がりについて。
正直、参加者の大半が課題作れなかったのは意外だった。…と他人事のように書いて俺も出来なかったわけだがw、おそらく主催者のwillnetさんはこれくらい簡単にできると思ってたんじゃないかな?
と書いたわけだけど、これはマジで意外だった。
実は俺が思ってるより課題(こちらを参照)が難しかったのかもしれないけど、やる事と言えば
- Todoリストの完了ボタンにユニークなid属性を付与する
- 完了ボタンを押すと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に食いついてない気がする。これも勝手に考えると、
- 技術的には面白くない
- ソーシャルってのが気に喰わない
- 検証環境を作るのが面倒。
のかなぁと。OpenSocialといってもmixiの情報使えるだけで後はJavaScriptで書くだけ。普段からJS使ってる人はあまり目新しいと思わないのかも。もう一つが、mixiアプリ作ってもmixiの中でしか使えないこと。俺はこのエントリで書いたとおり友達が使ってくれるだけでもいいじゃんと思うんだけど、Webアプリを作ってURL一発でリーチしてる人なら、mixiだけのためにアプリ作るなんてアホらしいのかもしれない。会員制サイト否定派も多いしねー。
最後はおまけだけど、いちいちファイルアップしてmixiアプリにアクセスするのが面倒という説。普段使ってる環境使えないとストレス溜まります。OpenSocial Development Environmentは使えるけど、eclipseインストールするのめんどいという人もいる。
以上3つの理由で食いつきが悪いのかな、と思います。
そう考えると、mixiアプリの作成者属性ってiPhoneアプリ作成者と被るところはあるのかも。面白半分、利益半分。普通のWebアプリに比べて法人割合が高い。
ただ言えることは、現時点でmixiアプリを自在に作れる人は少数だということ。勉強会に来るメンバーがこのくらいの習熟度ということは、今のうちにノウハウ積み上げれば正式版スタートしてから手をつける人に差をつけることができるかも…!
とはいえ
前途多難だなー。プラットフォームが不安定で検証もままならねーし、JavaScriptっていっても昔流行ったステータスバーの表示をちょろっと変えるレベルじゃないからね。実際、この本を120ページくらいまで読んだけど、mixiアプリのコード例で使われてる書式なんて全然出てきませんからね>< Web2.0時代のJavaScriptにはまだ遠いわー。
Web拍手&はてブ
下のボタンを押すと拍手を送ることができます。同時にメッセージも送れます。はてブはこちら。
- Comments: 2
- Trackbacks: 0
OpenSocial Host勉強会に行ってきたよーvv
26日(金)は第1回「OpenSocial Host勉強会」でした。
JavaScript初心者の俺ですが、OpenSocialに興味があったので参加してみました。…どのくらい初心者かというと勉強会に参加決めてから初めてJSの参考書を買ったくらいです。まぁ締切効果を利用してJS勉強できたので良かったっちゃあ良かった(ぉ
※参考:OpenSocialというかmixiアプリは実は簡単に作れそうな話。
ちなみにOpenSocialというのは今ベータテスト期間中のmixiアプリで採用されている技術で、これを学べば自分でmixiアプリを作って友達に使ってもらったり、PV増やして収益上げたりできるかもしれない。まだ知名度は低いけど、将来的にiモードみたいに一般的なものになる…かも?といった段階です。
OpenSocial Hostとは?
今回はOpenSocial Host(以下OSH)の勉強会でした。OSHは株式会社ハートレイルズさんが提供しているOpenSocailのアプリ開発を支援するサービス。
OpenSocialを作るためにはプログラムファイルを置くサーバが必要。けどレンタルサーバは有料だったりするのでOSHがファイル置き場を無料で提供します、というのがまず1点(※)。とはいえ、普通のエンジニアはサーバの1つや2つ持ってるのでこれだけではメリットにならない。ポイントは外部サーバのDBに簡単に書き込みできるAPIを提供している事だと思う。
※ 無料プランで1アプリにつき100ファイル、1ファイル10MB、合計500MBまで。
OpenSocialアプリと外部サーバの関係
仮にOpenSocialアプリ(mixiアプリ)で外部サーバにデータを保存しない場合でも、「永続化データ」という手法を使ってOpenSocial側(mixiのサーバ)にデータを保存することができます。ただこれが
- データ保存個数が限られる。gooホームの場合、1アプリに付き10個までしか保存できない。
- 同じアプリを入れてる人同士だと、お互いのデータが丸見え。
- 永続化データはユーザー毎に独立した領域に保存される。
とめちゃくちゃキツい制約あり。
例えば閲覧者の住んでいる場所を取得して明日の天気を返すだけのアプリならいいけど、日記アプリを作ろうとすると、
- 11個以上日記が書けない。
- 秘密の日記が書けない
- コメントの実装が大変でシステムリソースを食う。
となる。3については「永続化データはユーザー毎に独立した領域に保存される」制約が作用していて、例えばAさんの日記にBさんがコメントをつけたとしても、そのコメントはAさんのデータ領域に保存されない。つまりAさんの日記にコメントがついているかどうか調べるために、Aさんのマイミク(で日記アプリ使ってる人)を全員調べないといけない。日記一覧を表示してコメント数を表示するだけでも、大変なりソースを消費してしまうわけで。
んじゃ外部サーバにデータ保存するしかないよね、って話になるけど、OpenSocailアプリからのデータを受信するプログラムを別途書いたりしないといけないのでJS以外の知識も必要になる。
そこでOpenSocial Host
OSHならJavaScript API(※)でOSHのサーバにデータを書き込めてしまう。しかもデータに細かい権限設定ができるので秘密の日記なども作成可能。加えてアクセス解析機能も充実していて、例えばユーザーID単位でPV/UU集計できるので「あいつにアプリ紹介してやったのに全然見てねーわ」とかも分かっちゃう><
※ API使用回数:5,000,000回/月まで無料
OSHを使ったデモとして円グラフ日記を見せてもらいました。簡単そうに見えますが、最新の円グラフは永続化データで保存してHOMEビューに表示、円グラフについたコメントはOSHに保存という作りで開発には1週間かかったみたい。ただデータ保存部分をOSHで代用しなければもっと長くかかったんじゃないかな?と思います。
あと(なんでもそうですが)1個作れば使いまわして類似アプリを作れるので苦労するのは最初だけ!早いとこ自分の”フォーム”を確立しないとなーと思いました。
OpenSocial Hostで何か作ってみよう!
残り時間でOSHを使ったmixiアプリを作ってみよう!ということで、参加者みんなでOSHに登録した後、id:willnetさんの用意した雛形を使ってmixiアプリ登録→ちょこっと改造という流れ。
…だが「ボタンを押したらTodoリストを消す」という最初の課題もできない。いーよいーよ、どうせJS始めたててでDOMとかも分かってねーし(その割には各Todoにidを付与するとこまではできた)とふて腐れてたんだが、1時間経って課題を作れた参加者は2名だけでしたとさ。うーん。ここらへんは次のエントリあたりで補足予定→補足した。
OpenSocial Host 今後の予定
- mixiモバイル対応:7月末~8月頭目標。PCもモバイルも”なるべく”同じソースを使えるように検討中。
- データベース/ログのインポート/エクスポート機能
- JavaScriptAPIの拡充 ** 複数コンテナ(mixi⇔goo⇔orkut)/アプリケーション間の連携支援API ** 写真や動画などのマルチメディアファイルの投稿/取得API
- アプリの雛形となるソースの提供
感想いろいろ
まずはOSHの感想から。
正直外部サーバにデータ保存するところまでmixiアプリ作れてなかったのでOSHに興味なかったけど、永続化データの制約知った+登録簡単ですぐに使い始められるOSHはなかなかいいなぁと思いました。
あとは雛形のソースコードを充実させてほしいかな。。。例えば、普通の人がmixiアプリ作って外部サーバにデータ保存しようとした場合、まずmixi Developer Center見たり、実際にソース公開してる人探したりすると思います。
参考:mixiアプリからの署名付きリクエストの受け側を作る – プログラマー、再起動中
んで、そのやり方で作れちゃうとOSHイラネってなってしまうので、OSHを使ったmixiアプリのソースを解説付きで公開してくれるとありがたいです。まぁ僕が参考にしたいだけなんですけどね!
その他。
- アクセス解析はいいなぁと思いました。自分で実装するの面倒だしこれに慣れるとOSHから離れられないとかありそう。有料プランなら時間も取れるとか機能強化もできるし。
- GoogleAppEngineでmixiアプリできるよーvvという記事がいくつか上がってるので、圧倒的なブランド力に押されてtwitterに対するもごもご/wassr的な位置づけにならないか心配です。
OpenSocial周りのWebの盛り上がりについて。
これは次のエントリで。
初めての勉強会感想
オフ会の延長線って感じかな。違うのは、仲良くするのが目的じゃなく勉強/情報交換がメインなこと。例えば
- 出欠確認なし
- 参加者同士の自己紹介はなし
- 名札なし
- 名刺交換なし
って感じ。昨日だけでは判断できないけど、技術で会話するエンジニアにとってはオフ会よりやりやすい…かもしれません。けど正直1人参加は勇気がいるね。オフ会と違って普段からネットで仲良くしてる人って訳じゃないし、行ったら行ったで内輪気味な会かもしれない(昨日は違ったけど)。例えば参加者のブログ読んどいて「あの記事面白かったですね!」からきっかけ作ればいいけど、なかなかタイミングがないし(そもそもお互いの名前知らない)。
やっぱり懇親会なのかな?技術レベルが違いすぎる+Web系の人ばっかりっぽかった(私服多かった)ので参加しなかったけど、そういう所で仲良くなれれば次へのきっかけになるかもしれない…と帰ってから思った。例えばmixiアプリ作ってる人とブログやtwitterで交流する→勉強会で初顔合わせなら盛り上がったかもしれないなー。
課題出来なかった事も含めてやや不完全燃焼でしたが、mixiアプリと合わせてOSHの情報も追っかけていきたいと思います。
Web拍手&はてブ
下のボタンを押すと拍手を送ることができます。同時にメッセージも送れます。はてブはこちら。
- Comments: 0
- Trackbacks: 2
Home > Tags > プログラミング



