【转】Comet is Always Better Than Polling

Comet is Always Better Than Polling

by Greg WilkinsNovember 6th, 2007            

               

Comet techniques are advocated when your application needs low latency events to be delivered from the server to the browser. Comet can deliver sub-second latency for messages making possible web applications like chat, games and real-time monitoring of prices and states.

It is often asserted that for applications that don’t need low latency (e.g. email readers), traditional polling is a better alternative. However, some rudimentary analysis shows this assertion to be wrong, and that Comet techniques can be applied to all required latencies and event rates to provide improved data rates and average latencies.

For this analysis, I have considered polling vs. the long-polling technique where a server may hold a poll request for a period of time while waiting for events/messages to be delivered to the browser. In order to ensure that we are comparing apples with apples and oranges with oranges, I have compared configurations that provide the same maximum latency. For example, for a maximum latency of 10s, the polling technique must issue a poll every 10s and the average latency is half that. For the Comet technique long polling, a long poll needs to be issued 10s after the last long poll completes, but the server may hold the long poll for up to 300s while waiting for an event.

The attached spreadsheet contains the calculations, which I have graphed for 1s, 10s and 100s maximum latency for message rates of 1, 10, 100 and 1000 messages per second for 1000 users. The results show that the Comet long polling technique uses less bandwidth than polling in all situations, and uses significantly less bandwidth when the average period between messages is longer than the maximum latency:

Not only does Comet long-polling provide superior data rates, it also provides superior average latency. The Comet technique allows the average latency to be lower than the maximum latency because once the pause between polls is complete, the long poll is ready to respond immediately to events.

This analysis shows that for the worst case, when the message rate is high, load and latency for Comet long-polling are identical to traditional polling, and for most cases the load and latency are significantly better than traditional polling.
The calculations for these graphs are in this Comet vs Polling spreadsheet. The assumptions made are that all messages are equal in size (150Bytes) and that the message arrival times are randomly but uniformly distributed. A maximum long poll timeout of 240s is assumed. The Y axis of the graphs is logarithmic so larger differences appear smaller.

Continue reading 【转】Comet is Always Better Than Polling

voice srgs语法相关

grxml:使用xml书写srgs的方式
abnf:rfc5234规范,
现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。
例如sql语法帮助也是用这个来描述的。
然而srgs中的abnf是混合bnf和abnf的语法,例如或|是bnf写法,/被改做为权重, =又是abnf写法,bnf写法是:=

-------------------------------------------abnf双模式示例
#ABNF 1.0 UTF-8;

language en;
mode voice;
root $basicCmd;

public $basicCmd = (dtmf-1 | yes) {y} | (dtmf-2 | no) {n};


------------------------------------------------------------------------

在voice中既然后台具备自然语言处理的能力,就不应该使用tag而应该直接返回所有匹配项。

$object = [the | a] (window | file | menu);
这样的写法用户说了the就会返回the,没说就不会返回the,所以都用[]比较好。
$object = [the | a] [window | file | menu];

--------------------------------------------------------------------------

grxml

item下面可以有ruleref但不能是rule

<rule id="r_3">
        <one-of>
            <item>
                <tag><![CDATA[Yes]]></tag>    //可以
                <ruleref uri="#r_4" />
            </item>
            <item>
                <tag><![CDATA[No]]></tag>
                <ruleref uri="#r_5" />
            </item>
        </one-of>
    </rule>

item在下面放one-of是可以的
<rule id="r_0">
        <one-of>
            <item>
                <tag><![CDATA[__QUERY__]]></tag>
                <item repeat="1-">
                    <one-of>
                        <item>what</item>
                        <item>who</item>
                        <item>where</item>
                        <item>how</item>
                        <item>why</item>
                        <item>whom</item>
                    </one-of>
                </item>
                <item repeat="0-">
                    <one-of>
                        <item>is</item>
                        <item>are</item>
                        <item>were</item>
                        <item>does</item>
                        <item>do</item>
                        <item>did</item>
                        <item>will</item>
                        <item>would</item>
                        <item>shall</item>
                        <item>should</item>
                        <item>may</item>
                        <item>might</item>
                    </one-of>
                </item>
                <item>
                    <ruleref special="GARBAGE" />
                </item>
            </item>
        </one-of>
    </rule>

