作者存档: AnyKoro

1,444 查看

O2O核心应该是让用户省力更享受,让商家可控更获利

O2O,Online 2 Offline,其只是一种形式,或者说是一种工具。而如何用好 O2O 却不容易,正如灭绝师太虽手握倚天剑,但也技不如人,而扫地高僧虽手持蔽帚,但也所向披靡。O2O 的威力完全取决于使用者对市场和 O2O 本身的理解。 我认为使用 O2O 的核心是:让用户省力更享受,让商家可控更获利! 围绕着这个观点,按照根据用户和商家的特点,我将使用 O2O 的方式分为两种:单线型O2O和回环型O2O。 单线型O2O,该类型的典型使用情况如下: 用户侧:用户本身的需求相对简单或明确,同时对提供的服务没有严苛要求。 商家侧:产品的开发能力和服务能力都相对较弱。 平台侧:提供完善的需求分类和查找体系、提供较为完善的(双向)评价体系。 简述:当前最常见的 O2O 消费模式,线上预定或购买,线下完成消费。完成消费时,整个 O2O 流结束。 单线型 O2O 广泛存在于当今的互联网商业中,最典型的莫过于团购。线上购买,线下消费。这种模式简单且易于操作,用户和商家都十分容易接受。但其实,团购并不十分适用单线型 O2O,具体的原因会在回环型 O2O 中说明。为了更好说明此类 O2O 的模式和采用原因,这里我要举个已有端倪但远未完善的例子——C2C 的(LBS)O2O。顾名思义,这种 O2O 无论用户还是商家都是个人,我认为中国经济极有可能因此巨变。接下来,让我们试想下几个场景:狗狗代遛、书法教学、音乐教学、社区食杂店。下面我将对这几个场景做逐一说明。 狗狗代遛 用户因为工作忙碌而无法经常遛狗,所以可以将狗狗委托给商家进行代遛。此处的用户诉求通常十分简单:1、与商家距离很近,可以简单完成交付 2、能经常代遛狗狗;而用户对遛的质量并不十分在乎,只希望狗狗能解决大小便问题同时还能有一定的运动量。此时对商家来说,利润的高低并不是最主要的,往往是因为商家(个人)要么是本身在家闲来无事,要么就是原本就需要遛狗,不在乎再多加一条狗狗。也正是在这种情况下,用户的基本需求不仅得到了满足而且花费很少;商家则因为用户并无十分高的要求,做的自得其乐并获一定收入。 书法教学 虽然现在写字的机会越来越少,但写得一手好字仍令人羡慕。但这种需要长期坚持的“手艺活”,在没有老师的状况下入门较难而且难以坚持。如今即便能找到专门的书法培训机构,用户也不会愿意为此花数小时在路上。所以,此时的用户只希望有个距离很近的教学点,然后能够在老师的指导下完成 1 …

继续阅读 »

1 查看

如何打造移动互联网入口应用

