﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客- 驭风万里无垠-随笔分类-Misc</title><link>http://www.cppblog.com/skyscribe/category/11102.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 12 Mar 2012 04:54:21 GMT</lastBuildDate><pubDate>Mon, 12 Mar 2012 04:54:21 GMT</pubDate><ttl>60</ttl><item><title>转移到github</title><link>http://www.cppblog.com/skyscribe/archive/2012/02/29/move-to-octopress.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Wed, 29 Feb 2012 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2012/02/29/move-to-octopress.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/166817.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2012/02/29/move-to-octopress.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/166817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/166817.html</trackback:ping><description><![CDATA[接触了octopress之后，才发现真的是神器；用vim写东西然后rake generate;rake deploy;的方式就是好啊。<br />
<br />
感兴趣的请移步:
<a target="_blank" href="http://skyscribe.github.com">http://skyscribe.github.com</a>
<img src ="http://www.cppblog.com/skyscribe/aggbug/166817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2012-02-29 22:52 <a href="http://www.cppblog.com/skyscribe/archive/2012/02/29/move-to-octopress.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby学习笔记《二》</title><link>http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-1.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sun, 19 Feb 2012 11:29:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-1.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/165993.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/165993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/165993.html</trackback:ping><description><![CDATA[ruby的blocks和closure特性明显有别于其它的语言，其closure本身是real closure，所绑定的context是共享的而非copy，其设计思路和lisp的相同；blocks本身则可以用于实现closure。二者的关系如下所述 （<a href="http://www.artima.com/intv/closures2.html">来源</a>）<br />
<blockquote><br />
<div><strong>Yukihiro Matsumoto</strong>: You can reconvert a closure back into a block, so a closure can be used anywhere a block can be used. Often, closures are used to store the status of a block into an instance variable, because once you convert a block into a closure, it is an object that can by referenced by a variable. And of course closures can be used like they are used in other languages, such as passing around the object to customize behavior of methods. If you want to pass some code to customize a method, you can of course just pass a block. But if you want to pass the same code to more than two methods -- this is a very rare case, but if you really want to do that -- you can convert the block into a closure, and pass that same closure object to multiple methods.<br />
</div>
</blockquote>
<div>
<ul>
     <li>
     <h2>7种结构</h2>
     </li>
</ul>
<blockquote>
<ul>
     <li>block方式3种</li>
</ul>
<blockquote>
<ul>
     <li>隐式传入，内部用yield调用</li>
