<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Zealic IN Action</title>
    <link>https://www.zealic.com/</link>
    <description>
      Recent content from Zealic IN Action | 
      
    </description>
    <generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 16 Oct 2019 01:56:53 +0000</lastBuildDate>
    
        <atom:link href="https://www.zealic.com/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <id>urn:uuid:77fdc14c-d8b6-413c-b4c2-4f2bc94de092</id>
      <title>Zerotier 2.0 的愿景图</title>
      <link>https://www.zealic.com/2019/10/zerotier2/</link>
      <pubDate>Wed, 16 Oct 2019 00:20:12 +0800</pubDate>
      
      <guid>https://www.zealic.com/2019/10/zerotier2/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;一直使用 Zerotier 作为我的 Homelab 内网穿透核心组网工具，配合各类安全上网工具，作为合格的社畜出差美滋滋。&lt;/p&gt;

&lt;p&gt;但是一直不满意 Zerotier 不支持代理，不支持 TCP，不支持各种隧道， Moon 功能不直观不好用，私有化部署困难。&lt;/p&gt;

&lt;p&gt;现在，Zerotier 团队&lt;a href=&#34;https://www.zerotier.com/zerotier-2-0-status/&#34;&gt;规划了 2.0 版本&lt;/a&gt;，上面的大多数功能都有了对应的支持计划，我非常激动。&lt;/p&gt;

&lt;p&gt;这里就大概讲述一下 ZT2 的 2.0 愿景。&lt;/p&gt;

&lt;h2 id=&#34;使用-go-重写非核心代码&#34;&gt;使用 Go 重写非核心代码&lt;/h2&gt;

&lt;p&gt;是的，没错，你看到了，ZT2 的配置和控制部分代码使用 Go 完全重写。&lt;/p&gt;

&lt;p&gt;在过去，Zerotier 使用21天才能精通的 C++：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://www.zealic.com/images/2019/cpp21days.jpg&#34; alt=&#34;C++ 21 Days&#34; /&gt;&lt;/p&gt;

&lt;p&gt;这导致了 Zerotier 的开发进度缓慢，而现在除核心网络 IO 路径代码以外，拥抱了新时代的 Go，相信会更快的开发。&lt;/p&gt;

&lt;h2 id=&#34;去中心化的-lf-根服务器&#34;&gt;去中心化的 lf 根服务器&lt;/h2&gt;

&lt;p&gt;Zerotier 团队实现了一个去中心化的 KV 数据库 &lt;a href=&#34;https://github.com/zerotier/lf&#34;&gt;lf&lt;/a&gt;，作为 ZT2 根服务器；由此可以容易实现私有化部署。&lt;/p&gt;

&lt;p&gt;同时 ZT2 摒弃了旧有的 Moon/Planet 设计，支持通过域名动态查找根服务器，也不再使用固定端口。&lt;/p&gt;

&lt;p&gt;对此我能预测到的是，当前云时代的复杂跨云及多云需求，Zerotier 可以很好的帮助我们解决这一问题。
以前我觉得也许某一个区块链的网络项目的私有链可以解决这个问题，现在也许 ZT2 是更好的方案。&lt;/p&gt;

&lt;h2 id=&#34;智能组播复制&#34;&gt;智能组播复制&lt;/h2&gt;

&lt;p&gt;ZT2 支持点对点及星型组播，这对于公有云及复杂本地网络非常有意义。&lt;/p&gt;

&lt;h2 id=&#34;其他改进&#34;&gt;其他改进&lt;/h2&gt;

&lt;p&gt;真正的多线程支持，全新的 UI 及 APP，支持新的加密算法及身份认证。&lt;/p&gt;

&lt;h2 id=&#34;思考&#34;&gt;思考&lt;/h2&gt;

&lt;p&gt;一直有一个跨多云混合云的的虚拟网络的想法，寻找过许多工具，Zerotier 是最接近我的想法的，也许当 ZT2 面世的时候，会是让人惊喜的一天。&lt;/p&gt;

&lt;p&gt;ZT2 的应用场景会有很多，物联网也是其中一种，甚至可以用于游戏服务器中实现跨区跨国。&lt;/p&gt;

&lt;p&gt;以至于稍加修改整合，也会是一个区块链的虚拟云计算网络，希望这种价值，能早日得见。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/network">network</category>
      
    </item>
    
    <item>
      <id>urn:uuid:b239fc76-c105-4dcb-9a70-1e8e4a42e6e1</id>
      <title>战略观</title>
      <link>https://www.zealic.com/2019/06/strategy-viewpoint/</link>
      <pubDate>Sun, 16 Jun 2019 22:20:12 +0800</pubDate>
      
      <guid>https://www.zealic.com/2019/06/strategy-viewpoint/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;几日前，我在飞机上静思，也算是难得的安静时刻，重新概览了下我曾经玩过 700 多个小时的一个游戏【异星工厂】，
心神汇聚，突然有所领悟。&lt;/p&gt;

&lt;p&gt;对战略、价值、产品、服务、交付、资源、渠道以及风险这些有了更高意义上的理解。&lt;/p&gt;

&lt;p&gt;把这些高度抽象的概念一一思考，很多原本困惑的问题就通了，也瞬间看清了自己，乃至未来的模糊方向。&lt;/p&gt;

&lt;p&gt;脑图整理如下（非完整版，如有意沟通，请与我联系）：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://www.zealic.com/images/2019/strategy-mindmap.png&#34; alt=&#34;Strategy MindMap&#34; /&gt;&lt;/p&gt;

&lt;p&gt;后面的鱼骨图表示了战略这个概念，可以用在产品设计、个人、家庭、公司、国家这个范畴；我这里统一称为实体。&lt;/p&gt;

&lt;h2 id=&#34;何为战略&#34;&gt;何为战略&lt;/h2&gt;

&lt;p&gt;我把战略分为八个要点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;资源&lt;br /&gt;
资源可以是一般等价物，也可以是无形的资源。&lt;/li&gt;
&lt;li&gt;渠道&lt;br /&gt;
渠道可以放大资源，或者扩展其他的战略要点。&lt;/li&gt;
&lt;li&gt;发展&lt;br /&gt;
发展是战略健康演进的重要体现，始终贯穿战略的生命周期，引领全局。&lt;/li&gt;
&lt;li&gt;危机&lt;br /&gt;
任何事物都会存在危机，在不同的战略阶段，危机所蕴含的威胁以及处理方式都有所不同。&lt;/li&gt;
&lt;li&gt;生产&lt;br /&gt;
生产即我们进行生产任务的人或物。&lt;/li&gt;
&lt;li&gt;管理&lt;br /&gt;
管理是流程，是标准，将一切混乱可控，也为其他战略要点服务。&lt;/li&gt;
&lt;li&gt;产品&lt;br /&gt;
产品是最终产出物，也代表了价值，是实体对外的最终提现。&lt;/li&gt;
&lt;li&gt;债务&lt;br /&gt;
任何事物都有两面性，必然产生债务，一切总会需要偿还。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;战略，对一个实体而言，应仅仅低于基本生理需求，同时战略也可以优化这些基本诉求。&lt;/p&gt;

&lt;p&gt;现在的很多人都是浑浑噩噩度日，过一天算一天，休息时间多沉醉在刷抖音玩手游等地方，缺少延迟满足能力，也是缺乏战略规划能力的体现。&lt;/p&gt;

&lt;p&gt;所以对人的一生来说，明白自己想要什么，并不断演进自身战略，会是更有意义的事情。&lt;/p&gt;

&lt;p&gt;理想的情况下，发展是一路顺风的，因此可以做宏大的规划，想要很多事情一步到位。
而现实情况是，无数的风险暗中窥伺，我们需要步步为营却又不能放弃合理适度的规划。&lt;/p&gt;

&lt;h2 id=&#34;资源&#34;&gt;资源&lt;/h2&gt;

&lt;p&gt;现代文明都需要一般等价物进行交换，资源也就是对此的最大体现，但并非金钱就是资源。&lt;/p&gt;

&lt;p&gt;它可以有形也可以无形，哪怕人情、出身、背景乃至种族都可以是资源。&lt;/p&gt;

&lt;p&gt;如何最大化的发现和利用资源，也是一门高深的学问。&lt;/p&gt;

&lt;h2 id=&#34;渠道&#34;&gt;渠道&lt;/h2&gt;

&lt;p&gt;渠道可以放大&lt;strong&gt;资源&lt;/strong&gt;，或者扩展其他的战略要点。&lt;/p&gt;

&lt;p&gt;渠道可以从&lt;strong&gt;资源&lt;/strong&gt;演化而来，甚至从&lt;strong&gt;危机&lt;/strong&gt;演化而来。&lt;/p&gt;

&lt;h2 id=&#34;发展&#34;&gt;发展&lt;/h2&gt;

&lt;p&gt;任何实体都需要成长，如何成长，如何健康成长，就是发展的要素。&lt;/p&gt;

&lt;p&gt;发展应始终贯穿战略的生命周期，引领全局，是战略的核心体现，&lt;/p&gt;

&lt;p&gt;发展应从基本生存出发，到明白实体自身的核心诉求，并以此为主延伸到方向与文化等等。&lt;/p&gt;

&lt;p&gt;停止发展就是慢性自杀。&lt;/p&gt;

&lt;h2 id=&#34;危机&#34;&gt;危机&lt;/h2&gt;

&lt;p&gt;危机从来都无处不在，内外均可，有意无意甚难猜，甚至是本身的方向问题。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;发展&lt;/strong&gt;和&lt;strong&gt;管理&lt;/strong&gt;的重要部分也包括危机处理和规避。&lt;/p&gt;

&lt;h2 id=&#34;生产&#34;&gt;生产&lt;/h2&gt;

&lt;p&gt;生产，也就是生产者，生产者们协同工作，最终产出产品或部件。&lt;/p&gt;

&lt;p&gt;所有生产都应该尽量标准化、自动化，以使其具备可复制性、规模扩展性。&lt;/p&gt;

&lt;p&gt;你可以独特，但必须在规则之内，你可以非常独特，那可以为你专门改变，但必须有足够的价值或产出。&lt;/p&gt;

&lt;h2 id=&#34;管理&#34;&gt;管理&lt;/h2&gt;

&lt;p&gt;管理是一门艺术，但是很多时候我们很难知道什么是管理水平的好坏。&lt;/p&gt;

&lt;p&gt;管理的目的是驱动方向，并规范生产，使其保持高效率和健康。&lt;/p&gt;

&lt;p&gt;大多数时候，可能体现为繁琐的流程。&lt;/p&gt;

&lt;h2 id=&#34;产品&#34;&gt;产品&lt;/h2&gt;

&lt;p&gt;产品和服务就是目标，是一个实体的最终产生物，同时也是价值的承载和提现。
但是我们需要把目标转换为价值，这个过程是动态的，需要&lt;strong&gt;生产&lt;/strong&gt;和&lt;strong&gt;管理&lt;/strong&gt;同时运作才能达成我们的目标。&lt;/p&gt;

&lt;p&gt;一切为价值服务，而交付则是赋能和落地。&lt;/p&gt;

&lt;h2 id=&#34;债务&#34;&gt;债务&lt;/h2&gt;

&lt;p&gt;任何事物都有两面性，必然产生债务，一切总会需要偿还。&lt;/p&gt;

&lt;p&gt;债务也分为急性和慢性，慢性对于战略的影响是缓慢的，我们可以有更多的时间处理它，但并不能忽略。
而急性的债务则非常紧急，当下就会对造成损伤，必须立刻处理。&lt;/p&gt;

&lt;p&gt;很多人都过于看重急性债务而忽略慢性债务，实际上慢性债务爆发时，也是实体生死存亡的时刻。&lt;/p&gt;

&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;兵者，国之大事，死生之地，存亡之道，不可不察也。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这里我们可以把“兵”作为战略的指代，《孙子兵法》不就通篇讲的什么是战略吗？&lt;/p&gt;

&lt;p&gt;而《易经》更是直指本源，从阴阳五行到八卦，不正是我所抽象阐述的这些概念吗？&lt;/p&gt;

&lt;p&gt;需深度学习之～&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/business">business</category>
      
    </item>
    
    <item>
      <id>urn:uuid:0c8ba4f3-7c85-4355-ac2f-cb33313f83c4</id>
      <title>在 K8S 中部署 MySQL 双主复制高可用服务器</title>
      <link>https://www.zealic.com/2019/06/k8s-mysql-master-to-master-cluster/</link>
      <pubDate>Thu, 13 Jun 2019 23:46:26 +0800</pubDate>
      
      <guid>https://www.zealic.com/2019/06/k8s-mysql-master-to-master-cluster/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;之前因为某些需要，写了一个运行于 K8S 的 MySQL 双主复制高可用的编排。&lt;/p&gt;

&lt;p&gt;核心使用 StatefulSet，通过 initContainers 初始化的方式完成初次启动配置及同步，
完全自动化。&lt;/p&gt;

&lt;p&gt;当然，这只是用于测试环境的一个编排，因为缺少存储部分，因此不推荐用于生产。&lt;/p&gt;

&lt;p&gt;编排代码如下：&lt;/p&gt;

&lt;h2 id=&#34;mysql-mm-rbac-yml&#34;&gt;mysql-mm-rbac.yml&lt;/h2&gt;

&lt;p&gt;RBAC 权限定义。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;v1&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Namespace&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;---&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;v1&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ServiceAccount&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster-helper&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;namespace&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;---&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Role&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io/v1&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster-helper&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;namespace&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;rules&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;apiGroups&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;apps&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;resources&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;statefulsets&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;verbs&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;get&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;---&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;RoleBinding&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io/v1&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster-helper&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;namespace&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;subjects&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ServiceAccount&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster-helper&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;roleRef&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Role&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster-helper&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;apiGroup&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;mysql-mm-yml&#34;&gt;mysql-mm.yml&lt;/h2&gt;

&lt;p&gt;核心编排定义。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;ln&#34;&gt;  1&lt;/span&gt;---&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;v1&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ConfigMap&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;namespace&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;data&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;common.sh&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;|
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  9&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;    #!/bin/bash&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;update_data()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 11&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;svc=${HOSTNAME%-&lt;span class=&#34;cp&#34;&gt;*}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 12&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;token=$(cat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/run/secrets/kubernetes.io/serviceaccount/token)&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 13&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ns=${POD_NAMESPACE}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;url=https&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;//${KUBERNETES_SERVICE_HOST}/apis/apps/v1/namespaces/${ns}/statefulsets/${svc}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 15&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;curl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-kfsSL&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-H&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization: Bearer ${token}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;${url}&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ha-info/state.json&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 16&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;get_data()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 18&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ha-info/state.json&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;then&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 19&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;return&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 20&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;fi&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 21&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;cat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ha-info/state.json&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 22&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 23&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;get_replicas()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 24&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;get_data&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;replicas&amp;#34;:&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;head&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-n&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tr&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 25&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 26&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;get_ready_replicas()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 27&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;get_data&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;readyReplicas&amp;#34;:&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tr&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 28&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 29&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;get_current_replicas()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;get_data&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;currentReplicas&amp;#34;:&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tr&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 31&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;sync_done()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 33&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Sync has been done.&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 34&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Infinite blocking&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 35&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;while&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;do&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 36&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;sleep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 37&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 38&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 39&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;init-cluster.sh&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;|
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 40&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;    #!/bin/sh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 41&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql/CLUSTER_WAS_INIT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;then&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 42&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;exit&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 43&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;fi&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 44&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Initialize&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configuration...&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 45&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;source&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts/common.sh&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 46&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;SERVER_ID=$(hostname&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-oE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;[^-]+$&amp;#39;&lt;/span&gt;)&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 47&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;cat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/mysql/conf.d/master-to-master.cnf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;lt;&amp;lt;EOF&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 48&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;mysql&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 49&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;no-auto-rehash&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 50&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;mysqld&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 51&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;skip-host-cache&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 52&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;skip-name-resolve&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 53&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;server_id=&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;${SERVER_ID}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 54&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;log-bin=mysql-bin&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 55&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;auto_increment_increment=&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 56&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;auto_increment_offset=$((${SERVER_ID}+&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;))&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 57&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;EOF&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 58&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Initialize&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;configuration&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;successful.&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 59&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;sync-ha.sh&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;|
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 60&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;    #!/bin/bash&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 61&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;set&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 62&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql/CLUSTER_WAS_INIT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;then&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 63&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;sync_done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 64&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;fi&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 65&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;source&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts/common.sh&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 66&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Waiting all replicas up...&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 67&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;while&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;`get_current_replicas`&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-ne&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;`get_ready_replicas`&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 68&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;do&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 69&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;sleep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 70&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 71&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;get_another_host()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 72&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;svc=${HOSTNAME%-&lt;span class=&#34;cp&#34;&gt;*}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 73&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;server_id=$(hostname&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-oE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;[^-]+$&amp;#39;&lt;/span&gt;)&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 74&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;another_id&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 75&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$server_id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;==&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;then&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 76&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;another_id=&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 77&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;else&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 78&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;another_id=&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 79&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;fi&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 80&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${svc}-${another_id}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 81&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 82&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;get_binlog_file()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 83&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;host=$&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 84&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;s2&#34;&gt;&amp;#34;${MYSQL_ROOT_PASSWORD}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;show master status\G;&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;File&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 85&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 86&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;get_binlog_pos()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 87&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;host=$&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 88&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;s2&#34;&gt;&amp;#34;${MYSQL_ROOT_PASSWORD}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;show master status\G;&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Position&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 89&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 90&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;ensure_db()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 91&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;while&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;s2&#34;&gt;&amp;#34;${MYSQL_ROOT_PASSWORD}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;SELECT 1&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/dev/&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;do&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 92&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;sleep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 93&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 94&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;s2&#34;&gt;&amp;#34;${MYSQL_ROOT_PASSWORD}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;GRANT RELOAD, SUPER, REPLICATION SLAVE ON *.* TO &amp;#39;root&amp;#39;@&amp;#39;%&amp;#39; identified by &amp;#39;${MYSQL_ROOT_PASSWORD}&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 95&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 96&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;wait_db()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 97&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;host=$&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 98&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;while&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$host&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;s2&#34;&gt;&amp;#34;${MYSQL_ROOT_PASSWORD}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;SELECT 1&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/dev/&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;do&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 99&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;sleep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;101&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;102&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;sync_core()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;103&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mainHost=$&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;104&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;targetHost=$&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;105&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;file=$&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;106&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pos=$&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;107&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Synchionize&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${mainHost}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;file=${file}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pos=${pos}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;108&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${mainHost}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;s2&#34;&gt;&amp;#34;${MYSQL_ROOT_PASSWORD}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;CHANGE MASTER TO MASTER_HOST=&amp;#39;${targetHost}&amp;#39;, 
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;109&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;        MASTER_USER=&amp;#39;root&amp;#39;,
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;110&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;        MASTER_PASSWORD=&amp;#39;${MYSQL_ROOT_PASSWORD}&amp;#39;,
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;111&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;        MASTER_LOG_FILE=&amp;#39;${file}&amp;#39;,
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;112&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;        MASTER_LOG_POS=${pos};&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;113&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-h&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;${mainHost}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;s2&#34;&gt;&amp;#34;${MYSQL_ROOT_PASSWORD}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;start slave;&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;114&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;115&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;sync_db()&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;116&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;svc=${HOSTNAME%-&lt;span class=&#34;cp&#34;&gt;*}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;117&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;right_fqdn=`get_another_host`.${svc}.${POD_NAMESPACE}.svc.cluster.local&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;118&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;left_fqdn=${HOSTNAME}.${svc}.${POD_NAMESPACE}.svc.cluster.local&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;119&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Wait db $right_fqdn ...&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;120&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;wait_db&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$right_fqdn&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;121&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;left_file=`get_binlog_file&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;${left_fqdn}`&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;122&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;left_pos=`get_binlog_pos&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;${left_fqdn}`&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;123&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;right_file=`get_binlog_file&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;${right_fqdn}`&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;124&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;local&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;right_pos=`get_binlog_pos&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;${right_fqdn}`&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;125&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Sync&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;right&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;left&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;126&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;sync_core&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$left_fqdn&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$right_fqdn&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$right_file&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$right_pos&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;127&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Sync&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;left&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;right&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;...&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;sync_core&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$right_fqdn&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$left_fqdn&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$left_file&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$left_pos&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;129&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;130&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Ensuring db...&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;131&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;ensure_db&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;132&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;server_id=$(hostname&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;|&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-oE&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;[^-]+$&amp;#39;&lt;/span&gt;)&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;133&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;$server_id&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-eq&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;then&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;134&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;sync_db&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;135&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;master-$server_id synchionize suffessful.&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;136&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;else&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;137&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;echo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;master-$server_id are ready.&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;138&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;fi&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;139&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;touch&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql/CLUSTER_WAS_INIT&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;140&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;sync_done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;141&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;sync-ha-metadata.sh&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;|
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;142&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;    #!/bin/sh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;143&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;if&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql/CLUSTER_WAS_INIT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;then&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;144&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;sync_done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;145&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;fi&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;146&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;apk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;curl&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;147&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;source&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts/common.sh&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;148&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;while&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql/CLUSTER_WAS_INIT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;149&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;do&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;150&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;update_data&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;151&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;sleep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;152&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;153&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;sync_done&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;154&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;155&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;---&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;156&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;apps/v1beta2&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;157&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;StatefulSet&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;158&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;159&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-mm&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;160&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;namespace&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;161&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;spec&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;162&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;serviceName&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-mm&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;163&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;replicas&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;164&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;selector&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;165&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;matchLabels&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;166&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;app&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-mm&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;167&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;template&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;168&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;169&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;labels&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;170&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;app&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-mm&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;171&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;spec&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;172&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;initContainers&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;173&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;init-cluster&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;174&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;image&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;alpine&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;175&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;command&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;176&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts/init-cluster.sh&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;177&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;volumeMounts&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;178&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;179&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;180&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;readOnly&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;181&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-conf&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;182&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/mysql/conf.d&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;183&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ha-metadata&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;184&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ha-info&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;185&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;readOnly&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;186&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;containers&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;187&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;188&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;image&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5.7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;189&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;env&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;190&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MYSQL_ROOT_PASSWORD&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;191&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;value&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;123456!!&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;192&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MYSQL_ROOT_HOST&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;193&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;value&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;194&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;volumeMounts&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;195&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;196&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;197&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;readOnly&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;198&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-conf&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;199&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/mysql/conf.d&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-sock&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;201&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/run/mysqld&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;202&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-data&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;203&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;204&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;ports&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;205&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;containerPort&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3306&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;206&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sync-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;207&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;image&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5.7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;208&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;command&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;209&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts/sync-ha.sh&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;210&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;env&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;211&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MYSQL_ROOT_PASSWORD&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;212&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;value&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;123456!!&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;213&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;POD_NAMESPACE&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;214&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;valueFrom&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;215&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;fieldRef&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;216&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;fieldPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metadata.namespace&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;217&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;volumeMounts&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;218&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;219&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;220&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;readOnly&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;221&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-sock&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;222&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/run/mysqld&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;223&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ha-metadata&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;224&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ha-info&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;225&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-data&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;226&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;227&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sync-ha-metadata&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;228&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;image&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;alpine&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;229&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;command&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;230&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts/sync-ha-metadata.sh&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;231&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;env&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;232&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;POD_NAMESPACE&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;233&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;valueFrom&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;234&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;fieldRef&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;235&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;fieldPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metadata.namespace&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;236&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;volumeMounts&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;237&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;238&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;239&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;readOnly&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;240&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ha-metadata&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;241&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/ha-info&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;242&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-data&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;243&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;mountPath&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/lib/mysql&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;244&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;volumes&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;245&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;246&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;configMap&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;247&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-scripts&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;248&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;defaultMode&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0755&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;249&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ha-metadata&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;250&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;emptyDir&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;251&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-conf&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;252&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;emptyDir&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;253&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-sock&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;254&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;emptyDir&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-data&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;256&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;emptyDir&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{}&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;257&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;serviceAccountName&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cluster-helper&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;258&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# volumeClaimTemplates:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;259&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# - metadata:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;260&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     name: pvc-mysql-data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;261&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#   spec:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;262&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     accessModes: [ &amp;#34;ReadWriteOnce&amp;#34; ]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;263&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     resources:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;264&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#       requests:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;265&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#         storage: 10Gi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;266&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;267&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;---&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;268&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;269&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;v1&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;270&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Service&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;271&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;272&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-mm&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;273&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;namespace&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-ha&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;274&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;spec&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;275&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;ports&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;276&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;port&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3306&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;277&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;targetPort&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3306&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;278&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;selector&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;279&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;app&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;mysql-mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      <category domain="https://www.zealic.com/categories/network">network</category>
      
    </item>
    
    <item>
      <id>urn:uuid:475fbb34-ed80-49a0-a023-0ae3f9d7b874</id>
      <title>Kubernetes Homelab 实验环境</title>
      <link>https://www.zealic.com/2019/02/kubernetes-over-homelab/</link>
      <pubDate>Tue, 26 Feb 2019 23:54:44 +0800</pubDate>
      
      <guid>https://www.zealic.com/2019/02/kubernetes-over-homelab/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;Homelab 搭建也不能什么都没有，在之前解决了网络拓扑问题之后，便开始了 Kubernetes 在 Homelab 下的搭建运行。&lt;/p&gt;

