<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_朱博的技术园</title><subtitle type="text">关注基于.Net的Web解决方案，高性能数据库设计，高性能Web服务解决方案，关注移动开发</subtitle><id>http://feed.cnblogs.com/blog/u/33855/rss</id><updated>2011-12-16T03:22:59Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33855/rss"/><entry><id>http://www.cnblogs.com/zhubo/archive/2011/11/23/using_powershell_to_automate_building_for_different_channels.html</id><title type="text">用powershell脚本实现Andoird为不同市场编译、签名自动化，效率极大提高</title><summary type="text">前言我写Android 刚不久，发现一个Android应用是否有更多人用，不仅取决于应用本身，还取决于应用的推广，在中国，起码就有以下十个市场需要推广：360开放平台、爱米吧、谷歌电子市场、安智市场、应用汇、优亿市场、机锋、安卓市场、N多、安卓星空。为了衡量每个市场的效果，我使用了友盟的分发渠道分析接口，只需要为不同的市场在 AndroidManifest.xml 里定义不同的 meta-dataUMENG_CHANNEL 值，然后为各市场分发各自的apk即可。这时问题就来了，如果我的应用有更新，如果没有一个自动化的方法，我需要用eclipse手动export、签名…… ，光敲签名时的stor</summary><published>2011-11-23T11:44:00Z</published><updated>2011-11-23T11:44:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2011/11/23/using_powershell_to_automate_building_for_different_channels.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2011/11/23/using_powershell_to_automate_building_for_different_channels.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我写Android 刚不久，发现一个Android应用是否有更多人用，不仅取决于应用本身，还取决于应用的推广，在中国，起码就有以下十个市场需要推广：360开放平台、爱米吧、谷歌电子市场、安智市场、应用汇、优亿市场、机锋、安卓市场、N多、安卓星空。&lt;/p&gt;&#xD;
&lt;p&gt;为了衡量每个市场的效果，我使用了&lt;a href="http://www.umeng.com/doc/sdk_android.html#analysis" target="_blank"&gt;友盟的分发渠道分析接口&lt;/a&gt;，只需要为不同的市场在 AndroidManifest.xml 里定义不同的 meta-data&amp;nbsp;UMENG_CHANNEL 值，然后为各市场分发各自的apk即可。&lt;/p&gt;&#xD;
&lt;p&gt;这时问题就来了，如果我的应用有更新，如果没有一个自动化的方法，我需要用eclipse手动export、签名&amp;#8230;&amp;#8230; ，光敲签名时的storepass和keypass就够受的了，更不用说还得每次记得修改签名文件代表不同市场的后缀，比如MyApp_360.apk、MyApp_androidmarket.apk&amp;#8230;&amp;#8230;，非常容易出错，也很浪费时间。&lt;/p&gt;&#xD;
&lt;p&gt;于是我花了1天的时间，用powershell脚本将上面的操作自动化了，感觉很棒，和大家分享一下，希望能够帮到各位。&lt;/p&gt;&#xD;
&lt;p&gt;在阅读这篇文章之前，我假设您已经知道&lt;a href="http://developer.android.com/guide/publishing/app-signing.html" target="_blank"&gt;如何给Android 应用签名&lt;/a&gt;，了解&lt;a href="http://ant.apache.org/" target="_blank"&gt;apache ant&lt;/a&gt;，已经集成了&lt;a href="http://www.umeng.com/doc/sdk_android.html#analysis" target="_blank"&gt;友盟分发渠道分析接口&lt;/a&gt;，了解PowerShell。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;实现思路&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
     &lt;li&gt;用PowerShell实现一个方法：使用ant自动编译项目，在每次编译之前，修改 AndroidManifest.xml 中meta-data&amp;nbsp;UMENG_CHANNEL 的值为指定市场的标识。&lt;/li&gt;&#xD;
     &lt;li&gt;用字符串数组存储所有市场的标识，遍历该数组，遍历至每个元素时，都将该元素传入上面的方法，可实现针对不同的市场进行编译，编译完成后，再对编译好的应用签名即可。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;系统环境&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;Windows 7 Untimate&lt;/li&gt;&#xD;
     &lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u1-download-513651.html" target="_blank"&gt;JDK 7 Update1&lt;/a&gt;，假设路径为：&amp;nbsp;E:\Program Files\Java\jdk1.7.0_01&lt;/li&gt;&#xD;
     &lt;li&gt;&lt;a href="http://labs.renren.com/apache-mirror//ant/binaries/apache-ant-1.8.2-bin.zip" target="_blank"&gt;apache-ant-1.8.2&lt;/a&gt;，假设路径为：E:\Program Files\apache-ant-1.8.2&lt;/li&gt;&#xD;
     &lt;li&gt;&lt;a href="http://dl.google.com/android/android-sdk_r15-windows.zip" target="_blank"&gt;Android SDK&lt;/a&gt;，假设路径为：E:\Program Files\Android\android-sdk&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;用ant自动编译项目&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;假设Android项目路径为：D:\workspace\MyApp&lt;/li&gt;&#xD;
     &lt;li&gt;检查是否存在文件D:\workspace\MyApp\build.xml，这是使用ant编译项目时需要用到的配置文件&lt;/li&gt;&#xD;
     &lt;ul&gt;&#xD;
         &lt;li&gt;若不存在，在command窗口中执行：&lt;/li&gt;&#xD;
         &lt;ul&gt;&#xD;
             &lt;li&gt;CD&amp;nbsp;D:\workspace\MyApp&lt;/li&gt;&#xD;
             &lt;li&gt;D:&lt;/li&gt;&#xD;
             &lt;li&gt;"E:\Program Files\Android\android-sdk\tools\android" update project --path .&lt;/li&gt;&#xD;
         &lt;/ul&gt;&#xD;
         &lt;li&gt;若存在或通过上面的步骤生成了build.xml，修改文件中&amp;lt;project name="xxx" default="help"&amp;gt; xxx为&lt;span style="background-color: yellow; "&gt;自己项目的名称（项目名称如何改，参见文末的更新）&lt;/span&gt;，如：&amp;lt;project name="MyApp" default="help"&amp;gt;&lt;/li&gt;&#xD;
     &lt;/ul&gt;&#xD;
     &lt;li&gt;新建批处理文件D:\workspace\MyApp\build.bat，该文件使用ant对android项目自动编译，文件内容如下，请根据自己项目、系统的实际情况修改路径&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;SET&amp;nbsp;JAVA_HOME=E:\Program&amp;nbsp;Files\Java\jdk1.7.0_01&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;cd&amp;nbsp;D:\workspace\MyApp&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;D:&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;E:\Program&amp;nbsp;Files\apache-ant-1.8.2\bin\ant&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;release&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;如果系统环境没问题，build.bat执行后，在目录&amp;nbsp;D:\workspace\MyApp\bin 中应该可以看到编译好的MyApp-release-unsigned.apk。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: yellow; "&gt;注意：&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;如果项目中有引用的第三方jar包类库，要把这些类库放到项目根目录的 "libs" 目录下，否则，ant在编译的时候会出错。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;流程详解&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、定义参数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;param&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$ProjectName&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;$ProjectRootDirectory&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;$KeystorePath&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;$StorePass&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;$KeyPass&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;$Alias&lt;/span&gt;)&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$channels&lt;/span&gt;&amp;nbsp;=&amp;nbsp;@(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;360&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;aimi8&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;anzhi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;appchina&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;eoemarket&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;gfan&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hiapk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;nduoa&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;starandroid&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$defaultChannel&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;androidmarket&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$jdkPath&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;E:\Program&amp;nbsp;Files\Java\jdk1.7.0_01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$androidSDKPath&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;E:\Program Files\Android\android-sdk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$signedPath&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$ProjectRootDirectory\bin\signed&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$zipalignedPath&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$ProjectRootDirectory\bin\zipaligned&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;$ProjectName：项目名称，如：MyApp&lt;/li&gt;&#xD;
     &lt;li&gt;$ProjectRootDirectory：项目路径，如：D:\workspace\MyApp&lt;/li&gt;&#xD;
     &lt;li&gt;$KeystorePath：keystore路径，如：D:\workspace\MyApp\keystore&lt;/li&gt;&#xD;
     &lt;li&gt;$StorePass：store password，如：123456&lt;/li&gt;&#xD;
     &lt;li&gt;$KeyPass: key password，如：123456&lt;/li&gt;&#xD;
     &lt;li&gt;$Alias: keystore alias，如：MyApp&lt;/li&gt;&#xD;
     &lt;li&gt;$channels：定义了除AndroidManifest.xml中定义的默认市场标识外，剩下的所有市场标识&lt;/li&gt;&#xD;
     &lt;li&gt;$defaultChannel：即上面提到的默认市场标识，&lt;span style="color: #ff0000; background-color: yellow; "&gt;为什么要有默认市场标识&lt;/span&gt;的原因是，我们的AndroidManifest.xml文件不会常改，我们也不希望每次自动编译、签名完毕后，看到这个文件处于被修改的状态，所以我设计在最后才给默认的市场编译，这样的话，前面修改了n次的AndroidManifest.xml在最后回到未修改的状态&lt;/li&gt;&#xD;
     &lt;li&gt;$signedPath：即签好名的apk文件存储路径&lt;/li&gt;&#xD;
     &lt;li&gt;$zipalignedPath：即zipalign优化后文件存储路径，&lt;span style="background-color: yellow; "&gt;最后要发布的也是这个目录下的apk文件&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、修改 AndroidManifest.xml&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$manifestPath&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$ProjectRootDirectory\AndroidManifest.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$FILE&lt;/span&gt;&amp;nbsp;=&amp;nbsp;[System.IO.File]::ReadAllText(&lt;span style="color: #800080;"&gt;$manifestPath&lt;/span&gt;)&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;$FILE&lt;/span&gt;&amp;nbsp;=&amp;nbsp;[REGEX]::replace(&lt;span style="color: #800080;"&gt;$FILE&lt;/span&gt;,&amp;nbsp;'&amp;lt;meta-data\r?\n?\s+android:name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UMENG_CHANNEL&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;\r?\n?\s+(.*?)&amp;gt;',&amp;nbsp;'&amp;lt;meta-data&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UMENG_CHANNEL&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:value=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&amp;nbsp;+&amp;nbsp;$ChannelName&amp;nbsp;+&amp;nbsp;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;/&amp;gt;',&amp;nbsp;[Text.regularexpressions.regexoptions]::SingleLine)&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;6&lt;/span&gt;&amp;nbsp;[System.IO.File]::WriteAllText(&lt;span style="color: #800080;"&gt;$manifestPath&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;$FILE&lt;/span&gt;)&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;$ChannelName 代表每次遍历传入的市场标识，如：anzhi&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、调用 build.bat 编译 项目&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$ProjectRootDirectory\build&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、为编译好的应用签名&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&#xD;
