对联自动匹配

微软亚洲研究院出了一个对联自动匹配系统,春节回家需要你写对联的话,这也许还能用的上。网上搜到的对子一般都太俗,这个可以定制非常个性化的对联,你只要出上联,它就给你出下联和横批。这里先自恋一把。

对联

[ 分类: 动态 News ] 由 Pan 发表于 January 30, 2008 9:26 am  固定链接  评论( 2 )

复制大量文件的shell

google的sitemap服务端软件做性能测试时需要生成大量的文件

  1. #!/bin/bash
  2. #
  3. i=1
  4. while [ "$i" -le 300000 ]
  5. do
  6.         cp sample.html $i.html
  7.         echo copy succeed: $i.html
  8.         i=$((i + 1))
  9. done

执行以后大概会占用25G左右的磁盘空间。

[ 分类: 学习 Learning ] 由 Pan 发表于 January 29, 2008 10:56 am  固定链接  评论( 0 )

技术部活动和公司年会

1.2008年1月23日技术部组织去军都山滑雪。由于是第一次滑雪,屁股摔得极爽。滑雪确实很好玩,不过消费还是太高了,幸亏这次是公司掏钱,要是自己掏钱我就不去了。
2.2008年1月26日和27日公司在河北香河的中信国安第一城举办2007年度年会。年会上颁发的大奖都好诱惑人啊,明年争取能拿一个。今年没去年的温泉可以泡,开完年会都没啥可玩的,于是就在宾馆和同事一起打CS。

[ 分类: 动态 News ] 由 Pan 发表于 January 27, 2008 7:23 pm  固定链接  评论( 0 )

用Javascript操作硬盘文件

有一个日志文件格式是这样的4129,23|4074,25|4011,16|……每组以|分隔,前者是更新的模板ID,后者是该模板被关联的频道,需要统计模板的关联频道数并排序。

输入:
4129,23|4074,25|4011,16|……
输出:
模板ID 关联频道数
3261 871
523 824
2039 811
……

html代码

  1. <form>
  2. <input type="file" size="30" id="filePath" />
  3. <input type="button" value="分析" id="analyze" />
  4. </form>

javascript处理代码

  1. function $(el){ return document.getElementById(el);}
  2. var analyze = function(){
  3.     this.analyze = 'analyze';
  4.     this.filePath = 'filePath';
  5.     this.readFlag = 1;
  6.     this.writeFlag = 2;
  7.     //匹配数据组的正则表达式
  8.     this.regPattern = /^(\d+),(\d+)$/;
  9.     this.cache = {result:{},array:[]};
  10.     this.fso = new ActiveXObject("Scripting.FileSystemObject");
  11. };
  12. analyze.prototype = {
  13.     start:function(){
  14.         var _filePath = $(this.filePath).value;
  15.         var pairArray = this.read(_filePath).split('|'),pair = null;
  16.         for(var i = 0 ; i < pairArray.length ; i++){
  17.             //如果正则表达式匹配成功
  18.             //则pair[0]为全匹配,pair[1]为第一个子匹配,pair[2]为第二个子匹配
  19.             pairpairArray[i].match(this.regPattern);
  20.             if(pair){
  21.                 if(this.cache.result[pair[1]] != undefined && this.cache.result[pair[1]] != null)
  22.                     this.cache.result[pair[1]]++;
  23.                 else
  24.                     this.cache.result[pair[1]] = 1;
  25.             }
  26.         }
  27.         //从result拷贝到array,方便快速排序
  28.         for(var i in this.cache.result){
  29.             this.cache.array.push({templateId:i,channelCount:this.cache.result[i]});
  30.         }   
  31.         this.cache.array = this.quickSort(this.cache.array);
  32.         this.write(this.quickSort(this.cache.array),_filePath.replace('.txt','')+'_statistics.txt');
  33.         alert('done!');
  34.     },
  35.     read:function(filePath){
  36.         var _file = this.fso.OpenTextFile(filePath, this.readFlag);
  37.         var _string = _file.ReadAll();
  38.         _file.close();
  39.         return _string;
  40.     },
  41.     write:function(array,filePath){
  42.         var _file = this.fso.OpenTextFile(filePath, this.writeFlag,true);
  43.         _file.WriteLine('模板ID    关联频道数');
  44.         for(var i in array){
  45.             _file.WriteLine(this.digitFix(array[i]['templateId'],4)+'     '+ this.digitFix(array[i]['channelCount'],4));
  46.         }
  47.         _file.close();
  48.     },
  49.     quickSort:function(array,left,right){
  50.         if(left == null && right == null){ left = 0; right = array.length-1;}
  51.         var swap = function(i,j){
  52.             if(i==j) return;
  53.             var temp = _array[i];
  54.             _array[i] = _array[j];
  55.             _array[j] = temp;
  56.         }
  57.         var i, last,_array = array;
  58.         if (left >= right) return _array;
  59.         last = left;
  60.         for (i = left + 1; i <= right;i++ ){
  61.             if(this.compare(_array[i], _array[left]))
  62.                 swap(++last,i);
  63.         }
  64.         swap(left,last);
  65.         this.quickSort(_array,left,last-1);
  66.         this.quickSort(_array,last+1,right);
  67.         return _array;
  68.     },
  69.     compare:function(x,y){
  70.         return x['channelCount'] > y['channelCount'];
  71.     },
  72.     digitFix:function(number,count){
  73.         var _string = number + '';
  74.         var _count = count-_string.length;
  75.         for(var i = 0; i < _count; i++)
  76.             _string = ' ' + _string;
  77.         return _string;
  78.     },
  79.     bind:function(el,type,fn,range,params){
  80.         var _params = params == null || params.constructor != Array  ? [params] : params;
  81.         if (el.addEventListener)
  82.             el.addEventListener(type,function(){fn.apply(range,_params)}, false);
  83.         else
  84.             el.attachEvent("on"+type, function(){fn.apply(range,_params)});
  85.     },
  86.     init:function(){
  87.         this.bind($(this.analyze),'click',this.start,this);
  88.     }
  89. };
  90. var aa = new analyze();
  91. aa.init();
