150
風呂で のぼせないうちに作る マッシュアップ 株式会社ワイズノット 増井 雄一郎

1時間で作るマッシュアップサービス(関西版)

Embed Size (px)

DESCRIPTION

OSC2007で話した内容

Citation preview

Page 1: 1時間で作るマッシュアップサービス(関西版)

風呂でのぼせないうちに作るマッシュアップ株式会社ワイズノット 増井 雄一郎

Page 2: 1時間で作るマッシュアップサービス(関西版)
Page 3: 1時間で作るマッシュアップサービス(関西版)

↓Macbook pro

Page 4: 1時間で作るマッシュアップサービス(関西版)

↓Macbook proNot 防水

Page 5: 1時間で作るマッシュアップサービス(関西版)

1時間以上かけてたらのぼせちゃう

Page 6: 1時間で作るマッシュアップサービス(関西版)

Rails使ったことある人

Page 7: 1時間で作るマッシュアップサービス(関西版)

自分でMashup

したことある人

Page 8: 1時間で作るマッシュアップサービス(関西版)

サイトなんかも公開しちゃってる人

Page 9: 1時間で作るマッシュアップサービス(関西版)

Mashupマッシュアップ

Page 10: 1時間で作るマッシュアップサービス(関西版)

音楽用語

Page 11: 1時間で作るマッシュアップサービス(関西版)

Remixとの違い

Page 12: 1時間で作るマッシュアップサービス(関西版)

曲をいじったりくっつけるのが

Remix

Page 13: 1時間で作るマッシュアップサービス(関西版)

歌詞はこっちメロディーはあっちで

Mashup

Page 14: 1時間で作るマッシュアップサービス(関西版)

繋げるだけじゃなく変えるだけじゃなく

Page 15: 1時間で作るマッシュアップサービス(関西版)

いろんなサイトをごちゃまぜにしちゃえ

Page 16: 1時間で作るマッシュアップサービス(関西版)

携帯と地図のMashup

Page 18: 1時間で作るマッシュアップサービス(関西版)

Mashupとは

Page 19: 1時間で作るマッシュアップサービス(関西版)

アプリケーションの再構築

Page 20: 1時間で作るマッシュアップサービス(関西版)

昔は無理矢理やっていた

Page 21: 1時間で作るマッシュアップサービス(関西版)

HTML解析して・・・

Page 22: 1時間で作るマッシュアップサービス(関西版)

自分で使う分には良いけど公開できない

Page 23: 1時間で作るマッシュアップサービス(関西版)

いまでもAPI公開してないサイトのデータを使うときにやる

Page 24: 1時間で作るマッシュアップサービス(関西版)

データが命!勝手に使わせるなんてもってのほか!

Page 25: 1時間で作るマッシュアップサービス(関西版)

でもWeb2.0時代はサイト側がある程度自由にデータや

システムを使わせてくれる

Page 26: 1時間で作るマッシュアップサービス(関西版)

なんで?

Page 27: 1時間で作るマッシュアップサービス(関西版)

ビジネスモデルの変化

Page 28: 1時間で作るマッシュアップサービス(関西版)

データを囲い込んでも換金する方法がない

Page 29: 1時間で作るマッシュアップサービス(関西版)

でもトラフィックは広告で金になる

Page 30: 1時間で作るマッシュアップサービス(関西版)

サイトに誘導するためデータを使おう

Page 31: 1時間で作るマッシュアップサービス(関西版)

その使わせてくれる口がWebAPI

Page 32: 1時間で作るマッシュアップサービス(関西版)

色々なWebAPIが提供されてきている

Page 33: 1時間で作るマッシュアップサービス(関西版)

大別すると3種類

Page 34: 1時間で作るマッシュアップサービス(関西版)

データ系

Page 35: 1時間で作るマッシュアップサービス(関西版)

RSSAmazon Web Service

Google検索ホットペッパーじゃらんnet

Page 36: 1時間で作るマッシュアップサービス(関西版)

データを公開

Page 37: 1時間で作るマッシュアップサービス(関西版)

ここの部分が多い

Page 38: 1時間で作るマッシュアップサービス(関西版)

既存にデータを持っているところは容易に展開できる為

Page 39: 1時間で作るマッシュアップサービス(関西版)

処理系

Page 40: 1時間で作るマッシュアップサービス(関西版)

スクリーンショット形態素解析

テキスト→MP3変換

Page 41: 1時間で作るマッシュアップサービス(関西版)

