2011年8月21日

MYSQL会造成隐式提交的语句

MYSQL会造成隐式提交的语句

  

    以下语句(以及同义词)均隐含地结束一个事务,似乎是在执行本语句前,您已经进行了一个COMMIT。

  ·ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE TABLE, UNLOCK TABLES.

  ·当当前所有的表均被锁定时,UNLOCK TABLES可以提交事务。

  ·CREATE TABLE, CREATE DATABASE DROP DATABASE, TRUNCATE TABLE, ALTER FUNCTION, ALTER PROCEDURE, CREATE FUNCTION, CREATE PROCEDURE, DROP FUNCTION和DROP PROCEDURE等语句会导致一个隐含提交。

  ·InnoDB中的CREATE TABLE语句被作为一个单一事务进行处理。这意味着,来自用户的ROLLBACK不会撤销用户在事务处理过程中创建的CREATE TABLE语句。

  事务不能被嵌套。这是隐含COMMIT的结果。当您发布一个START TRANSACTION语句或其同义词时,该COMMIT被执行,用于任何当前事务。


转载请注明来源网址:http://book.china701.com/629/10113Q615696.html

posted @ 2011-08-21 18:53 linw 阅读(66) 评论(0) 编辑

2011年8月16日

Java 正则表达式最大,最小匹配问题

无标题文档
最大匹配模式X?     X, once or not at all

X*     X, zero or more times

X+     X, one or more times

X{n}     X, exactly n times

X{n,}     X, at least n times

X{n,m}     X, at least n but not more than m times

最小匹配模式X??     X, once or not at all

X*?     X, zero or more times

X+?     X, one or more times

X{n}?     X, exactly n times

X{n,}?      X, at least n times

X{n,m}?     X, at least n but not more than m times

posted @ 2011-08-16 23:17 linw 阅读(154) 评论(0) 编辑

2011年7月21日

程序员技术练级攻略(转载)

转载:http://coolshell.cn/articles/4990.html

程序员技术练级攻略

2011年7月18日

月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告诉我,他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜欢编程和技术的家伙,于是,我让他把他的一些学习Python和Web编程的一些点滴总结一下。于是他给我发来了一些他的心得和经历,我在把他的心得做了不多的增改,并根据我的经历增加了“进阶”一节。这是一篇由新手和我这个老家伙根据我们的经历完成的文章

我的这个朋友把这篇文章取名叫Build Your Programming Technical Skills,我实在不知道用中文怎么翻译,但我在写的过程中,我觉得这很像一个打网游做任务升级的一个过程,所以取名叫“技术练级攻略”,题目有点大,呵呵,这个标题纯粹是为了好玩这里仅仅是在分享Mailper和我个人的学习经历。(注:省去了我作为一个初学者曾经学习过的一些技术(今天明显过时了),如:Delphi/Power builder,也省去了我学过的一些我觉得没意思的技术Lotus Notes/ActiveX/COM/ADO/ATL/.NET ……)

前言

你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)

建议:

  • 不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。
  • 回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。
  • 一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。
  • 一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。

:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:

  • 现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。Windows的图形界面不吃香了。
  • 越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。
  • 微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。详情参见《Windows编程革命史

所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。

启蒙入门

1、 学习一门脚本语言,例如Python/Ruby

可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:

  • 处理文本文件,或者csv (关键词 python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)
  • 遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果
  • 跟数据库打交道 (python sqlite),写一个小脚本统计数据库里条目数量
  • 学会用各种print之类简单粗暴的方式进行调试
  • 学会用Google (phrase, domain, use reader to follow tech blogs)

为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。

2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具

  • Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。
  • Source Insight (或 ctag)

使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。

3、 熟悉Unix/Linux Shell和常见的命令行

  • 如果你用windows,至少学会用虚拟机里的linux, vmware player是免费的,装个Ubuntu吧
  • 一定要少用少用图形界面。
  • 学会使用man来查看帮助
  • 文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
  • 学会使用一些文本操作命令 sed/awk/grep/tail/less/more …
  • 学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…
  • 了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息
  • 了解正则表达式,使用正则表达式来查找文件。

对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。

4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)

