Returns the number X, truncated to D decimal places. If D is 0, the result has no decimal point or fractional part. D can be negative to cause D digits left of the decimal point of the value X to become zero.
最近使用 Chrom 访问生产环境经常得到 408 错误,经查这样的请求都没有到 nginx, 只请求到了 Haproxy。Google 后找到原因:
chrome 有一个预连接页面中 server 以加速浏览的特性。就是加载页面后对页面里链接中的 server 建立一个 tcp 连接(但不真正发出请求),在用户真正发起请求前完成 TCP 握手,这样就可省掉了另一个往返的延迟,大大提高访问速度。通过访问 chrome://dns 可以看到 TCP 预连接的使用情况。
haproxy 在 socket 建立了之后严格按照调置和 http 协议中的约定,当 sockets 建立之后等待一定时间,没有 http 请求上来就会产生一个 408 错误,这时真正的 http 请求通过这个 socket 上来时就会直接收到 haproxy 发出的这个错误.
将 408 错误重定向到 /dev/null 后,haproxy 将不再对 408 错误做出提示,也就是出现 408 之后不返回错误给 client 而是直接关闭 socket。这时当使用 chrome 真正请求资源时,chrome 的预连接已经被关闭,chrome 只能重新发起一个全新的 tcp 完成一次 http 请求,暂避免这个现象。这是一个变通的解决办法。
Chrome 的这个机制 3 年前就有了,为什么最近各 LB 突然出现这个问题,文章中没有给出原因。
Rails 内置了非常棒的单表继承 (Single Table Inheritance, STI) 机制。
单表继承就是面向对象的继承关系在关系型数据库中的一种表现方法。当数据库中的表映射到代码中的类时 (ORM),代码中的继承关系的不同类可以保存在同一张数据表中。约定的特定中列的内容可以指示出这条记录属于哪个具体继承的类,在 Rails 中,这个列的名字是 type。
class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
很直观,当用上面的类创建数据时, companies 表中的 type 会设置成相应的类名。如果没有 type 列,单表继承不会触发,只是写一条普通并区分不开的记录到 companies 表中。
Source code from Memcached refers to expire time:
#define REALTIME_MAXDELTA 60*60*24*30 /* * given time value that's either unix time or delta from current unix time, return * unix time. Use the fact that delta can't exceed one month (and real time value can't * be that low). */ static rel_time_t realtime(const time_t exptime) { /* no. of seconds in 30 days - largest possible delta exptime */ if (exptime == 0) return 0; /* 0 means never expire */ if (exptime > REALTIME_MAXDELTA) { /* if item expiration is at/before the server started, give it an expiration time of 1 second after the server started. (because 0 means don't expire). without this, we'd underflow and wrap around to some large value way in the future, effectively making items expiring in the past really expiring never */ if (exptime <= process_started) return (rel_time_t)1; return (rel_time_t)(exptime - process_started); } else { return (rel_time_t)(exptime + current_time); } }
判断某个元素是否已经存在于一个大的集合(亿级)中,并容许少量的误报的情况下使用。
初始化 m 位的位数组,被 0 填充。定义 k 个不同的 hash 函数,每个 hash 函数将一个输入元素映射到位数组的一个位上,一个确定的输入则有 k 个索引。
strace 是 Linux 平台和一些类 Unix 平台调试工具,可以方便的查看程序执行时的系统调用和接收到的信号。它几乎存在于所有的 Linux 系统中并且可以解决非常多的问题。