<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>chengkai (chengkai)</title>
    <link>https://ruby-china.org/chengkai</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>独立开发者因为广告拦截被优酷索赔 100 万元</title>
      <description>&lt;p&gt;本人独立开发者，最近遇到了这么一个麻烦。求各位老哥给支个招，看看怎样把损失降到到最少啊。 ：（&lt;/p&gt;

&lt;p&gt;详情参见 知乎链接，麻烦有知乎账号的同学，给点个赞支持或分享下，在此谢过。🙏&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zhuanlan.zhihu.com/p/285778671" rel="nofollow" target="_blank"&gt;https://zhuanlan.zhihu.com/p/285778671&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Thu, 12 Nov 2020 15:10:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/40571</link>
      <guid>https://ruby-china.org/topics/40571</guid>
    </item>
    <item>
      <title>使用 Puppeteer 提供网页转 PDF 及整页截图服务</title>
      <description>&lt;p&gt;原文链接：&lt;a href="http://doc.xbext.com/devopt/using-puppeter-convert-webpage-to-pdf-and-fullpage-screenshot/" rel="nofollow" target="_blank"&gt;http://doc.xbext.com/devopt/using-puppeter-convert-webpage-to-pdf-and-fullpage-screenshot/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最近需要为&lt;a href="https://www.xbext.com" rel="nofollow" target="_blank" title=""&gt;x 浏览器&lt;/a&gt; 提供一个网页转 PDF 的服务，鉴于 X 浏览器定位是一个简洁轻便的手机浏览器产品，所以打算在服务端实现这一功能，同时为了更好的为 X 浏览器客户端服务，所以准备自己尝试搭建这么一套服务。去年的时候曾经看到过关于 Puppeteer 的相关文章，知道通过这个产品可以实现网页转 pdf 以及生成整页截图。这篇文章用来记录如何使用这组件来搭建一个网页转 pdf 的服务。&lt;/p&gt;
&lt;h2 id="什么是Puppeteer"&gt;什么是 Puppeteer&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/GoogleChrome/puppeteer" rel="nofollow" target="_blank" title=""&gt;Puppeteer&lt;/a&gt; 是由 GoogleChrome 团队维护的一套基于 NodeJs 的 API 用于操控&lt;a href="https://developers.google.com/web/updates/2017/04/headless-chrome" rel="nofollow" target="_blank" title=""&gt;HeadLess Chrome&lt;/a&gt; 。headless chrome 其实是一个没有 UI 界面的 Chrome 浏览器，除此之外几乎和真正的 Chrome 没有差别。这时候你可能会奇怪没有界面的 Chrome 怎么用啊？是的对于普通用户来讲 Headless Chrome 确实无法使用，但是对于一些自动化测试的场景使用 Headless Chrome 就太方便了。我们只要通过命令行就可以对 Chrome 进行操控完成普通浏览器所用使用场景，打开页面，填写表单，点击按钮，甚至模拟鼠标及触屏，都完全不在话下。&lt;/p&gt;

&lt;p&gt;Puppeteer 提供了一套完备的&lt;a href="https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md" rel="nofollow" target="_blank" title=""&gt;API&lt;/a&gt;使我们我们可以方便的操控 Chrome，我们通过 UI 界面可以完成的操作都可以通过 Puppeteer 来实现。&lt;/p&gt;

&lt;p&gt;下面介绍如何安装 Puppeteer 以及使用 Puppeteer 提供整页截图和生成 pdf 文件。&lt;/p&gt;
&lt;h2 id="在Linux环境下部署Puppeteer"&gt;在 Linux 环境下部署 Puppeteer&lt;/h2&gt;
&lt;p&gt;为了安装部署方便，我们选择 ubutun 18.04 作为后台服务，在这之前我需要先安装 NodeJs 运行环境，Puppeteer 的一些最新特性需要在 Node v7.6.0 或更高版本中才被支持。所以我们选择安装 NodeJs 的 8.x 版本。&lt;/p&gt;

&lt;p&gt;curl -sL &lt;a href="https://deb.nodesource.com/setup_8.x" rel="nofollow" target="_blank"&gt;https://deb.nodesource.com/setup_8.x&lt;/a&gt; | sudo -E bash -
    sudo apt-get install -y nodejs&lt;/p&gt;

