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好久都没动静了,这个国际性的节日也一样,似乎有点说不过去。

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