TOP

每个程序员都应该读的一本书(转)

每一个程序员都有改变世界的梦想,他们不甘平凡,他们想要与众不同,他们想要创立世界上最酷的公司,那具体该如何做呢?风靡全球的《Rework》将告诉你答案。
37signals是一家很特别的公司,他们有很独特的理念。虽然他们的团队只有16人,但他们的几个产品每年都会带来相当可观的利润。他们反对风险投资,反对扩大规模,反对堆砌功能。如果让我用一个词形容他们的话,那就是maverick,在某种程度上他们与乔布斯有相似之处。除了他们的产品外,他们还有一些byproduct: 一个很著名的博客:Signal vs Noise,全世界都为之疯狂的web框架ruby on rails,还有2本书:《getting real》《rework》,今天我就要介绍一下《rework / 重来:更为简单有效的商业思维》这本书。
用一个词形容《rework》这本书就是“短小精悍”,只有130页,你只需要3-4个小时就可以读完,而且书中每一个观点都配了一张图,看起来很轻松,一点都不乏味。我们说“字如其人”,同样的道理,这本书很鲜明反映了37signals这家公司的特点。废话不多说了,我把每个观点都通用一句汉语总结出来了:
轻装上阵
不要被教条所束缚
失败并非成功之母,不要“崇拜”失败,从成功中你可以学到更多
计划等同于猜测,未来有太多你不能够控制的因素,长远的计划没有任何意义
企业不应盲目扩张,规模不是衡量企业成功与否的因素,小企业有大企业所没有的优势:灵敏
不要成为工作狂,你需要时间思考更重要的东西
“创业家”(entrepreneur)这个词应该被替换成“起步者”(startup),每个人都可以开创自己的事业
出发
做一些能够引起轰动的事,最关键的是能够真正帮助别人解决一些问题,而不是去山寨别人的产品>
抓住自己的需求,设计能够解决自己所遇到的问题的产品
立即开始去行动,你的计划和想法并不代表你做了什么
“没有时间”是借口,做你真正喜欢的事你不会说“没有时间”
必须有自己的信条,它是设计产品时的准绳
努力实现你的承诺,捍卫你的信条,而不是把它作为口号挂在墙上
拿VC的钱是最差的选择,花别人的钱你会上瘾,最终失去对于公司的控制
你所需要的并不多,创业公司不是大公司,你需要的只是一个车库罢了
不要用“创业公司(startup)”这个词麻痹自己了,你需要的是盈利,你需要开始真正的事业
你应该考虑如何让自己的企业获得成功,而不是尽早拿着现金退出
抛弃那些没有意义的东西吧,比如:长远的计划,过量的员工,无聊的会议,繁琐的制度
前进
少”是一件好事,限制更是一种优势
一段时间只做一件事,做最重要的事,把全部精力投入到一个产品上去>
从最核心的地方开始,细枝末节的部分以后慢慢修改
开始的时候不要太关注细节,它只会浪费你的时间
不断做决定的过程就是不断前进的过程,不要优柔寡断
抓住最核心的东西,抛弃那些不重要的东西,真正重要的东西迟早会引起你的注意
少即是多,不做最多的,而做最对的
专注于那些不会改变的东西,而不是那些时髦的新事物
问题的关键是争取顾客并赚钱,而不是你使用什么工具。一跟贵的高尔夫球杆不能保证你打球出色
买出你的“副产品”,做任何事总会给你带来“副产品”,他们可能同样具有价值
不要总被细枝末节所羁绊,不要等到尽善尽美才发布,尽快发布产品,并且发布后不断改进
效率
现实一点吧,用最直观的方式描述事物,放弃那些没有任何意义的文档和图表
不要只顾低头干事,还要抬起头来问问自己究竟为什么要这样做,这件事真的有意义吗
中断是高效的天敌,拿出一块完整的连续的时间做一件事,这样的效率最高
开会就像毒药
足够好就可以了,不必苛求完美,不必最求繁杂,那只会满足你的虚荣心
速度第一,尽快实现一个一个小的目标,这会激励你实现最终的大目标
放弃不等于失败,该放弃时就放弃,逞能只会让你失去的更多
注意休息,缺乏睡眠会让你失去创造力,士气低落,并且变得暴躁易怒
把大计划分成小计划,把大块时间切割成小块时间,这会帮助你更好的做出计划和选择
任务清单要小,每次只关心一件事
不断做出小的决定,并且不断根据时机而改变
对手
不要抄袭,通过抄袭你无法理解事物的本质,而且你一直处于被动的地位
把你自身融入到产品中去,变成产品的一部分,这是对手所抄袭不来的
找出对立的对手,让自己变得鲜明,同时也利于产品的营销
不要通过冷战的方式与对手较量,你需要的不是比对手做的更多,而是更少更精
把精力集中于自己,而不是竞争对手
进化
学会说不,不能被顾客牵着鼻子走,要有自己的原则
不要专门为一两个大客户而改变产品,你需要专注于一类用户,而不是一两个
想到好的想法不要头脑发热,先把它写下来,日后仔细考虑,互相比较,再决定实现哪一个
做那种让用户越用越喜欢的东西,而不是买完就后悔的东西,这样他会向他的朋友推荐你的产品,这是最好的广告
没有必要把用户反馈都记录下来,真正重要的建议你会多次接触,自然能记住
晋级
开始的时候默默无闻是一件好事,它给你犯错误的空间
培养你自己的听众,让他们主动了解你,博客是一个很不错的方式
“教育”用户,让他们对你“忠诚”,他们会尊敬你,apple是个好例子
学会分享,分享不会使你被别人超越,人们会喜欢你,你将从中收益
向用户展示产品背后的故事,这会拉近你与用户的关系
做真实的自己,正视自己的不足,残缺也是一种美
不要向记者们群发新闻稿,约他们出来,富有激情的向他们推销,这样你会获得最好的报道
不要指望通过那些大型媒体营销自己,相反那些草根博主也许可以帮助你
开始时免费给用户提供一些服务,如果他们喜欢,他们会花钱使用你更完善的服务
没有必要专门设置“销售部”,你发的每封邮件,回的每个电话都是在marketing
一夜成名的背后必然是数年的心血和默默的付出
招聘
招聘之前自己先体验一下这个岗位,这不仅有助于找到合适的人,还会帮助你日后更好的管理
在真正需要时才招聘,而不是仅仅为了扩大规模
不要因为对方很优秀就把他招进来,招最合适的,而不是最好的
不要不停大量招新人,这会使每一位员工身边都有大量陌生人,这对于公司发展很不利
同一份简历同时发给很多公司的人不要招。如何辨别这样的人:看信中他是在与你沟通,还是在堆砌要点
5年工作经验与半年工作经验没有太大区别,你很难辨别其间的区别
GPA并不重要,除非你需要一个教授,但事实上你不需要
对于小团队,每个成员都必须实实在在地做事,你不需要只会指手画脚的人
你需要一个能够从小事做起,并且总揽大局的管理者
聘用有更好写作能力的人,他们有更清晰的思维,更好的表达能力
合适的人选在世界各地,没必要在乎地理位置,是否在同一个城市对于一个团队并不重要
可以给应聘者一个小项目做,这是检验他能否胜任的最好方式
应对问题
当负面新闻出现时,坦诚地向消费者解释,而不是试图掩盖它
迅速解决客户遇到的问题,对方不但不会抱怨,反而会更加信任你
对于道歉要学会换位思考:如果你是被道歉者,你想听到怎样的道歉?最重要的是真诚
让每一个员工都能接触到客户,对于任何岗位这都有好处
发布新版本后深吸一口气吧,抵制改变是人的天性。不要消极应对客户的抱怨,而是要耐心的向他们解释
企业文化
企业文化不是你能够创造的,它是在长时间内一点点形成的
决定都是暂时的,要随着形势的不断变化而不断改变决定
企业的文化必须尊重每一个人的工作
不要像对待孩子一样对待员工,你应该信任他们,给予他们足够的空间
不要强行加班,这会降低员工白天的工作效率,最终不会给企业带来任何好处
不要往别人的伤口上撒盐,也不要惩罚那些偶然出现的问题,你应该关注那些经常出现的问题
不要装腔作势,那其实是一种自卑的表现
不要出现need, must, can’t, easy, just, only, fast这几个单词
只将真正紧急的事情贴上紧急标签
结语
当灵感出现时,立即抓住它,不要拖延。你可以有很多idea,但如果不实践,他们都等于零

