大家看到标题后的第一个问题可能是:“我们需要这样做吗?”

如果我们开发的是局域网 Web 应用的话,可能没有必要这样做。但如果我们的 Web 应用面向的是互联网上的成千上万的用户,这样做就很必要了。因为在现实世界中并不是所有的用户都有高数率的网络连接,也许用户使用的是拨号接入,移动设备,3G,或者是 USB 网络加密狗。如果我们没有在低数率的网络环境中测试过我们 Web 应用,极有可能在上线后收到一些意想不到的关于系统性能方面的抱怨。这个时候无论我们的 Web 应用界面多么地 Web 2.0,功能多么地强大,对于用户来说都失去了使用价值。

目前有很多工具能够模拟慢速网络,值得一提的是 Firefox Throttle,这是一个 Firefox 插件,你可以设置上载和下载的数率,并且监控当前带宽的使用情况。另一个非常有用的特性是它可以控制你的 localhost 的连接数率,对本地测试很有用。

另一个工具是 Sloppy,它是一个 Java Web Start application。

 

  本文向大家简单描述一下DIV+CSS相对IE6 IE7和IE8兼容问题整理,重点介绍一下IE6 IE7和IE8等浏览器的区别和联系,相信本文介绍一定会让你有所收获。

  DIV+CSS相对IE6 IE7和IE8兼容问题整理

  1.区别IE和非IE浏览器

以下是代码片段:
#tip{
background:blue;/*非IE背景?色*/
background:red9;/*IE6、IE7、IE8背景?色*/
}

  2.区别IE6,IE7,IE8,FF

  【区别符号】:「9」、「*」、「_」

  【示例】:

以下是代码片段:
#tip{
background:blue;/*Firefox背景变蓝色*/
background:red9;/*IE8背景变红色*/
*background:black;/*IE7背景变黑色*/
_background:orange;/*IE6背景变橘色*/
}

  【说明】:因为IE系列浏览器可读「9」,而IE6和IE7可读「*」(米字号),另外IE6可辨识「_」(底线),因此可以依照顺序写下来,就会让浏览器正确的读取到自己看得懂得CSS语法,所以就可以有效区分IE各版本和非IE浏览器(像是Firefox、Opera、 GoogleChrome、Safari等)。

  3.区别IE6、IE7、Firefox(方法1)

  【区别符号】:「*」、「_」

  【示例】:

以下是代码片段:
#tip{
background:blue;/*Firefox背景变蓝色*/
*background:black;/*IE7背景变黑色*/
_background:orange;/*IE6背景变橘色*/
}

  【说明】:IE7和IE6可读「*」(米字号),IE6又可以读「_」(底线),但是IE7却无法读取「_」,至于Firefox(非IE浏览器)则完全无法辨识「*」和「_」,因此就可以透过这样的差异性来区分IE6、IE7、Firefox

  4.区别IE6、IE7、Firefox(方法2)

  【区别符号】:「*」、「!important」

  【示例】:

以下是代码片段:
#tip{
background:blue;/*Firefox背景变蓝色*/
*background:green!important;/*IE7背景变绿色*/
*background:orange;/*IE6背景变橘色*/
}

  【说明】:IE7可以辨识「*」和「!important」,但是IE6只可以辨识「*」,却无法辨识「!important」,至于Firefox可以读取「!important」但不能辨识「*」因此可以透过这样的差异来有效区隔IE6、IE7、Firefox。

  我们知道,PHP语言的合理运用可以帮助我们实现导出Word文档的功能。今天我们将为大家介绍PHP处理Word转PDF的相关实现方法。

  PHP处理Word转PDF代码示例:

PHP代码
  1. <?php       
  2. set_time_limit(0);       
  3. function MakePropertyValue($name,$value,$osm){       
  4. $oStruct = $osm->Bridge_GetStruct       
  5. ("com.sun.star.beans.PropertyValue");       
  6. $oStruct->Name = $name;       
  7. $oStruct->Value = $value;       
  8. return $oStruct;       
  9. }       
  10. function word2pdf($doc_url$output_url){       
  11. $osm = new COM("com.sun.star.ServiceManager")       
  12. or die ("Please be sure that OpenOffice.org     
  13. is installed.
    "
    );       
  14. $args = array(MakePropertyValue("Hidden",true,$osm));       
  15. $oDesktop = $osm->createInstance("com.sun.star     
  16. .frame.Desktop");       
  17. $oWriterDoc = $oDesktop->loadComponentFromURL       
  18. ($doc_url,"_blank", 0, $args);       
  19. $export_args = array(MakePropertyValue       
  20. ("FilterName","writer_pdf_Export",$osm));       
  21. $oWriterDoc->storeToURL($output_url,$export_args);       
  22. $oWriterDoc->close(true);       
  23. }       
  24. $output_dir = "D:/LightTPD/htdocs/";       
  25. $doc_file = "D:/LightTPD/htdocs/2.doc";       
  26. $pdf_file = "2.pdf";       
  27. $output_file = $output_dir . $pdf_file;       
  28. $doc_file = "file:///" . $doc_file;       
  29. $output_file = "file:///" . $output_file;       
  30. word2pdf($doc_file,$output_file);       
  31. ?>  

 在网上看到一篇文章介绍五个免费开源的数据挖掘软件,转过来。

Orange

Orange [attach=2567]是一个基于组件的数据挖掘和机器学习软件套装,它的功能即友好,又很强大,快速而又多功能的可视化编程前端,以便浏览数据分析和可视化,基绑定了Python以进行脚本开发。它包含了完整的一系列的组件以进行数据预处理,并提供了数据帐目,过渡,建模,模式评估和勘探的功能。其由C++ 和 Python开发,它的图形库是由跨平台的Qt框架开发。

RapidMiner

RapidMiner, 以前叫 YALE (Yet Another Learning Environment), 其是一个给机器学习和数据挖掘和分析的试验环境,同时用于研究了真实世界数据挖掘。它提供的实验由大量的算子组成,而这些算子由详细的XML 文件记录,并被RapidMiner图形化的用户接口表现出来。RapidMiner为主要的机器学习过程提供了超过500算子,并且,其结合了学习方案和Weka学习环境的属性评估器。它是一个独立的工具可以用来做数据分析,同样也是一个数据挖掘引擎可以用来集成到你的产品中。

 

Weka

由Java开发的 Weka (Waikato Environment for Knowledge Analysis) 是一个知名机器学机软件,其支持几种经典的数据挖掘任务,显著的数据预处理,集群,分类,回归,虚拟化,以及功能选择。其技术基于假设数据是以一种单个文件或关联的,在那里,每个数据点都被许多属性标注。 Weka 使用Java的数据库链接能力可以访问SQL数据库,并可以处理一个数据库的查询结果。它主要的用户接品是Explorer,也同样支持相同功能的命令行,或是一种基于组件的知识流接口。

JHepWork

为科学家,工程师和学生所设计的 jHepWork 是一个免费的开源数据分析框架,其主要是用开源库来创建 一个数据分析环境,并提供了丰富的用户接口,以此来和那些收费的的软件竞争。它主要是为了科学计算用的二维和三维的制图,并包含了用Java实现的数学科学库,随机数,和其它的数据挖掘算法。 jHepWork 是基于一个高级的编程语言 Jython,当然,Java代码同样可以用来调用 jHepWork 的数学和图形库。

KNIME

KNIME (Konstanz Information Miner) 是一个用户友好,智能的,并有丰演的开源的数据集成,数据处理,数据分析和数据勘探平台。它给了用户有能力以可视化的方式创建数据流或数据通道,可选择性地运行一些或全部的分析步骤,并以后面研究结果,模型 以及 可交互的视图。 KNIME 由Java写成,其基于 Eclipse 并通过插件的方式来提供更多的功能。通过以插件的文件,用户可以为文件,图片,和时间序列加入处理模块,并可以集成到其它各种各样的开源项目中,比如:R语言,Weka, Chemistry Development Kit, 和 LibSVM.

源文:http://www.junauza.com/2010/11/free-data-mining-software.html(墙)

两天,jnj在本站发布了《如何在低速率网络中测试 Web 应用》,那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具,这样,你就可以知道你的服务器以及你的WEB应用能够顶得住多少的并发量,以及你的网站的性能。我相信,北京奥组委的订票网站的开发团队并不知道有这样的测试工具。

Grinder –  Grinder是一个开源的JVM负载测试框架,它通过很多负载注射器来为分布式测试提供了便利。 支持用于执行测试脚本的Jython脚本引擎HTTP测试可通过HTTP代理进行管理。根据项目网站的说法,Grinder的 主要目标用户是“理解他们所测代码的人——Grinder不仅仅是带有一组相关响应时间的‘黑盒’测试。由于测试过程可以进行编码——而不是简单地脚本 化,所以程序员能测试应用中内部的各个层次,而不仅仅是通过用户界面测试响应时间。

Pylot -Pylot是一款开源的测试web service性能和扩展性的工具,它运行HTTP 负载测试,这对容量计划,确定基准点,分析以及系统调优都很有用处。Pylot产生并发负载(HTTP Requests),检验服务器响应,以及产生带有metrics的报表。通过GUI或者shell/console来执行和监视test suites。

Web Capacity Analysis Tool (WCAT) – 这是一种轻量级负载生成实用工具,不仅能够重现对 Web 服务器(或负载平衡服务器场)的脚本 HTTP 请求,同时还可以收集性能统计数据供日后分析之用。WCAT 是多线程应用程序,并且支持从单个源控制多个负载测试客户端,因此您可以模拟数千个并发用户。该实用工具利用您的旧机器作为测试客户端,其中每个测试客户端又可以产生多个虚拟客户端(最大数量取决于客户端机器的网络适配器和其他硬件)。您可以选择使用 HTTP 1.0 还是 HTTP 1.1 请求,以及是否使用 SSL。并且,如果测试方案需要,您还可以使用脚本执行的基本或 NTLM 身份验证来访问站点的受限部分。(如果您的站点使用 cookie、表单或基于会话的身份验证,那您可以创建正确的 GET 或 POST 请求来对测试用户进行身份验证。)WCAT 还可管理您站点可能设置的任何 cookie,所以配置文件和会话信息将永久保存。

fwptt – fwptt 也是一个用来进行WEB应用负载测试的工具。它可以记录一般的请求,也可以记录Ajax请求。它可以用来测试 asp.net, jsp, php 或是其它的Web应用。

JCrawler – JCrawler是一个开源( CPL) 的WEB应用压力测试工具。通过其名字,你就可以知道这是一个用Java写的像网页爬虫一样的工具。只要你给其几个URL,它就可以开始爬过去了,它用一种特殊的方式来产生你WEB应用的负载。这个工具可以用来测试搜索引擎对你站点产生的负载。当然,其还有另一功能,你可以建立你的网站地图和再点击一下,将自动提交Sitemap给前5名的搜索引擎!

Apache JMeter – Apache JMeter是一个专门为运行和服务器装载测试而设计的、100%的纯Java桌面运行程序。原先它是为Web/HTTP测试而设计的,但是它已经扩展以支持各种各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库中的服务器的运行情况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据显示,测试同步及测试的创建和执行。

Siege -Siege(英文意思是围攻)是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。 Siege 支持基本的认证,cookies, HTTP 和 HTTPS 协议。

http_load – http_load 以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死。可以可以测试HTTPS类的网站请求。

Web Polygraph – Web Polygraph这个软件也是一个用于测试WEB性能的工具,这个工具是很多公司的标准测试工具,包括微软在分析其软件性能的时候,也是使用这个工具做为基准工具的。很多招聘测试员的广告中都注明需要熟练掌握这个测试工具。

OpenSTA – OpenSTA是一个免费的、开放源代码的web性能测试工具,能录制功能非常强大的脚本过程,执行性能测试。例如虚拟多个不同的用户同时登陆被测试网站。其还能对录制的测试脚本进行,按指定的语法进行编辑。在录制完测试脚本后,可以对测试脚本进行编辑,以便进行特定的性能指标分析。其较为丰富的图形化测试结果大大提高了测试报告的可阅读性。OpenSTA 基于CORBA 的结构体系,它通过虚拟一个proxy,使用其专用的脚本控制语言,记录通过proxy 的一切HTTP/S traffic。通过分析OpenSTA的性能指标收集器收集的各项性能指标,以及HTTP 数据,对系统的性能进行分析。 

如果你处在局域网的内网中,想获取你的外网IP地址。这里有一个使用Javascript调用ip138获取外网IP的方法,十分简单,代码如下:

 

JavaScript代码
  1. <script language="javascript">      
  2. xml=new ActiveXObject("Microsoft.XMLHTTP");      
  3. xml.open("GET","http://www.ip138.com/ip2city.asp",false);      
  4. xml.send();      
  5. kk=xml.ResponseText;      
  6. i=kk.indexOf("[");      
  7. ie=kk.indexOf("]");      
  8. ip=kk.substring(i+1,ie);      
  9. document.write("<span style=‘color:red;font-size:12;‘ cursor=‘hand‘>您的IP地址是:" + ip + "</span>");      
  10. </script>  

 

  SSL、SET和PGP是当前Internet 上比较常用的加密方法,它们在各自的应用范围内都拥有很大的用户群。本文将对这三种流行的加密方法做一比较介绍。

  SSL(Secure Socket Layer)

  SSL协议是由Netscape首先发表的网络资料安全传输协定,其首要目的是在两个通信间提供秘密而可靠的连接。该协议由两层组成,底层是建立在可靠的传输协议(例如:TCP)上的是SSL的记录层,用来封装高层的协议。SSL握手协议准许服务器端与客户端在开始传输数据前,能够通过特定的加密算法相互鉴别。SSL的先进之处在于它是一个独立的应用协议,其它更高层协议能够建立在SSL协议上。

  目前大部分的Web Server及Browser大多支持SSL的资料加密传输协定。因此,可以利用这个功能,将部分具有机密性质的网页设定在加密的传输模式,如此即可避免资料在网络上传送时被其他人窃听。

  SSL是利用公开密钥的加密技术(RSA)来作为用户端与主机端在传送机密资料时的加密通讯协定。目前,大部分的Web Server及Browser都广泛使用SSL 技术。

  对消费者而言,SSL已经解决了大部分的问题。但是,对电子商务而言问题并没有完全解决,因为SSL只做能到资料保密,厂商无法确定是谁填下了这份资料,即使这一点做到了,还有和银行清算的问题。

  SET(Secure Electronic Transaction)

  SET是IBM、信用卡国际组织(VISA/MasterCard)以及相关厂商针对网络电子交易共同制定的安全协议,它运用了RSA安全的公钥加密技术,具有资料保密性、资料完整性、资料来源可辨识性及不可否认性,是用来保护消费者在Internet持卡付款交易安全中的标准。SET 1.0版于1997年6月正式问世。现在,SET已成为国际上所公认的在Internet电子商业交易中的安全标准。

  SET协议用在安全电子银行卡的支付系统中,使用客户端的浏览器,应用于从商业站点到商业银行中。网上银行使用已经存在的程序和设备通过确认信用卡,清算客户银行户头完成交易。SET协议则通过隐藏信用卡号来保证整个支付过程的安全。所以,SET必须保证信用卡持有者与银行在现存系统和网络上,能够保持持续的联系。SET协议为在不同的系统中使用信用卡创建了一套完整的解决办法。可靠的身份验证使SET成为一个非常好的在线支付系统。它使交易中每个合法参与者能够拥有一个合理的身份,而对持卡者的身份验证是由银行来进行的。当然这其中还包括其它服务,比如:身份认证、客户服务等。这是建立另外一个可靠的用户连接的方法。同时可以方便在发生纠纷时进行仲裁。

  SET与SSL都是做消费者的认证工作的,也就是说不仅全球数据网购物站需要在认证单位进行认证,消费者也必须从认证机构获取认证。

  SET是由Electronic Wallet(电子钱包)、Merchant Server(商店端服务机)、Payment Gateway(付款转接站)和Certification Authority(认证中心)组成的,它们构成了Internet 上符合SET标准的信用卡授权交易。

  一般来说,在开放式网络上进行金融交易以SSL及SET交易协定为主,其中又以 SET被国际公认为最安全的。有鉴于此,VISA/MASTER在1997年6月提出了名为电子交易(SET:Secure Electronic Transaction)的网络交易安全规格,这个规格基本上也是利用与SSL同样的大数值编码技术,来保证资料保密与使用者认证的工作。

  目前信用卡的安全交易标准SET仍在进行前期建设。在该系统尚未正式运作前,消费者在网络上利用信用卡进行购物时,仍须承担信用卡资料被盗用的风险。

  敏感性资料在传递过程中被窃听,交易资料在传递过程中被篡改,交易的双方身份被假冒,完全相同的订单重复送出,这些问题即使对于目前SET安全交易标准来说仍旧有一定困难。利用WWW给用户提供机密性的资料时更多的会使用User Profile、SSL或CA,以避免资料在网络上传送时被其他人窃听。

  PGP(Pretty Good Privacy)

  目前,还有一种非常好的连接网络与桌面的安全方法,PGP(Pretty Good Privacy)。

  PGP是一个公钥加密程序,与以前的加密方法不同的是PGP公钥加密的信息只能用私钥解密。在传统的加密方法中,通常一个密钥既能加密也能解密。那么在开始传输数据前,如何通过一个不安全的信道传输密钥呢?使用PGP公钥加密法,你可以广泛传播公钥,同时安全地保存好私钥。由于只有你可拥有私钥,所以,任何人都可以用你的公钥加密写给你的信息,而不用担心信息被窃听。

  使用PGP的另一个好处是可以在文档中使用数字签名。一个使用私钥加密的密钥只能用公钥解密。这样,如果人们阅读用你的公钥解密后的文件,他们就会确定只有你才能写出这个文件。

  PGP是一个软件加密程序,用户可以使用它在不安全的通信链路上创建安全的消息和通信。PGP协议已经成为公钥加密技术和全球范围消息安全性的事实标准。因为所有人都能看到它的源代码,从而查找出故障和安全性漏洞,所有的故障和漏洞都在发现后被改正了。

    * 在支持position:fixed的浏览器上使用position:fixed,这样当拖动共同条的时候弹窗位置是固定的。
    * 优化了IE6下onscroll 事件绑定的函数

还需改进的地方(过段事件等项目应用的时候会修改):

    * 30秒后自动关闭
    * 方便的插入弹出内容

 

JavaScript代码
  1. var RBMessage={      
  2.     boxW:200,      
  3.     boxH:101,      
  4.     init:function(){      
  5.         var that = this;      
  6.         this.createBox();      
  7.         document.getElementById("msg_close").onclick = function() {      
  8.             that.BoxWin.style.display="none";      
  9.         }      
  10.     },      
  11.     bind: function() { //绑定窗口滚动条与大小变化事件      
  12.         var that = this,      
  13.         st, rt;      
  14.         window.onscroll = function() {      
  15.             if( !!window.ActiveXObject &amp;&amp; !window.XMLHttpRequest ){      
  16.                 clearTimeout(st);      
  17.                 clearTimeout(that.timer2);      
  18.                 that.setOpacity(0);      
  19.                 st = setTimeout(function() {      
  20.                     that.BoxWin.style.top = that.getY().top;      
  21.                     that.show();      
  22.                 },500);      
  23.             }      
  24.         };      
  25.         window.onresize = function(){      
  26.             if (!!window.ActiveXObject &amp;&amp; !window.XMLHttpRequest) {      
  27.                 clearTimeout(rt);      
  28.                 rt = setTimeout(function(){      
  29.                     that.BoxWin.style.top = that.getY().top      
  30.                 }, 100);      
  31.             }      
  32.         }      
  33.     },      
  34.     show: function() { //渐显      
  35.         clearInterval(this.timer2);      
  36.         var that = this,      
  37.         fx = this.fx(0, 100, 0.1),      
  38.         t = 0;      
  39.         this.timer2 = setInterval(function() {      
  40.             t = fx();      
  41.             that.setOpacity(t[0]);      
  42.             if (t[1] == 0) {      
  43.                 clearInterval(that.timer2)      
  44.             }      
  45.         },      
  46.         10);      
  47.     },      
  48.     fx: function(a, b, c) { //缓冲计算      
  49.         var cMath = Math[(a – b) > 0 ? "floor""ceil"],      
  50.         c = c || 0.1;      
  51.         return function() {      
  52.             return [a += cMath((b – a) * c), a – b]      
  53.         }      
  54.     },      
  55.     setOpacity: function(x) { //设置透明度      
  56.         var v = x >= 100 ? ‘‘‘Alpha(opacity=‘ + x + ‘)‘;      
  57.         this.BoxWin.style.visibility = x < = 0 ? ‘hidden‘‘visible‘//IE有绝对或相对定位内容不随父透明度变化的bug      
  58.         this.BoxWin.style.filter = v;      
  59.         this.BoxWin.style.opacity = x / 100;      
  60.     },      
  61.     getY: function() { //计算移动坐标      
  62.         var d = document,      
  63.         b = document.body,      
  64.         e = document.documentElement;      
  65.         var s = Math.max(b.scrollTop, e.scrollTop);      
  66.         var h = /BackCompat/i.test(document.compatMode) ? b.clientHeight: e.clientHeight;      
  67.         var h2 = this.BoxWin.offsetHeight;      
  68.         return {      
  69.             foot: s + h + h2 + 2 + ‘px‘,      
  70.             top: s + h – h2 – 2 + ‘px‘     
  71.         }      
  72.     },      
  73.     moveTo: function(y) { //移动动画      
  74.         clearInterval(this.timer);      
  75.         var that = this;      
  76.         var moveTopNum=-that.boxH;      
  77.         this.timer = setInterval(function() {      
  78.             moveTopNum+=5;      
  79.             that.BoxWin.style.bottom =  moveTopNum +‘px‘;      
  80.             if (moveTopNum >= 0) {      
  81.                 clearInterval(that.timer);      
  82.                 that.bind();      
  83.             }      
  84.         },50);      
  85.         return this;      
  86.     },      
  87.     createBox:function(){      
  88.         this.BoxWin=document.createElement(‘div‘);      
  89.         this.BoxWin.style.width = this.boxW+"px";      
  90.         this.BoxWin.style.height =  this.boxH+"px";      
  91.         this.BoxWin.style.bottom = – this.boxH+"px";      
  92.         this.BoxWin.id = "msg_win";      
  93.         this.BoxWin.innerHTML = ‘<div class="icos"><a href="javascript:void 0" title="关闭" id="msg_close">X</a></div><div id="msg_title">温馨提示(标题)</div><div id="msg_content"></div>‘;      
  94.         document.body.appendChild(this.BoxWin);      
  95.         var that = this;      
  96.         setTimeout(function() { //初始化最先位置      
  97.             that.BoxWin.style.display = ‘block‘;      
  98.             that.moveTo();      
  99.         },1000);      
  100.         return this;      
  101.     }      
  102. };      
  103. RBMessage.init();