据说是google的电面题目
昨天在bbs上看到的。
算法题一:Given 1 GB memory, input a file which contians 4 billion integers,
output one integer that is not in the file. What if you have only 10 MB
memory?
算法题二:There are 100 hundred sorted arrays, and each of them contains 100
numbers. Give an algorithm to merge them into a single sorted array, using
only one temporary array in the middle steps.
编程题:Input an integer array of size n and an integer k (k<=n), output all
subsets of size k.
如何用vmware安装ubuntu
如果你对linux的理解还停留在linux=redhat的层次上,那你有必要赶快装个ubuntu(发音是"我不土")。如果你平时主要用windows工作,只是想尝试一下linux,那vmware虚拟机应该会很适合你。如果你听说过这两个东西但不知道怎么用,那就好好读本文吧
用vmware装ubuntu说起来是很简单,不过对初学者而言,这篇文章可能会有帮助。
1、下载并安装vmware,我用的是VMware.Workstation.v5.5.1.19175
2、下载ubuntu光盘镜像,我用的是ubuntu-6.10-desktop-i386.iso
3、运行vmware workstation,新建一个虚拟机,选择typical,linux,ubuntu,其他都可采用默认选项。
4、建立虚拟机后,选择菜单中的VM - settings,点击cd-rom,use ISO image,打开刚才下载的镜像文件。
5、此时即可启动虚拟机,开始ubuntu的安装过程。
安装时唯一要注意的是分区。一般是swap分一个区,大小是内存容量*2;其他空间都分到根目录"/"下面。根目录分区的文件系统类型可以任选,我用的是ext3。
安装之后可能需要作些设置才能发挥ubuntu的全部能力,比如指定一个自动更新源以便自动升级 。(未名bbs的linux版给了一个北大校内的更新源,请参考http://bdwm.net/bbs/t.php?Linux/Z.1135167556.A/4/0/13)
因此,请仔细阅读http://wiki.ubuntu.org.cn/上的文章。初学者能遇到的问题一般都可以在这里找到答案。
例如,我在这里找到了一个安装ubuntu 6.10的图文教程:http://www.debianadmin.com /ubuntu-edgy-eft-desktop -installation-with-screens
hots.html
最后,如果需要同时在windows和linux下工作,我以前写的这篇blog在windows下编辑代码,用linux远程编译可能会有所帮助。
p.s. 最新版的ubuntu支持类似vista的3D桌面效果,大家试试Beryl这个程序吧!(注意,vmware不支持3D特效)
几个好玩的小软件和网站
vista的开始菜单有搜索功能看起来是很爽。xp下面装了google desktop的话也能搜索,只是它太大太慢了,其实大部分时候我只想搜索文件名,不需要全文搜索。Launchy 是个很好的选择,看看截图,界面很酷吧:



剪贴板增强工具,按下Alt+C列出最近15次复制的记录
,比Office自带的剪贴板增强好用多了。
据说ClipX也不错,这里有一个详细介绍和比较。
这两个小软件看起来简单,但的确很能提高效率。
到哪里找这类好玩软件呢?推荐两个网站:
小众软件
LinuxTOY
都支持rss,有什么好玩的新东西肯定不会错过了。
UC Berkeley的在线计算机视频教程!!
把课程完整的录像放到网上免费共享!!!uc berkeley的webcast实在让我惊奇不已。
打开CS 61A The Structure and Interpretation of Computer Programs,就可以看到2006年秋天刚刚录制完成的最新课程,质量超级好,可以说跟在教室里听课的效果差不多。对于2007年尚未结束的课程,还可以订阅随时更新的rss。
不过,这个网站唯一的缺点是课程数目比较少。但是,提供的课程都是精品,比如数据结构,操作系统,SICP等。
我是怎么发现这个网站的呢?这里再推荐一下著名的LtU:http://lambda-the-ultimate.org/ 做理论计算机研究的人,特别是程序语言的,都应该经常来这看看,里面经常能看到有趣的讨论,或是对一些重要论文的介绍。比如,最近LtU上有这样一个有趣的讨论:“计算机科学的发展的黄金时代是否已经过去了”。
两台电脑共享宽带上网的办法
- 两台电脑共享adsl宽带上网
每次寒假回家,都会遇到两台电脑争用一条宽带线路的问题。以前也看到一些共享宽带上网的介绍,可是大部分文章要么要求adsl猫支持路由功能,要么要求服务器上有两个网卡然后装wingate。
最近找到了一个简单的解决办法:装ccproxy。这是个免费的代理服务器,支持http, socks等多种代理。在服务器端运行之后,客户机就可以通过设置代理上网了。如果有些程序不支持代理,那就再加个sockscap就可以了。ccproxy的官方网站上有很多详细的说明。baidu上可以搜到破解版。
- 多用户同时登录winxp远程桌面
另一个非常有用的技巧是,破解winxp,使其支持远程桌面两个用户同时登录的功能。具体步骤可以参考“用XP SP2 仿真2003远程多用户登录(远程桌面)”一文。
以前我在实验室的机器上总是装win2003,其实就是为了实现多用户同时登录这么一个小功能。早知道xp也可以支持这个,就不用装软件兼容性很差的2003了。
- 提升公众网与教育网间的互联速度
最后,在家上网必然遇到的另一个问题是:公众网与教育网之间超慢的互联速度。以前,只要一回家,就无法telnet任何bbs,也不能用任何教育网的ftp,更不用说maze了。
不过,现在出现的很多跨网互联工具可以解决这个问题!比如我最近在用的Netpas,同时支持免费用户和收费用户,现在上bbs的感觉简直就跟在学校一样,可以说效果之好出乎我的意料啊。
如何用代理访问国外网络
地震了,网断了,好多事都没法做了……在郁闷了n天之后,今天我花了半天的时间研究代理软件,总算有了一点收获。步骤如下:
首先下载ProxyThorn和Proxy Hunter。
ProxyThorn可以从指定的网站下载代理地址,并对其批量验证,这样就不用手工加入代理地址逐个验证了。我在cang.baidu.com上用proxy关键字找到了一些不错的代理网站,比如http://www.dailifuwuqi.com/。注意要设置“启用模糊匹配抓取代理”,这样才能正确识别。
这样,就可以找到很多的代理了。但是,ProxyThorn不支持代理调度,也就是说不能同时使用多个代理。
好在ProxyHunter支持代理调度,所以我们必需先从ProxyThorn中导出可用的代理,然后用ProxyHunter导入,最后在浏览器中设置代理地址为127.0.0.1:8080(这是ProxyHunter的默认地址),就可以上国外网了。
还要注意!如果是通过拨号上网或VPN连接到国际网 (例如当你使用教育网直通车时), 代理服务器应该在[Internet选项]->[连接]选项卡上部的 “拨号和虚拟转用网络设置” 中选中相应的连接, 再点击右侧的 “设置” 进入代理服务器选项中设置”,而不是在“连接”的下方点“局域网设置”。(细节可参考http://wangjunyu.net/?p=352)
目前我还不知道如何在Firefox中作类似的设置。不管怎样,现在用教育网直通车+ProxyThorn+ProxyHunter总算可以访问国外网站了。
还有就是最近推出的ProxyExpert,据称可以完全取代ProxyHunter,但不知为何在我这里几乎无法运行,每次都要等2分钟左右才能打开。而且这个软件的界面实在太难用了。
Java相关技术学习资料收集
* AOP
What is AspectJ
AOP学习资源和AspectJ
AOP的确是个很强的idea,可以在一定程度上改变思维方式,同时也非常容易理解。
* EMF
OOPSLA 2006 - Introduction to EMF(附带一个很好的cheet sheet)
EMF真的是个好东西,比JAXB什么的强多了;加上GMF后就更强了。做个图形化的编辑器,可能只要15分钟!这个introduction是我见过的最好的了。
* xDoclet
ANT忠诚伴侣XDoclet基本任务手册
文档化注释可以做很多很多事。
* Spring, Hibernate
用spring、Hibernate、Struts组建轻量级架构
看了基于Spring的J2EE开发以后,越来越觉得企业应用开发很无聊……有了这些框架,程序员要做的无非是把用户的需求翻译成代码罢了,毫无创造性。
* MDA
AndroMDA
两篇openMDX的文章
看过一些MDA的工具后,我发现MDA并不是个空洞的概念,这里真的有点东西。PIM到PSM的自动转换的确是很有意义的。
Java6的一些新特征和例子代码
- Web service更容易写了
看下面的代码,感觉跟C#很像。
1 package hello; 2 import javax.jws.WebService; 3 4 @WebService 5 public class CircleFunctions { 6 public double getArea(double r) { 7 return java.lang.Math.PI * (r * r); 8 }
调用web service是这样的:
public static void main(String[] args) { try { // Call Web Service Operation ws.CircleFunctionsService service = new ws.CircleFunctionsService(); ws.CircleFunctions port = service.getCircleFunctionsPort(); // TODO initialize WS operation arguments here double arg0 = 3.0; // TODO process result here double result = port.getArea(arg0); System.out.println("Result = "+result); } catch (Exception ex) { } }
其中ws这个package可以由IDE从给定的wsdl文件自动生成。
- 运行期编译Java源代码
以前要编译Java源码必需用javac.exe,如果想在运行时动态生成两个类,只能先System.exec调用javac,然后用 ClassLoader从硬盘上读取生成的.class文件载入类。这个过程因为要读写硬盘所以非常慢。现在可以直接用API调用javac了。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager manager = compiler.getStandardFileManager(null, null, null); Iterable compilationUnits = manager.getJavaFileObjects(new File("MyClass.java")); compiler.getTask(null, manager, null, null, null, compilationUnits).call(); manager.close();
- 内置脚本支持
以前觉得djava是个好东西,现在java6内置了脚本支持,也允许脚本跟java之间的交互。看起来djava快要完全退休了。借用sun公司的一句广告:Perhaps You ThougHt yOu couldN't program with a scripting language and Java togetheR. Which will yoU Be trYing ?
jsEngine.put("namesListKey", namesList); System.out.println("Executing in script environment..."); try { jsEngine.eval("var x;" + "var names = namesListKey.toArray();" + "for(x in names) {" + " println(names[x]);" + "}" + "namesListKey.add(\"Dana\");"); } catch (ScriptException ex) { ex.printStackTrace(); } System.out.println("Executing in Java environment..."); for (String name: namesList) { System.out.println(name); }
- 其它
还有很多新特性,比如更好的桌面效果,可以对内存做分析如memory dump,等等,可以参考
http://java.sun.com/javase/6/
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/beta2.html
Java6发布了!
内置脚本支持
以前觉得djava是个好东西,现在java6内置了脚本支持,也允许脚本跟java之间的交互。看起来djava快要完全退休了。
jsEngine.put("namesListKey", namesList); System.out.println("Executing in script environment..."); try { jsEngine.eval("var x;" + "var names = namesListKey.toArray();" + "for(x in names) {" + " println(names[x]);" + "}" + "namesListKey.add(\"Dana\");"); } catch (ScriptException ex) { ex.printStackTrace(); } System.out.println("Executing in Java environment..."); for (String name: namesList) { System.out.println(name); }
除掉anonymouse.org的弹出广告
anonymouse.org是我平时用于浏览wikipedia等被过滤网站的工具之一。这个网站就是一个匿名代理,速度还挺快。唯一讨厌的是,每打开一个页面,都会弹出一个广告窗口。今天用greasemonkey插件,写了一行代码,搞定了这个问题。
greasemonkey是个著名的firefox插件,允许在网页载入后自动运行一段用户给定的代码来动态修改网页内容,比如删除页面中的广告,或者增加个按钮之类。关于它的介绍很多,还有一本简短的电子书“dive into greasemonkey“可以看看。有一个经典的greasemonkey脚本可以允许我们访问一直以来都被屏蔽的google网页快照。
安装greasemonkey插件后,用户只要写一个后缀为.user.js的文件,然后用firefox打开这个文件并选择“Install script"就可以了。
下面是我写的script文件(需要把它先另存为anonymouse.user.js,然后再用firefox打开就可以安装了):
// ==UserScript==
// @name Anonymouse popup remover
// @namespace http://xiang.blog.edu.cn
// @description Remove anonymouse.org popup ad. by zxp
// @include http://anonymouse.org/*
// ==/UserScript==
document.getElementById("mouselayer").style.display='none';