Read More
TOP

分布式配置管理git学习笔记(基本命令,提交修改)

git的安装和配置
git的安装,在ubuntu下很方便,只需要sudo apt-get install git就会把依赖的包和git安装下来,版本是git version 1.7.4.1
配置,只需要配置user.name和user.email就好了。配置通过git config命令完成:
git config –global user.name “wangdengwu”
git config –global user.email “dengwu.wang@gmail.com”
可以使用git config –global –list来查看是否设置成功
除了需要设置user.name和user.email之外,为了方便显示,还需要设置color.ui这个属性,来使用彩色区别不同部分
git config –global color.ui “auto”
初始化版本库
git初始化版本库很简单,只需要在你需要配置管理的文件夹下执行git init就可以了,会生成.git文件夹管理版本库
例如:mkdir test;cd test;git init
文件添加和修改
创建了版本库,让我们来添加和修改一些文件加入到版本库中来。
touch readme.txt
git add readme.txt
git commit -m “初始化readme.txt”
然后执行git log
就可以看到我们添加的历史记录
让我们修改下readme.txt的内容,echo “hello git” >> readme.txt
然后执行git status

# On branch master
# Changes not staged for commit:
# (use “git add …” to update what will be committed)
# (use “git checkout — …” to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use “git add” and/or “git commit -a”)
可以看到我们修改了文件,但是还没有把修改提交到版本库里去
git有3个地方可以提交修改,1:工作目录树 2:暂存区 3:版本库
执行git add readme.txt;git status

# On branch master
# Changes to be committed:
# (use “git reset HEAD …” to unstage)
#
# modified: readme.txt
#
可以看到已经将更改提交暂存区,但是还没有提交版本库,执行git commit -m “添加hello git”,就提交到版本库了
使用分支

其实我们现在就在分支上,只不过这个分支叫master分支,我们可以再建立一个分支

git branch father master,git branch的第一个参数为要创建的分支的名称,第二个参数为以哪个分支为基础创建

可以通过git branch查看:

father
* master
目前有2个分支,我们目前在master分支上
如何切换到新分支上去呢,使用git checkout father
我们在分支上修改点东西,echo “hello father” >> readme.txt
git commit -a -m “添加hello father”
然后我们给这个分支打个标签tag
git tag 1.0 father
git tag可以看到1.0的标签
然后我们checkout 到master上去,git checkout master
这个时候分支做了修改,而主干需要将修改merge回来,怎么办?
可以使用git rebase将分支的修改添加到主干上来:git rebase father
这样主干上也有了分支上的修改。
可以使用git branch -d 删除分支,如:git branch -d father
这个时候就只有master分支了,但是father分支就这么丢失了么?没有,因为我们还有tag,打了标签,就类似有了一个分支别名
可以使用git branch father 1.0找回来
至此我们学习和使用到了git最常用的几个命令:git init,git add,git commit,git status,git log,git branch,git tag,git rebase.
有时候发现使用git checkout和git commit没有svn co,svn ci方便,可以使用git config –global alias.ci “commit”来修改别名
如何查看本地文件,暂存区以及版本库之间的区别呢?可以使用git diff命令,如果只想比较暂存区与版本库之间的区别,可以使用git diff –cached
如果只想比较本地和版本库之间的区别,可以使用git diff HEAD
有时候,我们并分想把所有文件都提交到版本库里去,比如eclipse项目产生的classpath和project等文件,因为每个人的路径不同
这个时候,我们就可以使用2种让git忽略的办法:添加到.gitignore,然后提交到版本库,或者直接修改本地的.git/info/exclude