&lt;p&gt;安装 Puppeteer&lt;/p&gt;

&lt;p&gt;mkdir puppeteer-demo
    cd puppeteer-demo
    npm i  puppeteer&lt;/p&gt;

&lt;p&gt;安装的过程中会自动下载 HeadlessChrom, 完整安装后我们可以通过下面的脚本测试 puppeteer 是否可以和 HeadlessChrom 一起正常工作。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//version.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;puppeteer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;version&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行脚本&lt;/p&gt;

&lt;p&gt;node verison.js&lt;/p&gt;

&lt;p&gt;工作正常的话会显示 headless chromed 的版本号&lt;/p&gt;

&lt;p&gt;HeadlessChrome/79.0.3945.0&lt;/p&gt;
&lt;h2 id="转换网页到pdf格式"&gt;转换网页到 pdf 格式&lt;/h2&gt;
&lt;p&gt;下面的代码展示了使用 Puppeteer 如何把网页转换为 pdf 格式。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const puppeteer = require('puppeteer');

(async() =&amp;gt; {
const browser = await puppeteer.launch();
const page = await browser.newPage();

await page.goto('https://www.xbext.com', {waitUntil: 'networkidle2'});
await page.pdf({path: 'page.pdf', format: 'A4'});

await browser.close();
})();

&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="生成整页网页截图"&gt;生成整页网页截图&lt;/h2&gt;
&lt;p&gt;下面代码展示了如何模仿手机作为请求，并且生成整个网页的截图&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;puppeteer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setUserAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;//await page.setViewport({ width: 1920, height: 1080 });&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setViewport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;isMobile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt; 

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.xbext.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="na"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;networkidle2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myscreeshot.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;fullPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;//如图片过大可以通过生成.jpg文件并且控制图标质量&lt;/span&gt;
  &lt;span class="c1"&gt;//await page.screenshot({path: 'myscreeshot.jpg',fullPage: true,quality: 80});&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="相关问题"&gt;相关问题&lt;/h2&gt;
&lt;p&gt;运行 puppeteer 脚本时候无法启动 Chrome ,提示如下错误&lt;/p&gt;

&lt;p&gt;chrome-linux/chrome: error while loading shared libraries: libasound.so.2&lt;/p&gt;

&lt;p&gt;安装缺失的库即可&lt;/p&gt;

&lt;p&gt;sudo apt-get install libasound2&lt;/p&gt;

&lt;p&gt;无法渲染中文 &lt;/p&gt;

&lt;p&gt;生成 pdf 或截图的时候，中文字符显示为一个个小方块，是因为缺失中文字体文件，导致 chromium 无法正常渲染，使用下面的命令安装即可。&lt;/p&gt;

&lt;p&gt;sudo apt-get install language-pack-zh*
    sudo apt-get install chinese*&lt;/p&gt;
&lt;h2 id="参考资料"&gt;参考资料&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://developers.google.com/web/updates/2017/04/headless-chrome" rel="nofollow" target="_blank"&gt;https://developers.google.com/web/updates/2017/04/headless-chrome&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Tue, 12 Nov 2019 12:25:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/39243</link>
      <guid>https://ruby-china.org/topics/39243</guid>
    </item>
    <item>
      <title>[北京] 程序员寻找帮手一起完善产品 [10k-25k] + 股权</title>
      <description>&lt;p&gt;本人程序员一枚，花了大半年的时间做了这么一款手机浏览器产品，叫做&lt;a href="http://xbrowser.me" rel="nofollow" target="_blank" title=""&gt;X 浏览器&lt;/a&gt;  。全职苦逼的折腾了大半年后也是得到了部分用户的认可，最骄傲是我们做到了在小米市场搜索"浏览器" 排名第 7 位和一些大牌浏览器厂商并列。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://upload-images.jianshu.io/upload_images/222358-f05974f3e3aca5a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" title="" alt="小米市场排名"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://upload-images.jianshu.io/upload_images/222358-24db86875874eaaf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" title="" alt="小米用户评论"&gt;&lt;/p&gt;

