时间和日子在无知无觉中过去,问自己收获了什么?
每天无所事事。
列个标题,挖个坑,希望每天能来挑一点土。
《解读eclipse_3.50_galileo 源码》
从第一次使用eclipse(大概是03年的事,那时比较好用的是2.1版还是1.4版已记不清了)就想看看这么巧妙的一个玩意儿是怎么实现的,一直懒散无度,从未下手。
这段时间用SWT做个小工具,是边找边抄,为什么要那么写,不知道--真是有违一惯的作风。
每天下班后,都不是为什么奔忙着,网页?网游?都不知道自己看了些什么,玩了些什么。
eclipse 的jar很多,核心的是core.runtime和osgi(早些版本里,是没有osgi的),core.runtime比较小,就几个类,先攻击小的少的--毛主席真是伟大的军事家呀。
敬礼,睡觉去。
前言
一直想学习C,在刚知道有计算机的时候就想学习C,上学时,偷上计算机专业的课,学了半年Turbo C,学到指针时,晕了,也就没有下文。工作之后,时有心血来潮之时,但还是没怎么学习,Java还是比较简单,Java几乎占据了工作全部,更少有学习C了。用Java,研究到Java的核心,发觉还是得学C,学呀,学吧。
今天也是一时的心血来潮了,趁着有股劲,开始动手,记录一下,以期待和方便下次来潮。
写出的代码,得编译才可以运行,这个编译环境,得先搭起来。VC、Visual Studio,都微软的东西,有点抵触,也有些大,不安装了,手工配一套环境吧。
网上搜了一下,Windows系统配C的编译环境,得要MinGW或者cygWin,以前都下载过,但一直不知道它们本身是个什么东西,再查,知道大概:二者均基于GCC(GNU Compiler Collection -格努编译套件),再加一些基本的类库。去各自的官网分别下载安装,感受:cygWin更象是一个linux的模拟器,把linux环境下的GCC给模拟出来,其它的就都一样需要基本的编译器、类库,其它的如make工具。使用的时候,个人取向选择minGW,在环境变量中指向{$minGW}\bin,gcc和make就可以在cmd中运行了。
写个简单的hello world源程序,gcc一把,生产可执行文件,运行,结果出来,OK!
注,下载minGW时,我选择了自动安装下载,一个个的下载,点来点去,累的慌。
单独下载minGW,要如下几个包,再分别解开放在同一目录中。
gcc-core | C语言编译器 |
gcc-c++ | C++语言编译器 |
mingw-runtime | MinGW的运行时库(这个必须安装) |
win32api | win32的API函数头文件和连接库 |
binutils | MinGW的汇编器和连接器等基础工具 |
gdb | MinGW中的调试工具 |
mingw32-make | Make工具,用以更好的管理你的项目 |
make解后,没有通常的make.exe,只有一个mingw32-make.exe文件,其实,把这个文件改名为make.exe就行。
1978:第一个关键的年份
1988:虽然是第一个十年,但十岁的生日没多少印象了,更多的是开始注意的第一个年份。
1993:初中结束了,
1997:高中结束了,
2000/06/30:大学毕业了,世纪之交呀!
2000/08/03:子身跑到汕头的一个小镇开始第一份工作,真正的人生地不熟。到目的地时,身上只有20块钱了,还是年青的老板给我付的“摩的”费。
2001/11/03:混到一份跟自己所学专业,所做的工作一点也不相关的工作,毅然一个人跑到北京。首都呀!当时天很冷,比我想象的要冷,下车后把能穿的都穿上,不知象什么熊。打22块钱的车找到公司,竞然还没到上班时间。
2004/06/xx:一个伤感的月份,也注定要离开这个做了好几年有公司。
2004/08/04:换了一个比较远的公司,在朝阳,自己租住在西直门。
2005/02/28:一个没有29日的月份,还没开始工作,就没有选择的离开了。
2005/07/03:
2006/07/03:换了一份工作,不知什么感受。
与Velocity的第一次见面,是03年,有个新同事推荐使用,因当时我在做别的项目,也没怎么仔细了解,简单的知晓类似如模板一类的东西。之后有过几次接触,但,都没花时间仔细看,前段时间,帮朋友做一个小东西,觉得用个模板做,会省很多事,想到Velocity。东西很小,做完了都没时间看Velocity,今天正好有时间,研究研究。
Velocity是apache下的一个开源项目,其网址:http://velocity.apache.org/;下载地址:http://velocity.apache.org/download.cgi,可直接下载源码,也可通过SVN获取源码。
在eclipse中创建一个web应用工程,把Velocity的源码拷到java资源目录下,自动编译后,报几个错,拷贝下载的Velocity源码lib目录下的commons-collections-3.1.jar、oro-2.0.8.jar、commons-lang-2.1.jar这个三类包到web应用工程的lib目录下即可。
准备就绪,就写个例子跑跑试试。写一个hello.vm的模板文件,创建一个对应的Servlet,就可以运行了。两文件源码贴出如下:
hello.vm
<html>
<body>
#set($greet = "你好哇!")
Hello!$name, $greet
</body>
</html>
HelloServlet.java
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.servlet.VelocityServlet;
public class HelloServlet extends VelocityServlet {
protected Properties loadConfiguration(ServletConfig config)
throws IOException, FileNotFoundException {
Properties p = new Properties();
String path = config.getServletContext().getRealPath("/");
if (path == null) {
path = "/";
}
p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
p.setProperty("runtime.log", path + "velocity.log");
p.setProperty(Velocity.INPUT_ENCODING, "GBK");
p.setProperty(Velocity.OUTPUT_ENCODING, "GBK");
return p;
}
public Template handleRequest(HttpServletRequest request,
HttpServletResponse response, Context ctx) {
Template template = null;
try {
ctx.put("name","Velocity");
template = Velocity.getTemplate("/hello.vm");
} catch (Exception e) {
e.printStackTrace();
}
return template;
}
}
创建servelt要注意的几个地方。
1、新建的Servlet要扩展Velocity的VelocityServlet
2、在servlet中要实现 public Template handleRequest(HttpServletRequest request,HttpServletResponse response, Context ctx)
A)把要返回到页面上的数据放到context中对应到指定键值(键值名为对应模板中定义的变量名)
B)引入指定模板文件
3、导入配置文件的方法protected Properties loadConfiguration(ServletConfig config),是否实现,是可选的 ,其作用在后面说明。
发布运行后,访问http://localhost:8080/vt/HelloServelt,就可看到结果了。
运行起来,看到结果,是觉得很简单,其运行过程,就要跟踪看源码才能知道了。
看源码,先看的,肯定是VelocityServlet.java。发现源码注释中,这个类已不推荐使用,推荐使用Velocity的一个子项目tool中的VelocityViewServlet.java,我没有当tool子项目,就先看这个“过时的”实现。
VelocityServlet.java,扩展了HttpServlet,实现了doGet、doPost、init基本方法,前两个方法都直接调用新实现的doRequest方法,这些都是很常规的操作。
doRequest方法做如下几件事:创建上下文、设置响应内容文件类型、获取模板(调用每个请求中的具体实现)、合并数据做出响应、出错处理及资源清理。看到这儿,整个请求和响应过程很清晰,并没什么特别的处理。
接下来,看看它的初始化做了些什么事。就做了三件事,超类初始化、自己的初始化、缓存内容类型数据。自己的初始化,也就是(i)导入配置信息,(ii)根据配置信息做初始化设置。导入配置信息,是根据指定的几个地方,获取配置数据(在提供的样例中,重载了它的获取配置数据的方法,自己灵活的写入一些配置信息);根据配置信息做初始化的工作,应用单例设计模式,保证初始化工作的处理唯一。
VelocityServlet自已的初始化,调用另一个类org.apache.velocity.app.Velocity的init( Properties p )方法,就看看Velocity里做了些什么。Velocity里全是静态方法。主要有如下几个方法:
1、初始化;2、预演传入的数据(发现在应用中没有使用,只在单元测试代码中引用到);3、合并数据和模板;4、设置/获取属性;5、操作信息提示(不过,都不推荐使用了),整个的看下来,有两点:1、主要的还是初始化和数据合并了;2、这个类只是一个中转类,所有的方法,最终都是调另一个类org.apache.velocity.runtime.RuntimeSingleton的方法。
打开RuntimeSingleton的代码,看一看,发现它同Velocity类差不多,类本身不做实际的处理操作。它与Velocity不同的是,它是申明一个静态的实例,再调用这个实例,个别地方(init())加了同步控制。如此处理体现它这个类的名字--单例,核心的还是这个静态实例org.apache.velocity.runtime.RuntimeInstance。
到RuntimeInstance,就开始接触到Velocity的处理核心了。
写到这儿,突然没有写下去的冲动了,暂切休息一下。
抽时间看了一下Velocity子项目tool下的VelocityViewServlet的源码,比VelocityServlet要实现的好多了,与struct接合的比较好。
Velocity,不仅仅适合于web应用,还可以作生成SQL、XML的模板,内容比较多,待一一挖掘。
在网上看到“
盖茨北大演讲遭开源人士抗议”一事,对开源兄的行为,我选择不置可否,但对软件而言,我选择开源。
现在的局面是,商业化的软件比开源的软件,要活地滋润、舒展多了,所以也会发生这次事件。
为什么会出面这种局面?为什么需要开源?在这里我不阐述自己的观点--持有同感的人都有自己的想法。
开源如果想要活得不那么艰难,我想:需要一个良好的商业模式支持。
开源不是免费!
开源要生存发展,也需要营养供应,不能仅靠一部分怀开源激情的人或者组织无偿奉献能支撑起来的。
linux、jboss的生存模式算是比较成功的,但还不能够同商业化软件相比较,还需要更充足的营养源。
这二者的模式也是一定范围内有效,不能做到推而广之。
开源软件生存模式的探索之路还很广,还很远,需要有志之士共同努力。