Read More
TOP

自己动手编译JDK7.0

最近在看JDK的源代码,周末心血来潮,想自己编译个JDK玩玩,一来了解下JDK的编译过程,二来编译个DEBUG版本,好用GDB来调试,方便深入研究源代码。
整个编译过程记录如下,其间也遇到几个小问题,不过都解决了。
首先是把JDK的源代码hg下来,hg是啥?google一下Mercurial
hg clone http://hg.openjdk.java.net/jdk7/jdk7 openjdk7
然后运行
cd openjdk7 && sh ./get_source.sh,
耐心等待同步更新。
再继续以下步骤之前,请确定已经安装了JDK6u18+,啥?编译JDK7需要先安装JDK6?
这就是所谓的鸡生蛋,蛋生鸡的哲学问题了,不管怎么说,您还是得先装JDK6,起码JDK7里面的那些java代码需要JDK编译
好了,假设您现在已经安装好JDK了,java -version是1.6
下面开始环境准备
先装几个类库,gawk,ant,libxext-dev,libxrender-dev,libxtst-dev
其中ant还需要下载http://archive.apache.org/dist/ant/binaries/apache-ant-1.7.1-bin.zip,解压缩,将lib下的文件全部cp到/usr/share/ant/lib下
除了上面几个能使用sudo apt-get install gawk ant libxext-dev libxrender-dev libxtst-dev之外,还有需要使用源代码安装的
CUPS:去www.cups.org下载cups-1.5.0-source.tar.gz 解压缩之后,cd cups-1.5.0/
sudo ./configure
sudo make
sudo make install
FREETYPE:去http://freetype.sourceforge.net/freetype2/index.html下载freetype-2.4.6.tar.gz
解压缩之后cd freetype-2.4.6/
sudo ./configure –prefix=/usr/
sudo make
sudo make install
ALSA:去http://www.alsa-project.org/下载alsa-lib-1.0.24.1/ alsa-driver-1.0.24/
先装alsa-driver-1.0.24/ 再安装alsa-lib-1.0.24.1/
sudo ./configure
sudo make
sudo make install
下面该修改配置文件变量了
cd到home目录,vi .profile
添加如下变量export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk
/usr/lib/jvm/java-6-openjdk换成你自己的jdk路径
更新了环境变量,记得重启下系统。

环境准备好了,就开始干活吧。
先测试一下环境是否合格:make sanity
系统语言环境记得一定要切换到english,不然java源代码编译不过的。
如果结果一切OK,则可以继续执行make ALLOW_DOWNLOADS=true
之所以要加ALLOW_DOWNLOADS=true是因为讨厌的JAXP和JAX-WS
现在您可以喝杯咖啡或者出去转一圈再回来了,因为编译过程需要持续半个小时左右,反正我的破机器是编译了30分钟

======================================================================
编译完之后,cd 到/home/wangdengwu/jdk-source/openjdk7/build/linux-i586/j2sdk-image下
然后去bin目录下,运行./java -version 如果没错的话,就会看到鸡冻人心的带着您自己标签的java-version了
^_^,好了,编译到此告一段落,后续继续研读源代码。GDB调试还蛮不错

Read More
TOP

21个经典哲理故事

