遭遇牛人:一个故事两个功课(转载)

2010年05月31日

好久没有写博客了,转篇文章,给自己,不要浮躁

原文地址
http://blog.wenxuecity.com/archives.php?date=201004&blogID=40440

八零年代后期,我当学术界的逃兵,到IBM作网路产品开发。我的大老板是个IBM Fellow,在工业界大名鼎鼎。我们团队是他的“秘密武器”,成员多是名校调教出来的牛人,只有我是个无名小卒。不巧的是,我在项目的末期加入团队,他们已经把产品开发出来,正在测试。所以开始几个月,我只能打打杂帮点小忙,开会的时候大家高谈阔论,我却像个小呆瓜,什么都不懂,又尴尬又心虚,满怀压力。

虽然产品已经开发出来,但是速度太慢。这些牛人各自开发一块,大家都讲得头头是道,忙着改善自己那一块立大功。我不懂任何一块,只好依据基本原则分析一下到底哪里最慢。我设法记录每一个步骤的时间(timestamp),逐渐发现到95%的时间都在等待平台的回应。再分析一下,原来平台少了一个重要的功能,无法快速回应,我们的产品根本无法补救。我作个报告,团队讨论了几天,大家决定这个问题无解,最后只能放弃这个产品,宣告失败。

我才觉悟到这些牛人对产品懂得太多,反而先入为主,以偏概全。最后真正的问题,还是我凭“常识”找到的。我学到第一个重要的功课:解决实际的问题通常不需要高深的学问;在兵荒马乱中还能打出基本章法,才能平定天下。二十多年来,这个功课一再重复。我见过不少项目成功得很辉煌,不少项目失败得很悲惨,成败的原因都在于有没有打出基本章法。有趣的是,没能打出基本章法,往往正是因为花招太多,眼花缭乱!

可惜当年我的基本章法没有解决问题立功,而是尴尬地找到死刑的判决。却因如此,我有机会学到第二个功课。

隔了几天,大老板和我一对一会谈。我垂头丧气,谈到我来IBM的第一个项目就以失败收场,心里颇有压力。无可否认地,我们替公司浪费了很多钱。

大老板说:“如果你是工人,比方说是装配玩具的,公司要以你工作的时数或生产的数量来付你工资。你工作时间长,做得快,多赚点钱;否则,可能挨饿。公司只能这样管理工人才不会赔钱。相反地,公司需要在科技专才身上投资,希望有朝一日他们为公司赚大钱。比方说,杆码扫描器(Bar code scanner)就是个IBM的专利,到处收银台都需要。一个员工作一辈子只要发明这个专利,公司就赚不完了。当专业人员要有长远的眼光,不要把自己当作工人了。”

我把这个功课叫做“和时间交朋友”,让时间帮助你学习,成长,终于有所贡献。相形之下,有太多的人“和时间结仇”,有的揠苗助长,有的被时间逼得无法冷静,反而难有成就。二十多年来,每当我急躁起来的时候,就回想起大老板的一番话,庆幸有机会学到大牛的智慧。回头看来,大老板的话果真应验在我身上。我在IBM的前三年的确没做出什么成果,后三年却办成几件很重要的事。公司果然不用急,最后还是赚钱的赢家。

中国人向来最注重教育,深信长期投资开发一个人的知识和能力。在这个急功竞利的时代,更不要被一鸣惊人的花招吸引,被爆发户的光彩诱惑,而失去了对自己的信心和耐心。在这个时代不对自己长远投资,靠哪个公司这样做?

javascript+css实现图片90度倍数旋转

2010年04月6日

HTML代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style type="text/css">
.myrotate{
	-webkit-transform :rotate(-90deg);
	-moz-transform : rotate(-90deg);
	filter : progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
}
.clear{
	clear : both;
}
</style>
</head>
 
<body>
<div style="height:350px;">
<img id="img" src="http://www.baidu.com/img/baidu_logo.gif" />
<button type="button" onclick="rotateLeft()">向左旋转</button>
<button type="button" onclick="rotateRight()">向右旋转</button>
</div>
<div class="clear"></div>
<div id="log"></div>
</body>
</html>

JAVASCRIPT 代码

