分类 工作备忘 下的文章

最近有个lbs相关的项目,要求向用户位置推荐周边的(DB中的)已有地标。数据取自GPS的坐标系经纬度。是个典型求两点距离最优解的命题。
(需求接近于“滴滴拉屎”,自行脑洞一下)

备选的实现方向有:

  1. 使用地图服务商(例如百度地图、腾讯地图)提供的测距API计算 —— 缺点:不适合进行大量的计算,依赖第三方API业务稳定性有不可控,有网络请求延迟;
  2. 在后端脚本中进行计算 —— 缺点:每次查询需要取出数据库中全部地标数据,还需要自行实现排序结构化计算结果
  3. 在数据库中进行计算排序 —— 缺点:加重DB负担

衡量利弊后,似乎#3是比较理想的方案,于是找到了以下这个

《mysql 下 计算 两点 经纬度 之间的距离》
https://www.cnblogs.com/u0mo5/p/4260382.html

算法如下

round(6378.138*2*asin(sqrt(pow(sin( (`lat1`*pi()/180-`lat2`*pi()/180)/2),2)+cos(`lat1`*pi()/180)*cos(`lat2`*pi()/180)* pow(sin( (`lon1`*pi()/180-`lon2`*pi()/180)/2),2)))*1000)

验证的demo

#113.348407,22.968607 //lat, lon
#113.333603,22.973731 //地图距离1.6km

SELECT round(6378.138*2*asin(sqrt(pow(sin( (113.348407*pi()/180-113.333603*pi()/180)/2),2)+cos(113.348407*pi()/180)*cos(113.333603*pi()/180)* pow(sin( (22.968607*pi()/180-22.973731*pi()/180)/2),2)))*1000) as dist_m
dist_m
1663

经过验证计算结果和地图上直接测距一致, 单位 米

补充
初期的地标库比较小只有一百多条,所以直接用上面的sql便可以满足。若今后地标数据扩大,也会面临计算量大mysql计算负荷重的问题(需要计算后再排序,索引对提升速度无效)。届时进行的优化措施可以把坐标点按经纬度划分成若干间距的网格,仅在用户坐标的网格内(或加上周边一共9个网格内)进行检索,可以有效缩减计算量。
毕竟,如果我在北京王府井人有三急,我知道阿姆斯特丹有豪华六星厕所也没意义(笑)

几个月前尝试给台mini升级系统才发现已经惨遭apple抛弃。

QQ截图20190407185719.jpg

之后便一直闲置在一旁,直到最近在油管偶然发现有民间大神自己写了个安装补丁,可以手动升级旧款机型到最新系统,不仅限于macmini 还有旧型号的macbook,mac pro等笔电和台式。
之所以要把OS升级上去是因为很多开发环境不跟进升级无法开发编译出与最新iOS兼容的app。好了废话不多说,以下是升级全程的流水账。

(大多数是按照补丁作者官网的教程和描述执行,所以下文打多是官网的翻译归纳加我的一些截图)

准备

  • 一个16G或以上的空U盘
  • 比对补丁网站的兼容列表确认你的设备可以升级
  • 确保你当前的系统硬盘剩余空间有100G以上(升级安装,如果是完全重装可忽略这个条件)
  • 下载安装补丁
  • 下载mac os的安装文件

操作流程

1.下载mac os安装镜像
打开补丁,工具栏选 tools 可以直接从appstore下载安装镜像,选择保存路径后等待漫长的下载,大约6.5G
QQ截图20190407194242.jpg

2.格式化U盘
等待下载镜像的同时进入 launchpad - 其他 - 磁盘工具 格式化U盘

QQ截图20190407191303.jpg

选择u盘,抹掉,格式 Mac OS 扩展(日志式)

QQ截图20190407191617.jpg

3.写入U盘
下载完后回到补丁工具的界面刷新选择写入的设备,选择刚格式的U盘,点 Start Operation... 开始写入和打补丁,由于我的macmini是机械硬盘加usb2.0过程非常漫长

4.重启安装
完成后重启,启动时按住 键盘的 Option 键(104布局windows键盘为 Alt 键) 出现选择启动设备,选U盘
QQ截图20190407212206.jpg

