易栈网-膘叔

浏览模式: 标准 | 列表 | 图文

集体智慧编程笔记(一):相似度算法

本文内容全部来自《集体智慧编程》一书,原书采用的是python,因为没有python编程环境,所以用PHP实现

<?php
//filename:test_collecting_preferences
//数据和代码来自《集体智慧编程》
//原文采用python实现,尝试用PHP进行转换
//@description 搜集用户偏好寻找相近用户
$datalist = array(
'Lisa Rose' => array(
'Lady in the Water' => 2.5,
'Snake on a Plane' => 3.5,
'Just My Luck' => 3.0,
'Superman Returns' => 3.5,
'You, Me and Dupree' => 2.5,
'The Night Listener'=> 3.0
),
'Gene Seymour' => array(
'Lady in the Water' => 3.0,
'Snake on a Plane' => 3.5,
'Just My Luck' => 1.5,
'Superman Returns' => 5.0,
'You, Me and Dupree' => 3.5,
'The Night Listener'=> 3.0
),
'Michael Phillips' => array(
'Lady in the Water' => 2.5,
'Snake on a Plane' => 3.0,
'Superman Returns' => 3.5,
'The Night Listener'=> 4.0
),
'Claudia Puig' => array(
'Snake on a Plane' => 3.5,
'Just My Luck' =>3.0,
'Superman Returns' => 4.0,
'You, Me and Dupree' => 2.5,
'The Night Listener'=>4.5
),
'Mick LaSalle' => array(
'Lady in the Water' => 3.0,
'Snake on a Plane' => 4.0,
'Just My Luck' => 2.0,
'Superman Returns' => 3.0,
'You, Me and Dupree' => 2.0,
'The Night Listener'=> 3.0
),
'Jack Matthews' => array(
'Lady in the Water' => 3.0,
'Snake on a Plane' => 4.0,
'Superman Returns' => 5.0,
'You, Me and Dupree' => 3.5,
'The Night Listener'=> 3.0
),
'Toby' => array(
'Snake on a Plane' => 4.5,
'Superman Returns' => 4.0,
'You, Me and Dupree' => 1.0,
),
);
//欧几里德距离
//它以经过人们的一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考查他们彼此间的距离远近。
//偏好越相似的人,距离越近。不过我们还需要一个函数来对偏好越相近的情况给出越大的值,
//为此我们可以将函数值加1(这样可以避免遇到被零整除的错误),并取其倒数
//公式是 1 / (1 + sqrt ( pow( data[a][1] - data[b][1] .... ) ))
function sim_distance ( $datalist , $person1 , $person2)
{
$si = array();
foreach ( $datalist[$person1] as $moviename => $grade ){
if( array_key_exists( $moviename, $datalist[$person2] )){
$si[$moviename] = 1;
}
}
if( emptyempty( $si )){
return 0;
}
$powers = 0;
foreach ( $si as $moviename=>$val ){
$powers += pow( ($datalist[$person1][$moviename] - $datalist[$person2][$moviename] ), 2 );//两者影评分数相减的平方值
}
return 1 / (1+ sqrt($powers));
}
//测试 'Lisa Rose' 和 'Gene Seymour' 的相似度评价
//原书上求出来是 0.29429805508554946 , PHP 的结果是 0.29429805508555,默认精度没有python高
echo( sim_distance( $datalist , 'Lisa Rose' , 'Gene Seymour') );
echo( '<br/>' );

