Speed up your sites with PageSpeed for Nginx

http://googledevelopers.blogspot.jp/2013/04/speed-up-your-sites-with-pagespeed-for.html

By Jeff Kaufman, Software Engineer, Make the Web Faster Team

When we released mod_pagespeed in 2010, we gave webmasters a way to speed up their sites without needing to become web performance optimization experts. As an Apache module, however, it was unavailable to sites running Nginx, the popular high performing open source web server that powers many large web sites. Today that changes: we’re releasing PageSpeed Beta for Nginx, aka ngx_pagespeed.

Running as a module inside Nginx, ngx_pagespeed rewrites your webpages to make them faster for your users. This includes compressing images, minifying CSS and JavaScript, extending cache lifetimes, and many other web performance best practices. All of mod_pagespeed’s optimization filters are now available to Nginx users.

04_ngx_pagespeed

 

 

 

 

After three months of alpha testing on hundreds of sites, ngx_pagespeed has proven its ability to serve production traffic. It’s ready for beta, and it’s ready for you to start using it on your site.

MaxCDN, a content delivery network provider, recently published a blog post on their experience testing ngx_pagespeed: “With PageSpeed enabled, we shaved 1.57 seconds from our average page load, dropped our bounce rate by 1%, and our exit percentage by 2.5%. In sum, we squeezed out extra performance with nothing but a few extra lines in our nginx config files… We are continuing to test the module with the PageSpeed team, and our goal is to make it available across our CDN and to all of our customers – stay tuned!”

ZippyKid, a popular WordPress hosting provider, is also one of the early beta testers of ngx_pagespeed: “PageSpeed for ZippyKid is the world’s first WordPress optimization service powered by ngx_pagespeed, designed to automatically apply web performance best practices to deliver fast WordPress sites. Our benchmarks indicate that PageSpeed for ZippyKid will deliver up to a 75% reduction in page sizes and a 50% improvement in page rendering speeds.”

Development of ngx_pagespeed is open source, with contributions by developers from Google,TaobaoWe-Amp, and many other individual volunteers. Thanks everyone for helping us reach the Beta milestone!

To start using ngx_pagespeed, follow the installation instructions on GitHub.

Jeff Kaufman works on PageSpeed, an open-source server module that helps make the web faster, and is interested in experiment measurement. He also plays for contra dances, organizes otherdances, and blogs about dancinggiving, and tech.

 

https://developers.google.com/speed/pagespeed/ngx

How does ngx_pagespeed speed up web-sites?

ngx_pagespeed improves web page latency and bandwidth usage by changing the resources on that web page to implement web performance best practices. Each optimization is implemented as a custom filter in ngx_pagespeed, which are executed when nginx serves the website assets. Some filters simply alter the HTML content, and other filters change references to CSS, JavaScript, or images to point to more optimized versions.

ngx_pagespeed implements custom optimization strategies for each type of asset referenced by the website, to make them smaller, reduce the loading time, and extend the cache lifetime of each asset. These optimizations include combining and minifying JavaScript and CSS files, inlining small resources, and others. mod_pagespeed also dynamically optimizes images by removing unused meta-data from each file, resizing the images to specified dimensions, and re-encoding images to be served in the most efficient format available to the user.

ngx_pagespeed ships with a set of core filters designed to safely optimize the content of your site without affecting the look or behavior of your site. In addition, it provides a number of more advanced filters which can be turned on by the site owner to gain higher performance improvements.

ngx_pagespeed can be deployed and customized for individual web sites, as well as being used by large hosting providers and CDN’s to help their users improve performance of their sites, lower the latency of their pages, and decrease bandwidth usage.

Java程序员应该知道的10个调试技巧(转)

调试可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序。但这里介绍的调试方法基本都是通用的,也适用于NetBeans IDE,我们会把重点放在运行时上面。

在开始之前,推荐大家去看看Eclipse shortcuts这篇文章,它将会给你带来很多方便。在本文中使用的是Eclipse Juno版(Eclipse 4.2),在开始前给大家提3点建议!

  1. 不要使用System.out.println作为调试工具
  2. 把所有涉及到的组件日志级别激活并使用
  3. 使用日志分析器来读取日志

1.条件断点

如果你不知道如何添加断点,只需点击左边面板(行号前面)断点即被创建。在调试界面中,“断点”视图会把所有被创建的断点列出来。我们可以给它加一个布尔条件,也就是说,该断点会被激活并且如果布尔条件为真,就会执行该断点,否则将会跳过往下执行。

2.异常断点

在断点视图中,有一个J!标记按钮!我们可以使用该按钮来添加一个Java异常断点。例如,我们想让程序在遇到空指针异常(NullPointerException)时,仍然能继续调试,那么我们可以使用该按钮来添加一个异常断点!

3.监视点

这是一个非常好的功能,当选定的属性访问或修改程序时,程序会停止执行并允许进行调试。在Outline视图中选择一个类变量并从上下文菜单中选择切换监视点,属性监视点将会被创建,在断点(Breakpoints)视图中会把所有监视点用列表的形式显示出来。