Continue reading voice srgs语法相关

applet沙箱权限问题

官方解释:

http://download.oracle.com/javase/6/docs/technotes/guides/plugin/developer_guide/security.html

  • All unsigned applets are run under the standard applet security model.
  • If usePolicy is not defined in the java.policy file, then a signed applet has the AllPermission permission only if Java Plug-in can verify the signers, and the user agrees to granting the AllPermission permission when prompted.
  • If usePolicy is defined, then a signed applet has only the permissions defined in java.policy and no prompting occurs.

对于第二点,就是说签了名的一般都是有所有权限的。

但是还需要如下的处理[这个是必要的]
对于签名的applet,

  1. AccessController.doPrivileged(new PrivilegedExceptionAction() { 
  2.    public Object run() throws Exception { 
  3.    //you unsafe code                                          
  4.        return null; 
  5.    } 
  6. }); 


我们知道Java applet在浏览器中运行时默认情况下是不能访问本地资源的,比如读写客户端电脑上的文件。这是Java的安全沙箱机制,简单说就是有一组安全检查规 则,要通过检查之后才能访问特定资源。不过在企业应用中这种安全机制有时候并不是十分必要,这里我们就讨论一下在企业应用中突破沙箱检查的方案。
    当然,很多朋友会说,这太简单了,只需要改一下java.policy就可以了,授予程序对所有权限就可以了,就像下面这样:
     grant {
          permission java.security.AllPermission;
     };
没错,这样确实可以使客户端applet有权限访问任何资源,但是这个方案有个很实际的问题:java.policy是位于每个客户端电脑的jre 目录下的,如果要修改,那么就需要通知每一个使用该系统的用户,并指导他们做相应操作。这对于搞IT的用户来说是小菜一碟,但对一般业务人员来说却是个额 外的工作,这样的发布方式很难被人认可。

    另一个方案——对applet进行签名,用户访问时系统会弹出安全提示框,用户如果信任该程序,点击确认就相当于赋予了这个客户端小程序访问本地资源的权限。这是个很典雅的方案,体现了系统安全和对用户权利的尊重!具体做法大致如下:
    1、编写applet,编译并打成jar包
    2、对jar包签名
        这一步首先要产生证书,利用jdk提供的工具,执行类似下面的命令:
       keytool -genkey -keystore d:\mykeys.store -alias test -validity 300
       根据系统提示执行完这个命令后会生成一个证书库,上例是:mykeys.store,-validity 300是证书有效期为300天的意思,接下来用这个证书库中的证书给jar包签名,仍然是jdk的工具,命令类似下面:
       jarsigner -keystore d:\mykeys.store d:\applet.jar test
    3、把applet.jar发布到应用服务器

    这个看似完美的方案实际也有一点问题,很多时候我们并不希望把客户端程序都打到一个jar包里,那么多个jar包就需要分别签名,每次修改完客户端程序, 都要重新打包和签名,不然就只有applet能访问本地资源。我们不想这么麻烦,甚至我们有时都不希望对客户端代码打包,这时候签名就不好实现了。那么如 何解决这个问题呢,看下面这招。
    既然applet已经被用户授权,那么是否可以在applet里改变安全管理器(SecurityManager)?实验证明是可以的!只需要继承 SecurityManager类,创建自己的安全管理器类,然后覆盖checkPermission方法,允许访问任何资源。在applet的init 方法中调用System.setSecurityManager把安全管理器设置为我们自己的就一切OK了!

    至此,我们彻底突破了沙箱检查,而且客户体验很好,完美的方案!

