<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>tiseheaini (纯粹)</title>
    <link>https://ruby-china.org/tiseheaini</link>
    <description>经验是从磨练中积累出来的</description>
    <language>en-us</language>
    <item>
      <title>[天津] 饭团外卖招聘 Ruby 开发</title>
      <description>&lt;p&gt;跟 hr 小姐姐沟通过了，Remote 职位暂时关闭了 😭&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;strong&gt;【关于饭团外卖】&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;饭团外卖是饭团旗下的外卖送餐平台，为消费者提供餐饮美食、水果生鲜、超市便利等品类的即时配送服务，包括自提和配送两种模式，同时通过智能数据分析帮助合作餐饮商家拓展盈利模式；已积累众多优质商家，拥有超过 60 万用户，是北美最大的亚洲美食送餐平台。2019 年，饭团正式进军美国，上线后发展迅速。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;【其他参考链接】&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;官网：&lt;a href="https://www.fantuan.ca/" rel="nofollow" target="_blank"&gt;https://www.fantuan.ca/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;新浪微博：@ 饭团外卖-Fantuan&lt;/li&gt;
&lt;li&gt;Instagram: &lt;a href="/fantuanofficial" class="user-mention" title="@fantuanofficial"&gt;&lt;i&gt;@&lt;/i&gt;fantuanofficial&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube: Fantuan 饭团外卖&lt;/li&gt;
&lt;li&gt;抖音：@ 温哥华点点妹&lt;/li&gt;
&lt;li&gt;Linkedin: &lt;a href="/Fantuan" class="user-mention" title="@Fantuan"&gt;&lt;i&gt;@&lt;/i&gt;Fantuan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;岗位职责：后端 Ruby 开发工作&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;工作地点：天津&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;任职要求：&lt;/li&gt;
&lt;li&gt;精通 Ruby on Rails&lt;/li&gt;
&lt;li&gt;熟练 mysql,Redis,linux,&lt;/li&gt;
&lt;li&gt;熟悉 html5,css,javascript&lt;/li&gt;
&lt;li&gt;有编写自动化测试者优先&lt;/li&gt;
&lt;li&gt;有代码重构经验者优先&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;职位亮点：&lt;/strong&gt;&lt;/p&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;随着公司的高速可持续发展，更多资本进入，获得巨大的成功和回报。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;我们希望你：&lt;/strong&gt;&lt;/p&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;超级 Geek”：以创新技术为使命的人；&lt;/li&gt;
&lt;li&gt;&lt;p&gt;好奇心强”：关注前沿领域，对新技术充满热情。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;待遇：根据能力，月薪 15K -30K，P5 及以上享受期权。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;简历投递/微信交流：&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;邮箱：yangxiaokun@fantuan.ca&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;微信号：sofia-xk&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;来点图片展示&lt;/strong&gt;
&lt;img src="https://l.ruby-china.com/photo/2020/b9e27657-f9d3-4f50-95e1-1353d9fc0d3b.png!large" title="" alt="1"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/c2eec533-db26-4849-b798-d0f00cf342b3.png!large" title="" alt="2"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/3f3506b3-772c-44e6-af03-fd459c1e7480.png!large" title="" alt="3"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/5444e277-dad8-4648-83a3-e2ee62d27fd4.png!large" title="" alt="4"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/aeb68c2f-0d45-41f2-9e8e-a94f0017df2e.png!large" title="" alt="5"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/91db78db-4185-4c6a-80e8-d80e667784b3.png!large" title="" alt="6"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/b7eaa1f0-5474-429e-ba80-e042cde07c1a.png!large" title="" alt="7"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/cade5a01-f0ec-4428-b261-0fa6c87dce9a.png!large" title="" alt="8"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/2c4d0a7a-f58f-4f05-ae6a-62ced061d93b.png!large" title="" alt="9"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/7828c3c0-42cd-4bf5-940b-276a3f8a4d9b.png!large" title="" alt="10"&gt;&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Fri, 19 Feb 2021 20:33:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/40927</link>
      <guid>https://ruby-china.org/topics/40927</guid>
    </item>
    <item>
      <title>Electron 自动更新服务器如何选择呢</title>
      <description>&lt;p&gt;官网中配置更新服务器是没有验证信息的。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;publish&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;provider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;generic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;自定义域名&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我的问题是，如果使用 "自定义域名"，那么安全问题没有办法得到保障，会不会谁都可以向服务器上传文件。&lt;/p&gt;