未来必然是Web的世界,学习WEB基础的最佳网站是W3School

  • 学习HTML基本语法
  • 学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)
  • 学会用  Firefox + Firebug 或 chrome 查看你觉得很炫的网页结构,并动态修改。
  • 学习使用Javascript操纵HTML元件。理解DOM和动态网页(http://oreilly.com/catalog/9780596527402) 网上有免费的章节,足够用了。或参看 DOM 。
  • 学会用  Firefox + Firebug 或 chrome 调试Javascript代码(设置断点,查看变量,性能,控制台等)
  • 在一台机器上配置Apache Nginx
  • 学习PHP,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。
  • 把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)
  • 跟完一个名校的网络编程课程(例如:http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php ) 不要觉得需要多于一学期时间,大学生是全职一学期选3-5门课,你业余时间一定可以跟上
  • 学习一个javascript库(例如jQuery 或 ExtJS)+  Ajax (异步读入一个服务器端图片或者数据库内容)+JSON数据格式。
  • HTTP: The Definitive Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)
  • 做个小网站(例如:一个小的留言板,支持用户登录,Cookie/Session,增、删、改、查,上传图片附件,分页显示)
  • 买个域名,租个空间,做个自己的网站。

进阶加深

1、 C语言和操作系统调用

  • 重新学C语言,理解指针和内存模型,用C语言实现一下各种经典的算法和数据结构。推荐《计算机程序设计艺术》、《算法导论》和《编程珠玑》。
  • 学习(麻省理工免费课程)计算机科学和编程导论
  • 学习(麻省理工免费课程)C语言内存管理
  • 学习Unix/Linux系统调用(Unix高级环境编程),,了解系统层面的东西。
    • 用这些系统知识操作一下文件系统,用户(实现一个可以拷贝目录树的小程序)
    • 用fork/wait/waitpid写一个多进程的程序,用pthread写一个多线程带同步或互斥的程序。多进程多进程购票的程序。
    • 用signal/kill/raise/alarm/pause/sigprocmask实现一个多进程间的信号量通信的程序。
    • 学会使用gcc和gdb来编程和调试程序(参看我的《用gdb调试程序》)
    • 学会使用makefile来编译程序。(参看我的《跟我一起写makefile》)
    • IPC和Socket的东西可以放到高级中来实践。
  • 学习Windows SDK编程(Windows 程序设计 MFC程序设计
    • 写一个窗口,了解WinMain/WinProcedure,以及Windows的消息机制。
    • 写一些程序来操作Windows SDK中的资源文件或是各种图形控件,以及作图的编程。
    • 学习如何使用MSDN查看相关的SDK函数,各种WM_消息以及一些例程。
    • 这本书中有很多例程,在实践中请不要照抄,试着自己写一个自己的例程。
    • 不用太多于精通这些东西,因为GUI正在被Web取代,主要是了解一下Windows 图形界面的编程。@virushuo 说:“ 我觉得GUI确实不那么热门了,但充分理解GUI工作原理是很重要的。包括移动设备开发,如果没有基础知识仍然很吃力。或者说移动设备开发必须理解GUI工作,或者在win那边学,或者在mac/iOS上学”。

2、学习Java

  • Java 的学习主要是看经典的Core Java 《Java 核心技术编程》和《Java编程思想》(有两卷,我仅链了第一卷,足够了,因为Java的图形界面了解就可以了)
  • 学习JDK,学会查阅Java API Doc http://download.oracle.com/javase/6/docs/api/
  • 了解一下Java这种虚拟机语言和C和Python语言在编译和执行上的差别。从C、Java、Python思考一下“跨平台”这种技术。
  • 学会使用IDE Eclipse,使用Eclipse 编译,调试和开发Java程序。
  • 建一个Tomcat的网站,尝试一下JSP/Servlet/JDBC/MySQL的Web开发。把前面所说的那个PHP的小项目试着用JSP和Servlet实现一下。
3、Web的安全与架构
  • 学习HTML5,网上有很多很多教程,以前酷壳也介绍过很多,我在这里就不罗列了。
  • 学习Web开发的安全问题(参考新浪微博被攻击的这个事,以及Ruby的这篇文章
  • 学习HTTP Server的rewrite机制,Nginx的反向代理机制,fast-cgi(如:PHP-FPM
  • 学习Web的静态页面缓存技术。
  • 学习Web的异步工作流处理,数据Cache,数据分区,负载均衡,水平扩展的构架。
  • 实践任务:
    • 使用HTML5的canvas 制作一些Web动画。
    • 尝试在前面开发过的那个Web应用中进行SQL注入,JS注入,以及XSS攻击。
    • 把前面开发过的那个Web应用改成构造在Nginx + PHP-FPM + 静态页面缓存的网站

4、学习关系型数据库

  • 你可以安装MSSQLServer或MySQL来学习数据库。
  • 学习教科书里数据库设计的那几个范式,1NF,2NF,3NF,……
  • 学习数据库的存过,触发器,视图,建索引,游标等。
  • 学习SQL语句,明白表连接的各种概念(参看《SQL  Join的图示》)
  • 学习如何优化数据库查询(参看《MySQL的优化》)
  • 实践任务:设计一个论坛的数据库,至少满足3NF,使用SQL语句查询本周,本月的最新文章,评论最多的文章,最活跃用户。

5、一些开发工具

  • 学会使用SVN或Git来管理程序版本。
  • 学会使用JUnit来对Java进行单元测试。
  • 学习C语言和Java语言的coding standard 或 coding guideline。(我N年前写过一篇关C语言非常简单的文章——《编程修养》,这样的东西你可以上网查一下,一大堆)。
  • 推荐阅读《代码大全》《重构》《代码整洁之道

高级深入

1、C++ / Java 和面向对象

我个人以为学好C++,Java也就是举手之劳。但是C++的学习曲线相当的陡。不过,我觉得C++是最需要学好的语言了。参看两篇趣文“C++学习信心图” 和“21天学好C++

  • 学习(麻省理工免费课程)C++面向对象编程
  • 读我的 “如何学好C++”中所推荐的那些书至少两遍以上(如果你对C++的理解能够深入到像我所写的《C++虚函数表解析》或是《C++对象内存存局)()》,或是《C/C++返回内部静态成员的陷阱》那就非常不错了)
  • 然后反思为什么C++要干成这样,Java则不是?你一定要学会对比C++和Java的不同。比如,Java中的初始化,垃圾回收,接口,异常,虚函数,等等。
  • 实践任务:
    • 用C++实现一个BigInt,支持128位的整形的加减乘除的操作。
    • 用C++封装一个数据结构的容量,比如hash table。
    • 用C++封装并实现一个智能指针(一定要使用模板)。
  • 设计模式》必需一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。(也推荐《深入浅出设计模式》)
  • 实践任务:
    • 使用工厂模式实现一个内存池。
    • 使用策略模式制做一个类其可以把文本文件进行左对齐,右对齐和中对齐。
    • 使用命令模式实现一个命令行计算器,并支持undo和redo。
    • 使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。
  • 学习STL的用法和其设计概念  - 容器,算法,迭代器,函数子。如果可能,请读一下其源码。
  • 实践任务:尝试使用面向对象、STL,设计模式、和WindowsSDK图形编程的各种技能
    • 做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。
    • 做一个文件浏览器,可以浏览目录下的文件,并可以对不同的文件有不同的操作,文本文件可以打开编辑,执行文件则执行之,mp3或avi文件可以播放,图片文件可以展示图片。
  • 学习C++的一些类库的设计,如: MFC(看看候捷老师的《深入浅出MFC》) ,Boost, ACE,  CPPUnit,STL (STL可能会太难了,但是如果你能了解其中的设计模式和设计那就太好了,如果你能深入到我写的《STL string类的写时拷贝技术》那就非常不错了,ACE需要很强在的系统知识,参见后面的“加强对系统的了解”)
  • Java是真正的面向对象的语言,Java的设计模式多得不能再多,也是用来学习面向对象的设计模式的最佳语言了(参看Java中的设计模式)。
  • 推荐阅读《Effective Java》 and 《Java解惑
  • 学习Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是学习Java的设计,如IoC等。
  • Java的技术也是烂多,重点学习J2EE架构以及JMS, RMI, 等消息传递和远程调用的技术。
  • 学习使用Java做Web Service (官方教程在这里
  • 实践任务: 尝试在Spring或Hibernate框架下构建一个有网络的Web Service的远程调用程序,并可以在两个Service中通过JMS传递消息。

C++和Java都不是能在短时间内能学好的,C++玩是的深,Java玩的是广,我建议两者选一个。我个人的学习经历是:

  • 深究C++(我深究C/C++了十来年了)
  • 学习Java的各种设计模式。

2、加强系统了解

重要阅读下面的几本书:

  • Unix编程艺术》了解Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。你一定会有一种醍醐灌顶的感觉。
  • Unix网络编程卷1,套接字》这是一本看完你就明白网络编程的书。重要注意TCP、UDP,以及多路复用的系统调用select/poll/epoll的差别。
  • TCP/IP详解 卷1:协议》- 这是一本看完后你就可以当网络黑客的书。了解以太网的的运作原理,了解TCP/IP的协议,运作原理以及如何TCP的调优。
  • 实践任务:
    • 理解什么是阻塞(同步IO),非阻塞(异步IO),多路复用(select, poll, epoll)的IO技术。
    • 写一个网络聊天程序,有聊天服务器和多个聊天客户端(服务端用UDP对部分或所有的的聊天客户端进Multicast或Broadcast)。
    • 写一个简易的HTTP服务器。
  • Unix网络编程卷2,进程间通信》信号量,管道,共享内存,消息等各种IPC…… 这些技术好像有点老掉牙了,不过还是值得了解。
  • 实践任务:
    • 主要实践各种IPC进程序通信的方法。
    • 尝试写一个管道程序,父子进程通过管道交换数据。
    • 尝试写一个共享内存的程序,两个进程通过共享内存交换一个C的结构体数组。
  • 学习《Windows核心编程》一书。把CreateProcess,Windows线程、线程调度、线程同步(Event,  信号量,互斥量)、异步I/O,内存管理,DLL,这几大块搞精通。
  • 实践任务:使用CreateProcess启动一个记事本或IE,并监控该程序的运行。把前面写过的那个简易的HTTP服务用线程池实现一下。写一个DLL的钩子程序监控指定窗口的关闭事件,或是记录某个窗口的按键。
  • 有了多线程、多进程通信,TCP/IP,套接字,C++和设计模式的基本,你可以研究一下ACE了。使用ACE重写上述的聊天程序和HTTP服务器(带线程池)
  • 实践任务:通过以上的所有知识,尝试
    • 写一个服务端给客户端传大文件,要求把100M的带宽用到80%以上。(注意,磁盘I/O和网络I/O可能会很有问题,想一想怎么解决,另外,请注意网络传输最大单元MTU)
    • 了解BT下载的工作原理,用多进程的方式模拟BT下载的原理。

3、系统架构

  • 负载均衡。HASH式的,纯动态式的。(可以到Google学术里搜一些关于负载均衡的文章读读)
  • 多层分布式系统 – 客户端服务结点层、计算结点层、数据cache层,数据层。J2EE是经典的多层结构。
  • CDN系统 – 就近访问,内容边缘化。
  • P2P式系统,研究一下BT和电驴的算法。比如:DHT算法
  • 服务器备份,双机备份系统(Live-Standby和Live-Live系统),两台机器如何通过心跳监测对方?集群主结点备份。
  • 虚拟化技术,使用这个技术,可以把操作系统当应用程序一下切换或重新配置和部署。
  • 学习Thrift,二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。
  • 学习Hadoop。 Hadoop框架中最核心的设计就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的 一句话解释MapReduce就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。
  • 了解NoSQL数据库(有人说可能是一个过渡炒作的技术), 不过因为超大规模以及高并发的纯动态型网站日渐成为主流,而SNS类网站在数据存取过程中有着实时性等刚性需求,这使得目前NoSQL数据库慢慢成了人们 所关注的焦点,并大有成为取代关系型数据库而成为未来主流数据存储模式的趋势。当前NoSQL数据库很多,大部分都是开源的,其中比较知名的 有:MemcacheDB、Redis、Tokyo Cabinet(升级版为Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。

写了那么多,回顾一下,觉得自己相当的有成就感。希望大家不要吓着,我自己这十来年也在不断地学习,今天我也在学习中,人生本来就是一个不断学习和练级的过程。不过,一定有漏的,也有不对的,还希望大家补充和更正。(我会根据大家的反馈随时更新此文)欢迎大家通过我的微博(@左耳朵耗子)和twitter(@haoel)和我交流。

—– 更新  2011/07/19 —–

1)有朋友奇怪为什么我在这篇文章开头说了web+移动,却没有在后面提到iOS/Android的前端开发。因为我心里有一种感觉,移动设备上的UI最终也会被Javascript取代。大家可以用iPhone或Android看看google+,你就会明白了。

2)有朋友说我这里的东西太多了,不能为了学习而学习,我非常同意。我在文章的前面也说了要思考。另外,千万不要以为我说的这些东西是一些新的技 术,这份攻略里95%以上的全是基础。而且都是久经考验的基础技术。即是可以让你一通百通的技术,也是可以让你找到一份不错工作的技术。

3)有朋友说学这些东西学完都40了,还不如想想怎么去挣钱。我想告诉大家,一是我今年还没有40岁,二是学无止境啊,三是我不觉得挣钱有多难,难 的是怎么让你值那么多钱?无论是打工还是创业,是什么东西让你自己的价值,让你公司的价值更值钱?别的地方我不敢说,对于互联网或IT公司来说,技术实力 绝对是其中之一。

4)有朋友说技术都是工具,不应该如此痴迷这句话没有错,有时候我们需要更多的是抬起头来看看技术以外的事情,或者是说我们在作技术的时候不去思考为什么会有这个技术,为什么不是别的,问题不在于技术,问题在于我们死读书,读死书,成了技术的书呆子。

