<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Example Code</title>
    <description>自由懒散的程序员一枚，因为懒，所以喜欢极简主义，憎恨一切形式化的东西。不喜欢写BLOG，遇见了Jekyll，发现Blog也像写代码的方式一样来写.</description>
    <link>http://examplecode.github.io/</link>
    <atom:link href="http://examplecode.github.io/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>猎豹清理大师值得我们信任么？</title>
        <description>&lt;p&gt;大家应该都还记得前几日在各大媒体和朋友圈疯转的一片文章《傅盛豹变》我也读了这边文章，说实话文章写的很棒，看的我也是心潮澎湃。一向不怎么刷朋友圈的我，不仅转发而且还特地专门发给了几个身边的朋友希望大家都能够从猎豹和傅盛先生那里学到一些东西或者有所感悟。我自己也是看了这篇文章后怀着无比崇敬的心情安装了猎豹清理这个产品进行观摩学习。不曾想才过去短短的几天我就改变了对这款产品的看法。&lt;/p&gt;

&lt;p&gt;无意专门抹黑猎豹，只是希望此文能够唤醒做安全软件的企业们的一些责任心，对的起用户对你们的信任。你们不仅掌握着操作系统的至高无上的权限而且还掌握着对普通应用的生杀大权。无它求，只希望你们能够在行使你们的生杀大权的时候不要这么随意的草菅人命。相信对于大公司的产品你们都会认真对待，容不得半点马虎，但是对于苦逼的创业者和个人开发者就应该活该遭受这种待遇么？&lt;/p&gt;

&lt;p&gt;事情是这样的，我是一位个人开发者，辞去公司的工作花费了半年多的时间做了一款产品 &lt;a href=&quot;http://www.xbext.com&quot;&gt;XBrowser&lt;/a&gt; ，最近刚刚苦逼的把应用上传到国内的各大应用市场(这里的苦逼事情其实也够写一篇长文的，某些应用市场对于浏览器产品特别敏感，拿出各种各样的理由拒绝你)。日子过的很苦逼也很充实，一边自己想办法推广产品，一边继续写代码更新产品满足用户的需求。程序员那些推广手段你懂的，无非就是在论坛发发帖，无奈之下还注册几个马甲用户顶顶自己的帖子。大概是没有经验，很多次被人嘲笑“你这托儿简直是侮辱我们的智商”。没有办法就傻乎乎的承认自己是 “托儿“。。。&lt;/p&gt;

&lt;p&gt;身边的朋友都对我说，浏览器这样的产品是商业巨头玩儿的游戏，你一个个人开发者就别在这儿凑热闹了。每当这个时候我总是呵呵一笑，谁叫咱有这个产品情节呢，现在做的事情就是让将来自己老了以后没有机会鄙视现在的我(这个理由相当有逼格，每当别人质疑我的时候或则我自己质疑自己的时候都会把它搬出来)。就这样在别人的质疑，我的自我怀疑，和我的自我调整中，痛并快乐着，坚持着做着我的产品。好不容易积攒了几千用户，虽然不多但是确实每天增长的趋势。同时确实也赢得了不少用户对产品的好评和称赞，在此感谢给与我鼓励和支持的用户。文章篇幅有限，贴几个用户反馈截图。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/feedback_01.png&quot; alt=&quot;&quot; /&gt;  &lt;img src=&quot;/images/feedback_02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然而，老天并不会因为你苦逼就眷顾你，反而会更加雪上加霜的考验你。就在几天前突然发现了几个应用市场的增长突然下降，新增用户变成了个位数，次日留存也从以前的30%以上变成了10%-20% ，搞得我十分沮丧，真的不知道问题出在了那里？于此同时我也在论坛收到了用户反馈，说我的浏览器有病毒，于是我开始追问到底是什么软件提示存在病毒。很遗憾用户并没有回答我这个问题。当时并没有意识到事态多么严重，觉得可能是那个不知名的山寨安全软件的误报而已。就在今天我习惯的打开猎豹清理清扫清扫手机里的垃圾，不得不说清理工具都是抓住了很多强迫症的痛点，无时无刻的不报告你的系统中存在着多少垃圾，你的系统系统健康指数是多少，这招屡试不爽。恍然间，一个大大的警告出现在屏幕 “发现了木马程序“ ，我先是一惊，在手机上碰到木马对我来讲真是头一遭，从来没有遇到过这种情况（android是基于linux系统其安全级别要比windows中高得多，真的是不是那么容易能够遭遇木马的）。接下来又是大大的一惊，搁着以前凭着对这些“安全卫士”的信任，我会毫不犹豫的把携带木马程序删之（管你是什么程序，哪怕是微信也要先干掉再说),可是令人难以置信的是这个木马程序偏偏是自己呕心沥血半年的作品,当时我的脑袋都蒙了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/xbrowser-torj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;据报道，猎豹清理有4亿活跃用户，光应用宝这个一个渠道就赫然写着1.6亿的下载，这是一个什么概念？ 不夸张的讲，如果猎豹清理报告你这个产品是个木马或病毒，会让你这个产品顷刻灰飞烟灭。当时真的是万念俱灰，我赶紧发送邮件给猎豹清理的客服人员，多方面找朋友问问猎豹内部的熟人赶紧帮忙解决这个问题。同时我也做好了被灰飞烟灭的准备，半年的努力全完了，还是拍拍屁股老老实实的找工作上班去吧。&lt;/p&gt;

