<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jay_li (俊杰.Li)</title>
    <link>https://ruby-china.org/jay_li</link>
    <description>好好学习，身体倍儿棒....</description>
    <language>en-us</language>
    <item>
      <title>压力测试后的迟钝反应</title>
      <description>&lt;p&gt;测试的项目基于 Sinatra，Web 服务 Unicorn，数据库 MySql（阿里云），环境 CentOS，内存 8G，磁盘空间 1T(挂载)。&lt;/p&gt;

&lt;p&gt;过去几个月运行良好，由于近期要内部推广，就想压力测试一下，看代码的性能表现。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ab  -c 10 -n  1000  url/api-path
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下午（15:40）测试（&lt;strong&gt;运行环境&lt;/strong&gt;）后就开始分析代码，也没去看服务器怎么样（平时的责任心去哪啦），刚才（18:13}就接到客户电话，说客户端访问不了数据。&lt;/p&gt;

&lt;p&gt;远程登录，重启项目代码，成功，但访问（域名，IP:端口）很慢。&lt;/p&gt;

&lt;p&gt;切换至 Root，重启 Nginx，访问依然很慢，甚至在服务器内部 Curl 访问 localhost 依然很慢（&lt;strong&gt;困惑&lt;/strong&gt;）。&lt;/p&gt;

&lt;p&gt;检查内存、cpu、磁盘，一切正常，继续不知所措（&lt;strong&gt;请问此时该怎么继续调试下去&lt;/strong&gt;），就把项目的日志删了（41M），Nginx 日志文件夹没动（1.4M）。&lt;/p&gt;

&lt;p&gt;此时已经过去十几分钟，浏览器依稀可以解析域名，但样式文件没加载完整。&lt;/p&gt;

&lt;p&gt;查看 Unicorn 内存占用，正常。&lt;/p&gt;

&lt;p&gt;刷新浏览器，访问正常，估计是上次访问成功，这次 304 吧，登录进去，很慢，但算有响应了。杀掉进程，重启 Unicorn（重复了几次），好像一切正常了。&lt;/p&gt;

&lt;p&gt;但客户端一登录，就又僵尸了，注释掉数据库 update 操作（记录登录），重启项目，客户端访问提示服务器响应超时。脚本测试模拟登录，也响应极慢。&lt;/p&gt;

&lt;p&gt;感觉一时无解，就从台阶站起来，开始收拾东西（下班路上接到的客户电话，Mac 使用 iPhone 无线热点），坐在地铁上码刚刚的经历。&lt;/p&gt;

&lt;p&gt;地铁方向坐反，换乘对方向的路上感觉信号很好，就登录客户端尝试，一切正常了，重复登录登出，菜单这种访问，完全正常。&lt;/p&gt;

&lt;p&gt;停止码字，再测试继续正常。&lt;/p&gt;

&lt;p&gt;反应过来了（内存，Unicorn，阿里云）？&lt;/p&gt;

&lt;p&gt;请问
&lt;del&gt;1.  并发测试数与用户人数的大概几何关系&lt;/del&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;如何快速应对上述场景（高压恢复到低压后）？（&lt;del&gt;避免这种场景&lt;/del&gt;）&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>jay_li</author>
      <pubDate>Fri, 18 Mar 2016 20:41:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/29389</link>
      <guid>https://ruby-china.org/topics/29389</guid>
    </item>
    <item>
      <title>求助 - 拼图游戏，性能，ruby&amp;c</title>
      <description>&lt;h2 id="游戏规则:"&gt;游戏规则：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;拼图的单位为 [积木块]&lt;/li&gt;
