Browsed by
分类:杂项资源

C语言中史上最愚蠢的Bug

C语言中史上最愚蠢的Bug

本文来自“The most stupid C bug ever”,很有意思,分享给大家。我相信这样的bug,就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。。

首先,作者想用一段程序来创建一个文件,如果有文件名的话,就创建真正的文件,如果没有的话,就调用?tmpfile()?创建临时文件。他这段程序就是HTTP下载的C程序。code==200就是HTTP的返回码。

else if (code == 200) {     // Downloading whole file
    /* Write new file (plus allow reading once we finish) */
    g = fname ? fopen(fname, "w+") : tmpfile();
}

但是这个程序,只能在Unix/Linux下工作,因为 Microsoft 的?tmpfile()的实现?居然选择了 C:\ 作为临时文件的存放目录,这对于那些没有管理员权限的人来说就出大问题了,在Windows 7下,就算你有管理员权限也会有问题。所以,上面的程序在Windows平台下需要用不同的方式来处理,不能直接使用Windows的tmpfile()函数。

于是作者就先把这个问题记下来,在注释中写下了FIXME:

else if (code == 200) {     // Downloading whole file
    /* Write new file (plus allow reading once we finish) */

    // FIXME Win32 native version fails here because
    //   Microsoft's version of tmpfile() creates the file in C:\
    g = fname ? fopen(fname, "w+") : tmpfile();
}

然后,作者觉得需要写一个跨平台的编译:

FILE * tmpfile ( void ) {
#ifndef _WIN32
    return tmpfile();
#else
    //code for Windows;
#endif
}

然后,作者觉得这样实现很不好,会发现名字冲突,因为这样一来这个函数太难看了。于是他重构了一下他的代码——写一个自己实现的tmpfile() – w32_tmpfile,然后,在Windows 下用宏定义来重命名这个函数为tmpfile()。(陈皓注:这种用法是比较标准的跨平台代码的写法)

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (37 人打了分,平均分: 4.73 )
Loading...
国内微博和Twitter的最大不同

国内微博和Twitter的最大不同

霍炬近两个月前写过一篇《microblogging和微博信息架构产品差距和影响》分析了国内微博和Twitter的差距,重点就是因为信息的平等性。我也一直在观察新浪微博,以及新浪和Twitter的一些功能上的差别。发现了一些东西,想在这里和大家分享一下。我的见解达不到像霍炬那样的层次,作为一个技术人员,我只能在产品功能上做些分析。欢迎大家指正。

现实状况

国内的微博就是新浪,Sohu微博,腾讯微博,以及饭否。我们不难发现:

  • 搜狐的和腾讯的就是Copy新浪的。在Following和Followed上大家都有自己所谓的“创新”
  • 饭否是在Copy Twitter,这点太明显了,不过,抄在了表面,而且相当的怪。

国内所有的这些以Twitter为蓝本干出来的这些东西,其和Twitter在核心功能上有这些差别:

  • Twitter的Retweet一点信息都加不上,国内的微博的转发需要加上自己的评论,也就形自己的信息。
  • Twitter的Reply只会有一个@原来的人,国内的Reply也很相似,只是勾上转发后就会把Reply的东西以“//@XXX”的方式成为自己的信息。
  • 饭否的做法比较怪,转发加原文(想做成新浪的样子),回复不加原文,只有@(Twitter)的样子,可见饭否的分裂。

SNS中的上下文

这段时间,我一直在想,新浪为什么要做成这样,为什么不做成Twitter那样,或者,为什么Twitter做成那样而不是新浪这样?从表面上看上去,新浪的“回复+转发”会带被回的信息,而Twitter的回复不带上下文,Twitter上一些我fo的人的话题完全看不懂,不像新浪的还能看到上文

老实说,在一开始,我还觉得新浪微博这种用法和技术上要比 Twitter 要强大,现在看来是我当时对Twitter并不熟悉。经过这段时间的观察。我恰恰发现新浪在转发和回复上都要带上原文其实是一件很没有技术含量的事。要说清这个事,请让我说一下评论和回复的事。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (29 人打了分,平均分: 4.17 )
Loading...
重构代码的7个阶段

重构代码的7个阶段

你曾去想重构一个很老的模块,但是你只看了一眼你就恶心极了。文档,奇怪的函数和类的命名,等等,整个模块就像一个带着脚镣的衣衫褴褛的人,虽然能走,但是其已经让人感到很不舒服。面对这种情况,真正的程序员会是不会认输的,他们会接受挑战认真分析,那怕重写也在所不惜。最终那个模块会被他们重构,就像以前和大家介绍过的那些令人销魂的编程方式中的屠宰式编程一样。下面是重构代码的几个阶段,文章来自:The 7 stages of refactoring,下面的翻译只是意译。

