2010年7月

Sogou路书绘制骑车上班路线

今天试用了一下sogou的路书功能,还是挺好用的


直接输入起点,终点,它就能自己绘制出骑行路线


然后,自己可以拖动鼠标去修正路线


或者如果有gpx轨迹文件,直接上传就行了


以下是我骑车上班的路线图,总距离大概11.6KM,耗时45分钟


启动jvm虚拟机时的“段错误”

今天,在部署U盘程序时,重启resin时,报错


#

# An unexpected error has been detected by HotSpot Virtual Machine:

#

# SIGBUS (0x7) at pc=0x00000034da87aa5b, pid=3236, tid=47594056421008

#

# Java VM: Java HotSpot(TM) 64-Bit Server VM (1.5.0_19-b02 mixed mode)

# Problematic frame:

# 段错误


此时,无论直接运行java或用ant编译,都报以上错误


把所有的java进程都kill掉后,可以正常重启2个jvm,在启动第3个时,同样的错误又出现了


尝试更换成jdk5的其它版本,错误依旧


于是,决定用jdk6试试,如果不行,准备只好重启机器了...


没想到,在安装jdk6时,失败了,先提示/tmp空间不足,然后又报段错误


这时,才突然明白,可能是/tmp空间满了,导致无法运行java


把/tmp空间清理后,用以前的jdk可正常启动resin了


那么,启动java进程时,会向/tmp目录下写什么东西呢?


进去后,会发现有一个/tmp/hsperfdata_root目录


该目录下有一些文件,这些文件就是对应java进程的pid


而文件的内容似乎是启动java的命令,还有其它的一些log信息


看来java是利用该文件来记录启动时的一些log了


郁闷的问题,下午折腾了好久......


 

“淘宝”==“淘假”?

 曾听人这么评价过淘宝


“淘宝上的东西,90%以上都是假货...”


正因为如此,我每次在淘宝上买东西


一般都照信用比较高,评价好的店主


前端时间,在上面买了一个Kingston的8G U盘


看到很多好的评价,于是就出手了


拿到U盘后,用软件测试了一下,就发现是假的


是通过扩容扩成8G的,而且拷贝文件速度很慢


写入速度每秒不足3M....


当时本是想退货的,不过想想挺麻烦的,就懒得理它了


昨天,找了对应芯片的量产工具处理了一下


发现,实际容量是4G,还有13%的坏块


最后的可用容量大概是3.4G,而且量产后,速度也没有任何的提升


那个店主总算不太黑,曾看到网上有人买的U盘


是从16M直接给扩容到了4G,这个可真够狠的了...


看来,在淘宝上买东西,也不能只看它的那些评价和信用...

Git版本恢复命令reset

reset命令有3种方式:



  1. git reset --mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

  2. git reset --soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

  3. git reset --hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容


以下是一些reset的示例:



折叠复制代码




  1. #回退所有内容到上一个版本  

  2. git reset HEAD^  

  3. #回退a.py这个文件的版本到上一个版本  

  4. git reset HEAD^ a.py  

  5. #向前回退到第3个版本  

  6. git reset --soft HEAD~3  

  7. #将本地的状态回退到和远程的一样  

  8. git reset --hard origin/master  

  9. #回退到某个版本  

  10. git reset 057d  

  11. #回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit  

  12. git revert HEAD  






如果我们某次修改了某些内容,并且已经commit到本地仓库,而且已经push到远程仓库了


这种情况下,我们想把本地和远程仓库都回退到某个版本,该怎么做呢?


前面讲到的git reset只是在本地仓库中回退版本,而远程仓库的版本不会变化


这样,即时本地reset了,但如果再git pull,那么,远程仓库的内容又会和本地之前版本的内容进行merge


这并不是我们想要的东西,这时可以有2种办法来解决这个问题:



  1. 直接在远程server的仓库目录下,执行git reset --soft 10efa来回退。注意:在远程不能使用mixed或hard参数

  2. 在本地直接把远程的master分支给删除,然后再把reset后的分支内容给push上去,如下:


  3. 折叠复制代码




    1. #新建old_master分支做备份  

    2. git branch old_master  

    3. #push到远程  

    4. git push origin old_master:old_master  

    5. #本地仓库回退到某个版本  

    6. git reset --hard bae168  

    7. #删除远程的master分支  

    8. git push origin :master  

    9. #重新创建master分支  

    10. git push origin master  