<script type="text/javascript">
function rotateLeft()
{
	var o = document.getElementById('img');
 
	if(window.attachEvent)//IE
	{
		var currentFilter = o.currentStyle.filter;
 
		if (currentFilter)
		{
			var filterMatch = currentFilter.match(/rotation=(\d)+/);
			var r = parseInt(filterMatch[1]) - 1;
			if(r < 0)
				r = 3;
 
			o.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + r + ')';
		}
		else
		{
			o.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)';
		}
 
		//document.getElementById('log').innerHTML = currentFilter;
	}
	else//非IE
	{
		var currentFilter = o.style.MozTransform;
 
		//console.log(currentFilter);
 
		if (currentFilter)
		{
			var filterMatch = currentFilter.match(/rotate\(([\-]\d+)deg\)/);
 
			var r = parseInt(filterMatch[1]) - 90;
			if (r < -360)
				r = -90;
 
			o.style.MozTransform = 'rotate(' + r + 'deg)';
 
		}
		else
		{
			o.style.MozTransform = 'rotate(-90deg)';
		}
	}
 
}
 
function rotateRight()
{
	var o = document.getElementById('img');
 
	if(window.attachEvent)//IE
	{
		var currentFilter = o.currentStyle.filter;
 
		if (currentFilter)
		{
			var filterMatch = currentFilter.match(/rotation=(\d)+/);
			var r = parseInt(filterMatch[1]) + 1;
			if(r > 3)
				r = 0;
 
			o.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + r + ')';
		}
		else
		{
			o.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=1)';
		}
 
		//document.getElementById('log').innerHTML = currentFilter;
	}
	else//非IE
	{
		var currentFilter = o.style.MozTransform;
 
		//console.log(currentFilter);
 
		if (currentFilter)
		{
			console.log(currentFilter);
			var filterMatch = currentFilter.match(/rotate\(([\-]?\d+)deg\)/);
 
			var r = parseInt(filterMatch[1]) + 90;
			if (r > 0)
				r = -270;
 
			o.style.MozTransform = 'rotate(' + r + 'deg)';
 
		}
		else
		{
			o.style.MozTransform = 'rotate(-270deg)';
		}
	}
 
}
 
</script>

点击此处查看demo

使用putty+ssh搭配SocksCap翻墙【备忘】

2010年04月6日

写在前面的话

由于国内互联网的特殊环境,翻墙成了中国很多网民需要学习的一门技术之一。

因此,我也就此问题向同事请教,并学会了一种比较简单的翻墙方法。

在这里我举例如何访问国外某些被和谐网站来说明怎么操作此种方法,作此记录可以方便他人,也是为了怕自己忘记,作为备忘。

########    丑陋的分割线 #############

前提条件

1·putty

下载地址:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

2.SocksCap

此软件下载地址请自行搜索

3.你需要一个国外的SSH账号

具体操作:

1·将下载好的putty放到你想放的位置,然后双击,就会出现下面图示的界面

putty step1

putty step1

在hostname那里填写你的SSH账号所在IP或者域名,port里填写22

2·点击左侧菜单SSH的那个加号会打开如下图所示的子菜单,然后点击图中红色框中菜单

2

出现下图所示界面

3

在1号红色框中输入一个大于2000的数字,我这里建议输入9999

然后选择3号红色框,最后点击2号红色框的add按钮

这个时候就会添加了一个端口号9999的通道

然后在点击左侧菜单session 回到图putty step1界面,选中那个default setting,然后点击那个save按钮

最后点击下面的open按钮

就会出现下图所示界面

putty step4

putty step4

输入你的SSH账号回车,这个时候会提示你输入密码

输入SSH密码

然后打开下载好的SocksCap软件,点击文件=》设置

按下图所示设置,然后点击确定

1

这个时候你就可以把你最喜欢常用浏览器图标拖到此软件中,会出现下图所示提示

1

点击新建应用程序标识项,点击确定,然后双击控制台里那个浏览器图标

这个时候只要你的SSH账号所在主机所能访问的网站,你都可以访问了

当然,SocksCap这个软件也不是必须,只要你用PUTTY建立好了通道

你手工设置浏览器的代理项

同样可以实现翻墙效果了

Ubuntu8.10下安装了KDE后再卸载后安装mysql服务器问题总结

2010年01月12日

前段时间一直在鼓捣Ubuntu
本来是没有安装KDE的
一时冲动就装了个KDE,
发现不太好用就卸载掉了
今天晚上安装mysql服务器的时候竟然出现了N多的问题
花了我一晚上的时间