&lt;span style="color: #008080; "&gt;1&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&lt;span style="color: #800000; "&gt;$jdkPath\bin\jarsigner&lt;/span&gt;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&amp;nbsp;-keystore&amp;nbsp;&lt;span style="color: #800080; "&gt;$KeystorePath&lt;/span&gt;&amp;nbsp;-storepass&amp;nbsp;&lt;span style="color: #800080; "&gt;$StorePass&lt;/span&gt;&amp;nbsp;-keypass&amp;nbsp;&lt;span style="color: #800080; "&gt;$KeyPass&lt;/span&gt;&amp;nbsp;-signedjar&amp;nbsp;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&lt;span style="color: #800000; "&gt;$signedPath\$ProjectName-$ChannelName.apk&lt;/span&gt;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&amp;nbsp;-verbose&amp;nbsp;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&lt;span style="color: #800000; "&gt;$ProjectRootDirectory\bin\$ProjectName-release-unsigned.apk&lt;/span&gt;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080; "&gt;$Alias&lt;/span&gt;&amp;nbsp;-digestalg&amp;nbsp;SHA1&amp;nbsp;-sigalg&amp;nbsp;MD5withRSA&amp;nbsp;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;注意最后2个参数：-digestalg SHA1 -sigalg MD5withRSA，如果你当前的环境是 JDK 7，一定要加上这两个参数，否则签名完毕的应用在安装时会有错误：Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] &lt;sup&gt;[1]&lt;/sup&gt;&lt;/li&gt;&#xD;
     &lt;li&gt;签好名的应用在&amp;nbsp;$signedPath&amp;nbsp;定义的路径中&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5、zipalign优化签好名的apk&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(Test-Path&amp;nbsp;-path&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$zipalignedPath\$ProjectName-$ChannelName.apk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Remove-Item&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$zipalignedPath\$ProjectName-$ChannelName.apk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;5&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$androidSDKPath\tools\zipalign&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;-v&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$signedPath\$ProjectName-$ChannelName.apk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$zipalignedPath\$ProjectName-$ChannelName.apk&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6、批处理调用powershell脚本，实现自动化编译、签名&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;假设powershell脚本存储于：D:\workspace\build4DifferentChannels.ps1，新建批处理脚本：D:\workspace\build4DifferentChannels_MyApp.bat：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080; "&gt;1&lt;/span&gt;&amp;nbsp;powershell D:\workspace\build4DifferentChannels.ps1 MyApp "D:\workspace\MyApp" "D:\workspace\MyApp\keystore" 123456 123456 myapp&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;用批处理调用powershell脚本build4DifferentChannels.ps1，并传入了之前定义的各个参数。以后需要发布应用时，就执行该批处理，自动为各个市场编译、签名应用即可，十分方便。&lt;/p&gt;&#xD;
&lt;p&gt;如果执行改脚本遇到错误：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000; background-color: #ffff99; "&gt;&amp;nbsp; &amp;nbsp; File D:\workspace\build4DifferentChannels.ps1 cannot be loaded because the execution of scripts is disabled on this system.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;就用管理员权限打开command窗口，执行下面的命令：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;powershell&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080; "&gt;2&lt;/span&gt;&amp;nbsp;Set-ExecutionPolicy&amp;nbsp;RemoteSigned&amp;nbsp; &lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;7、完整脚本下载&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/zhubo/build4DifferentChannels_20111209.zip"&gt;build4DifferentChannels_20111209.zip&lt;/a&gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[1]：&lt;span style="font-family: Tahoma; font-size: medium; line-height: normal; "&gt;&lt;a href="http://code.google.com/p/android/issues/detail?id=19567" target="_blank"&gt;http://code.google.com/p/android/issues/detail?id=19567&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;[2]：&lt;a href="http://www.androidengineer.com/2010/06/using-ant-to-automate-building-android.html" target="_blank"&gt;http://www.androidengineer.com/2010/06/using-ant-to-automate-building-android.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;广告&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给最近开发的两个应用打一下广告&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;猫语：&amp;#8220;人言&amp;#8221;变&amp;#8220;猫语&amp;#8221;，让猫咪更懂你；摇一摇，52种猫语随时放；猫笑话、猫趣图、猫文每天更新；逗猫、养猫、了解猫之必备应用&lt;br /&gt;&#xD;
     应用汇：&lt;a href="http://www.appchina.com/soft_detail_179476_0_10.html"&gt;http://www.appchina.com/soft_detail_179476_0_10.html&lt;/a&gt;&lt;br /&gt;&#xD;
     电子市场：&lt;a href="https://market.android.com/details?id=com.shinboz.android.human2cat"&gt;https://market.android.com/details?id=com.shinboz.android.human2cat&lt;/a&gt;&lt;/li&gt;&#xD;
     &lt;li&gt;价值观察 ：在这里读懂新闻&lt;br /&gt;&#xD;
     应用汇：&lt;a href="http://www.appchina.com/soft_detail_179481_0_10.html"&gt;http://www.appchina.com/soft_detail_179481_0_10.html&lt;/a&gt;&lt;br /&gt;&#xD;
     电子市场：&lt;a href="https://market.android.com/details?id=com.chinavalue.focus"&gt;https://market.android.com/details?id=com.chinavalue.focus&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更新&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;2011-11-28&lt;br /&gt;&#xD;
     谢谢wanx的提醒：&amp;lt;project name="xxx" default="help"&amp;gt;，这里的xxx不是随便写，而是和使用eclipse手动编译出来的apk文件名一致，如果eclipse编译的文件名是Abc.apk，那么build.xml这段就应该改为：&amp;lt;project name="Abc" default="help"&amp;gt;&amp;nbsp;&#xD;
     &lt;/li&gt;&#xD;
     &lt;li&gt;2011-12-02&lt;br /&gt;&#xD;
     再次谢谢wanx的提醒：如果项目中有引用的第三方jar包类库，要把这些类库放到项目根目录的 "libs" 目录下，否则，ant在编译的时候会出错。&lt;/li&gt;&#xD;
     &lt;li&gt;2011-12-07&lt;br /&gt;&#xD;
     加入zipalign优化脚本&lt;/li&gt;&lt;li&gt;2011-12-09&lt;br /&gt;在zipalign之前，先删除旧有apk文件&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/zhubo/aggbug/2260628.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhubo/archive/2011/11/23/using_powershell_to_automate_building_for_different_channels.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2011/07/06/JSON_And_ProtocolBuffers.html</id><title type="text">JSON与Protocol Buffers</title><summary type="text">JSON与Protocol Buffers同为序列化数据的存储格式。性能比较，视平台、语言、数据结构复杂程度的不同，Protocol Buffers与JSON相比，性能可能会从慢15倍到快5倍。值得指出的是，在Android系统中，Protocol Buffers反序列化数据会比JSON快大约3倍。</summary><published>2011-07-06T01:44:00Z</published><updated>2011-07-06T01:44:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2011/07/06/JSON_And_ProtocolBuffers.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2011/07/06/JSON_And_ProtocolBuffers.html"/><content type="html">&lt;p&gt;&lt;a target="_blank" href="http://json.org/"&gt;JSON&lt;/a&gt;与&lt;a target="_blank" href="http://code.google.com/p/protobuf/"&gt;Protocol Buffers&lt;/a&gt;同为序列化数据的存储格式。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;性能比较，视平台、语言、数据结构复杂程度的不同，Protocol Buffers与JSON相比，性能可能会从慢15倍到快5倍。值得指出的是，在Android系统中，Protocol Buffers反序列化数据会比JSON快大约3倍&lt;sup&gt;[1]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;JSON数据格式有一个缺点：冗余太大，如：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[{&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Name&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Jane&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gender&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&amp;nbsp;{&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Name&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Waith&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gender&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;每一条数据都要包括"Name"与"Gender"，据统计，JSON格式的数据至少有1/5是无效的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;与JSON不同，Protocol Buffers用二进制编码数据，而且数据的格式是事先通过一个后缀名为.proto的文件指定的，如：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;message&amp;nbsp;Person&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;required&amp;nbsp;string&amp;nbsp;Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;optional&amp;nbsp;int32&amp;nbsp;Gender&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这样Protocol Buffers的数据会比JSON小不少，在一些场景，比如内存里要存储更多的数据时，用Protocol Buffers会更合适&lt;sup&gt;[2]&lt;/sup&gt;。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[1], &lt;a target="_blank" href="http://www.4feets.com/2009/08/serializing-data-json-vs-protocol-buffers/"&gt;Serializing Data - JSON vs. Protocol Buffers &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;[2], &lt;a target="_blank" href="http://www.infoq.com/cn/presentations/ywh-build-high-performance-weibo"&gt;构建高性能的微博系统&amp;#8212;&amp;#8212;再谈新浪微博架构&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhubo/aggbug/2098898.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhubo/archive/2011/07/06/JSON_And_ProtocolBuffers.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2010/04/16/Visual_Studio_2008_Skills.html</id><title type="text">Visual Studio 2008提高工作效率的小技巧</title><summary type="text">时间往往在不经意间就浪费掉了，比如我们在寻找上一个光标位置的时候，好好学习并利用下面的技巧，会提高工作效率，减少不必要浪费的时间，提高时间利用率，让生活更加美好。 </summary><published>2010-04-16T09:58:00Z</published><updated>2010-04-16T09:58:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2010/04/16/Visual_Studio_2008_Skills.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2010/04/16/Visual_Studio_2008_Skills.html"/><content type="html">&lt;p style="font-family: '楷体_GB2312';"&gt;时间往往在不经意间就浪费掉了，比如我们在寻找上一个光标位置的时候，好好学习并利用下面的技巧，会提高工作效率，减少不必要浪费的时间，提高时间利用率，让生活更加美好。&#xD;
&lt;/p&gt;&#xD;
&lt;span style="border-collapse: separate; color: #000000; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="font-family: Verdana; font-size: 13px;"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1，回到上一个光标位置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;使用组合键&amp;nbsp;&lt;strong&gt;Ctrl&lt;/strong&gt;&amp;nbsp;+&amp;nbsp;&lt;strong&gt;-&lt;/strong&gt;&amp;nbsp;键表示Navigate BackWard, 使用组合键&amp;nbsp;&lt;strong&gt;Ctrl&amp;nbsp;&lt;/strong&gt;+&lt;strong&gt;&amp;nbsp;Shift&amp;nbsp;&lt;/strong&gt;+&lt;strong&gt;&amp;nbsp;-&lt;/strong&gt;&amp;nbsp;键表示 Forward.&amp;nbsp;&#xD;
&lt;p&gt;&lt;strong&gt;2，删除多余的using指令，并且排序&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;当我们新一个类的时候，Visual Studio 会将常用的命名空间using在类的头部。但是在我们写完一个类的时候，有些using是多余的，删除多余的using，再排一下序，可以使代码看起来更清晰。Visual Studio 2008 已经为我们做好了这一切。在代码编辑区点击右键，可以看到"组织 using"菜单，这就是我们需要的了。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3，复制或删除一行代码时，不用先选择它&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;如果你想复制一行代码，你只需要简单的按CTRL+c拷贝，然后按CTRL+v粘贴这行就可以了，而不需要选择整行的代码。如果你想删除一行代码，只需按CTRL+x就可以了。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4，取代其他编辑器里Ctrl+F的方便的增量查找&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;用过ultraedit会对那两个上下搜索按钮印象深刻，Visual studio里有更厉害的。&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;操作方法：&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;1）.按Ctrl+I键；&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;2）.键入你要搜索的文本。注意：这时你会看到光标跳至第一个匹配的地方，匹配的文本高亮显示；&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;3）.再次按下Ctrl+I键，光标将跳至下一个匹配的文本；&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;4）.按Ctrl+Shift+I可向后搜索；&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;5）.要停止搜索，按ESC键；&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5，如何在编辑器中进行框式选择&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;操作方法：&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;你是否知道VS提供了两种不同的选择模型：流式和框式吗？&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;大家应该都熟悉流式选择模型了，只要使用Shift+方向键即可（或者使用鼠标进行选择）。&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;框式选择则允许你同时对航和列进行选择。只要同时按下Shift+Alt+方向键，你就了解它的不同之处了。剪切，拷贝，粘贴，这些功能都能使用，只是需要记住从哪里开始选择的。啊，让我想起了那段做测试时的时光。&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;备注：也可以使用鼠标+Alt键完成该操作。前两天我还遇到该提示的一个有意思的用法。有时候我们拷贝网上的文章中的代码时会将行号一起拷进来，使用框式选择可以只选择行号部分，将其删除。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6，如何使用快捷键在当前代码行的上面或下面插入一行（推荐，很实用）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;按下Ctrl+Enter会在上面插入一个空行，Ctrl+Shift+Enter则会在下面插入一个空行。光标会移至新行的开始处。&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;备注：这是我非常喜欢的一个快捷键，如果不用这个，则需要使用Home或End，然后使用方向键，再使用回车才能达到上面的效果。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;7，安装之后，将您的IDE设置恢复到默认设置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;如果IDE的设置在任何先前发布的版本中做了更改，它们都应该被恢复到默认设置。可以在Visual Studio 2008中点击菜单 Tools &amp;gt; Import and Export Settings... &amp;gt; Reset all settings，此外还有一些Import和Export的选项可用。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;8，通过按"tab"两次插入代码块&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;操作步骤：&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;在编辑的中输入代码片段，比如"for"&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;在这个状态下，按两次"tab"键，将会插入代码块，如下图所示&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;此时你可以把第一"i"改成"j"，然后按Tab键，则所有的变量都变成了"j"。&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;备注：这样既快又不容易语法出错。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;9，使用Ctrl+Tab打开IDE的导航，获得鸟瞰视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;同时在Visual Studio中导航到所有打开的文件和工具窗体&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;按"Ctrl+Tab"键，打开IDE导航窗口，按住Ctrl键，同时用方向键或鼠标选中一个文件或工具窗体来激活。&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;备注：这时最好不要松开"Ctrl+Tab"，按方向键看鸟瞰图，全部松开后就定位到需要的文件或工具窗体，说实在的，这窗口挺酷的。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;10，查找匹配的标记&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;某些标识总是成对出现。例如，"{"标识必须用对应的"}"标识关闭。虽然你点击一个{ 和它匹配的}就会高亮显示，但是如果代码过长的话就不好找了，同样，编译器指示符"#region"必须有对应的"#endregion"指示符。当导航你的代码时，你有时需要查找对应的标识。通过按Ctrl-]你可以这样做。这个快捷键只有当光标在这些标识符的任何一个的下面时才起作用，它会立即跳转到对应的标识符而不管它是开的或闭的标识。&lt;/div&gt;&#xD;
&lt;div style="margin-top: 0px; margin-bottom: 0px; direction: inherit;"&gt;如果你想显亮两个匹配的标识之间的所有代码时，按Ctrl-Shift-]显亮整个块，并移动光标到开的标识处。这个快捷键只有当光标在任意的标识的下面时才起作用（如光标在区域内它就不会起作用了）。&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/zhubo/aggbug/1713792.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhubo/archive/2010/04/16/Visual_Studio_2008_Skills.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2010/03/05/BatScript_Get_Date_Before_Today.html</id><title type="text">转：批处理获得任意天前的日期</title><summary type="text">批处理获得任意天前的日期</summary><published>2010-03-05T09:19:00Z</published><updated>2010-03-05T09:19:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2010/03/05/BatScript_Get_Date_Before_Today.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2010/03/05/BatScript_Get_Date_Before_Today.html"/><content type="html">&lt;p&gt;该批处理可以考虑到例如4月1日前一天是3月31日，而不是4月0日的问题，值得参考。&lt;/p&gt;&amp;nbsp;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&#xD;
&lt;br/ /&gt;&#xD;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;&#xD;
http://www.CodeHighlighter.com/&lt;br/ /&gt;&#xD;
&lt;br/ /&gt;&#xD;
--&gt;&lt;span style="color: #000000;"&gt;@&lt;/span&gt;&lt;span style="color: #000000;"&gt;echo&amp;nbsp;off&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;::&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;作者：&amp;nbsp;namejm&amp;nbsp;&amp;nbsp;出自：cn&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;dos&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;::&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;求N天前的日期&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;::&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;日期可以带星期，但是，必须以年月日的顺序排列&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;::&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;年份必须是四位，否则会出错&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;@&lt;/span&gt;&lt;span style="color: #000000;"&gt;echo&amp;nbsp;off&lt;br /&gt;&#xD;
:Main&lt;br /&gt;&#xD;
cls&lt;br /&gt;&#xD;
set&amp;nbsp;day&lt;/span&gt;&lt;span style="color: #000000;"&gt;=%&lt;/span&gt;&lt;span style="color: #000000;"&gt;date&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
set&amp;nbsp;days&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
echo.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;echo.&lt;br /&gt;&#xD;
echo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当前日期是：&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;day&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
echo.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;p&amp;nbsp;input&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;请指定要追溯的天数：&lt;br /&gt;&#xD;
setlocal&amp;nbsp;enabledelayedexpansion&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;::&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;提取日期&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;tokens=1-3&amp;nbsp;delims=-/.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%day%&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;sy&lt;/span&gt;&lt;span style="color: #000000;"&gt;=%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;i,&amp;nbsp;sm&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;sd&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;k&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
)&lt;br /&gt;&#xD;
set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;sd&lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt;input&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;sd&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;leq&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;call&amp;nbsp;:count&lt;br /&gt;&#xD;
cls&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;echo.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;echo.&lt;br /&gt;&#xD;
echo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当前日期是：&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;day&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
echo.&lt;br /&gt;&#xD;
set&amp;nbsp;sm&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;sm&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
set&amp;nbsp;sd&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;sd&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
echo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;input&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;天前的日期是：&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;sy&lt;/span&gt;&lt;span style="color: #000000;"&gt;%-%&lt;/span&gt;&lt;span style="color: #000000;"&gt;sm:~&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;%-%&lt;/span&gt;&lt;span style="color: #000000;"&gt;sd:~&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
pause&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;nul&lt;br /&gt;&#xD;
goto&amp;nbsp;Main&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
:count&lt;br /&gt;&#xD;
set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;sm&lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;sm&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;equ&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;sm&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;sy&lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
call&amp;nbsp;:days&lt;br /&gt;&#xD;
set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;sd&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;days&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;sd&lt;/span&gt;&lt;span style="color: #000000;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;leq&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;goto&amp;nbsp;count&lt;br /&gt;&#xD;
goto&amp;nbsp;:eof&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
:days&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;::&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;获取指定月份的总天数&lt;br /&gt;&#xD;
set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;leap&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;^!(sy&amp;nbsp;%%&amp;nbsp;4)&amp;nbsp;&amp;amp;&amp;nbsp;^!(^!(sy&amp;nbsp;%%&amp;nbsp;100))&amp;nbsp;|&amp;nbsp;^!(sy&amp;nbsp;%%&amp;nbsp;400)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
set&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;max&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;28&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;leap&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;tokens=%sm%&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;31&amp;nbsp;%max%&amp;nbsp;31&amp;nbsp;30&amp;nbsp;31&amp;nbsp;30&amp;nbsp;31&amp;nbsp;31&amp;nbsp;30&amp;nbsp;31&amp;nbsp;30&amp;nbsp;31&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;set&amp;nbsp;days&lt;/span&gt;&lt;span style="color: #000000;"&gt;=%%&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&lt;br /&gt;&#xD;
goto&amp;nbsp;:eof&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文链接：&lt;a target="_blank" href="http://bbs.verybat.org/viewthread.php?tid=11441"&gt;http://bbs.verybat.org/viewthread.php?tid=11441&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhubo/aggbug/1679304.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhubo/archive/2010/03/05/BatScript_Get_Date_Before_Today.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2010/03/02/how_to_truncate_and_shrink_transaction_log_in_SQLSERVER2008.html</id><title type="text">SQL Server 2008 事务日志物理文件尺寸无法减小的解决办法（含日志收缩(shrink)技巧）</title><summary type="text">SQLServer2008中如何收缩日志文件，在邀月工作室的日志《SQL2008如何压缩日志(log)文件？》已经详细描述，这里不再赘述。本文的重点是与大家分享日志截断、收缩后，物理文件的尺寸依然没有减小到期望尺寸的问题。</summary><published>2010-03-02T10:01:00Z</published><updated>2010-03-02T10:01:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2010/03/02/how_to_truncate_and_shrink_transaction_log_in_SQLSERVER2008.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2010/03/02/how_to_truncate_and_shrink_transaction_log_in_SQLSERVER2008.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SQLServer2008中如何收缩日志文件，在&lt;a target="_blank" href="http://www.cnblogs.com/downmoon/"&gt;邀月工作室&lt;/a&gt;的日志已经详细描述（&lt;a target="_blank" href="http://www.cnblogs.com/downmoon/archive/2009/12/13/1623004.html"&gt;点击查看&lt;/a&gt;），这里不再赘述。本文的重点是与大家分享日志截断、收缩后，&lt;strong&gt;物理文件的尺寸依然没有减小到期望尺寸&lt;/strong&gt;的问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解决方案 &lt;br /&gt;&#xD;
&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我的一个数据库，数据文件10+G ，事务日志达20+G，而且使用常规的截断、收缩方法均无法减小日志物理文件的尺寸，经过一番寻找，终于找到了解决方法。&lt;br /&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;查看日志信息&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在查询分析器中执行如下代码来查看日志信息：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&#xD;
&lt;br/ /&gt;&#xD;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;&#xD;
http://www.CodeHighlighter.com/&lt;br/ /&gt;&#xD;
&lt;br/ /&gt;&#xD;
--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;DBCC&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;LOGINFO(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;数据库名称&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;我们看到status=0的日志，代表已经备份到磁盘的日志文件；而status=2的日志还没有备份。当我们收缩日志文件时，收缩掉的空间其实就是status=0的空间，如果日志物理文件无法减小，这里一定能看到非常多status=2的记录。接下来分析为什么会有这么多status=2的记录&lt;/p&gt;&lt;p&gt;&lt;strong&gt;查看日志截断延迟原因 &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;活跃(active)的日志无法通过收缩来截断，有各种原因会使日志截断延迟，具体表现就是事务日志的物理文件无法通过截断、收缩来减小，通过下面的代码可以看到实例上每个数据库的日志截断延迟原因：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&#xD;
&lt;br/ /&gt;&#xD;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;&#xD;
http://www.CodeHighlighter.com/&lt;br/ /&gt;&#xD;
&lt;br/ /&gt;&#xD;
--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;USE&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;master&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;database_id&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;log_reuse_wait&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;log_reuse_wait_desc&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;sys&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;databases&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;各种原因及解释如下：&lt;/p&gt;&#xD;
&lt;table bgcolor="#333333" cellpadding="0" cellspacing="1"&gt;&#xD;
  &lt;tbody&gt;&lt;tr&gt;&#xD;
    &lt;th bgcolor="#ffffff"&gt; log_reuse_wait_desc 值 &lt;/th&gt;&#xD;
    &lt;th bgcolor="#ffffff"&gt; 说明 &lt;/th&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;NOTHING&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;当前有一个或多个可重复使用的虚拟日志文件。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;CHECKPOINT&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;自上次日志截断之后，尚未出现检查点，或者日志头部尚未跨一个虚拟日志文件移动（所有恢复模式）。&lt;/p&gt;&#xD;
        &lt;p&gt;这是日志截断延迟的常见原因。有关详细信息，请参阅&lt;a target="_blank" id="ctl00_MTCS_main_ctl06" href="http://msdn.microsoft.com/zh-cn/library/ms189573.aspx" onclick="javascript:Track('ctl00_MTCS_main_ctl00|ctl00_MTCS_main_ctl06',this);"&gt;检查点和日志的活动部分&lt;/a&gt;。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;LOG_BACKUP&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;需要日志备份，以将日志的头部前移（仅适用于完整恢复模式或大容量日志恢复模式）。&lt;/p&gt;&#xD;
        &lt;div&gt;&#xD;
          &lt;div&gt;&#xD;
            &lt;div&gt;&#xD;
              &lt;!--src=[../local/note.gif]--&gt;&#xD;
              &lt;img alt="ms345414.note(zh-cn,SQL.100).gif" src="http://i.msdn.microsoft.com/ms345414.note%28zh-cn,SQL.100%29.gif" /&gt;注意：&lt;/div&gt;&#xD;
            &lt;div&gt; 日志备份不会妨碍截断。&#xD;
                &lt;!----&gt;&#xD;
            &lt;/div&gt;&#xD;
          &lt;/div&gt;&#xD;
          &lt;p&gt;&lt;!----&gt;&#xD;
          &lt;/p&gt;&#xD;
        &lt;/div&gt;&#xD;
      &lt;p&gt;完成日志备份后，日志的头部将前移，一些日志空间可能变为可重复使用。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;ACTIVE_BACKUP_OR_RESTORE&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;数据备份或还原正在进行（所有恢复模式）。&lt;/p&gt;&#xD;
        &lt;p&gt;数据备份与活动事务的运行方式相同。数据备份在运行时，将阻止截断。有关详细信息，请参阅本主题后面的&amp;#8220;数据备份操作与还原操作&amp;#8221;部分。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;ACTIVE_TRANSACTION&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;事务处于活动状态（所有恢复模式）。&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt; 一个长时间运行的事务可能存在于日志备份的开头。在这种情况下，可能需要进行另一个日志备份才能释放空间。有关详细信息，请参阅本主题后面的&amp;#8220;长时间运行的活动事务&amp;#8221;部分。&lt;br /&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt; 事务被延迟（仅适用于 SQL Server 2005 Enterprise Edition 及更高版本）。&amp;#8220;延迟的事务&lt;em&gt;&#xD;
            &lt;!----&gt;&#xD;
            &lt;/em&gt;&amp;#8221;是有效的活动事务，因为某些资源不可用，其回滚受阻。有关导致事务延迟的原因以及如何使它们摆脱延迟状态的信息，请参阅&lt;a target="_blank" id="ctl00_MTCS_main_ctl09" href="http://msdn.microsoft.com/zh-cn/library/ms188290.aspx" onclick="javascript:Track('ctl00_MTCS_main_ctl00|ctl00_MTCS_main_ctl09',this);"&gt;延迟的事务&lt;/a&gt;。 &lt;br /&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;DATABASE_MIRRORING&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;数据库镜像暂停，或者在高性能模式下，镜像数据库明显滞后于主体数据库（仅限于完整恢复模式）。&lt;/p&gt;&#xD;
        &lt;p&gt;有关详细信息，请参阅本主题后面的&amp;#8220;数据库镜像与事务日志&amp;#8221;部分。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;REPLICATION&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;在事务复制过程中，与发布相关的事务仍未传递到分发数据库（仅限于完整恢复模式）。&lt;/p&gt;&#xD;
        &lt;p&gt;有关详细信息，请参阅本主题后面的&amp;#8220;事务复制与事务日志&amp;#8221;部分。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;DATABASE_SNAPSHOT_CREATION&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;正在创建数据库快照（所有恢复模式）。&lt;/p&gt;&#xD;
        &lt;p&gt;这是日志截断延迟的常见原因，通常也是主要原因。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
  &lt;tr&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;LOG_SCAN&lt;/p&gt;&lt;/td&gt;&#xD;
    &lt;td bgcolor="#ffffff"&gt;&lt;p&gt;正在进行日志扫描（所有恢复模式）。&lt;/p&gt;&#xD;
        &lt;p&gt;这是日志截断延迟的常见原因，通常也是主要原因。&lt;/p&gt;&lt;/td&gt;&#xD;
  &lt;/tr&gt;&#xD;
&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;针对延迟日志截断原因的部分解决方案&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;LOG_BACKUP &lt;br /&gt;备份日志后再执行收缩即可&lt;br /&gt;&lt;/li&gt;&lt;li&gt;REPLICATION&lt;br /&gt;这是我遇到的情况，但我根本没有启用过REPLICATION，据查，这好像是SQLSERVER2008的一个BUG，解决方法是给标有&amp;#8220;REPLICATION&amp;#8221;的数据库任意一个表创建数据库事务复制（TRANSACTION REPLICATION），然后再删除，执行数据库与日志备份后，就可以收缩了。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;小技巧&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一般收缩日志的代码中都要求指定日志的文件名称，下面的代码则可以自动获取日志文件名称：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;USE&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;数据库名称&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DECLARE&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@LogFileLogicalName&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sysname&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@LogFileLogicalName&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;Name &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; sys.database_files &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; Type&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;PRINT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@LogFileLogicalName&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DBCC&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;SHRINKFILE&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #008000;"&gt;@LogFileLogicalName&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考资料&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
     &lt;li&gt;&lt;a target="_blank" href="http://madhuottapalam.blogspot.com/2008/05/faq-how-to-truncate-and-shrink.html"&gt;FAQ : How to truncate and shrink Transaction Log file in SQL Server&lt;/a&gt;&lt;/li&gt;&#xD;
     &lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms345414.aspx"&gt;可能延迟日志截断的因素&lt;/a&gt;&lt;/li&gt;&#xD;
     &lt;li&gt;&lt;a target="_blank" href="http://www.sqlservercentral.com/Forums/Topic695034-357-1.aspx"&gt;log_reuse_wait_desc = replication but there's no replication&lt;/a&gt;&lt;/li&gt;&#xD;
     &lt;li&gt;&lt;a target="_blank" href="http://sqlship.wordpress.com/2008/06/17/how-to-truncate-mirrored-database-log-file/"&gt;How to truncate Mirrored Database Log File&lt;/a&gt;&lt;/li&gt;&#xD;
     &lt;li&gt;&lt;a target="_blank" href="http://www.cnblogs.com/downmoon/archive/2009/12/13/1623004.html"&gt;SQL2008如何压缩日志(log)文件？&lt;/a&gt;&lt;br /&gt;&#xD;
     &lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/zhubo/aggbug/1676522.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhubo/archive/2010/03/02/how_to_truncate_and_shrink_transaction_log_in_SQLSERVER2008.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2009/11/20/Experience_Google_Chromium_OS_Pre_Beta_with_SUN_VirtualBox.html</id><title type="text">用虚拟机实际体验Google Chromium OS (Chrome OS) Pre-Built</title><summary type="text">今天凌晨（20091120）2:05左右，与Chrome技术交流QQ群（75448027）的朋友们一起聆听了远在美国的ChromeOS发布会，经过一番实验后，终于在自己PC的虚拟机中成功运行了ChromeOS。这篇文章旨在帮助所有对ChromeOS感兴趣的朋友一起实际体验一下ChromeOS，比看截图要更有趣一些。</summary><published>2009-11-20T08:14:00Z</published><updated>2009-11-20T08:14:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2009/11/20/Experience_Google_Chromium_OS_Pre_Beta_with_SUN_VirtualBox.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2009/11/20/Experience_Google_Chromium_OS_Pre_Beta_with_SUN_VirtualBox.html"/></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2009/09/14/top_5_web_trends_of_2009_structured_data.html</id><title type="text">2009年互联网5大趋势之一：结构化的数据</title><summary type="text">ReadWriteWeb最近推出了系列文章：“2009年互联网5大趋势”，第一个主要的趋势是结构化的数据，这个概念在以往有关语义网（Semantic Web）的一些演讲中，曾被引用过，但显而易见，到现在为止，结构化的数据比语义网的发展趋势更加明显。本文会分析结构化的数据在今年的发展，并且有三个产品供参考：OpenCalais, Google, Wolfram Alpha。</summary><published>2009-09-13T16:45:00Z</published><updated>2009-09-13T16:45:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2009/09/14/top_5_web_trends_of_2009_structured_data.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2009/09/14/top_5_web_trends_of_2009_structured_data.html"/></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2009/09/06/Thinking_SQL_Injection_Protection_and_Restoring.html</id><title type="text">由一个案例引出SQL注入防范（WebKnight），补救（数据修复）的思考</title><summary type="text">我写本文的目的，是和各位分享一下内容篡改式攻击的判断方法、SQL注入攻击的防范、以及被攻击后的补救（数据恢复）相关知识，如有谬误，期待您的指正。  * 如何在IIS6中安装WebKnight？  * 如何配置WebKnight  * 如何恢复被篡改的数据  * 如何找到有漏洞的程序</summary><published>2009-09-06T15:14:00Z</published><updated>2009-09-06T15:14:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2009/09/06/Thinking_SQL_Injection_Protection_and_Restoring.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2009/09/06/Thinking_SQL_Injection_Protection_and_Restoring.html"/></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2009/06/06/google_developer_day_2009.html</id><title type="text">参加Google Developer Day 2009归来</title><summary type="text">继去年参加了Google Developer Day 2008后，又迎来了Google Developer Day 2009，谢谢公司给我的时间，得以如愿参加这个技术盛宴。 技术的发展，往往迅雷不及掩耳。记得去年的GDD，谈到了云计算这个概念，经过了1年的发展，云计算的概念已经深入人心。去年谈到的App Engine、Google Maps API、Open Social、Android、iGoogle、Google Web Toolkit今年都有讲，这些技术都已经得到了更进一步的发展。值得注意的是，去年谈到的Gears，今年只字未提，这是因为今年的新技术：HTML5 其实已经可以替代Gears了。今年的重头戏是Google Wave，我知道最近在美国举行的2009 Google I/O大会上公布的Google Wave引起轰动，据说这是可以媲美Email发明的里程碑式的通讯工具。</summary><published>2009-06-05T18:46:00Z</published><updated>2009-06-05T18:46:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2009/06/06/google_developer_day_2009.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2009/06/06/google_developer_day_2009.html"/></entry><entry><id>http://www.cnblogs.com/zhubo/archive/2009/03/04/Problems_In_Generating_Static_Pages.html</id><title type="text">网站首页、频道首页静态化的问题</title><summary type="text">一个服务ServiceA每5分钟会对配置好的网站首页、频道首页源地址分别发起一次请求，然后把请求的数据写入一个Html文档，这个Html文档即静态化的页面。本来一直工作的很正常，但今天我使用了自定义的500错误页面后出问题了，首页静态页面不定时地呈现出了我自定义的500错误页面，经分析，发现原来没有使用自定义错误页面时，WebResponse的返回结果是一个错误，可以被捕捉到；但使用了自定义错误页面后，WebResponse就把这个错误页面当成了首页的内容了。</summary><published>2009-03-04T10:24:00Z</published><updated>2009-03-04T10:24:00Z</updated><author><name>朱博</name><uri>http://www.cnblogs.com/zhubo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhubo/archive/2009/03/04/Problems_In_Generating_Static_Pages.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhubo/archive/2009/03/04/Problems_In_Generating_Static_Pages.html"/></entry></feed>