4.评估/检查

按Ctrl+Shift+D或者Ctrl+Shift+I来显示选定变量或者表达式的值。我们也可以给一个变量或表达式添加永久观察点,当程序在调试时,这些观察点就会在表达式视图(Expression view)中显示出来。

5.修改变量值

在调试过程中,我们可以修改变量值。先选好一个变量然后进入变量视图(Variables view),根据变量类型在其对应的Value列里输入值即可。

6.在Main函数里面停止执行

在运行/调试设置中,编辑配置对话框中有“Main”这个选项卡,我们可以勾选“Stop in main”这个复选框。如果选中,那么在调试一个基于main方法的Java程序时,程序会在main方法第一行位置便停止执行。

7.环境变量

并不是在系统属性中添加环境变量,我们可以在编辑配置对话框中很方便地进行添加。

8.Drop to Frame

这也是我最喜欢的一个功能。调试期间,可以重新跳到调用堆栈框架的开始处执行,并且变量值也会回到最初。根据回档调整堆栈的深度,这个功能的主要用途是所有变量状态可以快速回到方法开始执行时候的样子,然后你可以重新进行一遍一遍执行,这样就可以在你关注的地方进行多次调试,但是在执行过程中也会产生一些副作用,比如插入到数据库里面的数据是无法删除的!

9.分布过滤

当我们进入(F5)方法的时候,我们还可以访问其外部库(比如java.*),我们可能不需要这个库,就可以在Perference选项卡页面添加一个过滤器来排除这个包。

10.进入、跳出和返回

我把这个放在最后一点,在调试过程中,这些是必须要了解(最好掌握)的东西:

F5——进入:移动到下一个步骤,如果当前行有一个方法调用,该控件将会跳转到被调用方法的第一行执行。

F6——跳出:移动到下一行。如果在当前行有方法调用,那么会直接移动到下一行执行。不会进入被调用方法体里面。

F7——返回:从当前方法中跳出,继续往下执行。

F8——移动到下一个断点处执行。

不管你有再多的兴趣爱好

不管你有再多的兴趣爱好,再多的社会关系,再深的对努力学习的厌恶之感。在你青春期的某一个时间点,你都会明白,学习的重要性高过所有。你要无欲则刚,你要学会孤独,你要把自己逼出最大的潜能,没有人会为了你的未来买单;你要么努力向上爬,要么烂在社会最底层的泥淖里。这就是生活

建议PHP组以后统一运用此框架开发应用-YAF

开发环境

yaf开发环境建议 lamp,目前yaf的最新版本为2.1.18(建议使用),php version 5.3+

apache 必须开启rewrite模块

yaf框架是基于C扩展写的,调试起来相对麻烦。建议你的开发环境中,php.ini应如下配置:

display_errors = on
log_errors = on
html_errors = on
error_reporting= E_ERROR | E_WARNING | E_PARSE | E_NOTICE

目录结构

+ public  //网站根目录
   - index.php //入口文件
   - .htaccess //重写规则    
+ conf
  |- application.ini //配置文件   
application/
  + controllers
     - Index.php //默认控制器
  + views    
     |+ index   //控制器
        - index.phtml //默认视图
  + modules //其他模块
  - library    //组件目录
  - models  //model目录
  - plugins //插件目录
复制代码

命名规范

同Pear命名规范,@see http://www.wzjs163.com/tangshan/knowledge/php/41.html#1

补充 :

变量命名,全小写字母,单词用下划线分割,非驼峰

类方法命名,采用驼峰命名

类命名,应注意类与父目录之间的关系, 通常“目录名_类名”,  目录首字母和类首字母大写, 例 “Base_Func”, 类文件存储位置为Base目录下的Func.php

部件(library)加载

      默认规则

yaf框架的默认设置是,只要是符合命名规则类,只要放在APPLICATION_PATH/library下的类目录都会被加载,因为此时的APPLICATION_PATH/library目录

为全局目录. 所以我们不需要去注册本地类。

      全局类

我们开发的时候,通常会遇到这样的情形。多个应用同时公用一些类,我们常常把这些类称为全局类。

为了使这些类得到统一管理,避免这些类的反复修改,我们通常会把这些类的全局空间里。

我们需在php.ini文件夹下做如下配置:

yaf.library=/var/www/yaf_global

这样,我们的全局空间默认的路径就在”/var/www/yaf_global”下了,所有存放在全局空间的类,符合yaf命名的规则类都将被加载

      本地类

本地类是指应用的自身类库.

我们要修改本地类的存放路径,只需在应用的配置文件增加:

application.library = 本地类空间的路径(绝对路径)

      Yaf_loader::import

      既然有了autoloader,那么什么时候我们需要使用Yaf_loader::import

第一种,你的类属于第三方类,也就是不属于YAF命名规范的

第二种,你的文件不是一个类,它可能只是一个存放很多方法的文件

