<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Kevin Wang's Blog]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>http://kev7n.com/</link><generator>Ghost 0.11</generator><lastBuildDate>Wed, 15 Oct 2025 17:21:37 GMT</lastBuildDate><atom:link href="http://kev7n.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[【探索】基于NLP构建 Self-Service ChatBots]]></title><description><![CDATA[<h2 id="background">背景 / Background</h2>

<p>今年上半年的时候，公司内部组织过一次全球性Hackathon大赛，我被被任命为公司亚太区的SPOC，负责亚太区技术团队Hackathon大赛的推广及本地组织者。余热未了，最近亚太区技术Boss邮件问我可不可以做一个提供自助服务的ChatBots原型。正好几年前研究过相关的东西（NLP\ML\DL），虽说没有深入到理论层面，但是结合当下业务的某些场景，倒是可以快速的做些应用原型玩玩。</p>

<blockquote>
  <p>对于本文，主要涉及到功能探索和构建方面的内容，并不会就“为什么做这个功能”的问题本身展开描述。不会过多站在产品角度来写，更多的是记录应用具体的技术方案来实现的过程。另外对于NLP/ML/DP也不会深入到理论层面，因为这不是一篇文章就可以写清楚的，或者说我能写的很清楚。</p>
</blockquote>

<h2 id="explore">探索 / Explore</h2>

<p>原型的功能定义很简单，需要具备以下两个基本功能：</p>

<pre><code>1. 简单陪聊，可人工训练  
2. 自助个性化定制服务，根据用户的输入（Audio/Text）提供个性化服务  
</code></pre>

<p>一是简单陪聊，所谓陪聊就是在用户知道是跟机器人聊天的情况下，但又能聊的很愉悦。为什么这么说呢？目前市面上有部分已知的聊天机器人在面对简单的会话的时候，尚且能应付人类。一旦深入聊天，涉及到复杂的上下文会话，机器人的愚（Zhi）</p>]]></description><link>http://kev7n.com/2016/09/22/nlp-ml-chatbots/</link><guid isPermaLink="false">58aa8c97-cd9f-469f-9872-3a412bec9381</guid><category><![CDATA[NLP]]></category><category><![CDATA[ML]]></category><category><![CDATA[CHATBOTS]]></category><category><![CDATA[DOCKER]]></category><category><![CDATA[PYTHON]]></category><category><![CDATA[FLASK]]></category><category><![CDATA[REST]]></category><category><![CDATA[ANGULARJS]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Thu, 22 Sep 2016 08:17:39 GMT</pubDate><content:encoded><![CDATA[<h2 id="background">背景 / Background</h2>

<p>今年上半年的时候，公司内部组织过一次全球性Hackathon大赛，我被被任命为公司亚太区的SPOC，负责亚太区技术团队Hackathon大赛的推广及本地组织者。余热未了，最近亚太区技术Boss邮件问我可不可以做一个提供自助服务的ChatBots原型。正好几年前研究过相关的东西（NLP\ML\DL），虽说没有深入到理论层面，但是结合当下业务的某些场景，倒是可以快速的做些应用原型玩玩。</p>

<blockquote>
  <p>对于本文，主要涉及到功能探索和构建方面的内容，并不会就“为什么做这个功能”的问题本身展开描述。不会过多站在产品角度来写，更多的是记录应用具体的技术方案来实现的过程。另外对于NLP/ML/DP也不会深入到理论层面，因为这不是一篇文章就可以写清楚的，或者说我能写的很清楚。</p>
</blockquote>

<h2 id="explore">探索 / Explore</h2>

<p>原型的功能定义很简单，需要具备以下两个基本功能：</p>

<pre><code>1. 简单陪聊，可人工训练  
2. 自助个性化定制服务，根据用户的输入（Audio/Text）提供个性化服务  
</code></pre>

<p>一是简单陪聊，所谓陪聊就是在用户知道是跟机器人聊天的情况下，但又能聊的很愉悦。为什么这么说呢？目前市面上有部分已知的聊天机器人在面对简单的会话的时候，尚且能应付人类。一旦深入聊天，涉及到复杂的上下文会话，机器人的愚（Zhi）蠢（Shang）就暴露无疑了。这时候用户可能没有继续与该机器人聊下去的欲望和耐心。当然，这不代表我打算做一个能深度陪聊的机器人，毕竟以现有的资源要做到还很困难。这也是我为什么要定义为<strong>简单</strong>陪聊。虽说定义简单，还是会用到机器学习和自然语言处理相关的技术方案，而不是纯粹的简单指令匹配，通过ML/NLP或多多少能改善一些用户体验。让这个陪聊功能在一定程度上需要具备<code>“以其人之道还治其人之身”</code>的能力，即学习能力。自打Machine Learning提出之后，这些年聊天机器人原型不少。像斯坦福和国内清华大学的学生团队都有相继推出类似的原型，商业领域的谷歌、苹果、微软等巨头也有推出类似服务。</p>

<p>提到机器人聊天，我想延伸再聊聊<strong>人工智能</strong>。正如<strong>图灵测试</strong>对人工智能的定义是<code>“你不知道对面是人还是机器的时候，你觉得他是人类”</code>。在我看来，基于经典的冯若依曼架构很难做到这一点。当然，如果把这个架构模型抽象出来，以后不管怎么进化，始终是大同小异。我对于现有的人工智能的理解是本质上基于大规模训练得到产生行为的数据，通过算法来匹配和构建方案给予人类反馈。</p>

<blockquote>
  <p>包括去年很出彩的<strong>AphlaGo</strong>，它本质上不具备真正的思维能力，只是通过人类的训练（机器自我对弈）生产行为数据和算法匹配来应对人类。话说回来，人类的大脑也是在不断的学习过程中，沉淀知识数据和构建一些应对外界的刺激给予反射行为，本质上抽象出来一样是处理事务的一套算法。俗话说做人要有一套以自己的为人处世的方式方法，抽象出来理解就是计算机算法。</p>
</blockquote>

<p>二是自助服务，所谓自助就是用机器人来增强业务上的某些场景服务体验，以达到好用户体验。举个栗子，假设你这时候不知道自己怎么学习英语，那么此时你可能需要一个学习顾问来给予帮助，并且顾问需要站在你的角度给一些学习方面的建设性的意见和方案。在这个过程中，顾问需要知道你是否对某些领域感兴趣、当前的英语水平、家庭住址等等。通过这些信息，顾问就帮你分析匹配最优资源和内容，以达到给予个性化学习方案。</p>

<p>顾问可以是一个人，也可以是一个机器人。TA们要做的事情是相同的，但机器比人更高效，特别适用在Online方面。前面也谈到了机器人聊天对于会话上下文的理解和处理，本质上这个聊天的能力会是自助服务的前置能力。首先要对用户的输入进行转换（例如，语音识别转文本），然后进行处理。也就是NLP的过程，理解用户上下文。当然，前置条件是我们已经对自己的学习资源和内容进行了索引，以及有课程方案的策略池。这样才能在经过NLP处理之后，匹配上资源和内容最终给用户产生个性化方案。</p>

<hr>

<h2 id="build">构建 /  Build</h2>

<p>虽然只是一个原型，我也会尽量在构建过程，以项目工程的形式来处理确保完整性。以下是在构建过程中用到的技术栈：</p>

<pre><code>服务器： CENTOS 7.2 / Ubuntu（Docker Image）
应用容器引擎： Docker
研究方向：Nature Language Process / Machine Learning
HTTP服务器： Nginx / uwsgi  
数据传输协议： JSON via HTTP
应用架构： RESTful
后端语言： Python
Python API框架： Flask / Flask_restful  
前端语言： Javascript / html / css
RIA框架： Angular.js  
前端开发工具： Pug / less / gulp
持久化：Mongodb
</code></pre>

<p>从Client/Presentation层面来说，原型提供的服务抽象出来也就是一个会话框，对用户而言功能很简单。考虑到基于Web技术栈，所以UI这块采用技术人员常用的前端神器<em>Bootstrap</em>布局构建，色调搭配随便参考了一个网上的。界面没有花太多精力，所以看起来比较粗糙，毕竟原型的侧重点不是在UI交互。最后原型客户端界面长成下面这样</p>

<p><img src="http://kev7n.com/content/images/2016/09/QQ20160922-0.png" alt="ChatBots"></p>

<p>前端框架到用到了谷歌开源的Angular.js、css用Less生成，html采用Pug生成，构建任务采用Gulp，这些基本上是前端开发的常见组合。后端开发语言用的是Python，它对于数据处理是天生友好，最关键在于有各种齐全的数学库，所以有很多数学科学家喜欢用它，有不少数据挖掘、网络爬虫等框架就基于它研发。平时比较喜欢用Flask框架，它足够轻量，开发语言就决定用Py了。对于采用Docker部署，这个就不用解释太多了吧，就一个字“好”。技术栈中规中矩，没有奇形怪状的框架或者采用特别小众的开发语言。数据的持久化这块，考虑到没有复杂的业务逻辑和业务关系，所以采用NOSQL数据库Mongodb。</p>

<p>本原型需要构建的重点在于后端提供的服务，复杂度主要是自然语言处理和学习内容映射这块。需要理解用户的输入然后内容匹配分析，然后构建方案响应给用户。对于理解用户的输入，本质上就是顾问对用户提问之后所收集的信息的进行分析。这个分析会包含标识化、句子切分、部分词性标注、名称抽取、组块、解析等过程，根据这些任务产生关键信息，最终用于学习内容的索引信息匹配。对关键信息的解析匹配之后，根据预置的方案策略池予以组合产生个性化学习方案提供给学生。考虑到原型的快速构建，基于现有NLP框架/服务来应用构建是最好的方案。对于NLP这块，成熟的方案/算法模型比较多，像斯坦福大学的CoreNLP就是个不错选择，支持大多数常用的任务，所以就选定了它来构建NLP服务器。</p>

<h2 id="deployment">部署 /  Deployment</h2>

<p>未完待续...</p>

<h2 id="theend">结束语 / The End</h2>

<p>所有源代码均开源（已完成60%）在 <a href="https://github.com/Hell0wor1d/chatbots">https://github.com/Hell0wor1d/chatbots</a></p>]]></content:encoded></item><item><title><![CDATA[【补丁】Nancy Support Hot-plugging]]></title><description><![CDATA[<h2 id="background">Background</h2>

<p>近段时间一直有Github网友联系我, 咨询关于<a href="https://github.com/NancyFx/Nancy">Nancy</a>支持Hot-plugging代码补丁的事情，于是便有了此篇博客。</p>

<p>去年，我有用到微软的技术栈做一些东西，其中用到了开源的Nancy框架。可惜的是它并不支持Hot-plugging，鉴于此，我阅读它的源码之后，做了一些简单的代码补丁已达到支持热插拔的目的。</p>

<p>_**注意：本补丁并未在生产环境中使用，仅做了热插拔测试，步骤很简单。</p>

<h2 id="codepatch">Code Patch</h2>

<h3 id="setp1">SETP 1</h3>

<h4 id="fileiroutecachecs">File IRouteCache.cs</h4>

<blockquote>
  <p>src/Nancy/Routing/IRouteCache.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp">    void Refresh ();
</code></pre>

<h4 id="fileroutecachecs">File RouteCache.cs</h4>

<blockquote>
  <p>/src/Nancy/Routing/RouteCache.cs</p>
</blockquote>

<p>Change RouteCache : Dictionary to  ConcurrentDictionary; <br>
Add new lines</p>]]></description><link>http://kev7n.com/2016/05/03/make-the-nancy-framework-support-hot-plugging/</link><guid isPermaLink="false">18891d4e-097e-4c4c-9206-e52b55572b52</guid><category><![CDATA[OPENSOURCE]]></category><category><![CDATA[HOT-PLUGGING]]></category><category><![CDATA[Nancy]]></category><category><![CDATA[Microsoft]]></category><category><![CDATA[Github]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Tue, 03 May 2016 04:20:17 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/nancy.png" medium="image"/><content:encoded><![CDATA[<h2 id="background">Background</h2>

