出家如初,成佛有余

Slideshare PPT下载shell脚本

Posted in 技术相关 by chuanliang on 2012/01/26

以前总结过在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两个动态库大致可以知道。

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

 

Advertisements

Slideshare PPT下载shell脚本

Posted in 技术相关 by chuanliang on 2012/01/26

    以前总结过在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两个动态库大致可以知道。

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

 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

Posted in 移动互联网, 产品管理 by chuanliang on 2012/01/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、手机充值利润很薄,只能作为一种吸引流量的业务

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

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

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

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

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