代码很简单,类似于下面这样即可:[这种解决方法我也加了,没有测试是否必须--好像不起作用,没签名的引用包还是报错]
public class MainApplet extends JApplet {

private class DefaultSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm, Object context) {
}

@Override
public void checkPermission(Permission perm) {
}
}

@Override
public void init() {
super.init();
System.setSecurityManager(new DefaultSecurityManager());
  }
}

总结:
如果有是默认权限之外的代码:
1:需要签名
2:需要在applet中

  1. AccessController.doPrivileged(new PrivilegedExceptionAction() { 
  2.    public Object run() throws Exception { 
  3.    //you unsafe code                                          
  4.        return null; 
  5.    } 
  6. }); 

3:需要用户接受证书

在写skype4java applet时遇到的问题都是关于将包内资源dll加载的问题,winp,skype4java的实现都在applet环境下工作不好,我的解决方法是将其复制到tmp目录下再加载即可。

Continue reading applet沙箱权限问题

html5资源

[标准]
http://dev.w3.org/html5/postmsg/
http://dev.w3.org/html5/websockets/
http://dev.w3.org/html5/eventsource/
[当前实现]
http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28HTML_5%29#Related_specifications
[game教程]
http://www.brighthub.com/hubfolio/matthew-casperson/blog/archive/2009/06/29/game-development-with-javascript-and-the-canvas-element.aspx
[中文教程]
http://kb.operachina.com/node/190
[cake框架教程]
http://www.brighthub.com/hubfolio/matthew-casperson/blog/archive/2009/08/24/cake-programming-tutrorials.aspx
gif动画转图片
http://share.wglm.net:81/ts/Ulead_GIF_Animator5.0.rar
游戏
https://github.com/oldj/html5-tower-defense
websocket的缺陷
http://blogs.webtide.com/gregw/entry/websocket_chat
1:经常断线
2:不知道是否发送成功
3:keepalive
4:消息重发导致死循环[消息体过大]
替代物

Comet is Always Better Than Polling

-----------------------------------------------------------------------------------------------------------------------------

 

推荐10款非常优秀的HTML5开发工具

2011-10-09 09:37 | 2649次阅读 | 来源:梦想天空的博客 【已有0条评论】发表评论

关键词:HTML5 | 作者:梦想天空 | 收藏这篇资讯

HTML5发展如火如荼,随着各大浏览器对HTML5技术支持的不断完善以及HTML5技术的不断成熟,未来HTML5必将改变我们创建Web应用程序的方式。今天这篇文章向大家推荐10款优秀的HTML5开发工具,帮助你更高效的编写HTML5应用。

1.Initializr

推荐10款非常优秀的 HTML5 开发工具

Initializr是制作HTML5网站最好的入门辅助工具,你可以使用提供的特色模板快速生成网站,也可以自定义,Initializr会为你生成代码简洁的可定制的网页模板。

2.HTML5demos

推荐10款非常优秀的 HTML5 开发工具

想知道你的浏览器是否支持HTML5 Canvas吗?想知道Safari是否可以运行简单的HTML5聊天客户端吗?HTML5demos会告诉你每一个HTML5特性在哪些浏览器中支持。

3.HTML5 Tracker

推荐10款非常优秀的 HTML5 开发工具

想了解HTML5的最新动向吗?使用HTML5 Tracker吧,它可以跟踪HTML5最新修订信息。

4.HTML5 visual cheat sheet

推荐10款非常优秀的 HTML5 开发工具

想要快速超找一个标签或者属性吗?看看这个非常酷的速查手册吧,每个Web开发人员的必备。

5.Switch To HTML5

推荐10款非常优秀的 HTML5 开发工具

Switch To HTML5是一个基础而有效模板生成工具。如果你开始一个新项目,可以到这里获取免费的HTML5网站模板。

6.Cross browser HTML5 forms

推荐10款非常优秀的 HTML5 开发工具

