JS获取上一访问页面URL地址document.referrer实践 (www.zhangxinxu.com)
但是最近做了一个移动端项目,是我第一次在正式项目中使用document.referrer,这里跟大家分享一下相关的实践。

场景是这样的,移动端无论是原生app还是传统的网页,返回上页是一个比较强烈的需求,几乎所有的内页都有这么一个返回上一页的按钮。大部分场景下,上面办法可以满足我们的交互需求,但是,在有些时候……
by @技术头条 2017-02-20 00:12 查看详情
泛型中 ? super T 和 ? extends T 的区别 (yedward.net)
<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析这两种通配符的区别。
by @技术头条 2017-02-20 00:12 查看详情
基于CSS3 column多栏布局实现水平滑页翻页交互 (www.zhangxinxu.com)
column多栏布局和flex弹性布局基本上是同一时间段出现的,从兼容性来讲,column多栏布局一直以来更稳定更兼容,而flex弹性布局前前后后历经多个版本,直至现在有些移动设备支持依然不好,但是两者的命运却截然相反,column多栏布局鲜有人问津,而flex弹性布局则风生水起。面试的时候,就算面试者并未在实际项目中使用过flex弹性布局,也会时不时扯到这东西上来,好像不提flex布局就跟时代脱节一样,其实完全没有必要,每个CSS属性都有它的潜力和价值所在,挖掘其内在价值而不是单纯的被外在的那层表现困于庐山才是真正想要看到的。

而本文就是通过挖掘column多栏布局潜力实现了看上去很棘手的交互效果,这里特异分享给大家,希望能够对大家的学习有所帮助~
by @技术头条 2017-02-20 00:04 查看详情
JS the Hardcore: 执行上下文(Execution Context) (www.qianduan.net)
首先需要澄清的一点是,像 C 和 Java 这类所谓的「静态语言」需要编译后才能运行,但其实 Javascript 一样也是有编译过程的, 只是处于一些限制,编译过程特别快(以微秒计),以至于感觉上 Javascript 代码好像并没有经过编译。

当需要向别人描述一件事情的经过时,往往需要把事情的前因后果以及与其相关的场景预先说明一下。 类似,EC 就是一段代码涉及到的场景,在代码运行之前,js engine 会做一些变量内存分配,代码上下文关联的准备工作,这就是 EC。 EC 是 Javascript 引擎实现的一个内部机制,不能在代码中直接访问到。

对编程语言来说,给变量赋值,获取变量的值,是需要解决的基本问题,Javascript 当然也不例外。 EC 中会给变量分配一个存储空间,与之对应的数据结构称作 enviroment。

当程序流程需要从当前的 EC 进入另外一个和当前上下文无关的代码片段时,会创建一个新的 EC,并被推入栈中。这就是「执行上下文栈」(Execution Context Stack),可以看作是 调用栈的镜像。由于所有的 js 代码都存在于全局环境中,所以首先会创建 「全局执行上下文」(Global Execution Context),除此之外,js 中每一次的函数调用也会生成 EC,所以栈底肯定会是 全局执行上下文。

如果把 EC 视为作一个抽象对象,那这个对象包含了代码相关的 this、enviroment(存储标识符包括变量声明、函数声明、函数表达式的数据结构)和一个指向外部 enviroment 的指针。
by @技术头条 2017-02-20 00:03 查看详情
小tips: 页面链接跳转历史URL不记录的兼容处理 (www.zhangxinxu.com)
我们点击首页的“分类”进入分类页,然后分类页头部有个“男生”“女生”的频道切换,这两个都是直接的链接,如果就会带来这么一个问题,如果用户在“男生”“女生”的频道之间反复切换,则当我们点击左上角的返回按钮(如下图)的时候,就会发现点击很多次还是在“分类页”上,这其实是不符合用户预期的,正常的用户预期应该是点击左上角的返回按钮应该直接回到首页,而不是还在当前页过家家。