第三种,你的文件没有存放在自动加载的空间里,你依然想使用

YAF单例模式类

Yaf_Application,  Yaf_Loader,  Yaf_Dispatcher, Yaf_Registry, Yaf_Session,这些类都是单例模式类。反之,其他类不是

你可以通过它们的getInstance() 来获取它们的单例,也可以通过Yaf_dispatcher::getXXX方法来获取实例

YAF 链式操作

     Yaf的很多类提供的api都是直接返回自身对象的,这样我们可以很方便的进行链式操作。

Yaf_Session::getInstance()->set('name', "alex")->set('sex',"男");

YAF 默认url访问规则

     Yaf默认开启的路由是static路由模式.

static路由模式的访问规则为,http://domain-name/module-name/controller-name/action-name/param1/value1…..

     如果你想切换路由模式,那么需在应用的配置文件增加:

application.dispatcher.defaultRouter =  默认的路由形式

Yaf默认的模块为Index, 默认的Controller为Index,默认的Action为Idex,这些你也可以通过框架进行配置更改

application.dispatcher.defaultController = 默认的控制器
application.dispatcher.defaultModule = 默认的模块
application.dispatcher.defaultAction = 默认的动作

YAF 路由

Yaf支持5种默认路由模式.  注:以下规则示例中省略了入口文件

static 路由(不支持参数映射), 访问规则

http://domain-name/module-name/controller-name/action-name/param1/value1…….

supervar 路由(不支持参数映射),访问规则

http://domain-name/?r=/module-name/controller-name/action-name/&param1=value1……

simple 路由(不支持参数映射),访问规则

http://domain-name/?m=module-name&c=controller-name&a=action-name http://domain-name/?m=module-name&c=controller-name&a=action-name&param1=value1……

rewrite 路由(支持参数映射),支持REST, 访问规则

@see http://yaf.laruence.com/manual/yaf.routes.static.html#yaf.routes.rewrite

regex 路由(支持参数映射),支持REST, 访问规则

@see  http://yaf.laruence.com/manual/yaf.routes.static.html#yaf.routes.regex

yaf 支持多种路由同时共存,是优点也是缺点. 假设情景路由只支持rewrite路由模式,而不支持regex路由,但这两种路由都存在,我们如何

用最有效的方法的去处理.代码如下

复制代码
class UserPlugin extends Yaf_Plugin_Abstract {

    public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        $router = Yaf_Dispatcher::getInstance()->getRouter()->getCurrentRoute();
             if ($router == 'regex')  {
                   throw new Exception("not found page");
             }
    }
}
复制代码

另,配置路由的时候,请注意路由配置的顺序

Yaf 插件

yaf 插件主要用来增强Yaf框架功能,网上有人利用yaf的6个hook实现了YAF框架调试日志功能, 也有人利用插件实现了yaf的layout,

还有象上例实现路由的再次重定向,譬如我们可以通过IP段,UA,将请求重定向不同的模块,Controller,来处理

如何来写一个插件呢,我们只需写一个类去实现Yaf_Plugin_Abstract, 并将插件注册一下.

复制代码
class SamplePlugin extends Yaf_Plugin_Abstract {

    public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //在路由之前触发
    }

    public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //路由结束之后触发
    }

    public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发循环开始之前触发    
    }

    public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发之前触发
    }

    public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发结束之后触发
    }

    public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        //分发循环结束之后触发
    }
}
复制代码

注册需在bootstrap进行

   public function _initPlugin(Yaf_Dispatcher $dispatcher) {
        //注册一个插件
        $sample_plugin = new SamplePlugin();
        $dispatcher->registerPlugin($sample_dplugin);
   }

 

Yaf 模块

模块的使用再日常开发的情景非常多.比如CMS 前台后后台,可以定义为Index和Admin,这样它们可以共用配置文件和library.而且url也更加友好。

开发过程中也能分模块开发.  我们可以把一个搜索栏目,拆为新闻模块,供应模块,求购模块,产品模块,公司模块。或者分得更细些

模块在Yaf中的配置

application.modules = admin,index

 

参考资料 

yaf.laruence.com/manual/

项目地址

https://github.com/laruence/php-yaf

解剖Facebook部落式架构(转)

Facebook 的Director of Engineering(工程总监)Aditya Agarwal,在2008年和2010年,在QCon国际会议上的两篇演讲 [3,4],谈及Facebook的系统架构,见图一。

解剖Facebook架构:传统烟囱解决不了新需求

图一. Facebook 的系统架构

 

由此可见,目前 Facebook 的系统架构,类似于早期 Yahoo! 的系统架构。作为门户,Yahoo! 是一大堆各色服务的汇集,包括新闻,财经,求职,Email 等等。Yahoo! 内部把每个服务称为 “部落”,每个部落自成一体,有各自的酋长, Yahoo! CEO 杨致远自称是大统领。

国内的门户网站,如新浪和搜狐,它们的系统架构大多也与 Yahoo! 的类似。

