2008-07-07

工作的几个tip

关键字: jruby java spymemcached
1、如果用java6的ScriptEngineManager来调用JRuby,并且脚本使用到了Ruby的标准库(比如我用到了YAML库),如果没有正确设置,是会找不到标准库的。通过打印$:变量可以看到文件的加载路径,比如在某台机器上的打印的结果:    puts $:    输出: . /root/.jruby/lib/ruby/site_ruby/1.8 /root/.jruby/lib/ruby/site_ruby /root/.jruby/lib/ruby/1.8 /root/.jruby/lib/ruby/1.8/java ...
2008-06-18

NIO的SelectableChannel关闭的一个问题

关键字: nio channel close
    SocketChannel和ServerSocketChannel,两者的父类是SelectableChannel,它在jdk中的文档有这么段话:      Once registered with a selector, a channel remains registered until it is deregistered.This involves deallocating whatever resources were allocated to the channel by the selector. ...
    JavaOne2008上有个session《Upcoming Java Programming Language Features》,讲了即将到来的jdk7可能引入的新的语言特性,比较开眼界的是jsr308对Annotation的扩展使用,更多地作为断言或者 说checker使用以便减少bug。在ppt前面,我觉的更有意思的是对java语言演化的讲述,做个笔记。 1 、应用 VS. 语言 应用是特性越多越好,应用是 rich 的;而语言是 pure 的,更少的、普通的特性更好 ...
  Hadoop分布式文件系统:架构和设计要点一、前提和设计目标1、硬件错误是常态,而非异常情况,HDFS可能是有成百上千的server组成,任何一个组件都有可能一直失效,因此错误检测和快速、自动的恢复是HDFS的核心架构目标。2、跑在HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理;比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。3、HDFS以支持大数据集合为目标,一个存储在上面的典型文件大小一般都在千兆至T字节,一个单一HDFS实例应该能支撑数以千万计的文件。4、 HDFS应用对文件要求的是write-one-read-many访问模型。一个 ...
2008-05-31

两段java代码的比较

