2010年5月31日星期一

爱上Google

从三年前开始编程时,我就彻底摒弃了百度,开始使用Google。不过由于自己不是科班出身,旁边没有同学或者老师交流,对于Google的认识也就是搜索,仅限于搜索。不过仅仅是搜索,我对Google就爱不释手,因为每次用她搜索都可以得到想要的答复,不像百度,只是洗钱的工具而已。


从一年前开始工作来,随着自己知识面的拓展和与同事的交流,我对于Google的认识逐渐加深。Google Chrome, Google Code, GMail, GTalk, Google App Engine, Google Calendar, 一个个Google应用让我再也离不开Google。今年3月份,也购买G2,使用Google的Android操作系统。


今天下午,在使用Google Calendar,绑定了自己的手机号码,用手机短信来提醒自己的task、plan。更得知,只要加了好友(详细),便可以将2010年世界杯的所有赛程信息加入自己的Google Calendar,惊呼:爽极了!现在使用GTD管理软件都是Google Calendar和Doit.im结合使用,为了使用Doit.im,就是让我不打开Google Chrome的情况下,也能得到提醒。不过我相信再过一段时间,就要甩掉Doit.im了,因为Google Chrome完全开放扩展桌面提醒API


为何钟爱Google,在于:



  • Google的Don't be evil的信仰理念

  • Google的Do anything in web brower的产品思想

  • Google的简洁、朴实无华的界面

  • Google的免费、好用、舒服的服务

  • Google对于将科技变为实用应用的追求

  • Google更带领了我们对于自由的追求

  • ……


2010年5月28日星期五

从招聘看哲学

今天在CPyUG看到一则招聘,吸引我的是Elias Soong发的共事标准,很是喜欢,可以说引起我的共鸣,我觉得以后工作中的处事哲学也应该如此:



  • 你觉得做人、做事应该力求靠谱。

  • 你认为好的自动化会大幅提高工作效率,但也认为有时人工的适当参与可以形成 更为清晰有效的解决方案。

  • 你在写程序的时候总是很在意结构清晰和可读性,会想到三周或三个月以后再维 护这段程序的时候是什么状况,甚至有时这样的考虑超过了对极致性能的追求。

  • 在同等可用性条件下,你更愿意用开源软件/开源组件完成工作,并且曾经直接 与软件作者联系,提供过建议或者代码补丁。

  • 在使用开源软件遇到问题的时候,你不会立即放弃,除查看文档之外,你还会试 着调试或者查看源代码,看能不能自己动手解决,甚至在没有合适解决方案的情况 下还会自己动手编写软件并回馈给开源社区。

  • 你喜欢Python语言的简洁、优美和丰富的类库,但同时认为用其他编程语言也有办法做到Pythonic 。

  • 相比自成体系的Django,你更喜欢TurboGears 2或者Pylons,因为这样可以根据需要选择组件,组成最适合项目状况的编程框架,同时又能在需要时增补替换,与整个Python社区共享公共组件的进步。

  • 如果用Linux的话,你喜欢Debian Linux这样的发行版,因为它既能以简单 直观的方式即装即用,也提供一些好用的自动化机制帮助你管理自己的一些定制修 改,并且这种增补机制和发行版自带的软件包管理方式是完全一致的。

  • 你对新技术总有兴趣,比如尽管在工作中用的是 Subversion 而且觉得公司在很 长一段时间内不太可能去替换它,但还是忍不住在业余时间研究一下Git/Mercurial/Bazaar,并且会在自己的业余项目中试着使用,有机会时也会通过Seminar等方式推荐给同事。


作为一个入行不久的*nuxer和pythoer,觉得这样的职业习惯很利于自己的发展,虽然自己有些方面做的比较欠缺。

 

2010年5月27日星期四

reStructured Text使用感悟

上次参加珠江三角洲技术沙龙,社区大妈屡次提到:所见即所得(What you see is what you get),所想即所得(What you think is what you get)。字面意思好理解,但是真正理解还是今天使用reStructure Text。


平时vim书写html,的确不怎么爽,需要记住那么多的标签,手动敲那么多代码;另外对于我这个对css不精的人来说,设置样式简直是噩梦。如果采用DreamWeaver,的确省了不少力气。因为DW的确是个不错的WYSIWYG(跟word算是一类吧)。


