Discuz!X2.5论坛采集接口发布暨授权中心改版公告

4月7号完成Discuz!X2.5论坛接口发布,收费接口和免费接口同步发布;
4月15日完成授权中心改版,接口在线购买及在线升级功能完成并上线;

改版公告:
1,在购买接口时,请大家正确填写邮箱地址,避免购买成功却无法收到通知邮件的问题;
2,老用户可以在线对接口进行升级和降级,如购买DX1.0的用户,可以将升级到DX2.5,也可以降级到DZ7.2,但考虑到服务器压力,30天内只允许升降级一次;
3,免费用户购买流程,依然是只需要填写域名和联系信息,不需要付款,并能收到通知邮件;
4,所有留下邮箱的同学,可以在接口发布、升级、紧急Bug修正以后,收到更新通知邮件;

新版授权中心,如何购买相关采集程序:

[CodeAnwhere]Eclipse 即将发布基于浏览器的 IDE

写程序的动物们,这事儿靠谱么~~
开源开发工具Eclipse 基金会预计在10月份发布Orion 1.0,这是一款基于浏览器的IDE,用于构建web app。本周在Reston, Va 召开的EclipseCon 2012会议上将讨论此事。

桌面版的Eclipse是面向Java和C++的,而Orion则是面向HTML和JavaScript的。Eclipse的营销副总裁Ian Skerrett在接受记者采访时说:“使用Orion的好处是,开发工具本身就是app将来所要运行的环境。再者,Orion对云应用开发尤其有用。”

注:该会议当中有一个议题是关于Eclipse插件VJet JavaScript IDE的,在这个议题中会涉及到Node.js的讨论。

Orion是在去年的EclipseCon会议上提出来的。在今年的EclipseCon会议上,开发者将会获得一些关于使用和扩展Orion的信 息。而且Eclipse预计Orion将会在商业软件中得到应用。Skerrett特别指出,Mozilla已经开始在其Firefox开发工具中使用 Orion编辑器。

今年6月份Eclipse年度发布会将发布大量的Eclipse的相关技术,届时,Orion 1.0也将面世。今年的release train名为Juno,是基于具有重构功能的Eclipse 4的,重构功能使得在Eclipse平台上构建app变得更容易。去年的release train Indigo上发布了62个项目。

EclipseCon 2012会议上的其它议题包括:通过Eclipse工具开Andriod apps,app生命周期管理,devops,以及关于JavaFX和Eclipse的讨论。技术性会议Agile ALM Connect也在同一个地点召开,该会议的主题是“集成最新的开发工具、敏捷方法、app生命周期中的参与者”。

nginx + php-fpm 实现不同的虚拟主机使用不同的phpadminvalue配置

Apache下,每个虚拟主机可以单独不同的phpadminvalue,可以设置非常详细的网站目录权限设置,安全性比较高。

nginx做为一个高性能的web服务器已经得到广泛的应用,随着php5.3的发布,php-fpm也已经内置在php里面了,如何安装配置nginx+php-fpm,下面的内容,将集中于给nginx的虚拟主机和php-fpm的pools配合,实现不同虚拟主机运行不同配置的php。

我们下面会配置两个虚拟主机,使用不同的php和php-fpm配置

编辑php-fpm.conf

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = warning
emergency_restart_threshold = 0
emergency_restart_interval = 0
process_control_timeout = 0
daemonize = yes