&lt;p&gt;和云环境之上的 Kubernetes 不同，还是踩到了一些小坑。&lt;/p&gt;

&lt;h2 id=&#34;安装-kubernetes&#34;&gt;安装 Kubernetes&lt;/h2&gt;

&lt;p&gt;Kubernetes 在 1.7 版本时推出了 &lt;code&gt;kubeadm&lt;/code&gt;，用于简化集群的安装和配置，这就解决了 Kubernetes&lt;br /&gt;
安装困难的一大痛点。&lt;/p&gt;

&lt;h3 id=&#34;准备环境&#34;&gt;准备环境&lt;/h3&gt;

&lt;p&gt;Homelab 的好处就是可以开许多自己想要的虚拟机，这里我们为 Kubernetes 准备两台虚拟机：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;K8S-MASTER-LAVA&lt;br /&gt;
主节点&lt;/li&gt;
&lt;li&gt;K8S-NODE-BEAT&lt;br /&gt;
工作节点&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;安装-kubeadm&#34;&gt;安装 Kubeadm&lt;/h3&gt;

&lt;p&gt;这里我使用的是 Debian 9 环境，通过 Google 的官方源就可以安装 kubeadm&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;apt-get update
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;apt-get install -yq &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    apt-transport-https &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    ca-certificates &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    curl &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    gnupg2
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;apt-get update
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;curl -fsSL  https://packages.cloud.google.com/apt/doc/apt-key.gpg &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; apt-key add -
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;cat &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt;EOF &amp;gt;/etc/apt/sources.list.d/kubernetes.list
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;deb https://apt.kubernetes.io/ kubernetes-xenial main
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;EOF&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;apt-get update
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;apt-get install -y &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    ipvsadm ipset &lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# for ipvs mode&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;    kubelet kubeadm kubectl
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;apt-mark hold kubelet kubeadm kubectl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;初始化集群&#34;&gt;初始化集群&lt;/h3&gt;

&lt;p&gt;官方安装指南的网络插件默认都使用 &lt;code&gt;10.244.0.0/16&lt;/code&gt; 网段，这一网段和我的内网规划存在冲突，&lt;br /&gt;
因此自定义了一个网段 &lt;code&gt;10.64.0.0/16&lt;/code&gt; 来代替默认设置。&lt;/p&gt;

&lt;p&gt;登入主机 &lt;strong&gt;K8S-MASTER-LAVA&lt;/strong&gt;，运行如下脚本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NETWORK_PLUGIN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NETWORK_CIDR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;.64.0.0/16
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;kubeadm init --pod-network-cidr&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$NETWORK_CIDR&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;KUBECONFIG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/etc/kubernetes/admin.conf
&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;curl -sSL &lt;span class=&#34;nv&#34;&gt;$NETWORK_PLUGIN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed &lt;span class=&#34;s2&#34;&gt;&amp;#34;s|10.244.0.0/16|&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NETWORK_CIDR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;|g&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;8&lt;/span&gt;  kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;添加工作节点到集群&#34;&gt;添加工作节点到集群&lt;/h3&gt;

&lt;p&gt;集群初始化完成后可以通过输出的一段命令来添加工作节点。&lt;/p&gt;

&lt;p&gt;登入主机 &lt;strong&gt;K8S-NODE-BEAT&lt;/strong&gt;，运行如下命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;kubeadm join K8S-MASTER-LAVA:6443 --token &amp;lt;YOUR_TOKEN&amp;gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --discovery-token-ca-cert-hash sha256:&amp;lt;YOUR_CA_CERT_HASH&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;遇到的问题&#34;&gt;遇到的问题&lt;/h2&gt;

&lt;h3 id=&#34;dns-解析失败&#34;&gt;DNS 解析失败&lt;/h3&gt;

&lt;p&gt;在完成集群安装后，我部署了 gitlab-runner（k8s executor），在测试运行时却发生了问题，&lt;br /&gt;
在 gitlab-runner 中运行 Dind（Docker in Docker）时，产生的容器无法访问网络。&lt;/p&gt;

&lt;p&gt;通过 tcpdump 等工具进一步排查后，发现网络是没有问题的，K8S 内的容器可以访问外网，但是无法解析域名&lt;/p&gt;

&lt;p&gt;然后我找到了 &lt;code&gt;/etc/resolv.conf&lt;/code&gt;，发现有一些小小的不同，search 字段的最后多了一个 &lt;code&gt;lan&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-conf&#34; data-lang=&#34;conf&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;nameserver 10.96.0.10
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;search default.svc.cluster.local svc.cluster.local cluster.local lan
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;options ndots:5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;关于 resolv.conf 的 search 和 ndots 这里不再详述，读者可以自行搜索。&lt;/p&gt;

&lt;p&gt;正常情况下，这个 &lt;code&gt;lan&lt;/code&gt; 的搜索域应该是可以正常处理的，但是通过 tcpdump 排查时，发现在查询一个域名时，
少发了一个查询请求，比如我们查询 &lt;code&gt;example.com&lt;/code&gt;，正常情况下应有如下 FQDN 查询:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;example.com.example.com.default.svc.cluster.local.
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;example.com.svc.cluster.local.
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;example.com.cluster.local.
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;example.com.lan.
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;example.com.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;但是 tcpdump 的结果少了最后一条 &lt;code&gt;example.com.&lt;/code&gt; 这就导致我们无法访问外网。&lt;/p&gt;

&lt;p&gt;最后问题的根源在于使用的基础 Docker 镜像为 &lt;code&gt;alpine&lt;/code&gt;，这是一个精简镜像，使用 &lt;code&gt;msul&lt;/code&gt; 作为 C 库。&lt;/p&gt;

&lt;p&gt;msul 在 1.1.13  版本之前是不支持 search 和 ndots 选项的，之后的版本支持，&lt;br /&gt;
但是行为却&lt;a href=&#34;https://wiki.musl-libc.org/functional-differences-from-glibc.html&#34;&gt;和 glibc 不同&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;这里的问题在于搜索域列表达到四个时，不会查询根域 &lt;a href=&#34;https://github.com/jetstack/cert-manager/issues/1161&#34;&gt;cert-manager#1161&lt;/a&gt; 这里也有相关的讨论。&lt;/p&gt;

&lt;p&gt;解决方案有三种：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;修改 resolv.conf，使得列表域不超过三个&lt;/li&gt;
&lt;li&gt;不使用基于 msul 的镜像 alpine，使用 &lt;code&gt;debian:9-slim&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;部署 POD 时，自定义 dnsConfig，如下所示&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;custom-pod-dns.yml&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;apiVersion&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;v1&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;kind&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Pod&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;metadata&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;namespace&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;default&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;custom-pod-dns&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;spec&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;containers&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;custom-pod-dns&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;image&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;alpine&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;command&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sleep&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3600&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;dnsPolicy&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;None&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;dnsConfig&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;nameservers&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8.8&lt;/span&gt;.&lt;span class=&#34;m&#34;&gt;8.8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;searches&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lan&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;options&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;name&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ndots&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;value&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;无法访问公网&#34;&gt;无法访问公网&lt;/h3&gt;

&lt;p&gt;同样是运行 DIND，发现集群 POD 的 DIND 运行的容器无法访问外网，但是 curl 拿到的错误提示为，
&lt;strong&gt;Unknown SSL protocol error in connection&lt;/strong&gt;，&lt;code&gt;curl -vv&lt;/code&gt; 查看发现证书握手到一半就停止了。&lt;/p&gt;

&lt;p&gt;抓包诊断发现也是发包到一半就没了，开始以为是 NAT 问题，尝试了修改了宿主机的 docker 的 CIDR，但无法解决问题，后来想到可能是 MTU 导致的问题，Google 之找到了类似的问题。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mlohr.com/docker-mtu/&#34;&gt;https://mlohr.com/docker-mtu/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/docker-library/docker/issues/103&#34;&gt;https://github.com/docker-library/docker/issues/103&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;分析原因，是因为 flannel 的集群网络&lt;strong&gt;默认 MTU 为 1450&lt;/strong&gt;，由于 flannel 基于 vxlan，因此无法改变 MTU，
因此只能改自己的 MTU。&lt;/p&gt;

&lt;p&gt;可以在 DIND 的运行参数上加上 &lt;code&gt;--mtu=1450&lt;/code&gt; 即可解决此问题，但是同样存在连锁问题，
当使用 DIND 运行 docker-compose 时，docker-compose &lt;a href=&#34;https://github.com/docker/compose/issues/3438&#34;&gt;并不会使用 dockerd 设置的 MTU&lt;/a&gt;，而是使用默认的 1500。&lt;/p&gt;

&lt;p&gt;解决方法是配置 docker-compose 的网络使用指定 MTU:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;...&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;networks&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;default&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;driver&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bridge&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;driver_opts&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;com.docker.network.driver.mtu&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1450&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;但这种方法入侵性太强，我更倾向于更干净的方式，比如考虑不使用 flannel 作为网络插件，
使用 &lt;strong&gt;Cilium&lt;/strong&gt; 或者 &lt;strong&gt;Calico&lt;/strong&gt;，Calico 的三层模式需要路由器 BGP 的支持，要求比较高和繁琐，
所以我选择了 Cilium 基于 BPF 的方案。&lt;/p&gt;

&lt;p&gt;Cilium 支持三层平面网络，性能也不差，更拥抱 Service Mesh，紧密结合 Envoy，与 Calico 偏重 IDC 方向不同，Cilium 是偏重应用架构的容器网络方案。&lt;/p&gt;

&lt;p&gt;Cilium 1.3 更是可以&lt;a href=&#34;https://cilium.io/blog/2018/10/23/cilium-13-envoy-go/&#34;&gt;使用 Go 作为 Envoy 的扩展&lt;/a&gt;，可以自行编写 filter chain 扩展，有关这方面的内容可另写一篇文章详述，这里就此带过。&lt;/p&gt;

&lt;p&gt;顺带一提，Cilium 也是 DigitalOcean Kubernetes Cluster 采用的网络方案，同时也被 Google 大力推广。&lt;/p&gt;

&lt;p&gt;使用 Cilium 作为集群的网络方案后，docker-compose MTU 的问题也就此解决。&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/&#34;&gt;Kubernetes - Creating a single master cluster with kubeadm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.musl-libc.org/functional-differences-from-glibc.html&#34;&gt;msul - functional differences from glibc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mlohr.com/docker-mtu/&#34;&gt;Docker MTU issues and solutions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      <category domain="https://www.zealic.com/categories/network">network</category>
      
    </item>
    
    <item>
      <id>urn:uuid:8b4ae276-1dc8-42db-b8ef-003cfd705ef0</id>
      <title>Homelab 手记</title>
      <link>https://www.zealic.com/2019/02/homelab-network-topology/</link>
      <pubDate>Mon, 25 Feb 2019 15:33:23 +0800</pubDate>
      
      <guid>https://www.zealic.com/2019/02/homelab-network-topology/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;最近更新了家里的网关设备，也碰到了一堆问题，但也借由这个机会重新整理了网络拓扑，&lt;br /&gt;
并计划好好的利用 Kubernetes 部署内网的一堆应用与自动化工具。&lt;/p&gt;

&lt;h2 id=&#34;网络拓扑&#34;&gt;网络拓扑&lt;/h2&gt;

&lt;p&gt;首先理清内网所有的主要网络设备，当前如图。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.zealic.com/images/2019/homelab-network-topology.jpg&#34;&gt;&lt;img src=&#34;https://www.zealic.com/images/2019/homelab-network-topology.jpg&#34; alt=&#34;Network Topology&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ESXi 以及 NAS，Printer 都是之前就配置好的，这里不再赘述。&lt;/p&gt;

&lt;p&gt;主要涉及的是这次的新设备 ROS(RB450Gx4) 主网关以及 OpenWRT 虚拟路由，FreeGateway 用于科学上网，EdgeGateway 使用 Zerotier 作为边界网关，主要用于内网对等及穿透。&lt;/p&gt;

&lt;h2 id=&#34;主网关&#34;&gt;主网关&lt;/h2&gt;

&lt;p&gt;主网关使用 RB450Gx4，该设备属于有线路由，性能强劲，支持硬件转发，我在测速时可以跑满 200M，峰值270M，旧的路由器 RB951G 2HND 则只能跑到 170M。&lt;/p&gt;

&lt;p&gt;ROS 主要配置的是策略路由，国外 IP 将 TCP 包路由到 FreeGateway，对等子网路由到 EdgeGateway，并配置 DNS 转发到 FreeGateway。&lt;/p&gt;

&lt;p&gt;这里 ROS 配置时碰到了一个困扰很久的问题，路由转发到 FreeGateway 时，出现了大量丢包，导致无法完成请求。&lt;br /&gt;
使用 Wireshark 抓包分析发现有 ICMP Redirect 请求，之前的旧路由是同样的工作模式，没有出现问题，经过大量搜索与排查，没有在网上找到解决方案。&lt;br /&gt;
最后在配置防火墙时，无意发现禁用某条默认规则后再无丢包。&lt;/p&gt;

&lt;p&gt;该条规则如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;/ip firewall filter
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;add &lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;drop &lt;span class=&#34;nv&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;forward connection-state&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;invalid&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;作用是&lt;strong&gt;丢掉无效连接状态的包&lt;/strong&gt;，但是由于做了 marking-route 转发时产生了 ICMP Redirect，导致 tcp 状态失效，因此该规则就丢弃了部分正常包，下次记住配置 ROS 一定要默认的防火墙规则都删掉。&lt;/p&gt;

&lt;h2 id=&#34;dns&#34;&gt;DNS&lt;/h2&gt;

&lt;p&gt;一个合格的 Homelab 网络理应有 DNS 提供内网的主机名映射，这里我使用的是 FreeGateway 提供的 chinadns 作为主 DNS 解析，并配置了内网 DNS 转发，内网主机应统一配置域名后缀 lan，或者由 DHCP 下发。&lt;/p&gt;

&lt;p&gt;同时 ROS 配置了三条巧妙的 DNS 转发规则:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;/ip firewall nat
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;add &lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;netmap &lt;span class=&#34;nv&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;dstnat &lt;span class=&#34;nv&#34;&gt;comment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;DNS dst-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;.0.0.1 dst-port&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;nv&#34;&gt;protocol&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;udp src-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;!10.0.1.1 to-addresses&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;.0.1.1 to-ports&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;53&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;add &lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;masquerade &lt;span class=&#34;nv&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;srcnat dst-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;.0.1.1 dst-port&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;protocol&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    udp src-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;!10.0.1.1
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;add &lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;netmap &lt;span class=&#34;nv&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;dstnat &lt;span class=&#34;nv&#34;&gt;comment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;HijackDNS dst-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;.8.8.8 dst-port&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;protocol&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;udp src-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;!10.0.1.1 to-addresses&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;.0.1.1 to-ports&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;53&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;主DNS为 ROS &lt;code&gt;10.0.0.1&lt;/code&gt;,也是 DHCP 下发的 DNS，这两条规则的作用是，当 DNS 请求源 IP 为 FreeGateway &lt;code&gt;10.0.1.1&lt;/code&gt; 时，DNS解析由 ROS 负责，当请求源 IP 为其他主机时，DNS 解析请求 NAT 转发到 &lt;code&gt;10.0.1.1&lt;/code&gt;，而由于 FreeGateway 配置了内网域 &lt;code&gt;lan&lt;/code&gt; 转发到 ROS，内网主机的解析就重新由 ROS 来解析。&lt;/p&gt;

&lt;p&gt;最后劫持了对 8.8.8.8 的 DNS 请求，转发到 &lt;code&gt;10.0.1.1&lt;/code&gt;，这样内网主机使用时，DHCP DNS 下发为 10.0.0.1,
手动配置 DNS 则为 8.8.8.8，都能达到同样的效果，并且对应用和配置毫无侵入。&lt;/p&gt;

&lt;p&gt;而 ROS 则配置了一个脚本 schedule 来定时获取 DHCP 主机名并更新静态 DNS，以完成内网的解析，脚本如下。&lt;/p&gt;

&lt;p&gt;Gist: &lt;a href=&#34;https://gist.github.com/zealic/3b8e8b112338b96fa83f156d42bb64e5#file-dhcphosttodns-script&#34;&gt;dhcpHostToDNS.script&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;:local ttl &lt;span class=&#34;s2&#34;&gt;&amp;#34;00:05:00&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;:local zone &lt;span class=&#34;s2&#34;&gt;&amp;#34;lan&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;:local hostname
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;:local ip
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;:local dnsip
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;:local dhcpip
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;:local dnsnode
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;:local dhcpnode
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt; 
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;/ip dns static&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;:foreach i &lt;span class=&#34;nv&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=[&lt;/span&gt;find where name ~ &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.*\\.&amp;#34;&lt;/span&gt;.&lt;span class=&#34;nv&#34;&gt;$zone&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;  :local nodettl
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;  :set hostname &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; get &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; name &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;  :set hostname &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :pick &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :len &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; - &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :len &lt;span class=&#34;nv&#34;&gt;$zone&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; + &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;  :set nodettl &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;get &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; ttl&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;  /ip dhcp-server lease&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;  :set dhcpnode &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; find where host-name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;  :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :len &lt;span class=&#34;nv&#34;&gt;$dhcpnode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &amp;gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;    :log debug &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Lease for &amp;#34;&lt;/span&gt;.&lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt;.&lt;span class=&#34;s2&#34;&gt;&amp;#34; still exists. Not deleting.&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# there&amp;#39;s no lease by that name. Maybe this mac has a static name.&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;    :local found &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;    /system script environment
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;    :foreach n &lt;span class=&#34;nv&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=[&lt;/span&gt; find where name ~ &lt;span class=&#34;s2&#34;&gt;&amp;#34;shost[0-9A-F]+&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;       :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; get &lt;span class=&#34;nv&#34;&gt;$n&lt;/span&gt; value &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;         :set found true&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;    :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; found &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;      :log debug &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hostname &amp;#34;&lt;/span&gt;.&lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt;.&lt;span class=&#34;s2&#34;&gt;&amp;#34; is static&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;      :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$nodettl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ttl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;        :log info &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Lease expired for &amp;#34;&lt;/span&gt;.&lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt;.&lt;span class=&#34;s2&#34;&gt;&amp;#34;, deleting DNS entry.&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;        /ip dns static remove &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;      &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt; 
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;/ip dhcp-server lease&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;:foreach i &lt;span class=&#34;nv&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=[&lt;/span&gt;find&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;  :set hostname &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;  :local mac
&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;  :set dhcpip &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; get &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; address &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;  :set mac &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; get &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; mac-address &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;  :while &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; ~ &lt;span class=&#34;s2&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;47&lt;/span&gt;    :local pos &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :find &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;48&lt;/span&gt;    :set mac &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :pick &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$pos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; . &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :pick &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$pos&lt;/span&gt; + &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;999&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;49&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;50&lt;/span&gt;  :foreach n &lt;span class=&#34;nv&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=[&lt;/span&gt; /system script environment find where &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;shost&amp;#34;&lt;/span&gt; . &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;51&lt;/span&gt;    :set hostname &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; /system script environment get &lt;span class=&#34;nv&#34;&gt;$n&lt;/span&gt; value &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;52&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;53&lt;/span&gt;  :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :len &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;54&lt;/span&gt;    :set hostname &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; get &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; host-name &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;55&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;56&lt;/span&gt;  :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :len &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &amp;gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;57&lt;/span&gt;    :set hostname &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; . &lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt; . &lt;span class=&#34;nv&#34;&gt;$zone&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;58&lt;/span&gt;    /ip dns static&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;59&lt;/span&gt;    :set dnsnode &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; find where &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;60&lt;/span&gt;    :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; :len &lt;span class=&#34;nv&#34;&gt;$dnsnode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &amp;gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;61&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# it exists. Is its IP the same&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;62&lt;/span&gt;      :set dnsip &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; get &lt;span class=&#34;nv&#34;&gt;$dnsnode&lt;/span&gt; address &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;63&lt;/span&gt;      :if &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$dnsip&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$dhcpip&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;64&lt;/span&gt;        :log debug &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;DNS entry for &amp;#34;&lt;/span&gt; . &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; . &lt;span class=&#34;s2&#34;&gt;&amp;#34; does not need updating.&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;65&lt;/span&gt;      &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;66&lt;/span&gt;        :log info &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Replacing DNS entry for &amp;#34;&lt;/span&gt; . &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;67&lt;/span&gt;        /ip dns static remove &lt;span class=&#34;nv&#34;&gt;$dnsnode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;68&lt;/span&gt;        /ip dns static add &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$dhcpip&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;ttl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$ttl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;69&lt;/span&gt;      &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;70&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;={&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;71&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# it doesn&amp;#39;t exist. Add it&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;72&lt;/span&gt;      :log info &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Adding new DNS entry for &amp;#34;&lt;/span&gt; . &lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;73&lt;/span&gt;      /ip dns static add &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$hostname&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$dhcpip&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;ttl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$ttl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;74&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;75&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;76&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;kubernetes-集群&#34;&gt;Kubernetes 集群&lt;/h2&gt;

&lt;p&gt;完成了以上基础网络和环境配置后，才有基本的条件建立 Kubernetes 集群，也是之后的主要目的，这里我使用了 kubeadmin。&lt;/p&gt;

&lt;p&gt;由于搭建集群和配置过于复杂，应另起一文详叙。&lt;/p&gt;

&lt;p&gt;集群运行的组件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gitlab Runner&lt;br /&gt;
Gitlab Runner 的主要目的是提供一个特殊的 runner 供 gitlab-ci 使用，Gitlab 提供的 runner 虽然可以以 privlileged 模式运行，但是没有加载 nbd 内核模块，缺少我需要的构建条件，因此运行此 runner 来进行依赖 nbd 的特殊构建。&lt;/li&gt;
&lt;li&gt;Bitcoin Daemon&lt;br /&gt;
比特币全节点，主要用于开发和测试 API。&lt;/li&gt;
&lt;li&gt;Geth&lt;br /&gt;
以太坊全节点，同上。&lt;/li&gt;
&lt;li&gt;go-filecoin&lt;br /&gt;
Filecoin 节点，同上。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;结语&#34;&gt;结语&lt;/h2&gt;