//皮尔逊相关系数
//该相关系统是判断两组数据与某一直线拟合程序的一种度量。对应的公司比欧几里德距离评价的计算公式要复杂
//但是它在数据不是很规范时(如影评者对影片的评价总是相对于平均水平偏离很大),会倾向于给出更好的结果
//皮尔逊相关度评价法首先会找出两位评论者都曾评过的物品
//计算两者的评分总和与平方和,并求得评分的乘积之和,最后,利用这个结果计算出相关系数
function sim_person ( $datalist ,$person1 , $person2)
{
$si = array();
foreach ( $datalist[$person1] as $moviename => $grade ){
if( array_key_exists( $moviename, $datalist[$person2] )){
$si[$moviename] = 1;
}
}
if( emptyempty( $si )){
return 1;
}
$n = count( $si );
$sum1 = $sum1Sq = $sum2 = $sum2Sq = $pSum = 0;
foreach ( $si as $moviename => $val ){
$sum1 += $datalist[$person1][$moviename]; //个人影评分数累加
$sum1Sq += pow( $datalist[$person1][$moviename], 2 );//个人影评分数平方的累加
$sum2 += $datalist[$person2][$moviename];
$sum2Sq += pow( $datalist[$person2][$moviename], 2 );
$pSum += ( $datalist[$person1][$moviename] * $datalist[$person2][$moviename]);//两人影评之乘积
}

$num = $pSum - ( $sum1 * $sum2 / $n); // 正常情况下,我怎么都觉得这是1吧?
$den = sqrt( ( $sum1Sq - pow( $sum1, 2 ) / $n) * ( $sum2Sq - pow( $sum2, 2 ) / $n) );
if ( $den == 0 ){
return 0;
}
return ($num / $den );
}
//继续测试 'Lisa Rose' 和 'Gene Seymour' 的相似度评价
//原书上求出来是 0.396059017191 , PHP 的结果是 0.39605901719067,这回。。。位数超过了python
echo( sim_person( $datalist , 'Lisa Rose' , 'Gene Seymour') );

?>

有点长,随便看看吧

杂谈:邮箱

杂谈:邮箱

谈这个话题确实有点无聊,但总觉得不吐不快吧。
从08年开始仿佛是有了一个自己的邮箱,但现在看来总感觉不真实,那时候有了邮箱,还得学会outlook,看着一封封进来,感觉当然不一样。虽然,邮件进来的很少。

当时申请了好多好多邮箱,只是用到现在的也就是搜狐、新浪、网易的(这三个都是00年左右申请的了),东方网上线后还申请了一个Easyday.com的邮箱。

再后来有了yahoo的邮箱和gmail的邮箱。hotmail也是。这三个都是差不多在04、05年左右的了。gmail邮箱的出现,引出了邀请这个概念,当初为了得到邀请还在这边求那边要的。

用了这么久,谈谈感觉吧。。。

yahoo是最早推出虚拟邮箱(这个名字是我乱写的,11爷建议叫邮箱别名)。比如我注册 aaa@yahoo.com.cn,我可以自己分配几个虚拟名:bbb@yahoo.com.cn,和ccc@yahoo.com.cn,这样,我就可以给不同的人不同的邮箱。邮件也不会搞乱了,但事实上采用这个功能的人很少吧。 yahoo还是较早有邮件过滤功能的,这个一般是在客户端软件中才有的功能,他的WEB版也是早就有了。

gmail在08、09年(?)推出了邮件的标签功能,方便你分门别类的整理。

网易的邮箱我也是一直喜欢用,清新、速度快、垃圾邮件少。只是近来好象不咋地了。不如QQ邮箱了。QQ邮箱,几乎没有广告。难道是和他们庞大的用户有关?(方便收集整理学习垃圾邮件的状态?)

gmail也是几乎没有垃圾邮件的。或者说我看不到。。。

而yahoo是我收到邮件中垃圾邮件最多的,一些正常的邮件会被送进垃圾邮件箱,而没有任何提示,相反一些中奖信息却成天霸占着我的收件箱,即使点了举报也没用。反正三天两头的,不是雅虎欢乐送,就是欧洲大奖上亿美元或欧元,偶尔也会收到香港发来邮件说我透支消费,让我把信用卡密码发到XXX银行指定邮箱进行检查之类的。我就想不通了。为什么这些不能被认为是垃圾邮件?得,欧洲大奖不行,香港信用卡不行,雅虎欢乐送的内容几乎每次都一样,用户名称也都是雅虎管理员之类的,为什么这样还不能定性?