include=/srv/vhost/*/php-fpm.conf

这里第10行包含各vhost的配置

编辑/srv/vhost/a/php-fpm.conf

[a]
listen = /srv/vhost/a/php-fpm.sock

; Unix user/group of processes
user = nginx
group = nginx

; Choose how the process manager will control the number of child processes.
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 100

; Pass environment variables
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

; host-specific php ini settings here
php_admin_value[disable_functions]=phpinfo
php_admin_value[open_basedir]=/srv/vhost/a/webroot:/tmp

当php-fpm和nginx在同一台服务器时,我比较喜欢用unix sockt。这里指定了sockt文件的地址 /srv/vhost/a/php-fpm.sock

编辑 /srv/vhost/b/php-fpm.conf

[b]
listen = /srv/vhost/b/php-fpm.sock

; Unix user/group of processes
user = nginx
group = nginx

; Choose how the process manager will control the number of child processes.
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 100

; Pass environment variables
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

; host-specific php ini settings here
;php_admin_value[disable_functions]=phpinfo
php_admin_value[open_basedir]=/srv/vhost/a/webroot:/tmp

监听在 /srv/vhost/b/php-fpm.sock,另外可以看到,我注释了phpadminvalue[disable_functions]=phpinfo,也就是不禁用phpinfo函数

php-fpm配置完毕,启动它。

接下来配置nginx,配置两个server

server {
    listen       80;
    server_name  a.somethings.me;
    index index.php;
    root /srv/vhost/a/webroot/;

    location /{

    }

    location ~ .*\.php${
        fastcgi_pass  unix:/srv/vhost/a/php-fpm.sock;
        fastcgi_index index.php;
        include fcgi.conf;
    }
    access_log /var/log/nginx/a.somethines.me-access.log;
}

server {
        listen       80;
        server_name  b.somethings.me;
        index index.php;
        root /srv/vhost/a/webroot/;

        location /{

        }       

        location ~ .*\.php${
                fastcgi_pass  unix:/srv/vhost/b/php-fpm.sock;
                fastcgi_index index.php;
                include fcgi.conf;
        }
        access_log /var/log/nginx/b.somethines.me-access.log;
}

两个server分别fastcgi_pass到不同的sockte文件上,分别在/srv/vhost/a/webroot/ 和 /srv/vhost/a/webroot/ 下创建如下文件

<?php phpinfo();

启动nginx,分别访问 a.somethings.me 和 b.somethings.me 发现a.somethings.me 报错如下

Warning: phpinfo() has been disabled for security reasons in /srv/vhost/a/webroot/phpinfo.php on line 2

而b.somethings.me 正确显示了phpinfo信息,说明我们的配置生效了,在看一下我们的进程

OK, 成功了!

相关关键词挖掘的五种方法

关键词挖掘对于SEO来说是必不可少的,针对SEO项目制定的SEO策略,也应该是以“关键词挖掘”为基础的。关键词挖掘的过程,同时也是用户需求的挖掘过程,目的就是了解“潜在用户”在使用搜索引擎过程中的搜索习惯,为“潜在用户”提供“搜索关键词”对应的优质内容。
而怎么挖掘关键词,一直是备受SEOer关注的问题。

一、同事、亲戚、朋友

我们身边大部分人都已经成为搜索引擎的用户,而普通用户本身更能代表大众的搜索习惯。所以,在进行关键词挖掘之前,不妨给身边的每个人限定一个主题,让他们给出会使用最频繁的搜索词,例如,问你的女性朋友:如果她要从网上购买一款化妆品,她会怎样从百度获取信息。 或许从中你可以获得一些不错的建议。
以上述方式获得的这类关键词,一般被当作 “种子词”。万事开头难,有了种子词之后,就可以通过各类工具拓展出更多更深层次的关键词了,尤其是长尾关键词。

二、网站分析工具后台(Google Analytics)

如果网站已经有部分自然搜索流量,同时网站也安装了网站分析工具,那么就可以在分析工具的“关键词”报告中,得到用户进入本网站所使用的搜索“关键词”了。
Google Analytics默认最多导出500个关键词,如果要分析更多的关键词,需要使用Google Analytics提供的API或者修改下载链接。当前最多可以下载1万条关键词数据。

1、打开“老版本”Google Analytics的非付费关键词报告

2、点击导出,并复制“TSV”链接

3、在链接URL的最后,添加&limit=10000参数
https://www.google.com/analytics/reporting/export?******slice=non-paid&segkey=keyword&tchcol=0&tst=0&limit=10000
4、复制URL到浏览器地址栏,回车后,开始下载关键词数据
数据下载完成后,直接用Excel打开,容易出现中文乱码的情况,需要先用记事本打开,再复制粘贴到新的Excel文件中,就可以正常显示了。

对Google Analytics API感兴趣的可以查看:
http://www.google.com/analytics/features.html#customized_reporting
在Google Analytics APPs页面(http://www.google.com/analytics/apps/)也介绍了较多第三方工具,有收费的也有免费的。
现在也有较多为iPAD、iPhone等移动设备提供的Google Analytics APP应用,例如:
Analytics站点分析博士 HD :
http://itunes.apple.com/cn/app/id387112876?mt=8 
Analytics for iPad:
http://itunes.apple.com/cn/app/analytics-for-ipad/id373676475?mt=8
所能获得的这一部分词,成分比较复杂,有一些词可以作为“种子词”,有一些词跳出率过高,与网站相关性不大,需要剔除,所以需要详细分析,摘出质量较高的关键词。

三、搜索引擎

最了解用户在搜索什么词的,当然就是搜索引擎自己了。由于掌握了大量的原始数据,搜索引擎能给用户更多的搜索建议。搜索引擎为了减少用户的思考,或者帮助用户更好的使用搜索引擎得到想要搜索的内容,为用户提供了一些词的相关搜索词,或者搜索推荐词。以百度为例:

当用户在百度的搜索框中输入“关键词”时,百度会推荐最近时间内用户基于“关键词”这个词的常用搜索。当然这个是要在启用了“搜索框提示”的前提下:
(设置方法如图,URL:http://www.baidu.com/gaoji/preferences.html

这些关键词当然就是我们要找的“关键词”相关的关键词,使用网络抓包工具Fiddler可以得到推荐关键词的详细地址(http://suggestion.baidu.com/su?wd=%E5%85%B3%E9%94%AE%E8%AF%8D&p=3&cb=window.bdsug.sug&t=1320906904181),地址将返回JSON格式数据,可以通过自定义程序接收这些数据,纳入我们的关键词库中。
当然这些相关搜索,有一部分也存在人工操控的嫌疑,这个不在本文讨论范围之内。

在搜索操作完成之后,搜索结果页面的底部,将显示搜索词的“相关搜索”,同样是相关性非常高的词(http://www.baidu.com/s?wd=%B9%D8%BC%FC%B4%CA&rsv_bp=0&rsv_spt=3&inputT=5148):

与此类似的地址有:
百度指数:http://index.baidu.com/

相关关键词地址:
http://nssug.baidu.com/su?wd=%E5%85%B3%E9%94%AE%E8%AF%8D&prod=index&t=1320907158893
通过工具可以从这些地址批量获取“种子词”的相关拓展关键词。

这里只介绍了百度的关键词推荐,其他搜索引擎同样可以得到这些数据。

四、其它网络营销渠道

如果公司内部除了SEO之外,也有SEM/SMO等其他网络营销方式,则需要保持与其他网络营销部门之间的及时沟通及紧密配合。

SEM部门在测试投放关键词的过程中,如果发现某些关键词的ROI不够高,但是与网站相关性较强,可以推荐给SEO部门纳入SEO的关键词库;同样,SEO部门同事在做某些关键词时,如果发现其排名较靠后,但是转化率较高,也可以推荐给SEM部门的同事纳入投放关键词库。

SMO部门在策划某活动前,可以先将活动主题等内容告知SEO部门,SEO部门可衡量其中是否存在关键词获取的机会。例如,SMO做“光棍节送好礼”的专题活动,预计 “光棍节送好礼”关键词的搜索量两周之内将提升,SEO部门可以预先为关键词制作着陆页面,抢占搜索引擎前几位排名,通过自然搜索流量回收活动流量。

这类词突发性较强,优化时需要合理的流程,保证关键词迅速取得排名。

五、关键词工具推荐

很多SEO关键词工具的关键词来源即是方法二中提到的关键词搜索引擎相关搜索等数据,Netconcepts关键词拓展工具就属于此类。除此之外,常见的关键词推荐工具如下:
PPC类:
百度推广助手(http://editor.baidu.com/):需要用户注册,具有“关键词推荐”功能,数据可导出;
Google Adwords关键字工具:
http://www.google.com/intl/zh-CN_cn/adwords/select/tools.html
网站类:
Chinaz 百度指数分析:http://tool.chinaz.com/baidu/words.aspx
爱站关键词挖掘:http://ci.aizhan.com/
如果您有更好的工具,请留言分享,谢谢

如何在Google成为一名优秀的产品经理?

在 Google ,我(前 Google 工程师 Edward Ho)和我最优秀的产品经理一起工作过,我会根据自己的经历出一个列表。由于我不是项目经理,所以这些结论都是我在 Google 观察最优秀的产品经理后的结果。

1. 对产品以及所有相关的问题负责。这会让你积极主动,你是第一个寻找bug的人,第一个与用户沟通的人,以及第一个担心产品是否合格的人。你总是第一个自愿为产品或团队做各种任务的志愿者,像是做会议记录、给客户发邮件、填补临时的空缺、为bug确定优先级,或是快速做出一个实体模型。始终持有这样一个想法:这不是别人的责任,这就是你的责任。当你这么做的时候,你会发现第2条会更容易。

2. 具备难以置信的说服力。(我不知道这是如何做到的,但每天我都会看到)你希望把事情完成,但你不是负责人,所以只能去说服别人。没有哪个团队向你汇报,也没有任何人会按照你的说法行事。在 Google ,你需要通过使别人信服而不是发号施令来完成事情。如果你正在做第1条,事情会变得简单,因为每个人都知道如果有人攻击这个产品,你和他们会位于同一个战壕。

3. 成为一名工程师。我并不是说你真的需要为产品编写代码。我想说的是,你应当像一名工程师那样对产品的构造过程具有好奇心。你应该了解产品功能在开发过程需要的成本,以及为什么开发成本会变得这么高。那个特性使用的是什么算法?为什么这个页面会呈现得很慢?大的架构变动对产品会产生影响,团队中的每个工程师都会对此非常重视,你也应该如此。如果你遇到项目的负责人,他们想要知道一些具体的事情,你应该能够为他们解释一些主要的工程方面的决定以及之前的利弊权衡。在谷歌,最好的的产品经理都会尽可能地变得更加技术化并乐此不疲。

4. 积极,再积极一点。你的团队很可能全部由工程师组成,并且中的一些可能非常愤世嫉俗。一个非常积极向上的产品经理能够在团队中创造一种包容的氛围。尽管每时每刻都保持积极看上去很可笑,但是积极是有传染性的,你的团队会依赖上它。请记住,你和主要的工程师(技术负责人)可能会列出百万种让你沮丧的事情,但是团队中的其他人不应该知道这一切。因为你是产品经理,所以不应该沉浸在自己的担心中,这样会帮助他们更好地完成工作。你就是团队面向整个公司其他部门的窗口和信使。如果你变得消极,团队就会因此认为公司里其他人也是这么看待他们的工作。

5. 不要自我推荐。这是显而易见的,如果你这么做了,不但非常无聊而且对自身也有害。赞美团队中的其他人,你和技术负责人(们)已经是项目的主要联系人,因而不要做任何的推荐。如果你拿别人的辛苦劳动用来为自己博得赞赏,你不仅错了而且不会得逞。要心胸宽广。无论是撰写项目博客,还是产品新特性的午餐视频发布会,最优秀的产品经理都应该推荐团队的其他成员。看看谷歌最优秀的产品博客,你就会发现这些博客的作者并不总是由产品经理,反而会是团队中的各个成员。产品经理会积极推荐其他人。(请不要误解我这里所说的“推荐” promotion ,这和升职是完全不同的。顺便说一下,在谷歌升职是和绩效考核紧密相关的。)

6. 无所畏惧。这个名词如果是作家来解释可能会更好,但请你不要被字面意思所迷惑。最好的产品经理向领导汇报的内容和给团队中的工程师或设计师讲述的内容应该是一样的。如果你在被领导质问产品设计所作的决定时默不作声,你肯定不会成功。做出简洁明了的回答,并无所畏惧地为你团队的创意辩护。

[转]开发者需了解10个新的开源项目

国外出了一些针对开发者的开源项目,兴许用得着。

1.Bootstrap, 一个来自Twitter的工具包,用于快速开发Web应用和网站。

2.BrowserID, 一个安全,分散,开源,基于email地址的跨浏览器网站同步登录。

3.Canvas, 基于云计算的学习管理系统LMS

4.Cloud Foundry, 一个开放的平台作为一种服务(PaaS)云,开发框架和应用服务的选择;

5.Moai, 一个移动游戏开发平台,提供基于云的游戏服务和iOS, Android应用快速开发平台。

6.Mooege,一个开放源码的教育游戏服务器仿真器;

7.OpenShift, 来自Red Hat,免费,可扩展的Platform-as-a-Service (PaaS);

8.Orion, 一个基于浏览器的开放工具集成平台,由Eclipse平台团队构建;

9.rstat.us, 一个开放的微博平台。

10.Salt, 一个开源的配置管理和远程执行应用程序。

[转]产品设计中的沟通与协作

(产品)设计的沟通与协作,这个话题一抛出来,就让我很头大。需求方、产品经理、UIUE、程序、测试之间的烂事儿一大堆。涉及到第三方甚至是几个公司之间而非一个公司内部,那沟通的困难更是雪上加霜。再如果涉及到跟政府部门的协作,那简直就是一场灾难,2012。

即便是内部沟通,考虑到内部利益集团博弈,互相拆台这样的事儿发生,那基本上就完全是无法沟通,只能靠手段去制衡。

所以,真要讨论涉及的沟通与协作,必定要设定一个相对理想的环境,即:大家都是对事不对人,才有可能讨论下去。否则,就要用辩证的具体问题具体分析了。而我下面写的关于沟通的问题,也是基于理想化环境的,因为我是一个产品经理,所以我是站在产品经理角色去理解和处理这些问题的。

沟通、协作是个盘古开天地时就遗留下来的问题,同样,也遗留下来了五件必杀神器:

你们有我懂设计吗?

这个问题不是现阶段考虑的;

这个不一定是问题,是个别人的意见;

这个没法实现;

这个我们的底层不支持;

这五神器分别被美术、产品、技术捡到。神器一出,秒杀,你郁闷到缩阳也没用了。在UCD珠海书友会上,金山同学第一个问题就是技术使出必杀:这个我们没法实现。

对于五大神器,我实在碰到过很多次,其实必杀可破,只看你愿不愿意。破必杀之法,我归纳为五点:

1、平等对话

美术、技术、测试是我们最重要的工作拍档。对于他们工作所用到的知识,我们要有所涉猎,不用成为行家,但一定要有所了解,最好有自己动手的能力。这样,才能与他们建立平等对话,说出来的话才不会被人轻视,不会被人背地里骂做SB。

如果作为一个产品经理,却不知道自己业务的底层是怎样,基本代码、数据原理是怎样,被人丢必杀技是活该。引用某前端一句话:“我绝对拒绝与连HTML都不懂的产品经理合作,这是底线。”

2、自己是否想清楚,是否真有必要;

向别人提出需求的时候,一定要想清楚,是否真的要这样,有没有必要。想办法说服别人时,最好能有数据说明你的需求是确有必要的,能缩短用户查询时间、提高装机率、降低卸载率,提高在线时间等。产品经理做好事前分析工作,是对自己工作的尊重,也是对合作拍档的尊重。

拍拍脑袋的决定,最好不要搞。毕竟我们轻描淡写几句话,技术、美术可能就要为你这几句话忙活几天甚至是数周。

3、别人拒绝时,弄清为什么;

关于这一点金山的剑三总监唐洪亮打得比方很好:厕所地上有水,为什么有水?因为笼头滴水,为什么滴水?因为人没关紧,为什么没关紧?因为笼头不是很好关,为什么不好关?因为笼头的设计问题,那为什么要采购这种笼头……

碰到问题,不能退缩,要较真,要去问,要打破砂锅问到底。程序员有一个信念,这个世界上,没有代码实现不了的事情。如果他说无法实现,一定是他不想。为什么不想,要么是修改成本太高,要么是你的需求他认为根本没必要,要么是他压根看你不爽,八字不合。找出问题根源,然后对症下药,总能解决的。

4、确认别人理解的,是你想说的;

你想的是A,讲出来的是B,别人听成了C,理解后变成D,最后再加工做出来个E,网友一看,说:这傻×公司,做出来个F,就是Fuck的意思。

沟通变成鸡同鸭讲,世界将会怎样?要避免这种情况,所以在沟通之前一定要保证信息对称,需求背景、调研资料、用户数据等,免得你突然说出来一个决定,别人莫名其妙的,怎么沟通?

说完以后,还要确认对方接受了你的信息,并且理解的也是跟你一样。所以需要让他复述给你一遍,就像集结号里面谷子地给团长复述命令,信息发出与接收需要Match一次,确认无误后,这次沟通才算结束。

5、他性格怎样、情绪怎样,你跟他关系好嘛?

一般来讲,解决上面四个问题,报障基本沟通是没有问题的。但比较我们是人,不是机器,所有流程执行完毕,Match一次,确认无误就OK的。人,是会有情绪,会有关系的。所以当需求被拒绝时,还需要考虑人的因素,比如说:股票亏了,老婆跑了,情人吹了,别人发了……等等,这些时候你热着脸去找别人沟通,别人只会给你屁股。

无论你们公司体制怎样完善,找技术、美术等拍档多吃吃饭,一起出去远足什么的,交换一些私人空间,成为朋友,这样有事儿的时候,你能理解我,我能理解我,共建和谐新社会。

至于沟通的泛技巧比如倾听、表达、平等、等,就不在此说了,其实,很多时候碰到的问题,都是制度上的存在问题,如果大家的利益捆绑在一起了,可以解决很多的沟通问题。

以上所列都是平级或跨部门沟通的问题,除此之外,还有与上司沟通的问题,与下属沟通的问题。这就不算设计的沟通与协作范畴了,不过我看到一篇文章,觉得说得不错,简单归纳一下,就是三点:

向上沟通没胆:下属向上级沟通时没有胆量,缺乏积极主动性。

水平沟通没肺:部门和平级之间沟通缺乏真心,没有肺腑之言。

向下沟通没心:上级对下属没有过多的心情或时间进行沟通,不能对下属的移位及时的指导和修正,已造成现在的企业的管理者花去一个月的时间去招聘新人员,不愿抽出2天的时间与下属进行沟通。

说了这么多,再自省一句:任何事情,懂得再多理论,都要注意知行合一

From:http://www.rtdot.com/product/22

[免费]土豆网视频专辑采集接口详解

接上篇:
[免费下载]土豆网专辑采集规则+接口
http://www.4wei.cn/archives/1001491

以下是接口全文。
我给一些重要步骤做了注释。

tudou.php下载

<?php
/*
设置接口为60秒连接,防止采集远程链接超时
*/
set_time_limit(60);

