<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>whitecrow (Aaron Liu)</title>
    <link>https://ruby-china.org/whitecrow</link>
    <description>分享温暖，保持简洁。</description>
    <language>en-us</language>
    <item>
      <title>系统论与《SICP》 (二) ：从信息流角度看，如何一步步构造系统</title>
      <description>&lt;p&gt;这是第一篇：&lt;a href="https://ruby-china.org/topics/35379" title=""&gt;系统论与《SICP》 (一) ：什么是系统&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 所有软硬件系统，都是 input -&amp;gt; 系统 -&amp;gt; output&lt;/li&gt;
&lt;li&gt;input 和 output 越复杂，他们之间的差距越大，所需要系统也越复杂（用户规模也可看做 input 的一部分）。&lt;/li&gt;
&lt;li&gt;如果把这 100 种 input，比如转化为 500 种 output，我们需要为其中每一种映射关系，至少构建一个一元函数——output = f(input)。但是我们如果为每一种映射关系都构造一个函数，那么这个软件就是纯 hard code。成本太高，也无法响应需求的增加和变化。&lt;/li&gt;
&lt;li&gt;先把某些 input 的相同维度抽象出来，这时候有两种率抽象方式：

&lt;ol&gt;
&lt;li&gt;过程抽象：归纳为一个多元函数，也就是 output = f(input1, input2)；或多层函数 output = f(f(input1), input2)。&lt;/li&gt;
&lt;li&gt;数据抽象：把 input 抽象为一个复合数据，比如 output = f(data(input1, input2))&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;但是，这种抽象还是太浅了，这时候有 3 种新的抽象方法：

&lt;ol&gt;
&lt;li&gt;如果我们把 function 也看成一种新的 input，一种新的信息，对 function 的构造做处理，f(f)(inputs)，这就是高阶函数。&lt;/li&gt;
&lt;li&gt;把数据抽象和过程抽象结合起来，标识为一个单独的 object，就是面向对象了。&lt;/li&gt;
&lt;li&gt;如果我们把这些 input、object、高阶函数，重新用另外的、更通用的方式分解为单个字符。再重新做词法、语法分析，就是元语言抽象。（先降维，再升维）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;更复杂的函数式程序：f1(f2)(data(input1, input2), f3(input3))，对 f(x) 做了三重变换：一元函数 -&amp;gt; 多元函数，单层函数 -&amp;gt; 多层函数，一阶函数 -&amp;gt; 高阶函数&lt;/li&gt;
&lt;li&gt;更复杂的对象：object1(inputs, data(inputs), object2(inputs); f(inputs), f(objects)) ，对简单对象做了三重变幻：数据抽象（简单属性 -&amp;gt; 组合属性），过程抽象（简单函数 -&amp;gt; 复杂函数），对象包对象（一阶对象 -&amp;gt; 高阶对象）。&lt;/li&gt;
&lt;li&gt;如果把那些类、高阶函数的共同维度总结出来，放入一个文件夹，就是模块了。&lt;/li&gt;
&lt;li&gt;模块和模块之前做通信，通信消息就是“协议”了。&lt;/li&gt;
&lt;li&gt;可以把通信消息，看成一种新的 input，消息以结构简单为宜。&lt;/li&gt;
&lt;li&gt;为了响应变化，抽象信息的维度时，原则是选取那些不会变化（或者难以变化）的维度，首选是低层数据结构（list \ dict \ stack）维度；低层函数（map \ select \ reduce）；低层元语言抽象（状态机、CPS）。次选环境依赖，比如对操作系统和 HTTP 协议进行抽象。再次是是业务模型中的核心业务流程和数据结构（比如证券系统中的 portfolio）。&lt;/li&gt;
&lt;li&gt;系统有纵横，纵为层次，横为划分。经天纬地之谓文。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;本系列由浅入深，先给个概述。&lt;br&gt;
最后吐个槽，计算机教材还原论太严重。&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Fri, 06 Apr 2018 22:57:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/35401</link>
      <guid>https://ruby-china.org/topics/35401</guid>
    </item>
    <item>
      <title>系统论与《SICP》 (一) ：什么是系统</title>
      <description>&lt;p&gt;近来读系统论略有心得，其元思维大可解释《SICP》的诸多内涵，记录一二。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;世间万物都可看作不同的系统。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;系统接收特定的信息，又输出特定的信息。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;计算机程序就是典型的信息处理系统。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;简单的系统是一阶的、线性的、单基元的，它只有一层，信息穿过系统做最简单的变换。比如氢气在氧气下燃烧变成水。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;复杂的系统里有好多层，信息穿过一层再穿下一层，变了再变。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;输入信息和输出信息的差别越大、越复杂，所需要构造的系统也越复杂，比如分布式计算系统。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;构造系统的第一步是要揭示输入输出信息的核心维度，维度的复杂度决定了系统有多少层，有多复杂。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;信息维度和系统的层次越少越好，因为成本越低。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;但核心维度不是显而易见的，需要你通过观察足够多的现象，从现象中去归纳关键维度，而现象就是输入和输出的数据对。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;归纳了系统的核心维度，再加上你的专业知识，你就可以对系统建模，知道了系统内部有几层，信息是怎样在内部变换的。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;维持系统的约束条件发生变化，系统随之变化，需要外力重构系统。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;所谓预测，就是根据输入信号和系统，算出输出信号，因此预测的前提是，能够去解释一个系统或其子系统。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;一旦你构建或者解释了一个系统，你就有办法从这个系统得到特定的输出，然后通过这个系统去获利。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>whitecrow</author>
      <pubDate>Mon, 02 Apr 2018 11:22:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/35379</link>
      <guid>https://ruby-china.org/topics/35379</guid>
    </item>
    <item>
      <title>[ 武汉 ] 超靠谱团队诚聘 web 后端工程师 (年薪 10 万—20 万)</title>
      <description>&lt;h2 id="职位："&gt;职位：&lt;/h2&gt;&lt;h3 id="web后端开发工程师"&gt;web 后端开发工程师&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;两年以上 Ruby 及 Rails 开发经验，或其它 web 后端动态语言开发经验（node，python，golang，Clojure 都可以），水平足够不限制开发经验。&lt;/li&gt;