发泄一下,没有其他想法,不说搜狐和新浪,是因为这两个邮箱我是几乎不用的。除了用来登录一下校友录、微博外,其他还真没用过,也没有对外面公开过。

杂谈:Zend Studio 惊爆严重安全漏洞,系国内黑客首先发现

杂谈:Zend Studio 惊爆严重安全漏洞,系国内黑客首先发现

我是在cnbeta上看到这个新闻的,不过看到这个新闻后我也有疑问,这真的算是BUG吗?还是。。。要知道注释这个东西,本来就是允许你写上html代码让你在生成DOC的时候可以以特定的格式进行输出
不过,文中所说的内容,想来应该确实算是漏洞,但我本身都是在使用zend了,还有什么不可以使用系统变量或者权限呢?随便说说。。
只是看到这个的时候,我不知道phpdoc会怎么样,他会有同样的漏洞吗?他根据图片中的注释,会生成弹出计算器的doc文档吗??

新闻如下:
著名安全从业人员Saiy于2010年7月10日在安全网站80vul.com发布了Zend Studio的安全漏洞。 通过这个漏洞,可以在操作系统中执行任意命令。 在Zend Studio 6.0以上版本中,如果开发者开启了自动提示的功能,那么在一份存在问题的工程文件里(可能是别有用心者提供的),开发者就很可能触发这个漏洞,以执行他 人指定的代码。 文章中进行了案例演示。代码中定义了一个名为A的函数,那么只要在编辑区域输入A即触发此函数,此函数启动了 Windows系统中自带的计算器软件,那么同理,它可以启动任何一个软件,也可以执行任意其他的命令…… 目前Zend公司还没有对此安全漏洞作出任何反应。 建议相关开发者关闭自动提示的功能。
09a750b74bb71c87eee6b949dbd2e3fa
原文地址(英文): http://80vul.com/Zend%20studio/Zend%20studio%20location%20Cross.htm

高级PHP应用程序漏洞审核技术

高级PHP应用程序漏洞审核技术

不管是初学者还是老鸟,了解一下会有很多好处,比如里面介绍的,从URL传递global变量,比如5.26前的mt_rand的BUG等等。比如urldecode处理%2527会变成单引号,比如。。。实在太多了,或许程序真的没问题,但有问题的可能是PHP自己。
了解一下,可以让代码中更少漏洞吧?

原文很长,我这里也只是把目录贴一下,如果你真的有兴趣,不妨去看看全文

如果你有自己的想法,也可以尝试提交你的建议到该项目中去

neatpic 重写完成

neatpic 重写完成

其实 很多朋友已经在说我的neatpic了。我只是没时间重写。
原来的程序是walkerlee写的,我只是旁边加了一下工。
所以这次我重写的时候压力好大。。。
基本上,大部分功能完成,暂时还没有实现把图片详细地址隐藏起来

已完成功能:

1、单文件(保持不变)

2、生成数据的cache,在目录下图片很多的时候,方便读取(图片信息我没有在初始化的时候生成到Cache里,留着给未来进行处理吧)

3、模版(也是一个模型而已,因为最初的那版是写死的,很多朋友说不方便改进,不过那时候是04年,将就点吧)

4、语言包(语言包只是一个虚幻的概念,测试模型而已)

5、文件名自然排序(原来的程序没有这个功能)

未完成功能:(短时间内不作更新了)

1、中文文件名。。。和操作系统有关啊。如果再改进就用base64处理一下了,这样显示就不太会有问题

2、管理(目前没有管理功能,也就是说不能上传,和人工重建缓存)

3、缩图和原图模式(好象没有什么必要吧?现在模版可以自己做的情况下,用jquery的thickbox或者lightbox,都可以避免这种问题了)

4、其他未知问题(图片详细地址没有隐藏,没有考虑外链,没有打包下载等等)

5、未计算子目录(不过我都在下拉列表里显示全路径了,顺便说一下,目录也没有排序)

目前测试地址为:http://neatstudio.com/neatpic/。

下载地址为:47b08cc733b4e976db43538001e28089

注意:1、目前的程序几乎没有任何注释

