关于squid请求源服务器的响应中带Vary头
关于squid请求源服务器的响应中带Vary头
精选技术长文、实践记录与系统化阅读
低噪声、高可扫读;标题、摘要、来源、标签一目了然。
采集自各技术站点的近期文章。
关于squid请求源服务器的响应中带Vary头
libeio的feature:提供全套异步文件操作的接口,让使用者能写出完全非阻塞的程序。阻塞意味着低效,但非阻塞一定要有很好的通知机制才能做到高效。 其实linux下的AIO(异步IO)并不是没有解决方案:在用户态,多线程同步来模拟的异步IO,如Glibc 的AIO;以及在内核态实现异步通知,如linux内核2.6.22之后实现的Kernel Native AIO。但两者都存在让使用者望而祛步的问题。 Glibc的AIO bug太多,而且IO发起者并不是最后的IO终结者(callback是在单独的线程执行的);而kernel Native AIO只支持O_DIRECT方式,无法利用Page cache。
信号就是通知某个进程发了某个事件,也称为软件中断。信号提供了一种处理异步事件的方法。信号通常是异步发生的,进程预先不知道信号准确发生的时刻。后端程序(daemon)往往需要提供7*24不间断的服务,因此,编程daemon程序时对信号的正确处理尤为重要。下面和大家分享编写daemon程序时信号处理的注意事项,内容都来自Internet,只是进行了整理和总结。关于信号的基础只是请参考APUE。
最近做了一系列的单元测试相关的工作,除了各种规范及测试框架以外,讨论比较多的就是关于代码覆盖率的产生,c/c++与其他的一些高级语言或者脚本语言相比较而言,例如 Java、.Net和php/python/perl/shell等,由于没有这些高级语言和脚本语言的反射的特性,其代码覆盖率的产生过程会稍微复杂一些。发现许多同学对C++的覆盖率如何产生在都不太清楚,这里做一个简单的介绍。
前两天在一淘数据测试中启动了一个测试人员成长项目,叫做测试技术革新,其实就是一个系列培训计划。主要目的是为了帮助我们的测试人员成长,让他们可以更加胜任未来的自动化测试需要。在为测试技术革新项目挑选合适的主题的时候,我想到了测试驱动的开发过程。原因是这个过程既让测试人员可以了解一种好的开发过程,而又和测试本职工作相关,而且也比较容易理解。所以下面就是我对于测试驱动开发的一个过程介绍。什么是测试驱动开发?测试驱动开发(test driven development (TDD))是一个测试结果导向,可迭代的开发过程。我们直接从一个实例开始对测试驱动开发的讲解。假设,你被要求开发一个函数,lz_array_merge($new, $old),这个函数的目的是将$new数组里面的每一个内容,都覆盖给$old数组。第一个版本不考虑迭代,但是不排除迭代的可能性。
treap 是一个很有意思的数据结构,从名字也能看得出来,它是 tree 和 heap 的混合产物。为什么会有这么一个数据结构还得从二叉树(BST)说起。 我们都知道,普通的二叉树是不平衡的,在某些情况下进行插入删除操作可以导致时间复杂度从 O(logN) 下降到 O(N)。为了解决平衡的问题,有很多新的二叉树被引入,比如大家熟知的一些:Linux 内核中 CFS 使用到的红黑树(Red-black tree),数据结构课上都会讲到的 AVL 树。这些树都因为要进行复杂的旋转操作而不容易实现。 那么有没有一个实现容易的平衡二叉树呢?Treap 就是一个。普通的二叉树节点只有 key,而 treap 又多了一个 priority,这里的 priority 就是 heap (优先队列)中的 priority。这样, treap 既可以利用二叉树的特性,又可以利用 heap 的特性了。
平时一直都在用非常简单的表达式,匹配位置的时候,用几个元字符就够了。当今天不得不从别人的C源代码中取出一个特定宏的定义时候,终于觉得我要用零宽断言来匹配位置了。用的是python的 re模块,开始半天都匹配不上,因为是GUI程序,竟然也没有仔细看控制台的输出。后来仔细看了一下,又google了一下,看到两个匹配要取出字符串前面的零宽断言都必须是定长的时候……才明白怎么回事。
今天一个同事问我关于write(2)在写入文件的时候问题,问题是这样的:当磁盘剩余空间不能将一次write调用希望写入的数据写完的时候,write是直接返回-1,然后设置errno为ENOSPC,还是先写入一部分数据,将剩余空间占满然后再下一次调用的时候返回错误?当时发现好像没有考虑过这样的问题,Google了一下,好像没有找到关于这个细节的说明。于是今天决定自己试试看。用dd建立一个64M大小的文件,然后弄上不同的文件系统用loop挂载,去写满试试看。
Linux 内核中使用到了字符串搜索,所以它也有 KMP 算法的实现,代码在 lib/ts_kmp.c 中。 Linux 内核中用到 KMP 算法的地方有三处:iptables string match 模块、iptables conntrack amanda 模块(不知道这个是用...
普通的 IPv4 环境很简单,如果你使用 virt-manager 的话它自动都给你搭好了。每个 kvm guest 都在同一个子网内,通过 bridge 连接到一起,然后通过 host 上的 NAT 访问外网.....
我们知道,在KVM里测试内核会碰到一个很严重的问题:那就是在 host 编译的内核不能直接在 guest 里使用。有两个原因:一是 host 和 guest 的硬件可能不一样,所以需要的 config 不一样;二是内核模块即便是安装进了 initramfs 也仍有很多需要安装到 /lib/modules/`uname -r`。
最近由于一些控制IO带宽的需求,开始研究CFQ以及对应的IO cgroup,今天baidu了一下,竟然发现没有多少中文的介绍,所以准备写一个系列,介绍一下这个调度器,粗粗想了一下,大概可以灌四篇水,包括CFQ的基本介绍,CFQ各个配置参数的含义和调优,CFQ的基本架构以及CFQ+cgroup。各位看官要是觉得还有什么值得写的,请留言给我或者直接新浪微博 @淘伯瑜。闲话少说,言归正传。 CFQ是Completely Fair Queuing的缩写,顾名思义,他存在的主要目的就是为了保证公平性, 并为此做了大量的工作。为了说明他的公平性,让我们先来简单看看另外目前kernel另外两个IO调度器,noop和deadline。那么怎么看自己目前硬盘的调度器呢?
现在的linux内核中对于缓存的管理都是以page的形式进行的,也就是说在系统底层只存在各种page,这些page保存在不同的tree 中,buffer这个概念实际上已经过时了,但是为了保持对过往系统的兼容性,linux内核中还保留了这个概念,并仍然用它来代表文件系统中的一些所谓的元数据,但是由于已经没有buffer了,那么free该怎么显示buffers呢?内核巧妙的利用了一个特性,那就是文件系统在读取元数据的时候一般都是通过它所对应的块设备来进行,也就是说元数据存储的page一般都是保存在块设备对应的tree中,而一般文件的page cache则是保存在它的宿主文件的tree中。有了这个假设,我们就可以通过统计所有在块设备的tree上的page来得出系统的buffers数量。
protocol buffers是google提供的一种将结构化数据进行序列化和反序列化的方法,其优点是语言中立,平台中立,可扩展性好,目前在google内部大量用于数据存储,通讯协议等方面。PB在功能上类似XML,但是序列化后的数据更小,解析更快,使用上更简单。用户只要按照proto语法在.proto文件中定义好数据的结构,就可以使用PB提供的工具(protoc)自动生成处理数据的代码,使用这些代码就能在程序中方便的通过各种数据流读写数据。PB目前支持Java, C++和Python3种语言。另外,PB还提供了很好的向后兼容,即旧版本的程序可以正常处理新版本的数据,新版本的程序也能正常处理旧版本的数据。
“undefined reference to XXX”是一类挺常见的链接错误,原因通常是链接时找不到声明成extern类型的函数的定义点。不过这次遇到的undefined reference中的XXX函数明明在一个库中定义,而且该库明明已经在命令行用-l指定了,ld -verbose也显示能找到该库文件。
Pipes是hadoop提供的c++接口,但是在官网上找不到pipes的文档,只能从例子开始一点点摸索。实验环境是debian 6 amd64,hadoop 1.0.3。hadoop的安装目录是$HOME/hadoop,安装和配置过程在上一篇安装笔记中有提到。
用户的屏幕越来越大,而页面太宽的话会不宜阅读,所以绝大部分网站的主体宽度并没有太大变化,所以很多网站开始在滚动时让一部分内容保持可见以更好利用空白区域,比如,侧边栏的部...
微信在版本迭代演变过程中,一直在潜移默化地教育用户使用二维码。从当初的使用二维码来添加微信,到现在的使用二维码进行网页版账号识别登录工具以及商家优惠活动二维码识别。大家渐渐地对二维码不那么陌生。说实话,二维码作为一项新的技术,自问世就被炒的火热。但二维码只能锦上添花,不能雪中送炭,很少见到单独提供二维码服务的应用。因为二维码是个寄生类应用,单独出来是个鸡肋,例如我查查,关键是识别以后怎么为用户提供服务,创造价值?
记录一下hadoop集群的搭建过程,一共3台机器,操作系统都是debian 6,hadoop版本是1.0.3,jre是源里的openjdk-6。hadoop官网的说明挺详细,就是不能快速搭建出一个能跑的环境。在网上找到一篇文章(见参考资料[1]),虽然文章中用的是0.20版本,但是在1.0.3上也适用。这里使用master,slave1和slave2分别作为三台机器的主机名。为了操作方便,每台机器上都有一个用户hadoop,密码都一样。以下的配置操作都在master上进行。
说是初探, 其实也是学了很多年了,但是由于没有什么实践经验,所以没有真正的学以致用,近来无聊,看看以前貌似熟悉的知识还在否? 1.distinct——select中的一个去重的关键字,问题如下。 a)distinct能否修饰*?实践证明是可以的,但是没有意义,因为数据库主键必不能重复,所以distinct没有达到去重的效果。 b)distinct能否修饰多个column?这是不行的,distinct只能用于所有column之前,查重的结果必是所有查询的column都相同才予以去除。 2.order by 与 limit a)order by中的字符a和A是按ASCII排序的么?其实是一种设置,字符集是一种语言的所有字符,而校验是设置字符中那些是一样的。 b)limit后面数字的用法?有两种limit,一个参数仅仅表示选择行数,两个参数的第一个参数是从哪一行开始,第二个参数表示选择后面的多少