部落式的系统架构,有什么问题呢?

澳拜客(Outback Steakhouse)是一家全球连锁牛排餐厅,北京有两家分店,在王府井和工体院内,口味地道。澳拜客的正餐前的开胃菜,开花洋葱(Bloomin’ Onion),很受顾客青睐。

去年,澳拜客决定通过 Facebook 发放优惠券,以免费 ”开花洋葱“ 为号召,吸引顾客。促销活动从 2009 年 11 月 5 日开始,原订计划是做 30 天的活动,吸引 50 万顾客。

Facebook 的传染性果然威力惊人,活动开始后仅仅一周,就已经吸引了超过 20 万顾客,仅仅 18 天,就圆满完成了吸引 50 万顾客的任务 [5]。

对于 Facebook 来说,这不仅是一次赢利机会,而且也是一次绝好的宣传机会,今后可以举一反三,向其它商家推荐这种促销方式。但是 Facebook 没赚到什么钱,洋洋得意的,却是微软 [6]。

解剖Facebook架构:传统烟囱解决不了新需求

图二. 澳拜客(Outback)在 Facebook 上的 ”开花洋葱“ 优惠券

 

澳拜客的强项是烧菜,所以澳拜客的市场部把网络促销的实现工作,外包给了一家名叫Thuzi 的公司。Thuzi 的 CTO 认为,由于难以事先预料促销活动开始以后,会有多少顾客会光顾澳拜客的主页。流量难以预测,所以无法预先确定需要多少台服务器。合理的解决方案,是租赁云计算平台,根据实时流量,即时动态地分配服务器。多用多付钱,少用少付钱。

Thuzi 接到澳拜客的项目,是 2009 年 9 月的事儿,这时离促销开始的 11 月,只有两个月的时间。Thuzi 先是考虑租赁 Amazon 的云计算平台,但是开发工作量太大。又考虑了 Google 的云计算平台,但是使用太复杂。最后 Thuzi 选择了微软的 Azure 云计算平台,结果圆满完成任务 [6]。

在可见的未来,类似澳拜客这样的促销活动,将越来越多。Facebook 急需建设自己的云计算平台,而且还必须易学易用,把两个月的开发周期,最好降低到几天,甚至几个小时。

因为没有云,Facebook 丢了商机。而且丢掉的,不仅仅是市场促销活动这一类商机。

有个制作视频的服务,Animoto,在 Facebook 登台亮相之初,宾客盈门。Animoto 后台服务器在三天内,需求量从 40 台一下子猛增到 5000 台。热闹了一阵子以后,宾客热情消退,门可罗雀,根本用不了 5000 服务器。

如果在用户人数大增时,Animoto 不迅速增加后台服务器的数量,用户无法正常使用该服务,失去的是市场。但是用户人数大跌以后,这 5000 台服务器闲置,又造成对现金流的无意义的侵蚀。

所幸的是,Animoto 当初没有自己购置服务器,而是租用了 Amazon EC2 云计算服务,一场左右两难的惊悚,被云计算服务化解于无形 [7,8]。

Facebook 平台上,有 55 万个这样的服务。假如 Facebook 有自己的云,租赁云计算这笔大生意,就不至于落入 Amazon 和微软之手。

解剖Facebook架构:传统烟囱解决不了新需求

图三. Animoto 租用 Amazon 云计算服务

 

从这两个例子中,我们看到 “部落式” 的系统架构存在的一个问题。由于各个部落自成一体,不共享资源,造成各部落平时资源冗余,高峰时却又疲于应付。

无法实时地弹性地分配资源,这只是部落式系统架构存在的,诸多隐患中的一个。

业界经常把 Yahoo! 部落式系统架构,形象地称为 “烟囱”。烟囱式系统架构,虽然存在很多问题,但是技术门槛低,各部落各司其职,责任分明。从历史上看,曾经助力 Yahoo! 等等门户网站,迅速走向市场,这是烟囱的历史功绩。

但是随着时代的发展,传统的烟囱,解决不了新需求新问题。新需求新问题,需要云计算这个新技术。

Facebook 不是不明白这个道理,它正在逐步构筑自己的云计算平台。

本文参考文献:

[1] Apple SEC Filings.

http://finance.yahoo.com/q/sec?s=AAPL+SEC+Filings

[2] Warren Buffett and the Interpretation of Financial Statements

[3] Facebook: Science and the Social Graph

http://www.infoq.com/presentations/Facebook-Software-Stack

[4] Scale at Facebook.

http://www.infoq.com/presentations/Scale-at-Facebook

[5] Facebook + Cloud Computing = A Perfect Marriage for Social Media Marketing?

http://blogs.msdn.com/b/ingitaraj/archive/2010/03/29/facebook-cloud-computing-is-this-the-perfect-marriage-for-social-media-marketing.aspx

[6] Microsoft Case Studies: Outback Steakhouse.

http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000005861

[7] Above the Clouds: A Berkeley View of Cloud Computing