第一阶段 – 绝望

在你开始去查看你想要重构的模块的,你会觉得好像很简单,这里需要改一个类,那里需要改两到三个函数,重写几个函数,看上去没什么大不了的,一两天就搞定了。于是你着手开始重构,然后当你调整重构了一些代码,比如改了一些命名,修理了一些逻辑,渐渐地,你会发现这个怪物原来体型这么大,你会看到与代码不符甚至含糊不清的注释,完全摸不着头脑的数据结构,还有一些看似不需要方法被调了几次,你还会发现无法搞清一个函数调用链上的逻辑。你感到这个事可能一周都搞不定,你开始绝望了。

第二阶段 – 找最简单的做

你承认你要重构的这个模块就是一个可怕的怪物,不是一两下就可以搞定的,于是你开始着干一些简单的事,比如重新命名一下几个函数,移除一些代码的阻碍,产生几个常量来消除magic number,等等,你知道这样做至少不会让代码变得更糟糕。

第三阶段 – 再次绝望

但是接下来的事会让你再次撞墙。你会发现那些代码的瑕疵是些不痛不痒的事,改正这些事完全于事无补,你应该要做的事就是重写所有的东西。但是你却没有时间这么干,而这些代码剪不乱理还乱,耦合得太多,让你再一次绝望。所以,你只能部分重写那些不会花太多时间的部分,这样至少可以让这些老的代码能被更多的重用。虽然不完美,但是至少可以试试。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (24 人打了分,平均分: 4.79 )
Loading...
CSS图形

CSS图形

下面的示例展示了使用纯CSS制作的各种图形,你可以自由地修改文中的CSS代码。这个收集的原文在这里

经测试,IE9, Chrome, FF, Safari都可以正常显示。

正方形
长方形

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (9 人打了分,平均分: 5.00 )
Loading...
PHP分页技术的代码和示例

PHP分页技术的代码和示例

本文来自:10 Helpful PHP Pagination Scripts For Web Developers

分页是目前在显示大量结果时所采用的最好的方式。有了下面这些代码的帮助,开发人员可以在多个页面中显示大量的数据。在互联网上,分​页是一般用于搜索结果或是浏览全部信息(比如:一个论坛主题)。几乎在每一个Web应用程序都需要划分返回的数据,并按页显示。下面的这个列表给出的代码可以让你的开发很有帮助。学习这些代码,对于初学者也很有帮助

1) 使用Ajax分页

 

 

下面这个示例使用了jQuery + PHP。 Demo link

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (12 人打了分,平均分: 4.67 )
Loading...
疯狂的 Web 应用开源项目

疯狂的 Web 应用开源项目

下面是一个Web应用的开源列表。没什么可说的,太疯狂了。尤其是Web 2.0那一堆。我不知道你怎么想,有些开源项目的源码写得挺不好的,尤其是性能方面。或许你会以为改一改他们就可以成为为自己所用,不过,改这些开源的项目还真不容易。玩玩还可以。

数字媒体

  • 相册(Flickr, Picasa)
  • Gallery,基于PHP + MySQL的Web相册。非常易于使用,包括一个配置向导,对于相片的操作包括自动生成缩略图、相片的大小改变、选择、排序等。
  • Piwigo,基于PHP + MySQL。配备了强大的功能,发布和管理您的照片,可扩展性和智能浏览功能,如类别,标签,或年表。这是网络和照片的标准要求。扩展使Piwigo更可扩展性和可定制的。
  • UberGallery,一个简单易用的相册。PHP。不需要数据库。
  • Zenphoto,一个简单的web相册程序,它能够简单的展示你的图片,并含有你所需要的所有功能和特点。可以和Wordpress集成。
  • 视频(YouTube)
  • Flowplayer,一个用Flash开发的在Web上的视频播放器,可以很容易将它集成在任何的网页上。支持HTTP以及流媒体传输。
  • Plumi,一个建立在Plone 内容管理系统上的视频分享系统,可帮助你轻松建立视频分享网站。
好烂啊有点差凑合看看还不错很精彩 (36 人打了分,平均分: 4.86 )
Loading...
10大经典错误

10大经典错误

下面是10、11个经典的错误,升序排名。希望大家补充!

10、DOS的Abort,Retry, Fail?错误