/*
获取火车采集器传过来的ID,组装出土豆的专辑链接
*/
$lid = intval($_GET["lid"]);
if(empty($lid)) exit();

$uri = sprintf("http://www.tudou.com/playlist/p/l%d.html", $lid);

/*
使用CUrl函数进行远程链接的内容获取,就是采集过程
*/
$html= curl($uri);

/*
如果没有采集到内容,则重试3次
*/
if(empty($html)) $html= curl($uri);
if(empty($html)) $html= curl($uri);
if(empty($html)) $html= curl($uri);

/*
如果采集的网页进行了Gzip压缩,则调用gzdecode函数进行解压,以获取明文
*/
$html= strpos($html, "<")==0 ? $html : gzdecode($html);

/*
使用正则获取连续的视频ID及标题
*/
preg_match_all('@iid:(\d+)\s+?,title:"([^"]+)"@is', $html, $match);

/*
遍历所有视频,组装出Discuz的Flash视频播放代码。
*/
foreach ($match[1] as $key=>$iid)
{
$code = sprintf("[flash]http://www.tudou.com/player/outside/player_outside_list.swf?iid=%d&default_skin=http://js.tudouui.com/bin/player2/outside/Skin_outside_list_7.swf&autoPlay=false&listType=1&rurl=&autostart=false&lid=%d[/flash]", $iid, $lid);

/*
最后组装出方便火车采集器循环采集的代码格式
*/
printf("<!--titlestart-->%s<!--titleend--><!--codestart-->$code<!--codeend-->", $match[2][$key]);
}