2、对于目录判断等并没有完善,因此我打包的时候将目录结构都一并打包上来
3、语言包功能几乎无效。

4、更多小问题,目前暂时不作解释和更新(这才是最重要的提醒。。。)

欢迎留下意见,我会在收集完信息后,一并修改

未来哥还是不敌章鱼哥啊

未来哥还是不敌章鱼哥啊

凌晨的世界杯决赛,最终西班牙还是1:0战胜了荷兰。未来哥在这次竞猜中输给了章鱼哥。
章鱼哥果然很威猛。即使号称来自未来的未来哥在他面前也是不堪一击啊。
我没看足球,挺到12点半时,已经不行了。虽然半夜里因为心里想着足球,还是醒过来了,但终究还是没看,怕影响老婆第二天上班,至于我嘛。。。暂时失业,所以也无所谓了。
一大早起床,就打开“我爱世界杯”的手机软件,看到了西班牙的战绩,佩服一下章鱼哥。

Linux短信平台的搭建

关于linux下发短信,我是找到这篇 文章,但是我想要的只是一点点啦。因为我是用SP接口。

先上他的内容,然后我把我当初做的列出来,原文是在:http://www.cnblogs.com/pipc/archive/2010/07/11/1775007.html:

前段时间为用户提供VPN 和SSH 服务,消息的都是通过电子邮件发送的。没有短信的快捷和实时性,决定搭建自己的短信平台。

在此之前我也用过其他服务商提供的短信平台,都有各种各样的问题。

其中短信平台存在的问题:

1、发送短信有时段限制,有些短信通道只能在 上午8点 到晚上8点发送,如果遇到夜间的紧急时间需要发送短信就无能为力了,比如服务器当机、MSSQL数据库日志满了、系统盘空间不足。 在Linux 下磁盘空间不足会照成MySQL启动失败。

2、通过通道发送短信限制十分严格,相对于个人手机,进行关键词屏蔽非常厉害, 比如 “发票”、“还钱”、“你妈”有些常用词都不能发。 句子里包含关键词都发送失败, “我中午去打印手机话费发票”、“听说你妈住院了,现在身体好吗?”, 通过个人手机限制的就不严格。

3、通道拥挤的情况,因为这些通道一般都是提供批量发送广告的, 一次发送1万条,10万条都很正常。 如果这个时候你发送短信,只能排在消息队列的最后。 通常延时20分钟到4小时。

4、通道设备故障,因为各种情况照成的消息队列内的短信丢失。 你调用API接口发送短信,短信状态时成功的,由于平台的故障照成短信没有发送成功,而且你得不到错误的状态,费用照扣。

5、扣量,各个短信平台情况不一样, 价格比较低的扣量比较严重, 比如你群发 10万条, 前 5000条100%发送, 5000 -1万条 发送 95%, 1万-2万条 发送 90%, 到10万条的时候55% 甚至更低。

发送短信一般有2种方法, 一种是通过短信通道发送, 还有就是自己购买设备发送短信。

申请单独的短信通道要求比较高,一般在10-30万费用,比较大型的公司才会申请,比如银行、证劵等, 发送的号码都是95555 ,96000等, 还有就是106557**** 这样的通道。 申请的费用较少,一般几千元就可以申请到。 通道提供商业一般提供2种接口, 一种是API接口,通过API发送短信,比如http://www.pipc.net/sms/send.aspx?id=130130****& amp;msg=测试短信 ,还有一种数据库接口,你可以连接到数据库直接把消息插入相关的表中。

--EOF--

