| David's profileprowyh's spaceBlogLists | Help |
|
July 23 雨夜杭州小记杭州的事情已经耽搁得太久了。所以,上海的工作一经告一段落,就急急地赶往杭州……
2个小时之后,车到杭州东站。此时已是晚上8:30,又下着雨,正在踯躅着考虑要不要赶到市里。广场上散布着许多旅馆的拉客者,见我一个人,并非立马要走的样子,赶紧上前介绍旅馆。其中一个大妈,态度甚是诚恳,说旅馆如何如何好,价格如何如何便宜……
也许是性格上固有的弱点,很容易被“诚恳”所打动。反正明天一早还要到“千里之外”的下沙,暂且在这里住一晚也未尝不可,就答应大妈
去看看。
走到杭州邮政招待所门前,见大妈还要往前走,就说我先到这里看看。大妈眼看到手的生意要泡汤,连忙说:马上就到了,前面就是,还是那个好。旁边一蹬三轮车的也附和:还是那个好。
不管他们怎么说,我还是走进了邮政招待所。
已经很久没有住过招待所了。招待所,作为特定历史时期的特定形态,已经几近于消失。想起以前招待所时期的出差,必备的洗漱用品就占据了行囊中很大的空间,似乎是那么的遥远……
Reception一看我的身份证:呀,扬州好地方,我还没去过呢。我也趁机宣传起来:是啊,扬州的瘦西湖和你们的“胖”西湖比起来,是别有味道的。扬州出美女!古时候是有那么一说,不过据说当年乾隆下江南的时候,都被乾隆带走了……:)
之所以选择招待所而不是周围林立的宾馆,主要是考虑安全问题(身家性命都在电脑里,万一被贼拎走……),所以就顺便问起招待所的安全如何?Reception自豪地说:整个东站就我们一家是国有的,我们有24小时的监控录像。旁边的保安略带自嘲地说:我们这地方,那些小偷,让他们来,他们都不会来!呵呵,那是不是因为没人住啊?……:)
进到房间,还真是名副其实的招待所!除了卫生间和淋浴设施有点奢侈,以及墙上挂的裸体女人画反映着现时代的某些特点之外,与过去的招待所没有两样。只有暖壶,喝水要自己去打。不过,最让人匪夷所思的是,竟然没有茶叶!
以前看到过一张小报,宣传杭州的龙井茶,而且杭州扬言要做中国的茶都!
在这个“国家级”招待所里居然没有茶叶!
房间里没有电话,也懒得跑下楼去问服务员了。忽然想起来,以前的招待所里是没有茶叶的!这里没有,也算是名至实归了,不然,应该改名为“邮政宾馆”了……
只是……和“茶都”的豪气比起来,总不免让人心有戚戚焉……
2007-7-22雨夜11点记于杭州东站邮政招待所 July 10 JavaScript代码优化 如图为某信息系统的权限设置模块之用户界面:
如何获取用户的功能权限和对象权限的设置信息,还是大有讲究的。下面的代码列表1为未优化的JavaScript代码:
JavaScript Code List 1:
// non-optimized version
var functorList = new StringBuilder();
var objectList = new StringBuilder(); var coll = document.getElementsByTagName("INPUT"); // one pass scan to traverse the nodes collection coll to build functorList
for (var i = 0; i < coll.length; i++) { var _obj = coll[i]; if (_obj.type != "checkbox") continue; if (_obj.id.indexOf("functor_") >= 0 && _obj.checked == true) { var id = _obj.id; id = id.substring("functor_".length, id.length); functorList.append(id + ";"); } } // multi-pass scan to build objectList
for (var i = 0; i < coll.length; i++) { var _obj = coll[i]; if (_obj.type == "checkbox" && _obj.id.indexOf("object_") >= 0) { if (_obj.id.indexOf("_parent") > 0 || _obj.id.indexOf("_child") > 0) continue; if (_obj.id.indexOf("_r") > 0 || _obj.id.indexOf("_a") > 0 || _obj.id.indexOf("_m") > 0 || _obj.id.indexOf("_d") > 0) continue; var pid = _obj.id;
var gid = pid.replace(/object_/g, ""); var orList = new StringBuilder(); orList.append(gid + ":"); for (var k = 0; k < coll.length; k++) { var _objK = coll[k]; if (_objK.type == "checkbox" && _objK.id == pid + "_r" && _objK.checked) { for (var r = 0; r < coll.length; r++) { var _objR = coll[r]; if (_objR.type == "radio" && _objR.getAttribute("name") == "radio_" + gid + "_r" && _objR.checked) { orList.append("r_" + _objR.value + ":"); break; } } } else if (_objK.type == "checkbox" && _objK.id == pid + "_a" & _objK.checked) { orList.append("a_" + ":"); } else if (_objK.type == "checkbox" && _objK.id == pid + "_m" && _objK.checked) { for (var m = 0; m < coll.length; m++) { var _objM = coll[m]; if (_objM.type == "radio" && _objM.getAttribute("name") == "radio_" + gid + "_m" && _objM.checked) { orList.append("m_" + _objM.value + ":"); break; } } } else if (_objK.type == "checkbox" && _objK.id == pid + "_d" && _objK.checked) { for (var d = 0; d < coll.length; d++) { var _objD = coll[d]; if (_objD.type == "radio" && _objD.getAttribute("name") == "radio_" + gid + "_d" && _objD.checked) { orList.append("d_" + _objD.value + ":"); break; } } } } objectList.append(orList.toString() + ";"); } } JavaScript Code List 2是优化后的代码:
// optimized version
var functorListEx = new StringBuilder();
var objectListEx = new StringBuilder(); var coll = document.getElementsByTagName("INPUT"); // regular expression for matching
var fnRE = /functor_[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}/i; var objRE = /object_[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/i; var objRE_r = /radio_[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}_r/i; var objRE_a = /object_[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}_a/i; var objRE_m = /radio_[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}_m/i; var objRE_d = /radio_[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}_d/i; // helper data structures used by optimized algorithm
var aryObjList = new Array(); var aryRList = new Array(); var aryAList = new Array(); var aryMList = new Array(); var aryDList = new Array(); // one pass scan to traverse the nodes collection (coll) to build functorListEx
// and intermediate arrays for (var i = 0; i < coll.length; i++) { var _obj = coll[i]; if (_obj.type != "checkbox" && _obj.type != "radio") continue; var _match; if (_obj.checked && (_match = _obj.id.match(fnRE)) != null) { functorListEx.append(_match[0].split("_")[1] + ";"); } else if (_obj.checked && (_match = _obj.name.match(objRE_r)) != null) { aryRList[_match[0].split("_")[1]] = "r_" + _obj.value; } else if (_obj.checked && (_match = _obj.id.match(objRE_a)) != null) { aryAList[_match[0].split("_")[1]] = "a_"; } else if (_obj.checked && (_match = _obj.name.match(objRE_m)) != null) { aryMList[_match[0].split("_")[1]] = "m_" + _obj.value; } else if (_obj.checked && (_match = _obj.name.match(objRE_d)) != null) { aryDList[_match[0].split("_")[1]] = "d_" + obj.value; } else if (_obj.checked && (_match = _obj.id.match(objRE)) != null) { aryObjList.push(_match[0].split("_")[1]); } } // further process to build objectListEx from the intermediate arrays
for (var i = 0; i < aryObjList.length; i++) { var _id = aryObjList[i]; var _r = aryRList[_id] == null ? "" : aryRList[_id]; var _a = aryAList[_id] == null ? "" : aryAList[_id]; var _m = aryMList[_id] == null ? "" : aryMList[_id]; var _d = aryDList[_id] == null ? "" : aryDList[_id]; objectListEx.append(_id + ":" + _r + ":" + _a + ":" + _m + ":" + _d + ";"); } 【注】文见JavaScript代码优化一例(文)。 |
|
|