HTML5中的日历,取色板,滑块部件等都是非常棒工具,但是有些浏览器不支持。这个页面将帮助你构建完美的HTML5表单兼容方案。

7.HTML5 Test

推荐10款非常优秀的 HTML5 开发工具

你浏览器准备好迎接HTML5革命了吗?HTML5 Test将告诉你。这个网站会为你当前使用的浏览器生成一份对video、audio、canvas等等特性的支持情况的完整报告。

8.HTML Cheat Sheat

Canvas元素是HTML5最重要的元素之一,它可以在网页中绘制图形,非常强大。这是一个Canvas元素的详细速查手册。

9.Lime JS

推荐10款非常优秀的 HTML5 开发工具

LimeJS是一个HTML5游戏开发框架,用于快速构建运行于触屏设备和桌面浏览器的游戏。非常棒,一定要用用试试。

10.HTML5 Reset

推荐10款非常优秀的 HTML5 开发工具

HTML5 Reset是一组文件,包括HTML、CSS等,用于在开始新项目的时候帮助你节省时间,提供HTML5的空白WordPress模板。

Continue reading html5资源

[转]WebTest比拼Selenium:模拟和真实浏览器上的测试

 

作者 Geoffrey Wiseman 译者 乔梁 发布于 2007年11月5日 上午1时24

Web应用软件的功能测试工具有很多种,但它们最根本的差异在于:某些工具可以驱动一个或多个真正的浏览器以便得到完全真实的环境,比如Selenium,而另一些工具只是模拟Web浏览器的操作,比如Canoo WebTest。Marc Guillemot这两种工具进行了对比,根据他的观点,WebTest以13:5的比分获胜。
Marc就以下方面内容对这两种工具进行了对比和评分:

Canoo WebTest

Selenium

Tied

Reports

Browser Fidelity

Testing Ajax

Speed

Beginner Friendly

Integration into Development Process

Support for Badly Formatted HTML Code

Scalability

Multi-Language Support

Capture JS Errors

Documentation

Predictable Behaviour

XPath Support

Extensibility

Data-Driven Tests

Internationalization Support

Support for Non-HTML Content

