俯卧撑
【 以下文字转载自 NewExpress 讨论区 】
发信人: xfh (加油中国), 信区: NewExpress
标  题: 强大的俯卧撑
发信站: 水木社区 (Wed Jul  2 01:06:21 2008), 站内

欧阳峰蹲下了身子。

欧阳峰伸长了脖子。

欧阳峰瞪圆了双眼。

欧阳峰四肢着地。

欧阳峰鼓起了腮班。

洪七很冷静。

洪七解下了葫芦。

洪七拧开了葫芦盖子。

洪七咕嘟咕嘟地喝了几口。

“动手吧。”

洪七声音平静。

....

类型:随感,创建时间:十二月 30, 2011, 8:01 p.m. 点击查看完整内容。。。
screen程序使用初探

screen是用于在一个终端上模拟多个终端的linux程序。比如我们使用putty登录到linux,并且要运行多个程序。这时我们就可以使用screen程序。

screen程序的主要特性:

  • 可以模拟多个终端,使用Ctrl+A,N 这样的快捷键方便地切换。
  • 可以把正在进行的工作保存起来,下次登录的时候恢复它们。我们称之为会话管理,每次进行的所有工作组成一个会话。
  • 在不同的终端复制和粘贴,不知道怎么用。。

本文简单介绍screen命令行的使用,以及操作。

类型:LinuxApp,创建时间:十二月 31, 2011, 2 a.m. 点击查看完整内容。。。
在多线程编程的时候如何让子线程退出

虽然python下推荐使用多进程编程,但是在一些场合下,多线程编程还是方便一些。

最近就经常写一些关于网络方面的命令小程序,一个线程不断地从命令行得到用户的输入并且向网络发送一些东西,另外一个线程则从网络接收数据并打印在屏幕上。平常结束一个程序的办法是调用exit()函数,不过对于多线程的网络程序似乎却有点难办,因为除了一条sys.exit()语句外,还需要结束从网络接收数据的后台线程。

不幸的是python没有提供结束线程的接口,不能像java或者c#那样,使用thread.interrupt() 就可以让线程结束。更糟糕的是,python调用系统函数的时候会被阻塞在内核,除非阻塞被解除,这个线程不再继续执行python解释器的代码了,所以interrupt()理论上根本无法实现。那要怎么退出线程呢?我的解决办法是:

设置一个名为exiting的全局变量,从网络读数据的线程以它为循环条件。如果要让这个线程退出,只需要改变一下exiting的值,接着发送一些信息让线程退出阻塞。 调用线程的join函数可以等待线程退出。

类型:Python,创建时间:十二月 31, 2011, 1:48 a.m. 点击查看完整内容。。。
传参数应该用哪种形式——值、引用、指针?

最近写C++程序经常郁闷传参数的时候应该传值、传引用还是传指针。

  • 传值 :int func(User u);
  • 传指针: int func(User* u);
  • 传引用: int func(User& u);

传值是传参数最常见的方法,相当简单,是C++的基础传参方法。如果参数是整形、字符等基础类型,用传值的方法是最快的,也是最简单的。它的缺陷是对于一些很大的对象,比如上面定义的User对象,使用传值方法时,内存开销比较大,会重新创建一个User对象。还有一个情况,如果User是多态的,这样传参数会出问题。因为C++会调用新创建的User对象的复制构造函数,而默认的复制构造函数只会把需要的属性复制到新对象里,引起所谓的切割现象。

在C++古生代,传指针是传值之外的唯一方法。与传值相比较,需要考虑内存管理的问题,在栈上分配的对象通常就不能传递指针,因为函数返回之后栈上的对象会被析构,这时的指针就会成为野指针,引用它会造成内存访问异常。即使对象是在堆上分配的,传指针里也同样要考虑分配错误等问题。不过,与传值相比,传指针对付大型对象和多态对象很有效,而且,使用指针形式传递的变量在运行过程中可以被修改。

