红俊's profile蝈蝈俊的共享空间PhotosBlogListsMore Tools Help

Blog


    March 30

    Html标签嵌套对展示性能的影响

    一个简单问题:如下2种Html写法,那个加载速度快?

    <!-- 写法1 -->
    <div>
    <div>内容代码2</div>
    <div>内容代码3</div>
    <div>内容代码4</div>
    <div>内容代码5</div>
    <div>内容代码6</div>
    <div>内容代码7</div>
    <div>内容代码8</div>
    <div>内容代码9</div>
    <div>内容代码10</div>
    </div>
    
    <!-- 写法2 -->
    <div>内容代码2</div>
    <div>内容代码3</div>
    <div>内容代码4</div>
    <div>内容代码5</div>
    <div>内容代码6</div>
    <div>内容代码7</div>
    <div>内容代码8</div>
    <div>内容代码9</div>
    <div>内容代码10</div>

    我的答案,写法2。当然,如果只是上面的写法,实际上这两种写法对性能的差别,可以忽略不计。

    但是如果,上图的内容代码区域如果嵌入了一些不可控的因素,比如:外站的一些脚本出现在<div>内容代码7</div>中。写法1需要所有都加载完成才可以正常显示,写法2的内容2-6 不受这个影响。

     

    更具体的来说:浏览器解析Html的规则必然是:

    • 当服务器向浏览器输出多少,浏览器就会解释多少,浏览器不可能解析没有给它的内容。
    • 源文件Body区域的每个Html标签,如果浏览器找不到这个标签的结束标志(一些html标签没有结束标志,但是需要浏览器去分析结束位置)。这个标签对应的内容,浏览器就难以正常显示。
    • 源文件Body区域的多个标签嵌套,需要所有被嵌套标签都加载完成,才能正常显示,这时候加载顺序是倒着的。举例:<div>1<div>2<div>3</div><div></div>这段源代码会先显示3,然后2, 最后1。因为加载div1时并没有找到它的结束标签</div>,于是它不加载继续解析源文件,在找到div2时,和上面一样也没有找到结束位置不做加载。然后是找到div3,div3有结束标签。 浏览器开始加载div3,之后,找到div2的结束标签,加载div2,以次类推,所以这时理论加载顺序为: 3 2 1 。
    • 如果浏览器的加载页面元素只是上面这样的工作原理,我们看到的很多页面的效果就是整个页面所有都加载完成才能显示出来。其实浏览器还有由一个特性,它可以去预测没有加载的内容。有些浏览器在打开一些网页的规程中,会把一些元素移位,最后才恢复正常,一部分原因就是这个事先预测在起作用。

     

    再回到最初的问题:

    一般美工在作页面时,会喜欢写法1的嵌套Html。如果一个夏姆,对用户体验要求高,同时预测到可能会在一些地方嵌入广告脚本会影响到页面显示,我会要求美工用方法2的方式来书写源文件,以保证用户体验。页面的设计,减少嵌套的层次,对页面的加载会好处多多的。

    最后,我家儿子刚过一周岁,文章的最后祝福一下我家小宝贝。

     

    参考资料:

    <div>嵌套<div>后的显示速度问题
    http://zhidao.baidu.com/question/7892633.html

    关于DIV和表格的速度评论
    http://x.discuz.net/viewthread-469261.html

    把所有东西都放在一个大DIV里,显示速度问题。
    http://zhidao.baidu.com/question/52404898.html

    整个网页面用一个DIV包含起来好不好
    http://zhidao.baidu.com/question/67452079.html

    March 19

    NLB是如何做负载分流计算的

          网络负载平衡采用一种完全分布式的算法,根据传入客户端的 IP 地址和端口,以统计方式将其映射到群集主机。此进程的发生不需要主机间进行任何通信。当发现到达的数据包时,所有主机同时执行这种映射,以快速确定哪个主机应当处理这个程序包。这种映射一直保持不变,直到群集主机数发生更改时为止。与集中式负载平衡应用程序相比,网络负载平衡筛选算法处理数据包的效率更高,因为前者必须修改和重新传送数据包。

    如下图:

    • 请求发送到所有NLB主机
    • 只有一台主机会处理,其他主机丢弃这个请求。
    • 此进程的发生不需要主机间进行任何通信。
    • 不需要修改和重新传送请求数据包。

     

    cc756878_6526a396-cf25-4936-9474-827744f3ff9d(en-us)

    这个统计算法在 Wlbs.sys 组件中实现。

    有关这个算法细节可以搜索关键字:“Load Balancing Algorithm”

    下面是一些相关文章链接:

    How Network Load Balancing Algorithm works internally
    http://www.codedigest.com/Articles/Windows%20and%20Clustering/49_How_Network_Load_Balancing_Algorithm_Works_Internally.aspx

     

          为了协调其操作,网络负载平衡主机在群集内周期性地交换检测信号。IP 多播允许主机监控群集状态。当群集状态更改时(例如当主机发生故障、离开或加入群集时),网络负载平衡将调用称作“聚合”的过程,在该过程中,主机交换数量有限的消息,以确定群集的新的一致状态,并为主机指定最高主机优先级,即作为新的默认主机。当所有群集主机在正确的新群集状态下取得一致后,它们将在 Windows 事件日志中记录聚合的完成。完成这个过程一般用不了 10 秒种。

          在聚合过程中,其余主机继续处理传入的网络通信。对工作主机的客户端请求不受影响。完成聚合后,将以故障主机为目标的通信重新分发给仍在工作的主机。经过负载平衡后的通信将在仍在工作的主机间得到重新划分,以便尽可能好地实现特定 TCP 或 UDP 端口的新的负载平衡。

          如果向群集添加了一个主机,则聚合允许该主机接收自己那份经过负载平衡的通信。群集的扩展不影响正在进行的群集操作,而且其实现过程对 Internet 客户端和服务器应用程序都是透明的。但是,当选择了“客户端相似性”时,它可能影响跨多个 TCP 连接的客户端会话,因为可能会将客户端重映射到连接间的不同群集主机。有关相似性的详细信息,请参阅网络负载平衡和状态可控的连接。

          网络负载平衡假定,主机在群集内正常工作的时间与它同其他群集主机交换检测信号的时间一样长。如果在多次检测信号交换中,其他主机都没有接收到来自任何成员的响应,则它们将启动聚合,重新分发本来应由失败主机处理的负载。

          对于消息交换时段以及启动聚合所需的丢失的消息数,您都可以进行控制。默认值设置分别为 1000 毫秒(1 秒)和 5 个丢失的消息交换时段。由于一般都不修改这些参数,所以无法通过“网络负载平衡属性”对话框配置它们。必要时,可以在注册表中手动调整它们。调整聚合参数对完成此操作的过程进行了描述。

    如下图所示发生群机主机变更时的处理。

     

    聚集前的NLB集群

    cc756878_6c2499e2-a23d-4372-84e9-472f776f976e(en-us)

    聚集后的NLB集群

    cc756878_112a09ea-07b3-4147-a07b-e0dae0261879(en-us)

     

    参考资料:

    How Network Load Balancing Technology Works
    http://technet.microsoft.com/en-us/library/cc756878.aspx

    Appendix B - Network Load Balancing Technical Overview
    http://technet.microsoft.com/en-us/library/bb734896.aspx

    网络负载平衡的工作原理
    http://technet.microsoft.com/zh-cn/library/cc738894.aspx

    March 18

    ASP.net2.0的machineKey

    machineKey的作用在于下述场景:

    • ASP.net 使用 forms authentication 时的 cookie 数据的加密和解密。以确保这部分数据不会被篡改。
    • viewstate 数据的加密和解密。以确保这部分数据不会被篡改。
    • 使用进程外session(out-of-process session)时,对会话状态标识进行验证。

    ASP.net 1.0 以及 ASP.net 1.1, 我们都可以在下面地址的文件中找到machineKey的配置信息:

    %Windir%\Microsoft.NET\Framework\<version>\config\machine.config

    不同的是 ASP.net 1.0 找到的是如下的配置信息

    <machineKey 
       validationKey="AutoGenerate" 
       decryptionKey="AutoGenerate" 
       validation="SHA1"
    />

    ASP.net 1.1 找到的是如下信息:

    <machineKey 
       validationKey="AutoGenerate,IsolateApps" 
       decryptionKey="AutoGenerate,IsolateApps" 
       validation="SHA1"
    />

    但是 ASP.net 2.0 , .net Framework 3.0 ,.net Framework 3.5 这些版本中,我们在

    %Windir%\Microsoft.NET\Framework\<version>\config\

    目录的  machine.config 和 web.config 中找不到machineKey的设置。

    这是因为, ASP.net 2.0 中,machineKey 的默认设置没有写在配置文件中。

    ASP.net 2.0 中,machineKey 的默认设置如下:

    <machineKey 
       validationKey="AutoGenerate,IsolateApps" 
       decryptionKey="AutoGenerate,IsolateApps"    
       validation="SHA1" 
       decryption="Auto" 
    />

    我们如果要修改machineKey的默认设置,就需要在必要的地方新加machineKey的配置节点。

    产生一个可用的 machineKey 配置信息可以使用下面地址提供的工具:
    http://www.aspnetresources.com/tools/keycreator.aspx

    参考资料:

    How To: Configure MachineKey in ASP.NET 2.0
    http://msdn.microsoft.com/zh-cn/library/ms998288(en-us).aspx

    machineKey 元素(ASP.NET 设置架构)
    http://msdn.microsoft.com/zh-cn/library/w8h3skw9(VS.80).aspx
    http://msdn.microsoft.com/en-us/library/w8h3skw9.aspx

    March 17

    ASP.net 的工作线程与请求队列

    ASP.net工作线程池

    当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程。

    一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求。如果一个同步请求成为 I/O bound(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求的线程在调用返回之前处于挂起状态。 这影响了可伸缩性,原因是线程池的可用线程是有限的。

    这个数字的设置是在 machine.config 的 下述节点的 maxWorkerThreads 属性

    <system.web>
    	<processModel requestQueueLimit="num|Infinite" maxWorkerThreads="num"  />
    </system.web>

    maxWorkerThreads
    按 CPU 配置用于进程的辅助线程的最大数目。例如,如果单处理器服务器上的该值为 25,ASP.NET 使用运行时 API 将进程限制设置为 25。在双处理器服务器上,该限制设置为 50。该属性的值必须等于或大于 httpRuntime 配置节中的 minFreeThread 属性设置。
    该属性的范围是从 5 到 100。

    ASP.net请求队列

    上述设置中,还有一个队列设置,如下:


    requestQueueLimit
    指定队列中允许的请求数,超过此数目后,ASP.NET 将开始向新请求返回“503 - 服务器太忙”消息。

     

    默认情况下,这个可用分线程数为1000。下图为IIS6和IIS7中这个参数的设置地方。

    IIS 7 的可用线程数设置

    IIS 6 的可用线程数设置

     

    如果所有请求处理线程全部阻塞以等待 I/O 操作完成,则其他请求排入队列等待线程释放。

    最好的情况是吞吐量减少,因为请求等待较长的时间才能得到处理。

    最坏的情况则是该队列填满,并且 ASP.NET 因 503“Server Unavailable”错误使后续请求失败。

     

    参考资料:

    在服务器端 Web 代码中使用线程和生成异步处理程序
    http://msdn.microsoft.com/zh-cn/library/aa686076.aspx

    ASP.NET 2.0 中的异步页
    http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx

    IIS 6.0 架构
    http://blog.csdn.net/heaven_pl/archive/2008/02/19/2106572.aspx
    http://blog.csdn.net/heaven_pl/archive/2008/02/19/2106579.aspx

    IIS 7.0 架构
    http://blog.csdn.net/SKY_VID/archive/2008/03/04/2147732.aspx

     

    了解ASP.NET底层架构
    http://blog.csdn.net/fanweiwei/archive/2007/04/10/1558912.aspx

    网络负载平衡(Network Load Balancing)的工作原理

    最近正在研究如何把CSDN的论坛WEB服务器实现负载平衡(NLB)。下面就是我整理资料笔记:

    NLB 的工作原理

    NLB算法的特点:

    • 在NLB群集中,每台服务器都会有一个属于自己的静态IP地址,同时NLB群集中的所有服务器还有一个共同的IP地址—NLB群集地址;
    • 当客户向NLB群集(NLB的虚拟IP地址)发起请求时,其实客户的请求数据包是发送到所有的NLB节点(即:NLB算法需要NLB群集中的所有主机都能看到发往群集的每一个数据包。),然后运行在NLB节点上的NLB服务根据同样的NLB算法来确定是否应该由自己进行处理,如果不是则丢弃客户的请求数据包,如果是则进行处理。 
    • 网络负载平衡使得单个子网上的所有群集主机可以同时检测群集 IP 地址的传入网络通信。在每个群集主机上,网络负载平衡驱动程序充当群集适配器驱动程序和 TCP/IP 堆栈间的过滤器,以便在主机间分配通信。

    要确保上面算法的特点,单播(Unicast ),多播(Multicast)实现NLB就会有以下的特点:

    NLB中的单播(Unicast)

          在单播模式下,NLB重新对每个NLB节点中启用NLB的网络适配器分配MAC地址(此MAC地址称为群集MAC地址),并且所有的NLB节点均使用相同的MAC地址(均使用群集MAC地址),同时NLB修改所有发送的数据包中的源MAC地址,确保使交换机不能将此群集MAC地址绑定在某个端口上。

          工作在单播模式下的NLB可以在所有网络环境下正常运行,但是由于它的工作特性,具有以下两个限制:

    • 由于NLB所使用的群集MAC地址没有绑定在某个具体的交换机端口上,所以所有的NLB通讯均通过在交换机的所有端口上广播进行,而不管此端口是否连接了NLB节点,这造成了额外的网络流量负担;
    • 由于所有的NLB节点具有相同的MAC地址,NLB节点之间不能通过自己原有的专用IP地址进行通讯。

         单播模式的优点也很明显:它可以无缝地与大多数路由器和交换机协同工作。

         如下图所示:

    Image1189

    单播的其他注意项:

    • 在Windows server 2003 SP1中,微软修改了NLB单播模式的驱动,从而支持阵列成员通过自己原有的专用IP地址进行通讯,详细信息请参见KB898867,Unicast NLB nodes cannot communicate over an NLB-enabled network adaptor in Windows Server 2003。
    • 若我们在NLB创建时选择单播的模式,在“群集IP配置”中的“网络地址”是以“02 - BF”开头,后面紧跟IP地址的十六进制表示,该网络地址与实际主机的MAC地址相同,后续加入的主机也将修改为此MAC地址。

    参考:

    单播模式下的单个网络适配器
    http://technet.microsoft.com/zh-cn/library/cc757150.aspx
    单播模式下的多个网络适配器
    http://technet.microsoft.com/zh-cn/library/cc786134.aspx

    NLB中的多播(Multicast)

          在多播模式下,NLB不会修改NLB节点启用NLB的网络适配器的MAC地址,而是为它再分配一个二层多播MAC地址专用于NLB的通讯(此MAC地址称为群集MAC地址),这样NLB节点之间可以通过自己原有的专用IP地址进行通讯。

          但是在多播模式中,NLB节点发送的针对群集IP地址MAC地址ARP(Address Resolution Protocol,地址解析协议)请求的ARP回复会将群集IP地址映射到多播MAC地址,而许多路由器或者交换机(包括CISCO的产品)会拒绝这一行为。当出现这种情况时,你必须在路由器和交换机上手动添加静态映射,将群集IP地址映射到群集的多播MAC地址。          这种模式的优点是可以通过在交换机的“内容可寻址存储器”(CAM) 表中创建静态项,从而使得入站流量仅到达群集中的主机。

          还有一个缺点就是很多路由器不会自动将单播 IP 地址(群集的虚拟 IP 地址)与多播 MAC 地址关联起来。如果进行静态配置的话,一些路由器可以存在这种关联。若我们在NLB创建时选择多播的模式,在“群集IP配置”中的“网络地址”是以“03 -BF”开头,后面紧跟IP地址的十六进制表示。

          如下图所示:

     

     

    Image1193

     

     

    IGMP Multicast(IGMP多播)

          NLB算法需要NLB群集中的所有主机都能看到发往群集的每一个数据包。NLB不允许交换机将群集的MAC地址关联到交换机的某个特定端口,从而实现了这个目的。但是,这种做法也会带来不想要的副作用,就是发往NLB群集的所有数据包会在交换机上的所有端口上造成数据“洪水”。这不仅非常麻烦,而且必将会造成网络资源的浪费。

          为了解决这个问题,一个被称作IGMP支持的新特性被引入到了Windows Server 2003之中。该特性有助于将数据“洪水”限制到交换机上与NLB计算机相连接的端口上。通过这种方式,非NLB的计算机不会看到发往NLB群集的数据,而与此同时,所有的NLB计算机都可以看到发往群集的数据,因此满足了NBL算法的要求。但是,应该指出的是:IGMP支持只有在NLB被配置多播(multicast)模式时才能启用。

          在选择多播模式时,后面还有个复选项“IGMP Multicast(IGMP多播)”,若复选此项,就像多播操作模式一样,NLB 保留原厂 MAC 地址不变,但是向网络适配器中增加了一个 IGMP 多播地址。此外,NLB 主机会发出这个组的 IGMP 加入消息。如果交换机探测到这些消息,它可以使用所需的多播地址来填充自己的 CAM 表,这样入站流量就不会扩散到 VLAN 上的所有端口。这是这种群集模式的主要优点。缺点是有一些交换机不支持 IGMP 探测。除此之外,路由器仍然支持单播 IP 地址到多播 MAC 地址的转换。在IGMP多播模式下,将采用“01 – 00 - 5E”开头的MAC地址。在多播的模式下,实体主机之间可以互相通信。

    如下图所示:

    cc758275_d1687ea3-0f58-46ce-ae65-208ee3aab8dc(en-us)

     

    NLB对路由器的要求

    当群集已配置为在多播模式下工作时,如果网络负载平衡客户端正在通过路由器访问一个群集,请确保路由器满足以下要求:

    • 接受地址解析协议 (ARP) 应答,此应答在 ARP 结构的有效负载部分有一个媒体访问控制 (MAC) 地址,但正如以太网报头所确定的,它看上去像来自具有另一个 MAC 地址的站点。
    • 接受单播 IP 地址的 ARP 应答,此应答在其 ARP 结构的有效负载部分有一个多播 MAC 地址。

    单播模式对路由器没有要求。

     

     

    参考:

    多播模式下的单个网络适配器
    http://technet.microsoft.com/zh-cn/library/cc759683.aspx

    多播模式下的多个网络适配器
    http://technet.microsoft.com/zh-cn/library/cc779600.aspx

     

    附:单播(Unicast),多播(Multicast),广播(Broadcast) 的区别:

    单播:

    主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。
    单播的优点:
    1. 服务器及时响应客户机的请求
    2. 服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。
    单播的缺点:
    1. 服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。
    2. 现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞,只要有5%的客户在全速使用网络,其他人就不要玩了。而将主干扩展20倍几乎是不可能。

    多播(组播):

    主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。
    组播的优点:
    1. 需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。
    2. 由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个(268435456)组播,所以其提供的服务可以非常丰富。
    3. 此协议和单播协议一样允许在Internet宽带网上传输。
    组播的缺点:
    1.与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。
    2.现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中。

    广播:

    主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
    广播的优点:
    1. 网络设备简单,维护简单,布网成本低廉
    2. 由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。
    广播的缺点:
    1.无法针对每个客户的要求和时间及时提供个性化服务。
    2. 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。
    3. 广播禁止在Internet宽带网上传输。

    参考资料: 

    Load Balancing and ASP.NET
    http://www.hanselman.com/blog/LoadBalancingAndASPNET.aspx

    Web Farming with the Network Load Balancing Service in Windows Server 2003
    http://www.west-wind.com/presentations/loadbalancing/NetworkLoadBalancingWindows2003.asp

    网络负载平衡算法 Works 内部怎样
    http://support.microsoft.com/kb/556068/zh-cn?spid=3198&sid=770

    WEB farm - Load Balancing in Asp.net
    http://www.c-sharpcorner.com/UploadFile/gopenath/Page107182007032219AM/Page1.aspx

    How to test web load balance
    http://www.cnblogs.com/oscarxie/archive/2008/05/20/1203157.html

    将asp.net迁移到Load Balance和NAS上的步骤
    http://blog.joycode.com/hopeq/archive/2006/03/29/73762.aspx

    微软知识库中的关于负载均衡的HowTo文章汇总
    http://support.microsoft.com/ph/3198/zh-cn?sid=770&aid=1&GSA_AC_More1

    TechNet 关于 网络负载平衡群集  的内容
    http://technet.microsoft.com/zh-cn/library/cc759510.aspx     中文
    http://technet.microsoft.com/en-us/library/cc759510.aspx     英文

    下面文章中间谈到了负载均衡的工作原理
    http://technet.microsoft.com/zh-cn/library/aa998796%28EXCHG.65%29.aspx

    NLB配置中单播与多播区别
    http://hi.baidu.com/hneli/blog/item/656725d3e5471433970a16bd.html

    NLB群集
    http://blog.sina.com.cn/s/blog_4b611a45010009hh.html

    Using NLB with ISA Server Part 2: Layer 2 Fun with Unicast and Multicast Modes
    http://www.isaserver.org/articles/basicnlbpart2.html

    IP多播概述
    http://www.microsoft.com/china/technet/community/columns/cableguy/cg0202.mspx

    TCP/IP学习笔记之九 --- 广播和多播
    http://blog.csdn.net/kmajian/archive/2008/11/27/3389667.aspx

    网络负载平衡关键特性
    http://technet.microsoft.com/en-us/library/cc758275.aspx

    Network Load Balancing
    http://www.msxfaq.de/verschiedenes/nlb.htm

    Network Load Balancing Technical Overview
    http://technet.microsoft.com/zh-cn/library/bb742455(en-us).aspx 网络技术基础知识一之ARP协议概说
    http://cisco.chinaitlab.com/TCP/38035.html

    March 13

    information_schema.routines与sysobjects

    在建立存储过程前,我习惯于先检查存储过程是否存在,如果存在就建立,然后再创建。

    这个检查的过程,现在有2种习惯写法,如下:
    if exists (
    	select * from information_schema.routines where specific_name = 'WorkOrdersForBlade' and specific_schema = 'dbo')
    	begin
    		drop procedure dbo.workordersforblade
    	end
    go

    或者

    if exists (
    	select * from sysobjects where type = 'p' and name = 'WorkOrdersForBlade')
    	begin
    		drop  procedure  dbo.workordersforblade
    	end
    
    go

    information_schema.routines 是SQL Server 2000开始新加的系统视图,它是以 sysobjects 和 syscolumns 系统表为基础建立的系统视图。它的字段更具备可读性。

    用上面那个写法都没有问题。 在SQL Server 2005 以及 2008 的默认模板中,使用的是第一种写法。

    显然,我们最好用经过整合后,更具备可读性的视图 information_schema.routines 。

    参考资料:

    SQL Server 2008 联机丛书 对routines 视图的介绍
    http://msdn.microsoft.com/zh-cn/library/ms188757.aspx
    http://msdn.microsoft.com/en-us/library/ms188757.aspx

    数据库中User和Schema的关系
    http://blog.csdn.net/yanjiangbo/archive/2007/09/12/1782576.aspx

    ROUTINES
    http://www.yesky.com/imagesnew/software/tsql/ts_ia-iz_3kq1.htm

    March 12

    EditPlus 多行合并的方法

    比如我们有如下图一的文档,我们希望把他们每五行合并成一行,即图二。

    54301

    (图一)

    54302

    (图二)

    我们就可以用如下图的替换选项来实现:

    54303

    即,查找内容为

    \n([^\n]+)\n([^\n]+)\n([^\n]+)\n([^\n]+)\n

    替换内容为

    \1\2\3\4\n

    这些正则表达式的写法,直接看查找内容和替换内容边的下拉按钮就可以很方便的获得提示,如下图:

    54304

    54305

    March 11

    VS2008的DataBase Project的项目模板目录

    公司正在统一存储过程的编写规范,为了更宜用,我们就修改了SQL Server Management Studio 和 Microsoft Visual Studio 2008 的模板文件。

    SQL Server Management Studio 的模板文件所在的目录请参看我之前的博客:

    改变 SQL Server Management Studio的模板

    Visual Studio 2008 的DataBase Project(如下这个数据库项目)的模板则在

    C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\Templates\Database Project Items  这个目录下。

    注意:这跟其他类型项目的模板不是一个目录。

    401

    我这里要修改的模板就是下面方式建立的存储过程的模板。

    402

    额外多说一句,我是通过下面这个工具找到这个目录的。

    Process Monitor
    v2.03 (December 10, 2008)
    Monitor file system, Registry, process, thread and DLL activity in real-time.

    参考资料:

    vs2008修改模板-自定义版权信息

    March 05

    我碰到的一种出现“ConnectionString 属性尚未初始化。”的情况

    今天在外部发布一个站点时,站点一直报错误,而本地却没有这个问题:

    7401

    Google上搜索情况,跟我这里的情况都不一样。最后发现竟然是Web.config文件的 connectionStrings 配置节竟然有2个重名的导致的。

    connectionStrings 配置节重名正常会报如下错误,而不是“ConnectionString 属性尚未初始化。”这次确实很怪异。

    7402

    这次情况很特殊,特别记录下来,免得有人发现这个问题时,走弯路去其他地方找问题。

    FireFox3的附加组件YSlow导致Cookie丢失

    最近我用FireFox3访问一些网站的时候,老是频繁的让我登录,也就是Cookie老是丢失,分析下去是我装的一个FireFox插件导致的。

    这个插件就是YSlow。

    我的FireFox的版本如下:

    9601

    所装的插件如下:

    9602