因为我是采用的购买的SP的服务。因此,发送短信就相当于类似上面的方法了。不过我也想过接收短信,是采用原文中下面的方式(http://www.cnblogs.com/pipc/archive/2010/07/11/1775007.html)【我这里不一一介绍】

我具体是在linux下面跑一个cron任务,这样可以一直从队列里进行发送短信。大多数情况下我们是即时发送的,只是有时候会有堵塞,这时候我们就扔到队列里(当然,是需要返回结果不是手机号码不正确的原因才会扔到队列里,如果手机号码都不对了,扔到队列里也发送不了。)

接收短信,只要在任何一台机器上搞一个移动猫,用任何程序都可以定时读取信息。如果是接收到相应的代码就触发一些操作。有这种功能就免得你买一些需要接收固定号码的SP了,那样的价格高很多呢。

开心一刻:程序员特有的9个坏习惯

开心一刻:程序员特有的9个坏习惯

本文来自:http://www.phpv.net/html/1712.html,有点意思。纯属一笑吧,不过有时候看着也是一种悲哀。
如果你是一个程序员, 或者你就读计算机相关专业, 那么你应该能理解下面这些诡异的小习惯是怎么养成的, 或者你本身就有着其中的某些习惯:

0. 程序员数数会从0开始数起.

例: 程序员吵 架的时候会说: “我数三下, 你再不闭嘴我就不客气了! 零! 一! 二!” 或者列清单的时候编号会从0.开始写.

因: array[0]是数组的第一个元素.

评: 这个习惯的养成是一个艰难的过程. 多少次的越界, 多少次的循环次数错误让我们深深的记住了从0开始.

1. 程序员用肯定和否定 回答选择性的问题.

例: 问 “您想喝咖啡还是喝茶?” 程序员答: “嗯.”

因: 当条件或||有一个子句值为真, 则整个语句值为真.

评: 这个习惯夸张了一点, 但这的确是程序员思 维方式的通病, 用计算机的处理逻辑处理人类问题. 当然这样的回答显然是存在编程错误的, 因为对于这个问题他错误的返回了布尔型的值. 虽然高度怀疑有没有人关心这种回答的结果是怎样, 还是给出一个答案. 如果真的在程序的世界里, 服务员会优先考虑给你咖啡, 如果没有咖啡了, 才会端茶给你.

2. 程序员普遍患有或曾经患有分号结尾综合症;

例: 比如这几行;

因: 大部分程序, 特别是多数程序员的启蒙编程语言C语言是用分号结尾语句的;

评: 换行之前习惯用分号结尾, 这是程序员专 属的坏习惯. 还记得编译报的各种诡异的错最后原因总是少了那一个小小的”;”吗? 这就是这个坏习惯的成因. 据说分号结尾是有典故的, 因为键盘上的分号正好在右手小拇指的位置, 比起句号之类有着得天独厚的地理优势. 当然也有不需要分号结尾的编程语言(比如Ruby还有Python), 刚用起来会因为没有分号结尾而格外纠结.

3. 程序员对”语言”的概念和普通人有差.

例: 问: “你都会哪些语言?” 普通人: “我会汉语和英语, 还会一点点法语.” 程序员: “我会C语言, C++ 和 Java, 还会一点点Ruby.”

因: 程序员的世界里没有母语和外语, 只有编程语言.

评: 说真的, 程序语言的语法学起来比外语更容易, 拿到一个用没学过的语言写的程序, 你多少可以看懂部分程序. 程序语言没有国界, 是各国程序员交流最好的桥梁.

4. 程序员格外格外的厌恶括号/引号不配对的情形.

例: 看到这样的内容 (举个简单的例子(我知道你懂的), 你能表示”我很淡定我不抓狂吗?

因: 各种不配对问题会导致编译错误.

评: 扫视代码, 对不配对的情况异常敏感, 瞥一眼就能发现哪里少了个右括号. 这种症状在使用那些带自动补全功能的开发环境时变得更为纠结.

5. 程序员认为 千(k) == 1024.

例: 程序员换算表: 1km == 1024m, 1kg == 1024g.

因: 成因很曲折 计算机是二进制的世界 -> 1024是2的10次方 -> 英语里用kilo一词来表示 -> kilo翻译成中文是”千”, 比如千米, 千克.

评: 也许一般人会认为500, 1000是很整的数, 但程序员会觉得512, 1024是很整的数. 不要奇怪, 如果128, 256, 512这种形式看着不够整, 帮你转换成二进制: 10000000, 100000000, 1000000000…

6. 程序员惯用 == 来表示相等的意思.

例: 见5.

因: 在程序语言中, “=” 是赋值, “==” 才用来判断二者是否相等.

评: 单等和双等的区别是程序入门必修课, 也是老师爱考的考点. 如果在C语言if语句的判定条件里写了个单等, 编译能通过, 结果却往往不对, 够一个新手查上一阵子的. 当然目前的语言大都考虑到这一点, 防止了这类的误写, 但是单等和双等的差异已经深入每个程序员的 内心.

7. 程序员使用”//”表示”请无视这一行文字”.

例: 餐厅中. 程序员A: “我吃鱼香肉丝盖饭, 你吃什么?”

程序员B: “宫保鸡丁盖饭.”

程序员A 在点菜单写上:

鱼香肉丝盖饭 1

宫保鸡丁盖饭 1

程序员B: “我还是要牛肉面吧!”

程序员A 更正点菜单:

鱼香肉丝盖饭 1

// 宫保鸡丁盖饭 1

牛肉面 1

因: 程序中用”//”为代码加上注释, 程序运行时会无视掉”//”开头的代码行.

评: 如果和一伙程序员在一起时被冷落了, 可以抱怨一句”喂喂喂我是被注释掉了吗?” 相信一向以幽默感丰富又有爱心著称的程序员们会关注你的.

8. 程序员有 中文标点恐惧症.

例: 如果你注意到了, 这篇文章自始至终都在使用英文标点, 这就是最好的例子.

因: 程序中的全部符号都严格需要是英文半角标点.

评: 这个坏习惯是有中国特色的, 中国程序员特 有的. 任何一名优秀的我国程序员都应该可以作到区别中文标点和英文标点. 比如, 和,还有 ’和 ‘. 真的, 当年初学编程的时候, 诸如 “error C2018: unknown character ’0xa3′” 的错误看得还不够多吗!

就是这样一群人, 如果你慢吞吞的用电脑他们会急躁的抢过键盘熟练的使用各种快捷键, 他们会对着小孩子讲计算机的三原色是红绿蓝而不是红黄蓝, 他们描述大小距离更偏向于以像素作单位, 陪女朋友看电影看到电影院座位上稀稀落落的人就想做磁盘碎片整理…抱怨归抱怨, 这不也正是他们的可爱之处吗!

将Yiiframework与JQuery easyUI整合使用

jquery easyUI框架是国内某JS牛人写的仿extJS的框架。比较简单的实现一些功能,虽然目前还是有一些BUG,但将就着用用,也还能够接受。
YiiFramework是国内某PHP牛人写的php框架,哦,好象人不在国内。最近用的人较多。本人比较喜欢他们提供的虚拟机(只有16M,当然,安装后达到100多M)

随便的整合了一下,目前是这个情况。

b4f42cb619240ea1b4deaa6398e3e2f1

几个问题需要注意一下的

1、layout的时候要注意。因为easyUI框架里面的页面也需要用到jquery,因此在布局的时候得考虑header部分

2、登录框,与1的条件相关

3、$this->render与$this->renderPartial ,renderPartial是不渲染任何模版的。如果你不想用layout的时候,可以用这个renderPartial方法

其它的就属于一些小事了,比如菜单可以用json_encode输出之类的。前两天还写了一个jquery easyUI这个outlook式的menu改进。

整体用下来还算比较方便

首次尝试用ipad发文

首次尝试用ipad发文

首次发文还是遇到了不少问题,比如编辑器中的iframe无法正确认出,只能在源码模式下编辑。

等用电脑后补全这些问题吧

主要是焦点无法显示

【后记】
用ipad一般情况下还是可以的。但是对于这种所见所得编辑器,焦点无法聚集在里面。也就无法输入中文了。(编辑器上的按钮都可以点)
平时正常的登录退出一切都没有问题(而且对于input框还会提示下一个上一个,非常方便)
登录速度也挺快

最后:麦当劳免费半小时上网还是挺爽的。每人每天半小时。