2007年12月31日星期一

辞旧:年终了结

人都说本命年的命不好,12年前的第一个本命年我没有在意,但今年看来,似乎确实如此。大概是我没有穿红色内裤的缘故,本来年初收到一双红色的踩小人的小袜子,不过由于实在太小,属于儿童型的服饰,一直被晾在衣柜的角落,直到搬家扔掉。
 
12岁时我因为不知情,过去了也就算了;24岁时我风华正茂,有这样新潮穿法的勇气,但是却因为不信这一套而未曾这样实施;36岁时我也许会相信命运,但是我还会有这样的勇气吗,未得而知。
 
还好,诸事不顺的2007年一晃而将过,2008年近在咫尺,在这剩余的几十分钟里,大概没有办法展望未来,暂作此文算为今年做个了结。
 
 
虽说本命年诸事不顺,但是孰人未可知会因祸得福呢!   2008,积极进取吧。
ps. 今天弄到了两卷《Java2核心技术》第七版中文版的电子书,新的一年,新的开始,经过荒废了的一年,再把自己当作初学者,从新杀入新的历程。不折不挠,坚定不移。

2007年12月30日星期日

(Javascript) 阶乘改进算法

最近对数学再返无穷兴趣,在一个数学方面极好的博客上读得关于阶乘计算的好文,就把其中一个较易实现的改进算法发布如下(Javascript实现):

/**
 * 求阶乘的改进算法。
 * 循环求积次数减少一半,但是求平方时增加开销,在IE6,Firefox2,Safari3下测试求170的阶乘
 * (大于170的阶乘结果为Infinity,没有实际意义)均比简单求积方法少不到10毫秒。
 * 求小于50的阶乘的效率表现有时不如直接使用简单的累乘方法。
 * @param {Number, Integer} n 求阶乘的目标整数。
 * @see <a href=" http://www.matrix67.com/blog/article.asp?id=442">计算阶乘的另一些有趣的算法</a>,
 *  <a href=" http://www.luschny.de/math/factorial/index.html">巨牛,20多种阶乘算法的代码</a>
 */
Math.factorial_II = function(n){
     if (n===0){return 1;}
     if (!n.isPositiveInteger()){throw new Error("param error.")}
     var m=(n.isOdd()?(n+1):n)/2; // middle number.
     var r = n.isOdd()?m:m*n; //result;
     for (var i=1; i<m; i++){
         //r*=(Math.pow(m,2) - Math.pow(i,2)); // Math.pow方法求平方比两个数直接相乘的效率低很多。
         r*=(m*m - i*i);
     }
     return r;
};

/**
 * 判断当前数值对象是否是整数。
 * @return {Boolean} true,如果数值是整数,否则返回false。
 */
Number.prototype.isInteger = function(){
    return /^[+-]?\d+$/.test(this);
};

/**
 * 判断数值是否是为负数。
 * @return {Boolean} true,如果数值是负数,否则返回false。
 */
Number.prototype.isNegative = function(){
    return this<0;
};

/**
 * 判断数值是否为负整数。
 * @return {Boolean} true,如果数值为负整数,否则返回false。
 */
Number.prototype.isNegativeInteger = function(){
    return this.isNegative() && this.isInteger();
};

/**
 * 判断当前数字的值是否为奇数(定义:不能被2整除的(整)数,如1,3和5)。
 * 关于零(0)是否属于偶数,目前似乎尚无定论,这里不予理会,作为偶数处理。
 * @return {Boolean} true,如果当前值是奇数,否则,返回false。
 */
Number.prototype.isOdd = function(){
    /* Javascript整除(取模)运算:
     * 被除数为正整数时,结果为0或1;
     *       为负整数时,结果为0或-1;
     *       为0时,结果为0;
     *       为小数时,结果为正或负小数。
     */
    return this.isInteger() && ((this%2)!==0);
};

 

2007年11月21日星期三

Nike 之考试篇

I:
每当我考试,砍下八九十分,在考场上随心所欲地发挥,拿下两届的学年第一。你还真以为那是我一个人干的?不过说真的!考试是一帮人的....

II:
期中考试考场.... 不对,是期末考试,离交卷时间还剩下20秒,麦迪打算作弊。系主任就站在他的旁边,瞎扯,是校长~随便吧,反正他把纸条传出去了....还剩10秒,麦迪拿到了答案!最后3秒,他还需要一道填空题!答案传过来了,整个考场都试图阻止他!但他抄了起来~是左手!天啊!连老师都感动得哭了。

但那张纸上写着:我也不会.... 是的,当时就是这样。

2007年10月26日星期五

玉皇山游记

午饭过后,老许突然问我有没有登到过玉皇山顶,得到否定的回答后,我们决定换一下衣服就从小路逃票登山。

逃票很成功,因为老许上次做过同样的事情,比较有经验。

整座山不是很高,而且有石板路可以供汽车行驶至山顶。不过我们是一直通过小路步行至山顶,然后又步行下山。山虽不高,不过一路下来,也比较累,尤其昨晚通宵,下山的时候我的眼睛已经快要撑不开了,巴不得就地趴下呼呼大睡。

下面发一些用577W 130W像素摄像头拍摄的照片,由于新刷的系统中带的拍照软件不好控制,照片不是很理想,不过有我拍摄技术上的补救,还是有几张不太赖的。


秋菊
秋菊

江湖一览
江湖一览

玉皇山巅俯瞰众山
玉皇山巅俯瞰众山

云池,金鱼
云池,金鱼

登云阁
登云阁

参天大树
参天大树

至此,我也掌握了在玉皇山逃票的经验。
  1. 早6点之前;
  2. 晚6点之后;
  3. 走无人看管的小路。

小时候家里很穷 - 有意思的签名

 
看到一个网友的QQ签名很有意思,收藏引用如下:
小时侯,我家里很穷,没钱买自行车,我只好每天打的上学。
初中的时候,因为我成绩太突出,学校领导留我多读了两年。
初中毕业后,高中的校长觉得我很有前途,就多收了我2万5。
高三的时候,班主任认为我已经有独立生存的能力,于是让我退了学。
 

2007年10月23日星期二

blogspot.com与Google DNS服务器解封了

在深圳的时候,blogspot.com大多时间被封掉,我通过Google DNS服务器将自己的blog.xianyun.org域名绑定到自己的blogger.com博客(xianyunG.blogspot.com)。一直得意于此法,心想:让你疯(封)。

后来到杭州后才发现blog.xianyun.org同样无法访问,原来是Google DNS服务器也被封了。网上问了一些朋友知道,宁波,辽宁,南昌等地方也同样无法访问。从此,博客都懒得写了。

前不几天,blogspot.com解封了;今天,又发现Google DNS服务器也可以继续在杭州访问了。很好。

问题不在于禁和封,疏导才是明智之举,谢谢。

2007年10月16日星期二

使用jsdoc建立javascript文档


刚刚使用jsdoc实验/学习创建了javascript文档,这里写一点基本的记录。
 
jsdoc的sourceforge项目地址:http://jsdoc.sourceforge.net/
 
安装和使用
 
安装应该说比较简单,可以参考用JSDoc建立有益的JavaScript相关文档。为防止链接失效,这里拷贝一个文本备份:
 

不管因为什么原因,不给一个应用程序建立文档都不是一件好事,即使建立文档的工作一般令人厌烦。在给客户端JavaScript建立文档时尤其如此;与服务器端技术相比,客户端JavaScript通常被人们认为是前者的一个丑陋的继子。有趣的是,JavaScript文档问题的解决办法却来自一个非常相似的服务器端技术――Java。

有一个非常简洁的工具叫做Javadoc,可帮助Java开发者生成文档。这个工具还有一个JavaScript版本―― JSDoc,它可用于开发HTML文档,不仅帮助你给代码建立文档,而且有助于预防一些问题,如几个函数或对象基本上实现相同的功能,以及缺乏一般性的库知识。本教程将为你说明如何安装和使用JSDoc,以给JavaScript创建文档。

