手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2025年07月的文章

[转]为什么所有浏览器的userAgent都带Mozilla

为什么浏览器的userAgent第一个都是mozilla呢?看了这个博客后才发现,原来,历史上发生了N多事情,在浏览器大战里,NetScape才是最后的赢家,虽然它已经消失在茫茫人海.
转自[作者:Eamonn 发布时间:2012-01-06 20:04]
时间离现在都有1年过去了,虽然在这一年里发生了很多变化,比如...opera居然也投奔了webkit,看来下一个就是webkit一统江湖了.不知道IE是否能够抗住,firefox呢???

好了不多说了,直接上原文吧.

http://www.eamonning.com/blog.php?id=289
  1. 最早的时候有一个浏览器叫NCSA Mosaic,把自己标称为NCSA_Mosaic/2.0 (Windows 3.1),它支持文字显示的同时还支持图片,于是Web开始好玩起来。  
  2.   
  3.   
  4. 然后出现了一个新的网页浏览器,“Mozilla”,其实就是“Mosaic终结者”的意思,这搞的Mosaic很不爽,(毕竟Mosaic出道早,江湖老),新浏览器最后正式公布的名称是Netscape,它把自己标称为Mozilla/1.0 (Win3.1),更好玩了。Netscape支持框架显示,后来框架在大家中间流行起来了,但Mosaic不支持框架啊,于是伟大的“用户代-理人探测”技术出现了,如果是“Mozilla”,那就发给支持框架的页面,至于其他的浏览器,则发给不含框架的页面。  
  5.   
  6.   
  7. Netscape想逗Microsoft玩儿,把Windows叫做“几乎不曾做过调试的设备驱动器”,后者很恼火。Microsoft于是推出了自己的 网页浏览器,叫做Internet Explorer,希望它能成为“Netscape终结者”。Internet Explorer也支持框架,但它不是Mozilla啊,所以没人给它发送带有框架的页面。Microsoft慢慢烦躁起来,不再寄希望于网站管理员逐渐 认识IE并给它发框架,而是宣称自己是“兼容Mozilla”的,开始模仿Netscape,把自己标称为Mozilla/1.22 (compatible; MSIE 2.0; Windows 95),这样Internet Explorer也能收到框架了,整个Microsoft狂喜,但网站管理员开始有点被搞糊涂了。  
  8.   
  9. Microsoft把IE和Windows一起卖,并且把产品也弄得比Netscape更好了,拉开了第一场浏览器之战。结果和大家知道的一样,Netscape被干掉了,Microsoft大胜、大喜。但是后来Netscape以Mozilla的新名称重生了,构造了Gecko,标称其为Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826,Gecko属于渲染引擎,表现优异。Mozilla开发了Firefox,标称为Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0,并且Firefox表现也非常优秀。Gecko扩张迅速,一些浏览器使用了它的代码并标称为Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1 ,这是一个,还有Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0,另一个,它们都伪装成Mozilla,同时也都是基于Gecko支持的。  
  10.   
  11.   
  12. Gecko表现优秀,IE则很差劲,于是身份甄别再次发生,输送给Gecko的是设计良好的网页代码,其他浏览器就没有这个待遇了。Linux的跟随者很伤心,因为他们创建了基于KHTML引擎支持的Konqueror,但却不会被输送好代码,虽然他们自己认为KHTML和Gecko一样优秀,于是Konquerer开始伪装自己“像Gecko”那样以得到好的网页,并标称自己为Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko),这个世界更让人困惑了。  
  13.   
  14.   
  15. 后来出现了Opera这样的主儿,宣称“允许用户自己决定让浏览器装成谁”,它的菜单中提供了Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51, Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51,Opera/9.51 (Windows NT 5.1; U; en) 供大家来选择,选谁是谁。  
  16.   
  17.   
  18.   
  19. Apple开发了Safari,使用了KHTML,同时也增加了很多新特性,后来干脆一锅煮,另起炉灶叫了WebKit,但是它有希望能够得到那些为KHTML编写的网页,于是Safari标称自己为Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5,这个世界更混乱了。  
  20.   
  21.   
  22.   
  23. Microsoft越来越担心Firefox的发展,重新启动了Internet Explorer的开发,标称自己为Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ,可以很好的渲染代码,但那要看网站管理员是否指示它这么做。  
  24.   
  25.   
  26.   
  27. Google也开发了自己的浏览器Chrome, 使用了Webkit,有点像Safari,希望能得到为Safari编写的网页,于是决定装成Safari。这样啊,Chrome使用了WebKit渲染 引擎,想装成Safari,而WebKit呢又伪装自己是KHTML,KHTML呢又是伪装成Gecko的,同时所有的浏览器又都宣称自己是 Mozilla,于是,Chrome宣称自己是Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13,,UserAgent字符串彻底混乱了,也几乎不再发挥任何作用,每个人都宣称自己是别人,混乱充斥人间啊。  
  28.   
  29.   
  30. 有点调侃的味道,可以总结为一句话:Mozilla是Netscape的吉祥物,也是Netscape Navigator浏览器使用的内部开发代号。由于Netscape早期的影响力,直到今天,所有浏览器包括IE,向Web服务器报告自己的浏览器标识的 时候,都以 “Mozilla”开头,表明自己是Mozilla兼容的。这,就是原因啦。  
  31.   
  32.   
  33. 查看浏览器标记的方法也很容易,通过JavaScript语句:  
  34. javascript:alert(navigator.userAgent)  
  35. 在地址栏输入以上代码,然后回车。 

