<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cassiuschen (陈小紫)</title>
    <link>https://ruby-china.org/cassiuschen</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>[北京] AKESO 艾索健康科技诚聘 1 名 Ruby 工程师</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/35c837052b92ebaef3764680d8a4b122.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="我们是谁？"&gt;我们是谁？&lt;/h3&gt;
&lt;p&gt;艾索健康科技（&lt;a href="http://akeso.cn" rel="nofollow" target="_blank"&gt;http://akeso.cn&lt;/a&gt;）是一家由眼科学专业团队创立的互联网眼健康管理公司，设计研发了全球首款针对眼健康监测的可穿戴设备，以监测不同年龄段人群眼部疾病风险数据为起点，为用户提供全面的眼健康服务。
目前公司已获天使轮投资，产品的硬件产品也已发布并公测。办公地点位于北京二环内，崇文门附近。&lt;/p&gt;
&lt;h3 id="我们需要"&gt;我们需要&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;坐标：北京&lt;/li&gt;
&lt;li&gt;职位：Ruby 开发工程师 1 名&lt;/li&gt;
&lt;li&gt;工作职责：AKESO Web 端数据可视化后台的构建，代码重构优化，架构设计&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="详细说明"&gt;详细说明&lt;/h3&gt;
&lt;p&gt;因为业务开始扩展，我们诚挚的希望 Ruby 牛人加盟，共同构建 B 端的数据服务架构。一点点要求如下&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 年以上 Rails 开发经验，当然，如果你是优秀应届毕业生，可以无视这条;&lt;/li&gt;
&lt;li&gt;熟练使用 Git 进行版本控制;&lt;/li&gt;
&lt;li&gt;了解 HTML / CSS / Javascript;&lt;/li&gt;
&lt;li&gt;热爱技术，敢于尝试，有较强的学习能力;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你符合下列的情况，我们一定会优先考虑：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;有 ElasticSearch 使用经验&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;月薪：&lt;strong&gt;到手 12k 起&lt;/strong&gt;（具体面议）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可提供住房补贴&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你有实力，抑或你是多面手，我们完全可以开始符合你真正价值的薪酬。
公司正处于快速发展阶段，我们将把你视作伙伴，一起共同努力，一起打造更好的产品。
公司也没有严格的工作制度，上班时间可以相对自由，甚至部分时间 Remote 办公，当然我们更希望伙伴们可以面对面的交流。&lt;/p&gt;
&lt;h3 id="联系方式"&gt;联系方式&lt;/h3&gt;
&lt;p&gt;如果你对我们的职位感兴趣，欢迎将您的简历或情况发至 chenzisheng(at)akeso.cn，谢谢！&lt;/p&gt;

&lt;p&gt;当然，我们也在招聘 &lt;strong&gt;Web 前端工程师&lt;/strong&gt; 和 &lt;strong&gt;iOS 开发工程师&lt;/strong&gt;
另外，&lt;strong&gt;推荐入职成功者可获得千元以上的现金哦&lt;/strong&gt;~所以……简历快快发来吧！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;del&gt;大家都发公司环境和姑娘的照片，那我就发点公司聚餐的食物吧 &lt;img title=":smile:" alt="😄" src="https://twemoji.ruby-china.com/2/svg/1f604.svg" class="twemoji"&gt;&lt;/del&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/5f3682977fd3e431d02965f016522200.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/8ef4f11165bea5ebe405c9710642ab88.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/9f6372d0c02ad49f3c643f49918a7b90.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/96ea825da0721c043db3fffafbcd8f5a.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/6c4623952a082fbcc057fd84e56b9ad3.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/c2087fa029aaaa44f37e25d4bdb9bfd5.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2016/85478e32158de641b9b98a1dde347eba.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Mon, 21 Mar 2016 23:50:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/29409</link>
      <guid>https://ruby-china.org/topics/29409</guid>
    </item>
    <item>
      <title>一个关于 Ruby 数组初始化的问题</title>
      <description>&lt;p&gt;在写一段代码，其中一个片段是要初始化一个形如：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| 0 | 1 | 2 | 3 | 4 |
| 1 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;的二维数组，于是我用了以下非常难看的代码实现：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;dif&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;row_length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&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;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;dif&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="c1"&gt;#mark1&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;column_length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&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;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;dif&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果生成了：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| 0 | 1 | 2 | 3 | 4 |
| 0 | 1 | 2 | 3 | 4 |
| 0 | 1 | 2 | 3 | 4 |
| 0 | 1 | 2 | 3 | 4 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不得其解，于是打断点看数据，发现在&lt;code&gt;mark1&lt;/code&gt;处数据被写成了：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| 3 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt;于是便想到会不会是这里这个循环中&lt;code&gt;i&lt;/code&gt;的实例化过程并不和我所想的，每次循环时下面语句被重新改写……这个问题是不是在编译过程当中产生的？&lt;/del&gt;
经过 &lt;a href="/luikore" class="user-mention" title="@luikore"&gt;&lt;i&gt;@&lt;/i&gt;luikore&lt;/a&gt; 和身边的 &lt;a href="/chunlea" class="user-mention" title="@chunlea"&gt;&lt;i&gt;@&lt;/i&gt;chunlea&lt;/a&gt; 提点，查了下文档，发现：
&lt;img src="https://l.ruby-china.com/photo/2015/e37df4fd9da1a8c8d9b516951367da34.jpg" title="" alt=""&gt;
&lt;code&gt;Array.new(size, default)&lt;/code&gt;方法中这个&lt;code&gt;default&lt;/code&gt;在填充数组的时候共用&lt;code&gt;object_id&lt;/code&gt;，即为同一个对象，因此对其赋值要有一定的觉悟……&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Sun, 08 Nov 2015 04:53:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/27988</link>
      <guid>https://ruby-china.org/topics/27988</guid>
    </item>
    <item>
      <title>在 DaoCloud 上部署 Rails App</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;博客原文：&lt;a href="http://cassiuschen.me/posts/7-deploy-rails-app-on-daocloud" rel="nofollow" target="_blank"&gt;http://cassiuschen.me/posts/7-deploy-rails-app-on-daocloud&lt;/a&gt;
