2010年11月30日火曜日

geoDjangoでの座標変換

あんまりたいしたことじゃないんだけど、
ハマったのでメモ。

以前OpenLayersでGmapを使うときに
座標を変換しなければならないというようなことを書いたんだけど
その変換をgeoDjangoでやるときにハマったので
EPSG:4326からEPSG:900913へ変換する例を示す。

>>>from django.contrib.gis.geos import Point
#EPSG:4326系の座標を設定
>>>lon = 14510632.892999999
>>>lat = 4091884.7946700002
>>>p = Point(lon,lat)
#ここが問題
#変換先の座標系(EPSG:900913)を設定
>>>p.set_srid(900913)
#変換元の座標系(EPSG:4326)から変換
>>>p.transform(4326)
>>>p.x
130.35123310029377
>>>p.y
34.468498799969531

先に変換する座標系を設定して
変換元の座標系を指定しなければならないようで
この部分を逆にしていたためハマってしまった。
自分の感覚では先に変換元を指定、あとから変換先を指定だったので

2010年11月23日火曜日

Djangoの検索

Djnagoで検索を実装していて、ちょっと困ったことがあったので、

DjangoにはデフォルトでUserクラスってデータベースのモデルが入ってる。
そのモデルの中に「性」、「名」と二つがあるんだけど、
検索をする際に、普通は「田中一」なんて入れ方をするから
文字列をどこで性と名に分ける場所が不明になる。
それで困った。
もともと性と名が一緒なら「田中」で検索して「田中一」は出るんだけどなぁ。

んで、
いろいろ探していたらQオブジェクトなるものがDjangoの中にあるらしい。
Qオブジェクトを使うことで、OR検索なんかのより複雑な検索ができるようになるとのことで、

from django.db.models import Q
from django.contrib.auth.models import User
import re

def search(req):
   search_temrs = req.GET.get('search','')
   if search_terms:
      #空白文字があったら区切る。
      p = re.compile(u"[  ]")
      datas = p.split(search_terms)
      for data in datas:
         #一文字ずつに区切る
         data = data.encode("utf_8")
         char_data = list(unicode(data,"utf_8"))
         for char in char_data:
             char_utf = char.encode("utf_8")
             #一文字ずつ性または名でOR検索をかける。
             users = users.filter(Q(last_name__icontains=char_utf) | Q(first_name__icontains=char_utf))

一文字ずつ性または名でOR検索をかけるというやり方にしてみた。
もう少しスマートに書きたいところだけれどとりあえずはこれで

2010年10月23日土曜日

OpenLayers

Gmapを勉強して
結構APIを使えるようになったら
OpenLayersで使うことになった

一番やりたいことは、OpenLayersでGmapのLocalSearchを使うこと
空間検索や住所検索、ジャンル検索なんかを
LocalSearchでできるようになったものの

OpenLayersとGmapで座標系が違うので
これが結構大変だった…

LocalSearchに渡す座標系はGmap系の座標でないといけないので
//OpenLayersの中心座標をもらってくる。GMapobjはOpenLayersでのmapオブジェクトしている。
lat = GMapobj.getCenter().lat;
lon = Gmapobj.getCenter().lon;

//座標をOpenLayersのものからGmapのものへ変換
var trans_pnt = OpenLayers.Geometry.Point(lon, lat).transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"))
var search_pnt = new google.maps.LatLng(parseFloat(trans_pnt.y),parseFloat(trans_pnt.x));

//LocalSearchで検索した結果の座標系をOpenLayersのものへ変換し、中心の位置を変更。
GMapobj.setCenter(new OpenLayers.LonLat(parseFloat(lon), parseFloat(lat)).transform( new OpenLayers.Projection("EPSG:4326"), GMapobj.getProjectionObject()));

というようなことをしないといけなかった。

2010年8月30日月曜日

Google Data API

Google Mapsに空間検索機能があるということで調べていたが
それらしいAPIが見つからなかった

諦めかけていたら
Google Maps APIに空間検索機能があるのではなく
Google Data APIの中のGoogle Maps Data APIにあると分かった

すごく紛らわしい
しかし、便利ではありそう

Google Data APIでは
OAuth認証などを使わなければならないので
大変かも

また実装したりしたら載せようかな

