2007年12月31日星期一
辞旧:年终了结
2007年12月30日星期日
(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 之考试篇
每当我考试,砍下八九十分,在考场上随心所欲地发挥,拿下两届的学年第一。你还真以为那是我一个人干的?不过说真的!考试是一帮人的....
II:
期中考试考场.... 不对,是期末考试,离交卷时间还剩下20秒,麦迪打算作弊。系主任就站在他的旁边,瞎扯,是校长~随便吧,反正他把纸条传出去了....还剩10秒,麦迪拿到了答案!最后3秒,他还需要一道填空题!答案传过来了,整个考场都试图阻止他!但他抄了起来~是左手!天啊!连老师都感动得哭了。
但那张纸上写着:我也不会.... 是的,当时就是这样。
2007年10月26日星期五
玉皇山游记
逃票很成功,因为老许上次做过同样的事情,比较有经验。
整座山不是很高,而且有石板路可以供汽车行驶至山顶。不过我们是一直通过小路步行至山顶,然后又步行下山。山虽不高,不过一路下来,也比较累,尤其昨晚通宵,下山的时候我的眼睛已经快要撑不开了,巴不得就地趴下呼呼大睡。
下面发一些用577W 130W像素摄像头拍摄的照片,由于新刷的系统中带的拍照软件不好控制,照片不是很理想,不过有我拍摄技术上的补救,还是有几张不太赖的。
秋菊
江湖一览
玉皇山巅俯瞰众山
云池,金鱼
登云阁
参天大树
至此,我也掌握了在玉皇山逃票的经验。
- 早6点之前;
- 晚6点之后;
- 走无人看管的小路。
小时候家里很穷 - 有意思的签名
小时侯,我家里很穷,没钱买自行车,我只好每天打的上学。初中的时候,因为我成绩太突出,学校领导留我多读了两年。初中毕业后,高中的校长觉得我很有前途,就多收了我2万5。高三的时候,班主任认为我已经有独立生存的能力,于是让我退了学。
2007年10月23日星期二
blogspot.com与Google DNS服务器解封了
后来到杭州后才发现blog.xianyun.org同样无法访问,原来是Google DNS服务器也被封了。网上问了一些朋友知道,宁波,辽宁,南昌等地方也同样无法访问。从此,博客都懒得写了。
前不几天,blogspot.com解封了;今天,又发现Google DNS服务器也可以继续在杭州访问了。很好。
问题不在于禁和封,疏导才是明智之举,谢谢。
2007年10月16日星期二
使用jsdoc建立javascript文档
刚刚使用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
初始目录:$(FileDir)
2007年10月11日星期四
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 类型)。
所有通过引用类型(包括值类型的wrapper 类String, Number 和 Boolean )new 出来的对象,都是其对应类和其父类(这里是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 - 博客日
/** 重拾笔根
* @date 2007-8-31
* @weather 晴,傍晚稍有阴霾。
* @author 闲耘(xianyun.org, hotoo.cn[AT]gmail.com)
*/其实我早有重拾笔根,再写日记之意;日前又看得一位大概是台湾的仁兄,提到关于自己的日记的种种玩笑,思考,和收获,我也渐觉手痒起来。意欲重新提笔,为自己的卑微人生留下几许痕迹。
日记不同于博客,这里可以写下内心深处的秘密,欲望,和其他;不必,大概也不该写下违心的谎言。生活中我力求简单,但是出于愚蠢,虚伪或自我保护,我总是不时的拾起谎言,企图掩饰和麻痹自己,希望在这里我可以重归简单,展现真我。感谢这片还算纯洁的土地,让我种植心灵,培养心胸。
日记最好手写在纸质本子上,但是最近一直堕于上街,也没碰巧看中什么好的本子,就暂时写在这本本上,他日再撰抄到本子上。
谨记:每日只需一篇,数十字或数百字即可,敬请坚持。
BlogDay是什么?
BlogDay起源于Bloggers认为自己应该有一个专门的节日,以认识其他来自于不同国度或拥有各种不同嗜好、兴趣的博客。在BlogDay当天,所有参与活动的博客应该在自己的站上推出五个具有特色的Blogs给所有来访问的朋友,藉此和大家分享更多新而有趣的博客。BlogDay这天会发生什么事?
在八月三十一日这一天内,全世界参与活动的Blog都会发表一篇文章推荐五个新颖的Blog,而且最好这五个Blog的内容可能是来自不同的文化、观点和型态。而所有造访的朋友都可以在八月三十一日当天发现自己前所未知的Blog,藉此认识更多Blogger并为这些新发现而庆祝。
2007年8月28日星期二
文件系统标签结构随想
作为非系统程序员,可以考虑实现这样的文档管理软件:1.尽量支持多种文档格式;2.用户自定义监听目录;3.文档索引,提供快捷的搜索(本地搜索的索引应该进行全面的索引,例如Javascript程序员可能需要搜索js源代码,而现在的Google本地搜索却忽略这些文本内容。)。
2007年7月24日星期二
我记得/记得我
1. 关心/照顾他/她/它;2. 和他/她/它生活在一起;3. 和他/她/它说话。
你让他/她/它记得你什么呢?
2007年7月7日星期六
(Javascript) HTAutoComplete:不要进行词法分析
Keep It Simple, Stupid. (保持简单,保持朴拙。)
"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) 字符/串大小写反转
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年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++
这里假设Dev-C++安装目录为C:\Dev-Cpp。选择Editplus菜单"工具->配置用户工具...",在"工具->用户工具"分支下,选择一个未使用的群组与工具项目,可以更改群组名称为Cpp。
2007年6月21日星期四
(regedit) Windows文件关联
例如要将后缀为.ht的文件关联到记事本应用程序。
2007年6月11日星期一
(java) Overriding, Overloading
package org.xianyun.j2se.override;
public class Father {
public String fun(){
return "string";
}
}
package org.xianyun.j2se.override;从 I 处可以看出,系统判断覆写(Overriding)的凭据是方法名和传入参数。如果是覆写,则判断返回参数。
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 "";
}
}
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
defrag.exe c: -f -v >"d:\defrag_report_c.txt"其中 c:,d:等表示你要整理的驱动盘符,详细说明可以Google搜索关键字" windows 碎片整理 命令行",并且在我的Google搜索历史中2007年6月6日的标星记录里都是不错的链接。
defrag.exe d: -f -v >"d:\defrag_report_d.txt"
...
CONVERT D: /FS:NTFS
2007年6月1日星期五
Resin:JDK版本问题
后来装了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的主意)
Google的节日Logo好久都没动静了,这个国际性的节日也一样,似乎有点说不过去。
看了百度百科:六一儿童节才知道,六一国际儿童节并不是那么国际化,各国并不相同。不过谷歌中国难道不能本地化吗?
2007年5月31日星期四
(AD) 邮件广告调查
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从业人员心理特征研究报告
将Xianyun.org绑定托管到Blogger.com上我的博客
今天翻阅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、警觉
对于那些使狗和儿童感到畏惧的人应提高警觉。
警觉过度犹如不及,使人变得多疑。
不要羡慕邻居的篱笆更绿,或许荆棘多于青草。
对于满口"别人都说 -"的人,问他"别人"是谁,就会看到他张口结舌的窘态。
陌生人过分热心帮你做事时 ,当心他别有居心。
如果你想要更上一层楼,就为别人提供超出预期更多更好的服务。
每一次都尽力超越上次的表现,很快你就会超越周遭的人。
亨利福特悬赏 2.5万元,征求有办法让他在每一台汽车上节省一个螺钉和螺冒的人。
你让我工厂的每个环节节省10分钱,我让你平步青云。
如果你一直保持现状,10年后 将会 如何?
在你有把握做得更好之前,不要破坏任何东西。
6、主要目标
你的人生想要什么?你能付出什么作为回馈?
成功的人只想自己要的?而非自己不要的。
不要管过去做了什么,重要的是你将来要做什么?
如果你不知道 你自己的一生要的是什么,你还想得到什么?
智者除了有所为,还能有所不为。
为自己想要的忙碌,如此即无暇担忧你不想要的。
不要怕目标定得太高,你可能需要退而求其次。
如果你不会知道自己要什么,别说 你没有机会。
7、合作
请求比命令能得到更好的结果。
善于下命令的人,必定能够服从命令并且执行。
乐意合作产生支持的力量,强迫服 从导致失败的结果。
告诉上司你想要什么,看他是否愿意 帮助你去排除障碍。
友善的合作比煽动更得人心。
合作必须从部门领导开始,效率亦然。
狼狈为奸绝非合作。
除非你自己愿意被别人伤害,否则没有人能够伤害你。
8、勇气
勇敢的承认自己不知道的事情,才能学习并进步。
勇气只是多跨一步超越恐惧。
抱怨自己没有机会的人,多半没有勇 气冒险。
9、批评
一事无成的 无名小卒才能免于批评。
不要怕不公正的批评,但要知道哪些是不公正的批评。
不要批评你不了解的人,要趁机向他学习。
不要怕受人批评。当你提出新的观念,就要准备受人批评。
不要批评别 人的行为,除非你知道他 为何那么做。你在同 样的情况下也可能会如此。
不能忍受批评,就无法尝试新事物。
如果你经常批 评别人,何不试着赞美别人?
开始批评之前,最好先略加赞美。
如果你想要更受人欢迎,尽量多 赞美,少批评。
10 、行为
真正伟大的人,别人会从他的善行感受出来。
一天没有臆见善行,就是白过了。
奖章和头衔不能让你上天堂,善行才能增加你的分量。
建设性的行为才能服人,言语的吹嘘无益。
不要说你想要什么,用行为表达。
善行是赞美自己最好的办法。
如果你比别人更具智慧,别人会从你的行为看出来。
善意的回应是惩罚对你不义的人最安全的方式。
对不喜欢你的人不要多费口舌。
花钱想要上天堂的人,一定后悔没有多行善。
善行比滔滔雄辩更能打动人心。
墓志铭不如善行更另人怀念。
世界不会因为所知给你勋章,而会因你的善行而给你荣耀。
善行不需要言语的粉饰。
11 、明确的目标
明确的了解自己想要什么,致力追求。
一个人没有明确的目 标,就象船没有罗盘一样。
智者都有清晰思考的习惯 。
意志力缘于持 续的行动、自动自发、明确的目标。
诚实与努力的工作,需要明确的目标引导才能成功。
缺乏明确的目 标,一生将庸庸碌碌。
坚定的目标是成功的首要原则。
12 、教育或学习
教育是开发内在的力量。所有的教育都*自己的体会;没有人能够教育另外一个人。
你从工作中学到的,比眼前得到的报酬更可贵。
倾听才能学习,说话无益。
好老师一定是好学生。
不一定把所有的知识都记在心里,能够取得所需的知识即可。
研究一个人良好的观念,剩过挑剔他的缺点。
知识必须加以运用,才能产生力量。
努力把事情做得比别人更好,你就会忘了财务 的困扰。
如果你不努力向上司学习,就虚掷了升迁及更好的工作机会。
哲学家从犯错的人身上找出人类所犯的错误。
善于发问 使苏格拉底成为当时的智者。
明智的运用知 识,吸引更伟大的知识。
你自工作中学到的越多,赚得越多。
自工作学习的人,等于别人付钱让他上学。
知识必须经由行动产生利益,否则无用。
13 、言之有物
记住,别人从你所说的每一个字,了解你所知的多寡。
你怎么说和你说什么同样重要。
人们在有所求时,语气特别不同。
语气委婉别人比较听得 进去。
口不择言往往造成尴尬的场面。
刻薄的话伤 人最甚。
思考可以随心所欲,表达想法则必须谨慎小心。
14 、热诚
当热诚变成习惯,恐惧和忧虑即无处容身。
缺乏热诚 的人也没有明 确的目标。
热诚使想象的 轮子转动。
一个人缺乏热诚就象汽 车没有汽油。
善于安排玩乐和工作,两者保持热诚 ,就是最快乐的人。
热诚使平凡的 话题变得生 动。
15 、多做一点
每次你多做一些,别人就欠你一些。
让别人做得更好,同时提升自己的价值。
善于钓鱼 的人 选用鱼喜欢的饵。
你不能让所有的人喜欢你,却能减少别人讨厌你的原因。
与人协商而不产生摩擦,是有待学习的一大课题 。
多做一些,机会将随之而 来。
为别人服 务最多的人最富有。
服务的道路才能通往快 乐的城市。
16 、失败
爱迪生失败一万次才发明灯泡。失败一次不必担心。
"一般人"只失败一次就放弃。所以"一般人"者众,而爱迪生只有一个。
漫无目的,随波逐流是失败的首要原因。
横逆中能找出顺逆中所没有的机会。
让孩子小时侯"好过",长大之后经常会"难过"。
批评别人错误时,更要加入一些赞美。
失败和暂时的挫折有极大的差别,了解两者的不同,才能成功。
不因一时的挫折停止尝试 的人,永远不会失败。
许多人只需要再多支持一分钟,多做一次努力,就能反败为胜。
成功招揽成功,失败招揽失败。
企图不劳而获的人,往往一事无成。
别人的错误 不是你犯错的借口。
如果你尽力而 为,失败并不可耻。
不要责怪孩子不好,怪那些没有教好孩子的大人。
错误象花园中的杂草,若未及时铲 除,就会到处蔓生。
自怜是让人上 瘾的麻醉剂。
智者注意自己的缺点,一般人吹嘘自己的优点。
失败若能将人推出自满的椅子,迫使他做更有用的事情,则是一种福气。
失败是一种让人承担更大责任的准 备。
了解自己为何失败,则失败是资产 。
17 、公平
不要忽视小节,宇宙由原子构成。
得到帮助最好的方式是开始帮助别人。
18 、信心
信心愈用愈多。
除非你愿意, 没有人能破坏你对任何事情的信心。
所有伟大的奇 迹都只是信心的力量。
不幸很少会纠缠有希望和信心的人。
信心需要立足点,恐惧却能凭空存在。
信心缘于明 确的目标及积极的态度。
信心是一种态度,常使"不可能"消失于无形。
信心不能给你需要的东西,却能告诉你如何得到。
虚张声势往往显示极深的恐惧。
不要因为恐惧而犹疑,前进就能消除恐惧。
恐惧是魔鬼最大的武器,人类最大的敌人。
意识清楚的人很少畏惧任何东西。
信心可以克服恐惧。
把你的恐惧留给自己, 别人有别人的恐惧。
坏运气喜欢怕他的人。
希望和恐惧不会同行。
恐惧贫穷 的人永远不会富有。
20 、朋友
有求于人才会去找朋友,很快就没有朋友。
如果你愿意要朋友,先做别人的朋友。
不要让帮 助你自消沉中振作的朋友失望。
朋友是了解你并尊重 你的人。
友谊需要经常表达才能 长存
友谊是看出朋友的缺 点却 不张扬。
21 、抱怨
如果你非要抱怨,那么你小声一些,以免吵到别人。
不要太苛求抱怨的人,他把自己的日子弄得够难过的了。
22 、健康和习惯
如果你感觉无精打采,等到饿了再去吃东西。
生病之前就应该看医生。
只吃八分饱
不断想着疾病,你就会不断生病,健康亦然。
新鲜的水果和蔬菜是永 远不会过量的健康食品。
不要头痛医头,找出病因才是根本之道。
吃得多不一定健康。
注意饮食习惯 ,省下看医生的花费。
23 、残障
一位中国西北大学的盲生以速记抄录讲义,卖给视力正常的同学,完成学业。
如果你感到泄 气,想想又瞎、有盲、又聋,一生过得充实愉快,著书鼓励更多人的海伦`凯勒。
从顶端开始的人是极大的不幸,因为他只能往往是向下滑。
24 、快乐
有些人累积金钱换取财富,智者累积快乐,与人分享仍取之不竭。
快乐在于行动,不只是拥有。
剥夺别人的快 乐不能使自己快乐。
微笑使人更美丽、更愉快,却不费分文。
热情比怨恨更得人心。
慷慨的给予快 乐,自己更快乐。
25 、和谐
和谐使宇宙运转不停。
机器的摩擦耗费成本,人 际间的摩擦 损耗心 灵。
如果你不同意别人的说法,至少不要和他人争执。
促进和平的人受人景仰,挑起摩擦的人遭人嫌 恶。
记住,至少要两个人才能争执。
两个人以上 为明确的目标同心协力,将产生无穷的力量。
彼此信任是良好人际关 系的基础。
人际关系良好的人永远不愁没有朋友。
喜欢和谐的人通常知道该如何维系。
持久的成功建立在和谐的人际关 系之上。
尽量充当和事 佬,就没有太多纷争。
趁机浑水摸 鱼的人才会挑起人事纷争。
手机卡的自白
唉!老天何其不公!身为一张移动手机卡生在这个时代何错之有?!我宁愿变成一辆普普通通的单车,也能驮着人无拘无束的快乐游玩。可残酷的现实是:我只能被固定在铁箱子里收发信息,不见天日,唯一作伴的只有同样被固定在我身旁的SD卡。
现在好了,停机了,整个世界清净了。我终于可以泡杯热茶、吃块饼干,悠闲的等着机主注意到我了。
别担心,一旦这事引发混乱,机主会手脚麻利的尽快充值。所以等一会儿你再来看,就会发现我又开始自得其乐的工作了。
闲耘移动手机卡
(xianyun.org,手机卡也有生命)
(模仿WordPress.com当机之《服务器的自白》)
注:与上面不同的是,考虑到实际用途,决定暂不充值。
2007年5月27日星期日
2007年5月26日星期六
写履历表
真理之荣耀
我的儿子,今天人们使你有了伟大的光荣:你被认为是一个有资格为真理而受害的人。从今天起,你才开始了真正的生活。在你这样的年纪已经坐上了从前贝朗瑞和夏多布里昂坐过的那把椅子,是可以骄傲的。祝你的意志坚强不屈,你已经向你的父亲学会了它们,你把它们贯注到血液里去。
-- from 《读者》2005 24 十二月B
2007年5月25日星期五
2007年5月24日星期四
2007年5月22日星期二
Windows服务控制
例如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,如下:
@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
@echo off
if "%1"=="" goto helpnet stop %1
net start %1
goto end:help
echo [Usage] restart {service_name}
goto end:end
> startup resin // 启动Resin Web Server.
> stop resin // 停止Resin Web Server.
> restart mysql // 重启MySQL服务,注:安装MySql时可以设置服务名。
2007年5月20日星期日
2007年5月19日星期六
Resin服务重新启动控制
@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 stop : 停止Resin Web Server服务。
resin start : 启动Resin Web Server服务。
临时学的批处理知识,知识浅薄。请朋友多为指正。
2007年5月18日星期五
论据 vs 导师
兔子在写论文,狼走过来,问兔子在写什么?兔子说,我在写论文《论兔子怎么打败狼》,狼大笑:哈哈哈哈哈,可能吗,你的论据呢?兔子指着背后的山洞:论据在里面呢!狼不相信,就走进山洞。一阵惨叫后,兔子走进山洞,看到狮子在剔牙,兔子说:老师,怎么样了?狮子冷笑道:这个世界,写论文要什么论据啊,关键看导师是谁。
太有道理了。为什么有道理?问你导师去。-- 闲耘
2007年5月15日星期二
2007年5月14日星期一
(Java) 理解String对象不能改变
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));
}
}
true
true
SBAPPEND
true
true
仅注释掉行 I,结果如下:
AC
false
false
SBAPPEND
true
true
此时对象a的值已经改变,但是a对对象的引用也已经改变。
总结:String对象实例"A"的值是不可改变的,但是变量a对对象的引用可以改变。
2007年5月13日星期日
网易的邮件广告
(免费个人网站提供商也有类似的问题,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%。千万不要以为考研究生就是积极进取的表现。对于很多人而言,考研不过是一种消极逃避的方式罢了。
十一、垃圾是放错位置的人才。所以,在找工作的时候一定要把自己放到那个让你成为人才而不是垃圾的职位上。当然,前提是你要知道自己究竟想要做什么、究竟适合做什么。
十二、大学期间一定要多去图书馆多去自学室,很多书你现在不读,一辈子就再也没机会去读了。虽然不是每本书看了都一定有用,但是因为你不知道究竟哪本书以后会有用,所以只有多看书,并且抛弃那些过于功利的想法。尽管每次网到鱼的不过是一个网眼,但要想捕到鱼,就必须要编织一张网。