<img src="http://kev7n.com/content/images/2016/05/nancy.png" alt="【补丁】Nancy Support Hot-plugging"><p>近段时间一直有Github网友联系我, 咨询关于<a href="https://github.com/NancyFx/Nancy">Nancy</a>支持Hot-plugging代码补丁的事情，于是便有了此篇博客。</p>

<p>去年，我有用到微软的技术栈做一些东西，其中用到了开源的Nancy框架。可惜的是它并不支持Hot-plugging，鉴于此，我阅读它的源码之后，做了一些简单的代码补丁已达到支持热插拔的目的。</p>

<p>_**注意：本补丁并未在生产环境中使用，仅做了热插拔测试，步骤很简单。</p>

<h2 id="codepatch">Code Patch</h2>

<h3 id="setp1">SETP 1</h3>

<h4 id="fileiroutecachecs">File IRouteCache.cs</h4>

<blockquote>
  <p>src/Nancy/Routing/IRouteCache.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp">    void Refresh ();
</code></pre>

<h4 id="fileroutecachecs">File RouteCache.cs</h4>

<blockquote>
  <p>/src/Nancy/Routing/RouteCache.cs</p>
</blockquote>

<p>Change RouteCache : Dictionary to  ConcurrentDictionary; <br>
Add new lines to class  </p>

<pre><code class="language-csharp">    private readonly INancyContextFactory contextFactory;
    private readonly INancyModuleCatalog moduleCatalog;
</code></pre>

<p>Add new lines to line 1 of class constructor  </p>

<pre><code class="language-csharp">    this.contextFactory = contextFactory;
    this.moduleCatalog = moduleCatalog;
</code></pre>

<p>Move the code of line <em><strong>39-44</strong></em> to a new method  </p>

<pre><code class="language-CSharp">    public void Refresh ()
    {
        var request = new Request ("GET", "/", "http");
        using (var context = contextFactory.Create (request)) {
            this.BuildCache (moduleCatalog.GetAllModules (context));
        }
    } 
</code></pre>

<h3 id="setp2">SETP 2</h3>

<h4 id="fileirouteresolvercs">File IRouteResolver.cs</h4>

<blockquote>
  <p>/src/Nancy/Routing/IRouteResolver.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp">    void RebuildTireAndCache ();
</code></pre>

<h4 id="filedefaultrouteresolvercs">File DefaultRouteResolver.cs</h4>

<blockquote>
  <p>src/Nancy/Routing/DefaultRouteResolver.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp">    public void RebuildTireAndCache ()
    {
        routeCache.Refresh ();
        this.BuildTrie ();
    }
</code></pre>

<h3 id="setp3">SETP 3</h3>

<h4 id="fileirequestdispatchercs">File IRequestDispatcher.cs</h4>

<blockquote>
  <p>/src/Nancy/Routing/IRequestDispatcher.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp ">    void Update ();
</code></pre>

<h4 id="filedefaultrequestdispatchercs">File DefaultRequestDispatcher.cs</h4>

<blockquote>
  <p>src/Nancy/Routing/DefaultRequestDispatcher.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp">    public void Update ()
    {
        routeResolver.RebuildTireAndCache ();
    }
</code></pre>

<h3 id="setp4">SETP 4</h3>

<h4 id="fileinancybootstrappercs">File INancyBootstrapper.cs</h4>

<blockquote>
  <p>src/Nancy/Bootstrapper/INancyBootstrapper.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp">    void RegisterModule (Type moduleType);
</code></pre>

<h4 id="filenancybootstrapperbasecs">File NancyBootstrapperBase.cs</h4>

<blockquote>
  <p>src/Nancy/Bootstrapper/NancyBootstrapperBase.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-csharp">    public abstract void RegisterModule (Type moduleType);
</code></pre>

<h4 id="filedefaultnancybootstrappercs">File DefaultNancyBootstrapper.cs</h4>

<blockquote>
  <p>/src/Nancy/DefaultNancyBootstrapper.cs</p>
</blockquote>

<p>Add new method  </p>

<pre><code class="language-CSharp">    public override void RegisterModule (Type moduleType)
    {
        //  var modules = AppDomainAssemblyTypeScanner
        //      .TypesOf&lt;INancyModule&gt; (ScanMode.ExcludeNancy)
        //      .NotOfType&lt;DiagnosticModule&gt; ()
        //      .Select (t =&gt; new ModuleRegistration (t))
        //      .Where (c =&gt; !Modules.Contains ())
        //      .ToArray ();
        var existingModule = Modules.Any (c =&gt; c.ModuleType == moduleType);
        if (existingModule) {
            throw new ArgumentException ("Duplicate NancyModule.");
        }
        var mr = new ModuleRegistration (moduleType);
        var newModules = Modules.ToList ();
        newModules.Add (mr);
        RegisterModules (this.Container, newModules);
        RegisterRequestContainerModules (this.Container, new[] { mr });
    }
</code></pre>

<h3 id="setp5">SETP 5</h3>

<h4 id="fileinancyenginecs">File INancyEngine.cs</h4>

<blockquote>
  <p>/src/Nancy/INancyEngine.cs
  Add new method  </p>
</blockquote>

<pre><code class="language-csharp">    void Update ();
</code></pre>

<h4 id="filenancyenginecs">File NancyEngine.cs</h4>

<blockquote>
  <p>/src/Nancy/NancyEngine.cs
  Add new method  </p>
</blockquote>

<pre><code class="language-csharp">    public void Update ()
    {
        dispatcher.Update ();
    }
</code></pre>

<h3 id="setp6">SETP 6</h3>

<p>Add the code below to your NancyHost, such as <strong>Nancy.Hosting.Self</strong></p>

<pre><code class="language-csharp">    public void AddModuleFromAssemblyPath (string moduleAssemblyPath)
    {
        var moduleAssembly = Assembly.LoadFrom (moduleAssemblyPath);
        AppDomainAssemblyTypeScanner.AddAssembliesToScan (moduleAssembly);
        var modules = moduleAssembly.GetExportedTypes ().Where (c =&gt; c.IsSubclassOf (typeof(NancyModule)) || c.IsAssignableFrom (typeof(NancyModule)));
        foreach (var module in modules) 
        {
            this.bootstrapper.RegisterModule (module);
            this.engine.Update ();
        }
    }
</code></pre>

<h2 id="howtouse">HOW TO USE?</h2>

<pre><code class="language-csharp">yourHost.AddModuleFromAssemblyPath(yourNewModuleAssemblyPath);  
</code></pre>]]></content:encoded></item><item><title><![CDATA[【待续 】 自制2K显示器、图像识别、物体追踪机器人]]></title><description><![CDATA[<p>近几年 IoT 领域的火热程度，相信大家都是有目共睹。不管是医疗、家电、汽车，还是智能穿戴设备无不被炒得火热，用日益更新来形成一点不夸张。各大公司也是在不断的挖掘人才和技术储备，并尝试设计相关产品来进行市场布局。作为技术领域从业者，一直把技术研究作为兴趣爱好，在这样的大背景下，怎能视而不见...</p>

<p>最近四五年的时间里，一直尝试着做一些自认为比较有意思的DIY和项目，涉及 Deep Learning/ROBOT OS/Image recognition等方面。为此还特地买了一些相关书籍并且结交了一些专业领域的朋友，以便于深入的了解和学习。对于 DL 方向，有尝试着做试卷主观题试卷的智能批改系统；ROBOT OS 方向，尝试着研究和扩展 ROS；IR 方向，尝试着做试卷拍照答疑的项目。当然，除了正儿八经的项目外，也涉及到比较逗比的项目，比如“智能马桶”。某日，在业内聊天群内和一帮朋友聊天，不知我的哪根神经短路，突然就囔囔着想要做一台智能马桶，称之为<code>“屎上最牛逼的马桶”</code>。首先它是<code></code></p>]]></description><link>http://kev7n.com/2015/12/24/diy-display-ipad-led-ocr-object-tracking/</link><guid isPermaLink="false">e48b3c60-ea59-4f5a-a40f-9493225322cc</guid><category><![CDATA[OCR]]></category><category><![CDATA[DIY]]></category><category><![CDATA[OBJECT-TRACKING]]></category><category><![CDATA[IPAD-LCD]]></category><category><![CDATA[RETAINE]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Thu, 24 Dec 2015 15:59:19 GMT</pubDate><content:encoded><![CDATA[<p>近几年 IoT 领域的火热程度，相信大家都是有目共睹。不管是医疗、家电、汽车，还是智能穿戴设备无不被炒得火热，用日益更新来形成一点不夸张。各大公司也是在不断的挖掘人才和技术储备，并尝试设计相关产品来进行市场布局。作为技术领域从业者，一直把技术研究作为兴趣爱好，在这样的大背景下，怎能视而不见...</p>

<p>最近四五年的时间里，一直尝试着做一些自认为比较有意思的DIY和项目，涉及 Deep Learning/ROBOT OS/Image recognition等方面。为此还特地买了一些相关书籍并且结交了一些专业领域的朋友，以便于深入的了解和学习。对于 DL 方向，有尝试着做试卷主观题试卷的智能批改系统；ROBOT OS 方向，尝试着研究和扩展 ROS；IR 方向，尝试着做试卷拍照答疑的项目。当然，除了正儿八经的项目外，也涉及到比较逗比的项目，比如“智能马桶”。某日，在业内聊天群内和一帮朋友聊天，不知我的哪根神经短路，突然就囔囔着想要做一台智能马桶，称之为<code>“屎上最牛逼的马桶”</code>。首先它是<code>刚需</code>，其次它具有的想象空间很大（能集成的东西太多）。它将会具备以下功能：</p>

<pre><code>1. 通过智能分析日常的分泌物排泄，来识别使用者的健康程度。通过尿液取样分析可以得出很多健康的报告，数据上传至云端，可以打通至医疗机构；  
2. 基本的智能系统集成，各种信息预报；  
3. 称体重/按摩等  
</code></pre>

<p>关于马桶，后续我也会写一篇文章来具体的描述和介绍这一逗比的想法。</p>

<p>两年前，在业余时间DIY了一台2K显示器和一个能够图像识别、物体追踪的机器人原型。原本断断续续的记录过一些内容，苦于一直没有时间整理，总是那么一个理由 “实在是时间不够用”。最近一段时间，我会陆陆续续的把关于这些方面的研究内容、设计思路以及制作过程整理成一系列的文章记录下来，期望能帮助到一些喜欢动手和喜爱智能技术的爱好者。
内容会涵盖硬件和软件两部分，硬件部分主要是记录如何基于现有的元器件来定制，以及一些组合技巧以及DIY过程中需要规避深坑的要点。另外，我不会直接采用元器件套件，那样就失去 DIY 的趣味，在我看来最有意思的莫过于分析和思考的过程；软件部分会包括驱动编写、控制器编写及图像识别处理组件等方面，涉及到软件部分的是我自认为的强项，所以会记录的更深入一些。</p>

<p>目录（更新中）</p>

<ol>
<li><a href="http://kev7n.com/2015/12/24/diy-display-ipad-led-ocr-object-tracking/#1">基于 IPad 液晶面板 DIY 2K 显示器</a>  </li>
<li><a href="http://kev7n.com/2015/12/24/diy-display-ipad-led-ocr-object-tracking/#2">图像识别以及物体追踪机器人原型</a>  </li>
<li><a href="http://kev7n.com/2015/12/24/diy-display-ipad-led-ocr-object-tracking/#3">“屎上”最牛逼的马桶</a></li>
</ol>

<hr>

<h2 id="aid1aipaddiy2k"><a id="1"></a>基于 IPad 液晶面板 DIY 2K 显示器  </h2>

<p>自从苹果的视网膜屏的出现，让我对于显示屏分辨率的要求上升到了一个新的基准。突然有一天就很想基于它的显示面板来自制一个高分率的显示器，于是便有来接下来的事情：基于IPad Retina屏DIY一个2K高分辨率的自制显示器。</p>