传引用似乎结合了两者的优点。与传指针一样,传引用能很好地对付大型对象多态对象,而且相对于传指针,传引用通常是不需要考虑内存管理的问题,因为只能使用另一个已经初始化的变量来初始化引用。一切看起来似乎都很美好。不过优点往往也是缺点,引用类型的变量不适合作为类的属性,因为引用一旦初始化就不能改变其指向的对象。C++这种面向底层的语言真是让人很痛苦。

总结一下:

基础类型传值、普通的非多态的对象传引用,多态对象以及分配在堆上的对象传指针。

类型:C++ & Qt4,创建时间:十二月 30, 2011, 7:43 p.m. 点击查看完整内容。。。
关于敏捷开发(转载)

敏捷开发的原则和优点

  • 快速、连续的交付
  • 频繁的交付
  • 工作软件
  • 适应
  • 亲密无间,日常协作
  • 积极主动、熟练人员
  • 自组织的团队
类型:随感,创建时间:十二月 30, 2011, 7:37 p.m. 点击查看完整内容。。。
维护多个WebService API版本的方法

随着软件系统的不断发展,与其相配套的API也必定会发生着不断的变化。如何降低API变化对外部系统的影响是大多数软件系统都要面对的挑战。

在设计指令集、SDK或者API时,向后兼容可以说是最基本的道德,这已经被无法的例子所验证。不过随着软件系统功能的不断增加,维持原来的API往往是不可能的。两相权宜,只能选择有条件的向后兼容。通常的做法是保留原来的函数,然后增加新的函数。比如CreateWindow(String className),如果要新增了一个参数,名为style,那么我们可以再新增一个函数如CreateWindowEx(String className, String style)。显而易见,这种方法是最简便的,却可能不是最好的。利用高级语言的特性可以把它修改为具有默认参数的函数如:CreateWindow(String className, String style="default"),或者简单地再创建一个新的同名函数:CreateWindow(String className, String style)。虽然不能指定默认参数的值,但是Web Service支持前一种做法。

类型:Java,创建时间:十二月 31, 2011, 1:33 a.m. 点击查看完整内容。。。
可重入函数

可重入函数的定义是:

  1. 不为连续的调用持有静态数据。
  2. 不返回指向静态数据的指针;所有数据都由函数的调用者提供。
  3. 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
  4. 绝不调用任何不可重入函数。

可重入函数有一个很好的性质——它的输出只决定于输入,非常方便进行单元测试。

可重入函数没有全局数据,在运行的时候不会产生竞争条件,只要配合map & reduce这样的高阶函数就可以做并发编程,完全不需要额外的开销。随着多核处理器的流行,这样的概念应该会越来越流行的。

类型:随感,创建时间:十二月 30, 2011, 7:27 p.m. 点击查看完整内容。。。
配置iptables,把80端口转到8080

今天安装了一个tomcat服务器,不想让服务器直接以root用户运行,就配置了一个低权限的用户给它。但是,众所周知,在unix下,非root用户不能监听1024以上的端口号,这个tomcat服务器就没办法绑定在80端口下。

怎么办呢?有两种方案:

1、使用setuid或者sudo提升程序的权限。这个不好,跟直接用root一样的缺点。

2、把到80端口的服务请求都转到8080端口上。这个又分为两种方法。常见的方法是使用apache监听80端口,然后利用ajp转向把服务转到8080。这个办法有很多好处。比如对于一些静态或者php的url就可以直接由apache提供服务,而只把jsp的请求转到tomcat。这里不再详述。我使用的是第二种方法,利用iptables把80端口映射到8080。很简单,在root权限下运行一条命令:

iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

现在就可以看到效果了。不过据说不能拿本机做试验,因为本机的PREROUTING不起效果。你可以拿别人的机器试一下。

大多数Linux发行版本有关于iptables的配置文件,比如基于Redhat的发行版一般有一个/etc/sysconfig/iptables这个文件。使用这条命令把当前的iptables配置写到这个文件里:

iptables-save > /etc/sysconfig/iptables

重新启动机器之后端口映射就仍然有效

类型:LinuxApp,创建时间:十二月 30, 2011, 7:25 p.m. 点击查看完整内容。。。
对函数式编程的看法

