26

Slideshare PPT下载shell脚本

    以前总结过在slideshare上下载文件的方法(参考:从Slideshare.net 下载Slide的方法) ,只不过以上下载操作都需要手工操作,极其不人性化。尤其是在将swf格式的文件转化为pdf格式时候,要手动对一个几十页的ppt执行以上操作不累死人才怪,因此方法归方法,我自己都不怎么使用。   

    Slideshare Downloader是一个shell脚本,能自动下载slideshare上不提供下载功能的ppt并保存为pdf格式的文档。只不过在本机的Redhat Enterprise Server 5.3上试了一下,发现脚本有些问题。

    1、Slideshare Downloader用于解码swf文件的swfdec包在Redhat Enterprise Server上安装很麻烦,依赖一大堆包,捣腾了半天都未搞定,于是放弃掉使用swfdec。

        swfdec项目似乎从08年依赖就未更新过了,其官方wiki http://swfdec.freedesktop.org  也许久未维护了,登录进去全是灌水的广告帖子,刚开始还以为走错地方了。

       swfdec的安装指南

       swfdec的代码下载地址

   2、Slideshare Downloader直接用imagemagick的convert命令将多个png文件转化为一个pdf文件,测试了一下似乎不行。按照imagemagick 官方帮助的说明,多个png格式的文件不能直接使用convert命令合并成一个pdf文件     

    However, some formats, such as JPEG and PNG, do not support more than one image per file, and in that case ImageMagick is forced to write each image as a separate file.  imagemagick adjoin帮助

   3、Slideshare Downloader脚本应该是在Ubuntu等Debian系列的环境上测试的,在Redhat 下一些命令的语法似乎有问题

      在处理BASH_REMATCH 时候, RedHat 要加“”

    if [[ "$DOCID" =~ "([a-z0-9-]+)$"  ]]
    then
        DOCID=${BASH_REMATCH[0]}
    else
        echo $DOCID
        exit 1
    fi

       在Redhat下sort命令无-V参数

     基于以上几个原因,为方便自己使用,对Slideshare Downloader脚本进行了调整,测试了几个文档,应该还行。需要安装swftoolspdftkimagemagick

    大致的方法:

    1、使用wget -q –O 获得指定url地址文档的所有swf文件的实际地址并下载

    2、使用swftools的swfrender命令将swf文件转为png格式的文件

    3、使用imagemagick的convert  +adjoin 将png格式的每个文件都转化为对应的单个pdf文件。

    4、使用pdftk将多个pdf文件合并成一个pdf文件

     在合并多个pdf文件为一个pdf文件时候,由于需要按照页面顺序合并,因此使用了sort -k1.3

      PDFS=`ls *.pdf | sort -k1.3 `

   调整过的代码(只在Redhat 上做了测试,且对代码未做优化):

#!/bin/bash

# Author: Andrea Lazzarotto

# http://andrealazzarotto.com

# andrea.lazzarotto@gmail.com

# Slideshare Downloader

# This script takes a slideshare presentation URL as an argument and

# carves all the slides in flash format, then they are converted to

# and finally merged as a PDF

# License:

# Copyright 2010-2011 Andrea Lazzarotto

# This script is licensed under the Gnu General Public License v3.0.

# You can obtain a copy of this license here: http://www.gnu.org/licenses/gpl.html

# Usage:

# slideshare-downloader.sh URL [SIZE]

#———————————————–

# Modify 7/08/2011 by giudinvx

# Email  giudinvx[at]gmail[dot]com

#———————————————–

validate_input() {

    # Performs a very basic check to see if the url is in the correct form

    URL=`echo "$1" | cut -d "#" -f 1 | cut -d "/" -f 1-5`

    DOMAIN=`echo "$URL" | cut -d "/" -f 3`

    CORRECT=’www.slideshare.net’

    if [[ "$DOMAIN" != "$CORRECT" ]];

        then

            echo "Provided URL is not valid."

            exit 1

    fi

    if echo -n "$2" | grep "^[0-9]*$">/dev/null

        then SIZE=$2

        else

            SIZE=2000

            echo "Size not defined or invalid… defaulting to 2000."

    fi

}

check_dependencies() {

    # Verifies if all binaries are present

    DEP="wget sed seq  convert"

    ERROR="0"

    for i in $DEP; do

        WHICH="`which $i`"

        if [[ "x$WHICH" == "x" ]];

            then

                echo "Error: $i not found."

                ERROR="1"

        fi

    done

    if [ "$ERROR" -eq "1" ];

        then

            echo "You need to install some packages."

            echo "Remember: this script requires Imagemagick and Swfdec."

            exit 1

    fi

}

build_params() {

    # Gathers required information

    DOCSHORT=`echo "$1" | cut -d "/" -f 5`

    echo "Download of $DOCSHORT started."

    echo "Fetching information…"

    INFOPAGE=`wget -q -O – "$1"`

    DOCID=`echo "$INFOPAGE" | grep "doc=" | cut -d "=" -f 3 | cut -d "&" -f 1`

    if [[ "$DOCID" =~ "([a-z0-9-]+)$" ]]

    then

        DOCID=${BASH_REMATCH[0]}

    else

        echo $DOCID

        exit 1

    fi

    SLIDES=`echo "$INFOPAGE" | grep "totalSlides" | head -n 1 | sed -s "s/.*totalSlides//g" | cut -d ":" -f 2 | cut -d "," -f 1`

    echo "Slides: $SLIDES"

    echo "Size: $SIZE"

}

create_env() {

    # Finds a suitable name for the destination directory and creates it

    DIR=$DOCSHORT

    if [ -e "$DIR" ];

        then

            I="-1"

            OLD=$DIR

            while [ -e "$DIR" ]

            do

                I=$(( $I + 1 ))

                DIR="$OLD.$I"

            done

    fi

    mkdir "$DIR"

}

fetch_slides() {

    for i in $( seq 1 $SLIDES ); do

        echo "Downloading slide $i"

        wget "http://cdn.slidesharecdn.com/`echo $DOCID`-slide-`echo $i`.swf" -q -O "$DIR/slide-`echo $i`.swf"

    done

    echo "All slides downloaded."

}

convert_slides() {

    for i in $( seq 1 $SLIDES ); do

        echo "Converting slide $i"

#        swfdec-thumbnailer -s $SIZE $DIR/slide-$i.swf $DIR/slide-$i.png 2>/dev/null

        swfrender $DIR/slide-$i.swf -o $DIR/$i.png 2>/dev/null

    done

    echo "All slides converted."

}

build_pdf() {

    cd $DIR

    IMAGES=`ls *.png | sort -k1.3 `

    echo "Generating PDF…"

    convert $IMAGES +adjoin %d.pdf

    PDFS=`ls *.pdf | sort -k1.3 `

    pdftk $PDFS cat output $DOCSHORT.pdf

    cd ..

    echo "The PDF has been generated."

    echo "Find your presentation in: \"`pwd`/$DIR/$DOCSHORT.pdf\""

}