<p>通常情况下，一台液晶显示器包含两个重要的部分：液晶面板和驱动板。顾名思义液晶面板主要用于显示，而驱动板则用来驱动显示面板。由于苹果对自己的硬件一贯的采取严格保护措施，所以想基于它的显示屏来DIY显示器还是需要花一定的时间来研究。</p>

<p>对于液晶面板，我们很容易通过淘宝来购买二手配件，但是对于驱动版可就不是那么容易的事情，因为苹果一贯采取非主流的路线，所以基本上不可能随便找块驱动板来驱动显示屏。首先要做的就是来分析它的显示面板接口协议，苹果采用的是<code>eDisplayPort</code>协议，这是一种基于<code>DisplayPort</code>的扩展协议（相对于<code>DVI/HDMI</code> 等接口协议，相信大家都是比较熟悉）。在HACKADAY上，有文章放出破解的过程 (由于鄙人在此时只是业余的硬件 DIY 爱好者，所以还无法达到完完全全自主破解苹果硬件的水准，可以先学习下别人的思路)，这里就不详述，具体的可以参考这里：
<a href="http://hackaday.com/2013/04/22/connect-a-retina-display-to-a-regular-computer/">http://hackaday.com/2013/04/22/connect-a-retina-display-to-a-regular-computer/</a></p>

<p><strong>所需配件</strong>：</p>

<pre><code>显示屏: IPAD 3 Retina 9.7' LCD Display
驱动板：某捷克DIY 玩家自制
电源：12V DC（很容易淘到）
</code></pre>

<p>以下是我 DIY 完成后，点亮分屏显示 DOTA2 的效果图：</p>

<p><img src="http://kev7n.com/content/images/2015/12/2013-10-19T17-41-00_12.jpg" alt="">
<img src="http://kev7n.com/content/images/2015/12/2013-10-19T17-41-00_10.jpg" alt=""></p>

<hr>

<h2 id="aid2a"><a id="2"></a>图像识别以及物体追踪机器人原型  </h2>

<p>先放上视频吧，后续会继续更新制作过程（原本是想把视频引用嵌入本页面里，但优酷目前不支持https分享，无奈）：
<a href="http://player.youku.com/embed/XNjg1NTYwMjQ4">传送门</a></p>]]></content:encoded></item><item><title><![CDATA[【应用】应用层非宿主方式绑定SSL证书至特定端口]]></title><description><![CDATA[<h2 id="">本文背景</h2>

<p>最近项目上用到微软的技术栈，需要用到Windows Server支持服务的运行。应用层采用Self-Hosting的形式提供HTTP REST API服务，考虑到安全性需升级支持SSL，并将证书绑定至端口。常见的通过IIS/Apache/Nginx等宿主的形式部署HTTPS服务很方便，涉及到自定义应用程序的Self-Hosting，需要做一些简单的端口绑定操作。虽不是本职工作，考虑到帮队友分担任务，协助研究如何配置。这里我将配置的过程及配置说明记录，以帮助其他有此需求的网友。</p>

<h2 id="">操作步骤</h2>

<p><strong>证书的安装及指纹查看</strong></p>

<ol>
<li>获取已颁发的SSL证书，双击打开证书查看常规信息，如果先前尚未安装此证书，则双击安装证书，按照流程安装证书即可，如下图所示：</li>
</ol>

<p><img src="http://kev7n.com/content/images/2015/12/CER.png" alt=""></p>

<ol>
<li>在详细信息Tab页查看及复制证书指纹，这里是后面需要用到的。如下图：</li>
</ol>

<p><img src="http://kev7n.com/content/images/2015/12/cer-2.png" alt=""></p>

<p><strong>绑定证书到端口配置</strong></p>

<p>在Server 2008及以上版本中，使用 Netsh.exe 工具查看当前端口配置。打开CMD，输入：</p>

<pre><code>netsh http show sslcert  
</code></pre>

<p>即可查看当前已经绑定的证书明细，该操作主要了解当前已绑定的端口号及证书信息。如果你要绑定的端口是100端口，那么执行以下操作命令：</p>

<pre><code>netsh http add</code></pre>]]></description><link>http://kev7n.com/2015/12/17/ssl-configuration-bind-to-specific-port/</link><guid isPermaLink="false">7a34c6d4-0468-4438-982b-ef85f949322d</guid><category><![CDATA[SELF-HOSTING]]></category><category><![CDATA[NETSH]]></category><category><![CDATA[SSL]]></category><category><![CDATA[SERVER]]></category><category><![CDATA[Domain certificate]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Thu, 17 Dec 2015 07:39:28 GMT</pubDate><content:encoded><![CDATA[<h2 id="">本文背景</h2>

<p>最近项目上用到微软的技术栈，需要用到Windows Server支持服务的运行。应用层采用Self-Hosting的形式提供HTTP REST API服务，考虑到安全性需升级支持SSL，并将证书绑定至端口。常见的通过IIS/Apache/Nginx等宿主的形式部署HTTPS服务很方便，涉及到自定义应用程序的Self-Hosting，需要做一些简单的端口绑定操作。虽不是本职工作，考虑到帮队友分担任务，协助研究如何配置。这里我将配置的过程及配置说明记录，以帮助其他有此需求的网友。</p>

<h2 id="">操作步骤</h2>

<p><strong>证书的安装及指纹查看</strong></p>

<ol>
<li>获取已颁发的SSL证书，双击打开证书查看常规信息，如果先前尚未安装此证书，则双击安装证书，按照流程安装证书即可，如下图所示：</li>
</ol>

<p><img src="http://kev7n.com/content/images/2015/12/CER.png" alt=""></p>

<ol>
<li>在详细信息Tab页查看及复制证书指纹，这里是后面需要用到的。如下图：</li>
</ol>

<p><img src="http://kev7n.com/content/images/2015/12/cer-2.png" alt=""></p>

<p><strong>绑定证书到端口配置</strong></p>

<p>在Server 2008及以上版本中，使用 Netsh.exe 工具查看当前端口配置。打开CMD，输入：</p>

<pre><code>netsh http show sslcert  
</code></pre>

<p>即可查看当前已经绑定的证书明细，该操作主要了解当前已绑定的端口号及证书信息。如果你要绑定的端口是100端口，那么执行以下操作命令：</p>

<pre><code>netsh http add sslcert ipport=0.0.0.0:100 certhash=1d12a7c3e39524777730c13e017724b4c146aaaa appid={3fa83ee8-a2e9-11e5-bf7f-feff819caaaa} clientcertnegotiation=enable  
</code></pre>

<p><strong>注意</strong>：<code>certhash</code>是先前查看及复制的<code>证书指纹</code>，而<code>Appid</code>则是唯一的程序标示符（可来自于应用程序集的GUID，也可以是随机生成，便于以后查看哪个程序绑定了该端口的证书）。需要注意的是同一个应用程序对于同一个端口的监听要么是HTTP要么是HTTPS，否则会发生冲突（同一个端口已启用HTTP监听，再启用HTTPS监听会冲突报错）。</p>

<p>执行成功之后，打开<a href="https://xxx.com:100">https://xxx.com:100</a> 即可访问，这里的xxx.com域名必须是注册证书对应的域名。如果添加及测试完毕之后，需要删除绑定，则执行以下命令：</p>

<pre><code>netsh http delete sslcert ipport=0.0.0.0:100  
</code></pre>

<h2 id="">可能会遇到的问题</h2>

<ol>
<li>执行netsh时遇到1312的错误，具体表现为提示错误“未能添加SSL证书，错误：1312。指定的登录会话不存在，可能已被终止。</li>
</ol>

<blockquote>
  <p>如果出现上述问题，是因为生成证书的服务器与要安装此证书的服务器不是同一台。如果在证书管理器中查看证书时，会发现少了左下角的一个提示“您有一个与该证书对应的私钥”。那么只需要导入证书时导入带私钥的pfx文件即可。相关证书区别如下：</p>
  
  <p>1.带有私钥的证书 <br>
  由Public Key Cryptography Standards #12，PKCS#12标准定义，包含了公钥和私钥的二进制格式的证书形式，以pfx作为证书文件后缀名。 </p>
  
  <p>2.二进制编码的证书 <br>
  证书中没有私钥，DER 编码二进制格式的证书文件，以cer作为证书文件后缀名。 </p>
</blockquote>]]></content:encoded></item><item><title><![CDATA[【逆向】分析并编写优酷MP4文件补丁]]></title><description><![CDATA[<p>春节期间，手机上给家里人下载了一些优酷的戏曲视频，导出手机后无法播放，唯独能使用优酷的手机客户端播放。遇到这种情况，作为挨踢狗，多半是无法忍的。正所谓混迹挨踢江湖十几年，或多或少都有点犟劲儿，越不让使越要折腾...</p>

<p>前面提到只能使用优酷的播放器播放，基本上可以得出一些推断：</p>

<pre><code>1，要么对源文件采用了自己的编码格式，所谓的MP4文件名后缀只是假象;  
2，要么对文件格式做了手脚，或者说是对文件进行了加密处理；  
</code></pre>

<p>接下来要做的一件事情就是分析已下载的文件，来验证我们的推断是否正确。在分析之前先简单了解下MP4的格式，如下图所示：
<img src="http://kev7n.com/content/images/2015/09/2011101710133455.jpg" alt="DESCRIPTION"></p>

<p>通过以上表格，我们对MP4文件格式有了一定的了解。现在来把已经下载的这些文件进行采样对比分析（如下图所示），随机打开四个文件，可以发现它们有以下共同点:</p>

<pre><code>1，前2字节都被改成了YK，我琢磨着应该是Youku的缩写；  
2，除了filetype（ftyp）之后，其它该有的都有；  
</code></pre>

<p><img src="http://kev7n.com/content/images/2015/09/B787B983-231D-44C0-9F49-916E0AD4DEA5.jpg" alt="FTYP"></p>

<p>基本上可以验证我们先前的推断是正确的：下载的文件未被加密，优酷的开发人员只是对原视频文件做了点小手脚。这样以来那可真省了不少事，否则就得静态分析其反汇编代码，以及调试程序来研究其加密算法，然后进行解密。</p>

<p>我们继续来分析，既然没有<code>ftyp</code>播放器是无法识别以及播放的，那么恢复它是否就意味着视频文件被修复了？那就来着手修复，优酷播放器能播放下载的视频，</p>]]></description><link>http://kev7n.com/2015/09/12/yk-mp4-patcher/</link><guid isPermaLink="false">4fcdaf77-13f8-4ebd-813f-33e3a59f7a8c</guid><category><![CDATA[Youku]]></category><category><![CDATA[MP4]]></category><category><![CDATA[CRACK]]></category><category><![CDATA[PATCH]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Sat, 12 Sep 2015 07:58:00 GMT</pubDate><content:encoded><![CDATA[<p>春节期间，手机上给家里人下载了一些优酷的戏曲视频，导出手机后无法播放，唯独能使用优酷的手机客户端播放。遇到这种情况，作为挨踢狗，多半是无法忍的。正所谓混迹挨踢江湖十几年，或多或少都有点犟劲儿，越不让使越要折腾...</p>

<p>前面提到只能使用优酷的播放器播放，基本上可以得出一些推断：</p>

<pre><code>1，要么对源文件采用了自己的编码格式，所谓的MP4文件名后缀只是假象;  
2，要么对文件格式做了手脚，或者说是对文件进行了加密处理；  
</code></pre>

<p>接下来要做的一件事情就是分析已下载的文件，来验证我们的推断是否正确。在分析之前先简单了解下MP4的格式，如下图所示：
<img src="http://kev7n.com/content/images/2015/09/2011101710133455.jpg" alt="DESCRIPTION"></p>

<p>通过以上表格，我们对MP4文件格式有了一定的了解。现在来把已经下载的这些文件进行采样对比分析（如下图所示），随机打开四个文件，可以发现它们有以下共同点:</p>