本文发表在36kr:http://www.36kr.com/p/205710.html 移动互联网上的争夺越来越激烈,无论是巨头还是创新者都希望自己能打造出下一个移动互联网入口应用。本文将为你揭开成为入口应用所需要的必要条件。 在进入正文之前,为了方便描述,我们先做如下约定: 主入口:绝大多数用户都会通过它使用互联网。 入口:指用户通过它使用互联网,但覆盖面低于主入口。 准入口应用:指具有成为入口应用的潜质,但还不为入口的应用。 入口应用:无论在用户量,产品属性等各个方面都已成为入口应用的应用程序。 传统互联网:在本文中主要指在 PC 端使用互联网。 移动互联网:在本文中主要指在手机端使用互联网。 以史为鉴,可以知兴替。探思移动互联网的问题,我们需要从传统互联网开始。 结论: 入口的形成是因为习惯,入口的替换也是因为习惯,而使用的简便性决定了习惯的形成与更替 佐证: 传统互联网入口的产生和 PC 的最初定位有很大关系,即使 PC 提供了大量生活娱乐功能,但是其根本仍然在于让人们更方便地获取信息。所以,获取信息始终是 PC 端互联网的最主要功能。 传统互联网就是在这个脉络下不断发展,从 Web 1.0 时代(Yahoo),再到搜索引擎(Google),再到后来的社区(Facebook)和微博(twitter)。虽然形式发生了巨大变化,但是本质并没有变,始终围绕着为用户提供信息,只是在两个纬度上发生了变化,一是主动搜寻信息的便利性(搜索简化了搜寻信息的方式),二是被动获取信息的便利型(微博关注简化了获取信息的方式,当然其中也涉及用户是否乐于分享,但本质都是信息的传递)。 何为互联网入口?顾名思义就是进入互联网的第一站。比如我们常说,搜索是互联网的入口,其实这从另一个侧面说明了传统互联网的主属性是信息获取,搜索也正因提供了一条获取信息的简便途径而变得如此重要。 互联网的入口就只有搜索吗?当然不是,搜索只是主入口,它满足了 80% 的人的 80% 的目的。那么其他的一些入口是哪些呢?比较典型的有游戏、社交、电商等。之所以搜索会成为互联网主入口,是因为人们使用互联网的首要目的是获取信息,所以在无形之中养成了很强的用户习惯。比如,上京东购物,仍然会有大批人群会在百度中搜索京东,甚至直接在搜索框中输入域名。也正因为搜索非常切合传统互联网的需求,所以使其牢牢的成为了互联网的主入口。 这里我们还要说一下,另一个重要的入口分支——微博。微博的存在也是为了信息的获取和扩展,其主属性也十分切合传统互联网的需求,所以微博也是一个重要入口。因此微博为了巩固这个入口,它们唯有保住自己的“命脉”——禁止搜索引擎抓取自己的数据。只有这样才能让用户养成在微博中搜索的习惯。最典型的莫过于,Facebook 禁止 Google 抓取自己的内容。 由于马太效应和用户习惯的存在,搜索引擎和 SNS 产品作为入口是很难被替代的。因此要想撼动既有的强者,唯有让用户产生另一种更强的习惯,然后用一种习惯替代另一种习惯,所以入口之争又更往纵深发展了。于是系统预装的导航网站又成了香饽饽,对于大量的互联网初级用户,导航网站告诉他们哪里能看视频、哪里能玩游戏、哪里又能听音乐,关键还都是免费的。用户开始习惯将导航网站作为入口,同时上面的搜索框使用也更为方便,渐渐的,用户就习惯了,很少在意这个框是百度还是搜搜。这也是百度收购不少导航网站的重要原因。虽然导航网站也是网站,但由于能够被系统预装,所以从层级上来说它比入口级的百度更底层。如果再往下看,我们会发现浏览器的默认导航页、浏览器的搜索框、地址栏,甚至桌面上的搜索框插件等都可以更底层地将入口注入进去,但每一次必定都会简化用户的使用。所以 360 …

继续阅读 »

1 查看

HHVM简介

本文是一篇翻译的文章,因为觉得HHVM是以后的趋势,所以兴奋之余就翻译了此文,全当普及。 该文来源:http://coderoncode.com/2013/07/24/introduction-hhvm.html HHVM (HipHop Virtual Machine)会将PHP代码转换成高级别的字节码(通常称为中间语言)。然后在运行时通过即时(JIT)编译器将这些字节码转换为x64的机器码。在这些方面,HHVM十分类似与C#的CLR和Java的JVM。 历史 早在2008年Facebook就开始使用HipHop(现在成为HPHP),这是一种PHP执行引擎;最初是为了将Fackbook的大量PHP代码转成C++,以提高性能和节约资源。最初的版本成为HPHPc,是一个PHP到C++的编译器。   之后的两年里,Fackbook又向HipHop中增加了HPHPi和HPHPd,HPHPi其实就是开发版的HPHP,HPHPd则是HipHop的调试器。通过HPHPd开发人员可以单步调试运行在HipHop平台上的PHP代码。   使用HipHop的PHP代码在性能上最大可以是原生的6倍。但是,第一版的HipHop有不少确定,具体如下:   HPHPc 无法完全支持PHP的所有特性,最典型的是无法支持create_function()和eval()两个函数。但老实说,不支持后一个函数我不觉得是件坏事。 Facebook的开发者不得不维护两种不同的引擎(HPHPc和HPHPi),这直接导致了重复劳动和资源浪费。 最后,HPHPc部署步骤繁杂,这点很让PHP开发者头疼。. 在2010年初,Fackbook因为这些问题做出了2个重大的决定。首先是将HipHop平台开源,通过这种方式来加快HipHop的发展。 其次,Facebook开始开发HipHop的更高版本,也就是HHVM(HipHop虚拟机),HHVM加强了HPHPc的健壮性,同时还修复了许多重要错误。   HHVM是在HPHPc的基础上构建,它会将PHP代码转换成高级别的字节码(一种中间语言),在运行时即时(JIT)编译器会将这些字节码翻译成机器码。   下面是一些关于字节码、机器码和即时(JIT)编译器的概念,快速的浏览以下概念,可以清楚这些概念在HHVM所处的角色。 字节码:是一种人类无法阅读的代码,专门用来给编译器高效执行的。当HHVM首次加载项目时,它会将所有的PHP代码转换成字节码;字节码的生成是与平台无关的。 机器码:是一系列供CPU执行的指令。用过汇编的都应该清楚机器码,估计没人喜欢用汇编编程。通过编译器就可以把汇编转成机器码,然后供CPU处理。 JIT(即时)编译器:即时编译是种软件优化技术,指在运行时才会去编译字节码。字节码会存放在内存中,然后JIT编译器会根据需要加载并编译所涉的字节码。   通过以上技术,HipHop和HHVM获得了性能的提升。   最近,HHVM几乎已经完全支持PHP 5.4了,但还是有不少bug,所以不是所有应用程序都可以运行。因此,Facebook准备让最流行的20个开源PHP项目能够运行在HHVM上。第一个已经支持的项目就是Wordpress。 接下来该怎么做 更好的理解HHVM的功能和优势。在之后的文章中我会讲解如何安装HHVM专用的Vhost,并在HHVM上运行Magento。

