mysql 根据经纬度和距离筛选数据

先根据经纬度和距离计算一个矩形,然后筛选经纬度在矩形范围内的数据。

/**
 *
 * @param Select $select            
 * @param string $columnName            
 * @param string $longitude            
 * @param string $latitude            
 * @param int $distance
 *            metre
 * @return string
 */
static function ST_MBRWithinRectangle(Select $select, $columnName, 
    $longitude, $latitude, $distance)
{
    list ($min, $max) = self::rectangle($longitude, $latitude, $distance);
    $where = "$columnName!=PointFromText('Point(0 0)') and $columnName!='' and";
    $where .= " ST_MBRWithin(`$columnName`,ST_GeomFromText('Polygon(($min[0] $min[1],";
    $where .= "$min[0] $max[1],$max[0] $max[1],$max[0] $min[1],$min[0] $min[1]))'))";
    $select->where($where);
}

/**
 * get rectangle longitude and latitude
 *
 * @param float $longitude
 * @param float $latitude
 * @param integer $distance
 *            meter
 * @return array
 */
static function rectangle($longitude, $latitude, $distance)
{
    $radius = 6371 * 1000;
    // latitude boundaries
    $maxlat = $latitude + rad2deg($distance / $radius);
    $minlat = $latitude - rad2deg($distance / $radius);
    // longitude boundaries (longitude gets smaller when latitude increases)
    $maxlng = $longitude +
         rad2deg($distance / $radius / cos(deg2rad($latitude)));
    $minlng = $longitude -
         rad2deg($distance / $radius / cos(deg2rad($latitude)));
    return array(
        array(
            'lng' => $minlng,
            'lat' => $minlat
        ),
        array(
            'lng' => $maxlng,
            'lat' => $maxlat
        )
    );
}

 

freefilersync和rsync解决不同mac机器本地文件同步问题

场景如下:

shadowssocks 用户PAC需要不同机器全自动同步(通过iCloud),shadowssocks用户pac没有相关配置文件指定配置目录,默认在$HOME/.ShadowsocksX-NG/user-rule.txt。使用硬链接或硬链接套软连接都不行,因为通过shadowsocks内部修改user-rule.txt会导致文件inode变化,inode>1通过vi修改不会导致inode变化,但是icloud同步文件inode会变化,结论:只能通过外部实现。

mac下比较著名的是goodSync,大家伙100Mb,破解版安装也是非常麻烦,因为没安装成功,找到了一个更好的软件,freeFileRsync,内部有一个RealTimeSync可以完美达到目的。

需要解决的问题是

  1. iCloud死循环
  2. RealTimeSync自身死循环
  3. RealTimeSync命令中rsync死循环。

1的产生主要是由于3,2通过修改空闲时间解决(应该大于命令执行时间即可,默认10是个不错的选择),3通过 tu参数解决。

命令行:

rsync -tu /Users/Ares/.ShadowsocksX-NG/user-rule.txt /Users/Ares/Library/Mobile\ Documents/com~apple~CloudDocs/Ares/Document/shadowsocks/user-rule.txt;rsync -tu /Users/Ares/Library/Mobile\ Documents/com~apple~CloudDocs/Ares/Document/shadowsocks/user-rule.txt /Users/Ares/.ShadowsocksX-NG/user-rule.txt

所有需要同步的机器上都配置相同的RealTimeSync即可。

本套环境的强大之处在于可以同步任意非iCloud文件。

freeFileSync下载:

https://www.freefilesync.org/download.php

mac 下 rsync + fswatch 自动同步

mac 下没有inotifywait,替代品是fswatch,brewhome安装。

#!/usr/bin/env bash
dirPrefixPhp='/Users/Ares/Documents/Work/php'
excludeCommon="app/cache/* app/logs/* app/runtime/*"
projectArr[0]=$dirPrefixPhp'/ald/xxx1'
projectArr[1]=$dirPrefixPhp'/ald/xxx2'
projectArr[2]=$dirPrefixPhp'/ald/xxx3'
rsyncArr[0]='-e "ssh -p222" root@ip0:/srv/www/xxx1'
rsyncArr[1]='-e "ssh -p222" root@ip1:/srv/www/xxx2'
rsyncArr[2]='root@ip2:/srv/www/xxx2'
#wild card,seperated by space
exclude[0]='public/_captcha/*'
exclude[2]='system/caches/*'
watchArgs=$*
if [ -z "$watchArgs" ];then
	watchArgs='.'
fi
fswatch --exclude=\\.git --exclude=\\.svn --exclude=\\.settings --exclude=\\.project --exclude=\\.buildpath $watchArgs|while read v;do
	if [ ! -e $v ];then
		continue
	fi
	for k1 in ${!projectArr[*]};do
		dirPrefix=${projectArr[$k1]}
		if [ "${v:0:${#dirPrefix}}" = "$dirPrefix" ];then
			path=${v#$dirPrefix}
			excludeK1=($excludeCommon' '${exclude[$k1]})
			if [ -n "$excludeK1" ];then
				for v2 in ${excludeK1[*]};do
					if [[ "${path:1}" == $v2 ]];then
						break 2
					fi
				done
			fi
			rsync='rsync -avz -R --chown apache:apache'
			rsync="cd ${projectArr[$k1]} && "$rsync' .'$path' '${rsyncArr[$k1]}' --no-p --no-t'
			dst=${rsyncArr[$k1]#*@}
			#dst=${dst%:*}
			#echo -n '['`date +%H:%M:%S`'] '${projectArr[$k1]##*/}$path' => '$dst
			echo -n '['`date +%H:%M:%S`'] '$k1 $dst$path
			time=$( (time eval $rsync > /dev/null) 2>&1|head -n2|tail -n1|cut -f2)
			if [ 0 -eq $? ];then
				echo -ne " \033[32mOK\033[0m"
			else
				echo -ne " \033[31mFAILED\033[0m"
			fi
			echo '('${time:2}')'
		fi
	done
done

 

Mac ZendStudio 字体过小问题解决

Mac下ZendStudio有个问题,项目列表字体巨小无比,大显示器上没法看。解决办法如下:

Finder->应用程序 找到 Zend Studio点右键,显示包内容,进入Contents->Eclipse,编辑ZendStudio.ini,找到

-Dorg.eclipse.swt.internal.carbon.smallFonts

这一行,最前面加#注释掉,重启Zend Studio即可。