<pre><code>1，前2字节都被改成了YK，我琢磨着应该是Youku的缩写；  
2，除了filetype（ftyp）之后，其它该有的都有；  
</code></pre>

<p><img src="http://kev7n.com/content/images/2015/09/B787B983-231D-44C0-9F49-916E0AD4DEA5.jpg" alt="FTYP"></p>

<p>基本上可以验证我们先前的推断是正确的：下载的文件未被加密，优酷的开发人员只是对原视频文件做了点小手脚。这样以来那可真省了不少事，否则就得静态分析其反汇编代码，以及调试程序来研究其加密算法，然后进行解密。</p>

<p>我们继续来分析，既然没有<code>ftyp</code>播放器是无法识别以及播放的，那么恢复它是否就意味着视频文件被修复了？那就来着手修复，优酷播放器能播放下载的视频，基本上可推断出优酷播放器在播放的时候对视频文件进行了除解码外的补丁操作，那么我们只需要给源文件修复格式即可。</p>

<p>很遗憾的是加上ftyp之后，视频依旧无法播放，推测可能在其它地方也做了手脚。经过仔细的分析对比，果不其然，优酷的工程师把ftyp移动到文件尾部（如下图所示，此处省略100字...）。</p>

<p><img src="http://kev7n.com/content/images/2015/09/2402EEA3-7896-4F01-AFD4-46A9E7D5AF15.jpg" alt="EOF"></p>

<p>最后，修复的解决方案：</p>

<pre><code>移除文件结尾倒数8字节并替换文件起始8字节即可。
</code></pre>

<p>往往得出的解决方案是简单的，而分析的过程还是需要折腾折腾。附上用golang写的一个补丁器(源码)：<a href="https://github.com/Hell0wor1d/youkuMP4Patcher">传送门</a>
请自行编译。测试结果如下图所示：</p>

<p><img src="http://kev7n.com/content/images/2015/09/mac.jpg" alt="TESTING"></p>]]></content:encoded></item><item><title><![CDATA[【迁移】新博客语法高亮插件配置]]></title><description><![CDATA[<p>最近把博客迁移至GHOST，所以很多东西都需要重新整理和配置。对于喜欢敲代码的人而言，语法高亮是必不可缺的需求，毫无疑问，首先配置这个插件。原本是想写篇日志测试下配置后的插件显示效果，索性把过程记录下来。因为主要目的是插件应用，所以这里就<strong>不</strong>深入到阅读源码和代码层面的分析，没有太多内容可写，直接上干货了。<strong>对于想看湿货的朋友，可以直接忽略后面的内容。</strong></p>

<p>语法高亮的插件，我用的是：<a href="http://prismjs.com/">prismjs</a>, 它能高亮显示的语言种类很多，皮肤也有好几套，很赞。使用方式也很简单，见以下步骤：</p>

<h2 id="">安装插件</h2>

<ol>
<li>打开下载页面: <a href="http://prismjs.com/download.html">传送门</a>  </li>
<li>配置选项，勾选自己偏好的皮肤、语言以及附加功能。这点做的很人性化，按需配置  </li>
<li>配置完毕之后，在页面底部点击下载<code>prism.js</code>和<code>prism.css</code>两个文件  </li>
<li>把这两个文件上传至服务器  </li>
<li>复制<code>prism.js</code>到：<code>ghost/content/themes/xxx/assets/</code></li></ol>]]></description><link>http://kev7n.com/2015/06/16/pei-zhi-xin-bo-ke-yu-fa-gao-liang-cha-jian/</link><guid isPermaLink="false">a0ec5545-84bf-4ddc-90a6-0adad862f499</guid><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Tue, 16 Jun 2015 13:43:09 GMT</pubDate><content:encoded><![CDATA[<p>最近把博客迁移至GHOST，所以很多东西都需要重新整理和配置。对于喜欢敲代码的人而言，语法高亮是必不可缺的需求，毫无疑问，首先配置这个插件。原本是想写篇日志测试下配置后的插件显示效果，索性把过程记录下来。因为主要目的是插件应用，所以这里就<strong>不</strong>深入到阅读源码和代码层面的分析，没有太多内容可写，直接上干货了。<strong>对于想看湿货的朋友，可以直接忽略后面的内容。</strong></p>

<p>语法高亮的插件，我用的是：<a href="http://prismjs.com/">prismjs</a>, 它能高亮显示的语言种类很多，皮肤也有好几套，很赞。使用方式也很简单，见以下步骤：</p>

<h2 id="">安装插件</h2>

<ol>
<li>打开下载页面: <a href="http://prismjs.com/download.html">传送门</a>  </li>
<li>配置选项，勾选自己偏好的皮肤、语言以及附加功能。这点做的很人性化，按需配置  </li>
<li>配置完毕之后，在页面底部点击下载<code>prism.js</code>和<code>prism.css</code>两个文件  </li>
<li>把这两个文件上传至服务器  </li>
<li>复制<code>prism.js</code>到：<code>ghost/content/themes/xxx/assets/js</code>文件夹，注意<strong>xxx</strong>是模板名称  </li>
<li>复制<code>prism.css</code>到<code>ghost/content/themes/xxx/assets/css</code>文件夹  </li>
<li>编辑<code>ghost/default.hbs</code>文件</li>
</ol>

<p>在模板页<strong>顶</strong>部添加<code>css</code>文件链接</p>

<pre><code class="language-markup">  &lt;link rel="stylesheet" href="{{asset 'css/prism.css'}}" /&gt;
</code></pre>

<p>在模板页<strong>底</strong>部添加<code>js</code>文件链接，也可以在<code>ghost/content/themes/xxx/partials/footer.hbs</code>文件里面添加。</p>

<pre><code class="language-markup">  &lt;script src="{{asset 'js/prism.js'}}"&gt;&lt;/script&gt;
</code></pre>

<h2 id="">如何使用</h2>

<p>在Ghost后台编辑日志内容，添加如下内容进行测试：</p>

<pre><code>    ```language-markup
     &lt;h1&gt;Hello, World!&lt;/h1&gt;
    ```
</code></pre>

<p>对于其它语言，格式为<strong><code>language-name</code></strong>，只需将<code>name</code>替换成你想高亮的语言名称即可，使用起来很便捷。</p>

<h2 id="">语法高亮测试</h2>

<p>以下测试代码未经过编译测试，如果发现有输入错误，请无视。</p>

<h3 id="c">c</h3>

<pre><code class="language-c">#include &lt;stdio.h&gt;

void main(void)  
{
    printf("hello, world!");
}
</code></pre>

<h3 id="python">python</h3>

<pre><code class="language-python">def say(something):  
    print(something)

if ___name__ == '__main__':  
    say('Hello, world!')
</code></pre>

<h3 id="javascript">javascript</h3>

<pre><code class="language-javascript">function say(something){  
    alert(something)
}

say('Hello, world!');
</code></pre>

<h3 id="c">c++</h3>

<pre><code class="language-c++">#include &lt;iostream&gt;
using namespace std;

int main(int args, char **argv)  
{
    cout&lt;&lt;"hello, world!"&lt;&lt;endl;
    return 0;
}
</code></pre>

<h3 id="go">go</h3>

<pre><code class="language-go">package main

import(  
    "fmt"
)

func main(){  
    fmt.Println("Hello, world!")
}
</code></pre>]]></content:encoded></item><item><title><![CDATA[【迁移】博客搬家之《这些年，那些事》]]></title><description><![CDATA[<p>时光如梭，从发布自己的第一篇网络日志至今已消逝近十五载。回顾这些年，一些人一些事儿，整理写下来作为新博客的开篇日志...</p>

<p>时间的流逝中，记忆总会被切割成一小块一小块的存储在脑细胞中，大脑里所存储的记忆碎片也越积越多。如同计算机磁盘存储的原理那样，如果不在某一个时间点去整理这些碎片，读取过往的回忆会变得很艰难。常常想尝试去通过某种方式来整理这些碎片，从最初的日记本，到后来的网络日志，或许找起来不会再那么困难。</p>

<p>我常常以为，记忆是非常容易被模糊的东西，但是总会有那么些刻骨的记忆，会顽固的粘在磁头上。</p>

<h2 id="">"捣腾"的岁月</h2>

<p>依稀记得第一次搭架博客是采用国内一款早期开源博客系统，服务器是一位青海的网友友情赞助。那时，很多朋友问我："有那么多的服务商提供博客空间，为何你却偏偏要自己捣腾？"。其实，我也问过自己同样的问题，甚至一段时间内质疑自己是不是太无聊。后来给自己找了一个借口，技术出生的或多或少都有点强迫症？</p>

<p>前面提到青海的那位网友，至今，现实生活中我们也未曾谋面，仅仅通过互联网联系。可能会有人问"在网络骗子横行的年代，你们是怎样做到彼此信任?",答案其实很简单那就是“同道”。兴趣支撑着我们之间沟通的桥梁，也让我们在不断的沟通中建立了信任关系。俗话说“<strong>道不同，不相为谋</strong>”，也正是这样，让两个追技术狂热的人相识相知。可能也正是因为复杂的网络环境，让彼此在找到同道中人之后，</p>]]></description><link>http://kev7n.com/2015/06/16/some-things/</link><guid isPermaLink="false">fd71f629-a159-440b-8adb-45d55ee6f358</guid><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Tue, 16 Jun 2015 07:37:37 GMT</pubDate><content:encoded><![CDATA[<p>时光如梭，从发布自己的第一篇网络日志至今已消逝近十五载。回顾这些年，一些人一些事儿，整理写下来作为新博客的开篇日志...</p>

<p>时间的流逝中，记忆总会被切割成一小块一小块的存储在脑细胞中，大脑里所存储的记忆碎片也越积越多。如同计算机磁盘存储的原理那样，如果不在某一个时间点去整理这些碎片，读取过往的回忆会变得很艰难。常常想尝试去通过某种方式来整理这些碎片，从最初的日记本，到后来的网络日志，或许找起来不会再那么困难。</p>

<p>我常常以为，记忆是非常容易被模糊的东西，但是总会有那么些刻骨的记忆，会顽固的粘在磁头上。</p>

<h2 id="">"捣腾"的岁月</h2>

<p>依稀记得第一次搭架博客是采用国内一款早期开源博客系统，服务器是一位青海的网友友情赞助。那时，很多朋友问我："有那么多的服务商提供博客空间，为何你却偏偏要自己捣腾？"。其实，我也问过自己同样的问题，甚至一段时间内质疑自己是不是太无聊。后来给自己找了一个借口，技术出生的或多或少都有点强迫症？</p>

<p>前面提到青海的那位网友，至今，现实生活中我们也未曾谋面，仅仅通过互联网联系。可能会有人问"在网络骗子横行的年代，你们是怎样做到彼此信任?",答案其实很简单那就是“同道”。兴趣支撑着我们之间沟通的桥梁，也让我们在不断的沟通中建立了信任关系。俗话说“<strong>道不同，不相为谋</strong>”，也正是这样，让两个追技术狂热的人相识相知。可能也正是因为复杂的网络环境，让彼此在找到同道中人之后，更加珍惜这份友情。</p>

<p>或许是因为年轻气盛，亦或是时间充裕，常常想着捣鼓一些玩意儿。博客换模板、修复漏洞，然后跟别人互黑系统，以证明各自的技术精湛。事实上，这段时期严重偏离了搭建博客的初衷，或者说是纯粹是为了好玩儿。如果我没记错的话，在某一年的时间内，日志产出量基本为个位数。当然如果没有这个捣腾的岁月也不会有如今的内容，更或者说不会遇到那些喜欢技术捣腾的小伙伴们。</p>

<p>特别是高中毕业进入大学之后，其实有很多可写的故事。记得曾经有一个月为了写个反病毒软件，连续一个多月凌晨5点才睡，早上8点就起，跟疯了一样。还有好多类似的记忆小插曲，现在回忆起来很庆幸那会没因这些疯狂地举动，而造成无法挽回的悲剧，活着真好。</p>