1. 甲去买烟,烟29元,但他没火柴,跟店员说:“顺便送一盒火柴吧。”店员没给。 ­
乙去买烟,烟29元,他也没火柴,跟店员说:“便宜一毛吧。”最后,他用这一毛买一盒火柴。 ­`

这是最简单的心理边际效应。第一种:店主认为自己在一个商品上赚钱了,另外一个没赚钱。赚钱感觉指数为1。第二种:店主认为两个商品都赚钱了,赚钱指数为2。当然心理倾向第二种了。同样,这种心理还表现在买一送一的花招上,顾客认为有一样东西不用付钱,就赚了,其实都是心理边际效应在作怪。 ­

启示:变换一种方式往往能起到意想不到的效果! 通常很多事情换一种做法结果就不同了。人生道路上,改善心智模式和思维方式是很重要的。 ­

2. 有个小男孩,有一天妈妈带着他到杂货店去买东西,老板看到这个可爱的小孩,就打开一罐糖果,要小男孩自己拿一把糖果。但是这个男孩却没有任何动作。几次的邀请之后,老板亲自抓了一大把糖果放进他的口袋中。回到家中,母亲好奇地问小男孩,为什么没有自己去抓糖果而要老板抓呢?小男孩回答很妙:“因为我的手比较小呀!而老板的手比较大,所以他拿的一定比我拿的多很多!” ­

启示:这是一个聪明的孩子,他知道自己的有限,而更重要的,他也知道别人比自己强。凡事不只靠自己的力量,学会适时地依靠他人,是一种谦卑,更是一种聪明。­

3. 美国知名主持人林克莱特有一天访问一名小朋友,问他说:“你长大后想要当做什么呀?”小朋友天真地回答:“嗯……我要当飞机的驾驶员!”林克莱特接着问:“如果有一天,你的飞机飞到太平洋上空所有引擎都熄火了,你会怎么办?”小朋友想了想:“我会先告诉坐在飞机上的人绑好安全带,然后我挂上我的降落伞跳出去。”当在场的观众笑得东倒西歪时,林克莱特继续注视着这孩子,想看他是不是自作聪明的家伙。没想到,接着孩子的两行热泪夺眶而出,这才使得林克莱特发觉这孩子的悲悯之心远非笔墨所能形容。于是林克莱特问他说:为什么你要这么做?”小孩的答案透露了这个孩子真挚的想法:“我要去拿燃料,我还要回来!!!” ­

启示:这就是“听的艺术”。一是听话不要听一半。二是不要把自己的意思,投射到别人所说的话上头。要学会聆听,用心听,虚心听。 ­

4. 有两个和尚他们分别住在相邻的两座山上的庙里。这两座山之间有一条溪,于是这两个和尚每天都会在同一时间下山去溪边挑水,久而久之他么变成为了好朋友。就这样时间在每天挑水中不知不觉已经过了五年。突然有一天左边这座山的和尚没有下山挑水,右边那座山的和尚心想:”他大概睡过头了。”便不以为意。哪知道第二天左边这座山的和尚还是没有下山挑水,第三天也一样。过了一个星期还是一样,直到过了一个月右边那座山的和尚终于受不了,他心想:”我的朋友可能生病了,我要过去拜访他,看看能帮上什么忙。”于是他便爬上了左边这座山,去探望他的老朋友。等他到了左边这座山的庙,看到他的老友之后大吃一惊,因为他的老友正在庙前打太极拳,一点也不像一个月没喝水的人。他很好奇地问:”你已经一个月没有下山挑水了,难道你可以不用喝水吗?”左边这座山的和尚说:”来来来,我带你去看。”于是他带着右边那座山的和尚走到庙的后院,指着一口井说:”这五年来,我每天做完功课后都会抽空挖这口井,即使有时很忙,能挖多少就算多少。如今终于让我挖出井水,我就不用再下山挑水,我可以有更多时间练我喜欢的太极拳。”­

启示:我们在公司领的薪水再多,那都是挑水。而把握下班后的时间挖一口属于自己的井,培养自己另一方面的实力,未来当我们年纪大了,体力拼不过年轻人了,依然还是有水喝,而且还能喝得很悠闲。­

5. 有两个人相约到山上去寻找精美的石头,甲背了满满的一筐,乙的筐里只有一个他认为是最精美的石头。甲就笑乙:“你为什么只挑一个啊?”乙说:“漂亮的石头虽然多,但我只选一个最精美的就够了。”甲笑而不语,下山的路上,甲感到负担越来越重,最后不得已不断地从一筐的石头中挑一个最差的扔下,到下山的时候他的筐里结果只剩下一个石头! ­

启示:人生中会有许多的东西,值得留恋,有的时候你应该学会去放弃。 ­

6. 有一家牙膏厂,产品优良,包装精美,受到顾客的喜爱,营业额连续10年递增,每年的增长率在10%~20%。可到了第11年,业绩停滞下来,以后两年也如此。公司经理召开高级会议,商讨对策。会议中,公司总裁许诺说:谁能想出解决问题的办法,让公司的业绩增长,重奖10万元。有位年轻经理站起来,递给总裁一张纸条,总裁看完后,马上签了一张10万元的支票给了这位经理。那张纸条上写着:将现在牙膏开口扩大1毫米。消费者每天早晨挤出同样长度的牙膏,开口扩大了l毫米,每个消费者就多用1毫米宽的牙膏,每天的消费量将多出多少呢!公司立即更改包装。第14年,公司的营业额增加了32%。 ­

启示:面对生活中的变化,我们常常习惯过去的思维方法。其实只要你把心径扩大1毫米,你就会看到生活中的变化都有它积极的一面,充满了机遇和挑战­

7. 一只火鸡和一头牛闲聊,火鸡说:我希望能飞到树顶,可我没有勇气。牛说:为什么不吃一点我的牛粪呢,他们很有营养。火鸡吃了一点牛粪,发现它确实给了它足够的力量飞到第一根树枝,第二天,火鸡又吃了更多的牛粪,飞到第二根树枝,两个星期后,火鸡骄傲的飞到了树顶,但不久,一个农夫看到了它,迅速的把它从树上射了下来。­

启示:牛屎运让你达到顶峰,但不能让你留在那里。 ­

8. 乌鸦站在树上,整天无所事事,兔子看见乌鸦,就问:我能像你一样,整天什么事都不用干吗?乌鸦说:当然,有什么不可以呢?于是,兔子在树下的空地上开始休息,忽然,一只狐狸出现了,它跳起来抓住兔子,把它吞了下去。­

启示:如果你想站着什么事都不做,那你必须站的很高,非常高。 ­

9. 一只小鸟飞到南方去过冬。天很冷,小鸟几乎冻僵了。于是,飞到一大块空地上,一头牛经过那儿,拉了一堆牛粪在小鸟的身上,冻僵的小鸟躺在粪堆里,觉得很温暖,渐渐苏醒过来,它温暖而舒服的躺着,不久唱起歌来,一只路过的野猫听到声音,走过去看个究竟,循着声音,野猫很快发现了躺在粪堆里的小鸟,把它拽出来吃掉了。­

启示:不是每个往你身上拉大粪的人都是你的敌人。也不是每个把你从粪堆里拉出来的人都是你的朋友,还有,当你躺在粪堆里时,最好把你的嘴闭上。­

10. 从前,有两个饥饿的人得到了一位长者的恩赐:一根鱼竿和一篓鲜活硕大的鱼。其中,一个人要了一篓鱼,另一个人要了一根鱼竿,于是他们分道扬镳了。得到鱼的人原地就用干柴搭起篝火煮起了鱼,他狼吞虎咽,还没有品出鲜鱼的肉香,转瞬间,连鱼带汤就被他吃了个精光,不久,他便饿死在空空的鱼篓旁。另一个人则提着鱼竿继续忍饥挨饿,一步步艰难地向海边走去,可当他已经看到不远处那片蔚蓝色的海洋时,他浑身的最后一点力气也使完了,他也只能眼巴巴地带着无尽的遗憾撒手人间。又有两个饥饿的人,他们同样得到了长者恩赐的一根鱼竿和一篓鱼。只是他们并没有各奔东西,而是商定共同去找寻大海,他俩每次只煮一条鱼,他们经过遥远的跋涉,来到了海边,从此,两人开始了捕鱼为生的日子,几年后,他们盖起了房子,有了各自的家庭、子女,有了自己建造的渔船,过上了幸福安康的生活。­

启示:一个人只顾眼前的利益,得到的终将是短暂的欢愉;一个人目标高远,但也要面对现实的生活。只有把理想和现实有机结合起来,才有可能成为一个成功之人。有时候,一个简单的道理,却足以给人意味深长的生命启示。­

11. 孔子的一位学生在煮粥时,发现有肮脏的东西掉进锅里去了。他连忙用汤匙把它捞起来,正想把它倒掉时,忽然想到,一粥一饭都来之不易啊。于是便把它吃了。刚巧孔子走进厨房,以为他在偷食,便教训了那位负责煮食的同学。经过解释,大家才恍然大悟。孔子很感慨的说:“我亲眼看见的事情也不确实,何况是道听途听呢?”­

启示:推销生意是一种组织性质的生意,因为人多,人事问题也多。我们不时听到是非难辨的话,如某公司攻击另一间公司,如是者往往令人混淆是非,影响信心。因此找出事情的真相,不是轻易相信谣言,辛辛苦苦建立的事业才不会毁于一旦。­

12. 有位秀才第三次进京赶考,住在一个经常住的店里。考试前两天他做了三个梦,第一个梦是梦到自己在墙上种白菜,第二个梦是下雨天,他戴了斗笠还打伞,第三个梦是梦到跟心爱的表妹躺在一起,但是背靠着背。这三个梦似乎有些深意,秀才第二天就赶紧去找算命的解梦。算命的一听,连拍大腿说:”你还是回家吧。你想想,高墙上种菜不是白费劲吗?戴斗笠打雨伞不是多此一举吗?跟表妹躺在一张床上了,却背靠背,不是没戏吗?” 秀才一听,心灰意冷,回店收拾包袱准备回家。店老板非常奇怪,问:”不是明天才考试吗,今天你怎么就回乡了?”秀才如此这般说了一番,店老板乐了:”哟,我也会解梦的。我倒觉得,你这次一定要留下来。你想想,墙上种菜不是高种吗?戴斗笠打伞不是说明你这次有备无患吗?跟你表妹背靠背躺在床上,不是说明你翻身的时候就要到了吗?”秀才一听,更有道理,于是精神振奋地参加考试,居然中了个探花。­

启示:积极的人,象太阳,照到哪里哪里亮,消极的人,象月亮,初一十五不一样。想法决定我们的生活,有什么样的想法,就有什么样的未来。­­

13. 有一天动物园管理员们发现袋鼠从笼子里跑出来了,于是开会讨论,一致认为是笼子的高度过低。所以它们决定将笼子的高度由原来的十公尺加高到二十公尺。结果第二天他们发现袋鼠还是跑到外面来,所以他们又决定再将高度加高到三十公尺没想到隔天居然又看到袋鼠全跑到外面,于是管理员们大为紧张,决定一不做二不休,将笼子的高度加高到一百公尺。一天长颈鹿和几只袋鼠们在闲聊,”你们看,这些人会不会再继续加高你们的笼子?”长颈鹿问。”很难说。”袋鼠说∶”如果他们再继续忘记关门的话!”­

启示:其实很多人都是这样,只知道有问题,却不能抓住问题的核心和根基。­

14. 一天夜里,已经很晚了,一对年老的夫妻走进一家旅馆,他们想要一个房间。前台侍者回答说:”对不起,我们旅馆已经客满了,一间空房也没有剩下。”看着这对老人疲惫的神情,侍者不忍心深夜让这对老人出门另找住宿。而且在这样一个小城,恐怕其他的旅店也早已客满打烊了,这对疲惫不堪的老人岂不会在深夜流落街头?于是好心的侍者将这对老人引领到一个房间,说:”也许它不是最好的,但现在我只能做到这样了。”老人见眼前其实是一间整洁又干净的屋子,就愉快地住了下来。第二天,当他们来到前台结账时,侍者却对他们说:”不用了,因为我只不过是把自己的屋子借给你们住了一晚–祝你们旅途愉快!”原来如此。侍者自己一晚没睡,他就在前台值了一个通宵的夜班。两位老人十分感动。老头儿说:”孩子,你是我见到过的最好的旅店经营人。你会得到报答的。”侍者笑了笑,说这算不了什么。他送老人出了门,转身接着忙自己的事,把这件事情忘了个一干二净。没想到有一天,侍者接到了一封信函,打开看,里面有一张去纽约的单程机票并有简短附言,聘请他去做另一份工作。他乘飞机来到纽约,按信中所标明的路线来到一个地方,抬眼一看,一座金碧辉煌的大酒店耸立在他的眼前。原来,几个月前的那个深夜,他接待的是一个有着亿万资产的富翁和他的妻子。富翁为这个侍者买下了一座大酒店,深信他会经营管理好这个大酒店。这就是全球赫赫有名的希尔顿饭店首任经理的传奇故事。­

15. 有一位表演大师上场前,他的弟子告诉他鞋带松了。大师点头致谢,蹲下来仔细系好。等到弟子转身后,又蹲下来将鞋带解松。有个旁观者看到了这一切,不解地问:”大师,您为什么又要将鞋带解松呢?”大师回答道:”因为我饰演的是一位劳累的旅者,长途跋涉让他的鞋带松开,可以通过这个细节表现他的劳累憔悴.” “那你为什么不直接告诉你的弟子呢?””他能细心地发现我的鞋带松了,并且热心地告诉我,我一定要保护他这种热情的积极性,及时地给他鼓励,至于为什么要将鞋带解开,将来会有更多的机会教他表演,可以下一次再说啊。”­

启示:人一个时间只能做一件事,懂抓重点,才是真正的人才。­

16. 一个人在高山之巅的鹰巢里,抓到了一只幼鹰,他把幼鹰带回家,养在鸡笼里。这只幼鹰和鸡一起啄食、嬉闹和休息。它以为自己是一只鸡。这只鹰渐渐长大,羽翼丰满了,主人想把它训练成猎鹰,可是由于终日和鸡混在一起,它已经变得和鸡完全一样,根本没有飞的愿望了。主人试了各种办法,都毫无效果,最后把它带到山顶上,一把将它扔了出去。这只鹰像块石头似的,直掉下去,慌乱之中它拼命地扑打翅膀,就这样,它终于飞了起来!­

启示:磨练召唤成功的力量。­­

17. 雨后,一只蜘蛛艰难地向墙上已经支离破碎的网爬去,由于墙壁潮湿,它爬到一定的高度,就会掉下来,它一次次地向上爬,一次次地又掉下来……第一个人看到了,他叹了一口气,自言自语:”我的一生不正如这只蜘蛛吗?忙忙碌碌而无所得。”于是,他日渐消沉。第二个人看到了,他说:这只蜘蛛真愚蠢,为什么不从旁边干燥的地方绕一下爬上去?我以后可不能像它那样愚蠢。于是,他变得聪明起来。第三个人看到了,他立刻被蜘蛛屡败屡战的精神感动了。于是,他变得坚强起来。­

启示:有成功心态者处处都能发觉成功的力量。­­

18. 一个老人在高速行驶的火车上,不小心把刚买的新鞋从窗口掉了一只,周围的人倍感惋惜,不料老人立即把第二只鞋也从窗口扔了下去。这举动更让人大吃一惊。老人解释说:”这一只鞋无论多么昂贵,对我而言已经没有用了,如果有谁能捡到一双鞋子,说不定他还能穿呢!”­

启示:成功者善于放弃。­

19. 某大公司准备以高薪雇用一名小车司机,经过层层筛选和考试之后,只剩下三名技术最优良的竞争者。主考者问他们:”悬崖边有块金子,你们开着车去拿,觉得能距离悬崖多近而又不至于掉落呢?””二公尺。”第一位说。”半公尺。”第二位很有把握地说。”我会尽量远离悬崖,愈远愈好。”第三位说。结果这家公司录取了第三位。­

启示:不要和诱惑较劲,而应离得越远越好。­

20. 老和尚携小和尚游方,途遇一条河;见一女子正想过河,却又不敢过。老和尚便主动背该女子趟过了河,然后放下女子,与小和尚继续赶路。小和尚不禁一路嘀咕:师父怎么了?竟敢背一女子过河?一路走,一路想,最后终于忍不住了,说:师父,你犯戒了?怎么背了女人?老和尚叹道:我早已放下,你却还放不下!­

启示:君子坦荡荡,小人常戚戚;心胸宽广,思想开朗,遇事拿得起、放得下,才能永远保持一种健康的心态。­

21. 一个心理学教授到疯人院参观,了解疯子的生活状态。一天下来,觉得这些人疯疯癫癫,行事出人意料,可算大开眼界。想不到准备返回时,发现自己的车胎被人下掉了。”一定是哪个疯子干的!”教授这样愤愤地想道,动手拿备胎准备装上。事情严重了。下车胎的人居然将螺丝也都下掉。没有螺丝有备胎也上不去啊!教授一筹莫展。在他着急万分的时候,一个疯子蹦蹦跳跳地过来了,嘴里唱着不知名的欢乐歌曲。他发现了困境中的教授,停下来问发生了什么事。教授懒得理他,但出于礼貌还是告诉了他。疯子哈哈大笑说:”我有办法!”他从每个轮胎上面下了一个螺丝,这样就拿到三个螺丝将备胎装了上去。教授惊奇感激之余,大为好奇:”请问你是怎么想到这个办法的?” 疯子嘻嘻哈哈地笑道:”我是疯子,可我不是呆子啊!”

Read More
TOP

JNI简单尝试

最近由于听了2天android的培训,讲的都是NDK开发,涉及到JNI和底层C库以及AHL层,驱动开发等方面的知识,以前对JNI只是了解,没有写过代码,今天特意尝试了一下。
首先是java文件,HelloWorld.java和Main.java,内容如下

//HelloWorld.java
   class HelloWorld
   {
        public native void displayMessage();
        public native int add(int a,int b);
        static
        {
              System.loadLibrary("HelloWorldImp");
        }
    }
//Main.java
class Main
   {
     public static void main(String[] args)
     {
      HelloWorld hello = new HelloWorld();
       hello.displayMessage();
     System.out.println("1+1="+hello.add(1,1));
    }
  }

可以看到,Main.java和之前的调用没有什么差别,差别就在于HelloWorld.java里的方法声明是native,还有就是static动态加载.so动态库,在linux下的动态库都是.so的
我们来编译HelloWorld.java,Main.java
javac HelloWorld.java
javac Main.java
然后根据生成的class文件生成C或C++需要的.h文件
javah -jni HelloWorld
这样就生成了HelloWorld.h,这个文件内容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayMessage
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayMessage
  (JNIEnv *, jobject);

/*
 * Class:     HelloWorld
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_HelloWorld_add
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

此头文件里声明了需要实现的方法,然后引入了jni.h
而在jni.h里声明了Java转换成C对应的数据结构
然后我们需要一个.cpp文件来实现这个方法

//HelloWorld.cpp
#include 
#include "HelloWorld.h"   // this header file was generated by javah
JNIEXPORT void JNICALL Java_HelloWorld_displayMessage(JNIEnv *env, jobject obj)
{
  printf("Hello World!\n");
}
JNIEXPORT jint JNICALL Java_HelloWorld_add(JNIEnv *env, jobject obj, jint a, jint b)
{
	return (int)a+(int)b;
}

可以看到此cpp文件也很简单。
然后我们需要将此HelloWorld.cpp编译成动态链接文件
有一点linux编程基础知识需要知道,共享动态链接库文件需要以lib开头,所以我们生成此文件的时候,为了和HelloWorld.java里的
System.loadLibrary(“HelloWorldImp”);相对应,就需要生成的.so文件名是libHelloWorldImp.so
因此生成.so的命令为
g++ -shared -I/usr/ali/jdk1.6.0_24/include -I//usr/ali/jdk1.6.0_24/include/linux -fpic HelloWorld.cpp -o libHelloWorldImp.so
其中的include文件目录是我的jdk1.6的,需要替换成你自己的目录结构
这样我们就生成了libHelloWorldImp.so文件
我们可以把此动态链接库文件cp到jdk安装目录下的jre/lib/i386文件夹下,直接java Main就可以运行,或者是运行 java -Djava.library.path=. Main
运行结果如下:
Hello World!
1+1=2
Hello World!是C++输入的,而2也是C++返回的
至此JNI的初探就此结束,回头有时间搞个测试,看下C++原生的排序快还是Java版的快,或者能快多少。

Read More
TOP

是什么造就了伟大的程序员?(转)

回 想起来就像是在昨天。那是2000年,在数据结构课程的课堂上,Pargas博士站在前面给我们讲一些关于数据结构的话题,一个SSH的画面投影在我们前 面的墙上。有人问了一个问题,他说了一些东西,差不多是这样的话“是这样,如果你想成为一个真正的计算机科学家,你需要从现在开始就使用vi编辑器”。我 想他是在笑谈,课后感觉他说的话并不是完全的正确,但作为年轻且容易被感染的我,回到寝室立刻就开始学习如何使用vi。学习过程不容易,花费了不少时间, 但一旦掌握了其中的窍门,我发现,使用vi的确可以更快的做事情。

时间推到6年前,那时我对TextMate十分的着迷。我的工作是做Java开发,但同时我学习Rails,在业余时间开发一些Rails项目。那 时几乎所有我读的文章和观看的视频都是说明和演示如何使用TextMate来完成文本编辑工作的方法技巧的。事实上,我每天都在使用的Eclipse想要 把我变成一头蠢猪。于是,我买了一台Mac电脑,开机后十分钟内我就买了一套TextMate装了上去。

说老实话,这两种编辑器没有一种使我成为一个更好的程序员。

优秀的工具并不会把你变得更优秀。你使用的工具确实很重要。事实上,它们非常棒。但老虎伍兹即使用几根树枝也能把我们全部打败,梅西即使不穿鞋也能 把我们踢的很惨,拉斐尔-纳达尔即使使用一个60年代产的老式木质网球拍也能把我们任何一个人打败。该死,他即使用乒乓球拍也能打败我们。技术,知识,以 及锻炼出来的经验是你在与人对比中最重要的部分。

所以,工具造就不出程序员。那什么可以呢?我想,造就一个伟大的程序员的诸多因素都依赖于你所从事的事和与你共事的人,但从很多在软件开发领域取得 了巨大成功的人身上,我看到了很多共同的特征,我觉得值得与你们分享一下。我并不确定这些特征你是否能学得到,或者你天生就有,但我强烈的感觉到,如果我 能花更多了时间去追求这些特征,而不是钟情于更换编辑器,我一定能取得更大的进步。

以人为本
我知道的最好的程序员总是把人放在第一位。他们明白他们是在为人写软件,即使那只是一些复杂系统的后台程序或协议,除了程序员没有人会用到它们。他 们写文档,因为这很重要。他们帮助其它人如何使用自己的程序代码。他们愿意付出更多的努力去解决更复杂的问题来让人们以正确的方式使用他们的软件。

对学习有很大的胃口
神奇的程序员对知识有一种可笑的饥渴感。他们总是对你说一些新的、有趣的东西。他们习惯于大量的阅读(不论在线的还是线下的),他们喜欢尝试,从中学到经验。他们对新出现的语言和平台毫不担忧恐惧。

掌握问题规律的本领
当你做开发有了一段时间后,你会发现有时出现的问题和你曾经处理过的问题看起来惊人的相似。能够识别这些问题,把过往的解决方案应用到你当前的问题上,这是一个很有用处的本领。如果每次都能改进这个方案,那是更好了。

注意,这并不意味这你可以盲目的认为过去这个方案可行,现在它就一定可行。这种过往问题和现在出现的问题的类型匹配是很有技巧性的。你需要认真判断何时使用一个历史方案是可行的,什么时候是不行的。

有一点神经质
我弟弟在高中时上了一次Python课,当我问他是否喜欢这课时,他说我脑袋一定出问题了才去愿意当一名程序员,他说编程是他这辈子子做过的最无聊 的一件事。从某种程度上讲,他是对的。大多数的日子里我是对着计算机说话,而不是人。想到这些要把一行一行的基本的长长短短的语句拼成一个软件,我不由的 打了大大一个冷战。并不是所有的人都喜欢做这种事情,但是我知道的最优秀的程序员绝对是热爱制作软件的。

执着
软件开发是一个实际上比任何人的想像都要缓慢的开发过程。它很费时间。有时候你必须要有最够的耐心去精雕细琢出你需要的代码。有时,作为程序员,我 们会写出非常有趣的代码,但也有时候,我们不得不哭丧着脸去写一大堆过去曾经写过的代码。想想伟大的程序员之所以能坚持下来,是因为他们能看到他们所从事 的事业的大蓝景,他们喜欢这一点一点走向目标的开发过程。

这就是我想到的构成一个优秀程序员的一些特征,但这并不是全部,所以我想听听你的观点。你认为是什么使一个程序员变的优秀?

Read More
TOP

如何把玩btrace源代码

最近在研究btrace,对其实现原理很感兴趣,于是就想把玩下其源代码,整了下,发现源代码的版本控制不是svn,也不是git
而是没听过的Mercurial,用svn co了半天也co不下来,后来才发现需要使用Mercurial。
首先先安装Mercurial:sudo apt-get install mercurial
然后再使用hg clone https://hg.kenai.com/hg/btrace~hg btrace-source
这样就把btrace的源码download下来了,只是读权限,如果要有写权限,需要申请项目权限,并且使用ssh协议
这点倒和git有点像
要把玩好btrace需要IDE是netbeans才行,因为源码是人家sun的开发人员维护的,所以人家肯定用自己家的咯
到此,就搞定源码了,建议再使用git本地版本控制一下,就控制一下src文件夹就好了。
好了,开始把玩吧!

Read More
TOP

jdk7新特性简单尝试

发现jdk7已经到了M12了,于是就下了下来了解一些新特性

只是简单涉及到几个点,后续再做深入了解吧。
首先这些代码需要使用netbeans才能正常编辑,如果使用eclipse目前还不支持jdk7的编译级别,如果你喜欢,使用文本编辑器也可以,自己手动javac也OK的
UnderscoreCharacters:
首先介绍的一个特性是支持多种进制格式的常量赋值如下所示

private static int i=0b10111;
private static int sum=1234_5678;

可以看到,支持二进制的形式赋值,同时也对数字可读性进行了改进,像1234_5678一眼就看出来是多大的数字了
StringSwitchDemo:
jdk7开始支持以string作为switch的case表达式了,以前只能使用byte,char,int和enum,现在string也可以用了。

switch (month.toLowerCase()) {
            case "january":    monthNumber =  1; break;
            case "february":   monthNumber =  2; break;
            case "march":      monthNumber =  3; break;
            case "april":      monthNumber =  4; break;
            case "may":        monthNumber =  5; break;
            case "june":       monthNumber =  6; break;
            case "july":       monthNumber =  7; break;
            case "august":     monthNumber =  8; break;
            case "september":  monthNumber =  9; break;
            case "october":    monthNumber = 10; break;
            case "november":   monthNumber = 11; break;
            case "december":   monthNumber = 12; break;
            default:           monthNumber =  0; break;
        }

使用string更直观一些,其实使用enum也可以了,只不过需要额外的enum类
我觉得最经典的是TheCatchBlocks这块的改动,很简洁优雅
先看代码:

        try (InputStream in = new FileInputStream("");
             OutputStream out = new FileOutputStream("")) {
        }catch (FileNotFoundException|IOException ex) {
            ex.printStackTrace();
        }

这块代码涉及到2个出彩的点,一个是对多个异常的统一处理,有时候对于多个异常我们可能采取同样的处理方式就可以了,这样就可以使用|将异常连接起来一起处理
另外可以使用try(资源;资源)的形式免除以前繁琐的对资源close的操作,会自动为你关闭资源,不像以前那样需要在finally里处理。

InputStream in = new FileInputStream(src);
  try {
    OutputStream out = new FileOutputStream(dest);
    try {
      byte[] buf = new byte[8 * 1024];
      int n;
      while ((n = in.read(buf)) >= 0)
        out.write(buf, 0, n);
    } finally {
      out.close();
    }
  } finally {
    in.close();
  }

那什么样的类可以使用这样try-with-resources简洁的方式呢?
那就是实现了java.lang.AutoCloseable或者java.io.Closeable接口的类
就先写这么多吧,回头再深入了解一下。

Read More
TOP

有爱,有成长

来阿里巴巴有半年了,这半年来收获很多,应该对自己走过的路review一下了。

来阿里巴巴之后最大的感受就是激情和分享,这也是互联网公司应有的特性,同时把价值观作为考核的一部分也是一个特色,因为我们寻找的是一群志同道合的人,是有共同味道的人。

我觉得我最大的成长不是学到了什么什么技术,而是学到了团队,与人沟通交流和如何帮助自己,帮助别人成长,这才是最有价值的东西,技术不懂,可以自己一点点学,而与人合作沟通,逐步成长是一个大环境才行的,感谢阿里巴巴给我了一个这样的环境,让我觉得很舒服。

分享,分享,分享,还是分享,我听的最多的就是分享这个词,而实际情况也是这样,阿里巴巴部门内部,会有大P们的分享,小组内部也会有小分享,只要你想,随时可以去听,去分享。

揪头发,照镜子,闻味道这些方法论,能让自己更认清自己,去除自己的不足,走的更快更稳。

揪头发就是突破自己的舒适区,因为一个人做事情,熟悉了之后,就进入了舒适区了,如果不自我突破,就进步很慢,甚至不再有进步,而揪头发,就是让自己主动性强一些,突破这个舒适区,站的更高一点,看的更远一些。

阿里有句话:当你觉得不舒服的时候,就是你成长的时候。

照镜子,就是邀请自己的同事,大家坐在一起,聊一聊自己的不足,看看别人眼里你是一个什么样子,类似于360度,但是是实名的,这样你可以对自己有一个清醒的认识,别人提出的问题,自己有则改之无则加勉,男人要有大心胸,大气度。

闻味道,就是一个组织,一个团队的气氛味道,像阿里就是简单开放,平等分享,是一群人做事的风格,也是一个团队逐步成长的总结归纳,有了坏的味道就内部改正,有了好的味道就要继续保持发扬。

以后的路还很长,而我快乐的为了信仰而努力,激情,继续加油!

2011已经来了,套用一句葛大爷的话:步子不能走的太大,要及时总结,制定计划,才能避免扯着蛋。

Read More

Hit Counter provided by Email Lists