&lt;li&gt;熟悉 HTML、CSS 及 JQuery&lt;/li&gt;
&lt;li&gt;熟练运用 MySQL 或 Postgresql&lt;/li&gt;
&lt;li&gt;使用 Unix 或 Linux 系统进行开发&lt;/li&gt;
&lt;li&gt;熟练运用 Git&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;h4 id="加分项"&gt;加分项&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;有过互联网金融或电商项目的工作经验（支付及交易模块）&lt;/li&gt;
&lt;li&gt;熟悉 RESTful、HTTP 协议、TCP 协议&lt;/li&gt;
&lt;li&gt;有自己的 Github 开源项目及技术博客&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;有来自克利夫兰州立大学硕士，曾于新泽西州担任量化投资分析师。&lt;/li&gt;
&lt;li&gt;有曾任职于太平洋证券，上海证券交易所的小伙伴，行业研究分析师。&lt;/li&gt;
&lt;li&gt;我，一枚小小的 Ruby 兼 Python 兼前端程序员，做过 web，做过数据，做过量化。&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;p&gt;华中地区最大的债权类电子交易中心，中后期会使用区块链技术。&lt;/p&gt;
&lt;h3 id="福利待遇："&gt;福利待遇：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;年薪 10 万—20 万，每天工作八小时，一周五天，几乎不加班&lt;/li&gt;
&lt;li&gt;弹性办公，灵活的上下班制度&lt;/li&gt;
&lt;li&gt;办公室零食随意点&lt;/li&gt;
&lt;li&gt;有 PS4，VR，无人机各种玩意儿随意玩&lt;/li&gt;
&lt;li&gt;恪守代码质量，恪守需求靠谱！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="联系方式"&gt;联系方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;邮箱：liusihao@quantmi.com&lt;/li&gt;
&lt;li&gt;工作地点：广埠屯或光谷广场&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>whitecrow</author>
      <pubDate>Fri, 06 May 2016 11:31:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/29932</link>
      <guid>https://ruby-china.org/topics/29932</guid>
    </item>
    <item>
      <title>[抛砖引玉] Web 开发者独有的能力</title>
      <description>&lt;p&gt;最近在思考 Web 开发者相别与其它种类开发者能力的区别的问题。固然所有程序员都应当有足够的（1）学习能力（2）沟通协作能力（3）工程管理能力以及（4）对技术高效运用的能力等通用能力。&lt;br&gt;
但 web 开发人员一定有一些不同于其它程序员的能力要求。我认为应当分为以下两个部分：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;一，对业务的深刻理解以及写出维护性足够高的代码，这一点是所有应用开发者都该具备的。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1）对业务的理解简单的说说：一是学习其它开源项目的做法，比如做电商网站的时候可以借鉴 Spree 的数据库结构、API、业务流程。第二就是在同类项目中有丰富的业务经验上的积累，这个只能靠时间和经验累积。&lt;/p&gt;

&lt;p&gt;2）写出可维护性足够高的代码，可维护性包括拓展性好和可读性好，这建立在三个前提之下：第一是有足够的编程经验，这个不用说了，第二是对诸多编程范式、设计原则或抽象模式有自己的理解，第三是对业务本身有足够的理解。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;二，web 架构的选择和优化能力&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1）会做技术选型，一是看其它同类业务的应用架构怎么做的，适不适合我们团队，二是列出团队最关注的几项技术指标：比如开发效率、性能、容不容易学习或招聘等，然后居中权衡。&lt;/p&gt;

&lt;p&gt;2）架构优化，做好选型，开发到某个阶段的时候需要做优化，这时候需要对 web 涉及到的所有技术做粗浅的了解。分析性能瓶颈：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 性能监控：实时监控、监控代理、系统监控、服务监控、响应时间监控&lt;/li&gt;
&lt;li&gt; 网络方面：增加带宽、减少网页中的 HTTP 请求、CDN 等&lt;/li&gt;
&lt;li&gt; 各种缓存策略：使用动态内容缓存、数据库的前端缓存区（redis，memcached）、将动态内容静态化、页面组件分离、Web 服务器缓存、反向代理缓存等&lt;/li&gt;
&lt;li&gt; 数据库优化：优化 SQL 语句、索引、使用查询缓存、线程池、数据库拓展（复制和分离、垂直分区、水平分区）&lt;/li&gt;
&lt;li&gt; 服务器优化：吞吐率、CPU 并发计算、系统调用、内存分配、持久连接、I/O 模型、并发策略&lt;/li&gt;
&lt;li&gt; Web 负载均衡，这个不懂。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;请大家补充或建议。&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Tue, 20 May 2014 10:28:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/19404</link>
      <guid>https://ruby-china.org/topics/19404</guid>
    </item>
    <item>
      <title>请问大家，有没有数据库方面比较专业的垂直论坛？</title>
      <description>&lt;p&gt;主要是 PostgreSQL 方向，像 RubyChina 这样的。&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Tue, 20 May 2014 09:45:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/19403</link>
      <guid>https://ruby-china.org/topics/19403</guid>
    </item>
    <item>
      <title>我有特殊的 Github 运用技巧</title>
      <description>&lt;p&gt;现在开源项目放到了 Github 上面，包括 Ruby 源代码、Linux 源代码等。&lt;/p&gt;