&lt;p&gt;请问一下，自动更新时服务器后端的安全问题如何解决呢？&lt;/p&gt;

&lt;p&gt;另外官网推荐 &lt;a href="https://github.com/GitbookIO/nuts" rel="nofollow" target="_blank"&gt;https://github.com/GitbookIO/nuts&lt;/a&gt;，但是 nuts 已经很久没有更新了。&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sat, 04 Apr 2020 16:41:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/39700</link>
      <guid>https://ruby-china.org/topics/39700</guid>
    </item>
    <item>
      <title>Linux 命令行中如何为进程名创建一个 Tag，方便管理</title>
      <description>&lt;p&gt;linux 命令行中如何为进程名创建一个 tag&lt;/p&gt;

&lt;p&gt;例如我创建了 3 个进程&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby listen_order.rb
ruby listen_order.rb
ruby listen_order.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当使用 &lt;code&gt;ps aux | grep ruby&lt;/code&gt; 时会显示&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tiiny             38891   0.0  0.2  2465256  14064 s011  S+    3:32AM   0:00.14 ruby listen.rb
tiiny             38892   0.0  0.2  2465256  14064 s011  S+    3:32AM   0:00.14 ruby listen.rb
tiiny             38893   0.0  0.2  2465256  14064 s011  S+    3:32AM   0:00.14 ruby listen.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理想的进程名称是 &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tiiny             38891   0.0  0.2  2465256  14064 s011  S+    3:32AM   0:00.14 ruby listen.rb [order-100]
tiiny             38892   0.0  0.2  2465256  14064 s011  S+    3:32AM   0:00.14 ruby listen.rb [order-101]
tiiny             38893   0.0  0.2  2465256  14064 s011  S+    3:32AM   0:00.14 ruby listen.rb [order-102]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我看到 puma 命令中&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tiiny             39266   0.0  0.1  2610228   5392 s006  S+   Wed04AM   0:39.81 puma 3.11.3 (tcp://localhost:3030) [test-api]  TERM_SESSION_ID=w0t6p0:5BD60B0F-0C02-4CCD-B58C-3119FA04BCEB SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.hxpRewkMnu/Listeners Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.iTAp1K5WBk/Render
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;想请教一下 &lt;code&gt;[test-api]&lt;/code&gt; 是如何写到进程标题上的&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puma 3.11.3 (tcp://localhost:3030) [test-api] 
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Fri, 29 Mar 2019 03:40:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/38304</link>
      <guid>https://ruby-china.org/topics/38304</guid>
    </item>
    <item>
      <title>富文本编辑器 Trix</title>
      <description>&lt;p&gt;Rails 框架的创造者 Basecamp 公司，开发了一个富文本编辑器 Trix，今天发布 1.0 版了。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/basecamp/trix" rel="nofollow" target="_blank"&gt;https://github.com/basecamp/trix&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/b31bda98-d015-4b02-a26e-19e7e06e5cd0.jpg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Thu, 27 Sep 2018 17:15:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/37560</link>
      <guid>https://ruby-china.org/topics/37560</guid>
    </item>
    <item>
      <title>部署的网站图片加载速度很慢很奇怪，是不是配置项出现了问题</title>
      <description>&lt;p&gt;使用 rails 5.0.0.1 ruby 2.3.3 搭建了公司官网&lt;br&gt;
首页的图片加载速度很慢，找了很久找不到原因&lt;br&gt;
尝试将服务器的带宽提高，也没有提升速度&lt;br&gt;
用 unicorn 替换掉 puma 也没有提升速度&lt;br&gt;
网站链接 &lt;a href="http://112.74.29.23/" rel="nofollow" target="_blank"&gt;http://112.74.29.23/&lt;/a&gt; 我猜测是不是配置项出现了问题，求大家指点一下&lt;br&gt;
一张图片 60k，加载用了 3s，速度有些奇怪&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/315e62983fd6392a410c14d8758c6969.jpeg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sat, 10 Dec 2016 00:07:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/31863</link>
      <guid>https://ruby-china.org/topics/31863</guid>
    </item>
    <item>
      <title>fork 了开源项目后，如何持续跟进项目的开发</title>
      <description>&lt;p&gt;fork 了开源项目以后，开源项目会更新新的代码，自己也会更新一些代码。有些代码可能也会用的到。&lt;/p&gt;

&lt;p&gt;比如一个 bbs 类网站，开源版本会不停的修改问题，添加新功能。fork 后的代码也会提交新的代码。&lt;/p&gt;

&lt;p&gt;面对这样情况的时候大家是如何做的，希望大家分享一下自己的经验。&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sun, 03 Jan 2016 19:34:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/28595</link>
      <guid>https://ruby-china.org/topics/28595</guid>
    </item>
    <item>
      <title>怎么显示出两个分支间没有 merge 的 commit</title>
      <description>&lt;p&gt;fork 了 github 上的一个项目，大概时间在两个月前，自己修改了一部分代码，后来发现作者的项目提交了好多 commit。
我能否将项目最新代码和我本地代码比较，显示出自我 fork 那天到现在，作者有哪些 commit 被提交了嘛？？
或者说，我可以在 merge 最新的代码之前看看有哪些 commit 会被合并进来？求 git 经验丰富的前辈指点。&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sat, 02 Jan 2016 23:00:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/28592</link>
      <guid>https://ruby-china.org/topics/28592</guid>
    </item>
    <item>
      <title>CarrierWave  设置 version 时出现问题</title>
      <description>&lt;p&gt;在本地一个项目中我使用了 CarrierWave 进行文件处理，同时设置了一些小尺寸的 version&lt;/p&gt;

&lt;p&gt;ImageUploader 部分代码&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;ProductImageUploader&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;CarrierWave&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Uploader&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;store_dir&lt;/span&gt;
      &lt;span class="s2"&gt;"uploads/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;underscore&lt;/span&gt;&lt;span class="si"&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;mounted_as&lt;/span&gt;&lt;span class="si"&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="ss"&gt;:s_thumb&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="ss"&gt;:resize_to_fit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&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;filename&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt;
      &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="no"&gt;Digest&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_path&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="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;year&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&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;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extension&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;downcase&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&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;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;33
├── 2015
│&amp;nbsp;&amp;nbsp; └── 11a542587b175124adaeee5ab03f0b4b.png
└── s_thumb_2015
    └── 79c877b6948bedb1377396199c33d1c7.png

2 directories, 2 files
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;irb(main):017:0&amp;gt; Image.find(33).file.url
=&amp;gt; "/uploads/image/file/33/2015/11a542587b175124adaeee5ab03f0b4b.png"

irb(main):018:0&amp;gt; Image.find(33).file.s_thumb.url
=&amp;gt; "/uploads/image/file/33/s_thumb_2015/11a542587b175124adaeee5ab03f0b4b.png"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当我在代码中使用时，CarrierWave 给出的文件名是相同的，导致我没办法找到图片。
这个问题不知道出在哪里，也不知道怎么 Google 关键字&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Thu, 29 Oct 2015 12:06:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/27882</link>
      <guid>https://ruby-china.org/topics/27882</guid>
    </item>
    <item>
      <title>遇到一个棘手问题</title>
      <description>&lt;p&gt;遇到一个棘手问题
一个 bbs 类型的网站，当用户点击“发帖”按钮时&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;ApplicationController&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;login_required&lt;/span&gt;
      &lt;span class="c1"&gt;#验证用户是否登录&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;login_required&lt;/code&gt; 方法用来检测用户是否登录。
默认情况下 Request header 中 Accept:text/html; 不能在 &lt;code&gt;login_required&lt;/code&gt; 中执行 &lt;code&gt;render js: "alert('需要登录才能发帖')"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;是否可以强制设置 &lt;code&gt;Content-Type&lt;/code&gt; 为 &lt;code&gt;text/javascript&lt;/code&gt; 来执行 js 代码。&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Thu, 23 Jul 2015 14:16:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/26624</link>
      <guid>https://ruby-china.org/topics/26624</guid>
    </item>
    <item>
      <title>[分享] Rails 下实时生成多尺寸图</title>
      <description>&lt;p&gt;在开发网站时，同一张图片时常需要生成多张不同尺寸的缩略图片。&lt;/p&gt;

&lt;p&gt;一般有两种策略生成缩略图，一种在上传图片时，生成所有尺寸的缩略图，另一种是请求指定尺寸时再生成缩略图。&lt;/p&gt;

&lt;p&gt;前一种方式会有一些限制，当我们需要一种新的图片尺寸时，需要使用脚本重新生成。而后一种方式就比较灵活。（淘宝也是采用这个方案，只是淘宝使用 ImageMagick。）&lt;/p&gt;

&lt;p&gt;网上有一种是借助 lua_nginx module 调用 GraphicsMagick 命令生成缩略图片，不过 nginx 默认发布版本是不包含 lua_nginx 模块，需要重新编译安装，这样太麻烦，实现方式并不灵活。我们需要一种更灵活的方式来实现。&lt;/p&gt;

&lt;p&gt;使用 Nginx + API 的方式适用于各种 Web 框架。&lt;/p&gt;

&lt;p&gt;在 Nginx location 中将图片格式的请求全部拦截下来处理，检查请求的图片是否存在，存在则设置 expires http 缓存。否则就转向 API 去生成缩略图，并返回新生成的缩略图。&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;## 监听 80 端口&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;## 项目目录&lt;/span&gt;
    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="s"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;^(/pictures/).*&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(jpg|jpeg|png|gif|bmp)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;#如果文件存在,则设置过期时间,关闭访问日志&lt;/span&gt;
        &lt;span class="kn"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(&lt;/span&gt; &lt;span class="s"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$request_filename&lt;/span&gt; &lt;span class="s"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;#如果文件不存在,则rewrite到产生图片的脚本文件autoimg.php&lt;/span&gt;
        &lt;span class="kn"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(!-f&lt;/span&gt; &lt;span class="nv"&gt;$request_filename&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kn"&gt;rewrite&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;w*_&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;w*&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(jpg|jpeg|png|gif|bmp))&lt;/span&gt; &lt;span class="n"&gt;/pictures/resize?file=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;max&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;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;proxy_redirect&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://xxxx&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;nginx 中最重要的代码就是找到某些目录下的所有需要处理的图片，查看图片是否存在，不存在则 rewrite 到指定的 API 下处理。&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;#匹配 /pictures 路径下的所有常见图片格式，并处理。&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="s"&gt;^(/pictures/).*&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(jpg|jpeg|png|gif|bmp)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;#如果文件存在,则设置过期时间,关闭访问日志&lt;/span&gt;
    &lt;span class="kn"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(&lt;/span&gt; &lt;span class="s"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$request_filename&lt;/span&gt; &lt;span class="s"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;#如果文件不存在,则rewrite到生成缩略图的路由 /pictures/resize&lt;/span&gt;
    &lt;span class="kn"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(!-f&lt;/span&gt; &lt;span class="nv"&gt;$request_filename&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;rewrite&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;w*_&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;w*&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(jpg|jpeg|png|gif|bmp))&lt;/span&gt; &lt;span class="n"&gt;/pictures/resize?file=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;max&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;ruby 部分的代码只是一个示例，调用 API 处理图片，并将处理完的图片返回。&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;resize&lt;/span&gt;
  &lt;span class="c1"&gt;#找到图片，使用 MiniMagick 改变图片尺寸和图片质量&lt;/span&gt;
  &lt;span class="c1"&gt;#pic = Picture.find(name)&lt;/span&gt;
  &lt;span class="c1"&gt;#image = MiniMagick::Image.open()&lt;/span&gt;
  &lt;span class="c1"&gt;#image.resize&lt;/span&gt;
  &lt;span class="c1"&gt;#image.quality&lt;/span&gt;
  &lt;span class="c1"&gt;#send_file image_path, type: image.mime_type, disposition: "inline"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Mon, 29 Jun 2015 12:39:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/26231</link>
      <guid>https://ruby-china.org/topics/26231</guid>
    </item>
    <item>
      <title>Chrome 中 Adblock Plus 会导致浏览器开发者工具中无法搜索 html 内容</title>
      <description>&lt;p&gt;没图没真相
&lt;img src="https://l.ruby-china.com/photo/2014/a9c9a6c55ee63803c3f5d9873f67bd61.png" title="" alt=""&gt;
是不是只有我这里出现了这个问题。关掉后立刻恢复正常。&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Fri, 17 Oct 2014 17:12:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/22096</link>
      <guid>https://ruby-china.org/topics/22096</guid>
    </item>
    <item>
      <title>使用 mini_magick 保存的图片如何更改文件权限</title>
      <description>&lt;p&gt;使用 mini_magick 保存的图片权限不对，nginx 没办法正确读取。&lt;/p&gt;

&lt;p&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;save_picture&lt;/span&gt;
  &lt;span class="n"&gt;upload_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:picture&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;pic_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;SecureRandom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;upload_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;original_filename&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;
  &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;MiniMagick&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;upload_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tempfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt; &lt;span class="no"&gt;File&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="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'pictures'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pic_name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;ll public/pitcures/
total 2688
&lt;span class="nt"&gt;-rw-------&lt;/span&gt;  1 tiny  staff   628K  9 30 23:52 0949edc801.png
&lt;span class="nt"&gt;-rw-------&lt;/span&gt;  1 tiny  staff    19K  9 30 23:07 24a2727d79.jpg
&lt;span class="nt"&gt;-rw-------&lt;/span&gt;  1 tiny  staff   400K  9 30 23:51 522a93502b.png
&lt;span class="nt"&gt;-rw-------&lt;/span&gt;  1 tiny  staff    19K  9 30 23:08 6b8a2001d4.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 &lt;code&gt;image.write&lt;/code&gt; 保存的图片权限不对，希望改成 644，没找到合适的方法。大家有好方法推荐吗？&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Wed, 01 Oct 2014 10:52:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/21807</link>
      <guid>https://ruby-china.org/topics/21807</guid>
    </item>
    <item>
      <title>关于招聘信息是否应该移除出去的问题</title>
      <description>&lt;p&gt;刚刚有一篇帖子发表到了不该发表的地方，已经被管理者删除。&lt;/p&gt;

&lt;p&gt;将招聘信息独立出来以后，帖子的曝光率明显低了很多，记得 &lt;a href="/lgn21st" class="user-mention" title="@lgn21st"&gt;&lt;i&gt;@&lt;/i&gt;lgn21st&lt;/a&gt; 曾经说过，社区能帮助公司和求职者建立桥梁。&lt;/p&gt;

&lt;p&gt;现在去看看招聘版块，浏览者寥寥。&lt;/p&gt;

&lt;p&gt;我从招聘版块第 40 页，大概一年前发得招聘帖子中挑了 8 篇帖子，浏览量大多在 1000+ 以上，有一篇达到了 4000。&lt;/p&gt;

&lt;p&gt;防止时间的原因对帖子浏览量的影响，我从照片帖子第 5 页挑了 8 篇帖子，这些帖子大部分发表时间在 18 天以前，浏览量大多在 1000 左右，不超过 100 浏览量的帖子也有。&lt;/p&gt;

&lt;p&gt;希望能引起管理员的注意。相信这也不是管理者想看到的情况。&lt;/p&gt;

&lt;p&gt;截图
&lt;img src="https://l.ruby-china.com/photo/2014/25aaa7944179ea15ed79f8303bb5133a.jpg" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2014/07473db03e7c88bf1264a997f742cecc.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Tue, 09 Sep 2014 15:20:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/21433</link>
      <guid>https://ruby-china.org/topics/21433</guid>
    </item>
    <item>
      <title>Fork 开源项目之后</title>
      <description>&lt;p&gt;github 上面有很多我们能用的开源代码，比如开源的社区代码，clone 下来跑一下，放到自己的服务器上。&lt;/p&gt;

&lt;p&gt;过一段时间会对代码删删改改，可之前代码作者也在提交新的代码，两个代码仓库在 clone 下来那一刻就注定没办法走到一起了，话虽是这么说，可并不是说两个分支就从此路人了。代码还是能相互借鉴一下。&lt;/p&gt;

&lt;p&gt;&lt;img src="photo/.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;上面图是两个分支，两个分支都有提交新的代码，如果在这时把两个分支合并，冲突文件会特别多，相同一个文件会被修改多次。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;无论是 Linux 还是 Git，得一即可得天下。  -- 池建强
&lt;a href="http://zhuanlan.zhihu.com/mactalk/19796979" rel="nofollow" target="_blank"&gt;http://zhuanlan.zhihu.com/mactalk/19796979&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这是题外话，我想说的是，linus 有先见之明，在设计 Git 时就帮我们想好了解决方法。
git 可以给代码打补丁，我们可以把其他仓库的代码生成很多补丁，然后把补丁代码添加到自己的仓库中。ps: 关键字 &lt;strong&gt;git patch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;git 补丁的基本原理就是把两次提交中的改动部分在分支上重新提交一次。&lt;/p&gt;

&lt;p&gt;###git 有两种格式的 patch&lt;/p&gt;

&lt;p&gt;####使用 git diff 生成标准的 patch&lt;/p&gt;

&lt;p&gt;比较上图中 &lt;strong&gt;git init&lt;/strong&gt; 和 &lt;strong&gt;0.1 version&lt;/strong&gt; 两个 commit 中得不同&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git diff 61343f9..94ce1b5

diff --git a/views/index.erb b/views/index.erb
index ea5c291..5f414c8 100644
--- a/views/index.erb
+++ b/views/index.erb
@@ -7,7 +7,7 @@
   &amp;lt;link rel="stylesheet" href="style/normalize.css" media="all"&amp;gt;
   &amp;lt;link rel="stylesheet" href="style/index.css" media="all"&amp;gt;
   &amp;lt;link rel="stylesheet" href="style/small.css" type="text/css" media="screen and (max-width:768px)" /&amp;gt;
-  &amp;lt;script src="script/jquery.min.js"&amp;gt;&amp;lt;/script&amp;gt;
+  &amp;lt;script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"&amp;gt;&amp;lt;/script&amp;gt;
   &amp;lt;script src="script/main.js"&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;/head&amp;gt;
 &amp;lt;body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出的内容就是一个补丁文件。&lt;/p&gt;

&lt;p&gt;执行 &lt;code&gt;git diff 61343f9..94ce1b5 &amp;gt;&amp;gt; patch.txt&lt;/code&gt; 生成一个文件就能将生成的补丁保存下来。&lt;/p&gt;

&lt;p&gt;我们使用 git apply 来应用这个补丁&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git apply patch.txt
git commit -am "Patch Apply"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;git 标准 patch 就是将别人的提交内容装到 git 缓存区，然后重新提交一次。git diff 生成的 patch 还有一个好处就是将多次提交使用 git diff 生成一个 patch 文件，然后一次性提交就完成了。&lt;/p&gt;
&lt;h4 id="git format-patch生成的git专用补丁"&gt;git format-patch 生成的 git 专用补丁&lt;/h4&gt;
&lt;p&gt;还是比较上图中 git init 和 0.1 version 两个 commit 中的不同&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git format-patch 61343f9..94ce1b5 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;命令会生成一个 &lt;strong&gt;0001-jquery-cdn.patch&lt;/strong&gt; 文件这个文件和之前 git diff 生成的文件作用是一样的，只是格式不同，当然使用补丁的方式也不一样，git 专用格式的补丁需要使用 &lt;strong&gt;git am&lt;/strong&gt; 命令。&lt;/p&gt;

&lt;p&gt;执行 &lt;code&gt;git am 0001-jquery-cdn.patch&lt;/code&gt; 来应用这个补丁。
看看 git log 是不是多了一次提交。如果有冲突需要使用 google 解决。&lt;/p&gt;

&lt;p&gt;###结语
两个方式中比较推荐使用&lt;strong&gt;git format-patch&lt;/strong&gt;，由于 git format-patch 生成的补丁中含有这个补丁开发者的名字，因此在应用补丁时，这个名字会被记录进版本库，显然，这样做是恰当的。因此，目前使用 Git 的开源社区往往建议大家使用 format-patch 生成补丁。&lt;/p&gt;

&lt;p&gt;EOF&lt;/p&gt;

&lt;p&gt;&lt;a href="http://tise.c2qu.com/index.php/2014/08/21/27.html" rel="nofollow" target="_blank"&gt;http://tise.c2qu.com/index.php/2014/08/21/27.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[1]: &lt;a href="http://tise.c2qu.com/usr/uploads/2014/08/3738176363.jpg" rel="nofollow" target="_blank"&gt;http://tise.c2qu.com/usr/uploads/2014/08/3738176363.jpg&lt;/a&gt;&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sat, 23 Aug 2014 00:09:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/21188</link>
      <guid>https://ruby-china.org/topics/21188</guid>
    </item>
    <item>
      <title>将 Campo 的 markdown 编辑器换成 simditor ，jquery.validate 没办法验证输入框</title>
      <description>&lt;p&gt;将 markdown 编辑器换成 simditor，jquery.validate 可以检测 &lt;strong&gt;comment[body]&lt;/strong&gt; 不为空，并且能正确给出 &lt;strong&gt;不能为空字符&lt;/strong&gt; 的提示，可当我在输入框中继续输入内容后，错误消息没有正确消失，在 mrakdown 编辑器中没有出现这个问题
看了 jquery.validate 源码，小弟太挫，看不懂原理
在 &lt;strong&gt;validator.js.coffee&lt;/strong&gt; 文件里打 console.log 输出，貌似是 &lt;strong&gt;unhighlight&lt;/strong&gt;  没有执行。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;highlight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;highlight puts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.form-group&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addClass&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;has-error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;unhighlight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unhighlight puts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.form-group&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;removeClass&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;has-error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在源码里也找不到哪里在运行了这段逻辑，请大家帮忙看一下。
我 fork 的项目地址&lt;br&gt;
&lt;a href="https://github.com/tiseheaini/campo" rel="nofollow" target="_blank"&gt;https://github.com/tiseheaini/campo&lt;/a&gt;  rm-markdown 分支
github issue 地址
&lt;a href="https://github.com/chloerei/campo/issues/39" rel="nofollow" target="_blank"&gt;https://github.com/chloerei/campo/issues/39&lt;/a&gt;&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Tue, 19 Aug 2014 18:23:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/21122</link>
      <guid>https://ruby-china.org/topics/21122</guid>
    </item>
    <item>
      <title>Rails Turbolinks 如何解析 body 里面的外部 javascript 和 stylesheet</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="s2"&gt;"simditor-all.min"&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stylesheet_link_tag&lt;/span&gt;    &lt;span class="s2"&gt;"simditor"&lt;/span&gt;

&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;form_for&lt;/span&gt; &lt;span class="vi"&gt;@topic.comments.new&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;url: &lt;/span&gt;&lt;span class="n"&gt;topic_comments_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@topic&lt;/span&gt;&lt;span class="p"&gt;)&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;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text_area&lt;/span&gt; &lt;span class="ss"&gt;:body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;tabIndex: &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.add_this_comment'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="ss"&gt;javascript:
  &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ready page:load'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="n"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="no"&gt;Simditor&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="ss"&gt;textarea: &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'#comment_body'&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;这是 &lt;code&gt;app/views/topics/_textarea.slim&lt;/code&gt; 的简略代码，使用了 Turbolinks。
当我从 &lt;strong&gt;topics#index&lt;/strong&gt; 页面点击链接后，跳到 &lt;strong&gt;topics#show&lt;/strong&gt; 页面，会渲染 &lt;strong&gt;:partial =&amp;gt; 'textarea'&lt;/strong&gt; , 它会提示我 &lt;code&gt;Simditor is not defined&lt;/code&gt;，说明 &lt;code&gt;javascript_include_tag "simditor-all.min"&lt;/code&gt; 没有被解析，问题出在 &lt;strong&gt;Turbolinks&lt;/strong&gt; 上，如何让 &lt;code&gt;javascript_include_tag "simditor-all.min"&lt;/code&gt; 能够正常解析，求解答。&lt;/p&gt;

&lt;p&gt;PS：我尝试在 chrome 的 console 里执行 &lt;code&gt;Simditor&lt;/code&gt; ，可以得到 Simditor 对象。明明正常解析了，为什么在代码里会没办法执行呢  &lt;a href="/rei" class="user-mention" title="@rei"&gt;&lt;i&gt;@&lt;/i&gt;rei&lt;/a&gt;&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sun, 17 Aug 2014 14:38:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/21067</link>
      <guid>https://ruby-china.org/topics/21067</guid>
    </item>
    <item>
      <title>div contenteditable="true" 如何获得焦点</title>
      <description>&lt;p&gt;我将一个网站的编辑器换成了 Simditor ,现在要实现 @ 功能
将 @ 某用户的文字插入到 &lt;code&gt;&amp;lt;div class="simditor-body" contenteditable="true"&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt; 中，然后将光标移到输入框的最后位置。
现在我无法获得 div 的焦点，使用 &lt;code&gt;$('classname').focus()&lt;/code&gt;  没有效果。
我看到 simditor.tower.im 在页面加载完后可以做到使 div 获得焦点，请教一下如何做到的。&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sat, 16 Aug 2014 12:35:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/21052</link>
      <guid>https://ruby-china.org/topics/21052</guid>
    </item>
    <item>
      <title>Campo 3 新项目</title>
      <description>&lt;p&gt;&lt;strong&gt;Campo 3&lt;/strong&gt; 是 &lt;a href="/rei" class="user-mention" title="@rei"&gt;&lt;i&gt;@&lt;/i&gt;rei&lt;/a&gt; 的一个用 Rails 做的论坛类项目，风格清新受到很多人欢迎。
前段时间 clone 了一份下来看，代码写的非常好，很适合新人看。这也是很多人喜欢它的原因之一。
不过有一个不能让所有人都接受的问题是，rei 在技术选型上使用了比较生涩的技术，让很多新人看到代码后不能立即动手改写。
从菜鸟走过来的人会有一个感触，技术需要设计的很简单，能够迅速搭建起来使用，才能马上入门，遇到自己不满意的地方查文档然后去改代码，慢慢的就会轻车熟路得来应手，如果将进入门槛设的太高，对于新人来说很不友好。
也是由于这个原因我希望将 Campo 里面用到技术换成新人比较容易接受的技术。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Postgresql&lt;/strong&gt; ==&amp;gt;  &lt;strong&gt;Mysql&lt;/strong&gt;
&lt;strong&gt;Slim&lt;/strong&gt;          ==&amp;gt;  &lt;strong&gt;Erb&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;目前 &lt;strong&gt;Postgresql&lt;/strong&gt; ==&amp;gt;  &lt;strong&gt;Mysql&lt;/strong&gt; 代码已经完成，代码测试没有问题。
&lt;strong&gt;Slim&lt;/strong&gt;  ==&amp;gt;  &lt;strong&gt;Erb&lt;/strong&gt;  正在进行中  这里的工作量比较大，一时间没办法快速完成。&lt;/p&gt;

&lt;p&gt;声明一点，这个项目会紧跟 Campo 项目，不会有添加新特性进去。&lt;/p&gt;

&lt;p&gt;wiki 里面列出了项目进度  &lt;a href="https://github.com/tiseheaini/campo-hm/wiki" rel="nofollow" target="_blank"&gt;https://github.com/tiseheaini/campo-hm/wiki&lt;/a&gt; &lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sun, 13 Jul 2014 14:48:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/20470</link>
      <guid>https://ruby-china.org/topics/20470</guid>
    </item>
    <item>
      <title>campo 3  发送邮件的配置问题</title>
      <description>&lt;p&gt;昨天 clone 了一份 campo 3 的代码，搭建起来后发送邮件的问题和搜索的问题解决不掉&lt;/p&gt;

&lt;p&gt;resque 已经配置成功，发送邮件的问题折腾了一晚上也没解决。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/dd7ad926605f535810aa04d8c3ee8bf5.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;究竟是什么问题，始终找不到。求 &lt;a href="/chloerei" class="user-mention" title="@chloerei"&gt;&lt;i&gt;@&lt;/i&gt;chloerei&lt;/a&gt; 看一下。&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Tue, 08 Jul 2014 00:29:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/20368</link>
      <guid>https://ruby-china.org/topics/20368</guid>
    </item>
    <item>
      <title>帮忙在社区里找一个人 (她是一名 HR)</title>
      <description>&lt;p&gt;最近小团队需要招人，我记得在社区里有一名很好的 hr，她是一名女孩子。
印象比较深是因为之前 @ lgn21st 写过一个帖子介绍了她，科普了一下 hr 行业，不过那篇帖子搜不到了，希望大家能帮忙找到那名 hr。万分感谢&lt;/p&gt;</description>
      <author>tiseheaini</author>
      <pubDate>Sat, 05 Jul 2014 16:04:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/20330</link>
      <guid>https://ruby-china.org/topics/20330</guid>
    </item>
  </channel>
</rss>