データを投げると何らかの処理をしてくれる

Page 42: 1時間で作るマッシュアップサービス(関西版)

表示系

Page 43: 1時間で作るマッシュアップサービス(関西版)

Google MapsNIFTY Timeline

べつやくメソッドAPI

Page 44: 1時間で作るマッシュアップサービス(関西版)

色々なデータを表示する基盤

Page 45: 1時間で作るマッシュアップサービス(関西版)

ほとんどのAPIはMVCのMやVに相当

Page 46: 1時間で作るマッシュアップサービス(関西版)

Controllerをどうやって作る?

Page 47: 1時間で作るマッシュアップサービス(関西版)

既存の手法と同じ

Page 48: 1時間で作るマッシュアップサービス(関西版)

PHP, Perl, Ruby, Java....

Page 49: 1時間で作るマッシュアップサービス(関西版)

ちゃんと作ると非同期処理が多く

PHPは不利

Page 50: 1時間で作るマッシュアップサービス(関西版)

そこで我らがRuby on Rails

Page 51: 1時間で作るマッシュアップサービス(関西版)

救世主

Page 52: 1時間で作るマッシュアップサービス(関西版)

さすがはWeb2.0系フレークワーク

Page 53: 1時間で作るマッシュアップサービス(関西版)

WebAPIを楽にするActiveResource

Page 54: 1時間で作るマッシュアップサービス(関西版)

Rails2.0から標準添付

Page 55: 1時間で作るマッシュアップサービス(関西版)

でもRails2.0がいつ出るかは謎

Page 56: 1時間で作るマッシュアップサービス(関西版)

しかしActiveResourceは

Page 57: 1時間で作るマッシュアップサービス(関西版)

Rails 対 Rails にしか使えない

Page 58: 1時間で作るマッシュアップサービス(関西版)

別の方法を考えよう

Page 59: 1時間で作るマッシュアップサービス(関西版)

さてMashupで何を作る?

Page 60: 1時間で作るマッシュアップサービス(関西版)

OSC-Doではblogでリクエストを

募って

Page 61: 1時間で作るマッシュアップサービス(関西版)

「北海道温泉マップ」

Page 62: 1時間で作るマッシュアップサービス(関西版)

じゃらんが温泉情報をWebAPIで公開

Page 63: 1時間で作るマッシュアップサービス(関西版)

これをマッピング

Page 64: 1時間で作るマッシュアップサービス(関西版)

なのでKansaiでは

Page 65: 1時間で作るマッシュアップサービス(関西版)

「京都府温泉マップ」

Page 66: 1時間で作るマッシュアップサービス(関西版)

京都は温泉すくなくて焦った

Page 67: 1時間で作るマッシュアップサービス(関西版)

まずは温泉情報を持ってこよう

Page 68: 1時間で作るマッシュアップサービス(関西版)

APIのページを読む

Page 70: 1時間で作るマッシュアップサービス(関西版)

API使うには登録がいる

Page 71: 1時間で作るマッシュアップサービス(関西版)

APIキーをもらったらURLを叩くだけ

Page 73: 1時間で作るマッシュアップサービス(関西版)

XMLで帰ってくる

Page 74: 1時間で作るマッシュアップサービス(関西版)
Page 75: 1時間で作るマッシュアップサービス(関西版)

これをプログラムでごにょごにょ・・・

Page 76: 1時間で作るマッシュアップサービス(関西版)

Railsを使えば一発!

Page 77: 1時間で作るマッシュアップサービス(関西版)

とは行かない・・・

Page 78: 1時間で作るマッシュアップサービス(関西版)

require 'net/http'require 'cgi'require 'rexml/document'

class Onsen attr_accessor :address, :name, :id

KEY = 'phe11375af71ba' URL = 'http://jws.jalan.net/APICommon/OnsenSearch/V1/?' def self.find(params) results = [] get(params).elements.each('Results/Onsen') do |el| results << Onsen.new(el.elements["OnsenID"].text, el.elements["OnsenName"].text, el.elements["OnsenAddress"].text) end results end

def self.url(params) params[:key] = KEY URI.parse(URL+((params.map { |key,value| "#{key}=#{CGI::escape(value.to_s)}"}).join('&'))) end

def self.get(params) REXML::Document.new(Net::HTTP.get(url(params))) end def initialize(id, name, address) @id, @name, @address = id, name, address endend