2010年8月24日火曜日

サーバーほしい

djangoやpinaxなんかが使えるようになると
サーバーがほしくなってきた

けどそんな金ないよ(涙)
gae勉強してなんとかするしかないのか



会社のパソコン新しく買ってもらえることに
SSDに自分で入れ替えてさらに性能あげよっと

2010年8月6日金曜日

ブラウザアプリでOauth認証

twitterのOauth認証できるようになったので
ブラウザアプリケーションでもやってみるかと思ったら
認証の仕方が微妙に違う(汗)
仕方ないのでこっちは別にやりました


callbackして同じページに戻ってきて、
認証するようにしています

access_tokenは保存しておきたいので、cPickleを使って保存しておく。

以下access_tokenを取得して認証する関数

#!/usr/bin/python
#!-*- coding: utf-8 -*-

import os, cPickle, cgi
from oauthtwitter import *

CONSUMER_KEY = "your consumer_key"
CONSUMER_SECRET = "your consumer_secret"
KEYFILE = "./keyfile/key.dat"
ACCESS_TOKEN = "./access_file/access_token.dat"

def twitter():
  form = cgi.FieldStorage()
#access_tokenをすでに取得している場合
  if os.path.isfile(ACCESS_TOKEN):
    f = file(ACCESS_TOKEN,"rb")
    access_token = cPickle.load(f)
    f.close()
    return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)
#access_tokenを取得していない場合
  else:
#ユーザに許可をもらう前。request_tokenからurlを作成し、ユーザに許可をもらう画面にアクセスする。
    if "oauth_token" not in form:
      tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET)
      request_token = tw.getRequestToken()
      f = file(KEY_FILE,"wb")
      cPickle.dump(request_token,f)
      f.close()
      authorization_url = tw.getAuthorizationURL(request_token)
      print 'アクセス'%authorization_url
      return None
#ユーザに許可をもらった後。access_tokenを作成し保存する。
    else:
      f = file(KEY_FILE,"rb")
      request_token = cPickle.load(f)
      f.close()
      tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET,request_token)
      access_token = tw.getAccessToken()
      f = file(ACCESS_TOKEN,"wb")
      cPickle.dump(access_token,f)
      f.close()
      return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)

def print_coment(api)
  statuses = api.GetFriendsTimeline(count=10)
  for status in statuses:
    print "%s:%s
"%(status.user.name,status.created_at)
    print "%s
"%status.text

if __name__=="__main__":
  print "Content-Type: text/html"
  print
  api = twitter()
  if(api != None):
    print_coment(api)

2010年8月2日月曜日

twitterAPIコマンドライン投稿

実際にコマンドライン投稿できるようなものを
pythonで書いてみた。

細かいところがいろいろ必要だった。

まず、python-twitterから
/usr/lib/python2.5/site-packages/のなかの
twitter.pyの中で関数PostUpdate中の

if len(status) > CHARACTER_LIMIT:
          ↓
if len(status.decode("utf-8")) > CHARACTER_LIMIT:
変更した。日本語の場合、statusの文字数が三倍くらいになるので、140文字投稿できないため

前回インストールしたものに加え、以下のものインストール。
oauth-python-twitteroauthが必要になる。
インストールするにあたって
参照サイトを参考にしており、
def getAccessTokenWithPin(self, pin, url=ACCESS_TOKEN_URL):
  token = self._FetchUrl(url, parameters={"oauth_verifier": pin}, no_cache=True)
  return oauth.OAuthToken.from_string(token)
をoauth-python-twitterのtwitter.pyに追記してインストールしている。


さらに、twitterにアプリケーション登録を行い、
Consumer_keyとConsumer_secretをもらっておく必要がある。

#!/usr/bin/python
#!-*- coding: utf-8 -*-

import sys, os, pickle
from optparse import OptionParser
from oauthtwitter import *

CONSUMER_KEY = "CONSUMER_KEY" #実際のCONSUMER KEYを入力
CONSUMER_SECRET = "CONSUMER_SECRET" #実際のCONSUMER SECRETを入力
KEY_FILE = "KEY_FILES/twitter_key.dat"

