Geographicalビヘイビアでの緯度、経度のフィールドの精度

DoctrineのGeographicalビヘイビアは便利で好きなんだけど、
普通にschema.ymlで

Place:
  actAs: 
    - Timestampable
    - SoftDelete
    - Geographical
....

とやるとbuildされるテーブルはこんな感じになる。

CREATE TABLE `place` (
(snip)
  `latitude` double(18,2) DEFAULT NULL,
  `longitude` double(18,2) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`buillding_id`)
) ENGINE=InnoDB ;

この状態だとGoogleマップなんかを扱うと精度が不足してかなり残念な感じになってしまう。
小数点以下の桁があともう少し欲しい。

で、調べてみた。

actAsにGeographicalを指定したときに生成されるCREATE TABLE文のプロパティは

/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Template/Geographical.php

    /**
     * Array of geographical options
     *
     * @var string
     */
    protected $_options = array('latitude' =>  array('name'     =>  'latitude',
                                                     'type'     =>  'double',
                                                     'size'     =>  null,
                                                     'options'  =>  array()),
                                'longitude' => array('name'     =>  'longitude',
                                                     'type'     =>  'double',
                                                     'size'     =>  null,
                                                     'options'  =>  array()));

この辺で設定されている。

生成されるフィールドの精度が

`latitude` double(18,2) DEFAULT NULL,

になるのはDoctrineでフィールド型にdoubleを指定したときのデフォルトがそうなっているからなんだろう。

ここで
$_options['latitude']['type']
の値を変えると生成されるテーブルのフィールド型も変わる。

これを最初のyamlで指定するには

Place:
  actAs: 
    - Timestampable
    - SoftDelete
    Geographical: 
      latitude:
        type: double(10,7)
      longitude:
        type: double(10,7)
....

とする。

緯度は±90度まで、経度は±180度までの値しか入らないからこの辺でいいと思う。

validatorとかどうなるのかは未検証。これからやろう。

とりあえず、めでたし。

でも浮動小数点は丸めが入るので、本当はテキストの方が意図した値がちゃんと入って良かったりするのでは、とか思ったり。

これ、ちゃんと探したらまたどっかに書いてあったりするのかなぁ・・・

Scientific LinuxにMySQL5.5をインストール

今までは普通にCentOSを使ってたんだけど、
RHEL6のクローンはScientific Linuxが良いらしいので
試しに環境を作ってみる。

MySQLyum でインストールしようとすると、

# yum info mysql
Version : 5.1.52

なんだけど5.5で行きたいので
http://www-jp.mysql.com/downloads/mysql/
からrpmを持ってきてインストール。

ところが

# rpm -ivh --test MySQL-server-5.5.19-1.linux2.6.x86_64.rpm

としようとするとずらずら〜っと

準備中... ########################################### [100%]
ファイル /usr/share/mysql/charsets/README (パッケージ MySQL-server-5.5.19-1.linux2.6.x86_64 から) は、パッケージ mysql-libs-5.1.52-1.el6_0.1.x86_64 からのファイルと競合しています。
ファイル /usr/share/mysql/charsets/Index.xml (パッケージ MySQL-server-5.5.19-1.linux2.6.x86_64 から) は、パッケージ mysql-libs-5.1.52-1.el6_0.1.x86_64 からのファイルと競合しています。

と怒られる。

素の状態のOSにはmysqlはいれていない筈なんだけど・・・と思いきや、

# rpm -qa | grep mysql
mysql-libs-5.1.52-1.el6_0.1.x86_64

がいるので削除しようと・・・

# yum remove mysql-libs

========================================================================================================================
Package Arch Version Repository Size
========================================================================================================================
Removing:
mysql-libs x86_64 5.1.52-1.el6_0.1 @anaconda-ScientificLinux-201107271550.x86_64 4.0 M
Removing for dependencies:
cronie x86_64 1.4.4-7.el6 @anaconda-ScientificLinux-201107271550.x86_64 166 k
cronie-anacron x86_64 1.4.4-7.el6 @anaconda-ScientificLinux-201107271550.x86_64 43 k
crontabs noarch 1.10-32.1.el6 @anaconda-ScientificLinux-201107271550.x86_64 2.4 k
postfix x86_64 2:2.6.6-2.1.el6_0 @anaconda-ScientificLinux-201107271550.x86_64 9.7 M
postfix x86_64 2:2.6.6-2.2.el6_1 installed 9.7 M
sysstat x86_64 9.0.4-18.el6 @anaconda-ScientificLinux-201107271550.x86_64 805 k

Transaction Summary
========================================================================================================================
Remove 7 Package(s)

Installed size: 24 M
Is this ok [y/N]:

いやいや、そりゃないでしょ
cronとかMTAとか消しちゃうなんて・・・
sysstatが無いのも困る。

で、いろいろ調べてみるんだけどあまりグッとくる解決策がない。

  • mysqlは5.1であきらめる
  • remi ェ・・・

(なんとなくremi使うのって負けな気がする)

id:sh2 さんの
http://d.hatena.ne.jp/sh2/20110720
はとても参考になったけど、今回は外部リポジトリに頼らず、
CentOSにもubuntuにも行かずにMySQL5.5にこだわって頑張る。
CentOSではこんな苦労せずに、すんなり入りますよね?)

で、もうちょっと掘ってみる。

