<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>suxiaohun (苏小魂)</title>
    <link>https://ruby-china.org/suxiaohun</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>AES 加密解密算法求教，Java   128 位    AES/ECB/PKCS5Padding  ，始终对不上</title>
      <description>&lt;p&gt;求教，最近在做一个 java 项目集成的问题，用到了 AES 加密，他们给的工具类如下：&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt;  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;INIT_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt;  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;SECRET_IALGORITHM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AES"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;ZERO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;ONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;derectory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"D:"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;doFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sourceFilePath&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;targetFilePath&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&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;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sourceFilePath&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;BufferedInputStream&lt;/span&gt; &lt;span class="n"&gt;bis&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;BufferedInputStream&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;FileInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()];&lt;/span&gt;
        &lt;span class="n"&gt;bis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytIn&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;bis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;//aes对称加密算法  加密和解密用到的密钥是相同的&lt;/span&gt;
        &lt;span class="c1"&gt;//构造密钥生成器，指定为AES算法,不区分大小写&lt;/span&gt;
        &lt;span class="nc"&gt;KeyGenerator&lt;/span&gt; &lt;span class="n"&gt;kgen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KeyGenerator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;SECRET_IALGORITHM&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;//根据key规则初始化密钥生成器&lt;/span&gt;
        &lt;span class="c1"&gt;//生成一个128位的随机源,根据传入的字节数组&lt;/span&gt;
        &lt;span class="nc"&gt;SecureRandom&lt;/span&gt; &lt;span class="n"&gt;secureRandom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SecureRandom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SHA1PRNG"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;secureRandom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setSeed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;kgen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;INIT_SIZE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secureRandom&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;//        kgen.init(INIT_SIZE, new SecureRandom(key.getBytes()));&lt;/span&gt;
        &lt;span class="c1"&gt;//产生原始对称密钥&lt;/span&gt;
        &lt;span class="nc"&gt;SecretKey&lt;/span&gt; &lt;span class="n"&gt;skey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kgen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generateKey&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;//获得原始对称密钥的字节数组&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEncoded&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;//根据字节数组生成AES密钥&lt;/span&gt;
        &lt;span class="nc"&gt;SecretKeySpec&lt;/span&gt; &lt;span class="n"&gt;skeySpec&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;SecretKeySpec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;SECRET_IALGORITHM&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;//根据指定算法AES自成密码器&lt;/span&gt;
        &lt;span class="nc"&gt;Cipher&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cipher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;SECRET_IALGORITHM&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;//初始化密码器，第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作，第二个参数为使用的KEY&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&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;code&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Cipher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENCRYPT_MODE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skeySpec&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Cipher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DECRYPT_MODE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skeySpec&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;//将数据加密或解密&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;doFinal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytIn&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;BufferedOutputStream&lt;/span&gt; &lt;span class="n"&gt;bos&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;BufferedOutputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileOutputStream&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;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;targetFilePath&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
        &lt;span class="n"&gt;bos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytOut&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;bos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，他们项目回复说用的是 128 位    AES/ECB/PKCS5Padding，
我研究了下，也看了相关的帖子，写的加密算法如下&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;aes128_encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OpenSSL&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Cipher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="s1"&gt;'aes-128-ecb'&lt;/span&gt;
      &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encrypt&lt;/span&gt;
      &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
      &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
      &lt;span class="n"&gt;encrypted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
      &lt;span class="n"&gt;encrypted&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;final&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>suxiaohun</author>
      <pubDate>Thu, 21 Dec 2017 10:35:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/34744</link>
      <guid>https://ruby-china.org/topics/34744</guid>
    </item>
    <item>
      <title>clockwork 定时任务，rails 调用系统进程的问题</title>
      <description>&lt;p&gt;在做定时任务，
----不让使用 crontab
业务要求前台可配置，大概如下面这个意思
&lt;img src="https://l.ruby-china.com/photo/2017/9e0fa3e2719d7b83b49850b365a9036f.png!large" title="" alt=""&gt;
我查了一些资料，ruby 有很多中方式调用 shell 指令，ps -ef 也能查到 clockwork 的进程，逻辑也生效了
但是我对 linux 的进程不太懂，遇到了以下几个问题：
1.在开发环境，执行 shell 指令后（包括``,sytem 等等），就卡住了 
&lt;img src="https://l.ruby-china.com/photo/2017/42572cc7bcb42828e5c3709171de9daa.png!large" title="" alt=""&gt;
不会跳转，控制台也输出了 此指令的日志。&lt;/p&gt;

&lt;p&gt;2.假设能正常运行了，如何结束此任务？通过进程 pid 强制杀进程吗？&lt;/p&gt;