http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.pdf

[8] Animoto ramped up in the cloud.

http://www.informationweek.com/blog/main/archives/2009/01/behind_the_musi.html

也谈数据分析这点事(ZT)

  
  昨天看到了caoz写的《数据分析这点事》,非常值得深度,看完后很有感触,也在这里随便写写关于数据分析的个人看法。

  首先,在数据分析中我也不敢妄称高手,不会很多分析算法,不会用啥统计工具,只会傻傻的去盯着看。但是我非常喜欢看各种数据,大学时整天看各种硬件评测;研究生阶段看了无数相机、镜头评测;后来是每周琢磨全世界各种游戏机、游戏的销量。工作中也特别喜欢建立各种统计系统,看各种数据,现在公司的所有统计代码都是我自己写的,一般工作每天也会花接近30%的时间研究数据,至少可以算是个不折不扣的数据分析爱好者了。

  关于数据分析,caoz已经说的非常好了,我也只能补充一下自己的经验感受了。

  1、不管做统计还是看别人的数据,第一步永远是数据获取的可靠性。假如是采样数据的话,一定要看看采样方式,看看可能会存在什么样的误差。如果是自己数据的话,也要看看数据获取本身是否科学,例如统计用户行为一般都用js回调,如果还用apache日志来做统计,结果想来也不会靠谱。

  2、获取到数据之后,肯定是需要建立统计,这时候,需要想想,建立什么样的统计信息才能更好的分析产品及用户的特性。很多时候,往往单一特征已经很难去描述,需要综合很多地方来看。例如网页搜索中,往往要看首条CTR、前三条CTR,末次点击等多种因素,并通过很多种不同因素结合做出分析和判断。

  3、对数据要抱有怀疑之心,尤其是数据本身与你要达到的结论之间有没有必然的因果关系。举个例子,网页搜索结果如果CTR高一定就是体验好吗?搜索广告的RPM高就一定理想吗?

  4、生成同一个数据,往往可以有不同的统计方法,如果选择错误的话,结论往往会大相径庭。例如想分析网站对搜索引擎的依赖性,究竟应该用PV,用Session,还是用UV做统计呢?如果一个用户一天访问多次,某些是来自搜索引擎,某些是主动访问,该如何计算呢?这里面还是有很深的学问。

  5、数据中往往会有很多噪声,怎么将这些噪声过滤也很重要。就像投票有投票机,有些spider会执行你的统计js,有些用户会误点,如果没有很好的过滤和处理,会使数据的可靠性大打折扣。

  6、理解各种可能会使数据产生波动的原因,并通过不断的分析、验证和排除找到真正原因。例如当发生搜索流量下降,有可能有很多种原因,例如机房网络出故障、竞争对手用某些产品捣乱、上线的代码存在重大不稳定因素、运营商出故障或者拉闸限电等等,这中间每个都有不同的验证方式,需要从服务器日志、基调数据、分区域、用户行为等多个维度去进行跟踪和试验,找到真正可能的核心原因。

  对数据进行预估和判断需要一种感觉,这种感觉不是天生的,而需要不断的锻炼和培养。这个过程可能很漫长,一般情况下,需要先看很多数据,培养自己对数据的基本认识,也要分析一些事件中(如周末、节假日、或者故障等)数据的变化。而在产品上线前,先自己锻炼一下预估,然后再通过实际值对自己的预判进行验证和评估。通过这种不断的学习和分析,逐渐培养出自己对数据的领悟。

  数据来源于用户,这个很多时候更是需要对人性的研究和分析。就像摆在页面不同位置的广告,CTR一般能达到多少?同样位置,摆广告好还是摆用户产品好?要做某个新产品,CTR能到多少?做互联网的大多是高端用户,很多东西自己是不会用不会点的,但正是这样,需要对用户有非常强的代入感,去换位思考,去分析人性,才能事先避免很多过于乐观的预估,以及无谓的试错。

  以上,是自己的一点经验之谈。

数据分析这点事(ZT)