9,847 查看

使用Apache Zookeeper分布式部署PHP应用程序

原文:Distributed application in PHP with Apache Zookeeper 地址:http://systemsarchitect.net/distributed-application-in-php-with-apache-zookeeper/ 这篇文章实在不错,实在忍不住翻译下来,希望对大家有用。 Apache Zookeeper是我最近遇到的最酷的技术,我是在研究Solr Cloud功能的时候发现的。Solr的分布式计算让我印象深刻。你只要开启一个新的实例就能自动在Solr Cloud中找到。它会将自己分派到某个分片中,并确定出自己是一个Leader(源)还是一个副本。不一会儿,你就可以在你的那些服务器上查询到了。即便某些服务器宕机了也可以继续工作。非常动态、聪明、酷。 将运行多个应用程序作为一个逻辑程序并不是什么新玩意。事实上,我在几年前就已写过类似的软件。这种架构比较让人迷惑,使用起来也费劲。为此Apache Zookeeper提供了一套工具用于管理这种软件。 为什么叫Zoo?“因为要协调的分布式系统是一个动物园”。 在本篇文章中,我将说明如何使用PHP安装和集成Apache ZooKeeper。我们将通过service来协调各个独立的PHP脚本,并让它们同意某个成为Leader(所以称作Leader选举)。当Leader退出(或崩溃)时,worker可检测到并再选出新的leader。 ZooKeeper是一个中性化的Service,用于管理配置信息、命名、提供分布式同步,还能组合Service。所有这些种类的Service都会在分布式应用程序中使用到。每次编写这些Service都会涉及大量的修bug和竞争情况。正因为这种编写这些Service有一定难度,所以通常都会忽视它们,这就使得在应用程序有变化时变得难以管理应用程序。即使处理得当,实现这些服务的不同方法也会使得部署应用程序变得难以管理。 虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,由Andrei Zmievski在2009创建并维护。你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。 要使用该扩展你首先要安装ZooKeeper。可以从官方网站下载。 $ tar zxfv zookeeper-3.4.5.tar.gz $ cd zookeeper-3.4.5/src/c $ ./configure –prefix=/usr/ $ make $ sudo make install 这样就会安装ZooKeeper的库和头文件。现在准备编译PHP扩展。 $ …

继续阅读 »

550 查看

编码碎碎念

