存档

2009年9月 的存档

祝福大家节日快乐

2009年9月30日 1 条评论

好久没上来更新了,惭愧!这个月疲于找工作,面试,从这么多面试的过程中,学到了很多东西,也知道了自己还有很多方面的不足,需要努力了。

今天下午就要回家了,哈哈,心里特高兴,昨晚发现笔记本键盘坏了,那个懊恼,键盘上的方向键下箭头一直是被按下的状态,搞得我根本无法工作,索性自个儿把键盘拆了,接了个外置键盘,哈哈,还很好用,十一回来后再买个键盘吧。

首先祝福大家十一快乐,中秋更快乐,能回家和家里人团圆,还是回趟家吧,家里的爸妈年岁已高了,需要子女常回家看看,离家远了,电话也少了,有机会回家还是要回家的,呵呵。

电脑不能进系统 显示器停留在显示器品牌的那一屏

2009年9月24日 没有评论

今天一同事打开电脑的时候,不能进入系统了,界面停留在显示屏启动的那一刻,然后什么都没有了,键盘是激活了的,但显示器没有反应,就停留在显示显示器品牌的那一屏,刚开始,我以为是内存条有问题,拔下来擦擦,安装上还是一样的问题,分析下线路和电源,发现也没什么问题,这就怪了,还好,键盘是启动了的,按了下控制大小写的Caps Lock键和NumLock键,右边的小键盘上的灯有反应,呵呵,就想进入CMOS看看,试了下通常的F2和Del键不能进入CMOS,于是我就想把F1~F12按个遍,终于按F11的时候进入到CMOS了,看了看启动项,猛然发现第一启动项为Floppy,但看了看第二启动项为HDD-0,我想如果第一启动项没启动的话,它也应该从第二启动项开始启动啊,怎么就不启动呢,不管怎么的我把第一启动项改为HDD-0—>F10—->Y,经过这么一改,系统马上进去了,我汗…..

javascript 中的全部变量 与 局部变量

2009年9月23日 没有评论

因为一个面试题,我今天测试了下,居然我写的答案是错的,下面是大概意思的源程序:

var a = 100;
function showout(){
   var fullrange = 2 * a;
   var a = 200;
   var halfrange = a / 2;
   alert(fullrange);
   alert(halfrange);
}

开始我想的是既然在function里面定义了局部变量 a ,那function外定义的全局变量在function里面是不会起作用的,所以fullrange和halfrange的值应该分别是:400和100。因为当时是笔试,而不是上机(上机也不会出现这问题,呵呵),所以得出这个答案,面试老师看了之后回答是正确结果,我放心了。
但面试还是有几道题没有做出来,回家仔细的想了下,包括这道题,我在电脑上一测试,俺的天,得到fullrange的值居然是NaN,大呼怎么可能…. 于是我反复测试,如果我把function里面定义的:var a = 200;改为:a = 200;那么得出fullrange和halfrange的值的答案分别是:200和100,想了下其实如果我这里这样改的话,那么function里面的a就不是局部变量了,而是全局变量a,改变了全局变量a的值而已,所以得到值也就200和100了。那我就纳闷了,为什么定义了局部变量,而得不到fullrange的值呢,而且是个NaN,说明var fullrange = 2 * a;中a是没有定义的即typeof a为undefined。那么这也只能说明,在JavaScript中的function里面是严格按照顺序执行的,在function里面如果定义了与全局变量名称相同的局部变量,那么function里面引用到这个变量的都以局部变量来处理,用 this.变量名字 或 window.变量名字 才能引用function外部与变量名字相同的全局变量。
这里的全局变量和局部变量搞的很头晕了,我个人认为是:
在JavaScript执行代码之前,先处理变量声明,不管这个变量在什么位置,如果在function中变量显示声明,即变量在赋值语句中出现在左边,但没有用var声明,则把这个变量看成时全局变量。在function中,如果存在着用var声明的局部变量的名称与全局变量的名称相同,那么function中引用这个变量值的时候在应为局部变量的值,除非用this或window来修饰这个变量,才能取到全局变量的值。