<p>虽然有很多可以写的东西，也搭建了博客，可就不曾坚持记录所发生的点点滴滴。当然，没有那么多理由可以找给自己，就一个字"懒"...</p>

<h2 id="">"忙碌"的岁月</h2>

<p>大学毕业之后，忙碌便是不可避免的话题。遇到很多事情总是以"忙"来搪塞自己，但是相比之下，对于纯粹为了捣腾的岁月而言，似乎理智了许多，也会偶尔静下心来写点东西。说来也巧，这段岁月的博客空间也是一个好友分享的，后来在现实生活中也成了无话不说的好基友，这里也特别感谢他。</p>

<p>记得当初跟这位好友相识的时候，有段小插曲。我无意中发现了一个开源项目，很显然，这个项目的发起人正好是他。由于有喜欢看源码的癖好，所以也就习惯性的研究了一番，正好发现了几个安全漏洞，于是很无聊的入侵了他的网站。而后加了他好友，并告诉他的系统存在安全隐患。自那之后，便一发不可收拾，成了好基友，一起来到北京，这里可说是惺惺相惜吗？...</p>

<p>说到忙碌，有段时间居然忙到忘了给自己的博客域名续费，而后不得不重新注册一个域名，开始了新的博客，博客系统也换成了WP。在这段岁月里，我尝试记录了很多发生在生活里的一些琐事，也有一些技术相关的日志，很享受这段岁月。大多数情况下的忙碌，似乎都是沉浸在敲代码的时间里。或许这也就是为什么很多程序猿都喜欢往博客里面贴大堆的代码，却鲜见有文字叙述的原因之一吧，因为都在忙着写代码？</p>

<p>虽然打上了"忙碌"的标签，偶尔也会跑去逛逛好友的博客。每次看到订阅的更新日志，都会在内心一阵嘀咕："这货怎么就这么勤快，居然又写了篇日志"。后来微博盛行，由互动性更强，很快便爆火。微博更易于记录碎片化的事情，也更适合我这类号称忙碌之人使用，以至于一段时间内成了微博话唠...</p>

<p>后来由于域名备案号被注销，而又不想被这帮人倒腾，索性租用了国外的服务器，博客迁移至了墙外，后来包括域名也转到了国外服务商。虽然线路会偶尔抽风，起码在心觉上自由了许多。</p>

<h2 id="">归真返璞</h2>

<p>随着工作和社会经验的积累，越来越反感一些将问题复杂化的处事方式。在工作上，那些本身可以用很简单的方案就解决的问题，而一些人却总是用很复杂的方式思考；在人际往来中，本来有些人或物是很单纯和友善的，却总是会被无端的猜忌，以至于让关系变得很复杂。KISS原则适用于太多场景，不管是工作还是为人处世。现在，在我看来"懒"字很受用。</p>

<p>随着时间的推移，愈发觉得WP太过臃肿，已经不能再称之为Blog系统，而是复杂的CMS。我对于博客的功能需求量，显然也只是WP功能集的一个小小的子集。在我看来，系统越繁琐、代码量越多，越容易出现安全隐患，当然这不是必然的因果关系，但是在相当大的程度上增加了出现问题的概率。WP也逃离不了这个魔咒，时不时的会爆出一些安全漏洞。前段时间就因为一个穷举漏洞，被无端的攻击直至流量被耗尽然后拒绝服务...对于我这类小P民而言，服务器没有硬防、没有富裕的带宽量，遇到这类拒绝服务式攻击只能无可奈何。</p>

<p>经历过"倒腾"、"忙碌"的岁月之后，开始理智的对待一些事儿。依旧喜欢倒腾，依旧会很忙碌，但已经开始尝试去调和它们，享受当下的日子。现在，每月都会要求自己至少读一本书，关上电脑静心的深入思考一些问题。</p>

<p>目前老博客依旧存在，还不会关闭，以后不会再更新日志。这里将会是新的博客，归真返璞，简单便是享受。</p>]]></content:encoded></item><item><title><![CDATA[【随拍】北京四月妙峰山之旅]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>四月初，跟一些同事出游号称北京第二高峰的妙峰山。下面是路途中的一些随拍</p>

<h1 id="">小插曲</h1>

<p>2016年在迁移这篇文章的时候，挺有感触的。翻出六年前的照片集，看到这张Team的合影，看到曾经的战友感触颇深。回想起大家现在的去处，也都还算不错，也挺欣慰。之所以感触很深，可能只是因为跟着他们一起成长了很多，留下的许多欢乐的记忆。</p>

<ol>
<li>左一：去了Gameloft深圳工作室  </li>
<li>左二：回美国创业，现任某司创始人  </li>
<li>左二前面的：ME  </li>
<li>左三：从金山离职回武汉创业  </li>
<li>左四：从百度离职去澳大利亚读书深造  </li>
<li>右一：从云壤离职去了金融行业  </li>
<li>右二：从亚马逊离职回武汉创业，现任某司创始人  </li>
<li>右三：从海豚浏览器离职去闯荡金融行业  </li>
<li>右三前面的：目前是某搜索公司的CEO  </li>
<li>右四：去美国留学读书深造</li>
</ol>

<p><img src="http://kev7n.com/content/images/2016/05/25.png" alt=""></p>

<h1 id="davidtom">两位老板 David &amp; Tom</h1>

<p><img src="http://kev7n.com/content/images/2016/05/12.png" alt="">
<img src="http://kev7n.com/content/images/2016/05/30.png" alt=""></p>

<h1 id="">路途中</h1>

<p><img src="http://kev7n.com/content/images/2016/05/2-1.png" alt=""></p>

<h1 id="">北京郊外的农家小院</h1>

<p><img src="http://kev7n.com/content/images/2016/05/3-1.png" alt=""></p>

<p><img src="http://kev7n.com/content/images/2016/05/4-1.png" alt=""></p>

<p><img src="http://kev7n.com/content/images/2016/05/5-2.png" alt=""></p>

<h1 id="">路途中遇到的毛驴小队</h1>

<p>这里有个小插曲，特有意思。</p>]]></description><link>http://kev7n.com/2010/04/09/miao-feng-shan/</link><guid isPermaLink="false">491074e8-ba91-4804-88da-5d3a3c8e98e9</guid><category><![CDATA[同事]]></category><category><![CDATA[郊游]]></category><category><![CDATA[妙峰山]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Thu, 08 Apr 2010 21:23:24 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/33-1.png" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/33-1.png" alt="【随拍】北京四月妙峰山之旅"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>四月初，跟一些同事出游号称北京第二高峰的妙峰山。下面是路途中的一些随拍</p>

<h1 id="">小插曲</h1>

<p>2016年在迁移这篇文章的时候，挺有感触的。翻出六年前的照片集，看到这张Team的合影，看到曾经的战友感触颇深。回想起大家现在的去处，也都还算不错，也挺欣慰。之所以感触很深，可能只是因为跟着他们一起成长了很多，留下的许多欢乐的记忆。</p>

<ol>
<li>左一：去了Gameloft深圳工作室  </li>
<li>左二：回美国创业，现任某司创始人  </li>
<li>左二前面的：ME  </li>
<li>左三：从金山离职回武汉创业  </li>
<li>左四：从百度离职去澳大利亚读书深造  </li>
<li>右一：从云壤离职去了金融行业  </li>
<li>右二：从亚马逊离职回武汉创业，现任某司创始人  </li>
<li>右三：从海豚浏览器离职去闯荡金融行业  </li>
<li>右三前面的：目前是某搜索公司的CEO  </li>
<li>右四：去美国留学读书深造</li>
</ol>

<p><img src="http://kev7n.com/content/images/2016/05/25.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="davidtom">两位老板 David &amp; Tom</h1>

<p><img src="http://kev7n.com/content/images/2016/05/12.png" alt="【随拍】北京四月妙峰山之旅">
<img src="http://kev7n.com/content/images/2016/05/30.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">路途中</h1>

<p><img src="http://kev7n.com/content/images/2016/05/2-1.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">北京郊外的农家小院</h1>

<p><img src="http://kev7n.com/content/images/2016/05/3-1.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/4-1.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/5-2.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">路途中遇到的毛驴小队</h1>

<p>这里有个小插曲，特有意思。前面领队的是一只狼狗，很聪明，没有主人在那里，它独自带着毛驴队伍前进，管理的很有次序。</p>

<p><img src="http://kev7n.com/content/images/2016/05/6.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/7.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/8.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/9.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">坐落在大山里面的山村</h1>

<p><img src="http://kev7n.com/content/images/2016/05/10.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/11.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">荒山野岭</h1>

<p><img src="http://kev7n.com/content/images/2016/05/13.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/15.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/16.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">艰难的爬行中</h1>

<p><img src="http://kev7n.com/content/images/2016/05/18.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="david">入口处David留影</h1>

<p><img src="http://kev7n.com/content/images/2016/05/19.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="tom">我跟Tom在佛碑前合影</h1>

<p>我的表情有点YD。</p>

<p><img src="http://kev7n.com/content/images/2016/05/20.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/21.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/24.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/26.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/28.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/31.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/32.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/33.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/34.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/36.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p><img src="http://kev7n.com/content/images/2016/05/37.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">哥爬的不是山，是寂寞</h1>

<p><img src="http://kev7n.com/content/images/2016/05/39.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">一个人找一个点，远眺大山深处</h1>

<p><img src="http://kev7n.com/content/images/2016/05/40.png" alt="【随拍】北京四月妙峰山之旅">
<img src="http://kev7n.com/content/images/2016/05/41.png" alt="【随拍】北京四月妙峰山之旅"></p>

<h1 id="">爬坐落于山顶的铁塔</h1>

<p><img src="http://kev7n.com/content/images/2016/05/42.png" alt="【随拍】北京四月妙峰山之旅"></p>

<p>全部行历时一天，爬山用时5小时</p>]]></content:encoded></item><item><title><![CDATA[【分享】用WIX编写WS的Installer]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>国内写关于WIX的资源很少，可能用户不是太多吧。大多数都比较喜欢用Inno Setup，毕竟是开源的，而且性能上也能不错。好用并不代表就必须的用它，WIX也挺不错的，最近做的一些项目都是用它来做installer，现在最新的SDK是3.5。</p>

<p>PS：如果不是做的MS的项目，其实我也不太喜欢用它，个人比较倾向用开源的Inno Setup。</p>

<h2 id="wix">WIX介绍</h2>

<p>Windows Installer XML (WiX) 平台是一组工具与规范，使您能够创建 Microsoft Windows Installer 数据库文件（MSI 和 MSM）。WiX 工具承袭了根据源代码创建可执行文件所使用的传统编译和链接模型。WiX 的源代码是使用 XML 文件编写的。WiX 源代码经过预处理、编译与链接，以创建 Windows Installer 数据库。</p>

<p>WiX 工具集有以下两种使用方式：在代号“</p>]]></description><link>http://kev7n.com/2010/03/27/wix-windows-service-installer/</link><guid isPermaLink="false">38edc0a9-8d98-4dfe-b1df-423c678b47db</guid><category><![CDATA[MSI]]></category><category><![CDATA[Windows Service]]></category><category><![CDATA[WIX]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Fri, 26 Mar 2010 18:40:38 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/Wix.png" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/Wix.png" alt="【分享】用WIX编写WS的Installer"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>国内写关于WIX的资源很少，可能用户不是太多吧。大多数都比较喜欢用Inno Setup，毕竟是开源的，而且性能上也能不错。好用并不代表就必须的用它，WIX也挺不错的，最近做的一些项目都是用它来做installer，现在最新的SDK是3.5。</p>

<p>PS：如果不是做的MS的项目，其实我也不太喜欢用它，个人比较倾向用开源的Inno Setup。</p>

<h2 id="wix">WIX介绍</h2>

<p>Windows Installer XML (WiX) 平台是一组工具与规范，使您能够创建 Microsoft Windows Installer 数据库文件（MSI 和 MSM）。WiX 工具承袭了根据源代码创建可执行文件所使用的传统编译和链接模型。WiX 的源代码是使用 XML 文件编写的。WiX 源代码经过预处理、编译与链接，以创建 Windows Installer 数据库。</p>