Marc认为,这些测试不够快,但“WetTest 的工作不多,所有测试都运行在JVM上”。他也提到Selenium无法捕获Javascript错误导致的测试失败:
只要你的单元测试通过了,你就不在意编辑错误了吗?肯定不是!但事实上,Selenium就是这样的,因为它不能检测到你的应用程序中的javascript错误(除非这些测试直接导致测试失败)。
另外,他也提到Ajax 测试(一般来说,大家都认为这是浏览器模拟器的弱点)是一种纽带:
与一般的想法相反,你并不需要在浏览器中运行你的JavaScript测试来测试AJAX功能。HtmlUnit和WebTest可以完成这样的工作,甚至可以称为完全胜任这样的工作,因为它允许更好地测试页内请求,使不可预知的浏览器行为成为可预知的(参见我前一个帖子)。
另一方面,他相信Selenium可以支持多种语言,“Selenium RC可以与不同的开发语言(Java、Ruby、PHP等等)结合,而WebTest只能与Ant结合使用”,还支持不规范的Html以及真实的浏览器:
HtmlUnit对JavaScript支持已经大幅改善,但还不能(且永远不可能)与真正的浏览器行为一模一样。尽管Selenium也更改了一些Web应用的JavaScript正常执行,但它使用真正的浏览器工作,所以已经和浏览器的标准行为相当接近啦。
作为Canoo WebTest和HtmlUnit的首席开发人员,Marc明显倾向于他所接纳的这种形式的工具,在与他讨论之前,请一定要先读一下他的分析报告:
显然,作为WebTest(和HtmlUnit)的负责人,我的确是有倾向性的。但是,我也有多年开发和维护庞大的功能测试套件的经验。客观一点儿说,我可能在其它方向上过分担心了,应该相信Selenium。当然,我将不断地修正我在Selenium理解上的错误。但请您在开始批评我之前,一定要读一下这篇文章。
已经总结了这些反馈。Vitaly认为,WebTest和Selenium的关系可以看作是苹果和桔子的关系。“Selenium,WebTest(HttpUnit),DBUnit,JUnit和其它测试工具是互补的。有些事用这个工具可能完成,用另外一个工具却不成。”还有些人讨论了录制回放和脚本测试各自的优点,以及测试可维护性。Murali推荐使用PragmaticQA Element
Christian反驳了WebTest对Ajax支持的说法,并提及在他的应用中,“由于HtmlUnit不能解析Dojo的import子句,即使最简单的页面也会抛出异常。”
而Simon认为,对浏览器保真度最重要的一点就是:
象 WebTest这样的工具有点太理论化了,它想证明代码完全正常工作,但是只能在理想环境下,与生产环境相去甚远。真正的用户使用的是IE或 Firefox,而Selenium可以让我们在“真实的”条件下做测试,例如有内存泄漏问题的脆弱的浏览器,和不符合标准的代码。
没有客户使用WebTest使用的引擎,这意味着尽管我们知道它在某种环境上运行得很好,但并不意味着真的没有麻烦。相反,我们的Selenium测试运行在Firefox之上,也运行在IE之上,所以它会捕获跨平台使用中发生的很多问题。
最后,Kent Tong设想了结合两种方法的途径
是否可以开发这样一种中间层,即大家只写一套测试,即可以运行在WebTest上,又可以运行在Selenium之上?这样,大家就可以得到WebTest和Selenium各自带来的好处了。
你用过这些工具吗,或者其它功能测试工具?这会吸引你参与讨论下一代功能测试工具吗?更多的信息,请阅读Canoo WebTestSeleniumTesting下一代功能测试工具
英文原文链接:WebTest vs. Selenium: Real and Simulated Browser Testing

相关厂商内容

Web App应用开发者大会火热报名中(4月27日 北京 免费)!
2011年5月11日-13日第十届中国系统与软件过程改进年会
Adobe Flash Builder 4简体中文正式版高速下载

2 条回复

关注此讨论 回复
真实的环境下测试 发表人 胡 凯 发表于 2007年11月5日 上午8时15分

Re: 真实的环境下测试 发表人 blogbin avatar 发表于 2007年11月16日 上午7时7分

按日期倒序排列

  1. 返回顶部
  2. 真实的环境下测试
  3. 2007年11月5日 上午8时15分 发表人 胡 凯
  4. 在项目中有同时使用JWebUnit和Selenium, 虽然每天都在Selenium缓慢的运行中煎熬, 但是依然推荐使用, 进行这样功能测试的目的之一就是希望在所有目标环境中这部分功能都是可以正常工作的。 也就是在真实的条件下作测试, 在JWebunit中正确通过的功能, 能否在IE6/7, firefox,中正确工作? 所有人大概心里都没底。
  5. JWebUnit的速度很快,但是在运行的过程中开发者缺乏对Web项目的最直观的体验, 而且其使用的JS 引擎对于某些正确的js也会抛出异常,后来不得不关闭JWebUnit的javascript engine.
  6. 事实上JWebunit测试可以用做整个开发流程的Checkin gate, 将覆盖基本功能,容易失败的测试用JWebunit完成,在测试通过后就可以提交,然后进行下一步的工作,同时在CI Server上在多个浏览器中运行较为缓慢的Selenium作为acceptance gate。 这大概是能兼顾速度和“真实”的一种方式。
  7. --
  8. Hu Kai
  9. 回复
  10. 返回顶部
  11. Re: 真实的环境下测试
  12. 2007年11月16日 上午7时7分 发表人 blogbin avatar
  13. 是否可以开发这样一种中间层,即大家只写一套测试,即可以运行在WebTest上,
  14. 又可以运行在Selenium之上?这样,大家就可以得到WebTest和Selenium各自带来的好处
  15. 同感:
  16. 测试脚本的设计,开发和维护的工作量相当大,能够让正常跑起来实属不易。
  17. 不同厂商和组织提供许多测试工具,不过这些测试脚本并没有形成统一的标准和规范。