5) 对于NoSQL,最近比较火,但我对其有点保守,所以,我只是说了解就可以。对于Hadoop,我觉得其在分布式系统上有巨大的潜力,所以需要学习。 对于关系型数据库,的确是很重要的东西,这点是我的疏忽,在原文里补充。

(全文完,转载时请注明作者和出处)

posted @ 2011-07-21 14:56 linw 阅读(17) 评论(0) 编辑

2011年4月29日

C++著名程序库的比较和学习经验

1、C++各大有名库的介绍——C++标准库
2、C++各大有名库的介绍——准标准库Boost
3、C++各大有名库的介绍——GUI
4、C++各大有名库的介绍——网络通信
5、C++各大有名库的介绍——XML
6、C++各大有名库的介绍——科学计算
7、C++各大有名库的介绍——游戏开发
8、C++各大有名库的介绍——线程
9、C++各大有名库的介绍——序列化
10、C++各大有名库的介绍——字符串
11、C++各大有名库的介绍——综合
12、C++各大有名库的介绍——其他库
13、C++名人的网站

在 C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重 量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比 较著名的大型库。


1、C++各大有名库的介绍——C++标准库
标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。

1.1、Dinkumware C++ Library

参考站点:http://www.dinkumware.com/

P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其 C/C++的产品中采用Dinkumware的库。

