<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JiangYongKang (苦逼)</title>
    <link>https://ruby-china.org/JiangYongKang</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>如何简单的实现按距离排序？</title>
      <description>&lt;p&gt;现在应用中类似“优先按距离排序”的功能已经很常见了，那么这些功能如何简单快速的去实现呢？本文将提供一个在数据量不是特别大的时候的解决方案，实现起来比较简单。&lt;/p&gt;

&lt;p&gt;先将用来演示的表结构和数据初始化一下&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- 创建商户表&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="s1"&gt;'主键'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;merchant_name&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="s1"&gt;'商户名称'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;merchant_address&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="s1"&gt;'商户地址'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;longitude&lt;/span&gt; &lt;span class="nb"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&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;0&lt;/span&gt; &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="s1"&gt;'经度'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;latitude&lt;/span&gt; &lt;span class="nb"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&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;0&lt;/span&gt; &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="s1"&gt;'纬度'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;merchant_pk&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="s1"&gt;'商户表'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- 插入一些测试数据&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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="s1"&gt;'浦建路118号巴黎春天百货F5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;52088&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;20852&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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="s1"&gt;'长宁路88号KiNG88广场B1层'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;42741&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;22761&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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="s1"&gt;'川沙路5398号百联川沙购物中心F3层'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;69961&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;18577&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&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="s1"&gt;'川沙路4825号浦东商场B1层'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;69775&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;19509&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt; &lt;span class="k"&gt;VALUES&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="s1"&gt;'肯德基'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'张江路625号1层B座'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;61561&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;20514&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后套用 &lt;a href="https://en.wikipedia.org/wiki/Haversine_formula" rel="nofollow" target="_blank" title=""&gt;Haversine 公式&lt;/a&gt; 直接用 MySQL 的函数去计算距离再排序。例如：假设我当前位置是 &lt;strong&gt;[31.202635, 121.654555]&lt;/strong&gt; 查询周边的商家，并且按距离排序。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ACOS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;COS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RADIANS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;202635&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
            &lt;span class="n"&gt;COS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RADIANS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
            &lt;span class="n"&gt;COS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RADIANS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;RADIANS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;654555&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="n"&gt;SIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RADIANS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;202635&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
            &lt;span class="n"&gt;SIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RADIANS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;6378&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&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;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 6378 是地球赤道的半径，如果想调整精度，比如精确到米，可以设置为 6378000，下面是排序的结果&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th style="text-align:left;"&gt;id&lt;/th&gt;