&lt;p&gt;一个小时后猎豹清理的客服人员联系到了我，令人欣慰的是猎豹清理的工作人员还是及时认识到了是自己的问题，答应立刻给与解决。当时我心说，尼玛，等你解决掉估计我的产品也不复存在了，但是本着死要死的明白的原则，我一定得弄清楚事情的缘由，不能白死，也好给后面的个人开发者一些借鉴. 于是就继续有了下面的对话追问事情缘由。不做评价，直接上部分对话截图。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/chat-log-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/chat-log-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;有时候上天总是在考验你的耐心，事情总是不是进展的那么顺利。猎豹清理客服说已经处理过这个问题了，可是我的手机依然还是提示。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/chat-log-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;没有办法，又转到了猎豹的技术人员。：（&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/chat-log-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/chat-log-05.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;到此事情总算解决了，事态好像也没有想象的那么严重，产品用户是受到了影响，但是还没有到了灰飞烟灭的程度，野火烧不尽，春风吹又生。小草的生命力还是很顽强的。还是那句话，再小的开发者也是个生命。对于掌握生杀大权的安全厂商们，请你们挣钱的时候也看看脚下，别践踏无辜的生命。在执行一个软件生死之前，你是否真的拿到了它的罪证。搞安全的程序员同行们，你们的每一行代码也会关系到你的苦逼同行们的生死请务必慎重，谢谢。&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;后记&lt;/h3&gt;

&lt;p&gt;互联网这个圈子总是很小，猎豹团队的反应速度也足够快，昨天晚上发布的文章，今天猎豹清理的负责人就看到了这篇文章，上午的时候猎豹清理项目的负责人就找到了我，本来以为是过来公关的，没有想到却是又一次诚恳的道歉，反而搞的我有点不太好意思了，在这里赞一下猎豹团队的服务态度。个人认为他们能够获得那么大的用户和背后的服务团队也是分不开的。&lt;/p&gt;

</description>
        <pubDate>Mon, 30 Mar 2015 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/essay/2015/03/30/cleanmaster-should-we-trust-it</link>
        <guid isPermaLink="true">http://examplecode.github.io/essay/2015/03/30/cleanmaster-should-we-trust-it</guid>
      </item>
    
      <item>
        <title>markdown + git 最适合程序员的wiki系统</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://github.com/gollum/gollum&quot;&gt;gollum&lt;/a&gt; 是github的使用的一个基于markdown的 wiki系统。 最重要的是gollum直接和git集成不需要数据库，你可以选择在Web页面撰写文档，也可以用你喜欢的markdown工具编辑文档在命令行进行提交。 “markdown+git = wiki”  这对程序员来讲绝对是最棒的选择。&lt;/p&gt;

&lt;p&gt;Gollum wiki 的截图如下&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/gollum-screenshot.png&quot; alt=&quot;gollum截图&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Mac下安装的适合遇到了一些小问题，所以在这里记录一下安装过程 。&lt;/p&gt;

&lt;h2 id=&quot;section&quot;&gt;基本的环境&lt;/h2&gt;

&lt;p&gt;在安装之前，假定我们已经拥有了mac 下的包管理工具 homebrew 及 ruby 运行环境。我当前的工作环境如下:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Mac 10.9&lt;/li&gt;
  &lt;li&gt;homebrew 0.9&lt;/li&gt;
  &lt;li&gt;ruby 2.0&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;gollum&quot;&gt;安装 Gollum&lt;/h2&gt;