function curl($url) {
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 2 );
curl_setopt ( $ch, CURLOPT_ENCODING, "gzip" );

$data = curl_exec ( $ch );

if (curl_errno ( $ch )) {
/*debug info*/
return curl_error ( $ch );
} else {
curl_close ( $ch );
}

return $data;
}

function gzdecode($data) {
$len = strlen($data);
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
return null; // Not GZIP format (See RFC 1952)
}
$method = ord(substr($data,2,1)); // Compression method
$flags = ord(substr($data,3,1)); // Flags
if ($flags & 31 != $flags) {
// Reserved bits are set -- NOT ALLOWED by RFC 1952
return null;
}
// NOTE: $mtime may be negative (PHP integer limitations)
$mtime = unpack("V", substr($data,4,4));
$mtime = $mtime[1];
$xfl   = substr($data,8,1);
$os    = substr($data,8,1);
$headerlen = 10;
$extralen = 0;
$extra     = "";
if ($flags & 4) {
// 2-byte length prefixed EXTRA data in header
if ($len - $headerlen - 2 < 8) {
return false;    // Invalid format
}
$extralen = unpack("v",substr($data,8,2));
$extralen = $extralen[1];
if ($len - $headerlen - 2 - $extralen < 8) {
return false;    // Invalid format
}
$extra = substr($data,10,$extralen);
$headerlen += 2 + $extralen;
}
$filenamelen = 0;
$filename = "";
if ($flags & 8) {
// C-style string file NAME data in header
if ($len - $headerlen - 1 < 8) {
return false;    // Invalid format
}
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
return false;    // Invalid format
}
$filename = substr($data,$headerlen,$filenamelen);
$headerlen += $filenamelen + 1;
}
$commentlen = 0;
$comment = "";
if ($flags & 16) {
// C-style string COMMENT data in header
if ($len - $headerlen - 1 < 8) {
return false;    // Invalid format
}
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
return false;    // Invalid header format
}
$comment = substr($data,$headerlen,$commentlen);
$headerlen += $commentlen + 1;
}
$headercrc = "";
if ($flags & 1) {
// 2-bytes (lowest order) of CRC32 on header present
if ($len - $headerlen - 2 < 8) {
return false;    // Invalid format
}
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data,$headerlen,2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
return false;    // Bad header CRC
}
$headerlen += 2;
}
// GZIP FOOTER - These be negative due to PHP's limitations
$datacrc = unpack("V",substr($data,-8,4));
$datacrc = $datacrc[1];
$isize = unpack("V",substr($data,-4));
$isize = $isize[1];
// Perform the decompression:
$bodylen = $len-$headerlen-8;
if ($bodylen < 1) {
// This should never happen - IMPLEMENTATION BUG!
return null;
}
$body = substr($data,$headerlen,$bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
// Currently the only supported compression method:
$data = gzinflate($body);
break;
default:
// Unknown compression method
return false;
}
} else {
// I'm not sure if zero-byte body content is allowed.
// Allow it for now... Do nothing...
}
// Verifiy decompressed size and CRC32:
// NOTE: This may fail with large data sizes depending on how
//       PHP's integer limitations affect strlen() since $isize
//       may be negative for large sizes.
if ($isize != strlen($data) || crc32($data) != $datacrc) {
// Bad format! Length or CRC doesn't match!
return false;
}
return $data;
}

