深入了解函数调用与栈

有人把程序员比作魔术师,几行简单的代码就能指示电脑作出各种各样不同的操作,作为一个合格的魔术师,只有一步一步掌握魔法的底层运行原理,才能不断创新,创造出更新,效率更高的魔法。在计算机科学中,函数是一个非常重要概念,与此相关的栈,栈如此重要,以至于CPU从底层硬件上实现了它,下面我试着分析一下函数的调用和数据栈,水平有限,如有疏漏和错误欢迎指出。

系统的硬件组成

现代计算机遵守冯·诺依曼体系结构,一般来说由CPU(中央处理器),主存储器(内存),I/O总线和各种外设组成,如下:
IA32体系结构
…阅读更多>>

奇葩的FTP协议分析

文件传输协议(FTP)诞生于1971年,至今已经有40多年历史,作为最基础常用的互联网协议之一,它到现在依然发挥着重要作用。和大多数网络协议不一样,FTP是一个非常奇葩的网络协议,说它奇葩主要是有以下两点原因:第一是FTP有两个通道,数据通道和控制通道,数据通道用来传递数据,而指令通道用来传送客户端发送给服务器的指令。第二是FTP有主动和被动两种操作模式,他们的不同在于数据通道的连接方式,接下来我们来详细分析一下FTP协议。

和HTTP协议一样,FTP协议也是文本协议,和其不同的是,FTP是有状态的信息,和SMTP更为相似,它的所有指令如下:
CWD XCWD CDUP XCUP SMNT* QUIT PORT PASV
EPRT EPSV ALLO* RNFR RNTO DELE MDTM RMD
XRMD MKD XMKD PWD XPWD SIZE SYST HELP
NOOP FEAT OPTS AUTH* CCC* CONF* ENC* MIC*
PBSZ* PROT* TYPE STRU MODE RETR STOR STOU
APPE REST ABOR USER PASS ACCT* REIN* LIST
NLST STAT SITE MLSD MLST …阅读更多>>

河内塔与递归

河内塔,又叫汉诺塔,是法国数学家爱德华·卢卡斯于1883年发明,给定一个由八个圆盘组成的塔,这些圆盘按照大小递减的方式在三根桩柱上,需要把整个塔一道另一根桩柱上,一次只能移动一个圆盘,并且必须保证较大的圆盘永远在下面。在电影《猩球崛起》中有这样一个片段,凯撒的妈妈美瞳(Bright eyes)在实验室内在服用一种药物后,智商堪比人类,在对她进行河内塔游戏的测试中,有非常优秀的表现。
实验中的黑猩猩
河内塔还有一个美丽的传说:有64个这样的圆盘组成的塔,上帝命令一群牧师夜以继日的工作,当牧师完成上面的任务时,塔将坍塌,世界也将毁灭。 …阅读更多>>

HTML代码到底该不该压缩

在我的插件Super Static Cache的使用过程中,经常会有人问我这样的问题,怎么样让Super Static Cache插件支持我的HTML压缩插件,本文这里不谈技术实现问题,着重来分析一下现在的网站有没有必要再进行HTML代码压缩。

代码压缩压缩的是什么?

HTML的全称是超文本标记语言,HTML网页本身是一种文本文件,通过在文件中添加标记符,可以告诉浏览器如何显示其中的内容,包括文字大小,颜色,图片显示等等。这就意味着在文本文件中的一些特定意义的字符可以在浏览器显示的时候就不一样了,HTML代码压缩就是压缩这些在文本文件中有意义,但是在HTML中不显示的字符,包括空格,制表符,换行符等,还有一些其他意义的字符,如HTML注释也可以被压缩。

有了这个基础,我们挑选网络上的100张未经过HTML压缩的页面进行统计。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib2,re
import matplotlib.pyplot as plt

htmlsp = re.compile(r"[\r\n\t]")

def htmlcompress(html):
    html =  htmlsp.sub("",html)
    return html.replace("  "," ")

urls = open("urls.txt","rb")
comdation = list()
while True:
    url = urls.readline()
    if not url:
        break
    if not len(url):
        continue
    try:
        content = urllib2.urlopen(url).read()
    except:
        continue
    unlen = len(content)
    comlen = len(htmlcompress(content))
    comra = 100.0*(unlen*1.0-comlen*1.0)/unlen
    obj = "uncompress:%d bit, compress:%d bit, compressdatio: %f%%"%(unlen,comlen,comra)
    print obj
    comdation.append(comra)

plt.ylabel("compressdatio")
plt.plot(comdation)
plt.show()

…阅读更多>>

蒙特卡罗方法和随机数

蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。

蒙特卡罗方法最典型的应用是求圆周率π,如下图,在坐标系中,有一个以(0,0)为圆点,半径为1的圆,接下来画一个边长为2的正方形,做到把圆内切在正方形上,如图:
获取圆周率的方法 …阅读更多>>

如何在PHP7中安装mysql扩展

PHP是最流行的web脚本编程语言,目前全球有超过81.7%的服务器后端都采用它,然而它的运行效率一直广受诟病,为了提供PHP的运行效率,Facebook甚至开发HHVM,用来把PHP代码转换成字节码以提高其效率。为了对抗HHVM,2015年10月PHP7正式发布,相对于PHP5,PHP7有非常大的性能提升,关于其和HHVM性能的对比,可以查看鸟哥的PHP7 VS HHVM (WordPress).

相对与PHP5,PHP7的最大变化之一是移除了mysql扩展,推荐使用mysqli或者pdo_mysql,实际上在PHP5.5开始,PHP就着手开始准备弃用mysql扩展,如果你使用mysql扩展,可能看到过这样的提示”Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in”。所以在以后的程序中,为了保持兼容性,要尽量减少使用mysql扩展用于数据库连接。 …阅读更多>>