[ 分类: 学习 Learning ] 由 Pan 发表于 6:20 pm  固定链接  评论( 1 )

简单的Javascript日历

资讯频道的美国大选专题需要一个像CNN大选专题那样的选举日历功能。看了CNN的实现方式,觉得它的代码有点复杂,于是就自己写了一个简单通用的Javascript日历。主要思路是:
1.每一个表示日期的TD标签分配一个日期字符串的id,该字符串记录了TD标签所表示的日期;
2.当点击表示日期的TD标签后,在this.cache.selectedDates中保存该日期,并执行callback函数对日期进行处理;
3.每一个日历实例由this._MODULE_ID_唯一标识。
对应的主要函数分别是renderselectDatesetMoudleId

  1. //根据年份和日期呈现日历
  2. render:function(year,month){
  3.     this.preRender(year,month);
  4.     var date = new Date(year,month,1),dateString = '';
  5.     var dayCount = this.dayArray[month];
  6.     var preDayCount = date.getDay(),preDayCounter = preDayCount;
  7.     var afterDayCounter = (this.dayArray[month]+preDayCount)%7 == 0 ?
  8.             0 :
  9.             7-((this.dayArray[month]+preDayCount)%7);
  10.     var html = this.renderHeader()+'<div id="'
  11.              +this.properties.contentClass+this._MODULE_ID_+'" class="'
  12.              +this.properties.contentClass+'"><table>';
  13.     html += this.renderWeekdays();
  14.     html += '<tr>';
  15.    
  16.     //先补齐本月日期开始前的TD数
  17.     while(preDayCounter-- > 0) html += '<td>&nbsp;</td>';
  18.    
  19.     for(var i = 1; i <= dayCount; i++ ){
  20.         date = new Date(year,month,i);
  21.         dateString = this.dateToString(date);
  22.         //保存当前月的日期
  23.         this.cache.currentDateStrings.push(dateString);
  24.        
  25.         if(this.isSelectedDay(date) && this.isToday(date))
  26.             html += '<td class="'
  27.                  +this.properties.isDoubleDayClass+'" id="'
  28.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  29.         else if(this.isSelectedDay(date))
  30.             html += '<td class="'
  31.                  +this.properties.isSelectedClass+'" id="'
  32.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  33.         else if(this.isToday(date))
  34.             html += '<td class="'
  35.                  +this.properties.isTodayClass+'" id="'
  36.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  37.         else 
  38.             html += '<td class="'
  39.                  +this.properties.isDateClass+'" id="'
  40.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  41.         //如果满7个TD则换行
  42.         if((i+preDayCount) % 7 == 0) html += '</tr><tr>';
  43.     }
  44.    
  45.     //补齐本月日期结束后的TD数
  46.     while(afterDayCounter-- > 0) html += '<td>&nbsp;</td>';
  47.    
  48.     html += '</tr>';
  49.     html += '</table></div>';
  50.  
  51.     $(this.properties.holder).innerHTML = html;
  52.     this.attachEvent();
  53. }
  54. //根据TD和它的id选取日期
  55. //首先设置该TD的className改变其外观,然后在this.cache.selectedDates中增加该日期.
  56. selectDate:function(element,elementId){
  57.     if(this.properties.isMultipleSelect){
  58.         if(this.cache.selectedDates[elementId] == undefined){
  59.             element.className = this.properties.isSelectedClass;
  60.             this.cache.selectedDates[elementId] = true;
  61.         }
  62.         else 
  63.             this.deleteSelect(element,elementId);
  64.     }
  65.     else {
  66.         for(var i in this.cache.selectedDates)
  67.             this.deleteSelect($(i+this._MODULE_ID_),i);
  68.         element.className = this.properties.isSelectedClass;
  69.         this.cache.selectedDates[elementId] = true;
  70.     }
  71.     if(this.properties.callback!=null 
  72.        && this.isFunction(this.properties.callback)){
  73.         this.properties.callback(this);
  74.     }
  75. },
  76. //设置实例的唯一标识this._MODULE_ID_
  77. setMoudleId:function(){
  78.     var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  79.     for(var i = 0 ; i < 32; i++)
  80.         this._MODULE_ID_ += chars.charAt(Math.floor(Math.random()*62));
  81. }

如果要基于这个例子来修改的话
1.如果想只改改日历的外观,修改相关的css部分即可;
2.如果想应用日历输出数据,还得写一个callback函数处理选取后的数据;
2.如果想增加功能,可以分别在this.cache和this.properties里面增加你想要的数据和参数,在calendar.prototype中修改或者增加相关的函数。

在线浏览地址(第二个样式和PageFlakes日历控件外观差不多,并附有一个简单的callback函数):http://panweizeng.com/others/example/calendar-simple/
完整的Javascript代码:http://panweizeng.com/others/example/calendar-simple/calendar-common.js

[ 分类: 学习 Learning ] 由 Pan 发表于 5:28 pm  固定链接  评论( 0 )