继2年前的世界杯,现在欧洲杯终于又要开始了。不知道为什么一直没有什么感觉,知道6月初的时候才突然在网上看到消息。
很久没看球了,宿舍看球也不是很方便,最近看的三场比赛居然都是国足的,我冏。。。
比赛都是凌晨的。。。看来就是不看也不得好觉睡阿。。。。所以不如看比赛吧,呵呵
Author: Marshall
中柱而出
我现在的心情,就像中国对巴西打正式比赛,中国队一不小心在第10分钟进了一个球,1:0领先,现在正处于第12分钟,刚才一分钟,巴西一球打中横梁,中国大难不死。
————–酸酸的分割线———————
自从辅导员昨天早上宣布工学研究生的下学期很可能搬鼓楼以后,我和舍友YY的兴致很高。在浦口呆了5年,谁不想回到鼓楼的怀抱,彻彻底底当一回南大人,而不是在PKU继续沉沦。一周三趟的公交车江南江北,荒凉的高新区,拥堵的大桥,空旷的浦口,这些都没问题,我们可以好好的远离城市的喧嚣,浑浊的空气,浮躁的气氛。但这一切,加上一个限定词:5年,剩下的只有绝望。但当机缘巧合给了我们逃离的机会的时候,没有人相信这命运的转机,反而非常担心害怕这即将得到的美好的幻灭。
————-叙事的分割线———————-
晚上小老板来机房问我情况,也是机缘巧合,一个师弟突然问我是不是下学期要搬去鼓楼。唉,早不说晚不说,为啥现在问。。。。还好没被吓傻,很装蒜的问:“谁说的?我怎么就不知道呢?”然后哼哼哈哈的含糊过去了。小老板也说,这怎么可能呢。吓得我一身冷汗。要是让他知道,肯定会阻挠此事,煮熟的鸭子飞了不说,一切的计划泡汤也不说,就怕对不起LP空欢喜一场了。算是中柱而出吧。
————-事件回放—————————
由于南大决策失误,原本计划今年搬迁仙林的计划搁浅,而浦口的金陵学院却按原计划扩招,结果下学期浦口住宿异常紧张,部分院系提早搬迁鼓楼,出现了史上罕见的“把学生从新校区往老校区赶的场面”。由于软院研二的工学没有课,也被列入了搬迁鼓楼的计划,腾出20人的空间。此事目前已得到校长助理同意,但还为最后拍板。持续高度关注事态进展中。
ubuntu
今天在ubuntu下呆了一天,写PPT、聊天什么的都比较顺利。除了游戏,画visio,基本找不到什么windows的理由。下一次试试看开发。
解决Ubuntu升级8.04 “未能计算更新”问题
其实问题也不难,只要好好看提示就可以了。提示里说查看/var/log/dist-upgrade/里的内容,之前粗粗地看过一遍也没在意,main.log里没问题,term.log是空的,apt.log里东西挺多没仔细看。一直以为是cn99源的问题。换了cn.archive.ubuntu.com也失败。
今天把ubuntu-alternative给下了下来,发现还是这个问题。于是好好看了apt.log,发现有这么一句话:
language-support-cn has broken dep on openoffice.org-l10n-zh-cn language-support-cn has broken dep on openoffice.org-l10n-zh-tw
难道这几个东西之间有冲突?卸掉openoffice l10n的包以后,问题解决。
结论:仔细看日志。
Google TreasureHunt
Google悉尼一个寻找工程师的做题站点。现在还只有3题,一周更新一题。题目难度不大,但是还挺锻炼编程或者思考能力的(虽然robot那题比较火星,最新一题似乎用硬算的)
http://treasurehunt.appspot.com
补三周前的自行游记
其实也不是去哪儿旅游,只是实现了一直有的想法–自行车出游。正好天气很好,风不大也不热,很久没运动了。本来打算去学院拿本书,但机房下午4点半就关门了,过去实在不是很划算,干脆就骑车绕一个大圈子,最后顺便绕回学院,哈哈~
线路可以见图,挺早以前就一直盘算的路线:校门出门右转,从龙王山西面的永丰镇绕过龙王山,在南气(南信工)上大路(宁六公路)去大厂里转一圈,再从葛塘车站那边沿着宁六公路回来,全程只有1公里左右的重复路线,基本把南大以北的几个热闹地方探了个遍。大厂扬子以前骑车坐车去过几次,路还比较熟,但永丰那边的路况却不清楚,要是山间小道可就惨了。
出校门,过听香和小白鼠后往北拐上永锦路,路况比想象得要好得多,一边还有两排新建的商品房。这些年房地产开发像发疯了一样,不知道买房在这儿的人怎么出行。估计小区有规模了以后就等着131和159延长个一公里左右吧(话说苏宁天润城、威尼斯水城这些大楼盘直到这两天才有636和151通上)。
过了商品房,路上的乡间风光还是很不错的,特别是某处蜿蜒的看不到前头加上少许的上坡,右侧不远的龙王山山头,微风拂面,温和的阳光。想不到南大附近还是有这么不错的地方。这让我想到了上次到骑车去林场(经常在南京站坐火车的应该经常听到,“XXXX次列车林场开出,停靠N号站台”的广播,以前我老把这个当成“临场”,以为是某种铁道术语)时没想到东大西边居然有两座小山头之间有道深涧,估计有30米宽,25米深,可能更深,上面有座桥横跨,感觉到了山区丘陵。涧旁植被茂密,而我在山腰上的工地路(工地为地名)骑行,一直觉得误入歧途(要不是路旁的垃圾堆散发出来的恶臭,我准把这里当桃花源),直到看到了铁道才知道这里就是林场。
比预想要快就拐上了龙山北路,上了个小坡就到了南气的地盘。不宽的路边商家云集,而且比较有秩序(也许到了晚上就很乱了),店家也很多,大概有两三米长的店铺,大概是南大门口商圈规模的5倍大。南大门口巴掌大的“黄金美食一条街”实在是太寒酸了,谁让高新区的城管太厉害了呢。按照南大浦口17000人的规模(很可能更多),每人每天就是只有1块钱,一年300天,也有500万以上的市场,怎么就那么区区一两千平方米的营业面积呢?不过南大搬仙林,这里的前景有些看淡,也容易让投资者犹豫,留下来金陵学院的消费能力毕竟还是要比现在下降一些的。
上了宁六公路很快在杨庄转弯上了大厂主干道–新华路。这里和4年前相比(大一的国庆骑车来过),基本没有什么大的变化,南部的生活区还是老样子。过了邮电大楼,开始热闹起来,见到江北难得一见的繁华地带。忽然感觉有些亲切,因为这里和我家很想:一个大城市的郊区中心(杏林算是还算发达的卫星城镇吧),和市区大概有20公里的距离(杏林这些年随着厦门市区的北扩和公铁大桥的建成应该会拉近一些距离,不过还是有10公里以上)并且有着天然的阻隔(一个是长江,一个是海湾),城镇人口多,商业也还可以(都有国美,肯德基还都是两家,不过杏林没麦当劳),都是工业聚集区(一个有扬子石化、南钢、南化等大型国有能源企业,不过南钢似乎是复星控股,不是国企了;杏林主要是台商投资区,附近差点还有个PX,企业规模要小一些,人口应该也会少一些)。
沿着新华路总共骑了5公里在麒麟广场左转,发现了鼓扬的终点站–扬子。坐了那么多次的鼓扬,还是头一回见到那一边的底站长啥样,呵呵。也顺便转到葛塘的底站看了看,最后沿着宁六公路回了学院。全程25公里,耗时2小时10分,包括中途休息了近20分钟。附行车路线图。
zz商务周刊封面:别了,摩托罗拉
挺长的一篇IT产业文,写得挺不错的。以前看课本里写DEC、IBM的衰落基本没什么感觉,但Moto的虎落平阳,却是能真切感受到的。
Upgrading to Spring Security 2.0(zz)
原文:http://raibledesigns.com/rd/entry/upgrading_to_spring_security_2
就是appfuse作者的博客,做了一些精简
1. 包变化:org.acegisecurity => org.springframework.security
2. 依赖变化(略,不用Maven)
3. tag标签的开头authz => security, 然后把taglib的关联项改为
<%@ taglib uri="http://www.springframework.org/security/tags"
prefix="security" %>
4. web.xml,把<filter-class>改为org.springframework.web.filter.DelegatingFilterProxy,另外还要加上<init-param>标签
<init-param>
<param-name>targetBeanName</param-name>
<param-value>springSecurityFilterChain</param-value>
</init-param>
5. 修改security.xml,使用新的语法.根据作者的说法,AppFuse的security.xml的长度从177行下降到了33行,因为使用了很多convention over configuration的元素,如<http auto-config=”true”/>。关于语法,还需要一些实践把握。
关于数学
最近一段时间开始看数学了,估计是这几年来第一次主动读数学的东西。不过其实也不是纯粹的数学,主要是结合了计算机的一些算法啊,解题的思考啊,等等。
上个学期浅浅学过数据挖掘,特别是BP神经网络过后,突然又对算法这块感兴趣。这里也有求职的因素在内,毕竟很多工资高的企业,比如知名外企+百度都很看重这个。听说百度实习考试,考的基本上是算法,最简单似乎是快速排序的非递归算法,我没有细想,只想到一个类似递归的迭代算法,不知道认不认(刚才百度了下,结果基本上是用栈的,估计和我想得差不多吧)。Google的就不用说了,看到某Google牛人博客,说他应聘面试的时候,考官问了一题,他给了一个比较不普遍的解答,考官问为什么,答来自TAOCP第二卷,考官说这题就是考你有没有看过TAOCP的。TAOCP我虽然有3卷英文的,但实在是没有拜读的勇气,更没有精力,研究生阶段看完CLRS就很好了。
一开始考试完在图书馆翻了翻Tom Mitchell的Machine Learning和Luger的AI,主要是一些启发式的算法和贪心算法(这两个的之间也有交叉),觉得似乎基础还要补一补,又想起了Jetty毕业前的建议,开始从Programming Pearls研究起,做习题,主要做一下算法的题目。
接下来订阅了刘未鹏的博客和谈论组,上面常有一些很好的文章和讨论。特别是最近的一篇。也第一次知道波利亚的超级经典:How to Solve It,国内也有译本,不过听说翻译的极差,不推荐。英文的有电子版,不过是DJVU的版本,书倒是不厚。这本书我还没看,是下一个读书计划。看在很多大牛推荐讨论的份上,也大大的推荐一把。
昨天晚上书架上翻出“什么是数学”,去年在china-pub上跟风买的,本来以为是有点科技哲学和趣味的书,买来以后翻了翻,觉得倒有点像教材,于是束之高阁。昨天顿时觉得大错特错。
前几天研究一个问题时碰到马尔可夫链,不懂,没学过,也挺惭愧的。想找概率的书,却发现不见了,很是懊恼,今天抢了大三小朋友的一本,知道了随机过程、马尔可夫是啥回事。
讲了好多意识流,也困了,睡觉去。。。读书任重而道远,况且还要做项目。。。
P.S. 驾照半个月前就考完并到手了,还是挺开心的,都很顺利。不过还要去交警九大队落户,从桥北起要走挺远的,好麻烦。。
java diff 及wiki相关
diff的原理在于找两个字符串之间的最大相同子串(Longest Common Subsequence)以及编辑距离,比较有名的实现是UnixLinux上常用的diff(GNU Diff)。
实现
Java里Diff的实现我找了一下,主要是两个,java-diff 和bsmi上的Diff ,前者为LGPL,后一个为GPL。其实代码也都不多,都实现了LCS算法。前一个协议上对我们比较有利,而且文档、测试和例子多一些。
JavaDiff里主要有两个类,Diff和Difference类。前者是算法,后者是差异的表示类。下面讲一下例子:
Object[] a = new Object[] {
"a",
"b",
"c",
"d",
"e"
};
![]()
Object[] b = new Object[] {
"a",
"x",
"y",
"b",
"c",
"j",
"e",
};
![]()
Difference[] expected = new Difference[] {
new Difference(1, -1, 1, 2),
new Difference(3, 3, 5, 5),
};
![]()
Diff diff = new Diff(a, b);
List diffOut = diff.diff();
![]()
差别有三处,用两个Difference对象表示。一个Difference对象表示替换,增加,删除。Difference的构造函数:
public Difference(int delStart, int delEnd, int addStart, int addEnd)
如果delEnd或者addEnd为-1的话,就代表没有删除或者增加行为。
回到例子,两个字符串之间的差别在于,目标字符串在第1-2行(从0算起)增加了x,y,第3行的d被第5行的j替换。Difference虽然只说明了行号和动作,但我们可以推算出来增加了什么,删除了什么,替换了什么。下面是另一个更长的例子,来自测试用例:
![]()
![]()
public void testStrings1()
{
Object[] a = new Object[] {
"a",
"b",
"c",
"e",
"h",
"j",
"l",
"m",
"n",
"p"
};
![]()
Object[] b = new Object[] {
"b",
"c",
"d",
"e",
"f",
"j",
"k",
"l",
"m",
"r",
"s",
"t"
};
![]()
Difference[] expected = new Difference[] {
new Difference(0, 0, 0, -1),
new Difference(3, -1, 2, 2),
new Difference(4, 4, 4, 4),
new Difference(6, -1, 6, 6),
new Difference(8, 9, 9, 11),
};
![]()
runDiff(a, b, expected);
}
上面比较的都是一个个字符串的差异,推广一下,把每一行文本当作一个字母,就可以得到文件的差异。在java-diff的etc下有一个FileDiff.java,是一个很好的参考。得到之间的差异之后,我们要把这个差异表示出来,这个需要包装一下,不过难度不大。
版本保存
还有一个wiki版本的保存问题。大的维基引擎如MediaWiki(就是维基百科那个,顺便说一下,维基百科的英文版终于可以访问了)没时间研究,就是 JSPWiki也没来得及看)(JSPWiki连数据库也不用,Web用自己写的框架,可读性可能比较不行)。只研究了trac的wiki实现。trac 的wiki实现很简单,就是把每一个版本都保存在数据库,毕竟都是文本的,还可以接受。每次比较的时候就从数据库里取两个版本出来做一个diff,具体实 现在PYTHON/site-packages/trac/wiki/web_ui.py(_render_diff函数)。trac提供两种形式的 diff结果,一个是tabular的表格形式,就是很直观的对比,还有一个是Unified的形式,也就是经常看见的diff结果。这是通过页面上 javascript读table里的文字转换成Unified格式的diff文本,虽然个人不推荐这种方式。wiki的文本修改又有一个特点,就是每一 行其实内容可能比较多,只改了几个字,这样就要对这一行的两个版本再做一个diff,然后把删除的文本用<del>标签,增加的文本用 <ins>标签展示出来。
最后提一下JSR-170,一个用来管理仓库内容(主要是大型CMS)的API,支持版本控制,存储多元化,很复杂,有两个商业实现和一个Apache JackRabbit的开源实现,这里 是一个参考资料。JSR170也是里面的例子也是把每一个版本都存储下来。

}
Object[] a
}