&lt;p&gt;网络知识是一个架构师所需的基本素质，无论是架构还是应用都需要，了解这些对于提升技术水平甚至架构水平很有帮助。&lt;br /&gt;
搭建这个实验环境的目的也是为了更好的学习和提升，未来 Kubernetes 也许是云上的应用操作系统，需要更多的了解和深入学习它，在云端的 Kubernetes 和本机搭建的集群始终有所限制，通过这个 Homelab 之上的集群，可以做很多事情。&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.mikrotik.com/wiki/Setting_static_DNS_record_for_each_DHCP_lease&#34;&gt;Mikrotik Wiki - Setting static DNS record for each DHCP lease
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/network">network</category>
      
    </item>
    
    <item>
      <id>urn:uuid:9a324e0b-f456-4a92-8759-edb345e7f80a</id>
      <title>Linux 下的无线 AP 配置</title>
      <link>https://www.zealic.com/2013/07/wireless-ap-on-linux/</link>
      <pubDate>Sat, 06 Jul 2013 16:43:31 +0800</pubDate>
      
      <guid>https://www.zealic.com/2013/07/wireless-ap-on-linux/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;介绍在 Linux 下通过无线网卡配置无线的经验。&lt;/p&gt;

&lt;p&gt;我使用的网卡是 TL-WN841N，这样的大牌子可以很好的得到内核的驱动支持。&lt;br /&gt;
TP-LINK 官方是有在维护他的产品针对 Linux 驱动的。&lt;/p&gt;

&lt;p&gt;本文工作发行版使用ArchLinux，不保证其他发行可用，&lt;br /&gt;
但除了包管理器的差别外，大部分配置通常是可以通用的。&lt;/p&gt;

&lt;h2 id=&#34;1-启用驱动&#34;&gt;1) 启用驱动&lt;/h2&gt;

&lt;p&gt;使用如下命令启用驱动，需要重启：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo modprobe ath9k&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;当然也可以不用重启，但是我这里推荐你所有配置完成以后，还是重启一下比较好。&lt;/p&gt;

&lt;h2 id=&#34;2-配置网卡设备名&#34;&gt;2) 配置网卡设备名&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;/etc/udev/rules.d/10.network.rules&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;SUBSYSTEM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;net&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ACTION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;add&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ATTR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ff:ff:ff:ff:ff:ff&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;wlan1&amp;#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意将上述配置中的 &lt;strong&gt;ff:ff:ff:ff:ff:ff&lt;/strong&gt; 替换为你的无线网卡 MAC 地址。&lt;/p&gt;

&lt;p&gt;这样配置是由于 systemd 的新命名机制，导致网卡命名不像以前 eth*，而是一串不容易记忆的名称。&lt;br /&gt;
这里我们统一配置为 &lt;strong&gt;wlan1&lt;/strong&gt;，方便后面使用。&lt;/p&gt;

&lt;h2 id=&#34;3-配置-dhcpd-服务器&#34;&gt;3) 配置 dhcpd 服务器&lt;/h2&gt;

&lt;p&gt;因为无线 AP 需要提供 DHCP 服务，供无线设备使用，因此这里需要安装 DHCP。&lt;/p&gt;

&lt;p&gt;首先安装 dhcpd 软件包：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-.bash&#34; data-lang=&#34;.bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo pacman -S dhcp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后我们做一个简单的子网配置：&lt;br /&gt;
&lt;em&gt;/etc/dhcpd.conf&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-.ruby .numberLines&#34; data-lang=&#34;.ruby .numberLines&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;subnet 192.168.100.0 netmask 255.255.255.0 {
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;  range 192.168.100.100 192.168.100.199;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;  option routers 192.168.100.1;
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;  option domain-name-servers 8.8.8.8;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;  option ip-forwarding off;
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;  option broadcast-address 192.168.100.255;
&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;4-配置-wireless-ap-服务&#34;&gt;4) 配置 wireless-ap 服务&lt;/h2&gt;

&lt;p&gt;这是一个自定义 systemd 服务，用于配置无线网卡并绑定到 dhcp。&lt;br /&gt;
最后为其配置 iptables 转发规则。&lt;/p&gt;

&lt;p&gt;配置文件如下：&lt;br /&gt;
&lt;em&gt;/etc/systemd/system/wireless-ap.service&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Powered by Zealic, Visit : https://github.com/zealic&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;[Unit]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Wireless AP&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Wants&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;network.target&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Before&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;network.target&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;[Service]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;oneshot&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;RemainAfterExit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;yes&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;EnvironmentFile&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/etc/conf.d/wireless-ap&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/sbin/ip link set dev ${interface} up&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev ${interface}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/sbin/dhcpd -q ${interface}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/sbin/iptables -t nat -A POSTROUTING -o ${target_interface} -j MASQUERADE&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ExecStop&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/sbin/ip addr flush dev ${interface}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ExecStop&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/sbin/ip link set dev ${interface} down&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;[Install]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;multi-user.target&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;针对服务的环境配置：&lt;br /&gt;
&lt;em&gt;/etc/conf.d/wireless-ap&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;wlan1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;target_interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;net1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;192.168.100.1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;netmask&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;24&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;broadcast&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;192.168.100.255&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;记住，&lt;strong&gt;target_interface&lt;/strong&gt; 指的是你可以接入互联网的网卡，你的这个网卡名可能是 &lt;strong&gt;eth0&lt;/strong&gt; 之类的。&lt;/p&gt;

&lt;p&gt;完成服务配置以后，我们需要启用服务。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; wireless-ap&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;5-安装配置-hostapd&#34;&gt;5) 安装配置 hostapd&lt;/h2&gt;

&lt;p&gt;hostapd 就是可以让无线网卡工作在 master 模式下的工具了。&lt;/p&gt;

&lt;p&gt;首先安装软件包：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo pacman -S hostapd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置 hostapd&lt;br /&gt;
&lt;em&gt;/etc/hostapd/hostapd.conf&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ssid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;YOUR-AP-SSID&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;nl80211&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;hw_mode&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;g&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;channel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;11&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;wlan1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;auth_algs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;wpa&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;wpa_passphrase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;YOUR-AP-PASSWORD&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;wpa_key_mgmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;WPA-PSK&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;wpa_pairwise&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CCMP TKIP&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;rsn_pairwise&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CCMP&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ht_capab&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;[HT40-][SHORT-GI-40][DSSS_CKCK-40]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;别忘了把 &lt;strong&gt;YOUR-AP-SSID&lt;/strong&gt; 和 &lt;strong&gt;YOUR-AP-PASSWORD&lt;/strong&gt; 换成你自己的 SSID 和密码。&lt;/p&gt;

&lt;p&gt;启用 hostapd 服务：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; hostapd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;6-重启系统&#34;&gt;6) 重启系统&lt;/h2&gt;

&lt;p&gt;到这里我们已经配置完成无线网卡的 AP，重启系统即可开始使用。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo reboot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;当然如果你是高级 Linux 用户，完全知道自己在做什么，也可以自己控制卸载网卡并启动服务。&lt;/p&gt;

&lt;h2 id=&#34;7-问题&#34;&gt;7) 问题&lt;/h2&gt;

&lt;p&gt;我配置完成可以正常的使用，但是发现使用一段时间后无线 AP 就消失了，整个系统也有些问题，内核经常性的挂起。&lt;/p&gt;

&lt;p&gt;关键性报错如下：&lt;/p&gt;

&lt;p&gt;长时间工作后 tty 不停的刷如下日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;kernel: DMA: Out of SW-IOMMU space for 16 bytes at device 0000:00:1d.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在 tty 中运行任何命令都可能会导致长时间挂起，超时后输出如下错误：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;INFO: task blocked for more than 120 seconds.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这句忘了怎么来的了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;ath: Unable to remove station entry for: ff:ff:ff:ff:ff:ff&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;del&gt;
发生这个问题的原因是由于 Intel 的 64 位支持不太好的原因，&lt;br /&gt;
只需要在内核启动参数加上 &lt;code&gt;intel_iommu=off&lt;/code&gt; 选项即可。&lt;/p&gt;

&lt;p&gt;&lt;/del&gt;&lt;/p&gt;

&lt;h3 id=&#34;更新-2013-08-08&#34;&gt;更新：2013-08-08&lt;/h3&gt;

&lt;p&gt;确认以上问题不仅仅是内核选项的问题，而是由于我的配置项不完整导致的，&lt;br /&gt;
只需要在 hostapd 配置中加入&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ht_capab&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;[HT40-][SHORT-GI-40][DSSS_CKCK-40]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样以正确的设定其工作模式就没有问题了。&lt;/p&gt;

&lt;p&gt;我已经在上面的配置中加入了此配置选项。&lt;/p&gt;

&lt;p&gt;实验下来 AP 运行良好，没有出现导致内核挂起的问题。&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/index.php/Wireless_Setup&#34;&gt;ArchLinux Wiki - Wireless Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://w1.fi/gitweb/gitweb.cgi?p=hostap.git;a=blob_plain;f=hostapd/hostapd.conf&#34;&gt;hostapd Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:8b60fdde-1783-4529-a207-30ec272c4461</id>
      <title>实战 Gollum</title>
      <link>https://www.zealic.com/2012/04/gollum-in-action/</link>
      <pubDate>Tue, 17 Apr 2012 17:13:18 +0800</pubDate>
      
      <guid>https://www.zealic.com/2012/04/gollum-in-action/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;

&lt;p&gt;之前就说过想尝试 Gollum，GTD 精神引导我立刻就做。&lt;br /&gt;
以下就是我尝试的过程。&lt;/p&gt;

&lt;h2 id=&#34;安装-gollum&#34;&gt;安装 Gollum&lt;/h2&gt;

&lt;p&gt;本来想安装到 Windows 之上的，但是尝试之后，虽然 Gollum 可以安装到 Windows 之上（需要 MinGW 环境）。&lt;br /&gt;
但是由于其依赖的 Grit 无法在 Windows 之上工作，&lt;a href=&#34;https://github.com/github/gollum/issues/161&#34;&gt;参考这里&lt;/a&gt;。&lt;br /&gt;
我也尝试了进行补丁，但是无果～&lt;/p&gt;

&lt;p&gt;没办法，只好在 *nix 上尝试 Gollum。
个人习惯使用 Debian，运行以下 shell 代码即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;apt-get install ruby1.9.1-full
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Gollum 依赖的 nokogiri 需要这些才能编译&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;apt-get install libxml2-dev libxslt-dev
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# 最新版本的 redcarpet 无法工作在 gollum 之上，参考本文结尾的：&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#   Stackoverflow : Gollum Wiki - undefined method &amp;#39;new&amp;#39; for Redcarpet:Module&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;gem install redcarpet --version&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;.17.2
&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;gem install gollum&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如此即安装完成，这里我新建一个示例仓库来维护：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;git init mywiki
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; mywiki
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;gollum&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后访问 &lt;code&gt;http://localhost:4567&lt;/code&gt; 即可访问 gollum 托管的 Wiki。&lt;/p&gt;

&lt;h2 id=&#34;结语&#34;&gt;结语&lt;/h2&gt;

&lt;p&gt;按照我的设想，Gollum 是用来作为项目开发的文档工具来使用的，并不仅仅作为个人知识管理工具来使用。
至于实际效果么，就得看以后啦～&lt;/p&gt;

&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ztpala.com/2012/02/01/gollum-git-backed-wiki/&#34;&gt;用Gollum搭建基于Git的Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://stackoverflow.com/questions/8395347/gollum-wiki-undefined-method-new-for-redcarpetmodule&#34;&gt;Stackoverflow : Gollum Wiki - undefined method `new&amp;rsquo; for Redcarpet:Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dreverri/gollum-site&#34;&gt;静态站点生成 : gollum-site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.xdite.net/posts/2011/12/04/gollum-git-based-wiki&#34;&gt;Gollum Git Based Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:8b60fdde-1783-4529-a207-30ec272c4461</id>
      <title>整理一下最近的思路</title>
      <link>https://www.zealic.com/2012/04/most-recent-ideas/</link>
      <pubDate>Tue, 17 Apr 2012 12:41:33 +0800</pubDate>
      
      <guid>https://www.zealic.com/2012/04/most-recent-ideas/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;h2 id=&#34;关于博客&#34;&gt;关于博客&lt;/h2&gt;

&lt;p&gt;自从年后了解到 &lt;a href=&#34;https://github.com/mojombo/jekyll&#34;&gt;Jekyll&lt;/a&gt; 以后，就琢磨着把博客完全迁移到这个平台上面。&lt;br /&gt;
上月中旬已经迁移完成，顺便实现了大体的模板框架，利用一些前端 JS 及 HTML5 来改善浏览体验。&lt;br /&gt;
此后断断续续的对内容做整理及改进，统一了格式等等，还把一些写心情的文章移走，此博以后就专门发布技术文章及相关内容了。&lt;/p&gt;

&lt;p&gt;用上了 Jekyll 的感觉真好，其实之前还看过 &lt;a href=&#34;http://octopress.org&#34;&gt;Octopress&lt;/a&gt;，但是其是按照 Github 的要求来做的，不支持 Jekyll 的插件，而我有很多想要自己做的功能，入博客分页，标签功能等等。&lt;br /&gt;
因此就直接在 Jekyll 建博客，写了一些自定义插件，如分页标签什么的，毕竟以前学过一些 Ruby，弄些这个还是小 CASE。&lt;/p&gt;

&lt;p&gt;目前还剩下&lt;a href=&#34;http://zealic.cnblogs.com&#34;&gt;我在博客园&lt;/a&gt;的一部分文章没有移过来，弄完就应该了事了。&lt;/p&gt;

&lt;h2 id=&#34;amazon-cloud&#34;&gt;Amazon Cloud&lt;/h2&gt;

&lt;p&gt;云计算已经是时代趋势，我也开始在最近跑起了 &lt;a href=&#34;http://aws.amazon.com/ec2&#34;&gt;Amazon EC2&lt;/a&gt;，不得不说国外月亮真的很圆，最起码网络如此，在 EC2 上的做 Debian APT 更新时，下载网速峰值能达到 4MB！&lt;br /&gt;
因此打算将 &lt;a href=&#34;http://www.linode.com&#34;&gt;Linode&lt;/a&gt; 上的 VPS 停掉，以后就用 EC2 了。关于云计算，还需要学很多～&lt;/p&gt;

&lt;p&gt;前段时间也试着在 EC2 上面搭建 PPTP、L2TP VPN，由于 EC2 网关只支持 TCP、UDP及ICMP协议，因此工作在第二层的 L2TP 无法工作，而 PPTP 所用的 GRE 协议也在 EC2 上时好时坏，虽然搭起，却是不太稳定，因此又干脆的搭个 &lt;a href=&#34;http://en.wikipedia.org/wiki/OpenVPN&#34;&gt;OpenVPN&lt;/a&gt; 好了，然后自己对 &lt;a href=&#34;http://sourceforge.net/projects/ovpnp&#34;&gt;OpenVPNPortable&lt;/a&gt; 做了一些改造，并升级到最新的 OpenVPN 2.2.2，绿色版滴哟，现在用起来灰常舒服～&lt;/p&gt;

&lt;h2 id=&#34;兴趣&#34;&gt;兴趣&lt;/h2&gt;

&lt;p&gt;现在对 Windows Phone 非常感兴趣，当前用的手机也是这个，已经注册了 &lt;a href=&#34;http://create.msdn.com&#34;&gt;Apphub&lt;/a&gt; 帐号，打算将自己脑海中的一些应用实现。&lt;/p&gt;

&lt;p&gt;然后对于 &lt;a href=&#34;http://qt-project.org/wiki/Qt_5.0&#34;&gt;Qt5&lt;/a&gt; 的也非常感兴趣，想要进一步学习，如果 Qt5 有 Python Binding 的话再好不过了， QML 真的是太美了～&lt;/p&gt;

&lt;h2 id=&#34;文档-wiki-pkm&#34;&gt;文档、WIKI、PKM !?&lt;/h2&gt;

&lt;p&gt;一直以来想要一个 WIKI 来维护自己的个人知识，先后试过以下软件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.wjjsoft.com/mybase.html&#34;&gt;myBase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;www.tgslabs.com/en/winorganizer/&#34;&gt;WinOrganizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://moinmo.in&#34;&gt;MoinMoin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.screwturn.eu&#34;&gt;ScrewTurn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://twiki.org&#34;&gt;TWiki&lt;/a&gt;(&lt;a href=&#34;http://foswiki.org&#34;&gt;Foswiki&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;www.google.com/notebook&#34;&gt;Google Notebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;office.microsoft.com/en-us/onenote/&#34;&gt;OneNote&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;但是上述软件一直都不尽如意，期间也有利用 VCS 来做知识管理的想法，也用 SVN 实施过，但是也放弃了。因此到现在知识想法什么的一直都很散乱。&lt;br /&gt;
后来接触到了 Git，了解到了 &lt;a href=&#34;https://github.com/joeyh/ikiwiki&#34;&gt;ikiwiki&lt;/a&gt;、&lt;a href=&#34;https://github.com/sr/git-wiki&#34;&gt;git-wiki&lt;/a&gt;、&lt;a href=&#34;https://github.com/minad/olelo&#34;&gt;olelo&lt;/a&gt; 之后，就觉得这是我一直想要的，简单、方便、直观、自主控制的版本管理；太完美了～&lt;br /&gt;
但是却一直没有实施这个想法，现在打算在最近用 &lt;a href=&#34;https://github.com/github/gollum&#34;&gt;Gollum&lt;/a&gt; 部署起来，并慢慢把以前散乱在 WinOrganizer、Google Notebook、OneNote 和 Dropbox 中的数据迁移进去～&lt;/p&gt;

&lt;h1 id=&#34;git&#34;&gt;Git&lt;/h1&gt;

&lt;p&gt;现在使用 &lt;a href=&#34;http://git-scm.com&#34;&gt;Git&lt;/a&gt; 渐入佳境，认为这个最完美的版本控制工具了，哪怕在公司用 SVN 都不爽，要用 git-svn 协同工作才舒服。&lt;br /&gt;
自己的各种练手作品和项目也用 Git 管理起来，以及一些环境脚本，常用软件等等。&lt;br /&gt;
现在完全不怕数据丢失什么的了，哪怕个人电脑完全毁坏，也就是损失一些无关紧要的数据，关键数据我都用 Git 管理器来，比如常用软件。用 Git 管理并放到 &lt;a href=&#34;https://bitbucket.org&#34;&gt;bitbucket&lt;/a&gt;，我个人又有绿色软件强迫症，因此仓库中的软件都是精心制作，转为绿色才放进去的，以下就是一些大部头：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cygwin&lt;/li&gt;
&lt;li&gt;MinGW32&lt;/li&gt;
&lt;li&gt;VB6、VC6、VC71、VC80、VC90、VC100 的编译环境&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Perl&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些在到新环境的时候，都不用到处下载安装，只要 pull 下来仓库，运行其中的部署脚本而已。家里和公司中可以随时同步成相同的工作环境。&lt;/p&gt;

&lt;h2 id=&#34;结语&#34;&gt;结语&lt;/h2&gt;

&lt;p&gt;这篇文章完全使用 &lt;a href=&#34;http://code.google.com/p/notepad2-mod&#34;&gt;Notepad2-mod&lt;/a&gt; 写的，纯文本写文章的感觉真好，脱离了 &lt;a href=&#34;en.wikipedia.org/wiki/Windows_Live_Writer&#34;&gt;Live Writer&lt;/a&gt;，整个世界都清新了起来！&lt;/p&gt;

&lt;p&gt;此博近乎两年未更新，很多学到的东西都没记录下来，以后要勤于写博，总结经验，以前常听好记性不如烂笔头，这个确实是真的～&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/default">@Default</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c81322-5415-11e1-bd0f-96c22c02106a</id>
      <title>Windows 下使用 Nginx&#43;Mono 部署 ASP.Net</title>
      <link>https://www.zealic.com/2010/03/run-mono-asp.net-on-windows-and-nginx/</link>
      <pubDate>Wed, 31 Mar 2010 20:44:50 +0800</pubDate>
      
      <guid>https://www.zealic.com/2010/03/run-mono-asp.net-on-windows-and-nginx/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;自 Mono 1.9 以来，ASP.Net 也能通过 Mono 的 fastcgi-mono-server2 在 FastCGI 下运行了，更为可贵的是，Mono 兼容 Windows ；我们可以在 Windows 下利用 lighttpd、nginx 或 Apache 等服务器上部署 ASP.Net。&lt;/p&gt;

&lt;p&gt;我将 Mono for Windows 的 FastCGI-Mono-Server 提取出来，你可以 &lt;a href=&#34;https://cid-55ba94c1f823f482.skydrive.live.com/self.aspx/Programming/FastCGI-Mono-Server_2.6.3.7z&#34;&gt;猛击这里&lt;/a&gt; 下载。&lt;/p&gt;

&lt;p&gt;而 Nginx 目前也支持 Windows，是部署 Web 服务器的一个非常不错的选择，你可以在 &lt;a href=&#34;https://nginx.org/en/download.html&#34;&gt;Nginx 的官方网站&lt;/a&gt;找到下载。&lt;/p&gt;

&lt;p&gt;下面是我对 Nginx &lt;em&gt;nginx.conf&lt;/em&gt; 的配置，第 25 行属于关键内容。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;worker_processes&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;error_log&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;logs/error-debug.log&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;events&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;  &lt;span class=&#34;kn&#34;&gt;worker_connections&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;http&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;  &lt;span class=&#34;kn&#34;&gt;include&lt;/span&gt;         &lt;span class=&#34;s&#34;&gt;mime.types&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;  &lt;span class=&#34;kn&#34;&gt;default_type&lt;/span&gt;    &lt;span class=&#34;s&#34;&gt;text/plain&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;  &lt;span class=&#34;kn&#34;&gt;sendfile&lt;/span&gt;        &lt;span class=&#34;no&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;  &lt;span class=&#34;kn&#34;&gt;keepalive_timeout&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;65&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;  &lt;span class=&#34;kn&#34;&gt;index&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;index.html&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;index.htm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;  &lt;span class=&#34;kn&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;    &lt;span class=&#34;kn&#34;&gt;listen&lt;/span&gt;       &lt;span class=&#34;mi&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;    &lt;span class=&#34;kn&#34;&gt;server_name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;yourdomain.com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;    &lt;span class=&#34;kn&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;index.aspx&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;default.aspx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;    &lt;span class=&#34;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;      &lt;span class=&#34;kn&#34;&gt;root&lt;/span&gt;   &lt;span class=&#34;s&#34;&gt;D:/www/yourwebapp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;      &lt;span class=&#34;kn&#34;&gt;fastcgi_pass&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;127.0.0.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;      &lt;span class=&#34;kn&#34;&gt;fastcgi_param&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;SCRIPT_FILENAME&lt;/span&gt;  &lt;span class=&#34;nv&#34;&gt;$document_root/$fastcgi_script_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;      &lt;span class=&#34;kn&#34;&gt;include&lt;/span&gt;       &lt;span class=&#34;s&#34;&gt;fastcgi_params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后将上面的 FastCGI-Mono-Server 提取出来，所有文件全部注册到 GAC(否则 Web 应用会找不到他们，当然你也可以直接放到 &lt;em&gt;webapp/bin&lt;/em&gt;)，然后解压到某个文件夹，这里假设为 D:/FastCGI-Mono-Server。&lt;/p&gt;

