[SQL]SQL Server2005索引

mikel阅读(812)

最近在总结SQL Server2005下性能调优方法,一个通用的调优方法。通过找到系统的瓶颈,然后解决瓶颈,提高性能。例如:当我们找到系统的瓶颈在于磁盘I/O上, 在不提高硬件配置的前提下,我们应该如果提高性能?通过各种各样的性能分析工具 :Profiler、SQLDiag、Perfmon等等。我们找到了一些影响性能的关键SQL,现在我们暂不考虑程序问题。对于这些SQL我们应该如何 改进呢?说起SQL,不得不提索引,这也就是我们今天要讨论的主题。

  首先,什么是索引?从BookOnline上search了一下:

索引

   索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。

  索引有什么类型:

索引类型
  • 聚集
    • 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。
    • 只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。
  • 非聚集
    • 非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。
    • 从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。
    • 在 SQL Server 2005 中,可以向非聚集索引的叶级别添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。
  •    在了解了上述概念后,如何正确使用索引对于程序的性能有着至关重要的作用。设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,从而可以提高查询性能。对于包含 Select、Update 或 Delete 语句的各种查询,索引会很有用。

       在我们的coding中,得到相同的查询结果SQL的写法可以有多种,最重要的考虑因素之一是Where条件,Where条件限制了查询要返回的记录数目,查询优化程序会尝试判断已有的索引,分析对查找符合的记录是否有帮助。

       查询优化程序要查看Where中的条件,以决定这些条件在限制SQLServer访问时是否有用。所以,有效的设置查询参数,决定了是否可以充分的利用索引。

       查询参数可以包含一下操作:=、<、>、>=、<=、BETWEEN、部分like。其中,like当这样使用时会用到索 引:like '*%',但like'%*'就用不到索引。因为索引的摆放是依据字段值升序或降序排列,like'%*'这种用法,不能利用有序的数据结构,利用二分法 查找数据。

      不适当的查询参数有:NOT 、!= 、<>、 !>、 !< 、NOT EXISTS、 NOT IN 、NOT LIKE等,还有一些不当的用法,例如:对数据进行计算,负向查询、等号左边使用函数、使用OR。上述语法都不用不上索引,降低程序的效率。

       当我们了解了索引的用法后,在我们编写sql时考虑上述用法,充分利用索引,以高程序的性能。还有,在我们coding过程中,写好sql后,最好使用SQL Server自带的查询计划,来分析SQL执行成本、索引的使用情况,尽可能的使用索引来提高效率。

       先说这么多,欢迎高手们提出更好的建议,我们一起进步。

    [安全]163验证码识别

    mikel阅读(1404)

     

    识别验证码一般是要经过“去干扰”,“切字”,“识别”三步处理。

     

    一、切字

    切字即是将图片里的每个验证码都分别“切”开,这样才能进行下一步的验证码识别,并且“切字”切出来的“字”顺序也关系到识别出来的字符顺序,比如以下验证码样例图片:

      

     

    则应该需要切出“7”,“4”,“3”,“7”,“7”五个字图。

     

    对于不同的验证码图片,“切字”的方法也不尽相同,如对于一些验证码出现位置固定的验证码图片则可以直接从图形中分析出字坐标,再进行“切字”即 可。而对于一些采用了“变位”干扰的验证码图片(如163相册的)就不能采用固定坐标来“切字”了,并且对于某些字符相连的验证码图片(如Google 的),“切字”比“去干扰”还更头痛!!(-_#碰到这类的验证码图片,我一般放弃。咔咔!)

     

    对163相册验证码图片进行“切字”其时还是很简单,因为验证码字符之间是没有任何相连,只是采用了“变位”干扰,但对于这种图形使用“去白拆分法”(嘿嘿,这方法名是我自己名的命)则基本是万能方法。

     

    去白拆分法:

    也就是先将空白的头尾行/列去掉,再按空白列拆分为多个子图,再将这几个子图的头尾空白行/列去掉,经过这几步处理后,那些拆分出来的子图就是最终“切”出来的验证码字图了。

     

    1,去白:去除验证码图片的头尾空白行/列

    比如上面的验证码图片(为了便于说明我在画板程序中打开样例图并将图形放大了6倍和显示网格):

     

    去空白的头尾行/列则是将下面的黄色区域都去掉,只留中间部分。

     

    经过“去白”处理后,图形就变成了如下样式:

     

    2,拆分 : 按空白列拆分图形,如下图根据红线部分拆分就基本将所有验证码字图(7,4,3,7,7)都“切”出来了,如图:

    但要注意,经过上面折分后字图里也还是包含有空白的头尾行,所以也要“去白”处理,如下图:(也就是将那些黄色区域去掉)

     

    经这样处理后的“字图”就可以用于识别了:)

     

    注意:对于某些被干扰破坏得很严重的图形,在进行“去白拆分”操作时要确保“切”到的字图高宽度为“源数字图”的大小

    如下图中的“5”字:

     

    二、验证码识别

    当经过“去干扰”,“切字”处理后,识别就是一个很轻松的工作了。一般采用图形结构“相似度比较法”进行识别,这样对于一些在“去干扰”时就破坏了结构的字图(如上面图片中最后二个“7”字)也可以识别出来,但也因为是对图形结构进行“相似”比较,所以就存在有识别失败的可能性。

     

    相似度比较法

    此方法是将每个“切”出来的字图和所有源数字图逐一比较,并得出一个图形结构的相似度值,然后再取相似度值最高的“源数字图”,这样“字图”对应的字符就识别出来了。

     

    图形结构相似度

    假如将一幅图看成一个二维数组(一维下标对应X轴,二维下标对应Y轴),数组里的数据就是每个象素点的颜色值。那么求两副图图形结构的相似度值,则是等价于求两个二维数组里的数据的相似度统计。

     

    假如有两个数组的数据分别如下:

    二维数组A里的数据:("4"字的01图)

    Code

     

    二维数组B里的数据:("4"字被干扰破坏后的01图,注意红色部分)

     

    Code

     

    求A与B的相似度,则分别比较AB对应“行”里的数据,找出不相同点的数量,也就是共有3次不相同,所以相似度值大概为96% ,因此就可以认为B是A了。

    注:对于相似度取什么值就可考虑AB“相等”,这个大家要权衡一下,毕竟取的值过低识差率可是很大的。

    [框架]分布式计算开源框架Hadoop介绍

    mikel阅读(834)

    分布式计算开源框架Hadoop介绍

    作者 岑文初 发布于 2008年8月4日 上午2时15分

    社区
    Java
    主题
    网格计算,
    集群与缓存
    标签
    Hadoop

    在 SIP项目设计的过程中,对于它庞大的日志在开始时就考虑使用任务分解的多线程处理模式来分析统计,在我从前写的文章《Tiger Concurrent Practice –日志分析并行分解设计与实现》中有所提到。但是由于统计的内容暂时还是十分简单,所以就采用Memcache作为计数器,结合MySQL就完成了访问 控制以及统计的工作。然而未来,对于海量日志分析的工作,还是需要有所准备。现在最火的技术词汇莫过于“云计算”,在Open API日益盛行的今天,互联网应用的数据将会越来越有价值,如何去分析这些数据,挖掘其内在价值,就需要分布式计算来支撑海量数据的分析工作。

    回过头来看,早先那种多线程,多任务分解的日志分析设计,其实是分布式计算的一个单机版缩略,如何将这种单机的工作进行分拆,变成协同工作的集群, 其实就是分布式计算框架设计所涉及的。在去年参加BEA大会的时候,BEA和VMWare合作采用虚拟机来构建集群,无非就是希望使得计算机硬件能够类似 于应用程序中资源池的资源,使用者无需关心资源的分配情况,从而最大化了硬件资源的使用价值。分布式计算也是如此,具体的计算任务交由哪一台机器执行,执 行后由谁来汇总,这都由分布式框架的Master来抉择,而使用者只需简单地将待分析内容提供给分布式计算系统作为输入,就可以得到分布式计算后的结果。

    Hadoop是Apache开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用,如亚马逊、Facebook和Yahoo等等。 对于我来说,最近的一个使用点就是服务集成平台的日志分析。服务集成平台的日志量将会很大,而这也正好符合了分布式计算的适用场景(日志分析和索引建立就 是两大应用场景)。

    当前没有正式确定使用,所以也是自己业余摸索,后续所写的相关内容,都是一个新手的学习过程,难免会有一些错误,只是希望记录下来可以分享给更多志同道合的朋友。

    什么是Hadoop?

    搞什么东西之前,第一步是要知道What(是什么),然后是Why(为什么),最后才是How(怎么做)。但很多开发的朋友在做了多年项目以后,都习惯是先How,然后What,最后才是Why,这样只会让自己变得浮躁,同时往往会将技术误用于不适合的场景。

    Hadoop框架中最核心的设计就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇论文所提及而被广为流传的, 简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。

    MapReduce从它名字上来看就大致可以看出个缘由,两个动词Map和Reduce,“Map(展开)”就是将一个任务分解成为多个任 务,“Reduce”就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。这不是什么新思想,其实在前面提到的多线程,多任务的设计就可以找到这 种思想的影子。不论是现实社会,还是在程序设计中,一项工作往往可以被拆分成为多个任务,任务之间的关系可以分为两种:一种是不相关的任务,可以并行执 行;另一种是任务之间有相互的依赖,先后顺序不能够颠倒,这类任务是无法并行处理的。回到大学时期,教授上课时让大家去分析关键路径,无非就是找最省时的 任务分解执行方式。在分布式系统中,机器集群就可以看作硬件资源池,将并行的任务拆分,然后交由每一个空闲机器资源去处理,能够极大地提高计算效率,同时 这种资源无关性,对于计算集群的扩展无疑提供了最好的设计保证。(其实我一直认为Hadoop的卡通图标不应该是一个小象,应该是蚂蚁,分布式计算就好比 蚂蚁吃大象,廉价的机器群可以匹敌任何高性能的计算机,纵向扩展的曲线始终敌不过横向扩展的斜线)。任务分解处理以后,那就需要将处理以后的结果再汇总起 来,这就是Reduce要做的工作。


    图1:MapReduce结构示意图

    上图就是MapReduce大致的结构图,在Map前还可能会对输入的数据有Split(分割)的过程,保证任务并行效率,在Map之后还会有Shuffle(混合)的过程,对于提高Reduce的效率以及减小数据传输的压力有很大的帮助。后面会具体提及这些部分的细节。

    HDFS是分布式计算的存储基石,Hadoop的分布式文件系统和其他分布式文件系统有很多类似的特质。分布式文件系统基本的几个特点:

    1. 对于整个集群有单一的命名空间。
    2. 数据一致性。适合一次写入多次读取的模型,客户端在文件没有被成功创建之前无法看到文件存在。
    3. 文件会被分割成多个文件块,每个文件块被分配存储到数据节点上,而且根据配置会由复制文件块来保证数据的安全性。


    图2:HDFS结构示意图

    上图中展现了整个HDFS三个重要角色:NameNode、DataNode和Client。NameNode可以看作是分布式文件系统中的管理 者,主要负责管理文件系统的命名空间、集群配置信息和存储块的复制等。NameNode会将文件系统的Meta-data存储在内存中,这些信息主要包括 了文件信息、每一个文件对应的文件块的信息和每一个文件块在DataNode的信息等。DataNode是文件存储的基本单元,它将Block存储在本地 文件系统中,保存了Block的Meta-data,同时周期性地将所有存在的Block信息发送给NameNode。Client就是需要获取分布式文 件系统文件的应用程序。这里通过三个操作来说明他们之间的交互关系。

    文件写入:

    1. Client向NameNode发起文件写入的请求。
    2. NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
    3. Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

    文件读取:

    1. Client向NameNode发起文件读取的请求。
    2. NameNode返回文件存储的DataNode的信息。
    3. Client读取文件信息。

    文件Block复制:

    1. NameNode发现部分文件的Block不符合最小复制数或者部分DataNode失效。
    2. 通知DataNode相互复制Block。
    3. DataNode开始直接相互复制。

    最后再说一下HDFS的几个设计特点(对于框架设计值得借鉴):

    1. Block的放置:默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在 与指定DataNode非同一Rack上的DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。备份无非就是为了 数据安全,考虑同一Rack的失败情况以及不同Rack之间数据拷贝性能问题就采用这种配置方式。
    2. 心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。
    3. 数 据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和需要平衡DataNode数据交互压力等情况):这里先说一下,使用 HDFS的balancer命令,可以配置一个Threshold来平衡每一个DataNode磁盘利用率。例如设置了Threshold为10%,那么 执行balancer命令的时候,首先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode的磁盘利用率超过这个均值 Threshold以上,那么将会把这个DataNode的block转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。
    4. 数据交验:采用CRC32作数据交验。在文件Block写入的时候除了写入数据还会写入交验信息,在读取的时候需要交验后再读入。
    5. NameNode是单点:如果失败的话,任务处理信息将会纪录在本地文件系统和远端的文件系统中。
    6. 数 据管道性的写入:当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个 DataNode传递到备份的DataNode上,一直到所有需要写入这个Block的NataNode都成功写入,客户端才会继续开始写下一个 Block。
    7. 安全模式:在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文 件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必 要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只 需要等待一会儿即可。

    下面综合MapReduce和HDFS来看Hadoop的结构:


    图3:Hadoop结构示意图

    在Hadoop的系统中,会有一台Master,主要负责NameNode的工作以及JobTracker的工作。JobTracker的主要职责 就是启动、跟踪和调度各个Slave的任务执行。还会有多台Slave,每一台Slave通常具有DataNode的功能并负责TaskTracker的 工作。TaskTracker根据应用要求来结合本地数据执行Map任务以及Reduce任务。

    说到这里,就要提到分布式计算最重要的一个设计点:Moving Computation is Cheaper than Moving Data。就是在分布式处理中,移动数据的代价总是高于转移计算的代价。简单来说就是分而治之的工作,需要将数据也分而存储,本地任务处理本地数据然后归 总,这样才会保证分布式计算的高效性。

    为什么要选择Hadoop?

    说完了What,简单地说一下Why。官方网站已经给了很多的说明,这里就大致说一下其优点及使用的场景(没有不好的工具,只用不适用的工具,因此选择好场景才能够真正发挥分布式计算的作用):

    1. 可扩展:不论是存储的可扩展还是计算的可扩展都是Hadoop的设计根本。
    2. 经济:框架可以运行在任何普通的PC上。
    3. 可靠:分布式文件系统的备份恢复机制以及MapReduce的任务监控保证了分布式处理的可靠性。
    4. 高效:分布式文件系统的高效数据交互实现以及MapReduce结合Local Data处理的模式,为高效处理海量的信息作了基础准备。

    使用场景:个人觉得最适合的就是海量数据的分析,其实Google最早提出MapReduce也就是为了海量数 据分析。同时HDFS最早是为了搜索引擎实现而开发的,后来才被用于分布式计算框架中。海量数据被分割于多个节点,然后由每一个节点并行计算,将得出的结 果归并到输出。同时第一阶段的输出又可以作为下一阶段计算的输入,因此可以想象到一个树状结构的分布式计算图,在不同阶段都有不同产出,同时并行和串行结 合的计算也可以很好地在分布式集群的资源下得以高效的处理。


    作者介绍:岑文初,就职于阿里软件公司研发中心平台一部,任架构师。当前主要工作涉及阿里软件开发平台服务框架(ASF)设计与实现,服务集成平台(SIP)设计与实现。没有什么擅长或者精通,工作到现在唯一提升的就是学习能力和速度。个人Blog为:http://blog.csdn.net/cenwenchu79

    [Flex]Adobe的一天学会Flex视频集

    mikel阅读(1196)

    在Aodbe的网站上,推出的一系列的Flex视频教程,希望对大家有用,最近一直在弄.net挺长时间没弄flex
    看来,人在职场身不由己啊
    http://www.adobe.com/devnet/flex/videotraining/

    [问题].Net面试题

    mikel阅读(837)

    1.DateTime.Parse(myString); 这行代码有什么问题?
    2.PDB是什么东西? 在调试中它应该放在哪里?
    3.什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
    4.写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查",
    5.什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
    6.代码加上需要安全权限的特性有什么好处?
    7.gacutil /l | find /i "Corillian" 这句命令的作用是什么?
    8.sn -t foo.dll 这句命令是干嘛的?
    9.DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
    10.对比OOP和SOA,它们的目的分别是什么?
    11.XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
    12.为什么不提倡catch(Exception)?
    13.Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
    14.Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
    15.JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
    16.对比抽象基类和接口的使用
    17.a.Equals(b)和a == b一样吗?
    18.在对象比较中,对象一致和对象相等分别是指什么?
    19.在.NET中如何实现深拷贝(deep copy)?
    20.请解释一下IClonable
    21.什么叫装箱?
    22.string是值类型还是引用类型?
    23.XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
    24.为什么不应该在.NET中使用out参数?它究竟好不好?
    25.特性能够放到某个方法的参数上?如果可以,这有什么用?
    26.新建包含DataGrid控件的ASP.NET页,DataGrid控件负责显示检索到的数据并可按升降排序,我们通过 SortOrder 属性来给DataGrid控件提供数据排序方式:升序时SortOrder 的值为ASC,降序时SortOrder 的值为DESC。如果用户选择降序,应该执行
    a)Application[“SortOrder”] = “DESC”;
    string val = (string) Application[“SortOrder”];

    b)Cache[“SortOrder”] = “DESC”;
    string val = (string) Cache[“SortOrder”];

    c)ViewState[“SortOrder”] = “DESC”;
    string SortOrder = (string) ViewState[“SortOrder”];

    d)Cache[“SortOrder”] = “SortOrder”;
    string val = (string) Cache[“DESC”];

    27.public static void Main(string[] args)
    {
    int i = 2000;
    object o = i;
     i = 2001;
    int j =(int) o;
    Console.WriteLine("i={0},o={1}, j={2}",i,o,j);
    }
    请问此程序的输出是什么,为什么
    28.class Class1
     {
      public static int Count = 0;
      static Class1()
      {
       Count++;
      }
      public Class1()
      {
       Count++;
      }  
     
      static void Main()
      {
       Class1 o1 = new Class1();
       Class1 o2 = new Class1();
     
       Console.WriteLine(Class1.Count);
       Console.Read();
      }    
     }
    输出什么?
    29.以下语句执行后myTable的名称是什么?。
    System.Data.DataTable myTable= new System.Data.DataTable();
    30.如下的 IDimensions 接口和Box 类,该类显式实现接口成员 Length 和 Width。myDimensions是IDimensions 接口的一个实例。

    interface IDimensions 
    {
       
    float Length();
       
    float Width();
    }
    class Box : IDimensions 
    {
       
    float lengthInches;
       
    float widthInches;
       
    public Box(float length, float width) 
       {
          lengthInches 
    = length;
          widthInches 
    = width;
       }
       
    float IDimensions.Length() 
       {
          
    return lengthInches;
       }
       
    float IDimensions.Width() 
       {
          
    return widthInches;      
       }
       
    public static void Main() 
       {
          Box myBox 
    = new Box(30.0f20.0f);
          IDimensions myDimensions 
    = (IDimensions) myBox;
          System.Console.WriteLine(
    "Length: {0}", myBox.Length());
          System.Console.WriteLine(
    "Width: {0}", myBox.Width());
       }
    }

    执行以上程序控制台输出为?

    答案:

    1.

    当myString不能满足时间格式要求的时候,会引发异常。建议使用DateTime.TryParse()

    2.

    PDB是用于保存调试和项目状态信息的文件,在Debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。

    3.

    一种代码复杂度的衡量标准, 英文名称叫Cyclomatic Complexity。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的 最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。

    4.

    1public void LockTest()
    2{
    3    Object lockObj = new Object();
    4    lock (lockObj)
    5    {
    6       //
    7    }

    8}

    5.

    FullTrust完全信任。.NET运行时对GAC中的assembly自动赋予Full Trust的权限.

    6.

    没深入过,望高手指教

    7.

    全局程序集缓存中如果有Corillian就更新该程序集,没有就安装

    8.

    显示程序集foo.dll的公钥标记

    9.

    135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定。135是远程过程调用(RPC)的默认端口

    10.

    我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。而SOA是一个技术框架或者是一种思想,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件现组成业务总线提供给应 用程序来调用。

    11.

    将对象序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

    12.

    原因可能有两点:1)try..catch在出现异常的时候影响性能 2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等
    13.

    Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

    14.

    Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略

    15.

    方法,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么

    16.

    抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。

    17.

    不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等

    18.

    对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同
    19.

    实现IClonable接口

    20.

    IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对 象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是 Object.MemberWiseClone().

    深度复制与浅度复制比较

    21.

    装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将引用类型数据转换值类型,比如int j = (int)o;属于拆箱

    22.

    引用类型

    23.

    只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能

    24.

    不知道,只是看过有文章说最好少用……

    25.

    可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。

     

    方法的参数设置Attribute的例子

    26.

    C

    27.

    i=2001,0=2000,j=2000

    28.

    3

    29.

    ""(字符串空)

    30.

    报错,Box 类并没有Length和Width方法

    [SVN]SVN安装与配置

    mikel阅读(755)

    首选需要下载以下内容:
    1.Subversion 1.5
    2.TortoiseSVN-1.5.1.13563-win32-svn-1.5.1.msi SVN客户端
    3.VisualSVN-Server-1.5.1.msi Windows下的SVN服务器
    下载完毕后依次安装
    设置 VisualSVN如图
    1.右键单击Repository,选择create new respository

    2.弹出窗口中输入respository名字

    3.创建本地文件夹

    4.右键单击文件夹,选择SVN Checkout

    5.弹出窗口中输入http://SVN服务器名:8843/svn/Mikel,点击OK

    6.完成,这样你就可以在Mikel目录下创建你的项目,并单击右键选择SVN Commit 和SVN Update进行上传和更新操作,以及查看日志等操作,具体见TortoiseSVN帮助

    [SVN]SubVersion服务器Windows安装指南

    mikel阅读(709)

    SubVersion及TortoiseSVN下载请到其官方网站:http://subversion.tigris.org
    注:如果要使用TortoiseSVN中文界面,还要下载其语言安装包. 若只在本地计算机上使用,不使用SubVersion服务,则只需安装TortoiseSVN相关组件即可.
    一.下载文件列表:
    1.SubVersion  点击这里下载,版本是1.3.0,SubVersion服务程序.
    2.TortoiseSVN 点击这里下载,版本是1.3.2,SubVersion客户端程序.
    3.TortoiseSVN 中文语言包 点击这里下载,版本与上面的匹配.
    4.SVNService 点击这里下载,可以将SubVersion服务包装成Windows NT服务.
    二.安装步骤
    1.安装SubVersion
    2.安装TortoiseSVN及语言包
    3.配置SubVersion服务
        SubVersion本身是由命令行启动的,在SubVersion安装目录中找到,它不能像Windows NT服务一样随Windows启动,需要借SVNService来包装成Windows NT服务.具体设置如下:
        将下载的SVNService解包后,将其中的拷贝到SubVersion的安装目录中的\bin目录, 保证SVNService.exe和svnserve.exe在同一目录.
        安装服务:
        运行命令:SVNService -install -d -r <svnroot>
        在实际操作中,<svnroot>代表SubVersion服务的电子仓库目录.
        改变服务设置:
        运行命令:SVNService -setup -d -r <newsvnroot>
        在实际操作中,<newsvnroot>代表与SubVersion服务启动时不同的电子仓库目录.
        删除服务:
        运行命令:SVNService -remove
    4.用TortoiseSVN创建电子仓库
        TortoiseSVN客户端不是独立的程序,而是与Windows Explorer进行了外壳集成,其操作通过环境菜单来完成. 
       
        如上图所示:
        1.创建名为SVNroot的空目录
        2在目录上,或在在目录内空白处点右键,从TortoiseSVN菜单中选择Create repository here…(在此处创建电子仓库),在选择电子仓库类型后,将会自动生成一些文件和目录.这样就完成了电子仓库的创建,你可以用同样的方法创建多个电 子仓库.
        注:电子仓库类型有两种可供选择,选择任意一种即可:
        1.Native filesystem(FSFS) 本地文件系统
        2.Berkely database(BDB) Berkely数据库
        不同的选择只会影响电子仓库的数据存取格式,默认选择为:Native filesystem
        在本例中,可以用:SVNService -install -d -r e:\svnroot来安装SubVersion服务
        要问本机安装的服务请在右键菜单中选择Reop-browser(电子仓库浏览),弹出如下对话框:
        
        
        如果是访问本地电子仓库,可以使用文件协议:file:///e:/svnroot
        如果从网络上访问其它机器的电子仓库,则使用SVN协议,如:svn://127.0.0.1
        
        上图对话框中会以树状结构显示电子仓库的内容. 

    [SVN]SVN配置

    mikel阅读(630)

    svn架设快速入门(转)
    如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关心的问题,与CVS相比,Subversion有更多的选择,也更加的容易,几个命令就可以建立一套服务器环境,可以使用起来,这里配套有动画教程。
    本文是使用Subversion最快速的教程,在最短的时间里帮助您建立起一套可用的服务器环境,只需略加调整就可以应用到实际项目当中。
    本教程分为以下几个部门,不仅仅是快速入门,最后我们还有一些高级功能的说明,为了说明简单,教程是在windows下使用的方式,以方便资源有限的项目使用,对于UNIX环境下,区别并不大。
    软件下载
    服务器和客户端安装
    建立版本库(Repository)
    配置用户和权限
    运行独立服务器
    初始化导入
    基本客户端操作
    1,软件下载
    下载Subversion服务器程序。
    到官方网站的下载二进制安装文件,来到二进制包下载部分,找到 Windows NT, 2000, XP and 2003部分,然后选择” this directory “,这样我们可以看到许多下载的内容,目前可以下载 svn-1.4.0-setup.exe 。
    下载Subversion的Windows客户端TortoiseSVN。
    TortoiseSVN是扩展Windows Shell的一套工具,可以看作Windows资源管理器的插件,安装之后Windows就可以识别Subversion的工作目录。
    官方网站是TortoiseSVN ,下载方式和前面的svn服务器类似,在Download页面的我们可以选择下载的版本,目前的最高稳定版本的安装文件为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。
    2,服务器和客户端安装
    服务器安装,直接运行svn-1.4.0-setup.exe ,根据提示安装即可,这样我们就有了一套服务器可以运行的环境。
    安装TortoiseSVN,同样直接运行TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi按照提示安装即可,不过最后完成后会提示是否重启,其实重启只是使svn工作拷贝在windows中的特殊样式生效,与所有的实际功能无关,这里为了立刻看到好的效果,还是重新启动机器。
    3,建立版本库(Repository)
    运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:
    svnadmin create E:\svndemo\repository
    就会在目录E:\svndemo\repository下创建一个版本库。
    我们也可以使用TortoiseSVN图形化的完成这一步:
    在目录E:\svndemo\repository下”右键->TortoiseSVN->Create Repository here…“, 然后可以选择版本库模式, 这里使用默认即可, 然后就创建了一系列目录和文件。
    4,配置用户和权限
    来到E:\svndemo\repository\conf目录,修改svnserve.conf:
    # [general]
    # password-db = passwd
    改为:
    [general]
    password-db = passwd 然后修改同目录的passwd文件,去掉下面三行的注释:
    # [users]
    # harry = harryssecret
    # sally = sallyssecret
    最后变成:
    [users]
    harry = harryssecret
    sally = sallyssecret
    5,运行独立服务器
    在任意目录下运行:
    svnserve -d -r E:\svndemo\repository 我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。
    6,初始化导入
    来到我们想要导入的项目根目录,在这个例子里是E:\svndemo\initproject,目录下有一个readme.txt文件:
    右键->TortoiseSVN->Import…
    URL of repository输入“svn://localhost/”
    ok
    完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。
    需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。
    7,基本客户端操作
    取出版本库到一个工作拷贝:
    来到任意空目录下,在本例中是E:\svndemo\wc1,运行右键->Checkout,在URL of repository中输入svn://localhost/,这样我们就得到了一份工作拷贝。
    在工作拷贝中作出修改并提交:
    打开readme.txt,作出修改,然后右键->Commit…,这样我们就把修改提交到了版本库,我们可以运行。
    察看所作的修改:
    readme.txt上右键->TortoiseSVN->Show Log,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Compare with working copy,我们可以比较工作拷贝的文件和版本1的区别。
    最后,所有的内容都已经录制为动画文件,大家可以参考。
    关于本教程大家有什么意见,可以在论坛里讨论 。
    转载地址:http://www.subversion.org.cn/index.php?option=com_content&task=view&id=56&Itemid=9
    PS
    Subversion安装成service
    sc create SVNService binPath= “\”C:\Program Files\Subversion\bin\svnserve.exe\” –service -r E:\svndemo” DisplayName= “SVNService” depend= Tcpip start= auto

    Flash动画

    [问题]VS2008不支持SourceSafe的问题解决办法

    mikel阅读(909)

    You've probably all seen Soma's announcement that the 2008 suite of products officially shipped this morning.  Good luck downloading — our servers are pegged 🙂 

    If you plan to use VS 2008 with SourceSafe, make sure to pick up the Update CTP too.  Without it, some features like "Open from Source Control" will not work at all.  Pay close attention to the install instructions as well.  As it says in the KB article:

    You may receive error messages when you use Visual Studio 2008. This problem occurs because some compatibility fixes require the Tdnamespaceextension.dll file to be reregistered after you install Visual Studio 2008. To reregister the Tdnamespaceextension.dll file, type the following command at the [elevated – RB] command prompt:

    regsvr32 "%programfiles%\Microsoft Visual SourceSafe\tdnamespaceextension.dll"

    Sorry about the manual install step.  It sucks, I know.  The next Update won't have this requirement.  (We wanted to ship it before orcas but ran into some last-minute delays.  Expect it before the end of the year.)

    Why does SourceSafe need an update anyway?  Aren't VS plugin interfaces supposed to be backwards compatible?  Yes, they are.  In fact, there are no changes to the MSSCCI API in 2008; none of the fixes are related to MSSCCI.  (3rd party source control developers can now breathe a sigh of relief).  The changes come from the way SourceSafe implements Open from Source Control, Add to Source Control, and Share inside Visual Studio. 

    Starting in VSS 2005, these functions let you browse the database inside VS's open/add dialogs instead of hanging off the File -> Source Control menu like most other source control providers.  It's a cool trick known as a namespace extension.  In VS 2008, as you may have noticed, those open/add dialogs got a facelift: like VSS 2005, VS 2008 now uses the standard Windows dialogs.  So Vista users in particular get a spiffy new one with integrated search & everything.  Unfortunately, that change broke us pretty badly, leading in one way or another to at least 10 of the bugs on my list.  Bottom line, you don't want to be caught without the Update linked above. 

    Hopefully these fixes demonstrate our commitment to keep SourceSafe 2005 a viable option with VS 2008, Vista, and beyond!