分类目录归档:资源共享

Facebook值得长期投资5大原因:平台优秀难替代

Facebook何以如此值钱,以至于能够提交科技行业有史以来规模最大的IPO(首次公开招股)?因为他们打造了防御性极强的产品、平台和广告业务,而这一切的基础则是优秀的人才和有价值的数据。该公司目前拥有多项竞争优势,可以避免其地位被颠覆,并长期成为主要的网络身份提供商。无论IPO定价如何,以下5大原因都将使Facebook成为明智的长期投资选择:

1、网络效应

取代Facebook成为主流在线社交网络几乎不可能。该公司将实名注册引入了互联网领域,这也成为了吸引用户的主要法宝。当年的MySpace、Friendster和其他社交网络服务都采用了匿名注册制度,而Facebook则通过实名注册获得了优势,但现在已经没有哪家公司能够在Facebook的基础上找到这样的“法宝”。

Facebook的天才分销战略使得该服务可以充分利用附加价值,并迅速在全球普及开来。最终,Facebook获得了网络效应,不断增长的用户群也进一步增加了这款服务的价值,并反过来吸引更多新用户。

如今,惯性已然形成。用户已经花了大量时间在Facebook上建立了自己的资料和兴趣图谱,最重要的是,他们还借此构建了社交图谱。随着Facebook为越来越多的用户提供服务,加之任何一个人都有很多好友在使用这款服务,使得其他社交网络无法望其项背,必须要通过革命性的改进才能抢夺Facebook的用户。网络效应形成的这种防御力将使Facebook成为安全的长期投资对象。

2、News Feed的EdgeRank算法

5年来,Facebook一直在收集数据,并提炼EdgeRank算法。该算法可以决定哪些内容最终会出现在你的News Feed中,以及哪些内容会被突出显示。Facebook使用Like按钮点击数、评论数和分享数来判断内容的相关性,并开发出了一款称得上是全球最佳的自动化内容管理引擎。News Feed还将成为全球最大的照片数据库,而好友添加的图片标签也将帮助这些图片传播。

对于没有提交太多数据的新用户,Facebook仍然可以预测他们可能喜欢的内容。对于现有用户,尤其是主动使用反馈机制的老用户,News Feed则会持续提供相关内容。EdgeRank创建了一种极易上瘾的体验,吸引用户在该网站停留了大量时间,并展开了互动。尽管Twitter和Google+都对Facebook构成了挑战,但要开发一种能够提供相关内容的算法,仍然需要数年时间。

3、人才

马克·扎克伯格(Mark Zuckerberg)很有远见,这也使得Facebook可以不断开发能够吸引新用户的功能,而不至于遭遇用户流失。扎克伯格已经整合了很多原创想法,除此之外,还包括一些无法在其他地方充分发挥潜力的创意。他还推动该服务不断革新,使之在发布8年后的今天依然能够继续吸引用户,并处于行业中心地位。

扎克伯格致力于通过互连和开放让世界变得更好,这一理念也吸引了其他的梦想家。该公司COO雪莉·桑德伯格(Sheryl Sandberg)的高效运营已经大幅推高了Facebook的盈利能力。由于她勇于尝试,因此Facebook仍将继续通过行为定位和在社交内容中注入广告来改革广告行业。Facebook产品副总裁克里斯·考克斯(Chris Cox)引领了Facebook的社交设计运动,使得第一方和第三方产品能够从一开始就充分利用Facebook的数据和社区,而不是被其束缚。

由于拥有改变世界的潜力,以及高效而充满乐趣的企业文化,帮助Facebook从谷歌(微博)等臃肿而官僚化的大企业挖来了顶级的工程师、产品和商业人才。该公司还在积极收购具有颠覆性的创业公司,例如保罗·布切特(Paul Bucheit)和布莱特·泰勒(Brett Taylor)的FriendFeed、布莱克·罗斯(Blake Ross)的Parakey、山姆·莱辛(Sam Lessin)的Drop.io以及约什·威廉姆斯(Josh Williams)的Gowalla。这些明星产品设计师和高管将确保Facebook获得源源不断的创新。

IPO将为Facebook提供更多的并购资金,帮助其吸引更多人才。尽管这些人才随时可能会变现离开,但由于只需出售一少部分股票便可改善生活,因此他们或许仍然愿意继续留在Facebook。

4、应用和游戏平台

Facebook已经创建了一个增速迅猛的游戏平台。该服务仍有很大增长空间,而网站广告和游戏也已经为Zynga等企业带来了高额回报。Facebook已经培育了庞大的开发者社区,为该公司提供了大量应用和内容,这些都不会在一夜之间消失。

Facebook游戏经常会设计很长的情节,并让用户购买各种各样的虚拟商品,不仅满足用户的展示欲望,还可以进一步增强游戏粘度。该公司已经吸引了很多花费远超普通用户的“鲸类”用户。移动已经成为谷歌和苹果的重要平台,而Facebook在这一领域才刚刚起步,但他们的优势在于拥有庞大的移动用户群。

由于Facebook会从虚拟商品的销售额中抽取30%的分成,使得游戏平台成为了该公司的一个持续创收来源。如今,部分开发者已经开始尝试数字媒体销售和租赁业务,同时提供虚拟货币“微激励”计划,表明该平台在游戏之外还有更大的盈利前景。

