2009年2月19日星期四

2009年2月10日星期二

闲扯公司中VPN的安全

VPN,包括IPSec啊或是加密的PPTP啊什么的,本身是很安全的,一般都是用128位的算法来对来往数据加密。解开VPN的加密算法需要数千台计算机工作数千年。所以,迄今为止还没有听说通过破解加密算法来攻破VPN的真实案例,这也许是因为我孤陋寡闻,但是至少很稀有。

不 过,就像木桶能装多少水依靠最短的一块木板,VPN安全也有一块短板,那就是我们自己和自己的家用电脑。要想通过VPN来窃取公司机密,最方便也是最 常用的方法不是破解复杂的数学密码,而是想办法从相关人员手里偷到钥匙(偷窥到密码)。甚至在多数情况下,密码都不是“偷”去的,而是大摇大摆抄走 的,或是员工主动提供的。这听起来可笑,但是却常常发生在缺乏安全知识和意识的员工身上。下面通过几个例子来说明:

例子一:公司员工美女小A,在家里想远程连回公司办公,但是VPN总也不工作。小A想到正追求自己的宅男小C是电脑高手,于是搬来小C替自己解决。为了节约时间减少 麻烦,小A就把自己的密码“prada”告诉了小C。小C很快的解决了问题,带着小A的感谢和微笑(谜之音:还有密码!!!)回家了。小A找到帅气新男友 小D半月后,发生了公司客户数据以每条1块钱的价格泄露给竞争对手的消息,小A傻眼了(谜之音:她可能连眼都没傻)。

教训一:无论如何,不要把自己的密码泄露给其他人,包括公司的同事。公司的同事可能会利用你的身份进行信息犯罪,并栽赃给你。如果实在需要找小C帮忙,也记得自己输入密码,不要让小C看到。

例子二:公司员工美女小A,在家里想远程连回公司办公,输入了自己的用户名Amy和密码prada,顺利连入公司网络。情场失意的网络高手小C,在深夜报复社会,用程序猜测小A在公司VPN的密码。小C不是胡猜,他用一个含有很多常用密码、英文单词、从1970年到现在每天日期的文件作为猜测的备选,不出几分 钟,电脑上提示prada这个常见单词被猜中了。几天后,发生了公司客户数据以每条1块钱的价格泄露给竞争对手的消息。

教训二:不要使用简单的密码,例如自己的生日、英文单词、较短的随机字符串(例如小于5位字母,黑客完全可以把5个英文字母的所有组合尝试一遍)。密码要长,最好大于10位,要没有规律,要包含字母、数字和标点符号,例如“sak@32o8.fjs”就是一个不错的密码,黑客老死也无法猜中。记不住这么变 态的密码怎么办?多记就好了,一般来说几天之后就会背下来。我还有个小技巧,是利用符合发音规则的假词造长密码,例如coporine92simory!,这个密码比上面的好记,也相当安全。

例子三:公司员工美女小A,在家里想远程连回公司办公,输入了自己的用户名Amy和无敌密码i~dont~th1nk~u~can~guess~this~password293,顺利连入公司网络。情场失意的网络高手 小C在深夜报复社会,通过QQ、MSN等大量发送木马病毒。小A的机器没有开防火墙(嫌麻烦)和杀毒软件(嫌慢且不想花钱),已经不幸中招几天还没有察觉。小C发 现某台电脑受到自己控制,这台电脑又有一个活动的VPN链接,于是偷偷远程潜入小A的电脑,又通过小A电脑上已经连接的VPN进入公司。几天后,发生了公司客户数据以每条1块钱的价格泄露给竞争对手的消息,小A自己的私房照片也被贴在了火爆的成人网站上。

教训三:一定要开启防火墙,一定要及时更新系统,一定要安装杀毒软件并及时更新。黑客从来不是针对你行动的,他们广撒大网,只有安全性弱的电脑才会中招。 一般公司会配备集中采购的杀毒软件,如果没有的话,可以考虑Windows防火墙,AVG免费杀毒软件,360安全卫士和墨者安全专家等软件,这些都是完全免费的,能给电脑带来不错的基本保护(但是如果涉及高度敏感数据一定要咨询相关专业人员,如公司信息安全专员)。

