竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


285月/140

玩小游戏 《2048》 的一些感想心得

发布在 邵珠庆

最近走在上下班的路上看到很多人都在玩2048的一个游戏,我也尝试下载玩了几天,有些感悟跟大家分享一下。

 

2048游戏规则我就不多说了,安装下载拿到手划拉几下就知道怎么玩了,进入游戏基本没有什么学习成本。

十六个格子,2+2=4,4+4=8,8+8=16… 似乎和消除类游戏一样。

游戏说明:

1、游戏中的多米诺骨牌效应,包含了周易的博大思想,所谓一生二二生三三生万物,就是这个道理。

2、相同数字可以相加,包含了物以类聚人以群分思想。

3、小小十六格子,就象征了资源的有限性。

4、每次随机出现的数字2或者4就是新生事物,或者说是机遇,或者说是不稳定因素,如何妥善安排这些资源则是能否长久发展的关键。

5、只有通过不断的整合资源升级改造,让数字不停流动起来,才能发展壮大获取更多分数,如果数字流动不起来基本就玩完了。

6、总是想着把相同的数并起来,没有一个规划,搞得我不知道怎么游戏就这样结束了。后来慢慢明白,就是一个金字塔,一定要有一个目标,从小到大慢慢的合并数字。

7、做事情的时候多动脑,先思考再行动,不要盲目的去做事情,思路清晰方法正确剩下就是时间问题。

 

游戏感悟:

人不要贪心,目标要专一,一步步走好,不要太着急,目标总会实现。

1、基本素质:一定要有耐心,淡定的平常心。

2、游戏原则:数字按顺序紧邻排列,以大数字所在的一行为主要移动方向,分清主次。

3、战略布局:首先保证最大数字和第二大数字所在在的那一列/行是满的。

4、排兵布阵:最大的数字尽量放在角落,在中间会影响较小数字的发展空间。

5、关键角色:注意活动较大数“32”以上,旁边要有相近的数。

6、方向目标:最高单格子分数65536,理论游戏最高得分3932160,越往后得分越高,敢挑战下去会发现自己的潜力无限。

7、2048是个游戏,完蛋了还可以从新开始,人生不行…

8、好像经历了生命中一次奇特的旅行

 

 

GitHub开源2048代码:

https://github.com/gabrielecirulli/2048 

 

就像地球就这么大,但是社会要往前发展,技术的革新,意识形态的发展,社会组织形式的进步,所有的一切都不是凭空出现的,都是需要一定的社会积累,就是所谓的物质和科技的积累。关键的是,这样的积累必须是规则有序的,体现在现实社会中就是,个体必须服从约束。总共16格子,如果混乱无序,容纳不了多少数据就会相互堵塞,当再也容纳不了一个新数字的诞生,也就代表了这个游戏的结束。

如果把自己看做其中的一个数字,就会得到如下的情形:你随机出现在一个位置,可能是2可能是4,这就代表了你的出身,有人出生名门贵族(位置优势可以跟附近的数字组合),有人出身贫寒(位置不利于自己发展),有人天赋聪颖(数字4),有人稍显愚钝(数字2)。生命中充满了冒险,只有不断跟自己相同的数字去接近,融合然后发展成为更大的自己,然后接近更大的数字,得到更大的发展……

有句话叫“谋事在人,成事在天”大概就是说的是这个意思吧。。。在你足够努力,谨慎,拼搏,机敏过后,在你充分的发挥了你的天赋过后。。。可能冥冥之中,真的有一只手在帮助你达到你可以达到的高度。。。真的有一个雅典娜(女神)在控制着你的小宇宙。。。你能达到的最终高度,真的不是你决定的。。。当然,只是很多人(包括我自己)还远远没有达到需要拼天赋的时候,因为我们都不够努力。。。

 

285月/140

大数据行业生态图谱3.0–信息图

发布在 邵珠庆

big-data-landscape-v3-2013

点击上图,即可打开大图

2012年,FirstMark资本的MattTurck绘制了大数据生态地图2.0版本,涵盖了大数据的38种商业模式,被业界奉为大数据创业投资的清明上河图。两年后的今天,经过漫长的等待,Turck终于推出大数据生态地图3.0版本。(期间bloomberg推出过一个2013版大数据生态地图)

在大数据生态地图3.0版中,Turck从一个风险投资者的角度对两年来大数据市场的最新发展进行了深入的研判,并对未来趋势进行解读,以下是Turck眼中大数据市场的几个最为关键的演变趋势:

竞争加剧:创业者们纷纷涌入大数据市场,尾随的VC们也是挥金如土,导致大数据创业市场目前已经非常拥挤。例如一些创业项目类别,例如数据库(无论是NoSQL还是NewSQL),或者社交媒体分析,目前正面临整合或去泡沫化(随着Twitter收购BlueFin和GNIP,社交分析领域的整合已经开始)

虽然大数据创业市场已经人山人海,但是依然有足够的空间给新的创业公司,现阶段大数据基础设施和分析工具领域的创新吸引了大量的资金,当然,这类大数据创业本来就是资金密集型项目。

大数据市场尚处于初期阶段:虽然大数据的概念已经热炒了数年,但我们依然处于市场的早期阶段,虽然过去几年类似Drawn和Scale这样的公司失败了,但是相当多的公司已经看到了胜利的曙光,例如Infochimps、Causata、Streambase、ParAccel、Aspera、GNIP、BlueFinLanbs、BlueKai等。

还有不少大数据创业公司已经形成规模和气候,并且获得了海量融资,例如MongoDB已经募集2.3亿美元,Plalantir9亿,Cloudera1亿。但是就成功的IPO或公司而言,市场尚处于早期阶段(虽然已经有Splunk、Tableau等成功IPO)。

此外,目前阶段一些传统IT巨头已经展开了收购大战,例如Oracle收购BlueKai和IBM收购Cloudant。在很多大数据创业领域,创业公司们依然在为市场领袖的地位展开混战。

从炒作回归现实:虽然经过几年声嘶力竭的热潮后,媒体对大数据已经有些审美疲劳,但这恰恰是大数据真正落地的重要阶段的开始。未来几年是大数据市场竞争的关键时期,企业的大数据应用从概念验证和实验走向生产环境,这意味着大数据厂商的收入将快速增长。当然,这也是一个检验大数据是否真的有“大价值”的时期。

大数据基础设施:虽然Hadoop已经确立了其作为大数据生态系统基石的地位,但市场上依然有不少Hadoop的竞争和替代产品,但这些产品还需要时间进化。基于Hadoop分布式文件系统的开源框架Spark近来成为人们讨论的热门话题,因为Spark能够弥补Hadoop的短板,例如提高互动速度和更好的编程界面。而快数据(实时)和内存计算也始终是大数据领域最热门的话题。一些新的热点也在不断涌现,例如数据转换整理工具Trifacta、Paxata和DataTamer等。

时下一个关键的争论是企业数据是否会转移到云端(公有云或者私有云),如果是,什么时候会发生?一些基于云端的Hadoop服务创业公司例如Qubole、Mortar坚信从长远看所有企业数据最终都会转移到云端。

大数据分析工具:就创业者和VC的活跃度而言,大数据分析是大数据市场最活跃的领域。从电子表格到时间线动画再到3D可视化,大数据创业公司们提供了各种各样的分析工具和界面,有的面向数据科学家,有的选择绕过数据科学家直接面向业务部门,由于不同的企业对分析工具的类型有不同的偏好,因此每个创业公司在自己的细分领域都有机会。

大数据应用:大数据应用的发展进程相对缓慢,但目前阶段大数据确实已经进入了应用层。从大数据生态地图3.0中我们可以看到,一些创业公司开发出了大数据通用应用,例如大数据营销工具、CRM工具或防欺诈解决方案等。还有一些大数据创业公司开发出了面向行业用户的垂直应用。金融和广告行业是大数据应用起步最早的行业,甚至在大数据概念出现之前就已经开始了。未来大数据还将在更多行业得到广泛应用,例如医疗、生物科技(尤其是基因组学)和教育等。

205月/140

Google Analytics细分功能大升级:更强大更好用

发布在 邵珠庆

Justin Cutroni早在7月份就发布了博文介绍了升级后GA细分功能: http://cutroni.com/blog/2013/07/16/google-analytics-segmentation/。可以说这次细分功能的升级将是GA有史以来非常重要的一次升级。这些更新将在未来几个月内对所有使用者逐步开放。如果大家觉得GA有哪些地方不好用或是有一些新的需要,可以直接在Justin的博客后边发布你的意见或建议,通常他都会给你回复。

下边我们将从Justin的视角去了解一下更新后的细分功能:

细分功能可能是网站分析工具中最重要的功能。不细分,毋定死。这也充分说明了细分的重要性。通过使用升级后的Google Analytics细分功能,你可以创新性地对数据进行细分分析。