5、精准广告

年龄、性别、所在地、家乡、雇主、教育背景、好友、兴趣、正在应用中进行的活动以及网购习惯,当用户与好友分享这些数据时,他们也将这些信息分享给了Facebook。这使得Facebook拥有了最精准的定位数据。通过自助工具和广告代表,Facebook可以为广告主提供有效的广告解决方案,无论是本地企业还是跨国公司都可以享受到这样的服务。

通过将这些定位数据与社交广告相整合,Facebook已经创建了关注度颇高的广告。用户可以看到喜欢某个品牌的好友姓名和头像。而好友与某个品牌之间的互动(例如点击Like按钮、使用应用或签到)本身也可以通过Sponsored Storeis成为广告。这类广告正在逐渐抢夺搜索广告和精准显示广告的预算。

Facebook刚刚开始通过广告盈利,这类广告普遍尺寸较小,不具侵扰性。Facebook现在又开始将广告整合到News Feed信息流中。该公司尚未向数以亿计的移动用户展示广告,但Sponsored Stories很快就将登陆移动平台。最终,Facebook还将把这类广告推广到其他网站中,只要用户登录Facebook账号,就可以看到与Facebook.com具备同等相关度的广告。

—————————————————-

以上摘自新浪科技:http://tech.sina.com.cn/i/2012-01-31/13486669736.shtml

最奇特的编程语言特征

目前为止,据我个人观察,从语法角度上讲,最被人诟病的一种语言应该是LISP语言了。打开这种语言的代码,一眼望去,满目全是括弧,一层套一层。 这种语言特征最大的问题是,它不符合人们通常的思维习惯。LISP语言的这个特点是个整体的语言现象,而任何一种语言其实也都有一些个别的很奇特的东西, 其中有些会奇怪的让你摸不着头脑。有一个好事者在一个帖子上征集各种语言里不合常理的地方,结果收集到了320多条,问题最大最多的语言算是 Javascript了,另外还有C,Java,Python,PHP等等。下面列出的是其中最有趣的几条。

1. 在C语言里,数组可以这样索引取值

a[10]

这种写法相当常见。 然而,还有一种很少见的写法(绝对可用!)是这样的:

10[a]

这两种写法的效果是一样的。

2. 在JavaScript里:

'5' + 3 结果是 '53'

'5' - 3 结果是 2

3. 在JavaScript里,下面的语法结构

return
{
    id : 1234,
    title : 'Tony the Pony'
};

会提示语法错误:”缺少分号”。而下面的写法却能按你预想的结果运行:

return {
    id : 1234,
    title : 'Tony the Pony'
};

更让人郁闷的是下面的写法竟然可以(至少在谷歌浏览器里是这样的):

return /*
*/{
    id : 1234,
    title : 'Tony the Pony'
};

下面的例子也是同样的问题引起的,但不会报错,而你却得不到想要的结果:

return
    2 + 2;

4. JavaScript的等式对照表:

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

5. Java里有趣的自动打包(auto boxing)和IntegerCache:

Integer foo = 1000;
Integer bar = 1000;

foo = bar; // true
foo == bar; // false

//然而,如果 foo 和 bar 的值介于 127 和 -128 之间,
//情况会发生变化:

Integer foo = 42;
Integer bar = 42;

foo = bar; // true
foo == bar; // true

解释

在Java源代码里你很快能翻出下面的内容:

/**
 * Returns a Integer instance representing the specified
 * int value.
 * If a new Integer instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param  i an int value.
 * @return a Integer instance representing i.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    if (i >= -128 && i

注意; IntegerCache.high 的值,如果你不设置它,缺省是 127。

自动打包(auto boxing)过程中发生的事情是:除非显式的创建:比如 foo = new Integer(42) ,否则 foo 和 bar 都是从缓存中取出的整数,当比较值时,它们会返回 true。正确的比较Integer的方式是使用 .equals 。

6. 在Java里:

try {
    return true;
} finally {
    return false;
}

在Python和JavaScript也可以这样写。这样写的结果是什么?当作一个保留的问题考考大家吧

7. C++的模板可以做很多奇怪的事情,最好的例证是 “多维模拟排版”,你可以用模板来计算“画出的”形状。下面是一段计算一个3×3矩形的有效的C++代码:

#include"analogliterals.hpp"
using namespace analog_literals::symbols;

          unsigned int c = ( o-----o
                             |     !
                             !     !
                             !     !
                             o-----o ).area;

这还有一个3D立方体的例子:

  assert( ( o-------------o
            |L             \
            | L             \
            |  L             \
            |   o-------------o
            |   !             !
            !   !             !
            o   |             !
             L  |             !
              L |             !
               L|             !
                o-------------o ).volume == ( o-------------o
                                              |             !
                                              !             !
                                              !             !
                                              o-------------o ).area * int(I-------------I) );

8. PHP处理数字字符

"01a4" != "001a4"

如果两个字符串来的字符数不相等,它们不可能相等。前面的零非常重要,因为他们是字符而不是数字。

"01e4" == "001e4"

PHP不太喜欢字符,它会寻找任何的借口来把你提供的值当作数字。把这些十六进制的字符串稍微做些改动,PHP马上认为它们不再是字符,而是数字。它们是按科学计数法写的数字(PHP并不在意你是否用了引号),它们是相等的,因为对于数字来说,前面的零是可以忽略的。更强化这个事实的例子是,你会发现PHP认为 “01e4″ == “10000″ 是正确的,因为作为数字,它们的值是相当的。这是一个被特别提醒的语言特征,原因就是它不太合理。

9. 在一些没有保留字、关键字的语言里,例如PL/I, 你可以写出这样有趣而且合法的代码语句:

IF IF THEN THEN = ELSE ELSE ELSE = THEN

(IF, THEN, ELSE 都是变量名),或

IF IF THEN THEN ELSE ELSE

(IF 是变量,THEN 和 ELSE 都是函数)

10. JavaScript里八进制的转换:

void duff_memcpy( char* to, char* from, size_t count ) {
    size_t n = (count+7)/8;
    switch( count%8 ) {
    case 0: do{ *to++ = *from++;
    case 7:     *to++ = *from++;
    case 6:     *to++ = *from++;
    case 5:     *to++ = *from++;
    case 4:     *to++ = *from++;
    case 3:     *to++ = *from++;
    case 2:     *to++ = *from++;
    case 1:     *to++ = *from++;
            }while(--n>0);
    }
}

12. 在Python中:

>>> x=5
>>> 1>> 1

13. 在Java中:

int[] numbers() {
  return null;
}

可以被写成:

int numbers() [] {
  return null;
}

如果你觉得还没看够,请到这里,还有更多。

———————————–

摘自:http://www.aqee.net/strangest-language-feature/

国外最受欢迎的30款免费工具

免费通信工具

随着时代的发展,各种辅助工具迅速发展,使我们日常生活发生了翻天覆地的变化,工作中我们更有效率,生活中我们更方便快捷。在国外,免费工具和开源软件发展迅猛,在工作生活方面应用广泛,下面我们来看一下国外最受欢迎的开源软件和免费工具都有什么,也许对于您会有帮助。

基于Web的免费通信工具和开源软件

1. Gmail

Gmail是谷歌在线电子邮件(Web邮件)服务。可以免费注册电子邮件账户进行访问,其主要提供包括存储,搜索,内置聊天,移动接入,语音聊天,垃圾邮件过滤器等很多实用功能。而且谷歌一直在不断的推出新的功能和Gmail服务。

2. Meebo

Meebo是网上沟通渠道和平台相结合的一个单一的服务。通过Web浏览器在Meebo内的Messenger列表可让您访问所有主要的网络(AIM,雅虎,Windows Live Messenger中的Google Talk,ICQ,Jabber)。

3. Opera邮件

Opera邮件是一个免费的内置到Web浏览器的电子邮件客户端。 Opera可以提供邮件组织,索引和邮件进行排序等功能。它还集成了RSS feeds和一个不错的垃圾邮件过滤功能。

4. Thunderbird3.1

Thunderbird3.1是免费的可定制消息的电子邮件客户端。Thunderbird能帮助个人管理在线通信,包括电子邮件,即时通讯和社交信息。Thunderbird支持Windows,Mac OS X和Linux系统。

 

事物、文档管理工具

基于Web的免费开放源码的协同调度工具

5. GanttProject

国外学生用的最多的开源软件。

GanttProject是一个开放源码的项目调度和管理的工具。该软件可用于人们之间沟通交流。 GanttProject支持Windows,Mac OS X和Linux系统。

6. TimetoMeet

TimetoMeet是一个基于网络的调度工具,用户之间可以约定一个时间与他人见面讨论工作或项目。 TimeToMeet可以通过Outlook,iCal自动同步您的日历行程和约会地点。

7. EditGrid

EditGrid在线电子表格服务,提供了许多跟Excel相同的功能。 EditGrid允许你将你的电子表格共享协同并且发布放到网上。

8.谷歌Docs

谷歌Docs是一个基于Web的免费软件,可以用软件处理文件,电子表格,演示文稿,图纸。还可以从您的桌面上传文件,让朋友从互联网上访问文件。

9. PDFCreator

PDFCreator是一个开源的程序,在任何Windows程序中都可以创建的PDF文件。该软件可以通过Windows应用程序的打印机打印。

10. ZOHO Writer

ZOHO Writer是一个在线文字处理器,可以随时在协作组内创建文件。 Zoho还支持更新到博客功能,也可以将谷歌文档或者网上的文件下载到桌面上。

 

幻灯片演示工具

基于Web的免费的开源的幻灯片演示工具

11.嵌入式Google文档

嵌入式Google文档,您可以创建幻灯片。还可以添加文本,图像,视频,它能够更直接地为您演示幻灯片,Google文档支持包括PPT在内的所有文件格式。

12.Zoho Show 2.0

Zoho Show 2.0是一个在线创建演示文稿工具。 Zoho的显示提供了主题,剪贴画,加上能够拖拽和拖放等功能,是一个非常简单的应用程序。

 

基于Web的免费的开源的任务和时间管理工具

13.谷歌日历

谷歌日历是一个可以帮助你发送邀请,跟踪回函的桌面应用程序,如与Microsoft Outlook,苹果iCal和Mozilla的Sunbird同步。

14.Remember The Milk

Remember The Milk是一个可以在线帮助管理任务的免费的网络服务。Remember The Milk可以创建和管理任务,设置截止日期,还可以通过电子邮件或Instant Messenger设置提醒。也可以创建列表和共享,向其他联系人发送和发布任务。

 

数学建模工具

基于Web的免费开放源码的数学建模工具

15. GNU Octave

GNU Octave是一个开源的用于数值计算的高层次的解释语言。它提供了线性和非线性问题的数值解,并执行其他数值实验的能力。GNU的倍频提供了大量的图形 数据可视化的操纵能力。当前版本是3.4.0版本,一个倍频程的Windows二进制分发和一个八度的二进制分发为Sun系统做出做出了巨大贡献,它是适 用于Linux,Mac OS X和其他项目。

16.Graphing Calculator from e-Tutor

Graphing Calculator from e-Tutor是一个在线的Web工具,可以进入X功能,使用一个标准的数学格式。在网站上可以使用图形计算器。

17. Mathway

Mathway是一个解决计算问题的工具。 Mathway可以解决以下科目:包括基础数学,准代数,代数,三角,初等数学,微积分与统计。

18. Sage

Sage也是一个免费开源数学软件套件系统。软件是专为研究和教学工作用的。

 

共享软件

基于Web的免费开放源码的共享软件

19. NoteMesh

NoteMesh是一个免费的在线服务软件,允许在同一个群体的人彼此分享经验。它的工作原理是创建一个单独的群,用户可以编辑。可以自由发布自己的感受或分享经验。

20. WebNotes

WebNotes(精简版版本)是一个免费的在线服务,能在浏览器的网页上添加注释,该操作自动保存,再次访问时候将直接访问该页面。重要的网页和PDF文件可以通过电子邮件,Twitter与他人共享。

 

免费文档工具

免费Web的文档工具

21. EasyBib

EasyBib是一个免费的网络工具,它提供自动的书的目录和参考文献。该服务允许您搜索并且建立书目,然后导出或打印。

22.谷歌应用

谷歌应用是一个多功能地服务。搜索引擎可以帮助你找到参考文章,也可以作为一个计算器,定义取景器,还可以当转换工具来用。

23.谷歌新闻搜索

谷歌新闻搜索(存档搜索选项),是一个很好的研究历史或时事的工具。

24. Bookfinder

Bookfinder是一个基于搜索的网络资源,可以以最优惠的价格找到新的或用过的图书。

25.SparkNotes

SparkNotes是一个Web资源工具呢,旨在帮助解决书中遇到的问题和论文的写法等问题。

26.SpellJax

SpellJax是一个检查的工具。可以帮助你对文字(或粘贴)进行拼写检查。

27.Webopedia

Webopedia是一个免费的在线搜索计算机、互联网等技术定义的数据库。

 

开源电子学习平台

教育工作者的开源电子学习平台

28.Claroline

Claroline是一个开源电子学习和电子工作平台,能建立网上课程和管理Web上的学习和工作。该软件包是基于PHP /MySQL的,并已被翻译成35种语言。它适用于Windows,Unix,Linux和Mac OS X操作系统。

29.Dokeos

Dokeos在线学习套装软件。它是开源的,并提供免费下载。该平台提提供很多功能:包括多媒体,创建测试,论坛,会议和视频会议。

30.Sakai

Sakai是一个基于Java的电子学习平台,提供网上教学,学习,研究和教育所需的所有工具。那些想测试自己的硬件和操作系统的人可以下载并安装一个已编译的二进制工具进行测试。

——————————————————-

摘自:http://os.51cto.com/art/201111/304882.htm。具体每一工具,google其名便可。

互联网的天生本质

互联网,即广域网、局域网及单机按照一定的通信协议组成的国际计算机网络。从互联网用户的角度来总结互联网的天生本质,最主要有以下几点:

(1)开放与共享。信息和资源在互联网上具备开放性和共享性,这是互联网最根本的精神和特性。海量信息和资源在网络上互通互连,在所有的互联网用户之间相互开发和分享,如网站中的个人主页、网络硬盘、留言板、相册、论坛或博客中的资讯、文字、图片、视频、软件等内容,当然还包括人类以这些内容为载体所传承的知识、思想和价值。

(2)自由与平等。全球、全国网民参与、对接,包括信息获得、内容发布、业务交流、建立圈子等,在互联网的自由、平等的空间中,大家欢迎每一份真诚的交流,容纳每一份不伤害别人的个性,保护每一种渴望成功的愿望,现实生活中的权威、荣耀、等级,在Internet上被平等成一样的ID(IDentity,身份标识号码,互联网中的账号)。

(3)互动与虚拟。在互联网上,在平等的ID背后,没人知道电脑那边的会是谁。人不可能一世独立,每个人都很脆弱,人与人之间都需要交流互动,相信每一份成功都需要喝彩,相信每一次失败都需要告慰。互联网的互动与虚拟性也是互联网发展最突出的两大特性,很明显地表现在1M即时通信和网络游戏这两项在互联网经济占了很大比例的应用中。

通过以上这些站在用户角度去理解的互联网本性,我们逐渐清楚地看到,用户才是真正的上帝。中国互联网和国外同行,都是在为各自的网民服务。网民需求才是真正主导互联网发展走向的力量。创新是鱼,消费者是水,有多大的水池,就能养多大的鱼。

以上摘自《互联网之达芬奇密码》一书。

PHP的扩展

http://tech.qq.com/a/20110512/000301.htm (对其进行一些概括)

1 什么是PHP扩展化?

PHP本身是用C语言写的,你所编写的PHP脚本到最后都是通过C代码执行的,这时候PHP还提供一种方式可以直接写用C来写一个共享库,动态的共享库, 把它加载到PHP中,通过这种方式让你业务模式以C模式存在在PHP当中,这个模式就叫扩展,PHP提供一个很强大模块来支持你自己PHP扩展。

2 什么样的情况下我们应该使用扩展?

两种方式是需要扩展,1)第一种方式我们有一些,比方说已经成熟的C库,我们PHP许多办法直接用,我必须用一个扩展把它桥接过来,这种情况下需要使用PHP扩展;2)还有一种情况我对CPU密集型的东西,比方说我有一个算法,或者我有一个很复杂,很复杂的加密算法。这个算法如果我用PHP写的话非常慢,对于这种CPU密集型的东西,我是可以把它扩展化用C来实现,这样的话能提高性能。

3 扩展为什么会快?

这里我要提一下FaceBook极致,去年11月份极致把一个应用性能提高到4倍,他是怎么做到的呢?我们大家听各种各样报告,是把PHP编译成C++, 他这个编译其实不是说我根据你的逻辑找到对应的C代码进行编辑,他做的更多是把这个符号解析给拿掉了。我们在PHP里面,我们的变量,我们的函数都是存储 在一个一个关联数字结构里面,他这个结构设计足够精妙,确实也花很大心思去设计,但是当我们使用一个变量,或者一个方式的时候,都需要从这个表里面去查 的,这个过程是非常耗时的。

所以,PHP性能绝大部分低也是这个关键。PHP就把能在编译期间确定的符号就把它直接替换掉,相当于我们C程序编译的时候把符号直接换成二进制地址的一 样,就是一个符号回天。这只是一方面,还有一方面为什么扩展会比PHP快?这个我们抛开一切问题,一切IO,抛开一切内存存储我们来算一个简单算术题,一 个1G赫兹CPU能编织多少,这也是PHP比较慢一个原因。

淘宝李晓拴:淘宝网PHP电子商务应用

大家好,大家知道淘宝搜索是一个典型PHP架构。在座同学不知道有多少人使用过淘宝搜索可以举手示意一下?在开始这个话题之前我们先谈一下Polyglot,多语言混合编程,淘宝有很多系统是利用Java来开发的。淘宝大概有上千名Java工程师,也做了非常多Java工作,我们为什么还要选择PHP呢?一方面来讲我们利用一些外部动态,PHP开发效率更高一些,另外我们技术熟练程度。

所以,也有应了那句话“没有最好,只有最适合”。其实我们发现不管是任何语言来讲,Java也好,PHP也好和C也好,我们会利用Java做一些接口,利用PHP来写一些VO的功能,同时也会利用C写一些PHP扩展。接下来进入我们今天第一个话题,搜索产品介绍。正如大家所看到一样,这个就是我们淘宝搜索首页,非常简单一个搜索框一个搜索按纽,下面是一些热门关健词,当你搜索之后就会进入我们搜索结果页,看上去有点复杂。只要大家用过淘宝,基本上大家都可能进入这样一个页面。

今天主要内容就是讲解这个页面,还有其他搜索产品,一淘,是淘宝面向站外用户推出电子商务搜索引擎,这是一淘的首页,和淘宝搜索其他产品一样,也是标准的LAMP架构。接下来一个产品是我们的排行榜,和前面有一些差别,使用NGS来做,排行榜有非常多静态内容,我们在服务器选题上采用了NGS。

接下来我来讲一讲淘宝搜索整体架构,讲架构之前,可能会讲一下共同模块,这样大家对理解架构更加容易。首先,看一下网络,这张图其实是一个非常简单的落说明图,用户访问搜索域名,会根据用户IP定位到不同机房,比如有电信机房,网通机房,和教育网。为什么有三个机房呢?第一是有中国特殊国情决定的,第二也是为了容灾,每个机房大概都有几十台机器。淘宝搜索每天流量也在每天几亿,我们每个机房部署几十台机器来控制流量。

这些机器主要来请求PHP,页面还有很多资源文件,像CSC,还有图片,这是部署在我们CDN上。每台机器普通64位Linux系统,安装是阿帕奇,没有用5.3,因为我们一些扩展可能也是历史原因,一些扩展目前还不能迁移到5.3上,这也是我们接下来要做的工作。这个是放大搜索结果页,大家可以看到图上整个页面大概分了几个区域。最上面是搜索框,比如说有LOGO,有搜索框,再下面有一些导航条,中间这个区域我们把它叫做智能导航模块,右侧叫做掌柜推荐,大家可以理解为广告。

这个其实是所有搜索结果页基本都比较类似的,不管大家用Google也好,百度也好,或者其他MSN都非常类似,上面搜索框做搜索结果,右侧是广告。因为淘宝搜索页大概有3到4屏,这页主要是搜索相关一些筛选功能,比如上面看到有不同的筛选区,下面有不同结果,只不过大家没有特别留意。上面那个区我们叫做产品搜索区域,中间这个区域叫做商品搜索区域,在往下是其他一些文字链之类,最下面是翻页。

有些细节大家可能不太好理解,打个比方。大家去Google搜索的时候,当你搜索北京天气的时候,或者搜索北京奥运会的时候,搜索结果页里面有非常多的内容,比如有新闻的,有网页,甚至还有论坛的。不同的来源,其实有不同的后端服务提供的,怎么样在搜索结果页里面把它展现出来,这其实就是一个问题,是我们问题和挑战。

这里面有两个核心问题,第一个来讲,对于查询应该展示哪些模块,并不是每次搜索的时候都要出产品搜索结果。第二个问题,如果你要查询多个模块的时候,怎么样保证高性能,让用户看到快速的搜索结果。试想一下,我们这个结果我们回到上一页,这个页面里面其实是要查非常多服务,中间智能导航就是有很多服务,下面有一个相关搜索模块,包括右侧广告,和下一页产品搜索结果,商品搜索结果,这样算下来这个页面要查5到6个业务模块。

所以,怎么样查询多个模块的时候,能够保持高的性能,让用户快速看到搜索结果。带着这些问题,我们来看一下它的架构。这张架构其实也是非常简单图,首先用户可以进入我们一些入口程序,相当于搜索一个非常简单的教研程序看看是不是合法和编码。这些工作做完之后,会把用户搜索词,用户搜索诺基亚,搜索凉鞋等等词分配到解析,对于搜索来说理解用户意图非常重要,可以知道用户想要找什么,要找的这个东西,应该在哪个内幕下,或者有哪些属性。

所以,我们会去调来这个模块获取用户相关信息,查取相关内容。我们知道核心一个问题,应该展示哪些模块,同时对这个结果,应该怎么去展示。在这个时候,我们会去请求缓存模块,因为像我们刚才讲的一样,他其实有5、6个后台请求模块,我们会去看看缓存有没有命中,如果命中缓存问题就非常简单,直接把这个数据从缓存拿出来一组装,通过这个模板来做一切展示。

如果没有命中缓存的话,我们会有一个专门检索模块,会根据你需要的数据,必须你需要六个模块,根据六个模块去请求后台一些服务,在这里面是并发来做的,如何实现会在接下来讲。所以,通过这样一个架构,能够实现查询内容,以及能够并发去获取相关数据。接下来,讲一下性能优化,因为对搜索来讲,性能方面是非常关注。

这张图是09年Google合并的一些相关研究人员,他们通过一些实验对比来发现,性能对于搜索影响。当这个网站速度下降几秒之后,他们会发现用户点击,用户收入,相关广告收入,用户的满意度都会有非常明显下降。其实,性能来讲,这个话题这几年也变的逐渐非常热门起来,不管是从06年雅虎提出一些相关APP Store,或者前端优化十几跳军规,一直到去年这里面领军人物史蒂夫提出一个WTO概念,做性能优化已经可以做成一个产业。

所以,更好性能意味着更低的成本,更高收入,以及更好的用户体验。所以,我们在性能优化方面也做了非常多的工作。这些工作整理起来,我们可以把它归纳为性能规划CPP的原则,第一条就是Cache,缓存。做这种网站缓存非常重要,甚至有时候是非常关键一点。缓存我们通常使用两个方式,第一就是APC,如果大家做PHP可能对APC都比较了解。第二点就是Memcached,我们使用了一些缓存。

再下面一点就是并发,PHP并没有多线程概念。这里面我们利用一些技术,可以并发去访问后台一些接口。第三点就是预期,其实做性能也好,类似于优化也好,有时候你不能达到足够快,至少也要让这个网站看上去比较快,我们把它叫做预期。其实简单做法,让这个网站能够支持这种类似于分化输出,当用户搜索完了之后,你可以让你的网站,搜索框先出来,再去查后台模块,最后在展示最下面的内容。

这张图就是关于Cache一个介绍,比如APC。提供一些APC类似于Opcode的软件也好,我们选择的是APC。从这张图上可以看到,使用APC以后,能够大幅优化PHP代码解释时间,我们之前也做过一些性能对比,用过APC之后能够把性能提升25%-40%左右。对于APC还有很深入话题,比如APC里面有一些参数,有兴趣的同学可以上网查一下,也可以跟我交流。

这张图是一个Memcached的事例,基本原理就是Check,Miss,Store,Check是第一步,当你最开始访问这个模块是没有,如果开始没有,就会去到后台计算相关数据,比如去查数据库,去请求远程接口。当拿到结果之后,会把这个数据存储到Cache里面去,并且把这个结果反映给输出,你第二次来的时候就命中Cache,所以Cache直接输出结果了。

对于Memcached来讲是一个非常成熟技术,我们用Memcached大概有几十台机器,每台机器开了几个G来做,大概有几百个G,是一个独立的Cache集群。因为我们是多个模块,当你去请求Cache,可以查一下有没有命中,如果没有命中可以请求后台,你可以一次性向Memcached发请求,一次性把请求发过去看有没有命中,他会告诉你有几个模块命中有几个模块没有命中,我们在去查后端,可以减少Memcached的请求。

下面和大家分享一下并发,PHP其实不支持多线程。如果说要串行访问多个后台缺口会非常严重影响性能,做一个简单计算,刚才所讲一样,如果有5个后台模块。每个模块访问需要50毫秒,5×5就是250毫秒,对做搜索来讲其实是非常慢了。所以,如果串行访问后台接口会非常慢。我们解决方案是使用CURL和Multi功能,下面列了一些相关函数,大家可以在下面去查查手册可以看一下,这里面还有更详细的一个文章来介绍。

基本原理利用提供封装功能一次性把请求发出去,等着响应拿到结果进行处理。按照优化原则,80%优化都集中在前端。前端我们做了一些尝试,比如我们了CDN Combo,合并HTTP请求。比如我们这个页面需要用5个页面表,我们可以对请求进行合并,减少请求优化性能。同时,按照最常规做法就是压缩CSS/JS文件,压缩完之后尺寸可以大大减少,提高加载速度。

还有一些做法,我们在首页预先加载结果页所需部分文件,用户要做的事情通常是搜索。在首页可以预先加载所需要的CSS和JS文件,在首页进行一个平衡,据我了解Google很多网站都是这么做的。还有图片的Lazy-Load,相当于业界一个标准做法,像搜索结果页大概有40张图片,大多数情况下来讲,用户可能只会看前面几张图片,如果满意就点走了,如果不满意会做一些搜索和其他筛选。接下来你屏幕以下非常多的图片就有点浪费了,如果用户不看的话,所以我们就采用Lazy-Load,当用户滚屏的时候可以大幅度提高性能,降低带宽。

接下来给大家讲一下监控报警,每天几百台机器监控报警也是非常重要的。这张图是截取在我们公司里面一个哈勃监控系统,我们通常统计了命中率,统计了一些数据在这里面进行分析,具体实现大概是这样的。我们的程序是有日志,比如有统计PV,超时数据,如果一旦访问后台结果超时的时候会在日志里面做记录。还有Latency,如果发现一些问题,我们定一些规则,比如超时时数达到多少,或者PV变化,就会发短信进行报警。

同时,我们刚才讲了我们有非常多的memcached-top来作为缓存,所以我们使用memcached脚本监控memcached集群运行情况。我们使用xhprof采样获得线上程序运行情况,有点类似与PHP。由于时间关系,今天我要讲的内容基本上就这些,其实淘宝搜索他的内容非常多,刚才也只是讲到一些点,感兴趣的同学可以会后跟我联系。我们也在招一些PHP工程师,我们也非常希望大家能够加入我们,和我们一起来做下一代的淘宝搜索。我的联系方式是jiansu@taobao.com,还可以访问我们的微博,感谢大家。

Web是开源最大的成功

  开源运动广受欢迎,并且在软件开发史上写下了浓重一笔。但是它影响最深远的地方在哪呢?有史以来,最成功的开源“项目”又是什么呢?

  事实上,总体来看,Web不就是开源运动最大的成功么?

  可能最有名的例子就是隐藏域众多网站背后的LAMP,也就是Linux、Apache、MySQL和PHP。但当你仔细考虑后,你会发现更多。

  下面列出了Web得以运转的一些开源项目。

  Web browsers -网络浏览器

  在网络浏览器市场中,虽然微软的封闭源码软件IE浏览器仍然占有很大的份额,但其它功能相似的开源项目已经流行起来,并在不断壮大。像Mozilla公司的Firefox浏览器(它是开源的,还有Flock、PaleMoon)。还有增长迅速的基于Webkit的浏览器,像Safari,但最著名的是Chrome浏览器。

  如果把手机网络也算到这里面,其中Webkit主宰着iPhone、Android和Blackberry手机中的浏览器。

  Web server software – Web服务器软件

  迄今为止,Apache是使用范围最广的网络服务器软件,它是开源的,但是一个叫做Nginx的轻量级服务器软件在最近几年开始流行起来。事实上,三大顶级网络服务器软件中有两个是开源的(排名第二的微软的IIS是例外,但其距离第一相差甚远)。

  另外,大量服务器端底层软件也是开源的。例如,很多大流量网站使用Varnish作为与网站访问者之间的缓存层,而使用Memcached作为与网站数据库之间的缓存层。这只是众多例子中的两个。

  Scripting languages and web frameworks -脚本语言和Web框架

  网络上使用的大部分编程和脚本语言都是开源的,比如PHP、Perl、Python、Ruby等。

  但是,很少有网站完完全全是从零开始。毫不夸张的说,有成百上千的开源内容管理系统(CMS)和网络框架来协助开发人员,例如WordPress、Drupal、Ruby on Rails、Django、Joomla等。

  Databases -数据库

  开源软件MySQL是目前为止最流行的网站数据库,但还有其它功能相似的开源软件,比如PostgreSQL,更不用说近来出现的众多“非关系型(NoSQL)”数据库。

  既然我们说到了底层软件,那就不得不提一下每次我们使用互联网或因特网上的任何东西时都要依靠的基础系统:

  DNS -域名解析系统

  Web(就此而言是整个因特网)离开了域名解析系统就一无是处。大家都知道,域名解析系统可以让用户使用像example.com之类的域名,而不是IP地址。BIND几乎是DNS服务器(亦称名称服务器)软件的实际标准,并且,你现在可能已经猜到了,它是开源的。

  Server operating systems -服务器操作系统

  所有网站都必须在服务器上运行,而那也是开源的统治领域。虽然Windows统治着桌面领域,但是网站赖以运行的服务器大部分采用开源的Linux操作系统,其他比较流行的选择是freeBSD和OpenBSD。

  开源的诱惑

  由于在许多情况下,开源软件能够提供与商业的封闭源码软件相同的性能,并且又是免费的,所以开源软件如此流行并不奇怪。免费是一个难以挑战的价格。

  假如Web不是运行在所有这些免费软件上,那么它很可能需要一段艰苦的过程,才能让人们广泛接受。

  注意我们并没说过Web中没有任何封闭源码软件,而那显然是存在的。但是,从统计数据看,Web开源统治领域中真正的例外是微软的基于Windows系列系统。

  除了那个,你通常需要深入研究才能发现更多私有封闭源码技术,像路由器和类似设备上的操作系统。但那是因特网,而不是Web。

  结束语

  多亏了80年代因特网、便捷通讯以及合作与共享的兴起,开源运动才得以蓬勃发展。在90年代,当Web诞生于顶层因特网设备时,开源运动已经准备好助其一臂之力了。

  没有人会否认开源统治着Web的大部分。开源和Web是一个合作共生的关系,互利互惠,合作共赢。这就是为什么我们认为Web可以说是迄今为止是开源最大的成功。(我们并没有否定Tim Berners-Lee的意思。注:Tim Berners-Lee,万维网之父、第一位站长,参见《互联网历史上15个划时代的“第一”》)
  译文出处:伯乐在线- 职场博客
  译文链接:http://www.jobbole.com/entry.php/498

  原文作者:Pingdom  编译:伯乐在线 敏捷翻译组- 朱勇

在Win32下仿真UNIX的API的软件

如果想在window平台下学学Unix shell的命令,如tar, gzip或者grep等等,在VMware里,却不能实际操作window的文件等,cygwin/x 可帮到您(当然,还有好多命令还是不允许的,不过还是凑合使用 🙂 )。

在cygwin/x的官方网站有很详细的文档,教你如何安装和使用等。

Try it now

Web 开发与设计语言大盘点

下文是我复制到word里,原文地址忘记了,非常抱歉:

在这个 Web 的时代,与 Web相关的开发技术持续热门,从前端到后端,从标记语言到开发语言,各种技术交相辉映,沉沉浮浮,作为开发者,尤其是初级开发者,如何选择几门适合自己的开发语言尤为重要。本文是对所有 Web 相关开发语言的一次盘点,并指出其中最有前途的开发与设计语言。

无穷尽的选择

在 Web 开发与设计领域,我们有太多的选择,HTML 还是 XHTML, RSS 还是 Atom, PHP 还是 ASP.NET,SVG 还是 VML, JavaScript 还是VBS?这样的对决还可以列出很多,然而,它们往往没有固定答案,取决于个人嗜好,在你对各种语言和技术彻底了解之前,你自己也未必有任何清晰的想法。

如何选择?

答案是,取决于具体情况。不仅要看站点的类型,还要看你希望涉足的技术深度。本文会将 Web 相关的各种开发与设计语言,按不同的类别进行展示,并注明其复杂程度,流程程度以及浏览器支持程度。值得庆幸的是,任何一门 Web  语言都有很好的文档可以参考。

Web 开发与设计语言的层级

Web语言按层级分,传统上是这样分的,标记层(HTML),修饰层(CSS),客户端脚本层(JavaScript),服务器端(PHP,ASP.NET)。如果按功用分,参看上图,我们可以将它们分为15层,每个层级代表一种功用,比如用户交互,矢量图等等等。当然,并不是所有用户都需要全部掌握这些不同层级的语言。

标记语言

最常用的 Web 标记语言有四种。

Web聚合语言

最常用的 Web 聚合语言有 Atom 和 RSS 两种。

  • Atom
  • RSS
  • Others: EventsML, GeoRSS, MRSS, NewsML, OPML, SportsML and XBEL

元数据定义语言

常见的元数据定义语言有5种。

式样表与转换语言

常见的有2种。

  • CSS
  • XSL
  • Others: DSSSL and JSSS (Deprecated)

客户端脚本

这些脚本语言多数和 JavaScript 有关联。

服务器端开发语言

可选的余地很大。

数据库语言

有4种常见数据库脚本语言。

插件

这些插件运行在浏览器的沙盒环境中。

服务器端配置语言

用于访问管理,服务器端配置,搜索引擎引导等。

RIA – 富 Internet 应用

这些技术可以实现桌面化的 Web。

矢量建模语言

常见的 2D 和 3D 建模与渲染语言有 5 种。

PostScript 语言

  • PDF
  • XPS
  • Others: FlashPaper and OpenXML

数据格式化语言

文档纲要语言

  • DTD
  • XSD
  • Others: DSD, RelaxNG and Schema XML

对于初学入门者,建议遵照下图进行学习,不管如何选择,HTML 是最重要的开端。

原文译者注:

HTML + CSS + JS 是前段开发必须掌握的三种语言,这毫无争议,即时有,也只是 XHTML 和 HTML之争,而二者的争议也只限于对语言的严格程度上。PHP 和 MySQL 属于服务器端的开发语言,服务器端的开发语言有更广泛的选项,除了 PHP, MySQL,还有  ASP.NET,MS SQL,JSP,Ruby 都是可以考虑的选项,关键看你的项目要求。