安装JSDoc
遗憾的是,安装JSDoc并不十分简单。这主要是因为它是用Perl编写的,因此除非你已经安装了Perl,否则就需要一两个额外的步骤。由于我最近在笔记本电脑上安装了Windows XP Pro,我自己就经历过这些额外的步骤。首先我必须下载和安装 ActivePerl,它是一个msi文件。A显示了一部分安装过程[图略]。(注:双击运行msi文件,使用默认设置即可)

成功安装ActivePerl后,接下来就要下载和解压JSDoc。这时,你可能会在一个DOS窗口中运行JSDoc,但如果你这样做,它可能无法运行。这是因为你缺少一个Perl软件包,如B所示[图略](注:错误提示为Can't locate HTML/Template.pm in @INC ..... )。幸运的是,你可以在同一个窗口中输入ppm调用Perl软件包管理器,如C所示[图略]

使用Perl软件包管理器,你就可以安装缺少的HTML-模板软件包,如D所示。[图略](注:点击工具栏View All packages[Ctr+1]按钮,在搜索框输入HTML-Template,选中列表中的HTML-Template项,如果它前面的图标是灰色的,右键并点击出现的唯一菜单项 Install HTML-Template安装,也可以标记然后安装)
(又注:网上有"在Dos窗口输入ppm命令,然后
PPM> install HTML-Template
PPM> quit "的做法,不过我下载的1.10.2版输入ppm就会弹出软件包管理器,命令行不可输入)

使用JSDoc

表中列出了一些你可以在JavaScript文档中使用的标签。

标签

描述

@addon

把一个函数标记为另一个函数的扩张,另一个函数的定义不在源文件中。

@argument

用大括号中的自变量类型描述一个自变量。

@author

函数/类作者的姓名。

@base

如果类是继承得来,定义提供的类名称。

@class

用来给一个类提供描述,不能用于构造器的文档中。

@constructor

描述一个类的构造器。

@deprecated

表示函数/类已被忽略。

@exception

描述函数/类产生的一个错误。

@exec

 

@extends

表示派生出当前类的另一个类。

@fileoverview

表示文档块将用于描述当前文件。这个标签应该放在其它任何标签之前。

@final

指出函数/类。

@ignore

让JSDoc忽视随后的代码。

@link

类似于@link标签,用于连接许多其它页面。

@member

定义随后的函数为提供的类名称的一个成员。

@param

用大括号中的参数类型描述一个参数。

@private

表示函数/类为私有,不应包含在生成的文档中。

@requires

表示需要另一个函数/类。

@return

描述一个函数的返回值。

@returns

描述一个函数的返回值。

@see

连接到另一个函数/类。

@throws

描述函数/类可能产生的错误。

@type

指定函数/成员的返回类型。

@version

函数/类的版本号。

除上面提供的信息外,在JSDoc.pl命令后增加-h或-help选项,就会显示在生成文档时可以使用的选项列表。G显示的是使用帮助选项的结果。

命令行进入JsDoc根目录,输入命令:
> perl jsdoc.pl test.js tes2.js
默认安装perl会设置将perl安装路径放入系统环境变量,这样你可以在任意路径中使用perl命令。如果你想在任意目录找到jsdoc.pl,可以将jsdoc安装目录设置到系统环境变量中。可以批量为javascript源代码生成文档。

 

乱码问题

默认情况下生成中文文档会出现乱码,如果你查看文档源代码就会发现,源代码本没有乱码,你只需要在JSDoc文档模板(根目录下所有的tmpl文件,有的版本可能在JSDoc子目录下)头部加上META标记并重新生成文档即可。
<meta http-equiv="content-type" content="text/html; charset=gb2312" />
其中粗体gb2312可以换成Big5,UTF-8之类,请设置为与javascript源代码文件编码格式相同
see http://caterpillar.onlyfun.net/GossipCN/AjaxGossip/JSDocBig5.html

 

集成到Editplus

点击菜单栏工具,选择配置用户工具
菜单文本:jsdoc (可随意)
命令:perl                              (如果没有设置perl的环境变量,请指定到%PERL_HOME%\bin\perl.exe )
参数:jsdoc.pl $(FileName)    (如没有设置jsdoc的环境变量,使用%JSDOC_HOME%\jsdoc.pl $(FileName) )
初始目录:$(FileDir)
 
其他设置按照个人习惯酌情设置。
 

2007年10月11日星期四

好贵的新车


我有新车了,好贵的,9块钱,本来我只花4块就搞定的...
 

2007年10月9日星期二

深入Javascript对象比较(一) - 概述

 

概述

 

1.1 类型

 

Javascript 数据类型分为值类型引用类型,其中值类型包括字符串实体(例如:"string" ),数值实体(例如:100 )和布尔值实体(如:true )。而其他的复杂类型都属于引用类型,例如日期型( new Date() ),正则表达式(/a/gi, new RegExp("a", "gi") )数组( [1,2,3], new Array() )函数(function(){}, new Function() )和对象({a:"a", b:100}, new Object() )。这些都是Javascript 固有的数据类型,而用户自定义类型都属于引用类型(如:var Person = function(name){this.name=name;}; ),它们都只能使用new 关键字实例化为具体对象(new Person("hotoo") )。

 

为了理解Javascript 对象的类型,我们来看一些如下代码:

// test instanceof and typeof:

var instStr = ['"string"', '100' , 'true', '/a/g' , '[1,2,3]' , 'function(){}', '{}', 'null', 'undefined' ];

var inst = ["string", 100, true, /a/g, [1 ,2,3 ], function (){}, {}, null, undefined];

var ObjsStr = ["String", "Number" , "Boolean", "RegExp" , "Array", "Function", "Date" , "Object"];

var Objs = [String, Number , Boolean, RegExp, Array, Function, Date, Object];

jsoutInst ( "instanceof" , ObjsStr, Objs , instStr, inst);

 

 

 

function jsoutInst (methodName, tsStr , ts , osStr, os ){

    document.write ("<table border='1'><tr>" );

    document.write ("<td><strong>" +methodName+ "</strong></td>" );

    for (var i= 0; i< tsStr. length; i++){

       document.write ("<td>" +tsStr[i ]+"</td>" );

    }

    document.write ("</tr>" );

    for (var i= 0; i< os. length; i++){

       document.write ("<tr><td>" +osStr[i ]+"</td>" );

       for (var j= 0; j< ts. length; j ++){

           document.write ("<td>" +(os[i ] instanceof ts[j]? "<strong>true</strong>" :"false")+"</td>" );

       }

       document.write ("</tr>" );

    }

    document.write ("</table><br />" );

}

 

var typesStr = ["string", "number" , "boolean", "array" , "function", "date", "object" , "undefined"];

jsoutType ( "typeof" , typesStr, instStr , inst);

function jsoutType (methodName, tsStr , osStr , os){

    document.write ("<table border='1'><tr>" );

    document.write ("<td><strong>" +methodName+ "</strong></td>" );

    for (var i= 0; i< tsStr. length; i++){

       document.write ("<td>" +tsStr[i ]+"</td>" );

    }

    document.write ("</tr>" );

    for (var i= 0; i< os. length; i++){

       document.write ("<tr><td>" +osStr[i ]+"</td>" );

       for (var j= 0; j< tsStr. length; j ++){

           document.write ("<td>" +(typeof os[ i] == tsStr[ j]?"<strong>true</strong>" :"false" )+"</td>" );

       }

       document.write ("</tr>" );

    }

    document.write ("</table><br />" );

}

上面的代码很简单,第一个函数判断对象实例是否是某个类的实例(instanceof ),第二个函数对比对象实例是否与某类型(typeof )相等,他们将输出两个表格,我们来对比一下(为了方便阅读,这里将说明插在相应表格下。 )。


instanceof String Number Boolean RegExp Array Function Date Object
"string" false false false false false false false false
100 false false false false false false false false
true false false false false false false false false
/a/g false false false true false false false true
[1,2,3] false false false false true false false true
function(){} false false false false false true false true
{} false false false false false false false true
null false false false false false false false false
undefined false false false false false false false false

 

通过(instanceof )这个表格可以看出,值类型( "string", 100, true 等)不是任何对象的实体(instance ),而引用类型(/a/g, [1,2,3], function(){} {} )既是本身类型的实体,又是其父类型的实体(所有类型都继承自Object 类型)。

所有通过引用类型(包括值类型的wrapperString, Number Booleannew 出来的对象,都是其对应类和其父类(这里是Object )的实例。

虽然值类型不是其对应wrapper 类的实例,但是值类型却可以直接使用其wrapper 类的属性和方法,就如同值类型是其 wrapper 类的实例一样。例如:"ABC".toLowerCase()

 

typeof string number boolean array function date object undefined
"string" true false false false false false false false
100 false true false false false false false false
true false false true false false false false false
/a/g false false false false false false true false
[1,2,3] false false false false false false true false
function(){} false false false false true false false false
{} false false false false false false true false
null false false false false false false true false
undefined false false false false false false false true

 

2007年9月1日星期六

Blog Day - 博客日

本人特懒,平常比较少关注这些东西。今天看到robin日志,才知道昨天(8/31)是个什么鬼Blog Day,为时晚矣。
 
不过还好,昨天晚上写了很长时间以来的第一篇日记,这第一篇日记算作日记的序,没记下什么秘密,可以发布出来权当纪念Blog Day。
 

/** 重拾笔根
 * @date 2007-8-31
 * @weather 晴,傍晚稍有阴霾。
 * @author 闲耘(xianyun.org, hotoo.cn[AT]gmail.com)
 */

其实我早有重拾笔根,再写日记之意;日前又看得一位大概是台湾的仁兄,提到关于自己的日记的种种玩笑,思考,和收获,我也渐觉手痒起来。意欲重新提笔,为自己的卑微人生留下几许痕迹。

日记不同于博客,这里可以写下内心深处的秘密,欲望,和其他;不必,大概也不该写下违心的谎言。生活中我力求简单,但是出于愚蠢,虚伪或自我保护,我总是不时的拾起谎言,企图掩饰和麻痹自己,希望在这里我可以重归简单,展现真我。感谢这片还算纯洁的土地,让我种植心灵,培养心胸。

日记最好手写在纸质本子上,但是最近一直堕于上街,也没碰巧看中什么好的本子,就暂时写在这本本上,他日再撰抄到本子上。

谨记:每日只需一篇,数十字或数百字即可,敬请坚持。


 

ps:
BlogDay是什么?
BlogDay起源于Bloggers认为自己应该有一个专门的节日,以认识其他来自于不同国度或拥有各种不同嗜好、兴趣的博客。在BlogDay当天,所有参与活动的博客应该在自己的站上推出五个具有特色的Blogs给所有来访问的朋友,藉此和大家分享更多新而有趣的博客。

BlogDay这天会发生什么事?
在八月三十一日这一天内,全世界参与活动的Blog都会发表一篇文章推荐五个新颖的Blog,而且最好这五个Blog的内容可能是来自不同的文化、观点和型态。而所有造访的朋友都可以在八月三十一日当天发现自己前所未知的Blog,藉此认识更多Blogger并为这些新发现而庆祝。


2007年8月28日星期二

文件系统标签结构随想

随着标签的广泛/普遍应用,标签和实用价值越来越得到体现。
 
标签结构不同于目录结构,它没有明确的层次结构,并且没有唯一性问题(文件可以帖上多个不同标签)。
 
使用操作系统文件系统目录结构,可以带来许多好处:比如音乐子目录可以这样明确的分类:子目录华人男歌手、华人女歌手、欧美歌手...等分类,孙子目录下可以按照歌手名分目录,曾孙目录下可以按专辑分目录。
 
但是也因此有许多功能受到限制。当遇到相对模糊的情况时,则会比较难以取舍。一来目录的层次结构会根据用户的喜好而有所不同;二来,文件可以存放在一个语义的目录结构下,也许也可以存放在另一个语义的目录下。
 
出现这种情况时,可以通过快捷方式来模拟,或者使用辅助软件(播放器的播放列表,图片管理软件如Picasa的相册)。
 
 
如果在文件级别实现更为明确的标签功能,则可以方便管理所有单个文件或一组文件(如目录)的标签管理,再加上类似Gmail支持基于标签,目录(Gmail没有目录)和关键字(如果支持内容关键字则更完美)的搜索,wa..
 
 
不过如果提供管理软件外部支持或是模拟实现,也蛮是有用。比如我现在最需要的就是一款文档管理软件,最好他能支持"主流"文档类型(pdf, pdg, chm, htm, html, txt,),在统一界面下查阅文档,提供文档灵活分类模式(系统目录模式(模拟书架),标签模式),提供文档索引搜索能力。
 
除了搜索相关,其他功能类似播放软件(统一界面播放,统一操作)和图片管理软件(统一界面查看,编辑)。
 
但是问题是,如果文件被移动或删除或更名,播放列表和相册等都必须监听或扫描文件/目录。也许系统级提供类似实现,将标签存储在文件属性或其他属于文件本身的资源在,才是最为合理的设计。

作为非系统程序员,可以考虑实现这样的文档管理软件:1.尽量支持多种文档格式;2.用户自定义监听目录;3.文档索引,提供快捷的搜索(本地搜索的索引应该进行全面的索引,例如Javascript程序员可能需要搜索js源代码,而现在的Google本地搜索却忽略这些文本内容。)。
 
 
以上所有皆随想。

2007年7月24日星期二

我记得/记得我

- 你还会记得我吗?
- 唔,大概不会。
- 安慰一下我也好嘛!
- 我没有记住你,这不是我的错,而是你的问题。你没有让我记住你,说明你做的还不够。
 
 
ps: 要被记得,至少要选做下列一项:
1. 关心/照顾他/她/它;
2. 和他/她/它生活在一起;
3. 和他/她/它说话。

你让他/她/它记得你什么呢?

2007年7月7日星期六

(Javascript) HTAutoComplete:不要进行词法分析

Keep It Simple, Stupid. (保持简单,保持拙。)
 
上篇关于AutoComplete控件的思考中提到为了设计一个万能的自动完成控件,要对HTAutoComplete进行词/语法分析的想法,现在我改变主意了,那是一个自作聪明的愚蠢想法。
 
举个简单的例子,对于用户输入的如下文本,应该如何理解呢(允许输入引号本身,粗体表示)?
"a,b",c
可以有两种取词方式,
("a)(b")(c)
("a,b")(c)
我们该如何选择?
 
再复杂一点,对于引号不成对的输入:
"a,b",c"
更复杂一些:
",a,b,",c,"

换个符号对?
(a,b),c

You Can't Write Perfect Software. (你不可能写出完美的软件。)
由于允许输入特殊符号本身,和用特殊符号来分词本身就很矛盾和复杂。而一个Javascript控件,一个帮助工具,没有必要做成无所不能。提供的功能越多,所受的制约就越多。

我的建议:
1. 帮助类只帮助;
2. 让服务器去万能。

 

2007年7月5日星期四

关于AutoComplete控件的思考

一,现有控件的问题。

最近初步完成了两个自动完成的控件,最原始的HTAutoComplete暂时只完成了最基本的功能,大多细节都没有时间去考虑,而主要精力都放在HTAutoComplete2这个控件上。HTAutoComplete2是一个主要用来帮助用户在一个文本框内自动完成输入一个或多个字符/串的控件,主要用途可以是多标签的输入。

完成了beta版后,有些朋友提出了各种问题,建议和意见,都很值得思考。

其中最为典型的问题是输入特殊字符和特殊输入的问题,一般的特殊字符(如Javascript正则表达式用的特殊字符等)基本都考虑到并一定程度上得到解决。但是由于最初设计上的"硬伤"和基于"K.I.S.S."原则上的考虑,像需要输入所有字符/串的需求似乎有点困难和没有必要。

问题:
现有beta版的控件上,已知还有一个特殊字符没有彻底解决——分隔符。没有办法获得分隔符本身,因为现在的版本只取得分隔符之间的字符/串。

方案:
可以将分隔符放在引号或者其他符号对中,如果这样,就需要进行语法分析,可以使用正则表达完成,理论上不是问题。

最后,现有控件需要进一步进行抽象和解耦。


二,进一步抽象。

自动完成的本质是什么?怎么进行抽象?

自动完成控件无非就是帮助用户更方便的输入,所以写自动完成控件需要做的就是这样:
捕获需要自动完成的关键字;
与候选匹配项进行匹配;
返回并呈现匹配结果;
用户使用更方便的方法选中返回的候选匹配选项
自动完成替换,自动完成功能结束。
所以可以定义一个抽象的自动完成类,其他自动完成实例可以从这个抽象类继承,各个实例通过覆写抽象类的方法来完成自动完成工作。

2007年6月29日星期五

(javascript) 字符/串大小写反转

在封装一个模拟Google风格的多标签自动完成类之余,写了这个字符/串大小写反转方法(Google搜索了一下,暂没发现有写这个方法的),如果有用,请自用之;发现问题,请指教之。
 
var Character = function(character){ // 单个字符类
    if (character.length != 1){
        throw Error("[Error:Arguments error.\nclass:org.xianyun.Character]");
    }
    this.value = character; // private:
    this.charCode = character.charCodeAt(0); // public:readonly.
};
Character.reverseCase = function(character){ // 单个字符大小写反转,静态方法。
    var charCode = character.charCodeAt(0);
    if (charCode>=65 && charCode<=90){ // A-Z
        return String.fromCharCode(charCode + 32);
    }else if(charCode>=97 && charCode<=122){ // a-z
        return String.fromCharCode(charCode - 32);
    }else {
        return character;
    }
};
Character.prototype.reverseCase = function(){ // 单个字符大小写反转,成员方法。
    return Character.reverseCase(this.value);
};

 

String.prototype.reverse = function(){ // 字符串顺序反转。
    var s = "";
    for (var i=this.length-1; i>=0; i--){
        s += this.charAt(i);
    }
    return s;
};

String.prototype.reverseCase = function(){ // 字符串大小写反转
    var s = "";
    for (var i=0; i<this.length; i++){
        s += Character.reverseCase(this.charAt(i));
        //s += new Character(this.charAt(i)).reverseCase();
    }
    return s;
};

写给红颜知己

好了,结束了;或者,是有了一个崭新而不同的开始。
 
说实在的,我的确蛮喜欢你的,喜欢你大方的性格和成熟的心态,喜欢你朴素美丽的面庞和匀称健美的身材。
 
当然,我现在是没法去追求你的,像你这样美好的人儿,癞蛤蟆能远远看一眼就已经很奢侈了。追你,也许要等到下辈子吧,等下辈子我漂亮到可以令你迷倒在牛仔裤下,或是富有得可以用金子把你砸晕时,我再来自信的追求你。
 
很幸运,就这样不明不白、悄无声息地结束;正如她潜移默化,毫无预感的来临。有一点暗恋的幸福,却没有失恋的痛楚。或许这也算是爱情吧,比这更动人的爱情,大都比这更痛楚;而"有情人终成眷属"更不是爱情,那是婚姻。哈,谬论。
 
蓝颜知己、情人、老公,都是不错的角色。恩,真好。
 
再见!
 
--
2007/06/28 深夜,于深圳,闲耘。

2007年6月26日星期二

(Cpp) 5矮人分果

// from http://www.cppblog.com/mythma/archive/2007/06/25/26923.html
/**题:
 * 话说有五个小矮人上山摘野果,摘回来后平均分,可是怎么也分不下去.因为分不平均.
 * 到了晚上,一个小矮人爬起来,从里面扔了一个, 刚好能平均分成五份.然后他把自己的那份藏起来,就睡觉去了.
 * 第二个小矮个也爬了起来,也把果子扔了一个后刚好分成5份,他也把自己那份藏了起来.然后睡觉,
 * 余下3 个小矮人都是这样做的,过程完全一样. 请问,最初这堆果子至少有多少个?
 */
/**解:
 * 设共有total个野果;
 * 第1个矮人拿走 (total-1)/5 个野果,此时剩下 (total - 1)/5*4 个野果;
 * 第2个矮人拿走 ((total-1)/5*4 - 1)/5 个野果,剩下 ((total-1)/5*4 - 1)/5*4 个野果;
 * 以此类推...
 */
#include <iostream>
using namespace std;

int getTotal(){
    int total = 1; // 设初始野果总数1个
    while (true){
        int _t = total;
        for (int i = 1; i <= 5; i++){
            if ((_t - 1) % 5 == 0){ // 条件:扔掉1个能够5等分
                _t = (_t - 1) / 5 * 4; // 第i个矮人拿走1/5后剩下的继续循环
                if (i == 5){ // 如果5个矮人都拿到野果
                    return total;
                }
            }
        }
        total ++; // 不满足则野果总数加1
    }
}


int main(){
    cout << getTotal() << endl;
    return 0;
}
 

输出:3121

2007年6月25日星期一

配置Editplus工具,用来编译和运行C++

for Dev-C++
这里假设Dev-C++安装目录为C:\Dev-Cpp。选择Editplus菜单"工具->配置用户工具...",在"工具->用户工具"分支下,选择一个未使用的群组与工具项目,可以更改群组名称为Cpp。
 
添加工具,菜单文本可以为g++。
命令为C:\Dev-Cpp\bin\g++.exe。
参数为"$(FileName)" -o "$(FileNameNoExt)",参数加引号可以避免空格等问题。
起始路径为$(FileDir)
可选中捕获输出,这会将原本弹出命令行窗口的输出信息捕获到Editplus输出窗口。
 
 
 
for VC
 
 
for MinGW
 

2007年6月21日星期四

(regedit) Windows文件关联

Windows下将特定应用程序关联到特定文件类型,使该应用程序成为打开该文件类型的默认应用程序。
 
在桌面环境下,有多种方式实现这一点。
1. 右键文件->属性->打开方式->更改,选择或浏览应用程序即可。
2. 右键文件->打开方式->从列表中选择或者"选择程序(C)",这种方式操作与上面的方式类似。
 
下面介绍从注册表中完成关联:
运行 regedit 进入注册表编辑器,所有文件关联项目都在[KEY_CLASSES_ROOT]节点下,注意两点:
1. 所有名称为豆点号(.)开头的项都是欲关联文件的后缀(如:.ht)。这一节点(项)的默认值为另一个(非豆点开头的)节点名(如:HTFile)。
2. 这另一个节点(即HTFile)下建子项(shell/open/command 或 shell/edit/command),默认值为指定应用程序路径和名称,以及参数等。
 
这里给一个完整的简单示例:
例如要将后缀为.ht的文件关联到记事本应用程序。
首先在KEY_CLASSES_ROOT下创建(如果已有则展开)名称为.ht的项,此项会自动创建一个"默认"字符串(REG_SZ)值,修改其值为HTFile。
然后同样在KEY_CLASSES_ROOT下创建(已有则展开)HTFile/shell/open/command项,command项默认(字符串)值改为("C:\WINDOWS\notepad.exe" "%1")。其中第一个字符串为关联的应用程序路径,第二个字符串"%1"即指定文件的路径,还可以在后面带上%*,表示任意值,一般用来指定参数(斜体部分为闲耘猜测,暂未证实)。
完成。

2007年6月11日星期一

(java) Overriding, Overloading

看《Java编程思想》第2版第297页为所有返回类型各写一个类/接口,突然想到能不能仅仅写一个类/接口,通过多态特性,让它自动返回相应的类型呢,尝试失败。

package org.xianyun.j2se.override;
public class Father {
    public String fun(){
        return "string";
    }
}

package org.xianyun.j2se.override;
public class Children extends Father {
    public void fun(){
        // I : 父类返回String,子类返回void。Eclipse报错:返回类型与 Father.fun() 不兼容。
    }
    public void fun(String str){
        // II : 这里是重写(overloading)。
    }
    public String fun(){         // III : Eclipse报错:存在重复的方法 fun()
return "";
    }
}
从 I 处可以看出,系统判断覆写(Overriding)的凭据是方法名和传入参数。如果是覆写,则判断返回参数。
II 处,正常,属于重写(Overloading),此时Children类多了void fun(String)方法。
III 处证明,判断是同一个方法的依据是方法名和传入参数,不参照返回参数。
注:代码在sun jdk下尝试结果相同。

借此再温习一下覆写和重写:
Overriding (覆写)
方法与父类方法同名同参同返回。,即同方法名,同传入参数,同返回参数类型。

Overloading (重载)
方法与父类方法同名,不同传入参数(个数或/和类型),同/不同返回参数类型。





另,在网络技术交流群小学一招,使桌面上图标文本的默认阴影消失:
我的电脑 -> 属性 -> 高级 -> 性能 -> 设置 选中"在桌面上为图标标签使用阴影"。

2007年6月10日星期日

脚本的力量 - 碎片整理与磁盘格式转换

利用命令shell的力量。Use the Power of Command Shells.
学习一种文本操纵语言。Learn a Text Manipulation Language.
不要使用手工流程。Don't Use Manual Procedures.
from《程序员修炼之道》The Pragmatic Programmer
 
 
Windows磁盘碎片整理批处理,传说是WinXP,Win2K,Win2003等NT系统才支持。
将下面代码保存为disk.bat,双击运行即可。
defrag.exe c: -f -v >"d:\defrag_report_c.txt"
defrag.exe d: -f -v >"d:\defrag_report_d.txt"
...
其中 c:,d:等表示你要整理的驱动盘符,详细说明可以Google搜索关键字" windows 碎片整理 命令行",并且在我的Google搜索历史中2007年6月6日的标星记录里都是不错的链接。
 
将Windows磁盘从FAT32转换成NTFS格式,不会格式化磁盘,保留数据(不过最保险的还是备份先)。由于输入了如下命令后,需要立即手动输入对应磁盘卷标名(即你为磁盘驱动器命的名字,打开"我的电脑"即可看到)才会执行转换,所以几乎没有办法写成批处理,不过还好转换工作不是需要特别长的时间,几十秒到几分钟吧。
CONVERT D: /FS:NTFS
关于Google搜索同上,关键字"fat32 转 ntfs 命令"。

2007年6月1日星期五

Resin:JDK版本问题

最初将Resin注册为Windows服务时,JDK版本是1.4.2,一直运行正常。

后来装了JavaEE SDK 1.5,发现Resin运行JSP程序时,总是出现"com/sun/tools/javac/Main (Unsupported major.minor version 49.0)"错误信息,甚至resin-doc(.xtp)都无法正常编译运行。上网一查,了解到是版本问题。

我遇到的问题与Resin无法启动类似,但是我用了不同的方法解决。

很简单,不需要任何重装(当然,注册Resin为Windows服务例外)。

1. 在path中设置好需要的JDK版本。
2. 进入命令行模式,cd到Resin安装目录。
3. 运行如下命令,将Resin Web Server从Windows服务中去除。
> httpd -remove
如果运行正常,继续。
(注:不同的resin版本,httpd可运行程序可能会在不同的子目录。我用的是resin3.0.17 for Windows)
4. 然后运行下面的命令再将Resin注册为Windows服务。
> httpd -install
5. ok。

至于原因,Resin官方网说得很清楚:
If you have moved JDK or Resin manually, you get the error from Resin
because the data Resin once get from the registry and the real location
of the executables doesn't match. Reinstall jdk and, then, reinstall
Resin. That will solve this problem.

事后我有研究了一下注册表,在 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Resin] 中有一个名为"ImagePath"的"可扩充字符串值",值中有一个参数"-java_home "D:\jdk1.5.0""就是设置Resin使用的JDK路径的。( 注意可扩充字符串值导出的并不是字符串,而是十六进制数据,所以导入注册表时需要注意。)

六一儿童节

六一儿童节,百度Logo
六一国际儿童节百度Logo。(哎,看来也别打百度Logo的主意)

Google的节日Logo好久都没动静了,这个国际性的节日也一样,似乎有点说不过去。

看了百度百科:六一儿童节才知道,六一国际儿童节并不是那么国际化,各国并不相同。不过谷歌中国难道不能本地化吗?

2007年5月31日星期四

(AD) 邮件广告调查

前段时间我写了篇网易的邮件广告,后来发现在邮件里带广告的并非只网易一家,调查发现,国内各大免费邮箱提供商都有在用户邮件底部自作主张加广告的嗜好,乐此不彼。下面是朋友帮忙测试发邮件到Gmail的截图。

== 有广告型 ============================


21cn.com邮件,有广告。 (免费邮箱)



雅虎中国yahoo.com.cn邮件,有广告。 (免费邮箱)



搜狐sohu.com邮件,喧宾夺主的广告。(免费邮箱)



微软hotmail.com(Live)邮件,有广告。(免费邮箱)



微软msn.com邮件,有广告。(免费邮箱)



新浪sina.com邮件,浪多的广告。 (免费邮箱)



网易163.com邮件,有广告。(免费邮箱)



网易126.com专业邮箱邮件,有广告。 (免费邮箱)

最可笑而可悲的是中华广告网的评论: 网易免费邮箱广告策略性开放,其中最无耻的手段甚至包括“收件箱假信”,看来早些年的弹出广告不值一提了。




== 无广告型 ============================


网易vip.163.com VIP邮件,无广告。 (收费邮箱)



腾讯qq.com邮件,无广告。(免费邮箱)



Google Gmail.com邮件,无广告。(免费邮箱)


如果朋友您有上面所列邮箱中不同的邮箱,并且碰巧对这个调查也感兴趣,您不妨花几分钟时间给我发一封简短的邮件、或者附上您所见过带广告的邮件截屏。对您所做的一切,我心怀感激。

已知缺少:tom.com, china.com, eyou.com, 56.com

这是我的邮箱地址:

2007年5月30日星期三

IT从业人员心理特征

IT行业从业人员应具备12种职业核心素质,根据重要性排序,依次为沟通能力团队合作学习能力责任感问题解决能力诚信主动性理解能力应变能力 抗挫抗压能力踏实大局观

-- 我国首次发布IT从业人员心理特征研究报告

将Xianyun.org绑定托管到Blogger.com上我的博客

blogspot.com经常被封,导致国内无法访问虽然有不少方法解决,但是大都不理想,或有局限性(如改hosts文件),或麻烦并不太现实(如使用代理),有时候发现一些网站是自己的域名,但是发现连接出错时,却显示Google的Logo,不知道是怎么实现的。

今天翻阅Blogger.com的帮助文档,终于找到一篇相关的,如下:

How do I use a custom domain name on my blog?
如何在我的博客上使用定制域名。(即使用自己的域名,而不是默认的blogspot.com)。这种方法只需要拥有自己的域名即可(这个域名需要绑定到Google DNS服务器:ghs.google.com)。

另外,如果你还有自己的服务器,可以使用FTP或sFTP方法


OK,经过一番折腾,终于弄好了我的博客,现在这篇即设置生效后发布的,以资记忆。

2007年5月29日星期二

(转) 哈佛成功金句25则

1、正确的思考 
    
       先正确的评判自己,才有能力评断他人。 
       你是否欺骗别人,或是自己?想清楚再回答。 
       三思而后行的人,很少会做错事情。 
       企图说服不用大脑的人,是徒劳无功。 
       认为整个世界都错的人,极可能错在自己。 
    
 2、行动  
    
       观察走在你前面的人,看看他为何领先,学习他的做法。 
       忙碌的人才能把事情做好,呆板的人只会投机取巧。 
       优柔寡断的人,即使做了决定,也不能贯彻到底。 
       善意需要适当的行动表达。 
    
 3、相信 
    
       相信你做得到,你一定会做到。 
       不断告诉自己某一件事,即使不是真的,最后也会让自己相信。 
    
4、警觉 
    
       对于那些使狗和儿童感到畏惧的人应提高警觉。 
       警觉过度犹如不及,使人变得多疑。 
       不要羡慕邻居的篱笆更绿,或许荆棘多于青草。 
       对于满口"别人都说 -"的人,问他"别人"是谁,就会看到他张口结舌的窘态。
       陌生人过分热心帮你做事时 ,当心他别有居心。

5、挑战 
 
      如果你想要更上一层楼,就为别人提供超出预期更多更好的服务。 
      每一次都尽力超越上次的表现,很快你就会超越周遭的人。 
      亨利福特悬赏 2.5万元,征求有办法让他在每一台汽车上节省一个螺钉和螺冒的人。 
      你让我工厂的每个环节节省10分钱,我让你平步青云。 
      如果你一直保持现状,10年后 将会 如何? 
      在你有把握做得更好之前,不要破坏任何东西。  
 

6、主要目标  
  
      你的人生想要什么?你能付出什么作为回馈? 
      成功的人只想自己要的?而非自己不要的。 
      不要管过去做了什么,重要的是你将来要做什么? 
      如果你不知道 你自己的一生要的是什么,你还想得到什么? 
      智者除了有所为,还能有所不为。 
      为自己想要的忙碌,如此即无暇担忧你不想要的。 
      不要怕目标定得太高,你可能需要退而求其次。 
      如果你不会知道自己要什么,别说 你没有机会。 
 
7、合作 
 
      请求比命令能得到更好的结果。 
      善于下命令的人,必定能够服从命令并且执行。 
      乐意合作产生支持的力量,强迫服 从导致失败的结果。 
      告诉上司你想要什么,看他是否愿意 帮助你去排除障碍。 
      友善的合作比煽动更得人心。 
      合作必须从部门领导开始,效率亦然。 
      狼狈为奸绝非合作。 
      除非你自己愿意被别人伤害,否则没有人能够伤害你。   
 
8、勇气 
 
      勇敢的承认自己不知道的事情,才能学习并进步。 
      勇气只是多跨一步超越恐惧。 
      抱怨自己没有机会的人,多半没有勇 气冒险。 
 
9、批评 
 
      一事无成的 无名小卒才能免于批评。 
      不要怕不公正的批评,但要知道哪些是不公正的批评。   
      不要批评你不了解的人,要趁机向他学习。 
      不要怕受人批评。当你提出新的观念,就要准备受人批评。 
      不要批评别 人的行为,除非你知道他 为何那么做。你在同 样的情况下也可能会如此。 
      不能忍受批评,就无法尝试新事物。 
      如果你经常批 评别人,何不试着赞美别人? 
      开始批评之前,最好先略加赞美。 
      如果你想要更受人欢迎,尽量多 赞美,少批评。 

10 、行为 
 
       真正伟大的人,别人会从他的善行感受出来。 
       一天没有臆见善行,就是白过了。 
       奖章和头衔不能让你上天堂,善行才能增加你的分量。 
       建设性的行为才能服人,言语的吹嘘无益。 
       不要说你想要什么,用行为表达。 
       善行是赞美自己最好的办法。 
       如果你比别人更具智慧,别人会从你的行为看出来。 
       善意的回应是惩罚对你不义的人最安全的方式。 
       对不喜欢你的人不要多费口舌。 
       花钱想要上天堂的人,一定后悔没有多行善。 
       善行比滔滔雄辩更能打动人心。 
       墓志铭不如善行更另人怀念。 
       世界不会因为所知给你勋章,而会因你的善行而给你荣耀。 
       善行不需要言语的粉饰。  
  
 
11 、明确的目标 
 
       明确的了解自己想要什么,致力追求。 
       一个人没有明确的目 标,就象船没有罗盘一样。 
       智者都有清晰思考的习惯 。 
       意志力缘于持 续的行动、自动自发、明确的目标。 
       诚实与努力的工作,需要明确的目标引导才能成功。 
       缺乏明确的目 标,一生将庸庸碌碌。 
       坚定的目标是成功的首要原则。 
 
12 、教育或学习 
 
       教育是开发内在的力量。所有的教育都*自己的体会;没有人能够教育另外一个人。 
       你从工作中学到的,比眼前得到的报酬更可贵。 
       倾听才能学习,说话无益。 
       好老师一定是好学生。 
       不一定把所有的知识都记在心里,能够取得所需的知识即可。 
       研究一个人良好的观念,剩过挑剔他的缺点。 
       知识必须加以运用,才能产生力量。 
       努力把事情做得比别人更好,你就会忘了财务 的困扰。 
       如果你不努力向上司学习,就虚掷了升迁及更好的工作机会。 
       哲学家从犯错的人身上找出人类所犯的错误。 
       善于发问 使苏格拉底成为当时的智者。 
       明智的运用知 识,吸引更伟大的知识。 
       你自工作中学到的越多,赚得越多。 
       自工作学习的人,等于别人付钱让他上学。 
       知识必须经由行动产生利益,否则无用。 
 
13 、言之有物 
 
       记住,别人从你所说的每一个字,了解你所知的多寡。 
       你怎么说和你说什么同样重要。 
       人们在有所求时,语气特别不同。 
       语气委婉别人比较听得 进去。 
       口不择言往往造成尴尬的场面。 
       刻薄的话伤 人最甚。 
       思考可以随心所欲,表达想法则必须谨慎小心。 

14 、热诚 
 
       当热诚变成习惯,恐惧和忧虑即无处容身。 
       缺乏热诚 的人也没有明 确的目标。 
       热诚使想象的 轮子转动。 
       一个人缺乏热诚就象汽 车没有汽油。 
       善于安排玩乐和工作,两者保持热诚 ,就是最快乐的人。 
       热诚使平凡的 话题变得生 动。 
 
15 、多做一点 
 
       每次你多做一些,别人就欠你一些。 
       让别人做得更好,同时提升自己的价值。 
       善于钓鱼 的人 选用鱼喜欢的饵。 
       你不能让所有的人喜欢你,却能减少别人讨厌你的原因。 
       与人协商而不产生摩擦,是有待学习的一大课题  。 
       多做一些,机会将随之而 来。 
       为别人服  务最多的人最富有。 
       服务的道路才能通往快 乐的城市。 
 
16 、失败 
 
       爱迪生失败一万次才发明灯泡。失败一次不必担心。 
       "一般人"只失败一次就放弃。所以"一般人"者众,而爱迪生只有一个。 
       漫无目的,随波逐流是失败的首要原因。 
       横逆中能找出顺逆中所没有的机会。 
       让孩子小时侯"好过",长大之后经常会"难过"。 
       批评别人错误时,更要加入一些赞美。 
       失败和暂时的挫折有极大的差别,了解两者的不同,才能成功。 
       不因一时的挫折停止尝试  的人,永远不会失败。 
       许多人只需要再多支持一分钟,多做一次努力,就能反败为胜。 
       成功招揽成功,失败招揽失败。 
       企图不劳而获的人,往往一事无成。 
       别人的错误 不是你犯错的借口。 
       如果你尽力而   为,失败并不可耻。 
       不要责怪孩子不好,怪那些没有教好孩子的大人。 
       错误象花园中的杂草,若未及时铲 除,就会到处蔓生。 
       自怜是让人上   瘾的麻醉剂。 
       智者注意自己的缺点,一般人吹嘘自己的优点。 
       失败若能将人推出自满的椅子,迫使他做更有用的事情,则是一种福气。 
       失败是一种让人承担更大责任的准 备。 
       了解自己为何失败,则失败是资产  。 
 
17 、公平 
 
       不要忽视小节,宇宙由原子构成。 
       得到帮助最好的方式是开始帮助别人。 
 
18 、信心 
 
       信心愈用愈多。 
       除非你愿意,   没有人能破坏你对任何事情的信心。 
       所有伟大的奇   迹都只是信心的力量。 
       不幸很少会纠缠有希望和信心的人。 
       信心需要立足点,恐惧却能凭空存在。 
       信心缘于明  确的目标及积极的态度。 
       信心是一种态度,常使"不可能"消失于无形。 
       信心不能给你需要的东西,却能告诉你如何得到。

19 、恐惧 
 
       虚张声势往往显示极深的恐惧。 
       不要因为恐惧而犹疑,前进就能消除恐惧。 
       恐惧是魔鬼最大的武器,人类最大的敌人。 
       意识清楚的人很少畏惧任何东西。 
       信心可以克服恐惧。 
       把你的恐惧留给自己, 别人有别人的恐惧。 
       坏运气喜欢怕他的人。 
       希望和恐惧不会同行。 
       恐惧贫穷 的人永远不会富有。 
 
20 、朋友  

       有求于人才会去找朋友,很快就没有朋友。 
       如果你愿意要朋友,先做别人的朋友。 
       不要让帮  助你自消沉中振作的朋友失望。 
       朋友是了解你并尊重 你的人。 
       友谊需要经常表达才能  长存 
       友谊是看出朋友的缺 点却 不张扬。 
 
21 、抱怨 
       如果你非要抱怨,那么你小声一些,以免吵到别人。 
       不要太苛求抱怨的人,他把自己的日子弄得够难过的了。 
 
22 、健康和习惯 
 
       如果你感觉无精打采,等到饿了再去吃东西。 
       生病之前就应该看医生。 
       只吃八分饱 
       不断想着疾病,你就会不断生病,健康亦然。 
       新鲜的水果和蔬菜是永 远不会过量的健康食品。 
       不要头痛医头,找出病因才是根本之道。 
       吃得多不一定健康。 
       注意饮食习惯 ,省下看医生的花费。 

23 、残障 
 
      一位中国西北大学的盲生以速记抄录讲义,卖给视力正常的同学,完成学业。 
      如果你感到泄 气,想想又瞎、有盲、又聋,一生过得充实愉快,著书鼓励更多人的海伦`凯勒。 
      从顶端开始的人是极大的不幸,因为他只能往往是向下滑。 
 
24 、快乐 
 
      有些人累积金钱换取财富,智者累积快乐,与人分享仍取之不竭。 
      快乐在于行动,不只是拥有。 
      剥夺别人的快 乐不能使自己快乐。 
      微笑使人更美丽、更愉快,却不费分文。 
      热情比怨恨更得人心。 
      慷慨的给予快 乐,自己更快乐。 
 
25 、和谐 
 
      和谐使宇宙运转不停。 
      机器的摩擦耗费成本,人 际间的摩擦 损耗心 灵。 
      如果你不同意别人的说法,至少不要和他人争执。 
      促进和平的人受人景仰,挑起摩擦的人遭人嫌 恶。 
      记住,至少要两个人才能争执。 
      两个人以上 为明确的目标同心协力,将产生无穷的力量。 
      彼此信任是良好人际关 系的基础。 
      人际关系良好的人永远不愁没有朋友。 
      喜欢和谐的人通常知道该如何维系。 
      持久的成功建立在和谐的人际关  系之上。 
      尽量充当和事 佬,就没有太多纷争。 
      趁机浑水摸 鱼的人才会挑起人事纷争。


手机卡的自白

唉!老天何其不公!身为一张移动手机卡生在这个时代何错之有?!我宁愿变成一辆普普通通的单车,也能驮着人无拘无束的快乐游玩。可残酷的现实是:我只能被固定在铁箱子里收发信息,不见天日,唯一作伴的只有同样被固定在我身旁的SD卡。

现在好了,停机了,整个世界清净了。我终于可以泡杯热茶、吃块饼干,悠闲的等着机主注意到我了。

别担心,一旦这事引发混乱,机主会手脚麻利的尽快充值。所以等一会儿你再来看,就会发现我又开始自得其乐的工作了。

闲耘移动手机卡
(xianyun.org,手机卡也有生命)


(模仿WordPress.com当机之《服务器的自白》)

注:与上面不同的是,考虑到实际用途,决定暂不充值。

2007年5月26日星期六

写履历表

写履历表
[波兰]辛波丝卡
陈黎 张芬龄 译
 
需要做些什么?
填好申请表
再附上一份履历表。
 
尽管人生漫长
但履历表最好简短。
 
简洁、精要是必须的。
风景由地址取代,
摇摆的记忆屈服于无可动摇的日期。
 
所有的爱情只有婚姻可提,
所有的子女只有出生的可填。
 
认识你的人比你认识的人重要。
旅行要出了国才算。
会员资格,原因免填。
光荣记录,不问手段。
 
填填写写,仿佛从未和自己交谈过,
永远和自己只有一臂之隔。
 
悄悄略去你的狗、猫、鸟,
灰尘满布的纪念品、朋友和梦。
 
价格,无关乎价值,
头衔,非内涵。
他的鞋子的尺码,非他所住之地,
用以欺世盗名的身份。
 
此外,再附张露出单耳的照片。
重要的是外在形貌,不是听力。
反正还有什么好听的?
碎纸机嘈杂的声音。
 
-- from 《读者》2005 24 十二月B

真理之荣耀

 
法兰西思想家维克多.雨果的儿子被审判,因为他在杂志里写过一篇文章,在这篇文章里他认为处人死刑是可憎的。雨果亲自给儿子做辩护,他预先知道他的儿子终归要被控诉并下狱的,所以他这样结束了自己的话:
我的儿子,今天人们使你有了伟大的光荣:你被认为是一个有资格为真理而受害的人。从今天起,你才开始了真正的生活。在你这样的年纪已经坐上了从前贝朗瑞和夏多布里昂坐过的那把椅子,是可以骄傲的。祝你的意志坚强不屈,你已经向你的父亲学会了它们,你把它们贯注到血液里去。
-- 《给儿子的信》 [俄] 赫尔岑
-- from 《读者》2005 24 十二月B

2007年5月25日星期五

Gmail - 中国中央电视台版权所有?

早上开机,启动gnotify后发现有新邮件,双击任务栏gnotify图标,启动浏览器进入Gmail,不一会,显示页面如下:



Gmail 什么时候把版权给了中国中央电视台了?真是牛逼,中国DNS服务商。

2007年5月24日星期四

幸福


人们将幸福作为终极目标来追求,而不是作为达到其他目的的手段。
-- 亚里士多德


我们应当幸福的工作,而不是为了得到幸福而工作。

方向比距离更重要。
-- 高尔夫球教练

有朋友的人就不是失败者。
-- 《风云人物》电影 [美]


from <读者> 2005/12 六月B 《成功离你有多远》

 

2007年5月22日星期二

Windows服务控制

前文"Resin服务重新启动控制"中用的的重启resin服务的方法,有一个问题就是:当系统本身有类似resin.exe等以resin命名的可执行文件时,系统环境变量设置的不同,会造成不同的影响。

例如MySQL就有这个问题:在%MySQL_HOME%\bin目录中,本身就有mysql.exe文件, 在安装MySQL时,可以选择是否将MySQL安装目录放进系统环境变量中,但是推荐放进去,因为我们经常需要执行MySql本身的mysql.exe,以便于在命令行下操作MySql。

在Windows Server 2003系统命令行下输入
> start /?
可以查看start命令的用法,不带参数时默认启动一个新的命令行窗口。而直接在运行里输入start则提示"Windows找不到文件'start',..."说明Windows Server 2003和其他Win系统不同, 没有start.exe文件,start命令是集成的 (搜索结果也表明如此)。

为了避免命令重复造成的问题,创建启动服务的批处理文件保存为startup.bat,如下:
startup.bat
@echo off
if "%1"=="" goto help

net start %1
goto end

:help
echo [Usage] startup {service_name}
goto end
:end
 

stop.bat
@echo off
if "%1"=="" goto help

net stop %1
goto end

:help
echo [Usage] stop {service_name}
goto end

:end


restart.bat
 
@echo off
if "%1"=="" goto help

net stop %1
net start %1
goto end

:help
echo [Usage] restart {service_name}
goto end

:end

把如上三个文件所在目录添加到系统变量Path中。现在我们可以使用上面的通用批处理进行服务的启动,停止,重启操作了。
> startup resin // 启动Resin Web Server.
> stop resin // 停止Resin Web Server.
> restart mysql // 重启MySQL服务,注:安装MySql时可以设置服务名。


2007年5月20日星期日

无题


看风扫尘事;
听雨踩泥声。

最近几天下雨,为喧嚣的深圳带来了几分幽静。

2007年5月19日星期六

Resin服务重新启动控制

由于已经将Resin安装注册到系统服务中,需要重新启动服务时,要到服务中选择Resin Web Server,点击"重新启动",或者运行"net stop resin"和"net start resin"命令。下面是我使用的方法:把下面的代码复制到文本文件中,保存为 resin.bat,并将该文件所在目录添加到系统变量Path中。

@echo off
if "%1"=="start" goto start
if "%1"=="stop" goto stop
goto restart

:start
net start resin
goto end

:stop
net stop resin
goto end

:restart
net stop resin
net start resin

:end

现在,只需要运行"resin"或者"resin restart"就可以重新启动Resin Web Server服务了。另外:
resin stop : 停止Resin Web Server服务。
resin start : 启动Resin Web Server服务。

临时学的批处理知识,知识浅薄。请朋友多为指正。

2007年5月18日星期五

论据 vs 导师


兔子在写论文,狼走过来,问兔子在写什么?兔子说,我在写论文《论兔子怎么打败狼》,狼大笑:哈哈哈哈哈,可能吗,你的论据呢?兔子指着背后的山洞:论据在里面呢!狼不相信,就走进山洞。一阵惨叫后,兔子走进山洞,看到狮子在剔牙,兔子说:老师,怎么样了?狮子冷笑道:这个世界,写论文要什么论据啊,关键看导师是谁。
 
 
太有道理了。为什么有道理?问你导师去。
-- 闲耘

2007年5月15日星期二

二哥的千金

三哥五一回来,QQ上给我发了几条消息,有说到二哥家千金,并给了个照片地址,看过后,发现兄弟们生活挺滋润,个个脸上都圆咕噜了不少,很欣慰,看来大伙都生活得不错。

下面是二哥家千金小姐的玉照。小家伙正月十四生日,正好比我小一个月,呵呵。

2007年5月14日星期一

(Java) 理解String对象不能改变

一直不理解String对象的值不能改变是什么意思,
String a = "A";
a += "B";
这时s等于"AB",a不是已经改变了吗?
后来才明白,上面的String对象a,改变的不仅仅是a的值,a所引用的String对象也已经改变了。a最初引用的是String实例"A",后来引用的是String实例"AB"。
 
public class Str {
    public static void main(String[] args){
        String a = "A";
        String ai = a;
        a.concat("B"); // I
        a += "C"; // II
        System.out.println(a);
        System.out.println(a == ai);
        System.out.println(a.equals(ai));

        StringBuffer sb = new StringBuffer("SB");
        StringBuffer sbi = sb;
        sb.append("APPEND");
        System.out.println(sb);
        System.out.println(sb == sbi);
        System.out.println(sb.equals(sbi));
    }
}

仅注释掉行 II,结果如下:
A
true
true
SBAPPEND
true
true
此时对象a的值仍为"A",a对对象的引用也没有改变。
 

仅注释掉行 I,结果如下:
AC
false
false
SBAPPEND
true
true
此时对象a的值已经改变,但是a对对象的引用也已经改变。


总结:String对象实例"A"的值是不可改变的,但是变量a对对象的引用可以改变。

2007年5月13日星期日

网易的邮件广告

今天才注意到,用网易免费邮箱发邮件,网易会在邮件最后加上美妙的页脚 - 广告(vip用户好像没有加广告)。也就是说,你每发一封邮件,就免费帮网易发一次广告。



(免费个人网站提供商也有类似的问题,ik8.com最初是没有广告的,支持Javascript,很棒,但是自从AJAX的发现,ik8.com强行删除了所有用户的Javascript文件,并强行在用户网页的各个角落帖上广告。)

网易邮箱也算得是国内邮箱的老大了,我很早就用了网易的163和126邮箱,从最初的简单框架方式到最近的AJAX体验,同期都做的比国内同类产品好,最突出的有点就是速度快,发附件很有用,最早的时候支持30M附件(现在不行了)。

但是在一些小问题了,网易也许就表现得有点鼠目寸光(别打网易相册的主意)了。

一封邮件最后的小广告,也没什么大不了。但是每个用户每一封邮件都强行带上这样的东东,就有点说不过去了。但是人家网易在"服务条款"里有说"...同时,网易公司保留对申请了163.com免费邮箱的用户投放商业性广告的权利。"所以只能怪自己当初鼠目寸光,只看到免费,没注意到条款和广告(服务条款的性质:条款,而不是服务)。

但是我要说的是,你可以在我的网易免费邮箱里放广告,但是你没有权利广告放在我的邮件里。

当有一天,你发一封10个字的邮件里,却带着100个字的广告时,天哪,无语~~


PS:免费的服务就应该是最好的服务,否则你就不配免费。(来自《读者》)

PPS:此文并非针对网易或ik8.com,而是针对整个无度的广告业。




闲耘补语 2007/5/14:
在“互联网电子邮件服务管理办法”上第十三条和第十四条提到了关于广告的问题,其中第十三条明确规定如下:

第十三条 任何组织或者个人不得有下列发送或者委托发送互联网电子邮件的行为:
(一)故意隐匿或者伪造互联网电子邮件信封信息;
(二)未经互联网电子邮件接收者明确同意,向其发送包含商业广告内容的互联网电子邮件;
(三)发送包含商业广告内容的互联网电子邮件时,未在互联网电子邮件标题信息前部注明“广告”或者“AD”字样。

网易是没有权利在邮件里添加广告的。即便不如此,难道网易就有权利添加,删除,或者改变用户的邮件内容吗?擅自在用户邮件里添加广告或者其他内容合法吗?并且,网易是不是应该在用户邮件的标题前添加上“AD”或者“广告”字样呢?

2007年5月11日星期五

2007年5月9日星期三

(转)给大学生的十二条人生建议:做事不如做人

一、一定要有独立的人格、独立的思想。一个经过独立思考而坚持错误的人比一个不假思索而接受正确观点的人更值得肯定。不要成为灌输教育的牺牲品。

二、仕途、商界、学术――大致说来,每个人都注定要走上三条道路的一条。
进行职业规划的时候,不妨以此作为思考的出发点。只有知道自己以后要做什么,才能知道自己应该学什么。

三、专业无冷热,学校无高低。没有哪个用人单位会认为你代表了你的学校或者你的专业。千万不要因为你是名牌大学或者热门专业而沾沾自喜,也大可不必因为你的学校不好或专业冷门而自卑。
自信。

四、千招会,不如一招熟。10个10%不是100%,而是零。如果你有10项工作,每项都会做10%,那么,在用人单位眼中,你什么都不会。所以你必须要让自己具备核心竞争力,"通才"只有在"专才"的基础上才有意义。

五、一定要学会理财。对于贫困生来说,首先要做的不是挣钱,而是省钱。

六、做事不如做人,人脉决定成败。一个人具备多少能力,不只是说他一个人的时候能做什么,还包括他能通过别人做什么。一个人赚的钱。12.5%是靠自身的知识,87.5%则来自人脉关系。30岁以前靠专业赚钱,30岁以后靠人脉赚钱。所以好好珍惜大学期间建立起来的人脉关系。

七、互联网固然威力无穷,但是,如果你沉迷于网络游戏,浪费的金钱倒是可以弥补,荒废的青春就无可追寻了。

八、大部分女生将电脑当成了影碟机,大部分男生把电脑当成了游戏机。大学生要掌握必要的计算机操作能力,但是很多时候电脑会成为浪费时间的堂而皇之的借口。有电脑的大学生非常多,可是,这中间很多人可能大学毕业的时候还不会Excel,不会做一个像样的PPT。

九、爱情是不期而至的,可以期待,但不可以制造。花开堪折方须折,末让鲜花败残枝。一个有10000块的人为你花掉100元,你只占了他的1%;而一个只有10块的人为你花掉10块,你就成了他的全部。

十、研究生扩招的速度是30%,也就意味着硕士学历贬低的的速度是30%。千万不要以为考研究生就是积极进取的表现。对于很多人而言,考研不过是一种消极逃避的方式罢了。

十一、垃圾是放错位置的人才。所以,在找工作的时候一定要把自己放到那个让你成为人才而不是垃圾的职位上。当然,前提是你要知道自己究竟想要做什么、究竟适合做什么。

十二、大学期间一定要多去图书馆多去自学室,很多书你现在不读,一辈子就再也没机会去读了。虽然不是每本书看了都一定有用,但是因为你不知道究竟哪本书以后会有用,所以只有多看书,并且抛弃那些过于功利的想法。尽管每次网到鱼的不过是一个网眼,但要想捕到鱼,就必须要编织一张网。