my.donews.com叟不鸟呢~~
转战blog,又换地方了
http://blog.easyapp.net
现在feedsky的feed已经转过去了。
强烈建议大家看一下以下四篇文章
- Java 和 .Net 在异常处理机制上的区别 by tangrui
- 也议Java与C#的异常处理实现 by zhangdi
- 答 zhangdi 同学的问题 by tangrui
- 我对异常处理的理解 by zhangdi
出场演员简单介绍:
tangrui,我的师弟,曾经在一家公司供职。
zhangdi,我的同事,曾经我们三个人在一家公司供职。
tangrui和zhangdi,他们都是,嗯,从我来看都是完美主义者。对代码和程序的要求都是完美的。我之所以说是代码和程序,是因为如果从架构的层面,大家都应该追求完美。而对于代码和程序,某些人就是属于得过且过的类型了(比如我)。我是典型的实用主义者,一个代码,能用,ok,那么就是好东西。我才不管他写的如何呢。当然了,我的能用是指能够满足我(当前)的需求。tangrui对我的这个习惯,表示些许的嗤之以鼻
关于Java/C#(/C++)的Exception问题,我和tangrui也曾经探讨过,我和曾经的一个主管也探讨过。我的看法,基本上是和zhangdi一致的。要发生错误的地方,可预料的,那么就Checked住,如果是不可预料的,自然就是不知道如何处理的,那么就RuntimeException,任其自生自灭吧。并且,Exception就是Exception,不是其他。catch住了,为了容错打报告,而不是另辟蹊径的流程。
具体的可以参考以下spring社区的观点,具体的url,忘记了,一会找一下。
我个人觉得他提出的观点非常好,如果你知道这个exception要怎么应付他,那就cache,你要是不知道,那就Runtime。
PS:看到zhangdi的wordpress很漂亮,我也有打算自己搞一个了。看来今年换成自己架设blog,还是有希望的,hoho。
需要一个todolist,我就开始了yatodo。
用python,一方面为了学习,一方面也势比用c快,为什么不用java,因为我不想release的时候带着一坨JRE
今天增加了对catalog的支持,现在可以根据需要对自己的item进行分组了。
从svn上下来看看吧,估计这周如果可能的话,我会release下一个版本。
svn checkout http://yatodo.googlecode.com/svn/trunk/ yatodo
筹划需求的yatodo(Yet Another todolist)已经发布了版本0.0.2。
非常高兴可以一直坚持写一个东西了(虽然这个坚持只维持了还不到十天)
以前一直有想法,要写一个todolist,最关键的原因就是,我需要一个命令行的,简简单单的就足够了。命令行,无非就是为了速度快,因为我每天基本上所有的工作都是在命令行下完成的。所以一个顺手的todolist对我非常有帮助。虽然很多的同类产品都非常好,但是命令行的还是没有。
最早想用c写,为了学习c语言。但是自从在google code上面申请了项目,将近两个月没动换了。
最近是在无法忍受自己的堕落了。把这个项目翻出来,开始写。
本来还想用c,但是无奈小弟的c实在是二把刀,半瓶醋,不在调上。要是用c,也不是不可,估计就得到猴年马月才能用上了。而我又等不及。干脆横下一条心
$svn rm *
$emacs yatodo.py
用python快速开发吧。
这不,不到10天,每天平均不知道几小时开发(平均每天肯定没有半小时),一个我自己可以用的玩意已经出来了。
随着每天看到他成长,自己的需求也越来越多,随着自己的需求越来越多,也就每天能够看到他成长。每天都有动力,每天我都很欣慰。
我觉得最关键的,还是要快速的看到他在长,而不是干瞪眼半年,还是这仨瓜俩枣。黄花菜都凉了,也还没动手呢。况且,做一个东西,关键的是思想不是语言,学习c,还是写一些算法的题来的快一些。
hoho,很是兴奋啊,有一个印有Mozilla Firefox的T恤,可是正版的哦。
刚刚从大都酒吧街的化蝶酒吧出来。还是很兴奋哦。
Mozilla在国内的影响力,也许不大,但是可见,真正关注它的人,还是非常的痴迷的,其中就有我的一个从来只认识微软产品的哥们,现在也是忠实的Mozilla fans。
各种“名流”系数到场,收到了Feedsky的吕欣欣和夏炎(herock这个你总知道了吧),Bokee的文心,China W3C美女李安琪的名片。还有Mozilla台湾乔敬的名片,上面可是@mozilla.com的地址啊。
今天(昨天)参加的以技术人员居多,还有一些媒体的,市场的等等的人。气氛很是活跃。和夏炎聊的也比较开心。还有端正了李安琪身为W3C组织成员的态度,相信以后她在技术圈子里面,和人说话的时候,会比较理直气壮。
嗯,很多话,写不出来了,唉~,一看就是技术人员(还好,小声的说,我不是博士)。
总之,满载而归
今天,我开出了一个新的分类——“技术快餐” 。它的目的,就是在短时间内,使用一些技巧或者什么手法,来解决身边的一些“小”问题。既然是快餐,那么他就可能投机取巧,并且很有可能他就不是一个非常完美的解决方案。但是毕竟快嘛,用起来简单,方便,能够大体上得到一个(大致)精确的结果,我就满意了。
今天说一下如何判断js里面function的使用情况。
问题描述:我现在要调查一下线上服务的loadtime情况,其中能够奏效的很明显的一点就是较少js的体积。这里并不是讲究如何去压缩等等。而是一个简单的调查。
现在已经存在了大量的js lib,相信一些web的developer手上也有一些自己封装好的lib。用的时候,一个include,很是方便。但是当你在两大的lib里面,东拼西凑的完成你的功能的时候,其实也有一部分存在的代码,从来也没有执行过一次。这个时候,找到并处理他们是一个很有意义的事情。
思路:在每一个function里面,加入一个log,这样,当这个function被调用的时候,我就知道了,当覆盖了全部(或者大部分)的feature以后,js function的使用率自然一目了然。
log,不用什么高深的log4js等等,就是简单的apache access log就可以了。
在页面中动态的生成一个image对象,然后当需要记录log的时候,只要把image对象的src设置成为一个标记就可以。这样在apache的access_log当中就会有记录了。
实施:使用sed命令来给每一个需要统计的js做一下处理。
比如,你有一个方法叫做
function a () {
…
}
处理以后,变成
function a() {
ltimg.src=”xxx” mce_src=”xxx”;
…
}
这样就达到了记录的目的了。
下面附上代码:
jsfuncname.sh
sed -e ’s/function \(.*\)\(.*\){/function \1 \2 { ltimg.src=”\/images\/ltimg.jpg?n=\1″ mce_src=”\/images\/ltimg.jpg?n=\1″;/g’ $1 | sed -e ’s/\(.*\)=\(.*\)function\(.*\){/\1=\2function\3{ ltimg.src=”\/images\/ltimg.jpg?n=\1″ mce_src=”\/images\/ltimg.jpg?n=\1″;/g’ | sed -e ‘1i\
if (typeof(ltimg) == “undefined”) ltimg=new Image();
‘
使用方法,吧这段sh帖成一个sh文件,然后执行
sh jsfuncname.sh filename.js > newfile.js
这样newfile就是新的生成好的文件了。
下面是我测试用的一段code,
var a = function () {
aaa;
}
function a() {
}
function a () {
}
function a (a,b,) {
}
function a() { //tt
}
function a () { bb;
}
function a() { bb;}
(function a() {bb;})
var f= (function() { bb;})
if (typeof (a) == “function”) {
}
if (typeof (a) == “function”)
{}
if (typeof (a) == “function”) {}
if (typeof (a) == “function” && typeof (a) == “undefined”) {bb;}
if (typeof (a) == “undefined” && typeof (a) == “function”) {bb;}
至少,在我使用的环境下,他的表现还是完美的。
很久没有写东西了,主要是忙的有点弱智。今天好好的睡了两天(看出来弱智了吧),脑子有点清醒了,写一些东西出来。
周二看《赢在中国》,然后周四在公司开会,都提到了一个问题,就是我们做东西到底是为了谁。这个看上去好像是一个废话,做东西当然是为了客户。但是如果仔细的想一下,为了客户,为了哪个客户呢?客户可是很多的,这是一个很宽泛的说法,基本上等于没说。
我们是不可能满足所有人的需求的,所谓的满足了所有的人,那么也就是没有满足任何人。所有的产品都要有一个定位,老人,小孩,就算是白领,还有各种各样的区分方式了。这个说起来,肯定很多人都明白,但是我看,真的能够把它做的很好的,并不是很多。比如就说是音乐搜索,很多的地方都在做。可是的确的,我们的用户群的定位,并没有一个很清晰的说明。是针对年轻人的?在校生的?白领的?还是如何。不过,好在现在基本上更多的年轻人作为互联网的主体,更加的关注一些流行趋势,所以还算好说。(那我这种喜欢听动力火车和老爹的老家伙怎么办
)
也想好好的做个东西,但是更多的时候,还是从技术的角度去思考。真正的坐下来,静下心从宏观的角度去思考一下这个东西能提供什么,满足什么人的什么需求。其实,用户群哪怕是一点点,少到只有我自己,主要认真的做好了,还是会有人喜欢的,至少自己喜欢啊。
总之,做个好东西,为了真正需要的人,提供最贴切的服务,这就好了。
tangrui.cn: en
win = win || window;
}
刚刚和一个哥们讨论晚longjs里面的ResourceManager如何做。(广告时间,广告时间,longjs,一个我们自己写的完备的JavaScript Framework)。
ResourceManager是一个负责多语言处理的类,使用它,可以很方便的实现页面的语言切换,而且对于不同的UI Control,也能够方便的使用不同的语言。
这里就出现了一个问题,就是对于ResourceManager有两大类的分类方法,locale和control type,那么对于如何进行分类,我们有了分歧。我的想法是分两层,也就是第一层根据Locale来进行分类,然后再根据type分类。他则认为一次曾是control type,然后是locale,或者干脆,直接传入两个参数来获得真正的resource。
此时,我们有了分歧,经过了很长的时间,做到了如下的统一。就是底层不管怎么写,实现都是无关的,并且,对于一个实用lib的开发者来说,get什么,在什么语言下,他是不关心的,只要能够get出来一个String就可以了。我认为,从一个用户的角度,我使用一个语言,而不关心所有的控件类型是一个很make sense的事情。而且,大多数的实用,肯定是我的页面都是(绝大多数是)中文,或者英文。并且,此时,如果我添加一个法文的支持,我只要关心语言就可以了。在语言资源的组织上,我只要en/control/*,fr/control/*,这样对语言的操作也是统一的。符合使用习惯。
并且,我觉得,当你做到
var localeManager = ResMgr.get(”en”);
var str = localeManager.getString(”key”);
var buttonManager = localeManager.get(”button”);
var buttonText = buttonManager.getString(”key”);
这样我在切换语言的时候,只需要修改一句话就可以了。
我哥们认为,这个可以都引用一个全局的变量,也可以实现修改一句话就可以
var globalLocale = “en”;
var mgr = ResourceManager.get(”button”, globalLocale);
var str = ResourceManager.get(”key”, globalLocale);
这样我觉得他的实现方式,虽然可以达到目的,但是却没有一个程序的完备性。 我所谓的完备性,就是一个(比如是OO的程序)框架,在只有自己整体的情况下,是可以完全的工作的。而一些比如环境变量,注册表之类的,都是辅助的,能够更加的方便的实用的手段。而作为framework/library的开发者,在开发的时候,是不应该考虑这些的。因为如果总是这些方便的东西,肯定会自然不自然的实用,最后用的地方过多,以至于不可控。当然在完备的基础上,适当的一些方便的用法和技巧,是允许的也是必要的。
作为一个framework/library的开发者,我认为自始至终应该保持framework/library的完整性,完备性,以及时刻想着用户如何使用更加的make sense,更加的方便。
变了,伪装、遮掩,我们自己永远是亮丽和完美的,朋友之间永远是肝胆相照的。可是我看不到原汁原味的感情了。
每个人都生活在自己的面具下,平静的生活,有声有色。困难面前,很多就分崩离析了。我们也没有当初标榜的高尚了,原来生存和自我保护不受到伤害才是首要的。
现在工作了,大家更多的是一种短暂的临时的感情,已经没有梦想中的原汁原味了。而似乎人们也习惯和喜欢了这种感觉。面对什么,都是表面的光鲜足以影响我们的判断,让我们一下子就喜欢上它,随之就是一下子忘却了曾经的欣赏。如此反复,如此的让自己“充实” !
从网上找来了77年eagles的经典的“Hotel california”。没有合成,完全是靠自己原汁原味的声音把现场送上天籁。人们陶醉在其中,陶醉在这种真实的,能够触摸的感觉。完全没有那种手指轻弹,泡沫上天的感觉。怀旧?还是怀念那种真实和纯粹呢?
朋友啊,现在还好么?想你们了。回头一定去喝酒。
——“炬炬你好,我是老丁,你还好吧,在天堂。我们现在在棚里,大家依然在想你,录上这首《礼物》送给你,希望你能收得到。好,明天在梦里再梦你 。”
“靠”,多么好的一语双关啊。
现在社会上已经开始认识到,80后正在逐渐的成为社会的主力军。一些60后,70后们,还是肯宽容的,继续鄙视着80后。自私,自我,成了对我们这一带人的评价,蜜糖里养大的一代人。
社会(依)靠我们?社会靠(@#$%^&*只好马赛克处理)我们!
作为80后的大龄人,地位有些尴尬。70后不带我们玩,80后的典型代表,更多的指的是85后的80后后们。我们这些80后前,想法贴近70年代末的人群,但是毕竟7到8,还是相差很多的。
从我来看,的确现在的很多的孩子(请理解我说这些80后(后)们为孩子)丧失的责任感。社会的责任,家庭的责任,甚至是自我的责任。4-2-1的家庭,从根本上就会形成以孩子为中心的一种形态。自我,不可避免。但是我想说的,更多的还是这几代人,尤其是我们和父辈们这一带人的区别。
社会角色:我们只要扮演好自己的角色就好了。这是一个现实的社会,一个物竞天择的残酷的竞争的社会。我们需要的是不断的提高自己,击败别人。80后,面临的甚至是能否有饭吃的局面。这个竞争的角色从一出校门便开始了。很多的孩子们,就是无法适应角色的转变,很快的就倒在战场上。等待父母前来营救。所以,80后,是很不容易的一代人,要和父辈、兄长竞争,还要和自己身边的同龄人竞争。走的慢一点,就会被赶上。
社会责任感从一开始就很大(夸张么?)程度上向对金钱,权势的追求转变。并且,或许从70后,就已经开始了怀疑一切,怀疑别人。现在我们看到的,完全相信别人的事情,越来越少了,社会的悲哀,处在中心的80后的悲哀。
作为社会的现在的和即将的主体,我们反映了整个社会的现状。
家庭角色:很多的小孩,都是不考虑家长的,不考虑别人的。在家里不承担责任,而且根本就没有错的概念–”我做的就都是对的!”。对于父母,能有多少孩子自己就像起来,父母一辈子不容易,自己要让他们的后半生生活的美好,没有后顾之忧?我看很少。责任是多方面的,不能说80后的父辈们就没有责任。
对于婚姻,我觉得80后是更加的趋于理智的,但是也是更加的让父辈看不上眼的。白头到老固然幸福美满,但是不能白头到老,也无所谓。我们追求的生活的质量,而不仅仅是生活。思想开放了,见到的东西多了,选择的余地大了。我们不会为了别人的眼光而维护一个我们双方都觉得不好的婚姻。而且,绝不会让柴米油盐舒服住自己。
父辈们认为这个全都是放屁,而我们却说,”儿孙自有儿孙乐”,”子非鱼焉知鱼之乐”!
会出现4-2-1-1,4-2-1-2,还是4-2-1-0,不得而知,但是不管是什么,我们有自己的理由,因为我们生活的快乐。
属于你,属于我,属于我们八十年代的新一辈!。

Del.icio.us : 80后
This is a test blog from Zoundry Blog Writely.
Just have a test and have a look about it.
工作,是工作,不是职业,更不是事业。但是我也不能马马虎虎的对待,还是必须认真的。
现在的状态是我很喜欢的,工作的时候专心的工作,努力的压榨自己,把事情做好。虽然刚刚到这里,很多的还不熟悉,总会做错一些事情。但是感觉自己已经走上轨道。
而且,公司有班车,每天早晨不到9点就能到公司,每天下午,6:30之前准时离开。想要赶上班车,就必须在工作时间提高自己的效率,不能浪费一点时间。而下班回家早,就有很多的自己的时间,充电,做自己的程序。这个状态真的不错。
PS:做什么事情,是你做好了,有了这个能力,才会然你做这个职务。而不是让你做了什么职务,你在做什么事情。
国美花大钱卖了永乐,貌似顺带脚把大中也收至麾下。这下永乐的上海,大中的北京,以及他们辐射的周边城市的确也尽在掌握。这样国美的集中攻势+周边辐射,自身的格局已然形成。每年高达600多亿人民币的营业额,也让追赶着难以望其项背。俨然一切尽在掌握。
国美行动了,苏宁呢?据说苏宁刚刚上了SAP的ERP,可以实现快速的现金结算,货物供应,平均不到3天就可以增加一个店面。但是和国美的手笔比起来,还是温文尔雅。国美这一次收购,几百个店面(还是地理位置优越的店面),瞬间为我所用。
国美,苏宁,永乐,五星,大中,国内家电业的头五名,已然被国美收拢了两家,五星也让Best Buy买走了,苏宁呢?怎么玩?
有人说已经形成了三足鼎立之势,国美(永乐,大中)、Best Buy(五星)还有苏宁。可是我们看,苏宁够资格参与这个有戏么?我觉得恐怕够呛。家电大卖场,核心竞争力就是在话语权,实现对供应商有效的威胁。但是基础是规模,是地域覆盖率,是地区覆盖率,优良位置的争夺。如果不能形成迅速的扩展,从规模上超够对手,那么存活的几率就小很多。
现在苏宁怎么办?让我们拭目以待。
会不会迅速购买一些二级城市的地方品牌?以二级城市作为主打对象呢?
现在吵吵的最多的web2.0的实质是什么?ajax?新的用户体验?tag?个人认为,都不是。web2.0最核心的就是用户的群体智慧。
比如,在很多的产品中,用户都可以自主的做自己的一些个性化的设置,比如打tag,最典型的就是好吃的del.icio.us,完全用户自主设置tag。但是我们发现,这些tag,并没有出现一个(极端的)分散的状态,而是称金字塔的形式聚拢起来。
这充分的说明,我们的智慧是群体的。我们的个人行为是随机的,但是我们的群体行为是呈现一定趋势得。那么在这个时候,我们就可以利用一些统计得手段,对一些东西进行分析,包括用户的行为。
比如一个五子棋的人机对战程序,就有两种方法实现。
- 做一个人工智能的程序,分析当前的局势,然后走棋,争取胜利
- 做一个全统计的程序,把所有的出现的情况记下,以后出现一个局势,从已有的记录下的数据库中,选择获胜的几率最大的走发走棋。并且不断的增加自己的统计数据,提高准确性。
从这个地方,我们可以看出来,第二种做法,在技术的角度是方便实现的。并且,现在很多的应用都是使用这个方法。
搜索,至少是现阶段的搜索,其实就是一个统计和分析统计结果的过程。至少我是这么认为的。
今天做了一个东西,在登录的时候,“在本机记住我”,这个选项默认选中,还是不选中呢?众说纷纭,没有统一的结论。怎么办?做一个统计的程序吧,让我们不相信自己的智慧,让我们相信群众的智慧!
刚刚忍不住手痒,下载了一个Firefox 2.0 Beta 1(可能过几天这个链接就换了)。写了一段JS,看来果然在JS1.7当中,Iterator是非常好用的。
代码如下
================================
<html>
<head>
<script language=javascript>
// add function for JavaScript Object
Object.prototype.newfunc = function(){};
function init() {
var a = [1,2,3,4];
var it;
var s;
// old method in JavaScript 1.5
s = “”;
for (it in a) {
s += it + ” ==> ” + a[it] + “<BR>”;
}
document.getElementById(”old_in”).innerHTML = s;
// new one in JavaScript 1.7
s = “”;
try {
it = Iterator(a, true);
while (true) {
var key = it.next();
s += key + ” ==> ” + a[key] + “<BR>”;
}
} catch (err if err == StopIteration) {
//alert(”End of record.\n”);
} catch (err) {
//alert(”Unknown error: ” + err.description + “\n”);
}
document.getElementById(”new_in”).innerHTML = s;
}
</script>
</head>
<body onload=”init()”>
<div id=old_in></div>
<hr>
<div id=new_in></div>
<hr>
</body>
</html>
================================
运行结果如下:
0 ==> 1
1 ==> 2
2 ==> 3
3 ==> 4
newfunc ==> function () { }
0 ==> 1
1 ==> 2
2 ==> 3
3 ==> 4
可见,使用Iterator是可以避免在for之中错误的使用一些未知的新添加的方法的。
有一点遗憾的就是,Iterator的结束是很丑陋的,不知道有没有什么好的方法。还需要继续研究。
Firefox 2.0 beta 1推出了,肯定很多人已经关注这个事情了,我则比较(更加)关心的是JavaScript的增强。JavaScript升级到1.7了(FF1.5支持JavaScript1.5,IE6sp1支持不完全的JavaScript1.5)
在JavaScript 1.7里面有了一些新功能的支持,比如Generator和Iterator,let语法的支持,非结构化赋值(destructuring assignment)。
令我最关心和期待的就是Iterator的支持,据说只要自定义next方法和__iterator__属性就可以根据自己的需要定义返回的值了。Iterator的出现最大的好处就是可以放心的在一些内嵌的对象当中添加方法了。
以前这样的代码是很危险的:
var o = new Object();
for (var i in o){}
因为很可能某个第三方的库文件在Object当中添加了一些方法,(比如著名的prototype),这样,在不同的第三方库混用的时候,就很可能出现问题。
现在有了自定义的Iterator,那么我觉得是完全可以避免的,只要为Object写好合适的iterator就可以了。具体的代码我还没有尝试。
还有一个问题,就是不知道IE7支持JavaScript到什么版本,而且,IE6和Firefox1.5.*都还是JavaScript 1.5 并且很多人是不会升级的。
所以,JavaScript1.7也许在未来的一段时间内,还是一个美好的(但是不能实现的)愿景吧。
如我前面的文章说的,对于JavaScript,一个类,就是一个function,他的类方法(也就是static的)都是作为这个function的一部分,而实例方法,都是在prototype上面的。
function ClassA() {
}
ClassA.staticMethod = function () {
}
ClassA.prototype.instanceMethod = function () {
}
在我这个实现当中,一个类的继承是拷贝父类的所有类方法,这样子类就有了父类的静态方法。
然后让子类的prototype.prototype指向父类的prototype.
然后可以根据自己的需要,重写一些方法。
function ClassB() {
}
ClassB.staticMethod = ClassA.staticMethod;
ClassB.prototype.prototype = ClassA.prototype;
ClassB.prototype.instanceMethod = function () {
// method 2
}
对于子类,使用一个prototype的链,来实现方法的实例方法的继承。之所以选择这种实现方法,是因为子类是要重写其中的某些方法的。而prototype又是一个reference,所以直接的写作ClassB.prototype = ClassA.prototype,会在重写ClassB的实例方法的同时,破坏ClassA的实例方法。而修改后的方法则会屏蔽父类的。
寻找方法的顺序是,instanceA.prototype.method -> ClassA.prototype.
此时对于类方法的继承,已经实现,现在需要实现在子类中,调用父类的方法。
对于Java,这样的使用是很平常的
public void method() {
super.method();
}
在JavsScript中,为了实现此类功能,所以必须保留一个parent的reference,指向ParentClass.prototype.
ClassB.prototype.parent = ClassA.prototype.
那么在instanceB里面调用this.parent.method.call(this);就可以使用父类的方法了。使用call调用,是为了把自己的数据传到父类。更漂亮的解决方法,我还没有想到。
所以完成的代码是
function ClassA() {
}
ClassA.prototype.method1 = function () {
}
ClassA.staticMethod = function () {
}
function ClassB(){
}
ClassB.staticMethod = ClassA.staticMethod;
ClassB.prototype.prototype = ClassB.prototype.parent = ClassA.prototype;
这个我抽象出来一个extend方法,
var LCore = function () {
}
LCore.extend = function (destination, source) {
// copy all functons
for (var prop in source) {
if (prop == “prototype”) {
continue;
}
destination.prototype[prop] = source[prop];
}
// make a reference for parent and reference prototype
destination.prototype.prototype = destination.prototype.parent = source.prototype;
return destination;
}