Continue reading [转]WebTest比拼Selenium:模拟和真实浏览器上的测试

hibernate杂项

使用hibernate自动生成工具时 会自动加catorry
如:
<hibernate-mapping>
    <class name="co.iplatform.management.data.Health" table="tservice_health" catalog=”xxx”>
但是往往你刚开始用的数据库名是暂时的,与产品库不一样,所以发布时要注意改正这些名字。( 如果不一致mysql报错却是什么拒绝访问某表,根本不知道是数据库选错了)
一般的不需要catalog比较好,在数据库连接字符串里指定默认数据库就行了。
数据库表名大小写敏感?反正mysql是这样的aBc != abc
乱码问题,数据库要设置好编码, 连接也需要写好编码 例如 :
jdbc:mysql://localhost:13306/moviebug?useUnicode=true&amp;characterEncoding=UTF-8
还不行,则要查找其他原因

--------------------

native sql

以前查询把查询放在事务里面就可以保证取得最新数据,这次在management console里面就遇到问题,调用native sql后查询的还是旧数据。

hibernate说当调用commit或session.flush时会同步数据,网上说commit是先flush在提交。
不管怎样,flush一定会同步数据,这是最保险的做法。

且查询不一定需要放在事务里面(某些情况除外)。

对于使用了native sql的情况,要注意,hibernate并不知道native sql会对数据产生影响,所以,执行了native sql后要session.flush而且要clear。

-------------------------


Continue reading hibernate杂项

爬数据问题

想截取豆瓣的内容 ,发现以下问题 
一般的 网站都有防止被 iframe包含的脚本 ,所以 用iframe不行
我再试 window.open打开窗口来 加载脚本 ,但是
window的 onload事件 不能 监听,可能是跨域 问题 ,那么就做不下去了
-------------------
>

(function() {
function g_log(msg) {
if (!window.mylog_win) {
 window.mylog_win = window.open('', 'log');
}
var doc = window.mylog_win.document;
doc.write(msg + '<br>');
}
function DoubanTask() {
var URL = 'http://movie.douban.com/subject/';
var INDEX_BEGIN = 1000000;
var INDEX_END = 1999999;
var TRYCOUNT = 3;
var tryicount = 0;
var win = window.open('', 'doubanwin');
var url_index = INDEX_BEGIN;
function log (msg) {
 g_log(msg);
};
function getData() {
 var doc = Ext.get(win.document.body);
 var score = doc.query('strong[property=v:average]')
 if (!score || !score.length) {
  log('score not find,return null.');
  return null;
 }
 score = score[0].innerHTML;
 var vote = doc.query('span[property=v:votes]')
 if (!vote || !vote.length) {
  log('score not find,return null.');
  return null;
 }
 vote = vote[0].innerHTML;
 var name = doc.query('span[property=v:itemreviewed]')
 if (!name || !name.length) {
  log('name not find,return null.');
  return null;
 }
 name = name[0].innerHTML;
 var year = doc.query('span[class=year]')
 if (year && year.length) {
  year = year[0].innerHTML;
 }
 var director = doc.query('a[rel=v:directedBy]')
 if (director && director.length) {
  director = director[0].innerHTML;
 }
 if (year) {
  var i0 = year.indexOf('(');
  if (-1 != i0) {
   year = year.substring(i0 + 1);
  }
  i0 = year.indexOf(')');
  if (-1 != i0) {
   year = year.substring(0, i0);
  }
 }
 return {
  score : score,
  vote : vote,
  name : name,
  year : year,
  director : director
 };
}
function onloadfunc(url) {
 var data = getData();
 if (!data) {
  log('retrive no data in [' + url + '],continue.');
  runtask();
  return;
 }
 data.url = url;
 log('get data:' + Ext.encode(data));
 Ext.Ajax.request({
    url : "mytime.ax",
    params : data,
    success : function() {
     tryicount = 0;
     log('submit ok for url:' + url);
     runtask();
    },
    failure : function() {
     tryicount += 1;
     log('submit fail[' + tryicount + '] for url:' + url);
     if (tryicount > TRYCOUNT) {
      tryicount = 0;
      log('cancel try for:' + url
        + ', move for next none.');
      runtask();
     } else {
      log('continue try for:' + url);
      onloadfunc(url);
     }
    }
   });
}
function runtask() {
 url_index += 1;
 if (url_index >= INDEX_END) {
  log('task complete!');
  return;
 }
 var url = URL + url_index;
 //no use, can't work
 win.document.body.onload = function() {
  onloadfunc(url);
 };
 win.location.href = url;
}
this.run = function() {
 runtask();
};
}
function onload() {
var dbTask = new DoubanTask();
var btnRun1 = Ext.get('btnStart');
btnRun1.on('click', function() {
   dbTask.run();
  });
}
Ext.fly(window).on('load', onload);
})();