# yum deplist postfix | grep mysql
dependency: libmysqlclient.so.16()(64bit)
provider: mysql-libs.x86_64 5.1.52-1.el6_0.1
dependency: libmysqlclient.so.16(libmysqlclient_16)(64bit)
provider: mysql-libs.x86_64 5.1.52-1.el6_0.1
dependency: mysql-libs
provider: mysql-libs.i686 5.1.52-1.el6_0.1
provider: mysql-libs.x86_64 5.1.52-1.el6_0.1
dependency: libmysqlclient.so.16()(64bit)
provider: mysql-libs.x86_64 5.1.52-1.el6_0.1
dependency: libmysqlclient.so.16(libmysqlclient_16)(64bit)
provider: mysql-libs.x86_64 5.1.52-1.el6_0.1
dependency: mysql-libs
provider: mysql-libs.i686 5.1.52-1.el6_0.1

こんな感じでmysql-libsに直接依存してるのはpostfix(え
で、依存関係は

という感じで想像。

mysql-libsの中身はというと、

# rpm -ql mysql-libs
/etc/ld.so.conf.d/mysql-x86_64.conf
/etc/my.cnf
/usr/lib64/mysql
/usr/lib64/mysql/libmysqlclient.so.16
/usr/lib64/mysql/libmysqlclient.so.16.0.0
/usr/lib64/mysql/libmysqlclient_r.so.16
/usr/lib64/mysql/libmysqlclient_r.so.16.0.0
以下、コピーライトと各種言語(i18n)関係

なので、my.cnfはともかく

libmysqlclient.so.16

があれば良し、と踏む。

なので、

  1. mysql-libsを削除
  2. 依存してるライブラリもとりあえずサヨナラ
  3. libmysqllient.soはMySQL-sharedのrpmで入るのでおk
  4. libmysqllientのバージョン違いはシンボリックリンクで試してみる
  5. その後、サヨナラしたライブラリを再インストール

という方針。

# yum remove mysql-libs
mysql-libs,cronie,cronie-anacron,crontabs,postfix,sysstatを削除)
(/etc/postfix/main.cf は退避されるのであとで復帰する)
# rpm -ivh MySQL-server-5.5.19-1.linux2.6.x86_64.rpm
# rpm -ivh MySQL-devel-5.5.19-1.linux2.6.x86_64.rpm
# rpm -ivh MySQL-client-5.5.19-1.linux2.6.x86_64.rpm
# rpm -ivh MySQL-shared-5.5.19-1.linux2.6.x86_64.rpm
# rpm -ivh MySQL-test-5.5.19-1.linux2.6.x86_64.rpm

で、

# yum install cronie
(cronie,cronie-anacron,crontabsがインストールされる)
# yum install sysstat

ここまでやって、

# yum install postfix

はやっぱりmysql-libs欲しいと言われるので、
ちょっと気持ち悪くて嫌だけど強引に

# yumdownloader postfix
# rpm -ivh --nodeps postfix-2.6.6-2.2.el6_1.x86_64.rpm

libmysqlclientは

# ls -la /usr/lib64/libmysqlclient*
lrwxrwxrwx. 1 root root 20 12月 20 19:32 2011 /usr/lib64/libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx. 1 root root 24 12月 20 19:32 2011 /usr/lib64/libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
rwxr-xr-x. 1 root root 6856547 11月 24 00:14 2011 /usr/lib64/libmysqlclient.so.18.0.0
lrwxrwxrwx. 1 root root 17 12月 20 19:32 2011 /usr/lib64/libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx. 1 root root 17 12月 20 19:32 2011 /usr/lib64/libmysqlclient_r.so.18 -> libmysqlclient.so
lrwxrwxrwx. 1 root root 17 12月 20 19:32 2011 /usr/lib64/libmysqlclient_r.so.18.0.0 -> libmysqlclient.so

な感じで、

  • libmysqlclient.so.18 は入っている
  • 欲しいのはlibmysqlclient.so.16

とりあえずシンボリックリンクで。

# ln -s /usr/lib64/libmysqlclient.so /usr/lib64/libmysqlclient.so.16

とするとpostfixも動く。

MySQLダウンロードサイトにある
Connector/C 6.0.2
でもlibmysqlclientは入手できるんで展開して見てみたんだけど
libmysqlclientのバージョンが解らないんだよね・・・
(ひょっとしたらこれも16ではないかと思うんだけど)

# ls -la mysql-connector-c-6.0.2-linux-glibc2.3-x86-64bit/lib/
合計 12756
drwxr-xr-x. 2 root root 4096 12月 20 19:28 2011 .
drwxr-xr-x. 5 root root 4096 12月 20 19:28 2011 ..
lrwxrwxrwx. 1 7158 wheel 14 12月 20 19:28 2011 libmysql.so -> libmysql.so.16
lrwxrwxrwx. 1 7158 wheel 18 12月 20 19:28 2011 libmysql.so.16 -> libmysql.so.16.0.0
-rwxr-xr-x. 1 7158 wheel 4851331 8月 8 01:48 2009 libmysql.so.16.0.0
-rw-r--r--. 1 7158 wheel 8199192 8月 8 01:49 2009 libmysqlclient.a
lrwxrwxrwx. 1 7158 wheel 11 12月 20 19:28 2011 libmysqlclient.so -> libmysql.so
lrwxrwxrwx. 1 7158 wheel 11 12月 20 19:28 2011 libmysqlclient_r.so -> libmysql.so


また他にmysql-libsに依存したライブラリが出てきたらどうしようかなぁ・・・


追記。
やっぱり気持ち悪いので
http://pkgs.org/download/libmysqlclient.so.16(libmysqlclient_16)(64bit)
この辺りからmysqlclientのrpmを落として入れました。


追記その2。(2012/04/24)
MySQLrpmが更新されて、5.5.23からはこんなことしなくて良くなったようです。
@nakashii_ さんがブログに書かれています。
http://oopsops.hatenablog.com/entry/2012/04/24/214759