Java的Date&Time居然也JSR要通过了

    很少在这里发技术的牢骚。Java里的日期时间这块简直是耻辱,java.util.Date里那么多的Deprecated方法和属性,除了类本身,基本就是废柴。这里的消息表明,以后用Java日期时间的话,虽然可能不需要手动加入jar包(应该会在JDK里,毕竟太常用了),需要引入javax.time包了

原来都是粉丝

    微软号称要搞个“黑屏”,把很多用户气坏了,记者乐坏了(唯恐天下不乱的记者,随便看看几篇报道就知道)。本来一直想写点什么的,后来看到keso的这篇,发现不用写了。从前一直在道理上说说这事儿,keso一点拨,发现都是粉丝,于是所有的问题都迎刃而解了。真是“爱之深,责之切”啊。

一道编程珠玑的题,终于搞懂了

给定一个包含4300000000个32位整数的顺序文件,请问如何找到一个至少出现两次的整数?

顺序文件,不允许随机访问。

    解答:Binary Search,但不是对文件内容折半,而是对搜索范围折半。由于4.3G>32位的整数空间,根据鸽笼原理,肯定会有重复的整数。搜索范围从所有的32位正整数开始(全部当成unsigned int,简化问题),即[0, 2^32),中间值即为2^31。然后遍历文件,如果小于2^31的整数个数大于2^31,则调整搜索范围为[0, 2^31],反之亦然;然后再对整个文件再遍历一遍,直到得到最后的结果。这样一共会有logn次的搜索,每次过n个整数(每次都是完全遍历),总体的复杂度为o(nlogn)。

    例子:数组[4,2,5,1,3,6,3,7,0,7],假定从3位的整数空间内搜索。第一次的范围为[0,8),遍历过后发现[0,4)范围内的整数个数为5,于是调整为搜索[0,4)范围内的整数。第二次发现[2, 4)范围内的证书为3,大于2,于是调整为[2, 4)。再经过第三次的遍历,找出3为重复出现的整数。

    改进:上面的办法有很多的冗余。于是提出了一个办法:建立一个新的文件(是顺序文件就可以)。在一次遍历过后,确定搜索的范围后,把原有文件里这个范围内的整数写到新的文件里去,下次搜索就只要搜索这个新文件了。这样可以得到近似线性的复杂度(但是常数项应该很大)。

    嗯,算法还要加强,不然以后面试要挂了,呵呵。

中国人史纲

    前几天送LP回家,回来路上顺便去了一趟先锋书城逛逛,发现了一本挺有意思的书《中国人史纲》,是刚去世不久的柏杨写的。当时随便翻了翻,觉得视角很独特,于是,下了狠心。。。。。。。跑到图书馆借了出来。

    这本《史纲》基本颠覆了我对史纲的理解,实在是很有特点:

  1. 对帝王的称呼,直呼其名。在一个无须为尊者讳的时代,以年号或者谥号指代帝王,主要是为了读者的方便。而《中国人史纲》直接称呼名字,对读者反而造成了一些不方便。个中原因,在书中也有提到。作者对这些谥号实在是非常厌恶。比如某些遗臭万年的罪人,死后的谥号却是无比的显赫。
  2. 对儒家的态度立场鲜明,鞭笞入木三分。同时也没有特别偏向法家和道家。
  3. 年代的编排以公元纪年,还用到了二十年代,三十年代这些现代的记法来表示以前的时间。
  4. 在某一世纪的中国史篇章结束之后,会把同时代的西方大事件拎出来提一提。
  5. 评出了中国历史上的三个黄金时代:春秋-西汉,唐代和清代(最后一个争议比较大)。

    现在只读到刘彻这部分,看到了豆瓣上关于这本书的评论(链接1,链接2),都是比较推荐的。鼓楼图书馆只有上册,哪天回浦口的时候还要去把下册一并借出。

Nature & Science

    今天晚上又学术小白了自己科普自己了一把。

    第一次知道Nature & Science是在初中的生物课上,老师告诉我们这是两本很牛的杂志,生物学最新最NB的成果都发表在这个上面(那会儿基因工程啥的也炒得沸沸扬扬),从此以来我就一直以为这两本就是生物学的杂志,上面都是高深的充满公式的论文,自然也没有兴趣翻看(从小对生物没有爱)。

    今天看到TopLanguages上的推荐,从gigapedia上下载最新的Scientific America来看(在国内的引进版叫做“科学”,然后副标题叫做“科学美国人”,后来因为种种原因停办了,有点像国内的“Newton科学世界”吧)。(插播一句,对于E文电子书有爱的同学,强烈推荐gigapedia,上面的计算机类国外书籍、杂志基本没有找不到的;其他学科的我没有试过,大家可以试试看。注意一定要注册、登录再搜索,然后用Item Search,里面会有这本书在rapidshare.com,mild.net,filefactory.com等等文件共享站上面的链接可以下载,基本都是精良的PDF版本或者Djvu扫描版)里面有一篇IT的文章讲到了Web Science,在最后的链接里给了几篇文章。除了平常经常看到的IEEE和ACM的杂志或者通讯,我还发现了Tim Berners-Lee在Science上发的文章,彻底打破了我对Nature & Science的多年误解。

    后来wikipedia了一把Nature & Science,发现Nature其实并不是一个杂志,而是一坨。包括综述性期刊(Review)和研究性期刊。而主打杂志里的文章也不是什么高深的论文,而是具有较高的新闻性和广泛的读者群。除了具有“突出的科学贡献”,还必须“令交叉学科的读者感兴趣”。

   最后送上Nature最新一期的封底和封面(我在gigapedia上下了这一期,的确是这样~~)。