&lt;p&gt;之后我们就可以按下列命令运行 FastCGI:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;fastcgi-mono-server2 /socket&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tcp:127.0.0.1:8000 /root&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;D:/www/yourwebapp&amp;#34;&lt;/span&gt; /applications&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yourdomain.com:/:. /multiplex&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;True&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后执行运行 Nginx 服务器，我们的 ASP.Net 程序就能脱离 IIS 这个臃肿的家伙运行啦!!!&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c7ec11-5415-11e1-ab1c-96c22c02106a</id>
      <title>一种版本化的数据库脚本管理机制</title>
      <link>https://www.zealic.com/2009/07/a-version-of-the-database-script-management-mechanism/</link>
      <pubDate>Wed, 29 Jul 2009 13:55:38 +0800</pubDate>
      
      <guid>https://www.zealic.com/2009/07/a-version-of-the-database-script-management-mechanism/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;现今开发的软件当中，多数系统的数据都是基于数据库存储的，但是由于软件变化的复杂性，相对于维护代码，数据库架构的版本并不是那么好维护。&lt;/p&gt;

&lt;p&gt;这里本人针对实际情况，理想化出一种可以清晰理解的数据库架构脚本的版本控制机制。&lt;/p&gt;

&lt;p&gt;请先看目录树：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;Example.DataSchema
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;├─V1.0
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;│  ├─Common
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;│  │      001.Create.Table.Product.sql
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;│  │      002.Create.Table.User.sql
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;│  │      003.Create.Table.Feedback.sql
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;│  │      004.Create.Table.Role.sql
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;│  │      005.Create.Function.FN_GetlProductCode.sql
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;│  │      006.Create.Function.USP_CleanFeedback.sql
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;│  │
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;│  ├─Enterprise
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;│  │      001.Create.Table.Highland.sql
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;│  │
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;│  └─Professional  
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;│          001.Create.Table.Lowend.sql
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;│
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;├─V1.1
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;│  ├─Common
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;│  │      001.Alter.Table.User.sql
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;│  │      002.Alter.Function.FN_GetlProductCode.sql
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;│  │      003.Drop.Function.USP_CleanFeedback.sql
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;│  │
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;│  ├─Enterprise  
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;│  │      001.Alter.Table.Highland.sql
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;│  │  
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;│  └─Professional
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;│          001.Alter.Table.Lowend.sql
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;│
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;└─V2.0
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;    ├─Common
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;    │      001.Alter.Table.Product.sql
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;    │      002.Alter.Table.User.sql
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;    │      003.Create.Function.USP_CheckProduct.sql
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;    │
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;    ├─Enterprise
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;    │      001.Create.Table.Overland.sql
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;    │
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;    └─Professional
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;            001.Alter.Table.Lowland.sql
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;            002.Create.Table.Notebook.sql&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;相信上面的目录结构还算明了，我们可以根据软件的版本追溯数据库，而不是通过版本控制工具来追溯原始数据库，而数字序号的前缀，更指明了脚本执行顺序，再也不用因为在建立数据库时受到依赖/外键关系的原因而运行脚本失败了。整个层次非常清晰，头脑通透的 Coder 相信可以一看便明了。&lt;/p&gt;

&lt;p&gt;版本目录下有三个文件夹：Common, Professional, Enterprise，分别代表一个产品的三个定制化版本，因为软件中可能有这样的需求，软件基本结构不变，但是使用提供者模式提供了多个定制化版本，每个提供者的数据库结构基本相同，但是又有极少的差异。通过上面的这种管理机制，可以避免在源代码控制系统中开分支来维护，从某种程度上来说，提高了一定的可维护性。&lt;/p&gt;

&lt;p&gt;这种管理机制类似于 ROR，不过 ROR 更 OO 一些，还能够隔离特定数据；通过这种机制，我们可以结合 &lt;a href=&#34;https://www.rikware.com/RikMigrations.html&#34;&gt;RikMigrations&lt;/a&gt; 或 &lt;a href=&#34;https://code.google.com/p/migratordotnet/&#34;&gt;Migrator.NET&lt;/a&gt; 进行自动化的数据库升级(需要编码)。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c7c501-5415-11e1-986f-96c22c02106a</id>
      <title>数据迁移记</title>
      <link>https://www.zealic.com/2009/07/data-migrate/</link>
      <pubDate>Tue, 28 Jul 2009 15:18:22 +0800</pubDate>
      
      <guid>https://www.zealic.com/2009/07/data-migrate/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;昨天买了块 WD 1TB(黑) 硬盘，之后将原硬盘数据导入，现将所得经验记录在此。&lt;/p&gt;

&lt;p&gt;环境如下：&lt;br /&gt;
三块硬盘，分别为希捷80G，希捷 160G(SATA)，WD 1TB(SATA)&lt;br /&gt;
工具：Win7PE(内置 Ghost, DiskGenius, FastCopy 等工具)&lt;/p&gt;

&lt;p&gt;开始挂上 WD 硬盘打算分区时，电脑死机，经排查发现是电脑的电源不够强力，只能挂两块硬盘(以后要买强力电源啊)；之后在 U 盘中装上 Win7PE，引导进入系统，格式化，分区，拷数据，摘录以下注意事项：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 drvload 装载驱动，我的主板启动的 Win7PE 无法识别 SATA 硬盘，必须安装驱动， Win7 自带的 drvload 命令可以装载驱动，&lt;br /&gt;
因此我将我主板 SATA 驱动提取出来，使用该命令加载，识别成功。&lt;/li&gt;
&lt;li&gt;不要使用 DiskGenius 进行数据迁移，我使用 DiskGenius 的分区拷贝功能迁移数据时，因为修改了目标硬盘的一个分区，导致蓝屏，因此建议不要使用硬盘操作来进行数据迁移。&lt;/li&gt;
&lt;li&gt;使用 FastCopy 进行数据迁移，该软件能够发挥硬盘的最佳效能。&lt;/li&gt;
&lt;li&gt;分区不要太多，整个系统可见分区以六个以下为佳。(单硬盘)&lt;/li&gt;
&lt;li&gt;设一个极小的引导分区，为方便以后引导和维护系统。&lt;/li&gt;
&lt;li&gt;迁移数据时，尽量不要太快删除原有数据，待新数据稳定运行一段时间后再考虑删除，以避免硬盘故障。&lt;/li&gt;
&lt;li&gt;使用足够强劲的电源，避免因挂载过多的硬盘导致供电不足而蓝屏死机。&lt;/li&gt;
&lt;li&gt;信春哥，得永生。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我的硬盘分区如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[WOST_AOE] C: // 系统分区&lt;/li&gt;
&lt;li&gt;[WOST_BAR] D: // 工作分区，如程序代码，程序产生的数据，下载，交换文件 (频繁修改)&lt;/li&gt;
&lt;li&gt;[WOST_JET] E: // 程序、游戏、电影、音乐 、资料(极少修改)&lt;/li&gt;
&lt;li&gt;[WOST_ZIP] F: // 程序、压缩包、光盘镜像等内容的备份(不会修改)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;估计不久(大概5年内)，基于 DOS 的 16 位引导系统维护方式将会消失；而那时，WinXP 也将会死去，Win7 将会成为下一个统治者。&lt;/p&gt;

&lt;p&gt;而 Chrome OS，很遗憾，虽然有很多的 Geeker 和狂热者在使用它，但依然无法撼动 Windows 的地位。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/default">@Default</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c701b1-5415-11e1-bc3b-96c22c02106a</id>
      <title>MSBuild 简解</title>
      <link>https://www.zealic.com/2009/03/msbuild/</link>
      <pubDate>Sat, 28 Mar 2009 14:35:47 +0000</pubDate>
      
      <guid>https://www.zealic.com/2009/03/msbuild/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;从最原始的编译器，逐渐到 Shell 命令组合、Make工具，到现在的针对性 Build 工具，Rake、Ant、MSBuild，甚至于 PowerShell 这样的工具；都为我们软件开发以及系统管理做出了贡献，我甚至不能想象几十年前使用编译器生成程序的复杂步骤(其实就是把 makefile 拆开，相当恐怖)。&lt;/p&gt;

&lt;p&gt;探讨 Make、Ant 以及 MSBuild 无太多意义，甚至从纯技术和扩展性上来说，我认为 MSBuild 弱于 NAnt，但是软件并不是这么简单，之所以深研 MSBuild，M$ 作为后盾让人信任的无奈。&lt;/p&gt;

&lt;p&gt;本文主要讲述 MSBuild 的基本概念，以及如何使用它辅助开发。&lt;/p&gt;

&lt;p&gt;首先我们来看一个最简单的 Build:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Project&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;ToolsVersion=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3.5&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;DefaultTargets=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Build&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.microsoft.com/developer/msbuild/2003&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Welcome&amp;gt;&lt;/span&gt;Hello MSBuild!&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Welcome&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;Target&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Build&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Message&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;$(Hello)&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;8&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Target&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;假设我们把这个文件保存到 _D:\build.proj_，然后在命令行切换工作目录到 _D:_，运行 msbuild.exe (msbuild 默认直接运行当前目录下的 *.sln 或 *.*proj 文件)，则命令行将会显示详细的 build 信息，当然也包括我们的消息 &amp;lsquo;&lt;strong&gt;Hello MSBuild!&lt;/strong&gt;&amp;rsquo; 。&lt;/p&gt;

&lt;h2 id=&#34;概念&#34;&gt;概念&lt;/h2&gt;

&lt;h3 id=&#34;project&#34;&gt;Project&lt;/h3&gt;

&lt;p&gt;Project 代表一个 Build，有属性 ToolsVersion、DefaultTargets、 InitialTargets，分别为 &lt;strong&gt;依赖的 MSBuild 版本、默认 Build 目标，初始化目标。&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&#34;property&#34;&gt;Property&lt;/h3&gt;

&lt;p&gt;Property 是 MSBuild 中的基本单元，可以理解为变量，我们可以在大多数地方使用它作为 Task 的参数以完成我们预期的目标。&lt;br /&gt;
下面的语句示范如何声明 Property：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;Name&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Condition=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;$(Name) == &amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;Kate&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;WorkPath&amp;gt;&lt;/span&gt;D:\Workspace&lt;span class=&#34;nt&#34;&gt;&amp;lt;/WorkPath&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里定义了两个 Property，我们可以使用 $(Name) 和 $(WorkPath) 来引用它们，就和前面的范例一样。&lt;br /&gt;
Property 可以使用 MSBuild 的 /p 参数定义，这里就使用 Condition 属性判断是否存在外部 Name，如果不存在则使用自定义的 &amp;ldquo;Kate&amp;rdquo;。&lt;/p&gt;

&lt;h3 id=&#34;target&#34;&gt;Target&lt;/h3&gt;

&lt;p&gt;Target 是 Build 的基本单元，也对应 MSBuild 的 /t 参数，可用参数有 DependOnTargets，代表依赖的目标。&lt;/p&gt;

&lt;h3 id=&#34;task&#34;&gt;Task&lt;/h3&gt;

&lt;p&gt;Task 即任务，Build 的过程就是若干 Task 的执行。上面的 &lt;Message Text=&#34;...&#34; /&gt; 就是 MSBuild 内置的一个 Task，Text 则是参数。&lt;br /&gt;
Task 可以使用 Condition 属性。&lt;br /&gt;
通常情况下，MSBuild 自带的 Task 并不够用，有以下 MSBuild 扩展，可以几乎不需要自己写扩展：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://msbuildtasks.tigris.org/&#34;&gt;MSBuild Community Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.codeplex.com/sdctasks&#34;&gt;SDC Tasks Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.codeplex.com/MSBuildExtensionPack&#34;&gt;MSBuild Extension Pack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;item&#34;&gt;Item&lt;/h3&gt;

&lt;p&gt;我们可以简单的把 Item 理解为 .Net 中的 Dictionary&lt;string,Dictionary&lt;string,string&gt;&amp;gt; 类型，内层的字典被称作元数据表。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;Table&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Include=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;A;B;C;D&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;Game&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Include=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;StarCraft&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;Game&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Include=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;WarCraft&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;Game&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Include=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;CoderCraft&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;Program&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;Include=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;MyApp&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Developer&amp;gt;&lt;/span&gt;Zealic&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Developer&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Timestamp&amp;gt;&lt;/span&gt;2009-01-01T11:22:33&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Timestamp&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/Program&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;为方便理解，我们可以用 C# 来表述上述内容。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Table&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;()},&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;B&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;()},&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;()},&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;D&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;()}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Game&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;StarCraft&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;WarCraft&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;CoderCraft&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Program&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;MyApp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dictionary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; 
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Developer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Zealic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Timestamp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;2009-01-01T11:22:33&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;和使用 Property 不同，Item 有如下用法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;@(Table)&lt;br /&gt;
&lt;strong&gt;直接传递&lt;/strong&gt; Item 或展开为 &lt;strong&gt;A;B;C;D&lt;/strong&gt; (视 Task 参数类型而定)。&lt;/li&gt;
&lt;li&gt;@(Table, &amp;lsquo;+&amp;rsquo;)&lt;br /&gt;
以指定的分隔符展开 Item，结果为 &lt;strong&gt;A+B+C+D&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;@(Table -&amp;gt; &amp;lsquo;%(Identity).dll&amp;rsquo;)&lt;br /&gt;
转换 Item 为 &lt;strong&gt;A.dll;B.dll;C.dll;D.dll&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;%(Program.Developer)&lt;br /&gt;
引用 Program Item 的元数据 &amp;ldquo;Developer&amp;rdquo;；此外，以这种方式使用 Item 都会导致循环所有 Item 成员。比如 &lt;code&gt;&amp;lt;Message Text=&amp;quot;%(Game.Identity)&amp;quot;/&amp;gt;&lt;/code&gt;，会导致三次 Task 调用，分别输出 StarCraft, WarCraft 以及 CoderCraft；Identity 代表 Item 的名称，有关 Item 的更多预定义元数据，请参考 &lt;a href=&#34;https://msdn.microsoft.com/zh-cn/ms164313(VS.80).aspx&#34;&gt;MSDN&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Item 可以使用 Condition 属性。&lt;/p&gt;

&lt;h2 id=&#34;结语&#34;&gt;结语&lt;/h2&gt;

&lt;p&gt;可能有人会问，既然 MSBuild 和批处理能做的事都差不多，为什么不直接使用批处理呢？&lt;/p&gt;

&lt;p&gt;有以下几点原因：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;与 .Net Framework 紧密集成。&lt;/li&gt;
&lt;li&gt;易于扩展：你可以使用任何 CLR 上的语言编写 MSBuild Task 进行扩展。&lt;/li&gt;
&lt;li&gt;高效率：多个解决方案/项目可以在一个解决方案中编译，甚至支持多核下的并行编译。&lt;/li&gt;
&lt;li&gt;利于诊断：MSBuild 可扩展的日志系统使得 build 过程几乎和白盒没有区别，你可以看到 build 的每一步细节。这也是 VS2003 转到 VS2005 之间最大的转变 - IDE 对编译过程的感知从黑盒转变到白盒。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;此外，利用众多第三方 Task，MSBuild 可以完成诸如持续集成、管理服务器、自动化部署等任务，解放我们的时间，让我们可以有更多的时间 Coding 或偷懒 -_-。&lt;/p&gt;

&lt;p&gt;了解到这些内容以后，聪明的读者，你是否已经打开一个正在开发的项目的 *.csproj 文件，用文本编辑器看看 MSBuild 究竟有什么魔法呢？&lt;/p&gt;

&lt;p&gt;PS：文章写的比较简单，不够全面，有问题请给我妹儿 &lt;img src=&#34;https://byfiles.storage.msn.com/y1pbVPTOAnt4BIOK-4ZDGMBV7vh6YkzWR8o-g2wz6L3HCJ5J6igACrXDij9CsShHxkJrcVYJATaP90?PARTNER=WRITER&#34; alt=&#34;&#34; /&gt; ，我将详细为你解答。或访问&lt;a href=&#34;https://twitter.com/zealic&#34;&gt;我的 Twitter&lt;/a&gt;，里面有不少小技巧。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c701b0-5415-11e1-a1cb-96c22c02106a</id>
      <title>发散性碎片(2008-12-29)</title>
      <link>https://www.zealic.com/2008/12/fragment-2008-12-29/</link>
      <pubDate>Mon, 29 Dec 2008 13:48:46 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/12/fragment-2008-12-29/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;MSBuildExtensionPack&lt;/p&gt;

&lt;p&gt;MSBuild 一直都是 .Net 下 Build 工具的不二选择，可怜开源社区的 &lt;a href=&#34;http://nant.sourceforge.net/&#34;&gt;NAnt&lt;/a&gt; 几乎已经被彻底遗忘。而 MSBuild 则在蓬勃的发展。&lt;/p&gt;

&lt;p&gt;如果老兄你对持续集成 Very 的有兴趣的话，那么如果你不会 MSBuild 的话，我只能拍着你的肩膀说一声：老兄，你真的太老了；让来我们看看 MSBuild 的未来。&lt;/p&gt;

&lt;p&gt;Visual Studio 中的众多项目都是基于 MSBuild 的构建，包括 CodeAnalysis，OfficeTools，ReportingServices，WebApplications 以及 Workflow 等等，有兴趣的同学完全可以翻开 &lt;em&gt;C:Program FilesMSBuild&lt;/em&gt; 目录研读一番。&lt;/p&gt;

&lt;p&gt;有一个例外，Visual C++ 项目在 VS2003、VS2005、VS2008 是基于自己的构建方式，但是这一情况在 VS2010 中将彻底改变为&lt;a href=&#34;http://blogs.msdn.com/somasegar/archive/2008/11/21/c-enhancements-in-vs-2010.aspx&#34;&gt;基于 MSBuild 的构建方式&lt;/a&gt;，同时 Visual C++ 项目的智能感知数据库也会基于 SQLCE，而非以前的 .ncb (这是什么格式，Structured storage ??)。&lt;/p&gt;

&lt;p&gt;最后，Novell 的 &lt;a href=&#34;http://www.mono-project.com/&#34;&gt;Mono&lt;/a&gt; 项目也有一个 MSBuild 的克隆 - &lt;a href=&#34;http://www.mono-project.com/Microsoft.Build&#34;&gt;xbuild&lt;/a&gt;，好吧，我承认它是一个半成品。就目前来说，Mono 真的只是玩具，完全承担不起平台的重任 - 它实在太不稳定了~~&lt;/p&gt;

&lt;p&gt;扯远了，我们来说正题，今日在网上闲逛，发现了一个新的关于 MSBuild 的扩展项目，之前我们有这样的扩展项目可以用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.codeplex.com/sdctasks&#34;&gt;Microsoft&amp;rsquo;s SDC Tasks&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://msbuildtasks.tigris.org/&#34;&gt;MSBuild Community Tasks Project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你的团队很大的话，SDC 是不错的选择，因为它的 TFS 集成度很好，而 Community Tasks 则提供了一大堆功能给你用，无论是模板还是 XML 操作，或生成 AssemblyInfo.cs ，都是手到擒来。&lt;/p&gt;

&lt;p&gt;而现在呢，我们有一个新的扩展 &lt;a href=&#34;http://www.codeplex.com/MSBuildExtensionPack&#34;&gt;MSBuildExtensionPack&lt;/a&gt;，它更加强大(感觉像在看龙珠漫画似的，没有最强，只有更强)，在这里我就厚脸皮的直接摘抄介绍过来哈：&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;MSBuild Extension Pack 3.5.1.0&lt;/em&gt; release provides a collection of over 230 MSBuild tasks.&lt;br /&gt;
A high level summary of what the tasks currently cover includes the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System Items: Certificates, COM+, Console, Date and Time, Drives, Environment Variables, Event Logs, Files and Folders, GAC, Network, Performance Counters, Registry, Services, Sound&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Code: Assemblies, CAB Files, Code Signing, File Detokenisation, GUID’s, Mathematics, Strings, Threads, Xml, Zip Files&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Applications: BizTalk 2006, Email, IIS6, IIS7, MSBuild, SourceSafe, SQL Server 2005, SQL Server 2008, StyleCop, Team Foundation Server, Visual Basic 6, WMI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样众多的 Task 如果配合 &lt;a href=&#34;http://en.wikipedia.org/wiki/Windows_PowerShell&#34;&gt;Windows PowerShell&lt;/a&gt; 以及 &lt;a href=&#34;http://ccnet.thoughtworks.com/&#34;&gt;CC.Net&lt;/a&gt;，只要你的团队或者 PM 不是烂的过分，在这些工具的帮助下，效率肯定直线上升，您的项目奖金也唾手可得啦。:)&lt;/p&gt;

&lt;h1 id=&#34;messagebox&#34;&gt;MessageBox&lt;/h1&gt;

&lt;p&gt;通常看到 MessageBox 弹出时，如果需要其中的信息，一般用手打或者用 Spy++  取其中的文字。结果现在才发现，MessageBox 支持 Ctrl+C，即复制功能，直接复制文本到剪切板。&lt;/p&gt;

&lt;p&gt;是我孤陋寡闻，还是地球人都不知道？&lt;/p&gt;

&lt;h2 id=&#34;subversion-的-log-c-错误&#34;&gt;Subversion 的 log.c 错误&lt;/h2&gt;

&lt;p&gt;使用 svnserve 作为 Subversion service 时，查看日志时可能会出现 ..libsvn_reposlog.c 这样的错误，这时只要在你的 authz 配置中加上 &lt;em&gt;* = r&lt;/em&gt; 即可。&lt;/p&gt;

&lt;p&gt;参考 ：&lt;a href=&#34;http://www.nabble.com/Show-Log-Error-td19145692.html&#34;&gt;http://www.nabble.com/Show-Log-Error-td19145692.html&lt;/a&gt;&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c6daa2-5415-11e1-8302-96c22c02106a</id>
      <title>Google Toolbar 5</title>
      <link>https://www.zealic.com/2008/12/google-toolbar-5/</link>
      <pubDate>Sun, 28 Dec 2008 14:50:06 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/12/google-toolbar-5/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;Google Toolbar 5 已经发布正式版，并且自动更新到我的计算机上，兼容性和 TheWorld 没有问题，以下是新功能：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在线保存配置，现在可以把你的 Toolbar 的配置保存在 Google 上，这样在异地使用 Toolbar 时，将有一致的体验，再也不用在其他地方使用电脑时重新配置 Toolbar 了。&lt;/li&gt;
&lt;li&gt;新的选项 UI，比以前漂亮多了。&lt;/li&gt;
&lt;li&gt;自动填表，很多浏览器都有的功能，当然 - IE 没有。&lt;/li&gt;
&lt;li&gt;Google Notebook 功能集成，功能和 Firefox 的 Google Notebook 插件完全相同。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;总的来说，感觉不错，唯一的缺点就是似乎比老版本速度慢了那么一点。&lt;/p&gt;

&lt;p&gt;另外 Firefox 的 Google Toolbar 5 依旧在 Beta 中。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/default">@Default</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c6b390-5415-11e1-9d15-96c22c02106a</id>
      <title>简析 Google Gadget 的数据丢失原因</title>
      <link>https://www.zealic.com/2008/12/analyse-why-google-gadget-lost-data/</link>
      <pubDate>Wed, 24 Dec 2008 14:35:47 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/12/analyse-why-google-gadget-lost-data/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;崇尚 GTD 的人不少，诸如 TodoList 和便签之类的工具也有很多人使用，但我听说很多人使用 Google 提供的 &lt;a href=&#34;https://www.google.com/ig/directory?url=www.google.com/ig/modules/todo.xml&#34;&gt;TodoList Gadget&lt;/a&gt; 以及 &lt;a href=&#34;https://www.google.com/ig/directory?url=www.google.com/ig/modules/sticky.xml&#34;&gt;Sticky Note Gadget&lt;/a&gt; 时，丢失过数据，之后就再也不使用了，出于某种目的，我研究了下其中的原因。&lt;/p&gt;