&lt;p&gt;故事和大多数做产品的程序员类似，在得到了部分用户的认可后，有人愿意拿出一些资金支持我做这个产品。当初还很高兴，可后来却在纠结到底是做一个自由的个人开发者还是接受这笔投资？有人会说你这是纯粹的装 B 行为，有人投资还得了便宜卖乖。其实如果没有经历这样一个心路历程之前我也是这样想的，而且当初的时候我是有主动找过投资的，后来才想明白天下没有免费的午餐接受投资意味着需要向利益妥协，看看现在的商业浏览器做成什么样子就知道了，做一个自由程序员可以把产品做的更加纯粹，追随初心。自己需要在程序员和商人之间做一个选择，为此我痛苦的纠结了很长一段时间，最后承认我是个世俗的人，想做成一件事情本来就有面临这样那样的妥协，但做一款好产品依旧是我的目标，商业的支持可以帮你把产品变的更好更快的验证想法，同时也会让你的产品变的背离初衷，问题是我如何在这里去找到平衡。&lt;/p&gt;

&lt;p&gt;一向自认为比较高效的我，目前面对各种和用户的沟通及待完善的功能已经明显有些力不从心了，而且有些需求作为程序员我是有点无能为力的，比如用户吐槽 UI 不够美观 :(  。所以在这里我希望能够找到一些志同道合的伙伴和我一起打造一款好的产品。&lt;/p&gt;

&lt;p&gt;先说说自己的价值观吧，价值观不对是很难成为战友的。下面是我认同的一些信条，如果你恰恰也认可这些请继续往下看。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;喜欢简单，高效，讨厌一切形式化的东西，认同 kiss 原则。&lt;/li&gt;
&lt;li&gt;just do it ,事情是做出来的不是想出来的&lt;/li&gt;
&lt;li&gt;完成比完美重要，持续迭代&lt;/li&gt;
&lt;li&gt;这个世界没有规律，得到真相的唯一方法是快速试错和探索。&lt;/li&gt;
&lt;li&gt;好的产品是演化过来不是规划过来的，如果你动不动和我谈三个月的规划我会很鄙视你。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;接下来说说我需要的伙伴吧，我崇尚简单高效的小团队。Instagram 才 7 个人，所以我们 5-6 个人足以。&lt;/p&gt;

&lt;p&gt;** UI 设计师 **&lt;/p&gt;

&lt;p&gt;优秀的产品向来是优秀程序员 + 优秀设计师一起打造的。程序员的问题我可以 hold 住但是设计师我就无能为力了，所以渴求有想法的优秀设计师加入。(也许你现在看到的 UI 并不是那么丑，在这里要感谢一个叫姜楠的设计师，在前期给我提供了很多帮助.)&lt;/p&gt;

&lt;p&gt;最近遭到吐槽最多的是网友呼吁尽快实现 Material Design, 所以如果你对这个了解或者有兴趣就最好了。&lt;/p&gt;

&lt;p&gt;不知道怎样提供给设计师想要的东西，我只能说自己愿意陪着你去尝试你的一些想法和创意，和你一起分享好的想法创意带来的成就感。&lt;/p&gt;

&lt;p&gt;** Android 程序员和 Web 前端各一枚 **&lt;/p&gt;

&lt;p&gt;首先希望你对技术有浓厚兴趣的，这是最重要的。这是成为一个优秀程序员的基础。
有经验当然好，但不是最重要的，因为我很乐意分享自己的一些经验和原则，我最看重的是学习能力和解决问题的能力。&lt;/p&gt;

&lt;p&gt;有好奇心，爱折腾各种技术，有志成为全栈工程师。我自己也是高度认同"Devopt" 的理念，没准儿以后公司的服务器部署都交给你管理。&lt;/p&gt;

&lt;p&gt;**  海外运营人员 **&lt;/p&gt;

&lt;p&gt;在国内巨头林立的形势下，我更相信国外市场目前会存在更大的机遇，如果你也认同海外市场并且有能力帮到我们，也请给我一个面对面沟通的机会吧。&lt;/p&gt;

&lt;p&gt;**  其他 **&lt;/p&gt;

&lt;p&gt;看了上面如果你很认同我的一些价值观，认为你自己也能够对团队和产品有很大帮助欢迎毛遂自荐联系我。&lt;/p&gt;

&lt;p&gt;** 关于这款产品的前途 **&lt;/p&gt;

&lt;p&gt;读到这里如果你对我的想法还算认同，但是对浏览器产品的前途堪忧顾虑，毕竟竞争对手都是巨头，那么我这里还有一篇长文分析这款产品的定位和优势，留下您的邮件我发给您，您看后再决定是否加入。&lt;/p&gt;

&lt;p&gt;** 关于待遇和股权 **&lt;/p&gt;

&lt;p&gt;我这边暂时能够给到的待遇是 10k - 25k 你可以待遇和股权方面做选择，更多的股权或更多的薪水。&lt;/p&gt;

&lt;p&gt;** 关于工作时间 **&lt;/p&gt;

&lt;p&gt;37Signals 文化中毒很深，崇尚知识密集型，而不是劳动密集型，喜欢简单高效的工作。所以在大部分创业公司 996 的情况下，我们坚持每天 7 个半小时，每周双休的作息制度。&lt;/p&gt;

&lt;p&gt;原则上讲我是希望能够找到和我并肩作战的伙伴，不过在没有建立信任关系之前，远程的合作我也不排斥。&lt;/p&gt;

&lt;p&gt;** 联系方式 **&lt;/p&gt;

&lt;p&gt;邮件：chengkai.me@gmail.com&lt;/p&gt;

&lt;p&gt;** 关于我 **&lt;/p&gt;

&lt;p&gt;我是一个自由懒散的程序员，没有啥 BAT 背景，但自己带过的几个学生都在 BAT 及一线互联网公司供职，你可以从下面的几个链接更多的了解关于我的信息。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;github:&amp;nbsp;&lt;a href="https://github.com/examplecode" rel="nofollow" target="_blank" title=""&gt;https://github.com/examplecode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;blog1:&amp;nbsp;&lt;a href="http://www.jianshu.com/users/e8ec9a90b251/" rel="nofollow" target="_blank" title=""&gt;http://www.jianshu.com/users/e8ec9a90b251/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;blog2:&lt;a href="http://examplecode.github.io/" rel="nofollow" target="_blank" title=""&gt;http://examplecode.github.io/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>chengkai</author>
      <pubDate>Sun, 30 Aug 2015 13:40:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/27120</link>
      <guid>https://ruby-china.org/topics/27120</guid>
    </item>
    <item>
      <title>服务器被黑给我上了一课</title>
      <description>&lt;p&gt;当你作为一个独立开发者的时候总要面临这样那样的问题，以前认为的小概率事件也总是某个时间点蜂拥而至考验你的耐心，前一阵阵刚刚经历了一次木马惊魂 (参见文章&lt;a href="http://www.jianshu.com/p/d222ea914f14" rel="nofollow" target="_blank" title=""&gt;猎豹清理大师值得我们信任么？&lt;/a&gt; )，这次又遇到了服务器被黑。&lt;/p&gt;

&lt;p&gt;部署服务器及一般的服务配置管理对于一个写代码的人自然不在话下，但是相对专业的运维人员程序员确少的却是一个安全意识，总以为服务器被攻击是一个小概率的事件。以前是这么考虑的“互联网上的主机那么多偏偏你的主机被骇客盯上？这不跟重大奖一样么，我有那么幸运么？”虽然前一段时间自己的产品被当成木马已经是中了一次大奖了。所以心存侥幸心理，能省事就省事，先把服务部署起来能用就行，这也倒是符合我的极简主义行事风格。只有经历才能成长，这句话说的一点没错，感谢这个不太聪明的骇客给我上了一课，从此在做任何服务器部署和管理的时候我的脑袋里也多了一根弦儿“安全意识"。事情是这样的。。。&lt;/p&gt;

&lt;p&gt;全文见： &lt;a href="http://www.jianshu.com/p/97b9dc47b88c" rel="nofollow" target="_blank"&gt;http://www.jianshu.com/p/97b9dc47b88c&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Mon, 25 May 2015 15:42:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/25731</link>
      <guid>https://ruby-china.org/topics/25731</guid>
    </item>
    <item>
      <title>愚人节前期的病毒木马惊魂</title>
      <description>&lt;p&gt;大家应该都还记得前几日在各大媒体和朋友圈疯转的一片文章《傅盛豹变》我也读了这边文章，说实话文章写的很棒，看的我也是心潮澎湃。一向不怎么刷朋友圈的我，不仅转发而且还特地专门发给了几个身边的朋友希望大家都能够从猎豹和傅盛先生那里学到一些东西或者有所感悟。我自己也是看了这篇文章后怀着无比崇敬的心情安装了猎豹清理这个产品进行观摩学习。不曾想才过去短短的几天，就转变了我对这款产品的看法。&lt;/p&gt;

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

&lt;p&gt;更多内容，请了解图文并茂的原文 &lt;a href="http://www.jianshu.com/p/d222ea914f14" rel="nofollow" target="_blank"&gt;http://www.jianshu.com/p/d222ea914f14&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Tue, 31 Mar 2015 23:10:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/24939</link>
      <guid>https://ruby-china.org/topics/24939</guid>
    </item>
    <item>
      <title>个人写的 Android 浏览器产品，吹个牛,虽然是个人作品，但不输商业产品</title>
      <description>&lt;p&gt;程序员一枚，没有美工，没有设计，没有产品，自己搞定。&lt;/p&gt;

&lt;p&gt;下载地址：&lt;a href="http://xbrowser.me" rel="nofollow" target="_blank"&gt;http://xbrowser.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;说说比大多数浏览器做的好的地方吧 (也许是自己的意淫，欢迎拍砖)&lt;/p&gt;
&lt;h2 id="极简，快速"&gt;极简，快速&lt;/h2&gt;
&lt;p&gt;安装包非常小，绝对简洁一致的操作体验，一切皆为页面 (下载，搜藏，历史，设置)&lt;/p&gt;
&lt;h2 id="快捷输入搜索"&gt;快捷输入搜索&lt;/h2&gt;
&lt;p&gt;手机浏览器最重要的是搜索和输入网址，为了更快捷搜索和输入网址，个人再这方面做了很多优化，觉得比大多数的浏览器输入更加智能快捷，有时候你只需要输入一个字母就能猜到你的意图。&lt;/p&gt;
&lt;h2 id="稍后离线阅读"&gt;稍后离线阅读&lt;/h2&gt;
&lt;p&gt;主要是解决自己的问题，有时候地铁公交信号不好，没有办法上网，做了一个离线稍后读的功能。再也不怕没信号了。据我了解目前没有任何一家浏览器有此功能&lt;/p&gt;
&lt;h2 id="全屏体验"&gt;全屏体验&lt;/h2&gt;
&lt;p&gt;无论是 H5 游戏还是文章阅读，都希望有一个不受干扰的良好体验。所以个人在这方面的交互做了大量优化，希望读者在阅读的时候尽量保持全屏的体验，而在用户想切换页面或者搜索的时候又能很方面的把工具条和搜索栏呼叫出来。上推隐藏工具条和搜索栏，下来就会呼出工具条。重要的是在你阅读的时候，工具条和搜索栏不会频繁出现隐藏干扰读者。目前也没有任何浏览器做到这一点。&lt;/p&gt;

&lt;p&gt;如果大家感觉还行麻烦帮顶一下吧，支持下个人开发者：）&lt;/p&gt;

&lt;p&gt;下载地址：&lt;a href="http://xbrowser.me" rel="nofollow" target="_blank"&gt;http://xbrowser.me&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Sun, 25 Jan 2015 16:00:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/23931</link>
      <guid>https://ruby-china.org/topics/23931</guid>
    </item>
    <item>
      <title>用 Rails 写了一个应用大家看看有价值么？</title>
      <description>&lt;p&gt;这是一个打包 HTML5 应用为一个 本地 APK 的在线工具，主要就是其中用到了 delayed_job 组件，用于异步任务，前端提交了请求到服务器任务队列，服务端远程以异步的方式执行构建和编译工作，最后生成一个 .apk 文件提供下载。 &lt;/p&gt;

&lt;p&gt;应用地址： &lt;a href="http://xbrowser.me/appbuilder" rel="nofollow" target="_blank"&gt;http://xbrowser.me/appbuilder&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Thu, 22 Jan 2015 16:48:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/23889</link>
      <guid>https://ruby-china.org/topics/23889</guid>
    </item>
    <item>
      <title>markdown + git 最适合程序员的 wiki 系统 (又是一个 ruby 写的很酷的东东)</title>
      <description>&lt;p&gt;前一段时间在一个 Team 中使用 gollum 作为团队 scrum 开发的白板，感觉 gollum 是一个非常适合程序员使用的 wiki 系统，特在此推荐。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://examplecode.github.io/tools/2014/09/26/install-gollum-in-mac-109/" rel="nofollow" target="_blank"&gt;http://examplecode.github.io/tools/2014/09/26/install-gollum-in-mac-109/&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Thu, 22 Jan 2015 09:03:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/23870</link>
      <guid>https://ruby-china.org/topics/23870</guid>
    </item>
    <item>
      <title>清除 Android 和 IOS 项目中无用的图片资源 </title>
      <description>&lt;p&gt;&lt;a href="https://github.com/examplecode/unused-image" rel="nofollow" target="_blank"&gt;https://github.com/examplecode/unused-image&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;附上一则招聘：） &lt;a href="http://www.v2ex.com/t/139600" rel="nofollow" target="_blank"&gt;http://www.v2ex.com/t/139600&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Mon, 27 Oct 2014 13:06:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/22282</link>
      <guid>https://ruby-china.org/topics/22282</guid>
    </item>
    <item>
      <title>[分享] 最小的 http proxy c 语言实现 - 支持翻墙，从此 google 无压力</title>
      <description>&lt;p&gt;文章地址： &lt;a href="http://examplecode.github.io/2014/06/25/minimal-http-proxy-c-language-implementation/" rel="nofollow" target="_blank"&gt;http://examplecode.github.io/2014/06/25/minimal-http-proxy-c-language-implementation/&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Thu, 26 Jun 2014 23:18:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/20189</link>
      <guid>https://ruby-china.org/topics/20189</guid>
    </item>
    <item>
      <title>Lotus：替代 Rails 的新一代 Web 框架？</title>
      <description>&lt;p&gt;有人听说过 Lotus 么？请了解的评价一下。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geek.csdn.net/news/detail/13201" rel="nofollow" target="_blank"&gt;http://geek.csdn.net/news/detail/13201&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Wed, 25 Jun 2014 15:12:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/20159</link>
      <guid>https://ruby-china.org/topics/20159</guid>
    </item>
    <item>
      <title>使用 Ruby Jekyll 制作的 github page 页面第一篇 blog </title>
      <description>&lt;p&gt;使用 Ruby Jekyll 制作的 github page 页面第一篇 blog  :)&lt;/p&gt;

