Friday, February 27, 2009

Java编码转换核心

String encoding = "gb2312";
byte b[] = "你".getBytes("gb2312");

ByteToCharConverter convertor =
ByteToCharConverter.getConverter(encoding);
//将byte转到制定编码
char[] c = convertor.convertAll(b);

for (int i = 0; i < c.length; i++) {
System.out.println(c[i]+"--");
}

Saturday, February 14, 2009

Jennifer Love Hewitt

Jennifer Love Hewitt的两首好歌:
Take my heart back
Love will show you everything

Tuesday, January 06, 2009

Saturday, December 20, 2008

用jQuery.extend遇到的问题, 与大家共勉

官方接口: jQuery.extend( [deep], target, object1, [objectN] )

如果target未指定, 则jQuery名字空间接受extend后的属性, 但是, 如果object中包含dom属性, deep又设置为true的话, 则会出现recursively error, 因为dom树存在循环引用!
  • 看代码就很容易明白了,
  • extend函数的核心:
    if ( deep && copy && typeof copy === "object" && !copy.nodeType )
    target[ name ] = jQuery.extend( deep, src || ( copy.length != null ? [ ] : { } ), copy );
  • 可以看到这里copy.nodeType处理了dom node, 就是为了避免这种递归, 但是当我们自己有个对象, 此对象是互相引用的结构时, 这个情况就再所难免了, 所以一定要注意
  • 另外: $.ajax({param: ...}), 中的param, ajax函数内部就是一个jQuery.extend, 所以这里也要注意一下


Tuesday, November 18, 2008

今天整理文档, blog一下, 备忘: getNamedItem

getNamedItem以前做xml解析经常用到的函数, 在document dom中也是可用的,
用于获取某个标签的私有属性(非rfc标准的),
这个属性, IE会自动给解析出来, 例如dom.customize_field_name, 就直接可以访问,
Firefox却不会自动给解析,
只能用dom.attributes.getNamedItem('customize_field_name').value访问,

最后通用一点就是都用dom.attributes.getNamedItem('customize_field_name').value, IE下也是支持的

Friday, November 07, 2008

CI Email notification

在cruisecontrol标签之后, project标签之前, 添加plugin, 方便多个project共享htmlemail的通用设置, 例:
<plugin name="htmlemail"
mailhost="mail.mailserver.com"
username="notification@mailserver.com"
password="password"
reportsuccess="always"
returnaddress="notification@mailserver.com"
skipusers="false"
subjectprefix="CI"
defaultsuffix=""
buildresultsurl="http://serveraddress:7777/buildresults/${project.name}"
/>
在project的publishers节点下, 添加htmlemail通知任务:
<onfailure>
<htmlemail>
//只要构建失败, 就发邮件给emp1
<always address="emp1@mailserver.com"/>
// emp2, emp3可以映射到emp2@mailserver.com, emp3@mailserver.com
//此处设置的意思是, 如果本次构建失败了, 则通知提交代码的人 ,
提交代码的人的SCM帐户名称从recently modifications中可以拿到,
然后map就是完成从SCM帐户到email帐户的映射, alias ='emp2'中的emp2就表示SCM的帐户名称.
<map alias="emp2" address="emp2@mailserver.com"/>
<map alias="emp3" address="emp3@mailserver.com"/>
</htmlemail>
</onfailure>

John Resig

John Resig, the creator and lead developer of the jQuery JavaScript library.
His blog address: http://ejohn.org/, we can learn more about
javascript from his articles.

"Object()" or "new Object()" in javascript

We can implement an Object, which can be instance by "Object()" or
"new Object()", here's an example:

function User(name, age){
//if ( !(this instanceof User) )这个也是可以工作的, 但是arguments.callee更通用

if ( !(this instanceof arguments.callee) )
return new User(name, age);

this.name = name + " - " + age;
}

var user = User("xlty", 27); <==> var user = new User("xlty", 27);

flexible arguments

more generic usage of "apply":

Math.min accept a list of number:
> Math.min(1,43);

We want to pass an array to Math.min
> Math.min.apply( Math, array );

Friday, October 31, 2008

实现了一个简单的js test工具集