&lt;p&gt;当我使用开源项目开发时碰到一个巨难的 bug，比如 Ruby 本身的内存泄露、解释器错误，简直毫无头绪，根本无法调试，我该怎么办呢？&lt;/p&gt;

&lt;p&gt;这时候就有一招：你去 Ruby 这个项目的源码中，找到那段有问题的代码的 contributor，或者找那些提交最勤快的 contributors，去他们的 Github 中、博客、博客的评论中找：他们用过哪些调试工具，如何调试代码、他们怎么去面对类似的问题的，解铃还须系铃人嘛。靠这个方法我刚刚就找到一种 CPU 性能的调试工具。&lt;/p&gt;

&lt;p&gt;按这个节奏就能理出真正的头绪，并且非常非常节约你的时间。这招我刚悟到不久，非常奏效。&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Mon, 19 May 2014 08:44:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/19365</link>
      <guid>https://ruby-china.org/topics/19365</guid>
    </item>
    <item>
      <title>我对待技术学习的态度</title>
      <description>&lt;p&gt;博文原文地址：&lt;a href="http://liusihao.com/post/64854832920" rel="nofollow" target="_blank" title=""&gt;我对待技术学习的态度&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;本文仅谈业余时间的技术学习，不谈工作中的要求。&lt;/p&gt;

&lt;p&gt;技术固然要时时学习，因为更新快嘛，但对待技术上学什么，怎么花时间学，需要一个指导思想，否则浪费时间而且效果不好。  &lt;/p&gt;

&lt;p&gt;1）抓住主干，而非细节
最近很火的一句话是“你不要用战术上的勤奋掩盖战略上的懒惰”。放到技术学习上就先主理解主干后关注枝叶，比如 C++ 的好书很多，《Effective C++》和《Inside C++ Object Model》是好书，但它们都不是用来入门的，为什么？因为它们不是主干，语言实现细节和各种坑你都了解了，碰到实际问题依然用不好 C++。&lt;/p&gt;

&lt;p&gt;2）尽量不折腾
不去折腾那些不成熟的技术，尽量用较为成熟的技术。在一年多之前，我用 AngularJS，MongoDB 的时候把我可给坑惨了，所以我下决心如果不因为工作坚决不碰 Go 语言，Node.js，要学不如学 Erlang。新技术应用场景不清晰，前景不清晰，生态环境弱，类库少，坑多不容易跳出来。简而言之就是风险大于收益。同理我也不喜欢用 Linux 而喜欢 Mac，Vim 的包也是别人弄好了直接 install 的。  &lt;/p&gt;

&lt;p&gt;3）尽量学习经典原理而不是浪费时间在细节上。
这一点条和第一点类似，多花时间学习抽象模式，设计原则，类型系统，看诸如《SICP》《The little schemer》《Essential of Programming Language》这种书，如果不是因为工作绝不浪费时间到《Dive into python》这种具体到语言细节的书上。  &lt;/p&gt;

&lt;p&gt;4）尽量学习形而下的系统而不过多上升到形而上的思想上。
上一点谈到了抽象模式和类型系统，但切不可单纯从思想上判断哪种语言一定好，哪种抽象模式就一定好，一定要结合形而下的系统综合看待，学习 C 语言就要随着 OS 学习，学习 Lisp 就随着编译器或分析器一起学习，学习 Ruby 或 Python 就跟着 web 开发来学习，通过某一类系统架构理解语言的优劣，通过语言来理解为何这么架构系统。  &lt;/p&gt;

&lt;p&gt;5）学好那些通用技能。
比如：1，如何进行 Debug，2，如何阅读源代码，3，如何进行基本性能监控，4，熟练用好自己的编辑器和*nix 命令行，5，git 技巧，6，项目管理能力，7，关系型数据库的知识。  &lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Sun, 18 May 2014 18:31:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/19356</link>
      <guid>https://ruby-china.org/topics/19356</guid>
    </item>
    <item>
      <title>[干货]《How to Read an Engineering Research Paper》笔记</title>
      <description>&lt;p&gt;我的博客原文：&lt;a href="http://liusihao.com/post/85169957748/how-to-read-an-engineering-research-paper" rel="nofollow" target="_blank"&gt;http://liusihao.com/post/85169957748/how-to-read-an-engineering-research-paper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;《How to Read an Engineering Research Paper》&lt;/strong&gt;是一篇非常棒的技术论文指南阅读指南，极大提高了我阅读技术论文的效率，作者是 UCSD 的一位教师，主攻 complex software systems。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weibel.ucsd.edu/download/cse118/How_to_Read_an_Engineering_Research_Paper.pdf" rel="nofollow" target="_blank" title=""&gt;《How to Read an Engineering Research Paper》原文地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1，为什么阅读 research paper 是困难的？
