<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>huhongda (宅编程)</title>
    <link>https://ruby-china.org/huhongda</link>
    <description>我坚信付出多少就能获得多少</description>
    <language>en-us</language>
    <item>
      <title>如何优雅的重构这段代码？</title>
      <description>&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;在跨库事务操作时，我们会用上这样的代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
   &lt;span class="no"&gt;B&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
           &lt;span class="no"&gt;D&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;do&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;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有 A,B,C,D 四个库需要同时做事务操作（真实环境确实有这么多库）&lt;/p&gt;

&lt;p&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;Support&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Consistency&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&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;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;invalid_consts&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;span class="nf"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:transaction&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;invalid_consts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;invalid_consts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:to_s&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, they arent the sub class for ActiveRecord::Base"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;colorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:red&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="c1"&gt;# TODO: I think there are better codes&lt;/span&gt;
      &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
      &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.transaction {"&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'yield block'&lt;/span&gt;
      &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'}'&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="n"&gt;cmd&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;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Support&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Consistency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;B&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;D&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nf"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问有更优雅的办法重构这块代码么？&lt;/p&gt;</description>
      <author>huhongda</author>
      <pubDate>Fri, 17 Jul 2015 10:55:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/26530</link>
      <guid>https://ruby-china.org/topics/26530</guid>
    </item>
    <item>
      <title>万能的 Ruby-China，求 gitolite 迁移到 Gitlab 中目录多层结构解决办法？</title>
      <description>&lt;h2 id="问题："&gt;问题：&lt;/h2&gt;
&lt;p&gt;gitolite 的 repositories 中的目录结构是这样 ruby-china/aaa/bbb/a.git 这是是多层
而 gitlab 中的 repositories 中的目录结构是这样 ruby-china/a.git  &lt;code&gt;貌似gitlab只支持一层目录&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;现在需要实现 将 gitolite 的目录结构完全迁移到 gitlab 中，但是 gitlab 不支持多层啊！求大神解决！
实现 gitlab 的 repositories 的目录结构和 gitolite 一致。&lt;/p&gt;</description>
      <author>huhongda</author>
      <pubDate>Mon, 17 Mar 2014 15:33:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/17941</link>
      <guid>https://ruby-china.org/topics/17941</guid>
    </item>
    <item>
      <title>selenium-webdriver 的 sessionId 能共享么？</title>
      <description>&lt;h3 id="最近在用selenium-webdriver 做自动化测试，遇见一个问题，selenium-webdriver每次启动driver时都会重新生成一个新的session, 即每个浏览器窗口都是一个新的会话。"&gt;最近在用 selenium-webdriver 做自动化测试，遇见一个问题，selenium-webdriver 每次启动 driver 时都会重新生成一个新的 session, 即每个浏览器窗口都是一个新的会话。&lt;/h3&gt;
&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/aece0b8dad0ce9d5746ecb7127be2519.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="现在我想要每次使用selenium-webdriver时都使用同一个session（有cookie保存等）"&gt;现在我想要每次使用 selenium-webdriver 时都使用同一个 session（有 cookie 保存等）&lt;/h3&gt;
&lt;p&gt;查看了一下 selenium-webdriver 的源码：&lt;/p&gt;

&lt;p&gt;最终发现每个会话的 sessionId 来自于 selenium 返回的结果：&lt;/p&gt;

&lt;p&gt;源码地址：&lt;a href="https://github.com/vertis/selenium-webdriver/blob/master/lib/selenium/webdriver/remote/http/default.rb#L56" rel="nofollow" target="_blank"&gt;https://github.com/vertis/selenium-webdriver/blob/master/lib/selenium/webdriver/remote/http/default.rb#L56&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;返回结果来自于：response.body&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{"sessionId"=&amp;gt;"daec4133-c622-4da8-a662-fc05d487a21f", "status"=&amp;gt;0, "value"=&amp;gt;{"platform"=&amp;gt;"LINUX", "javascriptEnabled"=&amp;gt;true, "acceptSslCerts"=&amp;gt;true, "browserName"=&amp;gt;"firefox", "rotatable"=&amp;gt;false, "locationContextEnabled"=&amp;gt;true, "webdriver.remote.sessionid"=&amp;gt;"daec4133-c622-4da8-a662-fc05d487a21f", "version"=&amp;gt;"17.0.10", "databaseEnabled"=&amp;gt;true, "cssSelectorsEnabled"=&amp;gt;true, "handlesAlerts"=&amp;gt;true, "browserConnectionEnabled"=&amp;gt;true, "webStorageEnabled"=&amp;gt;true, "nativeEvents"=&amp;gt;false, "applicationCacheEnabled"=&amp;gt;true, "takesScreenshot"=&amp;gt;true}, "state"=&amp;gt;nil, "class"=&amp;gt;"org.openqa.selenium.remote.Response", "hCode"=&amp;gt;732910363}&lt;/code&gt;
可以看见 sessionId 来自于浏览器返回的结果。&lt;/p&gt;

&lt;p&gt;请各位大牛帮忙看看使用 selenium-webdriver 能否公用 session!&lt;/p&gt;</description>
      <author>huhongda</author>
      <pubDate>Tue, 07 Jan 2014 15:59:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/16673</link>
      <guid>https://ruby-china.org/topics/16673</guid>
    </item>
  </channel>
</rss>
