XGuru's Blog

技术,是一种态度。关注:高性能后端技术/服务器架构/C++/C/LAMP

   :: 首页 :: 联系 :: 聚合  :: 管理
  20 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks

公告





twitter / xoXGuru

feedsky
抓虾
google reader
鲜果
QQ邮箱
九点

常用链接

留言簿(12)

搜索

  •  

最新评论

阅读排行榜

2011年7月21日 #

最近重温《Python源码剖析》一书,将python基本对象的要点记录如下
python 整数对象
1.python中的整数使用c语言中的long类型存储
2.python int进行加法会检查结果是否溢出,如果溢出则自动转换为pyLongObject对象
3.python中的文档无缝集成在语言实现中
1 = 11
2 print a.__doc__

4.小整数对象完全缓存在内存中,其他整数对象轮流使用一块内存空间
5.小整数对象在python初始化中调用的_PyInt_Init中创建,然后就一直存在着, 直到python虚拟机退出

python String对象
1.pyStringObject在创建之后,内部维护的字符串不能再改变
2.intern机制是否只在字符数组长度0或者1的时候使用? 书中提供的代码太过于精简了,没讲清楚,但是看后面的演示结果,应该是所有的字符串都实现了intern机制
3.字符串连接操作严重影响python程序执行效率,使用join只需分配一次内存,能够大大提高效率.用法举例
"".join(['s1','s2','s3'])

Python Dict对象
1.Python中的dict采用hashtable而不是R-B Tree。
2.采用开放定址法解决冲突。
3.为保证冲突探测链的连续性,采用伪删除技术,active对象删除则设置为dummy态
4.为减少冲突,转载率大于2/3时则改变table的大小,每次增大4倍,如果table中的active态的元素个数大于50000时(巨型表),
则放慢增长速度,每次增长2倍。可以看出Python中dict的查找效率较高,而对于内存的使用是省了又省,还考虑了巨型表增长减少倍数。

Python List对象
1.PyListObject类似STL中的Vector。
2.Python对内存的使用十分节俭,如果list改变的新尺寸不到分配内存的1/2,则收缩内存.
3.在Pylist中建插入元素需要逐个移动后面的元素,类似C中的数组,因此需要尽量避免对中间元素的插入和删除操作。
4.STL和PyListObject自动扩容算法对比:个人觉得list改名为array比较恰当一些,嘿嘿
//sgi STL:
len 
= (old_size != 0 )?2*oldsize:1
//(不够用则扩充两倍,如果开始为空则设置为1)
//Python:
new_allocated
=(newsize>>3)+(newsize<9?3:6)
//(???)
5.对于增长倍数的选择,这里有讨论
http://en.w3support.net/index.php?db=so&id=1100311

p70书中笔误 :"allcated/2"应改为"allocated/2"

posted @ 2011-07-21 23:16 XGuru 阅读(2504) | 评论 (1)编辑 收藏

2010年12月22日 #

via :Kevin Watters's blog
译:XGuru

原始状态

    我曾经观看过小提琴家非常有激情地拉弦演奏,我有了这种想法:也许我投入到文本编辑器中的脑细胞数量和他为投入所喜好的乐器的演奏中差不多吧。我还有种奇异的想象,当他独奏的时候,脑中的核磁共振图和我在使用VIM中操控代码的的图像也许不会相差太大吧?





    如果你愿意的话请你仔细思考下,以下是一个vimmer的学习旅程的剪辑




Vim涅磐所经历的漫长而艰苦的道路


星期一

    “Eclipse当然是简洁实用的”

    “但是一些满脸落腮胡的奇怪家伙在工作中似乎使用vim确实非常快,我应该试一下。”

    “好吧!我弄了个Gvim,这看起来不是很糟糕,这里甚至还有菜单界面!”

    “等什么?我的文本去哪了?等一下,撤销,不要啊!”

    “:help”

    “:q!!!!!”

    今天剩下的时间还是回到拥有让人上瘾的自动补全样板功能的Eclipse中获得解脱吧


星期二

     “好吧 vim,这是新的一天了,这是个磨砺自己学习新东西的一个崭新的机会,我不是那么容易放弃的人!”

    “为什么我就不能一直呆在插入模式里面呢?FJDSAKLFJDALSKJKLDF(发狂的敲击键盘)”

    “等一下,你在告诉我保存的时候必须按ESC-shift-冒号-w-回车?这简直就是狗屁啊”

    “在花了2个小时学习教程以后,我基本上懂的就是ddp命令可以交换两行的内容,真是蛋疼啊”




