K-PAX

第一次完整读完了的一个英文中篇小说《K-Pax》. 在春节前先看了同名的电影,很是惊艳,就又找了英文原版小说来读。开始读着很吃力,本着日拱一卒的精神,每天读一点,到后来越来越快,今天终于读完。学了这么多年英语,最近终于开始有所收获了。

电影相对小说做了很多裁剪,结果其中有些没有完全明白,等看完小说才知道。小说非常精彩,强烈推荐。电影也很好,凯文·史派西演绎的非常出色。很喜欢这类介于科幻与现实之间的小说,你可以用科幻解释它,也可以用现实来解释,给人无限的想象空间。

 

 

转:Linux内核管理风范

看到了太好的文章,立刻转贴了。 表面上是个面向技术人员的文章,但里面提到的观点对其他行业的人都可能会有很多启发。

文章原作者是Linux之父Linus Torvalds, 原文标题 Linux kernel management style, 翻译者是[email protected], 译文原地址在http://wiki.woodpecker.org.cn/moin/LinuxKernelManaStyle, 英文原文在 http://openlife.cc/onlinebook/epilogue-linux-kernel-management-style-linus-torvalds

============================

1. 中译.Linux内核管理风范

1.1. 导言

Linus Torvalds 在2004年把一篇讲”Linux内核的管理风格”的文章放在了内核源码文档里。这篇文章有意对应他以前写的关于编码 风格的文章(比如烧书仪式),也有技术人员熟悉的Dilbert卡通的影子。 Henrik Ingo 写”Open Life: The Philosophy of Open Source“一书的时候,拿这篇文章作了后记。

这篇文章其实是总结了Linus十几年里领导开源运动的经验。更重要的是,它讲述了一种与传统不同的做事理念,一种后互联网时代的、尊重技术和自由的理念。

Linus的写作诙谐生动,完全不同于ESR的《大教堂和市集》。所以我作了比较自由的翻译。以下是译文。

 

1.2. Linux内核的管理风格