关键字: 递归 oom
第一个程序: import java.util.ArrayList; import java.util.List; public class TailRecursionTest { public static void main(String[] args) { TailRecursionTest t = new TailRecursionTest(); for (int i = 0; i < 10000; i++) t.a(0); } public void a(int j) ...
2008-05-05

使用Rope来高效处理长字符串

关键字: rope java ruby 长字符串
    前段时间看了这篇文章《Ropes:理论与实践 》。这两天为了提高工作中某个系统对外接口的效率,才认真学习了一番。本质上Ropes是将字符串表示为一棵二叉树,特别适用于长字符串的处理,貌似c++ STL库中也有这么个实现。具体实现和原理还是看这篇paper 。《Ropes:理论与实践 》 一文中给出的测试数据相当惊人,Ropes比之String和StringBuffer在append,insert,delete等操作上的效率都有一 个数量级以上的差距。跑下作者给出的测试程序,其实在测试的字符串不是很长的情况下,这个差距并没有那么大,这也从侧面说明了 ...
    推荐两篇blog: 《java NIO 类库selector机制解析(上)》 《java NIO 类库selector机制解析(下)》     有一个奇怪的现象引出的话题,为了Selector.wakeup功能做到跨平台, 每个 Selector.open() 时,在 Windows 会建立一对自己和自己的 loopback 的 TCP 连接;在 Linux 上会开一对 pipe ( pipe 在 Linux 下一般都是成对打开)。 java为了跨平台真是无 ...
   在《程序员》最新一期有个专题介绍java开源nio框架,其中谈到了mina和grizzly。mina我还算比较熟悉,写过一些代码,也尝试去读过源 码。而grizzly是第一次听说,这个项目是sun的一个开源nio框架,是2004年在GlassFish项目中诞生的,一开始是一个http web server,用于取代Tomcat的Coyote Connector和Sun WebServer,2007年7月1.5版本发布并宣布成为开源项目,项目主页在https://grizzly.dev.java.net     grizzly与m ...
Primitive Writes up to and including… ...are made visible to… Object the end of a synchronized block or method a thread entering a synchronized block or method for ...
2008-01-07

介绍一个轻量级java的swf处理库

关键字: swf swfheader
    提取swf文件元信息、压缩swf、解压swf都可以处理,来自于http://www.brooksandrus.com/blog/category/java/,或者直接这里下载。 一个小例子: SWFHeader header = new SWFHeader("G:\\mplayer\\test.swf"); System.out.println("signature: " + header.getSignature()); System.out.p ...
2008-01-07

PPT转图片

关键字: ppt 图片 dll jni
    小结下最近做的东西吧。因为是做一个素材管理的东西,因此需要处理各种各样的素材,音频、视频、图片、pdf、ppt等等。遇到一个需求就是将PPT转成 图片组,google一下,在java里是可以jcom之类的开源库实现,本质上都是通过jni调用office的COM接口来实现。我们就需要这么一个 小功能,拖这么大个开源库进来实在没有必要。最后决定自己写个动态链接库,通过jni来调用。     先写工具类, public class PPTUtils { public PPTUtils() { } ...
    挺久没动笔写blog了,换了新工作比较忙是一个原因。最近的工作是做一个素材管理的系统,其中有个要求做视频预览,将用户上传的视频转换并在网页上预 览。在网页上看视频,现在大多数视频网站都是采用flv流媒体文件,用flash做的播放器播放,我们也采用了这种方式。流程大概主要:用户上传文件- >后台转换文件成flv格式->flv播放器调用flv文件。     转换视频、音频文件到flv格式可以使用mencoder或者ffmpeg,我们采用了mencoder,在linux上的安装参考这里,安装结束后记的设置环境变量:export ...
2007-11-22

抽取网页数据的不同思路

关键字: 抽取网页数据 jtidy xsl xpath
    客户要求从Internet上的网页上抽取一定的数据,用来显示或者其他用户,这个需求很常见。这两天我们也遇到了这个需求,本来我一开始想是试用正则表达式去匹配需要的文本数据,后来经验丰富的经理给出了一个更好的思路,就是使用jtidy将 不符合xhtml的HTML文件转化成标准的xhtml文件——本质上就是XML文件,然后利用xsl抽取并转换成我们所需要的数据的一定格式的xml文 件。这样做其实就是将XSL模板当正则表达式来用,不过更清晰,当网页改变时也不需要重新编译代码,仅仅修改XSL模板就够了。过程如下:   & ...
    这两天看了一本老书《bitter java》,第一次系统地了解了所谓“反模式”。就书的内容来说已经过于陈旧,书中提到的magic servlet、复合jsp等等反模式已经是早就熟知的编程禁忌,而如web页面不能有太多元素这样的反模式也因为ajax的出现(异步加载)变的不是那么“反模式”了,其中又讲述了很多ejb的反模式,这些在轻量级框架流行的今天也早已经过时。不过书中有一个章节倒是挺有价值,讲述的是java的内存泄露问题,我认为是我目前读的关于这方面问题比较有价值的介绍。     ...
    昨天晚上搞到深夜,终于将资源模块搞定。到今天已经完成的功能包括: 1.四种基本路由:顺序、选择、并行、循环 2.流程定义文件和系统配置文件的读取和解析 3.使用内存作为流程数据和案例数据存储的MemoryWorkFlowDAO的开发 4.资源模块的开发 5.并发情况下的正确性测试等     计划中的功能: 1.一个GUI的流程定义工具,这个不急,也还没想好用什么做,web还是桌面? 2.各个数据库版本的WorkFlowDAO的开发,将流程数据和案例数据保存在数据库中。 3.更多的测试和example试验。 ...
    最简单的LRU算法实现,就是利用jdk的LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可,如下所示: java 代码   import java.util.ArrayList;   import java.util.Collection;   import java.util.LinkedHashMap;   import java.util. ...
2007-09-18

模仿st_table写的StTable类

关键字: st_table HashMap
    读ruby hacking guide,其中专门辟了一个章节介绍了st.c中的st_table,这个数据结构也就是类似java中的HashMap,基本原理是利用数组存储,数组的每一个元素是一个单向链表,链表中再存储具体的元素,如下图所示的结构    ruby中利用这个结构来存储对象变量、类方法、常量、全局变量等信息,在c ruby中,方法、变量都是用一个整型作为键值来存储在st_table中,因此这个数据结构对于以整性为键的map类型来说速度非常不错(我没有测试内存的占用情况)。 源码如下: java 代码   ...
2007-09-09

利用Doug Lea的并发包实现带超时机制的线程池

关键字: 并发 线程池 超时
    jdk5引入的concurrent包来自于Doug Lea的卓越贡献。最近我在查找服务器OOM的原因之后,决定采用这个包重写应用中一个servlet,这个servlet调用了一个阻塞方法,当被阻塞 之后,服务器中的线程数(因为阻塞了,后续请求不断地新增线程)突然增加导致了服务器当机,因此决定采用一个线程池,并且设置超时,如果阻塞方法超过一定 时间就取消线程。因为我们的项目仍然跑在jdk 1.4.2上面,短期内不可能升级到jdk5,还是要利用这个并发包。去这里下载源码并自己打包成jar,加入项目的lib,然后利用PooledExecutor和TimedCal ...
2007-09-03

线程任务的取消

关键字: java 线程 取消
    当外部代码能够在活动自然完成之前,把它的状态更改为完成状态,那么这个活动被称为可取消(cancellable)。取消任务是一个很常见的需求,无论 是由于用户请求还是系统错误引起的服务关闭等等原因。最简单的任务取消策略就是在线程中维持一个bool变量,在run方法中判断此变量的bool值来决 定是否取消任务。显然,这个bool变量需要声明为volatile,以保持多线程环境下可见性(所谓可见性,就是当一个线程修改共享对象的状态变量后,另一个线程 可以马上看到修改的结果)。下面是一个来自《java并发编程实践》的例子: java 代码   ...
2007-08-06

java求值字符串型逻辑表达式

关键字: parser 逻辑表达式 java
这是最近在项目中的一个需求,已知a=3,求字符串"a<=2"的值,也就是应该返回false。这个问题可大可小,就我们的应用场景也就是用来让用户自定义变量区间,比如类似下面这样的规则: a<=2    返回积分系数1.0 2<=5  返回积分系数1.1 a>5     返回积分系数1.2     如果用switch写死在代码中,以后要修改规则实在是很麻烦的事情,用户也希望能自己维护这样些区间值。于是我想就让用户自己输入这样的表达式和变量 ...
    知道这个模式还是通过《重构》,这个模式的出现还是了为了解决代码重复的坏味道。在项目中很经常见到类似下面这样的代码: java 代码   if(prj.getProjectId==null)       plan.setCost(0.0);   else       plan.setCost(prj.getCost());   ...
    这个类在spring2.01前没有被改写,spring2.06似乎已经改写了,还未看源码。不过这不是我所在意的问题。我在《org.springframework.beans简单解读》中的对这个类的理解是不正确的。我们先看看Guillaume Poirier对这个类中为什么使用WeakHashMap的解释: WeakHashMap is implemented with WeakReference for keys, and strong reference for values. That means if the value has a stron ...
    这个星期我的任务就是处理一些报表的打印问题,因为我算项目组里对jasperreport比较熟悉的了,这个东东也是我引进到这个项目。ireport画报表,使用struts的action输出PDF到浏览器,这是我们目前的解决方案。今天遇到一个ireport解决不了的要求——合并单元格。类似下面这样的表结构: ----------------------------------------------           |  &nbs ...
我们一直强调单元测试的重要性,但是有一个问题可能没有认真去想过,测试是重要的,但是我们测试什么呢?最近重读《单元测试之道》,书中给出了答案:Right-BICEP 1.Right——正确 很显然,如果代码运行的结果与你预期的不符合,那么这段代码肯定是有问题的。需要注意的是,Right并意味着正确,因为正确只是相对你所期望的结果而言,而对于用户需求也许就是错误的。 2.B——边界条件 寻找边界条件是单元测试最有价值的工作之一,因为bug一般出现在边界条件上,你常常需要考虑下面这些边界条件: 1)完全伪造或者不一直的数据进行输入 ...
    在websphere server上的jsp、servlet中调用EJB很简单了:             Context ctx = new InitialContext();             MessageSender msgSender = n ...
    我们是没办法使用javamail通过一般的代理服务器发送邮件的,比如下面的代码是没有效果的:         Properties props = System.getProperties();         props.setProperty("proxySet","true");       ...
The Java automatic garbage collection process typically operates as a low-priority thread that constantly searches memory for unreachable objects, objects not referenced by any other object reachable by a live thread. Different JVMs use different algorithms to determine how to collect garbage most e ...
呵呵,在《develope J2EE without EJB》中,DTO被狠很地批判了一把,rod说这完全是反模式。可实际项目当中,我们还是不得不在使用。VO,PO,一牵扯到概念总是多么复杂。。。把一个PO从头传到尾??从页面到数据库,一捅到底?NO,NO,万一你要显示给用户的是几个PO的结合怎么办?万一我们只是需要某几个属性组合在一起显示怎么办?一捅到底的策略是多么丑陋,而且你完全把你的数据库设计模型暴露给用户。所以我们需要一些map工具来转换,在这方面,过去我只知道有个 BeanUtils,不够灵活,而今天,接触了下dozer,啊,跟spring一样的理念!灵活多变,你想怎么映射,想怎么换 ...
最近重新再看<Inside JVM>,对JAVA编译成的字节码结构很感兴趣,希望找个工具能够对.class文件进行的解析和查看。没找到,倒发现javaassist可以对字节码进行操作和修改。此工具是JBOSS项目的一部分,JBOSS实现AOP的基础。呵呵,开眼界了,原来我们可以直接对字节码文件进行修改,哪怕不知道源文件(跟反编译完全不同)。一个简单例子: import javassist.*;class Hello {    public void say() {        System.out.println("Hello");    }} public class ...
怎么解析一个xml字符串?我不是第一次看到有人问这个问题了..汗 1.使用StringReader   Document doc  =  builder.parse(  new  java.io.StringReader(str));  2.使用DocumentHelper.parseText() String text  =   " <person> <name>James</name> </person&g ...
dennis_zane
搜索本博客
存档
最新评论