clean() {

    rm -rf $DIR/*.swf

    rm -rf $DIR/*.png

}

validate_input $1 $2

check_dependencies

build_params $URL

create_env

fetch_slides

convert_slides

build_pdf

clean

    脚本下载请猛击

    同样的程序逻辑其实可以适用于百度文库、豆丁这样的在线文库。像百度文库、豆丁之类的在线文库许多资料需要积分下载,但可免费在线浏览,这些文库都使用Flash作为播放器,这就为免积分下载器提供了条件。当然在windows上有冰点文库下载器易读文库下载器这样的图形化工具可用。只不过原理应该也是类似的,看一下冰点文库下载器目录下的SWFToImage.DLL、pdflib.dll两个动态库大致可以知道。

    其实谁有兴趣和精力可以将此类下载功能做成一个单独的在线服务,由此还可以延伸出其他产品功能来,应该还是挺有市场的。

 

03

移动互联网时代“人人都可以是分销商”

    所谓“渠道为王”,不管是传统线下零售商家还是互联网电子商务商家,要让商品抵达最终的用户,都要依赖一定的销售渠道,所以google、淘宝、腾讯、百度们等无不在围绕争夺用户的网络入口进行竞争。Google的Adsense、百度联盟、淘宝分销平台、当当/凡客等的网络联盟等等无不是网络渠道的典型代表。

    在这些渠道中,掌握话语权的角色基本上都为专业从事电子商务的商家,个人在整个交易过程中基本就扮演买家的角色而已。也曾有一些商业模式希望将个人用户转变为个体分销商/代理商的角色,建立由上百万个由普通个人节点组成的交易网络,最为典型的例子应该是以安利、特百惠、雅芳公司为代表的直销模式。尽管在国内大部分都认为:直销模式==传销模式,但直销模式在老美成百年的历史足足可以看出直销模式的生命力。直销和传销的区别不是我们讨论的重点,《直销管理条例》中对此有所说明。直销模式的一些启示:

  • 任何交易行为,如果参与交易的节点足够多并形成网络,这样的交易网络足可以颠覆传统巨头所建立的商业模式
  • 在中国,任何有影响力的网络都是极度危险的,必须让网络可控且局限在政策圈定的范围内
  • 参与交易者建立网络的成本要足够低。直销人员的网络就是身边的亲朋好友,不需要再重新建立产生交易所必须的网络
  • 买方有实际需求是直销网络赖以存在下去的基石。尽管会有因基于朋友间的面子问题而购买所推销商品的现象,但一个良性的网络要长期存在,买方必须对此网络所兜售的商品有所需求,肯定不单纯只靠朋友间的友谊 
  • 只要产品品质不错,交易门槛不高,大部分人并不反对成为个人分销商,通过口碑传播产生交易是可行的

    在互联网上,鲜有普通个人作为分销商/代理商的成功案例,大部分都为少数的意见领袖的例子。以曾经被寄予期望的个人博客为例子说说

    在个人博客兴起的时候,大家曾经将个人博客的盈利模式寄期望于Google Adsense为基础的联盟营销和付费评论(Paid Reviews),但最终效果并不显著,原因有很多,但从电子商务交易角度来看,我觉得有如下原因:

    1、除个别发烧级的博主外,大部分人的生活并不是完全依赖虚拟化的网络。要在真实的关系链重构一个基于虚拟关系链的网络并在这个发挥影响力,对大部分人而言很难。

    2、交易的门槛太高,交易过程太繁琐:要保持一定的更新频率和话题热度才能够吸引足够多的粉丝,这样才可能将流量转化为交易,这对于大部分博主而言基本为不可能的任务。即便对那些资深的博主而言,总可以见到抱怨:通过google adsense赚的钱必须积累到一定的额度才能兑现,且兑现过程极其麻烦

    3、对订阅博客的人来说,通过博客产生交易的需求及动力并不足

    4、博客的媒体属性,让其很难成为一个产生交易的分销渠道:付费评论并不是每个博主愿意做的,尤其是对那些有影响力的博主,更不屑于做这样的事情;

    传统线下分销模式和互联网分销模式下参与游戏的基本上只能为有一定实力的商家,这与其商业形态有关。而在移动互联网时代,始终联网的移动终端+具有普遍性需求的产品或服务+快捷的支付方式+基于熟人间的准实名身份+关系网等几种因素的结合,可以让每一个普通用户轻松变成产品或服务的代理商或分销商。夸张地说,在移动互联网时代,“人人都可以是分销商”。

    在移动互联网时代,渠道为王的理念依然管用,个人仍然可以成为交易环节的渠道提供者,主要受如下一些要素的影响:

    1、用户始终在线,让随时随地交易成为可能。而传统线下或传统互联网很难做到这一点

    2、线下线上的边界逐渐模糊,尤其是随着移动互联网的普及,诸如移动支付、移动电子商务的基础设施的成熟后

    3、线上与线下关系链的融合

    4、微博等与移动互联网结合紧密的社会化媒体的兴起,让口碑传播迅速

    5、相对便捷的支付方式的出现(例如快捷支付),让交易更加便捷

    6、准实名。例如手机号,基于熟人的网络等

    7、适合分销且具有普遍需求的产品或服务

   以具有普遍性需求的手机充值业务来说,传统线下渠道要成为手机充值代理必须受如下限制:

    1、必须具备一定的代理资质

    2、充值终端只能依赖于具体运营商,只能服务于某个运营商,不能跨运营商服务

    3、必须预存一大笔钱到运营商账户中,即便采用银行代扣模式也极其麻烦

    4、服务的对象只能局限于某个区域的线下客户,线上渠道基本没有

    5、基本上无太多的营销手段可用

    6、手机充值利润很薄,只能作为一种吸引流量的业务

    在互联网模式下,虽然手机充值的服务提供商大多是第三方服务提供商,但要成为手机充值代理,仍然存在一定的限制:

    1、必须具备一定的资质

    2、必须预存一大笔前到服务提供商账户

    3、服务对象基本局限在线上客户

    4、手机充值利润很薄,只能作为一种吸引流量的业务

     以上因素基本限定了个人用户很难成为线下代理或互联网代理。

    而在移动互联网时代,个人只需要有一个智能终端和一张能够实时扣费的银行卡(例如支持快捷支付),就可以成为一个合格的手机充值代理,可以随时随地提供为身边的亲朋好友提供手机充值服务及其他的各种服务。尽管手机充值业务本身也不一定能够带来多少服务,但如果身边有一个朋友能够随时帮助提供各种生活化的服务,那我们是不是会选择其服务呢?

   对服务提供商而言,普通个人代理的核心价值不一定是为服务提供商带来多少收入和毛利,而在于围绕普通个人代理那张现实的关系网及渠道,而这张关系网对一个产品的口碑传播通路恰恰是一个移动电子商务产品或服务引爆流行的核心所在。另外一个产品或服务如果能够让普通用户参与到产品运营与营销中来并从中分享利益,这是对用户最好的激励。

   口碑传播是产品进行营销最理想的的手段。一般情况下我们都依靠好的产品或服务来获得用户由衷的支持并主动在关系圈中义务对产品进行传播。如果好的产品+恰当的激励机制,那对于口碑传播应该有更好的促进作用,同时对提高用户对产品的粘性无疑有积极意义。

   个人代理的模式并不一定适合所有的行业,但对于一些初创型的移动互联网公司而言,发挥每一个个人的影响力及资源,让每一个用户都成为自己的渠道,那么在此基础上,足可以诞生出新的业务模式,颠覆那些传统巨头们长久以来所建立的模式。

 

18
十二

移动互联网时代的开放平台杂思

    开放平台成了一个互联网时代的热门术语,每一个稍微有点规模的公司不提自己的平台为开放平台都不好意思。对于Facebook这样的公司们而言,开放平台的意义显而易见:构建围绕自己的生态链,将自己不擅长的事情开放给合作伙伴们来做,通过一些有趣的应用来吸引用户,最终将用户黏在自己的平台上。

    从开放平台的服务对象来看,本质上仍然分为两大类:

  • 为C端的用户提供服务:典型代表为Facebook
  • 为B的用户(商家)提供服务:典型代表为Salesforce

    在互联网时代,不管是为C端用户还是B端用户提供服务,从技术角度而言,互联网时代开放平台的的所有应用都在开放平台服务提供商的服务器端运行(按照时髦的叫法应该称为:“云端”、“云计算”),用户只需要通过标准的浏览器访问即可。而对B端用户,即便有开发工作,由于Web端的开放人员相对容易找到,因此也不是大的问题。

   毋庸置疑的是,由于移动设备移动化、个性化、隐私性、具备地理位置信息等特征,导致移动互联网与传统互联网存在较大的差异。对各种线上线下的企业而言,各种“SoLoMo”、“O2O”、“移动支付”、“移动电子商务”等时尚术语描绘的前景无不说明其中所蕴含的机会,但也蕴含着众多的挑战。

    在移动互联网时代,对于Facebook这样为C端用户提供服务的开放平台,由于其应用主要都为云端应用,因此只需要按照自己的移动互联网战略规划,推出自己相应的app应用或HTML5应用即可。

    对大部分商家而言,不是不想赶移动互联网的热潮,而是目前移动互联网门槛太高:企业没人懂移动互联网,无法形成适合企业实际需要的移动互联网战略;移动互联网人员成本高,企业养不起自己的产品开发人员;即便拥有自己的客户端,也没有太多的应用可粘住用户,以及怎样运营客户端等等。

    这些问题解决的核心在于:怎样帮助企业降低移动互联网门槛呢?对于这些问题,是否可以采用互联网开放平台的思路来解决呢,尤其是在一些基础性的领域,例如移动支付、移动电子商务等等?

  • B端商家的移动互联网战略是什么?

         问题:大部分商家都意识到了移动互联网的机会,但对怎样推出真正适合自己企业需要的移动互联网战略毫无概念。是否需要推出单独的移动互联网战略,还是继续沿用互联网的战略?

         机遇:开放平台提供商可以发挥自己熟悉移动互联网的优势,深入垂直行业,帮助各垂直行业的企业找到适合企业发展需要的移动互联网战略,并推出对应的移动互联网解决方案。

  • B端商家是否具有移动互联网的专业人才,包括产品人员、技术人员、运营人员等,是否有能力研发自己单独的应用?

         问题:当下移动互联网处于虚热状态,相关的专业人才极度匮乏,人力成本也极高,对一般的商家而言(例如大量的中小B2C、个人站长),很难养活这些专业的移动互联网人才。

         机会:如果能够通过开放平台等模式降低商家使用移动互联网的成本,那无疑可以获得大量商家的欢迎。

  • B端商家如果推出自己的客户端后,怎样提供有粘性的应用,让用户愿意持续使用;还包括商家怎样推广自己的客户端、运营客户等

         问题:关于移动互联网的误区之一在于似乎只要推出自己的客户端,将已有的Web应用迁移到客户端上即可。但对于移动客户端而言,如果没有太多有粘性的应用,用户即便安装后,可能会永远不使用或直接卸载掉;但对于大部分商家而言,要自己提供有粘性的应用,有很大的难度;在开发出来后,怎样推广自己的客户端,游说用户安装自己的客户端;怎样运营自己的客户端用户等等。

         机会:如果能够通过开放平台形式,打包一些有粘性的行业应用以插件形式提供给商家客户端;或是针对某个垂直行业做客户端,以免费形式或freemium形式提供给商家;针对诸如app store、android market及互联网营销手段帮助商家推广客户端、做客户运营等。

    以上问题只是当下传统商家转向移动互联网时候面临的一些典型问题。尽管移动互联网时代的开放平台仍可以用互联网的开放平台的理论来解读,但由于移动互联网本身区隔于传统互联网的各种特征,以上问题为移动互联网时代新的开放平台的诞生提供了机遇,也为在传统互联网不具备优势的服务提供商提供了巨大的机会。

    当然正如互联网的开放平台最核心的问题不是技术的开放,而是心态的开放,移动互联网时代的开放平台也如此。很多提供移动互联网服务的公司其实都看见了开放平台所能带来的价值,但关键是能否有勇气去否定自己成熟的业务模式去面对全新但尚不确定的未来。

    其实对于大部分从事移动互联网的企业而言,尽管在传统互联网领域上彼此存在较大的竞争关系,但在移动互联网领域,在当下尚未有成熟的商业模式可供山寨的情况下,各自最大的竞争对手可能不是其他的竞争对手而是移动互联网的基础设施、用户习惯等等,尤其是像移动支付这样全新的领域,从培育产业链、用户使用习惯等角度而言,彼此间的合作关系的意义可能更大于竞争关系。

 

05
十一

为何产品升级后越来越烂?

    最近体验了几个经常使用的产品的最新版本,包括:google reader、新浪微博、echofon等。发觉对大部分产品而言,新产品意味着比老版本的产品拥有更多无用的功能、更炫但更华而不实的界面、更复杂的操作体验、更差的性能、更多的bug等等。当然最近google reader新版本功能相对老版倒是更少,但改版后,依然受到了一堆人的痛骂。

    为何一些原本简单易用的产品在经过几轮升级后,会变得如此垃圾呢?为何那么多的产品中,经过升级后能够越来越好的产品或服务极其缺少呢?

    一个产品之所以能够称其为好产品首先决定于产品的愿景目标,其次是产品设计的核心设计理念,最后才是产品的设计和实现的方法。

    在某个阶段做一个好产品相对容易,只需要产品提供的核心功能能够满足用户的需求就可以了,但要在一次一次的版本更新中,持续不断是做出与时俱进的好产品就很难,尤其是面临各种变化和诱惑:产品战略的变化、产品团队的变化、用户的变化、竞争态势的变化等等,以及在变化过程中的各种诱惑。这些变化和诱惑都可能导致产品升级过程中产品愿景目标、核心设计理念、细节设计的变化,最终导致产品升级的失败。

产品战略的变化:

    公司整体产品战略的变化,可能导致某个产品在公司地位的变化,从而影响产品的战略、定位、策略等,而这种变化对某个产品的影响可能是致命性。以Google Reader为例,Google近期的社会化的战略重点是Google+,因此Google Reader、Gmail等所有的产品都必须围绕与Google+整合进行调整。这样导致在 Reader的改版中,对社会化分享进行了较大调整。为了产品间所谓的协同效应,毁掉了多少产品的美好未来。

产品团队的变化:

    原有负责产品的人离职或不再负责,所谓“不破不立”,新人总有否定并推倒原有产品设计的冲动,这样方能体现自己工作的价值,而且新人对产品的愿景、设计理念大都有自己的一整套方法论,因此在做新一版本的产品设计时候会采用自己的方法论去重构产品,因此尽管只是老版本的升级版本,但产品团队、设计理念都早已变化。

    与产品团队相关的还包括新人能力、对产品的感情、热情等方面的原因。

目标用户的变化:

    随着用户数的快速增加,用户群也随之裂变,各类用户提出了貌似合理的形形色色需求。为了满足不同用户群的需求,产品不断新增功能,产品越来越臃肿。同时由于市场的成熟及竞争态势的变化,目标用户群的选择不再单一,用户对产品的期望值也有所变化。原有衡量优秀产品的标准可能也已变化,在此情况下,所有产品升级都面临如此的挑战:变还是不变,怎样变?怎样与时俱进?怎样均衡不同用户的需求和期望值?

竞争态势的变化:

    由于竞争对手的杀入,尤其是竞争对手推出了颇具竞争力的类似产品,为了保持自己的竞争力,产品的重点不再是关注怎样更好满足用户的需求,不再是保持自己的节奏和独有风格继续发展,而是在关注竞争对手在做什么然后相互山寨,匆忙之下推出一个又一个与竞争对手大同小异的新版本,最终产品变成了没有生命力和灵魂的垃圾。

成功的副作用:

    即便是同样的产品团队,在老版本大获成功后,新版本与老版本在品质上可能也是相去甚远。原因有很多,一个典型的情况是:在老版本时候,由于资源相对有限,不允许团队有太多想法,因此必须抵御住各种诱惑,专注于最重要的核心功能;另外由于团队成员都对成功有极度的饥饿感,大家还持有对产品的热情及共同目标。

    成功后,资源不再是最大问题,因资源、时间、资金等因素压抑许久的各种“伟大思想”呼之欲出,顿觉所有的方向都是机会,都是为竞争对手筑起的竞争壁垒。专一、简洁成了保守者的代名词,平台化、多元化、一站式成了新的团队术语。

    以前版本的大获成功,在我们这个成王败寇为唯一标准的国度,成功掩盖了团队所有的问题,公司资源无限倾斜,领导者的欲望也急剧膨胀,而团队目标不再单一,成功的欲望及热情不再象以前那样强烈。团队拥有和被赋予更多的期望、更多的资源、更多的承诺、更多的内耗、更多的混乱,最终果实是更烂的产品。此类现象我们可以称之为“成功的副作用”。

无答案的问答

    怎样避免产品升级后越来越垃圾的陷阱呢,其实并没有什么标准答案。 以上问题其实很多时候并无绝对的对错之分,只是度的把控问题,同样的道理在不同的场景下讲对错就不一样。

    因此最核心的问题实际上在于怎样在产品目标、团队能力、团队欲望、节奏之间要找到一个合适的平衡点,与时俱进,这样方能应对变化万千的世界。一个团队从一个成功走向另一个更大成功更需要对目标无比的专注、对团队能力清醒的认识、对欲望的有效把控以及合理的节奏感。

 

24

Solr与Mysql集成指南

    在《企业级搜索引擎Solr使用入门指南》《企业级搜索引擎Solr交流》中对Solr的使用做了简单介绍。在数据库驱动的应用中,当时采用的方案是应用层面有数据的增删改操作时候,由应用通过调用solr的xml接口来完成solr索引的增删改操作,对批量操作采用提交csv报文的方案。但此种方案不足之处在于:需要应用在增删改业务逻辑中来调用solr接口,业务逻辑与搜索引擎建索引的逻辑混在一起,在需要对搜索引擎的策略进行调整,可能需要对每一次业务应用涉及搜索的逻辑进行修改。在处理批量导入、增量操作时候也很不方便。

    从Solr 1.3开始,Solr提供DataImportHandler工具完成对mysql数据库数据的操作。因此极大方便了Solr与Mysql的集成,因此可以借助DataImportHandler来完成Solr与Mysql的集成,基本思路如下:

      1、使用mysql的触发器trigger获取数据库表数据的增删改操作

      2、触发器通过mysql的用户自定义函数user-defined function (UDF) 包mysql-udf-http 调用Solr DataImportHandler对应的命令

      3、由Solr DataImportHandler完成增删改数据的索引操作。

    此种方案的优点在于将索引逻辑完全与应用的业务逻辑处理完全隔离,尤其是对批量导入、增量导入有其优势。

    下面简单介绍Solr与Mysql集成的方案。关于solr的配置及使用说明可参考《企业级搜索引擎Solr使用入门指南》《企业级搜索引擎Solr交流》 ,这里主要说明与DataImportHandler相关的安装使用。

    测试环境说明:  

   操作系统:CentOS 5

   数据库:Mysql 5 ,直接使用了rpm安装的,mysql的lib库安装在/usr/lib/mysql

  Tomcat 6:tomcat安装在/opt/tomcat

  JDK 6

一、Solr安装配置

1)、Solr的安装

wget http://www.apache.org/dist//lucene/solr/3.4.0/apache-solr-3.4.0.tgz

tar zxvf apache-solr-3.4.0.tgz

cd apache-solr-3.4.0

cp -r example/webapps/solr.war /opt/tomcat/webapps/

cp -r example/solr/ /opt/solr-tomcat

cp -r dist/  /opt/solr-tomcat/

注dist目录下中有使用dataimport所必须的jar包apache-solr-dataimporthandler

将mysql的JDBC Driver mysql-connector-java-5.1.17-bin.jar拷贝到/opt/solr-tomcat/lib/下

 设定solr.solr.home

  在当前用户的环境变量中(.bash_profile)或在/opt/tomcat/catalina.sh中添加如下环境变量

export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/opt/solr-tomcat/solr"

  mkdir –p /opt/tomcat/conf/Catalina/localhost

    vi  /opt/tomcat/conf/Catalina/localhost/solr.xml ,内容如下:

      <Context docBase="/opt/tomcat/webapps/solr.war" debug="0" crossContext="true" >

                 <Environment name="solr/home" type="java.lang.String" value="/opt/solr-tomcat" override="true" />

    </Context>

注:

   为了避免在Solr管理界面测试时候出现中文乱码问题,需要做如下设置:

   /opt/tomcat/conf/server.xml 中设定URIEncoding: 

          <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"  URIEncoding="UTF-8" />

   /opt/tomcat/webapps/solr/WEB-INF/web.xml 设定过滤器

<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>ignore</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在xml请求数据中增加编码说明:

<?xml version=’1.0′ encoding=’utf-8′?>

<add>

<doc>

  <field name="id">123</field>

  <field name="name">Solr企业级搜索</field>

  <field name="manu">Apache Software Foundation</field>

  <field name="liangchuan">liangchuan’s solr "hello,world" test</field>

  <field name="url">http://www.google.com</field>

</doc>

</add>

3)、配置solr

cd /opt/solr-tomcat/

vi solrconfig.xml ,增加如下内容

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
    <str name="config">/opt/solr-tomcat/conf/data-config.xml</str>
    <lst name="datasource">
       <str name="driver">com.mysql.jdbc.Driver</str>
       <str name="url">

         jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=utf-8

       </str>
       <str name="user">user</str>
       <str name="password">password</str>
    </lst>
  </lst>
</requestHandler>

<lib dir="/opt/solr-tomcat/lib" />
<lib dir="/opt/solr-tomcat/dist" />

这里的data-config.xml就是DataImportHand
ler的配置文件

vi  /opt/solr-tomcat/conf/data-config.xml,内容如下:

<dataConfig>
  <document name="documents1">
        <entity name="documents"

          query="select id,title,content,date_added from documents"
          deltaImportQuery="select  id,title,content,date_added  from documents where ID=’${dataimporter.delta.id}’"
          deltaQuery="select id  from documents where date_added &gt; ‘${dataimporter.last_index_time}’"
        >
            <field column="id" name="id" />
            <field column="title" name="title" />
            <field column="content" name="content" />
            <field column="date_added" name="date_added" />
        </entity>
    </document>
</dataConfig>

关于DataImportHandler的详细使用请参考:http://wiki.apache.org/solr/DataImportHandler

这里就常用的用法简单说明:

query语句是用于批量导入(Full Import)中获取符合条件的全部数据的SQL。

deltaQuery语句是用于增量导入(Delta Import)中获取符合增量导入标准的数据的主键的SQL,供deltaImportQuery查询使用。

deltaImportQuery语句增量导入(Delta Import)中获取需要增量索引数据(document)的字段(field)

DataImportHandler的常见命令:

    批量导入(full-import):

        http://<host>:<port>/solr/dataimport?command=full-import&commit=y
    增量导入(delta-import):

        http://<host>:<port>/solr/dataimport?command=delta-import&commit=y
    导入状态查询(status):

        http://<host>:<port>/solr/dataimport
    重新装载配置文件(reload-config):

        http://<host>:<port>/solr/dataimport?command=reload-config
    终止导入(abort):

        http://<host>:<port>/solr/dataimport?command=abort

Solr执行增量导入的大致原理

    1、Solr 读取conf/dataimport.properties 文件,得到solr最后一次执行索引操作的时间戳last_index_time,以及单个实体最后一次执行索引的时间戳:entity_name.last_index_time

    2、Solr对指定的实体使用deltaImportQuery SQL查询得到insert或update时间戳大于${dataimporter.last_index_time}需要增量索引的字段,然后调用deltaQuery对符合条件需要执行增量索引的文档的字段进行索引,并更新dataimport.properties 的时间戳

 

数据库的测试表结构如下:

DROP TABLE IF EXISTS `documents`;
CREATE TABLE `documents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date_added` datetime NOT NULL,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

4)、测试Solr配置

  在数据库中documents表中插入几条数据,然后

执行批量导入操作:

:/solr/dataimport?command=full-import&commit=y">:/solr/dataimport?command=full-import&commit=y">http://<host>:<port>/solr/dataimport?command=full-import&commit=y

执行增量导入操作:
:/solr/dataimport?command=delta-import&commit=y">:/solr/dataimport?command=delta-import&commit=y">http://<host>:<port>/solr/dataimport?command=delta-import&commit=y

:/solr/admin">:/solr/admin">http://<host>:<port>/solr/admin执行查询操作,测试配置是否正确

二、mysql-udf-http 安装配置

wget http://mysql-udf-http.googlecode.com/files/mysql-udf-http-1.0.tar.gz

tar zxvf mysql-udf-http-1.0.tar.gz

cd mysql-udf-http-1.0/

./configure –prefix=/usr –with-mysql=/usr/bin/mysql_config

make && make install

echo "/usr/lib/mysql/plugin" >> /etc/ld.so.conf.d/mysql-i386.conf

/sbin/ldconfig

/sbin/ldconfig -v|grep mysql

  如果没有类似如下的输出

   /usr/lib/mysql/plugin:
        mysql-udf-http.so.0 -> mysql-udf-http.so
   则建立mysql-udf-http.so 的软连接(当然也可以通过修改编译Makefile脚本)

ln -s /usr/lib/mysql/plugin/mysql-udf-http.so /usr/lib/mysql/plugin/libmysql-udf-http.so

  建立软连接后再执ldconfig 命令,使用/sbin/ldconfig -v|grep mysql是否有如下内容:

/usr/lib/mysql/plugin:
        mysql-udf-http.so.0 -> libmysql-udf-http.so
原因是mysql-udf-http的Makefile中指定了动态链接库的SONAME为mysql-udf-http.so.0 ,而ldconfig缺省只处理以lib开头的动态链接库(例如libmysqlclient.so.15),因此执行ldconfig命令时候忽略了mysql-udf-http.so 。

创建mysql的用户自定义函数:

mysql >

create function http_get returns string soname ‘libmysql-udf-http.so’;
create function http_post returns string soname ‘libmysql-udf-http.so’;
create function http_put returns string soname ‘libmysql-udf-http.so’;
create function http_delete returns string soname ‘libmysql-udf-http.so’;

三、创建调用mysql-udf-http的触发器

/* INSERT插入操作的触发器 */
DELIMITER |
DROP TRIGGER IF EXISTS documents_insert;
CREATE TRIGGER documents_insert
AFTER INSERT ON documents
FOR EACH ROW BEGIN
     SET @result = (SELECT http_get(‘http://www.yeeach.com/solr/dataimport?command=delta-import&commit=yes’));
END |
DELIMITER ;

/* UPDATE更新操作的触发器 */
DELIMITER |
DROP TRIGGER IF EXISTS documents_update;
CREATE TRIGGER documents_update
AFTER UPDATE ON documents
FOR EACH ROW BEGIN

60;    SET @result = (SELECT http_get("http://www.yeeach.com/solr/dataimport?command=delta-import&commit=yes"));
END |
DELIMITER ;

/* DELETE删除操作的触发器 */
DELIMITER |
DROP TRIGGER IF EXISTS documents_delete;
CREATE TRIGGER documents_delete
AFTER DELETE ON documents
FOR EACH ROW BEGIN
        SET @result = (SELECT http_get(CONCAT(‘http://www.yeeach.com/solr/update/?stream.body=<delete><id>’,OLD.id,’</id></delete>&stream.contentType=text/xml;charset=utf-8&commit=true’)));
END |
DELIMITER ;

四、测试

  在数据库执行增删改操作,然后在Solr的管理界面执行查询操作,测试触发器调用mysql-udf-http是否正常。

五、参考资料

DataImportHandler文档:http://wiki.apache.org/solr/DataImportHandler

Mysql UDF的大本营:http://www.mysqludf.org/

mysql-udf-http:http://code.google.com/p/mysql-udf-http/

 

 

21

移动问答服务思考:内容运营策略

     继续移动问答服务思考 中对移动问答服务的思考,主要考虑移动问答服务的内容运营策略。

    这里所指的移动问答服务并不是类似opinionaided、localmind这样相对宽泛的问答服务,而是类似于Ask a Nomad这样针对垂直领域的问答服务。这就意味着:目标用户群更为明确,但对用户的专业技能要求更高。 而且移动问答服务是垂直领域增强用户粘性的产品服务之一,而非独立服务。

    对一个全新的移动问答服务而言,问答内容和用户始终是鸡生蛋、蛋生鸡的问题:在初期用户数较少的情况下,怎样保证问题的质量及回答的及时性。在内容较少的情况下,怎样保留住那些种子期的用户并激发他们持续贡献内容的热情。

   要解决这问题,内容运营策略至关重要。

1、问答内容运营的挑战

  问答的实时性

  问答的质量

  运营初期冷启动问题

  引爆点问题

2、内容运营重点

  问答平台内部各种内容运营

  微博、SNS社区等外部平台用户关系、专家导入

  问答平台与微博、SNS社区等外部平台间信息的互动

  怎样找到问答最佳的传播路径,将问题传递给最合适的人来回答

  怎样保持用户对问答服务持久的热情,尤其是那些对引爆点至关重要的角色:联系人、内行、推销员

移动问答服务,移动互联网,会化问答服务,Quora,问答服务,localmind,opinionaided

 

06

不只是同步而已

    同步到新浪微博、同步到Twitter、同步到Facebook、同步到xx… 类似这样与已有各种互联网服务同步已经是各种手机客户端及web应用必备功能之一。

    类似的同步功能其实并不复杂,只需要同步到的服务提供方提供的对应API接口。即使服务方没有提供API,也可以同步抓取报文模拟类似请求的方式完成(例如早期新浪微博接口不完善时候各种同步服务都这么干的)

    从接口来说,服务提供方一般提供:认证授权API、信息同步API

    从流程来说,一般涉及:账号认证授权阶段、信息同步阶段

    1)、账号认证授权阶段:

    服务提供方提供认证授权接口,然后由用户在同步方网站/客户端想服务提供方的网站发起授权请求,完成认证授权后,同步方获得了访问用户信息的权限。一般采用Basic认证、oAuth认证或xAuth。

    2)、信息同步阶段:

    尽管开放平台的概念大行其道,但对于国内的各种服务提供商而言,大都不希望信息在自己平台和其他平台间双向流动起来。用户或是直接在自己平台创造内容或是从其他平台导入各种内容,但不鼓励用户将内容从自己平台导出。因此一般对外提供的同步接口功能大都比较全面,但对于信息导出的功能都比较弱。

     对于以上两个阶段,对于外部的第三方应用而言,似乎可做的事情并不多,各种服务提供方的限制基本上决定了可以做的内容相对有限。

    一直也在思考怎样让信息双向流动起来的问题。一个典型的场景就是:如果我通过第三方的LBS客户端发布信息,LBS客户端同时将信息同步到了新浪微博,我在新浪微博上的好友在微博上对我的信息进行了点评,对于第三方的LBS客户端而言,最理想的情况是:朋友在新浪微博上的互动信息理应反向同步到LBS客户端上。

   其实类似的例子很多:怎样将信息从Twitter从新浪微博同步到Twitter,怎样将twitter信息同步为MSN状态等。一堆人都围绕此类功能提供了一堆hack的方法及工具。只不过此类工具的出路在那儿呢?似乎很难演变成一种业务模式,个人感觉在同步功能上并没有太多可做的文章了,想来那些提供了同步功能的客户端们也是抱有类似的想法。大家觉得同步功能无法成其为一种模式,只能沦落为工具而已,于是同步功能成了所有产品必备的功能,但又是最乏陈可味的功能。

    ifttt.com的出现,让人有眼前一亮的感觉,不由自主地感叹:ifttt的产品设计太天才了。其实从技术角度来说ifttt本身并不难,所以才会有国内一些公司在ifttt出来几天后就快速山寨出了类似服务。但恰恰是如此,才体现了ifttt产品设计的伟大之处:将我们认为无事可做的信息同步功能处理得如此优雅和cool。将一个复杂的事情以简洁方式展现出来是一种能力,能够将一件乏陈可味的事情以如此优雅的方式处理更是一种能力。

    ifttt的一些启示:

    1、好的产品必然有其内在的设计哲学、文化、气质及品位,而非各种功能的堆叠。对于ifttt这样的产品,我不相信只是其产品经理灵光一现的产物。这样优雅的设计,必然有其内在文化的沉淀。其实对于大部分公司的产品人员而言,做产品其实挺简单的:不就是通过各种渠道了解需求后(大部分都为山寨、山寨、再山寨),把这些功能做出来,然后持续完善罢了(美其名曰为微创新)。但这些一个个由功能堆叠起来的产品,最终只能为一个个平庸化的产品,并最终被遗忘掉。每一个好的产品背后必然有一个有思想、有品位的产品经理,优雅的产品必然是产品经理设计哲学的产物。因此要做出伟大的产品,首先培养我们自己关于产品的感觉、品位,形成自己的设计哲学。

    2、任何时代、任何市场都有机会,制约我们的不是机会本身的稀缺,而是我们的实力。对于同步这样的功能,我们认为没有机会了。自己也曾试图从信息双向同步角度去发现机会,但最终无功而返,最后抱怨平台不够开放等客观原因。所谓“市场已经饱和,没有机会了”的说法其实是一个伪命题,问题的关键是:我们能力有几何。

     3、玩透竞争对手的产品:使用ifttt时候,最大的体会之一是:ifttt对各种服务的功能太熟悉了,一直在使用twitter等服务,平常也从产品角度研究其设计,但对于这些产品的了解相对于ifttt太初级了。平常对竞争对手的了解基本就是浮光绿影、浅尝辄止,从战略、战术上都鄙视竞争对手,总是认为对于竞争对手我们已经有足够的了解了。一个很好的互联网产品销售负责人告诉我:他会每周都会去刷竞争对手的网站看新的产品、方案、招聘信息等,改进自己的营销策略、产品方案。想来也惭愧,我上一次仔细研究竞争对手的产品是什么时候呢,我是否真正做到了:从战略上蔑视竞争对手,从战术上重视竞争对手?

     4、我们低估了信息流动及信息挖掘的价值。ifttt只是对信息流动进行了简单处理,就引出了如此有趣的应用场景。如果能够对各种数据更深层次地挖掘、处理,促进数据在各种平台间的流动,那必将诞生各种有趣的应用和商业模式。

    5、能够用户带来价值就会有机会成为模式,就值得我们去做。受到那些靠平台化成就辉煌的故事的影响,我们不屑于那些工具性的产品,觉得工具性的产品用户粘性低,很难成其为商业模式,只有那些能够平台化的产品才有价值。商业模式成为我们是否做决定性的因素,其实原本应该是能否为用户带来价值才应该是决定性的因素。只要能够为用户带来价值,那这样的产品就有机会演变成为一种模式。

    其实很多业务模式和市场机会都有一个临界点的问题,例如用户数/商户数到一定数量、市场份额到一定额度、品牌知名度等。过此临界点后,有利因素之间会形成正循环,各种市场机会不断涌现,业务模式也会更加清晰。这不单纯只是规模效应问题,很多东西都需要实践去积累和沉淀。模式是运营出来的而非规划出来的。

10

一个移动互联网应用地图服务架构

    在移动互联网中,各种与位置相关的服务都严重依赖于地图服务,地图服务质量的好坏很大程度决定了所提供服务的高低。尽管有Google Map等免费或收费的地图服务可供使用,但没有那一家地图服务提供商能够完整提供移动互联网应用所必须的各种地图服务及数据,尤其是针对那些垂直行业应用。

    在中国特色的制度下,除了技术因素外,值得注意的是由于地图牌照发放问题带来的政策上的不确定性对架构实现的冲击和挑战。

    地图服务架构设计原则:

    1、高性能:由于目前的移动互联网带宽仍是较大的制约因素,在客户端用户的等待耐心有限,因此地图服务必须将性能作为首要设计要素。而且像google map之类的免费服务由于防火墙原因经常不稳定或异常缓慢,需要在架构设计时候重点考虑。

    2、低成本:尽管一些收费的地图服务已经提供了一些比较完整的地图数据、POI数据,但对于初创型的公司而言,资金有限,因此在技术能力许可的情况下,与其购买昂贵的服务,还不如采用低成本的DIY方案。

    3、架构灵活:能够适应客户端、服务器端服务的变化,能够应对政策因素等问题带来的冲击。可以在不同地图服务及本地服务间切换,不能因政策因素导致服务的不可用。

   4、持续积累:对于移动互联网公司而言,针对垂直领域POI数据及地图数据的积累也是产品的核心竞争力,因此架构必须有助于相关数据的积累。

 

google map,移动互联网,地图服务,位置服务,LBS,软件架构

客户端使用SDK访问地图服务 VS.  客户端访问自己服务器端代理

    a、如果由客户端直接访问google map之类的地图服务,则如果地图服务需要调整(例如需要从google map切换到其他地图服务、地图展示内容需要调整时候),都需要客户端升级;如果由服务器端代理完成,只需要服务器升级即可。

    b、服务器端可以缓存客户端频繁访问的地图访问请求(例如搜索周边、根据经纬度定位地图、根据地址定位地图等),可以极大提高性能

    c、服务器端可以在地图服务商的结果上,增加自己的一些操作及数据,例如服务器端可以聚合自己POI数据及其他服务提供商的数据,然后添加到google map结果集上

    d、客户端并不是很适合做一些复杂的计算,例如对于POI及其他内容数据的聚合、图层操作,服务器端来完成更合适

    当然采用服务器端代理的方式也有一些问题,例如google map对每天api调用次数可能有限制、采用客户端现成的SDK方式开发相对简单等。具体需要根据自己业务实际需要采用合适的架构。

25

用户行动轨迹设计杂思

    最近关于LBS是否有泡沫的争论此起彼伏,尤其是对Color模式质疑,甚至传出了国内某某基于Foursquare签到模式的LBS公司要大规模裁员的消息。毋庸置疑的是,LBS是整个移动互联网的基础应用之一,LBS业务模式尚处于探索期。不管现在众多的Foursquare、Color、Kuipp们的模式多么不靠谱,其中有多少的泡沫成分,并不代表LBS本身没有美好的未来,当然未来LBS的成功肯定不单纯只依赖于签到、弹性社交、问答等几个简单模式。

    在LBS应用中,针对用户行动轨迹的产品设计是一个值得深入探讨的话题,对用户的行动轨迹数据进行挖掘,可以衍生出众多有趣的应用,想象一下美妙的应用场景:

  • 根据用户已有的行动轨迹数据向用户做个性化推荐,推荐志同道合的朋友、美食、地点、活动等等 ;
  • 运动爱好者利用GPS设备记录下自己的运动路线,GPS数据中包含有海拔、运动速度、加速度等专业化数据,可以帮助运动爱好者提高运动水平;
  • 旅游爱好者将自己的旅行轨迹分享给亲朋好友;
  • 根据众多游客的行动轨迹数据自动做最佳旅游路线推荐;
  • 家长用于监控孩子活动范围、老板用于监控员工工作路线等等;

    这也是为何Apple、Google也对用户行动轨迹感兴趣的原因(iPhone、Android前一阵爆出的可记录用户行踪轨迹)。当然所有美妙的应用场景是以不触犯用户隐私的前提下来谈的。

    目前对用户行动轨迹记录的产品大致可以分为几大类:

    1)、基于独立设备的GPS轨迹记录仪及相关服务,此类设备所记录的用户轨迹是连续的。相关产品包括a-trip.comfoooooot.com

    2)、基于智能手机客户端的GPS记录仪及相关服务,此类客户端所记录的用户轨迹也是连贯的,相关的客户端包括MotionXMapmyrunRunKeeperGPS KitTrip-journalNIKE+GPS for iphone

    3)、基于智能手机客户端的LBS应用,此类客户端通过用户签到等操作将点串接成用户轨迹,用户轨迹并不是连贯的

    关于用户行动轨迹设计的一些思考:

1、用户行动轨迹产品设计主要思路

  • 用户行动轨迹只是表现形式和载体,核心价值在于用户在其间的所见所闻、所思所感。
  • 大部分场景下,用户行动轨迹是可以由几个关键地点勾勒出来,没必要持续连贯地记录整个过程。
  • 用户行动轨迹中的行为是一系列碎片化行为的组合,对于碎片化行为的记录可以是微博、拍照、问答、签到、互动游戏等形式。
  • 对于用户碎片化的行为,需要在一定的主题场景下才有意义和价值,主题场景可以是话题、行程、活动等。
  • 5W1H:When、Where、Who、What、Why、How。

2、用户行动轨迹产品设计要解决的主要问题

  • 怎样帮助用户将行进过程中精彩的瞬间记录下来。
  • 怎样帮助将用户行进过程的记录串接成一段行程、一个话题、一段旅程、一段回忆。
  • 怎样帮助用户将旅程、行程分享给好友并形成互动。
  • 怎样让用户将自己一个人孤独的行程、旅程变成一群人的旅程。
  • 怎样利用好用户行为碎片化的特征。

3、用户行动轨迹产品设计的主要元素

  • 时间
  • 地点/位置
  • 微博
  • 拍照
  • 旅程/行程
  • 话题
  • 问答
  • 活动/事件
  • 分享
  • 签到
  • 聚合
  • 个性化推荐
  • 点评
  • 等等

4、用户行动轨迹一些零碎的思考

    行为的不连贯性、碎片化是大部分的移动互联网应用的主要特征。因此通过GPS记录仪来连续记录记录用户行动轨迹,并不是最佳的设计方式。主要原因有几个:待机时间、用户行为碎片化、行动轨迹必须有对应主题才能赋予意义。怎样利用用户碎片化的行动记录来形成完整的行动轨迹是产品设计最需要考虑的。

    碎片化的行为来形成行动轨迹,最核心问题实际上是怎样用一个统一主题将这些碎片化的内容串接起来。这个统一主题可以是一段旅程、一段行程、一个话题、一个问题、一次活动等。设计时候可以遵循5W1H,素材可以包括微博、拍照、签到、点评、投票、问答、往事(穿越时空)、当下热点、周边、话题等

    计模式的角度来看,用户轨迹设计应该有多种模式场景,例如旅行的轨迹、城市生活的轨迹、某次活动的轨迹等,不同类型的轨迹的需求场景及产品设计思路不尽相同。并不是所有的场景都需要记录用户行动轨迹,但在一些应用中,用户行动轨迹对于增强用户粘性还是很有价值的,最佳的设计模式在哪儿?

   关于用户行动轨迹的产品设计,有空继续思考。

 

19

什么是好的产品流程制度?

     知乎上有人问:什么样的产品流程才是好的产品流程?

     我的回答:

1、不同的领域的产品研发流程的最佳实践不尽相同

    互联网领域、传统软件、传统制造业/快速消费品虽然都有产品研发,但研发流程不尽相同,这与所在行业的产品研发周期密切相关。
    总体而言,传统软件一般采用诸如CMMI、ISO9001、RUP、IPD(华为、IBM)之类的研发流程。快速消费品的代表是宝洁,汽车制造的代表是丰田;互联网一般采用敏捷开发过程,例如Scrum等。
2、企业在不同的阶段需要不同的产品研发流程
    在创业初期,人员较少,此时侯以解决生存、探索业务模式为主,此时侯产品研发流程以“简单实用”、快速响应市场需求为主要目的。此时侯产品研发流程可以重点关注立项、产品评审、技术评审等几个关键环节,保证流程的可控性,其他的可以自由发挥。另外在创业初期可以通过面对面的沟通、协作来弥补流程上的缺陷。对于初创型公司而言,如果连沟通协作都有问题,指望制定一个完美流程来规范化此过程,那这样的公司很难走远。当然并意味着不需要产品研发流程,但不要教条化产品研发流程,让流程编程创新的桎梏。
    企业处于成长期,规模比初创期稍微大点,人相对多了(例如几十号人),业务也上了规模,此时侯需要相对规范点的研发流程来规范整个研发过程。此时侯可以在原有流程基础上针对流程执行过程中常见问题来细化并规范化产品研发过程。此时侯流程制度+沟通协作还是主要形式。
    企业发展到成熟期后,此时侯大部分公司都陷入了大企业病、官僚体制(不是贬义,泛指到此阶段的状态),各部门间分工也相对细化,此时侯基于组织管理权责明确(或者叫撇清责任的目标),必须依靠完整的流程制度来规范化整个流程,此时侯产品研发流程越来越复杂,最终会演变成类似IPD、RUP、CMMI等业内最佳实践的变体。
3、每一个企业的产品研发流程都与其企业文化、企业所在领域、企业发展历史等密切相关,不要指望有一个完美流程能够原封不动地搬过来就能够涵盖自己企业的需求,每一个企业产品研发流程制度的制定可以参考业内最佳的实践,但取代不了结合企业的实际情况做裁剪。
4、产品研发流程制度最重要的环节不在于制定,而在于执行,而且在于持续不断地完善,所谓“持续优化”。在完美的产品研发流程制度,如果不执行到位,只是过形式,那这样的流程制度依然毫无价值;再差的产品研发流程制度,只要结合企业实际情况,持续不断地完善并落实到位,那对于此企业而言就是好的流程、就是完美流程
5、产品研发流程制度实际上是规范相关人员的行为,因此所有研发流程制度的问题归根结底还是人员素质、人员意识的问题,在制定流程制度来规范化相关行为时候,怎样提升这样人员的素质更为关键。

    其实对于此回答,我也不很满意。这样的问题,貌似简单,但其实挺大的,非我辈能够高瞻远瞩、提纲挈领地回答。

    好在只是谈个人心得,害死人不负责。近期我自己也在思考什么是好的产品及怎样才能做好产品管理,例如近期的一些思考:产品的取舍之道 互联网产品品质指标思考 互联网运营期产品评审杂思 互联网产品规划杂思 等。但对于有些问题,你越了解,你越不是很明白,对于一些浅显的问题越是有所敬畏。产品研发的过程其实像人世间的很多东西一样,很多时候无所谓好坏,关键还是在于对度的把握上,但要把控好过犹不及的尺度,似乎没有太多的人能够准确把控。 以上面回答中所说的“企业在不同的阶段需要不同的产品研发流程”为例,怎样定义企业的不同阶段、在不同阶段产品研发流程制度的详细程度都涉及度的问题。

    对于产品流程制度的见解,我自己也经历了类似于禅宗“见山三阶段”的过程。 

    1、见山只是山,见水只是水 – 初次接触,随意观察,表面印象,没有深入探讨 
        此阶段,迷信那些业内的最佳阶段,觉得产品研发流程制度的制定多么容易,直接参考并综合那些最佳实践就是了。但最后发现倒是制定了一堆融合了各种最佳实践的流程制度,貌似标准化了整个过程,但最终或是没有执行或是执行了效果并不好,最后的结果就是不了了之。

    2、见山不是山,见水不是水 – 进入怀疑、批判阶段,疑团满腹,眼前是假象    

        此阶段,对于那些最佳实践的执行前提及场景有了些认识,于是乎结合企业自己的实际情况对这些最佳实践进行裁剪,试图制定出一个相对符合企业实际情况的“完美流程”;同时也开始意识到持续完善的重要性。但一对流程制度持续完善,原本相对简单的流程制度开始越来越复杂,最终也演变成真正的“完美流程”:涵盖了产品研发过程中所有阶段、所有问题,最终执行情况也是不了了之。

    3、见山仍是山,见水仍是水 – 经验证、分析后获得领领悟和证明,疑虑解除。
        此阶段,越来越感觉到所谓“存在就是合理的”,任何执行得行之有效的制度都有其原因,无所谓完美。此时候有点明白“简单是美”的道理了,不再试图制定完美流程来涵盖各种需求场景,在制定制度时候也尽量保持制度的简单性,对那些理论上完美但执行相对复杂的都敬而远之。   此时侯意识到制定一个貌似完美的流程制度不是关键,关键在于执行的人、以及对制度持续的改进。对产品研发流程制度规范性的关注点转移到人的素质提升上,转移到制度的持续完善了(在“简单是美”原则下的持续完善)。

  正如在 互联网运营期产品评审杂思 中说的:

    一个制度的执行不在于制度最初定义得多么的完美,关键在于制度能否持续不断地优化。持续优化/持续改进/持续完善 是各种管理方法众所周知且行之有效的核心秘密之一,但也是最难贯彻执行的,尤其是相对于那些管理时尚流行语,提持续改进太没新意、太没高度了,于是乎我们都指望有“银弹”来解决面临的各种问题。

 
 

    订阅

    近期文章

    近期评论

    文章归档

    分类目录

    功能