Browsed by
分类:编程语言

千万不要把 bool 设计成函数参数

千万不要把 bool 设计成函数参数

我们有很多Coding Style 或 代码规范。但这一条可能会经常被我们所遗忘,就是我们经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性。不信?我们先来看看下面的代码。

当你读到下面的代码,你会觉得这个代码是什么意思?

widget->repaint(false);

是不要repaint吗?还是别的什么意思?看了文档后,我们才知道这个参数是immediate, 也就是说,false代表不立即重画,true代码立即重画。

Windows API中也有这样一个函数:InvalidateRect,当你看到下面的代码,你会觉得是什么意思?

InvalidateRect(hwnd, lpRect,  false);

我们先不说InvalidateRect这个函数名取得有多糟糕,我们先说一下那个false参数?invalidate意为“让XXX无效”,false是什么意思?双重否定?是肯定的意思?如果你看到这样的代码,你会相当的费解的。于是,你要去看一下文档,或是InvalidateRect的函数定义,你会看到那个参数是 BOOL bErase,意思是,是否要重画背景。

这样的事情有很多,再看下面的代码,想把str中的”%USER%”替换成真实的用户名:

str.replace("%USER%", user, false);   // Qt 3

TNND,那个false是什么意思?不替换吗?还是别的什么意思,看了文档才知道,false代码大小写不敏感的替换。

其实,如果你使用枚举变量/常量,而不是bool变量,你会让你的代码更易读,如:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (27 人打了分,平均分: 4.30 )
Loading...
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...
你会做Web上的用户登录功能吗?

你会做Web上的用户登录功能吗?

Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能。下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系到用户安全的功能,希望大家能从下面的文章中能知道什么样的方法才是一个好的用户登录功能。以下内容,转载时请保持原文一致,并请注明作者和出处

用户名和口令

首先,我们先来说说用户名和口令的事。这并不是本站第一次谈论这个事了。如何管理自己的口令让你知道怎么管理自己的口令,破解你的口令让你知道在现代这样速度的计算速度下,用穷举法破解你的口令可能会是一件很轻松的事。在这里我想告诉从开发者的角度上来做设计这个用户名和口令的事。下面一几件规则:

  • 限制用户输入一些非常容易被破解的口令。如什么qwert,123456, password之类,就像twitter限制用户的口令一样做一个口令的黑名单。另外,你可以限制用户口令的长度,是否有大小写,是否有数字,你可以用你的程序做一下校验。当然,这可能会让用户感到很不爽,所以,现在很多网站都提供了UX让用户知道他的口令强度是什么样的(比如这个有趣的UX),这样可以让用户有一个选择,目的就是告诉用户——要想安全,先把口令设得好一点。
  • 千万不要明文保存用户的口令。正如如何管理自己的口令所说的一样,很多时候,用户都会用相同的ID相同的口令来登录很多网站。所以,如果你的网站明文保存的话,那么,如果你的数据被你的不良员工流传出去那对用户是灾难性的。所以,用户的口令一定要加密保存,最好是用不可逆的加密,如MD5或是SHA1之类的有hash算法的不可逆的加密算法。CSDN曾明文保存过用户的口令。(另,对于国内公司的品行以及有关部门的管理方式,我不敢保证国内网站以加密的方式保存你的口令。我觉得,做为一个有良知的人,我们应该加密保存用户的口令)
好烂啊有点差凑合看看还不错很精彩 (40 人打了分,平均分: 4.70 )
Loading...
C++11 中值得关注的几大变化(详解)

C++11 中值得关注的几大变化(详解)

源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变化“追问为什么要引入这些变化”的一个探讨,只有知道为了什么,用在什么地方,我们才能真正学到这个知识。而以此你可以更深入地了解这些变化。所以,本文不是翻译。因为写得有些仓促,所以难免有问题,还请大家指正。

Lambda 表达式

Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略。 定义在与 lambda 函数相同作用域的变量参考也可以被使用。这种的变量集合一般被称作 closure(闭包)。我在这里就不再讲这个事了。表达式的简单语法如下,

[capture](parameters)->return_type {body}