最后那三段话,不是在每个浏览器中都支持,比如我的firefox18就不支持,后来在firebug的F12的console里直接alert了一下,看了看效果.....
世界已经变了

Tags: mozilla, useragent

关于APNS的一些小问题

此段内容其实有很多都知道,只是这里把问题相对集中的显示出来,也容易找到问题.所以我就转载了一下...

内容来自

http://blog.latermoon.com/?p=878
  1. 以下是大杂烩:  
  2.   
  3.     1.不要用一个开源的叫javapns的lib来推送,这个项目代码臃肿混乱,过度设计,还内存溢出;可以使用notnoop.apns  
  4.     2.Push会延时,也会被丢弃,似乎网络情况,Push本身带有Expiry,超过该值APNS会丢掉Push  
  5.     3.Push有三个基本属性,alert、badge、sound,通过将一些置空,可以实现只修改App上的气泡不出现文本、出现文本但不提示声音,发出声音而不出现任何提示等等效果  
  6.     4.Push除了三个基本属性,还可以附带任意json数据,但总大小不能超过256字节  
  7.     5.要异步发送Push,可以将应用内的Push序列化到Redis队列再消费,并且增加队列监控  
  8.     6.和国外服务的连接速度比较慢,要建立多个连接,使用多线程发送  
  9.     7.APNS有提供feedback服务,用于查询一个Token是否有效  
  10.     8.一台iPhone上的一个App会有两种Token,一种是Developer的,一种是正式Product的,不能混用,在一个与APNS的SSL连接里,使用Developer Token向Product发送Push是无法送达的,同时在十几秒内即使用正确的Product Token发送也无法送达,效果就像直接丢弃  
  11.     9.iPhone上的App处于前台运行时,即使受到Push也不会在界面出现提示,此时App内的回调函数会收到  
  12.     10.高速地向一台设备发送大量Push,Apple会自动丢掉部分Push  

Tags: apns

情人节快乐

又是一年情人节了.恭祝大家情人节快乐

本来春节有很多话想说,但想想,其实说来说去就那些了.还不如情人节送上两句祝福的话比较好..

情人节虽好,但要注意安全哦.

Tags: 情人节

error while loading shared libraries: libaio.so.1

看到这个的时候,觉得不是特别爽:/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

然后很纠结,于是想办法解决,其实很容易;

On Debian, if you get the error:

/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

type the following

apt-get install libaio1 libaio-dev

On Redhat/Fedora/CentOS:

yum install libaio

APNS 推送

关于apns这玩意,以前也写过不少的博客来介绍它了,国内的文章都是基于同一套代码的.
而正因为对apns了解的少,所以写的代码,以及对它的扩展都是不够完善的.

不过google code上终于有一套相对比较完善的代码了.https://code.google.com/p/apns-php/,其实在最近他已经迁移到了github了(October 26, 2012, Project source code has moved to github. )
看了一下代码,确实不错.
如果是原先的代码,其实一直有一个问题:如果某个token失效了,那么在接下来的10s左右,fwrite的推送都会失败.
虽然苹果提供了feedback的返回,但其实你翻看国内的文章,介绍,都没有告诉你怎么查询feedback,所以我到现在也没有好好的对Feedback处理过那些无效的信息.

上面介绍的这套代码就好很多了.可以进行推送,在失败的话,还能够继续推,如果成功的推送是直接可以进入下一条,不会胡乱浪费资源,真心不错...
代码也很简单:

PHP代码
  1. $push = new ApnsPush(ApnsAbstract::ENVIRONMENT_SANDBOX, '/dev.pem');  
  2.         // Set the Root Certificate Autority to verify the Apple remote peer  
  3.  
  4.         //$push->setRootCertificationAuthority('entrust_root_certification_authority.pem');  
  5.         // Increase write interval to 100ms (default value is 10ms).  
  6.         // This is an example value, the 10ms default value is OK in most cases.  
  7.         // To speed up the sending operations, use Zero as parameter but  
  8.         // some messages may be lost.  
  9.         // $push->setWriteInterval(100 * 1000);  
  10.         // Connect to the Apple Push Notification Service  
  11.         $push->connect();  
  12.         foreach ($result as $data) {  
  13.             $token = $appCache->getAppTokenByUserId($data['receive_userid']);  
  14.             if(!$token){  
  15.                 continue ;  
  16.             }  
  17.             $token = str_replace(" ","",$token);  
  18.             // Instantiate a new Message with a single recipient  
  19.             $message = new ApnsMessage($token);  
  20.             // Set a custom identifier. To get back this identifier use the getCustomIdentifier() method  
  21.             // over a ApnsMessage object retrieved with the getErrors() message.  
  22.             //$message->setCustomIdentifier(sprintf("Message-Badge-%03d", $i));  
  23.             // Set badge icon to "3"  
  24.             $message->setBadge( intval($data['cnt']));  
  25.             // Add the message to the message queue  
  26.             $push->add($message);  
  27.         }  
  28.         // Send all messages in the message queue  
  29.         $push->send();  
  30.         // Disconnect from the Apple Push Notification Service  
  31.         $push->disconnect();  
  32.         // Examine the error message container  
  33.         $aErrorQueue = $push->getErrors();  
  34.         if (!empty($aErrorQueue)) {  
  35.             var_dump($aErrorQueue);  
  36.         }  

这段代码不要纠结,为什么与官方不一样,因为我在用yii框架的时候没有autoload成功它的 代码,花了5分钟将它全部改成基于namespace的了.