不过所见即所得偏重的外观设计,并不是代码。比如我在强调某事的时候,是采用粗体还是红色字体呢,或者其他方法?注意:我仅仅想的是强调,我的目的是强调,粗体或者红色字体仅仅是方法。那么我在编辑代码的时候,只需要输出我的目的,实现方法可以根据不同的场合去选择不同的实现。这便是What you think is what you get。而reStructed Text便是实现WYTIWYT的工具。比如想调用,通过"**强调内容**"来表达自己的目的,具体如何显示强调,转换的时候去设置。


在这篇文章中,我就不再累赘reStructured Text的细节和元素,我所重视的它的一种思想。在使用中,我的确感觉中这种“所见即所得”的思想,的确给我带来了很大的方便。


在具体使用中,使用vim编辑器,使用vst插件。

TCP连接被重置的探究

身在天朝,在访问互联网的时候,总有各种原因被重置,现在就了解了解,探究一番。


在探究之前,先需知道TCP连接的三次握手。


  1. 用户-[SYN, x] --> 服务器{第一次握手}

  2. 用户 <-- [SYN/ACK, y:x+1]-服务器{第二次握手}

  3. 用户-[ACK: y+1] --> 服务器{第三次握手}


需要三次握手的原因:保证客户端和服务器都可以发送和接受信息。



那么我朝的GFW都干了些什么呢?GFW负责监控全国的TCP连接,当发现敏感词时就会介入,将服务器发回的SYN/ACK包改成SYN/ACK, Y:0,这代表TCP连接被重置,用户便主动放弃了连接,提示连接失败。可以看出,其实GFW就是在欺骗用户,让用户误认为服务器拒绝连接,而主动放弃继 续与服务器连接。


  1. 用户-[SYN, x] --> GFW-[SYN, x] --> 服务器{第一次握手}

  2. 用户 <-- [SYN/ACK, y:0]-GFW <-- [SYN/ACK, y:x+1]-服务器{第二次握手}

  3. 用户放弃连接



但是GFW虽然工作在TCP协议层上,但是也留下一个致命的漏洞:GFW只在连接发起时检测第一个TCP连接,这样做就可大大提高GFW的工作性能。下面是骗过GFW的方案:




  1. 用户-[SYN, x] --> GFW-[SYN, x] --> 服务器{第一次握手}

  2. 用户 <-- [SYN/ACK, y:0]-GFW <-- [SYN/ACK, y:x+1]-服务器{第二次握手}

  3. 用户-[FIN, y] --> GFW[认为用户连接结束]-[FIN, y] --> 服务器{忽略}

  4. 用户-[ACK, y] --> GFW[停止监测用户]-[ACK, y] --> 服务器{判断是坏包}

  5. 用户{忽略} <-- [RST, 0]-GFW[认为服务器重置连接] <-- [RST, 0]服务器{重置连接}

  6. 用户-[ACK, y+1] --> GFW[停止监测服务器]-[ACK, y+1] --> 服务器{第三次握手}



这样,一个三次握手的过程被我们改成了六次握手,成功骗过了GFW。


最后想说的是,不得不佩服西厢计划的黑客们,他们对于技术的探索,对于技术的热衷,更加体现出我们对于自由的渴望!最后在说句:Fuck GFW!






参考文献:


  1. 深入理解GFW,http://gfwrev.blogspot.com/2010/03/gfw.html (墙外)

  2.  “西厢计划”原理小解,http://blog.youxu.info/2010/03/14/west-chamber/

  3. 简述TCP三次握手过程,并说明为什么要3次握手,http://hi.baidu.com/it_hawk/blog/item/d053ab346830783e5ab5f54e.html

  4. TCP连接建立和关闭http://hi.baidu.com/layer7/blog/item/cb1243166bd6f11c962b430f.html

  5. 对TCP连接被重置解决方案的探究――跨过GFW通向自由网络的可行途径http://feedproxy.google.com/~r/chinagfwblog/~3/2tFHT1rfons/tcpgfw.html


2010年5月26日星期三

c语言中static和extern的作用

最近学习《unix环境编程》时,对于c语言不熟的我,经常有这样的疑惑:static和extern到底有什么作用,和心中的想法一致吗?Google之。


static的三个作用(来自http://club.it.sohu.com/r-program-76259-0-0-0.html):



  • 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

  • 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

  • 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。


我认为这样介绍static的作用比较肤浅,这样介绍更深入(来自http://developer.51cto.com/art/200812/103804.htm):



  • 隐藏

  • 保持变量内容的持久

  • 默认初始化为0


对于static可以保持变量内容的持久和默认初始化为0,都是由于static的变量都是存储在静态存储区中的缘故吧!



对于extern的理解和作用, 我想这样一句话就可以解释吧:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。