因为 paper 总是假定你已经了解了那个领域，而且 paper 较长，而你的时间很有限。为了解决这个问题，需要特别的阅读技巧。&lt;/p&gt;

&lt;p&gt;2，高效的阅读方式有什么效果？  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;你知道你应该在 paper 中得到什么。&lt;/li&gt;
&lt;li&gt;并且知道如何在 paper 中迅速定位你需要得到的信息。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;3，首先你应该了解 paper 的格式  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;introduction 部分用于描述工作的动机，解决方案的简介。&lt;/li&gt;
&lt;li&gt;body 部分描述解决方案的细节，并且用实验和术语来做细致的评价。&lt;/li&gt;
&lt;li&gt;最后，paper 有总结和回顾，包括主要贡献的讨论&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4，在阅读 paper 时你应该回答这些问题：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;它写这篇 paper 是为了解决什么问题？&lt;br&gt;
回答这个问题要分两点：&lt;br&gt;
第一点是&lt;strong&gt;人本问题&lt;/strong&gt;：对这个世界有何被预期的助益？比如能够提高生活的质量，节约时间啊，增强安全性之类。&lt;br&gt;
第二点是&lt;strong&gt;技术问题&lt;/strong&gt;：为什么这些 paper 中所谈到的问题没有一个明显的解决方案？它暗示了以前的解决方案是不恰当的。什么是以前的解决方案？还有它们为什么不恰当？&lt;br&gt;
最后，你能够将这个问题的&lt;strong&gt;主题&lt;/strong&gt;和&lt;strong&gt;解决动机&lt;/strong&gt;被萃取为一个“research question。”，通常情况下，上述元素（elements）并没有在 paper 中被明确直接地表述出来。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;它推荐了什么样的解决方案？&lt;br&gt;
也可称为假设或 idea，它应该能够回答为什么 paper 中的解决方案能够工作？而且比以前的方案更好？它也会讨论如何设计和实现这个解决方案。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;它在这个解决方案上做出了哪些评估？&lt;br&gt;
一个单独 idea 并不适合发表在公开的 paper 当中，它的论证、实现和实验对它的 idea 有什么价值、有什么预期的助益或问题？&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;对于已确定的问题、idea 和评估，你有什么分析？这是一个好点子吗？在工作中它有什么缺陷？最有趣的点是什么？最具争议的点是什么？ &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;paper 有什么贡献？&lt;br&gt;
除了常规贡献外，还包括这些贡献：idea，软件、实验技术。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;这项研究未来的方向是什么？
不仅是作者定义的方向，你自己在读 paper 时有什么点子？这可能关乎当前工作的缺陷和批评。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;你还遗留哪些问题？&lt;br&gt;
哪些问题你想公开讨论？哪些困惑或难点难以理解？通过讨论这些问题，你能够更深入你的工作。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;你在这篇 paper 中可以带走哪些信息？&lt;br&gt;
总结论文的主要含义，这能够快速地刷新和重构你的记忆，并让你试图鉴别工作的本质。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;在练习中，直到你能够全部回答这些问题才算将一篇论文读完。你可以用这个&lt;a href="http://cseweb.ucsd.edu/users/wgg/CSE210/paperform.pdf" rel="nofollow" target="_blank" title=""&gt;清单&lt;/a&gt;来检查你是否读完了 paper。&lt;/p&gt;

&lt;p&gt;阅读一本书和读 paper 不太一样，如果你通过回答上面这些问题来读书，对于书里每一章的细节并不公平。&lt;/p&gt;

&lt;p&gt;建议做笔记。除了填写上面这个清单，我也提倡直接在 paper 加上注释的方式来阅读。这是我建议的阅读和标注过程：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;高亮重要的 comments，或打下划线。&lt;/li&gt;
&lt;li&gt;标记 motivation/problem, idea/solution, their evaluation, and contributions 的段落。&lt;/li&gt;
&lt;li&gt;在 paper 开头，写下可获取的信息。&lt;/li&gt;
&lt;li&gt;在 paper 开头或结尾，写下关键性问题。而其它不那么关键的问题就写在 paper 周围。&lt;/li&gt;
&lt;li&gt;试图回答这些问题，无论通过任何途径。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;即使当你完成了上述过程，你很可能并没有对 paper 进行批判性思考。这时候你需要进行第二次阅读了。为了结构化你的阅读和笔记活动，你可以使用&lt;a href="http://cseweb.ucsd.edu/users/wgg/CSE210/NoteTakingRubric.pdf" rel="nofollow" target="_blank" title=""&gt;这个清单&lt;/a&gt;。&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Sun, 18 May 2014 17:18:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/19349</link>
      <guid>https://ruby-china.org/topics/19349</guid>
    </item>
    <item>
      <title>谁是你的天使用户</title>
      <description>&lt;p&gt;我的博文原文：&lt;a href="http://liusihao.com/post/86091756163" rel="nofollow" target="_blank"&gt;http://liusihao.com/post/86091756163&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;互联网产品中谁是你的天使用户？&lt;/p&gt;

&lt;p&gt;在互联网产品中，我们在最开始非常重视 MVP 和用户反馈，天使用户大多是目标用户，比如一个租房网站的天使用户大多会是租客。但在用户积攒中有一套“迁跃理论”对我很有启发。&lt;/p&gt;