&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt;  我看到你原来的那篇帖子了，最后一句配合 god 使用，是用来管理这个的吗？&lt;/p&gt;

&lt;p&gt;ps：还是说思路有问题，有更好的解决方式？求各位帮忙解答下&lt;/p&gt;</description>
      <author>suxiaohun</author>
      <pubDate>Mon, 09 Jan 2017 15:05:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/32079</link>
      <guid>https://ruby-china.org/topics/32079</guid>
    </item>
    <item>
      <title>请教下，rails3.1.1 ActiveRecord::Relation 是什么个情况?</title>
      <description>&lt;p&gt;如题，一个 rails3.1.1 的老项目 
在涉及到查询分页的时候，报错，看日志，是因为查询返回的是 array，然后改了下，返回的是 enumberable，还是报错，
最后对比了老代码，发现返回的是 activeRecord：relation，&lt;/p&gt;

&lt;p&gt;在网上查了下，将 array 转换成 activerecord：relation 后，可以正常使用&lt;/p&gt;

&lt;p&gt;那么，ActiveRecord::Relation 是什么返回类型，这个问题是因为 rails 版本导致的吗？还真不知道有这么个东西。&lt;/p&gt;</description>
      <author>suxiaohun</author>
      <pubDate>Mon, 29 Feb 2016 16:26:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/29154</link>
      <guid>https://ruby-china.org/topics/29154</guid>
    </item>
    <item>
      <title>大批量数据从 SQL Server 导入 MySQL，如何保证数据完整性</title>
      <description>&lt;p&gt;背景：一批老数据，大概 100w 条吧，原来是存在 SqlServer 的，项目要换成 MySQL，db 重构，但大部分字段是一致的&lt;/p&gt;

&lt;p&gt;面试的时候，被问到导数据的时候怎么保证数据的完整性，但老数据迁移不是我做的，
我是这么答的：因为数据太大，以时间点为基准，分批处理，导出文件，navicat，勾选对应字段，然后再导入
（总感觉有点蠢，没答到点子上，而且没想明白，导数据出现错误的几率应该比较小吧。）&lt;/p&gt;

&lt;p&gt;是否有专业的方式来解决这个问题？&lt;/p&gt;</description>
      <author>suxiaohun</author>
      <pubDate>Tue, 16 Feb 2016 19:20:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/29005</link>
      <guid>https://ruby-china.org/topics/29005</guid>
    </item>
    <item>
      <title>测试到底是什么？</title>
      <description>&lt;p&gt;这个点了，老是觉着有点不舒服，起因是因为今天去面试，被人问了写过测试吗？我回答从来没有写过测试。
然后面试官的神情让我感觉很不舒服，觉得好像什么都不会似的，一直别扭到现在。
我从接触 ruby 一直没用过测试，以前是自己写的功能，然后点点功能看能否正常运作，不正常就 debug 看哪里有问题，正常就发版了，后来也是
自己先过一遍，再交给测试人员去测试功能。&lt;/p&gt;

&lt;p&gt;我只知道项目中有自带的 Test::Unit 的东西，但是从来没用过，今天也搜了一些帖子，还是不太明白。
所以想问问，写测试的意义是什么，写测试到底有无必要，如果有必要，那我应该从哪方面入手，看帖子说还有个 Rspec 的框架，也是用的非常多。&lt;/p&gt;

&lt;p&gt;感激不尽。&lt;/p&gt;</description>
      <author>suxiaohun</author>
      <pubDate>Thu, 28 Jan 2016 22:06:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/28902</link>
      <guid>https://ruby-china.org/topics/28902</guid>
    </item>
    <item>
      <title>will_paginate 分页过多 (大概 10000 页)，点击最后几页的时候，速度明显变慢</title>
      <description>&lt;p&gt;我用 will_paginate 分页，
&lt;a href="/questions" class="user-mention" title="@questions"&gt;&lt;i&gt;@&lt;/i&gt;questions&lt;/a&gt; = Question.paginate(page: params[:page], per_page: 15)
db 中数据大概在 15w 条左右，在点击最后几页的时候速度很慢，我从 console 中
得到 sql 在数据库中执行，确实就很慢。&lt;/p&gt;

&lt;p&gt;我从网上查了查，说是 offset 过大，导致 sql 查询过慢，有什么好的方法解决这个问题吗？
看了一些优化，好像要写 sql？&lt;/p&gt;</description>
      <author>suxiaohun</author>
      <pubDate>Fri, 08 Jan 2016 15:38:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/28659</link>
      <guid>https://ruby-china.org/topics/28659</guid>
    </item>
  </channel>
</rss>
