Christmas – HTML5

2011年12月25日 5 条评论

今天是Christmas, 首先向所有的亲人和朋友们道一声Merry Christmas,天气冷了,大家注意防寒。 早上,看到Cnbeta的头条是一个关于程序员的故事—-程序猿的HTML5圣诞礼物,讲的是一个程序员朋友用HTML5给自己女朋友做的一个Christmas礼物,想必所有的程序员朋友的GF看了都会有点暖暖的感觉。一直以来,听大家讲HTML5,自己也没去了解过,一个人的Christmas,正好了解一下HTML5。

1. 什么是HTML5?
HTML5是指新版本的HTML,最近的一个版本是4.01,于1999年发布,自此之后就没做过什么大的改动,HTML5是下一代的HTML。现在,HTML5的标准还没有正式发布,但是主流的浏览器(包括IE, Chrome, Firefox, Safari)等已陆续开始支持HTML5的特性了。 阅读全文…

分类: 程序人生 标签: , 398 views

谈谈程序的封装

2011年12月11日 4 条评论

近半年来,团队加入了不少新同学,陆陆续续也看过不少新同学写的代码,一个比较大的感受是,新同学程序的逻辑上问题不会太大,但是代码的封装方面,还是有明显的不足。具体主要包括以下几个方面,一是命名,包括类、函数、变量等的,一个好的名字,可以让读程序的人一看到它就大概知道它是做什么用的;二是函数、类的划分,哪些实体应该抽象为一个类,这个实体的那些功能该抽象成函数,这是程序设计中最为重要的内容;三是线程安全,在多线程环境下,线程安全是一个很重要的话题,很多时候因为封装的不合理,导致使用上的不方便,更为严重的是造成死锁等的问题。下面就分别从这三个方面,谈一些自己的看法,希望能够对初入职场的新同学有所帮助。

第一个方面是命名,这个是最为基本的内容。可以这样讲,把写程序比做写文章,命名对于程序的作用,就相当于措词对于文章,好的措词对于一篇好的文章的作用,不用我再多说。关于程序中的命名,主要包括三种,一是类型名,二是函数名,三是变量名。类型名在C++中应对的包括class, struct, enum等,它们都是抽象出来的一个实体,因此它们的名字最好是一个名词,或者名词词组,比如PCManager,它是一个PC管理器类型。 阅读全文…

分类: 程序人生 标签: , , , , 1,160 views

漫话C++0x(六)—- variadic templates

2011年11月20日 3 条评论

熟悉printf/scanf的朋友应该对C/C++中的变参函数不陌生,它可以支持任意个数的参数。模板(template)在C++中的地位相信不用我再多说,但是,一直以来,C++模板不支持变参,这成了模板一个被诟病的地方,在很多使用场景限制了模板的威力。举例来说,同样语义的模板函数,因为参数个数不定,有若干个,这样的场景之下,我们只能通过枚举的方式来实现。这样的方法,一方面使得代码本身不够简洁,另一方面因为枚举只能做到有限个数的参数,还是在一定程度上限制了使用的灵活性。现在,C++0x引入了变参模板,上面讲的问题便迎刃而解了,这对C++程序员朋友们来说是莫大的福音。下面我们先看一个简单的例子,先对变参模板有一个直观的印象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include < iostream>
#include < string>
 
void Print()
{
    std::cout < < "\n";
}
 
template< typename T, typename ... TRest>
void Print(const T& obj, const TRest& ... rest)
{
    std::cout < < obj << " ";
    Print(rest ...);
}
 
int main()
{
    double p = 3.14;
    std::string s("pi");
    Print(p, &p, s, &s);
}

阅读全文…

分类: 程序人生 标签: , , , 1,213 views

2012

2011年11月13日 8 条评论


2011即将过去,再剩下差不多两个月的时间了。每年到了近年关,总感觉事情额外的多,有时候真的觉得有点心力交瘁,但是没有办法,还是得挺着。晚上把过年回家的机票搞定,好好整理一下心情,迎接2012来临之前的最后两个月!最近可能由于压力比较大,感觉有点小浮躁,需要好好静心反思一下,calm down and take it easy! 越来越觉得,职场确实是一所大学校,有好多东西需要我们去学习,而这些中,很多都是与技能无关的。在这个学习的过程中,有时候确实需要因为我们的无知而付出一些代价,这也许是我们成长需要经历的必要的过程,经历了,收获了,相信会越来越好的!

分类: 生活感悟 标签: 204 views

漫话C++0x(五)—- thread, mutex, condition_variable

