2008-03-14

请访问

http://yinwm.cn/blog

2008-03-2

http://yinwm.cn/blog

实在是不好意思,又换地方了:)

2007-03-1

my.donews.com叟不鸟呢~~

转战blog,又换地方了

http://blog.easyapp.net

现在feedsky的feed已经转过去了。

2007-02-1

强烈建议大家看一下以下四篇文章

  1. Java 和 .Net 在异常处理机制上的区别 by tangrui
  2. 也议Java与C#的异常处理实现 by zhangdi
  3. 答 zhangdi 同学的问题 by tangrui
  4. 我对异常处理的理解 by zhangdi

出场演员简单介绍:
tangrui,我的师弟,曾经在一家公司供职。
zhangdi,我的同事,曾经我们三个人在一家公司供职。
tangrui和zhangdi,他们都是,嗯,从我来看都是完美主义者。对代码和程序的要求都是完美的。我之所以说是代码和程序,是因为如果从架构的层面,大家都应该追求完美。而对于代码和程序,某些人就是属于得过且过的类型了(比如我)。我是典型的实用主义者,一个代码,能用,ok,那么就是好东西。我才不管他写的如何呢。当然了,我的能用是指能够满足我(当前)的需求。tangrui对我的这个习惯,表示些许的嗤之以鼻 :P

关于Java/C#(/C++)的Exception问题,我和tangrui也曾经探讨过,我和曾经的一个主管也探讨过。我的看法,基本上是和zhangdi一致的。要发生错误的地方,可预料的,那么就Checked住,如果是不可预料的,自然就是不知道如何处理的,那么就RuntimeException,任其自生自灭吧。并且,Exception就是Exception,不是其他。catch住了,为了容错打报告,而不是另辟蹊径的流程。

具体的可以参考以下spring社区的观点,具体的url,忘记了,一会找一下。
我个人觉得他提出的观点非常好,如果你知道这个exception要怎么应付他,那就cache,你要是不知道,那就Runtime。

PS:看到zhangdi的wordpress很漂亮,我也有打算自己搞一个了。看来今年换成自己架设blog,还是有希望的,hoho。

2007-01-31

需要一个todolist,我就开始了yatodo
用python,一方面为了学习,一方面也势比用c快,为什么不用java,因为我不想release的时候带着一坨JRE

今天增加了对catalog的支持,现在可以根据需要对自己的item进行分组了。

从svn上下来看看吧,估计这周如果可能的话,我会release下一个版本。

svn checkout http://yatodo.googlecode.com/svn/trunk/ yatodo

2007-01-26

筹划需求的yatodo(Yet Another todolist)已经发布了版本0.0.2。
非常高兴可以一直坚持写一个东西了(虽然这个坚持只维持了还不到十天)

以前一直有想法,要写一个todolist,最关键的原因就是,我需要一个命令行的,简简单单的就足够了。命令行,无非就是为了速度快,因为我每天基本上所有的工作都是在命令行下完成的。所以一个顺手的todolist对我非常有帮助。虽然很多的同类产品都非常好,但是命令行的还是没有。

最早想用c写,为了学习c语言。但是自从在google code上面申请了项目,将近两个月没动换了。
最近是在无法忍受自己的堕落了。把这个项目翻出来,开始写。

本来还想用c,但是无奈小弟的c实在是二把刀,半瓶醋,不在调上。要是用c,也不是不可,估计就得到猴年马月才能用上了。而我又等不及。干脆横下一条心
$svn rm *
$emacs yatodo.py
用python快速开发吧。
这不,不到10天,每天平均不知道几小时开发(平均每天肯定没有半小时),一个我自己可以用的玩意已经出来了。

随着每天看到他成长,自己的需求也越来越多,随着自己的需求越来越多,也就每天能够看到他成长。每天都有动力,每天我都很欣慰。
我觉得最关键的,还是要快速的看到他在长,而不是干瞪眼半年,还是这仨瓜俩枣。黄花菜都凉了,也还没动手呢。况且,做一个东西,关键的是思想不是语言,学习c,还是写一些算法的题来的快一些。

2007-01-17

hoho,很是兴奋啊,有一个印有Mozilla Firefox的T恤,可是正版的哦。