最近函数式编程概念很火,似乎每个“现代化”的编程语言都要沾一下函数式编程,才能称之为现代化的编程语言。java打算在jdk7中加入闭包,.net则早已支持lambda语句。至于python,ruby,javascript等这些过程化的编程语言则争先恐后地加入了函数式编程的战团,各展优雅。可是,函数式编程真的那么重要吗?

这些过程化编程语言通常提供了一些高阶函数,以及对于闭包的支持。比如python提供了

  • map(function, sequence) -> list
  • filter(function,sequence) -> list
  • reduce(function,sequence) -> result

这些函数在现有的过程式语言环境中基本上都是类似的实现。可以说,不过是语法糖而已,函数式编程擅长的并行计算不可能在这种过程式的编程语言中自动地获得。这种函数式编程有什么意义?更好看还是更简洁?难道还有其它的理由吗?

闭包是具有闭合作用域的匿名函数。他带来的优点和缺点在很多文章中已经被详加探讨。基本上,闭包在大多数过程化的编程语言里被实现为匿名类。说实话,自从用过闭包之后,我就很自觉地将闭包的思想用于软件设计。不过,毕竟只是语法糖,有也可以,没有也不是很遗憾。如同前所述的高阶函数,我认为,它对现有的过程化编程语言改进不是很大。怪不得之前有人建议在Python 3000里去掉lambda

类型:Python,随感,创建时间:十二月 30, 2011, 7:22 p.m. 点击查看完整内容。。。
欧拉神

最近在看Kennth H. Rosen的《离散数学及其应用》,里面有一个欧拉的传记:

列昂哈德·欧拉(Leonhard Euler 1707-1783) 欧拉是瑞士巴赛尔附近一位加尔文教派牧师之子,他13岁进入巴塞尔大学,遵照父亲的愿望开始神学生涯。在大学里,欧拉受到著名的伯努利家族中的数学家约翰·伯努利的指导。他的兴趣和熟练的技能使他放弃神学研究而转向数学。欧拉16岁取得了哲学硕士学位。1727年彼得大帝邀请他加入圣彼得堡的科学院。1741年他来到柏林科学院,在这里一直呆到1766年。然后他回到圣彼得堡,并在那里度过余生。

欧拉的成果多得令人难以置信。他在数学的许多领域都做出了贡献,包括数论、组合以及分析在诸如音乐和造船学这些的领域的应用等。他写的书籍和文章数量在1100部以上,另外还有非常多的去世前未能发表的著作,以至于在他去世之后,用了47年才发表完他的所有著作。他写文章非常快,在世时总有一大摞文章等待发表。柏林科学院总是先发表这一摞最顶上的文章,所以后来的结果常常先于它们所依赖或取代的结果而发表。欧拉有13个孩子,当有一两个孩子在他膝上玩耍时,他照样能够工作。在他生命的最后17年里,他完全失明了。但是,由于他神奇的记忆力,他的数学研究成果的推出并没有受到影响。他的全集的出版工作 由瑞士自然科学协会负责,目前还在进行之中,预期将超过75卷。

类型:随感,创建时间:十二月 30, 2011, 7:18 p.m. 点击查看完整内容。。。
Python的startswith和endswith

做文本处理的时候经常要判断一个文本有没有以一个子串开始,或者结束。Python为此提供了两个函数:

S.startswith(prefix[, start[, end]]) -> bool

如果字符串`S以prefix开始,返回True,否则返回Falsestartend是两个可以缺省的参数。分别是开始比较的位置和结束比较的位置。这个函数也可以写成S[start:end].startswith(prefix)`。

S.endswith(suffix[, start[, end]]) -> bool

如果字符串Ssuffix结束,返回True,否者返回False。与startswith类似,这个函数也可以写成S[start:end].endswith(suffix)startend仍然是从左数起。

Python的这两个函数有个特别的地方——它的prefixsuffix参数不仅可以是字符串,还都可以是一个元组。只要其中一个成立,就返回True,也就是一种“或”的关系。比如:

if filename.endswith((".gif", ".jpg", ".tiff")):
    print "%s是一个图片文件"%filename

