﻿<?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++博客-XGuru's Blog</title><link>http://www.cppblog.com/xguru/</link><description>技术，是一种态度。关注:高性能后端技术/服务器架构/C++/C/LAMP</description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 04:09:50 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 04:09:50 GMT</pubDate><ttl>60</ttl><item><title>[原创]Python基本对象学习笔记</title><link>http://www.cppblog.com/xguru/archive/2011/07/21/Python_object.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Thu, 21 Jul 2011 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2011/07/21/Python_object.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/151576.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2011/07/21/Python_object.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/151576.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/151576.html</trackback:ping><description><![CDATA[<div>最近重温《Python源码剖析》一书，将python基本对象的要点记录如下</div><div><pre><strong>python 整数对象</strong><br />1.python中的整数使用c语言中的long类型存储<br />2.python int进行加法会检查结果是否溢出，如果溢出则自动转换为pyLongObject对象<br />3.python中的文档无缝集成在语言实现中<br /></pre><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: #008080;">1</span>&nbsp;<span style="color: #000000;">a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;"><br /></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;a.</span><span style="color: #800080;">__doc__</span></div><pre><br />4.小整数对象完全缓存在内存中,其他整数对象轮流使用一块内存空间<br />5.小整数对象在python初始化中调用的_PyInt_Init中创建,然后就一直存在着， 直到python虚拟机退出</pre></div><br /><div><pre><strong>python String对象</strong><br />1.pyStringObject在创建之后，内部维护的字符串不能再改变 <br />2.intern机制是否只在字符数组长度0或者1的时候使用? 书中提供的代码太过于精简了，没讲清楚,但是看后面的演示结果，应该是所有的字符串都实现了intern机制<br />3.字符串连接操作严重影响python程序执行效率，使用join只需分配一次内存，能够大大提高效率.用法举例<br /></pre><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: #800000;">""</span><span style="color: #000000;">.join([</span><span style="color: #800000;">'</span><span style="color: #800000;">s1</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">s2</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">s3</span><span style="color: #800000;">'</span><span style="color: #000000;">])</span></div><pre><br /></pre></div><div><pre><strong>Python Dict对象</strong><br />1.Python中的dict采用hashtable而不是R-B Tree。<br />2.采用开放定址法解决冲突。<br />3.为保证冲突探测链的连续性，采用伪删除技术，active对象删除则设置为dummy态<br />4.为减少冲突，转载率大于2/3时则改变table的大小,每次增大4倍，如果table中的active态的元素个数大于50000时(巨型表)，<br />   则放慢增长速度，每次增长2倍。可以看出Python中dict的查找效率较高,而对于内存的使用是省了又省,还考虑了巨型表增长减少倍数。<br /><br /><div><pre><strong>Python List对象</strong><br />1.PyListObject类似STL中的Vector。<br />2.Python对内存的使用十分节俭，如果list改变的新尺寸不到分配内存的1/2，则收缩内存.<br />3.在Pylist中建插入元素需要逐个移动后面的元素，类似C中的数组，因此需要尽量避免对中间元素的插入和删除操作。<br />4.STL和PyListObject自动扩容算法对比:个人觉得list改名为array比较恰当一些，嘿嘿<br /></pre><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: #000000;">//</span><span style="color: #000000;">sgi&nbsp;STL:<br />len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(old_size&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;0&nbsp;)?</span><span style="color: #000000;">2</span><span style="color: #000000;">*</span><span style="color: #000000;">oldsize:</span><span style="color: #000000;">1</span><span style="color: #000000;"><br /></span><span style="color: #000000;">//</span><span style="color: #000000;">(不够用则扩充两倍,如果开始为空则设置为1)<br /></span><span style="color: #000000;">//</span><span style="color: #000000;">Python:<br />new_allocated</span><span style="color: #000000;">=</span><span style="color: #000000;">(newsize</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">3</span><span style="color: #000000;">)</span><span style="color: #000000;">+</span><span style="color: #000000;">(newsize</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">9</span><span style="color: #000000;">?</span><span style="color: #000000;">3</span><span style="color: #000000;">:</span><span style="color: #000000;">6</span><span style="color: #000000;">)<br /></span><span style="color: #000000;">//</span><span style="color: #000000;">（？？？）</span></div><pre>5.对于增长倍数的选择，这里有讨论<br /><a rel="nofollow" href="http://en.w3support.net/index.php?db=so&amp;id=1100311" target="_blank">http://en.w3support.net/index.php?db=so&amp;id=1100311</a><br /><br />p70书中笔误 :"allcated/2"应改为"allocated/2"<br /></pre></div><br /></pre></div><img src ="http://www.cppblog.com/xguru/aggbug/151576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2011-07-21 23:16 <a href="http://www.cppblog.com/xguru/archive/2011/07/21/Python_object.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[译文]VIM使用者大脑的形态</title><link>http://www.cppblog.com/xguru/archive/2010/12/22/vim_brain.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Wed, 22 Dec 2010 15:05:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/12/22/vim_brain.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/137236.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/12/22/vim_brain.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/137236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/137236.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="color: #020000; font-size: 12pt;"><span style="font-size: 10pt; color: #020000;">via :<a href="http://kevinw.github.com/2010/12/15/this-is-your-brain-on-vim/">Kevin Watters's blog</a><br></span></span><span style="color: #020000; font-size: 12pt;"></span><span style="color: #020000; font-size: 8pt;"></span>译：<a href="http://cppblog.com/xguru">XGuru</a><br><br style="font-weight: bold;"><span style="font-weight: bold; font-size: 18pt;">原始状态</span></span><br>&nbsp;&nbsp;&nbsp; <span style="font-size: 14pt;">我曾经观看过小提琴家非常有激情地拉弦演奏，我有了这种想法：也许我投入到文本编辑器中的脑细胞数量和他为投入所喜好的乐器的演奏中差不多吧。我还有种奇异的想象，当他独奏的时候,脑中的核磁共振图和我在使用VIM中操控代码的的图像也许不会相差太大吧？</span><br><br><br><a style="color: #020000; font-size: 8pt;" href="http://kevinw.github.com/2010/12/15/this-is-your-brain-on-vim/"><img alt="" src="http://www.cppblog.com/images/cppblog_com/xguru/vim_brain/brain_before.png" height="431" width="690"></a>
<br><br><br>&nbsp;&nbsp;&nbsp; <span style="font-size: 14pt;">如果你愿意的话请你仔细思考下，以下是一个vimmer的学习旅程的剪辑</span><br>
<h2><br></h2>
<br><br>
<h2 style="color: #020000;"><span style="font-size: 24pt;">Vim涅磐所经历的漫长而艰苦的道路</span></h2>
<h3><br><span style="font-size: 18pt;"></span></h3>
<h3><span style="font-size: 18pt;">星期一</span></h3>
&nbsp;&nbsp;&nbsp;<span style="font-size: 14pt;">
&#8220;Eclipse当然是简洁实用的&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;但是一些满脸落腮胡的奇怪家伙在工作中似乎使用vim确实非常快,我应该试一下。&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;好吧！我弄了个Gvim,这看起来不是很糟糕，这里甚至还有菜单界面！&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;等什么？我的文本去哪了？等一下，撤销，不要啊！&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;:help&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;:q!!!!!&#8221;<br><br>&nbsp;&nbsp;&nbsp; 今天剩下的时间还是回到拥有让人上瘾的自动补全样板功能的Eclipse中获得解脱吧<br></span><br><span style="font-size: 18pt;"><br>
<h3><span style="font-size: 18pt;">星期二</span></h3>
</span>
<h3></h3>
<span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp;&nbsp;
&#8220;好吧 vim,这是新的一天了，这是个磨砺自己学习新东西的一个崭新的机会，我不是那么容易放弃的人！&#8221;<br><br><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &#8220;为什么我就不能一直呆在插入模式里面呢</span>?FJDSAKLFJDALSKJKLDF（发狂的敲击键盘）&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;等一下，你在告诉我保存的时候必须按ESC-shift-冒号-w-回车?这简直就是狗屁啊&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;在花了2个小时学习教程以后，我基本上懂的就是ddp命令可以交换两行的内容,真是蛋疼啊&#8221;</span><br>
<h3><br></h3>
<br><br>
<h3><span style="font-size: 18pt;">一个礼拜以后</span></h3>
<span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp;&nbsp;
&#8220;哇噢，任何地方都有vim阿，这意味着这付出的所有的努力将不会白费，比如当我用ssh远程登入主机修改一些配置的时候&#8221;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; &#8220;太爽了，嘿，朋友们来看看这个全暗色的配色主题，我新的工具链表面上看起来非常安逸了&#8221;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; &#8220;噢，真是扯蛋，我的.vimrc没有在我的远程主机里，当我ssh登入编辑一些配置的时候，所有我的酷玩意都没了&#8221;</span><br><br><br><br>
<h3><span style="font-size: 18pt;">两个月以后</span></h3>
&nbsp;<span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp;
HJKL的移动方式习惯成自然，你神秘的失去了使用鼠标的能力。<br><br>&nbsp;&nbsp;&nbsp; &#8220;我将<span style="font-weight: bold;">始终</span>使用我刚下载的这400个插件！尤其是这个折叠latex语法的插件，噢，哥们&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;使用小箭头方向键简直是自我折磨阿&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;再见，Caps Lock键&#8221;<br><br>&nbsp;&nbsp;&nbsp; &#8220;就这样吧，这是忍耐的极限，vim甚至不能让文本合适的自动换行，我准备回到edit.com了&#8221;</span><br><br><br>
<h3><span style="font-size: 18pt;">一年后</span></h3>
&nbsp;&nbsp;&nbsp; <span style="font-size: 14pt;">更少的大声说话了。<br><br>&nbsp;&nbsp;&nbsp; 安装command-T插件，每天节约成百上千次的键盘敲击。<br><br>&nbsp;&nbsp;&nbsp; 用宏试着让你肩膀后的某个人感到印象深刻，通过在整个文件里混合大小写和参杂ROT13暗码（回转十三位加密）。<br><br>&nbsp;&nbsp;&nbsp; 最终在某个奇迹般的一天学会在肌肉记忆里用ctrl+[来延缓了腕关节炎症降临。<br><br>&nbsp;&nbsp;&nbsp; 学会了移动光标，使用visual模式和*键----这意味着已经没有退路了。<br><br>&nbsp;&nbsp;&nbsp; &#8220;vim不支持交互性缓存？都20年了？好吧，作为一名黑客，我决定给它添加这项支持。&#8221;<br><br>&nbsp;&nbsp;&nbsp; 查看vim代码库，疯狂地让它向相反的方向运行。<br><br>&nbsp;&nbsp;&nbsp; &#8220;谁无论如何也需要在编辑器里弄个控制台？我就是所有的unix哲学。&#8221;<br><br>&nbsp;&nbsp;&nbsp; 对周围的&#8221;vim只是将一个编辑模式合并到真正的编辑器中&#8220;观念感到无可忍耐。<br><br>&nbsp;&nbsp;&nbsp; 因为你老是在房间里令人讨厌地回复&#8221;:w&#8221;,IRC的朋友们最后将你孤立</span>。<br>
<h3><br><span style="font-size: 18pt;"></span></h3>
<h3><span style="font-size: 18pt;">两年以后</span></h3>
&nbsp;&nbsp;&nbsp; <span style="font-size: 14pt;">vim脚本就是一种对上帝的深恶痛绝。<br><br>&nbsp;&nbsp;&nbsp; 有点觉得emacs的从始至终的指令模式相对有点像在天堂一样。<br><br>&nbsp;&nbsp;&nbsp; 我昨晚做了一个噩梦，梦到我始终没有学会在宽屏显示器中垂直切分窗口，这样提心吊胆真是够混帐阿。<br><br>&nbsp;&nbsp;&nbsp; 偷偷地瞄一下周围，绑定ctrl+s到保存，允许自己悄悄地松一口气。<br><br>&nbsp;&nbsp;&nbsp; 意识到hjkl搜索定位不足以成为终极时间节约工具，发现:python脚本,所建立的大量定制功能达到鼎盛期，对&lt;Leader&gt;key绑定直到你的键盘类似于NASA指挥中心控制面板一样有点繁多到荒谬的功能感觉有一点糟糕。<br><br>&nbsp;&nbsp; &#8220;嘿，每个听的到我声音的家伙过来看看，我现在控制电脑，写博客，检查邮件，运行测试，调试程序，浏览黑客新闻<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有的一切都能在vim温暖舒适，超级可以定制化的母体中进行&#8221;<br><br>&nbsp;&nbsp;&nbsp; 为什么你这小子不做几个后空翻来庆祝一下呢？</span><br><br><br>
<h3><span style="font-size: 18pt;">模糊又很长某段时间之后</span><span style="font-size: 14pt; font-weight: bold;">
</span></h3>
&nbsp;&nbsp;&nbsp;<span style="font-size: 14pt;"> 在&#8220;文本编辑中模态的明显的优势&#8221;演讲结束后失去了几个朋友。<br><br><br>&nbsp;&nbsp;&nbsp; 尽情享受在github.com/me/vimfiles中分享自己配置的快乐中，有义务完成关于如何特立独行地安装语法检查，lint工具，自动补全，快速文档查看，成吨的杀手级缩写，世界上所有文件类型对应的插件，使vim在每种功能的高效性上接近真正的IDE的博客帖子。开机时间日志写入服务器，下意识地使用nano来编辑配置文件。不会为没有使用插件和vimrc中的更多语法而更新所有的配置文件而感到深深的羞愧。<br><br>&nbsp;&nbsp;&nbsp; 变得十分淡定，重复性的编辑任务再也难不住你，不再去参加emacs与vim谁好谁坏的争论</span>。<br><span style="font-size: 18pt;"><br>
<h2><span style="color: #020000;">...这就是你用vim时大脑的终级形态 <br></span></h2>
<br><br>
</span>
<h2><span style="color: #020000;"></span></h2>
<img alt="" src="http://www.cppblog.com/images/cppblog_com/xguru/vim_brain/brain_after.png">
<br><br><br>
<div style="text-align: center;">&nbsp;--EOF--<br></div>
<div style="text-align: center;"><img src="http://i.creativecommons.org/l/by-nc-sa/2.5/cn/88x31.png" alt="Creative commons license" height="31" width="88" border="0"><br></div>
by <a href="http://www.cppblog.com/xguru">XGuru</a>
is licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/">Creative
Commons 署名-非商业性使用-相同方式共享 2.5 中国大陆 License</a>.
<br><br>    <img src ="http://www.cppblog.com/xguru/aggbug/137236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-12-22 23:05 <a href="http://www.cppblog.com/xguru/archive/2010/12/22/vim_brain.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[分享]Git作弊手册图片一张</title><link>http://www.cppblog.com/xguru/archive/2010/12/01/135146.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Wed, 01 Dec 2010 03:54:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/12/01/135146.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/135146.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/12/01/135146.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/135146.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/135146.html</trackback:ping><description><![CDATA[via:git.or.cz<br><br><img style="width: 996px; height: 770px;" alt="" src="http://www.cppblog.com/images/cppblog_com/xguru/git-cheat-sheet-medium.png" border="0"><br> <img src ="http://www.cppblog.com/xguru/aggbug/135146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-12-01 11:54 <a href="http://www.cppblog.com/xguru/archive/2010/12/01/135146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[随笔]看看今年程序员们解决问题的顺序</title><link>http://www.cppblog.com/xguru/archive/2010/10/24/131044.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Sun, 24 Oct 2010 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/10/24/131044.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/131044.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/10/24/131044.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/131044.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/131044.html</trackback:ping><description><![CDATA[<p>2010 developer&#8217;s problem solving sequence:</p>
<p>from:<a class="tweet-user-block-screen-name user-profile-link" href="http://twitter.com/#%21/activa" title="Philippe Leybaert">@activa</a>&nbsp;</p>
<p><br></p>
<span style="color: #5138ff; font-size: 24pt;">1.Google </span><br>&nbsp;&nbsp;&nbsp; 技术上的问题多去google，wikipedia上看看绝对没错，想看性用品广告就多上上Baidu。<br><br><span style="color: #5138ff; font-size: 24pt;">2.Coworkers </span><br>&nbsp;&nbsp;&nbsp; 找同事帮忙，如果你的同事热心肠而且技术不错，而且遇到过类似的问题，他的建议就会很显得非常宝贵,也许就能一针见效。<br><br><span style="font-size: 24pt; color: #5138ff;">3.StackOverflow </span><br>&nbsp;&nbsp;&nbsp; 去编程互助网站搜索下答案，不行就上去发帖提提问，热心人还是蛮多的，但是感觉这个网站上的Java/.Net的问题比较多。<br><br><span style="color: #5138ff; font-size: 24pt;">4.RTFM </span><br>&nbsp;&nbsp;&nbsp; 读下令人郁闷的帮助文档（<font size="-1">Read the f*cking manual</font>），在linux下man一下或者查看下MSDN文档，mannual文档一般会组织得很好，很清晰。但是语言表达得太专业化了，有时候会让人很郁闷。<br><br><span style="color: #5138ff; font-size: 24pt;">5.Think </span><br>&nbsp;&nbsp;&nbsp; 最后不行了，还是自己想下怎么解决问题吧，求人不如求己。<br>
<br>    <img src ="http://www.cppblog.com/xguru/aggbug/131044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-10-24 15:18 <a href="http://www.cppblog.com/xguru/archive/2010/10/24/131044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[技巧]linux命令行解压小技巧一例</title><link>http://www.cppblog.com/xguru/archive/2010/10/07/128952.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Thu, 07 Oct 2010 13:54:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/10/07/128952.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/128952.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/10/07/128952.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/128952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/128952.html</trackback:ping><description><![CDATA[大家都为linux下压缩格式繁多，而且每种格式都对应不同的命令，这是个很让人头疼的问题。<br>我就介绍个方法给大家：<br>在bashrc里加入<br><br>
<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: #000000;">ex&nbsp;()&nbsp;{<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;[&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;]&nbsp;;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.tar.bz2)&nbsp;&nbsp;&nbsp;tar&nbsp;xjf&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.tar.gz)&nbsp;&nbsp;&nbsp;&nbsp;tar&nbsp;xzf&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.bz2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bunzip2&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.rar)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rar&nbsp;x&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.gz)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gunzip&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.tar)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar&nbsp;xf&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.tbz2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar&nbsp;xjf&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.tgz)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar&nbsp;xzf&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.zip)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unzip&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.Z)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uncompress&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.7z)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7z&nbsp;x&nbsp;$</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">无法解压'$1'文件!!</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;esac<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">'$1'&nbsp;不是一个合法的文件!</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;fi<br>}<br></span></div>
<br><img src="http://www.cppblog.com/images/cppblog_com/xguru/14114/ex.png" border="0"><br><br>解压文件的的话只需要简单输入"ex [压缩文档]"就可以了，如果你有其他格式的压缩文档格式也可以自己加入进来。<br>从此告别烦人的各种解压缩命令。<br>  <img src ="http://www.cppblog.com/xguru/aggbug/128952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-10-07 21:54 <a href="http://www.cppblog.com/xguru/archive/2010/10/07/128952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[趣闻]Emacs是否真的能煮咖啡？</title><link>http://www.cppblog.com/xguru/archive/2010/07/27/121416.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Tue, 27 Jul 2010 13:15:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/07/27/121416.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/121416.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/07/27/121416.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/121416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/121416.html</trackback:ping><description><![CDATA[<div style="text-align: left;">
</div>
<div style="text-align: center; font-weight: bold;">
<div style="text-align: left;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 24pt;"></span><span style="font-size: 24pt;"> &nbsp; &nbsp;&nbsp; Emacs是否真的能煮咖啡？</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; by <a href="http://www.cppblog.com/xguru" temp_href="http://www.cppblog.com/xguru" xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">XGuru</a>
<br>
</div>
<br>
<table style="width: 779px; height: 680px;" border="0">
    <tbody>
        <tr>
            <td><img style="width: 390px; height: 502px;" alt="" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/69/Vacpot3.jpg/467px-Vacpot3.jpg">
            </td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; <span style="font-size: 14pt;">坊间有传言曰:&#8220;emacs无所不能,甚至能够用来煮咖啡!&#8221;<br><br>&nbsp;&nbsp;&nbsp; 煮咖啡何解？勾起了我的考究欲望。<br><br>&nbsp;&nbsp;&nbsp; 上网搜索之,得出几种初步结论如下:<br><br>&nbsp;&nbsp;&nbsp;
            1.这只是一种好玩的说法，只是用来形容emacs功能无所不包而已。
            <br><br>&nbsp;&nbsp;&nbsp;
            2.Java的标志就一杯咖啡,用来形象的表示写代码</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img style="width: 143px; height: 143px;" alt="" src="http://www.cppblog.com/images/cppblog_com/xguru/make_coffee/java.png"><br><br>&nbsp;&nbsp;&nbsp;
            3.emacs的确具<a style="color: #0010ff;" href="http://people.ku.edu/%7Esyliu/shredderyin/emacs_power.html">有煮咖啡的功能</a>，有脚本能够控制自动咖啡机运行。
            </td>
        </tr>
    </tbody>
</table>
<br></div>
<br>&nbsp;&nbsp;&nbsp; 觉得第一种说法比较符合逻辑;第二种说法感觉有点唐突，毕竟Emacs是<a style="color: #0010ff;" href="http://en.wikipedia.org/wiki/Richard_Stallman" title="Richard Stallman">Richard Stallman</a><span style="color: #0010ff;">(</span>GNU创始人)所写，而Java是<a style="color: #0010ff;" href="http://en.wikipedia.org/wiki/Bill_Joy">Bill Joy</a>(vi作者)等人完成的，这两派都差点上升到宗教冲突了,这种解释有点差强人意;第三种的如果是真的话就会变得很有趣。<br><br><br>&nbsp;&nbsp;&nbsp;
于是就开始了探究，首先追本溯源，找到这段脚本代码的<a style="color: #0010ff;" href="http://emarsden.chez.com/downloads/coffee.el">源头</a><cite>。发现已经地址已经失效,终于在在debian的一个<a style="color: #0010ff;" href="http://archive.debian.net/zh-cn/woody/editors/emacs-goodies-el">软件包</a>里找到了<a href="http://archive.debian.net/zh-cn/woody/all/emacs-goodies-el/download"><span style="color: #0010ff;">副本</span>。</a>这是emacs常用脚本的一个打包。<br><br>代码如下<br>
</cite>
<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>-->&nbsp;&nbsp;1&nbsp;;;;&nbsp;coffee.el&nbsp;---&nbsp;Submit&nbsp;a&nbsp;BREW&nbsp;request&nbsp;to&nbsp;an&nbsp;RFC2324-compliant&nbsp;coffee&nbsp;device<br>&nbsp;&nbsp;2&nbsp;;;;<br>&nbsp;&nbsp;3&nbsp;;;;&nbsp;Author:&nbsp;Eric&nbsp;Marsden&nbsp;&lt;emarsden@laas.fr&gt;<br>&nbsp;&nbsp;4&nbsp;;;;&nbsp;Version:&nbsp;0.2<br>&nbsp;&nbsp;5&nbsp;;;;&nbsp;Copyright:&nbsp;(C)&nbsp;1999&nbsp;Eric&nbsp;Marsden<br>&nbsp;&nbsp;6&nbsp;;;;&nbsp;Keywords:&nbsp;coffee,&nbsp;brew,&nbsp;kitchen-sink,&nbsp;can't<br>&nbsp;&nbsp;7&nbsp;;;<br>&nbsp;&nbsp;8&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;program&nbsp;is&nbsp;free&nbsp;software;&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and/or<br>&nbsp;&nbsp;9&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modify&nbsp;it&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;as<br>&nbsp;10&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;published&nbsp;by&nbsp;the&nbsp;Free&nbsp;Software&nbsp;Foundation;&nbsp;either&nbsp;version&nbsp;2&nbsp;of<br>&nbsp;11&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;License,&nbsp;or&nbsp;(at&nbsp;your&nbsp;option)&nbsp;any&nbsp;later&nbsp;version.<br>&nbsp;12&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;13&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;program&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;useful,<br>&nbsp;14&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;warranty&nbsp;of<br>&nbsp;15&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.&nbsp;See&nbsp;the<br>&nbsp;16&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;for&nbsp;more&nbsp;details.<br>&nbsp;17&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;18&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public<br>&nbsp;19&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;License&nbsp;along&nbsp;with&nbsp;this&nbsp;program;&nbsp;if&nbsp;not,&nbsp;write&nbsp;to&nbsp;the&nbsp;Free<br>&nbsp;20&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Software&nbsp;Foundation,&nbsp;Inc.,&nbsp;59&nbsp;Temple&nbsp;Place&nbsp;-&nbsp;Suite&nbsp;330,&nbsp;Boston,<br>&nbsp;21&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MA&nbsp;02111-1307,&nbsp;USA.<br>&nbsp;22&nbsp;;;<br>&nbsp;23&nbsp;;;&nbsp;Please&nbsp;send&nbsp;suggestions&nbsp;and&nbsp;bug&nbsp;reports&nbsp;to&nbsp;&lt;emarsden@laas.fr&gt;.<br>&nbsp;24&nbsp;;;&nbsp;The&nbsp;latest&nbsp;version&nbsp;of&nbsp;this&nbsp;package&nbsp;should&nbsp;be&nbsp;available&nbsp;at<br>&nbsp;25&nbsp;;;<br>&nbsp;26&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;URL:http://purl.org/net/emarsden/home/downloads/&gt;<br>&nbsp;27&nbsp;&nbsp;<br>&nbsp;28&nbsp;;;;&nbsp;Commentary:<br>&nbsp;29&nbsp;;;<br>&nbsp;30&nbsp;;;&nbsp;This&nbsp;module&nbsp;provides&nbsp;an&nbsp;Emacs&nbsp;interface&nbsp;to&nbsp;RFC2324-compliant&nbsp;coffee<br>&nbsp;31&nbsp;;;&nbsp;devices&nbsp;(Hyper&nbsp;Text&nbsp;Coffee&nbsp;Pot&nbsp;Control&nbsp;Protocol,&nbsp;or&nbsp;HTCPCP).&nbsp;It<br>&nbsp;32&nbsp;;;&nbsp;prompts&nbsp;the&nbsp;user&nbsp;for&nbsp;the&nbsp;different&nbsp;additives,&nbsp;then&nbsp;issues&nbsp;a&nbsp;BREW<br>&nbsp;33&nbsp;;;&nbsp;request&nbsp;to&nbsp;the&nbsp;coffee&nbsp;device.<br>&nbsp;34&nbsp;;;<br>&nbsp;35&nbsp;;;&nbsp;coffee.el&nbsp;requires&nbsp;a&nbsp;special&nbsp;BREW-capable&nbsp;version&nbsp;of&nbsp;Emacs/W3&nbsp;to&nbsp;be<br>&nbsp;36&nbsp;;;&nbsp;installed.<br>&nbsp;37&nbsp;;;<br>&nbsp;38&nbsp;;;&nbsp;Reference:&nbsp;&lt;URL:ftp://ftp.isi.edu/in-notes/rfc2324.txt&gt;<br>&nbsp;39&nbsp;;;<br>&nbsp;40&nbsp;;;<br>&nbsp;41&nbsp;;;&nbsp;Thanks&nbsp;to&nbsp;Giacomo&nbsp;Boffi&nbsp;&lt;giacomo.boffi@polimi.it&gt;&nbsp;for&nbsp;some&nbsp;typos<br>&nbsp;42&nbsp;;;&nbsp;and&nbsp;the&nbsp;addition&nbsp;of&nbsp;the&nbsp;"Brown-Coffee"&nbsp;sweetener&nbsp;type.<br>&nbsp;43&nbsp;&nbsp;<br>&nbsp;44&nbsp;;;;&nbsp;Code:<br>&nbsp;45&nbsp;&nbsp;<br>&nbsp;46&nbsp;(require&nbsp;'cl)<br>&nbsp;47&nbsp;&nbsp;<br>&nbsp;48&nbsp;(defvar&nbsp;coffee-host&nbsp;"coffee"<br>&nbsp;49&nbsp;&nbsp;&nbsp;"*The&nbsp;host&nbsp;which&nbsp;provides&nbsp;the&nbsp;coffee&nbsp;service.")<br>&nbsp;50&nbsp;&nbsp;<br>&nbsp;51&nbsp;(defvar&nbsp;coffee-pot-designator&nbsp;1<br>&nbsp;52&nbsp;&nbsp;&nbsp;"*On&nbsp;machines&nbsp;with&nbsp;multiple&nbsp;pots,&nbsp;the&nbsp;number&nbsp;of&nbsp;the&nbsp;pot&nbsp;to&nbsp;brew&nbsp;in")<br>&nbsp;53&nbsp;&nbsp;<br>&nbsp;54&nbsp;(defvar&nbsp;coffee-brew-hook&nbsp;nil<br>&nbsp;55&nbsp;&nbsp;&nbsp;"*Hook&nbsp;executed&nbsp;before&nbsp;issuing&nbsp;a&nbsp;BREW&nbsp;request")<br>&nbsp;56&nbsp;&nbsp;<br>&nbsp;57&nbsp;(defconst&nbsp;coffee-milk-types<br>&nbsp;58&nbsp;&nbsp;&nbsp;'("Cream"&nbsp;"Half-and-Half"&nbsp;"Whole-Milk"&nbsp;"Part-Skim"&nbsp;"Skim"&nbsp;"Non-Dairy"))<br>&nbsp;59&nbsp;&nbsp;<br>&nbsp;60&nbsp;(defconst&nbsp;coffee-syrup-types&nbsp;'("Vanilla"&nbsp;"Almond"&nbsp;"Raspberry"&nbsp;"Chocolate"))<br>&nbsp;61&nbsp;&nbsp;<br>&nbsp;62&nbsp;(defconst&nbsp;coffee-sweetener-types&nbsp;'("White-Sugar"&nbsp;"Brown-Sugar"&nbsp;"Artificial-Sweetener"))<br>&nbsp;63&nbsp;&nbsp;<br>&nbsp;64&nbsp;(defconst&nbsp;coffee-alcohol-types&nbsp;'("Whiskey"&nbsp;"Rum"&nbsp;"Kahula"&nbsp;"Aquavit"))<br>&nbsp;65&nbsp;&nbsp;<br>&nbsp;66&nbsp;(defconst&nbsp;coffee-addition-types<br>&nbsp;67&nbsp;&nbsp;&nbsp;`(("Milk"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;,coffee-milk-types)<br>&nbsp;68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;("Syrup"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;,coffee-syrup-types)<br>&nbsp;69&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;("Sweetener"&nbsp;.&nbsp;,coffee-sweetener-types)<br>&nbsp;70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;("Alcohol"&nbsp;&nbsp;&nbsp;.&nbsp;,coffee-alcohol-types)))<br>&nbsp;71&nbsp;&nbsp;<br>&nbsp;72&nbsp;;;;###autoload<br>&nbsp;73&nbsp;(defun&nbsp;coffee&nbsp;()<br>&nbsp;74&nbsp;&nbsp;&nbsp;"Submit&nbsp;a&nbsp;BREW&nbsp;request&nbsp;to&nbsp;an&nbsp;RFC2324-compliant&nbsp;coffee&nbsp;device"<br>&nbsp;75&nbsp;&nbsp;&nbsp;(interactive)<br>&nbsp;76&nbsp;&nbsp;&nbsp;(require&nbsp;'url)<br>&nbsp;77&nbsp;&nbsp;&nbsp;(let*&nbsp;((additions-list<br>&nbsp;78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(append&nbsp;coffee-milk-types<br>&nbsp;79&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coffee-syrup-types<br>&nbsp;80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coffee-sweetener-types<br>&nbsp;81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coffee-alcohol-types))<br>&nbsp;82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(additions-string<br>&nbsp;83&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(mapconcat&nbsp;#'identity&nbsp;additions-list&nbsp;","))<br>&nbsp;84&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(url&nbsp;(coffee-url))<br>&nbsp;85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(url-request-method&nbsp;"BREW")<br>&nbsp;86&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(url-request-extra-headers<br>&nbsp;87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`(("Content-type"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;"message-coffeepot")<br>&nbsp;88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;("Accept-Additions"&nbsp;.&nbsp;,additions-string)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;89&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(url-request-data&nbsp;"START"))<br>&nbsp;90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(run-hooks&nbsp;'coffee-brew-hook)<br>&nbsp;91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(url-retrieve&nbsp;url)))<br>&nbsp;92&nbsp;&nbsp;<br>&nbsp;93&nbsp;(defun&nbsp;coffee-additions&nbsp;()<br>&nbsp;94&nbsp;&nbsp;&nbsp;(let*&nbsp;((type-name<br>&nbsp;95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(completing-read&nbsp;"Coffee&nbsp;addition:&nbsp;"&nbsp;coffee-addition-types&nbsp;nil&nbsp;t))<br>&nbsp;96&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(type&nbsp;(cdr&nbsp;(assoc&nbsp;type-name&nbsp;coffee-addition-types)))<br>&nbsp;97&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ingredients&nbsp;(mapcar&nbsp;#'(lambda&nbsp;(a)&nbsp;(cons&nbsp;a&nbsp;a))&nbsp;type))<br>&nbsp;98&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ingredient<br>&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(completing-read&nbsp;"Addition&nbsp;type:&nbsp;"&nbsp;ingredients&nbsp;nil&nbsp;t)))<br>100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ingredient))<br>101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>102&nbsp;(defun&nbsp;coffee-url&nbsp;()<br>103&nbsp;&nbsp;&nbsp;(require&nbsp;'w3-forms)<br>104&nbsp;&nbsp;&nbsp;(concat&nbsp;"coffee://"&nbsp;coffee-host&nbsp;"/"<br>105&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(int-to-string&nbsp;coffee-pot-designator)<br>106&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"?"&nbsp;(w3-form-encode-xwfu&nbsp;(coffee-additions))))<br>107&nbsp;&nbsp;<br>108&nbsp;&nbsp;<br>109&nbsp;(provide&nbsp;'coffee)<br>110&nbsp;&nbsp;<br>111&nbsp;;;&nbsp;coffee.el&nbsp;ends&nbsp;here</div>
<cite><br>&nbsp;&nbsp;&nbsp;
这个脚本看起来还是煞有其事的，文中提到"Submit&nbsp;a&nbsp;BREW&nbsp;request&nbsp;to&nbsp;an&nbsp;RFC2324-compliant&nbsp;coffee&nbsp;device"<br><br>&nbsp;&nbsp;&nbsp;
能够向与<cite style="color: #0010ff;"><cite></cite></cite><a style="color: #0010ff;" href="http://www.ietf.org/rfc/rfc2324.txt"><cite><cite>RFC2324</cite></cite></a>协议兼容的咖啡设备提交BREW请求</cite> ,<span style="font-family: monospace;">即兼容</span>Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)协议。超文本咖啡壶协议,光看这名字就够喜庆了，但这份协议写得很规范,看不出一丝破绽。有细心的朋友shrek.wang提醒了我，注意看日期:<br><br>
<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>-->Network&nbsp;Working&nbsp;Group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L.&nbsp;Masinter<br>Request&nbsp;for&nbsp;Comments:&nbsp;2324&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;April&nbsp;1998<br></div>
<br>&nbsp;&nbsp;&nbsp;
1998年4月1号，愚人节！这个就让人产生了疑问。<br>&nbsp;&nbsp;&nbsp; 通过查wiki发现，原来<a style="color: #0010ff;" href="http://zh.wikipedia.org/zh-cn/%E4%BA%92%E8%81%94%E7%BD%91%E5%B7%A5%E7%A8%8B%E5%B7%A5%E4%BD%9C%E5%B0%8F%E7%BB%84" title="互联网工程工作小组" class="mw-redirect">互联网国际标准机构</a>也是很有才的恶搞高手。<br><br>这里列举其中几个好玩的<br>
<ul>
    <li>
    <ul>
        <li>2001年，<a style="color: #0010ff;" href="http://tools.ietf.org/html/rfc1149" class="external mw-magiclink-rfc">RFC 1149</a>由一班挪威Linux使用者协会的成员实现了。他们传送了9个封包到约5公里外的地方，每个封包由不同的<a href="http://zh.wikipedia.org/zh-cn/%E9%B8%BD%E5%AD%90" title="鸽子" class="mw-redirect">鸽子</a>携带，并有一个ICMP应答要求封包（<a href="http://zh.wikipedia.org/zh-cn/Ping" title="Ping">ping</a>）。他们收到4个回应，封包流失率是55%，回应时间是3000至6000秒。<a href="http://www.blug.linux.no/rfc1149/" class="external autonumber" rel="nofollow">[1]</a></li>
        <li><a href="http://tools.ietf.org/html/rfc1607" class="external mw-magiclink-rfc">RFC 1607</a> — <strong> 来自<a href="http://zh.wikipedia.org/zh-cn/21%E4%B8%96%E7%B4%80" title="21世纪" class="mw-redirect">21世纪</a>的观点</strong>  <a href="http://zh.wikipedia.org/w/index.php?title=Vint_Cerf&amp;action=edit&amp;redlink=1" class="new" title="Vint Cerf（尚未撰写）">Vint Cerf</a> <a href="http://zh.wikipedia.org/zh-cn/1994" title="1994" class="mw-redirect">1994</a>.&nbsp;</li>
        <li><a href="http://tools.ietf.org/html/rfc3091" class="external mw-magiclink-rfc">RFC 3091</a> — <strong> <a href="http://zh.wikipedia.org/zh-cn/%E5%9C%93%E5%91%A8%E7%8E%87" title="圆周率">圆周率</a>数字产生协定</strong> . H. Kennedy <a href="http://zh.wikipedia.org/zh-cn/2001%E5%B9%B4" title="2001年">2001年</a></li>
    </ul>
    </li>