&lt;p&gt;GFW DNS 污染原理 ,java 和 c 代码展示如何绕过 DNS 污染&lt;/p&gt;

&lt;p&gt;&lt;a href="http://examplecode.github.io/tools/2014/06/20/the-tools-prevent-dns-cache-pollution/" rel="nofollow" target="_blank"&gt;http://examplecode.github.io/tools/2014/06/20/the-tools-prevent-dns-cache-pollution/&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Sun, 22 Jun 2014 14:54:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/20104</link>
      <guid>https://ruby-china.org/topics/20104</guid>
    </item>
    <item>
      <title>获取 GFW DNS 域名污染的真实 IP 的小工具</title>
      <description>&lt;p&gt;一个小工具，提供 C 语言，JAVA 两种语言版本实现，对编写想绕过 GFW DNS 污染的程序的同学也许有用。&lt;/p&gt;

&lt;p&gt;源码地址： &lt;a href="https://github.com/examplecode/gfw_dns_resolver" rel="nofollow" target="_blank"&gt;https://github.com/examplecode/gfw_dns_resolver&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Fri, 20 Jun 2014 19:28:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/20085</link>
      <guid>https://ruby-china.org/topics/20085</guid>
    </item>
    <item>
      <title>[分享] 一个 android 下测试 UI 和逻辑的单元测试工具，使开发效率倍增</title>
      <description>&lt;p&gt;团队内部用的，使用效果很好。最近整理发布出来了。&lt;/p&gt;