<p>WiX 工具集有以下两种使用方式：在代号“Rosario”的 Visual Studio Team System 中，这些工具已集成为 Visual Studio 的一部分，以便您直接在 Visual Studio IDE 中生成 WiX 项目。 您可以在命令行上使用 WiX 工具集或使用 MSBuild，来编译与链接 WiX 源代码。</p>

<h2 id="ws">如何使用来安装WS并更新？</h2>

<p>好了，现在入正题，以下一段代码是我实现安装Windows Service以及实现对已安装的Service更新。</p>

<pre><code class="language-xml "> &lt;?xml version="1.0" encoding="UTF-8"?&gt;  
 &lt;Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"&gt;  
 &lt;?define BUILDTARGET="G:Win7TFSVenusSrcBRC UpdaterUpdaterClientBRCUpdaterbinRelease" ?&gt;  
 &lt;Product Id="1195f5eb-4a35-4259-9c26-4d069e722e49" Name="BHO Upgrade Service" Language="1033" Version="1.0.0.0"  
 Manufacturer="BHO Upgrade Service" UpgradeCode="ad16898a-76f5-40f8-a253-7cc9cc31f8c6"&gt;  
 &lt;Package Id="*" Description="BHO Upgrade Service Installer package" Comments="This is used to upload the BRC log."  
 Manufacturer="Microsoft Corporation"  
 InstallerVersion="200" Compressed="yes"/&gt;  
 &lt;Upgrade Id="92430A4C-BE2B-42B6-9EAC-D0F48ED7408E"&gt;  
 &lt;UpgradeVersion OnlyDetect="no" Property="PROJECT_UPGRADE" Maximum="1.0.0.0" IncludeMaximum="no" RemoveFeatures="all"/&gt;  
 &lt;UpgradeVersion OnlyDetect="yes" Property="PROJECT_DOWNGRADE" Minimum="1.0.0.0" IncludeMinimum="no"/&gt;  
 &lt;/Upgrade&gt;  
 &lt;Property Id="PROJECT_UPGRADE" Secure="yes"/&gt;  
 &lt;Property Id="PROJECT_DOWNGRADE" Secure="yes"/&gt;  
 &lt;Media Id="1" Cabinet="product.cab" EmbedCab="yes" /&gt;  
 &lt;Condition Message="You must have administrator privileges to install the application."&gt;&lt;![CDATA[Privileged]]&gt;&lt;/Condition&gt;  
 &lt;Directory Id="TARGETDIR" Name="SourceDir"&gt;  
 &lt;Directory Id="ProgramFilesFolder"&gt;  
 &lt;Directory Id="INSTALLLOCATION" Name="BHO Update Service"&gt;  
 &lt;Component Id="ProductComponent" Guid="06FDC340-2560-48D8-A58F-81B8833C51E1"&gt;  
 &lt;File Id="Updater.exe" Source="$(var.BUILDTARGET)Updater.exe" /&gt;  
 &lt;File Id="Updater.exe.config" Source="$(var.BUILDTARGET)Updater.exe.config" /&gt;  
 &lt;File Id="TaskManager.dll" Source="$(var.BUILDTARGET)TaskManager.dll" /&gt;  
 &lt;File Id="RoleModel.dll" Source="$(var.BUILDTARGET)RoleModel.dll" /&gt;  
 &lt;File Id="RoleEngine.dll" Source="$(var.BUILDTARGET)RoleEngine.dll" /&gt;  
 &lt;File Id="DownLoadEngine.dll" Source="$(var.BUILDTARGET)DownLoadEngine.dll" /&gt;  
 &lt;File Id="Microsoft.Practices.ObjectBuilder2.dll" Source="$(var.BUILDTARGET)Microsoft.Practices.ObjectBuilder2.dll" /&gt;  
 &lt;File Id="Microsoft.Practices.Unity.dll" Source="$(var.BUILDTARGET)Microsoft.Practices.Unity.dll"/&gt;  
 &lt;File Id="ExceptionHandlerProvider.dll" Source="$(var.BUILDTARGET)ExceptionHandlerProvider.dll" /&gt;  
 &lt;RegistryKey Action="createAndRemoveOnUninstall" Root="HKLM" Key="SOFTWARESoftLab"&gt;  
 &lt;RegistryValue Name="Name" Value="BHO" Type="string"/&gt;  
 &lt;RegistryValue Name="Path" Value="[INSTALLDIR]" Type="string"/&gt;  
 &lt;RegistryValue Name="Version" Value="2.5" Type="string"/&gt;  
 &lt;/RegistryKey&gt;  
 &lt;!–&lt;RemoveFolder Id="DeleteFolder" Directory="[INSTALLDIR]" On="uninstall"/&gt;–&gt;  
 &lt;ServiceInstall  
 Id="ServiceInstaller"  
 Type="ownProcess"  
 Vital="yes"  
 Name="BHOUS"  
 DisplayName="BHO Update Service"  
 Description="This service is used to upgrade BHO."  
 Start="auto"  
 Account="LocalSystem"  
 ErrorControl="ignore"  
 Interactive="no"&gt;  
 &lt;/ServiceInstall&gt;  
 &lt;ServiceControl Id="StartService" Start="install" Stop="both"  
 Remove="uninstall" Name="BHOUS" Wait="yes" /&gt;  
 &lt;/Component&gt;  
 &lt;/Directory&gt;  
 &lt;/Directory&gt;  
 &lt;/Directory&gt;  
 &lt;CustomAction Id="NoDownGrade" Error="A later version of [ProductName] is already installed." /&gt;  
 &lt;InstallExecuteSequence&gt;  
 &lt;LaunchConditions After="AppSearch"&gt;&lt;/LaunchConditions&gt;  
 &lt;Custom Action="NoDownGrade" After="FindRelatedProducts"&gt;&lt;![CDATA[PROJECT_DOWNGRADE]]&gt;&lt;/Custom&gt;  
 &lt;RemoveExistingProducts After="InstallFinalize"/&gt;  
 &lt;/InstallExecuteSequence&gt;  
 &lt;Feature Id="ProductFeature" Title="BHO Update Service" Level="1"&gt;  
 &lt;ComponentRef Id="ProductComponent" /&gt;  
 &lt;!–&lt;ComponentRef Id="RegistryComponent" /&gt;–&gt;  
 &lt;/Feature&gt;  
 &lt;/Product&gt;  
 &lt;/Wix&gt;  
</code></pre>

<p>由于它是基于XML，所以代码阅读起来不难，具体的就不用我讲了吧（参考标签），希望能帮助到你。最后推荐一个WIX的资源站：<a href="http://wix.sourceforge.net/">http://wix.sourceforge.net/</a></p>]]></content:encoded></item><item><title><![CDATA[【随记】三月飘雪的”雾都“北京]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>又下雪了，每次看见下雪，就有种莫名的冲动。前几天还挺暖的，北京下雪都没什么征兆，说下就下了。</p>

<p>手机随手拍，虽说效果不佳，那种气氛相信还是可以很容易感受到的：</p>

<p><img src="http://kev7n.com/content/images/2016/05/IMG_0217.jpg" alt="">
<img src="http://kev7n.com/content/images/2016/05/IMG_0203.jpg" alt="">
<img src="http://kev7n.com/content/images/2016/05/IMG_0214-1.jpg" alt="">
<img src="http://kev7n.com/content/images/2016/05/IMG_0216.jpg" alt="">
<img src="http://kev7n.com/content/images/2016/05/IMG_0215.jpg" alt="">
<img src="http://" alt=""></p>]]></description><link>http://kev7n.com/2010/03/15/wu-du-beijing/</link><guid isPermaLink="false">8bb3c5ff-2de3-486c-88da-3447d4bddd56</guid><category><![CDATA[北京]]></category><category><![CDATA[下雪]]></category><category><![CDATA[雾都]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Sun, 14 Mar 2010 17:54:49 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/IMG_0214.jpg" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/IMG_0214.jpg" alt="【随记】三月飘雪的”雾都“北京"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>又下雪了，每次看见下雪，就有种莫名的冲动。前几天还挺暖的，北京下雪都没什么征兆，说下就下了。</p>

<p>手机随手拍，虽说效果不佳，那种气氛相信还是可以很容易感受到的：</p>

<p><img src="http://kev7n.com/content/images/2016/05/IMG_0217.jpg" alt="【随记】三月飘雪的”雾都“北京">
<img src="http://kev7n.com/content/images/2016/05/IMG_0203.jpg" alt="【随记】三月飘雪的”雾都“北京">
<img src="http://kev7n.com/content/images/2016/05/IMG_0214-1.jpg" alt="【随记】三月飘雪的”雾都“北京">
<img src="http://kev7n.com/content/images/2016/05/IMG_0216.jpg" alt="【随记】三月飘雪的”雾都“北京">
<img src="http://kev7n.com/content/images/2016/05/IMG_0215.jpg" alt="【随记】三月飘雪的”雾都“北京">
<img src="http://" alt="【随记】三月飘雪的”雾都“北京"></p>]]></content:encoded></item><item><title><![CDATA[【配置】Alienware m17x 呼吸模式]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>最近发现本本可以设置呼吸模式，看了看说明说，的确有这功能。<a href="http://www.tudou.com/programs/view/lfnDgBDo3kM/?resourceId=0_06_02_99">附上视频</a>，视频不是我拍的，为了方便直接在土豆上找的一个。
<img src="http://kev7n.com/content/images/2016/05/Alienware-1.jpg" alt=""></p>

<p><strong>效果</strong>：定义了键盘4区域的原色，红、黄、蓝、绿  由白色从红区经过黄区、蓝区、绿区，再返回红区。完整动作时间–4个短时间段  </p>

<h3 id="">第一区域</h3>

<p>第一时间段（短）：白–红（白色开始从红色区域过度到黄色区域，因此是由白色起变，逐渐恢复第一区域的红色） <br>
第二时间段（长，相当于两个短）：红色无变化（因为第一区域的白色经过后，变成了原本的红色，所以不需要改） <br>
第三时间段（短）：红–白（由于一个完整动作完结，需要循环，因此最后要让白色重新经过红色的第一区域）  </p>

<h3 id="">第二区域</h3>

<p>第一时间段（短）：黄–白（白色区域从红色第一区域消失，</p>]]></description><link>http://kev7n.com/2010/03/14/alienware-m17x/</link><guid isPermaLink="false">ab7e00d8-a5f2-4c9d-86f9-fb00560cef27</guid><category><![CDATA[Alienware]]></category><category><![CDATA[M17X]]></category><category><![CDATA[呼吸灯]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Sat, 13 Mar 2010 20:45:17 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/Alienware.jpg" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/Alienware.jpg" alt="【配置】Alienware m17x 呼吸模式"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>最近发现本本可以设置呼吸模式，看了看说明说，的确有这功能。<a href="http://www.tudou.com/programs/view/lfnDgBDo3kM/?resourceId=0_06_02_99">附上视频</a>，视频不是我拍的，为了方便直接在土豆上找的一个。
<img src="http://kev7n.com/content/images/2016/05/Alienware-1.jpg" alt="【配置】Alienware m17x 呼吸模式"></p>

<p><strong>效果</strong>：定义了键盘4区域的原色，红、黄、蓝、绿  由白色从红区经过黄区、蓝区、绿区，再返回红区。完整动作时间–4个短时间段  </p>

<h3 id="">第一区域</h3>

<p>第一时间段（短）：白–红（白色开始从红色区域过度到黄色区域，因此是由白色起变，逐渐恢复第一区域的红色） <br>
第二时间段（长，相当于两个短）：红色无变化（因为第一区域的白色经过后，变成了原本的红色，所以不需要改） <br>
第三时间段（短）：红–白（由于一个完整动作完结，需要循环，因此最后要让白色重新经过红色的第一区域）  </p>

<h3 id="">第二区域</h3>