刚刚从大都酒吧街的化蝶酒吧出来。还是很兴奋哦。
Mozilla在国内的影响力,也许不大,但是可见,真正关注它的人,还是非常的痴迷的,其中就有我的一个从来只认识微软产品的哥们,现在也是忠实的Mozilla fans。
各种“名流”系数到场,收到了Feedsky的吕欣欣和夏炎(herock这个你总知道了吧),Bokee的文心,China W3C美女李安琪的名片。还有Mozilla台湾乔敬的名片,上面可是@mozilla.com的地址啊。

今天(昨天)参加的以技术人员居多,还有一些媒体的,市场的等等的人。气氛很是活跃。和夏炎聊的也比较开心。还有端正了李安琪身为W3C组织成员的态度,相信以后她在技术圈子里面,和人说话的时候,会比较理直气壮。

嗯,很多话,写不出来了,唉~,一看就是技术人员(还好,小声的说,我不是博士)。

总之,满载而归

2007-01-15

今天,我开出了一个新的分类——“技术快餐” 。它的目的,就是在短时间内,使用一些技巧或者什么手法,来解决身边的一些“小”问题。既然是快餐,那么他就可能投机取巧,并且很有可能他就不是一个非常完美的解决方案。但是毕竟快嘛,用起来简单,方便,能够大体上得到一个(大致)精确的结果,我就满意了。

今天说一下如何判断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;}

至少,在我使用的环境下,他的表现还是完美的。

2006-11-19

很久没有写东西了,主要是忙的有点弱智。今天好好的睡了两天(看出来弱智了吧),脑子有点清醒了,写一些东西出来。

周二看《赢在中国》,然后周四在公司开会,都提到了一个问题,就是我们做东西到底是为了谁。这个看上去好像是一个废话,做东西当然是为了客户。但是如果仔细的想一下,为了客户,为了哪个客户呢?客户可是很多的,这是一个很宽泛的说法,基本上等于没说。