&lt;p&gt;试用过  &lt;a href=&#34;https://www.google.com/ig&#34;&gt;iGoogle&lt;/a&gt; 的人都应该知道 iGoogle 可以在线保存配置。这样在其他地点使用 iGoogle 时，还能保持 Gadgets 不变，同时 iGoogle 也提供导出配置为 xml 的功能，我通过查看其 XML 的格式，发现诸如 &lt;a href=&#34;https://www.google.com/ig/directory?url=www.google.com/ig/modules/todo.xml&#34;&gt;TodoList Gadget&lt;/a&gt; 以及 &lt;a href=&#34;https://www.google.com/ig/directory?url=www.google.com/ig/modules/sticky.xml&#34;&gt;Sticky Note Gadget&lt;/a&gt; 这样的 Gadget 皆是将数据保存在 iGoogle 的配置中的 &amp;mdash; API 允许这么做。&lt;/p&gt;

&lt;p&gt;因此，得出的结论是：使用 iGoogle &lt;a href=&#34;https://www.google.com/ig/directory?url=www.google.com/ig/modules/todo.xml&#34;&gt;TodoList Gadget&lt;/a&gt; 以及 &lt;a href=&#34;https://www.google.com/ig/directory?url=www.google.com/ig/modules/sticky.xml&#34;&gt;Sticky Note Gadget&lt;/a&gt; 时，必须小心留意你的配置文件，无论是删除 Gadget 还是还原、清空备份文件，都会导致你的 Gadget 数据丢失。&lt;/p&gt;

&lt;p&gt;其实，要用 TodoList 的话，&lt;a href=&#34;https://www.rememberthemilk.com/&#34;&gt;Remember The Milk&lt;/a&gt; 是不错的选择。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c6b38f-5415-11e1-aa57-96c22c02106a</id>
      <title>在 Windows 2003 下安装 Windows Live</title>
      <link>https://www.zealic.com/2008/12/install-windows-live-on-windows-2003/</link>
      <pubDate>Mon, 08 Dec 2008 04:53:53 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/12/install-windows-live-on-windows-2003/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;类似 Windows Live 及 Windows Media Player 的安装程序都是无法直接安装到系统，一直都为此而苦恼。&lt;/p&gt;

&lt;p&gt;突发奇想如果 Hook GetVersionEx 这样的 API 来欺骗系统的版本号，不就可以搞定了吗？&lt;/p&gt;

&lt;p&gt;搜之，已经有这样的软件了，于是 Down 之，可以安装 Live 了~~~&lt;/p&gt;

&lt;p&gt;这么好的东西怎么能不分享给大家呢？&lt;/p&gt;

&lt;p&gt;系统魔法师 v3.1(Verset)&lt;/p&gt;

&lt;p&gt;下载地址：&lt;a href=&#34;https://www.rayfile.com/zh-cn/files/0eb4666e-4a76-11dd-96fb-00142218fc6e/&#34;&gt;https://www.rayfile.com/zh-cn/files/0eb4666e-4a76-11dd-96fb-00142218fc6e/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;该软件来自：&lt;a href=&#34;https://handytool.net/index.php/2008/07/verset31/&#34;&gt;https://handytool.net/index.php/2008/07/verset31/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;同样，该方法也可用于在服务器上安装非服务器版软件或者在非服务器上安装服务器软件，比如卡巴7这样。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/default">@Default</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c68c80-5415-11e1-8757-96c22c02106a</id>
      <title>乱弹用户资源</title>
      <link>https://www.zealic.com/2008/12/user-resources/</link>
      <pubDate>Fri, 05 Dec 2008 13:30:00 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/12/user-resources/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;一个企业无论在何种阶段，如何掌握更多的用户，并且让用户具有更高的粘性，是必修的课题。&lt;/p&gt;

&lt;p&gt;在中国，大多数网民上网都必备一个腾讯公司的 QQ 号码，在某种程度上来说，没有 QQ 号码，就可以称作火星人；造成这种原因的情况的是有历史原因的；在大约95-99年的时候，中国兴起一股晚到的互联网浪潮，可以说中国的第一批真正意义上的网民就是从中诞生的。&lt;br /&gt;
此时，信息交流所必须的一种工具，在中国以一种较新的方式，它就是 OICQ 即我们现在所熟知 QQ，从名字上就可知 QQ 当时是模仿 ICQ 诞生的，仅有最简单的聊天功能，而就是这种最简单的功能，成就了中国互联网的基石。我甚至可以断言，即使在今天，如果 QQ 这样的软件全部消失，绝对会造成中国互联网的恐慌。&lt;/p&gt;

&lt;p&gt;腾讯掌握了中国的网民的数量可说为中国最多也不过，这里就牵扯到我们要讨论的话题：核心用户资源。&lt;/p&gt;

&lt;p&gt;这里我么可以理解用户资源为一个用户的帐户，具有很高黏度的那种帐户；因为时代原因，中国和欧美国家的互联网信息构成模式有很大不同；欧美国家的构成模式为 邮件/邮件列表/新闻组/门户，中国的构成模式为 即时聊天/论坛/门户，到目前的 Web 2.0 时代，又多了 博客/RSS/Twitter 这样的信息构成。&lt;/p&gt;

&lt;p&gt;但到目前为止，邮件始终是互联网的基石，这一点在中国不是太明显，多数中国 Web 公司都有自己的用户群和帐户系统，但是这些都是松散的结构，统一及多网站交互非常困难。&lt;br /&gt;
像百度这样虽然推出了众多的服务，但是却没有为用户提供邮件帐户，并不能增加用户黏性，目前黏性最大的服务即是百度贴吧，但我更多将他看做提供娱乐交流的服务，用户虽众多，但是并不牢靠，娱乐毕竟不能产生真正有价值的东西。&lt;/p&gt;

&lt;p&gt;而腾讯 QQ 掌握中国绝大部分用户，也可算雄霸一方，但其小气吝啬的作风让很多人都不爽，他的巨大可说是建立在中国网民素质(计算机素质)普遍不高的情况下。当网民素质普遍提高以后，并且对于即时聊天的以来减少以后，消亡也是迟早。&lt;br /&gt;
不过就目前来看，似乎很难，因为腾讯通过 QQ 巨大的用户群为平台，展开一系列的如 QQ空间、QQ游戏 等捆绑行为，试图将增加用户黏性，但用户群始终难以扩大，依旧固定在较年轻人群这一群体，因此，未来就很难说了。&lt;/p&gt;

&lt;p&gt;更能让人看好的是豆瓣这样 Web 2.0 网站，通过共性聚集的人群黏性不是一般强！&lt;br /&gt;
我始终相信，只要掌握了中国的邮件帐户，就掌握了中国的互联网核心用户资源。&lt;/p&gt;

&lt;p&gt;现在是 Web 2.0 时代，未来的发展方向肯定是 Web 与桌面结合；Web 是不可阻挡的趋势，Google 和 Microsoft 两个死对头都推出了自己的解决方案。&lt;/p&gt;

&lt;p&gt;Google 为我们提供的解决方案是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Docs

&lt;ul&gt;
&lt;li&gt;Word&lt;/li&gt;
&lt;li&gt;Spreadsheet&lt;/li&gt;
&lt;li&gt;Presentation&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Google Sites&lt;/li&gt;
&lt;li&gt;Google Notebook&lt;/li&gt;
&lt;li&gt;Google Calendar&lt;/li&gt;
&lt;li&gt;Google Mail&lt;/li&gt;
&lt;li&gt;Google Reader&lt;/li&gt;
&lt;li&gt;Google Picasa&lt;/li&gt;
&lt;li&gt;Google Talk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft 为我们提供的是 Windows Live 一整套解决方案。Live 试图打造一个统一的品牌：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Office Live

&lt;ul&gt;
&lt;li&gt;Word&lt;/li&gt;
&lt;li&gt;Excel&lt;/li&gt;
&lt;li&gt;PowerPoint&lt;/li&gt;
&lt;li&gt;Note&lt;/li&gt;
&lt;li&gt;List&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Live Writer&lt;/li&gt;
&lt;li&gt;Live Photo&lt;/li&gt;
&lt;li&gt;Live Mail&lt;/li&gt;
&lt;li&gt;Live Messenger&lt;/li&gt;
&lt;li&gt;Live SkyDrive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;而我呢。现在则正在烦恼到底用微软解决方案还是 Google 的解决方案；从根本上说我是喜欢微软解决方案的(有因为自己是 .Net Developer 的因素在内)，毕竟可以和 Office Outlook 之类的无缝整合，但是 Google 的服务确实好用。所以目前其实是混合，用 Google 的服务比较多，如果 Google 还在拖延 Google Drive 的推出，我就会毫不犹豫的投向 Microsoft 的服务了。&lt;/p&gt;

&lt;p&gt;目前使用的服务有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Reader&lt;/li&gt;
&lt;li&gt;Google History&lt;/li&gt;
&lt;li&gt;Google Notebook&lt;/li&gt;
&lt;li&gt;Google Mail&lt;/li&gt;
&lt;li&gt;Google Docs&lt;/li&gt;
&lt;li&gt;Live Space&lt;/li&gt;
&lt;li&gt;Live SkyDrive&lt;/li&gt;
&lt;li&gt;Live Writer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;胡言乱语一通，哈哈，看官勿笑。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/business">Business</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c63e5e-5415-11e1-9207-96c22c02106a</id>
      <title>SVN 简单备份与还原</title>
      <link>https://www.zealic.com/2008/11/svn-easy-backup-and-restore/</link>
      <pubDate>Wed, 26 Nov 2008 13:25:00 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/11/svn-easy-backup-and-restore/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;备份 SVN 仓库是很麻烦的事，而 Coder 通常是很怕麻烦的人，于是 Zealic  就为减少麻烦，花了一点麻烦的时间，写了两个麻烦的脚本，解决了这个麻烦的问题。&lt;/p&gt;

&lt;h2 id=&#34;1-备份脚本-dumpall-bat&#34;&gt;1. 备份脚本 DumpAll.bat&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-batch&#34; data-lang=&#34;batch&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:==================== &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Author : Zealic&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Version : 1.00&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: FileName : DumpAll.bat&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Summary : Dump 当前目录的所有 Svn 仓库，脚本将备份当前目录下的所有SVN仓库，&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:   本脚本依赖于 7za.exe 程序，请到下述连接下载程序&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:   https://downloads.sourceforge.net/sevenzip/7za457.zip&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Update : 2008-11-26&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:====================&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; OFF
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;VARDATE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;dir&lt;/span&gt; /B /AD &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; DIRS
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;EXIST&lt;/span&gt; DUMPFILES &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;DEL&lt;/span&gt; /Q DUMPFILES
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FOR&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;/F&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;%%&lt;/span&gt;i &lt;span class=&#34;k&#34;&gt;IN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;DIRS&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;DO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;REPOSNAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;%%&lt;/span&gt;i
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;CALL&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;DUMPREPOS&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;REPOSNAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt;.
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Compressing dump files...
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;7za a Repos&lt;span class=&#34;nv&#34;&gt;%VARDATE%&lt;/span&gt;.7z *.bin
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Delete dump files...
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;FOR&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;/F&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;%%&lt;/span&gt;i &lt;span class=&#34;k&#34;&gt;IN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;DUMPFILES&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;DO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;DEL&lt;/span&gt; /Q &lt;span class=&#34;se&#34;&gt;%%&lt;/span&gt;i
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEL&lt;/span&gt; /Q DIRS
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEL&lt;/span&gt; /Q DUMPFILES
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Successed.
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;GOTO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;EOF&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:==== Functions ====&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;DUMPREPOS&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;DUMPFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;.bin
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Dumping repository &lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt; ...
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;svnadmin dump &lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt; -q &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%DUMPFILE%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%errorlevel%&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;0 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%DUMPFILE%&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; DUMPFILES
&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;ELSE&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;DEL&lt;/span&gt; /Q &lt;span class=&#34;nv&#34;&gt;%DUMPFILE%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Dump &lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt; failed.
&lt;span class=&#34;ln&#34;&gt;47&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;48&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;DUMP_FILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;49&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt;.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;2-还原脚本-loadall-bat&#34;&gt;2. 还原脚本 LoadAll.bat&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-batch&#34; data-lang=&#34;batch&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:==================== &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Author : Zealic &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Version : 1.00 &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: FileName : LoadAll.bat &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Summary : Load Svn 仓库，确保当前目录为没有任何子目录， &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:  脚本将搜索当前目录下的 *.bin 文件，自动为其创建仓库并 Load Dump文件。 &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;: Update : 2008-11-26 &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:==================== &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; OFF
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;VARISEMPTYDIR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;TRUE
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;dir&lt;/span&gt; /B /AD &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; DIRS
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FOR&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;/F&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;%%&lt;/span&gt;i &lt;span class=&#34;k&#34;&gt;IN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;DIRS&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;DO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;VARISEMPTYDIR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;FALSE
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEL&lt;/span&gt; /Q DUMPFILES
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%VARISEMPTYDIR%&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;FALSE&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Error &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;Current&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt; directory is not empty.&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;GOTO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;EOF&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;VARISEMPTYDIR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;dir&lt;/span&gt; /B /A-D *.bin &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; DUMPFILES
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%errorlevel%&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Finded dump file.
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;ELSE&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Error &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;Can&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt; not find dump file.&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;GOTO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;EOF&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FOR&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;/F&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;%%&lt;/span&gt;i &lt;span class=&#34;k&#34;&gt;IN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;DUMPFILES&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;DO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;REPOSFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;%%&lt;/span&gt;i
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;CALL&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;LOADREPOS&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;REPOSFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEL&lt;/span&gt; /Q DUMPFILES
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Successed.
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;GOTO&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;EOF&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;:==== Functions ====&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;LOADREPOS&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;REPOSNAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%REPOSFILE:~0,-4%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Loading repository &lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt; ...
&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;svnadmin create &lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;svnadmin load -q &lt;span class=&#34;nv&#34;&gt;%cd%%REPOSNAME%&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%REPOSFILE%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;47&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%errorlevel%&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;0 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;48&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;%DUMPFILE%&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; DUMPFILES
&lt;span class=&#34;ln&#34;&gt;49&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;ELSE&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;50&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;RMDIR&lt;/span&gt; /Q &lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;51&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt; Load &lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%REPOSNAME%&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;^&amp;#34;&lt;/span&gt; failed.
&lt;span class=&#34;ln&#34;&gt;52&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;53&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SET&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;REPOSNAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;54&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ECHO&lt;/span&gt;.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;麻烦解决之，所以可以去娱乐了。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c5f041-5415-11e1-a017-96c22c02106a</id>
      <title>发散性碎片(2008-11-14)</title>
      <link>https://www.zealic.com/2008/11/fragment-2008-11-14/</link>
      <pubDate>Fri, 14 Nov 2008 16:33:00 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/11/fragment-2008-11-14/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;h1 id=&#34;1-因源&#34;&gt;1. 因源&lt;/h1&gt;

&lt;p&gt;很多时候，我们上网，总会碰到些自己感兴趣的小东西，了解了其一点信息，然后我们有据此延伸到其他的东西，这样的状态，也算是上网冲浪的一种；而对于我们程序员来说，感兴趣的自然和编程有关。&lt;/p&gt;

&lt;p&gt;这些看过的东西，说不定我们什么时候就会忘记，于是乎就想记录下来；你说单独把看到的东西独立成文吧，内容太少，干脆就以写杂文的心态，把觉得有用的通通写下来。这样的话内容可能有些杂乱，又想，就当锻炼文笔好了，写博客嘛，有些东西可以不用太计较。&lt;/p&gt;

&lt;p&gt;想不出什么标题，于是随意起个发散性碎片的名称，以后亦会如此。&lt;/p&gt;

&lt;h1 id=&#34;2-碎片啊碎片&#34;&gt;2. 碎片啊碎片&lt;/h1&gt;

&lt;h2 id=&#34;2-1-subversion&#34;&gt;2.1 Subversion&lt;/h2&gt;

&lt;p&gt;话说本人辞职有一段时间，好好的放纵些时候，回到家中已是很久没有学习和钻研“科学技术”了，于是乎开始搜索 SVN 这个自己一直很感兴趣的东西。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://subversion.tigris.org/&#34;&gt;Subversion&lt;/a&gt;&lt;br /&gt;
目前版本已经升级到 1.5.4 了，应该算稳定，还在观望的同学可以考虑升级到 1.5.x 系列，没有用过这东西的也推荐来试试。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ankhsvn.open.collab.net/&#34;&gt;AnkhSVN&lt;/a&gt;&lt;br /&gt;
2.0 发布，全面重写了 1.0 版本的 AnkhSVN，现在是一个 Visual Studio SCC Plugin，并且现在是以 &lt;a href=&#34;https://sharpsvn.open.collab.net/&#34;&gt;SharpSVN&lt;/a&gt; 这个 .Net 包装过的 Binding 用来访问 SVN 数据仓库(SharpSVN 将会以 Subversion 的官方 .Net Binding 的姿态出现，对此我很高兴)。&lt;/li&gt;
&lt;li&gt;Subversion &lt;a href=&#34;https://www.subversion.org.cn/submerged/?p=64&#34;&gt;将对于 HTTP 更加友好&lt;/a&gt;&lt;br /&gt;
不过大概是明年或更久远的事情，其实我更希望 SVN 能够运行于其他更多 Web Server 之上，比如 IIS、lighttpd、nginx 等等。&lt;br /&gt;
关注 Subversion，可以通过以下网站：

&lt;ul&gt;
&lt;li&gt;Submerged 的博客(Subversion 项目技术领导) :&lt;br /&gt;
中文版(感谢热心者的汉化与维护) : &lt;a href=&#34;https://www.subversion.org.cn/submerged/&#34;&gt;https://www.subversion.org.cn/submerged/&lt;/a&gt;&lt;br /&gt;
原版 : &lt;a href=&#34;https://blogs.open.collab.net/svn/&#34;&gt;https://blogs.open.collab.net/svn/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;2-2-collabnet&#34;&gt;2.2 CollabNet&lt;/h2&gt;

&lt;p&gt;CollabNET 是一家专业致力于使用开源软件来提供企业级协作软件及服务的公司。这里由于他是 Subversion 项目的所有者，所以我多关心了下(以前就知道，不过没啥兴趣)，CollabNet 提供的 &lt;a href=&#34;https://www.collab.net/products/cee/&#34;&gt;CollabNet Enterprise Edition&lt;/a&gt; 和 &lt;a href=&#34;https://www.collab.net/products/sfee/&#34;&gt;CollabNet SourceForge Enterprise&lt;/a&gt; 都属于重量级的项目管理工具，项目管理其实只是他们功能的一部分，我从&lt;a href=&#34;https://www.computertelecom.com.cn/cn/infomation_xx.asp?id=175&#34;&gt;这里&lt;/a&gt;摘抄了一些介绍，供同学们参考：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SourceForge Enterprise Edition（SFEE）
作为一家年盈利上亿的企业，CollabNet的核心产品并非Subversion一种。作为 CollabNet 最高端的产品，SFEE 能为企业用户提供开放源代码的平台支持。它是满足分布式协作开发需求、100% Web 化的开发平台。它集成了软件配置管理、需求定义、缺陷追踪、文档管理与文档评审、沟通与协作管理、Wiki、项目管理、知识搜索和文件发布管理等众多功能。&lt;/li&gt;
&lt;li&gt;CollabNet Enterprise Edition（CEE）
CEE（CollabNet Enterprise Edition）是 CollabNet 的协作化开发管理平台，它向用户提供甚至比 SourceForge 平台功能更加强大、可靠性更高的协作平台，诸如 HP、Intel、SUN、BEA 等全球性大公司都使用CEE来构建分布式开发协作平台。可以这样说，CEE 和 SourceForge 是目前市场占有率最高的两个协作开发平台。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;2-3-文档&#34;&gt;2.3 文档&lt;/h2&gt;

&lt;p&gt;然后我又因为一个现在已经忘记的关联，对文档产生了兴趣；恩恩，像 MSDN 风格那样漂亮的文档，我知道以前有两个项目，开源的 &lt;a href=&#34;https://ndoc.sourceforge.net/&#34;&gt;NDoc&lt;/a&gt; 和 微软的 &lt;a href=&#34;https://www.codeplex.com/Sandcastle&#34;&gt;Sandcastle&lt;/a&gt;，NDoc 早已停止开发，就在微软公布 Sandcastle 不久之后。
NDoc 仅支持 .Net 1.1，网上也有一些修改后支持 2.0 的版本，不过现在都 3.5 马上 4.0 了，我想用的人估计很少；此外还有两个基于 NDoc 的项目 &lt;a href=&#34;https://ndoc-reloaded.sourceforge.net/&#34;&gt;NDoc Reloaded&lt;/a&gt; 和 &lt;a href=&#34;https://sourceforge.net/projects/ndoc3/&#34;&gt;NDoc3&lt;/a&gt;，NDoc Reloaded 的发起人是本国人，不过似乎作者似乎把这个遗忘了，而 NDoc3 就不同了，在 SF.Net 上有高达 99.44% 的 Activity，值得关注。
Sandcastle 则没什么好说的，估计大多数人都用过了，等我过段时间试用 NDoc3 和 Sandcastle 后再细细写篇博文供大家参考。&lt;/p&gt;

&lt;h2 id=&#34;2-4-其他&#34;&gt;2.4 其他&lt;/h2&gt;

&lt;p&gt;在 Google 的过程中，我还发现了一个小东西，很有使用价值，不过似乎已经过期了。&lt;br /&gt;
&lt;a href=&#34;https://www.codeplex.com/MVPXML/Release/ProjectReleases.aspx?ReleaseId=77&#34;&gt;XPathmania&lt;/a&gt;，一个 VS2005 的插件，可以在 VS 中打开 XML 文件时，执行 XPath 查询，相当方便，效果可以看&lt;a href=&#34;https://felixmondelo.blogspot.com/2007/12/xpath-inside-biztalk.html&#34;&gt;这里&lt;/a&gt;。&lt;/p&gt;

&lt;h1 id=&#34;3-完了&#34;&gt;3.完了&lt;/h1&gt;

&lt;p&gt;完了，天已经黑的不能再黑了，夜魔要来抓我了，赶紧休息吧。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c4ded2-5415-11e1-a320-96c22c02106a</id>
      <title>动态链接库重定向技术</title>
      <link>https://www.zealic.com/2008/06/dll-dynamic-redirect/</link>
      <pubDate>Sun, 15 Jun 2008 16:07:33 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/06/dll-dynamic-redirect/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;Windows 有一种方法可以缓解传说种的 DLL Hell，即&lt;strong&gt;动态链接库重定向技术。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这种简单技术的实现方法如下：&lt;/p&gt;

&lt;h2 id=&#34;场景&#34;&gt;场景：&lt;/h2&gt;

&lt;p&gt;应用程序 a.exe 依赖动态链接库 compoent.dll 1.0 版本。但是用户的另一个软件 b 在系统的系统目录安装了 component.dll 2.0 版本，这两个版本完全不兼容，&lt;/p&gt;