原文的作者给出了下面的例子:

int main()
{
   char s[]="Hello World!";
   int Uppercase = 0; //modified by the lambda
   for_each(s, s+sizeof(s), [&Uppercase] (char c) {
    if (isupper(c))
     Uppercase++;
    });
 cout << Uppercase << " uppercase letters in: " << s <<endl;
}

在传统的STL中for_each() 这个玩意最后那个参数需要一个“函数对象”,所谓函数对象,其实是一个class,这个class重载了operator(),于是这个对象可以像函数的式样的使用。实现一个函数对象并不容易,需要使用template,比如下面这个例子就是函数对象的简单例子(实际的实现远比这个复杂):

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (21 人打了分,平均分: 4.38 )
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...
对象的消息模型

对象的消息模型

[ ———— 感谢 Todd 同学 投递本文,原文链接 ———— ]

C++对象模型

话题从下面这段C++程序说起,你认为它可以顺利执行吗?

//C++
class A {
    public:
        void Hello(const std::string& name) {
           std::cout << "hello " << name;
         }
};
int main(int argc, char** argv)
{
    A* pa = NULL; //!!
    pa->Hello("world");
    return 0;
}

试试的确可以顺利运行输出hello world,奇怪吗?其实并不奇怪,根据C++对象模型,类的非虚方法并不会存在于对象内存布局中,实际上编译器是把Hello方法转化成了类似这样的全局函数:

void A_Hello_xxx(A * const this, const std::string& name) {
    std::cout << “hello “ << name;
}

对象指针其实是作为第一个参数被隐式传递的,pa->Hello(“world”)实际上是调用的A_Hello_xxx(pa, “world”),而恰好A_Hello_xxx内部没有使用pa,所以这段代码得以顺利运行。

对象的消息模型

如果是研究C++对象模型,上面的讨论可以到此为止,不过这里我想从另一个层面来继续探讨这个问题。OOP的先驱人物Alan Kay在总结Smalltalk的OO特征时强调:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (10 人打了分,平均分: 4.80 )
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...
语言的数据亲和力

语言的数据亲和力

[ 感谢 Todd 同学投递本文 ]

目前,程序设计语言似乎进入了一个蓬勃发展的时期,Javascript、Perl、Python、Ruby、Groovy等一批较新的语言正越来越多地被熟悉和使用,而C++、C#、Java等主流语言也在不断地融入函数式和动态性特征。程序员的百宝箱中可供选择的宝贝是越来多了,而社区中关于语言间的比较和争论也更为热烈,我们常常见到关于“面向过程和面向对象的比较”、“动态语言和静态语言的比较”、“命令式和函数式范式的比较”等比较。我注意到这类讨论的关注点多集中于设计相关话题,如“动态语言的Duck typing多态和静态语言的继承多态的比较”,“Prototype based和Class based的比较”等。但我认为还有一个十分重要的方面值得关注,这就是数据处理。

数据处理之所以重要是因为不论是本地信息存储还是系统间信息交换都需要建立在一定的数据格式基础上。另外,不管语言属于那种范式,设计上采用什么模式,在微观层次上程序很大一部分工作都是在做数据处理。所以,从数据处理角度比较和理解语言间的差异有重要的现实意义。虽然数据通常是平台和语言无关的,但不同的语言在处理某种格式的数据时会表现出不同的难度,甚至某些数据格式只能采用特定的语言才能实现,这就是数据亲和力的不同。

语言的数据亲和力(Data Affinity)指的是语言的数据模型与某种数据格式之间的匹配程度。语言对某种数据格式亲和力越强,则操作某类数据越容易。

 

二进制字节块格式

 

 

在偏底层的操作系统、嵌入式和通信系统中,二进制的字节块是最常见的一种数据格式。二进制数据布局紧凑和接近机器的特点使得它常常作为系统间通信或系统文件的数据格式,但一般高级语言都不方便直接和0101打交道,而是基于记录、结构体和类等结构化表示操作数据,这就存在着在底层的二进制字节块和高层的结构化数据直接的转换问题。

阅读全文 Read More

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