上面两行代码根据文件扩展名是否是gifjpgtiff之一来决定文件是不是图片文件。这个代码也可以写成:

if filename.endswith(".gif") or filename.endswith(".jpg") \
        or filename.endswith(".tiff"):
    print "%s是一个图片文件"%filename

不过这样比较麻烦。值得注意的是,不熟悉Python的朋友可能会忘了元组周围的括号。

类型:Python,创建时间:十二月 31, 2011, 1:16 a.m. 点击查看完整内容。。。
百年语言(转载)

Paul Graham 2003年4月

(本文出自2003年Python大会上的一篇主题讲话)

很难预测人们的生活在一百年后会是什么样子,我们只能给很少的事物一个确切的预测。我们知道到那时候每个人都将驾驶气垫轿车,地方法规将对建造上百层的高楼无所制约,大部分时间都将日月无光,女人们都将精通武术(martial arts)……在这里,让我们把这幅图景的一个细节放大来看看:那时候人们用什么编程语言来写那些气垫轿车的控制软件呢?

这是一个值得思考的问题,其意义不在于我们一定要用这种语言,而是在于据此我们可以选择可能发展成那种语言的语言——如果我们够幸运的话。

类型:Python,创建时间:十二月 30, 2011, 7:08 p.m. 点击查看完整内容。。。
两年不重装系统的秘诀

以前写的一些东西。。主要是我使用电脑的习惯。老是中毒重装电脑的可以看一下。

类型:随感,创建时间:十二月 30, 2011, 7:07 p.m. 点击查看完整内容。。。
Python的exit函数

在2.5版本之前的Python,输入exit或者quit会得到这样一条说明:

>>> exit
'Use Ctrl-D (i.e. EOF) to exit.'

尝试着输入exit()或者quit(),python报错。

>>> exit()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: "str" object is not callable

很多新手都碰到这个问题。似乎exitquit的存在只是为了告诉别人不要用exitquit。这可真是奇怪的逻辑。

新版本的Python改了这种做法。输入exit()quit()就如我们所料地退出了Python。这也意味着很多情况下我们不用再导入sys这个模块了

Python2.5之前的程序:

>>> import sys
>>> sys.exit()

现在:

>>> exit()

不过需要注意的事,脚本里面并不能应用exit()函数。它只存在于解释器内。这个改动主要是为了方便*nix程序员的使用。Windows程序员都喜欢直接关闭窗口吧。

类型:Python,创建时间:十二月 31, 2011, 1:03 a.m. 点击查看完整内容。。。
Python的条件运算符

长期以来Python世界的人一直在争论是否应该拥有条件运算符。它可以用来处理根据条件返回不同的值。比如:

if contition:
    x=true_value
else:
    x=false_value

他们虽然讨论了很久,但是一直没什么结果。在python-dev邮件列表和comp.lang.python新闻主上甚至为此举行了一次投票。最后的结果是大家都同意应该添加条件运算符,可是它的语法形式是什么还是没有结果。主要的争论是C语言的cond ? true_v : false_vif cond then true_v else false_v到底挑哪个好。

最终,Guido van Rossum(Python语言的作者)挑了这样一个令人意想不到的语法形式:

true_value if condition else false_value

它的意义是:如果condition为真,计算并返回true_value,并跳过false_value的计算,否则计算并返回false_value。它完全等价于完整形式。

这个表达式的优先级是最低的,但是它优于=号。因此以下这两种形式是一样的

level = 1 if logging else 0
level = (1 if logging else 0)

不过笔者认为后一种形式看起来比较好一点,而且可以免去记忆运算符优先级的麻烦。

类型:Python,创建时间:十二月 30, 2011, 6:59 p.m. 点击查看完整内容。。。
Python的日志系统

如果使用Python写一个比较大型的程序,你一定会用上日志系统。特别是Python这样的动态语言,很多错误都只能在运行的时候才能发现,一个好的日志系统对于Python程序相当重要。最简单的解决方案当然是直接使用print输出运行信息。但是这样太简单了,没有分级功能,如果在发布的时候想去掉调试用的运行信息还得找出所有的print语句进行修改。再者,print只能输出到控制台,想要输出到文件或者通过电子邮件发送到其他地方,一个print语句就没办法解决了。

