Archive for January, 2010


什么叫做政府的办事效率

以前曾经提到过,作为一个疑似恐怖分子,我在墨尔本,悉尼机场均被海关人员拦下来过然后送往小房间审问。至于原因是什么,第一次觉得是巧合,第二次觉得是自己没梳洗太邋遢,直到第三次才让我有点愤怒了。于是,回国的时候,我就说,我要投诉。当时心理的想法是,如果能够在一个星期之内有个答复,我对澳大利亚这个国家就还没有那么失望。

回来后一直很忙,把这件事忘记在了脑后。前天澳洲国庆日的时候,突然想起了,于是说那我就国庆日来投诉一番吧。1月26日下午4点钟,把第一封信寄到了Custom的投诉处。(补充一下,每个部门都有支持很好的网上投诉入口,不要钱,不麻烦,填个表格谁都会)。很快,1月27日早上11点,也就是上班后两个小时,我的回信收到,说给我盖章的是海关的,但是到小房间审问的是DIAC的,于是要我把信转递给DIAC.

Dear Yudong,

Thank you for your email.  The small room that you refer to may be the room used by Officers of the Department of Immigration and and Citizenship (DIAC).

Can you please confirm that the issue you refer to is action of Customs Officers or Immigration Officers?

Customs Officers check and stamp your passport upon departure from Australia and may refer you to the immigration office at the airport if this is necessary.

Customs and DIAC are two different departments. Any issues that you may have in regards to your visa or passport will need to be taken up with DIAC.
You can contact the DIAC Global Feedback Unit by completing an online feedback form at www.immi.gov.au, or you may wish to take a look at their site www.citizenship.gov.au.
Alternatively you may prefer to call them on 133 177 to discuss this matter.
Questioning passengers is part of the risk assessment process used by Customs officers at all international airports. We cannot give anyone a guarantee that they
will or will not be questioned on either their departure or arrival.

If for some reason you discover that Customs was actually involved in this matter, please let us know the specific details of Customs involvement and we will investigate it.

Yours Sincerely,

National Coordinator | Complaints and Compliments Management Unit | NPAC
Australian Customs and Border Protection Service
P: 1800 228 227 | F: 03 9244 8160
E: comments@customs.gov.au
W: www.customs.gov.au

于是在1月27日下午下班以后,我将第二封信寄到DIAC的投诉初。今天早上11点,收到了确认信,说将会在五天内解决。然后下午34点的时候,我的回复已经受到:

Dear Mr Yudong LI,

Subject:  Sydney and Melbourne International Airport Referrals – Mr Yudong LI

Thank you for contacting us regarding your referrals at Sydney and Melbourne International Airports.

You have been referred to Departmental officers at both Sydney and Melbourne International Airports to verify your identity.  On all occasions, you have been assessed as a ‘non match’ to any persons of concern on our Departmental Movement Alert List (MAL), and this has resulted in you being allocated a Green MAL status.

A Green MAL status enables a client to travel without being referred as a result of the MAL system, unless new information comes to DIAC’s attention that requires a client to be reassessed.

Unfortunately, as new information has been loaded onto our MAL, containing client data that is similar to yours (on multiple occasions over the past two years), your MAL status has reverted to Amber.  This means that DIAC has then been required to assess your identity to ensure that you are not a match to any of these new persons of concern listed on the MAL.  As mentioned above, on all occasions you have been reassessed as a ‘non match’.

I can confirm that you currently have a Green MAL status, which means it is unlikely that you will be referred on your next departure, unless new information has come to DIAC’s attention before your departure date, requiring your identity to be reassessed.  This business is consistent with the dynamic nature of the Movement Alert List.

I apologise for any inconvenience that these referrals have caused.

Thank you for bringing this matter to our attention.

Yours sincerely,

Gary Sheppard

Director

Border Operations Centre

Border Security Division

Telephone: 02 6264 3091

没想到所有的事情这么快就有了结果,很详细的解释,很清除的说明。只能说让我非常满意。

是谁以前说澳洲办事效率低的?我现在是不会在这么觉得了。制度化的东西的确是好。