-------------------------

>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>run.html</title>
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script type="text/javascript" src="../js/ext-core.js"></script>
    <script type="text/javascript" src="js/main.js"></script>
</head>
<body>
 <table>
  <tr><td>
  <button id="btnStart">Start</button>
       
  <td></tr>
  <tr><td><iframe id="frm1"></iframe><td></tr>
 </table>    
</body>
</html>

-------------------------------

换取思路,可以使用ajax请求由服务端通过httpclient取得数据返回给客户端,再由客户端

写到iframe里面,这样就避开了跨域问题了。但是httpclient爬数据时要注意伪装成浏览器,加上请求头'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0',其余的就不要加了,加了反而会有问题(莫名其妙的返回)

HtmlUnit基于mozila实现,可以考虑

发现豆瓣提供api晕菜

-------------

Continue reading 爬数据问题

window.unload事件

window.unload事件:
用户刷新,关闭,后退,将地址栏重新打一遍(或者只打个回车)都会触发,但是服务端sendredirect则不会.
如果使用window.location.href=window.location.href也会触发
如果window.location.href=window.location.href在脚本第一行,后面的代码还是会执行的,但是页面文档则不会加载了,就是没有dom了。

Continue reading window.unload事件

jmx初步 控制台检监控技术探索

jmx资源:

ibm J2EE专题:
http://www.ibm.com/developerworks/cn/java/j-jee/j2ee-services.html#J2EEZ296
中的jmx部分
其中
http://www.ibm.com/developerworks/cn/java/j-lo-jse63/
这篇比较重要

Oracle的教程与example源代码
http://download.oracle.com/javase/1.5.0/docs/guide/jmx/tutorial/tutorialTOC.html
http://download.oracle.com/javase/1.5.0/docs/guide/jmx/examples.html
http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html

在其例子Basic中有个问题,rmiServer不好绑定,其原因是缺少LocateRegistry.createRegistry(connectorPort);这一句
具体见 http://www.iteye.com/topic/358379

基本概念:
MBean 规定了标准 MBean 也要实现一个接口,所有向外界公开的方法都要在这个接口中声明。否则,管理系统就不能从中获得相应的信息。此外,该接口的名字也有一定的规范:即在标准 MBean 类名之后加上“MBean”后缀。若 MBean 的类名叫做 MBeansName 的话,对应的接口就要叫做 MBeansNameMBean。

动态MBean要实现DynamicMBean接口。

MXBean(注意多个X)是OpenBean(1.6以后才有官方文档介绍) 
Open MBean 与其它动态 MBean 的唯一区别在于,前者对其公开接口的参数和返回值有所限制 —— 只能是基本类型或者 javax.management.openmbean包内的 ArrayType、CompositeType、TarbularType 等类型。这主要是考虑到管理系统的分布,很可能远端管理系统甚至 MBServer 层都不具有 MBean 接口中特殊的类。