</ul>
更多的可以看<a style="color: #0010ff;" href="http://zh.wikipedia.org/zh-cn/%E6%83%A1%E6%90%9ERFC">这里wiki</a>。<br><br>&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp; 这里可以大胆地作出推断，这个协议只是<strong> IETF</strong> 开的一个善意的joke，而coffee.el的作者Eric&nbsp;Marsden也是一个幽默的程序员，于是就做了一个兼容RFC2324的脚本,他也没想过要真正的控制咖啡机，所以这整个事情都源于程序员的冷幽默。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cppblog.com/images/cppblog_com/xguru/make_coffee/coffee.jpg" border="0">
<br>&nbsp;&nbsp;&nbsp;&nbsp; 然而远程控制咖啡机还是有可能的，这里有一个<a style="color: #0010ff;" href="http://hardware.slashdot.org/article.pl?sid=08/12/10/1838233">开源咖啡机</a>;这里还有一个<a style="color: #0010ff;" href="http://www.engadget.com/2007/09/13/the-internet-enabled-coffee-maker/">允许网络控制的咖啡机</a>（据说还是兼容RFC2324的）。<br>&nbsp;&nbsp;&nbsp;&nbsp; 估计IETF应该做梦也没想到自己开的一个玩笑竟然还真的有人做出了实物。 国外的牛人们还真是闲得蛋疼阿。可见geek们还是极富幽默感的。<br>朋友们，你的心中已经有答案了么？你们想要一台这样的咖啡机不?<br><br><br><br><br><br><br><br>PS.在这里BS下CPPBLOG的编辑器，真的很烂啊，文章写到一半时点保存，竟然给发布了！<br>
<br>&nbsp;<img src="http://i.creativecommons.org/l/by-nc-sa/2.5/cn/88x31.png" alt="Creative commons license" v:shapes="图片_x0020_7" height="31" width="88" border="0"><br>
<p>by <a href="http://www.cppblog.com/xguru" temp_href="http://www.cppblog.com/xguru" xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">XGuru</a>
is licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/" temp_href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/">Creative
Commons 署名-非商业性使用-相同方式共享 2.5 中国大陆 License</a>. <br></p>
<br>              <img src ="http://www.cppblog.com/xguru/aggbug/121416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-07-27 21:15 <a href="http://www.cppblog.com/xguru/archive/2010/07/27/121416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]个人最爱的九个火狐插件</title><link>http://www.cppblog.com/xguru/archive/2010/06/28/firefox_addons.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Mon, 28 Jun 2010 15:29:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/06/28/firefox_addons.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/118893.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/06/28/firefox_addons.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/118893.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/118893.html</trackback:ping><description><![CDATA[<h2 style="color: #020000; text-align: left;" dir="ltr" class="addon"><span style="font-size: 12pt;">豆瓣<span style="font-weight: normal; font-family: 微软雅黑; font-size: 12pt;">的<a href="http://www.douban.com/group/Firefox/">火狐小组</a>是这样说的:</span></span></h2>
<div style="text-align: center;"><span style="font-weight: normal; font-family: 微软雅黑; font-size: 14pt; font-style: italic;"><br>Firefox不是完美的，不是最稳定的，不是没有漏洞的，也不是最快的，但它可以是自己的。</span>
<br><br></div>
<span style="font-size: 12pt;"><br>很喜欢这句话,就是因为有了丰富多彩的插件,火狐才能如此的受欢迎.<br>下面的这几个插件是我个人最喜欢的,推荐给大家!</span><br><span style="font-size: 14pt;"><br>
<h2 style="color: #020000;" dir="ltr" class="addon"><span>1.ColorfulTabs </span></h2>
</span>
<h2 style="color: #020000;" dir="ltr" class="addon"><span></span></h2>
<span style="color: #020000;">
人对颜色的分辨别速度大大超出文字,根据页面的主色调生成标签颜色,让你的标签变得色彩斑斓</span>.不仅赏心悦目,更让你方便地切换到想要的标签.<br><br><img style="width: 609px; height: 173px;" src="http://www.cppblog.com/images/cppblog_com/xguru/colofulTab.png" border="0"><br><br style="color: #020000;">
<a href="https://addons.mozilla.org/zh-CN/firefox/addon/1368/">插件地址</a><br style="color: #020000;"><span style="color: #020000;">
</span><br><span style="font-size: 14pt;"><br style="color: #020000;">
<h2 style="color: #020000;" dir="ltr" class="addon"><span>       2.All-in-One Gestures</span></h2>
</span>
<h2 style="color: #020000;" dir="ltr" class="addon"><span></span></h2>
<span style="color: #020000;">
这年头,没有鼠标手势还能活么?该插件操作快捷,定制性强!</span><br><a href="https://addons.mozilla.org/zh-CN/firefox/addon/12/">插件地址</a><br style="color: #020000;"><span style="color: #020000;">
</span><br style="color: #020000;">
<h2 style="color: #020000;" dir="ltr" class="addon"><br><span>       </span></h2>
<h2 style="color: #020000;" dir="ltr" class="addon"><span style="font-size: 14pt;">3.AutoProxy</span></h2>
<span style="color: #020000;">
非常智能好用的Fuck GF.W的插件,tor,proxy,ssh都能很好的支持,最爽的是可以订阅规则,决定那些页面使用代理,哪些无须使用.和谐社会,和谐你我他</span>!<br><br style="color: #020000;"><span style="color: #020000;">
</span><br style="color: #020000;">
<img style="width: 503px; height: 376px;" src="http://www.cppblog.com/images/cppblog_com/xguru/Screenshot-AutoProxy.png" border="0"><br><br><a href="https://addons.mozilla.org/zh-CN/firefox/addon/11009/">插件地址</a><br><br><br style="color: #020000;">
<h2 style="color: #020000;" dir="ltr" class="addon"><span style="font-size: 14pt;">4.Readability</span></h2>
<span style="color: #020000;">
当页面繁杂不堪,难以阅读时,轻轻一点,魔法立现.整页面变得美观大方,甚至感觉像是在看一份精美排版报纸/小说</span>.<br><br>整容前:<br><br><img style="width: 519px; height: 356px;" src="http://www.cppblog.com/images/cppblog_com/xguru/unReadable.png" border="0"><br><br>整容后:<br><br><img style="width: 523px; height: 359px;" src="http://www.cppblog.com/images/cppblog_com/xguru/Readability.png" border="0"><br style="color: #020000;"><br><a href="https://addons.mozilla.org/zh-CN/firefox/addon/46442/">插件地址</a><br><br><span style="color: #020000;"></span><br style="color: #020000;">
<h2 style="color: #020000;" dir="ltr" class="addon"><br><span></span></h2>
<h2 style="color: #020000;" dir="ltr" class="addon"><span style="font-size: 14pt;">5.Tab Popup </span></h2>
<span style="color: #020000;">当你鼠标放在不同的标签页上,就会显示出该页的缩略图.</span><br><a href="https://addons.mozilla.org/zh-CN/firefox/addon/8253">插件地址</a><br style="color: #020000;"><span style="color: #020000;"></span><br style="color: #020000;">
<br style="color: #020000;">
<h2 style="color: #020000;" dir="ltr" class="addon"><span style="font-size: 14pt;">6.Adblock Plus</span></h2>
<span style="color: #020000;">
广告已经成往事!</span>告别各种烦人的弹窗.<br><a href="https://addons.mozilla.org/zh-CN/firefox/addon/1865/">插件地址</a><br style="color: #020000;"><span style="color: #020000;">
</span><br style="color: #020000;">
<br style="color: #020000;">
<h2 style="color: #020000;" class="addon"><span style="font-size: 14pt;">7.Vimperator </span></h2>
<span style="color: #020000;">
让你的firefox变得像vim一样舒服</span>,适合骨灰级vimer!<br><img style="width: 418px; height: 327px;" src="http://www.cppblog.com/images/cppblog_com/xguru/vimperator.png" border="0"><br><br>(图from linuxtoy)<br><br><a href="https://addons.mozilla.org/en-US/firefox/addon/4891/">插件地址</a> <a href="http://vimperator.org/help/vimperator/">在线帮助</a><br style="color: #020000;"><span style="color: #020000;">
</span><br style="color: #020000;">
<h2 style="color: #020000;" dir="ltr" class="addon"><br><span></span></h2>
<h2 style="color: #020000;" dir="ltr" class="addon"><span style="font-size: 14pt;">8.Personas Plus </span></h2>
<span style="color: #020000;">
firefox皮肤想换就换!</span>打造个性的firefox<br><a href="https://addons.mozilla.org/zh-CN/firefox/addon/10900/">插件地址</a><br style="color: #020000;"><span style="color: #020000;">
</span><br style="color: #020000;">
<h2 style="color: #020000;" dir="ltr" class="addon"></h2>
<span style="font-size: 14pt;">
<h2 style="color: #020000;" dir="ltr" class="addon"><br><span></span></h2>
<h2 style="color: #020000;" dir="ltr" class="addon"><span style="font-size: 14pt;">9.Integrated Gmail</span></h2>
<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/xguru/all_in_gmail1.png" width="519" height="356"><br>
</span>
<h2 style="color: #020000;" dir="ltr" class="addon"><span></span></h2>
<span style="color: #020000;">google发烧友必备,将google其他的功能都集中到gmail里.All your Google Needs in One Place! </span><br><a href="https://addons.mozilla.org/zh-CN/firefox/addon/9457/">插件地址</a><br><br style="color: #020000;"><span style="color: #020000;">
</span>相似的有另外一个<a href="https://addons.mozilla.org/en-US/firefox/addon/6424/">优化
greader的插件</a>,一个google<a href="https://addons.mozilla.org/en-US/firefox/addon/3576/">产品大全的shortcuts插件</a><br><br style="color: #020000;">
<img style="width: 519px; height: 348px;" alt="" src="http://www.cppblog.com/images/cppblog_com/xguru/Google_Shortcuts.png"><br style="color: #020000;">
<br style="color: #020000;"><span style="color: #020000;">
PS:<br>插件多了会当然会使firefox变慢,大家根据需要禁用一些</span><span style="color: #020000;">自己</span><span style="color: #020000;">平时不常用的插件.<br>另外Firefox  3.6.6主要是改进了插件崩溃或者停止响应之后终止该插件的时间.喜欢装插件的朋友赶快更新吧!<br><a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/3.6.6-candidates/build1/win32/zh-CN/Firefox%20Setup%203.6.6.exe">win 32位版本下载</a><br><a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/3.6.6-candidates/build1/win32/zh-CN/Firefox%20Setup%203.6.6.exe"> </a><a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/3.6.6-candidates/build1/linux-i686/zh-CN/firefox-3.6.6.tar.bz2">linux 32位版本下载</a><br><br>--EOF--<br></span>               <img src ="http://www.cppblog.com/xguru/aggbug/118893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-06-28 23:29 <a href="http://www.cppblog.com/xguru/archive/2010/06/28/firefox_addons.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]nginx启动关闭配置脚本</title><link>http://www.cppblog.com/xguru/archive/2010/06/28/118868.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Mon, 28 Jun 2010 08:43:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/06/28/118868.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/118868.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/06/28/118868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/118868.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/118868.html</trackback:ping><description><![CDATA[2010-12-29-update:找到一个最新的版本，由jason提供，地址<a href="http://code.google.com/p/nginx-init-ubuntu/source/browse/tags/2.0.0-RC2/nginx?spec=svn30&amp;r=30">在这</a>
<br><br><br>上网找了几个版本在ubuntu下都用不了<br>于是就自己重新修改了<span style="color: #008000;">jackbillow<span style="color: #080000;">的版本</span></span>,<span style="color: #000000;">用起来感觉还不错</span>.<br><br><br><br><span style="color: #000000; font-weight: bold;">Usage: nginx.sh {start|stop|</span><span style="color: #000000; font-weight: bold;">conf|</span><span style="color: #000000; font-weight: bold;">restart}<br></span><span style="color: #000000;">//开始|停止|配置|重启</span><br><br><span style="color: #000000;">注:需要以管理员身份运行<br></span><br><br>
<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: #008000;">#</span><span style="color: #008000;">###############################################<br>#!/bin/bash<br>#&nbsp;v.0.0.3<br>#&nbsp;create&nbsp;by&nbsp;jackbillow&nbsp;at&nbsp;2007.10.15<br>#&nbsp;redevelop&nbsp;by&nbsp;XGuru&nbsp;at&nbsp;2010.6.28<br>#&nbsp;On&nbsp;Ubuntu&nbsp;10.04<br>#&nbsp;nginx&nbsp;-&nbsp;This&nbsp;shell&nbsp;script&nbsp;takes&nbsp;care&nbsp;of&nbsp;starting&nbsp;and&nbsp;stopping&nbsp;nginx.<br>#<br>#&nbsp;description:&nbsp;nginx&nbsp;[engine&nbsp;x]&nbsp;is&nbsp;light&nbsp;http&nbsp;web/proxy&nbsp;server<br>#&nbsp;that&nbsp;answers&nbsp;incoming&nbsp;ftp&nbsp;service&nbsp;requests.<br>###############################################</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>nginx_path</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">/usr/local/nginx</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>nginx_pid</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">/usr/local/nginx/logs/nginx.pid</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br></span><span style="color: #000000;">prog</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">nginx</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br></span><br><span style="color: #000000;">RETVAL</span><span style="color: #000000;">=</span><span style="color: #800000;">0</span><span style="color: #000000;"><br></span><span style="color: #000000;"><br><br>start()&nbsp;{<br></span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Start&nbsp;daemons.</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;[&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">e&nbsp;</span><span style="color: #800080;">$nginx_path</span><span style="color: #000000;">/</span><span style="color: #000000;">conf</span><span style="color: #000000;">/</span><span style="color: #000000;">nginx</span><span style="color: #000000;">.</span><span style="color: #000000;">conf&nbsp;];then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">n&nbsp;$</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Starting&nbsp;$prog:&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">$nginx_path</span><span style="color: #000000;">/</span><span style="color: #000000;">sbin</span><span style="color: #000000;">/</span><span style="color: #000000;">nginx&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">c&nbsp;</span><span style="color: #800080;">$nginx_path</span><span style="color: #000000;">/</span><span style="color: #000000;">conf</span><span style="color: #000000;">/</span><span style="color: #000000;">nginx</span><span style="color: #000000;">.</span><span style="color: #000000;">conf&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETVAL</span><span style="color: #000000;">=</span><span style="color: #000000;">$</span><span style="color: #000000;">?</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;</span><span style="color: #800080;">$RETVAL</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">eq&nbsp;</span><span style="color: #800000;">0</span><span style="color: #000000;">&nbsp;]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;Start&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">$prog</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;successfully</span><span style="color: #000000;">!</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETVAL</span><span style="color: #000000;">=</span><span style="color: #800000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$RETVAL</span><span style="color: #000000;"><br>}<br></span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Stop&nbsp;daemons.</span><span style="color: #008000;"><br></span><span style="color: #000000;">stop()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">n&nbsp;$</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Stopping&nbsp;$prog\n</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo&nbsp;killall&nbsp;</span><span style="color: #000000;">-</span><span style="color: #800000;">9</span><span style="color: #000000;">&nbsp;nginx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETVAL</span><span style="color: #000000;">=</span><span style="color: #000000;">$</span><span style="color: #000000;">?</span><span style="color: #000000;"><br>}<br></span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;See&nbsp;how&nbsp;we&nbsp;were&nbsp;called.</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>conf(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gvim&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">$nginx_path/conf/nginx.conf</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>}<br>case&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">$1</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;in<br>start)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>stop)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>conf)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>restart)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;</span><span style="color: #000000;"><br></span><span style="color: #000000;">*</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Usage:&nbsp;$0&nbsp;{start|stop</span><span style="color: #000000; font-weight: bold;">|conf|</span><span style="color: #000000; font-weight: bold;">restart}</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Your&nbsp;may&nbsp;need&nbsp;root&nbsp;privilege&nbsp;to&nbsp;execute&nbsp;this&nbsp;script!</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">exit</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">1</span><span style="color: #000000;"><br>esac<br></span><span style="color: #0000ff;">exit</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$RETVAL</span><span style="color: #000000;"><br></span></div>
<br>--EOF--<br>  <img src ="http://www.cppblog.com/xguru/aggbug/118868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-06-28 16:43 <a href="http://www.cppblog.com/xguru/archive/2010/06/28/118868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]Libevent分析笔记(3)-I/O复用(Multiplexing)机制的确定</title><link>http://www.cppblog.com/xguru/archive/2010/06/25/118722.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Fri, 25 Jun 2010 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/06/25/118722.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/118722.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/06/25/118722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/118722.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/118722.html</trackback:ping><description><![CDATA[<p>&nbsp;<span>libevent</span><span>的初衷就是设计一个跨平台的轻量级</span><span>I/0</span><span>框架，由于历史问题，各平台的</span><span>I/O</span><span>复用机制难以统一。因此，这部分处理跨平台的方法值得重点关注。</span></p>
<p>&nbsp;<span>eventop</span><span>在源码中定义如下：</span></p>
<p><span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_40_103_Open_Image onclick="this.style.display='none'; Codehighlighter1_40_103_Open_Text.style.display='none'; Codehighlighter1_40_103_Closed_Image.style.display='inline'; Codehighlighter1_40_103_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_40_103_Closed_Image onclick="this.style.display='none'; Codehighlighter1_40_103_Closed_Text.style.display='none'; Codehighlighter1_40_103_Open_Image.style.display='inline'; Codehighlighter1_40_103_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;eventop&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">eventops[]</span><span style="COLOR: #000000">=</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_40_103_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_40_103_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">#ifdef&nbsp;HAVE_EVENT_PORTS<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">evportops,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&#8230;.<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp;由此可见</span><span>libevent</span><span>通过宏来在编译期找出可用的复用机制。</span></p>
<p><span>其中的顺序也是大文章的。<span>官方的文档中说明</span><span>libevent</span><span>中支持的复用机制</span><span> </span><span><a href="http://access1.sun.com/techarticles/devpoll.html"><span>/dev/poll</span></a></span><span>, </span><span><a href="http://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;apropos=0&amp;sektion=0&amp;format=html"><span>kqueue(2)</span></a></span><span>, </span><span><a href="http://developers.sun.com/solaris/articles/event_completion.html"><span>event ports</span></a></span><span>, <span>select(2)</span>, <span>poll(2)</span> and </span><span><a href="http://www.xmailserver.org/linux-patches/epoll.txt"><span>epoll(4)</span></a></span><span>. </span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;libevent</span><span>开发人员通过对各种机制的基准测试，根据性能高到低选择复用机制优先顺序如图所示：</span></span></p>
<p align=left><img border=0 src="http://www.cppblog.com/images/cppblog_com/xguru/libevent4.jpg"><strong></strong></p>
<p align=left><span></span>&nbsp;</p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;从中也可以了解到不同平台机制的不统一。标准的</span><span> poll</span><span>和</span><span> select</span><span>却难以满足大规模架构的需要，具体可以参考</span><span>Dan Kegel</span><span>的</span><span> "</span><span><a href="http://www.kegel.com/c10k.html"><span>The C10K problem</span></a></span><span>"</span><span>文档。</span></p>
<p align=left><span>关于机制的采用，</span><span>libevent</span><span>采用的是函数指针的方法。</span></p>
<p align=left><em><span>&nbsp;</p>
<p align=left></span></em>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_15_334_Open_Image onclick="this.style.display='none'; Codehighlighter1_15_334_Open_Text.style.display='none'; Codehighlighter1_15_334_Closed_Image.style.display='inline'; Codehighlighter1_15_334_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_15_334_Closed_Image onclick="this.style.display='none'; Codehighlighter1_15_334_Closed_Text.style.display='none'; Codehighlighter1_15_334_Open_Image.style.display='inline'; Codehighlighter1_15_334_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;eventop&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_15_334_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_15_334_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_36_43_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_43_Open_Text.style.display='none'; Codehighlighter1_36_43_Closed_Image.style.display='inline'; Codehighlighter1_36_43_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_36_43_Closed_Image onclick="this.style.display='none'; Codehighlighter1_36_43_Closed_Text.style.display='none'; Codehighlighter1_36_43_Open_Image.style.display='inline'; Codehighlighter1_36_43_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">name;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_36_43_Closed_Text>/**/</span><span id=Codehighlighter1_36_43_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">机制名称</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_82_90_Open_Image onclick="this.style.display='none'; Codehighlighter1_82_90_Open_Text.style.display='none'; Codehighlighter1_82_90_Closed_Image.style.display='inline'; Codehighlighter1_82_90_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_82_90_Closed_Image onclick="this.style.display='none'; Codehighlighter1_82_90_Closed_Text.style.display='none'; Codehighlighter1_82_90_Open_Image.style.display='inline'; Codehighlighter1_82_90_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">init)(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;event_base&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">);&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_82_90_Closed_Text>/**/</span><span id=Codehighlighter1_82_90_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">初始化事件</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_129_136_Open_Image onclick="this.style.display='none'; Codehighlighter1_129_136_Open_Text.style.display='none'; Codehighlighter1_129_136_Closed_Image.style.display='inline'; Codehighlighter1_129_136_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_129_136_Closed_Image onclick="this.style.display='none'; Codehighlighter1_129_136_Closed_Text.style.display='none'; Codehighlighter1_129_136_Open_Image.style.display='inline'; Codehighlighter1_129_136_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">add)(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_129_136_Closed_Text>/**/</span><span id=Codehighlighter1_129_136_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">添加事件</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_175_183_Open_Image onclick="this.style.display='none'; Codehighlighter1_175_183_Open_Text.style.display='none'; Codehighlighter1_175_183_Closed_Image.style.display='inline'; Codehighlighter1_175_183_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_175_183_Closed_Image onclick="this.style.display='none'; Codehighlighter1_175_183_Closed_Text.style.display='none'; Codehighlighter1_175_183_Open_Image.style.display='inline'; Codehighlighter1_175_183_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">del)(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_175_183_Closed_Text>/**/</span><span id=Codehighlighter1_175_183_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;删除事件</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_249_258_Open_Image onclick="this.style.display='none'; Codehighlighter1_249_258_Open_Text.style.display='none'; Codehighlighter1_249_258_Closed_Image.style.display='inline'; Codehighlighter1_249_258_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_249_258_Closed_Image onclick="this.style.display='none'; Codehighlighter1_249_258_Closed_Text.style.display='none'; Codehighlighter1_249_258_Open_Image.style.display='inline'; Codehighlighter1_249_258_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dispatch)(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;event_base&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_249_258_Closed_Text>/**/</span><span id=Codehighlighter1_249_258_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;调度事件&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_306_314_Open_Image onclick="this.style.display='none'; Codehighlighter1_306_314_Open_Text.style.display='none'; Codehighlighter1_306_314_Closed_Image.style.display='inline'; Codehighlighter1_306_314_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_306_314_Closed_Image onclick="this.style.display='none'; Codehighlighter1_306_314_Closed_Text.style.display='none'; Codehighlighter1_306_314_Open_Image.style.display='inline'; Codehighlighter1_306_314_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dealloc)(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;event_base&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">);</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_306_314_Closed_Text>/**/</span><span id=Codehighlighter1_306_314_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;释放资源</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;need_reinit;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p align=left>&nbsp;</p>
<p align=left><span>每个<span>eventop</span>即对应一种<span>IO</span>复用机制，其中的每个函数指针都指向使用该机制对事件进行操作的方法。</span></p>
<p align=left><span>比如对应<span>epoll</span>的<span>eventop</span>结构中：<br><span>1.void *(*init)(&#8230;)</span>函数指针对应的是<span>static void * epoll_init(&#8230;)<br></span>2.在<span>epoll_init()</span>里，首先对环境变量进行检测，发现没有<span>epoll</span>机制时立即返回<span>NULL</span>。<br>3.使用<span>epoll_create(32000)</span>指定了连接数目的上限为<span>32000</span>个，然后对<span>epollop</span>的各个成员所需资源进行分配。<br>4.最后调用<span>libevent</span>自身的信号初始化函数。</span></p>
<p align=left><span>选择机制并将其初始化的过程十分简单：</span></p>
<p align=left><span>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_51_141_Open_Image onclick="this.style.display='none'; Codehighlighter1_51_141_Open_Text.style.display='none'; Codehighlighter1_51_141_Closed_Image.style.display='inline'; Codehighlighter1_51_141_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_51_141_Closed_Image onclick="this.style.display='none'; Codehighlighter1_51_141_Closed_Text.style.display='none'; Codehighlighter1_51_141_Open_Image.style.display='inline'; Codehighlighter1_51_141_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;eventops[i]&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">evbase;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_51_141_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_51_141_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">evsel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;eventops[i];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">evbase&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">evsel</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">init(</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p align=left></span><img border=0 src="http://www.cppblog.com/images/cppblog_com/xguru/libevent5.jpg"></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;遍历存储机制的<span>eventops</span>数组，按顺序依次尝试初始化，一种机制被成功初始化则立即跳出循环。</span><span>当然，检测系统环境可用机制，选择哪种机制更合适，具体的复用机制如何使用，这一切的琐碎细节你都无需关心，使用时，只要调用<span>event_init()</span>函数即可。<span>Libevent</span>对各种复用机制的巧妙封装避免了开发者开发大规模架构时，处理跨平台时机制选择的苦恼。 </span></p>
<img src ="http://www.cppblog.com/xguru/aggbug/118722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-06-25 16:30 <a href="http://www.cppblog.com/xguru/archive/2010/06/25/118722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]VIM命令 Big picture</title><link>http://www.cppblog.com/xguru/archive/2010/06/24/118623.html</link><dc:creator>XGuru</dc:creator><author>XGuru</author><pubDate>Thu, 24 Jun 2010 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/xguru/archive/2010/06/24/118623.html</guid><wfw:comment>http://www.cppblog.com/xguru/comments/118623.html</wfw:comment><comments>http://www.cppblog.com/xguru/archive/2010/06/24/118623.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/xguru/comments/commentRss/118623.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xguru/services/trackbacks/118623.html</trackback:ping><description><![CDATA[<br><a href="http://www.cppblog.com/images/cppblog_com/xguru/14114/o_vim_cheat_sheet1.jpg"><img style="width: 1045px; height: 1525px;" alt="" src="http://www.cppblog.com/images/cppblog_com/xguru/14114/o_vim_cheat_sheet1.jpg"></a><br>可能<a href="http://www.cppblog.com/images/cppblog_com/xguru/14114/o_vim_cheat_sheet.jpg"></a><a href="http://www.cppblog.com/images/cppblog_com/xguru/14114/o_vim_cheat_sheet.jpg">图</a>(<a href="http://www.cppblog.com/images/cppblog_com/xguru/14114/o_vim_cheat_sheet1.jpg"></a><a style="color: #0000ff;" href="http://www.cppblog.com/images/cppblog_com/xguru/14114/o_vim_cheat_sheet1.jpg">这里</a><a style="color: #0000ff;" href="http://www.cppblog.com/images/cppblog_com/xguru/14114/o_vim_cheat_sheet.jpg"></a>)有点大，但是我觉得看起挺方便的。有错误的意见欢迎提出，我会尽快修正。这里有<a href="http://jrmiii.com/2009/03/06/learning-vim-the-pragmatic-way.html"><span style="color: #0000ff;">英文原版。</span><br></a><br>附上几个类似的：<a href="http://www.tuxfiles.org/linuxhelp/vimcheat.html"><span style="color: #0000ff;"><br>1.作弊手册cheat sheet</span></a><span style="color: #0000ff;"> </span><a href="http://www.fprintf.net/vimCheatSheet.html"><span style="color: #0000ff;">这里</span></a>，<br>2.键位图&nbsp;<a href="http://www.swaroopch.com/notes/File:Vi-vim-cheat-sheet.gif"><span style="color: #0000ff;">这里</span></a><span style="color: #0000ff;">[</span><a href="http://www.swaroopch.com/notes/File:Vi-vim-cheat-sheet.gif"><span style="color: #0000ff;">EN</span></a><span style="color: #0000ff;">] [<u><font style="background-color: #f5f5f5;" color="#cc0066"><a href="http://www.phpman.com.cn/wp-content/uploads/2009/02/vi-vim-cheat-sheet.png"><u><font style="background-color: #f5f5f5;" color="#cc0066">CN</font></u></a></font></u>]</span> , <br>3.vgod大神的<a style="color: #0000ff;" href="http://blog.vgod.tw/wp-content/uploads/2009/12/vgod-vim-cheat-sheet-full.pdf">版本</a>，<br>4.<a style="color: #0000ff;" href="http://www.cublog.cn/u/13329/upfile/060504194114.jpg">这里</a>也有一个，<br>5.这里还有张<a href="http://linuxtoy.org/i/2008/08/vi.png"><span style="color: #333399;">壁纸</span></a>。<br><br>
<script src="http://zoom.it/jsx5.js?width=auto&height=400px"></script><img src ="http://www.cppblog.com/xguru/aggbug/118623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xguru/" target="_blank">XGuru</a> 2010-06-24 15:42 <a href="http://www.cppblog.com/xguru/archive/2010/06/24/118623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>