&lt;p&gt;我们可以选择通过二进制或者源码的方式进行安装。&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;二进制安装&lt;/h3&gt;

&lt;p&gt;在安装的时候会出现找不到libiconv所以需要安装下面的依赖库&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;brew install libxml2 libxslt
brew link libxml2 libxslt --force
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
tar xvfz libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --prefix=/usr/local/Cellar/libiconv/1.13.1
make
sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;通过Gem安装 gollum&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[sudo] gem install gollum
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;section-2&quot;&gt;源码安装&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;git clone https://github.com/gollum/gollum
cd gollum
bundle install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;安装成功后尝试着在终端输入下面的命令，如果能够正常显示版本号则说明安装成功.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gollum --v
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;wiki&quot;&gt;创建自己的wiki系统&lt;/h2&gt;

&lt;p&gt;接下来我们就可以建立自己的wiki系统了，建立一个名字为”wiki”的目录使用git进行管理。进入到wiki目录，在wiki目录下启动gollum&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir wiki
cd wiki
git init
gollum
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;显示如下：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[2015-01-21 14:03:45] INFO  WEBrick 1.3.1
[2015-01-21 14:03:45] INFO  ruby 2.0.0 (2013-05-14) [x86_64-darwin12.4.1]
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from WEBrick
[2015-01-21 14:03:45] INFO  WEBrick::HTTPServer#start: pid=17699 port=4567
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;接下就可以在浏览器中访问了 http://localhost:4567/&lt;/p&gt;

&lt;p&gt;创建wiki文档可以选择在全部Web界面进行操作，也可以选择在终端命令行进行提交管理markdown文件，在浏览器中进行查看。&lt;/p&gt;

</description>
        <pubDate>Fri, 26 Sep 2014 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/tools/2014/09/26/install-gollum-in-mac-109</link>
        <guid isPermaLink="true">http://examplecode.github.io/tools/2014/09/26/install-gollum-in-mac-109</guid>
      </item>
    
      <item>
        <title>ubuntu下安装ruby rails环境</title>
        <description>&lt;h2 id=&quot;step1-rvm&quot;&gt;step1 安装rvm&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt; curl -L https://get.rvm.io | bash -s stable
 source ~/.rvm/scripts/rvm
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;step2--ruby&quot;&gt;step2 安装 ruby&lt;/h2&gt;

&lt;p&gt;在国内安装ruby比较慢所以先修改rvm的镜像源到淘宝的服务器&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sed -i -e &#39;s/ftp\.ruby-lang\.org\/pub\/ruby/ruby\.taobao\.org\/mirrors\/ruby/g&#39; ~/.rvm/config/db
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;列出当前可安装的ruby版本&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rvm list known
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;选择当前最新的稳定版本&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rvm install 2.1.2
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;step3-&quot;&gt;step3 替换默认镜像&lt;/h2&gt;

&lt;p&gt;使用国内较近的镜像：替换为taobao镜像&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem source -r https://rubygems.org/
gem source -a https://ruby.taobao.org
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;step4-rails&quot;&gt;step4 安装rails&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;gem install rails
&lt;/code&gt;&lt;/pre&gt;
</description>
        <pubDate>Tue, 23 Sep 2014 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/devopt/2014/09/23/install-ruby-rails-on-ubuntu</link>
        <guid isPermaLink="true">http://examplecode.github.io/devopt/2014/09/23/install-ruby-rails-on-ubuntu</guid>
      </item>
    
      <item>
        <title>自己搭建的google搜索镜像服务</title>
        <description>&lt;p&gt;基于我前几天发布的一个小工具&lt;a href=&quot;/2014/06/25/minimal-http-proxy-c-language-implementation&quot;&gt;mproxy&lt;/a&gt;，做了一个免费的Google搜索镜像用来满足日常使用Google的需求，为了发挥VPS的更大效能,现分享出来供免费使用。&lt;/p&gt;

&lt;p&gt;注：目前此教程只针对Chrome浏览器，其他浏览器的使用者请忽略此文，或自行想办法(原理上都是一样的)免费的镜像不知能够提供多长时间，有兴趣的话可以按照&lt;a href=&quot;/2014/06/25/minimal-http-proxy-c-language-implementation&quot;&gt;mproxy&lt;/a&gt;的使用教程自行部署服务&lt;/p&gt;

&lt;p&gt;应用原理主要是依赖浏览器的PAC(Proxy-Auto-Config)功能,在使用google的时候自动切换至mproxy提供的代理服务，如果想使用其他被墙的网站原理相同，只需要修改.pac文件就好了。设置简洁3步搞定，详情如下。&lt;/p&gt;

