以前CSDN的Blog非常不好用,所以搬走了。最近发现改进了不少,虽然还有很多问题,但总体上已经相当不错了,所以决定重新回到这里(但原博客http://blog.vckbase.com/localvar将继续同步更新)。原来的烂摊子懒得收拾了,就连文章带评论一块删除了,一切从零开始。以前的老文章也重新贴上来,但日期用的仍是最初发布的时间。 请大家多多支持!阅读全文>
发表于 @ 2008年12月27日 10:41:00 | 评论( loading... ) | 举报| 收藏
让这个bug困扰了很久,前一段太忙只找了个临时解决方案而没有追究原因,今天终于把它搞清楚了。由于测试时只在多cpu系统上出现,我甚至一度怀疑它是cpu的bug 。 两个c/s结构的网络通讯程序,服务器端使用完成端口模型,客户端使用阻塞模型,双方以一种客户端发送命令,服务器端处理,然后返回应答的方式通讯。问题出在服务器端。以下是服务器端代码的大致处理逻辑: long volatile g_busy = 0;void iocp_thread(){ while( GetQueuedCompletionStatus() ) { if( InterlockedCompareExchange( &g_busy, 1, 0 ) != 0 ) WSASend( "服务器忙" ); // 处理命令 ProcessCommand(); WSASend( "应答信息" ); InterlockedExchange( &g_busy, 0 ); }}其中ProcessCommand需要互斥运行(这是简化的逻辑,实际上有很多不同的命令,有阅读全文>
发表于 @ 2009年01月08日 16:55:00 | 评论( loading... ) | 举报| 收藏
为了分析用户使用过程中出现的软件Bug,经常需要.dmp文件的帮助。一般我们会用WinDbg或adplus制作这个文件,可这两个工具都有点“太难”了,往往要费九牛二虎之力才能教会用户。而让程序在崩溃时自动转储或用Dr. Watson转储虽然使用简单,却只能做崩溃转储,对死锁之类的情况则无能为力。 所以我决定自己写一个小工具降低一下制作.dmp文件的难度,也就有了今天发布的这个EasyDump(轻松转储)。代码和可执行文件都放到google code(也是刚注册的,尝试一下:))上去了,大家可以到http://code.google.com/p/easytools/下载。 程序还没有很好的测试过,如果有bug的话,应该可以直接在项目主页上报告。另外下一步考虑增加三个功能:首先是异常过滤,因为first chance异常太多了!如果选择了生成.dmp的话,一秒钟可能就有十个甚至更多的文件,设置了异常过滤后,可以把一些不关心的异常屏蔽掉,不生成文件。其次是如果没有second chance的话,就把first chance的文件直接删掉,也有助于减少不必要的文件。第三是界面的国际化,也发阅读全文>
发表于 @ 2009年01月06日 16:31:00 | 评论( loading... ) | 举报| 收藏
当一个solution中的project越来越多以后,管理编译选项,将成为一件很麻烦的事,单独对每个project进行设置不仅繁琐,而且容易出错。但实际上,visual studio已经为我们提过了统一的管理界面—Property Manager。 在visual studio中,每个c++ project的general属性页中,都有一项"Inherited Project Property Sheets",我们可以在这里指定一个或多个Property Sheet(不要和GUI开发中的Property Sheet搞混了,完全两个概念)供项目继承。在被继承的属性表(父属性表)中,我们设置好默认选项,然后把project中对应的选项设置为"inherit from parent or project defaults”就可以使用父属性表中的设置了。这样,在solution层面上准备一个Property Sheet,再让其下的所有project继承,即可实现编译选项的统一管理。 在visual studio的view菜单中选择property manage阅读全文>
发表于 @ 2008年12月31日 11:01:00 | 评论( loading... ) | 举报| 收藏
作为一个有着正常审美观的人,我简直无法忍受C++/CLI(以及managed c++)的丑陋。不过,近来发现,这个丑东西也还有点用,在把原生开发接口包装成托管开发接口时,比C#的互操作容易的多(互操作看了看,头大呀)。磕磕绊绊几天,终于把一个SDK开发包转换完成了。总结经验如下: 1. 对于clr中的引用类型,定义变量时要用个^符,如"String^ var1"、"array阅读全文>
发表于 @ 2008年12月29日 15:38:00 | 评论( loading... ) | 举报| 收藏
这两天往CSDN搬迁(准确的说是复制)BLOG,同时也开始把Windows Live Writer作为编辑器,发现确实比Web界面的编辑器好用多了。把这两天的使用经验记录下来,可能对像我一样的wlw初级用户有一点参考价值。 账户配置 选择“其它账户服务”,填入自己的blog地址,例如我的是“http://blog.csdn.net/localvar”。下一步中的日志类型选择“MetaWeblog API”,服务地址填“http://blog.csdn.net/localvar/services/metablogapi.aspx“即可,注意把其中的“localvar”换成自己的账号。 安装插件 由于经常贴代码,所以我安装了一个语法高亮插件“Syntax highlighted text”,但这个插件的英文版不支持中文,所以我又在这里下载了这个插件的中文版。插件的安装也很简单,解包后放在wlw的安装位置下的plugins文件夹中即可。 贴图 可以直接把图片拖放到wlw中,这样发布blog时,图片就自动上传了。但建议大家不要这样做,因为这样上传的图片会被放到一个名为“MetaWe阅读全文>
发表于 @ 2008年12月27日 17:20:00 | 评论( loading... ) | 举报| 收藏
网上介绍数字签名的文章,大多使用signtool的signwizard命令实现,这种方式虽说简单,却需要人为干预,不能自动执行。msdn上说signtool的sign命令可以在命令行中完成签名,但描述的相当模糊,试了半天,终于找到了它的使用方法,一共执行四条命令即可,前三条一次性执行,最后生成一个个人证书(pfx),最后一条用于实际签名,可以放在post build event中去自动执行。 1. makecert生成x.509证书和私钥, 会弹出界面要求输入两次密码, 我输的是123, 其中localvar studio是公司名 makecert /sv sign.pvk /n "CN=localvar studio" sign.cer 2. 把x.509证书转换为Software Publisher Certificate cert2spc sign.cer sign.spc 3. 把pvk转换为pfx, 例子中的123是私钥密码 pvk2pfx -pvk sign.pvk -pi 123 -spc sign.spc -pfx sign.阅读全文>
发表于 @ 2008年11月18日 07:43:00 | 评论( loading... ) | 举报| 收藏
试试下面这段代码的输出是什么? #include <stdio.h>#include <process.h>#include <windows.h>class foo { public: foo() { printf( "before sleep\n" ); Sleep( 1000 ); printf( "after sleep\n" ); } void test() { printf( "in test\n" ); } }; foo* bar() { static foo a; return &a; } unsigned __stdcall thread( void* ) { foo* p = bar(); p->test阅读全文>
发表于 @ 2008年05月29日 02:21:00 | 评论( loading... ) | 举报| 收藏
在《介绍一下SVN》一文中,我提到了自动递增版本号的功能,现在就来具体说明一下实现方法。虽然标题中说的是“使用SVN”,但我们实际用的是SVN的客户端工具TortoiseSVN中的SubWCRev程序。另外文中的例子也使用了Visual Studio的SVN插件VisualSVN,它并非必须,用了方便一些,不用也行。我平时主要使用C/C++语言,但考虑C#有更大的用户群,我的示例项目也采用了C#。 1. 生成一个名为autover的项目 注意项目的Properties文件夹下有一个名为AssemblyInfo.cs的文件,autover程序的版本号就写在它里面。 2. 创建模板文件 在windows的资源管理器中进入Properties文件夹,把AssemblyInfo.cs文件复制一份,命名为AssemblyInfo.template.cs,并把它加入到项目中来。 3. 修改AssemblyInfo.template.cs的属性 AssemblyInfo.template.cs文件是用来自动生成版本号的模板文件,它不应该被编译,所以我们要把它的Build Action阅读全文>
发表于 @ 2008年05月20日 03:57:00 | 评论( loading... ) | 举报| 收藏
原文链接 1. 引言 像SQLITE这样支持事务的数据库的一个重要特性是“原子提交”。原子提交意味着,一个事务中的所有修改动作要么全都发生,要么一个都不发生。有了原子提交,对一个数据库文件不同部分的多次写操作,就会像瞬间同时完成了一样。当然,现实中的存储器硬件会把写操作串行化,并且写每个扇区都会花上那么一小段时间,所以,绝对意义上的“瞬间同时完成”是不可能的。但SQLITE的原子提交逻辑还是让整个过程看起来像那么回事。 SQLITE保证,即使事务执行过程中发生了操作系统崩溃或掉电,整个事务也是原子的。本文描述了SQLITE实现原子提交时所采用的技术。 2. 对硬件的假设 虽然有的时候会使用闪存,但下文中,我们将把存储设备称为“磁盘”。 我们假设对磁盘的写操作是以“扇区”为单位的,也就是说不可能直接对磁盘进行小于一个扇区的修改,要想进行这类修改,你必须把整个扇区读进内存,进行所需的修改,然后再把整个扇区写回去。 对真正“磁盘”来说,读写操作的最小单位都是一阅读全文>
发表于 @ 2008年02月13日 02:03:00 | 评论( loading... ) | 举报| 收藏
注(2008.12.29):本文的内容已过时,新版的VisualSVN Server已经支持域认证,不用这么复杂的配置了。 其实在网上搜索这个主题,已经有很多文章了,而且Subversion和TortoiseSVN的文档上也有相关介绍。但在我自己配置的过程中,发现它们好像都不完全对。所以我觉得有必要把自己摸索的过程写出来,供大家参考。不过已经有那么多“前车之鉴”了,我的方法是否真的有用,只能靠老天保佑了。 要想配置成功,首先要保证Apache、Svn和mod_auth_sspi这几个模块的版本是匹配的。我最开始就是在这上面栽的跟头。Apache有很多个版本(以2.0.x和2.2.x最常见),作为对应,每个版本的svn都有一些子版本与其匹配。例如1.4.5版的svn就有针对2.0.x和2.2.x的两个子版本。不幸的是,网上搜到的svn下载链接多是指向针对Apache 2.0.x的那个子版本,当把它用在最新版(目前是2.2.6)的Apache上时,出问题就是必然的了。实际上,当使用2.2.x版的Apache时,我们应该到这里,点击左侧的文件夹Windows Apache 2.2.x(等阅读全文>
发表于 @ 2007年12月20日 01:32:00 | 评论( loading... ) | 举报| 收藏
发表在公司内刊上的一篇文章,拿过来凑数。 前一段时间,公司讨论统一配置管理工具时,我推荐了svn(subversion)。照理说,在公司已经使用了vss、cvs和ClearCase三种工具的情况下,再提一种基本没人用过的新工具不是什么明智的选择。但我确实觉得svn的优点很突出,值得一荐。下面我就对svn进行一下简单介绍,让各位同事对其有一个初步的了解。 1. 与其他工具的对比 vss是我用的最多的配置工具,所以我相信每个用过vss的人都会对它的离线操作功能头疼不已。虽然它允许在与服务器断开的情况下修改文件,但重新连接后必须非常小心的处理每个文件,一旦出错,就会造成不小的麻烦。svn则没有这个问题。二者更详细的区别我会在下一节说明,这里就不多啰嗦了。 svn相对cvs是有明显优势的,因为svn的设计目标之一就是“一个更好的cvs”。而且,从众多开源项目的反映看,它也确实达到了这个目标:06年,最大的开源网站SourceForge开始支持svn;KDE和GNOME的开发团队也已经换用svn;如果大家多注意一下的话,还会发现更多著名的开源项目使用了svn。 ClearCase我没阅读全文>
发表于 @ 2007年12月18日 03:32:00 | 评论( loading... ) | 举报| 收藏
加锁、解锁(同步/互斥)是多线程中非常基本的操作,但我却看到不少的代码对它们处理的很不好。简单说来有三类问题,一是加锁范围太大,虽然避免了逻辑错误,但锁了不该锁的东西,难免降低程序的效率;二是该锁的不锁,导致各种莫名其妙的错误;三是加锁方式不合适,该用临界区的用内核对象等,也会降低程序的效率。 要正确的运用锁操作,首先要弄清楚什么时候需要加锁。很多书上都说在可能“同时发生多个写操作”或“同时发生读写操作”时,应该加锁。这固然没什么错,但我认为它没有说到问题的根上,更准确的表述应该是:如果不加锁会导致不可容忍的数据不一致,那么就应该加锁。据此,我在下表中列出了多线程中应该加锁和无需加锁的条件,其中的“简单数据类型”是指cpu可以在一条指令中完成操作的数据类型,一般整形和所有比整形小的数据类型都是,除此之外的类型都属于“复杂数据类型”,例如你自己定义的结构体等。 操作的结果与初值无关 操作的结果与初值相关 写简单数据类型 不阅读全文>
发表于 @ 2007年10月15日 02:01:00 | 评论( loading... ) | 举报| 收藏
小家伙今天一周岁了。这一年,她实现了那么多的突破,第一次笑,第一次翻身,第一次爬,第一次站立.....,每一次都会让我和老婆兴奋不已。现在,她已经能很清晰的发出“爸爸”的声音了,虽然她还未必知道这两个字的含义,但我已经感动的不得了了,那种由衷的欣慰,是以前从未体会过的,或许这就是为人父母的不同吧。 阅读全文>
发表于 @ 2007年07月27日 06:22:00 | 评论( loading... ) | 举报| 收藏
作者:阮次山 近日见何院士在网上发表新言论,曰:中医乃糟粕,应废除之。阅罢全文,感慨之余,不禁想起了何院士半世纪前以一个物理学家身份在《学习》杂志一九五五年第十期上发表的批判中国古建筑学泰斗梁思成的一篇文章《 论梁思成对建筑问题的若干错误见解 》,(注 1)。 当年如何院士所愿,代表着封建王朝象征的北京城墙,这个"封建腐朽的糟粕",终被拆除了。而极力建议保留这些腐朽的"糟粕"的中国硕果仅存的集古建筑思想之大成的梁思成老先生,也终被打成了右派。代表着"新文化"、"新思想"的斗士们,于是胜利了,可以欣欣然以先进思想的代表们自居,于是功成名就,成一大家。 何院士与方舟子先生近年来以打假,特别是学术打假而著称,我也曾经是方舟子先生的Fans, 他在《新语丝》上发表的文章我也看过一些, 包括诬中医为糟粕的文章。看过虽不以为然,却没有动笔反驳的冲动,只是这次见到在学术界有着广泛影响力的何院士也如是说,这才愤然动笔,也要为我们祖国的传统医学说几句话。 阅读全文>
发表于 @ 2007年06月19日 08:19:00 | 评论( loading... ) | 举报| 收藏
《人体使用手册》的最后一章 吴清忠 十八世纪,西方发现了细菌,随后发明了抗生素,一举控制了瘟疫。从此奠定了西医权威的地位,同时也将西医的发展走向以微观证据为主的方向,所有医学的技术都朝向微小世界去寻找答案。为了在这个微小世界里找答案,因此发展出愈来愈精密的各种设备,这些设备的愈来愈进步,使人们也觉得医学愈来愈进步了。 经过了近两百多年的发展,到了二十世纪末,在解剖学上,对于人体的各个部份,似乎都已经查清楚了,可是许多疾病的原因却仍然是个迷。也有许多的疾病虽然推断出了疾病的原因,可是依据这些原因所发展出来的医疗方法,并不能真正的把疾病去除。多数的慢性病,只能用药物控制,患者必需终身服药,而医生也很明白的告诉患者,这些药只能减缓疾病的恶化,并不能真正断除疾病的根。实际上除了细菌性的疾病和外科手术以外,西医能够完全治愈的疾病并不多。多数严重的疾病只能控制而不能治愈。 这不禁使我怀疑倒底是医学真正的昌明进步了,还是只有那些用来制造医疗仪器的电子科学进步了,现代医学不过穿了件先进的电子外衣而已。 由于整体西医理论建立在解剖学的基阅读全文>
发表于 @ 2007年06月19日 08:19:00 | 评论( loading... ) | 举报| 收藏