Page 79: 1時間で作るマッシュアップサービス(関西版)

これでAPIを使える

Page 80: 1時間で作るマッシュアップサービス(関西版)

ちょっと読めないよね

Page 81: 1時間で作るマッシュアップサービス(関西版)

詳細はWebで!

Page 82: 1時間で作るマッシュアップサービス(関西版)

京都府の温泉リストを取り出す

Page 83: 1時間で作るマッシュアップサービス(関西版)

irb> puts Onsen.find(:count => 10, :pref => '260000').map{|o| o.name}.join(',')=>丹後琴引温泉,夕日ヶ浦温泉,木津温泉,久美の浜温泉郷,岩滝温泉,

ゆらゆら温泉郷,くらま温泉,湯の花温泉,嵐山温泉,北白川天然ラジウム温泉

Page 84: 1時間で作るマッシュアップサービス(関西版)

このリストをGoogle Mapに入れる

Page 85: 1時間で作るマッシュアップサービス(関西版)

こっちはRubyのライブラリがある

Page 86: 1時間で作るマッシュアップサービス(関西版)

YM4R/GM

Page 87: 1時間で作るマッシュアップサービス(関西版)

GoogleMaps APIをRailsで使うライブラリ

Page 88: 1時間で作るマッシュアップサービス(関西版)

$ rails onsen -d sqlite3$ cd onsen$ script/plugin install \ svn://rubyforge.org/var/svn/ym4r/Plugins/GM/trunk/ym4r_gm$ ./script/generate controller onsen index

Page 89: 1時間で作るマッシュアップサービス(関西版)

さっきのOnsenクラスはlib/onsen.rbに保存

Page 90: 1時間で作るマッシュアップサービス(関西版)

class OnsenController < ApplicationController def index @map = GMap.new("map_div") @map.control_init :large_map => true, :map_type => true @map.center_zoom_init([35.400245,135.42572], 9) endend

Page 91: 1時間で作るマッシュアップサービス(関西版)

<html><head><%= GMap.header %><%= @map.to_html %></head><body><%= @map.div(:width => 600, :height => 400) %></body></html>

Page 92: 1時間で作るマッシュアップサービス(関西版)

これだけで地図表示

Page 93: 1時間で作るマッシュアップサービス(関西版)
Page 94: 1時間で作るマッシュアップサービス(関西版)

これにじゃらんでゲットした温泉をピンで打つ

Page 95: 1時間で作るマッシュアップサービス(関西版)

Google Mapsでピンを打つには緯度経度が

必要

Page 96: 1時間で作るマッシュアップサービス(関西版)

じゃらんAPIでは住所しか持ってない

Page 97: 1時間で作るマッシュアップサービス(関西版)

そこでジオコーディング

Page 98: 1時間で作るマッシュアップサービス(関西版)

住所から緯度経度を割り出す

Page 99: 1時間で作るマッシュアップサービス(関西版)

これもGoogle Maps API

の一つ

Page 100: 1時間で作るマッシュアップサービス(関西版)

YM4R/GMを使えばそれも楽々

Page 101: 1時間で作るマッシュアップサービス(関西版)

京都駅の緯度経度を調べる

Page 102: 1時間で作るマッシュアップサービス(関西版)

irb> kyoto = Geocoding.get(‘京都駅’)

irb> kyoto.first.latlon=> [34.985458, 135.757755]

Page 103: 1時間で作るマッシュアップサービス(関西版)

Onsenクラスにコレをくっつける

Page 104: 1時間で作るマッシュアップサービス(関西版)

class Onsen ~中略~ def latlon Geocoding.get(@address).first.latlon endend

Page 105: 1時間で作るマッシュアップサービス(関西版)

でもGoogleのジオコーディングは郡に対応していない

Page 106: 1時間で作るマッシュアップサービス(関西版)

正規表現で「郡」を取り除けば大丈夫

Page 107: 1時間で作るマッシュアップサービス(関西版)

class Onsen ~中略~ def latlon Geocoding.get(@address.gsub(/(北海道|府|県).{1,5}郡/,'¥¥1')).first.latlon

endend

Page 108: 1時間で作るマッシュアップサービス(関西版)

これで2つのAPIをMashup

Page 109: 1時間で作るマッシュアップサービス(関西版)

これを地図に放り込む

Page 110: 1時間で作るマッシュアップサービス(関西版)