1.2、RogueWave Standard C++ Library

参考站点:http://www.roguewave.com/

这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。

1.3、SGI STL

参考站点:http://www.roguewave.com/

SGI公司的C++标准模版库。

1.4、STLport

参考站点:http://www.stlport.org/

SGI STL库的跨平台可移植版本。



2、C++各大有名库的介绍——准标准库Boost
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。

Boost中比较有名气的有这么几个库:

2.1 Regex  正则表达式库

2.2 Spirit   LL parser framework,用C++代码直接表达EBNF

2.3 Graph  图组件和算法

2.4 Lambda  在调用的地方定义短小匿名的函数对象,很实用的functional功能

2.5 concept check   检查泛型编程中的concept

2.6 Mpl   用模板实现的元编程框架

2.7 Thread   可移植的C++多线程库

2.8 Python   把C++类和函数映射到Python之中

2.9 Pool    内存池管理

2.10 smart_ptr   5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:

Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr.Dobb's Journal软件研发杂志》第7辑上的译文。

  Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的 工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手 法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品 代码中多多利用。

参考站点:http://www.boost.org


3、C++各大有名库的介绍——GUI
在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。

3.1、MFC

  大名鼎鼎的微软基础类库(Microsoft Foundation Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API 之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近发展以及官方支持上日渐势微。

3.2、QT

参考网站:http://www.trolltech.com

  Qt是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功 能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序 的基础。Qt也是流行的Linux桌面环境KDE 的基础,同时它还支持Windows、Macintosh、Unix/X11等多种平台。[wangxinus注:QT目前已经是Nokia旗下的产品,原官方网站已经失效,目前为http://qt.nokia.com.2009年初发布的Qt4.5版本开始使用LGPL协议,诺基亚希望以此来吸引更多的开发人员使用Qt库]

3.3、WxWindows

参考网站:http://www.wxwindows.org

  跨平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFC到WxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder X的GUI设计器就是基于这个库的。[wangxinus注:迫于微软的施压,已经由WxWindows更名为wxWidgets]

3.4、Fox

参考网站:http://www.fox-toolkit.org/

  开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。

3.5、WTL

  基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。

3.6、GTK

参考网站:http://gtkmm.sourceforge.net/

  GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而Qt就是这个库的C++封装版本。[wangxinus注:“Qt 就是这个库的C++封装版本”是错误的。Qt早于GTK,最初Qt由于协议的原因引起社区的不满,另外开发了一个基于C语言的GTK库,后面的扩展版本为 GTK+。GTK+的Gnome和Qt的KDE是目前linux桌面的两大阵营,曾有水火不容之势。目前双方都以及开源社区的精神,已经和解。]


4、C++各大有名库的介绍——网络通信

4.1、ACE

参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html

  C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ 包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

4.2、StreamModule

参考网站:http://www.omnifarious.org/StrMod

  设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。

4.3、SimpleSocket

参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

  这个类库让编写基于socket的客户/服务器程序更加容易。

4.4、A Stream Socket API for C++

参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html

  又一个对Socket的封装库。


5、C++各大有名库的介绍——XML

5.1、Xerces

参考网站:http://xml.apache.org/xerces-c/

  Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XMLSchema 的基本完整的开放标准。

5.2、XMLBooster

参考网站:http://www.xmlbooster.com/

  这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。

5.3、Pull Parser

参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp

  这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。

5.4、Xalan

参考网站:http://xml.apache.org/xalan-c/

  Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。

5.5、CMarkup

参考网站:http://www.firstobject.com/xml.htm

  这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻求一点灵感。

5.6、libxml++

http://libxmlplusplus.sourceforge.net/

  libxml++是对著名的libxml XML解析器的C++封装版本。

5.7. TinyXML [wangxinus注:一个非常小巧的XML解析库,基于DOM的。]


6、C++各大有名库的介绍——科学计算

6.1、Blitz++

参考网站:http://www.oonumerics.org/blitz

  Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template技术,程序执行甚至可以比Fortran更快。

  Blitz++目前仍在发展中,对于常见的SVD,FFTs,QMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供的函数来构建。

6.2、POOMA

参考网站:http://www.codesourcery.com/pooma/pooma

  POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。

6.3、MTL

参考网站:http://www.osl.iu.edu/research/mtl

  Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。

6.4、CGAL

参考网站:www.cgal.org

  Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。


7、C++各大有名库的介绍——游戏开发

7.1、Audio/Video 3D C++ Programming Library

参考网站:http://www.galacticasoftware.com/products/av/

  AV3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS。

7.2、KlayGE

参考网站:http://home.g365.net/enginedev/

  国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。

[wangxinus注:这个库国人了解很少,百度百科的KlayGE词条还是本人创建的。一个人开发一个游戏引擎库,是在让笔者汗颜,对作者表示钦佩!]

7.3、OGRE

参考网站:http://www.ogre3d.org

  OGRE(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备 的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3D和OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其 它类。


8、C++各大有名库的介绍——线程

8.1、C++ Threads

参考网站:http://threads.sourceforge.net/

  这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。

8.2、ZThreads

参考网站:http://zthread.sourceforge.net/

  一个先进的面向对象,跨平台的C++线程和同步库。


9、C++各大有名库的介绍——序列化

9.1、s11n

参考网站:http://s11n.net/

  一个基于STL的C++库,用于序列化POD,STL容器以及用户定义的类型。

9.2、Simple XML Persistence Library

参考网站:http://sxp.sourceforge.net/

  这是一个把对象序列化为XML的轻量级的C++库。


10、C++各大有名库的介绍——字符串

10.1、C++ Str Library

参考网站:http://www.utilitycode.com/str/

  操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。

10.2、Common Text Transformation Library

参考网站:http://cttl.sourceforge.net/

  这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。

10.3、GRETA

参考网站:http://research.microsoft.com/projects/greta/

  这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。


11、C++各大有名库的介绍——综合

11.1、P::Classes

参考网站:http://pclasses.com/

  一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。

11.2、ACDK - Artefaktur Component Development Kit

参考网站:http://acdk.sourceforge.net/

  这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM 和 CORBA的集成。

11.3、dlib C++ library

参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/

  各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。

11.4、Chilkat C++ Libraries

参考网站:http://www.chilkatsoft.com/cpp_libraries.asp

  这是提供zip,e-mail,编码,S/MIME,XML等方面的库。

11.5、C++ Portable Types Library (PTypes)

参考网站:http://www.melikyan.com/ptypes/

  这是STL的比较简单的替代品,以及可移植的多线程和网络库。

11.6、LFC

参考网站:http://lfc.sourceforge.net/

  哦,这又是一个尝试提供一切的C++库


12、C++各大有名库的介绍——其他库

12.1、Loki

参考网站:http://www.moderncppdesign.com/

  哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。

12.2、ATL

  ATL(Active Template Library)是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。

12.3、FC++: The Functional C++ Library

  这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师Peter Norvig在 “Teach Yourself Programming in Ten Years”一文中就将函数式语言列为至少应当学习的6类编程语言之一。

12.4、FACT!

参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html

  另外一个实现函数式语言特性的库

12.5、Crypto++

  提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。

  还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅。


13、C++名人的网站
正如我们可以通过计算机历史上的重要人物了解计算机史的发展,C++相关人物的网站也可以使我们得到最有价值的参考与借鉴,下面的人物我们认为没 有介绍的必要,只因下面的人物在C++领域的地位众所周知,我们只将相关的资源进行罗列以供读者学习,他们有的工作于贝尔实验室,有的工作于知名编译器厂 商,有的在不断推进语言的标准化,有的为读者撰写了多部千古奇作……

1、Bjarne Stroustrup

http://www.research.att.com/~bs/

2、Stanley B. Lippman

http://blogs.msdn.com/slippman/ (中文版)

http://www.zengyihome.net/slippman/index.htm

3、Scott Meyers

http://www.aristeia.com/

4、David Musser

http://www.cs.rpi.edu/~musser/

5、Bruce Eckel

http://www.bruceeckel.com

http://blog.csdn.net/beckel Bruce Eckel 博客中文版

6、Nicolai M. Josuttis

http://www.josuttis.com/

7、Herb Sutter

http://www.gotw.ca/

http://blog.csdn.net/hsutter/ Herb Sutter 中文博客

8、Andrei Alexandrescu

http://www.moderncppdesign.com

posted @ 2011-04-29 18:21 linw 阅读(84) 评论(0) 编辑

2011年4月24日

python中的中文处理问题

方法一:

在文件的开头加入编码声明:

#coding= gbk

s = '谷歌'

print s

输出结果:谷歌


方法二:

在输出时进行转码:

#coding= utf-8

s = '谷歌'

print unicode(s,'gbk')

输出结果:谷歌

posted @ 2011-04-24 20:35 linw 阅读(98) 评论(1) 编辑

2011年4月14日

char*作为形参

摘要: char*作为形参时遇到的问题 关于char还有一个特殊的语言就是char *,它在C/C++中有专门的语义,既不同于signed char *,也不同于unsigned char *,专门用于指以'\0'为结束的字符串。 char *p = "abcd"; 是可以通过编译的。会默认在结尾加入'\0'。但如果用 signed char *p = "abcd"; 还是 unsigned char *p = "abcd";都是不能通过编译的。例如: 如果有函数void A(const char* a)和vo阅读全文

posted @ 2011-04-14 16:15 linw 阅读(64) 评论(0) 编辑

2011年4月10日

先验概率与后验概率

摘要: 先验概率与后验概率(转) 事情还没有发生,要求这件事情发生的可能性的大小,是先验概率. 事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小,是后验概率.一、 先验概率是指根据以往经验和分析得到的概率,如全概率公式,它往往作为“由因求果”问题中的“因”出现。 后验概率是指在得到“结果”的信息后重新修正的概率,如贝叶斯公式中的,是“执果寻因”问题中的“因”。先验概率与后验概率有不可分割的联系,后验概率的计算要以先验概率为基础。二、先验概率与后验概率通俗释义事情有N种发生的可能,我们不能控制结果的发生,或者影响结果的机理是我们不知道或是太复杂超过我们的运算能力。新发一个物种,到底是猫阅读全文

posted @ 2011-04-10 15:42 linw 阅读(680) 评论(0) 编辑