Browsed by
月度归档: 2011年2月

欢迎攻击酷壳

欢迎攻击酷壳

相信大家都发现昨天下午2011年2月16日,下午从2点到6点,酷壳基本打不开。原因是服务器受到了黑客攻击。从互联网上几乎ping不通服务器(丢包率60%以上,ping时延巨大,是平时的10倍以上),我勉强登上服务器查看了系统负载,相当低,于是停止了Apache,发现网络ping马上恢复正常。于是,我启动Apache,再使用iftop查看了一下TCP链接的带宽消耗,发现有那么一两个链接把服务器带宽全部吃完,于是我记录了下IP地址。攻击在下午6点时准停止,就像我们正常下班一样。

酷壳受到很多攻击,不过,基本上都是一些注入式的攻击,都是想取得一些权限的攻击。这是第一次受到不以取得权限为目的,而只在以影响酷壳正常运转的攻击。

我不竟想到了几个问题:

  1. 为什么要攻击?这只是一个技术blog,这样的攻击目的是什么?
  2. 黑客攻击的背后总是有相关的利益冲突的,不会是没有动机的攻击。

所以,我一直在想,是什么样的利益冲突导到酷壳被攻击的?这个BLOG得罪了谁呢?我这个小小的个人的BLOG触动了谁的利益呢?任何事情总是有因果关系的,我很不自然地想到了最近我发布的几篇文章……

欢迎攻击酷壳!我很乐意看到某些人生气的样子。

阅读全文 Read More

好烂啊 有点差 凑合看看 还不错 很精彩 ( 27 人打了分,平均分: 4.30 )
Loading...
Web开发人员速查卡

Web开发人员速查卡

无论你是多牛的程序员,你都无法记住所有的东西。而很多时候,查找某些知识又比较费事。所以,网上有很多Cheat Sheets,翻译成小抄也好 ,速查卡也好,总之就是帮你节省 时间的。之前给大家介绍过 Web设计的速查卡 25个jQuery的编程小抄 ,还有 程序员小抄大全 ,今天转一篇开发人员的速查卡, 源文在这里 。下面的文章我就不翻译了。

HTML Cheat Sheet

阅读全文 Read More

好烂啊 有点差 凑合看看 还不错 很精彩 ( 13 人打了分,平均分: 4.00 )
Loading...
TDD并不是看上去的那么美

TDD并不是看上去的那么美

春节前的一篇 那些炒作过度的技术和概念 中对敏捷和中国ThoughtWorks的微辞引发了很多争议,也惊动了中国ThoughtWorks公司给我发来了邮件想来找我当面聊聊。对于Agile的Fans们,意料之中地也对我进行了很多质疑和批评。我也回复了许多评论。不过,我的那些回复都是关于中国ThoughtWorks咨询师以及其咨询的方法的。我对Agile方法论中的具体内容评价的不是很多,所以,我想不妨讨论一下Agile方法论中的具体的实践(以前本站也讨论过 结对编程的利与弊 )。

那么,这次就说说TDD吧,这是ThoughtWorks中国和Agile的Fans们最喜欢的东西了。我在 原来的那篇文章 中,我把TDD从过度炒作的技术剔除了出去,因为我还是觉得TDD有些道理的,不过,回顾我的经验,我也并不是很喜欢TDD。我这篇文章是想告诉大家, TDD并没有看上去的那么美,而且非常难以掌控,并且,这个方法是有悖论之处的

TDD简介

TDD 全称Test Driven Development,是一种软件开发的流程,其由敏捷的“ 极限编程 ”引入。其开发过程是从功能需求的test case开始,先添加一个test case,然后运行所有的test case看看有没有问题,再实现test case所要测试的功能,然后再运行test case,查看是否有case失败,然后重构代码,再重复以上步骤。其理念主要是确保两件事:

  • 确保所有的需求都能被照顾到。
  • 在代码不断增加和重构的过程中,可以检查所有的功能是否正确。

我不否认TDD的一些有用的地方,如果我们以Test Case 开始,那么,我们就可以立刻知道我们的代码运行的情况是什么样的,这样可以让我们更早地得到我们实现思路的反馈,于是我们更会有信心去重构,去重新设计,从而可以让我们的代码更为正确。

不过,我想提醒的是, TDD和Unit Test是两码子事儿 。有很多人可能混淆了自动化的Unit Test(如:XUnit系例)和TDD的软件开发过程。另外,可能还会有人向鼓吹“ TDD让你进行自顶向下的设计方式 ”,对此,请参阅本站的《 Richard Feynman, 挑战者号, 软件工程 》——NASA的挑战者号告诉你自顶向下设计的危险性。

TDD的困难之处

下面是几个我认为TDD不容易掌控的地方,甚至就有些不可能(如果有某某TDD的Fans或是ThoughtWorks的咨询师和你鼓吹TDD,你可以问问他们下面这些问题)

  • 测试范围的确定 。TDD开发流程,一般是先写Test Case。Test Case有很多种,有Functional的,有Unit的,有Integration的……,最难的是Test Case要写成什么样的程度呢。

    阅读全文 Read More

好烂啊 有点差 凑合看看 还不错 很精彩 ( 34 人打了分,平均分: 4.15 )
Loading...
GDB中应该知道的几个调试方法

GDB中应该知道的几个调试方法

七、八年前写过一篇《 用GDB调试程序 》,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题。这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来。希望大家补充。

一、多线程调试

多线程调试可能是问得最多的。其实,重要就是下面几个命令:

  • info thread 查看当前进程的线程。
  • thread <ID> 切换调试的线程为指定ID的线程。
  • break file.c:100 thread all  在file.c文件第100行处为所有经过这里的线程设置断点。
  • set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
    • off 不锁定任何线程,也就是所有线程都执行,这是默认值。
    • on 只有当前被调试程序会执行。
    • step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

二、调试宏

这个问题超多。在GDB下,我们无法print宏定义,因为宏是预编译的。但是我们还是有办法来调试宏,这个需要GCC的配合。

在GCC编译程序的时候,加上 -ggdb3 参数,这样,你就可以调试宏了。

另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。

  • info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
  • macro – 你可以查看宏展开的样子。

阅读全文 Read More

好烂啊 有点差 凑合看看 还不错 很精彩 ( 19 人打了分,平均分: 4.21 )
Loading...
Error handling in Egypt

Error handling in Egypt

以前发布过《 C语言的错误处理 》一文,不过今天想说的是Egypt的“错误处理”。埃及的事闹得挺大的,国外和中文twitter上更是炸了锅。不要以为程序员就只会写程序——看看程序员举出来的标语吧。呵呵。

Error handling in Egypt

当然,作为程序员来说,这段代码显然还需要重构:

阅读全文 Read More

好烂啊 有点差 凑合看看 还不错 很精彩 ( 12 人打了分,平均分: 4.00 )
Loading...