我选择美女小A作为主角也是有意义的。公司里面不乏计算机达人,他们自己的电脑防护的如铁桶一般百毒不侵,但是像小A这样对技术不感冒的员工就是企业安全的短板。要修补这块短板,一般就需要专职IT人员的检查和不厌其烦的培训了,呵呵。

2009年1月27日星期二

在Java中检测cpu数目

如果我们想在Java中利用多核处理器,那么就要按照实际的处理器数目来创建线程。如何得到处理器数目呢?一句话: Runtime.getRuntime().availableProcessors(); 这是一个int值,在我的macbook上返回的就是2,呵呵,简单方便。

2009年1月20日星期二

Is Java ready for multi-cores?

The title is a little big. -_-

Nowadays most computers have two independent CPU cores, for example, my MacBook has two in the Intel Core 2 Duo. Question is: Can we get any benefits from the additional core when coding with Java? Assuming we programmers take care of threading and algorithm parallelization.

The key to this question is whether we can run two Java threads simultaneously on different cores. In C/C++, we can use SetThreadAffinityMask() for Windows and thread_processor_bind_np() in POSIX systems like Linux. Is there similar mechanism in Java threading? A Google search brings up some relevant pages, like this article by Patrick on JavaWorld. Patrick argued that Java 1.1.3 VM cannot utilize more than 2 CPUs well (Oops, I have only 2..).

To get my hands dirty, I wrote a small program in Java to see if it can use all my cores.


public class MultiCoreWorker extends Thread {

@Override
public void run() {
int a = 0;
while (true) {
a = (a + 1) % 1000;
}
}

public static void main(String[] args)
throws InterruptedException {
MultiCoreWorker t1 = new MultiCoreWorker();
MultiCoreWorker t2 = new MultiCoreWorker();

t1.start();
t2.start();
Thread.sleep(1000000000);
}

}


The code basically do nothing but adding a number, which will take all available CPU cycles. When 2 MultiCoreWorker are running, the system have a 100% CPU usage on both cores. I ran the code multiple times to assure that it's stable. A screenshot of the Activity Monitor is as follows.


It seems at least Java threads can expand on 2 cores well ( On Mac OS X leopard with client JVM 6.0). I'll try to make some of my code parallel and see how much time can it saves by utilizing 2 cores.

The funny thing happened when running just a single thread. I commented out the codes with t2, and re-ran the program. Only one core was used, that's not beyond our expection. Interesting thing is in the following screenshot, the thread was actually jumping between the cores.

See the complementary curves just under the label "CPU Usage" ? :) Our code do not have any I/O operation, so there would be no I/O waiting. It clearly indicates that JVM can move threads between CPUs at any time. Cool...

2008年12月23日星期二

2008年12月21日星期日

Performance comparison 性能比较 : Java vs python vs c vs c++

哈哈,标题很大,内容很弱。
今天无聊,做了个小实验。假设我们有个任务,输入是一个文本文件,每行两个整数用空格分开,输出是一个文本文件,每行是输入对应行的和。这个例子虽小,但确是比较经典的场景。我用java, c, c++, python写了好几个程序,每个都在接近日常编码的情况下尽量写的快一点,看看究竟速度有什么差别。

程序的输入都是一样的,一个文本文件,有10,000,000行,每行两个1000以内的随机整数。机器是Macbook Intel Core Duo 2.0G, 2G内存 DDR667, 5400转seagate磁盘 8M缓存,Mac OS X Leopard 10.5.5. 虽然这些不是重要因素,但还是要介绍一下。

时间测试用的是bash的time命令,取的是real时间。

1) java,用split,java version "1.6.0_07" Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153) Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_07-b06-57, mixed mode)

程序如下

TextFileReader r = new TextFileReader("/Users/sixiance/Desktop/test.txt");
TextFileWriter w = new TextFileWriter("/Users/sixiance/Desktop/test.out.txt");
String l = null;
int a, b;
while ((l = r.readLine()) != null) {
String [] cols = l.split(" ");
a = Integer.parseInt(cols[0]);
b = Integer.parseInt(cols[1]);
w.writeLine(Integer.toString(a + b));
}
r.close();
w.close();

说实话split是很消耗时间的,每次都要生成一个正则表达式Pattern对象。这程序运行四次, 时间均值17.46125
标准差0.3162429,单位都是秒。