image

使用Cache-Control和gzip提升tomcat应用性能(整理)

这个其实应该是常识,只不过以前做的J2EE应用大部分是内网里跑的东西,所以性能上没什么问题。这次APIS由于有在外面用的可能,加上使用了一些比较大的javascript框架(Ext),所以性能问题瞬间窜了上来。
以前做的J2EE应用没有使用上达500K的框架,最多就是几十K的Prototype,所以没什么问题。一个页面一般也就几十K最多了。但这次还在开发中的APIS,由于还在用debug版本的库,所以单单Ext就膨胀到了一个多M,加上不知道是Struts还是Tomcat默认写入Response的cache-control: no cache,在远程用起来就很慢,一般一个页面需要十多秒种甚至更久,实在无法忍受。前几天集中解决了问题。
首先是Cache-Control的问题,Google了好一阵,没有什么直接配置的方法,只好自己抄了一个一个Filter,通过和web.xml里配置的配合勉强凑合着用。一般就是对*.do实施no-cache政策,其他需要缓存的img, js文件,统统加上长达两周的缓存期限。ETag实在不会用,就先用这个缓存策略吧。
Filter的代码:

  1. public class ResponseHeaderFilter implements Filter {
  2. FilterConfig fc;
  3. public void doFilter(ServletRequest req, ServletResponse res,
  4. FilterChain chain) throws IOException, ServletException {
  5. HttpServletResponse response = (HttpServletResponse) res;
  6. // set the provided HTTP response parameters
  7. for (Enumeration e = fc.getInitParameterNames(); e.hasMoreElements();) {
  8. String headerName = (String) e.nextElement();
  9. response.addHeader(headerName, fc.getInitParameter(headerName));
  10. }
  11. // pass the request/response on
  12. chain.doFilter(req, response);
  13. }
  14. public void init(FilterConfig filterConfig) {
  15. this.fc = filterConfig;
  16. }
  17. public void destroy() {
  18. this.fc = null;
  19. }
  20. }

web.xml里的巧妙配置:

  1. <filter>
  2. <filter-name>NoCache</filter-name>
  3. <filter-class>apis.server.common.util.ResponseHeaderFilter</filter-class>
  4. <init-param>
  5. <param-name>Cache-Control</param-name>
  6. <param-value>no-cache, must-revalidate</param-value>
  7. </init-param>
  8. </filter>
  9. <filter>
  10. <filter-name>CacheForWeek</filter-name>
  11. <filter-class>apis.server.common.util.ResponseHeaderFilter</filter-class>
  12. <init-param>
  13. <param-name>Cache-Control</param-name>
  14. <param-value>max-age=604800, public</param-value>
  15. </init-param>
  16. </filter>
  17. <filter-mapping>
  18. <filter-name>NoCache</filter-name>
  19. <url-pattern>*.do</url-pattern>
  20. </filter-mapping>
  21. <filter-mapping>
  22. <filter-name>CacheForWeek</filter-name>
  23. <url-pattern>/images/*</url-pattern>
  24. </filter-mapping>
  25. <filter-mapping>
  26. <filter-name>CacheForWeek</filter-name>
  27. <url-pattern>/img/*</url-pattern>
  28. </filter-mapping>
  29. <filter-mapping>
  30. <filter-name>CacheForWeek</filter-name>
  31. <url-pattern>/icons/*</url-pattern>
  32. </filter-mapping>
  33. <filter-mapping>
  34. <filter-name>CacheForWeek</filter-name>
  35. <url-pattern>/ext/*</url-pattern>
  36. </filter-mapping>
  37. <filter-mapping>
  38. <filter-name>CacheForWeek</filter-name>
  39. <url-pattern>*.js</url-pattern>
  40. </filter-mapping>
  41. <filter-mapping>
  42. <filter-name>CacheForWeek</filter-name>
  43. <url-pattern>*.css</url-pattern>
  44. </filter-mapping>

(插入一段:在探测这些性能问题的时候,我使用的是一个Firebug的插件,也就是Firefox插件的插件-YSlow,好像是Yahoo的,结合Firebug里XHR的Net这块做Profiling,效果很不错,很容易就知道瓶颈)
还有一个gzip的办法,就是在服务器压缩内容,再传给浏览器。现在主流的浏览器都支持gzip压缩,而且这些html和js文本压缩起来很厉害,基本上可以有40%的压缩率。办法在servel.xml的注释里也有写,就是在Connector元素里加上
compression=”on”
compressionMinSize=”2048″
noCompressionUserAgents=”gozilla,traviata”
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
以上的内容大部分都是Google得来,我自己做了一下整理