&lt;p&gt;因此，Windows 在加载 component.dll 的时候，会直接加载系统目录中的 component.dll，这就造成了 a.exe 程序无法运行，如果这时用户需要同时使用两个软件，就会造成所谓的 DLL Hell。&lt;/p&gt;

&lt;h2 id=&#34;使用动态链接库重定向技术解决-dll-hell&#34;&gt;使用动态链接库重定向技术解决 DLL Hell :&lt;/h2&gt;

&lt;p&gt;这里有两种方法可以实现动态链接库重定向技术。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;创建 a.exe.local 文件，该文件内容为空。&lt;br /&gt;
这时系统就会强制使 a.exe LoadLibrary 时先在 a.exe 所在的目录下查找要加载的动态库，之后才到系统目录下寻找。这个解决方法适用于两个不同的应用。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;创建 a.exe.local 目录，将 a.exe 依赖的库放入其中。&lt;br /&gt;
这时系统就会强制使 a.exe LoadLibrary 时先在 a.exe.local 目录下查找要加载的动态库，之后才到系统目录下寻找。这个解决方法适用于单个应用中存在两个应用程序，并且以来同名但是互不兼容的库。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;动态链接库重定向技术实际上是 M$ 修改了 LoadLibrary(Ex) 的代码，使其在调用时先检测是否存在 &lt;AppName&gt;.local 文件或目录实现重定向的。它是作为临时解决 DLL HELL 的方法。并且，当应用程序存在 Manifest 时，该技术将不会起作用。&lt;/p&gt;

&lt;p&gt;参考 ： &lt;a href=&#34;https://msdn.microsoft.com/en-us/library/ms682600(VS.85).aspx&#34;&gt;https://msdn.microsoft.com/en-us/library/ms682600(VS.85).aspx&lt;/a&gt;&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c490b0-5415-11e1-8681-96c22c02106a</id>
      <title>SilverLight 与移动平台</title>
      <link>https://www.zealic.com/2008/05/silverlight-and-mobile-platform/</link>
      <pubDate>Sat, 24 May 2008 07:25:31 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/silverlight-and-mobile-platform/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;SilverLight 今年将会&lt;a href=&#34;http://news.cnet.com/8301-10784_3-9884398-7.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1001_3-0-5&#34;&gt;支持部分主流移动平台&lt;/a&gt;，包括 Nokia S60 以及 Windows Mobile 6 系统，届时移动平台上将会有更炫的用户体验，这也真正实现了 SilverLight 当初的跨平台承诺。&lt;/p&gt;

&lt;p&gt;反观现在还在襁褓中的 &lt;a href=&#34;http://code.google.com/android/&#34;&gt;Android&lt;/a&gt;，在我看来虽然技术起点很高，拥有一个 Java SE 的有限子集以及开源社区的诸多代码可供复用，强过 J2ME 太多，可惜到目前为止依旧是一个空中楼阁。&lt;a href=&#34;http://www.mono-project.com/&#34;&gt;Mono&lt;/a&gt; 项目中有一个子项目 &lt;a href=&#34;http://www.mono-project.com/Moonlight&#34;&gt;Moonlight&lt;/a&gt; ，是 SilverLight 的 Linux 移植，不知道到时候会不会移植到 Android，听说 Mono 的项目负责人对 Android 是&lt;a href=&#34;http://tirania.org/blog/archive/2007/Nov-13-1.html&#34;&gt;很感兴趣&lt;/a&gt;的哦，想把 Mono 移植过去；更为疯狂的是，iPhone 也有份，并且&lt;a href=&#34;http://tirania.org/blog/archive/2008/Mar-10.html&#34;&gt;已经有实现&lt;/a&gt;了。&lt;/p&gt;

&lt;p&gt;另外还发现了一个 for Android 平台的 Web-Server： &lt;a href=&#34;http://code.google.com/p/i-jetty/&#34;&gt;iJetty&lt;/a&gt;，以后有得玩了。&lt;/p&gt;

&lt;p&gt;我对移动开发产生兴趣了。&lt;/p&gt;

&lt;p&gt;最后，再惊叹一个：&lt;a href=&#34;https://wiki.opensource.nokia.com/projects/PAMP&#34;&gt;PAMP&lt;/a&gt;(Personal Apache MySQL PHP)，用于 Nokia 的 S60 系统，这个想法很好很强大，我很早就想这么做了，在上面跑一个 &lt;a href=&#34;http://www.mediawiki.org/&#34;&gt;MediaWiki&lt;/a&gt; 是多么美好的一件事啊~~&lt;/p&gt;

&lt;p&gt;PAMP 的项目地址 : &lt;a href=&#34;https://sourceforge.net/projects/pamp/&#34;&gt;https://sourceforge.net/projects/pamp/&lt;/a&gt;&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c41b81-5415-11e1-b6ea-96c22c02106a</id>
      <title>Linux 下的 Apache &#43; FastCGI 部署 ROR 应用</title>
      <link>https://www.zealic.com/2008/05/linux-apache-fastcgi-ror-app/</link>
      <pubDate>Tue, 20 May 2008 19:21:47 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/linux-apache-fastcgi-ror-app/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;介绍如何在 Linux 下部署 Apache + FastCGI 的 ROR 应用。&lt;/p&gt;

&lt;h2 id=&#34;1-安装-ror-环境&#34;&gt;1) 安装 ROR 环境&lt;/h2&gt;

&lt;p&gt;这里假设你的机器为干净的机器，我使用的是 ubuntu-alternate 8.04 命令行安装模式，下面的脚本适合 debian 系的发行版，理论上不兼容 RedHat 系的发行版。&lt;/p&gt;

&lt;p&gt;为方便起见，我将安装 ROR 环境写了一个 SHELL 脚本，直接执行即可方便的安装 ROR 环境，这里使用的 RAILS 版本为 2.0.2。&lt;/p&gt;

&lt;p&gt;请使用 sudo 前缀执行该脚本：&lt;/p&gt;

&lt;p&gt;install_ror.sh&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;INSTALL_HOME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;~/ror_installer
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; INSTALL_HOME directory &lt;span class=&#34;s2&#34;&gt;&amp;#34;~/ror_installer&amp;#34;&lt;/span&gt; already exist.
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;mkdir &lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pushd&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Download files&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;  apt-get -d -y install ruby libruby-extras libyaml-ruby &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    libzlib-ruby libiconv-ruby libxml-ruby libdbi-ruby &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    libmysql-ruby libdbd-mysql-ruby libdbd-sqlite3-ruby libfcgi-ruby1.8
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/35283/rubygems-1.1.1.tgz
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/29353/actionmailer-2.0.2.gem
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/29350/actionpack-2.0.2.gem
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/29551/activerecord-2.0.2.gem
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/29552/activeresource-2.0.2.gem
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/29553/activesupport-2.0.2.gem
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/29554/rails-2.0.2.gem
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/29751/rake-0.8.1.gem
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Install ruby&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;  apt-get -y install ruby libruby-extras libyaml-ruby &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    libzlib-ruby libiconv-ruby libxml-ruby libdbi-ruby &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    libmysql-ruby libdbd-mysql-ruby libdbd-sqlite3-ruby libfcgi-ruby1.8
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Install rubygems&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;  tar xfv rubygems-1.1.1.tgz
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;pushd&lt;/span&gt; rubygems-1.1.1
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;    ruby setup.rb
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;    ln -s /usr/bin/gem1.8 /usr/bin/gem
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;popd&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Install Gem&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;  gem install rails -l --no-ri --no-rdoc
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;  
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Clean&lt;/span&gt; 
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;popd&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;rm -rf &lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;2-安装-apache&#34;&gt;2) 安装 Apache&lt;/h2&gt;

&lt;p&gt;同样是 SHELL 脚本安装，请使用 sudo 前缀执行该脚本：&lt;/p&gt;

&lt;p&gt;install_apache2.sh&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Download files&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;apt-get -d -y install apache2 libapache2-mod-fcgid
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Install apache&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;apt-get -y install apache2 libapache2-mod-fcgid
&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;3-配置-apache&#34;&gt;3) 配置 Apache&lt;/h3&gt;

&lt;p&gt;ROR 应用的 Apache 配置，在 /etc/apache2/apache2.conf 的末尾添加以下代码：&lt;br /&gt;
apache2.conf&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-apache&#34; data-lang=&#34;apache&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Include&lt;/span&gt; &lt;span class=&#34;sx&#34;&gt;/etc/apache2/httpd.conf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改 httpd.conf 为以下内容：&lt;br /&gt;
httpd.conf&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-apache&#34; data-lang=&#34;apache&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; RAILS_ENV production
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Alias&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/redmine&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/var/www/redmine/public/&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Directory&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/var/www/redmine/public/&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;Options&lt;/span&gt; Indexes ExecCGI
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;FollowSymLinks&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;  AllowOverride &lt;span class=&#34;k&#34;&gt;all&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;Order&lt;/span&gt; Deny, Allow
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;Allow&lt;/span&gt; from &lt;span class=&#34;k&#34;&gt;All&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/redmine/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;AddHandler&lt;/span&gt; fcgid-script .fcgi
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;FCGIWrapper&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/bin/ruby /var/www/redmine/public/dispatch.fcgi&amp;#34;&lt;/span&gt; .fcgi
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteEngine&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;on&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteBase&lt;/span&gt; &lt;span class=&#34;sx&#34;&gt;/redmine&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^$ index.html [QSA]
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^([^.]+)$ $1.html [QSA]
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^(.*)$ dispatch.fcgi?$1 [QSA,L]
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;4-配置-ror-应用&#34;&gt;4) 配置 ROR 应用&lt;/h2&gt;

&lt;p&gt;配置 ROR 应用，这里为方便期间，直接使用 sqlite3，ROR 程序为 &lt;a href=&#34;http://www.redmine.org/&#34;&gt;redmine&lt;/a&gt;。&lt;br /&gt;
请使用 sudo 前缀执行该脚本：&lt;br /&gt;
install_app.sh&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;INSTALL_HOME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;~/install_redmine
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; INSTALL_HOME directory &lt;span class=&#34;s2&#34;&gt;&amp;#34;~/install_redmine&amp;#34;&lt;/span&gt; already exist.
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;mkdir &lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Download files&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pushd&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;  wget -t0 -T15 http://rubyforge.org/download.php/36468/redmine-0.7.1.tar.gz
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;popd&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Install redmine&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;tar xfv &lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;/redmine-0.7.1.tar.gz -C /var/www/
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;mv /var/www/redmine-0.7.1 /var/www/redmine
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;cp /var/www/redmine/public/dispatch.fcgi.example /var/www/redmine/public/dispatch.fcgi
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#---- begin database.yml ----&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;declare&lt;/span&gt; -x &lt;span class=&#34;nv&#34;&gt;START_NO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$LINENO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -eq &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;production:
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;  adapter: sqlite3
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;  database: db/production.sqlite3
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;  timeout: &lt;span class=&#34;m&#34;&gt;5000&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;development:
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;  adapter: sqlite3
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;  database: db/development.sqlite3
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;  timeout: &lt;span class=&#34;m&#34;&gt;5000&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;test:
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;  adapter: sqlite3
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;  database: db/test.sqlite3
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;  timeout: &lt;span class=&#34;m&#34;&gt;5000&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;declare&lt;/span&gt; -x &lt;span class=&#34;nv&#34;&gt;END_NO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$LINENO&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#---- end database.yml ----&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;awk &lt;span class=&#34;s1&#34;&gt;&amp;#39;{if(NR &amp;gt; ENVIRON[&amp;#34;START_NO&amp;#34;] &amp;amp;&amp;amp; NR &amp;lt; ENVIRON[&amp;#34;END_NO&amp;#34;]) {print}}&amp;#39;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt; &amp;gt; /var/www/redmine/config/database.yml
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pushd&lt;/span&gt; /var/www/redmine
&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;  rake db:create &lt;span class=&#34;nv&#34;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;production&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;  rake db:migrate &lt;span class=&#34;nv&#34;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;production&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;  
&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;#  Load redmine&amp;#39;s default data&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; en &amp;gt; loc
&lt;span class=&#34;ln&#34;&gt;47&lt;/span&gt;  rake redmine:load_default_data &lt;span class=&#34;nv&#34;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;production&amp;#34;&lt;/span&gt; &amp;lt; loc
&lt;span class=&#34;ln&#34;&gt;48&lt;/span&gt;  rm -f log/production.log
&lt;span class=&#34;ln&#34;&gt;49&lt;/span&gt;  rm -f public/.htaccess
&lt;span class=&#34;ln&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;popd&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;51&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;52&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Clean&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;53&lt;/span&gt;rm -rf &lt;span class=&#34;nv&#34;&gt;$INSTALL_HOME&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注：如果在 Linux 下部署，并使用 SQLite3 数据库时，第一次访问 redmine 无法创建匿名用户，访问时会发生 500 错误，这是属于 redmine 的问题，要解决此问题，执行以下命令：&lt;/p&gt;

&lt;p&gt;交互式命令:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo apt-get install sqlite3
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /var/www/redmine/db
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;sudo sqlite3 production.sqlite3
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&amp;gt; INSERT INTO users &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;created_on&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;last_login_on&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;hashed_password&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;language&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;updated_on&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;firstname&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;lastname&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;mail&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;auth_source_id&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;mail_notification&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;login&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; VALUES&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;2008-05-21 04:31:54&amp;#39;&lt;/span&gt;, &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;, NULL, &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;2008-05-21 04:31:54&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;f&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;AnonymousUser&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;Anonymous&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, NULL, &lt;span class=&#34;s1&#34;&gt;&amp;#39;f&amp;#39;&lt;/span&gt;, &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&amp;gt; .exit
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;sudo apache2ctl restart
&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;ruby script/server -e production&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后，重启 apache2：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo apache2ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;部署看似简单，写起脚本来可是非常费劲的，不过一劳永逸，以后想要部署可以直接参考使用了。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c469a1-5415-11e1-a6b4-96c22c02106a</id>
      <title>Live Writer 12.0.1370.325 &#43; SyntaxColor4Writer 0.27</title>
      <link>https://www.zealic.com/2008/05/live-writer-12-0-1370-325-syntaxcolor4writer-0-27/</link>
      <pubDate>Tue, 20 May 2008 13:07:53 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/live-writer-12-0-1370-325-syntaxcolor4writer-0-27/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;用了很久的 Live Writer，最近有些无法忍受没有代码着色的功能，于是找了个很强大的 SyntaxColor4Writer 作为代码着色工具，很好很强大。&lt;/p&gt;

&lt;p&gt;顺便把 Live Writer 也更新到了最新版本 12.0.1370.325。&lt;/p&gt;

&lt;p&gt;以下是我打包好的 Live Writer 12.0.1370.325 绿色版，包含 SyntaxColor4Writer 0.27 插件。&lt;/p&gt;

&lt;p&gt;下载地址：&lt;a href=&#34;https://chhb5w.bay.livefilestore.com/y1pq_aMqjW2w_BfP3D3kqIKldUvJ96o_gU6E8NrA-x8XVvRVtm6UwDLI7E68MBubfF6RulCR8Iz2BmVihPP7R-htq18aFlwnpVn/LiveWriter-12.0.1370.325.7z&#34;&gt;LiveWriter-12.0.1370.325.7z&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;仅供学习参考使用，谢谢。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/default">@Default</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c41b80-5415-11e1-8f86-96c22c02106a</id>
      <title>ICE 编译器环境集合</title>
      <link>https://www.zealic.com/2008/05/ice-compiler-collection/</link>
      <pubDate>Sun, 18 May 2008 15:29:23 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/ice-compiler-collection/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;ICE 编译器环境，全称 Interactive Compile Environment，是 Zealic 整理的编译器环境，是只包含编译器等工具的实用工具包，不包含任何 IDE 环境，是构建程序的最佳利器，而无需安装任何庞大的 IDE 环境。&lt;/p&gt;

&lt;p&gt;目前包含以下编译器环境：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://bqo0ra.bay.livefilestore.com/y1pPh-NI_IKM6y6nt3M82zrEgOpx9Le76cboGqoTHcYE3hgVjYL6uYl_lcLopUddsVieL103dUl_GYWJQVc5yokUQ/ICE-0.1_MinGW-5.1.3.7z&#34;&gt;ICE-0.1_MinGW-5.1.3.7z&lt;/a&gt; (MinGW-5.1.3)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bqo0ra.bay.livefilestore.com/y1pPh-NI_IKM6ynRGD2Z2ptw9p_qhGLM2nWArncTNOPUdSncEVGMyYurCF36xcKRtL4lakVxsSnWh2SpPCAVqbYCg/ICE-0.1_MSVC-6.0.7z&#34;&gt;ICE-0.1_MSVC-6.0.7z&lt;/a&gt; (Microsoft Visual C/C++ 6.0 SP6)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bqo0ra.bay.livefilestore.com/y1pPh-NI_IKM6wW1CkGxWcZPswoCLgjcthUYiFVH9H-uCyCujUiZvcFmvhiIrvnYkdpMuA0Ax1QhNAW3zSdHNu6ew/ICE-0.1_MSVC-7.1.7z&#34;&gt;ICE-0.1_MSVC-7.1.7z&lt;/a&gt; (Microsoft Visual C/C++ 7.1 SP1)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bqo0ra.bay.livefilestore.com/y1pq_aMqjW2w_D9h-A5gKBQlHMUylMqQWf9xhiVzDCmXpsTiXLdYE-4yfLSsWKWL3iSdfy7lYtNVhAubjX3G9Kl13fBN1UuKUHP/ICE-0.1_MSVC-8.0.7z&#34;&gt;ICE-0.1_MSVC-8.0.7z&lt;/a&gt; (Microsoft Visual C/C++ 8.0 SP1)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bqo0ra.bay.livefilestore.com/y1pPh-NI_IKM6yWwTSs918JcqXZDVdxXNerpkcYfGRTZm_5LNl3Q2Lg1oojgyx6ny45BlSKeNZv05rbE8ehR12Ygg/ICE-0.1_MSVC-9.0.7z&#34;&gt;ICE-0.1_MSVC-9.0.7z&lt;/a&gt; (Microsoft Visual C/C++ 9.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;制作这个编译器集合的本意是，在没有开发环境的机器上依旧可以编译程序，比如，他人的电脑、自动构建服务器。&lt;/p&gt;

&lt;p&gt;对于 MSVC 编译器，是无法直接编译 dsp 和 sln 项目文件的，必须通过 Makefile 来编译；可以把 MSVC 的编译器当作一个精简版本的 VC 来使用。&lt;/p&gt;

&lt;p&gt;除 MinGW 环境可基于其协议自由使用外，Microsoft 的编译器仅供学习参考，本人不对任何使用其产生的法律纠纷负责。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c3f470-5415-11e1-862d-96c22c02106a</id>
      <title>Subversion and .Net</title>
      <link>https://www.zealic.com/2008/05/subversion-and-net/</link>
      <pubDate>Sat, 17 May 2008 14:17:12 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/subversion-and-net/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;h2 id=&#34;svn-net-https-www-pumacode-org-projects-svndotnet&#34;&gt;&lt;a href=&#34;https://www.pumacode.org/projects/svndotnet&#34;&gt;SVN.NET&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;This is a project to build reliable .NET bindings for the &lt;a href=&#34;https://subversion.tigris.org/&#34;&gt;Subversion&lt;/a&gt; version-control system libraries. This is a continuation of the &lt;a href=&#34;https://www.softec.st/en/OpenSource/ClrProjects/SubversionSharp/SubversionSharp.html&#34;&gt;SubversionSharp&lt;/a&gt; library initially created by &lt;a href=&#34;https://www.softec.st/&#34;&gt;Softec&lt;/a&gt; and released under the &lt;a href=&#34;https://www.opensource.org/licenses/lgpl-license.php&#34;&gt;LGPL&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;dotsvn-https-www-dotsvn-net&#34;&gt;&lt;a href=&#34;[https://www.dotsvn.net&#34;&gt;DotSVN&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;The objective of &lt;strong&gt;DotSVN&lt;/strong&gt; is to re-implement &lt;a href=&#34;https://subversion.tigris.org&#34;&gt;Subversion&lt;/a&gt; version-control-system completely in .NET.&lt;/p&gt;

&lt;h2 id=&#34;svnmanagerlib-https-www-codeplex-com-svnmanagerlib&#34;&gt;&lt;a href=&#34;https://www.codeplex.com/svnmanagerlib&#34;&gt;SVNManagerLib&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;The goal of SVNManagerLib is to create a kernel type library that can be used by .NET Web Services, Remoting, and ASP.NET for remotely administering Subversion repositories and users. This only supports files for svnserve as a NT Service or *nix Daemon.&lt;/p&gt;

&lt;p&gt;What can it do?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and Delete Repositories&lt;/li&gt;
&lt;li&gt;Create and Delete Directories&lt;/li&gt;
&lt;li&gt;Create and Delete Users&lt;/li&gt;
&lt;li&gt;Create Dump Files&lt;/li&gt;
&lt;li&gt;Create Hot Copies&lt;/li&gt;
&lt;li&gt;Manage access to repositories&lt;/li&gt;
&lt;/ul&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c3cd5e-5415-11e1-a691-96c22c02106a</id>
      <title>Windows 下的 Apache &#43; FastCGI 部署 ROR 应用</title>
      <link>https://www.zealic.com/2008/05/windows-apache-fastcgi/</link>
      <pubDate>Fri, 16 May 2008 09:19:21 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/windows-apache-fastcgi/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;h2 id=&#34;系统需求&#34;&gt;系统需求&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Apache&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Rails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;安装 Ruby 建议使用 &lt;a href=&#34;https://rubyforge.org/frs/download.php/29263/ruby186-26.exe&#34;&gt;Ruby 1.8.6 One-Click Installer&lt;/a&gt;，而不要使用 &lt;a href=&#34;ftp://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/ruby-1.8.6-p111-i386-mswin32.zip&#34;&gt;Ruby 1.8.6 Binary&lt;/a&gt; ，因为后者不包含 FCGI 模块，即使使用 &lt;em&gt;gem install fcgi&lt;/em&gt; 安装也必须编译才能使用。&lt;br /&gt;
如果没有 FCG 模块，则 Apache 启动 FastCGI 进程可能会报以下错误：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;The pipe has been ended.  : mod_fcgid: get overlap result error&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;安装 Rails : &lt;code&gt;gem install rails&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;安装 &lt;a href=&#34;https://httpd.apache.org/&#34;&gt;Apache Http Server&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;获得 &lt;a href=&#34;https://www.apachelounge.com/download/mods/mod_fcgid-2.2-w32.zip&#34;&gt;mod_fcgid&lt;/a&gt;，该模块依赖 &lt;a href=&#34;https://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&amp;amp;displaylang=en&#34;&gt;Visual C++ 2008 Redistributable Package&lt;/a&gt;；解压 mod_fcgid.so 到 Apache 目录的 modules 子目录下。&lt;br /&gt;
fcgid 进程默认只有一个 _FCGI_SHUTDOWN&lt;em&gt;EVENT&lt;/em&gt; 环境变量，而 Windows DNS 解析必须有一些特定的环境变量，否则会导致无法解析 DNS，应用报以下错误：&lt;/p&gt;

&lt;p&gt;&lt;em&gt;getaddrinfo: no address associated with hostname.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;下面的配置描述了如何解决该问题。&lt;/p&gt;