实在不知道该如何取名,姑且先这么叫吧。 其实,照片文章主要是要讲解我们经常会在浏览器(xml,html)中遇到的一些编码,以及unicode,gbk,utf-8中的一些简要关系,以及后端的一些关联。 OK,让我们先看下场景1 从一个URL中看起: http://www.baidu.com/s?wd=%E6%88%91%E6%98%AF%E5%A5%BD%E4%BA%BA 肯定有人奇怪wd=后面一串是什么玩意? 你可以用JavaScript中的decodeUri解析出来: decodeURI("%E6%88%91%E6%98%AF%E5%A5%BD%E4%BA%BA") //输出 "我是好人" 这里,推荐你阅读下,这篇文章。在这篇文章中,你会知道,为什么用decodeURI可以解码出,为什么unescape不可以。 言归正传,这串奇怪的字符到底是怎么出来的呢? 其实就是将UTF-8版的“我是好人”,传入了encodeURI,然后得到的。 这里有两点要注意, 1、本身文字内容的编码是UTF-8 2、传入encodeURI,其实就等于又进行了一次urlencode 没有错,做了两种编码操作,这就是为什么这个代码看上去这么怪的原因。 ok,这里先说这个情况。接下来,让我们看场景2 escape("我是好人") //输出 "%u6211%u662F%u597D%u4EBA" 这一串又是什么?这个是unicode,其实真正的unicode码是6211,只是为了表示是unicode,js里面都会加上%u。 再看个场景3 将下面这段复制到Html文本中,然后用浏览器显示: <div> &#25105;&#26159;&#22909;&#20154; </div> 你会看到,页面上显示“我是好人”。 我靠!这又是什么情况? 其实,你将场景2中的数字部分,转换成10进制,对应的就是场景3中的数字了,不同的是一个前面用的是%u,场景3中,用的是&#。 其实上面,还可以写成: <div> &#x6211&#x662F&#x597D&#x4EBA </div> 效果是一样的。 但是&#可以直接被浏览器渲染,这是因为HTML是采用UTF-8作为标准字集。(注意,unicode的编码和UTF-8的编码只需要通过模板就可以很方便的转换,所以,从一定意义上可以认为unicode和utf-8是一回事,但是unicode和GBK完全不是一回事,这点要注意。) 这里其实就是&#nnn,这个的nnn就是unicode的编码,而&#可以认为是html的约定,只要出现这个就是需要转义的。 而%u只是转码出来用来标示这是unicode的,并不是用来告诉浏览器如何解析的。 现在让我们思考场景1和场景2的关系。 其实说到这里就要明白utf8产生的原因,其原因是因为要减少网络传输的使用带宽,同时前面也说utf和unicode的互转可以通过模板简单实现。同时,浏览器是可以识别utf的,当然你要指定,此外操作系统本身就可以识别unicode,自然浏览器也可以识别。所以,你直观看起来就可能比较迷惑了。因为都是“我是好人”。其实这个时候我们应该从他们对应的十六进制码来看,对于utf和unicode来说,两者对应的十六进制值是不同的。这点很关键,这也就是他的背后要两个不同函数解析的原因。总而言之,对于编码操作,为了不混淆,在思考问题时,一定要转换成对应的16进制值。 …

继续阅读 »

1 查看

RamDisk, vmtouch and mlock

在实际工作中,我们经常会希望能有效提升IO性能,最直接的方法就是使用内存来代替磁盘,随着内存的不断白菜价,现在这种方式已经完全可行了。SQL Server中准备引入In-Memory技术,就是基于此种考虑,当然带来的效果也是很明显的。据说相对磁盘能有50倍的提升。 今天我们就介绍三款可以做到类似功能的产品,当然他们的使用场景还是有所区别的。 因产生本身简单,所以相关的介绍内容也很少。               RAM disk 一、介绍   Ram Disk:将内存划分出来一部分当磁盘使用。 优点:提升性能,加速读写。 缺点:重启后Ram Disk数据会丢失。     二、使用方法:   1、查看linux系统中的“内存盘”     $ls -l /dev/ram*   2、格式化RamDisk $mke2fs -m 0 /dev/ram0 3、创建挂载点并挂载RamDisk $mkdir /mnt/rd $mount /dev/ram0 …

继续阅读 »

1 查看

Java中的Hashtable实现方法