在删除远程master分支时,可能会有问题,见下:



折叠复制代码




  1. $ git push origin :master  

  2. error: By default, deleting the current branch is denied, because the next  

  3. error: 'git clone' won't result in any file checked out, causing confusion.  

  4. error:  

  5. error: You can set 'receive.denyDeleteCurrent' configuration variable to  

  6. error: 'warn' or 'ignore' in the remote repository to allow deleting the  

  7. error: current branch, with or without a warning message.  

  8. error:  

  9. error: To squelch this message, you can set it to 'refuse'.  

  10. error: refusing to delete the current branch: refs/heads/master  

  11. To git@xx.sohu.com:gitosis_test  

  12.  ! [remote rejected] master (deletion of the current branch prohibited)  

  13. error: failed to push some refs to 'git@xx.sohu.com:gitosis_test'  






这时需要在远程仓库目录下,设置git的receive.denyDeleteCurrent参数



折叠复制代码




  1. git receive.denyDeleteCurrent warn  






然后,就可以删除远程的master分支了


虽然说有以上2种方法可以回退远程分支的版本,但这2种方式,都挺危险的,需要谨慎操作......

大件产品流水账


  1.  7月9日,入手Nokia 5230,从买特上购买,让别人代下单,优惠5%,同时使用1200-45优惠券,最终价格为1232元

  2.  7月18日,入手西数500G绿盘,在海龙买的,说是质保3年,价格为280元,送了一个数据线


 

完了,忘了换衣服了~

 昨天,送快递的给我打电话说到楼下了,让下去取


于是,我就开始换衣服准备下去


昕昕看见了,非要跟这一块下去


为了省事,奶奶就给他穿着凉鞋


衣服也没换,就穿着一个小兜兜(他在家里就穿这个)


拉着他刚下到4层,这小子突然停住了


用手摸着他的兜兜,叫道:


完了,忘了换衣服了!


然后,就开始转身,往回走,说:


我要回去换衣服了


我对他说:算了,别回去换了,就一个送快递的,没有别的人


于是,他就继续跟着我下楼


到一层快下台阶时,当看到那个送快递的时候


他死活也不走了,怎么拉都不下楼


无奈,只好让他站在那,我去签收了


这小子,穿着兜兜还知道害羞...

Nginx/Apache中设置反向代理的timeout

Nginx和Apache中对于反向代理的请求,它们都有默认的timeout的


对于正常的请求来说,没有什么问题


但如果我们是请求一个长连接,那么就需要去修改它们的默认超时了


否则,长连接还没有返回结果时,前端Nginx或Apache就已经proxy timeout了



折叠复制代码




  1. #设置Nginx的proxy timeout为10分钟,默认值为60秒  

  2. ProxyTimeout 600;  

  3. #设置Apache的proxy timeout为10分钟,默认值为5分钟  

  4. ProxyTimeout 600  






 


 

使用Ajax来实现Streaming模式的Comet

Firefox和Safari浏览器中,XMLHTTPRequest支持interactive readyState的状态


其对应的readyState状态为3,当Client接收到Server端的一部分数据后就可以触发该状态


当Request请求完成后同样还会触发Success的状态


于是,可以利用这个特性来实现Streaming模式的Comet


Client端测试代码如下:



折叠复制代码




  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

  2. <htmlxmlns="http://www.w3.org/1999/xhtml">

  3. <head>

  4. <title>Comet demo</title>

  5. <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>

  6. <scripttype="text/javascript"src="prototype.js"></script>

  7. </head>

  8. <body>

  9. <divid="abc">The server time will be shown here</div>

  10. <scripttype="text/javascript">

  11. var _url="ajax_polling_server.jsp";

  12. var options= {

  13. method:'get',

  14. parameters:'t=0&callback=cb',

  15. onInteractive:ajaxCallBack,

  16. onComplete:ajaxCompletCallBack

  17. };

  18. var ajax=newAjax.Request(_url, options);

  19. var byteoffset=0;

  20. function ajaxCallBack(transport)

  21. {

  22. var ret=transport.responseText;

  23. var data=ret.substring(byteoffset);

  24. byteoffset=ret.length;

  25. $('abc').innerHTML=data;

  26. }

  27. function ajaxCompletCallBack(transport)

  28. {

  29. $('abc').innerHTML=transport.responseText;

  30. }

  31. </script>

  32. </body>

  33. </html>




