2009-04-10

run guest OS as service

isn't it a good idea to have your virtualbox based guest OS running on host system starting ?

let me show you how it can be done :

Suppose that you already have a guest os, such as JeOS. you can start it from command line :

>VBoxManage startvm "Ubuntu Server" -type vrdp  #your server's name , or vm id which you may already know. pay attention to the "-type vrdp", it means starting the guestOS in non-GUI mode.

the script for shutdown is :

>VBoxManage controlvm "Ubuntu Server" poweroff

these two lines are the core code, we write a shell file to include it (lets name it ubuntu.server.sh and put it under /etc/iniit.d/ , omit the file content....), and schedule it :

>sudo update-rc.d ubuntu.server.sh start 40 2 3 . stop 01 0 1 6 .

now you dont have to start the guestOS manually every time restart the machine :)

2008-07-23

the jsp-config trap

There will be conflict if configure the servlet and jsp-config the same pattern as below :

<servlet-mapping>
  <url-pattern>/system/*</url-pattern>
</servlet-mapping>

<jsp-property-group>
  <url-pattern>/system/*</url-pattern>

if a request came, "/system/watch" for example, Tomcat will pass the request to the jsp container,
since jsp container cannot found any jsp fit this request, an http 404 would be returned.

I spent 3 hours and worked it out. here i list out some related resource :
1. the request process diagram
http://tomcat.apache.org/tomcat-6.0-doc/architecture/requestProcess.html
2. org.apache.catalina.core.StandardContext  : how the war context was loaded.

2008-05-23

控制Bundle的启动

在开放RCP程序时, 由于ActivationPolicy的存在(这是个优点, 保证OSGi只加载需要的Bundle), spring的osgi-extender并不能自动start, 这导致所有基于spring-osgi的bundle只能愣在那起不了作用.

启动osgi-extender的方法是: 在config.ini里的osgi.bundles项里, 加入

org.springframework.bundle.osgi.extender@start

这个OSGi能识别并且确保会执行Activator.start()方法.
目前, 俺仅找到这么一个方式被证明是正确的, 之前也尝试过写另一个Bundle来激活它, 可那个bundle本身都没被激活...
小发现: osgi.extender被start过一次后(通过console), 之后每次都会自动启动.
小小发现: org.eclipse.update.configurator不依赖于org.eclipse.update.core, 并且, 是它负责启动plugins/目录下的所有插件, 这就是为啥它的启动顺序排第三:

org.eclipse.update.configurator@3:start


2008-05-16

Eclipse Monkey -- Eclipse 的脚本

Eclipse Monkey 是Dash下的兴趣项目, 由Aptana贡献,提供给Eclipse插件开发者使用。

它是用javascript书写的, 用来支持在Eclipse运行时期执行一些操作, 就像可以通过Firebug提供的JS输入接口可以窥探页面DOM信息,  Eclipse Monkey可以访问整个运行时的上下文,  比如获得当前选中的Editor并插入一段数字,  激活/停止某个bundle/plugin.

1.安装与运行
通过update site , 安装后重启. 在菜单栏会出现"script"项, 选sample, 会自动在生成出一些sample脚本. 然后再看菜单栏的"script"项, 就会看到sample脚本已经可以执行了.如果想写自己的脚本, 就复制任意一个sample, 然后选"script"项下的"paste new script"
2.语法与规则
注意文件最上几行的注释是元数据, 譬如Menu, Listener, DOM等, 不能省略.一般情况下main方法是执行入口, 如果是listener, 则依赖所触发的事件去调用相应的方法.
DOM里有已经定义好的对象, 比如editors, views等. 如获得当前激活的Editor的代码就是:
var ae = editors.activEditor;
这个不好用, 限制太多. 通过Packages就非常灵活了.Packages后面跟类的全限定名, 就能访问到这个类, 俺的喜好, 从Packages.org.eclipse.core.runtime.Platform基本上什么都能访问到.
Listener可以监听并执行脚本, 比如键盘监听, Editor/View被选中的监听.
3.延伸阅读
Aptana在EclipseCon的PPT以及Demo代码

2008-04-03

通过电脑收发短信

基本结构是, 用电脑控制手机收发短信.

手机收发短信, 就象电脑上网需要一个猫一样, 也有一个"GSM-modem". 插入SIM卡后, 就相当于给猫输入了用户名, 密码, 然后就可以打电话/发短信了.

电脑与手机的数据传输, GSM在这方面有个规范, 叫做"AT", 所有与"GSM-modem"的交互都是在这个协议上进行的. 在编程层次上, 这属于串口编程

大概流程是这样的

Nokia的手机除了早期出品的外, 基本上都可以通过pc suite实现这个功能, 它封装了这些交互细节. 我用的nokia 1116, 不被pc suite支持, 接口规范用的是FBUS, 在nokia官方网站上找不到相应的驱动程序, 不过有第三方的, 叫做"mobiMB".有破解版.

市面上, 有种东西叫做"短信猫" , 基本上就是这个意思. 不用自己去diy了 :)

2008-01-07

TPTP agent-controller 配置

 配置AgentController以profilejava程序.(用eclipse callisto版本的tptp)
先设置AGENT_HOME=D:\dev\eclipseCallisto\plugins\org.eclipse.hyades.execution.win32.x86_4.2.2.v200701141614
然后在jboss启动里加上下面的参数:
-XrunpiAgent:server=standalone,filters=tptp.profile.filters.txt,file=profilejboss.trcxml
启动程序, 然后打开eclipse, 通过远程方式连1002端口就可以了.

其中tptp.profile.filters.txt是用来过滤profile的对象的, 内容/格式如下:
com.eha.*   *    include
*           *    exclude
包名   函数名  过滤掉/包含

其中profilejboss.trcxml是在"standalone"模式下, 收集的数据, 这个可以被eclipse tptp打开.

最后说一下agent:server的4种模式:standalone, enabled, controlled, application
stantalone, 不需要通过eclipse做什么事, 完全独立运行, 最后会得出一个*.trcxml文件, 保存了profile的数据.
enabled, 默认的, 只有客户端请求时才采集数据, 否则什么也不做.
controlled, 加载agent的时候会暂停正常的java程序, 直到有客户端连上agent:server为止才恢复java程序运行.
application, 跟enabled没啥区别.
除了standalone模式外, 其它的都只根据请求产生xml片断(fragment).

2007-12-18

ejb环境下的org.hibernate.TransientObjectException

网站上用户注册的同时还要给用户加分.

以前ear部署时CallByValue设置的是false(ear-deployer.xml), 后来改成了true, 然后就不能加分了, 注册还是可以的, 就是一直报org.hibernate.TransientObjectException的异常.

代码大概是这样的:
Consumer c = new Consumer();
c.setUsername("uname001");
c.setPassword("pwordddd");
service.save(c);//1
service.addPoints(c, 300);//2

service是对EJB的引用(Stateless)
故事就是由EJB引起的.如果CallByValue=false, 在执行"1"后执行
System.out.println(c.getId());//841
返回值不是空, 如果CallByValue=true, 返回值就是空.

分析一下 : CallByValue时, Hibernate不能同步c的id.

POJO有3种状态, Transient, Persistent, Detached, Transient是用"new" 实例化的, 执行hibernate的save操作, 会存储到数据库的同时更新这个对象, 变成Persistent.而在CallByValue=true 的情况下, hibernate无法更新到这个对象, 也就是说, 在上面1步骤执行的时候, hibernate没有办法更新c这个变量.

废话多了, 好像也没大说明白....