通过使用Python的日志系统,就可以解决以上问题。

本文介绍了logging模块的简单使用,以及如何设置日志的输出格式、输出方式和过滤器。logging模块不止可以在屏幕上打印出日志信息,还可以将信息保存在文件,或者发到网络上,或者保存到linux/windows的系统日志里面。点击文章标题就可以阅读更多信息。

类型:Python,创建时间:十二月 31, 2011, 12:56 a.m. 点击查看完整内容。。。
Java的闭包与final关键字

Java下的闭包(Closure):

public static Runnable outter_func(){
    final String param=System.getenv("PATH");
    Runnable r=new Runnable(){
        public void run(){
            System.out.println(param);
        }
    };
    return r;
}

r.run();

这是在Java里面使用“闭包”的一个例子。run()相当于Python里的__call__()。可以看到在run()方法里可以使用外层函数的变量。这是怎么做到的呢?答案是,Java在编译的时候做了手脚。r这个类其实还有一个隐藏的属性叫做“var$param”,在run()里面所有的param被Java编译器偷偷替换成var$param。此外在r实例化完成后,Java还调用了:

r.var$param=param

假设param不是使用final修饰的变量,当param指向了另外一个对象的时候,r.var$paramparam就不是相同的了,这就会产生了语义上的问题。因此,闭包绑定的本地变量必须使用final修饰。

类型:Java,创建时间:十二月 31, 2011, 12:25 a.m. 点击查看完整内容。。。
使用Python开发应用时字符编码很麻烦

最近开发了一个命令行的Python程序,在Windows下和终端编码设置为zh_CN.GBK的Linux控制台下运行都会出现乱码问题。查看了一下代码,主要是因为我使用了raw_input()输入的字符被我使用socket直接发送到了Java平台进行处理。这个在发送的时候进行一下处理倒也不是很难得事,不过还要取得当前操作系统的字符编码设置,然后在每个输入的位置进行转码,很麻烦。而这样的事本应该由编程语言帮我们解决的。幸好Python3K已经在这方面做得不错了。

IT业存在着太多的分歧,整个软件业在这一方面浪费了很多力量。多种语言、多种平台、多种字符集。可以说软件业无时无刻都在和这些“不一样”做斗争。不知道有没有人统计一下这种浪费所占的百分比?

类型:Python,创建时间:十二月 31, 2011, 12:21 a.m. 点击查看完整内容。。。
Linux最近终于有了走向联合的趋势,很好

最近的两个新闻:

显示了Linux阵营正在走向联合,而不是像以前Ubuntu那样的分裂。同时,Linux阵营正在组建越来越多的标准化组织,比如标准化桌面。我觉得这是一件非常好的事。Linux想要发展,这是必由的道路。相信到最后,各个Linux发行版之间会只剩下界面方面的细微差别,软件开发真正编译一次,到处运行

类型:LinuxApp,创建时间:十二月 31, 2011, 12:21 a.m. 点击查看完整内容。。。
电子证书在现实世界的使用,以及CXF如何支持SSL.

这是一篇很长的文章。首先介绍了SSL的概况,解释一些基本的概念。然后又介绍了SSL的基础——非对称加密技术。短短的篇幅结束以后,就以一个现实世界的例子开始我们的安全之旅。

如果你碰到这些问题,看看这篇文章一定值。

  1. 怎么样制作一份自己的电子证书。
  2. 怎么样使用openssl以及Java的keytool工具来制作电子证书。
  3. 制作电子证书太麻烦,本文提供了一Python脚本,以向导的方式制作电子证书。
  4. 如何配置Tomcat,让它支持TLS,也就是https协议。
  5. Web Service客户端使用电子证书来验证服务器的身份。
  6. Web Service客户端提交电子证书,让服务器也可以验证客户端的身份。
  7. 吊销客户端的电子证书。禁止CXF客户端访问服务器。
类型:Java,创建时间:十二月 30, 2011, 6:14 p.m. 点击查看完整内容。。。