Server端代码如下:



折叠复制代码




  1. <%@ pagelanguage="java"contentType="text/html;charset=UTF-8"

  2. pageEncoding="UTF-8"%>

  3. <%@pageimport="java.util.Date"%>

  4. <%

  5. response.setHeader("Cache-Control", "no-store");

  6. response.setHeader("Pragma", "no-cache");

  7. response.setDateHeader("Expires", 0);

  8. out.flush();

  9. %>

  10. <%


  11. for(int i=0; i<10; i++){

  12. out.print(new Date());

  13. out.flush();

  14. Thread.sleep(1000);

  15. }

  16. %>





注意:



  1. 该特性目前只适用于Firefox和Safari

  2. 注意Client代码中的byteoffset,利用这个偏移量来获取每次返回结果中最新的部分


 

使用Iframe来实现Streaming模式的Comet

要实现一个基于Streaming模式的comet,比较通用的办法就是使用Iframe来实现


但iframe有一个比较大的问题,浏览器中的进度条会一直停留在某个地方,显示正在加载


Google的工程师们,包装了一个js对象,在IE下使用htmlfile,Firefox下嵌套Iframe解决了这个问题


测试代码如下,Client端页面代码:



折叠复制代码




  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

  2. <htmlxmlns="http://www.w3.org/1999/xhtml">

  3. <head>

  4. <title>Comet demo</title>

  5. <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>

  6. <scripttype="text/javascript"src="prototype.js"></script>

  7. </head>

  8. <body>

  9. <divid="abc">The server time will be shown here</div>

  10. <scripttype="text/javascript">

  11. var comet= {

  12. connection : false,

  13. iframediv : false,

  14. initialize: function() {

  15. var userAgent=navigator.userAgent.toLowerCase();

  16. if (/msie/.test(userAgent) && !/opera/.test(userAgent)) {

  17. // For IE browsers

  18. comet.connection=newActiveXObject("htmlfile");

  19. comet.connection.open();

  20. comet.connection.write("<html>");

  21. comet.connection.write("<script>document.domain='"+document.domain+"';</script>");

  22. comet.connection.write("</html>");

  23. comet.connection.close();

  24. cometcomet.iframediv= comet.connection.createElement("div");

  25. comet.connection.appendChild(comet.iframediv);

  26. cometcomet.connection.parentWindow.comet= comet;

  27. comet.iframediv.innerHTML="<iframe id='comet_iframe' src='./ysz_1.jsp'></iframe>";

  28. }


  29. if( /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) ) {

  30. // For Firefox browser

  31. comet.connection=document.createElement('iframe');

  32. comet.connection.setAttribute('id','comet_iframe');

  33. with (comet.connection.style) {

  34. left=top= "-100px";

  35. height=width= "1px";

  36. visibility="hidden";

  37. display='none';

  38. }

  39. comet.iframediv pan>=document.createElement('iframe');

  40. comet.iframediv.setAttribute('src', './ysz_1.jsp');

  41. comet.connection.appendChild(comet.iframediv);

  42. document.body.appendChild(comet.connection);

  43. }


  44. if (/webkit/.test(userAgent) || /opera/.test(userAgent)) {

  45. // for other browsers

  46. comet.connection=document.createElement('iframe');

  47. comet.connection.setAttribute('id', 'comet_iframe');

  48. comet.connection.setAttribute('src', './ysz_1.jsp');

  49. with (comet.connection.style) {

  50. position="absolute";

  51. left=top= "-100px";

  52. height=width= "1px";

  53. visibility="hidden";

  54. }

  55. document.body.appendChild(comet.connection);

  56. }

  57. },


  58. // this function will be called from backend.jsp

  59. printServerTime: function (time) {

  60. $('abc').innerHTML=time;

  61. },


  62. onUnload: function() {

  63. if (comet.connection) {

  64. comet.connection=false; // release the iframe to prevent problems with IE when reloading the page

  65. }

  66. }

  67. }

  68. Event.observe(window,'load',comet.initialize);

  69. Event.observe(window, 'unload', comet.onUnload);

  70. </script>

  71. </body>

  72. </html>