&lt;p&gt;Facebook 的做法也暗含迁跃理论，让我们来看看它是怎么做的：Facebook 的用户刚开始是哈佛大学的大学生，通过哈佛的大学生逐渐吸引到整个常春藤联盟的大学生，因为哈佛学生属于常春藤中最精英的一批，因此既有吸引力，也方便做口碑传播；接下来 Facebook 吸引了全美的大学生，同样的道理，常春藤大学对其他大学的学生具有吸引力，再接下来吸引了高中生、初中生，最后才是小孩和老人。他每次都是向下迁跃一个用户层次，并且宣传都是向下一个用户层次宣传——这个就是用户获取的迁跃理论。&lt;/p&gt;

&lt;p&gt;所以我们经常看到社区类（也有少数工作类）互联网产品一开始都是邀请注册，并且只对质量最高、最具有吸引力的用户进行邀请，接下来再迁跃到普通用户——知乎和 jing.fm 是非常好的例子。&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;我的公众微信号上线了，最新高价值博文会首发公众号，欢迎关注我的公众号：liaoit。分享互联网创业、软件工程、IT 技术以及个人成长的干货。因为全部是原创内容，更新慢，见谅。&lt;/p&gt;

&lt;p&gt;二维码扫描：
&lt;img src="//l.ruby-china.com/photo/2014/8f4f6939361c9f9df70f8274586c6b83.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Sun, 18 May 2014 17:09:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/19348</link>
      <guid>https://ruby-china.org/topics/19348</guid>
    </item>
    <item>
      <title>Ruby on Rails Productivty tools</title>
      <description>&lt;p&gt;我的原文地址：&lt;a href="http://liusihao.com/post/81891584873/ruby-on-rails-productivty-tools" rel="nofollow" target="_blank"&gt;http://liusihao.com/post/81891584873/ruby-on-rails-productivty-tools&lt;/a&gt;
抛砖引玉，大家也来推荐一些提高生产力的工具。&lt;/p&gt;

&lt;p&gt;These are my commonly used Ruby on Rails productivity tools.&lt;/p&gt;

&lt;p&gt;Frontend&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sass. It is a mature, stable, and powerful professional grade CSS extension language&lt;/li&gt;
&lt;li&gt;Compass. It is a Sass based CSS Framework. It’s chock full of the web’s best reusable patterns.&lt;/li&gt;
&lt;li&gt;CoffeeScript. It is a little language that compiles into JavaScript. It is an attempt to expose the good parts of JavaScript in a simple way.&lt;/li&gt;
&lt;li&gt;slim. A productivity rails view template.&lt;/li&gt;
&lt;li&gt;gon. Make tucking ruby objects to javascript codes easy.&lt;/li&gt;
&lt;li&gt;font-awesome. It is a free icon fonts library.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;###Command tools&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pry. It is powerful debug tool and console for ruby.&lt;/li&gt;
&lt;li&gt;zeus. It can speed up rails commands. run "nohup zeus start &amp;amp;" before you use it.&lt;/li&gt;
&lt;li&gt;spring. It can speed up ruby commands, too. You can run 'spring' check out how to use spring run ruby commands.  Usually, you only need to add spring before original command.&lt;/li&gt;
&lt;li&gt;commands. Qucikly run Rake/Rails commands through the console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;###others&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;better_errors. It is a powerful debug tool for rails application, you can debug rails application when it appear bug in browser.&lt;/li&gt;
&lt;li&gt;quiet_assets. It can hide needless information from rails log.&lt;/li&gt;
&lt;li&gt;simple_form. Use to reduce form codes in rails view.&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>whitecrow</author>
      <pubDate>Mon, 07 Apr 2014 00:14:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/18444</link>
      <guid>https://ruby-china.org/topics/18444</guid>
    </item>
    <item>
      <title>JavaScript 面向对象与原型</title>
      <description>&lt;p&gt;首先放在下博客的原文网址：&lt;a href="http://liusihao.com/post/77483884517/javascript" rel="nofollow" target="_blank"&gt;http://liusihao.com/post/77483884517/javascript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;##1, 原型编程的优缺点&lt;/p&gt;

&lt;p&gt;JavaScript 是一个基于对象的原型 (Prototype) 语言。&lt;/p&gt;

&lt;p&gt;什么是原型？我们来看看下面的代码：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;People&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="nx"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;White Crow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
   &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;23&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
   &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;
   &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;People&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;     &lt;span class="c1"&gt;//White Crow23&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这就是一个 JavaScript 构造原型和实例化原型的过程，乍一看和面向对象中构造类和实例化为对象的过程非常相似，但是原型编程和面向对象（OOP）编程的区别到底是什么呢？它会导致哪些问题呢？&lt;/p&gt;

&lt;p&gt;首先原型是共享的，如果修改原型：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;person2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;People&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再运行 person2.run()，则会返回 undefined，整个 People.prototype 都被覆盖了。
你不能给原型的属性附加不同的值。相反，OOP 中，每个对象的属性值都可以是不同的，OOP 中 person1.name 可以是 Jack，person2.name 可以是 Tom，原型编程中，person1.name 和 person2.name 都是同一个值，属性值是共享的。&lt;/p&gt;

&lt;p&gt;这就是 JavaScript 中原型的缺点（但同时也是它最大的优点），属性和方法的共享。因此原型的数据抽象能力相比于 OOP 中的类差了很多。&lt;/p&gt;

&lt;p&gt;有人问了，在 JS 的原型编程中，难道不能把值当做参数传给对象的属性吗？这样每个对象都可以拥有不同的属性值了。答案是不行，因为 People.prototype 的构造函数不能传参。&lt;/p&gt;

