计算 一个点 附近的地方

问题

随着地理位置的应用普及,越来越多类似计算 一个点 附近的酒店的需求。比如,显示当前位置2000米范围内的 7 天酒店。

一般来说,在系统里都有一张表,存储了每个 7 天酒店的位置信息,表结构可以简化为三个字段 tb_location(ID, lng, lat),其中 lng:表示经度;lat:表示纬度,这两个字段都是数值类型的,且建了索引。

现在要把 2 公里范围内的 7 天酒店找出来,有的人写的 SQL 语句大概是这样的:
select id from tb_location where calc_distance(lng, lat, curLng, curLat) < 2000

这个语句的问题是没法利用索引,需要全表扫描,计算每一条记录与当前位置的距离,效率很低。

优化

用一张图来说明优化策略:
附近地点计算优化

继续阅读

关于 RESTful 的一点思考

RESTful 是什么?

来自《Spring 实战》:

REST 组成:表述性、状态、转移。

REST 是将资源的状态以最合适的形式从服务器转移到客户端。

RESTless

RESTless 是面向行为的,而不是面向资源的。比如:
http://host:port/servletContext/showUser.action?id=123

在这个 URL 里,servletContext 是 servlet 上下文路径;showUser.action 是控制器 URL 模式,其中 show 是动词,是一种行为;id=123 是标识符。

RESTful URL

比如:http://host:port/servletContext/users/123

在这个 URL 里,users 是资源类型(名词),123 是特定的 user。

这个 URL 并不做任何事情,只是标识了一个资源,而对这个资源做什么是由 HTTP 请求的方法决定的。

RESTful URL 的一些特性:

  • 不仅定位资源,还可以唯一标识这个资源;
  • 有层次,从左到右读时,是一个从抽象到具体的过程;
  • 对于服务器端应用,路径是参数化的。

继续阅读

iframe cookie p3p

问题

参与一个客户端产品的开发,这个产品有几个模块的开发方式是这样的,C++代码调用浏览器组件加载本地一个html页面,这个页面主要是展现一些边框、条幅,为的是跟C++开发的模块的风格看起来像,这个页面的主要内容是通过iframe调用别的web服务器的页面的。

今天一个模块的出问题了,经过定位,问题是这样的:iframe引入的页面设置了一个cookie,但后续的js请求数据时却没有发送这个cookie,而服务器会检查这个cookie,所以验证失败,在客户端表现为没响应。

问题缘由

IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification) 协议默认阻止第三方无隐私安全声明的cookie。

在默认情况下IE会自动禁用第三方站点(不同域的站点)的cookie, 也就是在请求第三方站点的某url时在HTTP header里不发送它们的cookie。

在这个客户端产品里,浏览器组件首先加载的是本地的html页面,然后用iframe加载web服务器的一个页面,那么web服务器的页面所在的域与于本地的页面所在的域是不同的,就存在跨域了,所以浏览器组件阻止发送cookie。

继续阅读