class OnsenController < ApplicationController def index @map = GMap.new("map_div") @map.control_init(:large_map => true, :map_type => true) @map.center_zoom_init([35.400245,135.42572], 9) return Onsen.find(:count => 50, :pref => '260000').each do |o| begin marker = GMarker.new( o.latlon, :title => o.name, :info_window => render_to_string( :partial => 'point', :locals => { :onsen => o }) ) @map.overlay_init(marker) rescue end end end

Page 111: 1時間で作るマッシュアップサービス(関西版)

吹き出しのHTMLも

Page 112: 1時間で作るマッシュアップサービス(関西版)

<div><strong><%=h onsen.name %></strong></div><div><%=h onsen.address %></div>

Page 113: 1時間で作るマッシュアップサービス(関西版)

できあがり

Page 114: 1時間で作るマッシュアップサービス(関西版)
Page 115: 1時間で作るマッシュアップサービス(関西版)

つまらない・・・

Page 116: 1時間で作るマッシュアップサービス(関西版)

温泉の写真も貼ろう

Page 117: 1時間で作るマッシュアップサービス(関西版)

写真と言えばFlickr

Page 118: 1時間で作るマッシュアップサービス(関西版)
Page 119: 1時間で作るマッシュアップサービス(関西版)

もちろんWebAPI公開

Page 120: 1時間で作るマッシュアップサービス(関西版)

Ruby用バインドも複数公開

Page 121: 1時間で作るマッシュアップサービス(関西版)

でも京都の温泉の写真は全然ヒットしない

Page 122: 1時間で作るマッシュアップサービス(関西版)

ほかに写真を公開しているAPIは・・・

Page 123: 1時間で作るマッシュアップサービス(関西版)
Page 124: 1時間で作るマッシュアップサービス(関西版)

Yahoo画像検索Webサービス

Page 125: 1時間で作るマッシュアップサービス(関西版)
Page 126: 1時間で作るマッシュアップサービス(関西版)

キーワードの写真が取得できる

Page 127: 1時間で作るマッシュアップサービス(関西版)

すばらしい!

Page 128: 1時間で作るマッシュアップサービス(関西版)

使い方も簡単

Page 130: 1時間で作るマッシュアップサービス(関西版)
Page 131: 1時間で作るマッシュアップサービス(関西版)

これもOnsenクラスにいれちゃう

Page 132: 1時間で作るマッシュアップサービス(関西版)

class Onsen ~中略~ def photo Onsen.get({ :appid=>'kyotoonsen', :query=>@name.gsub(/ ¥(.*/,''),

:results => 1}, "http://api.searc........rch?" ).elements['/ResultSet/Result/Thumbnail/Url'].text endend

Page 133: 1時間で作るマッシュアップサービス(関西版)

これで写真も取得できちゃう

Page 134: 1時間で作るマッシュアップサービス(関西版)

最後にこれをマッピング

Page 135: 1時間で作るマッシュアップサービス(関西版)

<div><strong><%=h onsen.name %></strong></div><div><%=h onsen.address %></div><div style="height: 120px"><%= image_tag(onsen.photo) rescue 'No photo' %></div>

Page 136: 1時間で作るマッシュアップサービス(関西版)

これで吹き出しに写真が出た

Page 137: 1時間で作るマッシュアップサービス(関西版)
Page 138: 1時間で作るマッシュアップサービス(関西版)

写真合ってない・・・

Page 139: 1時間で作るマッシュアップサービス(関西版)

ひとまずこれで完成

Page 140: 1時間で作るマッシュアップサービス(関西版)

不満点が沢山

Page 141: 1時間で作るマッシュアップサービス(関西版)

遅い!

Page 142: 1時間で作るマッシュアップサービス(関西版)

キャッシュで改善

Page 143: 1時間で作るマッシュアップサービス(関西版)

京都以外は?

Page 144: 1時間で作るマッシュアップサービス(関西版)

選べるようにしましょう

Page 145: 1時間で作るマッシュアップサービス(関西版)

コメントとかは?

Page 146: 1時間で作るマッシュアップサービス(関西版)

acts_as_commentableで

Page 147: 1時間で作るマッシュアップサービス(関西版)

携帯は?

Page 148: 1時間で作るマッシュアップサービス(関西版)

jpmobileで

Page 149: 1時間で作るマッシュアップサービス(関西版)

これを改善して自分温泉地図を作りませんか?

Page 150: 1時間で作るマッシュアップサービス(関西版)

スライドとソースはhttp://blog.masuidrive.jp/