&lt;p&gt;##2, 运用原型 + 构造函数组合模式解决内存和数据抽象问题。&lt;/p&gt;

&lt;p&gt;为了解决传参的问题，可以组合用构造函数 + 原型模式&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//不共享，使用构造函数，解决了数据抽象问题&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;People&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;//共享，使用原型模式，节约内存&lt;/span&gt;
&lt;span class="nx"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;age&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;为什么 run 要使用原型模式创建，因为原型方法和属性在内存中是共享的，可以用于节约内存，不会因为 new 一个对象，就开辟一块内存用于存放相同的方法。&lt;/p&gt;

&lt;p&gt;这种模式解决了数据抽象和节约内存的问题，是比较好的解决方法。  &lt;/p&gt;

&lt;p&gt;##3, 动态原型模式&lt;/p&gt;

&lt;p&gt;原型模式和构造函数的组合模式解决了这两个问题后，我们又发现了一个问题，那就是它们没有 OOP 中的封装性。看起来比较乱，没有将信息都封装在函数体内。
那么我们可以这么做，解决封装问题：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;People&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;
   &lt;span class="nx"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&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;但是这么做，因为多次 new People 时，会初始化多次 run，为了不让它初始化多次，我们可以再添加一个条件判断语句解决这个问题：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;People&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;
        &lt;span class="p"&gt;};&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;##4, JS 中对象查找属性和方法的链条。&lt;/p&gt;

&lt;p&gt;JS 中，一个对象首先会查找它的构造函数的属性和方法&lt;/p&gt;

&lt;p&gt;举例：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;box1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;box1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="c1"&gt;//output 'a'&lt;/span&gt;
&lt;span class="nx"&gt;box1&lt;/span&gt;
&lt;span class="c1"&gt;//output Object {name: "a"}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;var box1 = {name : 'a'}; 这一段实际是创建了一个构造函数为 Object，属性为 name: 'a'的对象。所以当你运行 box1 时，它会返回 Object {name: "a"}。&lt;/p&gt;

&lt;p&gt;如果你这时候添加 box1 的构造函数 (Object) 的原型：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;

&lt;span class="nx"&gt;box1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="c1"&gt;//output "a"&lt;/span&gt;
&lt;span class="nx"&gt;box1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;
&lt;span class="c1"&gt;//output 99&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以我们可以发现，一个对象是先从自己的构造函数来查找自己的属性，接着从构造函数原型中查找自己的属性。Object 中找得到 name，那么用 Object 的 name，Object 找不到 age，就用 Object.prototype 里的 age。&lt;/p&gt;

&lt;p&gt;我们总结出一条查找属性的原则，就是“就近原则”，实例里有属性，就返回，没有才去查找原型，如果还没有则找到实例的类的超类，查找超类的属性，如果超类的属性没有，就查找超类的原型，一直往上到顶层的 Object 对象。  &lt;/p&gt;

&lt;p&gt;##5, 原型链&lt;/p&gt;

&lt;p&gt;如果连原型里都找不到自己的属性呢，则解释器会继续向构造函数的构造函数的原型，直到上升到根函数的原型（Object.prototype）也找不到为止，这时候返回 underfined。我们来举个例子：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;People&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;
&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;185&lt;/span&gt;
&lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;People&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;//output 'jack'&lt;/span&gt;

&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;      &lt;span class="c1"&gt;//output 99&lt;/span&gt;

&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;   &lt;span class="c1"&gt;//output 185&lt;/span&gt;

&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weight&lt;/span&gt;   &lt;span class="c1"&gt;//undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个就被称为 JS 的原型链。  &lt;/p&gt;

&lt;p&gt;##6, 继承
继承在 JS 中用原型链来实现：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jack&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Desk&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;Desk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;//Desk继承了Box，通过原型形成了链条。&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;desk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Desk&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;desk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;//Jack&lt;/span&gt;
&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;desk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;//100&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Desk&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;//Table继承了Desk&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//output "Tom"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;##7 对象冒充继承&lt;/p&gt;

&lt;p&gt;待续&lt;/p&gt;

&lt;p&gt;欢迎拍砖，如果觉得写得好，请点击下面的 &lt;strong&gt;喜欢&lt;/strong&gt;  :D&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Sat, 22 Feb 2014 23:22:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/17423</link>
      <guid>https://ruby-china.org/topics/17423</guid>
    </item>
    <item>
      <title>乔布斯：遗失的访谈 (1995)</title>
      <description>&lt;p&gt;视频地址：&lt;a href="http://v.163.com/movie/2013/5/N/R/M8TBJIK7D_M8TBLIINR.html" rel="nofollow" target="_blank"&gt;http://v.163.com/movie/2013/5/N/R/M8TBJIK7D_M8TBLIINR.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OOP 编程，web 时代，电子商务的前景。这一切都成了事实。乔帮主就是乔帮主。&lt;/p&gt;