&lt;th style="text-align:left;"&gt;merchant_name&lt;/th&gt;
&lt;th style="text-align:left;"&gt;merchant_address&lt;/th&gt;
&lt;th style="text-align:left;"&gt;longitude&lt;/th&gt;
&lt;th style="text-align:left;"&gt;latitude&lt;/th&gt;
&lt;th style="text-align:left;"&gt;distance&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:left;"&gt;5&lt;/td&gt;
&lt;td style="text-align:left;"&gt;肯德基&lt;/td&gt;
&lt;td style="text-align:left;"&gt;张江路 625 号 1 层 B 座&lt;/td&gt;
&lt;td style="text-align:left;"&gt;121.61561&lt;/td&gt;
&lt;td style="text-align:left;"&gt;31.20514&lt;/td&gt;
&lt;td style="text-align:left;"&gt;3.7185308288925247&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:left;"&gt;4&lt;/td&gt;
&lt;td style="text-align:left;"&gt;小杨生煎&lt;/td&gt;
&lt;td style="text-align:left;"&gt;川沙路 4825 号浦东商场 B1 层&lt;/td&gt;
&lt;td style="text-align:left;"&gt;121.69775&lt;/td&gt;
&lt;td style="text-align:left;"&gt;31.19509&lt;/td&gt;
&lt;td style="text-align:left;"&gt;4.197812806482076&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:left;"&gt;3&lt;/td&gt;
&lt;td style="text-align:left;"&gt;望湘园&lt;/td&gt;
&lt;td style="text-align:left;"&gt;川沙路 5398 号百联川沙购物中心 F3 层&lt;/td&gt;
&lt;td style="text-align:left;"&gt;121.69961&lt;/td&gt;
&lt;td style="text-align:left;"&gt;31.18577&lt;/td&gt;
&lt;td style="text-align:left;"&gt;4.683026249493325&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:left;"&gt;1&lt;/td&gt;
&lt;td style="text-align:left;"&gt;海底捞火锅&lt;/td&gt;
&lt;td style="text-align:left;"&gt;浦建路 118 号巴黎春天百货 F5&lt;/td&gt;
&lt;td style="text-align:left;"&gt;121.52088&lt;/td&gt;
&lt;td style="text-align:left;"&gt;31.20852&lt;/td&gt;
&lt;td style="text-align:left;"&gt;12.744185472645878&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:left;"&gt;2&lt;/td&gt;
&lt;td style="text-align:left;"&gt;河马鲜生&lt;/td&gt;
&lt;td style="text-align:left;"&gt;长宁路 88 号 KiNG88 广场 B1 层&lt;/td&gt;
&lt;td style="text-align:left;"&gt;121.42741&lt;/td&gt;
&lt;td style="text-align:left;"&gt;31.22761&lt;/td&gt;
&lt;td style="text-align:left;"&gt;21.802509499536363&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Fri, 30 Aug 2019 11:18:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/38999</link>
      <guid>https://ruby-china.org/topics/38999</guid>
    </item>
    <item>
      <title>Rails 服务端生成条形码和二维码</title>
      <description>&lt;p&gt;通常情况下，图片的生成应当在客户端去实现。但是当我们必须在服务端去生成图片时 &lt;a href="https://github.com/toretore/barby/" rel="nofollow" target="_blank" title=""&gt;Barby Gem&lt;/a&gt; 是一个非常不错的选择。它是一个用来生成各种标准的条形码，以及二维码的库。&lt;code&gt;Barby&lt;/code&gt; 的代码结构可以大致分为 &lt;strong&gt;生成器&lt;/strong&gt; 和 &lt;strong&gt;输出&lt;/strong&gt;。输出器的功能非常全面，可以输出 Base64、PNG、PDF 等等，甚至我们可以基于 &lt;code&gt;Barby&lt;/code&gt; 添加自己的输出器。需要注意的一点是，如果你试图生成二维码，需要添加一个额外的库 &lt;a href="https://github.com/whomwah/rqrcode/" rel="nofollow" target="_blank" title=""&gt;rqrcode Gem&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;第一步将相关的依赖添加到 Gemfile 中&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'barby'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 0.6.8'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rqrcode'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 0.10.1'&lt;/span&gt; &lt;span class="c1"&gt;# 如果不需要生成二维码，可以不添加&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二步，在 &lt;code&gt;config/application.rb&lt;/code&gt; 中加载相关的依赖库&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'barby/barcode/qr_code'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'barby/barcode/code_39'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'barby/outputter/png_outputter'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第三部，创建 &lt;code&gt;app/controllers/concerns/barby_generator.rb&lt;/code&gt; 编写用于生成条形码和二维码图片的通用方法&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;BarbyGenerator&lt;/span&gt;
  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_qr_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Barby&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;QrCode&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;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;base64_output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode64&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_png&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="ss"&gt;margin: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;xdim: &lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;ydim: &lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="s2"&gt;"data:image/png;base64,&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;base64_output&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\n/&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="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_barcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Barby&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Code39&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;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;base64_output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode64&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_png&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="ss"&gt;margin: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;xdim: &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;ydim: &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="s2"&gt;"data:image/png;base64,&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;base64_output&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\n/&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="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;Barby&lt;/code&gt; 可以自定义生成图片的一些属性，具体的用法 &lt;a href="https://github.com/toretore/barby/wiki/Outputters#definitions-and-common-options" rel="nofollow" target="_blank" title=""&gt;官方 WiKi&lt;/a&gt; 中有详细的描述。可以按照自身的需求去设置。&lt;/p&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Tue, 30 Jul 2019 23:20:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/38887</link>
      <guid>https://ruby-china.org/topics/38887</guid>
    </item>
    <item>
      <title>Action Mailer 无法发送邮件？？？！</title>
      <description>&lt;p&gt;当收件人邮箱是 Gmail 腾讯企业邮箱 QQ 邮箱等都可以正常发送和接收，但是当收件人邮箱是 163 邮箱时，就会接收不到邮件，这是为何呢？163 有毒啊？？！！