这里面的TextFileReader/Writer就是简单包装了一下new BufferedReader(new InputStreamReader(new FileInputStream()))

2) java 不用split, VM同上

既然刚才知道split比较费时间,那我就不用split,用如下的代码片段代替

int pos = l.indexOf(" ");
a = Integer.parseInt(l.substring(0, pos));
b = Integer.parseInt(l.substring(pos+1));

结果比split好很多,均值 10.26375标准差0.133784,快了好多。

3) c, gcc -O3, version 4.0.1 (Apple Inc. build 5465)

c程序如下:

#include "stdio.h"

int main(int argc, char** argv) {
FILE* fp = fopen("/Users/sixiance/Desktop/test.txt", "r");
FILE* ofp = fopen("/Users/sixiance/Desktop/test.cout.txt", "w");
int a, b;
while (!feof(fp)) {
fscanf(fp, "%d %d\n", &a, &b);
fprintf(ofp, "%d\n", a + b);
}
fclose(fp);
fclose(ofp);
}

结果自然是无敌快:均值8.09575, 标准差0.1816670

4) python, Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26) [GCC 4.0.1 (Apple Inc. build 5465)] on darwin

代码如下

f = open("/Users/sixiance/Desktop/test.txt", "r")
of = open("/Users/sixiance/Desktop/test.pyout.txt", "w")
for line in f:
[a,b] = line.strip("\n").split()
of.write(str(int(a) + int(b)) + "\n")
f.close()
of.close()

这个也是用了split,速度是很慢的, 均值48.5335, 标准差0.2030706

5) c++, g++ -O3, gcc version 4.0.1 (Apple Inc. build 5465)

程序如下

#include
#include

using namespace std;

int main(int argc, char** argv) {
ifstream ins("/Users/sixiance/Desktop/test.txt");
ofstream outs("/Users/sixiance/Desktop/test.cppout.txt");
int a, b;
while(!ins.eof()) {
ins >> a >> b;
outs << (a+b) << endl;
}
ins.close();
outs.close();
}

都用c++的方法,不是用c的部分。这个惊人的慢:均值68.3783,标准差0.3763082。c++ stream真不是盖的,敬仰啊... 这个的sys时间花的比user还多,而且都比c和java慢了好多。

6) c++ 不用endl
思考一下,罪魁祸首是endl,每个endl都会导致stream flush(这其实挺sb的)。把endl改成"\n",均值14.734,标准差0.2281447,这次是比较正常了。

总结回顾

让我们回顾一下,把各种情况下的时间都画在一个图里面:



这些数字绝不是要说明那个语言好或是那个语言快(本身意义也不大),因为实际的问题千差万别,很难用这么小的例子来概括。但是这些数字确实可以告诉我们,在抄起家伙随心地写一些小工具和小实验程序时候,大概会有一个什么性能差距。

2008年12月14日星期日

恢复游泳

今天晚上回到久违的学校游泳馆,开始恢复游泳了。

周四按摩的时候,按摩师傅说你们这些每天坐在电脑前面的人脊椎都不太好,得经常锻炼一下。我觉得这个挺重要,好几个兄弟颈椎都已经出状况了,赶紧就问啥锻炼最好。师傅介绍了几种方法,最好的还是游泳,看来经常游游是百利而无一害啊,不错不错。

游泳馆在奥运前半年的时候就封馆支援运动员训练了,上一张游泳卡就白搭了100多在里面。今天重回游泳馆,发现奥运还是有好处的,原来走廊里面剥落的墙皮现在变成瓷砖了,隔不远还有小装饰画,感觉好很多。更衣室里也重新装修,洗澡换成了感应喷头,热水也是哇哇地好,谁说奥运没啥好处,哈哈。

今天先游了1300米热热身,争取这次在游泳卡过期之前都把它用掉~

2008年12月8日星期一

魔方,无敌魔方

办公室有一个魔方,最普通的3x3那种,我搞了半天才搞定两个面,实在是太弱智了。

共享两个视频,第一个是机器人的,第二个是活人的






叹为观止啊

2008年12月7日星期日

美国的神奇之楼,竟然倒在一起