<p>第一时间段（短）：黄–白（白色区域从红色第一区域消失，同时要经过黄色第二区域） <br>
第二时间段（短）：白–黄（白色走过了黄色区域，自然要用一个短时间段再变回来） <br>
第三时间段（长）：黄色无变化（由于白色过去了，所以恢复本来的黄色，一直等待下一个循环）  </p>

<h3 id="">第三区域</h3>

<p>第一时间段（短）：蓝色无变化（第一个短时间段的效果是白色经过了红色，到达了黄色，和蓝色无关） <br>
第二时间段（短）：蓝–白（白色经过蓝色区域） <br>
第三时间段（短）：白–蓝（白色离开蓝色区域） <br>
第四时间段（短）：蓝色无变化（没有蓝色的事了，白色到绿色区域去了）  </p>

<h3 id="">第四区域</h3>

<p>第一时间段（长）：绿色无变化（也可以用两个短时间段做绿色无变化） <br>
第二时间段（短）：绿–白（白色来了） <br>
第三时间段（短）：白–绿（白色走了，回到红色去了）</p>]]></content:encoded></item><item><title><![CDATA[【逆向】午夜归来玩破解-火兔破解附解密过程]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>中秋，跟同事一起聚会玩到午夜，准备上火兔嘀咕几句，发现有人问我“图嘀怎么不能发图了？”（注：图嘀，以前做的一个小工具，用来突破限制发图）。当时心里就犯了嘀咕，火兔把我辛辛苦苦做的图嘀和谐了？</p>

<p>马上登陆图嘀验证，果然发送图片失败。某客户端也随之更新，以前的图滴版本无法使用。一连串的事实证明，图嘀确实被和谐了。火兔做了加密处理，但是我这人就是喜欢较劲。于是熬夜奋战，解决了问题。</p>

<p>遇到被封锁的问题，习惯性的想到火兔一定在API上做了手脚，果不其然，抓包看究竟。如图所示：</p>

<p><img src="http://kev7n.com/content/images/2016/05/1.png" alt=""></p>

<p>在发送嘀咕的时候程序会事先向LoveDiguVal 发送一个请求。然后会得到一个字符串：
<img src="http://kev7n.com/content/images/2016/05/2.png" alt=""></p>

<p>看到这字符串，有点莫名其妙，于是邪恶的连续刷新好几次，每次得到的字符窜都是不规则的字符窜（包括长度）。 看到这里，心里开始嘀咕，未必遇到加密高手了？放弃是不可能的，于是连续抓了几个包开始分析，准备从获取的字符窜中入手，以获取一些有用的信息。</p>

<p>以下是抓取的４组字符串：</p>

<blockquote>
  <ol>
  <li><p><strong>228</strong>  vxi  <strong>738</strong></p></li></ol></blockquote>]]></description><link>http://kev7n.com/2009/10/04/huo-tu-cracked/</link><guid isPermaLink="false">d7a360a9-5ebf-4266-941e-72f90d9ebd01</guid><category><![CDATA[火兔]]></category><category><![CDATA[破解]]></category><category><![CDATA[嘀咕]]></category><category><![CDATA[逆向]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Sun, 04 Oct 2009 08:03:00 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/5.png" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/5.png" alt="【逆向】午夜归来玩破解-火兔破解附解密过程"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>中秋，跟同事一起聚会玩到午夜，准备上火兔嘀咕几句，发现有人问我“图嘀怎么不能发图了？”（注：图嘀，以前做的一个小工具，用来突破限制发图）。当时心里就犯了嘀咕，火兔把我辛辛苦苦做的图嘀和谐了？</p>

<p>马上登陆图嘀验证，果然发送图片失败。某客户端也随之更新，以前的图滴版本无法使用。一连串的事实证明，图嘀确实被和谐了。火兔做了加密处理，但是我这人就是喜欢较劲。于是熬夜奋战，解决了问题。</p>

<p>遇到被封锁的问题，习惯性的想到火兔一定在API上做了手脚，果不其然，抓包看究竟。如图所示：</p>

<p><img src="http://kev7n.com/content/images/2016/05/1.png" alt="【逆向】午夜归来玩破解-火兔破解附解密过程"></p>

<p>在发送嘀咕的时候程序会事先向LoveDiguVal 发送一个请求。然后会得到一个字符串：
<img src="http://kev7n.com/content/images/2016/05/2.png" alt="【逆向】午夜归来玩破解-火兔破解附解密过程"></p>

<p>看到这字符串，有点莫名其妙，于是邪恶的连续刷新好几次，每次得到的字符窜都是不规则的字符窜（包括长度）。 看到这里，心里开始嘀咕，未必遇到加密高手了？放弃是不可能的，于是连续抓了几个包开始分析，准备从获取的字符窜中入手，以获取一些有用的信息。</p>

<p>以下是抓取的４组字符串：</p>

<blockquote>
  <ol>
  <li><p><strong>228</strong>  vxi  <strong>738</strong>  bkof  <strong>1296</strong>  an <strong>696</strong>  <strong>6510</strong>　emb（456  b  738  mcr  1134  sio  928  8680qg 1769 xgm）</p></li>
  <li><p><strong>228</strong>  opxc  <strong>738</strong>  <strong>1296</strong>  z   <strong>696</strong>  fplxxh <strong>6499</strong> eeho （456  irckph 738 1296  pd 609 enkwdsar 8665 comr 717 mtg）</p></li>
  <li><p><strong>228</strong>  bt  <strong>738</strong>  zv  <strong>1296</strong>  rl  <strong>696</strong>  nbu <strong>3028</strong> heg（456  mpvqknkks  738  vnkdsrnri  <strong>1134</strong>  psetp  928  kxhyeldouw294pxra）</p></li>
  <li><p><strong>228</strong>  ntr <strong>738</strong>  q  <strong>1296</strong>  ofc  <strong>696</strong>  vguk <strong>616</strong>  kbs （456  cnrhky  738  nlvt  1134  nqyxr  928  ww  1902  gpsuopt）</p></li>
  </ol>
</blockquote>

<p>空格是我特意分开的，从以上的数组中不难发现一个规律：前四组数字的值都是一样的，唯独最后一位的数字的值是变化的。看到这一组数据，开始纳闷了，这不像是流行的加密算法啊？未必火兔的程序员自己写了一个算法？</p>

<p>上面每组数据会有两组字符串，前面的是获取的，后面的是发送出去的。初步下了得出：客户端首先获取字符串，然后根据获取的字符串来进行处理，接着发送出去另外一个字符串。这个过程中，客户端可能会涉及到一个加密算法。</p>

<p>当然这时候，我也只是推测。做事情有始有终，既然在客户端会有处理，那么弄清楚它的算法不就可以看个究竟了？于是习惯性的，尝试反编译它的客户端，它的客户端是基于Adobe Air技术，以前还没试过反编译这玩意，这将会是一个吃螃蟹的过程。</p>

<p>经过一番努力，反编译成功，获得类似字节码的IL语言。开始分析代码，由于没有配置环境没法调试。直接从代码段开始入手分析，众里寻它千百度，暮然回首发现一个可疑的加密以及解密的函数，上图：</p>

<p><img src="http://kev7n.com/content/images/2016/05/3.png" alt="【逆向】午夜归来玩破解-火兔破解附解密过程"></p>

<p>这么敏感的字符居然没被混淆，哦也。Encry顾名思义加密的意思。那么它加密的什么呢？看代码（代码中<strong>注释</strong>的部分也就是我分析的过程）：</p>

<pre><code class="language-javascript">static function decryptIp(String):Array /*disp_id 4*/ //解密函数，返回是一个数组  
{   
    // local_count=3 max_scope=1 max_stack=4 code_len=80
    0       getlocal0         
    1       pushscope         
    2       getlocal1         
    3       getlex         RegExp 

    6       pushstring     "[A-Za-z]+"  //这里它用到了正则？这里为什么要用到正则呢？未必是处理 请求的那个字符窜的？（现在仅仅是猜测），继续往后走。  

    9       construct      (1)   

    11      callproperty   http://adobe.com/AS3/2006/builtin::split (1) //这里它用到了 分割？ 难道是把那个字符窜分割成数组？经验证确实如此。

    15      coerce         Array   

    17      setlocal2         
    18      getlocal2         
    19      pushbyte0  
    21      getlocal2         
    22      pushbyte       0 //这里指向数组 索引为 0的数  

    24      getproperty    null  

    27      pushbyte       2 //这里 它进行了 除 2的处理。  

    29      divide           //除法的意思。。英语很重要啊。呵呵  
    30      setproperty    null  

    33      getlocal2         
    34      pushbyte       1   
    36      getlocal2         
    37      pushbyte       1 //这里指向数组 索引为 1的数    
    39      getproperty    null  

    42      pushbyte       3 //这里 它进行了 除 2的处理。  

    44      divide           
    45      setproperty    null  

    48      getlocal2         
    49      pushbyte       2  
    51      getlocal2         
    52      pushbyte       2 //这里指向数组 索引为 2的数  

    54      getproperty    null  

    57      pushbyte       8 //这里 它进行了 除 2的处理。    

    59      divide           
    60      setproperty    null  

    63      getlocal2         
    64      pushbyte       3  

    66      getlocal2         
    67      pushbyte       3 //这里指向数组 索引为 2的数  
    69      getproperty    null  

    72      pushbyte       6 //这里 它进行了 除 2的处理。    

    74      divide           
    75      setproperty    null  
    78      getlocal2         
    79      returnvalue       
  }   
</code></pre>

<p>这里我有点奇怪，为什么只有四组？ 前面我们从函数的名字我们可以判断出，这组数据是跟IP有关联的（现在只是假设）。我把获取的字符窜里面的数字按早这个规则进行运算，得出的结果正好是我的IP地址？事情开始明朗了，好，我们继续往后走。 </p>

<pre><code class="language-javascript">static function encryptIp(Array):String /* disp_id 3*/  
{   
    activation {   
       var myPak::getRandomStr:Function /* slot_id 2 */  
       var myPak::r:String /* slot_id 3 */  
       var myPak::ip:Array /* slot_id 1 */  
     }   
     // local_count=3 max_scope=2 max_stack=5 code_len=230  
     0       getlocal0         
     1       pushscope         
     2       newactivation     
     3       dup               
     4       setlocal2         
     5       pushscope         
     6       getscopeobject 1  

     8       getlocal1         
     9       setslot        1  

     11      getscopeobject 1  

     13      newfunction    var undefined():String /* disp_id 0*/  

     16      coerce         Function 

     18      setslot        2  

     20      getscopeobject 1  

     22      pushstring     ""  

     24      setslot        3  

     26      getscopeobject 1  

     28      getlex         Math   

     31      getscopeobject 1  

     33      getslot        1  

     35      pushbyte       0  

     37      getproperty    null  

     40      pushbyte       4  //这里它把解密后的数值进行乘以4的处理？ 

     42      multiply         
     43      callproperty   round (1)   

     47      callproperty   http://adobe.com/AS3/2006/builtin::toString (0)  

     51      getscopeobject 1  

     53      getslot        2  

     55      getglobalscope   
     56      call           (0)   

     58      add               
     59      coerce_s         

     60      setslot        3  

     62      getscopeobject 1  

     64      getscopeobject 1  

     66      getslot        3  
     68      getlex         Math   

     71      getscopeobject 1  
     73      getslot        1  

     75      pushbyte       1  

     77      getproperty    null  

     80      pushbyte       3 //这里它把解密后的数值进行乘以3的处理？  
     82      multiply         
     83      callproperty   round (1)   
     87      callproperty   http://adobe.com/AS3/2006/builtin::toString (0)

     91      add               
     92      getscopeobject 1  

     94      getslot        2 

     96      getglobalscope   

     97      call           (0)   

     99      add               
     100     coerce_s         
     101     setslot        3  

     103     getscopeobject 1  

     105     getscopeobject 1  

     107     getslot        3  

     109     getlex         Math  

     112     getscopeobject 1  

     114     getslot        1  

     116     pushbyte       2  

     118     getproperty    null  

     121     pushbyte       7 //这里它把解密后的数值进行乘以7的处理？ 

     123     multiply         
     124     callproperty   round (1)   

     128     callproperty   http://adobe.com/AS3/2006/builtin::toString (0) 

     132     add               
     133     getscopeobject 1  

     135     getslot        2  

     137     getglobalscope   
     138     call           (0) 

     140     add               
     141     coerce_s         
     142     setslot        3  

     144     getscopeobject 1  

     146     getscopeobject 1  

     148     getslot        3  

     150     getlex         Math  

     153     getscopeobject 1  

     155     getslot        1  

     157     pushbyte       3  

     159     getproperty    null  

     162     pushbyte       8 //这里它把解密后的数值进行乘以8的处理？    

     164     multiply         
     165     callproperty   round (1)  

     169     callproperty   http://adobe.com/AS3/2006/builtin::toString (0)  

     173     add               
     174     getscopeobject 1  

     176     getslot        2  

     178     getglobalscope   
     179     call           (0)   

     181     add               
     182     coerce_s         
     183     setslot        3  

     185     getscopeobject 1  

     187     getscopeobject 1  

     189     getslot        3  

     191     getlex         Math   

     194     getlex         Math   

     197     callproperty   random (0) //NND 原来最后组数是随机数？难怪前面的都是有规律的，唯独最后一个数字没规律。  

     201     pushshort      2500 //它在0~250 范围内任意取值。

     204     multiply         
     205     callproperty   round (1)  

     209     callproperty   http://adobe.com/AS3/2006/builtin::toString (0) 

     213     add               
     214     getscopeobject 1  

     216     getslot        2  

     218     getglobalscope   
     219     call           (0)  

     221     add               
     222     coerce_s         
     223     setslot        3  

     225     getscopeobject 1  

     227     getslot        3  

     229     returnvalue       
   }   