</ul>
<blockquote>&nbsp;&nbsp;
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;thrice<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">yield</span><span style="color: #000000; "><br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">yield</span><span style="color: #000000; "><br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">yield</span><span style="color: #000000; "><br />
end<br />
<br />
x</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br />
thrice&nbsp;{x</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">}</span></div>
<span style="color: #000000; "></span></div>
</blockquote>
<ul>
     <li>&amp;block参数传入，内部直接操作&amp;block</li>
</ul>
<blockquote>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;six_times(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">block)<br />
&nbsp;&nbsp;thrice(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">block)<br />
&nbsp;&nbsp;thrice(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">block)<br />
end<br />
&nbsp;<br />
x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; "><br />
six_times&nbsp;{&nbsp;x&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;}</span></div>
</blockquote>
<ul>
     <li>&amp;block传入，保存block为变量，然后调用block.call</li>
</ul>
<blockquote>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;save_for_later(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">b)<br />
&nbsp;&nbsp;@saved&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;b&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Note:&nbsp;no&nbsp;ampersand!&nbsp;This&nbsp;turns&nbsp;a&nbsp;block&nbsp;into&nbsp;a&nbsp;closure&nbsp;of&nbsp;sorts.</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">end<br />
&nbsp;<br />
save_for_later&nbsp;{&nbsp;puts&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Hello!</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;}<br />
puts&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Deferred&nbsp;execution&nbsp;of&nbsp;a&nbsp;block:</span><span style="color: #800000; ">"</span><span style="color: #000000;"><br />
@saved.call<br />
@saved.call<br />
</span></div>
</blockquote><blockquote>这里的saved保存为main对象的一个成员，后边实现延迟调用。<br />
</blockquote></blockquote>
<ul>
     <li>Proc.new/proc</li>
</ul>
<blockquote>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">@saved_proc_new&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Proc.new&nbsp;{&nbsp;puts&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">I'm&nbsp;declared&nbsp;with&nbsp;Proc.new.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;}<br />
@saved_proc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;proc&nbsp;{&nbsp;puts&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">I'm&nbsp;declared&nbsp;with&nbsp;proc.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;}<br />
<br />
@saved_proc_new.call<br />
@saved_proc.call</span></div>
</blockquote>
<ul>
     <li>lambda</li>
</ul>
<blockquote>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">@saved_lambda&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">lambda</span><span style="color: #000000; ">&nbsp;{&nbsp;puts&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">I'm&nbsp;declared&nbsp;with&nbsp;lambda.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;}<br />
@saved_lambda.call</span></div>
</blockquote>
<ul>
     <li>method</li>
</ul>
<blockquote>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;some_method<br />
&nbsp;&nbsp;puts&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">I'm&nbsp;declared&nbsp;as&nbsp;a&nbsp;method.</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br />
end<br />
@method_as_closure&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000;">&nbsp;method(:some_method)<br />
<br />
</span></div>
</blockquote></blockquote>
<ul>
     <li>
     <h2>特点和差异</h2>
     </li>
     <ul>
         <li>
         <h2>return行为</h2>
         </li>
     </ul>
</ul>
<blockquote><blockquote>当对应的block里边包含return的时候，上述7中方式有些许的不同：<br />
<ul>
     <li>lambda/method表现出真正的closure行为，仅仅返回closure本身；外部调用控制流不受影响，继续yield或者call的下一语句执行</li>
     <li>其它几种会跳出外部调用者的控制流，即return出调用者，yield/call之后的也不会再执行，直接跳出到最近的end外</li>
</ul>
<p><br />
</p>
</blockquote>
<ul>
     <li>
     <h3>arity - 参数个数校验</h3>
     </li>
</ul>
<blockquote>对于调用点的参数检查，呈现如下行为：<br />
<ul>
     <li>lambda/method严格校验参数的个数，如果不匹配回抛出异常</li>
     <li>其它几个不检查参数个数</li>
</ul>
<p><br />
</p>
</blockquote></blockquote>
<ul>
     <li>
     <h2>总结</h2>
     </li>
</ul>
<blockquote>lambda/method方式呈现完备的closure行为，return之后继续下一流程，对于实际传入参数个数会在调用点检查；proc/blocks方式在return的时候直接返回了外部的函数或者block，对于传入的参数个数也没有执行检查。<br />
<br />
</blockquote>参考：<a href="http://innig.net/software/ruby/closures-in-ruby">http://innig.net/software/ruby/closures-in-ruby</a>
<br />以上结论验证于最新的ruby1.9.3，和链接中的结论有些许不同；ruby1.8中的proc函数可能有不同的行为。<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;"></span></div>
</div><img src ="http://www.cppblog.com/skyscribe/aggbug/165993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2012-02-19 19:29 <a href="http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby学习笔记《一》</title><link>http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-0.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sun, 19 Feb 2012 07:58:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-0.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/165976.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-0.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/165976.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/165976.html</trackback:ping><description><![CDATA[看得再多也不如自己动手试，最近有闲就打算认真研究一下ruby语言了。<a href="http://pragprog.com/the-pragmatic-programmer">Pragmatic programmer</a>中说，需要一年学一门新语言一遍改造思想，去年浅浅的学了javascript的皮毛，今年可以看看ruby这
个有lisp之风的OO语言了。<br />
<br />
<ul>
     <li>安装环境</li>
</ul>
第一个想到的是apt-get来下载了，得到的是一个交互式解析器和编译器。和python的比较类似，不过ruby的交互程序是个单独的程序叫做irb。<br />
<blockquote>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">skyscribe:</span><span style="color: #000000; ">~</span><span style="color: #000000; ">$&nbsp;ruby&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">version<br />
ruby&nbsp;</span><span style="color: #000000; ">1.8</span><span style="color: #000000; ">.</span><span style="color: #000000; ">7</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">2011</span><span style="color: #000000; ">-</span><span style="color: #000000; ">06</span><span style="color: #000000; ">-</span><span style="color: #000000; ">30</span><span style="color: #000000; ">&nbsp;patchlevel&nbsp;</span><span style="color: #000000; ">352</span><span style="color: #000000; ">)&nbsp;[i686</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linux]<br />
skyscribe:</span><span style="color: #000000; ">~</span><span style="color: #000000; ">$&nbsp;irb<br />
irb(main):</span><span style="color: #000000; ">001</span><span style="color: #000000; ">:</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;puts&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />
hello<br />
</span><span style="color: #000000; ">=&gt;</span><span style="color: #000000;">&nbsp;nil<br />
<br />
</span></div>
</blockquote>可惜得到的不是比较新的版本。<br />
<br />
不
过很快想起翻翻<a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29">
wiki</a>，还是用rvm方便的多。教程比较简单，参考它的<a href="http://beginrescueend.com/">quick installation guide</a>就可。第一次尝试的时候用apt-get安装了没有purge，导致总是安装到root用户造
成&#8220;permission denied"的问题。<br />
<br />
安装好之后，所有的东西都在$HOME/.rvm下边，比较干脆。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
</span><blockquote><span style="color: #000000; ">skyscribe:</span><span style="color: #000000; ">~</span><span style="color: #000000; ">$&nbsp;rvm&nbsp;install&nbsp;</span><span style="color: #000000; ">1.9</span><span style="color: #000000; ">.</span><span style="color: #000000; ">3</span><span style="color: #000000;"></span><br />
<span style="color: #000000; ">skyscribe:</span><span style="color: #000000; ">~</span><span style="color: #000000;">$&nbsp;rvm&nbsp;list</span><br />
<span style="color: #000000;"></span><br />
<span style="color: #000000;">rvm&nbsp;rubies</span><br />
<span style="color: #000000;"></span><br />
<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;ruby</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1.9</span><span style="color: #000000; ">.</span><span style="color: #000000; ">3</span><span style="color: #000000; ">-</span><span style="color: #000000;">p125&nbsp;[&nbsp;i686&nbsp;]</span><br />
<span style="color: #000000;"></span><br />
<span style="color: #000000; ">#&nbsp;Default&nbsp;ruby&nbsp;not&nbsp;</span><span style="color: #0000FF; ">set</span><span style="color: #000000; ">.&nbsp;Try&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">rvm&nbsp;alias&nbsp;create&nbsp;default&nbsp;&lt;ruby&gt;</span><span style="color: #000000; ">'</span><span style="color: #000000;">.</span><br />
<span style="color: #000000;"></span><br />
<span style="color: #000000; ">#&nbsp;</span><span style="color: #000000; ">=&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000;">&nbsp;current</span><br />
<span style="color: #000000; ">#&nbsp;</span><span style="color: #000000; ">=*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;current&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000;"></span><br />
<span style="color: #000000; ">#&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000;"></span><br />
<span style="color: #000000;"></span><br />
<span style="color: #000000; ">skyscribe:</span><span style="color: #000000; ">~</span><span style="color: #000000; ">$&nbsp;rvm&nbsp;alias&nbsp;create&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;ruby</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1.9</span><span style="color: #000000; ">.</span><span style="color: #000000; ">3</span><span style="color: #000000; ">-</span><span style="color: #000000;">p125</span><br />
<span style="color: #000000; ">Creating&nbsp;alias&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;ruby</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1.9</span><span style="color: #000000; ">.</span><span style="color: #000000; ">3</span><span style="color: #000000; ">-</span><span style="color: #000000;">p125.</span><br />
<span style="color: #000000; ">Recording&nbsp;alias&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;ruby</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1.9</span><span style="color: #000000; ">.</span><span style="color: #000000; ">3</span><span style="color: #000000; ">-</span><span style="color: #000000;">p125.</span><br />
<span style="color: #000000; ">Creating&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;links</span><span style="color: #000000; ">/</span><span style="color: #000000;">files</span><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "></span><span style="color: #000000; "><div>skyscribe:~$ cat &gt;&gt; ~/.bashrc <br />[[ -s "$HOME/.rvm/scripts/rvm" ]] &amp;&amp; . "$HOME/.rvm/scripts/rvm" # This loads RVM into a shell session.<br />^C<br />skyscribe:~$ bash<br />skyscribe:~$ rvm use 1.9.3<br />Using /home/skyscribe/.rvm/gems/ruby-1.9.3-p125<br />skyscribe:~$ ruby -v<br />ruby 1.9.3p125 (2012-02-16 revision 34643) [i686-linux]</div></span></div><br />
<span style="color: #000000; "></span></blockquote></div>
<br />
<ul>
     <li>熟悉和上手</li>
</ul>
官方的文档是最好的参考，推荐<a href="http://rubykoans.com/">ruby koans</a>,下载下来，解压后，是个典型的TDD学习材料，不断运行<br />
<blockquote>
<div>
<div>&nbsp;ruby path_to_enlightenment.rb</div></div></blockquote><div><div>koans 会遍历每一个test case直到全部完毕，大概需要2个小时以上的时间方可全部完工。中间的注释和THINK ABOUT的部分比较有意思，感悟比较深刻的是以下一些点：<br /><blockquote><ul><li>完完全全的OO，所有东西皆为对象</li><li>两种基本的collection，hash和array基本对应于python的dict和array</li><li>函数调用可以不必添加括号，除非可能引发歧义或者解析错误</li><li>函数参数可以包含block，支持lambda和closure<br /></li><li>bool类型更简单，只有false和nil与false等价，其余全部是true</li><li>控制结构有unless</li><li>类定义是开放式的，便于非侵入式设计，当然也可以允许修改builtin</li><li>每一个对象都有object id</li><li>symbol和string可以互相转化构造</li><li>method的调用可以用send 的方法发送message - proxy变得极度容易</li><li>module可以被class include从而包含方法， 便于mixin设计</li><li>instance variable和class variable 定义方便快捷</li><li>regular expresion的和python极为相似<br /></li></ul></blockquote></div></div><blockquote><div>
</div>
</blockquote><img src ="http://www.cppblog.com/skyscribe/aggbug/165976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2012-02-19 15:58 <a href="http://www.cppblog.com/skyscribe/archive/2012/02/19/ruby-study-0.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unix文本处理之利器－awk/gawk</title><link>http://www.cppblog.com/skyscribe/archive/2011/01/02/awk.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sun, 02 Jan 2011 12:32:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2011/01/02/awk.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/137894.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2011/01/02/awk.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/137894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/137894.html</trackback:ping><description><![CDATA[日常在shell中使用awk基本是家常便饭了，但是详细的写一些小程序还是第一次，总体是下来，还是深深得被这门年龄比自己都要大的工具语言的魅力所折服（<a  href="http://groups.engin.umd.umich.edu/CIS/course.des/cis400/awk/awk.html#history">since 1977</a>）。作者中最引人注目的当属鼎鼎大名的<a  href="https://secure.wikimedia.org/wikipedia/en/wiki/Brian_Kernighan">Brian W. Kernighan</a> (即K的简称来源）。目前所用的版本大多是gawk或者nawk.<br><br>作为一门微型且完整的编程语言，awk可以用数行代码就完成其他语言需要数倍的LOC才能完成的工作。其设计哲学也是比较特殊的，核心是data－driven的，并且采用了和C类似的语法来组织。它最核心的思想应该是如下两点：<br>
<ul>
    <li>pattern-action 结构 借由强大的正则表达式来匹配pattern，然后执行pattern对应的操作</li>
    <li>Record/Field 处理模型&nbsp; 所有的输入数据都根据制定的record separator 分割成 record, 然后没一个record再根据field separator 分割为fields. POSIX 定义的 field separator可以为正则表达式，而gawk可以允许record separator同时为正则表达式</li>
</ul>
引发我花点时间来仔细研究awk的起因是这样的，我们的程序在做profiling的时候，发现原来用shell写的脚本分析一次话费的时间太长。初看了下那个脚本，大概的逻辑是要扫名所有的log文件，按照时间戳将关注的时间所耗费的时间提取出来，计算平均值，波动等最终画出曲线图。<br><br>整体的脚本有几个部分（python＋bash），处理一次40MB的log文件需要耗费40分钟～1个小时，这显然超出了预期；中间一个处理很长的部分是grep某个时间段的信息然后按照报表格式写入到中间文件中。在想能否优化这一节的时候，忽然就想起了模式匹配来（学习Haskell的最深印象），于是大致翻了一下awk，发现很容易通过模式匹配使得按行处理，同时记录中间的信息，而一个时间段恰好和awk的record概念吻合。<br><br>花了2个小时研读了下awk的函数语法，自定义自己的时间截取函数（gawk的strftime很有用，尤其我们发现记录有跳跃要自动补全中间的数据记录时），通过三个pattern截取需要的信息，30分钟写出来awk的代码来。<br><br>所幸的是，其它的shell脚本都不需要任何改动，重新跑一次，3s就处理完了原来40MB的文件，看来这点时间投入还是相当值得的。<br><br>有兴趣的可参考：<br>&nbsp;&nbsp;&nbsp;&nbsp; <a  href="http://www.gnu.org/manual/gawk/gawk.html">http://www.gnu.org/manual/gawk/gawk.html</a><br><br>PS：awk的另一作者<a  href="https://secure.wikimedia.org/wikipedia/en/wiki/Peter_J._Weinberger">Winberger</a> 供职于google。<br>&nbsp;<br><br><img src ="http://www.cppblog.com/skyscribe/aggbug/137894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2011-01-02 20:32 <a href="http://www.cppblog.com/skyscribe/archive/2011/01/02/awk.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Popen中奇怪的OSError：too many open files</title><link>http://www.cppblog.com/skyscribe/archive/2009/10/19/98970.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Mon, 19 Oct 2009 11:31:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/10/19/98970.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/98970.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/10/19/98970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/98970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/98970.html</trackback:ping><description><![CDATA[<p><font face="微软雅黑" size="3">近来用Python的unittest框架来做一个regression test 工具，验证一些复杂的程序功能，期望做到自动化测试完成一部分需要繁琐的界面点击和等待才能完成的验证工作。</font></p>
<p><font face="微软雅黑" size="3">其中核心的部分是通过python的subproces module中的Popen来调用shell脚步完成功能性请求，并抓取执行的结果。</font></p>
<p><font face="微软雅黑" size="3"></font>&nbsp;</p>
<p><font face="微软雅黑" size="3">初一开始，test case比较少的时候（100个以内）都没有任何问题；但从某一刻起，当超过120个的时候，最后一个test case执行的时候，总是报告</font></p>
<p><font face="微软雅黑" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>OSError： too many open files</strong></font></p>
<p><font face="微软雅黑" size="3">给出的stack trace指向了Popen的communicate方法。</font></p>
<p><font face="微软雅黑" size="3"></font>&nbsp;</p>
<p><font face="微软雅黑" size="3">最简单的怀疑自然是打开文件数的限制了， ulimit&nbsp; -a 发现默认的Shell的确只有256，虽然感觉应该也够用了（因为每一个case都是用单独的Popen来执行操作,完毕就应该被回收了），但还是自然将其开大一些； </font></p>
<p><font face="微软雅黑" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#800080">ulimit &#8211;n 1024 </font></font></p>
<p><font face="微软雅黑" size="3">重新执行，还是最后一个case失败，错误依然。</font></p>
<p><font face="微软雅黑" size="3"></font>&nbsp;</p>
<p><font face="微软雅黑" size="3">Google了一下，暂时没有头绪，只有待有时间再详细盘查一下原委了。不过在搜索答案的过程中发现了一个有意思的现象：</font></p>
<p><font face="微软雅黑" size="3">&nbsp;&nbsp; 有人在询问怎样将python的字符串quote成为一个可以再shell中安全使用的字符串，就有人回复说Subprocess中有一个类似的方法可以完成类似的工作为什么不用；马上有牛人站出来说，这个模块的作者大概不想维护过多的东西，因而将其隐藏了起来，而不是放开了给大家用，因为它的doc里边都没有直接说明，用的人是看了他的代码才知道有这个函数（参考</font><a href="http://code.activestate.com/recipes/498202/"><font face="微软雅黑" size="3">这里</font></a><font face="微软雅黑" size="3">）</font></p><img src ="http://www.cppblog.com/skyscribe/aggbug/98970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-10-19 19:31 <a href="http://www.cppblog.com/skyscribe/archive/2009/10/19/98970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用wireshark+scripts实现有趣的加密包解码</title><link>http://www.cppblog.com/skyscribe/archive/2009/07/27/91394.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Mon, 27 Jul 2009 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/07/27/91394.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/91394.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/07/27/91394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/91394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/91394.html</trackback:ping><description><![CDATA[出于安全性的考虑，很多网络应用可能用比较强的安全算法加密传输的数据，从而导致抓包这一强大的网络分析工具成为鸡肋，SNMP v3就是这么个例子。<br>Wireshark自带有配置usmUser的例子，可以自动调用netsnmp的库来完成揭秘，但对于Unix程序而言，GUI的工具本身还是有诸多不便，没有CLI工具来的舒服自然，另外的一个问题是，通过自己配置usmUser，似乎一直无法成功解码。<br><br>翻看Wireshark的文档的时候，发现一个强大的小工具很适合配合脚本发挥威力：tshark；想到Python，马上实现了一个不错的小工具。<br><br>tshark本身可以支持很多选项，几乎涵盖了wireshark大部分常用功能，个人发现特别适合二次分析。这里最关键的是 -T pdml选项,<br>&nbsp;可以生成一个完整的xml格式的分析报告。<br><br>假设实现用tcpdump或者snoop抓取了一个加密的包test.pcap,那么接下来，可以用其作二次分析：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">snoop -d &lt;dev&gt; -o test.pcap &lt;filter&gt;<br>tshark&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r&nbsp;test.pcap&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">V&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">T&nbsp;pdml&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;test.xml</span></div>
<br>接下来可借助脚本的威力来解析这个xml文件了，python的xml.sax很适合干这个了，自己写一个ContentHandler， 将感兴趣的字段抓下来，存储在一个相关的结构里边。这里对于SNMP而言，只需要将对应的scopedPDU加密数据保存下来，同时保存其它必要的数据，放置于索引的dict中，便于下一步分析。<br><br>利用C/C++写一个小程序，接收加密参数、字段内容等参数完成实际解码工作，由于是API的简单调用和变换，所以比较简单；生成可执行文件即可。<br><br>最后，将上述通过python的 Popen建立I/O管道，将各个部分串联起来，并格式化每一步分析产生的输出结果，生成结果报告。<br><br>以上的方式可以不需要写dissector就完成自定义的报文分析，缺点是，运行效率比较低一些；优点也很明显，很容易定制和脚本自动化。<br>对于私有协议而言，上述方式也是一个不错的选择。<br><br><img src ="http://www.cppblog.com/skyscribe/aggbug/91394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-07-27 22:24 <a href="http://www.cppblog.com/skyscribe/archive/2009/07/27/91394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实用的流程图绘制工具：Diagram Designer</title><link>http://www.cppblog.com/skyscribe/archive/2009/07/06/89398.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Mon, 06 Jul 2009 12:34:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/07/06/89398.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/89398.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/07/06/89398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/89398.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/89398.html</trackback:ping><description><![CDATA[一直在留意好用的开源作图工具，可惜这年头很多是UML的，并且绑定与Eclipse的很多，可惜我需要的只是能够画基本的流程图，而且可以随意在矩形框之间加连接线，并且可以自动调整连接线的；最近突然发现了一款相当好用的开源工具，不仅小巧，而且速度快，自身相对独立，刚好合乎我的需要；也不需要蜗牛般的Java，真乃好东东。<br><br>下边是我做的图形：<br><br><img style="width: 644px; height: 951px;" alt="" src="http://www.cppblog.com/images/cppblog_com/skyscribe/USM_process_incoming_message.jpg"><br>表示复杂的结构也很是漂亮，而且最关键的一点是，可以直接拷贝到PPT里边做成presentation。<br>下边是另外一个图，类似于UML里边的Sequence Diagram，当时又不完全是，不过可以清晰的表达我的意思了。<br>曾经想用Netbeans的UML插件画出类似的图像，可惜想自己加个方框都不行，还是这个灵活：<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/skyscribe/USM_Discovery.jpg" height="768" width="768"><br>这个可爱的软件，简直可以和Visio媲美了，而且是开源免费的。<br>另外一个例子，作者提供的模板，也很漂亮，可以画电路硬件图的：<br><img style="width: 1025px; height: 725px;" alt="" src="http://www.cppblog.com/images/cppblog_com/skyscribe/demo.jpg"><br>还有一个UML的例子，看它的<a href="http://meesoft.logicnet.dk/DiagramDesigner/">官方网站</a>描述。<br><br>高级功能：自己定制模板，供以后使用。<br>可以导出为几种常见的图片格式，以它自己的格式(ddd后缀）最节省空间。<br><br>小缺点：折线箭头只能拐2个弯，因此不能一笔绘制回形箭头，需要手工拼接。<br>最强大的地方：属性可以自由修改，因此超级灵活。<br><br><br> <img src ="http://www.cppblog.com/skyscribe/aggbug/89398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-07-06 20:34 <a href="http://www.cppblog.com/skyscribe/archive/2009/07/06/89398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>