在google maps上偶尔看到的,应该是拼接的结果,但这拼接的也太好了

2008年12月1日星期一

校园风光



发两个校园随拍,安静的冬日午后。

2008年11月26日星期三

Java是混水摸鱼者的最爱?

看到一篇老文,The Perils of Java Schools,作者是Joel,一个知名程序员。大意呢就是java本身难度太低了,只学java不足以区分出优秀的计算机毕业生和混水摸鱼者。Joel对指针、递归和函数式语言比较有爱,觉得这些才能区分出一个脑子是不是适合做好的程序员。文章写的还是比较中肯的,不过总让我有一种感觉,就是某些有了一些知识的人,总是企图把自己脑袋里面的知识神化复杂化,好创造出和其他人的区别。Joel的文章里面也提起以前大学里面要学拉丁文,不是因为拉丁文有用,而是“受过教育的人应该懂拉丁文,以示和平头百姓的区别”。那么受过教育的CS毕业生也应该懂scheme以示和草根程序员的区别么?真是扯淡,有种拉出来练练才是真的。

另:你觉得递归有那么难,可以用来区分talented brain和java library cobbler么?
更新:昨天晚上找我女朋友做实验,我成功地在十几分钟内把递归的概念教给她,她随后自己推导出了快速排序算法。需要说明的是我女朋友是文科生,高中毕业后再没学过数学或是任何理科的东西。

2008年11月20日星期四

iPod touch 二代入手


观察了好久,终于出手啦,哈哈。我的是8G版本,在百度有啊上买的,1699大元,店主竟然亲自送货,还赠送屏幕贴,值得推荐。

言归正传,说说两天体会。
  1. 手感重量很棒,可以用惊人来形容,组装的也很结实,在工业设计上给满分。
  2. 触控感觉不错,虚拟键盘用起来很顺手,输入失误率很低。官方的拼音输入法就很不错了,手写玩了玩,觉得不如虚拟键盘打字方便,就又给关了。
  3. 速度流畅。
  4. 缺点:电池有点痿。我基本上是拿他当浏览器用,而不是当mp3用,所以wifi使用时间很多。如果像我这样整天wifi的话,基本上每天就得充一次电。
  5. 缺点:safari有时候会死掉,直接退回到home界面,不到影响使用的程度,但是也不罕见。
  6. 缺点:不支持flash。据说有人移植成功了?
  7. 缺点:appstore在中国好多东西不能买,音乐和电影就算了,连很多app都不能买,例如知名的enigmo谜之机器,实在是遗憾。中国appstore里面应用少很多,注册美国的帐号需要美国信用卡。据说有办法注册,还没试过。
  8. wifi连接速度挺快的,基本上感觉不到wifi初始化连接的过程,达到了“开机就上网”的标准。
  9. 没有内置麦克风,得用iphone耳机才能录音,很不方便。
总体来说还是很好的,哈哈

2008年11月17日星期一

百度的黑锅谁来背



我写东西非常不喜欢用叹号,始终觉得叹号太哗众取宠,在网络上已经被滥用了。不过今天我不得不用一个叹号,因为百度太棒了!

用百度搜索“谷歌公正性”,第一条结果“谷歌公正性遭质疑,央视曝光竞价排名”。题目看的我一惊,央视不是曝光百度么?怎么变成曝光谷歌了?点进去一看没有语言了,这个网页里面题目明明是“百度公正性遭质疑,央视曝光竞价排名”,到了百度的搜索结果里面,“百度”二字就有如神助地变成了“谷歌”,真是得来全不费功夫。

空口无凭,截图留念。

2008年11月13日星期四

游中关村软件园

软件园景色

软件园景色


今天陪mm去公司领材料,顺便游了游中关村软件园 :) 发两张照片纪念这个美好的阳光下午。(blogger不能发照片了?)

2008年11月5日星期三

找不到的mathbbold.sty ?

最近写一篇论文,用www2009的标准latex模版,在mactex下编译的时候提示找不到mathbbold.sty。虽然编译可以继续,但是心里总是很不爽,遂挖掘了一下相关原因。