一个礼拜以后

     “哇噢,任何地方都有vim阿,这意味着这付出的所有的努力将不会白费,比如当我用ssh远程登入主机修改一些配置的时候”

     “太爽了,嘿,朋友们来看看这个全暗色的配色主题,我新的工具链表面上看起来非常安逸了”

     “噢,真是扯蛋,我的.vimrc没有在我的远程主机里,当我ssh登入编辑一些配置的时候,所有我的酷玩意都没了”




两个月以后

     HJKL的移动方式习惯成自然,你神秘的失去了使用鼠标的能力。

    “我将始终使用我刚下载的这400个插件!尤其是这个折叠latex语法的插件,噢,哥们”

    “使用小箭头方向键简直是自我折磨阿”

    “再见,Caps Lock键”

    “就这样吧,这是忍耐的极限,vim甚至不能让文本合适的自动换行,我准备回到edit.com了”



一年后

    更少的大声说话了。

    安装command-T插件,每天节约成百上千次的键盘敲击。

    用宏试着让你肩膀后的某个人感到印象深刻,通过在整个文件里混合大小写和参杂ROT13暗码(回转十三位加密)。

    最终在某个奇迹般的一天学会在肌肉记忆里用ctrl+[来延缓了腕关节炎症降临。

    学会了移动光标,使用visual模式和*键----这意味着已经没有退路了。

    “vim不支持交互性缓存?都20年了?好吧,作为一名黑客,我决定给它添加这项支持。”

    查看vim代码库,疯狂地让它向相反的方向运行。

    “谁无论如何也需要在编辑器里弄个控制台?我就是所有的unix哲学。”

    对周围的”vim只是将一个编辑模式合并到真正的编辑器中“观念感到无可忍耐。

    因为你老是在房间里令人讨厌地回复”:w”,IRC的朋友们最后将你孤立


两年以后

    vim脚本就是一种对上帝的深恶痛绝。

    有点觉得emacs的从始至终的指令模式相对有点像在天堂一样。

    我昨晚做了一个噩梦,梦到我始终没有学会在宽屏显示器中垂直切分窗口,这样提心吊胆真是够混帐阿。

    偷偷地瞄一下周围,绑定ctrl+s到保存,允许自己悄悄地松一口气。

    意识到hjkl搜索定位不足以成为终极时间节约工具,发现:python脚本,所建立的大量定制功能达到鼎盛期,对<Leader>key绑定直到你的键盘类似于NASA指挥中心控制面板一样有点繁多到荒谬的功能感觉有一点糟糕。

   “嘿,每个听的到我声音的家伙过来看看,我现在控制电脑,写博客,检查邮件,运行测试,调试程序,浏览黑客新闻
           所有的一切都能在vim温暖舒适,超级可以定制化的母体中进行”

    为什么你这小子不做几个后空翻来庆祝一下呢?



模糊又很长某段时间之后

    在“文本编辑中模态的明显的优势”演讲结束后失去了几个朋友。


    尽情享受在github.com/me/vimfiles中分享自己配置的快乐中,有义务完成关于如何特立独行地安装语法检查,lint工具,自动补全,快速文档查看,成吨的杀手级缩写,世界上所有文件类型对应的插件,使vim在每种功能的高效性上接近真正的IDE的博客帖子。开机时间日志写入服务器,下意识地使用nano来编辑配置文件。不会为没有使用插件和vimrc中的更多语法而更新所有的配置文件而感到深深的羞愧。

    变得十分淡定,重复性的编辑任务再也难不住你,不再去参加emacs与vim谁好谁坏的争论


...这就是你用vim时大脑的终级形态






 --EOF--
Creative commons license
by XGuru is licensed under a Creative Commons 署名-非商业性使用-相同方式共享 2.5 中国大陆 License.

posted @ 2010-12-22 23:05 XGuru 阅读(13295) | 评论 (11)编辑 收藏

2010年12月1日 #

via:git.or.cz


posted @ 2010-12-01 11:54 XGuru 阅读(1044) | 评论 (3)编辑 收藏

2010年10月24日 #

2010 developer’s problem solving sequence:

from: 


1.Google
    技术上的问题多去google,wikipedia上看看绝对没错,想看性用品广告就多上上Baidu。

2.Coworkers
    找同事帮忙,如果你的同事热心肠而且技术不错,而且遇到过类似的问题,他的建议就会很显得非常宝贵,也许就能一针见效。

3.StackOverflow
    去编程互助网站搜索下答案,不行就上去发帖提提问,热心人还是蛮多的,但是感觉这个网站上的Java/.Net的问题比较多。

4.RTFM
    读下令人郁闷的帮助文档(Read the f*cking manual),在linux下man一下或者查看下MSDN文档,mannual文档一般会组织得很好,很清晰。但是语言表达得太专业化了,有时候会让人很郁闷。

5.Think
    最后不行了,还是自己想下怎么解决问题吧,求人不如求己。

posted @ 2010-10-24 15:18 XGuru 阅读(10633) | 评论 (8)编辑 收藏

2010年10月7日 #

大家都为linux下压缩格式繁多,而且每种格式都对应不同的命令,这是个很让人头疼的问题。
我就介绍个方法给大家:
在bashrc里加入

ex () {
  
if [ -f $1 ] ; then
    
case $1 in
      
*.tar.bz2)   tar xjf $1        ;;
      
*.tar.gz)    tar xzf $1     ;;
      