&lt;li&gt;[积木条] 由 5 个 [积木块] 组成，每个 [积木块] 面与面相贴 (二维界面)，可组合成任何可以组成的 [积木形状]&lt;/li&gt;
&lt;li&gt;[积木条] 放在 [拼盘] 中无间隙放满 ([积木条] 形状类型不同重复) 即成功，[拼盘] 长宽为 3x20(单位 [积木块])&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="游戏起因:"&gt;游戏起因：&lt;/h2&gt;
&lt;p&gt;上周五，在会议室吃午餐时，同事 (其实是前辈，临时待在上海) 说他小女儿有个课余作业，需要他帮助，就是上面的拼图游戏，&lt;/p&gt;

&lt;p&gt;他就用程序员最拿手的方式把这个问题给解决，不过他是使用 c 语言解决出来的，使用 1 分钟多点。&lt;/p&gt;

&lt;p&gt;我感觉很好玩，就使用 ruby 试写一下，使用 3x5,3x10 做测试，分别使用 1s,46s 左右跑出结果来，但计算 3x20 时跑不出结果来 (1 小时以上).&lt;/p&gt;
&lt;h2 id="当前困惑:"&gt;当前困惑：&lt;/h2&gt;
&lt;p&gt;我认为是代码（没有使用 ruby 最合适的用法）或算法（多使用递归，可能使用不得当）写的不好，所以才有此救助贴。&lt;/p&gt;