?>

apache/Nginx下的PHP/Ruby执行sudo权限的系统命令

apache/Nginx下的PHP/Ruby可以直接Windows和Linux下的系统命令,在Linux下,一般只能执行普通用户对应的权限,如果要执行一下需要Sudo的命令,则需要进行一些配置。

修改方式是将Webserver运行的用户名,加上sudo权限,这样php或者Ruby(以下就只写php了)就可以调用sudo及对应的命令了。

一般来说,为了安全,需要指定这些用户可以执行哪些命令,方法是修改sudoers这个文件的配置。
继续阅读apache/Nginx下的PHP/Ruby执行sudo权限的系统命令

答免费用户提问

为什么火车头里面的客服和会员 我们免费用户提问题都是想要支付辛苦费才愿意解答呢?
这样貌似对新手很大的歧视!!!严重鄙视这样的会员和管理员!什么都讲钱没钱就不解答??
记着你们也是新手走过来的!何必呢??解答个问题还要收费,那为什么还要出的免费版本??

继续阅读答免费用户提问

火车采集器通用OCR识别.NET插件,免费下载

火车头通用OCR识别/验证码识别演示程序 发布之后,我们将该技术做成通用插件,引用到火车采集器中来,供舰版及企业版用户直接免费使用

1、特殊注意:该插件需要 Microsoft Visual C++ 2008 SP1 Redistributable 支持。
Visual C++ 2008 SP1 Redistributable下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2