&lt;p&gt;主持人问教主，“你怎么学会经商的？”，他答“If you are willing to sort of ask a lot of questions? think about things and work hard, you can learn business pretty fast, not hardest thing in the world.”！！令人印象深刻。&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Mon, 09 Dec 2013 23:55:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/16104</link>
      <guid>https://ruby-china.org/topics/16104</guid>
    </item>
    <item>
      <title>Rails 4 中 plugin 和普通 gem 有什么区别？</title>
      <description>&lt;p&gt;Rails 4 里 rails new plugin 后就生成了一个 rails 专属 gem 包，它和普通 gem 包得区别似乎就是：前者专门为 rails 打造，后者则适用于所有 Ruby 项目。能够这样理解吗？&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Thu, 28 Nov 2013 00:40:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/15855</link>
      <guid>https://ruby-china.org/topics/15855</guid>
    </item>
    <item>
      <title>阅读源代码的几个步骤 [轻拍]</title>
      <description>&lt;p&gt;原文地址：&lt;a href="http://liusihao.com/post/56383384819" rel="nofollow" target="_blank"&gt;http://liusihao.com/post/56383384819&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;详情请查看我的 PPT： &lt;a href="http://yun.baidu.com/share/link?shareid=774438004&amp;amp;uk=1611324452&amp;amp;third=0" rel="nofollow" target="_blank"&gt;http://yun.baidu.com/share/link?shareid=774438004&amp;amp;uk=1611324452&amp;amp;third=0&lt;/a&gt;《如何阅读源代码》&lt;/p&gt;

&lt;p&gt;需要技能：程序调试能力．&lt;/p&gt;

&lt;p&gt;1，跑通程序．&lt;/p&gt;

&lt;p&gt;2，运行程序的核心功能，从外部了解它的运行方式．&lt;/p&gt;

&lt;p&gt;3，阅读核心功能相关的官方文档．&lt;/p&gt;

&lt;p&gt;4，读核心功能对应的源代码（即核心模块），从内部大概了解一下核心模块之间的联系．&lt;/p&gt;

&lt;p&gt;5，提出一个关于源码的问题（比如状态机如何运作，filters 分为几层等），试图解决．&lt;/p&gt;

&lt;p&gt;6，浏览该问题相关代码和测试，然后边调试边解决问题，（不要在代码非常不熟悉的情况下就开始调试，过长的程序栈会消耗太多时间）．&lt;/p&gt;

&lt;p&gt;7，继续提出问题，直至核心模块烂熟于心．&lt;/p&gt;

&lt;p&gt;8，（可选）与同学同事交流学习该模块，或写成博客与网友分享，以加深记忆，获取反馈．这次你很有可能会发现理解上的漏洞或错误，进行查漏补缺吧．&lt;/p&gt;

&lt;p&gt;9，开始阅读次核心模块，并重复3－7步骤．&lt;/p&gt;

&lt;p&gt;10，如果还嫌不足，为该程序开发插件或库吧．&lt;/p&gt;

&lt;p&gt;问题导向阅读代码的方法分为外部和内部两个部分．&lt;/p&gt;

&lt;p&gt;外部阅读：带着问题去看，自己提出一个程序常用的应用场景，然后自己去在程序上测试一些主要逻辑，比如后台添加了A，前台是否就生成了B？服务端修改了C，客户端会不会出现D之类．  &lt;/p&gt;

&lt;p&gt;内部阅读：带着问题去看，提出一个如何写程序拓展的场景，（你以后想拓展这一块逻辑该怎么做？有没有内建的现成 API 可供调用），总之不要被文档带着思路走，要被问题带着思路走．&lt;/p&gt;

&lt;p&gt;请大家多拍砖或补充，多谢．&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Tue, 22 Oct 2013 23:05:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/14954</link>
      <guid>https://ruby-china.org/topics/14954</guid>
    </item>
    <item>
      <title>pg_search 如何搜索中文？</title>
      <description>&lt;p&gt;使用 pg_search gem 包中的“multisearch”，只能搜索英文或数字（如 PgSearch.multisearch("tianjin")）而不能搜索中文，搜索中文会 Notice：
NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
并且不返回搜索结果。如何解决这个问题？&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Wed, 09 Oct 2013 11:13:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/14607</link>
      <guid>https://ruby-china.org/topics/14607</guid>
    </item>
    <item>
      <title>如果有一款针对学习者的学习资源评论，学习心得交流和知识管理网站</title>
      <description>&lt;p&gt;本人有个想法，经过几个月的业余开发已经做成了 Demo，有一部分模仿的豆瓣，Demo 已上线，地址在这里：&lt;a href="http://www.xue-she.com/" rel="nofollow" target="_blank"&gt;http://www.xue-she.com/&lt;/a&gt; 为防接下来功能的过多开发，分享出来希望大家吐槽，纠正。&lt;/p&gt;

&lt;p&gt;功能概览：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;发现知识和学习资源&lt;/strong&gt;
收藏你感兴趣的知识，发现喜欢的学习资源。这里有高质量的学习资源和知识评论，你可以在发现各种公开课，论文，发现 TED，Coursera 等高价值的资源。同时通过打分和高质量的评论将筛选最适合你的学习资源。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;云中大脑&lt;/strong&gt;
撰写你的笔记，学习心得，甚至创建属于自己的维基百科。最新最快的个人维基系统，帮助你以全新的交互形式归纳整理你的大脑，构建属于你自己的维基百科。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;开放式学习&lt;/strong&gt;
和你网上的小伙伴一起成长。恰好你在某一方面有所专长，正是其他人需要的：无论是计算机、数学、金融、财务、绘画…… 请加入我们，写出你想学的和想教的，共同协作。&lt;/p&gt;