配置如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/environments/development.rb&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_mailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perform_caching&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_mailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perform_deliveries&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_mailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_delivery_errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_mailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delivery_method&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:smtp&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_mailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;smtp_settings&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="ss"&gt;address:              &lt;/span&gt;&lt;span class="s1"&gt;'smtp.exmail.qq.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;port:                 &lt;/span&gt;&lt;span class="mi"&gt;465&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;domail:               &lt;/span&gt;&lt;span class="s1"&gt;'qq.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;ssl:                  &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;user_name:            &lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;password:             &lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;authentication:       &lt;/span&gt;&lt;span class="s1"&gt;'plain'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;enable_starttls_auto: &lt;/span&gt;&lt;span class="kp"&gt;true&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;</description>
      <author>JiangYongKang</author>
      <pubDate>Mon, 15 Jul 2019 13:45:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/38839</link>
      <guid>https://ruby-china.org/topics/38839</guid>
    </item>
    <item>
      <title>关于 Rails 环境变量的一个头疼的问题</title>
      <description>&lt;p&gt;这个是 db 的配置文件&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;default: &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;
  &lt;span class="ss"&gt;adapter: &lt;/span&gt;&lt;span class="n"&gt;mysql2&lt;/span&gt;
  &lt;span class="ss"&gt;encoding: &lt;/span&gt;&lt;span class="n"&gt;utf8&lt;/span&gt;
  &lt;span class="ss"&gt;host: &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;
  &lt;span class="ss"&gt;database: &lt;/span&gt;&lt;span class="n"&gt;test_db&lt;/span&gt;
  &lt;span class="ss"&gt;username: &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
  &lt;span class="ss"&gt;password: &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
  &lt;span class="ss"&gt;pool: &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %&amp;gt;

development:
  &amp;lt;&amp;lt;: *default

test:
  &amp;lt;&amp;lt;: *default

