<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/rss.xsl" type="text/xsl"?>
<rss version="2.0">
  <channel>
    <title>IT瘾internet推荐</title>
    <link>https://itindex.net/tags/internet</link>
    <description>IT社区推荐资讯 - ITIndex.net</description>
    <language>zh</language>
    <copyright>https://itindex.net/</copyright>
    <generator>https://itindex.net/</generator>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>https://itindex.net/images/logo.gif</url>
      <title>IT社区推荐资讯 - ITIndex.net</title>
      <link>https://itindex.net/tags/internet</link>
    </image>
    <item>
      <title>写了个磁力搜索的网页 － 收录最近热门分享的资源</title>
      <link>https://itindex.net/detail/59599-%E7%A3%81%E5%8A%9B-%E6%90%9C%E7%B4%A2-%E7%BD%91%E9%A1%B5</link>
      <description>&lt;p&gt;好吧，又很疯狂地做了一个东西：  &lt;a href="http://bt.shousibaocai.com/" target="_blank"&gt;http://bt.shousibaocai.com/&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://xiaoxia.org/upfiles/2013/05/btsearch.png"&gt;   &lt;img alt="btsearch" height="491" src="http://xiaoxia.org/upfiles/2013/05/btsearch-700x491.png" width="700"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;em&gt;&lt;/em&gt;&lt;/p&gt;
 &lt;p&gt;平常我们高端用户都会用到BT工具来分享一些好玩的资源，例如ubuntu 13.04的ISO安装盘，一些好听的音乐等。这个时候我们会进入一个叫做P2P的网络，大家都在这个网络里互相传递数据，这种分布式的数据传输解决了HTTP、FTP等单一服务器的带宽压力。以往的BT工具（包括现在也有）在加入这个P2P网络的时候都需要借助一个叫Tracker的中心服务器，这个服务器是用来登记有哪些用户在请求哪些资源，然后让请求同一个资源的用户都集中在一起互相分享数据，形成的一个集群叫做Swarm。&lt;/p&gt;
 &lt;p&gt;这种工作方式有一个弊端就是一旦Tracker服务器出现故障或者线路遭到屏蔽，BT工具就无法正常工作了。所以聪明的人类后来发明了一种叫做DHT（Distributed Hash Table）的去中心化网络。每个加入这个DHT网络的人都要负责存储这个网络里的资源信息和其他成员的联系信息，相当于所有人一起构成了一个庞大的分布式存储数据库。在DHT里定位一个用户和定位一个资源的方法是一样的，他们都使用SHA－1产生的哈希值来作标识。&lt;/p&gt;
 &lt;p&gt;具体如何工作的呢？举个形象点的例子，把DHT网络比作一个朋友圈子，你想进入这个圈子必须要有一个人带领你进去，通常会有一些特定人负责介绍你进入这个圈子。当你被A带进这个朋友圈，此刻你就只认识A而已。但是你的目的是想找奥巴马总统，所以你会问A要奥巴马的联系方式，但是A没有奥巴马的联系方式，他会介绍一个美国朋友B给你认识。于是你去问B要奥巴马的联系方式，B其实也没有奥巴马的联系方式，但是B认识一个州长C。于是你又得到了C的联系方式，C把奥巴马的联系方式告诉你之后，你就可以写信或者致电给奥巴马了。&lt;/p&gt;
 &lt;p&gt;这种DHT网络听起来很不错，没有中心服务器，也不怕被DDOS，看看海盗湾如今还能挺立那么久就知道了。但是有没有安全隐患在里面呢？答案是肯定有的。有些不听话的用户可能会在DHT网络里捣乱，譬如说撒谎，明明自己不是奥巴马，却偏说自己是奥巴马，这样会误导其他人无法正常获取想要的资源。另外，用户在DHT网络里的隐私可能会被窃听，因为在DHT网络里跟其他用户交换资源的时候，难免会暴露自己的IP地址，所以别人就会知道你有什么资源，你在请求什么资源了。这也是目前DHT网络里一直存在的一个弱点。&lt;/p&gt;
 &lt;p&gt;正是利用这个弱点，我根据DHT协议用Python写了一段白菜程序，加入了这个DHT网络。在这个网络里，我会认识很多人，越多越好，并且观察这些人的举动，比如说A想要ubuntu的安装盘，那么我会把A的这个行为记下来，同时我会把ubuntu安装盘这个资源的信息也记下来，保存到数据库中，统计请求ubuntu这个资源的人有多少。如今，这个爬虫已经运行了两个昼夜，以每分钟记录3000多个资源信息的速度工作（单机器单线程，耗尽了CPU的一个核心）。到目前为止（48小时），共发出4亿条交友请求，收到1100万条来自朋友的资源请求。到底有多少资源目前另外一个程序还在分析中，从已分析的300万请求中，独立资源个数为20万个。保守估计这1100万条请求中涉及资源个数为50万以上。迟点有空的话，对这些资源进行分类和分析。&lt;/p&gt;
 &lt;p&gt;在DHT网络里发现的资源基本上都是最新的活跃资源，一些几年前的资源现在没有用户请求的话就不会被挖掘出来。想想海盗湾沉淀了那么久才500万资源，我跑了两天的程序就已经探测到50万资源，所以随着时间推移，会有更多的资源被探测出来，而且那些最新的能够被接近实时的速度发现到。本来通过增加一个节点进程可以加快探测速度，但是我没有这样做的原因是分析请求的哈希值的速度赶不上发现新请求的速度。有兴趣的朋友可以自己琢磨一下这方面的东西，国内研究DHT网络的人应该比较少。前段时间我打探过几家现在做P2P视频播放的公司里，没有人做这方面的研究。&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;[DHT Protocol]   &lt;a href="http://www.bittorrent.org/beps/bep_0005.html" target="_blank"&gt;http://www.bittorrent.org/beps/bep_0005.html&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet 我的分享</category>
      <guid isPermaLink="true">https://itindex.net/detail/59599-%E7%A3%81%E5%8A%9B-%E6%90%9C%E7%B4%A2-%E7%BD%91%E9%A1%B5</guid>
      <pubDate>Sat, 11 May 2013 05:16:21 CST</pubDate>
    </item>
    <item>
      <title>微信收费事件背后被广泛忽略的技术细节</title>
      <link>https://itindex.net/detail/56138-%E5%BE%AE%E4%BF%A1-%E4%BA%8B%E4%BB%B6-%E6%8A%80%E6%9C%AF</link>
      <description>&lt;p&gt;作为一个横跨通信与互联网两大行业的从业者，前四年的核心网经验和后五年的互联网经验让我不得不感慨一个非常遗憾的现实：通信与互联网两大行业本来可以有珠联璧合的技术协同，为移动互联网提供近乎零耗电零流量的PUSH机制，但由于两个行业之间长期以来的价值观隔阂和互防心态，导致如今的手机PUSH技术不仅为用户增加了显著的电量消耗，还对移动运营商的基础设施造成了完全不必要的信令压力。微信与运营商的纷争正是这种冲突集中爆发的结果。&lt;/p&gt;
 &lt;p&gt;看到不少来自两个行业的专业分析，通信行业的专家谴责微信过于频繁的心跳和短包导致“信令风暴”，而互联网人士则往往站在用户与道德的制高点上对移动运营商挖苦讥讽，双方都很少探究这个问题的深层次技术和利益矛盾。这里我不妨提一提有些大家没有真正重视的技术细节。&lt;/p&gt;
 &lt;p&gt;为什么使用同样PUSH技术的Apple和Google等巨头，没有被运营商卯上，唯独单单拿微信下手？大家也许会认为这是运营商欺软怕硬，拿Apple和Google没办法。其实从实际数据上来看（下面将提到），微信确确实实产生了远超Apple和Google的信令需求。难道是因为腾讯技不如人，被逮着了尾巴？其实不然，我们曾经也在PUSH技术上投入了较多的分析研究，其中一项发现或许可以解释各种原委。根据分析，一般当基带空闲超过一定时间后，运营商的IP网关会自动释放（关闭）连接。目前各家所使用PUSH通道的实现原理虽然同为『长连接慢心跳』，但这个『慢』字却有很大的文章。  &lt;strong&gt;Google在Android系统中使用蜂窝（2G/3G）网络连接GCM的PUSH通道时，默认采用的心跳周期是28分钟&lt;/strong&gt;，这才是所谓“慢”的含义 —— 尽可能降低心跳的频度，从而达到尽量省电的目的。但这个放诸全球绝大部分地区借行得通的规则，到了中国大陆，就出现了问题。  &lt;strong&gt;以中移动的2.5G网络为例，经过粗略测试，大约5分钟左右的基带空闲，连接就会被释放，这就是为什么微信Android版本选择以『5分钟』为周期发送连接心跳。&lt;/strong&gt;可能有人会有疑问了，『那Google以28分钟发送心跳，岂不是在中移动的2.5G网络下无法保持PUSH长连接？』事实上，确实如此，这也是为什么Google的PUSH通道经常『迟到』。当我们活跃使用手机时，由于基带往往并不会闲置，所以部分掩盖了问题的本质。另外，当连接到Wi-Fi时，宽带的网关一般没有空闲释放机制，所以长连接会得到保持，这也进一步减少了我们平时遭遇的PUSH迟到。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;『5分钟』的心跳周期到底是什么概念？可以理解为，每部安装了微信的Android设备每天发送近300条短信（其实占用的信令资源还远超这个数量）；还意味着每天你的手机将被从待机省电状态唤醒近300次，每次相当于打一个几秒钟的电话。粗略测算，一般的Android手机每天有超过15-20%的电量被消耗在发送过度频繁的心跳上。&lt;/strong&gt;其实，这都还远不是最糟糕的事情。由于众所周知的原因，大陆行货渠道发售的Android手机都无法使用Google的PUSH通道，原本每个手机中只需要建立的唯一共享的PUSH通道，被人为分裂，以至于每一个声称为用户提供实时通知的国内App，基本都在重复上面微信所做的行为。当你的手机中同时安装了多个这类App时，无论手机的耗电，还是运营商的信令负担，都要数倍于上述情形。&lt;/p&gt;
 &lt;p&gt;虽然我向来不惮以最坏的恶意揣测国内的垄断巨头，但在这个事情上，中移动或许确有它的苦衷。正如很多技术文章中所言，2G网络的基础结构和协议并未针对IP传输优化，其服务IP链路的信令承载能力相对较弱，而TD-SCDMA又长期得不到真正的发展，导致中移动的2.5G网络承受了超龄超载的负荷。  &lt;strong&gt;刻意缩短空闲连接的释放超时，可能原本是期望能起到节省信道资源的目的，没想到聪明反被聪明误，这一限制性的举措让互联网应用不得不以远高于正常的频率发送心跳以维持PUSH长连接，结果大大加重的信令负担，给本就脆弱的2.5G网络雪上加霜，而且更给用户的手机造成了远超常规PUSH技术的电量消耗，造成了如今这一『三输』的格局。&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;其实，不光是微信，整个移动互联网行业都在努力解决PUSH机制目前所面对的各方面问题。包括Google、Apple这样在整个行业举足轻重的巨头，都仅仅在OSI通信协议的4层以上作各种努力，目前几乎所有的PUSH机制都基于『TCP长连接慢心跳』方式实现。虽然『慢心跳』如果得以正常工作，可以在一定程度上降低手机基带模块的工作频度，但无论互联网行业在技术上再如何标榜“PUSH”相比“PULL”的流量优势，但在OSI的下三层来看，基带模块所承受的负担和“PULL”仍然没有本质差别。这就决定了耗电问题不可能从互联网技术层面彻底解决。事实上，在移动通信网络中，信令是一种天然的最佳PUSH载体，它不需要任何IP层的收发包（也就不需要TCP连接）就能实现秒级的实时性，最重要的是它没有任何额外的电量负担，手机完全只需处于正常的待机状态。可惜移动运营商只会将其运用在一本万利的SMS（及WAP PUSH）服务，压根不可能无偿提供给互联网产业使用。结果，互联网行业选择了虽然不用付费，但却代价高昂的『TCP长连接』，只为让用户享受到免费的通知服务。这种两大行业置用户体验于不顾的分庭抗礼，已经相持近10年，而当互联网终究开始以免费服务反噬移动运营商的SMS甚至语音业务时，运营商再也坐不住了…… 但与其饱受信令风暴的折磨，不如主动免费开放信令通道作为更高效的PUSH通道给互联网产业使用，再以『免费增值』的思路构建有QoS保障的VIP PUSH服务。不仅可以大幅度节约信令资源，更能以用户体验的提升打造核心竞争优势和增值空间。能否走出这样一条转折的道路，就看运营商是否愿意转变思维了。&lt;/p&gt;
 &lt;p&gt;注：由于iOS系统的相对封闭性，暂时未能测定Apple的Push通道APNS在2.5G网络下的长连接心跳周期。欢迎了解的朋友补充测试数据。&lt;/p&gt;
 &lt;hr&gt;&lt;/hr&gt;
UPDATE：更正微信Android版在中移动2.5G网络下的心跳周期为5分钟（此前测定的2.5分钟存在偏差） &lt;p&gt;&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet Mobile</category>
      <guid isPermaLink="true">https://itindex.net/detail/56138-%E5%BE%AE%E4%BF%A1-%E4%BA%8B%E4%BB%B6-%E6%8A%80%E6%9C%AF</guid>
      <pubDate>Sun, 14 Apr 2013 22:27:17 CST</pubDate>
    </item>
    <item>
      <title>手撕包菜磁力搜索引擎的开源说明</title>
      <link>https://itindex.net/detail/56324-%E5%8C%85%E8%8F%9C-%E7%A3%81%E5%8A%9B-%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E</link>
      <description>&lt;p&gt;已经一年半载没有写博客了，搞得上来不知道写些什么。博客上的内容还时不时有人评论，大部分我还是会一一回复的。有些人会关注我的博客用什么主机，我的博客现在是用Linode的主机，因为现在很便宜，而且配置不差。另外比较多的是问手撕包菜的源代码能否提供，能否出售。今天我写这个文章就是把手撕包菜的网站开源了，包括网站页面，DHT爬虫和搜索引擎相关部分。&lt;/p&gt;
 &lt;p&gt;2年前的那篇跟磁力搜索相关的文章在这里：  &lt;br /&gt;
  &lt;a href="http://xiaoxia.org/2013/05/11/magnet-search-engine/"&gt;写了个磁力搜索的网页 － 收录最近热门分享的资源&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;作为最早在国内研究和实践DHT爬虫的人，我的灵感是来自芬兰Helsinki大学的这篇论文：  &lt;br /&gt;
  &lt;a href="http://www.cs.helsinki.fi/u/lxwang/publications/security.pdf"&gt;Real-World Sybil Attacks in BitTorrent Mainline DHT&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;英文好的同学应该很容易读懂，跟我写的不到300行的爬虫代码大致原理一样。初次接触DHT网络的可以结合我之前的文章阅读，或者拜读  &lt;a href="http://codemacro.com/blog/archives/"&gt;Kevin Lynx的博客&lt;/a&gt;。所以具体原理在这里就不再阐述了。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;手撕包菜一开始只是为了纯粹的技术研究，没有去想这个搜索引擎能给网民带来什么样的福利。当时采集了大量的数据，发现有一半以上的资源为限级内容，于是试图去对资源进行分类并且做了很多这方面的工作。譬如，基本上能通过一套规则能筛选出限级内容，对资源进行分类，如果是视频还能匹配出是哪一部影片。可惜，这些工作我主观上认为对生活应用并没有太大价值，于是就放弃了深入的研究。或许是因为网民使用此类搜索引擎大部分都是具有明显的目的性。&lt;/p&gt;
 &lt;p&gt;手撕包菜经历了多次点技术变更。开源版本使用了django网站框架重写，之前是Flask，再早期是tornado。电影FM也是使用tornado，后来发现tornado并不适用于任何场景。以内容为王的网站还是django比较擅长，只是入门时间比其他框架都较长。早期数据库采用了MongoDB，因为配合Python读写数据很方便，也不用关注数据结构，搜索功能采用自带的关键词搜索，不过后来随着资源数量增加，性能也明显跟不上。今年换了WiredTiger引擎，自带的fulltext search还是不给力。另外Amazon的cloudsearch是个坑，土豪可以考虑，性能真的很不错，就是比较贵。最后还是搭建一个SphinxSearch吧，数据库也换成MySQL（MyISAM引擎），配合起来也很方便。Sphinx创建全文索引的速度很给力，官方的自评也很高，我自己测试1000w的资源（大概3GB），1分钟左右就索引完毕。不信，大家可以自测一下。&lt;/p&gt;
 &lt;p&gt;网站和爬虫代码已经上传到GitHub，地址：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="https://github.com/78/ssbc"&gt;https://github.com/78/ssbc&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;代码采用GPLv2协议发布，使用时请遵循GPLv2的规定。  &lt;br /&gt;