javascript中二进制 八进制 十进制 十六进制相互转换

2009年9月21日 没有评论

在有的时候,我们需要把某些十进制数字,或则字母转换成二进制,或八进制,或十六进制,在JavaScript中,像这种进制很容易转换,如:
十进制转换成其他进制:

  • objectname.toString([radix])
  • objectname 必选项。要得到字符串表示的对象。
  • radix 可选项。指定将数字值转换为字符串时的进制。
  • radix 的最小值是 2,最大值是 36(用 10 个数字和 26 个英文字母表示)。
  • 返回对象的字符串表示。
var num = 10;
document.write(m.toString(2) + "<br>"); // 显示为 1010
document.write(m.toString(8) + "<br>"); // 显示为 12
document.write(m.toString(10) + "<br>"); // 显示为 10
document.write(m.toString(16) + "<br>"); // 显示为 a,注意是小写。

其他进制转换成十进制:
parseInt(numstring, [radix])

  • numstring 必选项。要转换为数字的字符串。
  • radix 可选项。在 2 和 36 之间的表示 numstring 所保存数字的进制的值。如果没有提供,则前缀为 ’0x’ 的字符串被当作十六进制,前缀为 ’0′ 的字符串被当作八进制。所有其它字符串都被当作是十进制的。
  • 返回由字符串转换得到的整数。
document.write(parseInt(1010, 2) + "<br>"); // 显示为 10
document.write(parseInt(12, 8) + "<br>"); // 显示为 10
document.write(parseInt(10, 10) + "<br>"); // 显示为 10
document.write(parseInt("a", 16) + "<br>"); // 显示为 10
document.write(parseInt("A", 16) + "<br>"); // 显示为 10
分类: javascript 标签:

attachEvent 与 addEventListener 对同一物件事件多次绑定的触发顺序

2009年9月20日 没有评论

