rails 每周乱弹:用ckeditor为表单添加所见即所得功能

我最近在搞codeany.com,用的rails开发,其中一些地方需要用到所见即所得编辑器,不想自己写了,上网搜了搜,找到了一个叫做ckeditor的rails插件,主页是:http://github.com/galetahub/rails-ckeditor;
安装方法:

./script/plugin install git://github.com/galetahub/rails-ckeditor.git

或者用是

./script/plugin install http://github.com/galetahub/rails-ckeditor.git

git协议能快一点点;这种安装需要你有git;另外你下载下来安装,下载地址是:http://github.com/galetahub/rails-ckeditor/tarball/master.
安装好以后设置数据库和配置文件;

rake ckeditor:install
rake ckeditor:config

现在就好了,使用很简单,比如以前的代码是:

<%form_for(....) do |f|%>
<%=f.text_area :content,:rows=>5,:cols=>60%>
…<%end%>


<%form_for(....) do |f|%>
<%= f.cktext_area :content, :swf_params=>{:assetable_type=>’User’, :assetable_id=>session[:uid]} %>
…<%end%>

并在页头加上:

<%= javascript_include_tag :ckeditor %>

即可;ckeditor和jquery等良好共存,并无问题.
下面说一下文件上传:
ckeditor上是带有上传图片并插入到所见即所得编辑器中去的功能,我是用的paperclip来实现,ckeditor对这个有支持,启用很简单,从ckeditor的示例目录中将几个model文件拷过来:

cp vendor/plugins/rails-ckeditor/examples/models/paperclip/* app/models/

这会拷贝这几个文件:

asset.rb
attachment_file.rb
picture.rb

并在数据库中创建assets表:

CREATE TABLE `assets` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data_file_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`data_content_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`data_file_size` int(11) DEFAULT NULL,
`assetable_id` int(11) DEFAULT NULL,
`assetable_type` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL,
`type` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `ndx_type_assetable` (`assetable_id`,`assetable_type`,`type`),
KEY `fk_assets` (`assetable_id`,`assetable_type`),
KEY `fk_user` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

即可了.
这个也可以上ckeditor的主页去看,ckeditor的主页写得很全面了,少部分地方不够细致,需要摸索一下.

rails 每周乱弹:解决RMagick版本问题

在rails中生成验证码时,报错了:This installation of RMagick was configured with ImageMagick 6.5.5 but ImageMagick 6.5.7-8 is in use.
我的解决办法是:
修改/usr/lib/ruby/1.8/RMagick.rb,在require “RMagick.so”之前加上:

RMAGICK_BYPASS_VERSION_TEST=true

检测文本正文是否包含有特定词的PHP扩展

项目主页为:http://github.com/xurenlu/acfilter

1:acfilter 用于实现查询某段文本中是否含有指定的词(当前禁词越来越多的情况下,
是有必要开发一个扩展来干这个了):在词库够大的情况下,能实现一定的分词的功能;
2:acfilter 基于发布于http://code.google.com/p/pysoft/ 上的acseg完成,原有代码发布的license为New BSD license;
acfilter 仍使用New BSD lincense;
3:
安装:

tar -xzf acfilter.tar.gz
cd acfilter
phpize
./configure
make
sudo make install

安装完之后请在php.ini里加上:

extension=acfilter.so

4:使用:
示例代码:

$ac=acfilter_new();
var_dump($ac);
acfilter_add_word($ac,”河边”);
acfilter_add_word($ac,”狗屎”);
acfilter_add_word($ac,”,”);
acfilter_add_word($ac,”工信部”);
acfilter_prepare($ac);
print_r(acfilter_check_text($ac,”曾经有一个很狗屎的部门,叫工信部,到河边自杀了”));
acfilter_close($ac);

运行后输出为包含的各个禁词用空格连起来的一个字符串,如下所示:

resource(4) of type (Acfilter Index)
狗屎 , 工信部 , 河边

具体可参见example.php;
5:有任何Bug,请发信给:xurenlu@gmail.com,谢谢!

CloudAPI 远程接口服务使用图文教程

Codeany的介绍:

要使用这个服务,第一步,必须先注册帐户:

接下来用刚注册的帐号登陆:

登陆后来到控制台,或是直接点击下图中的”立即开始’链接

点击后会来到所有API的列表页:

点击图中”创建使用这个API的库,填写如下表单:

注意,数据库名字应为字母打头,只能由字母和数字组成(我正在考虑放开这个限制),并且不得重名.创建后,来到控制台,查看您刚才创建的库的密钥:

这串字符串您需要保存好了,在实际应用中就是靠这个串来确认您的身份的.

现在开始编写程序,实地使用一下了:

注意这个API地址:

http://www.cloudapi.info/api/proxy.php?code=8Gk1N0QjoUUEgPI6Hzj8tNVdcJ8quDWf

后面的code就是您前面创建数据库里生成的密钥.另外,这个程序是在phprpc的基础上跑的,phprpc从这里下载:

http://www.phprpc.net/zh_CN/download/

有了PHPRPC,我就不用开发asp,jsp,perl,python等各种客户端了,全都已经有了.

运行一下,看看效果:

再试试正文抽取的接口:代码:

再看看执行效果:

好了,现在去Cloudapi 上搞个帐号试试吧,有问题欢迎反馈,gtalk:xurenlu@gmail.com

关于新闻网页正文抽取的一些思路

A:估计很多人只想要简单快速地实现正文抽取,我特地将PHP版本的调用示例给了出来,并打包提供下载:demo.tar;
B:希望自行实现的朋友可以顺这两个思路来实现:
i):链接密度算法:简单点说,就是统计每一个HTML子节点的链接密度,然后找出链接密度最小的那个点;对于中文新闻网页,这个密度值通常是0.03到0.05这个范围内,个别站点可能超出这个范围;当然你可以综合一下文本长度等等因素来考虑;网上有位达人写了一份python版的程序,可以考虑借鉴一下,源程序在这里:textextract.tar,调用第一个函数即可;使用时,如果返回的内容比实际的小,说明要将密度值调大一点,反之要调小一点;
附注:链接密度:处于链接中的文字中的长度除以整段文字的长度;
ii):HTML Tag打分算法:只能提供一些零散的要素点:
(不介绍正则模板类方法了,这个就太没意思了)
首先很多节点可以直接去掉,比如script,style,from,iframe,object或embed,这些多半不是正文,直接干掉;注释也去掉,它们带入处理,只会浪费内存;
再干掉很多HTML属性,像width,height,cellspacing,cellpadding,style,class这些都直接干掉;
一些节点可以保留文本内容,把HTML节点去掉;比如Span,Font,b 标记节点;
在主流的新闻网页(我们暂且把这个集合定义为:news.sina.com.cn,news.sohu.com,news.cn.yahoo.com,news.qq.com,news.163.com)中,一般来说可能是正文内容的就是DIV这两个标签了,DIV的可能性更大一些;正文内容往往放在一个DIV标记中;而且这些网站有着严格的编辑管理规范,一般都会规定,用

来表现段落,也存在可能某些编辑队伍要求用两个
来表现新段落的,这样,我们先将两个BR换成P,然后查找拥有多个段落的DIV节点;
“枝”节点和”页”节点的分类:通常来说,div,p,table,h1,h2…h6,ul,li,ol,form这些都可以为是枝干;而 A,img,input,button这些标签我们都视做为”叶子”节点;这里有很多小规则可以应用,比如网页的正文不会包括在一个A当中:哪个CMS的模板会把大段正文放在一个A标记中呢?同样地,像input,button这些一般也不会出现在正文中.
目标链接超长的的,一般是广告链接:像http://sina.allyes.com/main/adfclick?db=sina&bid=147826,186360,191333&cid=0,0,0&sid=179037&advid=3406&camid=25434&show=ignore&url=http://tech.sina.com.cn/iPhone/和 http://sohu.ad-plus.cn/event.ng/Type=click&FlightID=201006&TargetID=sohu&Values=fe5172f2,7a850001,a3827680,0fba7427&AdID=66817 这些,都是广告链接;带googleadsence,doubleclick,allyes等链接,也是广告,也排除掉;
去除HTML后,整段文字无标点的,一般是导航或是相关链接什么的;比如sohu的页面上某一段抽出正文后是:
“搜狐首页-新闻-体育-S-娱乐-V-财经-IT-汽车-房产-家居-女人-视频-播客-微博-邮件-博客-BBS-我说两句-搜狗” 这个,没有逗号也没有句号,多半是导航;这个导航还可以按照每个链接的平均文字长度来算,平均每个链接的长度在2~4之间的,不用想了,是导航链接,挨着一排链接平均长度在10-20左右的,多半是相关文章了;
另外还有一些其他的小伎俩:比如说,门户网站的广告发布,流程很复杂的,所以一般情况下,广告链接所用的域名都是固定的,比如可能就是sina.allyes.com,或是sohu.doubleclick.com(这两个域名我瞎写的,真实情况下可能和这差不太多);广告位置一般不太换(收了钱的,也不能随便换的);另外到正文的链接一般是本域名的完整URL,不会是相对URL,也一般不会出现其他站的链接,如果有,多半是收费文字链(页脚可能会有政府机关的链接,不过相信一上来你就有办法判断出哪个是尾巴了);

综合一下两种方法,要写出一个针对主流的,常见的新闻网页的抽取程序,那就很好办了.

至于标题提取,这个就太简单了,随便拿篇新闻做例子:比如这篇:http://news.sohu.com/20100706/n273301825.shtml,查看一下源代码,其中有:

真是太好做了,一般新闻网站的title属性就是{标题}-{网站名}{频道}的形式,要处理非常简单.

Ok,放出你的爬虫前,请先确认有相关新闻资质;注意,本文绝不鼓励侵权转载,嗯;本文只是介绍一下大致实现信息结构化的一个思路而已.做垃圾站真的是一个很没前途的职业的:(

新闻站抓取神器:正文抽取接口

目前市面上的采集器,主要是通过用户通过写模块实现;一般是用正则,有的采集器也能稍微把正则弄得傻瓜一点点.
另外一些高级一点的采集工具,则通过IE扩展或是firefox的扩展,通过手工选取要抽取的DOM节点的Xpath,实现正文抓取;
这些,都需要一个共同的过程:每新处理一个要抓取的站点,都需要手工设置一翻,写正则或是写DOM节点的路径;要抓取的网站一改版,这个所有的过程就必须重新来一遍.
经过很久很久的琢磨,一米六二开发了正文抽取的神器(虽然这么说有点夸张),针对主流新闻类网站的正文抓取,不再需要做模板或是特别针对某个站点的设置,统统都能正确返回正文!绝对是神器~
废话不多说,直接上代码:


* @version $Id$
* @copyright renlu , 02 三月, 2010
* @package default
**/
include dirname(__FILE__).’/phprpc/phprpc_client.php’;