from: http://hi.baidu.com/ncaoz/item/564975db8fcd6495260ae79e

  先声明一下,按照传统的定义,我还真不是数据分析高手,各种关联算法,只会最简单的一种(话说不少场合还算管用);各种挖掘技术,基本上一窍不通;各种牛逼的数据分析工具,除了最简单的几个免费统计平台之外,基本上一个都不会用。所以,各种高手高高手请随意BS,或自行忽略。这里说点高手不说的。

  从微博段子说起,微博上关于数据分析有两个段子,我经常当作案例讲,第一个段子,说某投资商对某企业所属行业有兴趣,要做背景调查,甲是技术流,一周分析各种网上数据,四处寻找行业材料,天天熬夜,终于写出一份报告;乙是人脉流,和对方高管喝了次酒,请对方核心人员吃了顿饭,所有内幕数据全搞定,问谁的方法是对的;第二个段子,某电商发现竞争对手淘宝店,周收入突然下降了30%,但是隔周后又自然恢复,中间毫无其他异常现象,于是老板让分析师分析,苦逼的分析师辛苦数日,做各种数学模型,总算找到勉强的理由自圆其说,老板读毕,虽说不能让人信服,却也没有更合理的解释,某日,见对手老板,闲聊此事,“你们某段时间怎么突然收入下降?”“嗨,别提了,丈母娘去世了,回家奔丧,公司放羊了。”老板恍然大悟。

  两个段子,第一个段子,微博上一边倒的说,苦逼分析没有人脉有用;第二个段子类似,一边倒的认为,人脉的消息比苦逼分析管用多了。但是我想说的是,这个解读绝对是错的!

  先说第一个段子,其实网络不乏这种“人脉达人”,特别是媒体圈,一些所谓的“IT名记”或者“著名评论家、分析师”和各种互联网大佬称兄道弟,天天秘闻不断,但是呢?他们从不研究产品,不分析用户,所以,他们知道了数据,却不懂数据背后是什么,更不知道什么是重要的,什么是次要的,我有时会批评身边这样的朋友,别天天觉得自己知道几个互联网大佬的花边新闻,就当自己是资深业内人士了,正因为掌握这些东西又觉得炫耀,才反而忽视了真正有价值的信息和有价值的数据。这就是为什么混网络媒体的,见过市面的各种达人,在互联网创业浪潮里,几乎没有成功几率的真实原因,自以为人脉广泛,无所不知,其实正因为缺乏最基本的数据背景分析,所以才是看上去什么都懂,细究下其实什么都不懂。请记住一点,除非你是富二代,官二代,衔着金钥匙出生,那不在我的讨论范围里,否则,没有苦逼的经历,就没有牛逼的成就。

  我常订阅一些著名分析师的微博,他们透露的数据往往是很有价值的(这是我订阅的原因),但是他们的解读通常是惨不忍睹的,这就是只看表象的恶果,而且随便翻看一下他们的数据解读,可以说他们的数据感和数据认知贫乏到可笑,甚至缺乏最基本的数据校核和考证的能力,他们拿到了某公司核心数据又怎样?没经历过苦逼的分析,他们其实什么都看不到。

  第二个段子同理,如果不是持续有效的数据跟踪,怎么能得出下降30%的结论,这一数据结论与人脉得到的消息相互验证,才会得到完整真实的结果,否则仅仅是闲聊,你怎能知道对方企业管理对业绩影响的范畴,苦逼的分析也许一时没有人脉的消息管用,但是你所得到的对数据的认知和积累,是人脉永远不会给你的。

  所以,再次强调,基本的数据跟踪和日常的数据感养成,绝不是可以忽略和无视的。人脉情报可以成为数据解读重要的信息来源,但是绝不能喧宾夺主,替代基本的数据分析工作。

  下面说一下数据感,什么是数据感?就是别人说一个数据出来,你会琢磨一下这个是否符合常理,与你日常的数据观测经验是否一致,如果不一致,那么可能的理由是哪些? 比如12306号称一天几十亿次点击,如果你有数据感,第一眼就会质疑这个“点击”定义的合理性;比如曾经有人说某国内图片分享网站一天多少亿访问量,第一眼就知道这个“访问量”定义是有歧义的,(事后官方解释是图片加载量,这个和访问量差异几十倍。) 数据感需要不断的培养,和基本的逻辑(比如你应该知道中国有多少网民,每天有多少人上网,一个大概什么类型,什么排名的网站会覆盖网民的比例是多少),以及善于利用各种工具,我以前在巨头公司,得益于公司巨大的数据资源,可以看到很多互联网的核心数据;但是离开后,才发现,其实互联网上公开可获取的数据途径是非常多的,而且善于利用的话非常有效。每天去查询一些感兴趣的数据,经过一段时间积累,想没有数据感都难。

  作为公司或团队负责人,怎么培养员工的数据感,我其实也有一个建议,平时可以搞一些小的竞猜,比如团队集体竞猜新产品或产品改版上线后的日活跃用户,或者pv数字,或者收入数据,等等;然后看谁的最准,一种是惩罚制,最不准的请最准的喝奶茶,吃冰淇淋;另一种不惩罚,最准的累计积分后公司可以发一些奖品鼓励,这样下去大家的数据感就会在日常培养起来,而且对团队的气氛培养也有帮助。

  数据感之后,谈数据分析的方法,我的建议是,不炫技,不苛求技术复杂度,最简单的数据,所包含的信息往往是最有价值的,而很多人恰恰这一步都没做好,就总想着弄一堆挖掘算法;数据的价值在于正确的解读,而不是处理算法的复杂度,切不可喧宾夺主。 大公司的kpi制度,往往会产生偏差,比如技术工程师的评定,要讲究“技术复杂度”、“技术领先性”,直接导致简单的事情没人肯做,最基本的工作不认真做!所以往往是大公司的分析工程师,为了评高级工程师,非要简单问题复杂化,四则运算就搞定的事情一定要弄一套诡异的算法,最终非但浪费了资源,消耗了时间,而且往往由于工程师对业务理解的漠视,对应的产品人员又对算法的陌生,导致了严重的理解歧义,从而出现各种误读。

  下面说关键,数据解读,正确的数据解读,是所有数据分析工作最关键的一步,这一步错了,前面的所有努力都是白搭,然后,往往很多人简单的以为“数据会说话”,他们认为把数据处理完一摆就ok了,所以我看到很多知名分析师拿着正确的数据信口胡诌;而更有甚者,显然是故意的行为,一个非常非常著名的、口碑极佳的跨国企业,曾经就同一份很酷的数据,在不同的场合下,为了市场公关的需求,做出不同的解读;这简直就是道德问题了。

  数据解读,不能是为了迎合谁,要遵循数据的本质,要遵循科学的逻辑,要有想象力(配合求证),可能有时候也需要依赖人脉关系所获得的情报,(这个也有很多典型范例),这个具体再怎么说可能我也说不清楚,说几个反面例子也许更容易理解。

  1、因果关联错误,或忽略关键因素,A和B的数据高度相关,有人就片面认为A影响了B,或者B影响了A;但是,有时候真实原因是C同时影响了A和B,有时候C被忽略掉了。

  2、忽略沉默的大多数,特别是网上投票,调查,极易产生这种偏差,参与者往往有一定的共同诉求,而未参与者往往才是主流用户。

  3、数据定义错误,或理解歧义,在技术与市场、产品人员沟通中产生信息歧义,直接导致所处理的数据和所需求的数据有偏差,结果显著不正确。

  4、强行匹配;不同公司,不同领域的数据定义可能不一致,在同一个公司内或领域内做对比,往往没有问题,大家对此都很习惯,却有评论家不懂装懂,强行将不同定义的数据放在一起对比做结论,显著失真;海外著名金融机构在分析中国页游和端游市场就连续犯这类错误。

  5、忽略前提;有些数据结论是基于某种前提,符合某种特定场景下得出的,但是解读者有意或无意忽略前提,将结论扩大化,显著误读。

  6、忽略交互;在商业模式改造和产品改进,往往都会出这类问题,最简单说,你游戏中的道具降价,对收入的影响是增还是减?如果忽略交互,仅仅依赖于数据推算,当然是减,但是实际呢?做运营的都知道。

  7、缺乏常识;如果对一些重要的纪念日,节日,或者网购节不了解,那去处理有关数据显然就不知所云了。做行业报告更是如此,很难想像对行业不了解的人能做出怎样的报告。

  8、无视样本偏差;我们通常做数据调研,是基于样本数据,而采样过程本身很难做到完全的公平和分散,样本偏差要控制在合理范畴内,即便无法控制,在结论中也需要标注;这才是严谨的数据解读,对样本偏差视而不见,甚至为了某种宣传目的刻意寻找偏差的样本,都不可能做出好的数据结论。

  那么, 数据处理也多说一点,虽说是个技术活,但是有些不那么技术的事情,也必须做到位才行;很多时候,我看到一个数据,不符合我的预期,我第一反应,是了解数据来源和处理逻辑,我们通常面对的数据,包括大量的干扰,噪音数据,以及一些识别上容易产生歧义甚至误判的数据,这都是需要处理的,很多时候工程师只关心算法层面、效率层面,不愿意也不关心这些东西,所得出的数据结论失真度就非常高,越是大公司,这种情况越普遍;在我效力的巨头公司时,这样的范例非常多,处理方法其实很简单,多看看源数据,对中间的噪音和干扰数据正确识别标注,对容易误判的数据进行二次判定,全是苦力活,没啥技术含量,但是这是必须的。

  最后,很多人想知道我怎么看数据,或者想问我,他们每天看很多数据,不知道怎么去看,我其实有很简单的三板斧,一学就会,一用就灵,对常见的数据场景,可解决绝大部分日常需求。 简单说就是“对比,细分,溯源” 六字真言,没了。

  对比,数据放在那里,是没意义的,你说你游戏周流失率80%,啥情况?不知道,你问我我也不知道。对比起来才知道。

  一是横比,你拿出50款游戏来比,别人平均流失率90%,你80%,你游戏还不错勒,别人要平均流失65%,你80%,这就有问题了。

  二是纵比,和自己时间轴比,你两个月前1.0版本流失率90%,你现在80%,有进步么,你要是两个月前是50%,现在80%,好好反思喽。

  所以,我特别强调,在通常企业数据监控,显示一大屏数据的界面上,对比特征要最大体现,比如所有同比下降超过多少比例的一概红色体现,所有上升多少比例的一概绿色体现,公司运营状况一目了然。

  细分,数据出现对比异常,你当然想知道原因,那就需要细分了。

  细分先分维度,再分粒度,什么是维度?你按照时间去分,就是时间维度,按照地区去分,就是地区维度,按照来路去分,就是来路维度,按照受访去分,就是受访维度;你说今天网站访问量涨了5%,咋回事不知道,你细分一看,大部分网页都没涨,某个频道某个活动页涨了300%,这就清楚了,这就是细分最简单的范例,其实很多领域都通用。 粒度是什么,你时间维度,是按照天,还是按照小时?这就是粒度差异,你来路维度,是来路的网站,还是来路的url,这就是粒度的差异;这样可以将对比的差异值逐级锁定,寻找原因。

  溯源,有时候我对比,细分锁定到具体维度,具体粒度了,依然没有结论,怎么办,溯源,依据锁定的这个维度和粒度作为搜索条件,查询所涉及的源日志,源记录,然后基于此分析和反思用户的行为,往往会有惊人的发现,我们正是基于这一逻辑发现过产品的一些缺陷,而且你不断通过这个方式分析数据,对用户行为的理解也会逐步加深。

  其实,这个话题还有很多延伸,比如,如何看一个年轻人有没有数据分析潜质;以及如何培养数据分析和产品分析人才,等等,不过,就这样吧。今天说的不少了,我水平有限,吃饭的就这几招,而且又老又笨,大家都会了我离下岗也不远了,您就凑活看吧。

  感谢诸多网友反馈提到的错误用词,纬度修改为维度,特此标注。

  还有这个人品大爆发,连续被名人推荐,受宠若惊,其实,这个,愧不敢当。