*.bz2)       bunzip2 $1       ;;
      
*.rar)       rar x $1     ;;
      
*.gz)        gunzip $1     ;;
      
*.tar)       tar xf $1        ;;
      
*.tbz2)      tar xjf $1      ;;
      
*.tgz)       tar xzf $1       ;;
      
*.zip)       unzip $1     ;;
      
*.Z)         uncompress $1  ;;
      
*.7z)        7z x $1    ;;
      
*)           echo "无法解压'$1'文件!!" ;;
    esac
  
else
    echo 
"'$1' 不是一个合法的文件!"
  fi
}



解压文件的的话只需要简单输入"ex [压缩文档]"就可以了,如果你有其他格式的压缩文档格式也可以自己加入进来。
从此告别烦人的各种解压缩命令。
posted @ 2010-10-07 21:54 XGuru 阅读(3128) | 评论 (5)编辑 收藏

2010年7月27日 #


                   Emacs是否真的能煮咖啡?        by XGuru









    坊间有传言曰:“emacs无所不能,甚至能够用来煮咖啡!”

    煮咖啡何解?勾起了我的考究欲望。

    上网搜索之,得出几种初步结论如下:

    1.这只是一种好玩的说法,只是用来形容emacs功能无所不包而已。

    2.Java的标志就一杯咖啡,用来形象的表示写代码

          

    3.emacs的确具有煮咖啡的功能,有脚本能够控制自动咖啡机运行。


    觉得第一种说法比较符合逻辑;第二种说法感觉有点唐突,毕竟Emacs是Richard Stallman(GNU创始人)所写,而Java是Bill Joy(vi作者)等人完成的,这两派都差点上升到宗教冲突了,这种解释有点差强人意;第三种的如果是真的话就会变得很有趣。


    于是就开始了探究,首先追本溯源,找到这段脚本代码的源头。发现已经地址已经失效,终于在在debian的一个软件包里找到了副本这是emacs常用脚本的一个打包。