2011年11月6日 6 条评论

熟悉C++98的朋友,应该都知道,在C++98中没有thread, mutex, condition_variable这些与concurrency相关的特性支持,如果需要写多线程相关程序,都要借助于不同平台上各自提供的api,这样带来的问题就是程序的跨平台移植性比较差,经常要用一大堆的#ifdef WIN32类似的宏来区分不同的平台,搞得程序很难看。C++0x最原始的初衷之一就是为了让C++的功能更加强大,更加方便使用。现如今硬件如此发达,concurrency在程序设计中已经是司空见惯的事情了,如果C++再不支持这些concurrency相关的特性,就真的out了。现在,C++程序员的福音到了,C++0x提供了对thread, mutex, condition_variable这些concurrency相关特性的支持,以后多线程这一块的代码可以完全跨平台了,而且由于C++0x封装的都比较好,代码写起来也十分简洁。下面开始介绍今天的内容。

  • 1. thread
  • 写过多线程程序的朋友,相信对thread本身都不会陌生,这里不对thread本身做太多的说明,以介绍C++0x中提供的thread的用法为主。请大家先看下面的例子: 阅读全文…

分类: 程序人生 标签: , , , , 5,864 views

推荐一个课程

2011年10月30日 12 条评论

一直以来,对机器学习这个领域比较感兴趣,但由于平时所做的工作与这个方面关系不大,所以一直也没有深入、系统的学习过。但由于比较感兴趣,所以平时也零零散散地了解过一些相关的内容。小时候读书的时候,听老师说21世纪是信息爆炸的时代,现在是真真切切的感受到了。随着人们可用的信息量越来越大,如何在如此庞大的信息海洋中找到对自己有用的信息,成为了一个越来越重要的领域。而机器学习,在这个领域中的作用越来越大,越发觉得它将是未来改变世界的一把利剑。举几个生活中比较常见的例子,现在比较火的一些sns社区中的个性化推荐引擎,这个东西威力真的很大,它通过对已有数据的‘学习’,然后把你感兴趣的事物推荐给你,从人们主动去搜索,到被动的被推荐,这中间有一个质的飞越,毕竟人的本性都是懒惰的,再说很多时候,并不是每个人都清楚的知道自己喜欢什么,而推荐引擎所推荐的,很多时候都是你喜欢的,这个够神奇吧。再举一个垃圾邮件的例子,相信几年前email刚流行起来的时候,大家对这个事情都比较头疼。垃圾邮件的处理,也是一个很好的机器学习的例子,基本的思路是通过对已有的一些垃圾邮件进行特征提取,然后利用这些特征和垃圾邮件数据训练出一个识别垃圾邮件的模型,做的好的这样的模型准确率和召回率都还是挺不错的,现在像qq和163这些邮箱的邮件反垃圾还都不错的。这些机器学习相关的例子,都是与我们的生活关系非常密切的,信息技术越发达,机器学习的作用越大,我称之为可以改变世界的一把利剑。 阅读全文…

分类: 机器学习 标签: , , 895 views

漫话C++0x(四) —- function, bind和lambda

2011年10月23日 4 条评论

本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础。下面我们来看看wikipedia上对于计算机领域的closure的定义:

A closure (also lexical closure, function closure or function value) is a function together with
a referencing environment for the non-local variables of that function.