&lt;h3 id=&quot;step1-mproxy&quot;&gt;step1 下载并编译mproxy&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;clone https://github.com/examplecode/mproxy
cd mproxy
gcc -o mproxy mproxy.c
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;step2-proxy&quot;&gt;step2 在命令行启动proxy&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;./mproxy -l 8081 -h m.mmbox.me -E -d
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;step-3-chrome-&quot;&gt;step 3 以命令行的方式启动Chrome 浏览器&lt;/h3&gt;

&lt;p&gt;为了确保自动切换代理模式可以正常工作，请再测试之前先禁用(chrome-&amp;gt;偏好设置-&amp;gt;扩展程序)掉所有的代理管理插件，如proxySwitchSharp。&lt;/p&gt;

&lt;h4 id=&quot;mac-&quot;&gt;Mac 版本&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;cd /Applications/Google\ Chrome.app/Contents/MacOS
./Google\ Chrome --proxy-pac-url=http://m.mmbox.me/mproxy.pac
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;linux-&quot;&gt;linux 版本&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;cd /path/of/chrome
./chrome --proxy-pac-url=http://m.mmbox.me/mproxy.pac
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在完成以上步骤后就可以畅通无阻的使用Google了，enjoy it ! :)&lt;/p&gt;

</description>
        <pubDate>Wed, 02 Jul 2014 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/tools/2014/07/02/build-your-own-google-search-mirrors-service</link>
        <guid isPermaLink="true">http://examplecode.github.io/tools/2014/07/02/build-your-own-google-search-mirrors-service</guid>
      </item>
    
      <item>
        <title>最小的http proxy c语言实现 - 支持翻墙</title>
        <description>&lt;p&gt;前几天发布了一个&lt;a href=&quot;/tools/2014/06/20/the-tools-prevent-dns-cache-pollution&quot;&gt;防止GFWDNS污染的小工具&lt;/a&gt; 出乎意料的有热心网友很快跟进基于类似原理开发出了更好用的工具，详情点击&lt;a href=&quot;http://www.v2ex.com/t/118913#reply123&quot;&gt;这里&lt;/a&gt;。于是我又心血来潮写了这么一个小东西，希望能够起到抛砖引玉的作用。&lt;/p&gt;

&lt;p&gt;源码地址：&lt;a href=&quot;https://github.com/examplecode/mproxy&quot;&gt;https://github.com/examplecode/mproxy&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;mproxy&quot;&gt;关于mproxy&lt;/h2&gt;

&lt;h3 id=&quot;mproxy-&quot;&gt;mproxy 是什么？&lt;/h3&gt;

&lt;p&gt;这是一个c语言实现的 极小的 http proxy 不依赖任何第三方库核心代码不足500行。&lt;/p&gt;

&lt;h3 id=&quot;mproxy-1&quot;&gt;mproxy有什么作用？&lt;/h3&gt;

&lt;p&gt;个人认为作用有两点：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;mproxy 代码量极少，实现简单,可以用来了解http proxy的基本工作原理。&lt;/li&gt;
  &lt;li&gt;如果你有翻墙的需求，它可以帮忙解决这个问题，至少可以访问google,youtube,facebook,twitter这些网站。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;翻墙的原理，一句话搞明白。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; Browser --&amp;gt; mproxy(local proxy)  --&amp;gt; mproxy (remte proxy) -&amp;gt; 墙外的世界
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;mproxy--1&quot;&gt;mproxy 需要单独的服务器资源么？&lt;/h3&gt;