下边我们将具体看一下GA细分功能的升级点及其在网站或APP分析中的应用。

Google Analytics细分新功能:

这一次GA的细分功能和之前相比主要有以下三大方面的不同:

1.真正的用户细分 高级细分功能将支持真正的用户细分。这意味着Google Analytics将可以把访问一个网站或者使用一个应用程序的人群明确细分开来。这也意味着我们将可以进行群组分析(把在某个时间段内具有同一特征或同一行为的用户细分出来进行分析,比如,在一月份第一次访问过analyticskey.com网站的用户。注:这里把cohort译为群组,以方便理解,后期GA的官方中文说法可能会有些不同)。

要注意的是,因为用户细分的数据是需要后台实时处理的,这是一项较大的工作,为了保证数据可以快速显示,这里对用户细分是有一定的限度:你最多只能把用户细分应用于90天的时间范围内。

2.顺序过滤器 这同样是一项非常大的改进。现在,我们可以实现真正的用户细分,我们可以跟踪同一用户在多个会话中的行为。例如,你可以创建这样一个细分:点击了某个广告系列并在一段时间后购买了产品的用户。

3.界面升级 更整洁更符合操作逻辑的界面。一些高级用户可能认为界面过于简单化了,原来有的一些功能变得不太好找,但实际上原有的功能仍然保留了下来。新的界面将方便大家更容易创建和管理一些常用的细分。

升级的界面如下图所示。

NewUserSegment

新的Google Analytics细分功能界面

下边我们将深入了解一下新升级的细分功能。

了解用户细分、访问细分和Hit细分有什么不同

用户细分将返回所有与该用户相关的数据。这意味着这包含了该用户在你的时间框架中产生的所有访问数据。你可以针对用户、访问或Hit设置限制条件。

例如,我可以创建一个基于收入(Revenue)的用户细分,我想看到​​所有产生了500美元的收入的用户的数据。在这个条件设置里,收入(Revenue)这个指标的限制条件将应用于单个用户。

里边的某个用户可以在经过多次访问产生的收入才超过500美元,而另一个用户在一次访问中产生的收入就超过了500美元。这个细分会把这两类用户的数据都包含在一起,因为这批用户中每一个人产生的收入都超过了$500。

1A_UserSegment

基于用户而不是基于会话的分类来评估一个用户

访问细分将基本访问返回所有符合过滤条件的数据。这与现在存在的功能相同。

现在我们从访问的角度来看看同样一个例子。如果我们创建了一个基于访问的单次收入大于$500收入的访问细分,GA将匹配找到所有满足该条件的访问,并返回所有相关的数据。

1B_VisitSegment

在Google Analytics中,细分条件过虑是于于会话而不是基于访问的

最后,还有一类Hit级别的细分。这在某种程度上,也类似于我们今天所使用的Google Analytics。你可以设置一个Hit级别的条件,比如综合浏览量或事件,系统将会返回所有与这些浏览量或事件相关的访问的数据 - 而不只是返回那些符合条件的浏览量或事件数据。

创建简单的分类

现在我们大概知道了不同类型的细分之间的差异,下边让我们创建一些简单的分类。

导航的左侧部分提供了一个维度组的列表,你可以从中找到一些最常见的维度或指标。例如,在电子商务(Ecommerce)的组里,你可以找到下边这一些常见的维度(比如产品Product和产品类别Product Category)与指标(如收入Revenue)。

2_InterfaceDescription

创建GA细分界面

这里的每个指标或维度都是有相应的条件逻辑的。这与之前我们经常使用的高级细分的设置比较相似。另外这里还有一个地方要输入细分条件的值。

对于指标来说,你可以把条件选项应用于用户或会话。通过下拉菜单可进行选择。

我们要创建的是一个用户收入超过$500的细分。首先要把这个细分应用到用户级别,然后再设置合适的条件数值,在“收入”(Revenue)字段中输入500。

3_User500Segment

为每个过滤器输入一个值。

请注意,当添加一个条件时,在界面右侧将会有相应的汇总显示。

如果要在这个细分中添加额外的条件,需要进入到另一个维度组并添加条件。

比如要在这个细分中添加一个地理位置的条件,需要点击人口统计组(Demographics),创建一个条件:仅包括来自马萨诸塞州(Massachusetts)的访问。

4_MultipleFiltersInSegment

注意添加标注的地方表明这个细分包括了多个过滤器

现在创建好了用户细分群组是,来自马萨诸塞州并在网站上花费超过$500的用户。

我可以把这个细分应用于少于90天的时间范围内。

另一个要注意的事项是:使用选项链接(Option)你可以把这个细分应用到到任何其他的你常用的配置文件中。旧版的细分功能也有此选项。当然,如果不是很必要,可以仅应用于当前的配置文件。

5_ApplyToMultipleProfiles

你可以把创建的细分应用到多个配置文件

创建高级细分

现在,我们已经掌握了基本的细分创建方法,下边我们将了解一下较为复杂的高级细分如何设置。高级细分可用于创建包括多个用户条件、多个访问条件或者是用户条件与访问条件的组合条件的细分。

6_AdvancedSegments

同时把访问条件与用户条件都应用于一个高级细分

这种细分可以用于衡量在某一段较长的时间段内一个用户的一次访问的行为情况。例如,你想了解一下阅读了你的博客的访问行为是否会影响到一个用户的长期价值。

下边我们将建立这样一个细分。

首先,创建一个基于价值(Revenue)的用户过滤器。然后再添加一个访问过滤器以匹配浏览过博客内容的访次。

7_BlogReaderRevenueSEgment

同时把访问条件与用户条件都应用于细分中

这两个过滤器将分两个阶段进行应用。

首先,GA将基于用户过滤器(包括所有这些用户的访问)把这符合条件的用户过滤出来。

然后,GA将再从符合第一个条件(用户条件)过滤得到的数据中选择满足第二个条件(访问条件)的访问数据筛选出来。

这个非常简单的设置可用于回答这样的问题:“我的博客内容有助于推动更多的销售和收入吗?” 在过去这确实是这个不好回答的较为纠结的问题,现在终于有了一个相对完善的解决方案。

这将对于内容营销有极大的促进作用。用原文作者的话说,所有内容营销的粉丝都流口水了吧?

创建顺序细分

顺序细分(Sequence Segments)是GA新的细分工具的另一个高级功能。这里所说的顺序可以是基于不同的访次或是基于同一次访问。这非常类似于再营销功能中所使用的顺序细分。

顺序过滤器可以把按一次的先后顺序浏览了两个页面(不一定要是页面条件,详情可见下边的示例)的用户细分出来。这有些类似购物车中的两个步骤。

细分示例:有些用户进入了购物流程但并没有最终购买。它采用了一个页面条件来表示添加货品到购物车。因为没有达成购买,交易是在会话期间为零。

7A_SequenceFilter

GA可以把那些进入购买流程但完成交易的用户细分出来

当你需要查看某两个动作之间的关系或相关数据,可以使用顺序细分。

在GA中创建用户群组

当然在新的细分功能发布之前我们是可以通过配置自定义变量的方法来跟踪和细分用户群组,这是基于代码的方法,实现起来有点麻烦。而现在我们可以直接在Google Analytics中创建基本的用户群组,这是一个巨大的进行。

群组(cohort),就是把在某个时间段内具有同一特征或同一行为的用户。一个群组基本上就是一个包含了某些日期条件的细分。例如,我要看所有在1月份中第一次访问网站的用户的相关数据。 他们在1月份之后有没有回访我们的网站呢,有没有继续产生销售呢?

要查看到这些信息,我们需要创建一个基于用户的第一次访问的群组。GA提供了这样一个新的维度:第一次访问的日期(Date of Fist Visit)。这意味着,我们为可以为第一次访问指定一个特定的日期范围。

8_Cohort

在GA中创建一个基本第一次访问日期维度的群组

注:该群组的日期范围不能超过31天。

当然,在创建其他的细分时你也可以使用第一次访问的日期作为细分的维度。例如,对于一个电商网站来说,通过需要把用户第一次访问的细分与用户产生的销售合并起来。

下边为第一次访问与电子商务的条件相合并的设置方法。

9a_RevenueOverTIme

把第一次访问与电子商务的条件相合并

由此产生的数据是这样的:

9b_RevenueOverTIme

这个例子展示了所有用户与及在特定时间内第一次访问了网站的用户的收入数据变化曲线

要注意的是,基于用户的细分只能应用于不超过90天的时间范围内。因此,任何创建的群组使用这种方法最多也只能应用于90天。

另一示例:如果我是一名出版商,我想看一下在特定的月份第一次访问网站用户他们在附后的时间里的行为表现。我可以为每一个月可以创建一个细分(第一次访问的用户群组)并查看每一个群组在随后的时间段中的数据变化情况。

10_PubReadersOverTime

在GA中查看月度首次访问群组的数据

