2010年2月28日日曜日

[ぐるめまっぷ] ぐるなび/ホットペッパー/食べログの飲食店をまとめて検索できるサービス

地図ベースで周辺の飲食店を一括検索できるサービスを作ってみました。

ぐるめまっぷ
http://maps.igllry.com/




作っている最中に気づいたこと

・ ぐるなびのレスポンスが遅い!

・ Google Maps APIを使ってみたかったから地図を全面に押し出したけど、飲食店検索は必ずしも地図ベースが便利とは限らないかもしれない。

・ ぐるなびAPIと食べログAPIはJSONPが用意されていないので、ひと手間加える必要がある。

・ Google Maps APIでAdsenseを利用できるようになってた (記事)



利用しているサービス


[地図]

Google Maps API
http://code.google.com/intl/ja/apis/maps/

google-maps-icons
http://code.google.com/p/google-maps-icons/


[飲食店情報]

ぐるなび Webサービス
http://api.gnavi.co.jp/api/service.htm

ホットペッパー|リクルートWEBサービス
http://webservice.recruit.co.jp/hotpepper/

食べログAPI
http://tabelog.com/help/api/


[その他]

駅データ
http://www.ekidata.jp/index.html

Google App Engine
http://code.google.com/intl/ja/appengine/

2010年2月12日金曜日

Flickr をだら見できるFlickr Photo Streamをつくってみた

Flickrをだら見

Flickr Photo Stream

Flickrはこじゃれた写真が多いですな


[追記]
ヒマにまかせて、
Flickr TwitPic TweetPhoto Picasaの画像をダラ見できるページを作ってみた





Inspired by
日本人がうpしたTwitPicの画像をだら見できるTwitPic Stream (ja)ってのを作ったよ

FriendFeedに流れてきたTumblrの画像をだら見できるTumblr Photo Streamってのを作ったよ

2010年2月7日日曜日

海外の有名ブログに自作のjQueryのプラグインを紹介してもらったらアクセスがこんな感じになった

Webデベロッパー&デザイナー向けの有名ブログ Six Revisionsの下記の記事で自作のjQueryプラグイン Twit を紹介してもらいました。


15 Fantastic Finds on the Google Code Repository
http://sixrevisions.com/resources/15-fantastic...

Googleコードで公開されているあまり知られていない(?)色々なプロジェクトを紹介していて、興味深い記事です。


さっき確認したところ400以上Diggられてて、DiggのTechnologyカテゴリーでTopページに掲載されていました。


で、Google AnalyticsでTwitのデモページのアクセスをチェックしたら、
普段20~30程度のページビューが700まで跳ね上がってました。




これを多いと見るか少ないと見るか。
所詮 1/15 の扱いでしかないわけですし、こんなもんかな。

Google App Engine + Twitter + OAuthでTwitterにつぶやくためのメモ

TwiVoxからTwitterにつぶやくためにOAuthを利用してみました。

認証して投稿するという部分をメモしておきます。


TwitterでOAuthを扱うためのライブラリはいろいろあるのですが
(Twitter APIのWikiでも紹介されています)、
今回はAppEngine-OAuth-Libraryを利用してみます。
ちなみに、フレームワークとしてDjangoを利用します。


0. 準備

TwitterでOAuthを利用したアプリを作るためにはアプリを登録する必要があるので、はじめに下のURLからアプリを登録してください。
https://twitter.com/apps


1. 認証

from django.http import HttpResponseRedirect
import oauth

CONSUMER_KEY = 'アプリのConsumer key'
CONSUMER_SECRET = 'アプリのConsumer secret'

'''
認証を実行
'''
def signin(request):
# Twitterの認証が成功された場合にコールバックするURLを指定
callback_url = 'http://%s/twitter/callback/' % request.get_host()

client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET, callback_url)

return HttpResponseRedirect(client.get_authorization_url())