用于响应式设计的9个CSS技巧(转)

本文将介绍一些CSS设计技巧,包括取消下划线、设计响应式视频、背景图片的设置以及相对值等。这些技巧可以适用于各种类型的网站,而且对于后期的网站维护也十分方便。

CSS已成为Web发展不可或缺的部分,开发人员可以使用它来改变网页元素的样式。而随着响应式设计越来越流行,CSS在响应式设计中已扮演着举足轻重的角色,在进行响应式设计时,倘若你能掌握一些CSS技巧,将大大提高你的工作效率。

本文将介绍一些CSS设计技巧,包括取消下划线、设计响应式视频、背景图片的设置以及相对值等。

1.取消下划线

现在越来越多的网站文本链接已取消下划线,而这已成为一种Web设计趋势,尤其是在做响应式网站时。下面提供一段简单的CSS代码,可以轻松取消文本链接下划线:

 

1
2
3
4
5
<style type=”text/css”>
a {
text-decoration:none;
}
</style>

2.响应式视频

在网页中嵌入视频,这里介绍 tjkdesign.com给大家,里面提供了许多CSS技巧,帮助你在页面中嵌入响应式视频( DEMO)。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.video {
positionrelative;
padding-bottom56.25%;
height0;
overflowhidden;
}
.video iframe,
.video object,
.video embed {
positionabsolute;
top0;
left0;
width100%;
height100%;
}