如果对于某一个群组,你要查看的数据的时间段超过了90天,那你可能还得使用自定义变量或事件跟踪的方法来收集和查看数据。

还有一些要注意的事项:我们还不能根据转化创建群组;在GA中还没有第一次转化日期的维度,现在只有第一次访问日期的维度。

细分管理变得更简单

相比于之前,新的界面让你的细分管理变得更加简单。

现在界面提供了过滤功能,你可以直接输入过滤条件快速查找到你之前设置的细分。另外你还可以使用星标标注出哪些是你最常用的细分

若要编辑某个细分,把鼠标悬停在该细分上面,并点击弹出的齿轮工具即可。

11_OrganizingSegments

多种方式组织和查找细分

小结

这篇文章有点长(作者原话)。我较早前就看到了这个功能的介绍,但因为之前一段时间较忙一直拖着没有把它整理出来。这可能是Google Analytics有史以来最重要的升级之一。用户细分的功能将会改变人们对于的GA使用方式。而且,我们即将进入通用分析的世界,我们将会有更多的数据,因此,更有效地对用户进行细分将显得尤为重要。

205月/140

从Google Analytics升级Universal Analytics

发布在 邵珠庆

从Urchin到Google Analytics,再到如今的Universal Analytics。Google的分析工具总是在不断的升级,完善中。搞的我们这些使用者一刻也不敢懈怠。努力的跟上这升级的节奏,不敢落后。从本篇文章开始,我们的注意力将从Google Analytics转移到对Universal Analytics的关注。

 

本篇文章将分两大部分来介绍Universal Analytics的代码。第一部分是Universal Analytics的全局代码,也就是网站中每个页面都需要添加的那部分常规追踪代码。第二部分是Universal Analytics的自定义代码。下面我们来分别看下这两部分追踪代码如何设置和实施,以及和Google Analytics追踪代码的区别。

 

第一部分 Universal Analytics全局代码

1,在返回数据时的变化

在对Universal Analytics的追踪代码和实施过程进行介绍之前,我想有必要先来介绍一个细节的变化。就是Google 分析工具在向服务器返回数据时的请求URL和方式的变化。在Google Analytics中,所有追踪到的数据会以对utm.gif图像的请求参数形式返回到Google服务器。因此,我们在检查Google Analytics时最常见的是以http://www.google-analytics.com/__utm.gif开头的URL地址。

但是现在,无论是你的网站部署的是Google Analytics,还是Universal Analytics,当你对返回数据进行检查时,都会发现一些变化。返回数据不再只有之前的一个URL地址了。而是可能会变成以下三个中的一个。

三类Google 分析工具返回数据URL地址

  1. http://www.google-analytics.com/__utm.gif
  2. http://www.google-analytics.com/collect
  3. http://stats.g.doubleclick.net/__utm.gif

这三类地址都可以正常返回访问者的行为数据,产生三类不同返回数据URL地址的原因在于网站中实施的Google分析工具。其中第一个是网站部署Google Analytics默认全局代码时返回数据的URL地址,第二个是网站部署Universal Analytics默认全局代码时返回数据的URL地址。第三个URL地址比较有意思,当我们启用受众特征和兴趣报告,并对默认的全局追踪代码进行定制时返回数据URL地址。

启用受众特征和兴趣报告需对Google分析的全局代码进行修改,并且在账户中的媒体资源部分选择启用受众特征和兴趣报告

下面我们以代码示例来说明下不同情况下可能产生的返回数据URL情况。

 

如果你的网站实施的是默认的Google Analytics全局追踪代码。

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-12347890-2']);
  _gaq.push(['_trackPageview']);
 
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>

那么你将看到以http://www.google-analytics.com/__utm.gif开头的返回数据URL地址。

1
http://www.google-analytics.com/__utm.gif?utmwv=5.4.6&utms=1&utmn=1896906760&utmhn= bluewhale.cc &utmcs=utf-8&utmsr=1120x700&utmvp=1103x33&utmsc=24-bit&utmul=zh-cn&utmje=1&utmfl=11.9%20r900& utmdt=%E8%93%9D%E9%B2%B8%E7%9A%84%E7%BD%91%E7%AB%99%E5%88%86%E6%9E%90%E7%AC%94%E8%AE%B0%20%7C%20%E5%85%B3%E6%B3%A8Google%20Analytics%E5%BA%94%E7%94%A8%E4%B8%8E%E6%8A%80%E5%B7%A7&utmhid=1955227755&utmr=-&utmp=%2F&utmht=1387982554877&utmac=UA-24113315-1&utmcc=__utma%3D1.1231777628.1385699116.1387959194.1387982555.8%3B%2B__utmz%3D1.1387959194.7.1.utmcsr%3Dbaidu123%7Cutmccn%3D(not%2520set)%7Cutmcmd%3D(not%2520set)%3B&utmu=qFEAg~

 

如果你的网站实施的是默认的Universal Analytics全局追踪代码。

1
2
3
4
5
6
7
8
9
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
 
  ga('create', 'UA-12347890-11', 'bluewhale.cc');
  ga('send', 'pageview');
</script>

那么你将看到以http://www.google-analytics.com/collect开头的返回数据URL地址。

1
http://www.google-analytics.com/collect?v=1&_v=j15&a=2124808192&t=pageview&_s=1&dl=http%3A%2F%2Fbluewhale.cc%2Ftest%2Fua_test.html&ul=zh-cn&de=gb2312&dt=UAcode%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A2&sd=24-bit&sr=1120x700&vp=1103x33&je=1&fl=11.9%20r900&_utma=127635166.34592685.1383186536.1387941519.1387981700.19&_utmz=127635166.1387352120.16.8.utmcsr%3Dgoogle%7Cutmccn%3D(organic)%7Cutmcmd%3Dorganic%7Cutmctr%3D%25E8%2593%259D%25E9%25B2%25B8%25E7%25BD%2591%25E7%25AB%2599%25E5%2588%2586%25E6%259E%2590&_utmht=1387982003772&_u=MACC~&cid=34592685.1383186536&tid=UA-12347890-11&z=994756508

 

如果你的Google分析启用了受众特征和兴趣报告,并对默认的全局追踪代码进行了定制。

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-12347890-11']);
  _gaq.push(['_trackPageview']);
 
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>

那么无论你的网站中实施Google Analytics还是Universal Analytics,你都会看到以http://stats.g.doubleclick.net/__utm.gif开头的返回数据URL地址。

1
http://stats.g.doubleclick.net/__utm.gif?utmwv=5.4.6dc&utms=1&utmn=894009105&utmhn=bluewhale.cc&utmcs=utf-8&utmsr=1120x700&utmvp=1120x33&utmsc=24-bit&utmul=zh-cn&utmje=1&utmfl=11.9%20r900&utmdt=%E8%93%9D%E9%B2%B8%E7%9A%84%E7%BD%91%E7%AB%99%E5%88%86%E6%9E%90%E7%AC%94%E8%AE%B0%20%7C%20%E5%85%B3%E6%B3%A8Google%20Analytics%E5%BA%94%E7%94%A8%E4%B8%8E%E6%8A%80%E5%B7%A7&utmhid=853429841&utmr=-&utmp=%2F&utmht=1387981699675&utmac=UA-12347890-1&utmcc=__utma%3D127635166.34592685.1383186536.1387941519.1387981700.19%3B%2B__utmz%3D127635166.1387352120.16.8.utmcsr%3Dgoogle%7Cutmccn%3D(organic)%7Cutmcmd%3Dorganic%7Cutmctr%3D%25E8%2593%259D%25E9%25B2%25B8%25E7%25BD%2591%25E7%25AB%2599%25E5%2588%2586%25E6%259E%2590%3B&utmu=qAE~

 

2,返回数据的类型变化

在介绍Google Analytics的文章中我们曾说过,Google Analytics支持5种数据类型。

而在Universal Analytics中对数据类型的标记和分类更加清晰,同时支持的数据类型也有增加。

在Universal Analytics的返回数据中通过参数t来记录本次记录到的数据属于哪种类型。除了我们之前介绍的5种类型以外,Universal Analytics还支持时间类型和社交类型的返回数据。

如上表所示,当t=pageview时表示页面类的数据,t=event时表示事件类的数据,t=Transaction或Item时表示电商类的订单数据,t=Social时表示社交类的数据,t=timing时表示计时类的数据。t参数的值不存在为空的情况。后面部分我们会详细介绍对触发不同类型数据代码的定制和实施方法。

 

3,Universal Analytics全局代码定制变化

前面介绍了返回数据URL的变化和数据类型的变化情况,下面我们进入正题,开始介绍Universal Analytics的全局代码。Universal Analytics的追踪代码与Google Analytics相比,更加简单,易用,并且可读性也更强。即使是一个非技术背景的分析人员,也能大概读懂代码所表示的含义并对追踪代码进行简单的定制工作。

常用代码定制界面化