&lt;p&gt;如果是你，你觉得你急需解决的最高优先级问题是什么 (´･_･`)&lt;/p&gt;

&lt;p&gt;有感于这篇帖子（&lt;a href="http://ruby-china.org/topics/14378" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/14378&lt;/a&gt;），同样希望对潜在用户进行调查，分析。如果不喜欢或觉得某些地方做得不好，欢迎轻喷。
——————————————————————————————
P.S.
这是我先前建的豆瓣小组，以技能交换和结对学习为主题：&lt;a href="http://www.douban.com/group/jieduixuexi/" rel="nofollow" target="_blank"&gt;http://www.douban.com/group/jieduixuexi/&lt;/a&gt; ，有 3000 多用户（用户活跃度不高），这个网站就是针对这个小组的验证而进行的开发，但似乎走岔了路。&lt;/p&gt;

&lt;p&gt;P.P.S
经过在豆瓣、论坛、Q 群的地的调查，用户一致认为，如果打算学习一项新技能或新知识时，你一开始想到的是什么？最紧急需要的是什么？回答是“一份高质量的学习路线图/攻略”。
———————————————————————————————
论坛内的建议：
1，Cestivan:首页文案建议再精进下，有些句子吹大了，潜在用户没共鸣的同时可能会有反感
2，Rei: 用现成工具和豆瓣小组的成员们协作看看。
3，Bhuztez：示意图和思维导图功能，数学公式编辑功能，PDF 导出功能。
4，SharpX：产品 UI 太粗糙。
5，knwang：用户定位模糊。
6，来自 knwange 的启发：为用户建立学习方案（甚至结合时间管理？）。
7，当用户学习一样新技能或知识时，用户最需要什么？
———————————————————————————————
这个项目参加了阿里云开发者大赛，大赛地址：&lt;a href="http://dasai.aliyun.com/signup/works2013/?search=570" rel="nofollow" target="_blank"&gt;http://dasai.aliyun.com/signup/works2013/?search=570&lt;/a&gt; ，顺便在这里拉个票，每个人可以投 10 票。 :D&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Thu, 26 Sep 2013 16:28:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/14405</link>
      <guid>https://ruby-china.org/topics/14405</guid>
    </item>
    <item>
      <title>求一个针对维基百科的网络爬虫</title>
      <description>&lt;p&gt;想爬维基百科里的词条，描述和图片，多谢 :D&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Tue, 24 Sep 2013 18:00:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/14357</link>
      <guid>https://ruby-china.org/topics/14357</guid>
    </item>
    <item>
      <title>[已解决] 无法给阿里云 OSS 上传图片的问题。</title>
      <description>&lt;p&gt;服务器用的阿里云，静态文件存储用的阿里云 OSS，在本地，无论开发环境或生产环境下，可以顺利上传图片到 OSS。但一旦部署到阿里云服务器后，就无法上传图片了。&lt;/p&gt;

&lt;p&gt;阿里云 OSS 配置为公开可读。&lt;/p&gt;

&lt;p&gt;用到了 Gem 'carrierwave-aliyun'&lt;/p&gt;

&lt;p&gt;这是我用的 Gem：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#upload files&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"carrierwave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"0.6.2"&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'mini_magick'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'3.3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rest-client'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'carrierwave-aliyun'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是我的 CarrierWave 配置：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;CarrierWave&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:aliyun&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aliyun_access_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"xxxxxx"&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aliyun_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'xxxxx'&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aliyun_bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"abc"&lt;/span&gt;
  &lt;span class="c1"&gt;# 你需要在 Aliyum OSS 上面提前创建一个 Bucket&lt;/span&gt;
  &lt;span class="c1"&gt;# 是否使用内部连接，true - 使用 Aliyun 局域网的方式访问  false - 外部网络访问&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aliyun_internal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="c1"&gt;# 使用自定义域名，设定此项，carrierwave 返回的 URL 将会用自定义域名&lt;/span&gt;
  &lt;span class="c1"&gt;# 自定于域名请 CNAME 到 you_bucket_name.oss.aliyuncs.com (you_bucket_name 是你的 bucket 的名称)&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aliyun_host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"abc.oss.aliyuncs.com"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问大家遇到过这个问题吗？请问如何解决？&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Fri, 20 Sep 2013 20:33:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/14247</link>
      <guid>https://ruby-china.org/topics/14247</guid>
    </item>
    <item>
      <title>2 天的 Code School 免费名额，请大家猛击~！！</title>
      <description>&lt;p&gt;点击链接地址 &lt;a href="http://go.codeschool.com/1x7DRw" rel="nofollow" target="_blank"&gt;http://go.codeschool.com/1x7DRw&lt;/a&gt;，登录后就可得到 :D&lt;/p&gt;

&lt;p&gt;我的已经满了30天了，大家点评论里的链接吧：D&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Thu, 25 Jul 2013 22:42:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/12778</link>
      <guid>https://ruby-china.org/topics/12778</guid>
    </item>
    <item>
      <title>[已解决] 请问如何在开发环境做微博 API 的测试？</title>
      <description>&lt;p&gt;网站已经接入微博，获取了 App Key 和 App Sercet，但是接入的域名是填写的 heroku 上生产环境的域名，请问如何在开发环境上做微博 API 相关功能的测试？&lt;/p&gt;

&lt;p&gt;非常感谢．&lt;/p&gt;</description>
      <author>whitecrow</author>
      <pubDate>Mon, 08 Jul 2013 10:28:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/12334</link>
      <guid>https://ruby-china.org/topics/12334</guid>
    </item>
  </channel>
</rss>
