David's profileprowyh's spaceBlogLists Tools Help

Blog


    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 + ";");
    }
    July 04

    wikipedia, really?

    偶然在iGoogle中发现了Wikipedia是可以访问的!
     
     
     
    我的天,这可真是不容易!