/*** {{{ test_remote */
function test_remote()
{
$url=”http://www.cloudapi.info/b8_api.py?code=HW4MlGesu5RJUcMZmfWSXd8vdrz3uXWs”;
$rpc= new PHPRPC_Client();
$rpc->setProxy(NULL);
$rpc->useService($url);
print_r($rpc->api_grab_text(file_get_contents(“http://news.cn.yahoo.com/10-07-/1037/2kl6e.html”),”GBK”));
}
/** }}} */
test_remote();
?>

您可以先点击查看一下原文:http://news.cn.yahoo.com/10-07-/1037/2kl6e.html;
代码运行的结果是:

Array
(
[content] =>

>>>点击进入雅虎新版资讯首页 体验更多精彩

新华网北京7月1日电(记者熊争艳)中国人民解放军副总参谋长马晓天1日表示,只要中美一致认为时机合适,中方欢迎美国国防部长盖茨访华。

马晓天当日出席“粮食安全:中国与世界”国际学术研讨会间隙,回答记者提问时说:“我们的立场还是,在(中美)双方都认为合适的时候,欢迎他的来访。”

据去年美国总统奥巴马访华期间双方发表的《中美联合声明》,盖茨定于今年访问中国。今年初美对台出售总额达63.92亿美元的武器后,考虑到美售台武器的严重危害性及对中美两军关系带来的恶劣影响,中方决定,暂停两军计划内的有关互访安排。

马晓天多次表示,中美两军关系能否克服当前困难,回到健康稳定发展的轨道,关键取决于美方能否切实尊重中方的核心利益和重大关切,在解决美售台武器、舰机侦察等两军关系重大敏感问题上体现诚意,为两军关系的恢复与健康发展创造条件。

[msg] => –
[code] => 200
[uuid] => 569ad633-75d2-4251-b9ce-6aea88bdb0f9
[title] => 解放军高官:欢迎美国防长在合适时机访华
– 雅虎资讯
)

嗯,我没有提供源代码,也没有要提代源代码的打算;这个抓取服务通过cloudapi.info这个云接口平台提供.至此,我想做的一些服务都已经完成鸟,下一步就开始完善cloudapi.info的功能,让它更好地为大众服务!