&lt;p&gt;我们这里作一些假设：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ROR 应用目录：D:/WebRoot/redmine/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;配置 Apache，添加以下脚本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-apache&#34; data-lang=&#34;apache&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;LoadModule&lt;/span&gt; fcgid_module et/mod/mod_fcgid.so
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; RAILS_ENV production&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;设置以下环境变量以保证 DNS 解析正确&lt;br /&gt;
如果不设置，则会报：&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;getaddrinfo: no address associated with hostname.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-apache&#34; data-lang=&#34;apache&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; PATH &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; SystemRoot &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/Windows&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; SystemDrive &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; TEMP &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/WINDOWS/TEMP&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; TMP &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/WINDOWS/TEMP&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;DefaultInitEnv&lt;/span&gt; windir &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/WINDOWS&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Alias&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/redmine&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;D:/WebRoot/redmine/public/&amp;#34;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Directory&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;D:/WebRoot/redmine/public/&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;Options&lt;/span&gt; Indexes ExecCGI FollowSymLinks
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;AllowOverride&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;all&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;Order&lt;/span&gt; Deny,Allow
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;Allow&lt;/span&gt; from &lt;span class=&#34;k&#34;&gt;All&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/redmine/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;AddHandler&lt;/span&gt; fcgid-script .fcgi
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;FCGIWrapper&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/ruby/bin/ruby.exe D:/WebRoot/redmine/public/dispatch.fcgi&amp;#34;&lt;/span&gt; .fcgi
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteEngine&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;on&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteBase&lt;/span&gt; &lt;span class=&#34;sx&#34;&gt;/redmine&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^$ index.html [QSA]
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^([^.]+)$ $1.html [QSA]
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^(.*)$ dispatch.fcgi?$1 [QSA,L]
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c37f40-5415-11e1-92e6-96c22c02106a</id>
      <title>好用的 Abyss Web Server</title>
      <link>https://www.zealic.com/2008/05/good-abyss-web-server/</link>
      <pubDate>Sat, 10 May 2008 15:46:33 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/good-abyss-web-server/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;今天在家中研究如何实现脱离 IIS 部署 ASP.Net，方法有很多种：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://sourceforge.net/projects/mod-aspdotnet/&#34;&gt;mod_aspdotnet&lt;/a&gt;&lt;br /&gt;
这个东西可以直接与 Apache 集成，不过 Apache Foundation 已经不再维护该模块，因此放弃。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ultidev.com/products/Cassini/&#34;&gt;UltiDev Cassini&lt;/a&gt;&lt;br /&gt;
还没用过，明天补上。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.aprelium.com/abyssws/&#34;&gt;Abyss Web Server&lt;/a&gt;&lt;br /&gt;
很好很强大，跨平台的 Web Server，支持 ASP、ASP.Net、ROR、PHP，提供了网页配置接口，用起来也非常的方便。&lt;br /&gt;
它使用 FastCGI 来统一各种技术。&lt;br /&gt;
我在 Win2003 下用它成功的运行了 &lt;a href=&#34;https://www.countersoft.com/&#34;&gt;Gemini&lt;/a&gt;(ASP.Net) 和 &lt;a href=&#34;https://www.redmine.org/&#34;&gt;Redmine&lt;/a&gt;(ASP.Net)。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我选择了 Abyss Web Server 来试验我的想法，它非常轻巧，安装包仅仅 700 多K，并且它还有一个免费的 X1 版本。并且可以根据你的需求设置为手动启动、开机启动或安装为 Windows 服务。&lt;/p&gt;

&lt;p&gt;关于如何在 Abyss Web Server 下部署 ROR，请看&lt;a href=&#34;https://www.aprelium.com/abyssws/ror.html&#34;&gt;这里&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;不过我这里用它部署 Remine 的时候，发生了一点小问题，没办法通过 URL &lt;a href=&#34;http://localhost/&#34;&gt;https://localhost/&lt;/a&gt; 访问 Redmine 的主页；要修订这个问题，我们需要在原有的 URL Rewriting 规则之上增加一条规则:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Virtual Path Regular Expression : ^/$&lt;br /&gt;
Redirect to : /dispatch.fcgi&lt;br /&gt;
Next Action : Next action&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;可以考虑将 Apache 和 Abyss Web Server 结合起来做一个反向代理，这样就可以集中一个端口提供服务，同时也可以作为集群的基础。&lt;/p&gt;

&lt;p&gt;Apache 下的 FastCGI 配起来可是会让人吐血的；当然，也可以考虑 lighttpd，不过 lighttpd 的 Windows 版本实在是感觉不爽，以后 Mono XSP + ROR + PHP 诸如此类的混合网站，再考虑在 Linux 下的 lighttpd 吧。&lt;/p&gt;

&lt;p&gt;终于，可以和 IIS 这个肥猪说拜拜了。（IIS 幽幽的说：你会回来的~）&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c35831-5415-11e1-b1af-96c22c02106a</id>
      <title>Zealic&#39;s Linux FAQ</title>
      <link>https://www.zealic.com/2008/05/zealic-linux-faq/</link>
      <pubDate>Thu, 08 May 2008 06:54:28 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/zealic-linux-faq/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;h2 id=&#34;前言&#34;&gt;前言：&lt;/h2&gt;

&lt;p&gt;该 FAQ 记录 Zealic 学习使用 Linux 的经验，包括 Ubuntu 发行版但不限于 Ubuntu 发行版，理论上兼容所有 debian 系的发行版，但不排除个别例外情况。&lt;/p&gt;

&lt;p&gt;欢迎转载，但你所看到版本不一定是最新的。&lt;/p&gt;

&lt;p&gt;文中假设的操作用户名为 &lt;strong&gt;zealic&lt;/strong&gt;，主机名为 &lt;strong&gt;host&lt;/strong&gt;。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;如何判断 Linux 的发行版?
&lt;code&gt;cat /etc/issue&lt;/code&gt;&lt;br /&gt;
/etc/issue 的用途是作为在显示登陆提示符之前的提示信息，大多数情况下，都是显示为系统的发行版。&lt;br /&gt;
此外还可以通过 /etc/issue.net 文件来判断。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如何恢复使用 Ctrl+Z 挂起的进程?
&lt;strong&gt;启用 cat 进程&lt;/strong&gt;
  &lt;code&gt;cat&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;按 Ctrl+Z 挂起进程，输出如下:&lt;/strong&gt;&lt;br /&gt;
  &lt;code&gt;[1]+Stopped                 cat&lt;/code&gt;&lt;br /&gt;
  &lt;code&gt;fg 1&lt;/code&gt;&lt;br /&gt;
这里 [1] 代表挂起的进程 ID，使用 jobs 命令可以列出所有挂起的进程。&lt;br /&gt;
使用 bg 命令可获得上一个被挂起的进程。&lt;br /&gt;
上面使用的 fg 命令则是恢复被挂起的进程。&lt;br /&gt;
注 : 这里的挂起，是指程序在后台运行。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如何修改登陆系统时的消息？
修改 /etc/motd 文件，motd 的全义是 : Message Of ToDay，该文件的作用是，每次用户登陆时，该文件的内容会显示到终端。&lt;br /&gt;
不过上述方法仅能更改当时的登陆消息，当重新启动系统后，又会被替换为 一部分动态生成的内容 + /etc/motd.tail 的内容。&lt;br /&gt;
所以想要持久性的修改，最好修改 /etc/motd.tail 。&lt;br /&gt;
实际上 modtd 是由 /etc/bootmisc.sh 生成的。&lt;br /&gt;
更多信息请使用以下命令参考：&lt;br /&gt;
&lt;code&gt;man motd&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;man motd.tail&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如何修改网卡和 DNS 设置？
网卡配置文件：/etc/network/interfaces&lt;br /&gt;
DNS 配置文件：/etc/resolv.conf&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如何统计目录或文件的大小？
使用 du 命令。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;查看当前系统挂载的分区？
使用 df 命令。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;无法启用 vim 的语法高亮？
某些 Linux 发行版安装的 vim 可能不是 vim，而是直接链接到 vi。&lt;br /&gt;
使用 vim &amp;ndash;version，查看是否 vim 及具体版本。&lt;br /&gt;
如果的确是 vim 的话，使用 &amp;ldquo;syntax on&amp;rdquo; 依旧无法启用语法高亮并报以下错误：&lt;br /&gt;
&lt;em&gt;E319: Sorry, the command is not available in this version: syntax on&lt;/em&gt;&lt;br /&gt;
则有可能是没有完整的安装 vim (比如我目前使用的 Ubuntu-8.04 CLI)。&lt;br /&gt;
解决方法，重新安装 vim：&lt;br /&gt;
&lt;code&gt;sudo apt-get install vim&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;lsof -i tcp 命令无效?
使用 sudo 前缀命令即可。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如何激活或锁定用户?
激活 root 用户：&lt;br /&gt;
&lt;code&gt;sudo passwd root&lt;/code&gt;&lt;br /&gt;
锁定 root 用户：&lt;br /&gt;
&lt;code&gt;sudo passwd root&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如何修改命令提示符？&lt;br /&gt;
修改 PS1 环境变量。如果要永久性的修改，则可以直接修改 ~/.bashrc 文件对 PS1 赋值的脚本，如果 .bashrc 没有对 PS1 赋值，则可以修改 /etc/profile。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如何配置本地编码支持?
使用以下命令：&lt;br /&gt;
&lt;code&gt;sudo locale-gen zh_CN.GBK&lt;/code&gt;&lt;br /&gt;
上述命令生成 zh_CN.GBK 本地化支持，要完全启用该支持，需要在 /etc/environment (需要重启) 或 ~/.profile (需要重登陆) 或在 SHELL (直接生效)中定义以下变量：&lt;br /&gt;
&lt;code&gt;LANGUAGE=&amp;quot;zh_CN:zh&amp;quot;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;LANG=&amp;quot;zh_CN.GBK&amp;quot;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;LC_ALL=&amp;quot;zh_CN.GBK&amp;quot;&lt;/code&gt;&lt;br /&gt;
支持的编码有 UTF-8，GB2312，GBK，GB18030，可以在 /usr/lib/locale 中找到生成的字符集文件；在/var/lib/locales/supported.d/local 文件中可以看到目前已安装的字符集。&lt;br /&gt;
这里我推荐使用 GBK 或 GB18030 编码。&lt;br /&gt;
如果是桌面环境，可能需要重新配置 locale：&lt;br /&gt;
&lt;code&gt;sudo dpkg-reconfigure locales&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;查看用户所属的用户组?
使用 &lt;strong&gt;groups&lt;/strong&gt; 命令即可查看当前登陆用户所属的用户组，如要查看指定用户的所属的用户组，在命令后加上用户名即可。&lt;br /&gt;
使用 &lt;strong&gt;id&lt;/strong&gt; 可达到相同的效果，并且信息更加详细。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;显示文件或目录的详细信息?
使用 &lt;strong&gt;stat&lt;/strong&gt; 命令即可。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;执行简单数学运算
使用 &lt;strong&gt;let&lt;/strong&gt; 命令即可，这是 bash 内建的命令。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;执行计划任务
使用 crontab 命令，或直接放置脚本到以下目录：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/etc/cron.daily/&lt;/li&gt;
&lt;li&gt;/etc/cron.hourly/&lt;/li&gt;
&lt;li&gt;/etc/cron.monthly/&lt;/li&gt;
&lt;li&gt;/etc/cron.weekly/&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;以上目录的脚本是通过 /etc/crontab 来执行的。&lt;br /&gt;
  也可使用 &lt;strong&gt;crontab -u root -e&lt;/strong&gt; 命令来编辑指定用户的计划任务脚本，编辑的脚本放在以下目录中：&lt;br /&gt;
  &lt;em&gt;/var/spool/cron/crontabs/&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&amp;lt;&amp;lt;待续&amp;gt;&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c35830-5415-11e1-b718-96c22c02106a</id>
      <title>小记安装配置 Ubuntu 8.04</title>
      <link>https://www.zealic.com/2008/05/install-ubuntu-8-04/</link>
      <pubDate>Thu, 08 May 2008 06:01:17 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/05/install-ubuntu-8-04/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;基本的安装很简单，省略不提。&lt;/p&gt;

&lt;h2 id=&#34;1-配置网络&#34;&gt;1. 配置网络&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;修改网络配置 : /etc/network/interfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;iface eth0 inet static
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;address &lt;span class=&#34;m&#34;&gt;192&lt;/span&gt;.168.1.10
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;netmask &lt;span class=&#34;m&#34;&gt;255&lt;/span&gt;.255.255.0
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;gateway &lt;span class=&#34;m&#34;&gt;192&lt;/span&gt;.168.1.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;使设置生效:
&lt;code&gt;/etc/init.d/networking restart&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;2-配置-apt&#34;&gt;2. 配置 APT&lt;/h2&gt;

&lt;p&gt;先说说源列表这个东西的概念&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;deb http://ubuntu.cn99.com/ubuntu/ hardy main restricted universe multiverse&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;包类型 : deb (deb 或 deb-src，分别代表二进制包和源代码包)&lt;/li&gt;
&lt;li&gt;来源地址&lt;/li&gt;
&lt;li&gt;发行版本 : hardy (hardy 为 ubuntu 8.04 的开发代号，也可以直接使用版本号)&lt;/li&gt;
&lt;li&gt;库 : main | multiverse | restricted | universe&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;参考：&lt;a href=&#34;http://wiki.ubuntu.org.cn/index.php?title=UbuntuHelp:Repositories/CommandLine/zh&#34;&gt;http://wiki.ubuntu.org.cn/index.php?title=UbuntuHelp:Repositories/CommandLine/zh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;配置源列表:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;sudo cp /etc/apt/sources.list /ect/apt/sources.list.bak
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;sudo vim /etc/apt/sources.list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改为:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-security main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-updates main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-proposed main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-backports main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-security main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-updates main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-proposed main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://ubuntu.cn99.com/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-backports main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-security main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-updates main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-proposed main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-backports main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-security main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-updates main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-proposed main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://archive.ubuntu.org.cn/ubuntu/&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-backports main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-security main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-updates main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-backports main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;deb &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-proposed main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-security main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-updates main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-backports main restricted universe multiverse
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;deb-src &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;http://cn.archive.ubuntu.com/ubuntu&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; hardy-proposed main restricted universe multiverse&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;更新源列表 :
&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;更多源列表信息参见：&lt;a href=&#34;http://wiki.ubuntu.org.cn/index.php?title=Qref/Source&amp;amp;variant=zh-cn&#34;&gt;http://wiki.ubuntu.org.cn/index.php?title=Qref/Source&amp;amp;variant=zh-cn&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;3-安装-ssh-服务&#34;&gt;3. 安装 SSH 服务&lt;/h2&gt;

&lt;p&gt;安装 openssh-server：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install openssh-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果需要，配置 sshd：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo vim /etc/ssh/sshd_config&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;配置后需要重启
&lt;code&gt;sudo /etc/init.d/ssh restart&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;之后使用 SecureCRT 或 putty 之类的 SSH Client 软件就可以连接该机器了。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c2bbef-5415-11e1-afab-96c22c02106a</id>
      <title>StringTemplate Perl 版</title>
      <link>https://www.zealic.com/2008/04/stringtemplate-perl-version/</link>
      <pubDate>Mon, 07 Apr 2008 15:22:26 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/04/stringtemplate-perl-version/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;上回写了一篇 &lt;a href=&#34;http://www.cnblogs.com/zealic/archive/2008/03/28/1126783.html&#34;&gt;利用 GAWK 实现模板文件替换&lt;/a&gt;，实现了文本文件的替换，不过最近了解下 Perl，因此就此写了一个 Perl 版本的 StringTemplate.pl。&lt;br /&gt;
要真说起来，Perl 还是 AWK 的派生，功能为为强大，由于我这里只是将模板替换功能应用到替换一些简单的东西，要求并不是很高，用一个精简版的 Perl 足矣，这就是精简版的 MiniPerl.exe，可以由 Perl 的源代码编译使用。&lt;br /&gt;
这次实现的 StringTemplate.pl 相比之前用 GAWK 实现的功能要更强大一些：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;嵌套变量替换&lt;/li&gt;
&lt;li&gt;是否区分大小写替换&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;未来的版本考虑添加一个类似 Java 中的 -D 选项添加变量的功能。&lt;/p&gt;