要实现思路并不难,就是“男生”“女生”频道切换的时候,URL地址不要进入历史URL记录堆栈,但如何实现同时保证各个浏览器都兼容是个问题,本文就将展示相关的实践,希望对大家的学习能够有所帮助。
by @技术头条 2017-02-20 00:02 查看详情
“蝉原则”与CSS3随机多背景随机圆角等效果 (www.zhangxinxu.com)
“蝉原则”,英文称作“cicada principle”,是一种让事物的重复出现符合“自然随机性”的规则,为什么这么说呢?

“蝉原则”源自于北美,中国似乎并未有这样的说法,这背后是有有故事的:

北美和东亚蝉的种群是不一样的,在东亚蝉的幼虫生活在土中3年5年或7年;但是北美有一种周期蝉(Magicicada),其生命周期为十三年或十七年,也被称为十七年蝉或十三年蝉。东亚的蝉生命周期短,因此,给人感觉好像每年都有很多蝉,而北美的周期蝉的生命周期很长,因此能够让人明显感觉到每隔十几年蝉的数量就会大规模爆发一下,于是就会引发一些科学家的好奇,为什么生命周期是十三年或者十七年呢?

蝉的天敌鸟类其繁荣萧条周期是具有规律性的(一般2至6年),然后不断重复。十三年或者十七年中的13和17都是质数,而吃蝉的鸟类一般寿命都不超过13年,因此就不会遇到上一世代所遇到的天敌。东亚蝉的幼虫生活的年限比较短,可能与东亚的主要鸟类种群寿命不长有关,例如麻雀就2年寿命。

还有一个很重要的原因,就是一片区域的蝉他不止一个种群,而使用质数作为生命周期年数就可以避免钻出泥土时可以和别种群的蝉类一起钻出,这样竞争压力就会小。例如,北美的十七年蝉和十三年蝉每221年才会出现同时爆发的情况。

这种以质数作为循环周期来增加“自然随机性”的策略就称之为“蝉原则”。

那“蝉原则”对我们网页设计有什么启示呢?那就是可以以最小成本实现更自然的随机效果。

本文就演示两个借助“蝉原则”和CSS3特性实现随机效果的例子。
by @技术头条 2017-02-19 23:57 查看详情
oracle如何判定统计信息陈旧 (www.askmaclean.com)
注意自动收集统计信息是从10g开始的,10g以前版本默认不自动收集统计信息。

对于自动收集统计信息而言需要知道统计信息是否陈旧stale ,判定陈旧的标准是对应的表上的数据修改超过10%(删除或插入或更新10%或以上数据行)。 这里oracle是如何知道修改超过10%的?

