摘要: hash_map的简洁实现hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样。如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢?我们知道hash_map最重要两个概念是hash函数和冲突解决算法。hash_map键-值之间的映射关系,hash函数将键映射为内存地址,冲突解决算法用于解决不同的键映射为相同地址时候的情况。数据结构和算法导论中介绍了大量的hash函数和冲突解决算法,如果选择实现精简的hash_map,那么可以选择“除留取余法”作为hash函数,选择“开散列地址链”作为冲入解决算法。这样的选择不仅使得hash_map实现简单,而且有很高的查询效率 阅读全文
posted @ 2013-09-12 18:12 Florian 阅读(15268) 评论(3) 推荐(3) 编辑
摘要: 缓冲区溢出攻击缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《0day安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Studio2010。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘 阅读全文
posted @ 2013-08-10 18:54 Florian 阅读(70526) 评论(11) 推荐(17) 编辑
摘要: 统计一下你写过多少代码最近整理了一下自己从开始学习编程以来写过的程序和代码,林林总总,花了不少的时间,最后把一些自认为还算不错的代码提交到github上做一个简单的分类和备份。当然我并不奢求它们能成为多好的开源代码,只是希望通过这种方式分享自己的劳动成果罢了。如果大家有兴趣可以访问我的github,欢迎朋友们提出意见和建议。在我整理代码的时候,突发奇想地想知道自己曾经写过多少行代码。相信手握大量代码的童鞋应该也有类似的想法,于是查阅资料来完成这个目标。首先,我们需要一点时间做一下准备工作。我们需要将自己写过的程序拷贝到一个文件夹下边,以防我们把一些教程和示例的代码也统计进去了,这的确需要不少精 阅读全文
posted @ 2013-07-20 13:41 Florian 阅读(6272) 评论(10) 推荐(0) 编辑
摘要: 红黑树数据结构剖析红黑树是计算机科学内比较常用的一种数据结构,它使得对数据的搜索,插入和删除操作都能保持在O(lgn)的时间复杂度。然而,相比于一般的数据结构,红黑树的实现的难度有所增加。网络上关于红黑树的实现资料汗牛充栋,但是乏于系统介绍红黑树实现的资料。本文通过一个自己实现的红黑树数据结构以及必要的搜索,插入和删除操作算法,为大家更系统地剖析红黑树数据结构的实现。对于大部分数据结构,一般都会使用抽象数据类型的方式实现,C++提供的模板机制可以做到数据结构与具体数据类型无关,就像STL实现的那样。不过本文并非去实现STL中的红黑树,更重要的是透过红黑树的实现学习相关的算法和思想。当然,我们还 阅读全文
posted @ 2013-07-13 12:53 Florian 阅读(29781) 评论(18) 推荐(24) 编辑
摘要: 一个简单的通用Makefile实现Makefile是Linux下程序开发的自动化编译工具,一个好的Makefile应该准确的识别编译目标与源文件的依赖关系,并且有着高效的编译效率,即每次重新make时只需要处理那些修改过的文件即可。Makefile拥有很多复杂的功能,这里不可能也没必要一一介绍,为了简化问题的复杂性,本文仅和大家讨论针对单目录下的C/C++项目开发,如何写一个通用的Makefile。首先,我们假设当前工程目录为prj/,该目录下有6个文件,分别是:main.c、abc.c、xyz.c、abc.h、xyz.h和Makefile。其中main.c包含头文件abc.h和xyz.h,a 阅读全文
posted @ 2013-06-17 20:53 Florian 阅读(17827) 评论(1) 推荐(2) 编辑
摘要: 最简git Server配置如何保持多台计算机的项目代码的同步更新呢?通过在一个公用计算机上开启git服务,任何能与该计算机互联的终端都可以同步最新的项目代码。每个终端所负责的就是下载代码更新,修改代码,提交代码更新,这些工作产生的变化能全部反应到git服务器上。同时,这么做也能避免使用github导致的代码过早公布的弊端。从此代码的版本控制和备份问题得到完美解决!服务端配置:1.安装git:sudo apt-get install git-core2.安装ssh服务:sudo apt-get install openssh-server3.创建服务端仓库文件夹(用户root可以访问):mkd 阅读全文
posted @ 2013-05-27 21:19 Florian 阅读(3589) 评论(1) 推荐(1) 编辑
摘要: Lisp的本质(The Nature of Lisp)学习思考作者 Slava Akhmechet 译者 Alec Jang出处: http://www.defmacro.org/ramblings/lisp.html简介最初在web的某些角落偶然看到有人赞美Lisp时, 我那时已经是一个颇有经验的程序员。在我的履历上, 掌握的语言范围相当广泛, 象C++, Java, C#主流语言等等都不在话下, 我觉得我差不多知道所有的有关编程语言的事情。对待编程语言的问题上, 我觉得自己不太会遇到什么大问题。其实我大错特错了。我试着学了一下Lisp, 结果马上就撞了墙。我被那些范例代码吓坏了。我想很多初 阅读全文
posted @ 2013-05-02 17:42 Florian 阅读(1190) 评论(0) 推荐(0) 编辑
摘要: git使用小结很多人可能和我一样,起初对git是一无所知的。我也是因为一次偶然的机会接触到git,并被它强大的功能所蛰伏。git其实就是一种版本控制工具,就像svn一样,但是git是分布式的。我不想给git打广告,我们直入正题——git能帮我们做什么?1)源码版本控制。平常写一写demo程序可能和git打不上交道,但是当我们把程序写到10000行以上,一般一个人开发的话要持续一个多月。期间程序作者可能会保存了N多份程序不同时期的拷贝,一来是为了备份代码,二者是作者添加新的程序功能,一旦对新功能不满意时可以方便撤销。git能帮助我们保存每次提交源码更改时的历史记录,并在需要的时候帮助我们撤销回滚 阅读全文
posted @ 2013-04-22 15:43 Florian 阅读(3839) 评论(12) 推荐(4) 编辑
摘要: Linux内核源码分析方法一、内核源码之我见Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了解到的信息。Linux内核由无数开源社区的“大神们”精心维护,这些 阅读全文
posted @ 2013-03-20 10:20 Florian 阅读(24911) 评论(7) 推荐(19) 编辑
摘要: 新手读懂五线谱一直以来都觉得五线谱好神秘,作为计算机专业的我,音乐水平也就停留在儿时“一闪一闪亮晶晶”的层次上。最近有幸认识了一位音乐方面的“大神”,难得抓住一个机会,好好请教一下。最终的结果还是对得起自己的音乐智商的,我也从一个对音乐无知的小白,变成了一个能看懂五线谱的菜鸟了(在这里需要特别的感谢这位无私的“大神”~)。如果你有兴趣也想了解五线谱的话,不如过来一起分享一下获得这些知识的快乐~我们按照三个步骤来学习:1.学习简谱的基本知识。2.学习五线谱的基本知识。3.找简谱和五线谱之间的对应关系。之所以这么做,是因为通过简谱可以方便得了解一些基本的乐理知识,假如你看得懂简谱,请跳过这一节。然 阅读全文
posted @ 2013-03-18 13:33 Florian 阅读(522804) 评论(96) 推荐(83) 编辑