DaoCloud 是一个 Docker 云，用户可以在上面建立 Docker 镜像并运用镜像进行持续集成、容器托管等服务。近期 DaoCloud 还推出了自由主机的 Docker 管理功能，更方便了 Docker 的容器部署。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;因为 DaoCloud 提供免费得容器空间，最高可用 256MB 内存和 20G 的硬盘，对于一个小型的 Rails 应用来说基本上够了，故我将我未完成的个人网站挂在了上面。本文记录了使用 DaoCloud 部署的全过程。&lt;/p&gt;
&lt;h2 id="Step 1：创建镜像(Mirror)"&gt;Step 1：创建镜像 (Mirror)&lt;/h2&gt;
&lt;p&gt;镜像是 Docker 容器运行的环境，在这一步，我们需要完成全部环境的配置。&lt;/p&gt;

&lt;p&gt;Docker 创建镜像有两种方式：一种是利用交互式命令行直接配置，另一种是通过&lt;code&gt;Dockerfile&lt;/code&gt;文件 Docker 自动配置。&lt;/p&gt;

&lt;p&gt;DaoCloud 目前没有提供交互式命令行，故只能通过&lt;code&gt;Dockerfile&lt;/code&gt;来配置。以下是我的个人网站所用的&lt;code&gt;Dockerfile&lt;/code&gt;：&lt;/p&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ubuntu:14.04&lt;/span&gt;
&lt;span class="k"&gt;MAINTAINER&lt;/span&gt;&lt;span class="s"&gt; Cassius Chen "chzsh1995@gmail.com"&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;gcc g++ make automake autoconf make libc6-dev patch openssl ca-certificates libreadline6 libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libgdbm-dev libncurses5-dev libtool bison pkg-config libffi-dev imagemagick redis-server zlib1g-dev openssl openssh-server curl libedit-dev wget git-core
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-zxvf&lt;/span&gt; ruby-2.2.2.tar.gz
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp/ruby-2.2.2&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"./configure"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;make &lt;span class="nt"&gt;-j2&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-j2&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;ruby &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-pv&lt;/span&gt; /var/data
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/data&lt;/span&gt;
&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="s"&gt; ./ /var/data/personal_site&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/data/personal_site&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-pv&lt;/span&gt; tmp/&lt;span class="o"&gt;{&lt;/span&gt;pids,sockets&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;gem &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-rdoc&lt;/span&gt; &lt;span class="nt"&gt;--no-ri&lt;/span&gt; bundler
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; RAILS_ENV docker&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-V&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;777 start.sh
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; DB_HOST ------&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; DB_USERNAME ------&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; DB_PASSWORD ------&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; REDIS_PASSWORD ------&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; REDIS_PORT ------&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; REDIS_HOST ------&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;rake assets:precompile
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["sh", "/var/data/personal_site/start.sh"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个配置并不是很优化，有很多东西也是没有必要安装的。但基本能跑。流程大约是：安装基本依赖 -&amp;gt; 下载 Ruby 源码 -&amp;gt; 编译安装 -&amp;gt; 拷贝项目文件至指定目录 -&amp;gt; 进入目录安装依赖&lt;/p&gt;

&lt;p&gt;我的个人网站使用了&lt;code&gt;MongoDB&lt;/code&gt;和&lt;code&gt;Redis&lt;/code&gt;，而 DaoCloud 免费提供了&lt;code&gt;MongoDB&lt;/code&gt;和&lt;code&gt;Redis&lt;/code&gt;的服务，不将数据库直接建立在镜像当中，而是使用外网连接使用。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;将数据库与应用分离也是 Docker 推荐的配制方法，其核心思想是一个 Docker Mirror 只负责一种 Container 的运维环境，数据库可以完全与应用分离，这样也保证了服务迁移时的稳定性和更优秀的可扩展性。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;如果是自己配置 Docker，一般而言会将应用源码放在容器之外，然后以&lt;code&gt;VOLUME&lt;/code&gt;的方式挂在进容器，这样只需要在宿主系统层面更新源码便可直接更新容器内的代码，而不用重新构建运行环境。可惜在 DaoCloud 上不存在宿主系统，故只能将源码拷贝到镜像当中，每次更新代码需要重新构建容器。&lt;/p&gt;

&lt;p&gt;这里还有个问题，可以注意到我将&lt;code&gt;rake assets:precompile&lt;/code&gt;这一步放在了镜像构建的过程中。这原则上是不对的，静态文件打包应该在容器运行时进行。之所以这样做主要是因为 DaoCloud 的容器只能使用 256MB 的内存，在容器运行时打包会导致内存超出范围的问题，而镜像构建过程没有内存使用限制，取个巧，移到这一步做。不过这带来的问题是&lt;code&gt;rake&lt;/code&gt;命令在运行时会读取 Rails 的基本配置，故有一部分环境变量需要在这一步&lt;code&gt;export&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;写好&lt;code&gt;Dockerfile&lt;/code&gt;就可以在 DaoCloud 上发布了。首先注册登录，然后点击“代码构建”，选择新建项目进入下面的界面：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://7xi3te.com1.z0.glb.clouddn.com/dao-01.png" title="" alt="新建页面"&gt;&lt;/p&gt;

&lt;p&gt;DaoCloud 可以读取你的在各处的 git 账户并直接从 master 分支 clone 代码，然后默认根据根目录中的&lt;code&gt;Dockerfile&lt;/code&gt;进行初始版本的镜像构建&lt;code&gt;master-init&lt;/code&gt;。成功后就可以进入第二步了。&lt;/p&gt;
&lt;h2 id="Step 2：创建服务"&gt;Step 2：创建服务&lt;/h2&gt;
&lt;p&gt;上文提到，这个网站用到了&lt;code&gt;MongoDB&lt;/code&gt;和&lt;code&gt;Redis&lt;/code&gt;，回到 DaoCloud 主界面，进入服务集成，看到下图：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://7xi3te.com1.z0.glb.clouddn.com/dao-02.png" title="" alt="服务集成"&gt;&lt;/p&gt;

&lt;p&gt;根据流程建立两个服务，这样数据库方面就建立好了。然后在 Rails 中配置：&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# In config/mongoid.yml&lt;/span&gt;
&lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Configure available database sessions. (required)&lt;/span&gt;
  &lt;span class="na"&gt;sessions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Defines the default session. (required)&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Defines the name of the default database that Mongoid can connect to.&lt;/span&gt;
      &lt;span class="c1"&gt;# (required).&lt;/span&gt;
      &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;%= ENV["DB_NAME"] %&amp;gt;&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;%= ENV["DB_USERNAME"] %&amp;gt;&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;%= ENV["DB_PASSWORD"] %&amp;gt;&lt;/span&gt;
      &lt;span class="c1"&gt;# Provides the hosts the default session can connect to. Must be an array&lt;/span&gt;
      &lt;span class="c1"&gt;# of host:port pairs. (required)&lt;/span&gt;
      &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;%= ENV["DB_HOST"] %&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以环境变量的方式处理配置，同理 Redis：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Redis&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:host&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"REDIS_HOST"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;:port&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"REDIS_PORT"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'6379'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"REDIS_PASSWORD"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后将&lt;code&gt;config/environments/production.rb&lt;/code&gt;另存一份成&lt;code&gt;config/environments/docker.rb&lt;/code&gt;，补全&lt;code&gt;config/secrets.rb&lt;/code&gt;和其他文件中关于 docker 环境的配置。就基本配置好了，可以进入下一步了。&lt;/p&gt;
&lt;h2 id="Step 3：部署应用"&gt;Step 3：部署应用&lt;/h2&gt;
&lt;p&gt;在构建完成的镜像后点击“查看镜像”，并点击“部署”进入下述部署界面：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://7xi3te.com1.z0.glb.clouddn.com/dao-03.png" title="" alt="部署应用"&gt;&lt;/p&gt;

&lt;p&gt;这里先以部署到 DaoCloud 为例，在这里可以选择两种配置。&lt;/p&gt;

&lt;p&gt;然后进一步配置环境变量和使用的服务，选择上述建立的服务，并根据自己的配置改变环境变量，如：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://7xi3te.com1.z0.glb.clouddn.com/dao-04.png" title="" alt="环境变量"&gt;&lt;/p&gt;

&lt;p&gt;启动时运行命令默认为&lt;code&gt;Dockerfile&lt;/code&gt;中&lt;code&gt;CMD&lt;/code&gt;中的命令，我这里是运行&lt;code&gt;start.sh&lt;/code&gt;, 贴出文件：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rake db:seed
puma &lt;span class="nt"&gt;-e&lt;/span&gt; docker &lt;span class="nt"&gt;-C&lt;/span&gt; config/docker_puma.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后贴出&lt;code&gt;docker_puma.rb&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env puma&lt;/span&gt;

&lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="s1"&gt;'docker'&lt;/span&gt;
&lt;span class="n"&gt;daemonize&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;threads&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;bind&lt;/span&gt; &lt;span class="s1"&gt;'tcp://0.0.0.0:80'&lt;/span&gt;
&lt;span class="n"&gt;preload_app!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 DaoCloud 就会开始运行啦~然后就大功告成！&lt;/p&gt;

&lt;p&gt;当然，还有如何更新代码。&lt;/p&gt;
&lt;h2 id="更新代码"&gt;更新代码&lt;/h2&gt;
&lt;p&gt;当本地 push 代码到远程仓库并带有&lt;code&gt;tag&lt;/code&gt;的时候，DaoCloud 会收到回调并自动构建相应 tag 的镜像。&lt;/p&gt;

&lt;p&gt;如：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nt"&gt;-A&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s1"&gt;'next version'&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v0.3.1 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'v0.3.1 version'&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git push origin master &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DaoCloud 会自动构建新的镜像并自动重新部署容器，于是，push 完代码，去喝杯咖啡，回来就更新部署完了~是不是很方便~？&lt;/p&gt;
&lt;h2 id="自有主机"&gt;自有主机&lt;/h2&gt;
&lt;p&gt;DaoCloud 还推出了针对自有主机的管理方式。按照网站上的流程很容易的可以在自己的服务器上装 DaoCloud 的客户端（可能存在安全隐患？），DaoCloud 就可以非常方便地提供服务器 Docker 状态的监控，服务器资源使用的监控。&lt;/p&gt;

&lt;p&gt;而在上文中部署时也可以使用自有主机进行部署，不同的是，在自有主机的环境中不能直接使用 DaoCloud 提供的服务集成，但可以挂在&lt;code&gt;VOLUME&lt;/code&gt;，并可以轻松的在自有主机上进行迁移：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://7xi3te.com1.z0.glb.clouddn.com/dao-05.png" title="" alt="迁移"&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;DaoCloud 用可视化且实时的交互方式为我们提供了友好的 Docker 管理和运行环境，可以说非常好了。
但 DaoCloud 因为始终没有交互式命令行所以在修 Bug 和 hotfix 方面完全没有作为。本身在 Docker 1.3 版本之后可以使用&lt;code&gt;docker exec&lt;/code&gt;的方式在容器内部运行进程，方便了 hotfix 和查错，希望未来 DaoCloud 可以加入这个功能。&lt;/p&gt;

&lt;p&gt;另我本人并非从事运维的专业人士，文中纰漏还望各位批评指正！&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Fri, 03 Jul 2015 15:06:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/26313</link>
      <guid>https://ruby-china.org/topics/26313</guid>
    </item>
    <item>
      <title>如何优雅地将 CoffeeScript 写的 class 暴露给全局？</title>
      <description>&lt;p&gt;感觉这是个会经常出现的场景：
用 CoffeeScript 写了一个 Class 来控制 UI，一如：&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Step&lt;/span&gt;
    &lt;span class="na"&gt;constructor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;.step"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; .active.step"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="na"&gt;nextStep&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;active.removeClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;__mountContent&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="na"&gt;__clearContent&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;content.html&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="na"&gt;__mountContent&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;__clearContent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;content.html&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Rails 中用 remote 更新 UI 的时候写到了形如&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;step&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;Step&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;registStep&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#registContent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nextStep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;%= j render partial: 'stuff/dashboard/set_college_form', locals: {colleges: College.all}%&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用 class 中的 function 来更新，结果就是 class 被 CoffeeScript 默认的匿名包给屏蔽，并没有暴露给全局。&lt;/p&gt;

&lt;p&gt;在不更改 CoffeeScript 默认渲染方式的情况下，如何可以优雅地把这种 component 暴露给全局呢？&lt;/p&gt;

&lt;p&gt;目前有一种方式比如写完 class 之后写： &lt;code&gt;window.Step = Step&lt;/code&gt;，但是一点都不优雅……&lt;del&gt;新建的时候居然要 &lt;code&gt;var step = new window.Step(...)&lt;/code&gt;&lt;/del&gt; 新建的时候写 &lt;code&gt;var step = new Step(...);&lt;/code&gt;倒是可以……&lt;/p&gt;

&lt;p&gt;所以最终相对优雅的方法是 &lt;a href="/rei" class="user-mention" title="@rei"&gt;&lt;i&gt;@&lt;/i&gt;rei&lt;/a&gt; 和 &lt;a href="/greatghoul" class="user-mention" title="@greatghoul"&gt;&lt;i&gt;@&lt;/i&gt;greatghoul&lt;/a&gt; 提出的用&lt;code&gt;this&lt;/code&gt;来包 class 名称的做法：
如：&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;Step&lt;/span&gt;
    &lt;span class="p"&gt;........&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Tue, 26 May 2015 14:36:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/25747</link>
      <guid>https://ruby-china.org/topics/25747</guid>
    </item>
    <item>
      <title>如何使用 Rails 建立可跨域访问的 API？</title>
      <description>&lt;p&gt;我在一个项目中前后端彻底分离，前端由 AngularJS 的&lt;code&gt;$http&lt;/code&gt;发起 Ajax 请求 API 数据，请求如下：&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$http&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'GET'&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApiBaseUrl&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;books.json"&lt;/span&gt;
        &lt;span class="na"&gt;isArray&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而该 API 由 Rails 提供，显而易见，会发生如下错误&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XMLHttpRequest cannot load http://localhost:3000/api/books.json. Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果希望允许跨域，显然是需要在 API 返回值的 Header 中加入数据，如我猜想的做法是这样的：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Api::BaseController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActionController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;protect_from_forgery&lt;/span&gt; &lt;span class="ss"&gt;with: :null_session&lt;/span&gt;
  &lt;span class="n"&gt;respond_to&lt;/span&gt; &lt;span class="ss"&gt;:json&lt;/span&gt;
  &lt;span class="n"&gt;before_action&lt;/span&gt; &lt;span class="ss"&gt;:allow_cross_domain_access&lt;/span&gt;
  &lt;span class="n"&gt;before_action&lt;/span&gt; &lt;span class="ss"&gt;:cors_preflight_check&lt;/span&gt;
  &lt;span class="n"&gt;after_action&lt;/span&gt; &lt;span class="ss"&gt;:cors_set_access_control_headers&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;allow_cross_domain_access&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Origin'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET, POST, PUT, DELETE, OPTIONS'&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Headers'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Max-Age'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'1728000'&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cors_set_access_control_headers&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Origin'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'POST, GET, OPTIONS'&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Headers'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Max-Age'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1728000"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cors_preflight_check&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="ss"&gt;:options&lt;/span&gt;
      &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Origin'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt;
      &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'POST, GET, OPTIONS'&lt;/span&gt;
      &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Headers'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'X-Requested-With, X-Prototype-Version'&lt;/span&gt;
      &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Max-Age'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'1728000'&lt;/span&gt;
      &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;:text&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:content_type&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'text/plain'&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于&lt;code&gt;:cors_preflight_check&lt;/code&gt;方法，是用来处理发起 Ajax 请求前先行的&lt;code&gt;OPTIONS&lt;/code&gt;请求的，但如上操作没有正确运行，因为 Rails 的 Routs 爆出错误：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Started OPTIONS "/api/books.json" for ::1 at 2015-02-26 23:29:29 +0800
ActionController::RoutingError (No route matches [OPTIONS] "/api/books.json"):
... ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是我考虑可能是我的思路有问题，因为 rack 是先找到 http method 与 url 对应的方法之后才会由 controller 执行 before_action 的，所以一般遇到这样的情况，都会如何解决呢？或有什么案例可供借鉴一下的么？&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Thu, 26 Feb 2015 23:40:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/24358</link>
      <guid>https://ruby-china.org/topics/24358</guid>
    </item>
    <item>
      <title>微信 Js-SDK 发布，感觉要逆天啊！</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;感觉微信要逆天啊，简直慢慢可以有小 app store 了！以后 h5 开发旁边是不是得专门加个微信平台开发啊……接口真心逆天！&lt;/p&gt;

&lt;p&gt;以下转自微信公共平台：&lt;a href="http://mp.weixin.qq.com/s?__biz=MjM5NDAwMTA2MA==&amp;amp;mid=209208141&amp;amp;idx=1&amp;amp;sn=1f075212b3482900bb7096ac810dc7f3&amp;amp;scene=2&amp;amp;from=timeline&amp;amp;isappinstalled=0#rd" rel="nofollow" target="_blank"&gt;http://mp.weixin.qq.com/s?__biz=MjM5NDAwMTA2MA==&amp;amp;mid=209208141&amp;amp;idx=1&amp;amp;sn=1f075212b3482900bb7096ac810dc7f3&amp;amp;scene=2&amp;amp;from=timeline&amp;amp;isappinstalled=0#rd&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;微信公众平台今日面向开发者开放微信内网页开发工具包（微信 JS-SDK）。&lt;/p&gt;

&lt;p&gt;通过微信 JS-SDK 提供的 11 类接口集，开发者不仅能够在网页上使用微信本身的拍照、选图、语音、位置等基本能力，还可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力，为微信用户提供更优质的网页体验。&lt;/p&gt;

&lt;p&gt;微信 JS-SDK 主要包含以下能力：&lt;/p&gt;

&lt;p&gt;1、分享类接口
支持获取“分享到朋友圈”、“发送给朋友”、“分享到 QQ”和“分享到微博”按钮的用户点击状态，同时支持自定义分享内容。&lt;/p&gt;

&lt;p&gt;2、图像类接口
支持拍照、从手机相册选择图片、上传图片、下载图片、预览图片功能。&lt;/p&gt;

&lt;p&gt;3、音频类接口
支持实现录制、播放、暂停播放语音等功能，同时支持将语音快速上传到云端服务器或从云端服务器将语音快速下载到网页。&lt;/p&gt;

&lt;p&gt;4、智能类接口
支持将语音快速地转换成文字。开发者无需掌握语音识别相关技术，只需简单地引用微信 JS-SDK 提供的方法即可实现。&lt;/p&gt;

&lt;p&gt;5、设备信息类接口
支持获取当前手机设备的网络状态，如 2g、3g、4g 或 wifi，为用户提供流畅的浏览体验。&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、微信小店接口
支持从网页跳转到指定的微信小店商品页，商品页支持浏览商品的详细信息，支持完整的购买、客服等流程。&lt;/p&gt;

&lt;p&gt;10、微信卡券接口
支持添加卡券、查看卡券及调起卡券列表等功能。&lt;/p&gt;

&lt;p&gt;11、微信支付接口
支持有支付权限的公众号在网页发起一个微信支付请求。&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Fri, 09 Jan 2015 20:16:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/23648</link>
      <guid>https://ruby-china.org/topics/23648</guid>
    </item>
    <item>
      <title>【已解决】如何在 AngularJS 里对隐藏元素数据绑定？</title>
      <description>&lt;p&gt;大概场景，比如有一个&lt;code&gt;dropdown&lt;/code&gt;，当我选择下拉菜单的某个项后，Javascript 会将一个&lt;code&gt;type="hidden"&lt;/code&gt;或者&lt;code&gt;display:none;&lt;/code&gt;的&lt;code&gt;input&lt;/code&gt;标签的值设为某个值，同时绑定在&lt;code&gt;input&lt;/code&gt;上的一个 Angular $scope 的值也相应改变。&lt;/p&gt;

&lt;p&gt;我试过在 input 上绑定&lt;code&gt;ng-model&lt;/code&gt;、或者设置&lt;code&gt;value="{{oneScope}}"&lt;/code&gt;但是 Angular scope 的值始终不随之改变，似乎 Angular 的数据绑定是基于 input 标签上发生的某个 Javascript 事件进行数据更新的……&lt;/p&gt;

&lt;p&gt;于是这种场景下应该如何实现才能触发数据更新呢？&lt;/p&gt;

&lt;p&gt;感谢&lt;a href="/muwinger" class="user-mention" title="@muwinger"&gt;&lt;i&gt;@&lt;/i&gt;muwinger&lt;/a&gt; 提示，调用&lt;code&gt;$apply&lt;/code&gt;解决，如&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="na"&gt;AngularDropDown&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'click'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;dropdown&lt;/span&gt;
        &lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; .text"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;
            &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; input.angularData"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;val&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;
            &lt;span class="c1"&gt;# 在Angular外调取$scope&lt;/span&gt;
            &lt;span class="nx"&gt;scope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;angular&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; input.angularData"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="c1"&gt;# 更新数据&lt;/span&gt;
            &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;$apply&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;registData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaltContact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Tue, 06 Jan 2015 10:46:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/23568</link>
      <guid>https://ruby-china.org/topics/23568</guid>
    </item>
    <item>
      <title>Angular.js 中如何取消 HTML 转义？</title>
      <description>&lt;p&gt;RT……求大大解救……&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Sat, 02 Aug 2014 22:47:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/20813</link>
      <guid>https://ruby-china.org/topics/20813</guid>
    </item>
    <item>
      <title>Json 长度超过限制如何解决？</title>
      <description>&lt;p&gt;在通过前端提交一篇文章的时候出现：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mo"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mo"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mo"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;HTTP&lt;/span&gt; &lt;span class="n"&gt;parse&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;malformed&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Puma::HttpP                                                                                        arserError: HTTP element QUERY_STRING is longer than the (1024 * 10) allowed len                                                                                        gth (was 11028)&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个如何解决呢…………难道要拆分这个请求？&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Wed, 30 Jul 2014 15:54:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/20751</link>
      <guid>https://ruby-china.org/topics/20751</guid>
    </item>
    <item>
      <title>在 Rails 的 Model 中定义 method_missing 覆盖了 AR 默认的肿么办……</title>
      <description>&lt;p&gt;因为想给照片（image 模型）加入 EXIF，所以给 Image 加了叫 exif 的 hstore 项，然后不想费事写每一个单项的名称，所以想到了&lt;code&gt;method_missing&lt;/code&gt;……
写了一段：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/=$/&lt;/span&gt;  
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exif&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="vg"&gt;$`&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
  &lt;span class="k"&gt;else&lt;/span&gt;  
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;NoMethodError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;这个方法你真的定义了嘛&amp;gt;~&amp;lt;人家木有找到耶……"&lt;/span&gt;  
  &lt;span class="k"&gt;end&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后果可想而知……AR 自带的&lt;code&gt;attribute_methods&lt;/code&gt;被覆盖了……
正在翻 AR 源码……不知有没有大神解决过类似问题…………&lt;/p&gt;

&lt;p&gt;然后 Rei 大大提供了一种思路&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;has_attributes?&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="c1"&gt;# code here&lt;/span&gt;
  &lt;span class="k"&gt;end&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>cassiuschen</author>
      <pubDate>Sat, 26 Jul 2014 20:26:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/20692</link>
      <guid>https://ruby-china.org/topics/20692</guid>
    </item>
    <item>
      <title>庆贺一下，大学终于落停了</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/1d04555a9e3ef44fcb7bc2f60799fd04.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;终于可以愉快的写 Ruby 而不用担心考试了哈哈哈！&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Wed, 09 Jul 2014 09:16:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/20387</link>
      <guid>https://ruby-china.org/topics/20387</guid>
    </item>
    <item>
      <title>明天高考了……</title>
      <description>&lt;p&gt;明天就要高考了……感谢一年来 Ruby 和 Ruby China 的陪伴，平时学累了写上几行代码总是令人心情愉悦的……
三年前，因为从小在计算机中长大，我还励志要学信科，进入高中后加入一个工作室改变了我一生的轨迹，在那里我搞起了各类数字媒体，从平面设计到摄影摄像编导都干过，也渐渐确立了做传媒类、艺术类的方向，直到高三开始写 Ruby，搞起了一点点粗浅的开发才又重新燃起来对互联网的热情。
Ruby 社区的新鲜、先进让我对程序员的生活有了重新的认识，以前写 C++ 只觉得是写码一件类似解题一般的事情，而写 Ruby 却让我了解了其余的那些“生活”：Peer、Git、TDD 等等…… 看到社区里那么多在努力奋斗的人，让整个人都充满了干劲呢！
不说了，祝明天自己好运～
&lt;img src="http://fmn.xnpic.com/fmn057/20130601/2330/large_LfeQ_114a00004639118c.jpg" title="" alt=""&gt;
图为快一岁时瞎玩 turbo c  ＝ ＝！&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Fri, 06 Jun 2014 13:38:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/19784</link>
      <guid>https://ruby-china.org/topics/19784</guid>
    </item>
    <item>
      <title>iPhone 充电时烧毁</title>
      <description>&lt;p&gt;今天 iPhone 4s 使用原装充电插头进行充电时无意间与旁边 iMac 上连接的原厂有线键盘金属部分接触，巨大的火花过后以下是惨剧：&lt;/p&gt;

&lt;p&gt;－ iPhone 烧毁，接触点附近金属熔化成小球，现在还在手机上留着
－ iPhone 机身温度极高，18 度空调下吹了半个多小时才冷却到室温
－ iPhone 不能开机使用
－ 键盘接触点附近明显灼烧痕迹，目前部分按钮如“P”、“Enter”等不能使用，还有些按钮如“j”按下后电脑输出“jou”三个字符等等。
－ 充电线与充电器连接部分明显灼烧痕迹，USB 接口出直接炭黑
－ 连接充电器的插座是直接接在墙上插销的，目前这墙上的两个插销都不能使用了，目测里面线熔断或者某个保险熔断了。&lt;/p&gt;

&lt;p&gt;所幸的是：&lt;/p&gt;

&lt;p&gt;－ iMac 与其余当时连在同一个插座上的用电器皆完好无损，曾担心旁边的 Mac Pro 被烧不过现在看一点问题都没有。
－ 插座完好，无灼烧痕迹。&lt;/p&gt;

&lt;p&gt;说一下其他背景：&lt;/p&gt;

&lt;p&gt;－ 充电线目测可能不是原厂的。
－ 单手握持 iPhone 金属部分、胳膊架在金属办公桌上没有问题，抚摸 iPhone 金属表面没有漏电迹象。
－ 单手握持 iPhone 金属部分、胳膊不小心碰到金属键盘，整条胳膊被电，麻了半天。
－ iMac 是 Yosemite 系统，前天刚升级的。昨天到今天手被电数次。
－ iMac 是 2010 中期 21.5 英寸版
－ 尚不知道系统升级前时候也有同样问题。
－ 之前用同一根线直接插在 iMac 或者旁边的 Mac Pro 上充电是出现过接触不良漏电的情况，但没有过电过。&lt;/p&gt;

&lt;p&gt;晚上拿相机拍照之后再上图。各位小心！不说烧毁机器，就上午被电的胳膊现在也还在疼……&lt;/p&gt;

&lt;p&gt;大概分析就是 iMac 的 USB 有线键盘于接地的用电器之间有大电势差，具体怎么产生的尚不明确。我这应该是小概率事件，也不希望有谁复现一下，只是如果有类似的情况发生还请告知一下，这个原因不是没有可能。&lt;/p&gt;

&lt;p&gt;另外为什么 Markdown 不起作用了？
另外为了联系小伙伴用起 iMessage 语言……真心好用！比微信保真度高多了，而且十分方便，自动降燥也做得非常好……
&lt;img src="https://l.ruby-china.com/photo/2014/044d5cdd39e53224b9271165e4c60ad9.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2014/fb9cfb3bccaf2fc9c5f2795b4a7933cb.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2014/8c1b45c01e65c58cfa54b1bd8da4e3d5.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Thu, 05 Jun 2014 15:49:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/19761</link>
      <guid>https://ruby-china.org/topics/19761</guid>
    </item>
    <item>
      <title>将业务建立在数据库特性上可靠吗？</title>
      <description>&lt;p&gt;比如利用 PostgreSQL 的 Array 特性写 tag 啊甚至好友逻辑什么的，这样做可靠吗？需要担心数据库升级新版本不能使用相关特性而导致业务不稳定么？&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Fri, 23 May 2014 23:52:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/19503</link>
      <guid>https://ruby-china.org/topics/19503</guid>
    </item>
    <item>
      <title>有关 hstore 读取的问题</title>
      <description>&lt;p&gt;使用&lt;code&gt;Postgresql&lt;/code&gt;的&lt;code&gt;hstore&lt;/code&gt;可以近似想成存入 JSON，不过有个问题，
比如对于 User 有一个&lt;code&gt;hstore&lt;/code&gt;类型的&lt;code&gt;contact&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mf"&gt;2.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;p76&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;002&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
  &lt;span class="no"&gt;User&lt;/span&gt; &lt;span class="no"&gt;Load&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;11.2&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="no"&gt;SELECT&lt;/span&gt;  &lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;*&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="s2"&gt;"users"&lt;/span&gt;   &lt;span class="no"&gt;ORDER&lt;/span&gt; &lt;span class="no"&gt;BY&lt;/span&gt; &lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="no"&gt;ASC&lt;/span&gt; &lt;span class="no"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;User id: 8,  contact: {"qq"=&amp;gt;"**QQ**", "weibo"=&amp;gt;"", "renren"=&amp;gt;"", "wechat"=&amp;gt;""}&amp;gt; &lt;/span&gt;
&lt;span class="mf"&gt;2.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;p76&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;003&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:qq&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt; 
&lt;span class="mf"&gt;2.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;p76&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;004&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"qq"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"**QQ**"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不是说 Symbol 和 String 大体上就是是否在使用时新建对象么？为何在这样的查询时就会有问题发生？&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Thu, 01 May 2014 13:09:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/18951</link>
      <guid>https://ruby-china.org/topics/18951</guid>
    </item>
    <item>
      <title>我见过最高大上的中学招聘</title>
      <description>&lt;p&gt;&lt;a href="http://zhaopin.pkuschool.edu.cn" rel="nofollow" target="_blank"&gt;http://zhaopin.pkuschool.edu.cn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;贴一段大家感受一下：
&lt;img src="//l.ruby-china.com/photo/2014/39fba1d8ac1e185b05c1425deefd692f.png" title="" alt=""&gt;
&lt;img src="//l.ruby-china.com/photo/2014/6dbb7c5b8c1a987c716f5781812eb330.png" title="" alt=""&gt;
&lt;img src="//l.ruby-china.com/photo/2014/e21a925238ea5bc3066016be0eb4557e.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Sun, 20 Apr 2014 13:47:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/18730</link>
      <guid>https://ruby-china.org/topics/18730</guid>
    </item>
    <item>
      <title>Ubuntu 14.04 LTS 已发布</title>
      <description>&lt;p&gt;今天刚刚发布，包括中国麒麟版。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What’s new in 14.04 LTS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu Server Supported for five years by Canonical&lt;/li&gt;
&lt;li&gt;Certification as a guest on AWS, Microsoft Azure, Joyent, IBM and HP Cloud&lt;/li&gt;
&lt;li&gt;Updates to Tomcat (v7), Postgresql (v9.3), Docker v(0.9), Puppet (v3.0), Qemu (v2.0), Libvirt (v1.2), LXC (v1.0) and MySQL (v5.5)&lt;/li&gt;
&lt;li&gt;The first production release of Open vSwitch 2.0 with full kernel integration&lt;/li&gt;
&lt;li&gt;Runs on x86, x86-64, ARM v7, ARM64 and Power&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;这么说树霉派也可以 ubuntu server？&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Fri, 18 Apr 2014 11:06:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/18684</link>
      <guid>https://ruby-china.org/topics/18684</guid>
    </item>
    <item>
      <title>如何安全地提交敏感数据？</title>
      <description>&lt;p&gt;程序中有各种需要提交数据的地方。举例说明如 DoorKeeper 这个流行的 Oauth2 Provider 在请求用户授权的界面使用了 hidden_tag 隐性表单提交 current_user 的信息到数据库，可这在浏览器端很容易就可以吧表单信息修改掉，从而取得别的用户的授权…
如果调用另一个方法来 post 数据，那么为了在 controller 里获得 current_user 的信息一般选择在 session 中存储，但 session 也是有办法修改的………有什么办法能阻止这样的情况发生么？&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Sat, 12 Apr 2014 16:20:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/18556</link>
      <guid>https://ruby-china.org/topics/18556</guid>
    </item>
    <item>
      <title>如何在 AngularJS 中使用 slim 渲染 template？</title>
      <description>&lt;p&gt;比如我现在有&lt;code&gt;~/app/assets/templates/home.html.slim&lt;/code&gt;，然后在某&lt;code&gt;.js.coffee.erb&lt;/code&gt;中有写：&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;config&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'$routeProvider'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$routeProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;$routeProvider&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;when&lt;/span&gt; &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;%= asset_path 'home.html' %&amp;gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后很明显 Rails 找不到 home.html……
有在&lt;code&gt;~/config/initializers/render.rb&lt;/code&gt;中写：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.slim'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Slim&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;context_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;ActionView&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Helpers&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url_helpers&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>cassiuschen</author>
      <pubDate>Mon, 07 Apr 2014 21:06:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/18455</link>
      <guid>https://ruby-china.org/topics/18455</guid>
    </item>
    <item>
      <title>雁过留声，人过留码…</title>
      <description>&lt;p&gt;&lt;del&gt;看到一篇未经证实的老新闻…&lt;/del&gt;好吧确定是假新闻……图一乐，珍爱生命…
&lt;img src="//l.ruby-china.com/photo/2014/614e99b182451f714a0ae9f183045b10.jpg" title="" alt=""&gt;
这般辛苦为哪般？&lt;/p&gt;</description>
      <author>cassiuschen</author>
      <pubDate>Sat, 29 Mar 2014 08:24:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/18241</link>
      <guid>https://ruby-china.org/topics/18241</guid>
    </item>
  </channel>
</rss>