怕下次再遇到这样的问题
故记录下

mysql的版本
mysql-5.4.3-beta-linux-i686-glibc23.tar.gz
用的是编译好的压缩包
根据以往的经验是只需要将这个压缩包解压到打算安装mysql服务器的文件夹去,然后运行scripts/mysql_install_db就可以了
但就是运行这个脚本一直出现问题
开始以为是我没有指定–basedir和–datadir参数的原因,后来发现并不是
然后又觉得是不是用户权限的原因,使用root用户执行,同样报错
提示我去查看错误日志
这句话被我一直无视
直到我折腾了一个小时后我看了下错误日志
有这么一句
Table ‘mysql.plugin’ doesn’t exist
google了一下
没找到太多有价值的文章
但是基本搞明白了原因是由于系统表无法初始化造成了

后来就想到我曾经装过KDE,是需要mysql服务器支持的
虽然后来卸载了
可能残留有文件

看了一下在/etc下果然有有个mysql的文件夹

删除
重新执行mysql_install_db脚本

总算OK了,具体原因因为不动shell脚本,没办法去看源代码分析了。
但问题是解决了先

总结 :shell脚本不懂就是睁眼瞎阿

数字转换为中文字符javascript版

2010年01月7日

算法是网上搜的一个PHP版的

原始出处没找到

就不贴链接地址了

自己改了个JS版的

做备忘

估计以后用的着

function num2str(num)
{
	var num = parseInt(num);
	num = num.toString();
 
	if (num <=0)
		return false;
 
	var smallUnits	= ['', '十', '百', '千'];
	var bigUnits	= ['', '万', '亿', '兆'];
	var numChinese  = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
 
	num = num.split("");
	num = num.reverse();
	num = num.join("");
 
	var result = '';
	var pos4 = 0;
	var zero = '';
 
	for(var i=0, l=num.length; i<l; i++ )
	{
		var mod = i % 4;
 
		if (mod == 0)
		{
			result = bigUnits[pos4++] + result;
			zero = '';
		} 
 
		if(num[i] == '0')
		{
			switch(mod)
			{
				case 0:
					break;
				case 1:
				case 2:
				case 3:
					if(num[i-1] != '0')
						zero = '零';
					break;
			}
 
			result = zero + result;
			zero = '';
		}
		else
		{
			result = numChinese[num[i]] + smallUnits[mod] + result;
		}
	}
 
	return result;
 
}
 
console.log( num2str(12004422346) );
 
输出为“一百二十亿零四百四十二万二千三百四十六”

thinkpad t41升级ubuntu到9.10后无线驱动安装

2009年12月26日

将ubuntu在线升级到9.10后悲剧了

无线网络用不了了

折腾了N久搜到了一个有用到

记录下

google “linux atheros” 关键字

到http://blog.chinaunix.net/u2/77682/showart_1153295.html

然后再到

http://madwifi.org/

下载

http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.28.pre10.tar.gz

解压

sudo make

sudo make install

modprobe ath_pci

最后终于搞定了

PS:

发现一个新的问题

那就是wireless_tools.28

在最新的kernel 2.6.31-16-generic内核下用不了

在kernel 2.6.28-17-generic内核下可以成功使用

各位看官要注意下

kernel 2.6.28-17-generic

thinkpad t41 安装Ubuntu9.04升级到 9.10后显卡驱动安装

2009年12月25日

thinkpad t41u安装buntu系统升级到9.10后显卡驱动不了的问题

解决办法笔记

sudo apt-cache search radeon |more

sudo apt-get install xserver-xorg-video-radeonhd

sudo apt-cache search libdrm

apt-get install libdrm-d

sudo apt-get install libdrm-dev

sudo reboot

OK

用Diff和Patch工具维护源码[转]

2009年12月24日

原文地址

http://www.ibm.com/developerworks/cn/linux/l-diffp/index.html

Highcharts纯JS的图表实现[牛B的老外]

2009年12月21日

以前用EXT的chart做过一些图表显示的东西

无意中看到的这个项目

纯JS版本的chart,而且是基于JQuery的,实在是爽。

牛B阿

项目地址

http://www.highcharts.com/

不过我还没有自己实际测试速度

不过已经很让我期待了

rsync 的高级应用

2009年12月9日

原文地址