SGA的shared pool存有SQL的statistics情况,对应的有SQL处理的行数,SMON进程定期将这些信息刷到表SYS.MON_MODS$基表中(参考拙作: http://www.askmaclean.com/archives/smon-flush-dml-statistics-mon-mods.html):SMON后台进程会每15分钟将SGA中的DML统计信息刷新到SYS.MON_MODS$基表中(SMON flush every 15 minutes to SYS.MON_MODS$),
同时会将SYS.MON_MODS$中符合要求的数据MERGE合并到MON_MODS_ALL$中,并清空原MON_MODS$中的数据。

MON_MODS_ALL$作为dba_tab_modifications视图的数据来源,起到辅助统计信息收集的作用,详见拙作<Does GATHER_STATS_JOB gather all objects’ stats every time?>。

这样基于之前的统计信息中的表的行数(dba_tables.num_rows),对比 MON_MODS_ALL$(dba_tab_modifications)中的update、delete、insert、truncate信息就可以知道该表从上一次收集统计信息到现在做了多少百分比的修改,若该百分比超过10%则判定为stale陈旧,否则为不陈旧。陈旧的统计信息会在自动收集统计信息时再次被收集。
by @技术头条 2017-02-19 23:56 查看详情
MongoDB WiredTiger 存储引擎cache_pool设计 (下) -- 实践篇 (blog.csdn.net)
用过MongoDB 3.0之后版本的同学应该都比较熟悉WiredTiger的cache evict问题。

连续好几个版本在cache 淘汰算法上设计都有些小问题,现象总结起来就是写入hang住。本文使用的是MongoDB v3.2.9下wiredtiger-2.8.1(现在wt官方主推v2.9.0版本, MongoDB v3.4之后会使用这个版本,云MongoDB现在可以使用v3.2.9,后续我们会很快支持)。
by @技术头条 2017-02-19 23:55 查看详情
PHPMailer漏洞分析 (blog.nsfocus.net)
在PHPMailer 5.2.17以及之前版本中,存在着一个高危的任意文件写入漏洞,当攻击者将精心构造的恶意数据分别写入邮件内容以及发件人地址中并传递给使用了相应版本的PHPMailer web应用,就可以导致任意文件写入以及远程代码执行的攻击。
by @技术头条 2017-02-06 23:10 查看详情
MongoDB WiredTiger 存储引擎(1) cache_pool设计 (blog.csdn.net)
最近由于工作需要,阅读了WiredTiger部分代码,感觉有的地方还是很值得学习的,准备搞个系列文章,笔者不是精通WiredTiger的大神,国内对WiredTiger深入分析的人不多,只是想在这里跟大家一起讨论一起学习。
by @技术头条 2017-02-06 22:59 查看详情
Linux的IO调度 (liwei.life)
我们今天要研究的内容主要在IO调度这一层。它要解决的核心问题是,如何提高块设备IO的整体性能?这一层也主要是针对机械硬盘结构而设计的。众所周知,机械硬盘的存储介质是磁盘,磁头在盘片上移动进行磁道寻址,行为类似播放一张唱片。这种结构的特点是,顺序访问时吞吐量较高,但是如果一旦对盘片有随机访问,那么大量的时间都会浪费在磁头的移动上,这时候就会导致每次IO的响应时间变长,极大的降低IO的响应速度。磁头在盘片上寻道的操作,类似电梯调度,如果在寻道的过程中,能把顺序路过的相关磁道的数据请求都“顺便”处理掉,那么就可以在比较小影响响应速度的前提下,提高整体IO的吞吐量。这就是我们问什么要设计IO调度算法的原因。在最开始的时期,Linux把这个算法命名为Linux电梯算法。目前在内核中默认开启了三种算法,其实严格算应该是两种,因为第一种叫做noop,就是空操作调度算法,也就是没有任何调度操作,并不对io请求进行排序,仅仅做适当的io合并的一个fifo队列。
by @技术头条 2017-02-06 22:58 查看详情
消费生产模式扫表 (type.so)
有一批数据需要导入到ElasticSearch中,但是写ElasticSearch的速度比较慢,需要采用多线程的方式,但是在每个线程中都扫表,会产生重复的数据段,所以采用生产消费的模型来解决该问题 (为什么不直接选择线程池?线程池提交是异步的,一般table中的数据量都比较大,很容易塞爆内存)
by @技术头条 2017-02-06 22:57 查看详情
《kafka中文手册》-快速开始 (ifeve.com)
Kafka™ is a distributed streaming platform. What exactly does that mean? Kafka是一个分布式数据流处理系统, 这意味着什么呢?
by @技术头条 2017-02-06 22:49 查看详情
Cgroup – 从CPU资源隔离说起 (liwei.life)
一个正在运行着服务的计算机系统,跟我们高中上课的情景还是很相似的。如果把系统中的每个进程理解为一个同学的话,那么班主任就是操作系统的核心(kernel),负责管理班里的同学。而cgroup,就是班主任控制学生行为的一种手段,所以,它起名叫control groups。

既然是一种控制手段,那么cgroup能控制什么呢?当然是资源啦!对于计算机来说,资源大概可以分成以下几个部分:

1、计算资源
2、内存资源
3、io资源
4、网络资源

这就是我们常说的内核四大子系统。当我们学习内核的时候,我们也基本上是围绕这四大子系统进行研究。
我们今天要讨论的,主要是cgroup是如何对系统中的CPU资源进行隔离和分配的。其他资源的控制,我们以后有空再说喽。
by @技术头条 2017-02-05 14:42 查看详情
分布式系统中 Unique ID 的生成方法 (chenpeng.info)
在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID?

在单机系统中 (例如一个 MySQL 实例), unique ID 的生成是非常简单的, 直接利用 MySQL 自带的自增 ID 功能就可以实现.

但在一个存在多个 Shards 的分布式系统 (例如多个 MySQL 实例组成一个集群, 在这个集群中插入数据), 这个问题会变得复杂, 所生成的全局的 unique ID 要满足以下需求:

1、保证生成的 ID 全局唯一
2、今后数据在多个 Shards 之间迁移不会受到 ID 生成方式的限制
3、生成的 ID 中最好能带上时间信息, 例如 ID 的前 k 位是 Timestamp, 这样能够直接通过对 ID 的前 k 位的排序来对数据按时间排序
4、生成的 ID 最好不大于 64 bits
5、生成 ID 的速度有要求. 例如, 在一个高吞吐量的场景中, 需要每秒生成几万个 ID (Twitter 最新的峰值到达了 143,199 Tweets/s, 也就是 10万+/秒)
6、整个服务最好没有单点

如果没有上面这些限制, 问题会相对简单, 例如:

1、直接利用 UUID.randomUUID() 接口来生成 unique ID (http://www.ietf.org/rfc/rfc4122.txt). 但这个方案生成的 ID 有 128 bits, 另外, 生成的 ID 中也没有带 Timestamp
2、利用一个中心服务器来统一生成 unique ID. 但这种方案可能存在单点问题; 另外, 要支持高吞吐率的系统, 这个方案还要做很多改进工作 (例如, 每次从中心服务器批量获取一批 IDs, 提升 ID 产生的吞吐率)
3、Flickr 的做法 (http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/). 但他这个方案 ID 中没有带 Timestamp, 生成的 ID 不能按时间排序

在要满足前面 6 点要求的场景中, 怎么来生成全局 unique ID 呢?

Twitter 的 Snowflake 是一种比较好的做法. 下面主要介绍 Twitter Snowflake, 以及它的变种
by @技术头条 2017-02-05 14:40 查看详情 (1)
S.O.L.I.D.类设计原则 (chenpeng.info)
本文是由敏捷宣言签署人之一、《 Clean Code(代码整洁之道)》一书的作者Robert C. Martin为他的《Applying Principles and Patterns》这本书搜集整理而来。

单一责任原则(SRP)

  只有一个理由去修改一个类。例如,如果一个业务规则的改变会导致这个类的修改,那么,数据库、界面、报表格式或系统任何其它的部分的改变都不该迫使这个类做修改。

开发/关闭原则(OCP)

  软件构成(类,模块,方法等)向扩展行为开放,向修改行为关闭。

Liskov替换原则(LSP)

  子类必须能够用来当作基类使用。如果类A继承类B,任何能使用A的地方,B也同样可以使用。例如,是否还记得,正方形可以看作是矩形!当进行扩展时:前提条件不许绕过,后置条件不能放宽限制,可见常量不能被修改(?)。常量:在扩展之前或之后,用户都需要依靠这个常量来传递信息。正确的使用set形式的继承关系。不遵守set语义是非常危险的。归纳:使用超类的引用的任何上下文中也可以使用其子类的引用替代。这个原则极大的限制了在纯扩展(继承)机制里可以做的事情。不遵守会带来风险。

接口分离原则(ISP)


  一个类对另一个类的依赖应该限制在最小化的接口上。

反向依赖原则(DIP)

  依赖抽象层(接口),而不是具体类。

其它重要原则

Demeter定律

  也被称做封锁信息原则:只跟朋友交流

  一个对象O的任何一个方法M只能调用下列类型的对象的方法:

它自己
它的参量
它创建/实例化的对象
它的直接组件对象

好莱坞原则

  不要调用我,我会调用你的。

不要自我重复(DRY)

  去掉重复代码。

对接口编程,而不是对实现

  反向依赖的另外一种说法。

你不需要它(YAGNI)

  不要添加你“认为以后可能有用”的代码。只在“事到临头”时才添加代码。

简单化,傻瓜化(KISS)

  让它能工作的最简单的方法是什么?
by @技术头条 2017-02-05 14:38 查看详情
一个简单的 lua 对象回收再利用方案 (blog.codingnow.com)
昨天在 review 我公司一个正在开发的项目客户端代码时,发现了一些坏味道。

客户端框架创建了一个简单的对象系统,用来组织客户端用到的对象。这些对象通常是有层级关系的,顶层对象放在一个全局集里,方便遍历。通常,每帧需要更新这些对象,处理事件等等。

顶层每个对象下,还拥有一些不同类别的子对象,最终成为一个森林结构,森林里每个根对象都是一颗树。对象间有时有一些引用关系,比如,一个对象可以跟随另一个对象移动,这个跟随就不是拥有关系。

这种设计方法或模式,是非常常见的。但是在实现手法上,我闻到了一丝坏味道。
由于类别很多,所以代码中充斥着模仿静态语言如 C++/C# 般的大量构造和析构函数。我一直对同事说 Lua 不是 C++ 大部分同事也认同我的观点,但落到实处,却逃不出过去的很多经验。

比如在这次具体问题上,为什么要实现一套带构造和析构函数的类别系统呢?
by @技术头条 2017-02-05 14:30 查看详情
在 Mac 安装 Docker 环境的种种 (sexywp.com)
其实很早就听说了 Docker 了,这正是现在世界上最炙手可热的容器技术。直到去年 2015 年,我们公司才有小伙,尝试使用 Docker,当时,我们公司是全 Mac 办公,而 Docker 只支持 Linux,于是各种非官方爱好者,做出了各种方案,比如当时,如果要在 Mac 上用 Docker,就必须安装一个 boot2docker 的组件,是一个在 Mac 上使用 Docker 的封装,同时还要依托 VirtualBox 才行,当然也有 VmWare 的版本,但是又是收费的。

这个 boot2docker 的方案,不但安装麻烦,其命令行界面也丑陋不堪。而负责去研究这个方案的小伙子,最终也没有给出特别好的技术方案,只是浅尝辄止的一个分享演讲而已,比较令人失望。
by @技术头条 2017-02-05 14:29 查看详情
使用 _ 作为私有成员变量前缀 (sexywp.com)
关于编码规范,每个程序员都有自己的看法,他们通常相信自己所奉行的规范是好的并且早已养成习惯,有些看法的意念特别强大,以至于上升到了一种信仰层面。

我个人觉得,编码规范不是个人习惯,比较好的态度是,信奉编码规范可以提升大家的效率,而坚守一个团队的编码规范,而不是,坚守某种固有的做法。至于

某种规范的条例是不是“很奇怪”,“不合理”,我们都可以讨论,但是讨论不代表不遵守,这才是比较职业化的态度。或者说,即便通过讨论,认定某个规范不合理.
by @技术头条 2017-02-05 14:29 查看详情
开源移动端元素拖拽惯性弹动以及下拉加载两个JS (www.zhangxinxu.com)
开源两个起点中文网M站两个动效交互JS,封装良好,即插即用。

一个是任意元素屏幕拖移外带惯性边缘弹动效果,另外一个是基于窗体的下拉释放加载刷新效果。
by @技术头条 2017-02-05 14:21 查看详情