PS:这次回国,在武汉第二公证处,感觉他们的服务态度还是非常不错的,特别是公证员。不过那几个收钱的却好像总是欠人钱样的。我的建议是,国内的各种公共机关,应该有更好的服务,首先就可以解决的是电子服务,把自己的办事流程,详细的写在网上应该不是麻烦事。最好,能够加上电子办理,那自然是最好了。还有潜力可挖阿!

GWT学习研究

1. GWT与Restlet的结合

目前进行的项目中,使用App Engine作为底层以及数据库的平台,Restlet是作为HTTP调用的库,然后GWT来前台界面的实现。基本上整个架构是严格按照Google的思路来进行的。最近把重心从底层慢慢走到了前台,于是对GWT有了些研究。把一些经验和总结列举出来。

首先,可以看到Restlet在最新的2.0m6和Snapshot之中,有五种版本,每一种版本的JAR的结构和路径都不一样。我们的项目在后台是使用的J2EE的版本,而在前台需要使用的是for GWT版本,于是这里就产生了第一个问题,在同一个项目中均需要使用这两个版本的冲突。在两个JAR包下都有org.restlet.jar存在。于是一个很简单的方法,就是改变其中一个JAR包的名字,来避免冲突。这里一定要注意的是,之后在引用JAR包时,一定要看清楚你的类是属于前台还是后台的,如果是前台的,一般包名是以com.google.gwt.core.client开头的。

2. – GWT的项目结构

在一个创建好的GWT项目中,一般会有以下三个重要的部分,第一个是项目名.gwt.xml,这个文件是整个项目的核心文件,里面包括了模块的引用,入口点的定义以及其他的一些配置方面的设置。接下来两部分分别存在两个包中,client包和server包。其中,client包就是为了做前台界面而存在的包,而server包可以认为是后台的,当然你可以使用你已经做好的而不是强制性非要放在里面。client包下的项目名同名java文件,即是在配置文件中定义的入口点,这个文件定义了界面UI的结构,以及各种事件的触发,就等于是一个以java而写的界面。GWT在编译过程中,是将其转化为javascript而给浏览器运行的。

现在有这样一个问题存在,如何实现页面的跳转。我们知道对于AJAX实现的Web应用,习惯于只用单页面来实现不同的内容,也就是利用同样的定位符如div等,来不断改变其中的内容。那么在GWT中,有没有比较好的办法做到这一点呢。我采用的方法,是使用一个单例模式下的固定div来实现。我们可以将不同的页面均视作为Content的不同实现,然后只需要替换页面下的Content即可。具体办法为:

1)创建一个Content的抽象类继承Composite类,这个类将作为所有通用的内容类,在主页面中替换使用。

public abstract class Content extends Composite {

}

2)在项目名java文件中,利用单例模式定一个该入口点的实例,同时创建一个Content实例,这个实例用来承载不同的实现内容类。同时加上一个setContent(Content content)方法,用来设定当前的Content。

public class XXX implements EntryPoint {

private static final XXX INSTANCE = new XXX();

private Content content;

private XXX(){}

public static XXX getInstance(){

return INSTANCE;

}

@Override

public void onModuleLoad() {

XXX.getInstance().setContent(new LoginContent());

}

public void setContent(Content content){

this.content = content;

RootPanel.get(”content”).clear();

RootPanel.get(”content”).add(content);

}

}

3)对于每一个不同的实现页面,分别创建一个类继承Content类,在这个类的构造函数中定义其界面和事件的触发函数。

public class LoginContent extends Content {

private Label usrLabel = new Label(”Username”);

……

public LoginContent(){

usrPanel.add(usrLabel);

usrPanel.add(usrTextBox);

……

initWidget(verPanel);

}

4)在今后的每次需要更换页面的时候,只需要获得该项目下的Content实例,进行替换即可。

3. – GWT下的UiBinder的实现