3.Rollover文本链接

越来越多的人喜欢在手机上浏览网页,这使得Rollover链接变得越来越流行。想要实现该效果一点都不难,代码也非常简单。

 

1
2
3
4
5
<style type="text/css">
a:hover{
color:red;
}
</style>

4.最大、最小宽度 

最大最小宽度可以帮助页面元素设置边界线,其最基本的目的是使所有页面元素都能在边界范围之内。下面提供一段代码,你也可以根据需要进行修改:

 

1
2
3
4
5
.container {
width800px;
max-width90%;
}

下面这段代码将会根据边界线自动调整图片大小: 

1
2
3
4
img {
max-width100%;
heightauto;
}

上面这段代码仅适用于IE 7和9,对于IE 8需要作出以下修改: 

1
2
3
4
5
@media \0screen {
img {
widthauto;/* for ie 8 */
}
}

最小宽度设定

5.背景图片

一些开发人员喜欢给table或者block设置背景图片,CSS有一段代码是专门设置背景图片的:

 

1
2
<div style="background-image: url(../images/test-background.gif); height: 200px; width: 400px; border: 1px solid black;">Example of a DIV element with a background image:</div>
<div style="background-image: url(../images/test-background.gif);height: 200px; width: 400px; border: 1px solid black;"> </div>

6.相对值 

相对值是响应式设计中非常重要的部分,如果你想要获得最佳效果,你就应该知道如何使用这些值,这对网站的布局是非常重要的。

 

 

Relative Font Size

在设置字体相对大小时,需要根据父元素进行设置:

相对比例填充

7.突出边界

 

1
border-bottom2px solid #427AA8;

8. Word-Break 

下面这段代码可以很好的实现文本换行:

 

1
2
3
.break-word {
word-wrap:break-word;
}

9.CSS溢出:隐藏技巧

visible的相对值默认情况下是隐藏的,如下图所示,超出box部分的内容就被隐藏起来了。

 

总结

以上都是用于响应式设计的最简单技巧,并且可以被普遍使用于各种网站上,对于后期的网站维护也十分方便。(编译/张红月 责编/夏梦竹)

原文链接: SMASHINGHUB