&lt;p&gt;项目地址： &lt;a href="https://github.com/examplecode/android-ui-test-runner" rel="nofollow" target="_blank"&gt;https://github.com/examplecode/android-ui-test-runner&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Wed, 11 Jun 2014 22:01:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/19883</link>
      <guid>https://ruby-china.org/topics/19883</guid>
    </item>
    <item>
      <title>[ 北京] 傲游移动团队招聘 iOS,Android (10K 起，上不封顶)</title>
      <description>&lt;h2 id="薪酬待遇"&gt;薪酬待遇&lt;/h2&gt;
&lt;p&gt;10K 起，上不封顶。&lt;/p&gt;
&lt;h2 id="招聘职位"&gt;招聘职位&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;android 浏览器开发工程师 (对 android 程序开发有自信即可)&lt;/li&gt;
&lt;li&gt;IOS 浏览器开发工程师 (对 IOS 程序开发有自信即可)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工作职责"&gt;工作职责&lt;/h2&gt;
&lt;p&gt;移动浏览器的维护及开发工作，此职位不涉及浏览器内核开发但希望你对 http 协议及 JS 有一定的了解。&lt;/p&gt;
&lt;h2 id="团队崇尚的文化"&gt;团队崇尚的文化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;just do it ,事情是做出来的不是想出来的。&lt;/li&gt;
&lt;li&gt;务实，敏捷，深深认同 37Signals 公司的文化，极简主义，厌恶一切形式化的东西&lt;/li&gt;
&lt;li&gt;我们喜欢做事情有主见有想法的人，敢于说不，敢于承担的人。&lt;/li&gt;
&lt;li&gt;创业者精神，做事情会不拘小节，但是有时候又需要专业精神。&lt;/li&gt;
&lt;li&gt;愿意把一件小事做好的人，实际上并不是每个人都能把一件小事做好。&lt;/li&gt;
&lt;li&gt;把事情做好有三个必要条件，沟通，沟通，沟通。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="对你的期望"&gt;对你的期望&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;对技术有极大的兴趣，生命不息折腾不止，愿意尝试和了解各种技术。全栈工程师是你的目标。&lt;/li&gt;
&lt;li&gt;希望你最好也读过《rewrok》,《geting real》,《精益创业》等书籍，并认同这些理念&lt;/li&gt;
&lt;li&gt;扎实的基础知识是我们看重的，各种花哨的技术和框架都是浮云。&lt;/li&gt;
&lt;li&gt;希望你有一定的工作经验，但我们更加看重的是学习能力和解决问题的能力。&lt;/li&gt;
&lt;li&gt;希望你能理解并认同 KISS 原则，这对你写出易于维护的代码会很有帮助。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我们使用的技术和开发工具"&gt;我们使用的技术和开发工具&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;C/C++, JAVA,Object C,Ruby,Pyhon,javascript&lt;/li&gt;
&lt;li&gt;Vim,Sublime,XCode,Eclipse&lt;/li&gt;
&lt;li&gt;Git/GitHub&lt;/li&gt;
&lt;li&gt;Unix-like OS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="联系方式"&gt;联系方式&lt;/h2&gt;
&lt;p&gt;chengkai.me@gmail.com&lt;/p&gt;

&lt;p&gt;更多详细信请参见官方招聘&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.maxthon.cn/jobs/" rel="nofollow" target="_blank"&gt;http://www.maxthon.cn/jobs/&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Thu, 13 Feb 2014 23:19:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/17239</link>
      <guid>https://ruby-china.org/topics/17239</guid>
    </item>
    <item>
      <title>apache 基金会的第一个 ruby 项目 Buildr，替代 Maven 和 Ant 的 java 构建工具</title>
      <description>&lt;p&gt;使用 Buildr 的一个简单示例   &lt;a href="https://github.com/examplecode/buildr_sample" rel="nofollow" target="_blank"&gt;https://github.com/examplecode/buildr_sample&lt;/a&gt;&lt;/p&gt;</description>
      <author>chengkai</author>
      <pubDate>Sun, 27 Oct 2013 19:17:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/15068</link>
      <guid>https://ruby-china.org/topics/15068</guid>
    </item>
  </channel>
</rss>
