手机开发中需要了解的知识之省流量 这篇文章中提到了增量更新这个概念,但是什么是增量更新了,它的算法原理又是什么了?其实增量更新在开发中是很常见的,在开发中,我们经常会使用SVN发一个diff文件给其他人做code review,这里面就有增量更新的概念。
diff文件会列出那些代码是新增加的,那些代码是删除掉的,我们只要使用应用patch就可以得到最新的代码。
增量更新的原理也是一样的,服务器会生成一个标志不同的内容的文件,程序只要下它并进行合并就能得到最新版本。说了这么多,那么增量更新使用了什么算法了?
答案很简单:最长公共子序列。 最长公共自序列的定义如下:
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有
例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2,3,5,7>。
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=<A, B, C, B, D, A, B>和Y=<B, D, C, A, B, A>,则序列<B, C, A>是X和Y的一个公共子序列,序列<B, C, B, A>也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。
最长公共子序列(LCS)问题:给定两个序列X=<x1, x2, …, xm>和Y=<y1, y2, … , yn>,要求找出X和Y的一个最长公共子序列。
假设现在有两个序列
a b c d f g h j q [...]
现在是3G时代了,省流量真的是必须的吗?是的,原因如下:
首先,省流量就是节约用户的钱。并不是每个用户都在使用3G网络,有的用户可能就在使用GPRS,一个月只包个30M的流量,所以省流量就是帮用户省钱。
其次、省流量就是节约自己的钱,现在的终端开发是跟服务器紧密联系的,服务器的流量是算钱的,省流量就是解决自己的钱。
再者、省流量能改善用户体验,因为同样的东西,如果体积更小,那么传到终端的时间就越短,用户上网就会感觉很快很爽。
说了这么多,那么有那些省流量的方法了?
一、合并请求,比如说要下载一些图片,如果这些图片合在一起,那么请求的次数就会减少,http的次数少了,流量自然就下来了。
二、使用二进制的格式,在请求数据的时候,不要使用XML,JSON,这种格式相对与二进制的格式来说还是体积太大,二进制格式可以使用Google的Protocol Buffers 或者是apache的 thrift。 使用这两个的好处是格式容易扩展,数据压缩的比例要远远高于XML。
三、对程序所使用的图片进行优化,比如说一个photoshop生成的图片,往往里面有很多不需要的注释信息,一旦内置了大量的图片,那么随着请求的次数越来越多,浪费的流量就越多。比如说专门优化PNG图片的 pngcrush
四、使用GZIP来压缩网页。
五、支持断点下载,这样在下载了一半的时候就不用再从头下载
六、增量更新资源。(原理参见省流量原理之增量更新)
七、减少程序的大小。
这篇文章是对所有字符串操作的一个索引, 最简单的方式是通过BOM (Byte order mark )来判断字符串的编码方式,
Encoding Representation (hexadecimal) Representation (decimal) Representation (ISO-8859-1) UTF-8[t 1] EF BB BF 239 187 191  UTF-16 (BE) FE FF 254 255 þÿ UTF-16 (
如何区分UTF8与GBK编码 中的应用场景比较狭窄,只是用在了SVN的提交上,其实编码方式在其他的地方也可以使用了,比如说爬虫。
做为一个爬虫,它必须正确识别网页的编码格式,如果它不能正确识别的话,那么它抓取的信息也就不对了,为了解决这个问题。可以根据http header中的 Content-type ,网页中的meta中的encoding方式来判断。
国外的一般检测顺序如下:
charset parameter in HTTP Content-type header. <meta http-equiv=”content-type”> element in the <head> of a web page for HTML documents. encoding attribute in the XML prolog for XML documents. Auto-detect the character encoding as a last resort.
下面这篇文章将的就是作为一个网页爬虫,如何去正确处理网页。
自动识别字符编码格式的一种方法 这篇文章介绍的是Mozilla自动识别字符串的一种方式,但是这种方式实现起来很复杂,如果只是考虑UTF8与GBK的区别的化,云风写的一篇Blog介绍如果简单的识别UTF8编码还是GBK编码。 原理很简单:利用UTF8与GBK的编码特征来区分 gbk 的第一字节是高位为 1 的,第 2 字节可能高位为 0 。这种情况一定是 gbk ,因为 UTF8 对 >127 的编码一定每个字节高位为 1 。 详情见文章:区分一个包含汉字的字符串是 UTF-8 还是 GBK。
最近某个大的技术网站被黑,由于密码是明文的没有加密,因此大量的用户名与密码被公布到网上。作为一个网站,用户名的密码不能使用明文储存就可以了吗?答案是不可以的,正确的做法是使用随机salt二次加密密码,具体分析可以见下文:
谈谈近期的安全事件 http://hi.baidu.com/caoz/blog/item/edcc36d3f812891e3af3cf28.html
salt的长度也是有讲究的,特别是现在存储硬盘越来越大,导致暴力破解越来越容易。所以salt的选择也是一门学问。下面这篇文章就说到Unix的早期密码保存时,salt过短导致的缺陷
Salt (cryptography) http://en.wikipedia.org/wiki/Salt_(cryptography)#Unix_implementations
除了salt的方式加密外,还有其他的方式,比如
bcrypt http://en.wikipedia.org/wiki/Bcrypt
当然bcrypt也有一些坏处,它的加密比较慢:
bcrypt到底有多慢?如果和MD5一起来比较的话,如果使用值为12的work factor的话,如果加密“cool”的话,bcrypt需要0.3秒,而MD5只需要一微秒(百万分之一秒)。也就是说,前面我们说的那个只需要40秒就可以穷举完所有的可能的MD5编码的口令的算法,在使用bcrypt下,需要12年。
详情可见:如何防范密码被破解
网站不仅应该在存储密码时考虑密码安全问题,应该在用户在注册的时候就要提醒用户他的密码强度不够,请重新输入密码:
详情请看:Twitter and Avoiding Weak Passwords
或者这篇
字符编码方式有很多种,最简单的应该就是ASCII码了(见下图)。
如果我门使用错误的编码方式去查看文件,那么我门看到的就是乱码。为了解决这个问题,Mozilla在很早之前提出过一个结合概率来自动识别字符编码的方式。
详情请见链接
A composite approach to language/encoding detection
这个单独看文章比较单调,在google code上有对应的代码实现,比如说Java版本的实现:
Categories
Recent Posts