&lt;p&gt;是的，你出来需要一台本地代理外还需要在国外部署一台独立的服务器作为中转来达到翻墙的目的。mproxy不像一些翻墙软件使用GAE作为服务（GAE服务不允许建立socket）,下面是你所需要的资源。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;一台国外的服务器或VPS (现在国外的vps都比较便宜，我的测试环境就是用的&lt;a href=&quot;https://www.digitalocean.com/?refcode=0340b5e32fde&quot;&gt;digitalocean&lt;/a&gt; 的vps 一个月只需要5美元，网站操作体验感觉比lindoe好，性能稳定性貌似差点，但毕竟价钱不一样) 。&lt;/li&gt;
  &lt;li&gt;一台unix like 本地服务器作为你的http代理。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;mproxy--2&quot;&gt;mproxy 如何安装部署？&lt;/h3&gt;

&lt;p&gt;mproxy 的安装部署请参考以下网址：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/examplecode/mproxy&quot;&gt;https://github.com/examplecode/mproxy&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;mproxy--3&quot;&gt;mproxy和 其他的翻墙软件有什么不同？&lt;/h3&gt;

&lt;p&gt;其实原理基本原理上没有特别大的区别，只是mproxy实现更加简单，没有使用一些第三方的库比如openssl，异步socket，http lib等。只是使用最少的代码展示翻墙的基本原理而已。&lt;/p&gt;

&lt;h3 id=&quot;mproxy--4&quot;&gt;mproxy 的使用效果如何？&lt;/h3&gt;

&lt;p&gt;mproxy刚刚开发完毕，实现简陋也没有经过大量测试。和成熟稳定的翻墙软件比还有一定差距，其主要目的也是用来学习和研究翻墙原理,目前这个东东完全没有达到一个产品级的水平，如果你喜欢折腾就继续尝试一下当成玩具，否则就此打住吧，免得你抱怨我发布一个垃圾的东西。目前经测试访问google,twitter,facebook,youtube等网站没有问题。&lt;/p&gt;

&lt;h3 id=&quot;mproxy--5&quot;&gt;mproxy 作为后台程序运行的时候如何查看程序输出？&lt;/h3&gt;

&lt;p&gt;直接使用重定向命令即可&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./mproxy -l 8081 -D -d &amp;gt; out_8081.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;section&quot;&gt;关于测试服务器&lt;/h2&gt;

&lt;p&gt;下面是我用来测试的服务器(不保证哪天会关闭)，如果你手头有一个unix like的系统可以先安装一个本地的mproxy,然后连接到我提供的测试服务器看看翻墙效果。服务器来自 &lt;a href=&quot;https://www.digitalocean.com/?refcode=0340b5e32fde&quot;&gt;digitalocean&lt;/a&gt; 的vps虚拟实例性能不高只有512M的内存，所以测试用户多了可能会响应较慢。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ip 地址：162.243.247.187&lt;/li&gt;
  &lt;li&gt;端口号: 8080,8081 (目前我的服务器上运行了两个mproxy实例，连接哪个都可以)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;再你的本地服务器启动mproxy使用如下命令:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./mproxy -h 162.243.247.187:8080 -E -d
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;vps&quot;&gt;关于vps&lt;/h2&gt;

&lt;p&gt;如果你想购买&lt;a href=&quot;https://www.digitalocean.com/?refcode=0340b5e32fde&quot;&gt;digitalocean&lt;/a&gt;的vps麻烦点击下面的链接，你懂的：）。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/?refcode=0340b5e32fde&quot;&gt;https://www.digitalocean.com/?refcode=0340b5e32fde&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Wed, 25 Jun 2014 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/2014/06/25/minimal-http-proxy-c-language-implementation</link>
        <guid isPermaLink="true">http://examplecode.github.io/2014/06/25/minimal-http-proxy-c-language-implementation</guid>
      </item>
    
      <item>
        <title>android下针对UI的单元测试工具</title>
        <description>&lt;p&gt;这是一个非常简单的测试框架，帮助我们测试一些UI相关的用例，通常情况下我们使用Junit编写单元测试只是针对没有界面的非UI用例，而对于和界面相关的逻辑操作测试起来就不太方便，比如我只想
看看这个界面的运行效果，看看界面的布局是否达到预期 Junit就满足不了我们的要求。通常我们不得不创建一个很小的demo来演示我们的界面，那么UITestRunner就是帮助android开发者解决类似的问
题的，其实他就是你需要的那个很小的demo,只是他更加方便的以类似JUnitTest的方式把你的所有用例组织起来（你只要写一个以“test”开头的方法即可），并且把这些用例以列表的方式显示出来，测试其中一个用例，只需要点击列表项即可。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;源码地址:&lt;/strong&gt;&lt;a href=&quot;https://github.com/examplecode/android-ui-test-runner&quot;&gt;https://github.com/examplecode/android-ui-test-runner&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;float:left&quot; src=&quot;/images/UITestRnnner-TestSuite.png&quot; alt=&quot;测试套件列表&quot; title=&quot;测试套件列表&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/UITestRunner-testCase.png&quot; alt=&quot;测试用例列表&quot; title=&quot;测试用例列表&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;uitestrunner&quot;&gt;在你的项目中使用UITestRunner&lt;/h2&gt;

&lt;h3 id=&quot;step1-uitestrunnereclise&quot;&gt;step1 导入UITestRunner到Eclise的工作空间&lt;/h3&gt;

&lt;p&gt;UITestRunner需要和你要测试的项目在同一个workspace,首先我们需要把它导入到我们所在的workspace.&lt;/p&gt;

&lt;p&gt;按照以下的步骤操作：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;File -&amp;gt; Import -&amp;gt; Existing Android Code Into WorkSpace
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;step2--uitestrunner&quot;&gt;step2 在你的项目中设置依赖 UITestRunner&lt;/h3&gt;
&lt;p&gt;UITestRunner 是以lib类型的工程存在，我们必须设置我们的项目依赖UITestRunner.
按照以下步骤操作：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;选择你的项目 -&amp;gt; 选择Properties(右键菜单) -&amp;gt; 选择Android 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这时候你会看到下面这个界面,点击Add把UITestRunner添加进来。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/Depend-UITestRunner.png&quot; alt=&quot;设置依赖UITestRunner&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;step3-uitestrunner&quot;&gt;step3 添加UITestRunner的声明&lt;/h3&gt;

&lt;p&gt;在你自己项目的AndroidManifest.xml中添加以下内容声明UITestActivity(测试用例的展示界面)&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;activity&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;android:name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;com.mmbox.uitestrunner.UITestActivity&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;action&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;android:name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;com.mmbox.uitestrunner.Main&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;category&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;android:name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;android.intent.category.DEFAULT&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;step4-&quot;&gt;step4 创建你自己的测试套件&lt;/h3&gt;

&lt;p&gt;你可以根据不同的测试类型创建多个测试套件，创建测试套件很简单只需要创建一个Class从UITestSuite继承即可。建议我们创建一个package来存放所有的测试套件(不是必须只是为了清楚易于维护，包名可以自己定义), 如下图所示:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/TestSuite-Package.png&quot; alt=&quot;测试套件放置到一个统一的package下&quot; /&gt;&lt;/p&gt;

&lt;p&gt;测试套件的实现代码如下所示：&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MySampleTestSuite1&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UITestSuite&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MySampleTestSuite1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Context&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// TODO Auto-generated constructor stub&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;step6-&quot;&gt;step6 为已有的测试套件添加测试用例&lt;/h3&gt;

&lt;p&gt;添加测试用例很简单，只需要在测试套件中增加一些以 “test” 开头的 public 方法即可，如以下代码：&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MySampleTestSuite1&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UITestSuite&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MySampleTestSuite1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Context&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// TODO Auto-generated constructor stub&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testSayHello&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Toast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;makeText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;Hello UITestRunner&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Toast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LENGTH_SHORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testCase1InTestSuite1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Toast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;makeText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;testCase1InTestSuite1 is runngin&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Toast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LENGTH_SHORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testCase2InTestSuite1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; 
    &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Toast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;makeText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;testCase2InTestSuite1 is runngin&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Toast&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LENGTH_SHORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;step5-&quot;&gt;step5 启动测试用例&lt;/h3&gt;

&lt;p&gt;完成以上步骤就可以通过eclise安装项目到你的设备或模拟器中了，启动测试用例很简单只需要输入下面的命令即可.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;adb shell am start -a com.mmbox.uitestrunner.Main
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;一切正常的话你将会看到下面的界面:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/UITestRnnner-TestSuite.png&quot; alt=&quot;测试套件列表&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;view&quot;&gt;在测试用例中测试一个View的布局显示&lt;/h2&gt;

&lt;p&gt;我们除了在测试用例测试一些简单的逻辑外，还有一个经常需要的场景就是想看看一个布局文件的实际显示效果，这时候我们没有必要创建一个新的Activity来显示你的View，只需要在测试用例中调用showTestView方法即可. 框架提供了两个方法 showView,showLayout，分别用于显示一个View实例和展示一个布局文件。&lt;/p&gt;

&lt;h3 id=&quot;view-1&quot;&gt;显示一个view实例&lt;/h3&gt;

&lt;h4 id=&quot;section&quot;&gt;代码&lt;/h4&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testShowSimpleButton&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Button&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;btn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;btn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Click Me&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;btn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setLayoutParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ViewGroup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LayoutParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ViewGroup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LayoutParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;WRAP_CONTENT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ViewGroup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LayoutParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;WRAP_CONTENT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;showView&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;btn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id=&quot;section-1&quot;&gt;展示效果&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/images/test_view.png&quot; alt=&quot;测试显示一个Button&quot; title=&quot;测试显示一个Button&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;显示一个布局文件&lt;/h3&gt;

&lt;h4 id=&quot;section-3&quot;&gt;代码&lt;/h4&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testShowSimpleLayout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;showLayout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;show_layout_demo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id=&quot;section-4&quot;&gt;展示效果&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/images/test_layout.png&quot; alt=&quot;显示FrameLayout的布局测试&quot; title=&quot;显示FrameLayout的布局测试&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Mon, 23 Jun 2014 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/android/2014/06/23/ui-test-runner-for-android</link>
        <guid isPermaLink="true">http://examplecode.github.io/android/2014/06/23/ui-test-runner-for-android</guid>
      </item>
    
      <item>
        <title>一些非常棒的在线工具【绝对干货】</title>
        <description>&lt;p&gt;分享整理了一下自己常用的几个在线网站，绝对是强悍简单。谁有更好的欢迎推荐 ：）&lt;/p&gt;

&lt;h3 id=&quot;markdown-&quot;&gt;MarkDown 编辑&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;https://stackedit.io&quot;&gt;https://stackedit.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;非常棒的MarkDown在线编辑工具，写MarkeDown所见即所得，支持保存到本地的不同格式(html,pdf,markedown);支持同步到Google Drive,Drop Box.支持发布到 github,gist,wordpress 等等。&lt;/p&gt;

&lt;h3 id=&quot;section&quot;&gt;脚本和命令行查找&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;http://www.commandlinefu.com/commands/browse&quot;&gt;http://www.commandlinefu.com/commands/browse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;搜集了大量的脚本和命令行及unix下常用技巧。如果你想使用很酷的脚本和命令提高工作效率，这个网址一定用得到。&lt;/p&gt;

&lt;h3 id=&quot;android&quot;&gt;在线制作android应用图标&lt;/h3&gt;

&lt;p&gt;这是一个非常棒的在线处理android图标的一个工具，强烈推荐 ！完全按照android的设计规范，输出不同规格的图标资源。同时还提供了很多现成的矢量图资源，对于缺少设计的android程序员真是一大福利。我做的浏览器产品完全依赖于这个工具实现大家可以看看实际效果 &lt;a href=&quot;http://xbrowser.me&quot;&gt;http://xbrowser.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://romannurik.github.io/AndroidAssetStudio/index.html&quot;&gt;http://romannurik.github.io/AndroidAssetStudio/index.html&lt;/a&gt;  （可能需要翻墙）&lt;/p&gt;

&lt;h3 id=&quot;asscii&quot;&gt;Asscii流程图绘制&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;http://www.asciiflow.com&quot;&gt;http://www.asciiflow.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;本人奉行极简主意，文档使用markdown,自然流程图也使用文本最好。这是一个强大的在线ASSCII图形绘制工具。&lt;/p&gt;

&lt;p&gt;下面是个demo&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;          +------------+        
    +---&amp;gt; | BaseClass  | &amp;lt;--+   
    |     |            |    |   
    |     +------------+    |   
    |                       |   
+---+------+        +-------+--+
|SubClassA |        |SubClassB |
|          |        |          |
+----------+        +----------+
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;section-1&quot;&gt;正则表达式测试&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;http://www.rubular.com&quot;&gt;http://www.rubular.com&lt;/a&gt;&lt;br /&gt;
网址: &lt;a href=&quot;http://www.debuggex.com&quot;&gt;http://www.debuggex.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;不做解释两个网址，第一个写ruby下的正则比较方便.&lt;/p&gt;

&lt;h3 id=&quot;ip&quot;&gt;查看出口ip地址&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;http://www.ifconfig.me&quot;&gt;http://www.ifconfig.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;不做解释，看域名就知道。&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;检测你的服务器的网速&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;http://www.just-ping.com&quot;&gt;http://www.just-ping.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;输入你的服务器地址，该网站会从全球各地的镜像ping你的主机。这样你可以了解到你的网站在全球各个地方的访问速度。&lt;/p&gt;

&lt;h3 id=&quot;section-3&quot;&gt;番茄工作法的计时小工具&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;http://alloyteam.github.io/AlloyTimer/&quot;&gt;http://alloyteam.github.io/AlloyTimer/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;腾讯提供的番茄工作法的即时小工具，不懂”番茄工作法”的去Google.&lt;/p&gt;

&lt;h3 id=&quot;section-4&quot;&gt;在线移动应用原型制作&lt;/h3&gt;

&lt;p&gt;网址: &lt;a href=&quot;https://www.flinto.com/&quot;&gt;https://www.flinto.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;使用图片快速生成移动应用的原型，设计师和产品经理绝对不要错过。在线制作，只要上传几张设计效果图随便拖拽几下，就可以部署到手机上查看逼真的交互效果（遗憾的是此网站不是完全免费，注册后免费30天的体验）。&lt;/p&gt;

&lt;h3 id=&quot;section-5&quot;&gt;管理搜藏&lt;/h3&gt;

&lt;p&gt;下面两个网址程序员不要错过，用来管理github上的start.&lt;/p&gt;

&lt;p&gt;网址: &lt;a href=&quot;http://gitconstellation.com&quot;&gt;http://gitconstellation.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;网址:  &lt;a href=&quot;https://app.astralapp.com&quot;&gt;https://app.astralapp.com&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;svg&quot;&gt;在线SVG编辑工具&lt;/h3&gt;

&lt;p&gt;网址： &lt;a href=&quot;http://editor.method.ac/&quot;&gt;http://editor.method.ac/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;很多图形处理工具不内建支持 .svg文件 ，我想把矢量图导出为指定规格的png文件这个在线工具帮了大忙&lt;/p&gt;

&lt;h3 id=&quot;tinypng-&quot;&gt;tinypng 图片压缩&lt;/h3&gt;

&lt;p&gt;这是一个用于压缩png图片的在线工具，非常适合移动应用开发人员和前端开发人员对图片资源优化。可以在不太损失显示效果的情况下能够把图片的尺寸减少 70%。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tinypng.com/&quot;&gt;https://tinypng.com/&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 21 Jun 2014 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/tools/2014/06/21/frequently-online-tools</link>
        <guid isPermaLink="true">http://examplecode.github.io/tools/2014/06/21/frequently-online-tools</guid>
      </item>
    
      <item>
        <title>GFW DNS污染原理 - 防止DNS污染的小工具</title>
        <description>&lt;p&gt;以前写的小工具，最近整理代码，再这里公布出来。这个小工具用于获取被gfw dns 污染域名的真实ip地址，通常可以用于获取twitter,youtube,facebook等网址的真实ip地址。如果你的某些程序需要绕过GFW DNS污染也许这些代码片断会用的上，分别提供了c语言和java的实现版本。&lt;/p&gt;

&lt;p&gt;其工作原理大致如下：&lt;/p&gt;

&lt;p&gt;GFW对域名进行DNS污染的原理实际上是在正常的DNS服务器返回请求包之前，返回请求者错误的IP地址。而GFW返回的这些错误地址也是有规律可循，根据这个原理我们就不难写出对抗GFW DNS污染的程序了。所以我提供的小程序核心内容就有两点：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;提供GFW返回IP的一个黑名单列表。&lt;/li&gt;
  &lt;li&gt;如果服务端返回的DNS响应IP地址在黑名单列表中，则进行忽略并尝试等待真实的ip地址返回。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/examplecode/gfw_dns_resolver&quot;&gt;前往 github 源码地址&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;c-&quot;&gt;C 语言版本&lt;/h2&gt;

&lt;h3 id=&quot;section&quot;&gt;编译&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;gcc -o gfw_dns_resolver  gfw_dns_resolver.c 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;编译输出调试信息版本&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gcc -o gfw_dns_resolver -DDEBUG gfw_dns_resolver.c 
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;section-1&quot;&gt;运行示例&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;./gfw_dns_resolver www.twitter.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;输出:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;The real ip is: 199.59.149.230
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;java-&quot;&gt;JAVA 版本&lt;/h2&gt;

&lt;h3 id=&quot;section-2&quot;&gt;编译&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;javac GFWDnsResolver.java
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;section-3&quot;&gt;运行示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;java GFWDnsResolver www.youtube.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;输出：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;host:www.youtube.com The real ip is:173.194.72.102
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/examplecode/gfw_dns_resolver&quot;&gt;前往 github 源码地址&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Fri, 20 Jun 2014 00:00:00 +0800</pubDate>
        <link>http://examplecode.github.io/tools/2014/06/20/the-tools-prevent-dns-cache-pollution</link>
        <guid isPermaLink="true">http://examplecode.github.io/tools/2014/06/20/the-tools-prevent-dns-cache-pollution</guid>
      </item>
    
  </channel>
</rss>