用上面的方法来实现界面存在的一个问题是,经常需要在类文件中写大量的界面元素的定义,如同Swing一样。一来对于Java程序员不太方便,二来对于界面程序员更为苦恼。于是在最新的GWT的版本中,Google推出了UiBinder,这是一个采用xml来作为界面管理器的实现方法,将界面的元素与功能实现了脱离,一方面简化了代码,另一方面也给前台和后台的程序员提供了便利。

在uiBinder下,我们如果需要创建一个新的界面,不再直接使用类来实现,而是创建一个UiBinder对象,在Eclipse下,new一个UiBinder会生成两个文件,一个是扩展了Composite的类,另一个是同名的.ui.xml文件。在.ui.xml中,xmlns:g=”urn:import:com.google.gwt.user.client.ui”的空间下定义的是所有的Widget,于是可以就像使用Java一样,列出这些需要的Widget了。在<ui:style>中,还可以定义所需要使用的样式,当然也可以单独在CSS中定义。以下是一个简单的例子:

<!DOCTYPE ui:UiBinder SYSTEM “http://dl.google.com/gwt/DTD/xhtml.ent”>

<ui:UiBinder xmlns:ui=”urn:ui:com.google.gwt.uibinder”

xmlns:g=”urn:import:com.google.gwt.user.client.ui”

xmlns:c=”urn:import:com.featheast.client”>

<ui:style>

.important {

font-weight: bold;

}

.bolder {

font-weight: bold;

}

</ui:style>

<g:HTMLPanel>

Hello,

<g:Button styleName=”{style.important}” ui:field=”button” />

<g:Label styleName=”{style.bolder}” text=”This is my label in bold!”></g:Label>

<g:VerticalPanel ui:field=”myPanelContent” spacing=”5″></g:VerticalPanel>

</g:HTMLPanel>

</ui:UiBinder>

对于每一个在.ui.xml中的元素,我们都有一个在类文件中的对应,比如这里,我们有一个Button,一个Label,这些可以操作的值在类中分别有

@UiField

Button button;

@UiField

Label label;

的对应。这样的结果就是我们能更好的操作这些元素。在该类的构造函数中,可以定义这些元素的事件函数和其他的操作。这样将界面和执行分隔开,效果的确比较好,思路也更加清晰。以下是一个对应的示例:

public class MyUIBinder extends Composite {

private static MyUIBinderUiBinder uiBinder = GWT.create(MyUIBinderUiBinder.class);

interface MyUIBinderUiBinder extends UiBinder<Widget, MyUIBinder> {}

@UiField

Button button;

@UiField

VerticalPanel myPanelContent;

public MyUIBinder(String firstName) {

initWidget(uiBinder.createAndBindUi(this));

button.setText(firstName);

HTML html1 = new HTML();

html1.setHTML(”<a href=’http://www.google.com’>Click me!</a>”);

myPanelContent.add(html1);

HTML html2 = new HTML();

html2.setHTML(”This is my sample <b>content</b>!”);

myPanelContent.add(html2);

}

@UiHandler(”button”)

void onClick(ClickEvent e) {

RootPanel.get().add(new FavouriteColorWidget());

}

}

运用同样的单例模式,我们可以更改同一个界面的内容,在此就不重复了。

Happy Australia Day


Backstreet Boys Melbourne Concert - Mar 5th

Backstreet Boys are back.

Mar 5th Rod Laver Arena

盘点2009

虽然盘点这个词很俗气,而且好像大部分人的总结早在12月就已经结束,而我则是因为休假和刚来的前两周忙碌的工作,直到这个周末才能静下心来好好回顾回顾。2009年对于我来说,可能是个十分转折的一年,十分重要的一年,在很多人眼里,我的2009是充满着眷顾的一年,的确幸运一直都在照顾着我,让我挺过了艰难的一年。而各种星象都表明未来的2010对我则是荆棘的一年,为了能够更加好的弥补这些天意,个人的努力就更加重要。

盘点2009年:

1. 顺利完成留学的学位
在很多人看来,其实这并不应该放在第一位,但是毕竟这是全家花费了将近60万人民币换来的一张文凭。不管其价值如何,至少是对我这两年的认可,我也可以说是一个硕士了。 然则,两年的澳洲留学,更多的是对自己视野的宽广,分析的加深,很对世界了解的更深。在这里没有GFW限制我的网络,让我尽可能的了解了更多我喜欢了解的,我想要了解的东西。而墨大和RMIT的图书馆,则是另一个可以遍寻资源的宝地,无论是什么样的书籍,只要有人推荐,就可以在这两所图书馆里找到资源,英文原版,一来不需要忍受恶劣翻译的折磨,二来也是严重锻炼了自己的英语能力。同时在澳洲的学习,也让自己对各种不同的文化,各种不同的背景有了更为深刻的了解,充分的明白了Chinese并不是局限于中国这个范畴之内,结交了来自世界各地的朋友,这都是今后的一笔宝贵的财富。尽管直到现在我还没有拿到毕业证书,我也没有意愿去参加毕业典礼,但我想,这两年的影响对我今后的发展将是至关重要的。

2. 雅思考过4个7
来澳洲的时候,必须考过4个7的事情已经是众然揭晓,但是当时始终抱着还有两年的学习时间,无所谓的态度,觉得两年的国外学习英语肯定自然可以到4个7,不过事实并非如此 。09年的1月17日,第一次在武汉参加了G类的考试,尽管阅读和听力都拿到了8.5,口语也上了7,但是作文的6.5给了我很重的一击。让我明白到继续靠这样混是远远不够的。我知道考试前的一个月的时间,尽管我一直在做各种试卷,但是逃避作文和口语的思维最终让我失败告终。和很多人不一样,我没有选择多次尝试,而是把自己的考试时间一次性卡在了9月5日。选择这个时间也是有了多番考虑的,一来7月前的位置都满了,寒假我想用来好好复习,而9月9日开始又有一段旅行,于是选择在旅行前的日期考试,成了一个十分好的选择。当然上天的眷顾,让我的作文过了7,也顺利地通过了4个7。就这样跨过了移民的门槛。

3. 第一份正式的工作
严格意义上,又是一次上帝的眷顾。正如同学所说,冥冥之间,似乎我什么都没做,事情就全部办妥了。旅行回来之后,看到了4个7的雅思,老板又签了我毕业后继续工作,而各种作业考试又顺利过关。1月过来以后,我又换到了正式的办公室,目前享受的待遇,和周围的博士后,研究学者一样,有明亮的办公室,大的办公桌,远远比去年在上个月的六楼工作要好。在工作方面,老板也不是一个十分PUSH的人,于是自己也算是得心应手,特别是在12月多次跑RMIT的时候,也没有被察觉,这也算是另一个幸运之处吧。还没毕业就开始了工作,到现在快3个月了,应该说是十分愉快的工作。

4. 第一次多国旅行
这也算是一个十分值得纪念的事情,其实在3年前,就有过去越南和柬埔寨的计划,只是当时由于时间紧迫和钱的问题,把行程改到了印度尼西亚巴厘岛。而今年的9月,两个人,两个包 ,四条腿,走过来香港,马来西亚,柬埔寨,越南和澳门。19天的独立异域旅行是第一次,也是十分有意义的一次。途中有遍尝海鲜的爽快,有阳光海滩的愉悦,有吴哥寺庙的神秘,也有着遗失行李的慌乱,疑似被宰的痛苦,和身体上的各种不适。但是最终把19天走下来,更确定了对旅行意义的理解,我也许不会再去这几个地方,但是更多的地方还在等着我。坚持探索各种文化就是终极的目标。

5. 个人博客的稳步提高
严格意义上将,这个博客是从2008年12月开始的,但是刚开始的日子,几乎没有人来访问。我没有和以前一样,各处推广宣传我的博客,除了QQ签名和各种网站的签名,我没有主动宣传过自己的博客。目前博客的访问量已经有了稳步的提升,虽然也许和AW他们这些牛人相比差距还是很明显的,但是至少我有了比较稳定的读者群,也有了很稳定的百度GOOGLE的搜索访问量。内容中包括HASKELL, GOOGLE APP ENGINE等内容还是颇受欢迎的。可惜的是自己的英文博客由于懒惰,更新比较少,访问则是更少。不过总的来说,能够坚持吧一个博客写下去,已经超出了我之前的估计。原本只准备玩一年的,但是现在已经续费下去。

6. 苹果家族
开始买iPhone的时候也是心中一头热,于是买了一款PRE-PAID的,不过现在还是觉得这是一次十分值得的付出。毕竟使用iPhone的理念,和以前的普通手机又了很大的普通,除了电话功能之外,iPhone的其他辅助功能才是我最为重要的。在任何使用可以使用3g上网浏览网页,查看天气,银行转账,GOOGLE等等,当然更可以使用QQ或者EBUDDY来登录MSN和GTALK。更为重要的是邮件功能,以前的邮箱几乎每天没有多少邮件,目前已经可以达到一天至少10封以上的重要的邮件,而iPhone有效的帮助我完成了这些。同时,使用Stanze看各种电子书籍,使用Echofon查看最近的Twitter,还有更多的游戏也是我每天的生活一部分。除了iPhone之外,目前购买的包括一台MacBook,一部iTouch,一个Shuffle,还有老师赠送的一个Nano,算是Apple家族的大集合了。

数据:

在武汉一共呆了79天,去了香港5次,上海3次,深圳2次,新加坡2次,广州1次,珠海1次,澳门1次,悉尼1次,布里斯班1次,其余时间均在墨尔本。

两年多的跨国生活终告结束

签证终于顺利批下,也正式宣告再也不需要通过国际长途,QQ,SKYPE这些东西了。

两个人的行程分别是:

2010年2月5日 QF29 Melbourne - Hong Kong 23.55 - 05.50

2010年2月6日 CZ3076 Hong Kong - Wuhan 11.35 - 13.20

2010年2月19日 CZ3075 Wuhan - Hong Kong 9.00 - 10.35

CX735 Hong Kong - Singapore 13.20 - 18.10

qf010 Singapore - Melbourne 20.15 - 06.30

2010年2月19日 CZ6245 Wuhan - Shanghai 09.50 - 11.20

SQ831 Shanghai - Singapore 13.50 - 19.20

SQ227 Singapore - Melbourne 21.00 - 07.25

看到指责与批评时

无需内疚,也无需难过。自检,有则改之,无则勉之。

新浪的评论

不知道大家有没有这个习惯,看新浪的新闻的时候,更关注的是评论怎么写的,有的评论内容比文章的内容要精彩的多,而且还有着很多的背后消息透露出来,同时也可以看出人心所向。

但是,最近在看所有的涉及到天朝的文章的时候,会突然发现中国人都好爱国啊,最开始我还觉得是国内民众如此心团结,但是三番五次三番五次的这样,总觉得不太敢相信。这次GOOGLE事件,随便看个新闻评论,通通是支持百度而骂GOOGLE的,竟然在这种典型的恶心枪手文章下还会如此,真的让我无语了。文章我就只扫了一句话,就觉得没有再看下去的必要了,说中国的GOOGLE访问量,99%贡献给的是google.com,只有1%给的是google.cn。这不纯粹是扯淡吗?要知道在中国,如果你强制访问google.com,是不可能打开的,只会跳转到google.cn,简直把所有不懂计算机的人当玩笑来看。

于是我突然发现,估计现在每个大型的门户网站,不仅仅在内容上要极度控制,在评论上,也会专门聘请员工来解决非法评论问题,于是我们可以看到所有的评论都是如此之和谐而统一。LUCKILY, I AM IN AUSTRALIA.

几个GAE/J中的Transaction的概念

Transaction是在计算机很多领域里都需要的,最基础的知识相信大家都懂,那就是一个或一组操作,要么都成功,一旦有任何一个失败则所有的都失败,要回滚到原始位置。这个概念在GAE/J中一样。在datastore中,所有的写操作都被认为是atomic的,任何尝试着创建,更新或者删除实体的操作要么成功,要么就失败。一个操作有可能因为很多原因而失败,比如当许多用户同时尝试去修改这个值,或者该操作超过了其允许的配额值,当然也有可能是datastore的内部错误造成。在任何情况下的出错,都会使得所有操作就像没有发生一样而回滚。

实体组在GAE/J中是一个十分重要的概念。最开始的时候,我也是什么都想着往关系数据库上套,结果发现一来出现很多外键上的问题,二来出现很多包含关系的问题。个人认为,对于datastore而言,实体组是必须十分熟悉的内容。实体组之间的关系是以父子来称呼的,比如一个实体是国家,另一个实体是省份,那么显然一个国家会有很多省份而一个省份属于一个国家,于是我们可以将国家视作一个父实体,则通过每一个子实体都可以得到父实体也就是这个国家。当实体之间有了父子关系的时候,我们可以将他们视为在一个实体组中。对于一个没有父实体的实体而言,它就是一个根实体。一个实体的父实体是在该实体创建时就设定好了而不可以更改的。 处在同一个根实体下的所有实体都可以看作属于同一个实体组,被存在同一个datastore节点上。

那么实体组和Transaction的关系在哪呢?一个单一的Transaction只能对一个实体组进行操作,或者将另一个实体加入到该实体组中去。无论是查询,更新还是删除实体,如果一旦涉及到多个实体组,就会报错。同样的道理,在一个单一的Transaction中,不能涉及到多个实体有多个根节点的,因为一个根节点就等于代表了一个实体组。

如果在任何的tx.begin()和tx.commit()之间,有多个进程同时调用同样的实体组,那么JDO就会抛出JDODataStoreException或者JDOException异常,这是由java.util.ConcurrentModificationException造成的。解决的办法可以通过建立一个循环,多次进行重试来保证每个进程都能够成功。如果在一个进程之间,更新多个实体组,则会报JDOFatalUserException的异常。

Datastore的隔离级别在Transaction之外是最接近于READ_COMMITTED,在Transaction之内是SERIALIZABLE,特别指出是一种Snapshot Isolation。

我们在更新一个实体的部分值时需要使用Transaction,原因是我们在修改的同时可能也会有其他的进程在修改。另外一个需要使用的地方实在更新或者创建Key的时候,道理与上者类似,以避免多进程的同时操作。最后一个需要使用的地方是多个读操作发生的时候,为了保持数据的一致性而使用Transaction。

一个Transaction应该很快的进行,来减少发生冲突的机会从而减少重试的次数。尽可能的在Transaction之外把数据准备好,然后在Transaction内部进行执行需要保持数据一致性的操作。应该在Transaction之内来准备Key,和使用Key来获得实体。将datanucleus.appengine.autoCreateDatastoreTxns设置为false,则所有的Transaction都被禁用了。该文件的位置位于war/WEB-INF/classes/META-INF。

如果你的代码是以前根据关系数据库编写的,里面的Transaction极有可能是基于全局的,于是在GAE/J下必然会报错。一个好的解决办法是,首先禁用掉GAE/J中的所有的Transaction,然后一步步的操作来解决这个Transaction的问题。

PR Fighting 3 - Medical Exam

After a damn hot day and night, Melbourne cools down today with a feeling of autumn has come. As mentioned in PR Fighting 1, my booking of medical exam is due today. 501 Swanston street, people there is more than I expected, but a nice work flow makes the speed much faster and smoother than what I have seen in Wuhan just ten days ago. Every doctor or nurse knows well of its responsibility and the rules there, they follow the same procedure and the connection between each sections is perfect bridged by nurses.

Less than one hour, all exams are finished. The doctor who checked my body is a quite nice guy. He is also Chinese but probably from an south eastern Asia background. Talked to me a lot about his study history in Melbourne University, and the changes there. And kindly reminds me my problem of blood pressure, which will not affect any immigration however health.

Waiting for the whole results in one week, and get back to my work again for the next three and a half week.

Older Entries
  • English Version

    • Cannot read Chinese? Please take a look at my English site, hope you can find more you need there!
  • 感谢支持

  • twitter

    facebook

    linkedin

  • Categories