代码如下
  1 ;;; coffee.el --- Submit a BREW request to an RFC2324-compliant coffee device
  2 ;;;
  3 ;;; Author: Eric Marsden <emarsden@laas.fr>
  4 ;;; Version: 0.2
  5 ;;; Copyright: (C) 1999 Eric Marsden
  6 ;;; Keywords: coffee, brew, kitchen-sink, can't
  7 ;;
  8 ;;     This program is free software; you can redistribute it and/or
  9 ;;     modify it under the terms of the GNU General Public License as
 10 ;;     published by the Free Software Foundation; either version 2 of
 11 ;;     the License, or (at your option) any later version.
 12 ;;    
 13 ;;     This program is distributed in the hope that it will be useful,
 14 ;;     but WITHOUT ANY WARRANTY; without even the implied warranty of
 15 ;;     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 16 ;;     GNU General Public License for more details.
 17 ;;    
 18 ;;     You should have received a copy of the GNU General Public
 19 ;;     License along with this program; if not, write to the Free
 20 ;;     Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 21 ;;     MA 02111-1307, USA.
 22 ;;
 23 ;; Please send suggestions and bug reports to <emarsden@laas.fr>.
 24 ;; The latest version of this package should be available at
 25 ;;
 26 ;;     <URL:http://purl.org/net/emarsden/home/downloads/>
 27  
 28 ;;; Commentary:
 29 ;;
 30 ;; This module provides an Emacs interface to RFC2324-compliant coffee
 31 ;; devices (Hyper Text Coffee Pot Control Protocol, or HTCPCP). It
 32 ;; prompts the user for the different additives, then issues a BREW
 33 ;; request to the coffee device.
 34 ;;
 35 ;; coffee.el requires a special BREW-capable version of Emacs/W3 to be
 36 ;; installed.
 37 ;;
 38 ;; Reference: <URL:ftp://ftp.isi.edu/in-notes/rfc2324.txt>
 39 ;;
 40 ;;
 41 ;; Thanks to Giacomo Boffi <giacomo.boffi@polimi.it> for some typos
 42 ;; and the addition of the "Brown-Coffee" sweetener type.
 43  
 44 ;;; Code:
 45  
 46 (require 'cl)
 47  
 48 (defvar coffee-host "coffee"
 49   "*The host which provides the coffee service.")
 50  
 51 (defvar coffee-pot-designator 1
 52   "*On machines with multiple pots, the number of the pot to brew in")
 53  
 54 (defvar coffee-brew-hook nil
 55   "*Hook executed before issuing a BREW request")
 56  
 57 (defconst coffee-milk-types
 58   '("Cream" "Half-and-Half" "Whole-Milk" "Part-Skim" "Skim" "Non-Dairy"))
 59  
 60 (defconst coffee-syrup-types '("Vanilla" "Almond" "Raspberry" "Chocolate"))
 61  
 62 (defconst coffee-sweetener-types '("White-Sugar" "Brown-Sugar" "Artificial-Sweetener"))
 63  
 64 (defconst coffee-alcohol-types '("Whiskey" "Rum" "Kahula" "Aquavit"))
 65  
 66 (defconst coffee-addition-types
 67   `(("Milk"      . ,coffee-milk-types)
 68     ("Syrup"     . ,coffee-syrup-types)
 69     ("Sweetener" . ,coffee-sweetener-types)
 70     ("Alcohol"   . ,coffee-alcohol-types)))
 71  
 72 ;;;###autoload
 73 (defun coffee ()
 74   "Submit a BREW request to an RFC2324-compliant coffee device"
 75   (interactive)
 76   (require 'url)
 77   (let* ((additions-list
 78           (append coffee-milk-types
 79                   coffee-syrup-types
 80                   coffee-sweetener-types
 81                   coffee-alcohol-types))
 82          (additions-string
 83           (mapconcat #'identity additions-list ","))
 84          (url (coffee-url))
 85          (url-request-method "BREW")
 86          (url-request-extra-headers
 87           `(("Content-type"     . "message-coffeepot")
 88             ("Accept-Additions" . ,additions-string)))         
 89          (url-request-data "START"))
 90     (run-hooks 'coffee-brew-hook)
 91     (url-retrieve url)))
 92  
 93 (defun coffee-additions ()
 94   (let* ((type-name
 95           (completing-read "Coffee addition: " coffee-addition-types nil t))
 96          (type (cdr (assoc type-name coffee-addition-types)))
 97          (ingredients (mapcar #'(lambda (a) (cons a a)) type))
 98          (ingredient
 99           (completing-read "Addition type: " ingredients nil t)))
100     ingredient))
101           
102 (defun coffee-url ()
103   (require 'w3-forms)
104   (concat "coffee://" coffee-host "/"
105           (int-to-string coffee-pot-designator)
106           "?" (w3-form-encode-xwfu (coffee-additions))))
107  
108  
109 (provide 'coffee)
110  
111 ;; coffee.el ends here

    这个脚本看起来还是煞有其事的,文中提到"Submit a BREW request to an RFC2324-compliant coffee device"

    能够向与RFC2324协议兼容的咖啡设备提交BREW请求
,即兼容Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)协议。超文本咖啡壶协议,光看这名字就够喜庆了,但这份协议写得很规范,看不出一丝破绽。有细心的朋友shrek.wang提醒了我,注意看日期:

Network Working Group                                       L. Masinter
Request for Comments: 2324                                 1 April 1998

    1998年4月1号,愚人节!这个就让人产生了疑问。
    通过查wiki发现,原来互联网国际标准机构也是很有才的恶搞高手。

这里列举其中几个好玩的
    • 2001年,RFC 1149由一班挪威Linux使用者协会的成员实现了。他们传送了9个封包到约5公里外的地方,每个封包由不同的鸽子携带,并有一个ICMP应答要求封包(ping)。他们收到4个回应,封包流失率是55%,回应时间是3000至6000秒。[1]
    • RFC 1607 来自21世纪的观点 Vint Cerf 1994
    • RFC 3091 圆周率数字产生协定 . H. Kennedy 2001年
更多的可以看这里wiki

  
     这里可以大胆地作出推断,这个协议只是 IETF 开的一个善意的joke,而coffee.el的作者Eric Marsden也是一个幽默的程序员,于是就做了一个兼容RFC2324的脚本,他也没想过要真正的控制咖啡机,所以这整个事情都源于程序员的冷幽默。
                          
     然而远程控制咖啡机还是有可能的,这里有一个开源咖啡机;这里还有一个允许网络控制的咖啡机(据说还是兼容RFC2324的)。
     估计IETF应该做梦也没想到自己开的一个玩笑竟然还真的有人做出了实物。 国外的牛人们还真是闲得蛋疼阿。可见geek们还是极富幽默感的。
朋友们,你的心中已经有答案了么?你们想要一台这样的咖啡机不?







PS.在这里BS下CPPBLOG的编辑器,真的很烂啊,文章写到一半时点保存,竟然给发布了!

 Creative commons license

by XGuru is licensed under a Creative Commons 署名-非商业性使用-相同方式共享 2.5 中国大陆 License.


posted @ 2010-07-27 21:15 XGuru 阅读(12914) | 评论 (5)编辑 收藏

2010年6月28日 #

豆瓣火狐小组是这样说的:


Firefox不是完美的,不是最稳定的,不是没有漏洞的,也不是最快的,但它可以是自己的。



很喜欢这句话,就是因为有了丰富多彩的插件,火狐才能如此的受欢迎.
下面的这几个插件是我个人最喜欢的,推荐给大家!


1.ColorfulTabs

人对颜色的分辨别速度大大超出文字,根据页面的主色调生成标签颜色,让你的标签变得色彩斑斓.不仅赏心悦目,更让你方便地切换到想要的标签.



插件地址


2.All-in-One Gestures

这年头,没有鼠标手势还能活么?该插件操作快捷,定制性强!
插件地址


3.AutoProxy

非常智能好用的Fuck GF.W的插件,tor,proxy,ssh都能很好的支持,最爽的是可以订阅规则,决定那些页面使用代理,哪些无须使用.和谐社会,和谐你我他!




插件地址


4.Readability

当页面繁杂不堪,难以阅读时,轻轻一点,魔法立现.整页面变得美观大方,甚至感觉像是在看一份精美排版报纸/小说.

整容前:



整容后:



插件地址



5.Tab Popup

当你鼠标放在不同的标签页上,就会显示出该页的缩略图.
插件地址


6.Adblock Plus

广告已经成往事!告别各种烦人的弹窗.
插件地址


7.Vimperator

让你的firefox变得像vim一样舒服,适合骨灰级vimer!


(图from linuxtoy)

插件地址 在线帮助


8.Personas Plus

firefox皮肤想换就换!打造个性的firefox
插件地址


9.Integrated Gmail



google发烧友必备,将google其他的功能都集中到gmail里.All your Google Needs in One Place!
插件地址

相似的有另外一个优化 greader的插件,一个google产品大全的shortcuts插件



PS:
插件多了会当然会使firefox变慢,大家根据需要禁用一些
自己平时不常用的插件.
另外Firefox 3.6.6主要是改进了插件崩溃或者停止响应之后终止该插件的时间.喜欢装插件的朋友赶快更新吧!
win 32位版本下载
linux 32位版本下载

--EOF--
posted @ 2010-06-28 23:29 XGuru 阅读(4791) | 评论 (2)编辑 收藏

2010-12-29-update:找到一个最新的版本,由jason提供,地址在这


上网找了几个版本在ubuntu下都用不了
于是就自己重新修改了jackbillow的版本,用起来感觉还不错.



Usage: nginx.sh {start|stop|conf|restart}
//开始|停止|配置|重启

注:需要以管理员身份运行


################################################
#!/bin/bash
# v.0.0.3
# create by jackbillow at 2007.10.15
# redevelop by XGuru at 2010.6.28
# On Ubuntu 10.04
# nginx - This shell script takes care of starting and stopping nginx.
#
# description: nginx [engine x] is light http web/proxy server
# that answers incoming ftp service requests.
###############################################


nginx_path
="/usr/local/nginx"
nginx_pid
="/usr/local/nginx/logs/nginx.pid"
prog="nginx"

RETVAL=0


start() {
# Start daemons.
        if [ -$nginx_path/conf/nginx.conf ];then
          echo 
-n $"Starting $prog: "
          
$nginx_path/sbin/nginx -$nginx_path/conf/nginx.conf &
          RETVAL
=$?
        [ 
$RETVAL -eq 0 ] && {
        echo Start 
"$prog" successfully!
        }
        
else
        RETVAL
=1
        fi
        
return $RETVAL
}
# Stop daemons.
stop() {
        echo 
-n $"Stopping $prog\n"
        sudo killall 
-9 nginx
        RETVAL
=$?
}
# See how we were called.

conf(){
        gvim 
"$nginx_path/conf/nginx.conf"
}
case 
"$1" in
start)
        start
        ;;
stop)
        stop
        ;;
conf)
        conf
        ;;        
restart)
        stop
        start
        ;;

*)
        echo $
"Usage: $0 {start|stop|conf|restart}"
        echo $
"Your may need root privilege to execute this script!"
        
exit 1
esac
exit $RETVAL

--EOF--
posted @ 2010-06-28 16:43 XGuru 阅读(945) | 评论 (0)编辑 收藏

2010年6月25日 #

 libevent的初衷就是设计一个跨平台的轻量级I/0框架,由于历史问题,各平台的I/O复用机制难以统一。因此,这部分处理跨平台的方法值得重点关注。

 eventop在源码中定义如下:

static const struct eventop *eventops[]={

#ifdef HAVE_EVENT_PORTS

         
&evportops,

#endif 

….

}

    由此可见libevent通过宏来在编译期找出可用的复用机制。

其中的顺序也是大文章的。官方的文档中说明libevent中支持的复用机制 /dev/poll, kqueue(2), event ports, select(2), poll(2) and epoll(4).

    libevent开发人员通过对各种机制的基准测试,根据性能高到低选择复用机制优先顺序如图所示:

 

    从中也可以了解到不同平台机制的不统一。标准的 poll select却难以满足大规模架构的需要,具体可以参考Dan Kegel "The C10K problem"文档。

关于机制的采用,libevent采用的是函数指针的方法。

 

 

struct eventop {
    
const char *name; /*机制名称*/
    
void *(*init)(struct event_base *); /*初始化事件*/
    
int (*add)(void *struct event *);    /*添加事件*/
    
int (*del)(void *struct event *);    /* 删除事件*/
    
int (*dispatch)(struct event_base *void *struct timeval */* 调度事件 */
    
void (*dealloc)(struct event_base *void *);/* 释放资源*/
    
int need_reinit;
}
;

 

每个eventop即对应一种IO复用机制,其中的每个函数指针都指向使用该机制对事件进行操作的方法。

比如对应epolleventop结构中:
1.void *(*init)(…)函数指针对应的是static void * epoll_init(…)
2.在epoll_init()里,首先对环境变量进行检测,发现没有epoll机制时立即返回NULL
3.使用epoll_create(32000)指定了连接数目的上限为32000个,然后对epollop的各个成员所需资源进行分配。
4.最后调用libevent自身的信号初始化函数。

选择机制并将其初始化的过程十分简单:

 

    for (i = 0; eventops[i] && !base->evbase; i++{

       
base->evsel = eventops[i];

       
base->evbase = base->evsel->init(base);

    }

    遍历存储机制的eventops数组,按顺序依次尝试初始化,一种机制被成功初始化则立即跳出循环。当然,检测系统环境可用机制,选择哪种机制更合适,具体的复用机制如何使用,这一切的琐碎细节你都无需关心,使用时,只要调用event_init()函数即可。Libevent对各种复用机制的巧妙封装避免了开发者开发大规模架构时,处理跨平台时机制选择的苦恼。

posted @ 2010-06-25 16:30 XGuru 阅读(1724) | 评论 (0)编辑 收藏

2010年6月24日 #



可能(这里)有点大,但是我觉得看起挺方便的。有错误的意见欢迎提出,我会尽快修正。这里有英文原版。

附上几个类似的:
1.作弊手册cheat sheet
这里
2.键位图 这里[EN] [CN] ,
3.vgod大神的版本
4.这里也有一个,
5.这里还有张壁纸

posted @ 2010-06-24 15:42 XGuru 阅读(3399) | 评论 (2)编辑 收藏