原因其实很简单,这个mathbbold.sty就在你的系统上,不过改名叫mathbbol.sty(8.3文件名复活记?)。想兼容mathbbold这种写法,就到/usr/local/texlive/2008/texmf-dist/tex/latex/jknapltx/下,sudo cp mathbbol.sty mathbbold.sty,然后运行sudo mktexlsr重新建立文件名索引。再编译一下你的文档试试?大功告成 :)

2008年10月24日星期五

站立式工作



今天在Engadget上看到一篇帖子,说站着工作要比坐下工作健康好多,还会促进脂肪的代谢,减少一型糖尿病的发病率。看罢我们办公室的几个就立刻动手,把放电脑的桌子抬高到吧台高度(上图照片)。站立工作了一天,感觉还不错,不像是在写程序做实验,倒像是在演奏乐器或是接待客人。不如大家都来试试?

推荐一个编程时可以听的在线音乐电台:GrooveSalad

有没有过这种时候:工作比较累,周围太安静(或太聒噪),想听点音乐,又不想被歌词和演唱者忘我的高潮干扰,也不想操心该听什么?SomaFM提供了一个频道叫GrooveSalad就正好满足了这个要求。

SomaFM是一个免费的在线电台,下面有几个频道,我一直听的就是GrooveSalad。GrooveSalad,顾名思义,就是节奏(groove)拌的沙拉,播放的内容是DJ精选的背景音乐,曲调简单好听,节奏感强,但又不喧宾夺主,实在是编程第一佳品,哈哈。

GrooveSalad是一个pls文件,有realplayer就可以听,mac的itunes和linux下vlc都可以,你还可以把这个pls文件保存在电脑上,下次不用上网连,直接双击打开就可以了。

经过我长期收听,鉴定结果是GrooveSalad很值得推荐 :)

2008年10月22日星期三

恩,又慢慢转回mac,囧

用了一段时间的vista,还是蠢蠢欲动要转回mac。Vista的好处是可以运行一些windows程序,网络银行啊pplive啊啥的。说句实话除了这些就不太好用了,1)启动慢,2)盖上电脑休眠后再启动也慢,3)电脑的快捷键经常不好用,4)任务栏驻留了很多的东西,5)字体渲染和mac差太多,尤其是在看英文PDF论文的时候,6)我装的暴风影音竟然会在播放半路自动退出。

看来还是双系统,留个windows玩游戏看pplive之类,主要的工作系统mac爽一点,呵呵。

2008年10月18日星期六

Gnome Asia Summit

今天去了Gnome Asia Summit,地点很近就在北航。Gnome来了好多人演讲和做教程,加上赞助商Sun、Motorola和Mozilla等等,人气很旺。Gnome现在在linux上市场占有率很高,不过说实话KDE/QT的设计和代码可读性等等感觉都比gnome好,但是大家就是认gnome。这有点像Mac和windows,Mac各个方面都比windows好,大家就是认windows。我发现的一个规律就是在软件市场上,有时是第二名技术和产品都比第一名好,但是第一名还是遥遥领先,除非是第二名好太多,这一般是不现实的。例子很多,如刚才说的win和mac,gnome和kde,还有linux和solaris、hao123和Google导航,IE和firefox。我们下次选软件的时候可以留意一下,在没有兼容问题的前提下,看看有没有优秀的第二名 :)

关于Gnome Asia Summit,更棒的是免费注册+中午管饭。在餐厅排队的时候听组织者介绍一顿要50块/人,还是不错的。有免费午餐就有蹭免费午餐的,排在组织者后面的两位仁兄就连gnome是啥都不知道,搞的组织者很尴尬......

p.s. 没带照相机,所以没图没真相了,请鄙视吧 -_-

2008年10月14日星期二

九型人格测试,应该做一做

前天mm推荐我做了一个人格测试,属于标准的Enneagram九型人格测试,通过一系列的二选一问题来猜测你更属于九种典型人格中的哪些。九型人格测试很准确,而且从儿童成长的角度对人格的形成做了解释。我觉得每个人都应该做一下,认识一下自己 :)

九型人格看起来很像隐含主题模型,每个人格是一个隐含主题,而每个人的性格是多种主题的混合,通过一系列的问题能把人的性格分解到不同的分量上去。如果能拿到很多很多人的问答数据,对其进行概率分解或是SVD分解,不知能不能还原出代表九个性格的隐含主题?哈哈