QQ截图20190407212227.jpg

引导后同意协议,选择写入的分区,选已有的mac OS的硬盘,一路next 和等待(超慢,大约3个多小时)
QQ截图20190407212148.jpg

5.打上补丁
再次重启进入U盘,这次执行macOS Post Install , 选择对应的机型和分区,点 Patch 打补丁,完成后再一次重启,拔掉U盘

选择机型时,补丁程序已经很贴心的代你检测了,如果不确定是哪个的话参考文末的apple macmini 产品列表链接

QQ截图20190407221357.jpg

最后一次的reboot 需要 rebuild cache 也是需要略长时间的。

QQ截图20190407231004.jpg
完成

附一张完全体的截屏,证明旧版系统的用户数据被完美保留了下来
QQ截图20190407231500.jpg

最后

这个补丁的作者真的太良心了,竟然还有后续的跟踪服务,如果apple有更新发现与老机器不兼容会有个补丁更新程序随版本更新,点10086个赞!
QQ截图20190407230930.jpg

注意事项

  • 如果你的设备很新直接appstore就可以升级,那请不要折腾请走官网
  • 如果你的设备很旧连这个补丁也无能为力(多数是2007年以前发布的机器)那请放弃,即便勉强升级了10年前的硬件估计体验也很糟糕吧?
  • 注意看补丁网站的changelog , 大意是如果安装 10.14.4 务必用最新版的补丁工具,旧版已不能使用。万恶苹果与良心大神的战争仍在继续..
  • 第4步,作者说只要选择当前系统相同的分区便是执行升级安装(注意预留足够的可用空间),如果需要完全重装则多一道工序安装之前用磁盘工具对分区进行抹除

参考链接

这一段是铺垫,可跳过

想在树莓派上运行脚本监控自己的几个节点工作情况、跑交易机器人监控交易所报价以及做一些价格报警。当中要链接许多海外的网站、IP,由于机器在墙内,所以很多时候访问稳定性欠佳,于是需要派通过ss连国外的vps代理访问。而网上查出来的很容易会被误导装了 ss的服务端  “shadowsocks-libev”, 但我真正需要的是客户端。安装后也只是给派自己链接用,当然可以修改配置之后作为局域网内的一个代理节点,让其他机器都可以通过树莓派转发翻墙,这是后话本文并不提及。

前提

  1. 有台树莓派(我用的是树莓派 3B+,用其他型号也可以,甚至不用树莓派改用其他开发板甚至PC、服务器都可以,只要是能运行python的机器)
  2. 已经部署好或者有可用的 ss 服务器资源(可以自己租一台国外的VPS部署)。

下载安装

cd ~
sudo apt-get install python-pip python-gevent python-m2crypto
sudo pip install shadowsocks

配置

sudo vi /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py

修改 52行和111行,改cleanup 为 reset, 如图(备注了原句复制这行,改写成reset)

编写配置文件,我把配置文件保存在 /home/download/sslocal/config.json 路径随意,只要不放在 /tmp ,重启后不会丢失就行。注意这个路径下文运行的时候要对应。内容如下(注意去掉全部注释)

{
"server":"123.45.67.89", //你的SS(VPS)服务器IP
"server_port":50000, //替换成ss服务的端口 
"local_address":"0.0.0.0", //写 0.0.0.0不限使用者 或 127.0.0.1 供本机使用
"local_port":1080, //不用改
"password":"123456", //ss服务密码
"timeout":600,
"method":"aes-256-cfb" //和ss服务的加密算法对应,一般是这个
}

运行

保持在后台运行的方法

sudo nohup python /usr/local/bin/sslocal -c /home/download/sslocal/config.json &

推荐把这行写成一个 run_ss.sh 并添加执行权限,以后重启后只需要运行这个 sh 就可以启动了

服务启动后,监控运行状态,在执行运行命令行的路径下

tail –f nohup.out

树莓派的curl请求或可以设置代理的程序设置代理:

IP 127.0.0.1
端口 1080
类型 SOCKS5