再来讲述JavaScript中的attachEvent 与 addEventListener使用方法,在有的时候,可以想像一下使用注册事件方法对同一物件事件进行多次绑定,那么这里就存在了一个触发顺序,看下面实例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv=Content-Type content="text/html;charset=gb2312">
<script type="text/javascript">
window.onload=function(){
var testbut = document.getElementById("btn_test");
var info = document.getElementById("info")
 if (window.attachEvent)
{
    //IE
    testbut.attachEvent("onclick", function () { info.innerHTML += "1" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "2" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "3" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "4" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "5" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "6" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "7" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "8" + "
"; });
    testbut.attachEvent("onclick", function () { info.innerHTML += "9" + "
"; });
}
else
{
    //Firefox
    testbut.addEventListener("click", function () { info.innerHTML += "1" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "2" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "3" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "4" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "5" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "6" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "7" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "8" + "
"; }, false);
    testbut.addEventListener("click", function () { info.innerHTML += "9" + "
"; }, false);
}
}
</script>
</head>
<body>
<input id="btn_test" type="button" value="测试" />
<div id="info"></div>
</body>
</html>

IE下输出的结果为:
4  6  8  9  7  5   3  2  1
Firefox下输出的结果为:
1  2  3  4   5  6   7   8  9
从这可以看出在IE下它的触发顺序是乱七八糟的,而在火狐Firefox下,先绑定的先执行,以后得注意点了….

网站连接并发数 什么是并发数

2009年9月19日 没有评论

对于做web的,应该对并发数这个词很熟悉,一直没有对其深了解,下面摘抄一篇文章,讲的挺详细的,记录之,呵呵。

并发连接数是指防火墙或代理服务器对其业务信息流的处理能力,是防火墙能够同时处理的点对点连接的最大数目,它反映出防火墙设备对多个连接的访问控制能力和连接状态跟踪能力,这个参数的大小直接影响到防火墙所能支持的最大信息点数。

并发连接数是衡量防火墙性能的一个重要指标。在目前市面上常见防火墙设备的说明书中大家可以看到,从低端设备的500、1000个并发连接,一直到高端设备的数万、数十万并发连接,存在着好几个数量级的差异。那么,并发连接数究竟是一个什么概念呢?它的大小会对用户的日常使用产生什么影响呢?要了解并发连接数,首先需要明白一个概念,那就是“会话”。这个“会话”可不是我们平时的谈话,但是可以用平时的谈话来理解,两个人在谈话时,你一句,我一句,一问一答,我们把它称为一次对话,或者叫会话。同样,在我们用电脑工作时,打开的一个窗口或一个Web页面,我们也可以把它叫做一个“会话”,扩展到一个局域网里面,所有用户要通过防火墙上网,要打开很多个窗口或Web页面发(即会话),那么,这个防火墙,所能处理的最大会话数量,就是“并发连接数”。

像路由器的路由表存放路由信息一样,防火墙里也有一个这样的表,我们把它叫做并发连接表,是防火墙用以存放并发连接信息的地方,它可在防火墙系统启动后动态分配进程的内存空间,其大小也就是防火墙所能支持的最大并发连接数。大的并发连接表可以增大防火墙最大并发连接数,允许防火墙支持更多的客户终端。尽管看上去,防火墙等类似产品的并发连接数似乎是越大越好。但是与此同时,过大的并发连接表也会带来一定的负面影响:

1.并发连接数的增大意味着对系统内存资源的消耗
以每个并发连接表项占用300B计算,1000个并发连接将占用300B×1000×8bit/B≈2.3Mb内存空间,10000个并发连接将占用23Mb内存空间,100000个并发连接将占用230Mb内存空间,而如果真的试图实现1000000个并发连接的话那么,这个产品就需要提供2.24Gb内存空间!

2.并发连接数的增大应当充分考虑CPU的处理能力
CPU的主要任务是把网络上的流量从一个网段尽可能快速地转发到另外一个网段上,并且在转发过程中对此流量按照一定的访问控制策略进行许可检查、流量统计和访问审计等操作,这都要求防火墙对并发连接表中的相应表项进行不断的更新读写操作。如果不顾CPU的实际处理能力而贸然增大系统的并发连接表,势必影响防火墙对连接请求的处理延迟,造成某些连接超时,让更多的连接报文被重发,进而导致更多的连接超时,最后形成雪崩效应,致使整个防火墙系统崩溃。

3.物理链路的实际承载能力将严重影响防火墙发挥出其对海量并发连接的处理能力
虽然目前很多防火墙都提供了10/100/1000Mbps的网络接口,但是,由于防火墙通常都部署在Internet出口处,在客户端PC与目的资源中间的路径上,总是存在着瓶颈链路——该瓶颈链路可能是2Mbps专线,也可能是512Kbps乃至64Kbps的低速链路。这些拥挤的低速链路根本无法承载太多的并发连接,所以即便是防火墙能够支持大规模的并发访问连接,也无法发挥出其原有的性能。

有鉴于此,我们应当根据网络环境的具体情况和个人不同的上网习惯来选择适当规模的并发连接表。因为不同规模的网络会产生大小不同的并发连接,而用户习惯于何种网络服务以及如何使用这些服务,同样也会产生不同的并发连接需求。高并发连接数的防火墙设备通常需要客户投资更多的设备,这是因为并发连接数的增大牵扯到数据结构、CPU、内存、系统总线和网络接口等多方面因素。如何在合理的设备投资和实际上所能提供的性能之间寻找一个黄金平衡点将是用户选择产品的一个重要任务。按照并发连接数来衡量方案的合理性是一个值得推荐的办法。

以每个用户需要10.5个并发连接来计算,一个中小型企业网络(1000个信息点以下,容纳4个C类地址空间)大概需要10.5×1000=10500个并发连接,因此支持20000~30000最大并发连接的防火墙设备便可以满足需求;大型的企事业单位网络(比如信息点数在1000~10000之间)大概会需要105000个并发连接,所以支持100000~120000最大并发连接的防火墙就可以满足企业的实际需要; 而对于大型电信运营商和ISP来说,电信级的千兆防火墙(支持120000~200000个并发连接)则是恰当的选择。为较低需求而采用高端的防火墙设备将造成用户投资的浪费,同样为较高的客户需求而采用低端设备将无法达到预计的性能指标。利用网络整体上的并发连接需求来选择适当的防火墙产品可以帮助用户快速、准确的定位所需要的产品,避免对单纯某一参数“愈大愈好”的盲目追求,缩短设计施工周期,节省企业的开支。从而为企业实施最合理的安全保护方案。

在利用并发连接数指标选择防火墙产品的同时,产品的综合性能、厂家的研发力量、资金实力、企业的商业信誉和经营风险以及产品线的技术支持和售后服务体系等都应当纳入采购者的视野,将多方面的因素结合起来进行综合考虑,切不可盲目的听信某些厂家广告宣传中的大并发连接的宣传,要根据自己业务系统、企业规模、发展空间和自身实力等因素多方面考虑。

JavaScript 中的attachEvent与addEventListener方法

2009年9月18日 没有评论

很久没用又忘了在JavaScript中注册事件的使用方法了,这里再回顾下: 因为浏览器的不同,在IE下我们用的是attachEvent()方法,而在Mozilla系列,并不支持该方法,需要用到addEventListener(),下面举例说明:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>TesyJS</title>
</head>
<body>
<button>点击我</button>
<button>点击我</button>
<button>点击我</button>
<script type="text/javascript">
function method1(){
alert("事件触发了");
 }
 var but = document.getElementsByTagName("button");
//IE下用addEventListener,
//Mozilla系列(如FireFox)下用addEventListener
 if(navigator.userAgent.toLowerCase().indexOf("msie")>-1)
    but[0].attachEvent("onclick",method1);
else
   but[0].addEventListener("click",method1,false);
</script>
</body>
</html>

其中ie浏览器下用的结构为:

element.attachEvent(type,listener)

其中element是要绑定函数的对象,括号中只带2个参数:

  • type是事件名称,事件名带”on”(如onclick、onfocus)。
  • listener是要绑定的函数了,记住不要跟括号。

在Mozilla系列的浏览器下,用的结构为:
element.addEventListener(type,listener,useCapture)
其中element是要绑定函数的对象,括号中带3个参数:

  • type是事件名称,要注意的是”onclick”要改为”click”,”onblur”要改为”blur”,也就是说事件名不要带”on”。
  • listener当然就是绑定的函数了,记住不要跟括号.
  • 最后一个参数是个布尔值,表示该事件的响应顺序,auserCapture若为true,则浏览器采用Capture,若为false则采用bubbing方式。建议用false,因为看下面例子(只在Mozilla系列(如Firefox)中测试):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>TesyJS</title>
<script type="text/javascript">
window.onload=function(){
/**
   *改变第三个参数的值,可以发现当都为true的时候,从外到内依次触发事件
   *当都改为false的时候,从内到外依次触发事件
   *当一个true一个false之时,哪个为true先触发哪个的事件。
   **/
document.getElementById("div_test").addEventListener("click",test1,true); document.getElementById("btn_test").addEventListener("click",test2,true);
 }
 function test1(){ alert("外部div层触发") }
 function test2(){ alert("内部input按钮触发") }
</script>
<body>
 <div id="div_test">
   <input id="btn_test" type="button" value="测试" />
 </div>
</body>
</html>

javascript 中的location.pathname

2009年9月18日 没有评论

今天在弄FCKediter的时候,看了下源码,发现在源码中用到:

location.pathname;

这在之前我没怎么注意过,所以研究研究。
location.pathname:
返回URL的域名(域名IP)后的部分。例如 http://www.joymood.cn/wordpress/返回/wordpress/,又或则 http://127.0.0.1/index.html 返回/index.html,注意是带url的域名或域名IP,在磁盘上随便建个Html文件进行location.pathname测试,如浏览器上的路径是:
C:\Documents and Settings\Administrator\桌面\testjs.html,
这样,得到的结果是:
/C:\Documents and Settings\Administrator\桌面\testjs.html
既然提到这了,那我们就分析下下面的URL:
http://www.joymood.cn:8080/test.php?user=admin&pwd=admin#login
想得到整个如上的完整url,我们用:location.href;
得到传输协议http:,我们用:location.protocol;
得到主机名连同端口www.joymood.cn:8080,我们用:location.host;
得到主机名www.joymood.cn,我们用:location.hostname;
得到主机后部分不包括问号?后部分的/test.php,就用我们刚才讲的:location.pathname;
得到url中问号?之后井号#之前的部分?user=admin&pwd=admin,我们就用:
location.search;
得到#之前的部分#login,我们就用location.hash;
经过上面的讲述,我们可以通过location对象的某些属性得到一个完整URL的各个部分。

java创建多级目录

2009年9月17日 没有评论

在编程中,经常要用到创建多级目录,下面通过java来实现:

import java.io.*;
import java.util.*;
public class CreateFolders{
public static void main(String[] args) {
       String   path="c:/aaa/bbb/ccc";
       StringTokenizer   st=new   StringTokenizer(path,"/");
       String   path1=st.nextToken()+"/";
       String   path2 =path1;
       while(st.hasMoreTokens())
       {
             path1=st.nextToken()+"/";
             path2+=path1;
             File inbox   =   new File(path2);
             if(!inbox.exists())
                  inbox.mkdir();
       }
}
}

而用的最多的莫过于根据日期来创建目录进行文章的分类,如20090915用它来在E盘下创建一个E:/2009/09/17的目录而20090917又是一个字符串,须将它转化为:2009/09/17这种格式才好创建目录,下面是我实现的方法:

import java.util.*;
import java.text.*;
import java.io.*;
public class Createdirs{
public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        String dateString = "20090917";
        try {
             Date date = df.parse(dateString);
             String path="E:/"+new SimpleDateFormat("yyyy/MM/dd").format(date);
             //System.out.println(DateFormat.getDateInstance().format(date));
             StringTokenizer st=new StringTokenizer(path,"/");
             String path1=st.nextToken()+"/";
             String path2 =path1;
            while(st.hasMoreTokens())
            {
                    path1=st.nextToken()+"/";
                    path2+=path1;
                    File inbox = new File(path2);
                    if(!inbox.exists())
                        inbox.mkdir();
            }
            } catch (Exception ex) {
             System.out.println(ex.getMessage());
            }
}
}
分类: java 标签: , ,

java 将字符串转换为日期格式

2009年9月17日 没有评论

有时候,我们获取到的日期类型可能为一字符串,如20090915;输出的时候,我们想转化为: 2009年09月15日 这种日期格式,那么我们怎么来将字符串转换为日期格式,下面是转换的代码:

import java.util.*;
import java.text.*;
import java.io.*;
class StrToDate
{
    public static void main(String[] args)
    {
        String dateString = "20090915";
        try {
             Date date=new SimpleDateFormat("yyyyMMdd").parse(dateString);
            //下面将字符串转换为日期格式后显示的格式是2009-09-15
             System.out.println(DateFormat.getDateInstance().format(date));
            //如果想换一种别的格式,可以用下面的办法,得到任何的日期格式都可以
            //输出的结果为2009/09/15
             System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(date));
            //SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
            //输出的结果为2009年09月15日
             System.out.println(new SimpleDateFormat("yyyy年MM月dd日").format(date));
        } catch (Exception ex) {
             System.out.println(ex.getMessage());
        }
    }
}

通过上例代码,就可以转换成我们想要表示的日期格式了。

分类: java 标签: , ,