production:
  &amp;lt;&amp;lt;: *default
  host: &amp;lt;%=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_HOST'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="ss"&gt;username: &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= ENV['DATABASE_USERNAME'] %&amp;gt;
  password: &amp;lt;%=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'DATABASE_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个是我 &lt;code&gt;~/.zshrc&lt;/code&gt; 的配置&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DATABASE_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DATABASE_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hahaha
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fuckfuck
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 &lt;code&gt;RAILS_ENV=production rails c&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; ActiveRecord::Base.configurations
    {
        "default"     =&amp;gt; {
            "adapter"  =&amp;gt; "mysql2",
            "encoding" =&amp;gt; "utf8",
            "host"     =&amp;gt; "localhost",
            "database" =&amp;gt; "test_db",
            "username" =&amp;gt; "root",
            "password" =&amp;gt; "root",
            "pool"     =&amp;gt; 5
        },
        "development" =&amp;gt; {
            "adapter"  =&amp;gt; "mysql2",
            "encoding" =&amp;gt; "utf8",
            "host"     =&amp;gt; "localhost",
            "database" =&amp;gt; "test_db",
            "username" =&amp;gt; "root",
            "password" =&amp;gt; "root",
            "pool"     =&amp;gt; 5
        },
        "test"        =&amp;gt; {
            "adapter"  =&amp;gt; "mysql2",
            "encoding" =&amp;gt; "utf8",
            "host"     =&amp;gt; "localhost",
            "database" =&amp;gt; "test_db",
            "username" =&amp;gt; "root",
            "password" =&amp;gt; "root",
            "pool"     =&amp;gt; 5
        },
        "production"  =&amp;gt; {
            "adapter"  =&amp;gt; "mysql2",
            "encoding" =&amp;gt; "utf8",
            "host"     =&amp;gt; nil,
            "database" =&amp;gt; "test_db",
            "username" =&amp;gt; nil,
            "password" =&amp;gt; nil,
            "pool"     =&amp;gt; 5
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我的 .zshrc 中明明是有配置环境变量的，也执行过 &lt;code&gt;source ~/.zshrc&lt;/code&gt; 了可是就是读不到啊。
另外 如果使用 &lt;code&gt;RAILS_ENV=production DATABASE_HOST=xxxx rails c&lt;/code&gt; 的方式去启动是可以读到的。这个问题在 mac 和  ubuntu 上都存在。&lt;/p&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Tue, 09 Jul 2019 10:24:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/38813</link>
      <guid>https://ruby-china.org/topics/38813</guid>
    </item>
    <item>
      <title>求助，ActionCable 如何作为 WebSocket 客户端来使用？</title>
      <description>&lt;p&gt;Ruby on Rails Guides 中有关于 ActionCable 的文档，但是都是将 ActionCable 作为 WebSocket 作为服务端来使用。假如现在我想要订阅一个第三方服务的 WebSocket，那么是否可以将 ActionCable 作为客户端来使用呢？如果不能，可以推荐给我一些友好的 Gem 吗？&lt;/p&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Tue, 14 May 2019 22:48:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/38527</link>
      <guid>https://ruby-china.org/topics/38527</guid>
    </item>
    <item>
      <title>Sidekiq CPU 线程数量设置多少比较合适？</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/56da1cf8-4cf7-464a-9731-24ce430f5233.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;生产环境中 sidekiq 占用了太多的 CPU。
弱弱的问一句，在部署的时候，Puma 的 workers threads_count 和数据库 pool 的大小，还有 sidekiq 的线程数量分别设置多少？
服务器是 4 核 16G 的配置&lt;/p&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Sun, 29 Jul 2018 21:25:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/37248</link>
      <guid>https://ruby-china.org/topics/37248</guid>
    </item>
    <item>
      <title>Rspec 如何测试在 controller 中自定义的方法</title>
      <description>&lt;p&gt;一般情况下用 &lt;code&gt;rspec&lt;/code&gt; 是这样婶的：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s1"&gt;'#index'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;"return 200"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="vi"&gt;@request.env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Auth-Token'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;access_token&lt;/span&gt;
      &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="ss"&gt;:index&lt;/span&gt;
      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;have_http_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&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;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;get&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，这个方法的第一个参数必须是 &lt;code&gt;action&lt;/code&gt; ??? 我有很多自定义的方法名，并非默认的 &lt;code&gt;create&lt;/code&gt; &lt;code&gt;index&lt;/code&gt; 之类的。我该如何使用 &lt;code&gt;rspec&lt;/code&gt; 测试 &lt;code&gt;controller&lt;/code&gt; 中的自定义方法？
求各路大佬相助...&lt;/p&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Tue, 09 Jan 2018 18:03:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/34862</link>
      <guid>https://ruby-china.org/topics/34862</guid>
    </item>
    <item>
      <title>为什么 Ruby 这么好用，却从未进入 TIOBE 前三名？</title>
      <description>&lt;p&gt;这是今天的 TIOBE 指数， &lt;a href="https://www.tiobe.com/tiobe-index/" rel="nofollow" target="_blank"&gt;https://www.tiobe.com/tiobe-index/&lt;/a&gt; &lt;/p&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Sat, 30 Dec 2017 17:55:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/34798</link>
      <guid>https://ruby-china.org/topics/34798</guid>
    </item>
    <item>
      <title>如何设置一个定时任务？</title>
      <description>&lt;p&gt;我想在 &lt;code&gt;Rails&lt;/code&gt; 项目中，每隔十五分钟去更新 &lt;code&gt;Redis&lt;/code&gt; 缓存，该如何实现？&lt;/p&gt;</description>
      <author>JiangYongKang</author>
      <pubDate>Mon, 30 Oct 2017 10:31:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/34456</link>
      <guid>https://ruby-china.org/topics/34456</guid>
    </item>
  </channel>
</rss>