</code></pre>

<p>在以上的代码中，一个明朗的思路渐现：客户端申请一个字符串，然后对字符串解密并二次加密发送数据。</p>

<p>我开始有点纳闷，它根据IP加密的，为啥要生成一个字符串然后解密再加密？让人摸不着头脑，后来证明那加密完全是多余，也就是说把火兔的程序员想的好一点：他用来混淆试听的，或者是起到一个类似于验证码的功能。</p>

<p>最后写了一个小DEMO 去测试是否验证成功，截图：</p>

<p><img src="http://kev7n.com/content/images/2016/05/4.png" alt="【逆向】午夜归来玩破解-火兔破解附解密过程"></p>

<p>测试发图成功，如图：</p>

<p><img src="http://kev7n.com/content/images/2016/05/5-1.png" alt="【逆向】午夜归来玩破解-火兔破解附解密过程"></p>

<p><strong>注意</strong>：仅供参考。之所以拿火兔开刀，是因为觉得它做的还是不错，就是限制的厉害，正好我最讨厌被限制，于是有了图嘀的出现。</p>

<p>破解过程有点跳跃性，在真正的破解中，这是很漫长的过程，大概花了我4个小时。由于实在太累，所以就写了关键的部分，不懂的可以邮件问我。最后说一句“道高一尺魔高一丈，安全是个永恒的话题”。</p>]]></content:encoded></item><item><title><![CDATA[【工具】发布嘀咕-小小嘀 V 1.1版]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>新版本1.1，修复以及增加了以下功能：</p>

<pre><code>修复了发送多个图片时出错的BUG；
增加了图片验证功能；
增加图片处理功能，可以发任意大小图片；
增加图片管理功能，更人性化；
增加对本地图嘀密码进行强加密保护，保护用户隐私；
增加了发送图片时的预览；
</code></pre>

<p><img src="http://kev7n.com/content/images/2016/05/Tudi1-1-1.png" alt=""></p>

<p><img src="http://kev7n.com/content/images/2016/05/tudi1-2.png" alt=""></p>

<p><img src="http://kev7n.com/content/images/2016/05/Tudi1-3.png" alt=""></p>

<p><strong>下载地址：已过期</strong></p>]]></description><link>http://kev7n.com/2009/09/20/xiao-xiao-di-v1-1/</link><guid isPermaLink="false">82f979dc-81b3-45c4-9a10-c669f7b16742</guid><category><![CDATA[工具]]></category><category><![CDATA[嘀咕]]></category><category><![CDATA[火兔]]></category><category><![CDATA[更新]]></category><category><![CDATA[小小滴]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Sat, 19 Sep 2009 21:49:00 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/Tudi1-3-1.png" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/Tudi1-3-1.png" alt="【工具】发布嘀咕-小小嘀 V 1.1版"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>新版本1.1，修复以及增加了以下功能：</p>

<pre><code>修复了发送多个图片时出错的BUG；
增加了图片验证功能；
增加图片处理功能，可以发任意大小图片；
增加图片管理功能，更人性化；
增加对本地图嘀密码进行强加密保护，保护用户隐私；
增加了发送图片时的预览；
</code></pre>

<p><img src="http://kev7n.com/content/images/2016/05/Tudi1-1-1.png" alt="【工具】发布嘀咕-小小嘀 V 1.1版"></p>

<p><img src="http://kev7n.com/content/images/2016/05/tudi1-2.png" alt="【工具】发布嘀咕-小小嘀 V 1.1版"></p>

<p><img src="http://kev7n.com/content/images/2016/05/Tudi1-3.png" alt="【工具】发布嘀咕-小小嘀 V 1.1版"></p>

<p><strong>下载地址：已过期</strong></p>]]></content:encoded></item><item><title><![CDATA[【工具】编写图嘀-小小嘀 V1.0版]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>用过<strong>火兔/嘀咕</strong>的人都知道，那里是不允许发布图片的（除了手机，以及视频之外）。很多想发图的滴友们就会很郁闷，限制过大。于是写了这个工具，可以任意的发布图片，突破官方所有的的限制。原本打算是自己用用的，有很多滴友也很想用，为了方便大家，这里发布1.0版供参考使用。</p>

<p>目前，针对火兔的客户端还是比较多的，所以我就做了一个他们没有的功能：不受限制任意发图，以后会把他们的全部的功能都加上。</p>

<p>下载地址在本文最后,如果大家觉得好用，我以后会持续的更新。：）</p>

<pre><code>运行环境：XP/Vista/Windows 7
</code></pre>

<p>登陆界面（这个界面之前是为嘀咕做的，后来被和谐之后，就一直搁着在）：</p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-1.png" alt=""></p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-1-1.png" alt=""></p>

<p>操作界面：可以预览图片，以及最近图嘀的信息。</p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-2-1.png" alt=""></p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-2-2.png" alt=""></p>

<p>发送图嘀（任意图片都可以，这里突破了限制）。</p>

<p><img src="http://kev7n.com/content/images/2016/05/digu-3.png" alt=""></p>

<p>成功上传至火兔。：）</p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-4.png" alt=""></p>

<p>好了，欢迎大家指出问题。</p>

<p><strong>下载地址：已过期</strong></p>]]></description><link>http://kev7n.com/2009/09/19/xiao-xiao-di/</link><guid isPermaLink="false">dd15e6b2-ea43-45d0-8f47-84c8ebdd7aec</guid><category><![CDATA[工具]]></category><category><![CDATA[突破限制]]></category><category><![CDATA[火兔]]></category><category><![CDATA[嘀咕]]></category><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Sat, 19 Sep 2009 04:14:00 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/Digu-4-1.png" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/Digu-4-1.png" alt="【工具】编写图嘀-小小嘀 V1.0版"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>用过<strong>火兔/嘀咕</strong>的人都知道，那里是不允许发布图片的（除了手机，以及视频之外）。很多想发图的滴友们就会很郁闷，限制过大。于是写了这个工具，可以任意的发布图片，突破官方所有的的限制。原本打算是自己用用的，有很多滴友也很想用，为了方便大家，这里发布1.0版供参考使用。</p>

<p>目前，针对火兔的客户端还是比较多的，所以我就做了一个他们没有的功能：不受限制任意发图，以后会把他们的全部的功能都加上。</p>

<p>下载地址在本文最后,如果大家觉得好用，我以后会持续的更新。：）</p>

<pre><code>运行环境：XP/Vista/Windows 7
</code></pre>

<p>登陆界面（这个界面之前是为嘀咕做的，后来被和谐之后，就一直搁着在）：</p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-1.png" alt="【工具】编写图嘀-小小嘀 V1.0版"></p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-1-1.png" alt="【工具】编写图嘀-小小嘀 V1.0版"></p>

<p>操作界面：可以预览图片，以及最近图嘀的信息。</p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-2-1.png" alt="【工具】编写图嘀-小小嘀 V1.0版"></p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-2-2.png" alt="【工具】编写图嘀-小小嘀 V1.0版"></p>

<p>发送图嘀（任意图片都可以，这里突破了限制）。</p>

<p><img src="http://kev7n.com/content/images/2016/05/digu-3.png" alt="【工具】编写图嘀-小小嘀 V1.0版"></p>

<p>成功上传至火兔。：）</p>

<p><img src="http://kev7n.com/content/images/2016/05/Digu-4.png" alt="【工具】编写图嘀-小小嘀 V1.0版"></p>

<p>好了，欢迎大家指出问题。</p>

<p><strong>下载地址：已过期</strong></p>]]></content:encoded></item><item><title><![CDATA[【逆向】闲逛之余发现的Gif图片木马]]></title><description><![CDATA[<blockquote>
  <p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>今天逛Mop，无意之中逮到一匹gif网马。根据文件名分析可知这个马儿还是去年上传的，至今还在Mop上。说明了一个什么问题我就不多说了，有图有真相：</p>

<p><img src="http://kev7n.com/content/images/2016/05/kaspersky.png" alt=""></p>

<p>根据以往惯例，被我逮到了，那就得杀了研究下内脏。 关闭卡巴，下载之。最后在找个图片的尾部（以就是偏移：0x0000084E）开始被嵌入了IFrame代码，老鸟们都知道这是干嘛的了，原理很简单，借助图片打开指定木马地址（或者是其它用途连接），上图：</p>

<p><img src="http://kev7n.com/content/images/2016/05/Hex.png" alt=""></p>

<p><strong>结论：不管多流行的网站，也得长心眼，安全才是根本。</strong></p>]]></description><link>http://kev7n.com/2009/09/16/gif-downloader/</link><guid isPermaLink="false">793f3ddc-30e3-4ac1-9836-7d424b5c0791</guid><dc:creator><![CDATA[Kevin Wang]]></dc:creator><pubDate>Tue, 15 Sep 2009 23:44:00 GMT</pubDate><media:content url="http://kev7n.com/content/images/2016/05/Hex-1.png" medium="image"/><content:encoded><![CDATA[<blockquote>
  <img src="http://kev7n.com/content/images/2016/05/Hex-1.png" alt="【逆向】闲逛之余发现的Gif图片木马"><p><strong>注意：本文从旧博客迁移过来，涉及内容可能已经过时，请选择性阅读。</strong></p>
</blockquote>

<p>今天逛Mop，无意之中逮到一匹gif网马。根据文件名分析可知这个马儿还是去年上传的，至今还在Mop上。说明了一个什么问题我就不多说了，有图有真相：</p>

<p><img src="http://kev7n.com/content/images/2016/05/kaspersky.png" alt="【逆向】闲逛之余发现的Gif图片木马"></p>

<p>根据以往惯例，被我逮到了，那就得杀了研究下内脏。 关闭卡巴，下载之。最后在找个图片的尾部（以就是偏移：0x0000084E）开始被嵌入了IFrame代码，老鸟们都知道这是干嘛的了，原理很简单，借助图片打开指定木马地址（或者是其它用途连接），上图：</p>

<p><img src="http://kev7n.com/content/images/2016/05/Hex.png" alt="【逆向】闲逛之余发现的Gif图片木马"></p>

<p><strong>结论：不管多流行的网站，也得长心眼，安全才是根本。</strong></p>]]></content:encoded></item></channel></rss>