(Linux kernel management style, by Linus Torvalds. Retrieved from http://openlife.cc/node/43, Jan-28-2008)

这个简单文档描述Linux内核偏爱的(或编造的,取决于你问谁)管理模式。它在一定程度上是编码风格文档的影子,主要写来避免一遍又一遍回答同一类问题*。

  • 管理风格是很个人化的,比起简单的编码风格条例更难量化,所以这个文档跟现实可能沾边也可能不沾边。它开始于游戏,但是不见得就不作数。你只有自个儿决定。
  • 顺便说一下,我们说到”内核管理者”的时候,完全是说技术带头人,不是公司里那些作传统管理工作的人。如果你是在订单上签名的人或者对你们组的预算知道一丁半点,你几乎一定不是个”内核管理者”。这些建议对你可能适用也可能不适用。
  • 首先,我建议你买一本《高度成功人士的七个习惯》,不-要读它,烧了。表一下决心。
    • (*) 这个文档不见得”回答”多少问题,更大程度上是展示我们的无知,让提问者死了这条心。

不管怎样,开讲了:

 

1.2.1. 第一章:决定

每个人都觉得管理者是作决定的,作决定是很重要的。决定越大、越艰难,管理者就越伟大。这一点很深刻、很明显,但不见得正确。

  • 事情的要义是避免-作决定的必要性。特别是,当有人告诉你”是甲还是乙,我们需要你来作决定”,你作管理的麻烦就来了。你手下的人一般比你更懂具体问题,所以要是他们找你作一个技术性的决定,你死定了。要替他们作决定,你显然水平不够。

(推论:如果你手下的人不比你更懂具体问题,你还是死定了,尽管出于完全不同的原因。说白了就是你站错了岗位,应该他们-来管理你的才华才对。)

  • 所以要义是避免-决定,至少避免大的和艰难的决定。作小的、不重要的决定还好了,而且让你挺挺板板、面上有光。所以一个内核管理者需要的是把大的艰难的决定变成没人在乎的小事情。
  • 帮你点拨一下,大决定和小决定的区别在于你能否事后修补得了。如果你犯错了的时候(而且你会-犯错),你能返回来弥补损失,那么你可以把任何的决定变成”小决定”。一下子,你的表现机会多了一倍:你要作两-个不重要的决定,错误决定”加上”正确决定。
  • 而且大家甚至会认为这是领导才能(咳咳,狗屁,咳咳)。因此避免作重大决定的要点成了仅仅避免做不可逆反的事情。不要被牵引到一个无路可逃的角落里。困在角落里的耗子或许是危险的,困在角落里的管理者不过是个可怜虫。
  • 事实上,不管怎样-,没有人会愚蠢到让一个内核管理者承担太大的财政责任,所以纠正错误一般不是多难。既然你没有机会浪费掉你倾家荡产也还不清的巨额经费,你要纠正的不过是一个技术性的决定。那就好办了:告诉每个人你是个不称职的白痴,说对不起,把你让大家上一年作的无用功都扔掉。一下子,你一年前作的决定也不见得是什么重大决定,既然能简单的撤销掉。
  • 然而事实上,有些人搞不来这个办法。有两个原因:
    • (一)承认自己是傻瓜做起来蛮难的。我们都喜欢保持形象,公开认错有时候是很困难。
    • (二)对下级的工程师来说,被人告知自己上一年的工作落得一文不值,也是很恼火的。实际的工作结果-可以删除了事,但你可能就永久性的失去了这个工程师的信任。记住,”永久性”是我们要避免的第一件事,这样你的决定最终还是一个重大决定。
  • 所幸的是,你对两个原因都可以棋高一着,未雨绸缪,防患未然。办法是:事先就承认你狗屁不懂,告诉大家你的决定不过是摸着石头过河,说不定就掉河里了。
  • 你应该永远保留改变决定的权利,而且要让大家明白-这一点。而且在你做了真正的傻事之前承认你是个傻瓜要容易的多。
  • 这样,当事情真的到了傻冒的地步,人们不过是翻下眼皮,说:”唉……真是灵验啊……”
  • 这种事先承认不足的做法可能还会让下面真正做事的人三思而后行,想一下值不值。说回来,如果他们-都不确定是个好主意,你铁定了不应该给他们开绿灯,煽风点火。至少要让他们在开始大动作之前好好想一下。
  • 记住:他们在细节上应该知道的比你多,而且他们一般觉得一切已在掌握之中。作为管理者,你能做的最好的事情不是给他们填充信心,而是给他们适量的批判理性。
  • 顺便说一下,另外一个避免决定的办法是装可怜,简单地问”我们为什么不能两个都做呢?” 相信我,这个有用。如果不清楚哪条路子更好一些,他们最终会整明白的。答案或许是两帮人都挫败灰心,双双放弃。
  • 这听起来像是个失败,但它一般是两个项目都有问题的迹象,大家无法决定的原因是双方都错了。结果是你成了智慧的舵手,而且你又避免了一个本来会死得很难看的决定。

 

1.2.2. 第二章:人

大多数人都是傻瓜,当管理者就意味着你不得不和这一点打交道。或许更重要的是,他们-不得不和你-打交道。

  • 事实证明,消除技术性问题还是容易的,消除人脑筋里的问题就没那么容易了。你就不得不忍受这些问题,他们的还有你自个儿的问题。

然而,为了做好内核管理者,最好记住不要自绝后路,伤及无辜,或树敌过众。现实是,疏远人们是蛮容易的,把他们拉拢回来就难了。因此”疏远”直接归类到”不可逆反”的事情里,就是第一章里说的大忌。

  • 这里只有两条简单的规则:
    • (一)不要骂人猪头(至少不要在公开场合下)
    • (二)要是你忘了第一条,学会怎样道歉
  • 第一条的问题是太容易违反,因为你有一万种骂人猪头的办法*,有时不自觉就骂了,而且几乎总是义愤填膺、义正严词。
  • 而且你越是骂的热血沸腾(让我们来面对事实,你可以骂几乎任何-人猪头,你往往不-会骂错),事后你越难道歉。
  • 要解决这个问题,你其实只有两条路子:
    • (一)成为道歉专家
    • (二)”遍洒博爱,处处留情”,这样没有人会觉得受到了特殊待遇。骂出新意,骂出水准,他们没准会找到艺术的享受。
  • 第三条路子,始终如一的作谦谦君子,是行不通的。没有人会信任城府太深的人。
  • *保罗西蒙的歌唱道”失恋五十种”,是因为老实说,”骂一个程序员猪头一万种”没有那么押韵。不过我相信他肯定考虑过这个。

 

1.2.3. 第三章:能人

尽管现实是大多数人都是傻瓜,不幸的推论包括你也是傻瓜之一,尽管我们都心安理得的自认比傻瓜高明(让我们来面对事实,没有人自认傻瓜或不如傻瓜),我们还是应该承认我们不是独步江湖,总会有一些人不像我们一样的傻瓜。一些人嫉贤妒能,另一些人从善如流。

  • 确定你,作为一个内核管理者,属于第二种。贴紧了高手能人,因为他们会使你的工作变容易。特别是,他们将能够替你作决定,这正是事情的要义。
  • 所以你要是发现了比你聪明的人,顺水推舟好了。你的管理职责很大程度上就成了说一下”听起来是个好主意,放手去干吧”,或者”这个不错,那个XXX怎么样呢?”。第二个版本尤其有效:你要么学到一些关于”XXX”的新东西,要么指出了聪明人都没想到的东西,表现得胸有-韬略。随便那种情况,你都是赢家。
  • 另外一件要小心的事情是,一个人在一方面厉害不见得在其他方面也厉害。你或许煽动谁做什么,但是让我们来面对事实,他或许精通自己的一亩三分地却其他什么都做不来。好的消息是,人们自然而然的倾向于选择自己擅长的事情来做。所以你真的-煽动一下,一般不见得会造成什么不可逆反的后果,只是不要用铁扇公主的芭蕉扇来煽。

 

1.2.4. 第四章:担当

事情总会出错的,大家会找人来责怪。哈,就是你了。

  • 担当责任其实不是那么难的,尤其是当大家心里也有数,不全-是你的错的时候。这带来了担当责任的最好的方式:代人受过。你会因为挑起了担子而心安,那个真正搞砸了的家伙不会成为众矢之的而颓废,至于那个因为你的失职而丢失了半个硬盘的A片的家伙,也会嘟嘟囔囔的承认你至少没有猥猥琐琐的推卸责任。
  • 然后,私下-告诉那个搞砸了的家伙是他搞砸了(如果你能发现他的话)。这样不仅让他以后避免重犯,而且让他知道他欠你一个人情。而且,或许更重要的是,他可能就是那个能修补事故的人。因为,让我们来面对事实,你肯定不行。
  • 担当责任也是最初你来作管理者的原因。这是领导者的本分。大家能信任你,给你荣誉,是因为你在必要的时候能说”是我不好”。而且如果你已经遵循了前面的规则,你现在说这个应该很在行了。

 

1.2.5. 第五章:禁区

比骂人”猪头”更招人恨的是用挖苦的语调骂人”猪头”。你可以为前一个道歉,后一个你都不会有道歉的机会。即使你其他方面都做的很好,他们可能也不会再听你的了。

  • 我们都自我感觉良好,就是说当别人指手划脚的时候,真的-是可忍孰不可忍。你可能在才智品行上超出你周围所有的人,但是你要不是真的想-招惹谁的话*,不要”表现”得太明显。类似的,处理问题不要太客气或微妙。客气往往会隔靴搔痒,不得要害。就像人家说的,”在互联网上,没有人听得到你微妙”。大张旗鼓、锣鼓喧天的把你的意见摆出来,不然你没法指望大家领悟到。
  • 一点幽默可以帮助润滑你的蛮横和说教。过分夸张到荒诞的地步,既能充分表达你的观点,又不至于让对方难堪,因为他只会认为你在发疯。这样就可以绕过我们每个人都有的、抵制批评的心理盲区。
    • *支一招:和你的工作不直接相关的网络论坛(译者按:Linus是说新闻组。没看到西方国家的论坛事业有中国这么发达。)是发泄的好地方。隔三岔五的,狞笑着写点侮辱人的帖子来点燃战火,会让你再次焕发青春。只是不要把战火烧到自己的老巢。

 

1.2.6. 第六章:为什么是我?

  • 既然你的主要职责好像就是代人受过,赤裸裸的展示自己如何不称职,显然的问题是:那你为什么还要做呢?
  • 首要的是,可能有也可能没有尖叫着的小女生(或者小男生,我们不要作道学家或性别岐视)来敲你更衣室的门,作”负责人”会-给你带来巨大的个人成就感。不用说你的”领导”其实是拼命从后面追赶大家、努力跟上大家的步伐。每个人还是会认为你是”负责人”。

如果你能驾驭得了,这是一项伟大的工作。

 

游戏中的感悟

前一阵和朋友谈起打牌,中间聊到麻将,就想起10年前一件事。 当时和一个朋友在一个小村子里,那个朋友和当地人晚上打麻将,居然赢了几千,相当的意气风发。 听说我不会打麻将,很是为我惋惜,说了一大通。别的都没记住,就记住一句:“打麻将能让人明白很多人生道理的”。

到现在也没学打麻将,不过这句话让我想到,其实很多游戏都给自己不少的感悟, 明白一些人生的道理,这里和大家分享一下。

中国象棋的感悟

  1. 不要光看着当前怎么走,而要想到几步以后
  2. 太容易得到的好处很有可能是陷阱

 

围棋的感悟:

  1. 含而不露的棋往往是力量很大的,那种咄咄逼人的反倒有可能是纸老虎。
  2. 要懂得放弃

 

足球的感悟:

  1. 人不是放在一起就叫团队的,要经过训练磨合。
  2. 配合好的团队迸发的力量很惊人

 

长跑的感悟:

  1. 找到适合自己的节奏很重要,跟着别人的节奏很有可能会被拖垮,哪怕这个人比你慢。

 

登山的感悟:

  1. 你可以爬的很慢很慢,中间也可以休息,但不要无计划的长时间停下来,俗话说的:“不怕慢,就怕站”,“远山怕慢牛”。 如果要休息,一定要有计划的休息。人生中的很多目标也是如此。
  2. 不要以登顶为唯一目标,要学会享受攀登的过程。

 

红警的感悟:

  1. 刚开始玩红警时,我总想着建设好了再打别人,可往往这时候别人也建设好了。 明白了不要想着什么都准备好了再去找机会。

 

实况足球的感悟:

  1. 不用去尝试很多阵型,你只用把一种阵型练到极致

 

文明给我的感悟:

  1. 这是个合作的世界
  2. 要让和你合作的人得到好处,甚至让对方占大头,这样人家才会乐意和你长期合作。

Toastmaster

机缘巧合,1个月前开始参加珠海Toastmaster最早的俱乐部TMC的活动,观察了半个月后正式加入。 感觉Toastmaster很不一般,很值得做企业或做公益组织的去研究学习。 Toastmaster是个全球性NGO组织,从1924年在美国发起,现在有几十万会员,只有全球主席一人拿薪水,其他都是志愿者。 而全球主席和各分区主席都是选举产生,每半年轮换。 这个组织还在不断壮大中,光是珠海就有4个俱乐部。

曾听一个企业家说, 最好的管理是用制度管理人。而Toastmaster把这一点发挥到了近乎极致。 所有的人,包括管理人员,都在不停变动,而这个组织则稳步发展壮大, 靠的就是他设计的非常巧妙的制度机制。 我还在详细捉摸中,越捉摸越感觉整套机制的设计充满了智慧。等彻底想明白了和大家分享,今天太晚先睡了 :)。