开源的目的是为了交流，学习和改进。如果商用，请务必告知。&lt;/p&gt;
 &lt;p&gt;附一个P2P网络协议QQ交流群：97912038。&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet 我的代码 我的分享</category>
      <guid isPermaLink="true">https://itindex.net/detail/56324-%E5%8C%85%E8%8F%9C-%E7%A3%81%E5%8A%9B-%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E</guid>
      <pubDate>Fri, 15 May 2015 00:44:38 CST</pubDate>
    </item>
    <item>
      <title>IE8，9，10 将在下周二寿终正寝</title>
      <link>https://itindex.net/detail/55030-ie8-%E5%91%A8%E4%BA%8C</link>
      <description>&lt;p&gt;让一个软件死亡，那就是不再给它更新版本、修补漏洞以及给用户提供技术支持。&lt;/p&gt; &lt;div&gt;  &lt;img alt="" src="http://dn-noman.qbox.me/Fh_DWC_SzQSVRULh-alFQ4Tel3rg"&gt;&lt;/img&gt;&lt;/div&gt; &lt;p&gt;  &lt;a href="https://support.microsoft.com/en-us/kb/3123303?sd=rss&amp;spid=14019"&gt;微软官方发布公告 &lt;/a&gt;，「臭名昭著」的 Internet Explorer 8，9，10 三个版本的浏览器将会在下周二（1 月 12 日）迎来它们寿终正寝的日子，并告知升级 IE 浏览器的办法。&lt;/p&gt; &lt;p&gt; 下周二，微软将会推送一个 KB31323303 的补丁催促依旧使用旧版 IE 浏览器的用户升级到最新版本的浏览器。&lt;/p&gt; &lt;p&gt;这对于开发者来说是一个好消息，因为它们再也不必为适配这些僵尸浏览器而感到郁闷了，因为微软也已经放弃了，一位程序员说道，它们听到 IE 死亡就如同魔法世界的人听到伏地魔被消灭一样感到兴奋。&lt;/p&gt; &lt;p&gt;微软说，IE 11 这次虽然能够苟延残喘，但它的日子也将不会久了，Windows 7，Windows 8.1 和 Windows 10 的用户仅会在很短的时间内接收到有关 IE 11 的安全更新，漏洞修补和技术支持。&lt;/p&gt; &lt;p&gt;如果你为了一些不知道为什么的奇怪理由继续使用旧版本的 IE 的话，你将可能面对很多的小问题而且得不到技术支持，如果你非要使用微软的浏览器的话，你不妨考虑使用 Windows 10 内置的 Edge 浏览器。&lt;/p&gt; &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
        
      &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>internet explorer</category>
      <guid isPermaLink="true">https://itindex.net/detail/55030-ie8-%E5%91%A8%E4%BA%8C</guid>
      <pubDate>Wed, 06 Jan 2016 19:49:49 CST</pubDate>
    </item>
    <item>
      <title>使用ffmpeg合并视频文件的三种方法</title>
      <link>https://itindex.net/detail/52379-ffmpeg-%E5%90%88%E5%B9%B6-%E8%A7%86%E9%A2%91</link>
      <description>&lt;p&gt;ffmpeg合并视频的方法有三种。国内大多数仅介绍了其中之一。于是觉得有必要翻译一下。其实在ffmpeg的  &lt;a href="https://ffmpeg.mplayerhq.hu/faq.html#How-can-I-concatenate-video-files_003f" target="_blank"&gt;FAQ文档中有比较详细的说明。&lt;/a&gt;&lt;/p&gt;
 &lt;ol&gt;
  &lt;li&gt;
   &lt;h3&gt;使用concat协议进行视频文件的合并&lt;/h3&gt;
   &lt;p&gt;这种方式的适用场景是：视频容器是MPEG-1, MPEG-2 PS或DV等可以直接进行合并的。换句话说，其实可以直接用cat或者copy之类的命令来对视频直接进行合并。很多文章介绍了这种方法，但适用性却没有提及。这并不是一个通用的方法。典型的命令示例如下：&lt;/p&gt;
   &lt;pre&gt;ffmpeg -i concat:&amp;quot;intermediate1.mpg|intermediate2.mpg&amp;quot; -c copy intermediate_all.mpg&lt;/pre&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;h3&gt;使用concat demuxer进行视频文件的合并&lt;/h3&gt;
   &lt;p&gt;这种合并方式的适用场景是：当容器格式不支持文件层次的合并，而又不想（不需要）进行再编码的操作的时候。这种方式对源视频同样有同格式同性质的要求。其详细语法参见    &lt;a href="https://ffmpeg.mplayerhq.hu/ffmpeg-formats.html#concat-1"&gt;这里&lt;/a&gt;。典型的命令示例如下：&lt;/p&gt;
   &lt;pre&gt;ffmpeg -f concat -i Cam01.txt -c copy Cam01.mp4&lt;/pre&gt;
   &lt;p&gt;其中，Cam01.txt 为包含了输入文件的描述文件。&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;
   &lt;h3&gt;使用concat滤镜（filter）进行视频文件的合并：&lt;/h3&gt;
   &lt;p&gt;当需要进行任意程度的重新编解码时，官方推荐使用的方法即是用concat滤镜来进行视频文件的合并处理。详细说明参见    &lt;a href="https://ffmpeg.mplayerhq.hu/ffmpeg-filters.html#concat"&gt;这里&lt;/a&gt;。典型命令示例如下：&lt;/p&gt;
   &lt;pre&gt;ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
  &amp;apos;[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
   concat=n=3:v=1:a=2 [v] [a1] [a2]&amp;apos; \
  -map &amp;apos;[v]&amp;apos; -map &amp;apos;[a1]&amp;apos; -map &amp;apos;[a2]&amp;apos; output.mkv&lt;/pre&gt;
   &lt;p&gt;这段命令目的是将三段双语格式的视频合并至最终的一段视频(output.mkv)。参数n=3说明待合成的视频有三段，v=1说明视频流为一，a=2说明音频流为二。 -map参数的详细说明可以从Filtergraph文档中找到。
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
 &lt;p&gt; &lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>计算机与 Internet ffmpeg 多媒体</category>
      <guid isPermaLink="true">https://itindex.net/detail/52379-ffmpeg-%E5%90%88%E5%B9%B6-%E8%A7%86%E9%A2%91</guid>
      <pubDate>Fri, 02 Jan 2015 10:34:43 CST</pubDate>
    </item>
    <item>
      <title>Android 4.2开发者新特性</title>
      <link>https://itindex.net/detail/40863-android-%E5%BC%80%E5%8F%91</link>
      <description>&lt;p&gt;Android 4.2沿用了Jelly Bean开发代号，版本名为：Jelly Bean MR2。相对于Android 4.1，4.2进一步的提高了系统性能，更新了系统UI，并加入了其它一些新特性。&lt;/p&gt;
 &lt;h2&gt;  &lt;a name="42-performance"&gt;&lt;/a&gt;更快，更平滑，更高响应性&lt;/h2&gt;
 &lt;p&gt;Android 4.2继承了4.1已经加入性能优化—   &lt;strong&gt;全面垂直同步&lt;/strong&gt;,   &lt;strong&gt;三倍缓冲，触摸延迟消除和CPU&lt;/strong&gt;  &lt;strong&gt;随输入调整。&lt;/strong&gt;  &lt;strong&gt;并加入了新的改善：&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;硬件加速2D&lt;/strong&gt;  &lt;strong&gt;渲染&lt;/strong&gt; 的调优使得一些诸如卷动和滑动等动画变得更顺滑。更加入了针对图层处理，和某些图形（圆角矩形、圆和椭圆）的绘制优化。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;WebView&lt;/strong&gt;  &lt;strong&gt;渲染优化&lt;/strong&gt;进行了大量修整，页面卷动更加平滑。&lt;/p&gt;
 &lt;p&gt;Android的  &lt;strong&gt;渲染脚本（&lt;/strong&gt;  &lt;strong&gt;Renderscript&lt;/strong&gt;  &lt;strong&gt;）计算&lt;/strong&gt;  &lt;strong&gt;是首次移植的计算平台，直接运行于&lt;/strong&gt;  &lt;strong&gt;   &lt;em&gt;移动设备&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;GPU&lt;/strong&gt;  &lt;strong&gt;上。它会自动启用&lt;/strong&gt;  &lt;strong&gt;   &lt;em&gt;GPU &lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;   &lt;em&gt;计算&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;资源，动态的为图形和图像处理进行性能优化。所有采用了渲染脚本技术的应用都可以在不&lt;/strong&gt;  &lt;strong&gt;   &lt;em&gt;重新编译&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;的情况下，&lt;/strong&gt;  &lt;strong&gt;&lt;/strong&gt;  &lt;strong&gt;在支持的设备上&lt;/strong&gt;  &lt;strong&gt;，由此GPU&lt;/strong&gt;  &lt;strong&gt;混合获得性能提升。&lt;/strong&gt;&lt;/p&gt;
 &lt;h2&gt;  &lt;a name="42-ui"&gt;&lt;/a&gt; 全新UI&lt;/h2&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;Android 4.2重新定义了Jelly Bean的用户体验，并将诸如状态条、系统栏通知窗口等我们熟知的Android UI元素全面覆盖到平板上。&lt;/p&gt;
 &lt;p&gt;所有的屏幕尺寸都将在顶部显示  &lt;strong&gt;状态条&lt;/strong&gt;，以及  &lt;strong&gt;通知&lt;/strong&gt;新加入的  &lt;strong&gt;快速设置&lt;/strong&gt;下拉菜单。我们熟悉的系统栏位于屏幕下部，同时适合左右手使用。  &lt;strong&gt;应用栏&lt;/strong&gt;也将在所有的屏幕尺寸上启用。&lt;/p&gt;
 &lt;h2&gt;平板多用户支持&lt;/h2&gt;
 &lt;p&gt;现在，多个用户可以  &lt;strong&gt;共享同一个Android&lt;/strong&gt;  &lt;strong&gt;平板&lt;/strong&gt;，每个用户都有自己  &lt;strong&gt;独立的用户空间。&lt;/strong&gt;用户可以在锁屏界面进行用户切换。&lt;/p&gt;
 &lt;p&gt;在多用户设备上，Android给每个用户分配了独立的环境，包括用户特定的虚拟SD卡存储。每个用户都有他们自己的主屏、widget、账户、设置、文件和应用，而系统负责将他们分隔开。所有的用户共享核心的系统服务，但系统会确保每个用户的应用数据是分开的。其最终效果就好像每个用户都拥有他们自己的Android 设备。&lt;/p&gt;
 &lt;p&gt;用户可以在他们自己的使用环境中随时安装/删除应用。为了节省存储空间，仅在设备中没有任何一个用户安装过的情况下，Google Play才会去下载应用APK。如果应用曾经安装过，Google Play&lt;/p&gt;
 &lt;p&gt;会跟平时一样记录下新用户的安装，但不会重新下载应用。多个用户可以使用同一个APK，但用户数据保存在各自的空间里。&lt;/p&gt;
 &lt;p&gt;对开发者而言，  &lt;strong&gt;多用户支持是透明的&lt;/strong&gt; — 你毋须为多用户环境做更多考虑。也毋须对发布的APK做任何改变（  &lt;strong&gt;但由于存储的改变，任何原先在程序中写死的&lt;/strong&gt;  &lt;strong&gt;/mnt/sdcard&lt;/strong&gt;  &lt;strong&gt;这样的存储位置都将出现问题&lt;/strong&gt;）。系统会针对每个用户的空间管理应用，好像它运行在单用户环境中一样。&lt;/p&gt;
 &lt;h2&gt;  &lt;a name="42-engagement"&gt;&lt;/a&gt; 吸引用户的新方式&lt;/h2&gt;
 &lt;h3&gt;  &lt;a name="42-lockscreen-widgets"&gt;&lt;/a&gt;锁屏widgets&lt;/h3&gt;
 &lt;p&gt;Android 4.2中，用户可以将应用widget放置于锁屏界面上，在不解锁的情况下，即可访问他们的应用。用户可以由安装的应用提供的widget中选择多至5个锁屏widget。锁屏界面将它们显示在独立的面板上，用户可以通过左右滑动面板来进行切换。&lt;/p&gt;
 &lt;p&gt;与所有应用widget类似，锁屏widget可以显示  &lt;em&gt;任何种类的内容&lt;/em&gt;，并与用户进行直接交互。比如用于控制音乐播放的widget或者它们可以使用户在进行必要的解锁操作后，直接跳转到应用中的Activity。&lt;/p&gt;
 &lt;p&gt;对开发者来说，锁屏widget提供了一个吸引用户的崭新方式。它们可以帮你将应用内容放置于用户最常看到的位置，从而拥有更多用户使用你应用的机会。&lt;/p&gt;
 &lt;p&gt;你可以新建一个应用widget或扩展你目前的主屏widget来获得这个新功能。如果你的应用中已经有了主屏widget，你只需做非常少的修改，就可以令其支持锁屏widget。为了提供更好的体验，你可以更新你的widget以使用全部的锁屏界面。或在小屏幕上提供尺寸修改版本。你也可以在widget上添加新功能，以使其更适合锁屏界面使用。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-daydreams"&gt;&lt;/a&gt;白日梦（Daydream）&lt;/h3&gt;
 &lt;p&gt;白日梦是一种  &lt;strong&gt;互动屏保模式&lt;/strong&gt;。当用户的设备置于底座或充电时启用。启用时，系统加载一个白日梦作为屏保。它其实是由安装的应用提供的远程内容服务。用户可以在设置应用中启用白日梦，然后选择一个应用用以显示。&lt;/p&gt;
 &lt;p&gt;白日梦接合了动态壁纸和主屏widget的优势，但更加有力。它们在全新的使用模式中帮你为用户提供各种内容。并响应用户交互，比如翻阅图片，播放音频/视频，或一触之下，跳转至你的应用。&lt;/p&gt;
 &lt;p&gt;因为白日梦会在充电或者放入底座的时候自动启动，所以这给了你的应用程序提供新型用户体验的机会，比如后靠模式、展示模式、演示模式、全屏浏览模式和吸引模式。所有这些都不需要特殊的硬件支持。&lt;/p&gt;
 &lt;p&gt;白日梦跟Activity很类似，可以执行所有Activity的操作：从渲染UI树（毋须使用RemoteViews）到直接用Canvas、OpenGL、SurfaceTexture等绘图。但是，白日梦并不是Activity，所以它们不会存在于返回堆栈当中，也不会在近期使用的列表中出现，也无法由你的应用中直接启动。&lt;/p&gt;
 &lt;p&gt;白日梦的实现是比较简明的，你可以直接使用你应用中其它部分的现成的UI组件和资源。你可以在一个应用中提供多个白日梦，而且可以为它们提供不同的内容和设置项。&lt;/p&gt;
 &lt;h2&gt;  &lt;a name="42-external-display"&gt;&lt;/a&gt; 扩展显示支持&lt;/h2&gt;
 &lt;p&gt;Android 4.2为平台引入了  &lt;em&gt;扩展显示&lt;/em&gt;支持。这种支持并不只是在不同的屏幕上显示相同的内容。应用可以针对不同的显示输出，显示不同的内容。应用可以借此来为用户提供新形态互动和娱乐体验。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-display-manager"&gt;&lt;/a&gt;显示管理器&lt;/h3&gt;
 &lt;p&gt;应用通过一个新的显示管理器系统服务来与显示系统互动。您的应用可以枚举当前所有的显示设备，并获得它们的相关参数，比如尺寸、密度、显示名称、ID、对安全视频的支持等。当显示设备接入或拔除时，或当它们的参数变化时，您的应用也会收到回调通知，由此可以更好的管理您在扩展显示上的内容。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-presentation"&gt;&lt;/a&gt;展示窗口&lt;/h3&gt;
 &lt;p&gt;为了更方便的显示扩展显示上的内容，框架提供了一个新的叫做  &lt;em&gt;展示&lt;/em&gt;（  &lt;strong&gt;Presentation&lt;/strong&gt;）的UI对象。您的应用只需提供一个将要使用的显示器、一个窗口主题以及显示内容。  &lt;em&gt;展示&lt;/em&gt;将负责处理资源引用，并依据您目标显示的特性来渲染您的显示内容。&lt;/p&gt;
 &lt;p&gt;您可以用  &lt;em&gt;展示&lt;/em&gt;来对两个或多个显示设备进行全面控制。&lt;/p&gt;
 &lt;p&gt;展示可以使你的应用控制远程窗口和它所显示的内容。并让你基于用户的输入事件比如点按、触摸手势、移动事件等对其进行管理。您可以使用平时所用的所有工具在展示中创建UI、渲染内容，不论是用 SurfaceView和SurfaceTexture直接创建视图层次，还是将流内容和相机预览直接绘制到窗口中。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-preferred display"&gt;&lt;/a&gt;首选显示选择&lt;/h3&gt;
 &lt;p&gt;当存在多个外部显示设备时，您可以创建任意多的展示，每个都在特定的显示器上显示不同的内容。在很多情况下，您可能只希望您的内容显示于某个特定的外部显示器上——最适合展示内容的那个。在这一点上，系统可以帮助您的应用选择最佳设备。&lt;/p&gt;
 &lt;p&gt;您的应用可以向显示管理器查询系统  &lt;em&gt;默认展示显示设备&lt;/em&gt;，并在此设备改变时收到回调。或者，您可以使用Android 4.2中扩展的媒体路由服务，来在系统视频路由改变时接收通知。您的应用可以在默认的主Activity中进行内容显示，而在适当的展示设备接入时切换过去。您的应用也可以使用媒体路由的MediaRouteActionProvider和MediaRouteButton提供标准的显示输出选择UI。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-protected-content"&gt;&lt;/a&gt;内容保护&lt;/h3&gt;
 &lt;p&gt;对处理保护/加密内容的应用来说，显示API会上报连接显示器的  &lt;em&gt;安全视频能力&lt;/em&gt;。您可以在应用中查询一个显示器是否支持安全视频输出或支持图像缓冲保护，并由此来选择合适的内容流或解码以保证内容可以正常显示。SurfaceView 对象加入了新的安全机制，您的应用可以设置安全标志位，来标记其中的内容不会出现于  &lt;strong&gt;截屏结果&lt;/strong&gt;或不提供安全显示输出的显示器上。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-wireless-display"&gt;&lt;/a&gt;无线显示&lt;/h3&gt;
 &lt;p&gt;由Android 4.2用户可以经由wifi，使用  &lt;a href="http://www.wi-fi.org/wi-fi-certified-miracast&amp;#8482;"&gt;Miracast&lt;/a&gt; 来连接外部显示器。这是一个由  &lt;a href="http://www.wi-fi.org/"&gt;Wi-Fi&lt;/a&gt;  &lt;a href="http://www.wi-fi.org/"&gt;联盟&lt;/a&gt; 定义的点对点无线显示标准。当无线显示器连接时，用户可以将包括图片、游戏、地图等任意内容以流的形式传输到大屏幕上。&lt;/p&gt;
 &lt;p&gt;应用可以在  &lt;em&gt;无线显示器&lt;/em&gt;中获得一切外部显示功能的支持，而无须额外处理。系统会管理网络连接并将您的展示或其它应用内容以流的形式输出到无线显示器上。&lt;/p&gt;
 &lt;h2&gt;  &lt;a name="42-native-rtl"&gt;&lt;/a&gt; 本地由右到左文字支持&lt;/h2&gt;
 &lt;p&gt;Android 4.2引入了  &lt;em&gt;由右到左文字的全面本地支持&lt;/em&gt;布局。在本地RTL支持下，您可以为所有用户带来完美的应用体验，不论他们的文字书写方向是由左至右还是由右至左。&lt;/p&gt;
 &lt;p&gt;当用户切换系统语言到由右至左书写方式时，系统提供自动的应用UI布局和所有可视组件的镜像，包括文字元素的显示和输入。&lt;/p&gt;
 &lt;p&gt;您的应用仅需极少改变即可支持  &lt;em&gt;RTL&lt;/em&gt;  &lt;em&gt;布局镜像&lt;/em&gt;。如果您的应用支持这一特性，只要在您应用的manifest文件中将所有的”left/right”布局属性改变为对应的”start/end”即可。系统就会根据需要处理您UI了。&lt;/p&gt;
 &lt;p&gt;为精确控制您的应用UI，Android 4.2包括了新的API帮您管理View组件中的布局方向，文字方向，文字对齐，布局分配和语言方向。您甚至可以使用由右至左的书写方向时，创建布局/绘图和其它资源的定制版本来进行显示。&lt;/p&gt;
 &lt;p&gt;为帮助您定制由右至左布局，HierarchyViewer工具中可以看到层次结构中所有的View的start/end，布局方向、文字方向和文字对齐属性&lt;/p&gt;
 &lt;h2&gt;  &lt;a name="42-intl"&gt;&lt;/a&gt; 国际语言增强&lt;/h2&gt;
 &lt;p&gt;Android 4.2为国际用户提供了大量的  &lt;em&gt;字体和字符优化&lt;/em&gt;：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;为韩国用户提供了新的字体选择 — Nanum (나눔글꼴) Gothic, 为韩语设计的unicode字体。&lt;/li&gt;
  &lt;li&gt;在WebViews里为日语提供了改良的竖排显示支持。&lt;/li&gt;
  &lt;li&gt;为印度语、泰语、阿拉伯语和希伯来文改善了默认字体的字距和位置。&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;默认的Android键盘也包括了多套更新的字典：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;为法语（支持两字组）、英语和俄语改良了字典&lt;/li&gt;
  &lt;li&gt;   &lt;a name="result_box"&gt;&lt;/a&gt;为丹麦，希腊，芬兰，立陶宛，拉脱维亚，波兰，斯洛文尼亚，塞尔维亚，瑞典，土耳其语提供了新字典&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;  &lt;a name="42-ui-tools"&gt;&lt;/a&gt; 创建华丽UI的新方式&lt;/h2&gt;
 &lt;h3&gt;嵌套Fragments&lt;/h3&gt;
 &lt;p&gt;为更好的控制您的UI组件，使它们更模块化，Android 4.2中可以将一个  &lt;em&gt;Fragment&lt;/em&gt;  &lt;em&gt;嵌入另外一个&lt;/em&gt;  &lt;em&gt;Fragment&lt;/em&gt;  &lt;em&gt;中&lt;/em&gt;。新的Fragment管理器可以帮你把一个Fragment作为子结点植入到另外一个Fragment的视图层次中。&lt;/p&gt;
 &lt;p&gt;您可以在很多情景下使用嵌套Fragment，但最有用的地方是在一个动态可重用的UI组件内实现另外一个动态可重用UI组件。比如说如果您使用ViewPager创建了一个支持左右滑动的fragment，您现在可以在其中的每个Fragemnt中再嵌入其它的Fragment了。&lt;/p&gt;
 &lt;p&gt;为帮助您在应用中由嵌套Fragment获益更多，这个特性已经加入了最新的  &lt;em&gt;Android&lt;/em&gt;  &lt;em&gt;支持库&lt;/em&gt;。&lt;/p&gt;
 &lt;h2&gt;相机HDR支持&lt;/h2&gt;
 &lt;p&gt;Android 4.2引入了  &lt;em&gt;新的相机硬件接口和流水线&lt;/em&gt;以改善性能。  &lt;strong&gt;在设备支持的情况下&lt;/strong&gt;，应用可以使用新的  &lt;em&gt;HDR&lt;/em&gt;  &lt;em&gt;摄像情景模式&lt;/em&gt;来使用高动态范围技术拍摄。&lt;/p&gt;
 &lt;p&gt;此外，框架层提供了API，供应用  &lt;strong&gt;设置是否在拍摄时启用快门音&lt;/strong&gt;。应用可以给用户选择来禁用声音，或选择其它的声音来替换标准快门音。&lt;/p&gt;
 &lt;h2&gt;  &lt;a name="42-dev-options"&gt;&lt;/a&gt; 新的内建开发者选项&lt;/h2&gt;
 &lt;p&gt;Android 4.2系统包括了大量的新开发者选项，以使构建兼顾外观和性能的应用更加容易。为在设备和模拟器上进行  &lt;em&gt;调试和调优&lt;/em&gt;曝露了更多特性。&lt;/p&gt;
 &lt;p&gt;在运行Android 4.2的设备上，开发者选项默认隐藏。您可以在Android设备上找到设  &lt;strong&gt;置&lt;/strong&gt;  &lt;strong&gt;&amp;gt;&lt;/strong&gt;  &lt;strong&gt;关于手机&lt;/strong&gt;  &lt;strong&gt;&amp;gt;&lt;/strong&gt;  &lt;strong&gt;版本号&lt;/strong&gt;，并连续点击  &lt;strong&gt;7&lt;/strong&gt;  &lt;strong&gt;次&lt;/strong&gt;来打开此选项。&lt;/p&gt;
 &lt;p&gt;Android 4.2中的新开发者选项包括：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;strong&gt;获取Bug&lt;/strong&gt;   &lt;strong&gt;报告&lt;/strong&gt; — 即刻截屏并dump设备状态信息至本地文件存储，并将其作为邮件附件发送。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;电源菜单bug&lt;/strong&gt;   &lt;strong&gt;报告&lt;/strong&gt; — 在设备电源菜单和快速设置上添加新选项以生成bug报告（见上）。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;经由usb&lt;/strong&gt;   &lt;strong&gt;验证应用&lt;/strong&gt; — 允许您在通过usb安装应用时禁用应用检查，但在其余的诸如浏览器来源的应用上仍保持此验证过程。这有助于在保持安全选项打开的情况下，加速应用开发。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;显示硬件层更新&lt;/strong&gt; — 当硬件层有更新时，会闪动绿色。？？&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;显示GPU&lt;/strong&gt;   &lt;strong&gt;覆盖绘制&lt;/strong&gt; — 高亮GPU覆盖绘制区域。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;强制4&lt;/strong&gt;   &lt;strong&gt;倍MSAA&lt;/strong&gt; — 在Open GL ES 2.0应用中强制打开4倍MSAA支持。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;模拟第二显示输出&lt;/strong&gt; — 在当前屏幕上创建非安全的覆盖窗口，以模拟远程显示。您可以控制模拟显示器的尺寸和密度。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;启用OpenGL&lt;/strong&gt;   &lt;strong&gt;跟踪&lt;/strong&gt; — 使您可以用Logcat、Systrace或glGetError来跟踪OpenGL的执行。&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;  &lt;a name="42-platform-tech"&gt;&lt;/a&gt; 新平台技术&lt;/h2&gt;
 &lt;p&gt;Android 4.2包括了大量新的和  &lt;em&gt;增强的平台技术&lt;/em&gt;以支持借助广泛硬件设备实现交流创新的用例。大部分情况下，新平台技术和增强不会直接影响您的应用，所以，您可以在不做任何修改的情况下享用其成果。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-security"&gt;&lt;/a&gt;安全增强&lt;/h3&gt;
 &lt;p&gt;每个版本的Android发布均包括了大量的安全增强以保护用户。以下是一些Android 4.2中的安全增强：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;strong&gt;应用校验&lt;/strong&gt;— 用户可以启用“验证应用”来使应用在安装前接受应用校验器的扫描。应用校验可以在用户尝试安装一个可能有害的应用时提醒用户。如果应用确实有害，它会阻止应用的安装。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;对收费SMS&lt;/strong&gt;   &lt;strong&gt;的控制&lt;/strong&gt; — 如果应用尝试发送短信至可能产生额外收费的短号码，Android会提示用户。用户可以选择是否允许应用发送短信。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;永远在线VPN&lt;/strong&gt; — 可以设置应用无法连接网络，直到特定的VPN联通。这可以阻止应用经由其它的网络连接。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;证书锁定&lt;/strong&gt; — libcore的SSL实现支持了证书锁定。锁定的域将在获取到的证书链和期待证书不匹配时报出证书认证错误。这个保护措施对证书认证过程中可能的风险予以防护。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;改良的Android&lt;/strong&gt;   &lt;strong&gt;权限显示&lt;/strong&gt; — 权限现在归入到组里，以使用户更易于理解。在浏览权限时，用户可以点击权限来获得该权限的更多详情信息。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;installd &lt;/strong&gt;   &lt;strong&gt;保护&lt;/strong&gt; — installd系统服务不再以root用户运行，降低了提升权限漏洞的潜在可能性。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;init &lt;/strong&gt;   &lt;strong&gt;脚本保护&lt;/strong&gt; — init添加了O_NOFOLLOW语素以阻止链接相关的攻击。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;FORTIFY_SOURCE&lt;/strong&gt; — Android实现了FORTIFY_SOURCE。这个特性用于系统库和应用，以阻止内存破坏。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;ContentProvider &lt;/strong&gt;   &lt;strong&gt;默认配置&lt;/strong&gt;— 针对API level 17的应用对于ContentProvider的export选项配置默认值改为了“false”，以降低应用被攻击的可能性。&lt;/li&gt;
  &lt;li&gt;   &lt;strong&gt;Cryptography&lt;/strong&gt; — 修改默认SecureRandom和Cipher实现。RSA使用OpenSSL。借由OpenSSL 1.0.1 支持了TLSv1.1和TLSv1.2&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;  &lt;a name="42-bt-stack"&gt;&lt;/a&gt;新蓝牙栈&lt;/h3&gt;
 &lt;p&gt;Android 4.2引入了为Android设备进行过优化的新蓝牙栈。新蓝牙栈为Google和Broadcom共同开发，以取代BlueZ，它提供了改进的兼容性和可靠性。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-audio"&gt;&lt;/a&gt;低延迟音频&lt;/h3&gt;
 &lt;p&gt;Android 4.2改善了低延迟音频回放的支持，由Android 4.1发布起，就用 OpenSL ES，Soundpool和音频发生器API来改善音频输出延迟。这些改善  &lt;strong&gt;需要硬件支持：&lt;/strong&gt;拥有低延迟音频特性的设备可以经由硬件特性常量来通知应用。新的AudioManager在支持此特性的设备上提供了查询本地音频采样率和缓冲大小的API。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-camera-interface"&gt;&lt;/a&gt;新相机硬件接口&lt;/h3&gt;
 &lt;p&gt;Android 4.2引入了新的相机栈实现。相机子系统包括了相机流水线中的组件实现，诸如具有过程控制的连拍系统。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-nfc-interface"&gt;&lt;/a&gt;新NFC硬件接口和控制接口&lt;/h3&gt;
 &lt;p&gt;Android 4.2引入了基于来自NFC论坛的NCI标准的控制器支持。NCI提供了NFC控制器（NFCC）和设备Host之间的标准对话协议。Google和博通共同开发的新NFC栈对其提供了支持。&lt;/p&gt;
 &lt;h3&gt;  &lt;a name="42-dalvik"&gt;&lt;/a&gt;Dalvik虚拟机运行时优化&lt;/h3&gt;
 &lt;p&gt;Dalvik运行时在架构范围内增强了性能和安全：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;Intel提供了x86的JIT支持；MIPS提供了MIPS的JIT支持&lt;/li&gt;
  &lt;li&gt;为内存大于512MB的设备提供了优化的垃圾回收参数&lt;/li&gt;
  &lt;li&gt;SecureRandom和Cipher的默认实现。RSA现在使用OpenSSL的实现&lt;/li&gt;
  &lt;li&gt;SSLSocket借由OpenSSL 1.0.1 支持了TLSv1.1和TLSv1.2&lt;/li&gt;
  &lt;li&gt;为StrictMath的 abs, min, max, 和sqrt 方法提供了新的intrinsic支持&lt;/li&gt;
  &lt;li&gt;BouncyCastle升级至1.47&lt;/li&gt;
  &lt;li&gt;zlib升级至1.27&lt;/li&gt;
  &lt;li&gt;dlmalloc升级至2.8.6&lt;/li&gt;
&lt;/ul&gt;
 &lt;div&gt;&lt;/div&gt; &lt;div&gt;&lt;/div&gt; &lt;div&gt;  &lt;a&gt;&lt;/a&gt;  &lt;a&gt;&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>计算机与 Internet Android jellybean</category>
      <guid isPermaLink="true">https://itindex.net/detail/40863-android-%E5%BC%80%E5%8F%91</guid>
      <pubDate>Wed, 28 Nov 2012 11:35:56 CST</pubDate>
    </item>
    <item>
      <title>HTTPS与SNI扩展，一个IP多个证书</title>
      <link>https://itindex.net/detail/41195-https-sni-%E6%89%A9%E5%B1%95</link>
      <description>&lt;p&gt;在搭建支持HTTPS的前端代理服务器时候，通常会遇到让人头痛的证书问题。根据HTTPS的工作原理，浏览器在访问一个HTTPS站点时，先与服务器建立SSL连接，建立连接的第一部就是请求服务器的证书。而服务器在发送证书的时候，是不知道浏览器访问的是哪个域名的，所以不能根据不同域名发送不同的证书。用过GoAgent的人都知道需要给浏览器导入证书才能使用HTTPS正常登录Twitter等网站。&lt;/p&gt;
 &lt;p&gt;SNI（Server Name Indication）是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是，在连接到服务器建立SSL连接之前先发送要访问站点的域名（Hostname），这样服务器根据这个域名返回一个合适的证书。目前，大多数操作系统和浏览器都已经很好地支持SNI扩展，OpenSSL 0.9.8已经内置这一功能，据说新版的nginx也支持SNI。&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://xiaoxia.org/upfiles/2012/12/sni_loadbalancing.png"&gt;   &lt;img alt="" height="421" src="http://xiaoxia.org/upfiles/2012/12/sni_loadbalancing.png" title="sni_loadbalancing" width="441"&gt;&lt;/img&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;/p&gt;
 &lt;p&gt;Github上有一个小巧的支持SNI的代理服务器，  &lt;a href="https://github.com/dlundquist/HTTPS-SNI-Proxy" target="_blank"&gt;https://github.com/dlundquist/HTTPS-SNI-Proxy&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;我down下来，在一个VPS上编译（需要安装pcre的开发库），写了一个简单的配置文件，把所有访问443端口的HTTPS请求都进行代理。启动sni_proxy之后，修改本地的hosts文件，把twitter.com映射为服务器的IP地址，比如我的是&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;184.82.206.107 twitter.com&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;然后，在浏览器里访问 https://twitter.com/。&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://xiaoxia.org/upfiles/2012/12/C8FC1658-9042-4496-AC69-D0BD42E5E89B.jpg"&gt;   &lt;img alt="" height="446" src="http://xiaoxia.org/upfiles/2012/12/C8FC1658-9042-4496-AC69-D0BD42E5E89B-700x446.jpg" title="C8FC1658-9042-4496-AC69-D0BD42E5E89B" width="700"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;看到木有，这是活生生的twitter的证书。&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://xiaoxia.org/upfiles/2012/12/84ED5D85-F982-4A21-A096-53BDE84FD100.jpg"&gt;   &lt;img alt="" height="465" src="http://xiaoxia.org/upfiles/2012/12/84ED5D85-F982-4A21-A096-53BDE84FD100.jpg" title="84ED5D85-F982-4A21-A096-53BDE84FD100" width="648"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet 我的分享</category>
      <guid isPermaLink="true">https://itindex.net/detail/41195-https-sni-%E6%89%A9%E5%B1%95</guid>
      <pubDate>Tue, 18 Dec 2012 14:23:37 CST</pubDate>
    </item>
    <item>
      <title>Android4.2多用户模式的结构与实现</title>
      <link>https://itindex.net/detail/41132-android4-%E5%A4%9A%E7%94%A8%E6%88%B7-%E6%A8%A1%E5%BC%8F</link>
      <description>&lt;p&gt;本文将跟随洒家的理解和同学们的指正进一步修改。所以如果您需要转载，请保留出处，以防以后我改对了，您那边还是错的。&lt;/p&gt;
 &lt;p&gt;在Android 4.2中的一个比较显著的改变就是加入了多用户的支持。因多用户手机专利早已被Symbian雇员注册，故 android官方的多用户切换目前仅支持平板设备。&lt;/p&gt;
 &lt;h2&gt;多用户模式的启用&lt;/h2&gt;
 &lt;p&gt;系统判断当前设备是否支持多用户模式的依据是配置文件config.xml中的config_multiuserMaximumUsers配置项。 其取值为整型，决定着当前设备支持的最大用户上限。默认值为1，即不支持多用户。如需启用多用户，则设置此值 为大于1的值。在Nexus 7中，此值为   &lt;em&gt;8&lt;/em&gt;。&lt;/p&gt;
 &lt;p&gt;具体代码的判断位置在UserManager.java:&lt;/p&gt;

 &lt;div&gt;  &lt;table&gt;   &lt;tr&gt;    &lt;td&gt;     &lt;pre&gt;    public static int getMaxSupportedUsers() {
        // Don&amp;apos;t allow multiple users on certain builds
        if (android.os.Build.ID.startsWith(&amp;quot;JVP&amp;quot;)) return 1;
        return SystemProperties.getInt(&amp;quot;fw.max_users&amp;quot;,
                Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
    }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

 &lt;h2&gt;多用户相关操作流程&lt;/h2&gt;
 &lt;p&gt;对用户的操作目前未对普通应用开放，其相关API都有hide注解，并需要system权限。此外，用户的添加和移除还 要需android.Manifest.permission.MANAGE_USERS权限。&lt;/p&gt;
 &lt;h3&gt;用户添加流程&lt;/h3&gt;
 &lt;p&gt;用户添加是通过调用UserManager的public UserInfo createUser(String name, int flags)方法进行的。其具体实现在UserManagerService的同名方法中。&lt;/p&gt;
 &lt;p&gt;在调用时，系统进行如下操作：&lt;/p&gt;
 &lt;ol&gt;
  &lt;li&gt;检查调用者是否具有所需权限。&lt;/li&gt;
  &lt;li&gt;对安装和软件包流程加锁，保证线程安全&lt;/li&gt;
  &lt;li&gt;检查多用户环境是否到达用户数量限制。如果没有，创建用户实例&lt;/li&gt;
  &lt;li&gt;为新用户创建相关目录&lt;/li&gt;
  &lt;li&gt;序列化用户列表&lt;/li&gt;
  &lt;li&gt;发送用户建立广播，MountService在收到此广播后，调用createEmulatedVolumeForUserLocked方法为用户建 立相应的数据目录&lt;/li&gt;
&lt;/ol&gt;
 &lt;h3&gt;用户的保存&lt;/h3&gt;
 &lt;p&gt;用户创建后，会首先在/data/system/users/userlist.xml文件中保存新增加用户的id，创建/data/system/users/ 用户id 目录，并将用户信息保存至其下的   &lt;em&gt;用户id.xml&lt;/em&gt; 文件中。其内容包括一些基本的用户信息。&lt;/p&gt;
 &lt;h3&gt;用户切换流程&lt;/h3&gt;
 &lt;p&gt;用户切换是通过调用ActivityManager的public boolean switchUser(int userId)方法进行。一般通过 ActivityManagerNative.getDefault().switchUser(int userId)进行调用。&lt;/p&gt;
 &lt;p&gt;在调用时，系统进行以下操作&lt;/p&gt;
 &lt;ol&gt;
  &lt;li&gt;检查调用者是否具有所需权限。&lt;/li&gt;
  &lt;li&gt;获取切换目标用户信息，并设定当前用户为目标用户&lt;/li&gt;
  &lt;li&gt;WindowsManagerService设置当前用户，锁定屏幕&lt;/li&gt;
  &lt;li&gt;切换目标用户状态至启动&lt;/li&gt;
  &lt;li&gt;广播REPORT_USER_SWITCH_MSG和USER_SWITCH_TIMEOUT_MSG消息，设定用户切换和切换超时时间（2秒），此超 时时间用于限定REPORT_USER_SWITCH_MSG广播全程时间。&lt;/li&gt;
  &lt;li&gt;切换Activity堆栈至当前用户&lt;/li&gt;
  &lt;li&gt;广播ACTION_USER_SWITCHED消息，各接收组件进行相应操作。 大部分具体操作，比如存储目录切换、安全设置 切换等，都在此广播后进行。&lt;/li&gt;
&lt;/ol&gt;
 &lt;h3&gt;用户移除流程&lt;/h3&gt;
 &lt;p&gt;用户移除是通过调用UserManager的 public boolean removeUser(int userHandle) 方法进行的。其具体实现同样 是在UserManagerService的同名方法中。&lt;/p&gt;
 &lt;p&gt;在调用时，系统进行如下操作：&lt;/p&gt;
 &lt;ol&gt;
  &lt;li&gt;检查调用者是否具有所需权限。&lt;/li&gt;
  &lt;li&gt;对软件包变化加锁&lt;/li&gt;
  &lt;li&gt;将用户id加入待移除用户列表，将用户状态设为partial，这样，在下次系统启动时，会清除此用户。&lt;/li&gt;
  &lt;li&gt;停止用户，杀掉用户相关进程。&lt;/li&gt;
  &lt;li&gt;发送用户移除的广播。广播成功后，删除用户描述文件和数据文件。&lt;/li&gt;
  &lt;li&gt;序列化用户列表&lt;/li&gt;
&lt;/ol&gt;
 &lt;p&gt;此外UserManager还提供了 public void wipeUser(int userHandle) 方法，用于删除单个用户的所有数据，但保留 用户账号。 此方法目前对应的底层实现尚未完成。&lt;/p&gt;
 &lt;h2&gt;多用户模式的API接口UserManager-&amp;gt;UserManagerService&lt;/h2&gt;
 &lt;h3&gt;大致结构&lt;/h3&gt;
 &lt;p&gt;与其它系统服务的实现类似，用户管理也采用了经由Binder调用的远程服务机制。UserManager为暴露给用户的接 口，UserManagerService为接口的底层实现。其类图如下所示：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.biaji.net/wp/wp-content/uploads/2012/12/UserManager.png"&gt;   &lt;img alt="" height="1024" src="http://www.biaji.net/wp/wp-content/uploads/2012/12/UserManager-850x1024.png" title="UserManager&amp;#31867;&amp;#22270;" width="850"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;h3&gt;android.os.UserManager&lt;/h3&gt;
 &lt;p&gt;UserManager是暴露出来的应用程序接口。对于普通应用程序，提供用户数查询，用户状态判断和用户序列号查询 等基本功能。   &lt;strong&gt;普通应用没有用户操作权限&lt;/strong&gt;。&lt;/p&gt;
 &lt;p&gt;对于系统应用，UserManager提供了创建/删除/擦除用户、用户信息获取、用户句柄获取等用户操作的接口。均由远 程调用UserManagerService服务的对应方法实现。&lt;/p&gt;
 &lt;h3&gt;isUserAGoat()&lt;/h3&gt;
 &lt;p&gt;UserManager中提供了一个名为isUserAGoat()的方法。源码中此方法直接返回了false。此方法的加入纯粹是为了给 枯燥的编程生活带来一丝乐趣，以便写出：&lt;/p&gt;

 &lt;div&gt;  &lt;table&gt;   &lt;tr&gt;    &lt;td&gt;     &lt;pre&gt;while(!isUserAGoat()){
 
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

 &lt;p&gt;这样的语句。&lt;/p&gt;
 &lt;h3&gt;com.android.server.pm.UserManagerService&lt;/h3&gt;
 &lt;p&gt;与其它大部分Service一样，UserManagerService的实现采用了   &lt;strong&gt;单例模式&lt;/strong&gt;。在服务中，由组成为UserInfo类的散列 表mUsers维护所有的用户状态。&lt;/p&gt;
 &lt;p&gt;mUsers在系统启动时由/data/system/users/userlist.xml读取生成，并在运行期间动态改变。所有用户的添加、删 除操作，都最终序列化回此文件中。&lt;/p&gt;
 &lt;h3&gt;com.android.server.am.ActivityManagerService&lt;/h3&gt;
 &lt;p&gt;ActivityManagerService目前加入了多用户支持。负责维护设备中存在的所有用户状态。服务以下述变量来记录当 前处于“启动”状态的用户。&lt;/p&gt;

 &lt;div&gt;  &lt;table&gt;   &lt;tr&gt;    &lt;td&gt;     &lt;pre&gt;    /**
     * Which uses have been started, so are allowed to run code.
     */
    final SparseArray mStartedUsers = new SparseArray();
 
    /**
     * LRU list of history of current users.  Most recently current is at the end.
     */
    final ArrayList mUserLru = new ArrayList();
 
    /**
     * Constant array of the users that are currently started.
     */
    int[] mStartedUserArray = new int[] { 0 };&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

 &lt;p&gt;用户的启动状态对象为com.android.server.am.UserStartedState。其中指定的用户状态有四种：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;public final static int STATE_BOOTING = 0; //用户启动&lt;/li&gt;
  &lt;li&gt;public final static int STATE_RUNNING = 1; //运行中&lt;/li&gt;
  &lt;li&gt;public final static int STATE_STOPPING = 2; //停止中&lt;/li&gt;
  &lt;li&gt;public final static int STATE_SHUTDOWN = 3; //用户关闭状态&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;完整的用户生命周期为：  &lt;br /&gt;
BOOTING-&amp;gt;RUNNING-&amp;gt;STOPPING-&amp;gt;SHUTDOWN&lt;/p&gt;
 &lt;p&gt;用户必须处于RUNNING状态时，才能作为切换的目标用户。所以在用户切换流程中，首先要判断当前用户的状态， 并启动STOPPING/SHUTDOWN状态的用户。&lt;/p&gt;
 &lt;h2&gt;多用户模式的牵涉面&lt;/h2&gt;
 &lt;h3&gt;锁屏界面&lt;/h3&gt;
 &lt;p&gt;用户最先体验到多用户的入口位置即为锁屏界面。锁屏界面中加入了用户切换组件： KeyguardMultiUserSelectorView类。&lt;/p&gt;
 &lt;p&gt;该类在设备允许多用户存在的情况下，显示当前所有用户的列表。并在用户进行选择后，调用 ActivityManagerNative.getDefault().switchUser(int userId)方法进行用户切换。&lt;/p&gt;
 &lt;h3&gt;外部存储&lt;/h3&gt;
 &lt;p&gt;对于每个用户，Android都为其分配了单独的存储空间。标准的支持多用户的外部存储空间是由init.rc定义的环境 变量所指定：&lt;/p&gt;

 &lt;div&gt;  &lt;table&gt;   &lt;tr&gt;    &lt;td&gt;     &lt;pre&gt;# See storage config details at &amp;lt;a href=&amp;quot;http://source.android.com/tech/storage/&amp;quot;&amp;gt;http://source.android.com/tech/storage/&amp;lt;/a&amp;gt;
mkdir /mnt/shell/emulated 0700 shell shell
mkdir /storage/emulated 0555 root root
 
export EXTERNAL_STORAGE /storage/emulated/legacy
export EMULATED_STORAGE_SOURCE /mnt/shell/emulated
export EMULATED_STORAGE_TARGET /storage/emulated
 
# Support legacy paths
symlink /storage/emulated/legacy /sdcard
symlink /storage/emulated/legacy /mnt/sdcard
symlink /storage/emulated/legacy /storage/sdcard0
symlink /mnt/shell/emulated/0 /storage/emulated/legacy&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

 &lt;p&gt;在Dalvik虚拟机初始化的过程中，会以dalvik_system_Zygote.cpp中的mountEmulatedStorage函数，使用带有 MS_BIND参数的mount命令， 将用户对应的外部存储卡目录mount到上述定义的TARGET目录下。其判断应用userid的 方式为： 以当前应用的uid/100000,获得对应的userid，这段逻辑位于system/core/libcutils/multiuser.c中。&lt;/p&gt;
 &lt;p&gt;而Environment类中相应的获取外部存储目录的方法，也是由上述环境变量所获得。对于每个用户，其标准外部存 储路径为：&lt;/p&gt;
 &lt;p&gt;EMULATED_STORAGE_TARGET/userid/&lt;/p&gt;
 &lt;p&gt;比如：&lt;/p&gt;
 &lt;p&gt;/storage/emulated/0 为主用户的外部存储路径。&lt;/p&gt;
 &lt;h3&gt;包管理(PackageManagerService)&lt;/h3&gt;
 &lt;p&gt;在多用户环境下，所有用户安装的应用仍然同以前一样，放置于/data/app目录下。但原先/data/data的数据存储位 置目前仅对主用户有效，其余用户的数据存储目录则位于/data/user/用户id/目录下。 此目录的创建是在创建用户 时由前述的MountService完成的。&lt;/p&gt;
 &lt;p&gt;对于每个用户，系统都会以PackageuserState类来维护其安装的软件状态。此列表以散列表的形式存在，由 PackageSettingBase类维护。所有的包——用户关系和状态最终仍然序列化至/data/system/package.xml中，并保留 /data/system/package-backup.xml作为备份。&lt;/p&gt;
 &lt;h2&gt;可能的发展&lt;/h2&gt;
 &lt;h3&gt;Guest用户的实现&lt;/h3&gt;
 &lt;p&gt;目前代码中已经存在诸如 isGuestEnabled() 之类的方法。但没有对开发公开，可以预计今后会加入Guest用户， 实现“随手玩玩”模式。&lt;/p&gt;
 &lt;div&gt;&lt;/div&gt; &lt;div&gt;&lt;/div&gt; &lt;div&gt;  &lt;a&gt;&lt;/a&gt;  &lt;a&gt;&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>计算机与 Internet Android</category>
      <guid isPermaLink="true">https://itindex.net/detail/41132-android4-%E5%A4%9A%E7%94%A8%E6%88%B7-%E6%A8%A1%E5%BC%8F</guid>
      <pubDate>Fri, 14 Dec 2012 23:05:56 CST</pubDate>
    </item>
    <item>
      <title>IE10 for Windows 7正式发布</title>
      <link>https://itindex.net/detail/42673-ie10-for-windows</link>
      <description>&lt;p&gt;千呼万唤始出来，微软终于在今天发布了正式版的Internet Explorer 10 for Windows 7，这一版本让Windows 7用户等待了好久。之前IE10一直仅在Windows 8上才可以使用，而在Windows 7中只有预览版提供。  &lt;br /&gt;
从IE10官方网站的下载地址看到，简体中文版在线安装包数字签名：2013年2月17日，19:47:20（UTC+8）&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="internet explorer 9 advert" height="377" src="http://www.boxui.com/blog/wp-content/uploads/2013/02/145733IsM.png" width="566"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;IE10下载地址:&lt;/strong&gt;  &lt;a href="http://windows.microsoft.com/en-us/internet-explorer/downloads/ie-10/worldwide-languages" target="_blank"&gt;点击下载Internet Explorer 10&lt;/a&gt;&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>最新动态 ie10 Internet Explorer 10 win7</category>
      <guid isPermaLink="true">https://itindex.net/detail/42673-ie10-for-windows</guid>
      <pubDate>Tue, 26 Feb 2013 22:57:33 CST</pubDate>
    </item>
    <item>
      <title>非一致性内存访问模型与内存分配器</title>
      <link>https://itindex.net/detail/33778-%E4%B8%80%E8%87%B4%E6%80%A7-%E5%86%85%E5%AD%98-%E8%AE%BF%E9%97%AE</link>
      <description>&lt;p&gt;CPU主频涨不上去了，一直停留在2-3G。前端总线的时钟频率也涨不上去了，我现在用的这个小黑，Intel Core2 P8600，前端总线的时钟频率只有266MHz。于是，虽然内存越来越便宜了，但是没有那么大的高速带宽来连接CPU和内存啊。&lt;/p&gt;
&lt;p&gt;于是NUMA出现了。CPU组成node，每个node各自管理几十G内存，然后node和node之间通过Point-to-Point的方式建立高速直连。于是系统总线就没了，出现一个新名词，QPI，指那个快速访问通道，它不光连接内存和CPU，还连接其它外设如显卡。但是有个重要的结果是：CPU到每根内存条的“距离”是不相等的。有的是直连，所以速度很快，而有的需要绕到另一个node去拿，这样不仅速度慢，而且很容易把node之间的那个互连通道堵死。想想看，如果你工作在天津，但是偏偏要住在北京，每天上班下班是不是很痛苦？为什么呢？为什么会这样？为什么我想访问的这个内存不在我身边？那它在哪？&lt;/p&gt;
&lt;p&gt;从C语言的malloc说起。首先强调一点，malloc分配的是“地址空间”，而不是内存！同理，free释放的也只是地址空间，而不是内存。当你访问某个内存地址，而这个地址没有映射到任何物理页的时候，就会发生缺页中断，然后此时，操作系统才分配内存。简单点说，”&lt;strong&gt;内存的分配发生在第一次访问的时候&lt;/strong&gt;！“。&lt;/p&gt;
&lt;p&gt;总的来说，内存分配器此时有三种策略：&lt;br&gt;
1、糊里糊涂。什么都不知道，随便分。&lt;br&gt;
2、就近，找离当前CPU最近的node分配。&lt;br&gt;
3、round-robin。把你要的东西尽可能的平均分到每个node上。&lt;/p&gt;
&lt;p&gt;我不清楚你用的C Runtime到底是哪一种实现，反正以上三种都有可能。喜欢C的人大多都是追求高效，那么自然喜欢第二种咯？于是就有人提出，&lt;strong&gt;服务器的启动过程应该做成并行化的&lt;/strong&gt;，比如IO的buffer就让IO线程去初始化，各自做各自的。这样听起来很有道理，但是！亲爱的，如果这个线程被调度到另一个CPU上怎么办？所以我们不光得控制内存怎么分配的，还得控制线程调度策略，把这个线程绑在固定的CPU组上。更复杂的是，执行任务的是一个线程池怎么办？请问，我是在写Application，还是Operating System? 无论如何，“谁要用谁分配”依然是一个有效的优化策略。&lt;/p&gt;
&lt;p&gt;那么说Java吧，它比较清晰。Java有4种垃圾回收策略 串行化、并行、CMS（并发）、G1。如果选择了并行化的垃圾回收策略（Server版的jvm默认如此），它的内存池分为三类：新生代、老生代、永生代。&lt;br&gt;
并行化的垃圾回收器有一个开关，-XX:+UseNUMA，这个影响到新生代的Eden Space这个内存池的分配器的策略。先说Eden Space是干什么的：大部分new出来的对象都是首先在Eden Space上创建，这里面的对象都是临时创建而又立马被销毁的对象，否则会很快（小于1秒）就被挪到老生代里面去。如果打开了-XX:+UseNUMA，那么Eden Space会尽量就近找node分配，从而获得最经济、快捷的内存访问。可是另外，其它几个内存池呢？他们要么是采用的糊里糊涂的方式，要么就是采用的方式3，做round-robin。所以说，前面所说的为了内存访问局部化而把启动过程做成并行的对JAVA来说完全不适用。&lt;/p&gt;
&lt;p&gt;那么，现在重新思考NUMA的问题：访问速度、带宽。&lt;br&gt;
访问速度：的确，访问远处的内存会慢些，但是会慢多少呢？30%？50%？200%？你测过吗？我没有。据说，即便再慢，也比Nehalem之前的任何CPU快，因为改进了系统架构去掉北桥做了QPI等等。而且，根据我看到的各种数据来看，速度差距在50%以内。NUMA真是个很有意思的话题。我初次接触到这个概念是在《Solaris内核结构》那本书上，那本书是06年出版的。那个时代的硬件和现在差别很大的，那时候做NUMA可真是死了心的做，差2倍、差20倍它也觉得没问题，因为它和SMP相比增加了带宽嘛。于是OS就得被迫为这样巨大的差异做各种优化。可是现在呢？你看JVM，为什么仅仅对Eden Space做了就近分配？网上有很多关于NUMA的文章，以及如何在NUMA架构上写出更高效的程序。但是，很多观点是陈旧的。&lt;/p&gt;
&lt;p&gt;带宽：你确实把CPU间的QPI跑满了吗？近年产的CPU，每条QPI的单向带宽是每秒12GB（理论最大值），如今看来，只有大型的数据库Server或者Cache Server才有可能把它跑满。否则，你不需要考虑带宽的问题。&lt;/p&gt;
&lt;p&gt;所以现在有一种新的策略：SUMA，或者叫page interleaving，这个可以做到硬件层面去。把物理地址空间以均匀交替的方式分给每个node。例如0×0000-0x0FFF分给node 1，0×1000-0x1FFF分给node 2，以此类推。然后所有软件完全不在乎NUMA这件事情。做page interleaving的目的是尽可能平均的使用每个QPI通道。我觉得一般来说，这就足够了。Intel NUMA的x86 CPU在3年前才开始陆续面世，先让OS、compiler、jvm这些去适应它，等他们都折腾够了，最后才是我们这些普通的software developer。&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>计算机与 Internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/33778-%E4%B8%80%E8%87%B4%E6%80%A7-%E5%86%85%E5%AD%98-%E8%AE%BF%E9%97%AE</guid>
      <pubDate>Sat, 22 Oct 2011 01:11:54 CST</pubDate>
    </item>
    <item>
      <title>在 Ubuntu Server 上尝试 Nagios3</title>
      <link>https://itindex.net/detail/34634-ubuntu-server-nagios3</link>
      <description>&lt;p&gt;  &lt;a href="http://raynix.info/wp-content/uploads/2011/12/Workspace-1_279.png"&gt;   &lt;img alt="" height="205" src="http://raynix.info/wp-content/uploads/2011/12/Workspace-1_279-1024x382.png" title="Workspace 1_279" width="550"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;Nagios (据说)是业内一流的系统监控软件框架. 但我这样一个非一流的 Linux 系统管理员, 之前由于管理的系统实在是少. 加上 Linux 自身的强壮, 于是似乎不怎么管也不会出事. 进而, 我之前一直都没有应用 Nagios 的良好动机.&lt;/p&gt;
 &lt;p&gt;最近, 负载我这小 blog 的VPS有些小小的情绪化行为. 可能是大环境不好吧. 于是我打算用 Nagios 监控一下.&lt;/p&gt;
 &lt;p&gt;在2009年我买了一本&amp;lt;Linux Networking Cookbook&amp;gt;, 上面对 Nagios 的讲解倒是蛮详细的, 但也有些吓人: 从编译开始的... 我在 Ubuntu Server 上测试了一下, 貌似很简单的. 首先:&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;$sudo  apt-cache search nagios&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;发现当前的版本是 nagios3 了, 于是:&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;$sudo apt-get install nagios3&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;过程中会要求输入一个 password, 其实就是教程里使用 httpasswd 生成的用于保护 nagios 的口令. 之后使用浏览器查看:&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;http://localhost/nagios3&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;就能看到基本的监测界面了. 相当简单吧. 下一步如果要添加额外的需要监控的网站, 仅需要利用现有的 generic-host 模板设置新站点信息即可, 例如:&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;define host{   &lt;br /&gt;
use        generic-host   &lt;br /&gt;
host_name    raynix   &lt;br /&gt;
alias        raynix   &lt;br /&gt;
address       184.82.236.44   &lt;br /&gt;
}&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;然后, 记得要把上面的配置存到一个.cfg文件, 并复制或者链接到 /etc/nagios3/conf.d 文件夹. 定义了 host, 然后需要把 host 添加到需要检测的主机群(host group)里就完成了. 例如要将 raynix 添加到 http-servers, 这样就可以让 nagios 检测主机 raynix 上的 httpd 服务了.&lt;/p&gt;
 &lt;p&gt;打开: /etc/nagios3/conf.d/hostgroups_nagios2.cfg (为什么是 nagios2 呢?)&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;define hostgroup {   &lt;br /&gt;
hostgroup_name  http-servers   &lt;br /&gt;
alias           HTTP servers   &lt;br /&gt;
members         localhost,raynix   &lt;br /&gt;
}&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;然后重新启动 nagios3 服务, 就可以以缺省的设置对主机 raynix 的 http 服务进行监测了. 另外如果要接收提示邮件的话, 需要修改 /etc/nagios3/conf.d/contacts_nagios2.cfg.   &lt;img alt=":)" src="http://raynix.info/wp-includes/images/smilies/icon_smile.gif"&gt;&lt;/img&gt; &lt;/p&gt;
 &lt;hr&gt;&lt;/hr&gt;
 &lt;p&gt;  &lt;small&gt;© raynix for    &lt;a href="http://raynix.info"&gt;#raynix&amp;apos;s notes&lt;/a&gt;, 2011. |
   &lt;a href="http://raynix.info/archives/2094"&gt;Permalink&lt;/a&gt; |
   &lt;a href="http://raynix.info/archives/2094#comments"&gt;唉, 一个评论都没&lt;/a&gt; |
Add to
   &lt;a href="http://del.icio.us/post?url=http://raynix.info/archives/2094&amp;title=&amp;#22312; Ubuntu Server &amp;#19978;&amp;#23581;&amp;#35797; Nagios3"&gt;del.icio.us&lt;/a&gt;
   &lt;br /&gt;
Post tags:    &lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;small&gt;Feed enhanced by    &lt;a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/"&gt;Better Feed&lt;/a&gt; from     &lt;a href="http://planetozh.com/blog/"&gt;Ozh&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
 &lt;img height="1" src="http://feeds.feedburner.com/~r/raynix/~4/aNUG7xL1oXQ" width="1"&gt;&lt;/img&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Free software Internet Security Opensource</category>
      <guid isPermaLink="true">https://itindex.net/detail/34634-ubuntu-server-nagios3</guid>
      <pubDate>Mon, 19 Dec 2011 08:47:23 CST</pubDate>
    </item>
    <item>
      <title>IE 明年开始支持 Windows 7，Vista 和 XP 系统下自动更新</title>
      <link>https://itindex.net/detail/34537-ie-windows-vista</link>
      <description>&lt;p&gt;分类:   &lt;a href="http://cn.engadget.com/category/internet/" rel="tag"&gt;互联网络&lt;/a&gt;&lt;/p&gt; &lt;a href="http://www.engadget.com/2011/12/15/internet-explorer-to-start-automatic-upgrading-across-windows-7/"&gt;  &lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/12/untitled-4.jpg"&gt;&lt;/img&gt;&lt;/a&gt;微软 Internet Explorer  &lt;a href="http://cn.engadget.com/2011/12/02/statcounter-chrome-leapfrogs-firefox-for-the-first-time-still/"&gt;浏览器的份额&lt;/a&gt;在被逐渐蚕食，不过微软还有绝招。他们宣布  &lt;a href="http://cn.engadget.com/tag/InternetExplorer/"&gt;Internet Explorer&lt;/a&gt; 的更新将和 Windows 系统更新紧密结合， Windows 7，Vista 和 XP 系统下都可以实现，当然需要 IE 在版本 8 以上才可以。明年自动更新将先在澳大利亚和巴西推出，然后推广到其它地区，微软宣称这对于提高电脑安全性是非常必要的。很高兴的是，微软还是提供了不更新选项给用户选择。来源还有微软 IE 总经理 Ryan Galvin 的更多解释。 &lt;br /&gt;
 &lt;br /&gt;
自动更新将让用户感觉方便， &lt;a href="http://cn.engadget.com/tag/Chrome/"&gt;Chrome&lt;/a&gt; 已经支持自动升级。现在的悬念是，这个功能开启之后，浏览器份额是否会再度发生微妙变化呢？ &lt;p&gt;&lt;/p&gt; &lt;h6&gt;&lt;/h6&gt; &lt;a href="http://www.engadget.com/2011/12/15/internet-explorer-to-start-automatic-upgrading-across-windows-7/"&gt;引用来源&lt;/a&gt; |  &lt;a href="http://windowsteamblog.com/ie/b/ie/archive/2011/12/15/ie-to-start-automatic-upgrades-across-windows-xp-windows-vista-and-windows-7.aspx"&gt;引用来源&lt;/a&gt; |  &lt;a href="http://cn.engadget.com/2011/12/16/internet-explorer-to-start-automatic-upgrading-across-windows-7/" rel="bookmark" title="Permanent link to this entry"&gt;此文章网址&lt;/a&gt; |  &lt;a href="http://cn.engadget.com/forward/20129309/" title="Send this entry to a friend via email"&gt;转寄此文章&lt;/a&gt; |  &lt;a href="http://cn.engadget.com/2011/12/16/internet-explorer-to-start-automatic-upgrading-across-windows-7/#comments" title="View reader comments on this entry"&gt;回应&lt;/a&gt; &lt;hr&gt;&lt;/hr&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>automatic updates AutomaticUpdates IE Internet Explorer internet explorer 6</category>
      <guid isPermaLink="true">https://itindex.net/detail/34537-ie-windows-vista</guid>
      <pubDate>Fri, 16 Dec 2011 21:06:00 CST</pubDate>
    </item>
    <item>
      <title>全球網路將在2012年6月6日正式啟用IPv6。</title>
      <link>https://itindex.net/detail/35312-%E5%85%A8%E7%90%83-ipv6</link>
      <description>&lt;p&gt;  &lt;img alt="World IPv6 Day large verge medium landscape" border="0" src="http://whiteappleer.tw/wp-content/uploads/2012/01/World_IPv6_Day_large_verge_medium_landscape.png" title="World_IPv6_Day_large_verge_medium_landscape.png" width="525"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;目前網路上使用的IP位置，在2011年初就已經將最後的位置分發完畢。為了應付今後對於IP不斷增長的需求， Internet Society目前已經正式宣佈，將在2012年6月6日正式啟用IPv6網路。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;而隨著此公告，許多網路公司與硬體製造商也表示將同時支援IPv6，包含Google、Facebook、Microsoft Bing、Yahoo以及Cisco與D-Link等。&lt;/p&gt;
 &lt;p&gt;總之，如果今年6月6日大家發現網路怪怪的，那大概就是因為IPv6的問題。不過如果一切正常的話，那我們應該一點感覺都沒有……&lt;/p&gt;
 &lt;p&gt;via   &lt;a href="http://googleblog.blogspot.com/2012/01/ipv6-countdown-to-launch.html"&gt;Official Google Blog/ IPv6/ countdown to launch&lt;/a&gt; and   &lt;a href="http://www.internetsociety.org/news/world-ipv6-launch-solidifies-global-support-new-internet-protocol"&gt;World IPv6 Launch Solidifies Global Support for New Internet Protocol | Internet Society&lt;/a&gt;&lt;/p&gt;
 &lt;table border="0" cellpadding="2" cellspacing="0" width="100%"&gt;
      &lt;tr&gt;
           &lt;td&gt;    &lt;strong&gt;相關文章：&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
              &lt;tr&gt;
                   &lt;td&gt;
                        &lt;img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif"&gt;&lt;/img&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwhiteappleer.tw%2F2011%2F04%2F27%2F2012-iphone-6-will-use-sharp-p-si-lcd%2F&amp;from=http%3A%2F%2Fwhiteappleer.tw%2F2012%2F01%2F18%2Fworld-ipv6-launch-day-set-for-june-6th-2012%2F" target="_blank"&gt;
                        2012年的iPhone 6將採用Sharp製的p-Si（低溫多晶矽）液晶面板？
                    &lt;/a&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
              &lt;tr&gt;
                   &lt;td&gt;
                        &lt;img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif"&gt;&lt;/img&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwhiteappleer.tw%2F2011%2F04%2F27%2F2012-iphone-6-will-use-sharp-p-si-lcd%2F%3Fvariant%3Dzh-cn&amp;from=http%3A%2F%2Fwhiteappleer.tw%2F2012%2F01%2F18%2Fworld-ipv6-launch-day-set-for-june-6th-2012%2F" target="_blank"&gt;
                        2012年的iPhone 6将采用Sharp制的p-Si（低温多晶硅）液晶面板？
                    &lt;/a&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
              &lt;tr&gt;
                   &lt;td&gt;
                        &lt;img border="0" src="http://static.wumii.com/images/widget/widget_solidPoint.gif"&gt;&lt;/img&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect.htm?url=http%3A%2F%2Fwhiteappleer.tw%2F2008%2F06%2Ffirefox-3-%25E6%25AD%25A3%25E5%25BC%258F%25E7%2589%2588%25EF%25BC%259A6%25E6%259C%258817%25E6%2597%25A5%25EF%25BC%2581%25EF%25BC%2581%2F&amp;from=http%3A%2F%2Fwhiteappleer.tw%2F2012%2F01%2F18%2Fworld-ipv6-launch-day-set-for-june-6th-2012%2F" target="_blank"&gt;
                        Firefox 3 正式版：6月17日！！
                    &lt;/a&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
      &lt;tr&gt;
           &lt;td align="right"&gt;
                &lt;a href="http://www.wumii.com/widget/relatedItems.htm" target="_blank" title="&amp;#26080;&amp;#35269;&amp;#30456;&amp;#20851;&amp;#25991;&amp;#31456;&amp;#25554;&amp;#20214;"&gt;
                无觅
            &lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Wordpress Internet IT</category>
      <guid isPermaLink="true">https://itindex.net/detail/35312-%E5%85%A8%E7%90%83-ipv6</guid>
      <pubDate>Wed, 18 Jan 2012 14:00:53 CST</pubDate>
    </item>
    <item>
      <title>微软正式发布 Windows 8 消费者预览版</title>
      <link>https://itindex.net/detail/36318-%E5%BE%AE%E8%BD%AF-windows-%E6%B6%88%E8%B4%B9%E8%80%85</link>
      <description>&lt;p&gt;  &lt;a href="http://livesino.net/images/farm21/Windows-8-_5D32/windows8_consumer_preview.png" rel="ignition"&gt;   &lt;img alt="&amp;#24494;&amp;#36719;&amp;#27491;&amp;#24335;&amp;#21457;&amp;#24067; Windows 8 &amp;#28040;&amp;#36153;&amp;#32773;&amp;#39044;&amp;#35272;&amp;#29256;" height="361" src="http://livesino.net/images/farm21/Windows-8-_5D32/640x361xwindows8_consumer_preview_thumb.png.pagespeed.ic.k5mno0Pgg3.png" title="&amp;#24494;&amp;#36719;&amp;#27491;&amp;#24335;&amp;#21457;&amp;#24067; Windows 8 &amp;#28040;&amp;#36153;&amp;#32773;&amp;#39044;&amp;#35272;&amp;#29256;" width="640"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;今天在 MWC 2012 的一个发布会上，微软刚刚  &lt;a href="http://blogs.msdn.com/b/b8/archive/2012/02/29/welcome-to-windows-8-the-consumer-preview.aspx" target="_blank" title="Welcome to Windows 8 &amp;#8211; The Consumer Preview"&gt;发布了&lt;/a&gt; Windows 8 消费者预览版（Consumer Preview），大家已经可以  &lt;a href="http://livesino.net/archives/4038.live" target="_blank"&gt;下载到 Windows 8 消费者预览版&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;根据之前版本的反馈，消费者预览版中有超过 100,000 代码的改变，主要更新有：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;大量功能和用户体验改进&lt;/li&gt;
  &lt;li&gt;Windows Store 试运行“App Review 阶段”&lt;/li&gt;
  &lt;li&gt;连接 SkyDrive 个人云（稍后更多介绍）&lt;/li&gt;
  &lt;li&gt;Internet Explorer 10 平台预览版 5 &lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;开发者还可以  &lt;a href="http://www.microsoft.com/visualstudio/11/en-us/downloads" target="_blank"&gt;下载 Visual Studio 11 Beta&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#24494;&amp;#36719;&amp;#27491;&amp;#24335;&amp;#21457;&amp;#24067; Windows 8 &amp;#28040;&amp;#36153;&amp;#32773;&amp;#39044;&amp;#35272;&amp;#29256;" height="38" src="http://livesino.net/images/farm21/-Windows-8-_73E3/visual_studio_11_logo.png" title="&amp;#24494;&amp;#36719;&amp;#27491;&amp;#24335;&amp;#21457;&amp;#24067; Windows 8 &amp;#28040;&amp;#36153;&amp;#32773;&amp;#39044;&amp;#35272;&amp;#29256;" width="335"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;table border="0" cellpadding="3" cellspacing="0"&gt;
    
      &lt;tr&gt;
           &lt;td colspan="5"&gt;    &lt;strong&gt;您可能也喜欢：&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    
          &lt;tr&gt;
                   &lt;td valign="top" width="122"&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Flivesino.net%2Farchives%2F494.live&amp;from=http%3A%2F%2Flivesino.net%2Farchives%2F4039.live" target="_blank" title="&amp;#24494;&amp;#36719;&amp;#36824;&amp;#21487;&amp;#33021;&amp;#21019;&amp;#36896; iLife &amp;#31454;&amp;#20105;&amp;#32773;&amp;#65311;"&gt;
                             &lt;img height="116px" src="http://static.wumii.com/site_images/2010/12/10/1212362.png" width="116px"&gt;&lt;/img&gt;     &lt;br /&gt;
                        微软还可能创造 iLife 竞争者？
                    &lt;/a&gt;
                &lt;/td&gt;
                   &lt;td valign="top" width="122"&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Flivesino.net%2Farchives%2F2821.live&amp;from=http%3A%2F%2Flivesino.net%2Farchives%2F4039.live" target="_blank" title="&amp;#27599;&amp;#20301;&amp;#24494;&amp;#36719;&amp;#21592;&amp;#24037;&amp;#37117;&amp;#23558;&amp;#33719;&amp;#24471; Windows Phone 7 &amp;#25163;&amp;#26426;"&gt;
                             &lt;img height="116px" src="http://static.wumii.com/site_images/2010/12/10/1207154.jpg" width="116px"&gt;&lt;/img&gt;     &lt;br /&gt;
                        每位微软员工都将获得 Windows Phone 7 手机
                    &lt;/a&gt;
                &lt;/td&gt;
                   &lt;td valign="top" width="122"&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Flivesino.net%2Farchives%2F3565.live&amp;from=http%3A%2F%2Flivesino.net%2Farchives%2F4039.live" target="_blank" title="&amp;#24494;&amp;#36719; 21 &amp;#24180;&amp;#32769;&amp;#20853; Charlie Kindel &amp;#23558;&amp;#31163;&amp;#32844;"&gt;
                             &lt;img height="116px" src="http://static.wumii.com/site_images/2011/08/09/21710335.jpg" width="116px"&gt;&lt;/img&gt;     &lt;br /&gt;
                        微软 21 年老兵 Charlie Kindel 将离职
                    &lt;/a&gt;
                &lt;/td&gt;
                   &lt;td valign="top" width="122"&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Flivesino.net%2Farchives%2F1157.live&amp;from=http%3A%2F%2Flivesino.net%2Farchives%2F4039.live" target="_blank" title="Windows &amp;#8216;Mojave&amp;#8217; &amp;#23454;&amp;#39564;"&gt;
                             &lt;img height="116px" src="http://static.wumii.com/site_images/2010/12/10/1208691.png" width="116px"&gt;&lt;/img&gt;     &lt;br /&gt;
                        Windows ‘Mojave’ 实验
                    &lt;/a&gt;
                &lt;/td&gt;
                   &lt;td valign="top" width="122"&gt;
                        &lt;a href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Flivesino.net%2Farchives%2F2838.live&amp;from=http%3A%2F%2Flivesino.net%2Farchives%2F4039.live" target="_blank" title="&amp;#24494;&amp;#36719;&amp;#36130;&amp;#21153;&amp;#20998;&amp;#26512;&amp;#24072;&amp;#20250;&amp;#35758;&amp;#65306;&amp;#20113;&amp;#35745;&amp;#31639;&amp;#12289;Windows 7 &amp;#24179;&amp;#26495;&amp;#12289;Windows Phone 7"&gt;
                             &lt;img height="116px" src="http://static.wumii.com/site_images/2010/12/10/1204803.jpg" width="116px"&gt;&lt;/img&gt;     &lt;br /&gt;
                        微软财务分析师会议：云计算、Windows 7 平板、Windows Phone 7
                    &lt;/a&gt;
                &lt;/td&gt;
        &lt;/tr&gt;
    
      &lt;tr&gt;
           &lt;td align="right" colspan="5"&gt;
                &lt;a href="http://www.wumii.com/widget/relatedItems" target="_blank" title="&amp;#26080;&amp;#35269;&amp;#30456;&amp;#20851;&amp;#25991;&amp;#31456;&amp;#25554;&amp;#20214;"&gt;
                无觅
            &lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt; &lt;p&gt;©2011   &lt;a href="http://livesino.net"&gt;LiveSino.net&lt;/a&gt; |   &lt;a href="http://livesino.net/archives/4039.live" title="&amp;#24494;&amp;#36719;&amp;#27491;&amp;#24335;&amp;#21457;&amp;#24067; Windows 8 &amp;#28040;&amp;#36153;&amp;#32773;&amp;#39044;&amp;#35272;&amp;#29256;"&gt;阅读原文&lt;/a&gt; |   &lt;a href="http://livesino.net/archives/4039.live#comments" title="&amp;#24494;&amp;#36719;&amp;#27491;&amp;#24335;&amp;#21457;&amp;#24067; Windows 8 &amp;#28040;&amp;#36153;&amp;#32773;&amp;#39044;&amp;#35272;&amp;#29256; &amp;#30340;&amp;#35780;&amp;#35770;"&gt;添加评论&lt;/a&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>资讯 Cloud Consumer Preview IE10 Internet Explorer</category>
      <guid isPermaLink="true">https://itindex.net/detail/36318-%E5%BE%AE%E8%BD%AF-windows-%E6%B6%88%E8%B4%B9%E8%80%85</guid>
      <pubDate>Thu, 01 Mar 2012 00:33:02 CST</pubDate>
    </item>
    <item>
      <title>一招教您如何阻止Internet Explorer更新为IE10</title>
      <link>https://itindex.net/detail/44408-internet-explorer-%E6%9B%B4%E6%96%B0</link>
      <description>&lt;p&gt;每当微软有更新推送时，我们手动检查更新或设置成自动检查更新时，系统都能检测到相应的重要更新和推荐更新。正常情况下，推荐更新可以手动选择安装项，重要更新则会默认全部安装。Internet Explorer 更新也属于其中一个重要更新。&lt;/p&gt;
 &lt;p&gt;然而，部分网站跟IE10的兼容性还有待改善，直接将浏览器版本更新到  &lt;a href="http://www.iefans.net/ie10-for-windows-7-zhongwenban-guanfang-xiazai/" target="_blank" title="IE10 For Windows 7&amp;#20013;&amp;#25991;&amp;#29256;&amp;#23448;&amp;#26041;&amp;#19979;&amp;#36733;"&gt;IE 10&lt;/a&gt;，或多或少的带来不便。  &lt;br /&gt;
同时对于启用了自动更新功能的PC ，即使卸载了IE10，也总能有意无意的再次安装。&lt;/p&gt;
 &lt;p&gt;那么如何能够阻止浏览器版本更新为IE10呢？&lt;/p&gt;
 &lt;p&gt;我们可以通过手动修改注册表键值，来解决这个问题：&lt;/p&gt;
 &lt;p&gt;1. 按”Win+R”组合键，调出运行框输入：regedit 并回车。&lt;/p&gt;
 &lt;p&gt;2. 定位到如下路径：[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Setup\10.0]&lt;/p&gt;
 &lt;p&gt;注：对于未曾安装过IE10的用户，还需要参考步骤3新建”Setup”项和”10.0”项。而对于曾安装过IE10的用户，可以跳过步骤3，直接转到步骤4新建值。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#23637;&amp;#24320;&amp;#27880;&amp;#20876;&amp;#34920;&amp;#33267;Setup&amp;#39033;" src="https://ys5jzw.blu.livefilestore.com/y2px7bPRQYrOL8cQOLACvlbaq5vW2FEsVlVNAgkteblymOVKxyWbP6xcU2awqL4SKlL6UDc98lbs1Opue6z9Wz3HBAid0U2s2yr0YEd1tJAIKm-hqJqTkyoHcwbbJ2STJh9/10.0.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;3. 右击Internet Explorer项，选择“新建”--项。对”新项 #1” 重命名为”Setup”。同样，右击”Setup”项，选择“新建”—项。并对”新项 #1” 重命名为”10.0”。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#26032;&amp;#24314;&amp;#39033;&amp;#37325;&amp;#21629;&amp;#21517;&amp;#20026;&amp;#8221;10.0&amp;#8221;" src="https://ys7kqw.blu.livefilestore.com/y2puYuyk7S4DvVd9Ko0IzSXRShgts1GR4Fuizbf9D4uXDvNEdPurA3khxE4L6kEtMxiSYRNJIxJX_FJ8_Aepeepg6uz2tNBVqaJ4X0c0CCLC3EDPex7jTnlNJjLyiVlBL-y/Setup.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;4. 选中”10.0”项，并在右侧面板，右击选择”新建”—“DWORD(32-位)值(D)”。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#26032;&amp;#24314;&amp;#31354;&amp;#30333;DWORD&amp;#38190;&amp;#20540;" src="https://ys4t5g.blu.livefilestore.com/y2pygb79j-JLg4ZZUi7qQgLkIJymH-ROtz3aiCo1srf9_FPsOcZ7U8kWtw3S9a2nYfeCVwEdleMPGaw9MjqGuvsUmib32GQoYFENXVWItDk1ui7zFtfzUnbG47zUe9fNsEP/DWORD.JPG"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;5. 对新建的值重命名为：DoNotAllowIE10，并双击，在&amp;quot;数值数据&amp;quot;框中输入： 1--确定，保存更改。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#23545;&amp;#26032;&amp;#24314;&amp;#30340;&amp;#20540;&amp;#37325;&amp;#21629;&amp;#21517;&amp;#20026;&amp;#65306;DoNotAllowIE10" src="https://ys6uwg.blu.livefilestore.com/y2pz-o7LIAu1TMA_oZqVK-hmCRDLYaSsuA_gwGSu4F-_k5MBzzDXBoT1SDN-8d957oVl87KCWdoLeapSYRo9P6B11Mvcl1ixUW7LLFnK1zwz_dCV5GaXchzTE0ySp8Hy4MP/1.JPG"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;当然，还可以直接单击如下链接，到微软官网下载工具，自动禁用IE10的安装。  &lt;br /&gt;
  &lt;a href="http://www.microsoft.com/zh-cn/download/details.aspx?id=36512" target="_blank"&gt;http://www.microsoft.com/zh-cn/download/details.aspx?id=36512&lt;/a&gt;&lt;/p&gt;

 &lt;p&gt;This article addresses:  &lt;a href="http://www.iefans.net/ruhe-zuzhi-internet-explorer-gengxin-ie10/"&gt;http://www.iefans.net/ruhe-zuzhi-internet-explorer-gengxin-ie10/&lt;/a&gt;&lt;/p&gt;Here is no comments yet by the time  your rss reader get this, Do you want to be the first commentor? Hurry up &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>IE技巧 IE10 Internet Explorer 更新</category>
      <guid isPermaLink="true">https://itindex.net/detail/44408-internet-explorer-%E6%9B%B4%E6%96%B0</guid>
      <pubDate>Fri, 07 Jun 2013 22:48:59 CST</pubDate>
    </item>
    <item>
      <title>北美亚洲网络遭遇严重问题</title>
      <link>https://itindex.net/detail/40287-%E5%8C%97%E7%BE%8E-%E4%BA%9A%E6%B4%B2-%E7%BD%91%E7%BB%9C</link>
      <description>根据互联网流量报告，北美和亚洲的网络遭遇到严重问题：北美网络平均丢包率达到32%，亚洲网络平均丢包率33%，欧洲大洋洲和南美洲网络正常。网络问题导致Google App Engine、Tumblr和Dropbox等服务下线。目前不清楚故障原因，但云服务商Akami报告网络攻击流量比平常高出50%。 &lt;img border="0" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/24ebae48/mf.gif" width="1"&gt;&lt;/img&gt; &lt;div&gt;  &lt;table border="0"&gt;   &lt;tr&gt;    &lt;td valign="middle"&gt;     &lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=en&amp;title=%E5%8C%97%E7%BE%8E%E4%BA%9A%E6%B4%B2%E7%BD%91%E7%BB%9C%E9%81%AD%E9%81%87%E4%B8%A5%E9%87%8D%E9%97%AE%E9%A2%98&amp;link=http%3A%2F%2Finternet.solidot.org%2Farticle.pl%3Fsid%3D12%2F10%2F26%2F1525251%26amp%3Bfrom%3Drss" target="_blank"&gt;      &lt;img border="0" src="http://res3.feedsportal.com/images/emailthis2.gif"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/td&gt;    &lt;td valign="middle"&gt;     &lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=%E5%8C%97%E7%BE%8E%E4%BA%9A%E6%B4%B2%E7%BD%91%E7%BB%9C%E9%81%AD%E9%81%87%E4%B8%A5%E9%87%8D%E9%97%AE%E9%A2%98&amp;link=http%3A%2F%2Finternet.solidot.org%2Farticle.pl%3Fsid%3D12%2F10%2F26%2F1525251%26amp%3Bfrom%3Drss" target="_blank"&gt;      &lt;img border="0" src="http://res3.feedsportal.com/images/bookmark.gif"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; &lt;br /&gt; &lt;br /&gt; &lt;a href="http://da.feedsportal.com/r/148658240643/u/49/f/556826/c/33236/s/24ebae48/a2.htm"&gt;  &lt;img border="0" src="http://da.feedsportal.com/r/148658240643/u/49/f/556826/c/33236/s/24ebae48/a2.img"&gt;&lt;/img&gt;&lt;/a&gt; &lt;img border="0" height="1" src="http://pi.feedsportal.com/r/148658240643/u/49/f/556826/c/33236/s/24ebae48/a2t.img" width="1"&gt;&lt;/img&gt; &lt;div&gt;
  &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=oNCamYn7jGQ:rwMYrhdiaks:yIl2AUoC8zA"&gt;   &lt;img border="0" src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA"&gt;&lt;/img&gt;&lt;/a&gt;   &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=oNCamYn7jGQ:rwMYrhdiaks:7Q72WNTAKBA"&gt;   &lt;img border="0" src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/40287-%E5%8C%97%E7%BE%8E-%E4%BA%9A%E6%B4%B2-%E7%BD%91%E7%BB%9C</guid>
      <pubDate>Fri, 26 Oct 2012 23:12:00 CST</pubDate>
    </item>
    <item>
      <title>jQuery捕获超链接事件进行局部刷新</title>
      <link>https://itindex.net/detail/36988-jquery-%E8%B6%85%E9%93%BE%E6%8E%A5-%E4%BA%8B%E4%BB%B6</link>
      <description>&lt;p&gt;  &lt;a href="http://xiaoxia.org/upfiles/2012/04/243.png"&gt;   &lt;img alt="" height="335" src="http://xiaoxia.org/upfiles/2012/04/243.png" title="243" width="647"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;使用Google的UI的时候，在当前页面打开一个超链接，网页会根据需要进行局部刷新，而不是替换整个页面。当用户选择新窗口打开超链接的时候，超链接仍然可以到达预想的页面。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;pre&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta http-equiv=&amp;quot;content-type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;A Click Event Test&amp;lt;/title&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
        $(function(){
            /* 点击事件会在超链接跳转前发生 */
            $(&amp;quot;#div_test a&amp;quot;).click(function(){
                var link = $(this).attr(&amp;apos;href&amp;apos;);
                $(&amp;apos;#div_view&amp;apos;).attr(&amp;apos;src&amp;apos;, link);
                var href = window.location.href;
                window.location.href = href.substr(0, href.indexOf(&amp;apos;#&amp;apos;)) + &amp;apos;#&amp;apos; + link;
                return false;
            });
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id=&amp;quot;div_test&amp;quot;&amp;gt;
        &amp;lt;ol&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://xiaoxia.org&amp;quot;&amp;gt;xiaoxia&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://www.ibaiyang.org&amp;quot;&amp;gt;ibaiyang&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://www.xiaoxins.com&amp;quot;&amp;gt;xiaoxins.com&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ol&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;iframe id=&amp;quot;div_view&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
 &lt;p&gt;这只是我用jQuery做的一个测试，不知道Google是怎么实现的。例如，当点击一个超链接事件之后，页面通过iframe来进行局部刷新。而此时浏览器的地址栏应该会发生变化，这个如何改动呢？&lt;/p&gt;
 &lt;p&gt;我目前是通过修改 window.location 来使地址发生改变的，但是我只能改变#符号后面的内容吧。如果前面的内容也变了，可能会导致浏览器刷新整个页面？&lt;/p&gt;
 &lt;p&gt;求赐教！&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/36988-jquery-%E8%B6%85%E9%93%BE%E6%8E%A5-%E4%BA%8B%E4%BB%B6</guid>
      <pubDate>Wed, 11 Apr 2012 13:06:24 CST</pubDate>
    </item>
    <item>
      <title>Google的万圣夜logo视频</title>
      <link>https://itindex.net/detail/33577-google-%E4%B8%87%E5%9C%A3%E5%A4%9C-logo</link>
      <description>&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://zh.wikipedia.org/zh-hans/%E4%B8%87%E5%9C%A3%E5%A4%9C"&gt;万圣夜&lt;/a&gt;（英语：Halloween）在每年的10月31日，是西方世界的传统节日，主要流行于北美、不列颠群岛、澳大利亚和新西兰。当晚小孩会穿上化妆服，戴上面具，挨家挨户收集榶果。万圣夜通常与灵异的事物联系起来。欧洲传统上认为万圣节是鬼怪世界最接近人间的时间，这传说与东亚的中元节与盂兰节以及日本的百鬼夜行类似。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;2011年，&lt;a href="http://www.google.com"&gt;Google&lt;/a&gt;的万圣夜logo是一段有意思的视频。因为采用youtube托管的缘故，应该是无法打开的。我传到了优酷（&lt;a href="http://v.youku.com/v_show/id_XMzE3Nzk4NTc2.html"&gt;地址&lt;/a&gt;），如下：&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;br&gt;
&lt;iframe src="http://reader.googleusercontent.com/reader/embediframe?src=http://player.youku.com/player.php/sid/XMzE3Nzk4NTc2/v.swf&amp;amp;width=480&amp;amp;height=400" width="480" height="400"&gt;&lt;/iframe&gt;&lt;br&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;h3&gt;相关日志推荐&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nings.cn/2010/03/23/google-cn.html" title="一只兔子"&gt;一只兔子&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2007/12/17/new-google-mobile.html" title="Google移动版全面更新"&gt;Google移动版全面更新&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2007/09/19/google-mp3-mp4.html" title="Google（谷歌）MP3、MP4播放器实物评测"&gt;Google（谷歌）MP3、MP4播放器实物评测&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2007/09/18/google-guge.html" title="Google向左，谷歌往右"&gt;Google向左，谷歌往右&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2007/09/06/how-to-ungoogle-yourself.html" title="怎样在Google里隐姓埋名"&gt;怎样在Google里隐姓埋名&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2007/08/15/google-browser-sync.html" title="Google browser sync出错的解决办法"&gt;Google browser sync出错的解决办法&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2007/03/11/%e8%b0%b7%e6%ad%8c%e5%af%bc%e8%88%aa%e7%9a%84%e4%b8%8d%e9%9d%a0%e8%b0%b1.html" title="谷歌导航的不靠谱"&gt;谷歌导航的不靠谱&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2007/02/23/google-bookmarks-%e7%9a%84%e5%87%a0%e4%b8%aa%e7%bb%8f%e9%aa%8c.html" title="Google Bookmarks 的几个经验"&gt;Google Bookmarks 的几个经验&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2006/12/31/2007%ef%bc%8c%e6%88%91%e5%bf%83%e4%b8%ad%e7%9a%84google.html" title="2007，我心中的Google"&gt;2007，我心中的Google&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2006/11/06/google20%e2%80%94%e2%80%94searchmash%e5%8d%87%e7%ba%a7%e4%ba%86.html" title="Google2.0——SearchMash升级了"&gt;Google2.0——SearchMash升级了&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nings.cn/2006/10/10/google%e6%94%b6%e8%b4%adyoutube%e7%9a%84%e5%85%ad%e4%b8%aa%e5%8e%9f%e5%9b%a0.html" title="Google收购YouTube的六个原因"&gt;Google收购YouTube的六个原因&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>INTERNET Google logo 万圣节</category>
      <guid isPermaLink="true">https://itindex.net/detail/33577-google-%E4%B8%87%E5%9C%A3%E5%A4%9C-logo</guid>
      <pubDate>Mon, 31 Oct 2011 01:06:03 CST</pubDate>
    </item>
    <item>
      <title>现在还是有很多人希望利用互联网把中国搞乱</title>
      <link>https://itindex.net/detail/33527-%E5%A4%9A%E4%BA%BA-%E5%B8%8C%E6%9C%9B-%E5%88%A9%E7%94%A8</link>
      <description>&lt;p&gt;&lt;img src="http://blog.est.im/wp-content/uploads/2011/10/QQ%E6%88%AA%E5%9B%BE20111031135725.png" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.weibo.com/1642634100/xvgabhMzx"&gt;原文&lt;/a&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>News China Internet quotes</category>
      <guid isPermaLink="true">https://itindex.net/detail/33527-%E5%A4%9A%E4%BA%BA-%E5%B8%8C%E6%9C%9B-%E5%88%A9%E7%94%A8</guid>
      <pubDate>Mon, 31 Oct 2011 13:58:51 CST</pubDate>
    </item>
    <item>
      <title>数据显示 Internet Explorer 9 普及进度加速</title>
      <link>https://itindex.net/detail/33058-%E6%95%B0%E6%8D%AE-internet-explorer</link>
      <description>&lt;span style="font-weight:bold"&gt;微软公布了来自NetMarketShare的最新网页浏览器市场占有率数据，Firefox和Chrome各占有大约20%和10%的市场并保持平稳，而变化最大的是微软的IE9浏览器，随着Windows 7普及进程的深入，IE9的市场占有率也水涨船高&lt;/span&gt;，在最近三个月涨幅明显，目前已经达到了30%以上并继续预期大幅度增长，微软一直在推动用户升级旧版IE到IE9，而Web开发人员也对用户的升级行为表示极大的期待。&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet Explorer</category>
      <guid isPermaLink="true">https://itindex.net/detail/33058-%E6%95%B0%E6%8D%AE-internet-explorer</guid>
      <pubDate>Sat, 29 Oct 2011 09:11:18 CST</pubDate>
    </item>
    <item>
      <title>MySQL数据库优化的一些笔记</title>
      <link>https://itindex.net/detail/37657-mysql-%E6%95%B0%E6%8D%AE%E5%BA%93-%E4%BC%98%E5%8C%96</link>
      <description>&lt;p&gt;  &lt;strong&gt;0. 索引很重要&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;之前列举记录用了下面的语句。state字段为索引。&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
SELECT * FROM feed_urls WHERE state=&amp;apos;ok&amp;apos; AND feed_url&amp;lt;&amp;gt;&amp;apos;&amp;apos; LIMIT N,10
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;当记录数量很大时，有几万之后，这句SQL就很慢了。主要是因为feed_url没有建立索引。后来的解决方法是，把feed_url为空的，设为一个ok以外的state值，就行了。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;1、索引不是万能的&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;为了计算记录总数，下面的语句会很慢。  &lt;br /&gt;
&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
mysql&amp;gt; SELECT COUNT(*) FROM feed_urls WHERE state=&amp;apos;error&amp;apos;;
+----------+
| COUNT(*) |
+----------+
|    30715 |
+----------+
1 row in set (0.14 sec)

mysql&amp;gt; EXPLAIN SELECT COUNT(*) FROM feed_urls WHERE state=&amp;apos;error&amp;apos;\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: feed_urls
         type: ref
possible_keys: state,page_index
          key: page_index
      key_len: 10
          ref: const
         rows: 25936
        Extra: Using where; Using index
1 row in set (0.00 sec)
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;state为索引，请求用时140ms。遍历了state=&amp;apos;error&amp;apos;索引下的每一条记录。&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
mysql&amp;gt; SELECT state,COUNT(*) FROM feed_urls GROUP BY state;
+----------+----------+
| state    | COUNT(*) |
+----------+----------+
| error    |    30717 |
| fetching |        8 |
| nofeed   |    76461 |
| ok       |    74703 |
| queued   |   249681 |
+----------+----------+
5 rows in set (0.55 sec)

mysql&amp;gt; EXPLAIN SELECT state,COUNT(*) FROM feed_urls GROUP BY state\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: feed_urls
         type: index
possible_keys: NULL
          key: state
      key_len: 10
          ref: NULL
         rows: 431618
        Extra: Using index
1 row in set (0.00 sec)
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;请求用时550ms。遍历了每个state下的每一条记录。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;改进方法：&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;独立一个表用来计数，使用MySQL的Trigger同步计数：&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
CREATE TRIGGER my_trigger AFTER UPDATE ON feed_urls
FOR EACH ROW BEGIN

IF OLD.state &amp;lt;&amp;gt; NEW.state THEN

IF NEW.state=&amp;apos;ok&amp;apos; THEN
    UPDATE feed_stat SET count_feed = count_feed + 1;
END IF;

IF NEW.state IN (&amp;apos;ok&amp;apos;, &amp;apos;error&amp;apos;, &amp;apos;nofeed&amp;apos;) THEN
    UPDATE feed_stat SET count_access = count_access + 1;
END IF;

END IF;

END
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;  &lt;strong&gt;2. 当分页很大时&lt;/strong&gt;&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
mysql&amp;gt; SELECT * FROM feed_urls LIMIT 230000, 1\G
*************************** 1. row ***************************
         id: 736841f82abb0bc87ccfec7c0fdbd09c30b5a24d
       link: http://mappemunde.typepad.com/
      title: Tim Peterson
   feed_url: NULL
update_time: 2012-05-12 11:01:56
      state: queued
http_server: NULL
   abstract: NULL
previous_id: ceea30e0ba609b69198c53ce71c44070d69038c5
  ref_count: 1
      error: NULL
        aid: 230001
1 row in set (0.50 sec)

mysql&amp;gt; EXPLAIN SELECT * FROM feed_urls LIMIT 230000, 1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: feed_urls
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 431751
        Extra:
1 row in set (0.00 sec)
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;读取一条记录，耗时500ms，因为表记录是变长的，所以MySQL不能算出目标位置，只能每一条记录的数过去。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;改进方法：&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;通过索引定位，数索引比数记录要快，因为索引占用的空间比整条记录小很多。&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
mysql&amp;gt; SELECT * FROM (SELECT aid FROM feed_urls ORDER BY aid LIMIT 215000, 1) d JOIN feed_urls u ON d.aid=u.aid\G
*************************** 1. row ***************************
        aid: 215001
         id: 2e4b1a385c8aae40b3ec2af9153805ca446f2029
       link: http://ncse.com/
      title: NCSE
   feed_url: NULL
update_time: 2012-05-12 10:47:15
      state: queued
http_server: NULL
   abstract: NULL
previous_id: 819a6e3c5edc1624a9b8f171d8d3ae269843785f
  ref_count: 3
      error: NULL
        aid: 215001
1 row in set (0.06 sec)

mysql&amp;gt; EXPLAIN SELECT * FROM (SELECT aid FROM feed_urls ORDER BY aid LIMIT 215000, 1) d JOIN feed_urls u ON d.aid=u.aid\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: 
         type: system
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
        Extra:
*************************** 2. row ***************************
           id: 1
  select_type: PRIMARY
        table: u
         type: const
possible_keys: aid
          key: aid
      key_len: 4
          ref: const
         rows: 1
        Extra:
*************************** 3. row ***************************
           id: 2
  select_type: DERIVED
        table: feed_urls
         type: index
possible_keys: NULL
          key: aid
      key_len: 4
          ref: NULL
         rows: 211001
        Extra: Using index
3 rows in set (0.15 sec)
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;耗时60ms，比之前的方法快了将近10倍。如果LIMIT语句里还有WHERE a=1，应该建立一个（a，aid）的索引。&lt;/p&gt;
 &lt;p&gt;话说，MySQL好像还是不能直接算出第21500条索引的位置呀，这种方法还是数了索引了，能算出来就直接0ms了。不过这样的效率，对于百万级的，还能应付吧。如果是千万级的或者像我之前在KS创建的一张上亿条记录的表（120G），这种方法就肯定不行了。&lt;/p&gt;
 &lt;p&gt;经过上述优化，打开最后一页的速度已经很快了（之前需要800ms，现在则为300ms左右）。&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://xiaoxia.org/upfiles/2012/05/feed10.png"&gt;   &lt;img alt="" height="77" src="http://xiaoxia.org/upfiles/2012/05/feed10.png" title="feed10" width="648"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;膜拜下这Burst.NET最低档次的VPS (30RMB/month)。&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;root@xiaoxia-pc:~/# ping feed.readself.com -n
PING app.readself.com (184.82.185.32) 56(84) bytes of data.
64 bytes from 184.82.185.32: icmp_req=1 ttl=45 time=161 ms
64 bytes from 184.82.185.32: icmp_req=2 ttl=45 time=161 ms
64 bytes from 184.82.185.32: icmp_req=3 ttl=45 time=161 ms
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;用同样的方法，优化了搜索引擎的排名算法。即排名过程中选取尽量少的值出来排序，排序后再JOIN一次获取结果的信息。&lt;/p&gt;
 &lt;p&gt;排序过程如下：&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
SELECT u.*, count_level(u.id) lv
  FROM(
    SELECT f.id, f.ref_count, MATCH(i.link,i.title) AGAINST (keywords) score
    FROM feed_index i
    JOIN feed_urls f ON f.id=i.id
    WHERE MATCH(i.link,i.title) AGAINST (keywords)
    ORDER BY score*0.5 + score*0.5*(ref_count/max_ref_count_in_result) DESC
  LIMIT offset,10
) d JOIN feed_urls u ON u.id = d.id
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;目前处理10万记录的全文索引数据，MySQL还是可以满足的，就是不知道上百万之后，还能不能撑下去。撑不下去就依赖第三方的工具了，例如Sphinx   &lt;img alt=":)" src="http://xiaoxia.org/wp-includes/images/smilies/icon_smile.gif"&gt;&lt;/img&gt; &lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;3. SELECT里的函数&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;给FeedDB增加了层次的显示。因为本人太懒，所以没有给数据库表增加一个记录深度的字段。所以，直接写了一个MySQL的自定义函数 count_level，用来统计通过parent_id一直找到顶层经过的路径长度（Level）。&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
CREATE DEFINER=`feeddb_rw`@`%` FUNCTION `count_level`(fid char(40)) RETURNS int(11)
BEGIN
     SET @levels = 0;
     SET @found = false;
     WHILE NOT @found DO
	     SELECT previous_id INTO @prev_id FROM feed_urls WHERE id=fid;
	     IF @prev_id is null OR @prev_id = &amp;apos;&amp;apos; THEN
		SET @found = true;
             ELSE
             	SET @levels = @levels + 1;
             	SET fid = @prev_id;
	     END IF;
     END WHILE;
     IF @prev_id is null THEN
         RETURN null;
     END IF;
     RETURN  @levels;
END
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;在网页显示的时候用了类似下面的SQL语句。&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
mysql&amp;gt; SELECT u.*, count_level(u.id) FROM feed_urls u ORDER BY ref_count DESC LIMIT 12000,1\G
*************************** 1. row ***************************
               id: e42f44b04dabbb9789ccb4709278e881c54c28a3
             link: http://tetellita.blogspot.com/
            title: le hamburger et le croissant
         feed_url: http://www.blogger.com/feeds/7360650/posts/default
      update_time: 2012-05-15 14:50:53
            state: ok
      http_server: GSE
         abstract: Lepekmezest un épais sirop bordeaux obtenu par réduction dumoût de raisin, une sorte de mélasse de raisin, en somme. Légèrement acidulé, il apporte du pep&amp;apos;s aux yaourts et nappe avec bonheur les
      previous_id: 129cabd96e7099a53b78c7ddeff98658351082e9
        ref_count: 9
            error: NULL
              aid: 174262
count_level(u.id): 8
1 row in set (4.10 sec)
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;好吧，悲剧了！4100ms。一定对12000个条目都算了一次count_level，然后再进行排序。所以才用上了4秒那么漫长的时间！！！&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;改进方法：&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;先SELECT LIMIT，再在派生的临时表里，计算count_level。&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;pre&gt;
mysql&amp;gt; SELECT u.*, count_level(u.id) FROM (
      SELECT id FROM feed_urls ORDER BY ref_count DESC LIMIT 27521,1
 ) d JOIN feed_urls u ON u.id=d.id\G
*************************** 1. row ***************************
               id: 61df288dda131ffd6125452d20ad0648f38abafd
             link: http://mynokiamobile.org/
            title: My Nokia Mobile
         feed_url: http://mynokiamobile.org/feed/
      update_time: 2012-05-14 14:06:57
            state: ok
      http_server: Apache/2.2.19 (Unix) mod_ssl/2.2.19 OpenSSL/1.0.0-fips mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
         abstract: ArchivesSelect MonthMay 2012April 2012March 2012February 2012January 2012December 2011November 2011October 2011September 2011August 2011July 2011June 2011May 2011April 2011March 2011February 2011Janua
      previous_id: f37af92bb89c08f6d4b69e72eab05d8ab1e2aca4
        ref_count: 5
            error: NULL
              aid: 154996
count_level(u.id): 8
1 row in set (0.09 sec)
&lt;/pre&gt;
&lt;/blockquote&gt;
 &lt;p&gt;如此，优化之后效果好很多了！但是还可以继续优化，例如建立一个字段存储Level的值应该是最好的办法了。&lt;/p&gt;
 &lt;p&gt;初次了解MySQL一些工作机制，欢迎一起探讨！&lt;/p&gt;
 &lt;p&gt;参考文献：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/"&gt;http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/"&gt;http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/&lt;/a&gt;&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/37657-mysql-%E6%95%B0%E6%8D%AE%E5%BA%93-%E4%BC%98%E5%8C%96</guid>
      <pubDate>Wed, 16 May 2012 02:38:58 CST</pubDate>
    </item>
    <item>
      <title>M.C.ハマー、新しい検索エンジン「WireDoo」を紹介</title>
      <link>https://itindex.net/detail/31038-%E6%A4%9C%E7%B4%A2-wiredoo</link>
      <description>cheez 曰く、&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;米サンフランシスコで開催されているWeb 2.0サミットにて、意外な人物が新製品を発表したそうだ（&lt;a href="http://bits.blogs.nytimes.com/2011/10/19/m-c-hammer-announces-wiredoo-a-search-start-up/"&gt;The New York Times&lt;/a&gt;、&lt;a href="http://idle.slashdot.org/story/11/10/20/157222/mc-hammer-launches-a-search-engine"&gt;本家/.&lt;/a&gt;）。
&lt;/p&gt;&lt;p&gt;
その人物は90年代初め「U Can't Touch This」で一世を風靡した&lt;a href="http://ja.wikipedia.org/wiki/M.C.%E3%83%8F%E3%83%9E%E3%83%BC"&gt;M.C.ハマー&lt;/a&gt;。新しい検索エンジン「WireDoo」を引っ提げてやってきたという。
&lt;/p&gt;&lt;p&gt;
この検索エンジンは検索結果に関連情報を付加してくれるものだそうで、例えば「車」と検索すれば車以外にも価格や保険、消費者安全レーティングなども返してくれるとのこと。また株価の銘柄記号を検索すれば関連した投資家や投資信託なども表示されるという。
&lt;/p&gt;&lt;p&gt;
WireDooは現在開発段階にあり、まだ公開はされていない。ハマー曰くGoogleのような大手と競合するつもりはなく、クエリに対し繋がりのある情報を提示できる「より深い検索」を提供できればと話したそうだ。
&lt;/p&gt;&lt;p&gt;
ラッパーであり、現在は格闘技選手のマネジメントなども行っているハマー氏はデータ駆動型の企業のビジネスポテンシャルに目をつけているといい、最近ベンチャー企業の立ち上げや投資を手がけ始めたとのことだ。&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;
	&lt;a href="http://it.slashdot.jp/story/11/10/21/0847246/"&gt;すべて読む&lt;/a&gt;
	
		| &lt;a href="http://it.slashdot.jp/"&gt;ITセクション&lt;/a&gt;
	
		| &lt;a href="http://slashdot.jp/search.pl?tid=1913"&gt;インターネット&lt;/a&gt;
		&lt;/p&gt;
		&lt;p&gt;
		関連ストーリー：
		
			&lt;br&gt;&lt;a href="http://it.slashdot.jp/article.pl?sid=11/07/19/0212259"&gt;検索エンジンは人間の外部記憶装置と成りつつある？&lt;/a&gt;
			&lt;small&gt;2011年07月19日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://slashdot.jp/article.pl?sid=11/07/06/1025211"&gt;米Microsoft、中国の検索サイト「百度」と提携&lt;/a&gt;
			&lt;small&gt;2011年07月06日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://it.slashdot.jp/article.pl?sid=11/07/01/0152230"&gt;「かわいい」を検索できる、慶應 SFC 発の「かわいい検索」&lt;/a&gt;
			&lt;small&gt;2011年07月01日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://it.slashdot.jp/article.pl?sid=11/10/21/203206"&gt;Microsoft、著名人の好みを検索に反映させる技術の特許を出願中&lt;/a&gt;
			&lt;small&gt;2011年10月22日&lt;/small&gt;
		
		&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/31038-%E6%A4%9C%E7%B4%A2-wiredoo</guid>
      <pubDate>Fri, 21 Oct 2011 17:05:00 CST</pubDate>
    </item>
    <item>
      <title>非一致性内存访问模型与内存分配器</title>
      <link>https://itindex.net/detail/31108-%E4%B8%80%E8%87%B4%E6%80%A7-%E5%86%85%E5%AD%98-%E8%AE%BF%E9%97%AE</link>
      <description>&lt;p&gt;CPU主频涨不上去了，一直停留在2-3G。前端总线的时钟频率也涨不上去了，我现在用的这个小黑，Intel Core2 P8600，前端总线的时钟频率只有266MHz。于是，虽然内存越来越便宜了，但是没有那么大的高速带宽来连接CPU和内存啊。&lt;/p&gt;
&lt;p&gt;于是NUMA出现了。CPU组成node，每个node各自管理几十G内存，然后node和node之间通过Point-to-Point的方式建立高速直连。于是系统总线就没了，出现一个新名词，QPI，指那个快速访问通道，它不光连接内存和CPU，还连接其它外设如显卡。但是有个重要的结果是：CPU到每根内存条的“距离”是不相等的。有的是直连，所以速度很快，而有的需要绕到另一个node去拿，这样不仅速度慢，而且很容易把node之间的那个互连通道堵死。想想看，如果你工作在天津，但是偏偏要住在北京，每天上班下班是不是很痛苦？为什么呢？为什么会这样？为什么我想访问的这个内存不在我身边？那它在哪？&lt;/p&gt;
&lt;p&gt;从C语言的malloc说起。首先强调一点，malloc分配的是“地址空间”，而不是内存！同理，free释放的也只是地址空间，而不是内存。当你访问某个内存地址，而这个地址没有映射到任何物理页的时候，就会发生缺页中断，然后此时，操作系统才分配内存。简单点说，”&lt;strong&gt;内存的分配发生在第一次访问的时候&lt;/strong&gt;！“。&lt;/p&gt;
&lt;p&gt;总的来说，内存分配器此时有三种策略：&lt;br&gt;
1、糊里糊涂。什么都不知道，随便分。&lt;br&gt;
2、就近，找离当前CPU最近的node分配。&lt;br&gt;
3、round-robin。把你要的东西尽可能的平均分到每个node上。&lt;/p&gt;
&lt;p&gt;我不清楚你用的C Runtime到底是哪一种实现，反正以上三种都有可能。喜欢C的人大多都是追求高效，那么自然喜欢第二种咯？于是就有人提出，&lt;strong&gt;服务器的启动过程应该做成并行化的&lt;/strong&gt;，比如IO的buffer就让IO线程去初始化，各自做各自的。这样听起来很有道理，但是！亲爱的，如果这个线程被调度到另一个CPU上怎么办？所以我们不光得控制内存怎么分配的，还得控制线程调度策略，把这个线程绑在固定的CPU组上。更复杂的是，执行任务的是一个线程池怎么办？请问，我是在写Application，还是Operating System? 无论如何，“谁要用谁分配”依然是一个有效的优化策略。&lt;/p&gt;
&lt;p&gt;那么说Java吧，它比较清晰。Java有4种垃圾回收策略 串行化、并行、CMS（并发）、G1。如果选择了并行化的垃圾回收策略（Server版的jvm默认如此），它的内存池分为三类：新生代、老生代、永生代。&lt;br&gt;
并行化的垃圾回收器有一个开关，-XX:+UseNUMA，这个影响到新生代的Eden Space这个内存池的分配器的策略。先说Eden Space是干什么的：大部分new出来的对象都是首先在Eden Space上创建，这里面的对象都是临时创建而又立马被销毁的对象，否则会很快（小于1秒）就被挪到老生代里面去。如果打开了-XX:+UseNUMA，那么Eden Space会尽量就近找node分配，从而获得最经济、快捷的内存访问。可是另外，其它几个内存池呢？他们要么是采用的糊里糊涂的方式，要么就是采用的方式3，做round-robin。所以说，前面所说的为了内存访问局部化而把启动过程做成并行的对JAVA来说完全不适用。&lt;/p&gt;
&lt;p&gt;那么，现在重新思考NUMA的问题：访问速度、带宽。&lt;br&gt;
访问速度：的确，访问远处的内存会慢些，但是会慢多少呢？30%？50%？200%？你测过吗？我没有。据说，即便再慢，也比Nehalem之前的任何CPU快，因为改进了系统架构去掉北桥做了QPI等等。而且，根据我看到的各种数据来看，速度差距在50%以内。NUMA真是个很有意思的话题。我初次接触到这个概念是在《Solaris内核结构》那本书上，那本书是06年出版的。那个时代的硬件和现在差别很大的，那时候做NUMA可真是死了心的做，差2倍、差20倍它也觉得没问题，因为它和SMP相比增加了带宽嘛。于是OS就得被迫为这样巨大的差异做各种优化。可是现在呢？你看JVM，为什么仅仅对Eden Space做了就近分配？网上有很多关于NUMA的文章，以及如何在NUMA架构上写出更高效的程序。但是，很多观点是陈旧的。&lt;/p&gt;
&lt;p&gt;带宽：你确实把CPU间的QPI跑满了吗？近年产的CPU，每条QPI的单向带宽是每秒12GB（理论最大值），如今看来，只有大型的数据库Server或者Cache Server才有可能把它跑满。否则，你不需要考虑带宽的问题。&lt;/p&gt;
&lt;p&gt;所以现在有一种新的策略：SUMA，或者叫page interleaving，这个可以做到硬件层面去。把物理地址空间以均匀交替的方式分给每个node。例如0×0000-0x0FFF分给node 1，0×1000-0x1FFF分给node 2，以此类推。然后所有软件完全不在乎NUMA这件事情。做page interleaving的目的是尽可能平均的使用每个QPI通道。我觉得一般来说，这就足够了。Intel NUMA的x86 CPU在3年前才开始陆续面世，先让OS、compiler、jvm这些去适应它，等他们都折腾够了，最后才是我们这些普通的software developer。&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>计算机与 Internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/31108-%E4%B8%80%E8%87%B4%E6%80%A7-%E5%86%85%E5%AD%98-%E8%AE%BF%E9%97%AE</guid>
      <pubDate>Sat, 22 Oct 2011 01:11:54 CST</pubDate>
    </item>
    <item>
      <title>bitly が「これから評判になりそうな情報を提供する」サービスを開始</title>
      <link>https://itindex.net/detail/30309-bitly</link>
      <description>&lt;p&gt;insiderman 曰く、&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;短縮 URL サービス &lt;a href="https://bitly.com/"&gt;bitly&lt;/a&gt; が、そのデータを用いた「評判管理サービス」を提供するそうだ (&lt;a href="http://bitlyenterprise.com/post/11403350749/social-search" title="bitly Enterprise Blog - Social Search"&gt;bitly Enterprise Blog の記事&lt;/a&gt;、&lt;a href="http://jp.techcrunch.com/archives/20111013bit-ly-wants-to-predict-the-future-with-realtime-social-search/" title="Bit.ly、リアルタイムソーシャル検索を利用して未来予測システム構築を目指す"&gt;TechCrunch JAPAN の記事&lt;/a&gt;より) 。&lt;/p&gt;&lt;p&gt;このサービスはまだベータ版ではあるが、短縮した URL の情報を収集・分析したデータベースを用い、検索した用語に関して「今後 24 時間で大きな注目を集めそうなコンテンツを返す」そうだ。ただし有料ユーザー向けのサービスで、有料サービスの価格は 955 ドル/月と、個人で利用するにはややお高い。&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;
	&lt;a href="http://it.slashdot.jp/story/11/10/19/0042202/"&gt;すべて読む&lt;/a&gt;
	
		| &lt;a href="http://it.slashdot.jp/"&gt;ITセクション&lt;/a&gt;
	
		| &lt;a href="http://slashdot.jp/search.pl?tid=1913"&gt;インターネット&lt;/a&gt;
		&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/30309-bitly</guid>
      <pubDate>Wed, 19 Oct 2011 09:30:00 CST</pubDate>
    </item>
    <item>
      <title>iCloudに関するAppleとJASRACとの交渉は難航？</title>
      <link>https://itindex.net/detail/30308-icloud-apple-jasrac</link>
      <description>あるAnonymous Coward 曰く、&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;Appleが12日より開始した「iCloud」には、クラウド経由で自分の所有している音楽データを複数の端末で共有する機能が用意されている。だが、国によって著作権に関する状況が異なるため、米国以外ではこのサービスはまだ提供されていない。以前にも&lt;a href="http://japan.cnet.com/news/service/35008418/"&gt;Appleは米国外での音楽ライセンスを交渉中&lt;/a&gt;と報じられていたとおり各国で交渉が行われているようだが、日本ではなかなか難航しそうだ。&lt;a href="http://www.nikkei.com/tech/trend/article/g=96958A9C889DE1E7E7EBE0E7E2E2E3E6E3E2E0E2E3E3E2E2E2E2E2E2;p=9694E0E2E2E6E0E2E3E3E3EBE7E6"&gt;日経新聞がこの件について報じている&lt;/a&gt;が、JASRACは「我々が価格決定権を持てないお店に安い価格で商品を出したくない。それが音楽業界の気持ちです」と述べているという。
&lt;/p&gt;&lt;p&gt;
iCloudの場合、iTunes Storeで購入した楽曲はiCloud経由で無償で各端末に同期でき、また24.99ドルの追加料金を支払えば自分でリッピングした楽曲の同期も可能になるというサービスも提供されているが、どちらも日本では利用できない。米国では&lt;a href="http://www.cinematoday.jp/page/N0036235"&gt;映画データの共有も準備中&lt;/a&gt;だそうで、ますます差は広がるばかりだ。&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;
	&lt;a href="http://apple.slashdot.jp/story/11/10/18/101208/"&gt;すべて読む&lt;/a&gt;
	
		| &lt;a href="http://apple.slashdot.jp/"&gt;アップルセクション&lt;/a&gt;
	
		| &lt;a href="http://slashdot.jp/search.pl?tid=1913"&gt;インターネット&lt;/a&gt;
		&lt;/p&gt;
		&lt;p&gt;
		関連ストーリー：
		
			&lt;br&gt;&lt;a href="http://it.slashdot.jp/article.pl?sid=11/07/07/0232241"&gt;Google や Amazon のクラウド音楽サービスは合法か ?&lt;/a&gt;
			&lt;small&gt;2011年07月07日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://apple.slashdot.jp/article.pl?sid=11/06/24/012217"&gt;Apple の iCloud Music Match はハニーポットか ?&lt;/a&gt;
			&lt;small&gt;2011年06月24日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://yro.slashdot.jp/article.pl?sid=08/12/11/0027254"&gt;ホリプロ会長や JASRAC 理事ら、「コンテンツに必要なのは流通ではない」と主張&lt;/a&gt;
			&lt;small&gt;2008年12月11日&lt;/small&gt;
		
		&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/30308-icloud-apple-jasrac</guid>
      <pubDate>Wed, 19 Oct 2011 06:00:00 CST</pubDate>
    </item>
    <item>
      <title>猛犸4浏览器：北大附中季逸超给谈微创新的大佬们一耳光</title>
      <link>https://itindex.net/detail/28436-%E7%8C%9B%E7%8A%B8-%E6%B5%8F%E8%A7%88%E5%99%A8-%E5%8C%97%E5%A4%A7%E9%99%84%E4%B8%AD</link>
      <description>&lt;p&gt;&lt;a href="http://www.leiphone.com/mammoth4-browser.html"&gt;&lt;img title="未命名" src="http://www.leiphone.com/wp-content/uploads/2011/10/%E6%9C%AA%E5%91%BD%E5%90%8D9.jpg" alt="" width="150" height="150"&gt;&lt;/a&gt;就在很多大佬总是说移动互联网时代单打独斗已经不行了的时候，一位高中生用自己的实际行动狠狠地扇了他们一耳光。这就是&lt;a href="http://itunes.apple.com/us/app/mammoth4-internet-browser/id464736531?ls=1&amp;amp;mt=8"&gt;猛犸4浏览器&lt;/a&gt;，该浏览器由北大附中（现在应该进大学了）的一位叫做&lt;a href="http://weibo.com/peakji"&gt;季逸超&lt;/a&gt;的学生开发，并且获得了Macworld2011的特等奖。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;至于这款浏览器有多神奇，我们来一起看一下吧。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p style="text-align:center"&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/116.jpg"&gt;&lt;/a&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/mzl.avdefimu.320x480-75.jpg"&gt;&lt;img title="mzl.avdefimu.320x480-75" src="http://www.leiphone.com/wp-content/uploads/2011/10/mzl.avdefimu.320x480-75.jpg" alt="" width="320" height="480"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;多页面系统，滑动换页，你可以从这个剪贴板中先选择打开某个网页，二维书签也很有特色，可见的浏览记录跟Mac上的&lt;a href="http://www.leiphone.com/tag/Safari"&gt;Safari&lt;/a&gt;有得一拼，而且这是在手机上。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/26.jpg"&gt;&lt;img title="2" src="http://www.leiphone.com/wp-content/uploads/2011/10/26.jpg" alt="" width="200" height="300"&gt;&lt;/a&gt;惊人效果的动画，还可以手势操作，一个手势可以访问任何收藏。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/37.jpg"&gt;&lt;/a&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/mzl.llvhecrn.320x480-75.jpg"&gt;&lt;img title="mzl.llvhecrn.320x480-75" src="http://www.leiphone.com/wp-content/uploads/2011/10/mzl.llvhecrn.320x480-75.jpg" alt="" width="320" height="480"&gt;&lt;/a&gt;&lt;br&gt;
智能的弹出菜单，还有后台通知系统。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/47.jpg"&gt;&lt;img title="4" src="http://www.leiphone.com/wp-content/uploads/2011/10/47.jpg" alt="" width="200" height="300"&gt;&lt;/a&gt;私人模式浏览网页，以及广告拦截功能 ，当然&lt;a href="http://www.leiphone.com/tag/twitter"&gt;twitter&lt;/a&gt;这些服务怎么可以没有集成其中呢。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/56.jpg"&gt;&lt;/a&gt;&lt;a href="http://www.leiphone.com/wp-content/uploads/2011/10/mzl.pgsamkcs.320x480-75.jpg"&gt;&lt;img title="mzl.pgsamkcs.320x480-75" src="http://www.leiphone.com/wp-content/uploads/2011/10/mzl.pgsamkcs.320x480-75.jpg" alt="" width="320" height="480"&gt;&lt;/a&gt;&lt;br&gt;
有30多个内置的插件，如果你自己懂点代码的话，还可以自己在代码编辑器里面进行编辑。iOS5出来了，有些与之对应的更新应该也出来了，升级了的童鞋可以去下载一试，哦，忘了说，这款应用需要1.99美金哦！&lt;/p&gt;
&lt;p&gt;下面有段视频，看完你绝对会被这位童鞋的作品所震撼！&lt;/p&gt;
&lt;p&gt;&lt;iframe src="http://reader.googleusercontent.com/reader/embediframe?src=http://player.youku.com/player.php/sid/XMzEwMDQ5MDQw/v.swf&amp;amp;width=600&amp;amp;height=500" width="600" height="500"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;#&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>App库 编辑选择 Mammoth4 Internet Browser 北大附中 季逸超</category>
      <guid isPermaLink="true">https://itindex.net/detail/28436-%E7%8C%9B%E7%8A%B8-%E6%B5%8F%E8%A7%88%E5%99%A8-%E5%8C%97%E5%A4%A7%E9%99%84%E4%B8%AD</guid>
      <pubDate>Thu, 13 Oct 2011 10:03:28 CST</pubDate>
    </item>
    <item>
      <title>免費的雲端加速網站代理服務—CloudFlare，讓你的網站變得又快又安全！</title>
      <link>https://itindex.net/detail/28413-%E5%8A%A0%E9%80%9F-%E4%BB%A3%E7%90%86-cloudflare</link>
      <description>你聽過「CDN」這種越來越流行的網路服務嗎？CDN是一種網站代理服務，提供CDN服務的公司，會擁有非常充沛的網路頻寬，並在不同地點建置伺服器，然後根據訪客的位置，從最近的伺服器提供網站的資料給使用者，世界上有不少大型網站（如NBA、癮科技、Download.com…）都開始採用CDN服務。一般的CDN服務都是根據流量來計費的，但是今天阿正老師要介紹的這間「CloudFlare」CDN服務卻是完全免...&lt;p&gt;&lt;iframe src="http://feedads.g.doubleclick.net/~ah/f/4f70ol3tp3s3egp2167cgbf9j4/468/60#http%3A%2F%2Fblog.soft.idv.tw%2F%3Fp%3D1110" width="100%" height="60" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/quicktop/~4/jx_xAVsSh-0" height="1" width="1"&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet相關 web 2.0 密技偷偷報 精選 網路服務</category>
      <guid isPermaLink="true">https://itindex.net/detail/28413-%E5%8A%A0%E9%80%9F-%E4%BB%A3%E7%90%86-cloudflare</guid>
      <pubDate>Wed, 12 Oct 2011 11:45:12 CST</pubDate>
    </item>
    <item>
      <title>HTTP Headers 入门</title>
      <link>https://itindex.net/detail/28896-http-headers</link>
      <description>&lt;p&gt;非常感谢 &lt;a href="http://www.99css.com/"&gt;@ytzong&lt;/a&gt; 同学在&lt;a href="https://www.twitter.com/ytzong/status/6266688471"&gt;twitter上推荐&lt;/a&gt;这篇文章，&lt;a href="http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/"&gt;原文在此&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;本文系统的对HTTP Headers进行了简明易懂的阐述，我仅稍作笔记。&lt;/p&gt;
&lt;h3&gt;什么是HTTP Headers&lt;/h3&gt;
&lt;p&gt;HTTP是“Hypertext Transfer Protocol”的所写，整个万维网都在使用这种协议，几乎你在浏览器里看到的大部分内容都是通过http协议来传输的，比如这篇文章。&lt;/p&gt;
&lt;p&gt;HTTP Headers是HTTP请求和相应的核心，它承载了关于客户端浏览器，请求页面，服务器等相关的信息。&lt;/p&gt;
&lt;p&gt;&lt;img title="http_diagram" src="http://nettuts.s3.amazonaws.com/511_http/http_diagram.png" alt="" width="537" height="429"&gt;&lt;br&gt;
&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;示例&lt;/h3&gt;
&lt;p&gt;当你在浏览器地址栏里键入一个url，你的浏览器将会类似如下的http请求：&lt;br&gt;
&lt;code&gt;GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1&lt;br&gt;
Host: net.tutsplus.com&lt;br&gt;
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)&lt;br&gt;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br&gt;
Accept-Language: en-us,en;q=0.5&lt;br&gt;
Accept-Encoding: gzip,deflate&lt;br&gt;
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br&gt;
Keep-Alive: 300&lt;br&gt;
Connection: keep-alive&lt;br&gt;
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120&lt;br&gt;
Pragma: no-cache&lt;br&gt;
Cache-Control: no-cache&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
第一行被称为“Request Line” 它描述的是这个请求的基本信息，剩下的就是HTTP headers了。&lt;/p&gt;
&lt;p&gt;请求完成之后，你的浏览器可能会收到如下的HTTP响应：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;HTTP/1.x 200 OK&lt;br&gt;
Transfer-Encoding: chunked&lt;br&gt;
Date: Sat, 28 Nov 2009 04:36:25 GMT&lt;br&gt;
Server: LiteSpeed&lt;br&gt;
Connection: close&lt;br&gt;
X-Powered-By: W3 Total Cache/0.8&lt;br&gt;
Pragma: public&lt;br&gt;
Expires: Sat, 28 Nov 2009 05:36:25 GMT&lt;br&gt;
Etag: "pub1259380237;gz"&lt;br&gt;
Cache-Control: max-age=3600, public&lt;br&gt;
Content-Type: text/html; charset=UTF-8&lt;br&gt;
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT&lt;br&gt;
X-Pingback: http://net.tutsplus.com/xmlrpc.php&lt;br&gt;
Content-Encoding: gzip&lt;br&gt;
Vary: Accept-Encoding, Cookie, User-Agent&lt;br&gt;
&amp;lt;!-- ... rest of the html ... --&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第一行呢被称为“Status Line”，它之后就是http headers，空行完了就开始输出内容了（在这个案例中是一些html输出）。&lt;/p&gt;
&lt;p&gt;但你查看页面源代码却不能看到HTTP headers，虽然它们同你能看到的东西一起被传送至浏览器了。&lt;/p&gt;
&lt;p&gt;这个HTTP请求也发出了一些其它资源的接收请求，例如图片，css文件，js文件等等。&lt;/p&gt;
&lt;p&gt;下面我们来看看细节。&lt;/p&gt;
&lt;h3&gt;怎样才能看到HTTP Headers&lt;/h3&gt;
&lt;p&gt;下面这些FireFox扩展能够帮助你分析HTTP headers：&lt;/p&gt;
&lt;p&gt;1. &lt;a href="http://getfirebug.com/"&gt;firebug&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title="firebu" src="http://nettuts.s3.amazonaws.com/511_http/firebug.png" alt="" width="549" height="650"&gt;&lt;/p&gt;
&lt;p&gt;2.&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3829"&gt;Live HTTP Headers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title="live_http" src="http://nettuts.s3.amazonaws.com/511_http/live_http.png" alt="" width="578" height="702"&gt;&lt;/p&gt;
&lt;p&gt;3. 在PHP中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://php.net/manual/en/function.getallheaders.php"&gt;getallheaders()&lt;/a&gt; 用来获取请求头部. 你也可以使用 $_SERVER 数组.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.php.net/manual/en/function.headers-list.php"&gt;headers_list()&lt;/a&gt; 用来获取响应头部.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文章下面将会看到一些使用php示范的例子。&lt;/p&gt;
&lt;h3&gt;HTTP Request 的结构&lt;/h3&gt;
&lt;p&gt;&lt;img title="request_header" src="http://nettuts.s3.amazonaws.com/511_http/request_header.png" alt="" width="590" height="247"&gt;&lt;/p&gt;
&lt;p&gt;被称作“first line”的第一行包含三个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“method” 表明这是何种类型的请求. 最常见的请求类型有 GET, POST 和 HEAD.&lt;/li&gt;
&lt;li&gt;“path” 体现的是主机之后的路径. 例如，当你请求 “http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/”时 , path 就会是 “/tutorials/other/top-20-mysql-best-practices/”.&lt;/li&gt;
&lt;li&gt;“protocol” 包含有 “HTTP” 和版本号, 现代浏览器都会使用1.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剩下的部分每行都是一个“Name：Value”对。它们包含了各式各样关于请求和你浏览器的信息。例如”User-Agent“就表明了你浏览器版本和你所用的操作系统。”Accept-Encoding“会告诉服务器你的浏览可以接受类似gzip的压缩输出。&lt;/p&gt;
&lt;p&gt;这些headers大部分都是可选的。HTTP 请求甚至可以被精简成这样子：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1&lt;br&gt;
Host: net.tutsplus.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;并且你仍旧可以从服务器收到有效的响应。&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;请求类型&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;三种最常见的请求类型是：GET，POST 和 HEAD ，从html的编写过程中你可能已经熟悉了前两种。&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;GET：获取一个文档&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;大部分被传输到浏览器的html，images，js，css, … 都是通过GET方法发出请求的。它是获取数据的主要方法。&lt;/p&gt;
&lt;p&gt;例如，要获取Nettuts+ 的文章，http request的第一行通常看起来是这样的：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一旦html加载完成，浏览器将会发送GET 请求去获取图片，就像下面这样：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;表单也可以通过GET方法发送，下面是个例子：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;form action=&amp;quot;foo.php&amp;quot; method=&amp;quot;GET&amp;quot;&amp;gt;&lt;br&gt;
First Name: &amp;lt;input name=&amp;quot;first_name&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br&gt;
Last Name: &amp;lt;input name=&amp;quot;last_name&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br&gt;
&amp;lt;input name=&amp;quot;action&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot; /&amp;gt;&lt;br&gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;当这个表单被提交时，HTTP request 就会像这样：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET /foo.php?first_name=John&amp;amp;last_name=Doe&amp;amp;action=Submit HTTP/1.1&lt;br&gt;
...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;你可以将表单输入通过附加进查询字符串的方式发送至服务器。&lt;/p&gt;
&lt;h3&gt;POST：发送数据至服务器&lt;/h3&gt;
&lt;p&gt;尽管你可以通过GET方法将数据附加到url中传送给服务器，但在很多情况下使用POST发送数据给服务器更加合适。通过GET发送大量数据是不现实的，它有一定的局限性。&lt;/p&gt;
&lt;p&gt;用POST请求来发送表单数据是普遍的做法。我们来吧上面的例子改造成使用POST方式：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;form action=&amp;quot;foo.php&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br&gt;
First Name: &amp;lt;input name=&amp;quot;first_name&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br&gt;
Last Name: &amp;lt;input name=&amp;quot;last_name&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br&gt;
&amp;lt;input name=&amp;quot;action&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot; /&amp;gt;&lt;br&gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;提交这个表单会创建一个如下的HTTP 请求：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;POST /foo.php HTTP/1.1&lt;br&gt;
Host: localhost&lt;br&gt;
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)&lt;br&gt;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br&gt;
Accept-Language: en-us,en;q=0.5&lt;br&gt;
Accept-Encoding: gzip,deflate&lt;br&gt;
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br&gt;
Keep-Alive: 300&lt;br&gt;
Connection: keep-alive&lt;br&gt;
Referer: http://localhost/test.php&lt;br&gt;
Content-Type: application/x-www-form-urlencoded&lt;br&gt;
Content-Length: 43&lt;br&gt;
first_name=John&amp;amp;last_name=Doe&amp;amp;action=Submit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这里有三个需要注意的地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一行的路径已经变为简单的 /foo.php , 已经没了查询字符串。&lt;/li&gt;
&lt;li&gt;新增了 Content-Type 和 Content-Lenght 头部，它提供了发送信息的相关信息.&lt;/li&gt;
&lt;li&gt;所有数据都在headers之后，以查询字符串的形式被发送.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;POST方式的请求也可用在AJAX，应用程序，cURL … 之上。并且所有的文件上传表单都被要求使用POST方式。&lt;/p&gt;
&lt;h3&gt;HEAD：接收头部信息&lt;/h3&gt;
&lt;p&gt;HEAD和GET很相似，只不过HEAD不接受HTTP响应的内容部分。当你发送了一个HEAD请求，那就意味着你只对HTTP头部感兴趣，而不是文档本身。&lt;/p&gt;
&lt;p&gt;这个方法可以让浏览器判断页面是否被修改过，从而控制缓存。也可判断所请求的文档是否存在。&lt;/p&gt;
&lt;p&gt;例如，假如你的网站上有很多链接，那么你就可以简单的给他们分别发送HEAD请求来判断是否存在死链，这比使用GET要快很多。&lt;/p&gt;
&lt;h3&gt;http响应结构&lt;/h3&gt;
&lt;p&gt;当浏览器发送了HTTP请求之后，服务器就会通过一个HTTP response来响应这个请求。如果不关心内容，那么这个请求看起来会是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img title="response_header" src="http://nettuts.s3.amazonaws.com/511_http/response_header.png" alt="" width="424" height="249"&gt;&lt;/p&gt;
&lt;p&gt;第一个有价值的信息就是协议。目前服务器都会使用 HTTP/1.x 或者 HTTP/1.1。&lt;/p&gt;
&lt;p&gt;接下来一个简短的信息代表状态。代码200意味着我们的请求已经发送成功了，服务器将会返回给我们所请求的文档，在头部信息之后。&lt;/p&gt;
&lt;p&gt;我们都见过“404”页面。当我向服务器请求一个不存在的路径时，服务器就用用404来代替200响应我们。&lt;/p&gt;
&lt;p&gt;余下的响应内容和HTTP请求相似。这些内容是关于服务器软件的，页面/文件何时被修改过，mime type 等等…&lt;/p&gt;
&lt;p&gt;同样，这些头部信息也是可选的。&lt;/p&gt;
&lt;h2&gt;HTTP状态码&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;200 用来表示请求成功.&lt;/li&gt;
&lt;li&gt;300 来表示重定向.&lt;/li&gt;
&lt;li&gt;400 用来表示请求出现问题.&lt;/li&gt;
&lt;li&gt;500 用来表示服务器出现问题.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;200 成功 （OK）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前文已经提到，200是用来表示请求成功的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;206 部分内容 （Partial Content）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果一个应用只请求某范围之内的文件，那么就会返回206.&lt;/p&gt;
&lt;p&gt;这通常被用来进行下载管理，断点续传或者文件分块下载。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;404 没有找到 （Not Found）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/404.png" alt="404" width="547" height="272"&gt;&lt;/p&gt;
&lt;p&gt;很容易理解&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;401 未经授权 （Unauthorized）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;受密码保护的页面会返回这个状态。如果你没有输入正确的密码，那么你就会在浏览器中看到如下的信息：&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/401.png" alt="401" width="542" height="280"&gt;&lt;/p&gt;
&lt;p&gt;注意这只是受密码保护页面，请求输入密码的弹出框是下面这个样子的：&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/401_prompt.png" alt="401_prompt" width="548" height="348"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;403 被禁止（Forbidden）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你没有权限访问某个页面，那么就会返回403状态。这种情况通常会发生在你试图打开一个没有index页面的文件夹。如果服务器设置不允许查看目录内容，那么你就会看到403错误。&lt;/p&gt;
&lt;p&gt;其它一些一些方式也会发送权限限制，例如你可以通过IP地址进行阻止，这需要一些htaccess的协助。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;order allow,deny&lt;br&gt;
deny from 192.168.44.201&lt;br&gt;
deny from 224.39.163.12&lt;br&gt;
deny from 172.16.7.92&lt;br&gt;
allow from all&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;302（或307）临时移动（Moved Temporarily） 和 301 永久移动（Moved Permanently）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这两个状态会出现在浏览器重定向时。例如，你使用了类似 bit.ly 的网址缩短服务。这也是它们如何获知谁点击了他们链接的方法。&lt;/p&gt;
&lt;p&gt;302和301对于浏览器来说是非常相似的，但对于搜索引擎爬虫就有一些差别。打个比方，如果你的网站正在维护，那么你就会将客户端浏览器用302重定向到另外一个地址。搜索引擎爬虫就会在将来重新索引你的页面。但是如果你使用了301重定向，这就等于你告诉了搜索引擎爬虫：你的网站已经永久的移动到了新的地址。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;500 服务器错误（Internal Server Error）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/500.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;这个代码通常会在页面脚本崩溃时出现。大部分CGI脚本都不会像PHP那样输出错误信息给浏览器。如果出现了致命的错误，它们只会发送一个500的状态码。这时需要查看服务器错误日志来排错。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完整的列表&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你可以&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes"&gt;在这里&lt;/a&gt;找到完整的HTTP 状态码说明。&lt;/p&gt;
&lt;h2&gt;HTTP Headers 中的 HTTP请求&lt;/h2&gt;
&lt;p&gt;现在我们来看一些在HTTP headers中常见的HTTP请求信息。&lt;/p&gt;
&lt;p&gt;所有这些头部信息都可以在PHP的$_SERVER数组中找到。你也可以用&lt;a href="http://php.net/manual/en/function.getallheaders.php"&gt;getallheaders()&lt;/a&gt; 函数一次性获取所有的头部信息。&lt;/p&gt;
&lt;h3&gt;Host&lt;/h3&gt;
&lt;p&gt;一个HTTP请求会发送至一个特定的IP地址，但是大部分服务器都有在同一IP地址下托管多个网站的能力，那么服务器必须知道浏览器请求的是哪个域名下的资源。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Host: rlog.cn&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这只是基本的主机名，包含域名和子级域名。&lt;/p&gt;
&lt;p&gt;在PHP中，可以通过$_SERVER['HTTP_HOST'] 或 $_SERVER['SERVER_NAME']来查看。&lt;/p&gt;
&lt;h3&gt;User-Agent&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个头部可以携带如下几条信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器名和版本号.&lt;/li&gt;
&lt;li&gt;操作系统名和版本号.&lt;/li&gt;
&lt;li&gt;默认语言.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是某些网站用来收集访客信息的一般手段。例如，你可以判断访客是否在使用手机访问你的网站，然后决定是否将他们引导至一个在低分辨率下表现良好的移动网站。&lt;/p&gt;
&lt;p&gt;在PHP中，可以通过 $_SERVER['HTTP_USER_AGENT'] 来获取User-Agent&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {&lt;br&gt;
echo "Please stop using IE6!";&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Accept-Language&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Accept-Language: en-us,en;q=0.5&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个信息可以说明用户的默认语言设置。如果网站有不同的语言版本，那么就可以通过这个信息来重定向用户的浏览器。&lt;/p&gt;
&lt;p&gt;它可以通过逗号分割来携带多国语言。第一个会是首选的语言，其它语言会携带一个“q”值，来表示用户对该语言的喜好程度（0~1）。&lt;/p&gt;
&lt;p&gt;在PHP中用 $_SERVER["HTTP_ACCEPT_LANGUAGE"] 来获取这一信息。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {&lt;br&gt;
header('Location: http://french.mydomain.com');&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Accept-Encoding&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Accept-Encoding: gzip,deflate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;大部分的现代浏览器都支持gzip压缩，并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小，以节省下载时间和带宽。&lt;/p&gt;
&lt;p&gt;在PHP中可以使用 $_SERVER["HTTP_ACCEPT_ENCODING"] 获取该信息。 然后调用&lt;a href="http://www.php.net/manual/en/function.ob-gzhandler.php"&gt;ob_gzhandler()&lt;/a&gt;方法时会自动检测该值，所以你无需手动检测。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;// enables output buffering&lt;br&gt;
// and all output is compressed if the browser supports it&lt;br&gt;
ob_start('ob_gzhandler');&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;If-Modified-Since&lt;/h3&gt;
&lt;p&gt;如果一个页面已经在你的浏览器中被缓存，那么你下次浏览时浏览器将会检测文档是否被修改过，那么它就会发送这样的头部：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果自从这个时间以来未被修改过，那么服务器将会返回“304 Not Modified”，而且不会再返回内容。浏览器将自动去缓存中读取内容&lt;/p&gt;
&lt;p&gt;在PHP中，可以用$_SERVER['HTTP_IF_MODIFIED_SINCE'] 来检测。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;// assume $last_modify_time was the last the output was updated&lt;br&gt;
// did the browser send If-Modified-Since header?&lt;br&gt;
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {&lt;br&gt;
// if the browser cache matches the modify time&lt;br&gt;
if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {&lt;br&gt;
// send a 304 header, and no content&lt;br&gt;
header("HTTP/1.1 304 Not Modified");&lt;br&gt;
exit;&lt;br&gt;
}&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;还有一个叫Etag的HTTP头信息，它被用来确定缓存的信息是否正确，稍后我们将会解释它。&lt;/p&gt;
&lt;h3&gt;Cookie&lt;/h3&gt;
&lt;p&gt;顾名思义，他会发送你浏览器中存储的Cookie信息给服务器。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;它是用分号分割的一组名值对。Cookie也可以包含session id。&lt;/p&gt;
&lt;p&gt;在PHP中，单一的Cookie可以访问$_COOKIE数组获得。你可以直接用$_SESSION array获取session变量。如果你需要session id，那么你可以使用session_id()函数代替cookie。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;echo $_COOKIE['foo'];&lt;br&gt;
// output: bar&lt;br&gt;
echo $_COOKIE['PHPSESSID'];&lt;br&gt;
// output: r2t5uvjq435r4q7ib3vtdjq120&lt;br&gt;
session_start();&lt;br&gt;
echo session_id();&lt;br&gt;
// output: r2t5uvjq435r4q7ib3vtdjq120&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Referer&lt;/h3&gt;
&lt;p&gt;顾名思义, 头部将会包含referring url信息。&lt;/p&gt;
&lt;p&gt;例如，我访问Nettuts+的主页并点击了一个链接，这个头部信息将会发送到浏览器：&lt;br&gt;
&lt;code&gt;Referer: http://net.tutsplus.com/ &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在PHP中，可以通过 $_SERVER['HTTP_REFERER'] 获取该值。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if (isset($_SERVER['HTTP_REFERER'])) {&lt;br&gt;
$url_info = parse_url($_SERVER['HTTP_REFERER']);&lt;br&gt;
// is the surfer coming from Google?&lt;br&gt;
if ($url_info['host'] == 'www.google.com') {&lt;br&gt;
parse_str($url_info['query'], $vars);&lt;br&gt;
echo "You searched on Google for this keyword: ". $vars['q'];&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
// if the referring url was:&lt;br&gt;
// http://www.google.com/search?source=ig&amp;amp;hl=en&amp;amp;rlz=&amp;amp;=&amp;amp;q=http+headers&amp;amp;aq=f&amp;amp;oq=&amp;amp;aqi=g-p1g9&lt;br&gt;
// the output will be:&lt;br&gt;
// You searched on Google for this keyword: http headers&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You may have noticed the word “referrer” is misspelled as “referer”. Unfortunately it made into the official HTTP specifications like that and got stuck.&lt;/p&gt;
&lt;h3&gt;Authorization&lt;/h3&gt;
&lt;p&gt;当一个页面需要授权，浏览器就会弹出一个登陆窗口，输入正确的帐号后，浏览器会发送一个HTTP请求，但此时会包含这样一个头部：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Authorization: Basic bXl1c2VyOm15cGFzcw==&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;包含在头部的这部分信息是base64 encoded。例如，base64_decode(‘bXl1c2VyOm15cGFzcw==’) 会被转化为 ‘myuser:mypass’ 。&lt;/p&gt;
&lt;p&gt;在PHP中，这个值可以用$_SERVER['PHP_AUTH_USER'] 和 $_SERVER['PHP_AUTH_PW'] 获得。&lt;/p&gt;
&lt;p&gt;更多细节我们会在WWW-Authenticate部分讲解。&lt;/p&gt;
&lt;h2 style="font-size:1.5em"&gt;HTTP Headers 中的 HTTP响应&lt;/h2&gt;
&lt;p&gt;现在让我了解一些常见的HTTP Headers中的HTTP响应信息。&lt;/p&gt;
&lt;p&gt;在PHP中，你可以通过 &lt;a href="http://php.net/manual/en/function.header.php"&gt;header()&lt;/a&gt; 来设置头部响应信息。PHP已经自动发送了一些必要的头部信息，如 载入的内容，设置 cookies 等等… 你可以通过 &lt;a href="http://www.php.net/manual/en/function.headers-list.php"&gt;headers_list()&lt;/a&gt; 函数看到已发送和将要发送的头部信息。你也可以使用&lt;a href="http://www.php.net/manual/en/function.headers-sent.php"&gt;headers_sent()&lt;/a&gt;函数来检查头部信息是否已经被发送。&lt;/p&gt;
&lt;h3&gt;Cache-Control&lt;/h3&gt;
&lt;p&gt;w3.org 的定义是：“The Cache-Control general-header field is used to specify directives which MUST be obeyed by all caching mechanisms along the request/response chain.” 其中“caching mechanisms” 包含一些你ISP可能会用到的 网关和代理信息。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Cache-Control: max-age=3600, public&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;“public”意味着这个响应可以被任何人缓存，“max-age” 则表明了该缓存有效的秒数。允许你的网站被缓存降大大减少下载时间和带宽，同时也提高的浏览器的载入速度。&lt;/p&gt;
&lt;p&gt;也可以通过设置 “no-cache”  指令来禁止缓存：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Cache-Control: no-cache &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;更多详情请参见&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9"&gt;w3.org&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;Content-Type&lt;/h3&gt;
&lt;p&gt;这个头部包含了文档的”mime-type”。浏览器将会依据该参数决定如何对文档进行解析。例如，一个html页面（或者有html输出的php页面）将会返回这样的东西：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Type: text/html; charset=UTF-8&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;‘text’ 是文档类型，‘html’则是文档子类型。 这个头部还包括了更多信息，例如 charset。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;如果是一个图片，将会发送这样的响应：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Type: image/gif&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;浏览器可以通过mime-type来决定使用外部程序还是自身扩展来打开该文档。如下的例子降调用Adobe Reader：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Type: application/pdf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;直接载入，Apache通常会自动判断文档的mime-type并且添加合适的信息到头部去。并且大部分浏览器都有一定程度的容错，在头部未提供或者错误提供该信息的情况下它会去自动检测mime-type。&lt;/p&gt;
&lt;p&gt;你可以在&lt;a href="http://www.webmaster-toolkit.com/mime-types.shtml"&gt;这里&lt;/a&gt;找到一个常用mime-type列表。&lt;/p&gt;
&lt;p&gt;在PHP中你可以通过 &lt;a href="http://www.php.net/manual/en/function.finfo-file.php"&gt;finfo_file()&lt;/a&gt; 来检测文件的ime-type。&lt;/p&gt;
&lt;h3&gt;Content-Disposition&lt;/h3&gt;
&lt;p&gt;这个头部信息将告诉浏览器打开一个文件下载窗口，而不是试图解析该响应的内容。例如：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Disposition: attachment; filename="download.zip"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;他会导致浏览器出现这样的对话框：&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/download.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;注意，适合它的Content-Type头信息同时也会被发送&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Type: application/zip&lt;br&gt;
Content-Disposition: attachment; filename="download.zip"&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Content-Length&lt;/h3&gt;
&lt;p&gt;当内容将要被传输到浏览器时，服务器可以通过该头部告知浏览器将要传送文件的大小（bytes）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Length: 89123&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;对于文件下载来说这个信息相当的有用。这就是为什么浏览器知道下载进度的原因。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;例如，这里我写了一段虚拟脚本，来模拟一个慢速下载。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;// it's a zip file&lt;br&gt;
header('Content-Type: application/zip');&lt;br&gt;
// 1 million bytes (about 1megabyte)&lt;br&gt;
header('Content-Length: 1000000');&lt;br&gt;
// load a download dialogue, and save it as download.zip&lt;br&gt;
header('Content-Disposition: attachment; filename="download.zip"');&lt;br&gt;
// 1000 times 1000 bytes of data&lt;br&gt;
for ($i = 0; $i &amp;lt; 1000; $i++) {&lt;br&gt;
&lt;span style="white-space:pre"&gt; &lt;/span&gt;echo str_repeat(".",1000);&lt;br&gt;
&lt;span style="white-space:pre"&gt; &lt;/span&gt;// sleep to slow down the download&lt;br&gt;
&lt;span style="white-space:pre"&gt; &lt;/span&gt;usleep(50000);&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;结果将会是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/download_with_progress.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;现在，我将Content-Length头部注释掉：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;// it's a zip file&lt;br&gt;
header('Content-Type: application/zip');&lt;br&gt;
// the browser won't know the size&lt;br&gt;
// header('Content-Length: 1000000');&lt;br&gt;
// load a download dialogue, and save it as download.zip&lt;br&gt;
header('Content-Disposition: attachment; filename="download.zip"');&lt;br&gt;
// 1000 times 1000 bytes of data&lt;br&gt;
for ($i = 0; $i &amp;lt; 1000; $i++) {&lt;br&gt;
&lt;span style="white-space:pre"&gt; &lt;/span&gt;echo str_repeat(".",1000);&lt;br&gt;
&lt;span style="white-space:pre"&gt; &lt;/span&gt;// sleep to slow down the download&lt;br&gt;
&lt;span style="white-space:pre"&gt; &lt;/span&gt;usleep(50000);&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;结果就变成了这样：&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/download_without_progress.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;这个浏览器只会告诉你已下载了多少，但不会告诉你总共需要下载多少。而且进度条也不会显示进度。&lt;/p&gt;
&lt;h3&gt;Etag&lt;/h3&gt;
&lt;p&gt;这是另一个为缓存而产生的头部信息。它看起来会是这样：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Etag: "pub1259380237;gz"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;服务器可能会将该信息和每个被发送文件一起响应给浏览器。该值可以包含文档的最后修改日期，文件大小或者文件校验和。浏览会把它和所接收到的文档一起缓存。下一次当浏览器再次请求同一文件时将会发送如下的HTTP请求：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;If-None-Match: "pub1259380237;gz"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果所请求的文档Etag值和它一致，服务器将会发送304状态码，而不是2oo。并且不返回内容。浏览器此时就会从缓存加载该文件。&lt;/p&gt;
&lt;h3&gt;Last-Modified&lt;/h3&gt;
&lt;p&gt;顾名思义，这个头部信息用GMT格式表明了文档的最后修改时间：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$modify_time = filemtime($file);&lt;br&gt;
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;它提供了另一种缓存机制。浏览器可能会发送这样的请求：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;在If-Modified-Since一节我们已经讨论过了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Location&lt;/h3&gt;
&lt;p&gt;这个头部是用来重定向的。如果响应代码为 301 或者 302 ，服务器就必须发送该头部。例如，当你访问 http://www.nettuts.com 时浏览器就会收到如下的响应：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;HTTP/1.x 301 Moved Permanently&lt;br&gt;
...&lt;br&gt;
Location: http://net.tutsplus.com/&lt;br&gt;
...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在PHP中你可以通过这种方式对访客重定向：&lt;br&gt;
&lt;code&gt;header('Location: http://net.tutsplus.com/');&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;默认会发送302状态码，如果你想发送301，就这样写：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;header('Location: http://net.tutsplus.com/', true, 301);&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Set-Cookie&lt;/h3&gt;
&lt;p&gt;当一个网站需要设置或者更新你浏览的cookie信息时，它就会使用这样的头部：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT&lt;br&gt;
Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;每个cookie会作为单独的一条头部信息。注意，通过js设置cookie将不会体现在HTTP头中。&lt;/p&gt;
&lt;p&gt;在PHP中，你可以通过&lt;a href="http://php.net/manual/en/function.setcookie.php"&gt;setcookie()&lt;/a&gt;函数来设置cookie，PHP会发送合适的HTTP 头。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;setcookie("TestCookie", "foobar");&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;它会发送这样的头信息：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Set-Cookie: TestCookie=foobar&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果未指定到期时间，cookie就会在浏览器关闭后被删除。&lt;/p&gt;
&lt;h3&gt;WWW-Authenticate&lt;/h3&gt;
&lt;p&gt;一个网站可能会通过HTTP发送这个头部信息来验证用户。当浏览器看到头部有这个响应时就会打开一个弹出窗。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;WWW-Authenticate: Basic realm="Restricted Area"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;它会看起来像这样：&lt;/p&gt;
&lt;p&gt;&lt;img src="http://nettuts.s3.amazonaws.com/511_http/401_prompt.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;在&lt;a href="http://nettuts.s3.amazonaws.com/511_http/401_prompt.png"&gt;PHP手册的一章&lt;/a&gt;中就有一段简单的代码演示了如果用PHP做这样的事情：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if (!isset($_SERVER['PHP_AUTH_USER'])) {&lt;br&gt;
header('WWW-Authenticate: Basic realm="My Realm"');&lt;br&gt;
header('HTTP/1.0 401 Unauthorized');&lt;br&gt;
echo 'Text to send if user hits Cancel button';&lt;br&gt;
exit;&lt;br&gt;
} else {&lt;br&gt;
echo &amp;quot;&amp;lt;p&amp;gt;Hello {$_SERVER[&amp;#39;PHP_AUTH_USER&amp;#39;]}.&amp;lt;/p&amp;gt;&amp;quot;;&lt;br&gt;
echo &amp;quot;&amp;lt;p&amp;gt;You entered {$_SERVER[&amp;#39;PHP_AUTH_PW&amp;#39;]} as your password.&amp;lt;/p&amp;gt;&amp;quot;;&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Content-Encoding&lt;/h3&gt;
&lt;p&gt;这个头部通常会在返回内容被压缩时设置。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Encoding: gzip&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在PHP中，如果你调用了&lt;a href="http://www.php.net/manual/en/function.ob-gzhandler.php"&gt;ob_gzhandler()&lt;/a&gt;函数，这个头部将会自动被设置。&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>文摘翻译 读书笔记 Internet web</category>
      <guid isPermaLink="true">https://itindex.net/detail/28896-http-headers</guid>
      <pubDate>Thu, 03 Dec 2009 22:36:59 CST</pubDate>
    </item>
    <item>
      <title>ニコニコ動画やYouTubeの音声をテキスト化する「PodCastle」</title>
      <link>https://itindex.net/detail/29163-youtube-podcastle</link>
      <description>あるAnonymous Coward 曰く、&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;産総研は、インターネット上の動画音声データを対象とした音声全文検索・書き起こしサービス「PodCastle」を一般公開し、音声情報検索技術の実証実験を開始した(&lt;a href="http://www.aist.go.jp/aist_j/press_release/pr2011/pr20111012/pr20111012.html"&gt;プレスリリース&lt;/a&gt;)。
&lt;br&gt; &lt;br&gt;

音声認識技術によって動画音声データをテキスト化し、誤りをユーザーに訂正してもらうことで認識結果だけでなく認識精度も向上していくというもの。産総研では2008年から日本語のポッドキャストを対象とした音声全文検索サービスを公開し、ユーザーの協力により認識精度が向上することを実証していた。今回はポッドキャストに加えてニコニコ動画、YouTube、Ustreamに対応し、&lt;a href="http://podcastle.jp/"&gt;日本語&lt;/a&gt;と&lt;a href="http://en.podcastle.jp/"&gt;英語&lt;/a&gt;の音声認識および検索が可能となっている。
&lt;br&gt; &lt;br&gt;

実際の認識例を見ると、報道系などについては比較的精度良くテキスト化できているが、トーク番組などのバラエティ系はあまり精度が高くないように見受けられる。ユーザーの訂正により、認識精度はどれぐらい向上するのだろうか。&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;
	&lt;a href="http://it.slashdot.jp/story/11/10/14/2242246/"&gt;すべて読む&lt;/a&gt;
	
		| &lt;a href="http://it.slashdot.jp/"&gt;ITセクション&lt;/a&gt;
	
		| &lt;a href="http://slashdot.jp/search.pl?tid=472"&gt;テクノロジー&lt;/a&gt;
	
		| &lt;a href="http://slashdot.jp/search.pl?tid=1913"&gt;インターネット&lt;/a&gt;
		&lt;/p&gt;
		&lt;p&gt;
		関連ストーリー：
		
			&lt;br&gt;&lt;a href="http://slashdot.jp/article.pl?sid=11/09/25/0948220"&gt;産総研オープンラボ開催&lt;/a&gt;
			&lt;small&gt;2011年09月25日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://it.slashdot.jp/article.pl?sid=11/09/22/0842248"&gt;クラウド型「人力OCR」、どう思う？&lt;/a&gt;
			&lt;small&gt;2011年09月22日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://it.slashdot.jp/article.pl?sid=05/01/26/2216253"&gt;Googleがテレビ番組検索提供開始&lt;/a&gt;
			&lt;small&gt;2005年01月27日&lt;/small&gt;
		
			&lt;br&gt;&lt;a href="http://slashdot.jp/article.pl?sid=04/09/13/1734246"&gt;IBMが自社の音声認識ソフトウェアをオープンソース化&lt;/a&gt;
			&lt;small&gt;2004年09月14日&lt;/small&gt;
		
		&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>internet</category>
      <guid isPermaLink="true">https://itindex.net/detail/29163-youtube-podcastle</guid>
      <pubDate>Sat, 15 Oct 2011 15:25:00 CST</pubDate>
    </item>
    <item>
      <title>微软新推浏览器安全评分网站 IE领先竞争对手</title>
      <link>https://itindex.net/detail/28305-%E5%BE%AE%E8%BD%AF-%E6%B5%8F%E8%A7%88%E5%99%A8-%E5%AE%89%E5%85%A8</link>
      <description>&lt;span style="font-weight:bold"&gt;微软周二推出一个名为yourbrowsermatters.org的网站，对各种版本微软IE浏览器以及谷歌和Mozilla等竞争对手制作的浏览器进行安全评分。&lt;/span&gt;这个新网站让浏览器通过一个安全功能检查表，然后对浏览器进行评分，最高评分是4。毫不奇怪，微软IE9获得满分4分。IE8获得3分。谷歌上个月推出的Chrome 14浏览器获得2.5分。另一个推出一个月的Mozilla的火狐7浏览器仅获得2分。&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Internet Explorer</category>
      <guid isPermaLink="true">https://itindex.net/detail/28305-%E5%BE%AE%E8%BD%AF-%E6%B5%8F%E8%A7%88%E5%99%A8-%E5%AE%89%E5%85%A8</guid>
      <pubDate>Wed, 12 Oct 2011 07:51:00 CST</pubDate>
    </item>
  </channel>
</rss>