&lt;p&gt;看代码先:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;code&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;owner name=&amp;#34;Zealic&amp;#34; email=&amp;#34;rszealic@gmail.com&amp;#34;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;timestamp&amp;gt;2008-3-30&amp;lt;/timestamp&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;/code&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Initial&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scalar&lt;/span&gt; &lt;span class=&#34;vi&#34;&gt;@ARGV&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vi&#34;&gt;@ARGV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;showHelp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;101&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;    &lt;span class=&#34;vg&#34;&gt;$ignoreCase&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vi&#34;&gt;@ARGV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;i&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;    &lt;span class=&#34;vg&#34;&gt;$nesting&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vi&#34;&gt;@ARGV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;  &lt;span class=&#34;vg&#34;&gt;$dictFile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vi&#34;&gt;@ARGV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;  &lt;span class=&#34;vg&#34;&gt;$templateFile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vi&#34;&gt;@ARGV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# Show help&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;showHelp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;102&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Open files&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;FDICT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$dictFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;die&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Can&amp;#39;t open file $dictFile.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;FTPL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$templateFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;die&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Can&amp;#39;t open file $templateFile.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Parse dict&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;  &lt;span class=&#34;vi&#34;&gt;@lines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;FDICT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vi&#34;&gt;@lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=~&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/w+=/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;          &lt;span class=&#34;vg&#34;&gt;$key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$+&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;          &lt;span class=&#34;vg&#34;&gt;$value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$+&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$+&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;          &lt;span class=&#34;nb&#34;&gt;chomp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;          &lt;span class=&#34;vg&#34;&gt;$dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Replace and output&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;47&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;48&lt;/span&gt;  &lt;span class=&#34;vi&#34;&gt;@contents&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;FTPL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;49&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vi&#34;&gt;@contents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;50&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;51&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=~&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/$(w+)/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;52&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;53&lt;/span&gt;          &lt;span class=&#34;n&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$old&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;54&lt;/span&gt;          &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;each&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;55&lt;/span&gt;          &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;56&lt;/span&gt;              &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$ignoreCase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;57&lt;/span&gt;              &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;58&lt;/span&gt;                  &lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=~&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/$($key)/&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$value&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/gi;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;59&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;              }
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;              else
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;61&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;              {
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;62&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;                  $line =~ s/&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/$value/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;63&lt;/span&gt;              &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;64&lt;/span&gt;          &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;65&lt;/span&gt;          &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$old&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;eq&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;last&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;66&lt;/span&gt;          &lt;span class=&#34;k&#34;&gt;unless&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vg&#34;&gt;$nesting&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;last&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;67&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;68&lt;/span&gt;      &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;$line&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;69&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;70&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;71&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;72&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;sub&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;showHelp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;73&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;74&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;StringTemplate 1.0
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;76&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;Copyright 2008 Zealic, All rights reserved.
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;77&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;Contact Me : e-mail:rszealic@gmail.com
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;78&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;79&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;Usage :
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;StringTemplate.pl : [-[i][n]] &amp;lt;DictFile&amp;gt; &amp;lt;TemplateFile&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;81&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;82&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;Options :
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;83&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;  i : IGNORECASE variable for case-insensitive matches.
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;84&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;  n : Nest replacement.
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;85&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;86&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;根据这个东西，可以直接将 MiniPerl.exe 纳入版本控制中，成为自动构建的一部分，可以据此动态生成脚本、源文件，Manifest 文件；或通过 &lt;a href=&#34;http://msbuildtasks.tigris.org/&#34;&gt;MSBuild Community Tasks&lt;/a&gt; 的 SVN/VSS/TFS Task，与我以前所写的 &lt;a href=&#34;http://www.cnblogs.com/zealic/archive/2007/12/05/984026.html&#34;&gt;通过 TSVN 自动更新程序集版本信息&lt;/a&gt; ，再加上 MSBuild，可以让版本信息生成/测试打包/安装文件生成等重复劳动更加轻松简单。&lt;br /&gt;
最后，你可以&lt;a href=&#34;http://www.cnblogs.com/Files/zealic/StringTemplate_Perl.zip&#34;&gt;在这里下载&lt;/a&gt;本文所说的内容，包括 MiniPerl.exe、StringTemplate.pl、以及示例文件。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c21fb1-5415-11e1-80ad-96c22c02106a</id>
      <title>利用 GAWK 实现模板文件替换</title>
      <link>https://www.zealic.com/2008/03/using-gawk-impl-template-replace/</link>
      <pubDate>Thu, 27 Mar 2008 20:11:15 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/03/using-gawk-impl-template-replace/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;对于产品开发需要的情况下，我们通常会选择某些模板引擎生成一些文件，如 StringTemplate、Volecity，但是如果我们只是需要完成一些简单重复或者自动化的工作的话，依旧使用这样重量级的东西未免杀鸡用牛刀。&lt;/p&gt;

&lt;p&gt;好在有个强大的 GNU AWK!&lt;br /&gt;
于是乎，花了一些时间来写了一个 awk 脚本，实现如下功能。
&lt;strong&gt;从 ini 文件读取键值，通过键名替换值。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;其实就是一个简单的模板功能。&lt;/p&gt;

&lt;p&gt;现在我们看一个简单的场景：&lt;br /&gt;
文件内容 &lt;strong&gt;&lt;code&gt;Talk.tpl&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;$(Famale) : Who are you!  
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;$(Male_FirstName) : $(Male_FirstName), $(Male_FirstName) $(Male_LastName).&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;INI字典文件 &lt;strong&gt;&lt;code&gt;Conf.ini&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Famale&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Jane  &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Male_FirstName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;James  &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Male_LastName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Bond&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;执行以下命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;gawk -f DictReplace.awk Conf.ini Talk.tpl &amp;gt; Talk.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;则会生成文件 &lt;strong&gt;&lt;code&gt;Talk.txt&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;Jane : Who are you!  
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;James : James, James Bond.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;awk 脚本 &lt;strong&gt;&lt;code&gt;DictReplace.awk&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-awk&#34; data-lang=&#34;awk&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#!/usr/bin/gawk -f&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;code&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;owner name=&amp;#34;Zealic&amp;#34; email=&amp;#34;rszealic@gmail.com&amp;#34;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#&amp;lt;/code&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;BEGIN&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fileCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fullContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fullLength&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# MAIN  &lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# File flag&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;FNR&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;fileCount&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Load dict&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fileCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/w+=.*/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;klen&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;klen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;klen&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;repDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fileCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Replace and store&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;outValue&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;repDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;# Dynamic reglur exp&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;    &lt;span class=&#34;nx&#34;&gt;nowRegex&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;\$\(&amp;#34;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dKey&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;\)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;    &lt;span class=&#34;nx&#34;&gt;dValue&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;repDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;    &lt;span class=&#34;kr&#34;&gt;gsub&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;nowRegex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;outValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;fullContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fullLength&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;outValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;fullLength&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;END&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Output result&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fullLength&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;47&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;48&lt;/span&gt;  &lt;span class=&#34;kr&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fullContent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;49&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上述脚本代码在 UnxUtils 的 gawk 下执行通过。&lt;br /&gt;
你可以直接在&lt;a href=&#34;https://www.cnblogs.com/Files/zealic/DictReplace.zip&#34;&gt;这里下载完整内容&lt;/a&gt;查看结果并获得 gawk.exe。&lt;/p&gt;

&lt;p&gt;AWK 的动态构造正则真要命，搞了半天才发现，直接构造字符串就可以，然后直接放到参数中就可以作为正则使用，就是上面代码的蓝色部分。不过也基本学会 AWK，以后又有件利器可用啦。&lt;/p&gt;

&lt;p&gt;稍后再测试能否在 Linux 下工作。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c1aa80-5415-11e1-ae3c-96c22c02106a</id>
      <title>妙用扩展方法</title>
      <link>https://www.zealic.com/2008/03/magical-extension-method/</link>
      <pubDate>Sat, 15 Mar 2008 15:29:24 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/03/magical-extension-method/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;h2 id=&#34;1-参数检查&#34;&gt;1.参数检查&lt;/h2&gt;

&lt;p&gt;对于写库的大多数人来说，参数检查是一件极其麻烦的事情，我们需要重复写以下代码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;现在我们有了扩展方法，则可以这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// 参数检查扩展方法类
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;RequireExtension&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RequireNotNull&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 示例
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RequireNotNull&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;2-本地化&#34;&gt;2.本地化&lt;/h2&gt;

&lt;p&gt;当我们使用枚举，经常需要在枚举和本地化字符串之间转换，或者编码规范为英文，需要将枚举转换为中文，扩展方法可以让我们这样。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// 本地化后的友好名称
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;LocalizedNameAttribute&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Attribute&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// 扩展枚举
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;EnumExtension&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ToLocalized&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Enum&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;Type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;member&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FieldInfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;field&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetFields&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;field&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsDefined&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalizedNameAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;      &lt;span class=&#34;n&#34;&gt;LocalizedNameAttribute&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;att&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalizedNameAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;      &lt;span class=&#34;n&#34;&gt;GetCustomAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;field&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalizedNameAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;att&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;member&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// 性别
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Gender&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;  [LocalizedName(Name = &amp;#34;男&amp;#34;)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;Male&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;  [LocalizedName(Name = &amp;#34;女&amp;#34;)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;Famale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;  [LocalizedName(Name = &amp;#34;东方不败&amp;#34;)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;EastNotFail&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;我们就可以 Gender.Famle.ToLocalized() 直接获取本地化后的字符串。&lt;/p&gt;

&lt;h2 id=&#34;3-强类型转换扩展&#34;&gt;3.强类型转换扩展&lt;/h2&gt;

&lt;p&gt;利用强类型转换，我们可以在代码中少写很多强制转换和类型检查代码。&lt;br /&gt;
我们经常写出这样又臭又长的代码:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyAttribute&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;att&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attribute&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetCustomAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;methodInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;现在，我们可以这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;MyAttribute&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;att&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;methodInfo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetAttribute&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;MyAttribute&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;今天先到这里，下次有经验再分享。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c1aa81-5415-11e1-b310-96c22c02106a</id>
      <title>Socket 死连接详解</title>
      <link>https://www.zealic.com/2008/03/socket-dead-connection/</link>
      <pubDate>Sat, 15 Mar 2008 14:37:02 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/03/socket-dead-connection/</guid>
      <description>&lt;div>&lt;/div>&lt;div>

&lt;p&gt;当使用 Socket 进行通信时，由于各种不同的因素，都有可能导致死连接停留在服务器端，假如服务端需要处理的连接较多，就有可能造成服务器资源严重浪费，对此，本文将阐述其原理以及解决方法。&lt;/p&gt;

&lt;p&gt;在写 Socket 进行通讯时，我们必须预料到各种可能发生的情况并对其进行处理，通常情况下，有以下两种情况可能造成死连接：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;通讯程序编写不完善&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络/硬件故障&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;a-通讯程序编写不完善&#34;&gt;a) 通讯程序编写不完善&lt;/h2&gt;

&lt;p&gt;这里要指出的一点就是，绝大多数程序都是由于程序编写不完善所造成的死连接，即对 Socket 未能进行完善的管理，导致占用端口导致服务器资源耗尽。当然，很多情况下，程序可能不是我们所写，而由于程序代码的复杂、杂乱等原因所导致难以维护也是我们所需要面对的。&lt;/p&gt;

&lt;p&gt;网上有很多文章都提到 Socket 长时间处于 CLOSE_WAIT 状态下的问题，说可以使用 Keepalive 选项设置 TCP 心跳来解决，但是却发现设置选项后未能收到效果 。&lt;/p&gt;

&lt;p&gt;因此，这里我分享出自己的解决方案：&lt;/p&gt;

&lt;p&gt;Windows 中对于枚举系统网络连接有一些非常方便的 API：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GetTcpTable&lt;/strong&gt; : 获得 TCP 连接表&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GetExtendedTcpTable&lt;/strong&gt; : 获得扩展后的 TCP 连接表，相比 GetTcpTable 更为强大，可以获取与连接的进程 ID&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SetTcpEntry&lt;/strong&gt; : 设置 TCP 连接状态，但据 MSDN 所述，只能设置状态为 DeleteTcb，即删除连接&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相信大多数朋友看到这些 API ，就已经了解到我们下一步要做什么了；枚举所有 TCP 连接，筛选出本进程的连接，最后判断是否 CLOSE_WAIT 状态，如果是，则使用 SetTcpEntry 关闭。&lt;/p&gt;

&lt;p&gt;其实 Sysinternal 的 &lt;a href=&#34;https://technet.microsoft.com/en-us/sysinternals/bb897437.aspx&#34;&gt;TcpView&lt;/a&gt; 工具也是应用上述 API 实现其功能的，此工具为我常用的网络诊断工具，同时也可作为一个简单的手动式网络防火墙。&lt;/p&gt;

&lt;p&gt;下面来看 Zealic 封装后的代码：&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;TcpManager.cs&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt;  1&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  2&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;&amp;lt;code&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  3&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;  &amp;lt;revsion&amp;gt;$Rev: 0 $&amp;lt;/revision&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  4&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;  &amp;lt;owner name=&amp;#34;Zealic&amp;#34; mail=&amp;#34;rszealic(at)gmail.com&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  5&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;&amp;lt;/code&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;  6&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;**/&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;  7&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;  8&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Collections.Generic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;  9&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Diagnostics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 10&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Net&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 11&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Net.NetworkInformation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 12&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Runtime.InteropServices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 13&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 14&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 15&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Zealic.Network&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 17&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 18&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;/// TCP 管理器
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 19&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 20&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;TcpManager&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 21&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 22&lt;/span&gt;        &lt;span class=&#34;cp&#34;&gt;#region PInvoke define
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 23&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TCP_TABLE_OWNER_PID_ALL&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 24&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 25&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;        [DllImport(&amp;#34;iphlpapi.dll&amp;#34;, SetLastError = true)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 26&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extern&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetExtendedTcpTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 27&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;IntPtr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pTcpTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;ref&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwOutBufLen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ipVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tblClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reserved&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 28&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 29&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;        [DllImport(&amp;#34;iphlpapi.dll&amp;#34;)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 30&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extern&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SetTcpEntry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ref&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MIB_TCPROW&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pTcpRow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 31&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 32&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 33&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;        [StructLayout(LayoutKind.Sequential)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 34&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MIB_TCPROW&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 35&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 36&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpState&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 37&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwLocalAddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 38&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwLocalPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 39&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwRemoteAddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 40&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwRemotePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 41&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 42&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 43&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;        [StructLayout(LayoutKind.Sequential)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 44&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 45&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 46&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpState&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 47&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwLocalAddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 48&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwLocalPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 49&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwRemoteAddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 50&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwRemotePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 51&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwOwningPid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 52&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 53&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 54&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;        [StructLayout(LayoutKind.Sequential)]&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 55&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MIB_TCPTABLE_OWNER_PID&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 56&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 57&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dwNumEntries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 58&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;table&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 59&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 60&lt;/span&gt;        &lt;span class=&#34;cp&#34;&gt;#endregion
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 61&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 62&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetAllTcpConnections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 63&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 64&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NO_ERROR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 65&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IP_v4&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 66&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tTable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 67&lt;/span&gt;            &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buffSize&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 68&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;GetExtendedTcpTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IntPtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Zero&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;ref&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buffSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IP_v4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TCP_TABLE_OWNER_PID_ALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 69&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;IntPtr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buffTable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Marshal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AllocHGlobal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 70&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 71&lt;/span&gt;            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 72&lt;/span&gt;                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NO_ERROR&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetExtendedTcpTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;ref&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buffSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IP_v4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TCP_TABLE_OWNER_PID_ALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 73&lt;/span&gt;                &lt;span class=&#34;n&#34;&gt;MIB_TCPTABLE_OWNER_PID&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tab&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 74&lt;/span&gt;                    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MIB_TCPTABLE_OWNER_PID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Marshal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PtrToStructure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MIB_TCPTABLE_OWNER_PID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 75&lt;/span&gt;                &lt;span class=&#34;n&#34;&gt;IntPtr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rowPtr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IntPtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)((&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffTable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Marshal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SizeOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tab&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwNumEntries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 76&lt;/span&gt;                &lt;span class=&#34;n&#34;&gt;tTable&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[tab.dwNumEntries]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 77&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 78&lt;/span&gt;                &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rowSize&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Marshal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SizeOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 79&lt;/span&gt;                &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tab&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwNumEntries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;++)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 80&lt;/span&gt;                &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 81&lt;/span&gt;                    &lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tcpRow&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 82&lt;/span&gt;                        &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Marshal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PtrToStructure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rowPtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 83&lt;/span&gt;                    &lt;span class=&#34;n&#34;&gt;tTable&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[i]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tcpRow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 84&lt;/span&gt;                    &lt;span class=&#34;n&#34;&gt;rowPtr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IntPtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)((&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rowPtr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rowSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 85&lt;/span&gt;                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 86&lt;/span&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 87&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;finally&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 88&lt;/span&gt;            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 89&lt;/span&gt;                &lt;span class=&#34;n&#34;&gt;Marshal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FreeHGlobal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 90&lt;/span&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 91&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 92&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 93&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 94&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TranslatePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 95&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 96&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xFF00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 97&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 98&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 99&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Kill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;100&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;101&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;conn&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;102&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;MIB_TCPROW&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MIB_TCPROW&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;103&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwState&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DeleteTcb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;104&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning disable 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;105&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwLocalAddr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;106&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning restore 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;107&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwLocalPort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TranslatePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;108&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning disable 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;109&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwRemoteAddr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RemoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;110&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning restore 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;111&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwRemotePort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TranslatePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RemoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;112&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SetTcpEntry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ref&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;113&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;114&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;115&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Kill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;remoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;116&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;117&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localEndPoint&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;localEndPoint&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;118&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remoteEndPoint&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;remoteEndPoint&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;119&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;MIB_TCPROW&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MIB_TCPROW&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;120&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwState&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DeleteTcb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;121&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning disable 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;122&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwLocalAddr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;123&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning restore 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;124&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwLocalPort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TranslatePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;125&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning disable 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;126&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwRemoteAddr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;127&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#pragma warning restore 612,618
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwRemotePort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TranslatePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;129&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SetTcpEntry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ref&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;130&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;131&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;132&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;133&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetTableByProcess&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;134&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;135&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tcpRows&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetAllTcpConnections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;136&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tcpRows&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;137&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;list&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;138&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MIB_TCPROW_OWNER_PID&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tcpRows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;139&lt;/span&gt;            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;140&lt;/span&gt;                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwOwningPid&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;141&lt;/span&gt;                &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;142&lt;/span&gt;                    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localPort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TranslatePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwLocalPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;143&lt;/span&gt;                    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;remotePort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TranslatePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwRemotePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;144&lt;/span&gt;                    &lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;145&lt;/span&gt;                        &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;146&lt;/span&gt;                            &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwLocalAddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;147&lt;/span&gt;                            &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwRemoteAddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;remotePort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;148&lt;/span&gt;                            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dwState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;149&lt;/span&gt;                    &lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;150&lt;/span&gt;                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;151&lt;/span&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;152&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToArray&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;153&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;154&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;155&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetTalbeByCurrentProcess&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;156&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;157&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetTableByProcess&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetCurrentProcess&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;158&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;159&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;160&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;161&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;TcpConnectionInfo.cs&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;&amp;lt;code&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;  &amp;lt;revsion&amp;gt;$Rev: 608 $&amp;lt;/revision&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;  &amp;lt;owner name=&amp;#34;Zealic&amp;#34; mail=&amp;#34;rszealic(at)gmail.com&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;&amp;lt;/code&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;**/&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Collections.Generic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Net&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Net.NetworkInformation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Zealic.Network&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;/// TCP 连接信息
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sealed&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;TcpConnectionInfo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IEquatable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IEqualityComparer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;19&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;20&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;readonly&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_LocalEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;21&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;readonly&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_RemoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;22&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;readonly&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpState&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_State&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;23&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;24&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;remoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpState&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;25&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;26&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localEndPoint&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;localEndPoint&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;27&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remoteEndPoint&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;remoteEndPoint&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;28&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;_LocalEndPoint&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;29&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;_RemoteEndPoint&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;remoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;30&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;_State&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;31&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;32&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;33&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LocalEndPoint&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;34&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;35&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;get&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_LocalEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;36&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;37&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;38&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IPEndPoint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RemoteEndPoint&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;39&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;40&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;get&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_RemoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;41&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;42&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;43&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpState&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;State&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;44&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;45&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;get&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_State&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;46&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;47&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;48&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;49&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;50&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RemoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RemoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;51&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;52&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;53&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetHashCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;54&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;55&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetHashCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;^&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RemoteEndPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetHashCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;56&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;57&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;58&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;other&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;59&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;60&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;other&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;61&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;62&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;63&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;64&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;65&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;66&lt;/span&gt;                &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;67&lt;/span&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TcpConnectionInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;68&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;69&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;70&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;71&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;至此，我们可以通过 TcpManager 类的 GetTableByProcess 方法获取进程中所有的 TCP 连接信息，然后通过 Kill 方法强制关连接以回收系统资源，虽然很C很GX，但是很有效。&lt;/p&gt;

&lt;p&gt;通常情况下，我们可以使用 Timer 来定时检测进程中的 TCP 连接状态，确定其是否处于 CLOSE_WAIT 状态，当超过指定的次数/时间时，就把它干掉。&lt;/p&gt;

&lt;p&gt;不过，相对这样的解决方法，我还是推荐在设计 Socket 服务端程序的时候，一定要管理所有的连接，而非上述方法。&lt;/p&gt;

&lt;h2 id=&#34;b-网络-硬件故障&#34;&gt;b) 网络/硬件故障&lt;/h2&gt;

&lt;p&gt;现在我们再来看第二种情况，当网络/硬件故障时，如何应对；与上面不同，这样的情况 TCP 可能处于 ESTABLISHED、CLOSE_WAIT、FIN_WAIT 等状态中的任何一种，这时才是 Keepalive 该出马的时候。&lt;/p&gt;

&lt;p&gt;默认情况下 Keepalive 的时间设置为两小时，如果是请求比较多的服务端程序，两小时未免太过漫长，等到它时间到，估计连黄花菜都凉了，好在我们可以通过 Socket.IOControl 方法手动设置其属性，以达到我们的目的。&lt;/p&gt;

&lt;p&gt;关键代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 假设 accepted 到的 Socket 为变量 client
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 设置 TCP 心跳，空闲 15 秒，每 5 秒检查一次
&lt;/span&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inOptionValues&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;[4 * 3]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BitConverter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CopyTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inOptionValues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BitConverter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;15000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CopyTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inOptionValues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BitConverter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CopyTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inOptionValues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;span class=&#34;ln&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IOControl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IOControlCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KeepAliveValues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inOptionValues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以上代码的作用就是设置 TCP 心跳为 5 秒，当三次检测到无法与客户端连接后，将会关闭 Socket。&lt;/p&gt;

&lt;p&gt;相信上述代码加上说明，对于有一定基础读者理解起来应该不难，今天到此为止。&lt;/p&gt;

&lt;h2 id=&#34;c-结束语&#34;&gt;c) 结束语&lt;/h2&gt;

&lt;p&gt;其实对于 Socket 程序设计来说，良好的通信协议才是稳定的保证，类似于这样的问题，如果在应用程序通信协议中加入自己的心跳包，不仅可以处理多种棘手的问题，还可以在心跳中加入自己的简单校验功能，防止包数据被 WPE 等软件篡改。但是，很多情况下这些都不是我们所能决定的，因此，才有了本文中提出的方法。&lt;/p&gt;

&lt;p&gt;警告 ：本文系 Zealic 创作，并基于 &lt;a href=&#34;https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh&#34;&gt;CC 3.0 共享创作许可协议&lt;/a&gt; 发布，如果您转载此文或使用其中的代码，请务必先阅读协议内容。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17c023de-5415-11e1-8664-96c22c02106a</id>
      <title>Understand Issue Tracking System</title>
      <link>https://www.zealic.com/2008/01/understand-issue-tracking-system/</link>
      <pubDate>Tue, 22 Jan 2008 14:57:58 +0800</pubDate>
      
      <guid>https://www.zealic.com/2008/01/understand-issue-tracking-system/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;Issue Tracking System （ITS）是供软件开发所使用的系统，允许在软件开发中和追踪每个问题进程，直到问题最终被解决。在ITS中，一个&amp;rdquo;问题&amp;rdquo;，可能是Bug，可能是一个功能，也可能是一个测试。这些都可以被 ITS 管理，拥有者或者其它的什么管理单元所跟踪。&lt;/p&gt;

&lt;p&gt;ITS 通常给用户提供了一条报告&amp;rdquo;问题&amp;rdquo;的通径，并且跟踪它的解决过程，了解造成&amp;rdquo;问题&amp;rdquo;的原因。它还允许系统管理者定制跟踪程序，避免问题解决部分的一些多余的文件造成时间的延误。许多行业的企业都使用ITS软件，包括软件开发商、生产商、IT帮助桌面和其它的服务提供者。&lt;/p&gt;

&lt;p&gt;严格的讲，ITS 是 SCM 中的变更控制和过程控制理论的实现者，再加上 VCS，可以构成管理一个软件生产过程的基本模型。&lt;/p&gt;

&lt;p&gt;现在大多数 ITS 都提供与 VCS 集成的功能，可以很方便的了解到一个&amp;rdquo;问题&amp;rdquo;所经历的源代码变化，并对此进行数据统计，改进工作计划或协调任务。&lt;/p&gt;

&lt;p&gt;由于软件是无形的存在，人们在很大程度上难以掌握和估计，因此经常会发生对于低估某个项目的开发周期，最终造成项目的延迟甚至流产；而由于 ITS 的 Timeline 能在很大程序上直观的了解到项目的进度，以某个里程碑为推进目标；无论是开发者的士气还是管理者的焦虑，都能得到够好的效果。&lt;/p&gt;

&lt;p&gt;并且，由于 ITS 几乎全盘接管项目的开发过程，因此只需要很少的文档，新成员或者项目维护者就能够了解到整个项目的历史、功能以及未决问题，从宏观上来说，非常有利。&lt;/p&gt;

&lt;p&gt;此外，对于需求变化，使用 ITS 也能够做到较为迅速的反应和记录；我可以毫不顾忌的说，ITS、VCS 是实施敏捷所必需的工具，缺少任何一项，都不能称之为完整的敏捷。无论是快速迭代开发或者稳健的 TDD，ITS 都将是不可或缺的成员。&lt;/p&gt;

&lt;p&gt;真正实施 ITS 需要的是团队成员的配合，如果仅仅是拿来做摆设，或者作为一种事后补充，几乎上述所有优点将丧失殆尽，ITS 的实施也就毫无意义。&lt;/p&gt;

&lt;p&gt;最后介绍一些著名的 ITS ：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Bugzilla&lt;br /&gt;
作为一个老牌到牙都不掉的 ITS，无论是功能、社区支持还是与第三方工具协作方面，Bugzilla 都是极为稳定和高效的。&lt;br /&gt;
由 &lt;a href=&#34;https://bugzilla.mozilla.org&#34;&gt;Mozilla&lt;/a&gt; 出品，Free。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;FogBugz&lt;br /&gt;
有 &lt;a href=&#34;https://www.joelonsoftware.com/&#34;&gt;Joel on Software&lt;/a&gt; 开发，具体不太了解，不过作为一个获得 JOLT 大奖的产品，想来不会太差。付费产品。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;JIRA&lt;br /&gt;
由 &lt;a href=&#34;https://www.atlassian.com&#34;&gt;Australian atlassian&lt;/a&gt; 公司的出品的 JIRA 是一个基于 J2EE 成熟的 ITS，曾经荣获 JOLT 大奖。全球很多大型公司和组织都在使用 JIRA 管理企业的项目；JIRA 是一个商业程序。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Microsoft TFS&lt;br /&gt;
Microsft 在 Visual Studio 2005 提供对应 &lt;a href=&#34;http://msdn2.microsoft.com/en-us/teamsystem/aa718934.aspx&#34;&gt;TFS(Team Foundition System)&lt;/a&gt; 同样也是一个 ITS，并且集成源代码管理功能，不过由于 TFS 配置管理及硬件需求过高，维护起来也颇为麻烦，在实际中少见使用。也许这是一个遵循微软三版定律的软件。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Edgewall Trac&lt;br /&gt;
&lt;a href=&#34;https://trac.edgewall.org&#34;&gt;Trac&lt;/a&gt; 是一个基于 Web 的轻量级 ITS，个人以为它比较适合精英类型的团队使用，人数考量应在 3-6 人之间，由于使用 SQLite 及 PostageSQL 作为数据后端，Trac 无法承载更大型的项目管理工作。Trac 是一个开源的产品，有稳定持续的维护者和开发计划。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;本文遵循 &lt;a href=&#34;https://creativecommons.org/licenses/by-nc-nd/2.5/cn/&#34;&gt;CC创作共享许可协议&lt;/a&gt;，所有内容仅代表个人观点，但不包括第三方内容。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/tech">tech</category>
      
    </item>
    
    <item>
      <id>urn:uuid:17beeb62-5415-11e1-b285-96c22c02106a</id>
      <title>搬家：新的起点</title>
      <link>https://www.zealic.com/2007/12/move-house-jumping-off-point/</link>
      <pubDate>Thu, 13 Dec 2007 07:56:15 +0800</pubDate>
      
      <guid>https://www.zealic.com/2007/12/move-house-jumping-off-point/</guid>
      <description>&lt;div>&lt;/div>&lt;div>&lt;p&gt;没有任何原因，大概是新年想换个节点吧。&lt;br /&gt;
我决定不再使用这个空间，可能这里都不会再更新了。&lt;br /&gt;
感谢你一直以来的关注。&lt;br /&gt;
原本我有两个主要空间：&lt;br /&gt;
一个是博客园的技术博客：&lt;a href=&#34;https://zealic.cnblogs.com/&#34;&gt;https://zealic.cnblogs.com&lt;/a&gt;&lt;br /&gt;
主要分享一些技术心得和学习经验。&lt;br /&gt;
另一个就是本博，主要就是写点心情啥的，还是很隐晦的手法来写的。&lt;br /&gt;
这次决定搬家是因为新年的缘故，也是想放开心灵，以后写东西会稍微正常点的，也许还会记日记哦。&lt;br /&gt;
还有一个原因可能就是对 TX 不太放心吧，呵呵，至少 Microsoft 不会私自取走你的隐私。&lt;br /&gt;
请到我的新家，以后就会在这个博客里更新包括技术和生活方面的内容；当然，博客园也会同步更新。&lt;br /&gt;
&lt;a href=&#34;https://zealic.spaces.live.com/&#34;&gt;https://zealic.spaces.live.com&lt;/a&gt;&lt;br /&gt;
Thank you.&lt;br /&gt;
新年快乐，爱你的 Zealic。&lt;/p&gt;
&lt;/div></description>
      <author></author><category domain="https://www.zealic.com/categories/default">@Default</category>
      
    </item>
    
  </channel>
</rss>