#access_tokenを取得する。ない場合は取得し、前回のものが保存してある場合はそれを使う。
def Get_Access_Token():
  if os.path.isfile(KEY_FILE):
    access_token = pickle.load(file(KEY_FILE))
  else:
    tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET)
    request_token = tw.getRequestToken()
    authorization_url = tw.getAuthorizationURL(request_token)
    print authorization_url
    tw = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, request_token)
    oauth_verifier = raw_input("PINを入力:\n")
    access_token = tw.getAccessTokenWithPin(oauth_verifier)
    pickle.dump(access_token, file(KEY_FILE,"w"))
  return OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token)


#フォローしている人物のコメントを表示する。
def print_coment(option, opt_str, value, parser, *args, **kwargs):
  api = Get_Access_Token()
  statuses = api.GetFriendsTimeline(count=10)
  for s in statuses:
    print s.user.name + ":"
    print s.text


#フォローしている人物の名前を表示する。
def print_friends(option, opt_str, value, parser):
  api = Get_Access_Token()
  users = api.GetFriends()
  for user in users:
    print user.name

def main():
  tw = twitter()

  parser = OptionParser()

  parser.add_option("-t","--tweet",dest="coment",type="string",action="store",help="write coment")

  parser.add_option("-w","--watch",dest="tweet",action="callback",callback=print_coment,help="watch your friend's coment")

  parser.add_option("-f","--friend",dest="friend",action="callback",callback=print_friends,help="watch your friends")

  (options, args) = parser.parse_args()

#コメントを投稿する。
  if(options.coment != None):
    post = options.coment
    status = tw.PostUpdate(post)

if __name__=="__main__" :
  main()

コマンドラインtwitterできるようになった!
このプログラムでツイートとフォローしている人物のコメント閲覧とフォローしている人物の名前の表示ができる。

前回の認証にはBASICを使用していたが、
今回はOAuthを使用してプログラムを書いてみた。

2010年7月30日金曜日

twitterAPI

Twitterについて勉強中。
この業界にいて今まで触ったことなかったのでまずいよね。

とりあえずプログラムの中から使えるようにしてみる。

僕はpython使いなので
python-twitterを使うのがよさそう。
python-twitterを使うのに必要なものとして、simplejsonもインストールしておく。
OSはubuntu8.04を使っているので、
$sudo apt-get install python2.5-simplejson
でできた。

python-twitterのインストールは解凍して
$sudo python setup.py
で完了。

プログラムから使ってみる。

#!/usr/bin/python
#!-*- coding: utf-8 -*-

import twitter

api = twitter.Api("ユーザ名","パスワード")
status = api.PostUpdate("コメント")

で「コメント」を投稿できる。

なかなか面白い。
コマンドラインで実行できるようにすれば、
プログラム書いてる途中でツイートできるじゃないの!

ハマりそ!

2010年3月18日木曜日

店員さんが親切

ヨドバシカメラでTVを買いに行ったんです


ずっと店員さんにどんなのが
良いとか聞いてて

REGZAが良いって言ったら
親切に教えてくれました


「じゃあこれ買いますんで」と言うと
「じゃあ店員さん呼んできます」と返されました

店員さんだとばかり思っていたら
違っていたのか?

2010年3月4日木曜日

突然ですが

昨日結婚しました


全然実感ないです

変わったことと言えば
風呂が広くなりました

ん~
あとは特にないかな

2010年2月15日月曜日

javascriptっていいな

最近javascriptにはまってます

コレ良いね
Webページ作るときに
かなり凝ったものを作れるようになります

おもしろすぎる

GAEと合わせ技で
いろいろ楽しめそうです

2010年2月2日火曜日

GAE

最近
GoogleのAppEngineというのであそんでます

自分でサーバを立てなくても
使えるのがいいです

自分の頭のなかをまとめるのが大変になってきてるんで
これでなんか作ろうかな~

2010年1月27日水曜日

広島に

昨日今日と広島行ってきました

学会だったんですが
ネット上のコミュニケーションをどうすんのかって
内容の発表がかなり面白かったです

んで
今日広島城を見学して帰ってきました
結構写真撮ったんですが
ケータイのデータがどこに保存したか
わかんなくなって残念なことに

昨日は牡蠣とかお好み焼も食べました
lafla社長に食べさせていただきました

広島いいっすね