一时兴起, 实现了一个简单的js测试框架, 结构如下:
==========================================================================
//测试项
var TestEntry = function(id){
return {
//目前只实现了一个简单的方法, 其他的可以自由扩展
assertTrue: function(result){
var r = ET.get(id);
r.append(result? "Ok" : "Error");
r.addClass(result? "ok" : "error");
}
}
}
//测试执行器
var Test=function(){
var mc;
return {
init:function(dom){
ET.get(dom || document.body).append("<div
id='messageconsole'><b>Message console:</b></div>");
mc = ET.get("messageconsole");
},
addTest: function(msg){
var id = UUID.generate("v4");
mc.append("<br><b class='item'>test "+msg+" <b class='result'
id='"+id+"'></b></b>");
return TestEntry(id);
},
reset: function(){
mc.html("<br>");
},
report: function(){
//设置延时是为了, 等待异步执行的部分ajax测试完成
setTimeout(function(){
var total = ET.getByJQSelector("b.item").length;
var error = ET.getByJQSelector("b.error").length;
var ok = ET.getByJQSelector("b.ok").length;
mc.append("<br><br>"+
"<b class='item'>Totally "+total+" tests,</b>"+
"<b class='passed'> passed "+ok+" tests,</b>"+
"<b class='failed'> failed "+error+" tests,</b>"+
"<b class='unfinished'> unfinished "+(total-ok-error)+" tests</b>");
},
1000);
}
}
}();
==========================================================================
css代码:
.item {
color: blue;
}

.result, .unfinished, .failed {
color: red;
}
.passed {
color: #55FF55;
}
==========================================================================
用法:
Test.init();

//普通测试项
Test.addTest("log message here").assertTrue(1+2==3);

//异步操作的测试
var ajaxTest = Test.addTest("ajax request test");
Ajax.request({data:{id:1}, url:'../getName.htm', callback:function(data){
ajaxTest.assertTrue(data.name='apple');
}
});

Test.report();

解释说明:
Test.addTest在系统中添加一条测试记录,
返回一个TestEntry, 用返回的TestEntry的assert系列方法, 来断定此测试项的正确与否

Thursday, October 30, 2008

[转] 北京的慢性驱逐令

原文: http://home.donews.com/donews/article/1/130211.html
很有同感的一篇文章, 转来分享一下


离开北京已经有一年多了,但至今还是常有人不理解地问:"为什么你在北京有房有车有公司,却会在一夜之间决定彻底离开北京?"问的朋友多了,于是,我想倒不如把我是如何"被北京抛弃"的原因说说,也好省些口舌。

北京的慢性驱逐令

1996年的建军节乘火车到北京,直至20078月与人签订售房合同,我在北京整整生活了11个年头。其间,住过中央社会主义学院的办公楼,住过小南庄的居民楼,住过万寿寺的老院子,直至自己买楼置业。过去的11年历历在目。

说句实话,我还是比较喜欢北京人的,虽然对老北京不够上进和锐气有些失望,但多元的北京文化不像上海的市侩、小气,也不像南方人的生意、烦躁。恬淡、性情的文化使外来的人们感觉不到太强的排外感。倒是外来的人群对老北京有些"排内"。

然而,我终究是成不了北京人的。

1998年,我跳槽到一家新的报社工作,报社提出员工档案要统一放到(原)电子人才中心管理,我托老爹去浙江丽水市最早分配的工作单位调档。结果告知:因为原来与单位签订的5年劳动合同没有执行完,我就擅自离职,剩余年限需按每年1000元交钱后才能调档。

我当时就有砍人的冲动:当时在丽水工作半年,一个月400元工资,一共才发了我二千多元的工资,现在居然要收我4000元——半年白干不说,还要倒贴钱。如果是大城市,我也就认了,丽水这么个"浙江的西藏"也值得我打破脑袋往里钻?

单位领导还算"仁慈":你还没干满一年,按理,要照五年计算,我们就只算了你四年的钱。

后 来有一次,总编曾经提出可以帮我的户口"弄"到北京。当然,我因此会欠他老大的人情,我还不得不和报社签订长期的"卖身契"。考虑到用"自由换户口"不是 什么划算的"交易",我也就没应这茬——户口这种老掉牙的玩意迟早会死掉的,说不定十年后就没什么用了,社会总不会倒退吧?

2000年底,我去了《计算机世界》报社。突然有一天,当时一位领导不知抽了什么风,要求员工把档案在限期时间前必须把档案调到北京市人才,否则工资只能拿到正常工资的1/3

这一下,全报社的同事都忙活了起来,我当然也不例外。当时我的档案还在电子人才,当我去电子人才办调档手续的时候,被告知:户口不在北京的人员档案不能在北京不同档案管理中心之间直接调档,须先调回户口所在地,再调过来。

于是,我把档案调回到了老家县城的人才中心。再委托人将档案调至北京市人才。过了很长时间,每次打电话,北京市人才总说没有我的档案。只好打电话问县人才,告之:档案被北京市人才退回去了。

又打电话问北京市人才,工作人员说,你的档案在县人才,我们没法接收,你必须先高到当地地市一级以上的人才才可以调过来。

我又托老爸将档案调到了当地市人才。又过了很长时间,北京市人才又说档案被打回去了,原因是我当初没有转正就离职,档案里没有"干部"身份。我终于明白了:北京是"干部"呆的地方,不是"干部"就免进。

从此,我患上了档案过敏症——一提到档案,脑袋嗡嗡作响。

报社和我类似的情况很多,领导的"高招"最后不得不不了了之。

过去在北京没有户口是无法上车牌的。尽管一直想自己买辆车,但一想到上车牌还是找北京本地户口的人"挂靠",这又是件脑袋大的事。

2001年十月,北京市宣布拥有工作寄住证(工作居住证的前身)的人可以允许上车牌。我的"寄住"证是前一家单位办的,没有按规定交回,不过快到期了。我赶紧挑了辆车去上牌,工作人员疑惑地看着我:这个玩意儿能上车牌吗?

你没看新闻吗?我心里忐忑不安地回答,紧盯着工作人员打电话询问的每一个动作和表情。看到他的脸皮松驰着,我心安了一点——总算有自己的车牌了!

2002年小家伙出生后,麻烦又要开始了:有小孩的日子过得很快,以后的上学又成了一个麻烦事。交赞助费倒在其次,更担心以后考大学——北京的教学应试能力没法和浙江比,小孩要在北京上学,回浙江考大学就惨了。原来大学同班的北京同学分数要低200分左右,这种成绩在浙江是上不了大学的。分数线的差异可能要了小孩未来的命。

我第一次感到自己对中国的改革过乐观了:几千年的户籍制度改革比蜗牛都慢,而小孩却长得飞快。也许我们这一辈子是看不到真正的自由户籍制度的了。

离京:无奈的选择

选择离开北京不是件容易的事,毕竟人的一生不会有太多的11年。在北京,我从一个毛头小伙成了一个中年人。但最终,我决定离开北京——我想无论我多努力,我终究成不了北京人。

2007年春节回家后,我断然决定:准备离开北京,停止公司开展新业务,老项目执行完后就关闭公司,卖房子离开。

对南方人来说,北京是脏,北京是干,但其实这些都可以适应,而一次次政策性的歧视让人有不如奴隶的感觉——即使是奴隶,他的努力工作也多少会搏得主人的一些欢心;而那些对外地人的羁绊却像故宫的一重重门槛一样走不到头,而且坚不可摧。

所以,故宫我是不喜欢去的,除了有一次陪长辈,我从未进去游玩过——在我看来,这是一个阵旧的,封建的象征,体制的"故宫"我已经走厌了,再不愿去看那形式的故宫。

2007年回到杭州,买了一套房子,找了一份工作,今年上半年时把户口转到了杭州,小孩也顺利地进入了小学。打工的日子花钱没像以前那么随意了,但我还是认为自己的决定并没有错。

窗外秋雨迷离,我回过头去看看自己的脚印,一步一步从浙江走到北京,又走回到浙江。那一段激情燃烧的岁月,那一段北京的创业史都随风而去,只在记忆里隐约可见。

一段时间里,我一直在想:是我抛弃了北京,还是北京抛弃了我?我想也许在北京看来,我是一个寄住者,我去北京是和北京人抢地盘、抢资源的,所以,我遇到的事总会在有意无意地驱逐我。一些朋友从国外回来,最后又走了,我于是想:是祖国抛弃了他们,还是他们抛弃了祖国?

中 国太多的东西沉淀了几千年,以至于每个人对它熟视无睹。当人们习惯成自然的时候,不合理也变成了合理。就像有多少人知道蛋白精的存在却当成了一件合理的 事,这是一种可怕的沉沦,这种沉沦的更可怕之处在于沉沦者的不自知——用人血馒头治痨病的人还隐藏于每一个人的心灵深处,它因此影响着中国的政治、经济、 文化和所有的社会环境。

JQuery 树插件介绍: jQuery SimpleTree Drag&Drop plugin

发现一个很好的树插件: jQuery SimpleTree Drag&Drop, 感觉很好, 代码质量不错, 支持拖拽, 风格清晰, 这里推荐一下. Demo看这里.

Saturday, October 18, 2008

Taffy DB : A JavaScript database for your browser

Taffy DB : A JavaScript database for your browser

Taffy DB is a free and opensource JavaScript library that acts as thin data layer inside Web 2.0 and Ajax applications.

What makes it cool:
  • Under 10K!
  • Simple, JavaScript Centric Syntax
  • Fast
  • Easy to include in any web application
  • Compatible with major Ajax libraries: YUI, JQuery, Dojo, Prototype, EXT, etc
  • CRUD Interface (Create, Read, Update, Delete)
  • Sorting
  • Looping
  • Advanced Queries

Think of it as a SQL database in your web browser.

Link To Taffy DB

Wednesday, October 15, 2008

最近动向

  1. 正在比较深入的研究前台开发, 写一些小的框架.
  2. 研究SEO, Google Adsense, 正处于实验阶段, 本站就是实验室, 争取把"小楼听雨"给优化到google, baidu搜索结果的第一页, 这个任务可以比较重, 呵呵.
  3. 整理, 搭建公司的基础架构, 这一块任务比较重, 需要考虑的比较详细.
  4. 另外的一个django站点, 纯凭自己的爱好做着玩的也会在最近上线, 正好用来研究前台开发, 呵呵.
  5. 以后有了什么经验, 会及时拿来分享.

Tuesday, October 14, 2008

A ibatis code generator - iBATOR

iBATOR is a code generator for iBATIS. iBATOR will introspect a database table (or many tables) and will generate iBATIS artifacts that can be used to access the table(s). This abates some of the initial nuisance of setting up objects and configuration files to interact with database tables. iBATOR seeks to make a major impact on the large percentage of database operations that are simple CRUD (Create, Retrieve, Update, Delete). You will still need to hand code SQL and objects for custom queries, or stored procedures.

iBATOR will generate:

  • SqlMap XML Files
  • Java Classes to match the primary key and fields of the table(s)
  • DAO Classes that use the above objects (optional)
Example Class Usage Notes:
  • Example Class has ored Criteria list and every Criteria has many anded filed list
I want to implement a ibatis code generator some day, But I find it "unfortunately".

Saturday, October 11, 2008

Get Computed Style Attribute

when a dom style has been setted more than one times in css file, the final style should be computed, such as:
css file:

#abc{
color: red;
}

div #abc{
color: red;
}

html file:
...

<div><span id='abc'>text in span...</span></div>
...

js code:

var spanEl = document.getElementById('abc');
var ret = document.defaultView.getComputedStyle( spanEl, null );
var color = ret.getPropertyValue("color");

so we can get the right style which appled to dom.

js简单继承的实现 - 网上做法修正篇

网上有些继承prototype实现上有bug例如:

function base() {
this.member = ["dnnsun_Member",2,3,4];
}
var child=function(){
};

child.prototype=new base;
var c1 = new child();
var c2 = new child();
c1.member[1]=333;
alert(c2.member[1]);

结果是: 333

base中如果有集合, 对象属性, 这种简单继承导致的后果是所有的child的实例都共享了base的同一个member属性. 所以要尽量避免此种情况, 尽量在父类中只是定义方法, 变量改为传入的方式. 估计这也是为什么jquery, ext等框架不强制继承的子类必须subclass_instance instanceof superclass==true的原因.