第一次做Ah Counter

在珠海TMC今晚的meeting中,第一次做了Ah Counter。 记录的比较详细,但上去做介绍和报告还是很紧张,断断续续的。 下次可以放松点,最后报告更有条理些。

和大家分享两个做Ah Counter的两个经验。

  1. 可以从http://www.fourseasonstoastmasters.com/docs/Ah-CounterTallySheet.xls 下载Ah Counter Sheet, 并打印出来。 在meeting开始前根据Agenda将人名填好,记起来方便很多
  2. 还发现一个用特别适合Ah Counter的计数器,在https://itunes.apple.com/us/app/counter-+/id478557426?mt=8 。 可以把第一屏设置为临时计数器,第二个设置为记录TM, 第三个用来记录Table Topic Master

有些背景信息,大家可参看下列资料

  1. What is Toastmaster?
  2. What is Ah Counter?

Selenium WebDriver学习笔记一

Selenium是web自动化测试框架,从2.0版本后加入了webdriver功能, 可以用java,python等主流语言完全操控浏览器进行自动化测试,功能非常强大。

下面演示一个很简单的例子,就是通过webdriver打开一个浏览器,然后访问google,搜索一个字符串,再显示结果页面的title。例子都是从selenium文档里抄的,语言为java。

  1. 安装jdkmaven(记得设置JAVA_HOME, M2_HOME宏)
  2. 在firefox安装selenium的插件
  3. 新建工程目录,创建pom.xml,内容如下
    
    
            4.0.0
            MySel20Proj
            MySel20Proj
            1.0
            
                UTF-8
            
            
                
                    org.seleniumhq.selenium
                    selenium-java
                    2.37.0
                
                
                    com.opera
                    operadriver
                
            
            
                
                    
                        com.opera
                        operadriver
                        1.5
                        
                            
                                org.seleniumhq.selenium
                                selenium-remote-driver
                            
                        
                    
                
            
    
    
    
  4. 在目录里执行: mvn clean install
  5. 在Idea里import新生成的maven project
  6. 创建子目录 src\main\java\org.openqa.selenium
  7. 在子目录下创建文件Selenium2Example.java, 内容如下
    package org.openqa.selenium.example;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedCondition;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class Selenium2Example  {
        static WebDriver driver ;
    
        public static void main(String[] args) {
            // Create a new instance of the Firefox driver
            // Notice that the remainder of the code relies on the interface,
            // not the implementation.
            driver = new FirefoxDriver();
    
            // And now use this to visit Google
            driver.get("http://www.google.com");
            // Alternatively the same thing can be done like this
            // driver.navigate().to("http://www.google.com");
    
            // Find the text input element by its name
            WebElement element = driver.findElement(By.name("q"));
    
            // Enter something to search for
            element.sendKeys("Cheese!");
    
            // Now submit the form. WebDriver will find the form for us from the element
            element.submit();
    
            // Check the title of the page
            System.out.println("Page title is: " + driver.getTitle());
    
            // Google's search is rendered dynamically with JavaScript.
            // Wait for the page to load, timeout after 10 seconds
            (new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
                public Boolean apply(WebDriver d) {
                    return d.getTitle().toLowerCase().startsWith("cheese!");
                }
            });
    
            // Should see: "cheese! - Google Search"
            System.out.println("Page title is: " + driver.getTitle());
    
            //Close the browser
            driver.quit();
        }
    }
  8. 在项目目录执行如下命令:
    mvn compile
    mvn exec:java -Dexec.mainClass=”org.openqa.selenium.example.Selenium2Example”

    运行后就能看到一个firefox窗口被创建出来,自动访问google并搜索, 在console窗口中会看到title的输出

 

 

查找读写指定文件的进程

今天遇到一个问题,需要知道读写某个特定文件的进程是哪个。开始找到inotify,发现它确实能监控文件的读写等一系列事件,但它只能告知制造这些事件的用户id,而没有进程id。这时候想到lsof, 它能列出当前所有被打开的文件及打开进程的信息。那么在收到inotify事件通知后,执行lsof不就能知道进程信息了,抱着这个想法写了个python脚本,结果发现屁用没有。因为大多数修改文件的过程,都是修改完后立刻关闭文件的,收到inotify事件通知再去执行lsof几乎得不到任何有用信息。

正在陷入困境之际,网上找到了答案。只要执行如下命令:

/sbin/auditctl -w 文件路径 -p war

等到文件改变后,执行:
/sbin/ausearch -f 文件路径

就能知道到底是哪个进程修改了这个文件。ausearch的输出信息很多,可以用more或倒到一个文件里慢慢看。
看完后执行
/sbin/auditctl -D

以删除所有监控规则。

在CENTOS 6.4 测试通过。