<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[vkill'blog]]></title> 
<link>http://blog.vkill.net/index.php</link> 
<description><![CDATA[]]></description> 
<language>en-US</language> 
<copyright><![CDATA[vkill'blog]]></copyright>
<item>
<link>http://blog.vkill.net/read.php/141.htm</link>
<title><![CDATA[uninitialized constant REQUIRED at ruby1.9.1 use Getopt::Long]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Mon, 25 Jan 2010 12:08:48 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/141.htm</guid> 
<description>
<![CDATA[ 
	假设我们需求如下<br/><div class="code"><br/>Usage: test.rb &#91;OPTION&#93;<br/>-h,&nbsp;&nbsp;--help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view help<br/>-e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encode String (default)<br/>-d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decode String<br/>-p,&nbsp;&nbsp;--pass=PASSWD&nbsp;&nbsp;password<br/></div><br/><br/>ruby 1.8.x win一键安装时我们是这样写<br/><div class="code"><br/>require &#039;getopts&#039;<br/>getopts(&#039;hed&#039;, &#039;help&#039;, &#039;p:&#039;, &#039;pass:&#039;)<br/>p $OPT<br/></div><br/><br/>到了ruby 1.9.1 时应该这样写，详细参见 lib&#92;ruby&#92;gems&#92;1.9.1&#92;gems&#92;getopt-1.4.0&#92;examples&#92;目录下的两个说明文件<br/><div class="code"><br/>#gem install getopt&nbsp;&nbsp;-v 1.4.0<br/>require &quot;getopt/long&quot;<br/>opts = Getopt::Long.getopts(<br/>&nbsp;&nbsp;&#91;&quot;--help&quot;, &quot;-h&quot;&#93;,<br/>&nbsp;&nbsp;&#91;&quot;-e&quot;&#93;,<br/>&nbsp;&nbsp;&#91;&quot;-d&quot;&#93;,<br/>&nbsp;&nbsp;&#91;&quot;--pass&quot;, &quot;-p&quot;, 0&#93;<br/>)<br/>p opts<br/></div><br/><br/>注：上例中 ["--pass", "-p", 0] 那句按官方example的写法应该是 ["--pass", "-p", REQUIRED]，但是那样写的话就会报错如下：uninitialized constant REQUIRED (NameError) ，我看了 lib&#92;getopt&#92;long.rb 文件中有如下设置 <br/><div class="code"><br/>REQUIRED&nbsp;&nbsp;= 0 # Argument is required if switch is provided.<br/>BOOLEAN&nbsp;&nbsp; = 1 # Value of argument is true if provided, false otherwise.<br/>OPTIONAL&nbsp;&nbsp;= 2 # Argument is optional if switch is provided.<br/>INCREMENT = 3 # Argument is incremented by 1 each time the switch appears.<br/></div><br/>所以这里我们写为0就可以使用了<br/><br/>后记：个人感觉还是 getopts 好，我是从1.8.7 复制了个 getopts.rb 到了 &#92;lib&#92;ruby&#92;1.9.1 目录下了，呵呵<br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/gem/" rel="tag">gem</a> , <a href="http://blog.vkill.net/go.php/tags/error/" rel="tag">error</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/140.htm</link>
<title><![CDATA[一种基于移位式的加密算法 ruby-vkEncryptStr_v0.1]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Wed, 20 Jan 2010 12:32:19 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/140.htm</guid> 
<description>
<![CDATA[ 
	请多提意见，我好修复完善<br/><br/>v0.1 (20100120)<br/>原理参见 EncryptStr_TBySCW.rb<br/><a href="http://vkill.xm28.91cdn.com/attachment/ruby-vkEncryptStr_v0.1.7z">Click to download</a><br/><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%25B7%25A5%25E5%2585%25B7/" rel="tag">工具</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/encrypt/" rel="tag">encrypt</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/139.htm</link>
<title><![CDATA[transfer file use socket]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Fri, 7 Aug 2009 08:56:20 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/139.htm</guid> 
<description>
<![CDATA[ 
	很简陋的代码，只是为了实现<br/>服务端<br/><div class="code"><br/>#test_s.rb<br/>require &#039;TransferFile.rb&#039;<br/>require &#039;socket&#039;<br/><br/>s = TCPServer.new(1088)<br/>while true<br/>&nbsp;&nbsp;sock = s.accept()<br/>&nbsp;&nbsp;Thread.new() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;%s already conn!&#92;n&quot;, sock<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tf = TransferFile.new()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tf.file_client(sock,&quot;./temp/&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tf.incept<br/>&nbsp;&nbsp;&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p $!<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;%s close!&#92;n&quot;, sock<br/>&nbsp;&nbsp;&#125;<br/>end<br/></div><br/>客户端<br/><div class="code"><br/>#test_c.rb<br/>require &#039;TransferFile.rb&#039;<br/>require &#039;socket&#039;<br/><br/>socket = TCPSocket.new(&#039;127.0.0.1&#039;, 1088)<br/>file = &quot;11.exe&quot;<br/>p file<br/>begin<br/>&nbsp;&nbsp;tf = TransferFile.new()<br/>&nbsp;&nbsp;tf.file_server(socket, file)<br/>&nbsp;&nbsp;tf.send<br/>rescue<br/>&nbsp;&nbsp;p $!<br/>end<br/></div><br/><br/>TransferFile.rb<br/><div class="code"><br/>#<br/>#TransferFile.rb<br/>#<br/><br/>require &#039;timeout&#039;<br/>class TFSSocketWriteError &lt; StandardError<br/>end<br/>class TFSReadFileInfoError &lt; StandardError<br/>end<br/>class TFCSocketReadError &lt; StandardError<br/>end<br/>class TFCReadHeaderError &lt; StandardError<br/>end<br/>class TFCWriteFileError &lt; StandardError<br/>end<br/><br/>class TransferFile<br/>&nbsp;&nbsp;def initialize<br/>&nbsp;&nbsp;&nbsp;&nbsp;@socket = nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;@file = nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;@send_header = &#039;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;@call_header = &#123;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;@read_once_size = defined?(READ_ONCE_SIZE) ? READ_ONCE_SIZE : 102400<br/>&nbsp;&nbsp;&nbsp;&nbsp;@transfer_size = 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;@sleep_sec = 0.05<br/>&nbsp;&nbsp;&nbsp;&nbsp;@sock_write_timeout_sec = 30<br/>&nbsp;&nbsp;&nbsp;&nbsp;@sock_read_timeout_sec = 30<br/>&nbsp;&nbsp;end<br/><br/>&nbsp;&nbsp;#server<br/>&nbsp;&nbsp;def file_server(socket, file)<br/>&nbsp;&nbsp;&nbsp;&nbsp;@socket = socket<br/>&nbsp;&nbsp;&nbsp;&nbsp;@file = file<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@file_name = File.basename(@file)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@file_size = File.size(@file)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@file_mtime = File.mtime(@file)<br/>&nbsp;&nbsp;&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise TFSReadFileInfoError, format(&quot;read file info Err &#91;%s&#93;&quot;, $!)<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;def defined_send_header_file()<br/>&nbsp;&nbsp;&nbsp;&nbsp;@send_header.concat(format(&quot;file-name: %s&#92;r&#92;n&quot;, @file_name))<br/>&nbsp;&nbsp;&nbsp;&nbsp;@send_header.concat(format(&quot;file-size: %s&#92;r&#92;n&quot;, @file_size))<br/>&nbsp;&nbsp;&nbsp;&nbsp;@send_header.concat(format(&quot;file-mtime: %s&#92;r&#92;n&quot;, @file_mtime))<br/>&nbsp;&nbsp;&nbsp;&nbsp;if @send_header.length &lt; 1024<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@send_header.concat(&quot; &quot; * (1024 - @send_header.length))<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;def send()<br/>&nbsp;&nbsp;&nbsp;&nbsp;#new thread sending<br/>&nbsp;&nbsp;&nbsp;&nbsp;sending = Thread.new() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defined_send_header_file()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock_write @send_header<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;###send for bytes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#File.open(@file, &quot;rb&quot;) do &#124;f&#124;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;@send_ok = false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;while not f.eof?<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;sock_write f.read(@read_once_size)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;@transfer_size += @read_once_size<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;###send for line<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@send_ok = false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.open(@file, &quot;rb&quot;).each_line do &#124;line&#124;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock_write line<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@transfer_size += line.length<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@send_ok = true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;while true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while not defined?(@send_ok)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rtransfering initialize ...&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep @sleep_sec<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rtransfering&#91;%s:%sbytes&#93; %s%%&quot;, @file_name, @file_size, @transfer_size * 100 / (@file_size + 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unless sending.status<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @send_ok<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rtransfering&#91;%s:%sbytes&#93; 100%%&quot;, @file_name, @file_size<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot; OK&#92;n&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot; ERR&#92;n&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep @sleep_sec<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;def sock_write(data=&#039;&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;#p data<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout(@sock_write_timeout_sec) &#123;@socket.write(data)&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise TFSSocketWriteError, format(&quot;send data Err &#91;%s&#93;&quot;, $!)<br/>&nbsp;&nbsp;&nbsp;&nbsp;rescue TimeoutError<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise TFSSocketWriteError, &quot;timeout&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/><br/>&nbsp;&nbsp;#client<br/>&nbsp;&nbsp;def file_client(socket, dir=&#039;.&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;@socket = socket<br/>&nbsp;&nbsp;&nbsp;&nbsp;@dir = dir<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;def defined_file_info()<br/>&nbsp;&nbsp;&nbsp;&nbsp;resp = sock_readpartial(1024)<br/>&nbsp;&nbsp;&nbsp;&nbsp;raise TFCReadHeaderError, &quot;read header Err&quot; unless resp.length == 1024 and resp.count(&quot;&#92;r&#92;n&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;resp.each_line do &#124;line&#124;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if line =~ /^(.*)+:&#91; &#93;?(.*)+$/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@call_header&#91;$1.strip&#93; = $2.strip<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;@file_name = @call_header&#91;&quot;file-name&quot;&#93; &#124;&#124; nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;@file_size = @call_header&#91;&quot;file-size&quot;&#93;.to_i &#124;&#124; nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;raise TFCReadHeaderError, &quot;defined file-name Err&quot; unless @file_name<br/>&nbsp;&nbsp;&nbsp;&nbsp;raise TFCReadHeaderError, &quot;defined file-size Err&quot; unless @file_size<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;def incept()<br/>&nbsp;&nbsp;&nbsp;&nbsp;#new thread calling<br/>&nbsp;&nbsp;&nbsp;&nbsp;calling = Thread.new() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defined_file_info()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f = File.new(@dir + &#039;/&#039; + @file_name, &quot;wb+&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise TFCWriteFileError, format(&quot;create file Err &#91;%s&#93;&quot;, $!)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@transfer_ok = false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp = sock_readpartial @read_once_size<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break if resp.empty?<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write resp<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.flush<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@transfer_size = File.size(f)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if File.size(f) == @file_size<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.close<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@transfer_ok = true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.delete(f)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;while true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while not defined?(@transfer_ok)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rtransfering initialize ...&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep @sleep_sec<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rtransfering&#91;%s:%sbytes&#93; %s%%&quot;, @file_name, @file_size, @transfer_size * 100 / (@file_size + 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unless calling.status<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @transfer_ok<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rtransfering&#91;%s:%sbytes&#93; 100%%&quot;, @file_name, @file_size<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot; OK&#92;n&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot; ERR&#92;n&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep @sleep_sec<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/><br/>&nbsp;&nbsp;def sock_readpartial(len=1024)<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @socket.eof?<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp = timeout(@sock_read_timeout_sec) &#123;@socket.readpartial(len)&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise TFCSocketReadError, format(&quot;incept data Err &#91;%s&#93;&quot;, $!)<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/>end<br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%25B7%25A5%25E5%2585%25B7/" rel="tag">工具</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25B1%2580%25E5%259F%259F%25E7%25BD%2591/" rel="tag">局域网</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25BA%2593/" rel="tag">库</a> , <a href="http://blog.vkill.net/go.php/tags/socket/" rel="tag">socket</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/138.htm</link>
<title><![CDATA[ruby smtptls v0.1]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Sat, 25 Jul 2009 02:20:56 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/138.htm</guid> 
<description>
<![CDATA[ 
	看了python 和 ruby 的 一些库，仿了一个 ruby 的 smtptls，当然只是个雏形，加入方法的块就更好了<br/><br/>使用方法：<br/><div class="code"><br/>#Example:<br/>require &#039;SMTPTLS&#039;<br/><br/>host = &#039;smtp.gmail.com&#039;<br/>port = 25<br/>user = &#039;vkill.net@gmail.com&#039;<br/>secret = &#039;*******&#039;<br/>to = &#91;&#93;<br/>to &lt;&lt; &#039;122755990@qq.com&#039;<br/>to &lt;&lt; &#039;vkill.net@hotmail.com&#039;<br/><br/>msgstr = &lt;&lt;-MSGEND<br/>From: &quot;vkill.net&quot; &lt;vkill.net@gmail.com&gt;<br/>To: 122755990@qq.com<br/>Subject: test,sendmail<br/>Date: Thu, 16 Jul 2009 18:35:03 +0800<br/>MIME-Version: 1.0<br/>Content-Type: multipart/mixed;<br/>&nbsp;&nbsp;&nbsp;&nbsp;boundary=&quot;===ruby-vkmailsend&#91;0.3919741430011&#93;===&quot;<br/>X-mailer: ruby-vkmailsend &#91;cn&#93;<br/><br/>--===ruby-vkmailsend&#91;0.3919741430011&#93;===<br/>Content-Type: text/plain;<br/>&nbsp;&nbsp;&nbsp;&nbsp;charset=&quot;gb2312&quot;<br/>Content-Transfer-Encoding: base64<br/><br/>dGVzdA==<br/><br/>--===ruby-vkmailsend&#91;0.3919741430011&#93;===--<br/>MSGEND<br/><br/>begin<br/>&nbsp;&nbsp;smtp = SMTPTLS.new()<br/>&nbsp;&nbsp;smtp.set_debug_output<br/>&nbsp;&nbsp;#smtp.enable_ssl()<br/>&nbsp;&nbsp;smtp.start(host, 25, user, secret)<br/>&nbsp;&nbsp;smtp.send_message(msgstr, user, to) #smtp.send_message(msgstr, user) ##send mail to me<br/>&nbsp;&nbsp;puts &quot;send mail ok!&quot; if smtp.state<br/>rescue<br/>&nbsp;&nbsp;if $!.message =~ /&#92;&#91;(&#91;^&#92;&#93;&#93;+)&#92;&#93;/<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;ERR-&gt;&#91;%s&#93;&#92;n&quot;, $1<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;ERR-&gt;&#91;%s&#93;&#92;n&quot;, $!.message<br/>&nbsp;&nbsp;end<br/>end<br/></div><br/><br/>smtptls 库下载：<br/><br/><a href="http://blog.vkill.net/attachment/smtptls_v0.1.7z">Click to download</a><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/auth/" rel="tag">auth</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a> , <a href="http://blog.vkill.net/go.php/tags/smtp/" rel="tag">smtp</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25BA%2593/" rel="tag">库</a> , <a href="http://blog.vkill.net/go.php/tags/socket/" rel="tag">socket</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/137.htm</link>
<title><![CDATA[conn smtp server and auth flowchart]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Sat, 18 Jul 2009 01:10:37 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/137.htm</guid> 
<description>
<![CDATA[ 
	<br/>点击图片放大<br/><a href="http://blog.vkill.net/attachment/conn_smtp_server_and_auth_flowchart.png" target="_blank"><img src="http://blog.vkill.net/attachment/conn_smtp_server_and_auth_flowchart.png" class="insertimage" alt="Open in new window" title="Open in new window" border="0" width="600" height="800"/></a><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/auth/" rel="tag">auth</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a> , <a href="http://blog.vkill.net/go.php/tags/smtp/" rel="tag">smtp</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/136.htm</link>
<title><![CDATA[邮件发送脚本 ruby-vkmailsend_v0.6]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Mon, 13 Jul 2009 05:42:58 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/136.htm</guid> 
<description>
<![CDATA[ 
	请多提意见，我好修复完善<br/>关于脚本实现的原理网上搜索 socket smtp 很多的<br/>io.readline 那个把我弄疯了，我晕，最后用了 io/wait 和 给 sslsocket 加了一个方法才搞定，呵呵~<br/><br/><br/>v0.6 (20090723)<br/>使用 smtptls.rb<br/><a href="http://blog.vkill.net/attachment/ruby-vkmailsend_v0.6.7z">Click to download</a><br/>v0.5 (20090717)<br/>修正 自动判断starttls 和 自动判断auth 以前方法的一些错误<br/>v0.4 (20090716)<br/>修正为自动判断是否需要 starttls<br/>修正为自动判断认证方式<br/>认证方式加入plain，以前只有login<br/>修正如附件不存在则退出<br/>v0.3 (20090715)<br/>可定义某些附件后缀不执行打包压缩<br/>可定义某些附件后缀需执行rename<br/>可自定义昵称<br/>v0.2 (20090714)<br/>重写class smtpclienl，使对话更合理<br/>加入tls的支持，可以发送gmail邮件了<br/>修正163 qq 等邮件发送时的错误<br/>v0.1 (20090706)<br/>基于p-mailsend_v4.8修改而来，只是完全用ruby实现的<br/>增加邮件源文件保存记录<br/>增加邮件发送日志的功能，便于以后检查<br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/auth/" rel="tag">auth</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a> , <a href="http://blog.vkill.net/go.php/tags/smtp/" rel="tag">smtp</a> , <a href="http://blog.vkill.net/go.php/tags/socket/" rel="tag">socket</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25BA%2593/" rel="tag">库</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/135.htm</link>
<title><![CDATA[ruby隐藏输入密码 getpass()]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Thu, 9 Jul 2009 04:45:45 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/135.htm</guid> 
<description>
<![CDATA[ 
	python 直接有个getpass()来支持隐藏输入密码，而ruby没有<br/><br/>在 http://blog.jeffhui.net/2009/03/password-input-in-ruby/ 看到了一个方法，试了下可行，记录下<br/><br/>代码如下：<br/><br/><div class="code"><br/>require &#039;highline/import&#039;<br/>def getpass(msg=&quot;Enter password:&quot;)<br/>&nbsp;&nbsp;ask(msg,String) &#123;&#124;p&#124; p.echo = false&#125;<br/>end<br/><br/>##Usage:<br/>while true<br/>&nbsp;&nbsp;printf &quot;please enter password: &quot;<br/>&nbsp;&nbsp;if (pass = getpass(&#039;&#039;)) !~ /^$/<br/>&nbsp;&nbsp;&nbsp;&nbsp;break<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;end<br/>end<br/>printf &quot;your password is: %s&quot;,pass<br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/pass/" rel="tag">pass</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/134.htm</link>
<title><![CDATA[ruby download progress 2]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Sat, 27 Jun 2009 00:50:09 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/134.htm</guid> 
<description>
<![CDATA[ 
	bjsh给我写了个python的，我看了下原理，又去看看了socket编程，自己用ruby写了个雏形，还有未考虑到的，以后完善<br/>用 socket ，比分片下载好很多<br/><br/><div class="code"><br/>#!/usr/bin/env ruby<br/>#<br/># ruby Download progress 2<br/># by:vkill&nbsp;&nbsp;&nbsp;&nbsp; last change:28/6/2009<br/># Usage: *.rb http://xxx.net/xxx.xxx<br/>#<br/>require &#039;socket&#039;<br/>require &#039;uri&#039;<br/><br/>RECV_DATA_LEN = 1024<br/>have_read = 0<br/>url = ($*&#91;0&#93;&#124;&#124;&quot;http://avira.vkill.net/upd/vdf/antivir3.vdf.gz&quot;)<br/><br/>u = URI.parse(url)<br/>fileName = File.basename(u.path)<br/><br/>begin<br/>&nbsp;&nbsp;$s = TCPsocket.new(u.host,u.port)<br/>rescue<br/>&nbsp;&nbsp;puts &quot;create socket Err, #&#123;$!&#125;&quot;<br/>&nbsp;&nbsp;exit<br/>end<br/><br/>downing = Thread.new &#123;<br/>&nbsp;&nbsp;header = &#123;&quot;User-Agent&quot; =&gt; &quot;antivir-ruby&quot;&#125;<br/>&nbsp;&nbsp;req = &quot;GET &quot;+url+&quot; HTTP/1.0&#92;r&#92;n&quot;<br/>&nbsp;&nbsp;header.each do &#124;k,v&#124;<br/>&nbsp;&nbsp;&nbsp;&nbsp;req += k+&quot;:&quot;+v+&quot;&#92;r&#92;n&quot;<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;$s.write(req+&quot;&#92;r&#92;n&quot;)<br/>&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, #&#123;$!&#125;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;self.kill<br/>&nbsp;&nbsp;end<br/>&#125;<br/><br/>while downing.status == &quot;run&quot; or downing.status == &quot;sleep&quot; do<br/>&nbsp;&nbsp;#read header<br/>&nbsp;&nbsp;$s.recv(1024).each_line do &#124;d&#124;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if $dataStart<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have_read += d.length<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$f.write(d)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (/^HTTP&#92;//i =~ d) != nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$statu = d.split(&quot; &quot;)&#91;1&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not /^(200)$/ =~ $statu<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, statu #&#123;$statu&#125;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;downing.kill<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (/^Content-Length:&#91;&#92;t &#93;*&#91;&#92;d&#93;+&#91;&#92;r&#92;n&#93;*$/i =~ d) != nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$totalLength = d.gsub(/.*:&#91;&#92;t &#93;*/,&quot;&quot;).to_i<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (/^&#91;&#92;r&#92;n&#93;*$/ =~ d) != nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dataStart = true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$f = File.new(fileName, &quot;wb+&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;if not $dataStart<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, parser httpHeader error&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;downing.kill<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;$totalLength &#124;&#124;= 1<br/><br/>&nbsp;&nbsp;#read data<br/>&nbsp;&nbsp;while true<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rdowning #&#123;fileName&#125;...&#91;#&#123;$totalLength&#125;bytes&#93; #&#123;(have_read*100) / $totalLength&#125;%&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp = $s.recv(RECV_DATA_LEN)<br/>&nbsp;&nbsp;&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, #&#123;$!&#125;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;downing.kill<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if resp == &quot;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rdowning #&#123;fileName&#125;...&#91;#&#123;$totalLength&#125;bytes&#93; 100%&#92;n&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;have_read += resp.length<br/>&nbsp;&nbsp;&nbsp;&nbsp;$f.write(resp)<br/>&nbsp;&nbsp;end<br/>end<br/><br/>$f.close()<br/><br/>case downing.status<br/>&nbsp;&nbsp;when false<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing normally quit&quot;<br/>&nbsp;&nbsp;when nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing unnormally quit&quot;<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing nuknow quit&quot;<br/>end<br/></div><br/><br/><br/>bjsh写的python的<br/><div class="code"><br/>import socket<br/><br/>READ_ONCE_SIZE = 512<br/>have_read = 0<br/><br/>fd = open(&quot;c:&#92;&#92;test.rar&quot;, &quot;wb&quot;)<br/><br/>s = socket.socket()<br/>s.connect((&quot;blog.vkill.net&quot;, 80))<br/>s.sendall(&quot;GET http://blog.vkill.net/attachment/1221875343_6600827a.rar HTTP/1.0&#92;n&#92;n&quot;)<br/><br/><br/>content = s.recv(READ_ONCE_SIZE)<br/><br/>while True:<br/>&nbsp;&nbsp;&nbsp;&nbsp;start = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;start = content.find(&#039;&#92;n&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;if content&#91;start+1&#93; == &#039;&#92;n&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content = content&#91;start+2:&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if content&#91;start+1&#93; == &#039;&#92;r&#039; and content&#91;start+2&#93; == &#039;&#92;n&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content = content&#91;start+3:&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if content.startswith(&quot;Content-Length&quot;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalLength = int(content&#91;:start&#93;.split()&#91;1&#93;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;content = content&#91;start+1:&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>have_read += len(content)<br/><br/>fd.write(content)<br/><br/>while True:<br/>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;&#92;rtest.rar.....%d&#92;t&#92;t%5d%%&quot; % (totalLength, have_read*100/totalLength),<br/>&nbsp;&nbsp;&nbsp;&nbsp;content = s.recv(READ_ONCE_SIZE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;if not content:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;&#92;rtest.rar.....%d&#92;t&#92;t%5d%%&#92;n&quot; % (totalLength, 100),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br/>&nbsp;&nbsp;&nbsp;&nbsp;fd.write(content)<br/>&nbsp;&nbsp;&nbsp;&nbsp;have_read += len(content)<br/><br/>fd.close()<br/><br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a> , <a href="http://blog.vkill.net/go.php/tags/socket/" rel="tag">socket</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/133.htm</link>
<title><![CDATA[ruby download progress]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Tue, 23 Jun 2009 01:29:03 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/133.htm</guid> 
<description>
<![CDATA[ 
	采用的是分片下载，应该有更好的方法，不过大概原理都是一样的<br/><br/><div class="code"><br/>#!/usr/bin/env ruby<br/>#<br/># ruby Download progress<br/># by:vkill 23/6/2009<br/>#<br/>require &#039;net/http&#039;<br/>require &#039;uri&#039;<br/><br/>url = &quot;http://127.0.0.1/upd/vdf/antivir3.vdf.gz&quot;<br/>u = URI.parse(url)<br/>fileName = File.basename(u.path)<br/>http = Net::HTTP.new(u.host,u.port)<br/>req = Net::HTTP::Head.new(u.path)<br/>resp = http.request(req)<br/>totalLenght = resp&#91;&quot;Content-Length&quot;&#93;.to_i<br/>partLenght = 20480<br/><br/>if totalLenght &gt; 10240000<br/>&nbsp;&nbsp;puts &quot;request downing file size GTR 10M, program quit!!!&quot;<br/>&nbsp;&nbsp;exit<br/>end<br/><br/>downing = Thread.new &#123;<br/>&nbsp;&nbsp;$transLenght = 0<br/>&nbsp;&nbsp;$data = &quot;&quot;<br/>&nbsp;&nbsp;while $transLenght &lt;= totalLenght do<br/>&nbsp;&nbsp;&nbsp;&nbsp;lenghts = $transLenght<br/>&nbsp;&nbsp;&nbsp;&nbsp;lenghte = $transLenght + partLenght - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;lenghte = totalLenght if lenghte &gt; totalLenght<br/>&nbsp;&nbsp;&nbsp;&nbsp;header = &#123;&quot;Range&quot; =&gt; &quot;bytes=#&#123;lenghts&#125;-#&#123;lenghte&#125;&quot;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;req = Net::HTTP::Get.new(u.path,header)<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (resp = http.request(req) rescue false) == false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.kill<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$transLenght += partLenght<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = $data.concat(resp.body)<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/>&#125;<br/><br/>while downing.status == &quot;run&quot; or downing.status == &quot;sleep&quot; do<br/>&nbsp;&nbsp;printf &quot;&#92;rdowning #&#123;fileName&#125;...&#91;#&#123;totalLenght&#125;bytes&#93; #&#123;$transLenght/(totalLenght/100)&#125;%&quot;<br/>&nbsp;&nbsp;sleep 0.5<br/>end<br/><br/>if totalLenght == $data.size<br/>&nbsp;&nbsp;printf &quot;&#92;rdowning #&#123;fileName&#125;...&#91;#&#123;totalLenght&#125;bytes&#93; 100%&#92;n&quot;<br/>&nbsp;&nbsp;f = File.new(fileName,&quot;wb+&quot;)<br/>&nbsp;&nbsp;f &lt;&lt; $data<br/>&nbsp;&nbsp;f.flush<br/>&nbsp;&nbsp;f.close<br/>else<br/>&nbsp;&nbsp;printf &quot;...Err&#92;n&quot;<br/>end<br/><br/>case downing.status<br/>&nbsp;&nbsp;when false<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing normally quit&quot;<br/>&nbsp;&nbsp;when nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing unnormally quit&quot;<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing nuknow quit&quot;<br/>end<br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a> , <a href="http://blog.vkill.net/go.php/tags/socket/" rel="tag">socket</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/132.htm</link>
<title><![CDATA[局域网架设Avira Antivir v8/v9升级服务器 镜像脚本 ruby-MAAUS_v1.1]]></title> 
<author>vkill &lt;admin@yourname.com&gt;</author>
<category><![CDATA[ruby &amp; ROR]]></category>
<pubDate>Sat, 20 Jun 2009 11:22:42 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/132.htm</guid> 
<description>
<![CDATA[ 
	<span style="color: #DC143C;">此代码仅做学习和研究，如造成任何对红伞公司的损失，本人不负责任</span><br/>请多提意见，我好修复完善<br/>关于脚本实现的原理参见 http://blog.vkill.net/read.php/65.htm 这个帖子里面的cmd脚本<br/><br/>v1.1 (20091212)<br/>修正了v9使用新病毒库后无法读取病毒库版本号的问题<br/>配置文件中使用了最新的官方地址（由晓月提供）<br/><a href="http://blog.vkill.net/attachment/ruby-MAAUS_v1.1.7z">Click to download</a><br/><br/>v1.0 (20090702)<br/>修正因下载idx后读取idx最后更新时间出错导致错误<br/><br/>v0.9 (20090701)<br/>加入镜像时使用代理的功能，主要是不用代理连接德国的时候下载老是会超时，如 proxy_addr 值为空的话将使用 http_proxy 变量的设置<br/>加入是否更新antispam.info可设置的功能，因为v8/v9 s的这个特有更新 有些源是不提供的<br/>加入是否更新v7.info可设置的功能，因为个人架设的话是不非要支持v7的<br/>修改 代理如连接失败就退出 为 代理如连接失败则不使用代理<br/><br/>v0.8 (20090630)<br/>经过多次测试，发现当 $RECV_DATA_LEN 设置为1024的时候，连接德国服务器下载老是超时的问题，我修改为5120后正常，所以把这个变量设置放到了配置文件中，这样方便些<br/>增加了 create socket 时的超时处理<br/>把timeout sec的值也放到了配置文件中<br/><br/>v0.7 (20090628)<br/>进一步对timeout做了处理<br/><br/>v0.6 (20090628)<br/>对日志文件文件名做了分类，这样就很直观的可以看出是更新日志还是检查文件md5日志<br/>修正了下载文件时如连接意外关闭时的报错<br/><br/>v0.5 (20090627)<br/>增加下载时显示进度的功能<br/>下载超时的问题应该也解决了，没有条件测试超时<br/><br/>v0.4 (20090622)<br/>增加下载并修改广告，使v8f、v7c可以显示自己的广告，新的广告定义在 v7v8AdNewPage 中<br/>增加命令行执行 ruby-MAAUS.rb checkgzsum 可以直接效验所有gzmd5是否正确<br/>修正了分析info文件时出现分析出的文件少了很多的问题，原因是def createFileList()中 each 那段里面错误的用了break，换为next后正确<br/>修正了v9读取病毒库版本时出错的问题，v9和v8的 vdf.info不同，前面版本是按相同处理的，所以出错了<br/>对idx做了一些注释，方便以后查证<br/><br/>0.3 2009-6-21<br/>修改了读取vdf version的方式，改为直接从info中读取，这样避免了0.2中出现的 Zlib::BufError 错误<br/>因0.2没有在别的机子上试验，发现缺少iconv.dll和zlib1.dll是不能运行的，故把这两个文件一起打包<br/><br/>0.2 2009-6-21<br/>修改了日志记录方式，使日志更容易看懂<br/>增加更新完引擎和病毒库后读取引擎和病毒库版本并写入到xml<br/>修复下载文件后验证gzmd5失败后还继续的问题，问题出在少写了个return<br/><br/>0.1 2009-6-20<br/>基于p-AviraAntiVirupdateV_v3.8修改而来，只是完全用ruby实现的<br/>增加下载文件后即刻效验此文件 gzmd5<br/>修改为可自定义同时更新引擎病毒库、单版本的组件<br/>增加下载完idx文件后检查官方idx是否有更新才继续更新的功能，这功能默认是启用的，如想屏蔽这个功能请修改配置文件中compelUpd 值为 1<br/>增加记录更新日志的功能，便于以后检查更新记录<br/><br/><br/><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%2591%25BD%25E4%25BB%25A4%25E8%25A1%258C/" rel="tag">命令行</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25B7%25A5%25E5%2585%25B7/" rel="tag">工具</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/avira/" rel="tag">avira</a> , <a href="http://blog.vkill.net/go.php/tags/ngnix/" rel="tag">ngnix</a>
]]>
</description>
</item>
</channel>
</rss>