&lt;p&gt;下面我会把代码的解法思路，认为的瓶颈简单描述一下。&lt;/p&gt;
&lt;h2 id="游戏思路:"&gt;游戏思路：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;5 个 [积木块] 可以拼成 12 种 [积木条] 形状类型，每个形状类型旋转、翻转等可以组成 63 种 [积木条] 形状。 (由于 [拼盘] 深度为 3，过滤一下只有 50 种 [积木条] 形状）&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;递归尝试每一个 [积木条] 形状&lt;/p&gt;

&lt;p&gt;1 [积木条] 形状深度大于 3，直接跳过
2 使用一个 [积木条] 形状后，把该 [积木条] 类型的所有形状都标记一下，下次遇到直接跳过
3 递归遍历 [拼盘] 中所有连续的空白块 (感觉此处代码有很大优化空间)，数量都应该除 5 余 0，否则跳过
4 [积木条] 形状在 [拼盘] 上找不到放置，跳过
5 把 [积木条] 形状放置到 [拼盘] 上
6 是否拼满了&lt;/p&gt;

&lt;p&gt;1 yes 打印
    2 no，继续尝试下一个 [积木条] 形状&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;其中为了便于区分 [积木条] 形状，有对每种 [积木条] 类型对应一个符号，要不然，打印出来，全是 1，同时也为了 uniq 一下。&lt;/p&gt;
&lt;h2 id="相关说明:"&gt;相关说明：&lt;/h2&gt;
&lt;p&gt;上周五晚上就把 3x5 的测试跑出来了，但需要 28s，这几天一直在优化代码 (现在需要 1s)，但还是跑不出 3x20 的结果。&lt;/p&gt;

&lt;p&gt;其中尝试对 3x5 的结果再操作，最终实现 3x20，这条路不行的，3x5 的结果集包含的 [积木条] 类型是互斥的，经计算只能两两组合，实现 3x10.&lt;/p&gt;

&lt;p&gt;对于写出的代码跳不出结果来，感觉很无奈...压箱底不管，还不如发个贴，救助学习一下。&lt;/p&gt;
&lt;h2 id="代码文件："&gt;代码文件：&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jay16/phantom/tree/master/bricks" rel="nofollow" target="_blank"&gt;https://github.com/jay16/phantom/tree/master/bricks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;util.rb         - 通用代码（复制对象，打印等）
shapes.rb  - 处理 [积木条] 形状
adapter.rb - 处理 [积木条] 形状与 [拼盘] 位置
bricks.rb   - 调用上面三个文件
_test.rb     - 测试代码&lt;/p&gt;

&lt;p&gt;可以针对解法逻辑、代码风格、命令规范、测试规范进行批评。
（当前状态感觉自己的代码很丑陋）&lt;/p&gt;

&lt;p&gt;贴一下电脑配置，&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2014/6147a75d7755c5ec5803632e42f3ded1.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jay_li</author>
      <pubDate>Tue, 21 Oct 2014 15:48:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/22166</link>
      <guid>https://ruby-china.org/topics/22166</guid>
    </item>
    <item>
      <title>带着疑惑分享一个关于 remote: true 的技巧</title>
      <description>&lt;p&gt;在设置 i18 多语言时，希望通过 ajax 的方式重置 I18n.locale 来实现切换显示语言，form 已经设置为 remote: true，是通过 select 选择变化时自动提交。&lt;/p&gt;

&lt;p&gt;但提交格式总是:html，一直没解决，索性添加了隐藏的 submit_tag，select 变化时触发 submit_tag 点击，这才实现了提交格式为:js&lt;/p&gt;

&lt;p&gt;旧代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= form_tag(i18_path(), :remote =&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;style: &lt;/span&gt;&lt;span class="s2"&gt;"margin:0px;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;
   &amp;lt;span style="color:darkgray;"&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= t("layout.lang") %&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;select_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;options_for_select&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lang.english"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lang.chinese"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;"zh-CN"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;class: &lt;/span&gt;&lt;span class="s2"&gt;"chosen-select"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;onchange: &lt;/span&gt;&lt;span class="s2"&gt;"this.form.submit()"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;% end &lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= form_tag(i18_path(), :remote =&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;style: &lt;/span&gt;&lt;span class="s2"&gt;"margin:0px;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;
   &amp;lt;span style="color:darkgray;"&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= t("layout.lang") %&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;select_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;options_for_select&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lang.english"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lang.chinese"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;"zh-CN"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;class: &lt;/span&gt;&lt;span class="s2"&gt;"chosen-select"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;onchange: &lt;/span&gt;&lt;span class="s2"&gt;"$('#i18_btn').trigger('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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= submit_tag "", id: "i18_btn", style: "display:none;" %&amp;gt;
 &amp;lt;% end %&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那位了解其中道理的朋友帮忙解释一下，顺便说一下如何通过原来的方式实现:js 提交？&lt;/p&gt;

&lt;p&gt;毕竟触发 submit_tag 的方式太罗嗦了。&lt;/p&gt;</description>
      <author>jay_li</author>
      <pubDate>Thu, 24 Oct 2013 14:46:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/15001</link>
      <guid>https://ruby-china.org/topics/15001</guid>
    </item>
    <item>
      <title>rescue_from 如何获取更详细错误信息</title>
      <description>&lt;p&gt;SyntaxError in Categories#index&lt;/p&gt;

&lt;p&gt;Showing /home/work/focus_mail/app/views/categories/index.html.erb where line #52 raised:
/home/work/focus_mail/app/views/categories/index.html.erb:52: syntax error, unexpected $end, expecting '}'&lt;/p&gt;

&lt;p&gt;Extracted source (around line #52):
52:               &amp;lt;%= form_tag "/categories/update/#{list.id}", :class =&amp;gt; 'form-horizontal hidden' , remote: true, :id=&amp;gt; "editlist#{list.id %}" do %&amp;gt;
Trace of template inclusion: app/views/categories/index.html.erb&lt;/p&gt;

&lt;p&gt;上面的报错 rescue_from 只能获取 exception.message
 SyntaxError in Categories#index
/home/work/focus_mail/app/views/categories/index.html.erb:52: syntax error, unexpected $end, expecting '}'&lt;/p&gt;

&lt;p&gt;而怎么样获取 Extracted source (around line #52):这样详细的细节信息？！&lt;/p&gt;</description>
      <author>jay_li</author>
      <pubDate>Wed, 12 Dec 2012 10:39:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/7482</link>
      <guid>https://ruby-china.org/topics/7482</guid>
    </item>
  </channel>
</rss>
