java

22 posts

Set up OpenTripPlanner using Auckland data

If you want to do some journey planning in Auckland, basically you have three options:

This post will show how to set up OpenTripPlanner using Auckland data.

OpenTripPlanner (OTP) is an open source trip planner. You need to check out code from GitHub first.

cd /path/to/projects  
git clone git://github.com/opentripplanner/OpenTripPlanner.git  

Then build the source code.

cd OpenTripPlanner  
mvn clean package  

After code is built, download GTFS data from AT's MAXX. OpenStreetMap (OSM) data is also required. Download Auckland's data from here. Select binary PBF OSM data.Put downloaded GTFS and OSM data into the same directory, e.g. /tmp/pbx, then run

cd /path/to/projects/OpenTripPlanner  
java -Xmx2G -jar target/otp.jar --build /tmp/pbx  

This will generate a Graph.obj file in /tmp/pbx directory. Create directory /var/otp/graphs and copy Graph.obj file into that directory. Then start OTP server:

java -Xmx2G -jar target/otp.jar --server  

After server is started, access http://localhost:8080/index.html for the OTP instance.

Note

After a quick test, the journey planning result is not quite accurate comparing results from Google Maps or AT's MAXX site. More tuning is required for better results.

Send raw UDP packets in Java

Sending raw UDP packets in Java is required when you want to control certain headers of UDP packets. For example, you may want to modify the source IP address in the UDP packets to masquerade yourself. This kind of operations cannot be done using standard Java API. You have to use native code to do that. libpcap is the most popular library to capture network packets. It also provides the capability to create or modify packets. There are several Java wrappers available for libpcap, including jNetPcap and jpcap. I tried different libraries and found out that jNetPcap is the best choice for now.

Set up

jNetPcap is just a Java library. Unfortunely there is no public Maven repository which contains it. You need to download it from the website. It's recommended to use the production release 1.3.0. Development release 1.4 has some issues on RHEL. The downloaded package contains Java library and native library. Choose the right package for your platform.

Add the Java library to your application's CLASSPATH. Add following arguments when starting the JVM.

-Djava.library.path=<Path of jNetPcap native library>

The Code

After finishing the set up, it's time to write the code to send raw UDP packets. The complete code is listed as below. The code is hosted as a GitHub gist.

{% gist 7108987 RawUdpPacketSender.java %}

Test

Open Wireshark to capture network packets. Run the code. You should be able to see the packets.

Troubleshooting

Most of the time, the problem will be UnsatisfiedLinkError when loading native libraries. Make sure you have downloaded the correct jNetPcap native library matches your platform. This library should be specify in -Djava.library.path.

《深入理解Java 7》一书已经出版

在历时近一年之后,我写的《深入理解Java 7 - 核心技术与最佳实践》一书已经出版。这本书不仅仅是一本关于Java 7的书,也包含了很多Java平台的底层技术的详细介绍,适合于有一定Java基础的读者。

发布基于Apache MINA 2的联机俄罗斯方块的源代码

这其实是一件拖了很久的事情,周末的时候花了些时间把它做完了。之前写了一篇关于Apache MINA 2的文章,其中开发了一个联机俄罗斯方块的小应用做完示例,代码一直没有整理。 周末的时候把代码整理并修正了一些问题,正式发布出去。希望对学习Apache MINA 2的人有所帮助。

原始的博文地址在这里,发表的文章在这里

源代码发布在Google Code上面,地址是:http://code.google.com/p/tetris-mina/

《深入探讨Java类加载器》

深入探讨Java类加载器》是我3月份写的一篇文章,一直没有在这个博客上面介绍一下。

Java的类加载器一直是个比较复杂的话题,在Java里面又是比较重要的概念。虽然一般开发中很少遇到,但是如果要开发容器或是OSGi组件的话,有些时候会遇到它。而且一旦出现问题,很难一下子发现问题的所在。这篇文章就是结合了之前自己的一些使用经验,对Java的类加载器做了一些探讨。

文章的摘要如下:

类加载器(class loader)是 Java™ 中的一个很重要的概念。类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。

解决Apache服务器无法启动的问题

前几天重启了电脑之后,Apache服务器突然无法启动了,在日志里面看到了下面的出错信息:

[crit] (OS 10022)An invalid argument was supplied.  : Child 6120: setupinheritedlisteners(), WSASocket failed to open the inherited socket.

马上到Google搜索,发现了这是一个还比较常见的问题,原因可能是Windows底层的socket实现出现了问题。解决的方式非常简单,到微软网站上下载一个工具,修复winsock2就可以了。

工具的链接是:如何在 Windows Server 2003、Windows XP 和 Windows Vista 中确定 Winsock2 是否已损坏并从中恢复

SSH, 又见SSH

这里的SSH不是指的Secure Shell,而是指的Struts + Spring + Hibernate。 关于这3个东西,大家都不陌生了。合在一起是目前主流的Java Web应用开发模式。写这篇博文的出发点是我今天的一个面试。 实际上我之前也面试过一些人,SSH是我很常听到的一个词。每次听到这个词,我不由自主的有种感觉,是不知道该如何发问。 我并非SSH的专家,我所用到SSH的地方也就是之前自己做过一两个小应用,纯粹是学习的用途。SSH肯定也有很多我不知道的技术细节。

SSH的流行有它们很多必然的因素。Structs是老牌的前端框架了;Spring,我仍然记得当年看Rod Johnson的那本《J2EE Without EJB》时的兴奋心情;Hibernate则影响了Java的持久化模式。
我所担心的是SSH的流行对于普通开发人员的影响,对于刚毕业的学生的影响。SSH使得开发人员之间的同质化加剧。 对公司来说,这是好事,一个人离职了,很快就可以找到相同技能的人来替代;对于个人来说,一方面是好事,跳槽很容易。 不在这个地方SSH,就在另外一个地方SSH。不好的地方则是比较竞争优势的缺失以及思维的局限。 大家都用一样的东西,自然没有什么很大的区别。局限在一种开发模式,则容易迷失。 SSH也许可以保证你5年,甚至10年的饭碗,但未必能保证你20年的饭碗(也许可以?)。拥抱更多的可能性才是更好的办法。

下面是一些我觉得不错的做法:

  • 在了解框架的同时,了解背后的设计理念和实现细节。比如读读SSH这些框架的源代码。

  • 拥抱更多的可能性。把眼光挪到其它的模式上看看,了解了解。

有点感触就随便写了这么多,不存在对SSH的任何偏见。

《使用Apache MINA 2开发网络应用》

这是最近写的一篇关于Apache MINA 2的文章,主要介绍了Apache MINA 2的技术细节,对于想用它开发网络应用的人来说,可以作为一个参考。这篇文章的写作花费了我很长的时间,主要是其中示例应用的开发时间很长。为了做那个联机的俄罗斯方块,我花费了很长的时间把Spring Rich Client, Apache MINA和Spring整合起来,涉及到UI的开发就会比较复杂一些。最后做出来的效果还不错吧,虽然代码仍然有些粗糙。目前的想法是重构整理之后再发布出来。

点击这里访问这篇文章。文章的简介如下:

Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。Apache MINA 2 可以作为开发网络应用程序的一个良好基础。本文将介绍 Apache MINA 2 的基本概念和 API,包括 I/O 服务、I/O 会话、I/O 过滤器和 I/O 处理器。另外还将介绍如何使用状态机。本文包含简单的计算器服务和复杂的联机游戏两个示例应用。

重要更新

源代码已经发布,地址是:http://code.google.com/p/tetris-mina/