2、该压缩包只是火车采集器插件,如果需要配置插件需要的xml配置文件,请使用火车头通用OCR识别/验证码识别演示程序(http://board.locoy.com/?post=69 )进行测试识别和配置xml。

3、安装使用方法(火车采集器2010版以上适用):

安装方法:将压缩包里面的System目录及Plugins目录覆盖到火车采集器程序目录内
          该ocr也能识别部分非常简单的汉字,如果测试程序配置后可以识别,需要将测试程序里面的chi_sim.traineddata复制到采集器目录下System/tessdata目录下。

使用方法:1.使用火车头通用OCR识别/验证码识别演示程序(http://board.locoy.com/?post=69 )进行测试识别并保存xml配置文件到火车采集器Plugins目录,文件名必须包含识别二字, 如:口碑验证码识别.xml,58同城验证码识别.xml。
          2.假设您已经识别测试成功,开始添加图片地址标签,该标签名为您刚刚保存的xml文件的文件名 如:口碑验证码识别,58同城验证码识别。
          3.测试识别效果或正式采集。

旗舰版企业版用户可以直接免费使用,点击下载火车采集器通用OCR识别.NET插件

4_13_5b57cdacd222195.jpg

这几天都在紧张的学习中,头皮发麻~~

下个月有新的项目要上,为了做这个项目还临时学起了ThinkPHP的RBAC和DWZ框架。

不知道为什么,学的东西越多,发现自己人的东西越少,心里不免有一些发毛的感觉。于是不断强迫自己去学习。

这周在当当买的C#的书还看150页,这两天又没有时间看下去了。取代的是LampBrother的视频教程、ThinkPHP的手册、DWZ的使用文档。

ThinkPHP的教程看到最后,猛然发现TP传说中的RBAC并不能完全解决项目的需求,也就是说,还得进行扩展,也就是说,这几天学习的时间多少有一些浪费了。

每天都在忙。

新项目,做需求;旧项目,做维护;新技术,要学习;老代码,要重构。

一天的时间一下就不见了,灰常大的压力,担心项目周期周转不开,担心不可控因素太多,巴拉巴拉如是。

DX2要出了,PW8.5也出了,接口应该要升级了,额,打个哈欠,洗洗睡了。

明天又是淫荡的一天~

: mrgreen:

当当网的购物悲剧

在当当买了一本C#的书看,周末下的单,想周一收到,因为周二会离开公司。

收到货以后,发现当当确实挺悲剧的。

  1. 书的纸张比路边买的盗版故事会纸张还差,盗版呐!
  2. 用的加急,以为下午能当,结果等到第二天,京东网没有运费,最迟第二天也能送到,坑害。
  3. 书皮严重损坏,划伤,满是灰尘,包装袋破损,恶劣!
  4. 加运费共计121元,发票上只有111元,公司不给报,还得自己贴10元!
  5. 要求退款,运费不退,而且还要自己承担运费,恶劣!

相比之下,在京东购物的优势一下就凸显出来了。到货快,支持货到付款,能刷卡,退货方便,优惠多。

以后再也不去当当网买书了。

终于还是把博客迁到新的服务器上了。

去年在安徽八度租用的E5200服务器,终于还是服务器质量太差,技术服务太差放弃了。

还有几个月到期,也不准备问他们退款了,只是希望朋友们别去八度租用E5200的服务器了,质量太差。

我租的服务器硬盘估计太老化了,性能非常低,复制大文件最快不超过10M,这样的速度真是接近U盘的性能了,真的很让人腚疼。叫了客服几次查问题,死活说机器正常,网络正常。 再加上租用的服务器是电信机房单线,好多地方访问速度太慢,很早以前就想搬离八度。

一直在考虑是做单线+CDN呢,还是上多线,折腾了几回,终于还是在371拿下了这台4线的机器,小试速度飞快。

几个未Ping通的地区,是DNS未生效的旧IP,其它几个测试点表现非常良好,速度发了两篇日志,大呼过瘾。然后速度给WP装上了super cache,前台访问速度貌似有点提升,个人感觉有点YY的味道。

WP的后台速度确实比其它程序都慢,一直在寻思要不要自己开发一套博客程序,额,这纯属瞎蛋疼,哥哪有时间。

数据迁移完毕,明天早上做下安全,八度的悲剧就算结束,洗洗睡吧。

学习经:论坛运营策略

  额,这可是新年第一篇文章。过年回家上网不方便,没时间也不方便写大篇大篇的文章,天天没事就看这围脖那围脖,结果发现都是些尽扯蛋的,看了半天没有看到一点有用的东西。

  还是博客好呐,看的东西完全有用,喜欢你就看,内容详细,不聒噪。

  今年要从技术往运营上挪挪位置了,于是乎就多了一些关于运维方面的学习文章,纯技术的文章没几个人看得懂。还好我是比较好学的孩子,文章转摘过来至少表明我从头看到尾了,也算对得原作者了。

  论坛的重点是运营,不是推广。论坛不同于传统的1.0型网站,所谓的WEB1.0是以内容为主,只要推广得力就会有流量。而且推广简单,就一步:你把用户想办法拉到你的网站来浏览,就OK。

  但是社区不行,社区至少要比资讯站多五步:你仅把用户拉来了浏览,还不够,因为光有人浏览,这还是个死社区,没意义;这就需要再完善第二步,让用户注册,但用户注册就OK了吗?也不行,注册不发贴,那叫死用户;所以就需要第三步,让用户发贴,但是用户发了贴子就算成功了吗?也不是,偶尔发个贴子,那论坛还是火不起来,得需要用户经常发贴才行,也就是第四步,要让用户经常发贴;那经常发贴就OK了吗?肯定也不行,如果净发些没价值的灌水贴,也不能称为一个好社区,所以第五步就需要用户能够用户发些有价值的贴子,经常参与到社区的讨论和互动中来。

  而在这五步中,除了第一步能够通过推广完成外,其它四步根本无法通过推广完成,剩下的四步,就得完全靠运营了。所以对于社区来说,网络推广做的再牛,都没用,而反过来说,即使不会推广但是社区本身运营的好,也会发展的非常好。而且对于社区来说,最大的推广就是用户的口碑,只要运营的好,用户就自发用口碑帮你推广了。 继续阅读学习经:论坛运营策略