• WebX的url生成及URIBroker的问题和解析

    前提条件

    将WebX应用部署在“/”上,新建一个component名为“happy”。

    其中的happy对应的uri对象配置如下:

    <uris:uri id="server" requestAware="true" />
    <!-- happy -->

    <uris:turbine-uri id="happyModule" exposed="true" extends="server">
    <componentPath>/happy</componentPath>
    </uris:turbine-uri>
    <uris:turbine-content-uri id="happyContent" exposed="true" extends="happyModule" />

    诡异的现象

    当我们分别打开“http://127.0.0.1:8081/happy/”、“http://127.0.0.1:8081/happy/index”和“http://127.0.0.1:8081/happy/index”时,我们发现:

    • 在“http://127.0.0.1:8081/happy/”中,$happyModule和$happyContent都被解析为“http://127.0.0.1:8081/happy/happy”,显然,这不是我们想要的结果。
    • 在“http://127.0.0.1:8081/happy/index”中, $happyModule和$happyContent都被解析为“http://127.0.0.1:8081/happy/index/happy”,这,跟我们想要的相差更多了
    • 在“http://127.0.0.1:8081/happy/index.htm”中, $happyModule和$happyContent都被解析为“http://127.0.0.1:8081/happy”,后面少了个“/”,嗯,还凑合。

    我们先来看一下,为啥上面的若干情况如此诡异呢?考虑以下四个URL:

    • http://127.0.0.1:8081/happy
    • http://127.0.0.1:8081/happy/
    • http://127.0.0.1:8081/happy/index
    • http://127.0.0.1:8081/happy/index.htm

    其实,他们指向的component都是happy,对应的screen都是index。而事实上,WebX也是这么映射到对应的screen的——因为我们能够正常访问页面,而且都是happy下index的内容,对吧。理论上,我们要求WebX对确定的映射内容也返回稳定的渲染结果,而事实却并非如此。为什么呢?我们要深入源代码一探究竟。

    深入源码

    先简单介绍一下,在com.alibaba.citrus.service.uribroker.uri.URIBroker类中,有一个叫path的数组,里面存放了杠与杠之间的各部分。比如/aaa/bbb/ccc/,那么这个数组存放的是[aaa, bbb, ccc]。此类还有一个叫renderPath()的函数,作用是把path中的各个元素组合起来。如上面的数组会组合成“/aaa/bbb/ccc”。看起来不错,不过少了最后的一道杠。

    回到上面的例子,为什么会出现了两次“happy”呢?直接原因,是path数组中存了两个“happy”。根本原因,是因为request.getServletPath()返回了“/happy/”,导致ServletURIBroker类中populateWithRequest()函数误以为当前的servlet是happy。因为在j2ee中,后面处理URI时会把servlet部分切割掉,所以多加了一次“happy”。这是不正确的,因为当前的servlet应该是“/”才对!

    而这个getServletPath()函数,则是com.alibaba.citrus.service.requestcontext.rewrite.impl.RewriteRequestContextImpl#RequestWrapper中定义的。

    论坛已经有人提出相关的问题:http://www.openwebx.org/forum/showthread.php?tid=91&highlight=servletpath。两年过去,仍旧如故。

    解决

    相当于写死了URL(参见http://openwebx.org/forum/showthread.php?tid=478和http://hi.baidu.com/epplera/item/5877681cce410e221994ec67)。

    方法1:

    使用turbine-content-uri,并且增加:<contextPath>Web App的部署目录,一般部署在根目录则填“/”</contextPath>

    方法2:

    <uris:uri id="server" requestAware="false">
    <serverName>127.0.0.1</serverName>
    <serverPort>8081</serverPort>
    </uris:uri>

    还凑合的一道杠

    为什么说“http://127.0.0.1:8081/happy”还凑合呢?因为,Spring框架中,当我们直接访问“http://127.0.0.1:8081/happy”时,Web服务器发现该网址不存在,于是就返回302跳转到“http://127.0.0.1:8081/happy/”去,所以最后那个是可以正常访问的,虽然跟我们想要的还是差了一道杠(差了网址结尾的“/”)。

    不过,一道杠的差别,却不是轻易就能够解决的。话分两头:一方面,想要用turbine-uri在后面加一道简简单单的杠,几乎是不可能的,后文详述原因;另一方面,如果turbine-uri是指向python编写的web app(尤其是用强哥框架,英文名Django框架)的话,就不一定会自动给你补上后面的一道杠,而是冷冰冰地返回一个404错误。

    一道杠的距离

    这时候,再说一下,WebX中,如果要在uri后面加一道杠,究竟有多难?答案是很难。假设我们分别要生成“http://blog.creke.net/tag/linux/”和“http://blog.creke.net/803.html”,注意后面有道杠。看看下面的配置:

    <uris:uri id="crekeServer" requestAware="false" >
    <serverName>blog.creke.net</serverName>
    </uris:uri>

    <uris:turbine-content-uri id="crekeLink1" exposed="true" extends="crekeServer" >
    <contentPath>/tag/linux/</contentPath>
    </uris:turbine-content-uri>
    <uris:turbine-content-uri id="crekeLink2" exposed="true" extends="crekeServer" >
    <componentPath>/tag</componentPath>
    <contentPath>/linux/</contentPath>
    </uris:turbine-content-uri>
    <uris:turbine-uri id="crekeLink3" exposed="true" extends="crekeServer" >
    <target>/tag/linux/</target>
    </uris:turbine-uri>
    <uris:turbine-content-uri id="crekeLink4" exposed="true" extends="crekeServer" >
    <contentPath>/803.html</contentPath>
    </uris:turbine-content-uri>

    生成的结果分别是:

    • http://blog.creke.net/tag/linux
    • http://blog.creke.net/tag/linux
    • http://blog.creke.net/tag/linux
    • http://blog.creke.net/803.html

    根本原因是,uriBroker将任何URL的路径部分都一视同仁地分解为上文所述的path数组。这对于有后缀名的“http://blog.creke.net/803.html”来说无所谓,反正“803.html”是path的一个元素,直接加就对了;但是对于“http://blog.creke.net/tag/linux/”来说,uriBroker并不会记录是否需要补上最后的一道杠,也就是被吞掉了。

    总结

    在WebX中,如果不想在配置中写死URL前缀,那么除了首页外,总是要加上index.htm来标示默认页面。而如果要生成最后带“/”的URL的字符串,则不要使用URIBroker类。

    最后,还是用WebX文档中的一句话来作总结吧:“我并不是说所有的框架都一样好,而是说只要假以时日,所有的框架在发展过程中,必然会积聚好的方面,淘汰坏的方面,从而变得足够好。从这个角度看,的确没有特别明显的理由来选择Webx,但也没有明显的理由不选择Webx。”(via http://openwebx.org/docs/preface.html#d0e76)

    2013.08.25 / 4 条评论 / 3,072 次点击 / 分类: 所谓技术

  • ffmpeg/ffprobe查看音频视频文件信息并输出为json格式

    ffmpeg/ffprobe查看音频视频文件信息并输出为json格式,这是一个很实用的功能,特别是外部程序调用并处理音频视频信息时。

    相关命令如下:

    ffprobe -v quiet -print_format json -show_format -show_streams #{source}

    2013.03.12 / 5 条评论 / 8,098 次点击 / 分类: 所谓技术

  • ffmpeg将音频或视频编码为AMR格式音频

    Android编码的MP4音频格式可能为AMR,这时候用以下命令可以从MP4中直接提取AMR音频:

    ffmpeg -i test.mp4 -c:a copy test.amr

    将其他格式的音频或视频转成AMR的命令:

    新写法:

    ffmpeg -i test.mp4 -c:a libopencore_amrnb -ac 1 -ar 8000 -b:a 12.20k -y test.amr

    旧写法:

    ffmpeg -i test.mp4 -acodec libopencore_amrnb -ac 1 -ar 8000 -ab 12.20k -y test.amr

    2013.03.12 / 暂无评论 / 1,445 次点击 / 分类: 所谓技术

  • CentOS编译安装ffmpeg以及相关编码解码器

    CentOS编译安装ffmpeg是一件很痛苦的过程,因为各种编码器、解码器什么的很繁杂,而且相互依赖关系更复杂。

    编译了一天终于把它搞定并基本测试无问题,以下是步骤。

    安装yasm

    wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
    tar zxf yasm-1.2.0.tar.gz
    cd yasm-1.2.0
    ./configure
    make
    make install

    安装frei0r(先安装新版autoconf,这会覆盖掉系统中的旧版本哦)

    wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
    tar zxf autoconf-2.69.tar.gz
    cd autoconf-2.69
    ./configure --prefix=/usr
    make
    make install

    wget http://files.dyne.org/frei0r/releases/frei0r-plugins-1.4.tar.gz
    tar zxf frei0r-plugins-1.4.tar.gz
    cd frei0r-plugins-1.4
    ./configure
    make
    make install

    安装gnutls

    参考:http://blog.creke.net/800.html

    安装mp3lame

    wget http://iweb.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
    tar zxf lame-3.99.5.tar.gz
    cd lame-3.99.5
    make
    make install

    安装opencore-amr

    wget http://iweb.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-0.1.3.tar.gz
    tar zxf opencore-amr-0.1.3.tar.gz
    ./configure --enable-shared
    make
    make install

    安装opus

    wget http://downloads.xiph.org/releases/opus/opus-1.0.2.tar.gz
    tar zxf opus-1.0.2.tar.gz
    cd opus-1.0.2
    make
    make install

    安装rtmpdump

    wget http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz
    tar zxf rtmpdump-2.3.tgz
    cd rtmpdump-2.3
    make
    make install

    安装schroedinger(先安装好orc库)

    wget http://code.entropywave.com/download/orc/orc-0.4.17.tar.gz
    tar zxf orc-0.4.17.tar.gz
    cd orc-0.4.17
    ./configure
    make
    make install
    /sbin/ldconfig

    wget http://diracvideo.org/download/schroedinger/schroedinger-1.0.11.tar.gz
    tar zxf schroedinger-1.0.11.tar.gz
    cd schroedinger-1.0.11
    PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig ./configure
    make
    make install

    安装soxr(注:新版libsoxr貌似与当前ffmpeg不兼容,用旧版)

    yum install -y xz
    wget http://hivelocity.dl.sourceforge.net/project/soxr/soxr-0.1.0-Source.tar.xz
    xz -d soxr-0.1.0-Source.tar.xz
    tar xf soxr-0.1.0-Source.tar
    cd soxr-0.1.0-Source
    ./go
    cd Release/
    make
    make install
    /sbin/ldconfig

    安装speex(先安装libogg库)

    wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz
    tar zxf libogg-1.3.0.tar.gz
    ./configure
    make
    make install
    /sbin/ldconfig

    wget http://downloads.xiph.org/releases/speex/speex-1.2rc1.tar.gz
    tar zxf speex-1.2rc1.tar.gz
    cd speex-1.2rc1
    ./configure
    make
    make install

    安装theora(先安装好libvorbis库和libsdl库)

    wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
    tar zxf libvorbis-1.3.3.tar.gz
    ./configure
    make
    make install

    wget http://www.libsdl.org/release/SDL-1.2.15.tar.gz
    tar zxf SDL-1.2.15.tar.gz
    cd SDL-1.2.15
    ./configure
    make
    make install
    /sbin/ldconfig

    wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2
    tar zjf libtheora-1.1.1.tar.bz2
    ./configure
    make
    make install

    安装twolame

    wget http://downloads.sourceforge.net/twolame/twolame-0.3.13.tar.gz
    tar zxf twolame-0.3.13
    .tar.gz
    cd twolame-0.3.13
    ./configure
    make
    make install
    /sbin/ldconfig

    安装VisualOn AAC(注:github的tag和master版均无法autoconf,用zeranoe版代替)

    wget wget http://ffmpeg.zeranoe.com/builds/source/external_libraries/vo-aacenc-0.1.2.tar.xz
    xz -d vo-aacenc-0.1.2.tar.xz
    tar xf vo-aacenc-0.1.2.tar
    cd vo-aacenc-0.1.2
    ./configure
    make
    make install

    安装VisualOn AMR-WB(注:github的tag和master版均无法autoconf,用zeranoe版代替)

    wget http://ffmpeg.zeranoe.com/builds/source/external_libraries/vo-amrwbenc-0.1.2.tar.xz
    xz -d vo-amrwbenc-0.1.2.tar.xz
    tar xf vo-amrwbenc-0.1.2.tar
    cd vo-amrwbenc-0.1.2
    ./configure

    安装libvpx(注:新版libvpx貌似与当前ffmpeg不兼容,用旧版)

    wget http://webm.googlecode.com/files/libvpx-v1.1.0.tar.bz2
    tar jxf libvpx-v1.1.0.tar.bz2
    cd libvpx-v1.1.0
    ./configure
    make
    make install

    安装x264

    wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
    tar jxf last_x264.tar.bz2
    cd x264-snapshot-20130311-2245/
    ./configure --enable-shared
    make
    make install

    安装xvid

    wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
    tar zxf xvidcore-1.3.2.tar.gz
    cd xvidcore
    cd build/generic
    ./configure
    make
    make install

    最重要的一步——编译安装ffmpeg!

    wget http://ffmpeg.org/releases/ffmpeg-1.1.3.tar.gz
    tar zxf ffmpeg-1.1.3.tar.gz
    cd ffmpeg-1.1.3
    PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig ./configure --disable-static --enable-shared --enable-gpl --enable-version3 --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-zlib
    make
    make install

    注1:

    我在编译安装时参考Windows Build:http://ffmpeg.zeranoe.com/builds/。

    注2:

    与Windows Build相比,以下没有选项开启:

    --enable-libgsm --enable-libilbc -enable-libass --enable-libbluray --enable-libcaca --enable-libopenjpeg --disable-w32threads --enable-avisynth --enable-libxavs

    2013.03.12 / 1 条评论 / 4,297 次点击 / 分类: 所谓技术

  • CentOS编译安装新版gnutls

    在Linux中,gnutls应用很常见,最近编译ffmpeg时也用到,不过应该是自带的gnutls太旧了,所以编译错误,要新编译一个。下面是编译安装过程。

    注意:/etc/ld.so.conf要加上lib64。并且不要使用yum remove gnutls gnutls-devel,不信?你会后悔的!

    首先安装nettle:

    wget http://www.lysator.liu.se/~nisse/archive/nettle-2.5.tar.gz
    tar zxf nettle-2.5.tar.gz
    cd nettle-2.5
    ./configure --enable-shared
    make
    make install

    然后安装gnutls新版:

    wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.9.1.tar.xz
    xz -d gnutls-3.1.9.1.tar.xz
    tar xf gnutls-3.1.9.1.tar
    cd gnutls-3.1.9.1
    PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig ./configure --enable-shared
    make
    make install

    就是这样。

    2013.03.12 / 1 条评论 / 2,764 次点击 / 分类: 所谓技术

  • MingW通过mingw-get的package管理切换回gcc 4.5.2

    MingW的mingw-get-inst是会在安装时自动找到最新的package然后进行安装,安装了gcc后,我们会发现gcc版本太新了,以致不少程序不支持。因此,我们要把MingW的gcc换回旧版,以下是切换方法。

    首先,我们应该知道,mingw的package可以用mingw-get管理,具体命令参考网址:

    http://sourceforge.net/projects/mingw/files/Installer/mingw-get/

    按照当前安装的gcc版本,把新版gcc相关东西删掉,如当前安装的是gcc 4.7.2,可以在http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.7.2-1/看到各种package,用以下命令删除:

    mingw-get remove package名

    这步可以不做,但是还是推荐做一下。

    安装旧版gcc:

    mingw-get install "gcc-core=4.5.2-1" "gcc=4.5.2-1"

    安装libz库:

    mingw-get install libz zlib

    再试一下“gcc -v”,成功换回了4.5.2版。

    2013.01.21 / 1 条评论 / 1,432 次点击 / 分类: 所谓技术

  • 在Eclipse中添加Chrome为external browser并使用自定义参数

    在Eclipse Juno中添加Chrome为external browser并使用自定义参数是一件很痛苦的事,因为要添加%URL%,要添加自定义参数,如“--disable-web-security”等。探索了一晚,终于找到了解决方法……

    在Eclipse中点击:Window->Preferences->General->Web Broser,然后选择“User external web browser”。点击“New”,添加,名字是Chrome,路径自行通过快捷方式进行寻找,我的是“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe”,关键部分在于“Parameters”,填入以下内容:

    "%URL% --disable-web-security

    注意第一个引号前面有空格,并且只有一个引号哦!

    确定后试一下,终于可以正常访问URL并使用了该参数了!

    最后的总结是:Eclipse Juno坑爹,真坑爹!

    2013.01.21 / 暂无评论 / 1,125 次点击 / 分类: 所谓技术

  • Linux安装Python2.7并保留自带版本

    Linux很多组件需要Python,但自带的都是比较旧的版本,但不少程序也需要Python,但都是要求比较高的版本,但Python新旧版本不太兼容,所以……

    我们很有比较在系统上装个新版本,但默认还是要用旧版的Python。以下是安装过程。

    装较新版sqlite,否则新版的2.7会编译出错,而且一些Python应用程序也会莫名其妙地运行出错。

    wget http://www.sqlite.org/sqlite-autoconf-3071401.tar.gz
    tar zxf sqlite-autoconf-3071401.tar.gz
    ./configure
    make && make install
    ln -sf /usr/local/lib/libsqlite3.so /usr/lib/libsqlite3.so
    ln -sf /usr/local/lib/libsqlite3.so.0.8.6 /usr/lib/libsqlite3.so.0.8.6
    ln -sf /usr/local/lib/libsqlite3.so.0 libsqlite3.so.0.8.6

    然后安装Python,这里安装到/usr/local/python27的路径,防止覆盖掉旧版。

    wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
    tar zxf Python-2.7.3.tgz
    cd Python-2.7.3
    ./configure --prefix=/usr/local/python27
    make
    make install
    ln -sf /usr/local/python27/bin/python2.7 /usr/local/bin/python2.7

    然后安装setuptools,即easy_install。

    wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
    tar zxf setuptools-0.6c11.tar.gz
    cd setuptools-0.6c11
    python2.7 setup.py install
    ln -sf /usr/local/python27/bin/easy_install-2.7 /usr/local/bin/easy_install-2.7

    好了,现在如果要用自带的Python,则直接运行对应的py文件即可,如果要用安装的Python2.7,则使用“python2.7 xxx.py”即可。

    使用easy_install也是,自带的直接运行“easy_install xxx”,对应Python2.7的运行“easy_install2.7 xxx”。

    2012.11.08 / 6 条评论 / 6,709 次点击 / 分类: 所谓技术

  • OpenVPN使用纯插件通过MySQL进行用户验证(不使用PAM与FreeRadius)

    OpenVPN通过MySQL进行用户验证有很多种方案,比较常见的是自编写脚本、PAM和FreeRadius等。各有各的缺点,如PAM只能验证而不能监控流量;自写脚本太麻烦,效率不够高;FreeRaduis配置麻烦,消耗资源有点大,等等。

    有个“openvpn-mysql-auth”插件可以单独完成用户验证,并且可以自定义SQL语句,且各种具备事件前后执行的功能,相当强大好用。

    假设已经根据《Linux下OpenVPN服务安装记》一文编译安装好了OpenVPN服务端。

    首先,从https://github.com/chantra/openvpn-mysql-auth获得源代码,进入源代码目录。运行

    ./autogen.sh

    ./configure

    make

    如果出现“undefined reference to 'mysql_init'”或者相关的mysql函数未定义的错误,则运行

    ln -s /usr/lib/mysql/libmysqlclient.so /usr/lib/libmysqlclient.so

    然后再make一次。

    接着,执行命令将编译好的库放到OpenVPN目录:

    cp -a src/.libs/libopenvpn-mysql-auth.so* /etc/openvpn/mysql-auth/

    进入OpenVPN的目录,生成tls-auth key:

    cd /usr/local/openvpn/

    sbin/openvpn --genkey --secret ta.key

    mv ta.key etc/

    在etc/server.conf对应位置加上:

    tls-auth /usr/local/openvpn/etc/ta.key 0

    在etc/server.conf最后加上

    plugin /usr/local/openvpn/plugin/libopenvpn-mysql-auth.so -c /usr/local/openvpn/etc/plugin/mysql-auth.conf

    其中的mysql-auth.conf根据自己需要和实际的账户数据库进行填写,具体可以参考它的README。比如我的实现登录验证和登录日志功能,非常简单:

    hostname blog.creke.net
    port 3306
    login creke
    password creke
    db creke
    s_path none

    auth_user_pass_verify_query SELECT uid FROM creke_users WHERE usr='{{escaped_username}}' AND pwd=MD5('{{escaped_password}}') AND

    client_connect_query INSERT INTO creke_log (usr, ip, time) VALUES ('{{escaped_username}}', '{{trusted_ip}}', {{time_unix}})

    PS:如果希望不用client证书验证而仅通过用户名密码加TLS认证,可以只给用户ca和tls-auth对应的文件,在客户端配置中将cert和key注释。但服务器端不能将cert和key注释,否则会报错。并在server.conf最后加上

    client-cert-not-required

    username-as-common-name

    2012.11.05 / 2 条评论 / 2,828 次点击 / 分类: 所谓技术

  • 在Linux中安装plowshare

    使用git将项目clone到机器上并安装。如果没有git,可以参考《CentOS安装git》安装。

    使用以下命令进行安装plowshare

    git clone https://code.google.com/p/plowshare/

    cd plowshare

    然后,由于新版的plowshare默认是支持bash4以上,而大多数Linux都还是bash3,如果运行,会出现“plowshare/src/core.sh: line 2592: local: -u: invalid option”的错误提示,所以正在用bash3的用户要改成支持bash3的分支。

    git branch -a #看到有两个分支,一个master,一个bash3,HEAD则是头分支

    git checkout bash3 #切换到bash3分支,并自动track远程的同名分支

    最后安装(如果用了bash4的版本则将“plowshare3”改为“plowshare4”):

    make install PREFIX=/usr/local/plowshare

    ln -sf /usr/local/plowshare/share/plowshare3/download.sh /usr/local/bin/plowdown

    ln -sf /usr/local/plowshare/share/plowshare3/upload.sh   /usr/local/bin/plowup

    ln -sf /usr/local/plowshare/share/plowshare3/delete.sh   /usr/local/bin/plowdel

    ln -sf /usr/local/plowshare/share/plowshare3/list.sh     /usr/local/bin/plowlist

    安装完毕好,就可以直接使用:

    plowdown 网址

    即可将网络硬盘上面的内容下载到本地了。如果有验证码,则要根据提示找到验证码,并将验证码输入即可,或者加上“--captchamethod=imgur”参数,把验证码传到imgur网址,就可以直接通过浏览器访问验证码啦。

    更新也很简单,先进入plowshare的git版本目录,运行:

    git pull --all

    rm -rf /usr/local/plowshare/

    make install PREFIX=/usr/local/plowshare

    2012.10.28 / 暂无评论 / 795 次点击 / 分类: 所谓技术