首先,对于Google Analytics中我们使用最频繁的几项代码定制的工作,如添加新搜索引擎来源,访问次数超时设置,Cmapaign来源有效期设置,以及搜索关键词排除设置等操作在Universal Analytics中都不再需要对全局追踪代码进行修改或定制,这些操作在Universal Analytics中都被以友好的界面方式呈现,并且有清晰的引导和说明信息。

 

上图是Universal Analytics中添加搜索引擎来源的操作界面,你可以在报告界面中的“管理”部分找到这些定制操作界面。在这类界面中即使没有技术背景的分析师也可以完成对代码的定制工作,并且也不需要重复的对页面中的代码进行修改。当然你也可以选择通过Google Tag Manager来减少修改代码对网站及页面的影响,但界面化的操作比直接面对代码要友好很多。

自定义追踪代码全局变量

Universal Analytics的全局代码中允许我们对全局变量进行自定义。在Universal Analytics全局代码第一段的最后一部分,是默认的全局变量ga,对于这个全局变量,我们可以进行修改和自定义。

 

这是默认的默认的Universal Analytics全局追踪代码。第一部分最后的全局变量名称是ga,同时第二部分中的创建账户以及返回数据代码也都使用了ga这个全局变量。

1
2
3
4
5
6
7
8
9
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
 
  ga('create', 'UA-12347890-11', 'bluewhale.cc');
  ga('send', 'pageview');
</script>

我们对Universal Analytics的全局变量名称进行修改,将ga修改为ua,同时代码第二部分中所使用的全局变量名称也都需要手动修改为ua。

 

1
2
3
4
5
6
7
8
9
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ua');
 
  ua('create', 'UA-12347890-11', 'bluewhale.cc');
  ua('send', 'pageview');
</script>

——————————————————重要提示————————————————————

注意:本部分以后的代码我们都将以ua作为Universal Analytics的全局变量进行定制和实施介绍。在使用代码时请注意,如你的网站使用默认Universal Analytics全局代码,请将ua更改为ga再使用。否则可能导致代码无法正常工作!

———————————————————————————————————————————

Cookie有效期设置及名称

在Universal Analytics中除了修改全局变量名称外,我们还可以修改记录访客的Cookie有效期。Universal Analytics默认的cookie有效期为两年,我们可以通过设置cookieExpires修改这个cookie的有效期。

在上面的截图中,我们将Universal Analytics的Cookie名称改为uaCookie,并将过期时间从2年改为1天。具体的代码修改如下:

在Universal Analytics全局代码第二部分增加cookieExpires值的设置,以秒为单位,示例中86400秒等于24小时,即1天。(86400秒/60=1440分钟/60=24小时)

1
2
3
4
5
6
7
8
9
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ua');
 
  ua('create', 'UA-12347890-11',{'cookieExpires': 86400});
  ua('send', 'pageview');
</script>

更改Cookie名称的方法和修改有效期类似,在Universal Analytics全局代码中相同的位置对 cookieName值进行设置即可。

 

1
2
3
4
5
6
7
8
9
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ua');
 
  ua('create', 'UA-12347890-11',{'cookieName':'uaCookie','cookieExpires': 86400});
  ua('send', 'pageview');
</script>

需要说明的是,对Cookie有效期及名称的修改请在代码初次实施前完成,并且需要保证所有页面代码保持一致,否则你可能会因为同时存在多个不同名称及生存期的Cookie而导致网站的数据不准确。

 

第二部分 Universal Analytics自定义代码

对于Universal Analytics自定义代码的定制和实施与Google Analytics中变化不大。下面我们分别来介绍虚拟页面事件追踪,社交追踪和电商代码的定制和实施。所有的Universal Analytics自定义代码我们都将以onclick事件为例。并且以定制后的ua作为Universal Analytics全局变量进行介绍。如你的网站中使用默认的Universal Analytics全局代码,请讲ua更改为ga。否则代码可能无法正常工作。

 

1,  虚拟页面

常规的虚拟页面代码如下,在pageview后添加虚拟页面的命名规则即可,添加的虚拟页面名称以URL的形式出现在Universal Analytics的所有页面报告中。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'pageview', '/virtual_pageviews_test');">虚拟页面</a>

与Google Analytics不同的是,Universal Analytics中除了可以定制虚拟页面的URL,还可以定制虚拟页面的title。在title后添加虚拟页面的title名称即可。这将大大提高虚拟页面在报告中的数据可读性。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'pageview', {'page':'/virtual_pageviews_test','title':'virtual_page'});">虚拟页面测试(自定义页面URL及title)</a>

2,  事件追踪

Universal Analytics中的事件追踪与Google Analytics没有太大差别,同样使用事件类别,行动和标签三个默认参数来标记事件。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'event', 'category', 'action', 'label');">事件追踪</a>

3,  社交追踪

Universal Analytics中的社交追踪与事件非常相似,你可以对网站中的各类社交分享按钮进行追踪,这里允许记录社交媒体的名称,社交按钮的行为,目标URL等信息。具体社交追踪代码如下。

1
<a href="http://bluewhale.cc"onClick="javascript:ga('send', 'social', 'socialNetwork', 'socialAction', 'socialTarget');">社交媒体</a>

加强型的社交追踪代码除了前面介绍的三个参数外,还能标记社交按钮被触发的页面名称。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'social', 'socialNetwork', 'socialAction', 'socialTarget', {'page': '/my-new-page'});">社交媒体</a>

4,电子商务追踪

最后介绍的Universal Analytics定制代码是电商代码,结构和功能与Google Analytics类似,唯一不同的是Universal Analytics为了保证analytics.js的文件大小,没有把电商的代码放在里面,因此在使用电商代码时,需要单独调用ecommerce.js文件。另外,在使用电商代码前,需要先在Google分析管理后台开通电商报告功能。

以下是Universal Analytics电子商务代码示例。所有全局变量以及改为ua,请注意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ua');
 
  ua('create', 'UA-12347890-11', 'bluewhale.cc');
  ua('send', 'pageview');
  ua('require', 'ecommerce', 'ecommerce.js');
  ua('ecommerce:addTransaction', {
  'id': '1234',                     // Transaction ID. Required.
  'affiliation': 'Acme Clothing',   // Affiliation or store name.
  'revenue': '11.99',               // Grand Total.
  'shipping': '5',                  // Shipping.
  'tax': '1.29'                     // Tax.
  });
  ua('ecommerce:addItem', {
  'id': '1234',                     // Transaction ID. Required.
  'name': 'Fluffy Pink Bunnies',    // Product name. Required.
  'sku': 'DD23444',               // SKU/code.
  'category': 'Party Toys',         // Category or variation.
  'price': '11.99',                 // Unit price.
  'quantity': '1'                   // Quantity.
  });
  ua('ecommerce:send');
</script>

 

本篇文章我们简单介绍了Universal Analytics的全局代码和自定义代码的定制和实施。更多Universal Analytics全局代码的定制内容请参看Google官方文档

—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,转自“蓝鲸网站分析博客”。】—

155月/140

升级Universal Analytics部署代码

发布在 邵珠庆

https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced
 
<!-- Google Analytics -->
<script>
/**
 * Creates a temporary global ga object and loads analy  tics.js.
 * Paramenters o, a, and m are all used internally.  They could have been declared using 'var',
 * instead they are declared as parameters to save 4 bytes ('var ').
 *
 * @param {Window}      i The global context object.
 * @param {Document}    s The DOM document object.
 * @param {string}      o Must be 'script'.
 * @param {string}      g URL of the analytics.js script. Inherits protocol from page.
 * @param {string}      r Global name of analytics object.  Defaults to 'ga'.
 * @param {DOMElement?} a Async script tag.
 * @param {DOMElement?} m First script tag in document.
 */