还有个区别,标准mbean要求接口和实现类在同一个包中,而open bean则没有这个要求。[http://blogs.oracle.com/jmxetc/entry/javax_management_standardmbean_when_and] 

Model Bean
具有持久化,日志等功能,但要看具体容器的支持。


jmx客户端和jmx服务端:
客户端通过RMI连接服务端获取信息。
服务端一般是某个容器或服务器的附加功能,它们依据jmx规范写出容器的管理Mbean。tomcat,mule都实现了。

getPlatformMBeanServer是获得已存在的server,一般是本地虚拟机上的

如果注册在 getPlatformMBeanServer上,则可通过增加JVM参数来增加jmx控制,参见http://blog.ureshika.com/archives/516.html

这种方式与创建专门的MBeanServer所不同的是自动会包含Platform MBeans(java.lang/com.sun.management)Logging Management(java.util.logging)这些个MBean,参见

http://download.oracle.com/javase/1.5.0/docs/guide/management/overview.html

访问远程jvm的技术jstad:
http://download.oracle.com/javase/6/docs/technotes/tools/share/jstatd.html
注意里面的申明:可能在以后不支持。
NOTE: This utility is unsupported and may or may not be available in future versions of the JDK. It is not currently available on the Windows 98 and Windows ME platforms.
只能监控,不能操作。
需要制定policy -J-Djava.security.policy 和hostname(nat环境下)-Djava.rmi.server.hostname=
否则会有问题
参见
http://hi.baidu.com/passedbylove/blog/item/b600b2a8b6ebc2bacb130cc5.html
http://hi.baidu.com/luohuazju/blog/item/36ddd6103a51b2f6c3ce79c0.html

visualvm用于监测远程机器:
http://java.net/projects/visualvm/content/jmx_connections.html
但是如果远程jvm没有开放监测端口,可使用设置com.sun.management.jmxremote.*参数的办法,让每个你想检测的程序都开放一个检测端口(这个就不太好了,如果一个平台里面有许多应用,那么开那么多的端口本身就很耗资源。)



服务端注册/创建:

         MBeanServer mbs = MBeanServerFactory.createMBeanServer(); 
         String domain = mbs.getDefaultDomain(); 
         
         MemoryMXBean obean = ManagementFactory.getMemoryMXBean(); 
         ObjectName on = new ObjectName(domain+":type=abc"); //名字只是个key,只要客户端与之对应就找得到 
         mbs.registerMBean(obean, on); 

客户端查找:

MemoryMXBean proxy = JMX.newMXBeanProxy(mbsc, stdMBeanName, MemoryMXBean.class); 
//注意上面多了个X,因为是查找Open MBean,其他类型应该使用newMBeanProxy 

监听服务断开事件

>JMXConnector jmxc =...; jmxc.addConnectionNotificationListener(new NotificationListener(){

Continue reading jmx初步 控制台检监控技术探索

window关闭时onunload,onbeforeunload处理

要想在页面跳转时询问用户,需要在onbeforeunload 事件中返回询问字符:

window.onbeforeunload = function(e) {
            return 'Are You Sure To Leave This Page?';
        };

如果在关闭页面时需要做些请求动作,在onunload事件中处理较好:

window.onunload = function() {
            //close function
        };

注意事项:

1:不要试图用addEventListener或attachEvent绑定这两个事件,浏览器不兼容。

2:应该在onbeforeunload 中询问,而将退出动作放在onunload 中,这样逻辑好清晰。

3:如果是ajax请求放在onunload 事件中,需要同步执行ajax,否则是不能保证这个ajax请求会成功的。

Continue reading window关闭时onunload,onbeforeunload处理

Pagination


Total views.

© 2013 - 2024. All rights reserved.

Powered by Hydejack v6.6.1