换了工作机,重装系统,发现忘记了如何打开远程桌面服务工具,悲剧啊!记性总是这么不好!
折腾了半小时,总算搞定!记录备忘!!
1、下载并安装Windows 7 远程服务器管理工具
2、安装完成后依次打开”控制面板”-”程序和功能”-”打开或关闭Windows功能”-”远程服务器管理工具”-”角色管理工具”,勾选下面的”远程桌面服务工具”
3、所有程序=〉 管理工具=〉远程服务工具=〉远程桌面
我忘记了第二步,唉!这记性!!
换了工作机,重装系统,发现忘记了如何打开远程桌面服务工具,悲剧啊!记性总是这么不好!
折腾了半小时,总算搞定!记录备忘!!
1、下载并安装Windows 7 远程服务器管理工具
2、安装完成后依次打开”控制面板”-”程序和功能”-”打开或关闭Windows功能”-”远程服务器管理工具”-”角色管理工具”,勾选下面的”远程桌面服务工具”
3、所有程序=〉 管理工具=〉远程服务工具=〉远程桌面
我忘记了第二步,唉!这记性!!
在今天写程序,如果可以改编、重用、再造,节省自己90%的工作量,为什么还要从零开始编码呢?现在已经离不开开源代码了。
前一段有个工具需求,为配置管理写一个SVN权限配置的工具,自我感觉这个应当有,搜索了一下原来真的有,本来给我两天让我完成这个工具的,一下节省了两天的工作量。
还有一个需求是解析PDB文件,以得到被编译进去的文件列表,虽然对PDB文件格式一点都不了解,但通过开源的PDB Parser很快完成了这个解析,从而有更多的精力集中在业务逻辑代码的编写上。所以我认为当接到一个需求时,先看一下有没有开源代码,如果有且学习成本小于自己实现的成本,就会直接拿来用。
前一段看到一个新闻,中移动的OPhone使用Google的Android源代码,但对其中的部分底层代码进行了改动,导致OPhone在Android版本升级时的不匹配问题,从而导致了巨大的维护量。 同样,我们的游戏也存在这个问题,对Lua进行了扩展,改动了部分Lua源代码,在Lua版本升级的时候就要对这些地方进行维护。 我感觉一个好的使用开源代码的方式,不是直接修改开源代码,而是封装一层,保持开源代码的独立性。
《Unix编程艺术》一书中有这样一个总结:“在Unix历史中,最大的规律就是,距开源越近就越繁荣。任何将Unix专有化的企图,只能陷入停滞和衰败。”我没有参与过多人维护的开源项目,对于开源带来的软件好处还没有切身理解,但从开源代码中得到了这么多益处,自然要回报,所以,拥抱开源吧!
这一段在重构一个web底层和数据库,这就意味着要有很多Sql操作,稍微不留神,Sql语句就引来很多bug。如果能够自动生成Sql语句,既节省人力,又减少风险,何乐而不为呢?这种封装Sql操作的库被称为ORM,ORM的全称是Object Relational Mapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。
有很多开源的ORM,写得都相当漂亮,功能非常完善,但是学习成本太高,要添加很多的属性,源代码也很多,当出现bug的时候查起来很麻烦。为什么会出现这种情况?因为这东西做成通用的真的很难。
学习开源库大约要两天,自己写Sql语句大约要一天,自己写一个满足基本功能的ORM仅需要一个小时,从时间上考虑这是最省的,根据80-20原则,这个基本功能的ORM可以满足需求。
做通用很难,做适用却很简单,对一个应用项目来说,适用就够了,但对于一个类库,可能要做的通用,导致很难用。
今天遇到一个问题,在IIS6.0环境中ASP.NET中使用Process.Start()启动svn程序,发现运行很慢,要12秒才能执行完成,但在windows程序中只需要200毫秒,一个Web页面打开需要12秒是不可以忍受的,必须解决这个问题。
使用vs2005自带的ASP.NET运行环境和IIS 5.0执行此代码和windows程序执行速度差不多,使用IIS7.0却提示因为缺少用户配置文件不能执行,经搜索得知,这是IIS应用程序池标示的问题,修改为最高权限"本地系统"后,程序正常运行,速度极快,IIS6.0同样设置,问题解决。
其实我并不喜欢写宏,认为宏即难懂,有难调,还容易出问题。但工作中有这个需求,就写了一些,有两个注意的问题,害得我今天调了很久。
1、宏换行符后面不能有空格(/后不能有空格,否则就不认为是换行符)
2、宏参数的名不能和类(或结构体)成员变量的名相同
重装了系统,发现忘记了备份VA宏,手忙脚乱重新弄了一遍,其实我自定义的VA宏就三个,记在这儿,备用!
/////////////////////////////////////////////////////////////// // Copyright(C) www.886s.com $YEAR$ - All Rights Reserved // // FileName : $FILE_BASE$.$FILE_EXT$ // Creator : ChenShiCai // E-Mail : BeingStudio@GMail.com // Date : $YEAR$-$DAY_02$-$MONTH_02$ $HOUR$:$MINUTE$ // Comment : $end$ // /////////////////////////////////////////////////////////////// #ifndef _$FILE_BASE_UPPER$_$FILE_EXT_UPPER$_ #define _$FILE_BASE_UPPER$_$FILE_EXT_UPPER$_ $selected$ #endif // _$FILE_BASE_UPPER$_$FILE_EXT_UPPER$_ int $end$() { int nResult = false; int nRetCode = false; PROCESS_ERROR(false); nResult = true; Exit0: return nResult; }
VA支持的宏列表(英文)
阅读全文 »
匆匆把《Unix编程艺术》读完了,这不是纯技术书,是程序员多年的感悟,亦是开源愤青的牢骚!在附录的《无名师的Unix心传》的几个小故事,基本覆盖了他在本书中的所有技术论点,很好很强大!
无名师与万行码
无名师曾对来访的程序员说:“Unix传统上认为,一行shell脚本胜过万行C程序。”
这个程序员自以为对C极其精通,说:“这不可能。UNIX内核正是用C实现的。”
无名师回道:“确是如此。不过,UNIX传统上认为,一行shell脚本胜过万行C程序。“
程序员颇为沮丧:”但是在C中我们可领会到尊者Ritchie的智慧。我们与操作系统和机器合而为一,可以获取无与伦比的性能。”
无名师回道:“诚如你言。不过,Unix传统上认为,一行shell脚本胜过万行C程序。”
程序员冷笑着想愤然离去。无名师向学生Nubi颔首示意,Nubi在黑板上写下一行shell脚本,问道:“尊敬的程序员,看看这行管道,用纯C实现,是不是要一万行C代码?”
程序员沉吟念诵。最终他承认如此。
“你需要多长时间来实现和调试那个C程序?”Nubi问道。
“很长”,来访的程序员承认。“但傻子才会干这个而不去完成更有价值的任务。”
“那么谁更了解Unix传统?”无名师问道。“是写一万行代码的,还是看到任务的无谓而不去编码的?”
听到此,程序员眼中一亮。
最近在忙Dump收集和分析的事情,本文写一下堆栈的知识。也可以说是对《软件调试》一书22章的笔记。
本文介绍:X86CPU堆栈原理
栈产生
当操作系统创建线程的时候会为每个线程创建栈,在windows系统中,每个线程至少有一个栈,系统县城之外的每个线程都有两个栈,一个称谓用户态栈,一个称为内核态栈。
对CPU而言,它只使用当前栈,即SS和ESP寄存器所指向的栈,当线程间切换或者内核态和用户态间切换的时候,系统会保证SS和ESP寄存器始终指向合适的栈。
栈是超低地址方向生长的,故压栈操作使ESP的值减小。
CALL指令
用作函数调用的指令。分为Near Call和Far Call两种。
Near Call操作
1、EIP当前值压入到栈中供返回时使用
2、将被调用过程的偏移(相对于当前段)加载到EIP中
3、开始执行被调用个过程
阅读全文 »
这几个问题是对剑三Dump数据分析的时候碰到的,一直不知道具体原因是什么,请教过两个人,一个是Jochen Kalmbach(StackWalker程序的作者),一个是张银奎(调试软件一书的作者)。但都是很简略的回答,毕竟对堆栈我的了解还不够,可能他们说在了点子上,但我一时还无法了解。
1、servprov.h中IServiceProvider报错
error C2872: “IServiceProvider”: 不明确的符号 c:\program files\microsoft visual studio 8\vc\platformsdk\include\servprov.h
error C2872: ‘IServiceProvider’ : ambiguous symbol c:\program files\microsoft visual studio 8\vc\platformsdk\include\servprov.h
原因:
servprov.h中定义了IServiceProvider,.Net中存在 System::IServiceProvider,造成了重复定义, 修改办法:
第二种办法:修改头文件位置
把include
第二种办法:修改代码
//Line 93 in servprov.h is: typedef /* [unique] */ IServiceProvider *LPSERVICEPROVIDER; //Change this to: #ifdef __cplusplus typedef /* [unique] */ ::IServiceProvider *LPSERVICEPROVIDER; #else typedef /* [unique] */ IServiceProvider *LPSERVICEPROVIDER; #endif
2、字符串互转
非托管字符串转托管字符串
char *psz = "www.886s.com"; String^ result = gcnew String(psz);
托管字符串转非托管字符串