javascriptで配列内にある特定の値が存在するかチェックしようと思ったわけです。
var otomo = ['inu','saru','kiji'];
とあった場合、配列otomoが値'saru'を持つかを確認するような感じです。
rubyなどではindexを使えだけなのですが、javascriptではこのindexに相当するような関数がぱっとみ見つかりませんでした。
でも困ったときのjQueryということでjQueryのほうを調べたら
inArray
があるということがわかりました。
$.inArray("saru", otomo)
みたいな感じで使えます。
詳しくは、以下を見てみてください。
http://f32.aaa.livedoor.jp/~azusa/?t=ajax&p=jquery_utilities_array_object_operations#a_jquery_utilities_inarray
2010-06-21
2010-06-20
pythonさんでジオコーディングと逆ジオコーディング V3
以前、
pythonさんでジオコーディングと逆ジオコーディング
というのを書きましたが、いつまにかGoogle map apiがV3になっていました。
V3になって、Google Map APIを利用するためのキーが必要なくなりました。
なので、V3版で場所の名前から緯度経度取得するジオコーディングとその逆をpythonでやってみました。
Google map api V3でのジオコーディングに関しては、
http://code.google.com/intl/en/apis/maps/documentation/geocoding/
に書いてあります。
コードは以下のような感じです。
google app engineで利用することを前提にしているので
urlfetchを使っていますが、そうでないならばそこを置き換える必要があります。
jsonのパーサーも場合によって変更が必要だと思います。
pythonさんでジオコーディングと逆ジオコーディング
というのを書きましたが、いつまにかGoogle map apiがV3になっていました。
V3になって、Google Map APIを利用するためのキーが必要なくなりました。
なので、V3版で場所の名前から緯度経度取得するジオコーディングとその逆をpythonでやってみました。
Google map api V3でのジオコーディングに関しては、
http://code.google.com/intl/en/apis/maps/documentation/geocoding/
に書いてあります。
コードは以下のような感じです。
google app engineで利用することを前提にしているので
urlfetchを使っていますが、そうでないならばそこを置き換える必要があります。
jsonのパーサーも場合によって変更が必要だと思います。
import urllib
from google.appengine.api import urlfetch
import django.utils.simplejson as json
from django.conf import settings
#場所名から緯度経度取得
def geocoding(addr):
url = 'http://maps.google.com/maps/api/geocode/json?'
url = url + '&language=ja&sensor=false®ion=ja'
url = url + '&address=' + urllib.quote(addr.encode('utf-8'))
result = urlfetch.fetch(url)
if result.status_code != 200:
return None
obj = json.loads(result.content)
if obj["status"] != "OK":
return None
ret = {}
ret['lon'] = str(obj["results"][0]["geometry"]["location"]["lng"])
ret['lat'] = str(obj["results"][0]["geometry"]["location"]["lat"])
return ret
#緯度経度から場所名取得
def regeocoding(lat,lon):
url = 'http://maps.google.com/maps/api/geocode/json?'
url = url + '&language=ja&sensor=false®ion=ja'
url = url + '&latlng=' + str(lat) + ',' + str(lon)
result = urlfetch.fetch(url)
if result.status_code != 200:
return None
obj = json.loads(result.content)
if obj["status"] != "OK":
return None
addr = None
for result in obj["results"]:
if "sublocality" in result["types"]:
addr = result["formatted_address"]
addr = addr.replace(u'日本, ', '', 1)
break
return addr
2010-06-10
mysqlで4月始まりの年度情報などを得るためのsql
mysqlで4月始まりの年度情報を得るsqlです。
2010年3月でも2009が欲しいという場合のときに使います。
now()のところを適宜書き換えてください。
また、指定日が第何四半期にあたるかを得るsqlです。
4月~6月を第1四半期、1月~3月を第4四半期としたい場合です。
now()のところを適宜書き換えてください。
2010年3月でも2009が欲しいという場合のときに使います。
select case when month(now()) > 4 then year(now()) else year(now())-1 end;
now()のところを適宜書き換えてください。
また、指定日が第何四半期にあたるかを得るsqlです。
4月~6月を第1四半期、1月~3月を第4四半期としたい場合です。
select quarter(now() -interval 1 quarter)
now()のところを適宜書き換えてください。
2010-06-06
JapaninoのPOV用データをテキストから作る
Japaninoとは、大人の科学vol.27のおまけのArduino互換8bitマイコンです。
大人の科学vo.27ではPOVと言われる光残像で文字を書くキットが付属しています。
なかなか楽しげなのですが、ちょっと面倒なのが文字データを作ることです。
なのでテキストからこのJapaninoのPOV用データを作成するものをつくってみました。
Txt2Pov
使い方は、
テキストボックス(ABC)と書いてあるところに好きな文字(10文字まで)を入れてデータ作成のボタンを押します。
すると作成されたPOVデータイメージが表示されます。
あわせてテキストエリアにPOV用データが表示されます。
POV用データイメージはクリックすると反転して微調整できます。
テキストエリアのデータをコピーしてJapaninoのPOVサンプルデータのデータ部分を書き換えればOKです。
やっていることはActionScriptで、
・テキストを画像に変換
・変換された画像をピクセル単位で解析
をしてデータを作成してます。
抜粋版のソースを、
http://wonderfl.net/c/aBqZ
に置いておきました。
Txt2Povは、Japanino用のデータになっていますのが、http://wonderfl.net/c/aBqZを書き換えれば他のデータ形式のものを作成できると思います。
本当は、サーバー側にテキストデータを投げれば、POVデータが帰ってくる感じのWebサービスをGoogle App Engine上で創ってみようと思ったのですが、Google App Engineに用意されている画像操作系の機能ではちょっとできそうもない感じでした。
自前でサーバを持っていればPHPとかで比較的容易に実装できそうな感じではあります。
次は、HTML5でいろいろできる感じだと思ったので、Javascriptで実装しようと思ったのですが、
画像操作系のやり方がいまいちわからず挫折。
というわけでflashでやってみました。
大人の科学vo.27ではPOVと言われる光残像で文字を書くキットが付属しています。
なかなか楽しげなのですが、ちょっと面倒なのが文字データを作ることです。
なのでテキストからこのJapaninoのPOV用データを作成するものをつくってみました。
Txt2Pov
使い方は、
テキストボックス(ABC)と書いてあるところに好きな文字(10文字まで)を入れてデータ作成のボタンを押します。
すると作成されたPOVデータイメージが表示されます。
あわせてテキストエリアにPOV用データが表示されます。
POV用データイメージはクリックすると反転して微調整できます。
テキストエリアのデータをコピーしてJapaninoのPOVサンプルデータのデータ部分を書き換えればOKです。
やっていることはActionScriptで、
・テキストを画像に変換
・変換された画像をピクセル単位で解析
をしてデータを作成してます。
抜粋版のソースを、
http://wonderfl.net/c/aBqZ
に置いておきました。
Txt2Povは、Japanino用のデータになっていますのが、http://wonderfl.net/c/aBqZを書き換えれば他のデータ形式のものを作成できると思います。
本当は、サーバー側にテキストデータを投げれば、POVデータが帰ってくる感じのWebサービスをGoogle App Engine上で創ってみようと思ったのですが、Google App Engineに用意されている画像操作系の機能ではちょっとできそうもない感じでした。
自前でサーバを持っていればPHPとかで比較的容易に実装できそうな感じではあります。
次は、HTML5でいろいろできる感じだと思ったので、Javascriptで実装しようと思ったのですが、
画像操作系のやり方がいまいちわからず挫折。
というわけでflashでやってみました。
2010-06-01
InfiniDBを使ってみる
InfiniDBは列指向型DBと言われるもので、データウェアハウスなどの大量データの扱いにすぐれているようです。
特長は、mysqlのストレージエンジンとして実装されていて各種sqlでデータ操作ができるということです。
なのでアプリケーションは作りやすいそうな感じです。
詳しくは、
http://www.infinidb.org/
をご覧ください。
というわけで試してみました。
CentOS5.4(32bit版)へインストールしてみました。
手順は、以下のような感じです。
ルートで行います。
su
boostというものが別途必要な感じです。
yum install boost
ダウンロードしてインストールします。
wget http://infinidb.org/downloads/doc_download/203-105-final-32-bit-rpms
tar xvzf 203-105-final-32-bit-rpms
rpm -ivh calpont*.rpm
すでにmysqlが動いている環境にインストールしたので利用ポートの変更とutf-8の設定を行います。
vi /usr/local/Calpont/mysql/my.cnf
3306としている部分を3366なりに変更します。
また、[mysqld]と[mysql]のセクションに
default-character-set=utf8
を追加します。
なんかスクリプトを流します。
/usr/local/Calpont/bin/install-infinidb.sh
InfiniDB用のmysqlクライアントを用意します。
vi /usr/local/bin/idbmysql
------------------------------
#!/bin/bash
/usr/local/Calpont/mysql/bin/mysql --defaults-file=/usr/local/Calpont/
mysql/my.cnf $*
------------------------------
chmod 755 /usr/local/bin/idbmysql
これで完了です。
起動終了は、
/etc/init.d/infinidb start
/etc/init.d/infinidb stop
になります。
データベースの作成は通常のmysqlと変わりません。
idbmysql -u root
create database ttt;
use ttt;
テーブルもストレージエンジンにInfiniDBと指定することで作成できます。
ただしindexをつけることができませんし、PKを含めNOT NULLなどの制約も利用できません。
indexは実質不要でよいようなのですが、制約がかけられないのはちょっと面倒かもしれません。
とりあえず性能を比較してみました。
同じマシンで通常のmysql(InnoDB)とInfiniDBの両方を動かして
以下のようなテーブルを用意します。
TABLE名(tttt)
id:int InnoDBではPKにします。
code:varchar(16) InnoDBではindexを張ります。
amount:int
val:varchar(255)
このテーブルに40万件ほどデータを入れておきます。
それぞれに対して同じsqlを発行した結果です。
(1)select count(*) from tttt;
InnoDB:4.78 sec
InfiniDB:0.73 sec
(2)select sum(amount) from tttt;
InnoDB:3.06 sec
InfiniDB:0.38 sec
(3)select code,sum(amount) from tttt group by code;
InnoDB:6.72 sec
InfiniDB:1.07 sec
(4)select count(*) from tttt where code='AAAA';
InnoDB:0.29 sec
InfiniDB:0.47 sec
(5)select * from tttt where code='AAAA' limit 1;
InnoDB:0.00 sec
InfiniDB:6.91 sec
(6)select count(*) from tttt where val='test';
InnoDB:2.73 sec
InfiniDB:0.43 sec
(7)select count(*) from tttt where val like '%es%';
InnoDB:4.08 sec
InfiniDB:0.48 sec
確かにselectは、速い感じで確かにデータウェアハウスとかに適していそうな感じです。
そのうち使ってみてもよいかもと思ってみたりしてみました。
特長は、mysqlのストレージエンジンとして実装されていて各種sqlでデータ操作ができるということです。
なのでアプリケーションは作りやすいそうな感じです。
詳しくは、
http://www.infinidb.org/
をご覧ください。
というわけで試してみました。
CentOS5.4(32bit版)へインストールしてみました。
手順は、以下のような感じです。
ルートで行います。
su
boostというものが別途必要な感じです。
yum install boost
ダウンロードしてインストールします。
wget http://infinidb.org/downloads/doc_download/203-105-final-32-bit-rpms
tar xvzf 203-105-final-32-bit-rpms
rpm -ivh calpont*.rpm
すでにmysqlが動いている環境にインストールしたので利用ポートの変更とutf-8の設定を行います。
vi /usr/local/Calpont/mysql/my.cnf
3306としている部分を3366なりに変更します。
また、[mysqld]と[mysql]のセクションに
default-character-set=utf8
を追加します。
なんかスクリプトを流します。
/usr/local/Calpont/bin/install-infinidb.sh
InfiniDB用のmysqlクライアントを用意します。
vi /usr/local/bin/idbmysql
------------------------------
#!/bin/bash
/usr/local/Calpont/mysql/bin/mysql --defaults-file=/usr/local/Calpont/
mysql/my.cnf $*
------------------------------
chmod 755 /usr/local/bin/idbmysql
これで完了です。
起動終了は、
/etc/init.d/infinidb start
/etc/init.d/infinidb stop
になります。
データベースの作成は通常のmysqlと変わりません。
idbmysql -u root
create database ttt;
use ttt;
テーブルもストレージエンジンにInfiniDBと指定することで作成できます。
ただしindexをつけることができませんし、PKを含めNOT NULLなどの制約も利用できません。
indexは実質不要でよいようなのですが、制約がかけられないのはちょっと面倒かもしれません。
とりあえず性能を比較してみました。
同じマシンで通常のmysql(InnoDB)とInfiniDBの両方を動かして
以下のようなテーブルを用意します。
TABLE名(tttt)
id:int InnoDBではPKにします。
code:varchar(16) InnoDBではindexを張ります。
amount:int
val:varchar(255)
このテーブルに40万件ほどデータを入れておきます。
それぞれに対して同じsqlを発行した結果です。
(1)select count(*) from tttt;
InnoDB:4.78 sec
InfiniDB:0.73 sec
(2)select sum(amount) from tttt;
InnoDB:3.06 sec
InfiniDB:0.38 sec
(3)select code,sum(amount) from tttt group by code;
InnoDB:6.72 sec
InfiniDB:1.07 sec
(4)select count(*) from tttt where code='AAAA';
InnoDB:0.29 sec
InfiniDB:0.47 sec
(5)select * from tttt where code='AAAA' limit 1;
InnoDB:0.00 sec
InfiniDB:6.91 sec
(6)select count(*) from tttt where val='test';
InnoDB:2.73 sec
InfiniDB:0.43 sec
(7)select count(*) from tttt where val like '%es%';
InnoDB:4.08 sec
InfiniDB:0.48 sec
確かにselectは、速い感じで確かにデータウェアハウスとかに適していそうな感じです。
そのうち使ってみてもよいかもと思ってみたりしてみました。