Server端jsp代码:



折叠复制代码




  1. <%@ pagelanguage="java"contentType="text/html;charset=UTF-8"

  2. pageEncoding="UTF-8"%>

  3. <%@pageimport="java.util.Date"%>

  4. <%

  5. response.setHeader("Cache-Control", "no-store");

  6. response.setHeader("Pragma", "no-cache");

  7. response.setDateHeader("Expires", 0);

  8. out.flush();

  9. %>

  10. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

  11. <htmlxmlns="http://www.w3.org/1999/xhtml">

  12. <head>

  13. <title>Comet backend</title>

  14. <metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"/>

  15. </head>

  16. <body>


  17. <scripttype n>="text/javascript">

  18. // KHTML browser don't share javascripts between iframes

  19. var is_khtml=navigator.appName.match("Konqueror") || navigator.appVersion.match("KHTML");

  20. if (is_khtml)

  21. {

  22. var prototypejs=document.createElement('script');

  23. prototypejs.setAttribute('type','text/javascript');

  24. prototypejs.setAttribute('src','prototype.js');

  25. var head=document.getElementsByTagName('head');

  26. head[0].appendChild(prototypejs);

  27. }

  28. // load the comet object

  29. //alert(window.parent.comet)

  30. var comet=window.parent.comet;

  31. </script>

  32. <%


  33. for(int i=0; i<10; i++){

  34. out.println("<scripttype='text/javascript'>");

  35. out.println("comet.printServerTime('" + (new Date()) + "');");

  36. out.println("</script>");

  37. out.flush();

  38. Thread.sleep(1000);

  39. }

  40. %>


  41. </body>

  42. </html>




以上代码,在Tomcat里测试正常,可以看到页面内容在不断变化,但如果用nginx反向代理后,页面就不能实时变化,而是最后load完了才变化


查了好久原因,才发现,nginx的proxy默认会Buffer后端Server的响应内容,导致Client端不能实时更新,解决很简单,把buffer给关闭就可以了:



折叠复制代码




  1. proxy_buffering off;




但在Resin里面,上述代码仍旧没有测试通过,页面无法实时更新,暂时还没有找到原因


但Resin自己也提供了一套comet的解决方案,参见这里


 

Web应用中的Comet技术

Web开发中,Comet通常是指在Client和Server端维持一个长连接


当有新消息到达时,Server端可以实时把消息push到Client端


实际上,要实现“服务器推送”,不一定非要用基于http的comet来做


还可以基于socket来实现,比如:flash、applet、html5等


可以参考IBM的“Comet:基于 HTTP 长连接的“服务器推”技术


就Comet的实现来说,可以有两种方式:


1. Streaming流模式:这种方式,实际上才是真正的长连接,Client和Server端一直维持该连接


当Server端有数据时,立即把数据返回给Client,Client马上去解释处理该数据


然后该连接继续保持,等待后续的数据....


2. Long Polling长轮询模式:当Server端没有数据时,该连接一直保持着,当返回给Client端后,Server端就断掉该连接


同时,Client端再发起一个新的长连接,依次循环...


从具体的技术实现上,comet可以有以下方式:


1. Iframe,可适用于Streaming和Long Pooling这2种模式,返回的数据格式使用Chunked来进行传输,使用它最大的缺点是,浏览器上可能会有进度条或不停Loading,不过,总还是有解决办法 的,见这里


2. Ajax, 可以适用于任何浏览器的Long Pooling模式。对于Streaming模式,在Firefox和Safari下可以使用,参见这里


3. Jsonp, 只适用于Long Pooling模式,它的好处是可以跨域,但同样会有浏览器不断Loading的问题

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它