J.Blogs : Weblog

来源:百度文库 编辑:神马文学网 时间:2024/04/20 03:32:18
程序界知名的IDJoel,早年混微软,后自立门户,建树颇多,著有Joel On Software(Joel说软件)等秘籍宝典,乃是一代宗师.
话说风水轮流转,最近Joel同学被Rod抢了不少风头,郁闷得紧,心血来潮勃了一篇ThePerilsofJavaSchools(Java学校的危险),对江湖第一大门派--兵强马壮的Java派--叫起了板.
让人家上门踢馆?这还了得!
这边厢立马就有John等高手跳将出来,好事者J预计,后面还有很多高手高手高高手将会出招.
各位,观战最要紧的就是:搬上小板凳,抢个好位置.
( 2006年01月05日, 11:51:42 上午 CST )Permalink留言 [0]
星期三 2005年12月28日
xul+ajax? why not!
上次和 dlee 就 xul 和 ajax 是否相互排斥进行了沟通.最近忙,拖到现在才整理.
首先需要澄清,这里的 xul 并非特指 mozilla xul ,它与 mozilla 绑定,不能跨浏览器运行,显然不符合 ajax "浏览器通吃"的原则.这里提到的 xul 泛指这一设计思想,如 thinlet/swixml/xswt 等等,都算是 xul 思想用不同技术来实现的产物.可以参考xul open alliance
基本上 xul 是一个"ui 构造思想".也就是说,用 xul motor 解析 xml 格式的界面描述文件,得到需要的用户界面.而 ajax 是一系列"界面实现技术手段",其实就是 html + javascript + css + dom + xmlhttprequest 技术的集合.这两者,对于界面构造这个话题,一个是思想,另一个是手段,为什么会互斥呢.比如说,我如果用纯粹的 javascript 实现一个 xul motor 然后也用 html/css/xmlhttprequest 来实现界面和交互,那它为什么就不可以是一个 ajax 的应用呢?
实际上,已有高人做到了这点,比如,qooxdoo 的 builder 示例或者plexTk 都是这么干的.与"标准" ajax 相比,所不同的仅仅是:界面的构造代码由 javascript 变成了 xml 的.
更重要的另外一个问题是,不就是做个界面么,原来该怎么写就怎么写,干嘛搞这么多东东?其实仅仅就在于"简单"二字.
xul 标准化了构成界面的 widgets ,也就是说,界面构造由"念咒语"变成了"搭积木".我要的只是一个界面而已,那些 widgets 的 api 能不学就不学好了.其次 xul 便于扩展,写一个自己的 widgets 其实就是定义一个新的标签,然后"钩上"自己写的类,仅此而已.说起来,就是使用起来简单,扩展起来也简单.
把貌似高深的界面构造工作请下神坛,不是很好么?
( 2005年12月28日, 11:17:02 上午 CST )Permalink留言 [0]
星期四 2005年11月17日
DW上新的炮轰AOP?
DW上最近发表了一篇重磅文章--AOP在大规模软件开发项目中应用的尝试与思考 ,从文章的联合署名来看,作者们是很严肃的.
这篇文章从AOP最为经典的LOG例子入手,说明了在团队开发的场景下,遇到的种种问题,每一个都让设计者面临两难的境地,而无从下手.在一个现实的大型项目中,连LOG这样的AOP都难于开展,那么其他的应用又该如何开展呢?
这篇文章可以说是对在正式项目(而不是个人的试验性质项目)中应用AOP发出了强烈的质疑.我们有理由相信,来自IBM的开发团队,他们的素质是优秀的,他们的技术是高超的,他们的态度是严肃的,他们的项目是认真的--可是连他们都用不好AOP,为什么我们就能用好呢?这也许说明了:目前的AOP还不成熟,或者与他相适应的开发理论还不成熟,至少目前还不能适应于大规模的团队化软件开发.
( 2005年11月17日, 04:57:10 下午 CST )Permalink留言 [0]
星期五 2005年07月15日
XUL + JavaScript + XMLHTTP!!!
我们生存的这个可爱的世界,就是这么富有创造的戏剧性,俺前面的一篇文章(1.24.2005)中还在憧憬,要是有个xul+JavaScript+XmlHttp的东西,用来做客户端,那该多好啊.这边厢,梦想已经实现了!!!
Cameron Braid已经把QxBuilder提交到了qooxdoo的cvs版本之中.
window.application.main = function() { new QxBuilder().buildFromUrl(this, ‘Builder_2.xml‘);}界面都在xml之中.
demo虽然简单,但这就是我们梦寐以求的界面构造方式.
i love opensource!
( 2005年07月15日, 02:47:53 下午 CST )Permalink留言 [2]
星期四 2005年06月16日
qooxdoo初步学习
最近花了些时间学习qooxdoo的源码,笔记如下:
1.继承,qooxdoo设计了一个crossbrower的继承机制,用起来感觉有点象java
2.属性,通过使用javascript的关联数组特性,提供了通用的addProperty和removeProperty机制,在property上,可以增加很多个方法,用起来,感觉像是在做AOP的拦截,COOL.
3.事件,AJAX本来就是"异步"的,所有的东西都要和"事件"关联起来.qooxdoo中的事件无处不在.比方property会触发updateProperty事件,XmlHttpLoader会触发n多个事件.QxTarget实现了事件的Listener注册/分发机制,QxEvent定义了一系列的事件对象.刚开始,不容易理解,弄久点,理解就容易一些了.
4.界面组件,所有的组件都继承自QxWidget对象,这个对象非常复杂,目前还没有看得太懂.但,这种结构让人觉得非常优雅.
QxData组件的小bug.对于一个高度依赖事件机制的框架来说,任何异常都要小心处理,比如,某个事件的结果是要移除监听器,当事件出现异常时,就会有比较怪异的现象发生.也就是说,即使内部出现了异常,也应该以合理的方式来处理,保证触发外部的事件.这样的话,才能减少出错的情况.
( 2005年06月16日, 11:19:41 上午 CST )Permalink留言 [3]
星期五 2005年05月13日
最近比较烦
最近发生了很多的事情,渐渐的有点不能沉淀下来专注于代码了. 持续了很长时间的旧代码重构工作,也渐渐的失去了动力和热情. 这样的情况,我对自己也很不满意.
但是,太多更高优先级的任务,人事的变迁,地理的转换,总是比技术本身更加损失人的热情. 也可以说我是在推卸责任吧,无所谓了.
现在的看法是,代码的腐朽,除了技术本身之外,很大程度上,也是管理的问题. 我们的代码,是怎样从当时的野心勃勃踌躇满志,一步一步的变成腐朽和恶臭的呢?
开会的讨论重构工作的时候,又提起了一些掌故,挺有意思的,值得一记.
且说这个代码当时的设计目标是另外一个"用户系统",压根就不是一个所谓的"业务系统",因为是用户系统的那帮人做的嘛.很多东西直接copy来就用了. 当时跑跑,未见什么异常.我相信没有程序员乐于写出恶心自己的代码,也许在这个时期,当时的代码也是有如透明的泉水,从山间活跃的流出.
后来,经历了第一次动荡,由一个市场部门的同学来领导.项目转移,人员自然也要发生变化. 之前设计整个架构的同学离开了team,只有一个参与的同志留了下来,自然也加入了一些新人. 此时,项目本身的目标也经历了巨大的转变.更多的促销,更多的优惠,调整价格策略,拉开产品线,更多的收费方式... 技术永远要服从于市场,时间常常都是技术的敌人,赶时间,抓进度,据过来的同志说,那是一个不堪回首的岁月.
忙乱之中生产的代码常常都是草率的,此时如果可以有一个缓冲时间的话,那么大家也许可以及时重构那些新鲜的垃圾代码.
可是,福无双至祸不单行,世界上的事情大多如此. 此时的搬家风波,让所有的人都没有心情优化自己的代码. 拖家带口的,让换去另外一个城市,谁乐意呢?
再然后,俺就进入了项目.野心勃勃的想要优化这些代码.当然,为了那些那些永远都不会结束的紧急任务,我放了更多的垃圾进来.
到如今,折腾了一个新地儿,光是上班的路程就已经让人疲于奔命.此时搬家风波再起,人心早已涣散, 代码重构?比起让人忧心忡忡的生存之计来,无良公司代码的味道好坏,于我又有什么意义呢?
稳定压倒一切,诚然也.
( 2005年05月13日, 06:06:36 下午 CST )Permalink留言 [2]
星期一 2005年04月18日
AJAX的RIA有希望!
上次提到,AJAX目前最大的问题在于----缺乏一个好的界面工具库.
这个基础库,必须:
跨浏览器
控件丰富
易于调试
开放源码
性能优秀
我一直认为,用JavaScript来实现这样的界面工具库,是一个Mission Impossible,直到我看到qooxdoo的demo.
这个project似乎很新,而且更新很快.很明显,它将会是ajax强有力的竞争武器.
且继续关注这个让人耳目一新的项目.
qooxdoo
( 2005年04月18日, 04:12:28 下午 CST )Permalink留言 [1]
星期五 2005年04月15日
将 Persistence 看作一个 Aspect?
刚弄到一本《精通AspectJ》,看了一部分.
其中的这些话引起了我的注意.
关于对象:"对象应该是一种自包含的单元,对象完全不理解自身所在的环境,而所处的环境应该也只能了解对象所暴露出来的东西",听起来让人想起了所谓的开闭原则或者IOC.
关于横切:"横切表示这样一种情况:若要满足系统某项需求,则要把代码放到系统的其他对象中,但这些代码并不直接关联于后者所定义的功能",这样的情况似乎很常见.
那么,persistence是不是一种横切(corsscut)呢?
RecordObject或者DomainObject,就其本质而言,是否有职责关注持久化?似乎没有必要,它表示的是一行数据(RecordObject)或者一个概念(DomainObject),它似乎并不需要理解持久化的处理.若要满足持久化的处理,(每个)持久类都需要增加代码,这些代码并不直接关联于它们本身定义的功能.代入之后,上面这句关于横切的话,显得很通顺,而且合乎情理.
转念一想,似乎的确如此,hibernate用到的cglib,本质上不就是一种Aspect的手段么,通过它将persistence的逻辑代码织入原有的对象.
这么想,再回头看Persistence,看法似乎不同了.
( 2005年04月15日, 04:11:13 下午 CST )Permalink留言 [0]
星期二 2005年03月22日
RIA? Flash or Ajax?
RIA在敲门...
通过各种渠道,我们大家都能听到它轰轰隆隆的动静.除非你身在火星.
那么,RIA会以一种什么样的方式到来呢?这是一个问题.
赛道上,FLASH和AJAX这两名领先的选手正在激烈竞争,其他的,XUL知名度不高,XAML光打雷不下雨,EclipseRCP/XWT/Thinlet/SwiXML/...这些都需要安装各种尺寸不等的运行环境(JRE/SWT/Applet/ActiveX),就在手边的,似乎也只有FLASH和AJAX,且来看看它们各自的参数吧:
运行环境:
FLASH的插件,宣称覆盖90%的浏览器.
AJAX理论值达到100%,这年头谁没有浏览器?但,IE/Mozilla彼此的兼容性让人头疼.
运行效率:
FLASH的东西普遍缓慢,无论是FLEX还是Laszlo的DEMO,一旦RUN起来,立刻感觉CPU心跳缓慢.
AJAX运行效率基本达到"无明显感觉"的阶段.
开发工具:
FLASH阵营有Laszlo和FLEX,FLEX更有MacroMedia提供的Designer.
AJAX大致还停留在汇编时代,调试基本靠Alert,娱乐基本靠手.
学习曲线:
FLASH的FLEX和Laszlo都是XUL系技术,学习曲线平滑,基本上,XML+Java就是了
AJAX让人望而生畏,搞个简单的东西确实不复杂,问题是什么都要从零开始."用汇编写整个GUI"?自信有这个能力的请举手,你写一个基本库来,俺们封你为偶像.
结论:目前,感觉都不成熟.FLASH方案的运行效率需要拼命优化.AJAX的兼容性和基础类库需要使劲丰富.两位选手,加油啊.
建议:想要在你的项目中RIA前卫一把?看看你的项目本身吧.
如果你的项目面对几乎所有人,如果你有熟悉Mozilla/IE方言的JavaScript高手,尽管AJAX吧.
如果你的客户相对固定,而且机器配置嗷嗷叫,正等着找些东西来啃,如果你有熟悉XML和Java的同志,不妨FLASH咯.
呃,如果你都没有?咳咳...,刚才说什么来着?XAML又延期了吗?
AJAX:GMail
Google Suggest
Google Maps
ORKUT
Panic Shoping Cart
FLASH:FLEX
Laszlo
( 2005年03月22日, 12:39:17 下午 CST )Permalink留言 [2]
星期五 2005年03月11日
RIA下PO的新问题
现在,大量的Web应用中,我们是怎么使用Persistence层的呢?比较流行的做法是----直接传递PO到View中显示.
这么做的好处非常明显,再也没有复杂的VO,DTO----这些东西怎么看都很有重复代码的嫌疑.如果只有一个Object当然要直观得多.没有了那些东西,自然也就不需要进行费劲的转换(如果没有合适的工具的话,那这就是一个体力活),当然也就简单了.
这通常没有什么问题.因为,大多数情况下,Web容器和Persistence代码都在一个JVM中运行,可以通过ThreadLocal获取Session,这样,可以LazyLoading到那些关联的属性.PO对象庞大的ObjectGraph始终都在同一个JVM中运行,没有传输和远程,一切都是那么美好.
可是----一旦说到可是,总没有好事----咱们不是马上就要奔RIA了吗,也就是说,Client端现在Rich了,那么,新环境,会不会有新问题呢?
答案是否定的.
各位,来认识一下RIA环境的情况吧.
1. 客户端是有脑的,也就是说,你不能象Browser一样,扔给我一个HTML字符串唬弄唬弄就了事,现在我要动用我的"计算能力"了,你至少要给我几个Object吧.
2. 通讯是有代价的,那就是说,如果我要一个小的东西,你也照样扔给我一大堆(ObjectGraph),虽说也可以跑,但是要在网络上传输这样的大家伙,可不要指望能我跑得快.
简而言之,也就是说,在RIA开创的新局面下,按照与时俱进的眼光来看,服务器递过来的,应该是大小合理的而且又是功能完备的Object.请注意,应该是小的Object,而不是大的ObjectGraph.
换个角度,如果把Web应用的View层看作一个Persistence代码的Client话,那么,一般的Web应用里,这个Client是Local的.而在RIA环境下,这个Client要Remote了.
于是,请大家打开"J2EE专家编程",翻到第xxx页----当,当,当,经典的"反模式"----DTO粉末登场了.
且慢!我们真的需要DTO吗?回忆一下那些累赘的Converter,那些编码编得想要抽自己EJB岁月,我们真的必须要这样做吗?
......
未完待续
( 2005年03月11日, 02:58:33 下午 CST )Permalink留言 [0]
星期一 2005年03月07日
Java的UI开发
最近对UI的东西比较有兴趣。RIA(Rich Internet Application),RCP(Rich Client Platform),Rxx...归根结底,也都是UI开发的事.
引入了界面逻辑,那就意味着与Web的"一页一个来回"完全不同的开发概念.很多东西颇不习惯呢.记下笔记,以免忘了. :P
1.Client自己完成大部分与用户的交互逻辑.
2.Client只是在需要的时候与Server通讯.
3.Client端需要有自己的MVC逻辑.
4.Client端的Widgets包装这些逻辑提供定制的组件.
5.组装Widgets得到Application.
看了看SWT,似乎很Cool的样子.可惜要DLL,让人觉得RCP得比较笨重.
Swing的界面被无数的人骂它缓慢而笨重.
目前比较看好Thinlet,几百K的Applet,而且界面很好看,还是很吸引的,但是它的组件化编码方式太弱了,很多东西都是脚本,似乎要自己来一套Event/Component机制.
还有什么选择呢?
... any suggestion?
( 2005年03月07日, 02:18:57 下午 CST )Permalink留言 [0]
星期一 2005年01月24日
XUL + JavaScript + XMLHTTP?
因为工作的关系,最近在试用一个基于 XMLHTTP+JavaScript 的框架,bstek 的 Extra.
它主要是一个 Client Side 的东西.大致上,就是以 JavaScript 的方式,提供了一系列的 GUI Widgets ,这些 Widgets 可以通过 XMLHTTP 同后端的 Service 进行交互.基本上是采取 Client Side 的 MVC 模式.有一个核心的 DataSet 对象,用以表达 M 的概念, V 和 C 则以 JavaScript 的 Widgets 形式提供.这些组件,与 M 通讯,当需要数据的时候, M 和 ServerSide 以 XMLHTTP 的方式交互.比如说,获取数据,分页等等.因为主要的部分就是 JavaScript 所以,大量的界面操作得以在浏览器中本地运行,数据也可以缓存在内存当中.如果设计合理应用得当,可以降低 XMLHTTP 交互的次数和数据量.不失为一个很好的应用基础.
概念很不错.可是,开发环境却不大理想.它的开发界面是一个定制好的 XML 设计器.所设计出的 XML 是作为系统输入,用以产生界面代码.但是,这个过程不彻底.所设计出的 XML 仅仅相当于显示逻辑中用到的元素集合.界面排列和组合仍然需要借助于 JSP 代码.
于是,就有了突然的灵感 ---- XUL 如何呢?
以 XUL 方式来定义界面,该界面被 render 为 DHTML + JavaScript 的代码,在浏览器中运行显示.这些 JavaScript 可以在需要的时候同 Service 通过 XMLHttp 通讯.这样的话,就摆脱了需要写 JSP 来摆放组件的尴尬局面.
转念一想 XUL 就是一个描述而已,它的 render 完全是另一个问题.你要 render 为 AWT 那就是 Thinlet ,你要 render 为 Swing 那就是 SwiXml ,如果要 render 为 DHTML+JavaScript 那就是这个了.
如何实现呢?这个要好好想想了...
( 2005年01月24日, 02:58:03 下午 CST )Permalink留言 [0]
星期二 2005年01月18日
权限系统新问题
权限的引擎是一个问题,引擎的应用是另一个问题.
一个通用的权限系统,应该可以不侵入的介入任何一个应用系统之中,或者说"嵌入"任何一个应用系统之中,不是权限系统要求应用系统如何如何,而是权限系统来符合应用系统对于权限的要求.
不要实现接口,不要继承父类,不要特定的类和方法命名规则...应用系统关注它自己就可以了.
权限系统来理解应用系统的业务,针对相关的操作,进行控制.也就是说,对于权限,应用系统是"无知的".
如何解决?
:)
( 2005年01月18日, 01:48:54 下午 CST )Permalink留言 [0]
星期二 2005年01月04日
JavaScript escape/unescape 编码的 Java 实现
上次贴出的 escape 的 java 实现,似乎对大家有用.最近曾军同学提出 unescape 对于 javascript 与后端的交互也有意义.于是就一并实现了.再次贴上来.
代码非常简单,注释就免了吧.一贯的,仍然遵循"以空间换时间"原则.
需要的桶子,一贯的,help yourself.
/** * JavaScript escape/unescape 编码的 Java 实现 * author jackyz * keep this copyright info while using this method by free */public class Escape { private final static String[] hex = { "00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F", "10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F", "20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F", "30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F", "40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F", "50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F", "60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F", "70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F", "80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F", "90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F", "A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF", "B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF", "C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF", "D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF", "E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF", "F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF" }; private final static byte[] val = { 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F }; public static String escape(String s) { StringBuffer sbuf = new StringBuffer(); int len = s.length(); for (int i = 0; i < len; i++) { int ch = s.charAt(i); if (ch == ‘ ‘) { // space : map to ‘+‘ sbuf.append(‘+‘); } else if (‘A‘ <= ch && ch <= ‘Z‘) { // ‘A‘..‘Z‘ : as it was sbuf.append((char)ch); } else if (‘a‘ <= ch && ch <= ‘z‘) { // ‘a‘..‘z‘ : as it was sbuf.append((char)ch); } else if (‘0‘ <= ch && ch <= ‘9‘) { // ‘0‘..‘9‘ : as it was sbuf.append((char)ch); } else if (ch == ‘-‘ || ch == ‘_‘ // unreserved : as it was || ch == ‘.‘ || ch == ‘!‘ || ch == ‘~‘ || ch == ‘*‘ || ch == ‘\‘‘ || ch == ‘(‘ || ch == ‘)‘) { sbuf.append((char)ch); } else if (ch <= 0x007F) { // other ASCII : map to %XX sbuf.append(‘%‘); sbuf.append(hex[ch]); } else { // unicode : map to %uXXXX sbuf.append(‘%‘); sbuf.append(‘u‘); sbuf.append(hex[(ch >>> 8)]); sbuf.append(hex[(0x00FF & ch)]); } } return sbuf.toString(); } public static String unescape(String s) { StringBuffer sbuf = new StringBuffer(); int i = 0; int len = s.length(); while (i < len) { int ch = s.charAt(i); if (ch == ‘+‘) { // + : map to ‘ ‘ sbuf.append(‘ ‘); } else if (‘A‘ <= ch && ch <= ‘Z‘) { // ‘A‘..‘Z‘ : as it was sbuf.append((char)ch); } else if (‘a‘ <= ch && ch <= ‘z‘) { // ‘a‘..‘z‘ : as it was sbuf.append((char)ch); } else if (‘0‘ <= ch && ch <= ‘9‘) { // ‘0‘..‘9‘ : as it was sbuf.append((char)ch); } else if (ch == ‘-‘ || ch == ‘_‘ // unreserved : as it was || ch == ‘.‘ || ch == ‘!‘ || ch == ‘~‘ || ch == ‘*‘ || ch == ‘\‘‘ || ch == ‘(‘ || ch == ‘)‘) { sbuf.append((char)ch); } else if (ch == ‘%‘) { int cint = 0; if (‘u‘ != s.charAt(i+1)) { // %XX : map to ascii(XX) cint = (cint << 4) | val[s.charAt(i+1)]; cint = (cint << 4) | val[s.charAt(i+2)]; i+=2; } else { // %uXXXX : map to unicode(XXXX) cint = (cint << 4) | val[s.charAt(i+2)]; cint = (cint << 4) | val[s.charAt(i+3)]; cint = (cint << 4) | val[s.charAt(i+4)]; cint = (cint << 4) | val[s.charAt(i+5)]; i+=5; } sbuf.append((char)cint); } i++; } return sbuf.toString(); } public static void main(String[] args) { String stest = "中文1234 abcd[]()<+>,.~\\"; System.out.println(stest); System.out.println(escape(stest)); System.out.println(unescape(escape(stest))); }}( 2005年01月04日, 06:55:35 下午 CST )Permalink留言 [1]
星期二 2004年12月28日
凌晨4点27分,果冻搬迁中...
凌晨4点27分,果冻搬迁中...
我们负责维护的系统要搬迁了,那个就像果冻一样的系统.
A服务器用Http调用B,B服务器用Http调用C,C服务器用Http调用----A!
不要奇怪,这就是果冻一样的系统.所谓牵一发而动全身,所谓十面埋伏,这就是了.
对于它的重构,已经不抱太大的希望了.只希望慢慢的,在保证它能够冒着烟的运行的前提下.渐渐的有一个可以动手改动的基础代码.
新的需求已经正式提出了.旧有的代码,却出奇的顽固,出现在任何地方,让你不敢贸然动手改任何东西.
人手不够是个足够的理由吗?不是吗?是吗?
管他呢,公司应该给俺们"恶臭补贴",FUCK!