首先,先上Hashtable.class中的代码,所有的Java实现方法都在这个文件中了。 /* * %W% %E% * * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.util; import java.io.*; /** * This class implements a hashtable, which maps …

继续阅读 »

1,821 查看

OAuth2.0中的关键性概念解释

一、角色                                                                                                                               OAuth定义了四种角色: 1、resource owner资源所有者 可以获得授权去访问受保护的资源的实体。这句很绕口,简单来说就是资源的所有者,这个所有者是指当初上传或生成的那个所有者,并不是指服务器的所有者。比如,anykoro在新浪微博中发了一篇微博,这个时候anykoro是resource owner,这篇微博就是resource 2、resource server资源服务器 承载受保护资源的服务器,可以接收和响应使用access token(访问令牌)请求受保护资源。 我们继续前面的例子,这里新浪微博的服务器就是resource server,它提供了可以通过access token获取anykoro所发微博的功能。如果不能提供这个功能,那么当然也就称不上resource server。 3、client客户 一个产生受保护资源请求的应用,该应用代表resource owner,并且已经获得其授权。所以其实客户就是指前面说到的这种特性的应用,是种application。还是继续前面的例子,现在anykoro在xxx网站,使用新浪微博账号登陆。此时这个xxx网站就是client。anykoro是resource owner,请求资源的服务器就是resource server。这里将这三个一起做总结,主要是因为,为了便于理解。 4、authorization server授权服务器 用来分发access token的服务器,主要分发给client,反过来说,就是client会向authorization server请求access token。当client获得access token后,才能说已经验证了resource owner,并且已经获得其授权。 这个部分对应什么?比如,anykoro使用新浪账号登陆时,会出现类似下图的情况, 点击授权后,client就获得了authorization code。 注意:现在来让用户做授权与否操作的,可不是authorization server!!! 真正的authorization server是给client用的,anykoro是看不到的。 二、协议流                                                                                                                              接下来让我们看一张图,来更好的理解四种角色间的交互作用 +——–+ +—————+ | |–(A)- …

继续阅读 »

2,016 查看

Varnish中如何更灵活的编写vcl

Varnish本身的VCL语法是很简单的,功能也有限。不过可以完成比较好的固定要求的需求。 比如当我们要设置ttl为一个特定值时候,我们可以这么设置 set beresp.ttl = 3600s 上面表示将ttl设置为3600s。 我们如果现在有一个这样的需求, 我希望每个页面有自己的缓存时间,而不是统一为3600s。这个时候该怎么做呢? 因为可能是跨平台的,所以,最直接想到的,自然是使用http协议头信息进行控制。 这里我是这么做的,首先我们定一个新的协议头,名为Cache-Span。我没有使用原有的Pragma和Cache-Control等,这些原有的头信息,主要是因为,这些事保留给控制浏览器使用的。另外,为了简化在Varnish中使用正则,自定义一个头,是最简单的方法。 在程序部分,我们也可以在一个信息要发送出去之前,加上该头信息。 对于Varnish来说,只需要解析头信息即可。于是又了下面的代码, set beresp.ttl = beresp.http.Cache-Span; 如果你使用这段代码,当重启varnish的时候,会提示String不能转成Duration。 这下郁闷了吧。 不过,不担心,这里我们就要引入,我们这次要着重介绍的库vmod_std,该库,在varnish3.0中默认是一起发布的,所以,在使用时候,只要import std;即可了。 这里,贴一下该库的文档连接,应该还是很简单易用的。 https://www.varnish-cache.org/docs/trunk/reference/vmod_std.html 于是,我们就将代码变成了 set beresp.ttl = std.duration(beresp.http.Cache-Span+"s",3600s); 这里文档上写的是3600,是错的。是需要加s的。 Ok,这样就满足了我们需求。如果有更复杂的需求,都可以采取类似的方案进行处理。 最后,附上,其他一些varnish常用的工具的文档说明的地址。 https://www.varnish-cache.org/docs/trunk/reference/index.html SyntaxHighlighter.defaults['class-name'] = ”; SyntaxHighlighter.defaults['smart-tabs'] = true; SyntaxHighlighter.defaults['tab-size'] = …

继续阅读 »

3,444 查看

PHP中的源代码签名(PHP源码学习快速方法)

在阅读了一篇文章后,觉得有必要写一个源码签名收集器,所以就自己动手扩展了个, 下面是实现的主要细节。另外,附我读的那篇文章的翻译。详见文章最后部分。 使用方法: 假设对应的php脚本文件,名为SourceCodeIteration.php 此时,我们在需要遍历的源码包的根目录处,新建一个脚本,名为runGetSourceCode.php,代码如下: <?php include("SourceCodeIteration.php");//引入库 $si = new SourceIteration();//初始化源码遍历对象 $si->GetInfo();//获取签名,并打印在页面上 效果图如下: 接下来,直接贴我改造后的代码,具体的原理详解可以点击参看,翻译部分 <?php class SourceIteration { var $baseDir; var $type; //.php;.aspx; you can use ; to split different type var $displayWay; var $seperator; var $RoleArray; var $initIndent; var …

继续阅读 »

无觅相关文章插件,快速提升流量