我们是不可能满足所有人的需求的,所谓的满足了所有的人,那么也就是没有满足任何人。所有的产品都要有一个定位,老人,小孩,就算是白领,还有各种各样的区分方式了。这个说起来,肯定很多人都明白,但是我看,真的能够把它做的很好的,并不是很多。比如就说是音乐搜索,很多的地方都在做。可是的确的,我们的用户群的定位,并没有一个很清晰的说明。是针对年轻人的?在校生的?白领的?还是如何。不过,好在现在基本上更多的年轻人作为互联网的主体,更加的关注一些流行趋势,所以还算好说。(那我这种喜欢听动力火车和老爹的老家伙怎么办 :P

也想好好的做个东西,但是更多的时候,还是从技术的角度去思考。真正的坐下来,静下心从宏观的角度去思考一下这个东西能提供什么,满足什么人的什么需求。其实,用户群哪怕是一点点,少到只有我自己,主要认真的做好了,还是会有人喜欢的,至少自己喜欢啊。

总之,做个好东西,为了真正需要的人,提供最贴切的服务,这就好了。

2006-09-5
tangrui.cn: ok
我已经把名字改成 lcore Le
不过还没 commit
Weiming: 我说,怎么没有up到

tangrui.cn: en

lazy load 的暂且先放一放
说那个资源和代码先后的问题
Weiming: 好,这个我觉得需要去调查以下
Sent at 10:30 PM on Monday
Weiming: ?
tangrui.cn: 啊,我在等你说呀
Weiming: 你不是说了,lazyload的,放一下,我说好,先去调查
tangrui.cn: 就是我上午说,代码文件要是访问资源文件的话,那么资源文件必须在代码文件之前引用
这就要求,比如 longjs.lang.lstring 必须先定义这个类型
Weiming: 上午说的,你说要把定义,单独放在__package__虾米,这个我不同意
如果
longjs.res = {};
然后所有的res,都挂在这个虾米呢?
下面
longjs.res.lstring = {};
long.res.lstring['en'];
这样就有了
tangrui.cn: 什么意思
Weiming: 就是,现在的res都是单独的
比如lstring的,
那么就是
longjs.lstring['en']这样的
tangrui.cn: res 不能单开命名空间呀
要不然我怎么能知道他放在哪里了
Weiming: 我的意思,res,不是一个单独的命名空间
longjs.lstring['en']这样的
tangrui.cn: 再说把他们放到 longjs.res 下面也不成呀,res 岂不成一个命名空间了
Weiming: res,是一个变量
或者说,应该是
longjs.__res
这样
他只是一个resource的挂节点
从一个逻辑的角度,
tangrui.cn: 那么你的资源就没有层次结构了呀
Weiming: longjs.__res,起始就是统一的管理resource了
还是有的,
只不过,你的原来的没有一个统一的根,现在有了
tangrui.cn: 再说这个东西没有放到前面的,还是那句话,你的资源是要跟类型走的
Weiming: 什么东西没有放到前面的?
tangrui.cn: 现在是因为可能有多语言把他们分开,但其是资源和类型是应该在一起的
Weiming: 资源,起始,做成
longjs.lstring['en'];
tangrui.cn: 即便像你说的那样,也应该是 longjs.lang.lstring.__res
Weiming: ok,停以下
tangrui.cn: ok
Weiming: lstring的res,是否是lstring的一部分?
先不考虑default的
tangrui.cn: 不是
Weiming: 那么,也就是没有res,我可以用lstring
tangrui.cn: 但是需要至少配备 default 的
Weiming: 先不考虑default
tangrui.cn: 是的
Weiming: 如果default的实现和其他完全一样
那么也没必要考虑
因为都是一样的
ok,这个地方,咱们没有分歧,就是lstring是可以,并且应该单独使用的
tangrui.cn: 对
Weiming: 如果,我现在有了res
那么他也应该在lstring加载后,以一种补充的方式
把自己”挂”上去
ok?
tangrui.cn: 是的
Weiming: 那么加载的顺序就定了(先不管怎么实现)
就是先lstring,再是他的res,(如果default和其他的一样,那么同样处理)
tangrui.cn: 是的
然后
Weiming: 在现阶段
咱们已经实现了lstring对longjs的挂接
可以使用这个说法么?
tangrui.cn: 什么叫 lstring 对 longjs 的挂接
Weiming: 如果从一个扩展的角度看,(也许不合适)
就是lstring,是对longjs的一个扩展
tangrui.cn: 这个不能这么说吧
Weiming: 为什么不能?
tangrui.cn: lstring 毕竟是 longjs native 的 class
不说那么拗口的名词,继续往下
Weiming: ok
反正,就是
现有了longjs,然后又了lstring
tangrui.cn: 对
Weiming: 并且,lstring,要么有,要么没有
不能说,我有一部分
tangrui.cn: 是的
Weiming: 那么,早晨你说的吧lstring的定义
也就是longjs.lstring = xxx
放在__package__里面,我觉得是不合适的
tangrui.cn: 但是,没有办法
Weiming: 其实,现在可以说,只有在static method的地方,才会出现
我使用res,但是没有
对吧
tangrui.cn: 对
Weiming: 我想想
先说结果
就是,这样
longjs.__res.lstring
那么再说我是如何理解
我现在也不知道这样是否合适
就是
现有longjs,后有lstring
longjs。lstring,从某种意义上
认为是lstring挂在longjs上面
那么,这个时候,能否认为
lstring的res,也是在和lstring加载的时候,也是挂在longjs.__res上面的
对于longjs,这些class,他的跟是longjs
对于他们的res,根是longjs.__res
也就是longjs管理所有的class等
longjs
longjs.__res管理所有的res
可否这么认为
tangrui.cn: 那就不对了
Weiming: ok
tangrui.cn: 你要是这么理解的话,那怎么组织都说得通了
我就算把资源放到 abc.def.hjk.__res.lssssss
Weiming: 我这样说,只是从一个树,变成了两个树
tangrui.cn: 下面我也能说,是在 longjs.lang.lstring 加载的时候挂上去的
但是既然咱么做了一个有层次结构的框架,那就资源也和类型必须在他的可控范围之内
Weiming: ok
tangrui.cn: 资源与类型不是平行的关系,而是资源从属与类型
Weiming: 对
tangrui.cn: 所以从组织上也需要是具有从属的层次
ft 又遇到一个问题
这个我觉得咱么明天再说吧,一晚上估计不一定能讨论出来
Weiming: 是,这是一个圈,妈的
tangrui.cn: 现在恐怕 lcore.using 要加上一个参数表示所在的 window 了
lcore.using(target, win);
Weiming: 不好吧
为什么这么玩?
tangrui.cn: 因为原来 lcore.using 没有前面的 lcore 所以
Weiming: 所以,都是本window?
我靠
tangrui.cn: 所以在 using 里面那到 this 就是那个 window
现在,lcore.using 的 this 都是 lcore
Weiming: 那,using就没用了
tangrui.cn: 如果你强行使用 window 那么这个 window 就是 jsFrame 而不是调用方法的那个 window
除非把 using 前面的 lcore 去掉
否则就要加上这个恶心的参数
Weiming: 我宁可叫做longjs_using
也不愿意加上window
tangrui.cn: 要不咱么这些 core 的方法都这么叫
longjs_undef
longjs._createPackage();
Weiming: ._
还俩?
tangrui.cn: 多打了一个
我已经提交了
Weiming: 豪
longjs里面,多少是和jsframe相关的?
tangrui.cn: 什么意思
Weiming: 就是,longjs,提供一系列的方法
他有多少是和window,frame相关的
比如using就和window相关
tangrui.cn: 类库部分没有
Weiming: longjs.js
这里面
tangrui.cn: 有的话也是靠类似 lcore.using 这样的方法来获得的
Weiming: using,应该是都是针对调用这个方法的window吧
tangrui.cn: 现在 lcore 的 unit test 最后一个有问题之外,其他的都是可以用的了
而且不能用到 function 里面
比如你应该 using(longjs.lang);
而不能 var MyClass = function() { using(longjs.lang) }; 这样就不对了
这时候 using 的 this 就是 MyClass 了
Weiming: var MyClass = function() { using(longjs.lang) };
这肯定不行
tangrui.cn: 所保险起见是应该提供这样的一个参数,但是可以允许省略
Weiming: 那就得写成
longjs_using
tangrui.cn: 是呀,前提都是这么写
要不这么写,就一定要提供这个参数
Weiming: 除了不好看,还有什么问题
tangrui.cn: 没什么问题
以前也是这么写的,就是没有 longjs 前缀
Weiming: 还是有一个前缀好
tangrui.cn: 我觉得宁愿加一个参数也不这么写
Weiming: longjs_using比using好
我是宁可不加这个参数
tangrui.cn: 加一个参数,无论如何是保险的
Weiming: 你想,肯定很多的人
都会问你
为什么
我这个页面,调用
longjs.using
还非得加一个window,我不就是在这个window么?
既然我再这个window,那么为什么还得加上
tangrui.cn: 但是这个方法不是在这个 window 里面 run 的
Weiming: 但是会很不爽
tangrui.cn: 这样的问题有的是
比如 win$()
你必须指定一个 window 即便你在这个 window 里面
Weiming: 哪个,我明显是要操作其他的window的,
我觉得win$可以省略
tangrui.cn: 这个可以说是 js 编程的一个特例,没什么办法
Weiming: 如果省略了,就是本window
还有,如果我没有jsframe
那么我怎么用?
tangrui.cn: 不可以省略,省略了就是 jsFrame 里的东西了
Weiming: 我觉得不能接受,肯定很多的人不接受
至少我就不接受
我宁可写一个不好看的longjs_win$
tangrui.cn: 因为现在 win$ 放到了 lcore 里面,以后应该放到比如 longjs.web.dom.LElement 这样的类型下面
无论如何是不能省略 window 的
Weiming: 不好
我宁可已给一个叫做longjs_win$的alias
tangrui.cn: 而且省略了 window 只是代码上面稍微好看了一点,但是会带来严重的不安全性
给 alias 也没有
Weiming: 如果我没有jsframe之类的东西
我只有这个也没
你让我都写一个这个东西,自己的这个window,
tangrui.cn: 再说 longjs 下面只放和 core 有关的,这些和 core 是无管的
Weiming: 很丑陋啊
tangrui.cn: 没有办法,我也不想这样
否则就是那个 class
Weiming: 如果这样,那么我要是用,我肯定写一个很小的做alias的js,然后每个页面都include
tangrui.cn: javascript 就这样,否则都写成平的,就一点问题都没有了
Weiming: 我觉得,这些和window相关的,
tangrui.cn: 这是他的事情了
Weiming: 给window是应该的
tangrui.cn: 如果他这样的话为什么还要用咱么的东西
Weiming: 但是,不给,默认是当前的window,也是应该的
ok,这就是问题了
tangrui.cn: 问题是做不到
Weiming: 你出这个东西,
目的是方便大家的使用啊
当然是越方便越好了
tangrui.cn: 那也要有一定的适用条件
Weiming: 还是这个问题
如果我只有一个页面,我也得都写window
我本来只有一个window啊
tangrui.cn: 所以我说有一个适用条件
Weiming: longjs,是不应该依赖jsFrame的
也就是,我必须用这个webfx么?
tangrui.cn: 按照有 jsFrame 的模式来用是 longjs 的长处,也是区别于 dojo 的地昂
地方
Weiming: 为什么我一定要有jsFrame
tangrui.cn: 你要是 single page 的首先一点就是他为什么要用你的东西而不用 dojo 的
Weiming: 我不是single page啊
tangrui.cn: 当然你不一定有,但是我的 api 是根据有 js frame 优化的
Weiming: 我也是每个页面都去跳转啊
做软件的一个点,就是让用户用起来很方便,
把麻烦留给自己,而不是用户
tangrui.cn: 没有我可以保证运行正常,有我也会保证运行正常,且他们能保持同样的 api 接口
Weiming: 可是,这样很烦啊
况且,我只有一个window,你为什么还让我非得写这个window
tangrui.cn: 你用 frame work 的初衷是要解决你棘手的问题
Weiming: 比如什么棘手的问题?
tangrui.cn: 这点东西相比之下就不足味道了
Weiming: 我不认为
当一个开发者,用一个库不爽的时候,他会选择放弃这个库
tangrui.cn: 当然对于他来讲我能不能有一个 tree 有一个 datagrid 是更重要的
问题是这样没什么不爽呀
Weiming: 难道这样很爽么?
就好像
tangrui.cn: 何况是咱么现在讨论的这个问题是没有办法jiejuede
Weiming: 你写所有的关于net的程序
tangrui.cn: 解决的,就算不爽也办法,我也觉得不爽,但是只能这样
Weiming: 所有的方法,你都需要写一个localhost
这样你也会不爽
我并不认为只能这样
这个是可以解决的
tangrui.cn: 当然可以有一个 work around 就是再提供一个 $() 方法
Weiming: 提供$,我也不认为是work around的方法
我认为是标准的做法
tangrui.cn: 这个方法里面直接调用 window.document.getElementById()
Weiming: 如果非要加上window,那么就必须给一个不要window的方阿飞
tangrui.cn: 如果你保证是 single page 就用这个方法,否则这个方法永远返回 js frame 里面的东西
那么 using 也可这么做
Weiming: 这个方法,为什么要放在jsFrame里面?
tangrui.cn: 只有在 single page 的时候允许他不用加上 window
Weiming: 操作本window,都应该可以不加上
tangrui.cn: 所有的方法都在 js frame 里面
Weiming: 为什么?
tangrui.cn: 现在所有的方法都在 js frame 里面,上面的 frame 没有任何类库相关的内容
Weiming: 为什么?
tangrui.cn: 不为什么呀,要不然咱么做这个干什么呢
Weiming: 那么,也就是我必须有一个jsFrame咯
tangrui.cn: 不需要呀,你不用 js frame 就把他们 perpage include 就可以了
反正不用 window 的重载只会返回代码所在的那个 window 里面的东西
Weiming: 如果
tangrui.cn: 所以通常是 js frame 除非他是 single page 的
Weiming: 如果,你提供了这个必须写window的东西
然后,有人写一个很小的做alias和一些window处理的js
要求每个页面都include
那么你认为,大家会不会使用这个
如果不会,为什么
tangrui.cn: 你要是这么说得话,就没有意义了
Weiming: 如果会,能有多少人用?
为什么没意义?
tangrui.cn: 他所有的都可以这么做,为什么好要用咱么的东西
Weiming: 做为使用者,
我不但要求功能强大,我还要求使用方便
你提供功能强大
那么为什么,我不能在你提供功能强大的基础上,做一个使用方便的呢
tangrui.cn: 再说,我已经给他提供了足够好用的变通方法,如果他再不认可,那还能有什么办法
让他自己写这样的框架最终也要写成这样
Weiming: 你的变通的方法,不也得是每个页面做include么
tangrui.cn: 不用呀
Weiming: 那么,我怎么用$
又能解决有window的,又能解决没有window的
tangrui.cn: 在多页面的情况下不能用 $
Weiming: 如果我是本页面,为什么不能?
tangrui.cn: 不能就是不能,javascript 不做不到
Weiming: 不会啊
$ = function (id, win) {
win = win || window;
}
这样就可以啊
tangrui.cn: 你要是在本页面 include 代码的话,那么这个代码至少不属于框架的一部分
Weiming: 我认为是框架的一部分
你既要给强大的功能,还要给最简单和方便的使用方法
tangrui.cn: 咱么可以提供很多这样的 util 来辅助用户
但是同时他这样带来的是代码的重复
Weiming: 重复在什么地方?
tangrui.cn: 作为一个框架你不能在任何时候都往 util 里面加东西
Weiming: 这个是肯定的
tangrui.cn: 比如 java 用户自然希望往屏幕上输出一行字,用 print(abc); 就可了
Weiming: 但是前提是我可以很”方便”的使用你”强大”的框架
tangrui.cn: 但是作为一个框架,他必须要 System.out.println();
Weiming: 这点我承认
tangrui.cn: 你认为这样不可以接受吗
Weiming: 我认为不可接受
所以我的,并且很多人的
tangrui.cn: 框架就要有框架的规矩
Weiming: java,如果是做一个大的
那么肯定有一个叫做print的方法
框架有框架的规矩,是针对框架内部说的
对于用户,就应该给最方便的
就好比
tangrui.cn: 如果有一个方法可以游离于框架之外,那么就会有更多的方法游离
不肯能,否则类库就没有必要设计了
Weiming: 我不认为,框架,只能从一个地方include
一个类库,也不是说,我必须只能从一个地方include
tangrui.cn: 我觉得这个也没有必要讨论了
Weiming: 如果又方便的方法,那么肯定会有人写,并且大量的人用
结论
tangrui.cn: 最后的结果,首先在类库内部没有办法,提供这样的方法,所以只能提供 win$ 和 $
然后在页面上可以随便 include 任何的代码
Weiming: win$放在那?
$放在那?
tangrui.cn: 但是这些不能算作框架的一部分,只是为了方便
Weiming: 页面include什么?
tangrui.cn: 都在方他们该在的地方
Weiming: 你说对于解析xml,算作框架的一部分么?
tangrui.cn: 框架中的方法肯定不能任意游离
如果咱么要做的话,就算
Weiming: xerces,
这个现在已经被包含在java里面了
但是开始他并没有
从这里,就能说明,框架,不是一个单根的
tangrui.cn: 但是他加到 java 里面去以后也不可能是游离的
就像 java 永远都无法提供 print 方法一样
Weiming: 我可以接受,框架有框架的规矩
但是,我要求吧util做为框架的一部分
tangrui.cn: 除非把它做进 vm 和编译器
Weiming: 他并不是游离
tangrui.cn: 这样的话就已经不属于框架类库的一部分了
Weiming: 每名把,什么做进vm?
为什么不属于?
这么说罢,从实用主意
你会不会使用这个东西?
tangrui.cn: 框架不能有 util 的东西,还是那句话,有一个就会有更多
Weiming: 你会不会在你的页面include这个东西
关键不是有多少,而是为什么有
如果他有他存在的理由,那么多少也是应该的
tangrui.cn: 或许说得准确一点,这个不算是类库的一部分,但是可以算作框架的一部分
Weiming: 这个说法,我接受
tangrui.cn: 我还是那句话,不建议他用这套框架写 single page 的东西
Weiming: 就好像,如果真的,java给出的sdk里面,有一个,print的方法,你觉得多少人还会用system.out.print
tangrui.cn: 否则重复做一个 dojo 没有意思
Weiming: 1,我并不是觉得,这个是重复的dojo
tangrui.cn: 那么他内部肯定也是转换成 system out
Weiming: 2,这个的目的是,就算当dojo用,也要比dojo好
这个是我的目标
tangrui.cn: 所以这样的方法不能是类库的一部分
Weiming: 用户不管你是不是转换
tangrui.cn: 问题是你和 dojo 竞争是没有意义的
Weiming: 所以,我坚持他是框架的一部分
我并没有和dojo竞争
竞争也没有意义
tangrui.cn: 我不需要比 dojo 做得好,别人用我的东西,是因为 dojo 做不到
Weiming: 但是如果,非要这么做,要保证比他出色
longjs不是针对single page
但是也要兼容single page
tangrui.cn: 当然,做就要做好了,但是咱么和 dojo 是没有竞争关系的
或者说是 dojo 的超集
Weiming: 有没有竞争关系,不是咱们说了算的,要看用户
很多地方,做成single page类似的是很有必要的
比如我做一个login 的一个块
我就要求要能够随意的include到其他的页面里面
这个很正常的
tangrui.cn: 这个就没有必要了吧,直接写 html 比用任何框架都划算
Weiming: 很有必要啊
比如我同时几个产品
都需要认证
login
当然只写一个就好了
tangrui.cn: 这个先讨论到这里吧,还有一个问题
Weiming: ok,什么?
tangrui.cn: 这个属于 user control 更高级了
就是我在想这个文档怎么写,肯定没有时间写所有的文档了,所以只能写用户文档
我想用户文档就写成 java doc
Weiming: 你指的用户文档,就是api doc么?
tangrui.cn: 然后应该有工具可以转成一份文档
Weiming: http://xdoclet.sourceforge.net/xdoclet/index.html
tangrui.cn: 其实 api doc 写好了就是用户文档
Weiming: http://xdoclet.sourceforge.net/xdoclet/index.html
http://www.docbook.org/
这些都是生成doc的工具
这个好说
tangrui.cn: java 和 msdn 都是这样,把说明写全了,再写上示例代码就足够了
Weiming: 示例代码必要
tangrui.cn: 那就好,睡觉了
Weiming: 呵呵,去吧
2006-08-27

刚刚和一个哥们讨论晚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,更加的方便。

2006-08-25

变了,伪装、遮掩,我们自己永远是亮丽和完美的,朋友之间永远是肝胆相照的。可是我看不到原汁原味的感情了。
每个人都生活在自己的面具下,平静的生活,有声有色。困难面前,很多就分崩离析了。我们也没有当初标榜的高尚了,原来生存和自我保护不受到伤害才是首要的。

现在工作了,大家更多的是一种短暂的临时的感情,已经没有梦想中的原汁原味了。而似乎人们也习惯和喜欢了这种感觉。面对什么,都是表面的光鲜足以影响我们的判断,让我们一下子就喜欢上它,随之就是一下子忘却了曾经的欣赏。如此反复,如此的让自己“充实” !

从网上找来了77年eagles的经典的“Hotel california”。没有合成,完全是靠自己原汁原味的声音把现场送上天籁。人们陶醉在其中,陶醉在这种真实的,能够触摸的感觉。完全没有那种手指轻弹,泡沫上天的感觉。怀旧?还是怀念那种真实和纯粹呢?

朋友啊,现在还好么?想你们了。回头一定去喝酒。

——“炬炬你好,我是老丁,你还好吧,在天堂。我们现在在棚里,大家依然在想你,录上这首《礼物》送给你,希望你能收得到。好,明天在梦里再梦你 。”

2006-08-19

“靠”,多么好的一语双关啊。
现在社会上已经开始认识到,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,不得而知,但是不管是什么,我们有自己的理由,因为我们生活的快乐。

属于你,属于我,属于我们八十年代的新一辈!。
要靠80后

Del.icio.us :

2006-08-11

This is a test blog from Zoundry Blog Writely.

Just have a test and have a look about it.

2006-08-10

工作,是工作,不是职业,更不是事业。但是我也不能马马虎虎的对待,还是必须认真的。
现在的状态是我很喜欢的,工作的时候专心的工作,努力的压榨自己,把事情做好。虽然刚刚到这里,很多的还不熟悉,总会做错一些事情。但是感觉自己已经走上轨道。
而且,公司有班车,每天早晨不到9点就能到公司,每天下午,6:30之前准时离开。想要赶上班车,就必须在工作时间提高自己的效率,不能浪费一点时间。而下班回家早,就有很多的自己的时间,充电,做自己的程序。这个状态真的不错。

PS:做什么事情,是你做好了,有了这个能力,才会然你做这个职务。而不是让你做了什么职务,你在做什么事情。

2006-08-9

国美花大钱卖了永乐,貌似顺带脚把大中也收至麾下。这下永乐的上海,大中的北京,以及他们辐射的周边城市的确也尽在掌握。这样国美的集中攻势+周边辐射,自身的格局已然形成。每年高达600多亿人民币的营业额,也让追赶着难以望其项背。俨然一切尽在掌握。

国美行动了,苏宁呢?据说苏宁刚刚上了SAP的ERP,可以实现快速的现金结算,货物供应,平均不到3天就可以增加一个店面。但是和国美的手笔比起来,还是温文尔雅。国美这一次收购,几百个店面(还是地理位置优越的店面),瞬间为我所用。
国美,苏宁,永乐,五星,大中,国内家电业的头五名,已然被国美收拢了两家,五星也让Best Buy买走了,苏宁呢?怎么玩?

有人说已经形成了三足鼎立之势,国美(永乐,大中)、Best Buy(五星)还有苏宁。可是我们看,苏宁够资格参与这个有戏么?我觉得恐怕够呛。家电大卖场,核心竞争力就是在话语权,实现对供应商有效的威胁。但是基础是规模,是地域覆盖率,是地区覆盖率,优良位置的争夺。如果不能形成迅速的扩展,从规模上超够对手,那么存活的几率就小很多。

现在苏宁怎么办?让我们拭目以待。

会不会迅速购买一些二级城市的地方品牌?以二级城市作为主打对象呢?

2006-08-8

现在吵吵的最多的web2.0的实质是什么?ajax?新的用户体验?tag?个人认为,都不是。web2.0最核心的就是用户的群体智慧。

比如,在很多的产品中,用户都可以自主的做自己的一些个性化的设置,比如打tag,最典型的就是好吃的del.icio.us,完全用户自主设置tag。但是我们发现,这些tag,并没有出现一个(极端的)分散的状态,而是称金字塔的形式聚拢起来。

这充分的说明,我们的智慧是群体的。我们的个人行为是随机的,但是我们的群体行为是呈现一定趋势得。那么在这个时候,我们就可以利用一些统计得手段,对一些东西进行分析,包括用户的行为。
比如一个五子棋的人机对战程序,就有两种方法实现。

  1. 做一个人工智能的程序,分析当前的局势,然后走棋,争取胜利
  2. 做一个全统计的程序,把所有的出现的情况记下,以后出现一个局势,从已有的记录下的数据库中,选择获胜的几率最大的走发走棋。并且不断的增加自己的统计数据,提高准确性。

从这个地方,我们可以看出来,第二种做法,在技术的角度是方便实现的。并且,现在很多的应用都是使用这个方法。

搜索,至少是现阶段的搜索,其实就是一个统计和分析统计结果的过程。至少我是这么认为的。

今天做了一个东西,在登录的时候,“在本机记住我”,这个选项默认选中,还是不选中呢?众说纷纭,没有统一的结论。怎么办?做一个统计的程序吧,让我们不相信自己的智慧,让我们相信群众的智慧!

2006-07-14

刚刚忍不住手痒,下载了一个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的结束是很丑陋的,不知道有没有什么好的方法。还需要继续研究。 

 

 

2006-07-13

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也许在未来的一段时间内,还是一个美好的(但是不能实现的)愿景吧。

2006-06-20

如我前面的文章说的,对于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;
}

下一页 »