85年以后出生的人可能不知道DOS是什么了,只有那老家伙还知道这是什么。我还记得当时的我对于Abort和Fail这两个选择还是比较清楚的,不过,今天完全忘记了Abort和Fail的差别是什么?这个出是DOS下的经常出现,也相当的经典,以至于在Wikepedia上都有专门的业面 Abort, Retry, Fail?。简称为ARF。当然,ARI – Abort, Retry, Ignore?

9、Windows Vista 的红屏错误

红屏错误(RSoD – Red Screen of Death)不单单只是Windows Vista引入的(也许是蓝屏太有名了,突然变成红屏,大家觉得这个是比蓝屏更NB的错,所以也就引人关注了),PlayStation的也喜欢使用红屏。

Windows Vista 的 RSoD

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (24 人打了分,平均分: 4.83 )
Loading...
10个必需的iOS开发工具和资源

10个必需的iOS开发工具和资源

界面总不是一件很容易事,尤其是iPhone/iPad的界面,做过iOS开发的程序员,一定会感到开发iPhone/iPad的界面是一件多么不容易的事。下面的文章来自10 Essential iOS Developer Tools & Resources,这个文章介绍了十个iOS开发的基础性工具和资源,其一定会很有效地帮你做iOS的开发。(在这里,我再闲扯一句,虽然Android的开发好像整整XML文件界面就出来了,其明显比iOS的开发要容易很多,但是我还是觉得iOS的生命力要强过Android,看看Android今天的应用就知道,有时候入门门槛低不是一些好事,大多数的程序员搞出来的Android代码和软件简直令人作呕,就像不是每个人都能烧得手好菜一样。(“食客与大厨”,也许偏激,但值得你我思考),又把蛋扯远了)

1. Omnigraffle + Ultimate iPhone Stencil

Omnigraffle 是一个很强大的像Microsoft Viso的一个软件,其只能于运行在Mac OS X和iPad平台之上。它曾获得2002年的苹果设计奖。在这里,你可以下载 Ultimate iPhone Stencil ,然后使用Omnigraffle 来非常快地制作你的iPhone应用的演示界面。(查看了一下Omnigraffle 的iPad版,真贵,$49.99。作者居然推荐买,TNND,一看就是托)。

Omnigraffle Link, Ultimate iPhone Stencil Link

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (8 人打了分,平均分: 4.00 )
Loading...
你确信你了解时间吗?

你确信你了解时间吗?

你还记得“软件真的好难做”中的那个有意思的例子吗?那个例子告诉我们软件开发中假设可能会是致命的事。今天,我又在StackOverflow上看到一个关于时间的问题——为什么1927年12月31日的午夜时间这么奇怪?提问题的这个人给了下面的一段java代码(我做一些修改,保证让你可以copy过去就可以编译运行)

我在其中高亮了几行,这个程序就是想比较一下“1927-12-31 23:54:07”  和  “1927-12-31 23:54:08” 差几秒,很明显,是差一秒。但是程序的输出却不是这样的。

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
class time{
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sf.setTimeZone(TimeZone.getTimeZone("Asia/shanghai"));
        String str3 = "1927-12-31 23:54:07";
        String str4 = "1927-12-31 23:54:08";
        Date sDt3 = sf.parse(str3);
        Date sDt4 = sf.parse(str4);
        long ld3 = sDt3.getTime() /1000;
        long ld4 = sDt4.getTime() /1000;
        System.out.println(ld3);
        System.out.println(ld4);
        System.out.println(ld4-ld3);
    }
}

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (25 人打了分,平均分: 4.88 )
Loading...
面向对象的Shell脚本

面向对象的Shell脚本

还记得以前那个用算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西。你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可能,这不,我在网上又看到了一个把Shell脚本整成面向对象的东西。Shell本来是不支持的,需要自己做点东西,能搞出这个事事的人真的是hacker啊。

当然,这里并不是真正的面向对象,因为其只是封装罢了,还没有支持继承和多态。最变态的是他居然还支持typeid,靠!

下面让我们看看他是怎么来做的。下面的脚本可能会有点费解。本想解释一下,后来想想,还是大家自己专研一下吧,其实看懂也不难,给大家提几个点吧。

  1. 我们可以看到,下面的这个脚本定义了class,  func, var, new 等函数,其实这些就是所谓的关键字。
  2. class是一个函数,主要是记录类名。
  3. func和var实际上是把成员函数名和成员变量记成有相同前缀的各种变量。
  4. new方法主要是记录实例。大家重点看看new函数里的那个for循环,最核心的就在那里了。
脚本如下所示:
好烂啊有点差凑合看看还不错很精彩 (9 人打了分,平均分: 4.78 )
Loading...