上面的大义是说,closure是一个函数和它所引用的非本地变量的上下文环境的集合。从定义我们可以得知,closure可以访问在它定义范围之外的变量,也即上面提到的non-local vriables,这就大大增加了它的功力。关于closure的最重要的应用就是回调函数,这也是为什么这里把function, bind和lambda放在一起讲的主要原因,它们三者在使用回调函数的过程中各显神通。下面就为大家一步步接开这三者的神秘面纱。

  • 1. function
  • 我们知道,在C++中,可调用实体主要包括函数,函数指针,函数引用,可以隐式转换为函数指定的对象,或者实现了opetator()的对象(即C++98中的functor)。C++0x中,新增加了一个std::function对象,std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。我们来看几个关于function对象的例子: 阅读全文…

    分类: 程序人生 标签: , , , , , 6,881 views

    Happy Birthday!

    2011年10月19日 5 条评论


    又是一年的今天,猛然发现来深圳已经三年有余了,不变的是每天简单、充实的生活,变了的是一颗渐渐老去的心。QQ空间、微博上收到不少朋友的祝福,突然觉得有点感慨。刚上大学那会儿,同学、朋友过生日,都是通过写信、发短信或者打电话的方式来祝福,后来慢慢变成了email, 现在又变成了sns的虚拟礼物或者微博,这样的过程,正是这些年来互联网发展的过程,互联网正在慢慢改变我们的生活,每一个角落都不放过。

    今天也是doubletony同学的生日,大学时一个班的兄弟,同年同月同日生,这种小概率事件,能聚在一起是多么的不容易。自从知道是同年同月同日生,无论身在何处,每年都要相互祝福一下。今年是他先在微博上提起,我才突然想起。在这里也祝福一下,tony兄弟在米国好好加油,坚守自己的理想,生日快乐!
    阅读全文…

    分类: 生活感悟 标签: 198 views

    再谈“事件驱动”

    2011年10月16日 1 条评论

    之前也写过一些关于事件驱动模型的文章,事隔一年多,再谈起事件驱动,又是一种新的感触,借此文来分享一下,希望能够帮助到在工作、学习中在这方面遇到困惑的朋友。

    通常,我们会把轮询和事件驱动拿来做对比,关于它们两者,我在《浅淡“事件驱动”》一文中有举过一个传统邮件和电子邮件的例子,可以帮助大家来理解。轮询的最大缺点是盲目的做,CPU浪费很严重;事件驱动解决了浪费CPU的问题,它只在需要做的时候做,但是在实现上相对要复杂一些。不过总的来说,再复杂的模型,只要理解了它的原理,都阻挡不了聪明的人类使用它的步伐。

    工作的两三年的时间里,陆陆续续也做过不少项目,写过不少程序。每次写新的程序,或者是看别人写的程序,都多多少少对会反思自己以前写的程序中使用过的一些模型,想着如何来改进它,使得程序的可扩展性,可复用性等越来越好。通过这样的一些过程,自己也确实发现了变化,也积累了一些经验,总结一下,分享给大家。接下来我将通过一些实例,来介绍事件驱动模型在实现的过程中需要注意的一些点。 阅读全文…

    分类: 程序人生 标签: , , 1,148 views

    纪念乔帮主

    2011年10月9日 5 条评论

    刚刚过去的国庆,对于所有的人来说,都是非常的不平凡,苹果新品发布会在吸引了足够多的眼球后如期而至,结果因为没有果粉们期待已久的iphone5,使广大果粉大失所望。第二天一大早,上微博,发现乔帮主上船了,新浪微博、腾讯微博,几乎全是是关于乔帮主上船的消息。看到有网友调侃说“做人应像乔布斯,活着刷我们的卡,死了刷我们的屏”,虽说有点俏皮的味道,但也不失为事实。

    对于我自己而言,第一次知道乔帮主大概是在07年底,抑或是在08年初,当时我们的软件工程老师从美国带来一台iphone,在课堂上给我们show,让我们体验,当时真的非常震惊。那时起,知道了iphone,后来也自然而然地知道了乔布斯。

    后来到了2009年下半年的时候,李开复离开谷歌,当时写了一篇很题为《再见,谷歌》的博文,向社会各界阐述他离开谷歌的原因,向谷歌告别。这篇文章在当时也算是轰动一时,在博文的最后,开复引用了一段乔布斯的话来做为结束语,至今让我记忆犹新——“最重要的,拥有跟随内心与直觉的勇气,你的内心与直觉多少已经知道你真正想要成为什么样的人。任何其它事物都是次要的。”从那时起,乔布斯这个名字,已经深深的烙在我的心里,’Follow your heart’也成为了我自己很多时候来做抉择的标准。 阅读全文…

    分类: 生活感悟 标签: , , , , 144 views

    手把手教你玩转GDB(2)—在GDB中玩转STL(ppt)

    2011年10月1日 19 条评论

    上周给team成员分享的—-GDB系列第二弹—-主要内容是分析STL中常用容器的结构,教大家如何在GDB中玩转STL,让STL的调试不再头疼。如果对GDB不是很熟的朋友,我之前推出过一系列的GDB相关的文章,可以先看一下之前的文章,然后再看这个会轻松一些。之前的GDB系列文章参见下面的“相关文章”列表。下面是flash版的PPT,大家可以先堵为快:

    Get Adobe Flash player


    如果觉得flasht版不够给力的朋友,可以在下面留言,向我索取原始的ppt版本,记得留下邮箱地址。或者到新浪微博,收听小武哥博客(http://weibo.com/zeshengwu),然后给我发私信索取,谢谢!

    漫话C++0x(三)

    2011年9月24日 没有评论

    本文是《漫话C++0x》系列的第三篇,接前面的内容,继续为大家介绍一些C++0x中增加的比较好玩的特性。我们知道变量的初始化在C++中是一个比较重要的话题,好的编程习惯建议大家在声明变量的时候最好初始化,这样可以避免一些不必要的问题。另外,在C++98中,变量的初始化(initialization)和赋值(assignment)是两个比较重要的概念,这里大家可以回顾一下,比如常量只能初始化,不能赋值。

    今天要讲的主要内容就是C++0x中新增加的统一初始化的语法,通过与C++98中的对比,我们来加深对C++0x的理解。下面我们来看一些C++98中初始化的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    /// 各种形式的初始化
    const int x(5);           ///< 直接初始化
    const int y = 5;          ///< copy构造初始化
    int arr[] = {1, 2, 3};    ///< 大括号初始化
    struct Point{int x, y;};
    const Point p = {1, 2};   ///< 大括号初始化
    class PointX
    {
    public:
        PointX(int x, int y);
    private:
        int x, y;
    };
    const PointX px(1, 2);    ///< 构造函数初始化
    std::vector< int> vec(arr, arr+3); ///< 从别的容器初始化

    阅读全文…

    分类: 程序人生 标签: , , , , 833 views

    漫话C++0x(二)

    2011年9月17日 9 条评论

    本文是《漫话C++0x》系列的第二篇,从本篇开始,我将正式为大家介绍C++0x新增的特性,帮助大家认识C++0x。由于C++0x增加的特性还是挺多的,限于篇幅原因,每一篇只能介绍大概4、5个特性,所以,要把所有的新特性介绍完,需要好几个篇幅。下面言归正传,开始今天要介绍的内容,首先从大家最常用到的基本特性讲起。

  • 1. auto用来声明变量
  • 大家先看看下面的代码,一个我们比较熟悉的C++98中遍历map的例子:

    1
    2
    3
    4
    5
    
    std::map< std::string, std::vector<int> > mp;
    for (std::map< std::string, std::vector<int> >::iterator i = mp.begin(); i != mp.end(); ++i)
    {
        /// traverse the map
    }

    阅读全文…

    分类: 程序人生 标签: , , 1,547 views

    漫话C++0x(一)

    2011年9月10日 2 条评论

    关于C++0x,很多朋友可能会感到比较陌生,其实简单来讲,它就是C++语言的一个升级版本,至于为什么叫C++0x,且听我一一说来。在介绍C++0x的由来之前,有必要介绍一下C++语言的发展历史,从一开始到现在,C++大概经历了以下几个比较重要的阶段:

  • 1998: ISO官方发布C++标准,俗称C++98,这是第一个C++的官方正式版本
  • 2003: TC1(Technical Corrigendum 1)发布,俗称C++03, 这个版本可以当成是C++98的一个bugfix版本
  • 2005:TR1(Technical Report 1)发布,TR1是一个新增加的库,增加了大约14种新的组件到C++标准中
  • 2008:新C++标准(C++0x)草案发布,这个主要是以TR1的基础上进行了扩充
  • 2011:C++0x标准通过
  • 阅读全文…

    分类: 程序人生 标签: , 1,232 views

    下一个“浪潮之巅”在哪里?

    2011年8月28日 1 条评论

    浪潮之巅8月5号,从吴军老师手中接过亲笔签赠的〈浪潮之巅〉,中间由于工作关系,每天断断续续的看一部分,终于在上个星期的时候看完了。吴军老师作为一名计算机科学家,长期待在美国,“有幸”见证IT发展的历史,这不足不奇。但是,他能够把整个历史串得如此生动、娓娓道来,这不是每个人都能做到的。正如李开复老师在序言中所说“我认识很多顶尖的工程师,但具备强大叙事能力的优秀工程师,我认识的可以说是凤毛麟角,而吴军是其中之一”。之前由于工作的缘故,也听过吴军老师几次的报告会,有技术的,也有非技术的。一方面对他技术上的造诣感觉不可望其项背,一方面对他知识面的广博更加觉得不可思议。

    之前看过林军老师写的一本〈沸腾十五年〉,主要内容是近十五年来,国内IT业的发展情况。我个人推荐还没看过〈浪潮之巅〉的朋友,把〈浪潮之巅〉和〈沸腾十五年〉拿来一起看,这样对国内外的IT发展史就会有一个相对比较全面的认识。当然,这是题外话了,这里还是主要说一下看完〈浪潮之巅〉之后的一想感想,下面言归正传。 阅读全文…