<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>xizhu2012 (昔竹)</title>
    <link>https://ruby-china.org/xizhu2012</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>有一个似乎是很常见的需求,但是没发现简洁优雅的实现方式:如何结束 ping x.x.x.x -t 命令?</title>
      <description>&lt;p&gt;需求：
windows 系统，在程序中运行命令"ping X.X.X.X -t"10 秒，并在 10 秒后停止 ping，并返回这段时间内 ping 命令的回显。&lt;/p&gt;

&lt;p&gt;刚开始觉得挺简单的，设置超时时间，然后调用 ping 命令，到点抛异常并捕获，输出回显。&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;'timeout'&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`ping 127.0.0.1 -t`&lt;/span&gt; &lt;span class="c1"&gt;#假设ip为127.0.0.1&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;Exception&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; 
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$!&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;execution expired
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后开始上网搜寻解决方法，发现没有一个方法能满足需求，最后在一个英文论坛中找到半个解决方案，只能在 10 秒后结束 ping -t 命令，但获取不了内容，而且代码还很长，涉及到 IO.poen,Process.waitpid2 之类的命令，没看太明白，还有些解决方案中提到用 fork,open3,open4 的方法，比较简洁，但是在 windows 下这些都无法使用，无奈之下，只好来论坛求助.
我觉得这个需求很简单，很常见，因为不一定是 ping -t 命令，凡是涉及到很多耗时的操作，需要中断并取得操作结果的场景，都和这个类似，像这种需求，实现起来应该会有简洁优雅的方式吧，只是我没找到？希望大家能给点帮助，多谢！&lt;/p&gt;</description>
      <author>xizhu2012</author>
      <pubDate>Sat, 26 Sep 2015 22:53:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/27494</link>
      <guid>https://ruby-china.org/topics/27494</guid>
    </item>
    <item>
      <title>网页抓取遇下面的问题,可以通过模拟发送请求解决吗?还是必须运行 js 才行？</title>
      <description>&lt;p&gt;访问网页的过程中，有个会跳转的网页，中间态的页面是下面这个内容，跳转的原理似乎是载入页面后再运行后面的那段 js，然后跳转，想问一下这样的最终的网页能抓的到吗？
例如，网址为 www.xxgs.com/showproject.aspx?fid=123456(网址是示例，关键信息已经隐去) 打开后得到下面的中间页面
...&lt;/p&gt;





    
        
    


&lt;p&gt;
        var bt = $("#btnRedirect");
        $(window).load(function () {
            bt.click();
        })

...
过一会儿就跳转到 www.xxgs.com/showproject2.aspx?fid=123456
也就是说页面会由 www.xxgs.com/showproject.aspx?fid=123456 跳转到 &lt;a href="http://www.xxgs.com/showproject2.aspx?fid=123456,%E4%B8%AD%E9%97%B4%E8%BF%87%E7%A8%8B%E6%98%AF%E9%A1%B5%E9%9D%A2load%E4%B9%8B%E5%90%8E,%E7%82%B9%E5%87%BBbutton%E8%BF%9B%E8%A1%8Cpost,post%E6%95%B0%E6%8D%AE%E5%B0%B1%E6%98%AF__VIEWSTATE" rel="nofollow" target="_blank" title=""&gt;www.xxgs.com/showproject2.aspx?fid=123456,中间过程是页面load之后,点击button进行post,post数据就是__VIEWSTATE&lt;/a&gt;
但是我对 www.xxgs.com/showproject.aspx?fid=123456 模拟着发送 post 请求，总是只能得到中间态的页面，这是为什么呢？
另外，一旦涉及到 https 的操作，例如:
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == "https"  # enable SSL/TLS
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
这样的话，连接网站就会出现 
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (Faraday::SSLError)
的错误.
折腾了好久，不知道到底问题出在哪儿，希望有人能指点一下，多谢！&lt;/p&gt;</description>
      <author>xizhu2012</author>
      <pubDate>Sat, 14 Feb 2015 00:43:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/24257</link>
      <guid>https://ruby-china.org/topics/24257</guid>
    </item>
  </channel>
</rss>