'''
コールバック
'''
def callback(request):
# Twitterからoauth_token, oauth_verifierというパラメータが返ってきます。
oauth_token = request.GET.get('oauth_token')
oauth_verifier = request.GET.get('oauth_verifier')

client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET, None)
user_info = client.get_user_info(oauth_token, oauth_verifier)

# ユーザー情報を保存
from model import TwitterUser
twitteruser = TwitterUser.all().filter('twitter_id =', user_info['id']).get()
if not twitterusr:
twitteruser = TwitterUser()
twitteruser.twitter_id = user_info['id']
twitteruser.username = user_info['username']
twitteruser.picture = user_info['picture']
twitteruser.token = user_info['token']
twitteruser.secret = user_info['secret']
twitteruser.oauth_verifier = oauth_verifier
twitteruser.save()

return HttpResponseRedirect('/u/%s/' % user_info['username'])


2. 投稿
from django.http import Http404
from django.shortcuts import render_to_response

def post(request):
if request.method != 'POST': raise Http404;

# つぶやき
status = request.POST.get('status')

# 140文字以上だと反映されないので弾く
if len(status) > 140 or len(status) == 0:
return render_to_response('post.html',
{'error': 'Your Twitter message cannot be blank and cannot be longer than 140 characters.'},
context_instance=RequestContext(request))

# パラメータにつぶやきをセット
additional_params = {'status': status.encode('utf-8')}

# 返信の場合
in_reply_to_status_id = request.POST.get('in_reply_to_status_id')
if in_reply_to_status_id:
additional_params['in_reply_to_status_id'] = in_reply_to_status_id

client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET, None)

try:
# リクエストを投げる
# request.twitter_userに認証時に保存したユーザー情報が格納されているとします。
response = client.make_request('http://twitter.com/statuses/update.json',
token=request.twitter_user.token,
secret=request.twitter_user.secret,
additional_params=additional_params,
protected=True,
method='POST')
# JSONをパースする
from django.utils import simplejson as json
data = json.loads(response.content)
if data.has_key('error'):
logging.error(data['error'])
return render_to_response('post.html',
{'error': data['error']},
context_instance=RequestContext(request))
except Exception, e:
import traceback
logging.error(traceback.format_exc())
return render_to_response('index.html', context_instance=RequestContext(request))

2010年2月1日月曜日

MySQLで日付型以外のフィールドで日付の比較を行うメモ

MySQLで日付を扱う場合ってたいていカラムの型として datetime とか date を指定することが多いと思うのですが、
そうではなくて、諸々の理由から日付型のカラム以外に日付(らしき)データを格納して、それを日付として比較する場合のメモ(ややこしや)


こんな感じのテーブルがあるとします。

CREATE TABLE `foo`
(
`id` INTEGER NOT NULL AUTO_INCREMENT,
`year` INTEGER,
`month` INTEGER,
`day` INTEGER,
`created_at` DATETIME NOT NULL,
)
# year, month, day にそれぞれ年,月,日が格納される


この中のyearmonthday の組み合わせが、たとえば "2010/02/15"より前のデータだけを取得したい場合どうするか?



これ、単純に年は年、月は月で比較するととんでもなく大変です。




とりあえず CONCAT (CONCAT_WS)DATE_FORMAT の組み合わせを使えばすっきり書けそうです。

SELECT CONCAT(year, month, day) FROM foo;
# => 201011

SELECT CONCAT_WS("/", year, month, day) FROM foo;
# => 2010/1/1

SELECT DATE_FORMAT(CONCAT_WS("/", year, month, day, "%Y/%m/%d")) FROM foo;
# => 2010/01/01


で、"2010/02/15" より前のデータを引っ張ってくる書き方。
SELECT
*
FROM
foo
WHERE
DATE_FORMAT(CONCAT_WS("/", year, month, day, "%Y/%m/%d")) <= "2010/02/15";





MySQLの日付時刻関数
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html


MySQLの文字列関数数
http://dev.mysql.com/doc/refman/5.1/en/string-functions.html