闲耘.博客

巨人归来。

这个shell可以辅助你:
1. 来回切换预设好的两个(你也可以改为更多个)网络设置;
2. 自动获取网络设置;
3. 手动设置网络环境(一般临时用一下);
4. 启用/禁用网卡;
5. 查看网络设置。

代码保存为*.bat/*.cmd均可,双击执行。
注:因为Win2003的命令行代码页默认不支持中文(可以通过改注册表修正)这里把网卡名称改成了Lineate,如果你的命令行支持中文(也可以通过修改该批处理文件的快捷方式属性->选项->当前代码页为936),把Lineate改成你的网卡名称(如“本地连接”)即可。

参考:http://windowsitpro.com/articles/index.cfm?articleid=41111&cpage=1#feedbackAnchor

@echo off  

title Switch Network Settingset card=Lineate  

set house_ip=192.168.2.98
set house_mask=255.255.255.0
set house_gway=192.168.2.1
set house_dns0=127.0.0.1
set house_dns1=202.96.134.133  

set office_ip=192.168.1.113
set office_mask=255.255.255.0
set office_gway=192.168.1.1
set office_dns0=192.168.1.1
set office_dns1=202.101.172.35  

:Lab_choice
cls
echo Choice the Network type (for [%card%]):
echo -------------------------------------------------------------------------
echo *  [1] : [ House ] Network Setting:%house_ip% %house_mask% %house_gway%
echo *  [2] : [ Office ] Network Setting:%office_ip% %office_mask% %office_gway%
echo *  [3] : Set Address by Youself.
echo *  [4] : Auto.
echo *
echo *  [5] : Disable Interface.
echo *  [6] : Enable Interface.
echo *  [7] : Change Network Card Name (Current : %card%)
echo *  [9] : Show Status.
echo *
echo *  [?] : Help.
echo *  [0] : Exit.
echo -------------------------------------------------------------------------  

set /p type=Choice:
if %type%==0 exit
if %type%==exit exit
if %type%==quit exit
if %type%==1 goto Lab_house
if %type%==2 goto Lab_office
if %type%==3 goto Lab_userset
if %type%==4 goto Lab_set_dhcp
if %type%==5 goto Lab_disable
if %type%==6 goto Lab_enable
if %type%==7 goto Lab_changeCard
if %type%==9 goto done
if %type%==? goto Lab_help
goto Lab_choice  

:Lab_changeCard
cls
echo All Network Card Config Infomation:
echo -------------------------------------------------------------------------
netsh interface ip show config
echo -------------------------------------------------------------------------
set /p card=Input Network Card Name:
goto Lab_choice
rem ==========================================================================  

:Lab_userset
cls
echo Input Network
echo -------------------------------------------------------------------------
set /p ip=IP Address:
set /p mask=Subnet Mask:
set /p gway=Default Gateway:
set /p dns0=Default DNS Servers:
set /p dns1=Spare DNS Servers:
echo -------------------------------------------------------------------------
echo  [y/Y] : Update network setting immediately.
echo  [n/N] : Cancel and goto main menu.
set /p confirm=Config the Network Setting(y/n):
if %confirm%==y goto Lab_set_static
goto Lab_choice  

:Lab_house
set ip=%house_ip%
set mask=%house_mask%
set gway=%house_gway%
set dns0=%house_dns0%
set dns1=%house_dns1%
goto Lab_set_static  

:Label_office
set ip=%office_ip%
set mask=%office_mask%
set gway=%office_gway%
set dns0=%office_dns0%
set dns1=%office_dns1%
goto Lab_set_static  

rem ==========================================================================
:Lab_set_static
echo Reset Network Setting...
netsh interface ip reset "%card%"
echo Setting IP Address and Subnet Mask...
netsh interface ip set address "%card%" source=static addr=%ip% mask=%mask%
echo Setting Default Gateway...
netsh interface ip set address "%card%" gateway=%gway% gwmetric=1
echo Setting Default DNS Servers...
netsh interface ip set dns "%card%" static %dns0% primary
echo Adding Spare DNS Servers...
netsh interface ip add dns "%card%" addr=%dns1% index=2
goto done  

rem ==========================================================================
:Lab_set_dhcp
echo Auto get IP Address...
netsh interface ip set address "%card%" source=dhcp
echo Auto get DNS Servers...
netsh interface ip set dns "%card%" source=dhcp
goto done  

:Lab_disable
netsh int set interface name="%card%" admin=disabled
goto done
:Lab_enable
netsh int set interface name="%card%" admin=enabled
goto done  

rem ==========================================================================
:done
echo Current Network Setting:  

echo -------------------------------------------------------------------------
netsh interface ip show config "%card%"
echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ipconfig /all
pause
goto Lab_choice  

:Lab_help
cls
echo Help Infomation - Advance Usage
echo -------------------------------------------------------------------------
echo ? get help.
echo.
pause
goto Lab_choice

由阿志翻译的飞鸽传书(IPMsg中文版),其日志部分(包括“关键字”和日期格式等)同样被翻译为中文,这本身没有什么不好,但是如果你想用IPMsg官方网(日文)(或英文)推荐的日志查看器(IPmsgView),那就不行了,除非将日志转为原始格式。

这里提供一个Javascript实现的在线转换器,可以帮你解决以上问题。如果您有上万行记录,或者机器性能不够自信,请分批转换。

http://labs.xianyun.org/trans/IPMsg-logs-trans.html

这里附上源码:

function trans2(src){
	var r = src.replace(/^ 来自: /mg, " From: ");
	r = r.replace(/^ 发往: /mg, " To: ");
	r = r.replace(/^  (文件)/mg, "  (files)");
	var m=["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
	var w={"一":"Mon","二":"Tue","三":"Wed","四":"Thu","五":"Fri","六":"Sat","日":"Sun"};
	return r.replace(/^ 时间: ([0-9]{4})-([0-9]{2})-([0-9]{2}) (?:星期(.)) ([0-9]{2}:[0-9]{2}:[0-9]{2})(?: ((组播))?((RSA))?((封装))?)?/mg, function($0,$1,$2,$3,$4,$5,$6,$7,$8){
		var t=($6?"(multi)":"")+($7?"(RSA)":"")+($8?"(sealed)":""); // multi, RSA, sealed
		return " at "+w[$4]+" "+m[$2|0]+" "+$3+" "+$5+" "+$1+(t?" "+t:"");
	});
}

在javaeye.com论坛上看到JSI Side 代码风格与规范,里面提到的大部分细节/技巧都很有创意,但是看到关于原始类型对象量的部分,正好我也有过“研究”,想说两句,于是发现要注册,我觉得javaeye.com还是不错的,便填写资料注册之,注册过程/之后发现激活邮件里竟然带有我输入的原始明文密码,失望1;算了,有话想说,先吐为快吧,却发现新注册用户需要在三天之后才能评论,天哪,三天,此时我都已经无语了,失望2;跑到作者javaeye博客上,发现和论坛一样,也是3天….。

下面是我想说的两点,其实本身并没什么好说的,都是关于对象比较的,更多介绍请参看我的《深入Javascript对象比较》一文:

1.    new String(”test”) != new String(”test”);
两次new String()得到两个(不同的)对象,内存地址当然不相同。

2.    if(new Boolean(false)){
        alert(”执行到”)
      }else{
        alert(”未被执行”)
      }
new Boolean()得到的也是对象,在if里相当于true,当然“执行到”,你可以试一下: if(new Boolean(false).valueOf())

前段时间不记得在哪里看到的说法:Javascript全等于(===)比普通等于(==)效率低,我当时在没有测试的情况下就隐约相信了这样的提法,因为初步想来,要多一个等号字符,要同时比较类型和值,效率低一点不是没有道理的。有了这种想法,就时时顾虑着我之前偏向于使用“强类型”的完全等于比较符是否于我不利。

今天一位同事看我代码时“抱怨”我用的完全等于太多了,并随口问了句“三个等号效率要高一些吗?”兴许说者无心,但是听着有意,在Editplus里随手写了几行测试代码,却发现结果与前文提到的说法完全相反:

var I=400000;
var d1 = new Date();
for (var i=0; i<I; i++){
 1==”1″;
}
d1 = new Date()-d1;

var d2 = new Date();
for (var i=0; i<I; i++){
 1===”1″;
}
d2 = new Date()-d2;

document.write(d1+”:”+d2);

测试结果是完全等于(===)效率要高于普通等于(==),我猜想造成这样的结果缘由如下:完全等于不进行类型转换,但是普通等于需要进行类型转换(Javascript是弱类型、但不是无类型)。

注:这里使用了两个类型不同的对象/值进行比较,如果换成同类型对象/值进行比较(如:1==1/1===1)则效率相当。

关于使用等于/完全等于的建议:
1. 如果程序对“强”类型不作要求,或者看重代码量(虽然我认为多加几个等号代码也多不到哪里去),则建议使用等于(==);
2. 否则建议使用完全等于(===)。

我过多使用完全等于号即考虑类型匹配性,如果不匹配,快速失败。

今天看了dennis的《用递归计算阶乘咋不行呢?》受益良多,这里做下小结。

传统的递归算法写起来很漂亮,代码很简洁,但是没递归一次就需要更深一层的堆栈支持,可能会造成内存溢出而失败,所以递归和goto语句一样声名狼藉。

甚至《代码大全》的作者有这样一句话:如果为我工作的程序员用递归去计算阶乘,那么我宁愿换人。作者对递归的态度相当谨慎,这在静态命令式语言中显然是正确的,但是在函数式语言中,由于有尾递归优化的存在,递归反而是最自然的形式,况且我打心里认为递归更符合人类思维。(by dennis)


尾递归就是从最后开始计算,每递归一次就算出相应的结果,也就是说,函数调用出现在调用者函数的尾部,因为是尾部,所以根本没有必要去保存任何局部变量,直接让被调用的函数返回时越过调用者,返回到调用者的调用者去。举例说明。
线性递归(传统递归方式):

function recursion(n){
    return n==1?1:n*recursion(n-1);
}

尾递归:

function tailRecursion(n, a){
    a = a||1; // 尾递归之尾,即上次递归结果。
    return n==1?a:tailRecursion(n-1, a*n);
}



这里将基于尾递归的求数值阶乘算法贴下:

Math.factorial_III = function(n){
    var a = arguments[1]||1;
    return n<=1?a:Math.factorial_III(n-1, a*n);
};

效率上和循环迭代、阶乘改进算法相当甚至稍胜出(ie6,firefox2,safari3),普通递归的效率最为底下,且需要深入堆栈。

参考:
尾递归》-百度百科
用递归计算阶乘咋不行呢?》-dennis

以前用过各种博客系统,自己也写了一个(由于朋友赞助的服务器无法继续使用,只留了在本地演示)。很长时间以来一直使用Google收购的Blogger.com提供的服务,并绑定到自己的blog.xianyun.org域名下,由于国内过于和谐的缘故,Google DNS服务器也无法访问了,就另图出路。久仰WordPress大名,特来瞻仰。

 大概是系统的原因,以前在Blogger.com的日志暂时无法导入过来,实在是遗憾。

昨天申请的帐号,今天写第一篇,以自贺乔迁之喜。最近对数学再返无穷兴趣,在一个数学方面极好的博客上读得关于阶乘计算的好文,就把其中一个较易实现的改进算法发布如下(Javascript实现),初来乍到,不知道怎么发布源代码,请见谅:

/**
 * 求阶乘的改进算法。
 * @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.isNegativeInteger()){throw new Error(”param error.”)}
    if (n===0){return 1;}
    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));
    }
    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);
};

在封装一个模拟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;
};

// 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

看《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 (重载)
方法与父类方法同名,不同传入参数(个数或/和类型),同/不同返回参数类型。

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

利用命令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 命令“。