(function(i, s, o, g, r, a, m){
  i['GoogleAnalyticsObject'] = r; // Acts as a pointer to support renaming.

  // Creates an initial ga() function.  The queued commands will be executed once analytics.js loads.
  i[r] = i[r] || function() {
    (i[r].q = i[r].q || []).push(arguments)
  },

  // Sets the time (as an integer) this tag was executed.  Used for timing hits.
  i[r].l = 1 * new Date();

  // Insert the script tag asynchronously.  Inserts above current tag to prevent blocking in
  // addition to using the async attribute.
  a = s.createElement(o),
  m = s.getElementsByTagName(o)[0];
  a.async = 1;
  a.src = g;
  m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

ga('create', 'UA-XXXX-Y', 'auto'); // Creates the tracker with default parameters.
ga('send', 'pageview');            // Sends a pageview hit.
</script>
<!-- End Google Analytics -->
145月/140

如何科学的吐槽(完整版)

发布在 邵珠庆

虽然知乎上每天必看神吐槽但是在看一遍还是tm太搞!

125月/140

马云内部邮件:为什么这15年我们能幸运的生存下来

发布在 邵珠庆

5月7日凌晨消息,据新浪科技报道,阿里巴巴集团董事局主席马云通过内部邮件向阿里巴巴员工宣布,阿里巴巴集团正式向美国证券监管委员会递交上市注册登记书,并提醒全体阿里巴巴人,感恩过去,敬畏未来。

附,马云邮件全文:

新的机会 新的挑战 新的征程

各位阿里人,

几分钟后我们将会正式向美国证劵监管委员会首次递交上市注册登记书。这将意味着阿里巴巴即将进入新的挑战时代。

15年前,阿里巴巴18个创始人立志创建一家中国人创立的属于全世界的互联网公司,希望能成为全球十大网络公司之一,成为一家能生存102年的企业。15年过去了,我们幸运的生存了下来。我们活的比我们当年想像的好得多。

我们明白这不是因为我们多么的努力,或者是多么的聪明能干让我们走到了今天,而是因为我们幸运的生活在这个时代。感谢互联网,感谢生气勃勃的年轻人,感谢在一路相伴的创业者和追梦人,感谢这个国家改革和开放的进程。。。

我们深知,我们生存下来不是因为战略多么的宏远,执行力多么的完美,而是我们十五年来坚持了“让天下没有难做的生意”这个使命,坚持了我们“客户第一”的价值观,坚持了相信未来,相信相信,坚持了平凡人一起做非凡事。

相信公司的注册登记书(内含招股书)第一版公布之后,我们将会面临各类评论。15年来,在大量的支持,赞语和掌声背后,我们从来不缺指责,批评,漫骂和质疑。回应这一切最好的办法是用我们感恩和敬畏的心态,一如既往的追随“让天下没有难做的生意”的使命,专注工作,让小企业成功,让时间让结果去说明一切。

上市从来就不是我们的目标,它是我们实现自己使命的一个重要策略和手段,是前行的加油站。但阿里人要清醒的认识到资本市场巨大利益诱惑背后有着无比巨大的无情和压力。只有很少数的杰出企业能够在资本市场持久驰骋。阿里巴巴这次在国际资本市场必将会因为规模,期待值,国界意识,文化冲突,区域政经。。。。遭遇空前绝后的挑战和压力。只有坚持我们的坚持,相信我们的相信,我们才有可能在压力和诱惑中度过未来艰辛的87年。能够面临这样全球性挑战的企业并不多,我们荣幸成为其中一个。

上市后我们仍将坚持“客户第一,员工第二,股东第三”的原则。我们相信做任何艰难的决定,不管是在过去还是将来,坚持原则才是对各方利益最大的尊重和保护。上市某种意义上是让我们更有力量去帮助客户、支持员工、守护股东利益。

最后,提醒大家注意严格遵守证券监管法规及集团的保密规定,不要对招股书做任何公开评论,所有采访须知会集团公关部,通过集团公关部进行协调。

至于每个员工的股票事宜,集团HR将会发出处理方案。这是件令人高兴的事。我们也必须坚持“认真生活 快乐工作”的原则,请大家处理好自己的财富,在照顾好自己,家人的同时,力所能及的做些回报社会的工作和捐助。谢谢大家了。

“兴于诗 立于礼 成于乐”,阿里人,过去15年我们过的很艰难,但很精彩。未来的每一天注定不会平凡,不会简单。今天不努力,我们可能看不到后天的太阳。没有一家企业会持久顺利,我们在坚持我们坚持的同时,必须为客户而变,为世界而变,为未来而变。

马云

阿里巴巴集团董事局主席

2014。5。7

阿里大事记

125月/140

JavaScript的开发规范要求

发布在 邵珠庆

作为一名开发人员(We前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题。本人在开发工作中就曾与不按规范来开发的同事合作过,与他合作就不能用“愉快”来形容了。现在本人撰写此文的目的除了与大家分享一点点经验外,更多的是希望对未来的合作伙伴能够起到一定的借鉴作用。当然,如果我说的有不科学的地方还希望各路前辈多多指教。下面分条目列出各种规范要求,这些要求都是针对同事编码毛病提出来的,好些行业约定的其它规范可能不会再提及。

1、保证代码压缩后不出错

对于大型的JavaScript项目,一般会在产品发布时对项目包含的所有JavaScript文件进行压缩处理,比如可以利用Google Closure Compiler Service对代码进行压缩,新版jQuery已改用这一工具对代码进行压缩,这一般会去掉开发时写的注释,除去所有空格和换行,甚至可以把原来较长的变量名替换成短且无意义的变量名,这样做的目的是加快文件的下载速度,同时也减小网站访问带来的额外数据流量,另外在代码保护上也起到了一点点作用,至少压缩后的代码即使被还原还是没那么容易一下读懂的。要想代码能正确通过压缩,一般要求语句都要以分号正常结束,大括号也要严格结束等,具体还要看压缩工具的要求。所以如果一开始没有按标准来做,等压缩出错后再回去找错误那是浪费时间。

2、保证代码能通过特定IDE的自动格式化功能

一般较为完善的开发工具(比如Aptana Studio)都有代码“自动格式”化功能,这一功能帮助实现统一换行、缩进、空格等代码编排,你可以设置自己喜欢的格式标准,比如左大括号{是否另起一行。达到这个要求的目的在于方便你的开发团队成员拿你代码的一个副本用IDE自动格式化成他喜欢或熟悉的风格进行阅读。你同事需要阅读你的代码,可能是因为你写的是通用方法,他在其它模块开发过程中也要使用到,阅读你的代码能最深入了解方法调用和实现的细节,这是简单API文档不能达到的效果。

3、使用标准的文档注释

这一要求算是最基本的,这有利于在方法调用处看到方法的具体传参提示,也可以利用配套文档工具生成html或其它格式的开发文档供其他团队成员阅读,你可以尝试使用jsdoc-toolkit。如果你自动生成的API是出自一个开放平台,就像facebook.com应用,那么你的文档是给天下所有开发者看的。另外编写完整注释,也更方便团队成员阅读你的代码,通过你的参数描述,团队成员可以很容易知道你编写的方法传参与实现细节。当然也方便日后代码维护,这样即使再大的项目,过了很长时间后,回去改点东西也就不至于自己都忘记了当时自己写的代码是怎么一回事了。

4、使用规范有意义的变量名

使用规范有意义的变量名可以提高代码的可读性,作为大项目开发成员,自己写的代码不仅仅要让别人容易看懂。开发大项目,其实每个人写的代码量可能都比较大,规范命名,日后自己看回自己的代码也显的清晰易懂,比如日后系统升级或新增功能,修改起代码来也轻松多了。如果到头发现自己当初写的代码现在看不太懂了,那还真是天大的笑话了。

当然,使用有意义的变量名也尽量使用标准的命名,比如像这里:var me = this也许没有var self = this好,因为self是Python中的关键字,在Python中self就是通常语言this的用法。再看下面一个例子,加s显然比没有加来的科学些,这样可以知道这个变量名存的是复数,可能是数组等:

var li = document.getElementsByTagName('li')var lis = document.getElementsByTagName('li')

5、不使用生偏语法

JavaScript作为一门动态脚本语言,灵活性既是优点也是缺点,众所周知,动态语言不同层次开发人员对实现同样一个功能写出来的代码在规范或语法上会存在较大的差别。不管怎么样,规范编码少搞怪,不把简单问题复杂化,不违反代码易读性原则才是大家应该做的。

比如这语句:typeof(b) == 'string' && alert(b) 应该改为:if (typeof(b) == 'string') alert(b),像前面那种用法,利用了&&运算符解析机制:如果检测到&&前语句返回false就不再检测后面语句,在代码优化方面也有提到把最可能出现的情况首先判断,像这种写法如果条件少还好,如果条件较多而且语句也长,那代码可读性就相当差。

又比如:+function(a){var p = a;}( 'a') 应该改为:(function(a){var p = a;})( 'a'),其实function前面的+号与包含function的()括号作用是一样的,都是起运算优先作用,后者是常见且容易看明白的防止变量污染的做法,比如好些流行JavaScript框架就是采用后面这种方式。

再说个降低代码可读性的例子,如:function getPostionTxt(type){return type == 2 ? "野外" : (type == 3 ? "商城" : (type == 4 ? "副本" : null));} 应该改成:function getPostionTxt(type){var typeData={"2":"野外","3":"商城","4":"副本"};if (typeData[type]) return typeData[type]; else return null;}。如果type是从0开始不间断的整数,那么直接使用数组还更简单,这种结果看起来就清晰多了,看到前面那种多层三元表达式嵌套头不晕吗。

6、不在语句非赋值地方出现中文

语句中不应该出现中文我想一般人都知道,虽然这样做不影响程序运行,但是显然有背行业标准要求,当然我们也不是在使用“易语言”做开发。关于这一个问题,我本来不想把它拿出来说的,但我确实遇到有人这样做的,也不知道是不是因为他的英语实在太烂了,至少还可以用拼音吧,另外寻求翻译工具帮忙也不错的选择。我举例如下,像以下写法出现在教学中倒还可以理解:

this.user['名字'] = '张三' 或者 this.user.名字 = '张三'

7、明确定义函数固定数量的参数

固定数量参数的函数内部不使用arguments去获取参数,因为这样,你定义的方法如果包含较多的脚本,就不能一眼看到这个方法接受些什么参数以及参数的个数是多少。比如像下面:

var $ = function(){return document.getElementById(arguments[0]);} 应该改成:var $ = function(elemID){return document.getElementById(elemID);}

8、不必热衷动态事件绑定

虽然知道事件可以动态绑定,比如使用addEventListener或者使用jQuery的bind方法,也知道采用动态事件绑定可以让XHTML更干净,但是一般情况下我还是建议直接把事件写在DOM节点上,我认为这样可以使代码变得更容易维护,因为这样做,我们在查看源代码的时候就可以容易地知道什么Element绑定了什么方法,简单说这样更容易知道一个按钮或链接点击时调了什么方法脚本。

9、降低代码与XHTML的耦合性

不要过于依赖DOM的一些内容特征来调用不同的脚本代码,而应该定义不同功能的方法,然后在DOM上调用,这样不管DOM是按钮还是链接,方法的调用都是一样的,比如像下面的实现显然会存在问题:

function myBtnClick(obj)
{
 if (/确定/.test(obj.innerHTML))
  alert('OK');
 else if (/取消/.test(obj.innerHTML))
  alert('Cancel');
 else  alert('Other');
}<a herf="javascript:;">确定</a><a herf="javascript:;">取消</a>

上面例子其实在一个函数内处理了两件事情,应该分成两个函数,像上面的写法,如果把链接换成按钮,比如改成这样:<input type="button" value="确定" />,那么myBtnClick函数内部的obj.innerHTML就出问题了,因为此时应该obj.value才对,另外如果把按钮名称由中文改为英文也会出问题,所以这种做法问题太多了。

10、一个函数应该返回统一的数据类型

因为JavaScrip是弱类型的,在编写函数的时候有些人对于返回类型的处理显得比较随便,我觉得应该像强类型语言那样返回,看看下面的两个例子:

function getUserName(userID)
{
 if (data[userID])
  return data[userID];
 else  return false;
}
应该改为:function getUserName(userID)
{
 if (data[userID])
  return data[userID];
 else  return "";
}

这个方法如果在C#中定义,我们知道它准备返回的数据类型应该是字符串,所以如果没有找到这个数据我们就应该返回空的字符串,而不是返回布尔值或其它不合适的类型。这并没有影响到函数将来的调用,因为返回的空字符串在逻辑判断上可被认作“非”,即与false一样,除非我们使用全等于“===”或typeof进行判断。

11、规范定义JSON对象,补全双引号

使用标准肯定是有好处的,那么为什么还是有人不使用标准呢?我想这可能是懒或习惯问题。也许还会有人跟我说,少写引号可以减轻文件体积,我认为这有道理但不是重点。对于服务器返回的JSON数据,使用标准结构可以利用Firefox浏览器的JSONView插件方便查看(像查看XML那样树形显示),另外你如果使用jQuery做开发,最新版本jQuery1.4+是对JSON格式有更高要求的,具体的可以自己查阅jQuery更新文档。比如:{name:"Tom"}或{'name':'Tom'}都应该改成{"name":"Tom"}。

12、不在文件中留下未来确定不再使用的代码片段

当代码调整或重构后,之前编写的不再使用的代码应该及时删除,如果认为这些代码还有一定利用价值可以把它们剪切到临时文件中。留在项目中不仅增加了文件体积,这对团队其它成员甚至自己都起到一定干扰作用,怕将来自己看回代码都搞不懂这方法是干什么的,是否有使用过。当然可以用文档注释标签@deprecated把这个方法标识为不推荐的。

13、不重复定义其他团队成员已经实现的方法

对于大型项目,一般会有部分开发成员实现一些通用方法,而另外一些开发成员则要去熟悉这些通用方法,然后在自己编写模块遇到有调用的需要就直接调用,而不是像有些开发者喜欢“单干”,根本不会阅读这些通用方法文档,在自己代码中又写了一遍实现,这不仅产生多余的代码量,当然也是会影响团队开发效率的,这是没有团队合作精神的表现,是重复造轮子的悲剧。

比如在通用类文件Common.js有定义function $(elemID){return document.getElementById(elemID)}那么就不应该在Mail.js中再次出现这一功能函数的重复定义,对于一些复杂的方法更应该如此。

14、调用合适的方法

当有几个方法都可以实现同类功能的时候,我们还是要根据场景选择使用最合适的方法。下面拿jQuery框架的两个AJAX方法来说明。如果确定服务器返回的数据是JSON应该直接使用$.getJSON,而不是使用$.get得到数据再用eval函数转成JSON对象。如果因为本次请求要传输大量的数据而不得以使用$.post也应该采用指定返回数据类型(设置dataType参数)的做法。如果使用$.getJSON,在代码中我们一眼能看出本次请求服务器返回的是JSON。

温馨提示:jQuery1.4后,如果服务器有设置数据输出的ContentType,比如ASP.NET C#设置 Response.ContentType = "application/json",那么$.get将与$.getJSON的使用没有什么区别。

15、使用合适的控件存储合适的数据

曾发现有人利用DIV来保存JSON数据,以待页面下载后将来使用,像这样:<div >{ "name":"Tom"}</div>,显然这个DIV不是用来界面显示的,如果非要这样做,达到使用HTML文件进行数据缓存的作用,至少改成用隐藏域来存这数据更合理,比如改成:<input type="hidden" value=" { "name":"Tom"}" />。

其实也可以利用window对象来保存一些数据,像上面的例子,我们可以在AJAX请求页直接包含这样的脚本块:<script>window.userData = { "name":"Tom"};</script>,当在AJAX请求回调函数中执行完$( "#MyDiv ").html(data)后,在window上就马上有了这一变量。如果采用第一种方法,将不可避免eval(document.getElementById("UserData").innerHTML)。如果在window对象存放大量数据的话,这些数据不用时要及时手动清理它们,它们是要等浏览器刷新或重启后才会消失的,这就会增加内存开销。

16、永远不要忽略代码优化工作

代码最优化是每个程序员应该努力达到的目标,也应该成为程序员永远的追求。写代码的时候,不应该急着把功能实现出来,要想一下如何写代码,代码的执行效率才是较好的。

举个例子:假设有定义getElementById的快捷方法functoin $(elemID){return document.getElementById(elemID)},那么有人可能会写出这样的代码$("MyDiv").parentNode.removeChild($("MyDiv")),其实这里执行了两次getElementById DOM查找,如果改成这样将更好:var myDiv = $("MyDiv"); myDiv.parentNode.removeChild(myDiv)。还好getElementById的DOM查找算比较快,如果换成getElementsByTagName则更应该注重优化了。jQuery开发团队也有提醒大家要注意这方面的问题。

当然,代码优化技巧也是需要个人不断积累的。曾有朋友跟我说他写网站后台代码从来不用考虑优化的,因为他们网站用的是至强四核服务器,我觉得这是很可笑的。

17、会分析策划文档,能用面向对象方法进行接口定义和代码组织

这一能力对于每一个程序员来说都是非常重要的,这也是决定一个程序员水平高低的一个重要因素。能够把需求细化并抽象出不同的类,然后有条理地编写代码,使代码结构清晰,可读性高,代码易于维护,不至于太过程化而且杂乱无章,这样才算是一个优秀的程序员。

45月/140

win7下几个常用的组合键

发布在 邵珠庆

1.Win+D: 这是高手最常用的第一快捷组合键。这个快捷键组合可以将桌面上的所有窗口瞬间最小化,无论是聊天的窗口还是游戏的窗口只要再次按下这个组合键,刚才的所有窗口都回来了,而且激活的也正是你最小化之前在使用的窗口! 
 
2.Win+F:不用再去移动鼠标点“开始→搜索→文件和文件夹”了,在任何状态下,只要一按Win+F就会弹出搜索窗口。

3.Win+R:在我们的文章中,你经常会看到这样的操作提示:“点击‘开始→运行’,打开‘运行’对话框。其实,还有一个更简单的办法,就是按Win+R 
 
4.Alt+Tab:如果打开的窗口太多,这个组合键就非常有用了,它可以在一个窗口中显示当前打开的所有窗口的名称和图标,选中自己希望要打开的窗口,松开这个组合键就可以了。而alt+tab+shift键则可以反向显示当前打开的窗口。 
 
5.Win+E:当你需要打开资源管理器找文件的时候,这个快捷键会让你感觉非常“爽”!再也不用腾出一只手去摸鼠标了! 

6.Win:就是开始菜单咯。

很实用的几个组合键与大家分享.外加微软快捷键大全

Windows 7是微软公司即将发布的一款新一代操作系统,据悉,微软公司已于7月中旬将RTM版本交付PC生产厂商,并将在2009年10月正式上市。此前微软已经就Windows 7发布过多个测试版,根据网友试用,无论是界面,硬件需求,还是性能,相比Vista都有很大改善。
以下是微软官方发布的Windows 7操作系统快捷键的应用解释:
1. 轻松访问键盘快捷方式
按住右Shift 八秒钟: 启用和关闭筛选键
按左 Alt+左 Shift+PrtScn(或 PrtScn):启用或关闭高对比度
按左 Alt+左 Shift+Num Lock :启用或关闭鼠标键
按 Shift 五次: 启用或关闭粘滞键
按住 Num Lock 五秒钟:启用或关闭切换键
Windows 徽标键 + U : 打开轻松访问中心
2. 常规键盘快捷方式
F1 显示帮助
Ctrl+C  复制选择的项目
Ctrl+X  剪切选择的项目
Ctrl+V  粘贴选择的项目

Ctrl+Z  撤消操作
Ctrl+Y  重新执行某项操作
Delete  删除所选项目并将其移动到“回收站”
Shift+Delete  不先将所选项目移动到“回收站”而直接将其删除
F2 重命名选定项目
Ctrl+向右键 将光标移动到下一个字词的起始处
Ctrl+向左键 将光标移动到上一个字词的起始处
Ctrl+向下键 将光标移动到下一个段落的起始处
Ctrl+向上键 将光标移动到上一个段落的起始处
Ctrl+Shift 加某个箭头键 选择一块文本
Shift 加任意箭头键 在窗口中或桌面上选择多个项目,或者在文档中选择文本
Ctrl 加任意箭头键+空格键 选择窗口中或桌面上的多个单个项目
Ctrl+A 选择文档或窗口中的所有项目
F3 搜索文件或文件夹
Alt+Enter 显示所选项的属性
Alt+F4 关闭活动项目或者退出活动程序
Alt+空格键 为活动窗口打开快捷方式菜单
Ctrl+F4 关闭活动文档(在允许同时打开多个文档的程序中)
Alt+Tab 在打开的项目之间切换
Ctrl+Alt+Tab 使用箭头键在打开的项目之间切换
Ctrl+鼠标滚轮 更改桌面上的图标大小
Windows 徽标键 + Tab 使用 Aero Flip 3-D 循环切换任务栏上的程序
Ctrl + Windows 徽标键 + Tab 通过 Aero Flip 3-D 使用箭头键循环切换任务栏上的程序
Alt+Esc 以项目打开的顺序循环切换项目
F6 在窗口中或桌面上循环切换屏幕元素
F4 在 Windows 资源管理器中显示地址栏列表
Shift+F10 显示选定项目的快捷菜单
Ctrl+Esc 打开「开始」菜单
Alt+加下划线的字母 显示相应的菜单
Alt+加下划线的字母 执行菜单命令(或其他有下划线的命令)
F10 激活活动程序中的菜单栏
向右键 打开右侧的下一个菜单或者打开子菜单
向左键 打开左侧的下一个菜单或者关闭子菜单
F5 刷新活动窗口
Alt+向上键 在 Windows 资源管理器中查看上一级文件夹
Esc 取消当前任务
Ctrl+Shift+Esc 打开任务管理器
** CD 时按住 Shift 阻止 CD 自动播放
3. 对话框键盘快捷方式
Ctrl+Tab  在选项卡上向前移动
Ctrl+Shift+Tab  在选项卡上向后移动
Tab  在选项上向前移动
Shift+Tab  在选项上向后移动
Alt+加下划线的字母  执行与该字母匹配的命令(或选择选项)
Enter  对于许多选定命令代替单击鼠标
空格键 如果活动选项是复选框,则选中或清除该复选框
箭头键 如果活动选项是一组选项按钮,则选择某个按钮
F1 显示帮助
F4 显示活动列表中的项目
Backspace 如果在“另存为”或“打开”对话框中选中了某个文件夹,则打开上一级文件夹

4. Windows 徽标键相关的快捷键
Windows徽标键就是显示为Windows旗帜,或标有文字Win或Windows的按键,以下简称Win键。XP时代有4个经典的 Win 键组合:R/E/F/L。到了 Win7,花样更多了。
Win:打开或关闭开始菜单
Win + Pause:显示系统属性对话框
Win + D:显示桌面
Win + M:最小化所有窗口
Win + SHIFT + M:还原最小化窗口到桌面上
Win + E:打开我的电脑
Win + F:搜索文件或文件夹
Ctrl + Win + F:搜索计算机(如果您在网络上)
Win + L:锁定您的计算机或切换用户
Win + R:打开运行对话框
Win + T:切换任务栏上的程序(感觉是和alt+ESC 一样 )
Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,新开一个实例。(感觉这个比较新颖,貌似快速启动。) Shift + Windows logo key +number:Start a new instance of the program pinned to the taskbar in the position indicated by the number
Ctrl + Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,切换到上一次的活动窗口。 Ctrl+Windows logo key +number:Switch to the last active window of the program pinned to the taskbar in the position indicated by the number
ALT + Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,显示跳转清单。 Alt+Windows logo key +number: Open the Jump List for the program pinned to the taskbar in the position indicated by the number
Win + TAB:循环切换任务栏上的程序并使用的Aero三维效果
Ctrl + Win + TAB:使用方向键来循环循环切换任务栏上的程序,并使用的Aero三维效果
按Ctrl + Win + B:切换到在通知区域中显示信息的程序
Win + 空格:预览桌面
Win + ↑:最大化窗口
Win + ↓:最小化窗口
Win + ←:最大化到窗口左侧的屏幕上
Win + →:最大化窗口到右侧的屏幕上
Win + Home:最小化所有窗口,除了当前激活窗口
Win+ SHIFT + ↑:拉伸窗口的到屏幕的顶部和底部
Win+ SHIFT + →/←:移动一个窗口,从一个显示器到另一个
Win + P:选择一个演示文稿显示模式
Win + G:循环切换侧边栏的小工具
Win + U:打开轻松访问中心
Win + x:打开Windows移动中心
5. Windows Explorer相关快捷键
Ctrl+N 打开新窗口
Ctrl+Shift+N 新建文件夹
End 显示活动窗口的底部
Home 显示活动窗口的顶部
F11 最大化或最小化活动窗口
Num Lock+小键盘星号(*) 显示选中文件夹的所有子文件夹
Num Lock+小键盘加号(+) 显示选中文件夹的内容
Num Lock+小键盘减号(-) 折叠选中文件夹
左方向键 折叠当前展开的选中文件夹或选中上层文件夹
Alt+Enter 打开选中项目的属性对话框
Alt+P 显示预览窗格
Alt+左方向键 切换到前一次打开的文件夹
右方向键 显示(展开)当前选中项目或选中第一个子文件夹
Alt+右方向键 切换到下一次后打开的文件夹
Alt+上方向键 打开上层文件夹
Ctrl+鼠标滚轮 改变文件和文件夹图标的大小和外观
Alt+D 选中地址栏(定位到地址栏)
Ctrl+E 选中搜索框(定位到搜索框)
6. 放大镜键盘快捷方式
Windows 徽标键 + 加号或减号 放大或缩小
Ctrl+Alt+空格键 显示鼠标指针
Ctrl+Alt+F 切换到全屏模式
Ctrl+Alt+L 切换到镜头模式
Ctrl+Alt+D 切换到停靠模式
Ctrl+Alt+I 反色
Ctrl+Alt+箭头键 按箭头键的方向平移
Ctrl+Alt+R 调整镜头的大小
Windows 徽标键 + Esc 退出放大镜
7. 远程桌面相关快捷键
Alt+Page Up 按从左向右顺序切换程序
Alt+Page Down 按从右向左切换程序
Alt+Insert 按程序打开先后顺序循环切换程序
Alt+Home 显示“开始”菜单
Ctrl+Alt+Break 在窗口模式和全屏之间切换
Ctrl+Alt+End 显示Windows安全性对话框
Alt+Delete 显示当前窗口的系统菜单
Ctrl+Alt+-(小键盘减号) 当前活动窗口截图
Ctrl+Alt++(小键盘加号) 全屏截图
Ctrl+Alt+向右键 从远程桌面控件“跳转”到主机程序中的控件(如按钮或文本框)。将远程桌面控件嵌入到其他(主机)程序后,此功能非常有用。
Ctrl+Alt+向左键 从远程桌面控件“跳转”到主机程序中的控件(如按钮或文本框)。将远程桌面控件嵌入到其他(主机)程序后,此功能非常有用。
8. 画图键盘快捷方式
Ctrl+N 创建新的图片
Ctrl+O 打开现有图片
Ctrl+S 将更改保存到图片
F12 将此图片另存为新文件
Ctrl+P 打印图片
Alt+F4 关闭图片及其画图窗口
Ctrl+Z 撤消更改
Ctrl+Y 恢复更改
Ctrl+A 选择整个图片
Ctrl+X 剪切选择内容
Ctrl+C 将选择内容复制到剪贴板
Ctrl+V 从剪贴板粘贴选择内容
向右键 将选择内容或活动图形向右移动一个像素
向左键 将选择内容或活动图形向左移动一个像素
向下键 将选择内容或活动图形向下移动一个像素
向上键 将选择内容或活动图形向上移动一个像素
Esc 取消某个选择
Delete 删除某个选择
Ctrl+B 粗体选择文本
Ctrl++ 将画笔、直线或形状轮廓的宽度增加一个像素
Ctrl+- 将画笔、直线或形状轮廓的宽度减少一个像素
Ctrl+I 将所选文本改为斜体
Ctrl+U 为所选文本添加下划线
Ctrl+E 打开“属性”对话框
Ctrl+W 打开“调整大小和扭曲”对话框
Ctrl+Page Up 放大
Ctrl+Page Down 缩小
F11 以全屏模式查看图片
Ctrl+R 显示或隐藏标尺
Ctrl+G 显示或隐藏网格线
F10 或 Alt 显示快捷键提示
Shift+F10 显示当前快捷菜单
F1 打开“画图”帮助
9. 写字板的键盘快捷方式
Ctrl+N 新建一个文档
Ctrl+O 打开一个现有文档
Ctrl+S 将更改保存到文档
F12 将此文档另存为新文件
Ctrl+P 打印文档
Alt+F4 关闭“写字板”
Ctrl+Z 撤消更改
Ctrl+Y 恢复更改
Ctrl+A 选择整个文档
Ctrl+X 剪切选择内容
Ctrl+C 将选择内容复制到剪贴板
Ctrl+V 从剪贴板粘贴选择内容
Ctrl+B 将所选文本改为粗体
Ctrl+I 将所选文本改为斜体
Ctrl+U 为所选文本添加下划线
Ctrl+= 使选择的文本成为下标
Ctrl+Shift+= 使选择的文本成为上标
Ctrl+L 向左对齐文本
Ctrl+E 向中心对齐文本
Ctrl+R 向右对齐文本
Ctrl+J 对齐文本
Ctrl+1 设置单倍行距
Ctrl+2 设置双倍行距
Ctrl+5 将行距设置为 1.5
Ctrl+Shift+> 增加字体大小
Ctrl+Shift+< 减小字体大小
Ctrl+Shift+A 将字符更改为全部使用大写字母
Ctrl+Shift+L 更改项目符号样式
Ctrl+D ** Microsoft 画图图片
Ctrl+F 在文档中查找文本
F3 在“查找”对话框中查找文本的下一个实例
Ctrl+H 在文档中替换文本
Ctrl+向左键 将光标向左移动一个字
Ctrl+向右键 将光标向右移动一个字
Ctrl+向上键 将光标移动到上一行
Ctrl+向下键 将光标移动到下一行
Ctrl+Home 移动到文档的开头
Ctrl+End 移动到文档的结尾
Ctrl+Page Up 向上移动一个页面
Ctrl+Page Down 向下移动一个页面
Ctrl+Delete 删除下一个字
F10 显示快捷键提示
Shift+F10 显示当前快捷菜单
F1 打开“写字板”帮助
10. 计算器的键盘快捷方式
Atl+1 切换到标准模式
Alt+2 切换到科学型模式
Alt+3 切换到程序员模式
Alt+4 切换到统计信息模式
Ctrl+E 打开日期计算
Ctrl+H 将计算历史记录打开或关闭
Ctrl+U 打开单位转换
Alt+C 计算或解决日期计算和工作表
F1 打开“计算器”帮助
Ctrl+Q 按下 M- 按钮
Ctrl+P 按下 M+ 按钮
Ctrl+M 按下 MS 按钮
Ctrl+R 按下 MR 按钮
Ctrl+L 按下 MC 按钮
% 按下 % 按钮
F9 按下 +/– 按钮
/ 按下 / 按钮
* 按下 * 按钮
+ 按下 + 按钮
- 按下 – 按钮
R 按下 1/× 按钮
@ 按下平方根按钮
0-9 按下数字按钮 (0-9)
= 按下 = 按钮
. 按下 .(小数点)按钮
Backspace 按下 Backspace 按钮
Esc 按下 C 按钮
Del 按下 CE 按钮
Ctrl+Shift+D 清除计算历史记录
F2 编辑计算历史记录
向上箭头键 在计算历史记录中向上导航
向下箭头键 在计算历史记录中向下导航
Esc 取消编辑计算历史记录
Enter 编辑后重新计算计算历史记录
F3 在科学型模式下选择“角度”
F4 在科学型模式下选择“弧度”
F5 在科学型模式下选择“梯度”
I 在科学型模式下按 Inv 按钮
D 在科学型模式下按 Mod 按钮
Ctrl+S 在科学型模式下按 sinh 按钮
Ctrl+O 在科学型模式下按 cosh 按钮
Ctrl+T 在科学型模式下按 tanh 按钮
( 在科学型模式下按 ( 按钮
) 在科学型模式下按 ) 按钮
N 在科学型模式下按 ln 按钮
; 在科学型模式下按 Int 按钮
S 在科学型模式下按 sin 按钮
O 在科学型模式下按 cos 按钮
T 在科学型模式下按 tan 按钮
M 在科学型模式下按 dms 按钮
P 在科学型模式下按 pi 按钮
V 在科学型模式下按 F-E 按钮
X 在科学型模式下按 Exp 按钮
Q 在科学型模式下按 x^2 按钮
Y 在科学型模式下按 x^y 按钮
# 在科学型模式下按 x^3 按钮
L 在科学型模式下按 log 按钮
! 在科学型模式下按 n! 按钮
Ctrl+Y 在科学型模式下按 y√x 按钮
Ctrl+B 在科学型模式下按 3√x 按钮
Ctrl+G 在科学型模式下按 10x 按钮
F5 在程序员模式下选择 Hex
F6 在程序员模式下选择 Dec
F7 在程序员模式下选择 Oct
F8 在程序员模式下选择 Bin
F12 在程序员模式下选择 QWord
F2 在程序员模式下选择 Dword
F3 在程序员模式下选择 Word
F4 在程序员模式下选择 Byte
K 在程序员模式下按 RoR 按钮
J 在程序员模式下按 RoL 按钮
% 在程序员模式下按 Mod 按钮
( 在程序员模式下按 ( 按钮
) 在程序员模式下按 ) 按钮
| 在程序员模式下按 Or 按钮
^ 在程序员模式下按 Xor 按钮
~ 在程序员模式下按 Not 按钮
& 在程序员模式下按 And 按钮
A-F 在程序员模式下按 A-F 按钮
空格键 在程序员模式下切换位值
A 在统计信息模式下按 Average 按钮
Ctrl+A 在统计信息模式下按 Average Sq 按钮
S 在统计信息模式下按 Sum 按钮
Ctrl+S 在统计信息模式下按 Sum Sq 按钮
T 在统计信息模式下按 S.D. 按钮
Ctrl+T 在统计信息模式下按 Inv S.D. 按钮
D 在统计信息模式下按 CAD 按钮
11. Windows 日记本键盘快捷方式
Ctrl+N 开始新的便笺
Ctrl+O 打开最近使用的便笺
Ctrl+S 将更改保存到便笺
Ctrl+Shift+V 将便笺移动到特定的文件夹
Ctrl+P 打印便笺
Alt+F4 关闭便笺及其日记本窗口
Ctrl+Z 撤消更改
Ctrl+Y 恢复更改
Ctrl+A 选择页面上的所有项目
Ctrl+X 剪切选择内容
Ctrl+C 将选择内容复制到剪贴板
Ctrl+V 从剪贴板粘贴选择内容
Esc 取消某个选择
Delete 删除某个选择
Ctrl+F 开始基本查找
Ctrl+G 转到页面
F5 刷新查找结果
F5 刷新便笺列表
F6 在便笺列表和便笺之间切换
Ctrl+Shift+C 显示便笺列表中列标题的快捷菜单
F11 以全屏模式查看便笺
F1 打开“日记本”帮助
12. Windows 帮助查看器键盘快捷方式
Alt+C 显示目录
Alt+N 显示“连接设置”菜单
F10 显示“选项”菜单
Alt+向左键 返回先前查看过的主题
Alt+向右键 向前移动到下一个(先前已查看过的)主题
Alt+A 显示客户支持页面
Alt+Home 显示帮助和支持主页
Home 移动到主题的开头
End 移动到主题的末尾
Ctrl+F 搜索当前主题
Ctrl+P 打印主题
F3 将光标移动到搜索框