June 15, 2011
| 作者:白菜
|
分类:编程算法


原理
对于简单的验证码,使用的原理也相当的简单。
现在有两个长度一致的二进制的数字,1110111011101和1010111011100,比较他们的相似度可以使用XOR运算!
1110111011101 XOR 1010111011100 = 0100000000001
结果中,1的数目越小,相似度越高。现在比较两张单色的图片,也可以使用这样的方法。这两张图必须是规格相同的,

把两张单色的图片进行Xor,结果残留下来的白点越小,表示相似度越高!!!
for y in range(h):
for x in range(w):
im2.putpixel((x,y), im1.getpixel((x,y)) ^ im2.getpixel((x,y)))
im2.show()
阅读剩余部分...
May 25, 2011
| 作者:白菜
|
分类:编程算法
类是对象的抽象组织,对象是类的具体存在。
2200年前的战国时期,赵国平原君的食客公孙龙在骑着白马进城的时候,被守城官以马不能入城拦下,公孙龙即兴演讲,以一篇“白马非马”,驳倒了守城官,于是就骑着他的 (不是马的) 白马进城去了。此战,就是历史上最经典的一次对面向对象思维的阐述。
公孙龙的“白马非马”一论如下:
“白马非马”,可乎?曰:“可。”曰“何哉?”曰:“马者,所以命形也;白者,所以命色也。命色者非命形也。故曰:‘白马非马’。”曰:“有白马不可谓无 马也。不可谓无马者,非马也?有白马为有马,白之,非马何也?”曰:“求马,黄、黑马皆可致;求白马,黄、黑马不可致。使白马乃马也,是所求一也。所求一 者,白者不异马也。所求不异,如黄、黑马有可有不可,何也?可与不可,其相非明。故黄、黑马一也,而可以应有马,而不可以应有白马,是白马之非马,审矣!”
公孙龙乃战国时期的“名家”,名家的中心论题是所谓“名”(概念)和“实”(存在)的逻辑关系问题。名者,抽象也,类也。实者,具体也,对象也。从这个角度讲,公孙龙是我国早期的最著名的面向对象思维的学习者。
“白马非马”这一论段的关键就在于“非”一字,公孙龙一再强调白马与马的特征,通过把白马和马视为两个不同的类,用“非”这一关系,成功地把“白马”与“马”的关系转移到“白马”这个类与“马”这个类的相等关系上,显然,二者不等,故“白马非马”。而我们常人的思维是,马是一个类,白马是马这个类的一个对象,二者属于从属关系。说“白马非马”,就是割裂马与白马之间的从属关系,偷换概念,故为诡辩也。
白马非马,我们可以称之为诡辩;小熊猫非熊猫,这是不得不承认的事实。我们把这些问题抽象出来,实际上讨论的就是类与类之间的界定,类的定义等一系列问题,其中即涉及到了类与对象的本质问题,也涉及了类设计过程中的一些原则。
要回答类与对象的本质这个问题,我想可以从“形”和“本”的角度来回答。
这个问题就交给你来研究吧,试试写出java或者php版本的白马非马的代码
May 13, 2011
| 作者:白菜
|
分类:编程算法
As there is a growing interest in dynamic languages, more people are running into a programming concept called Closures or Blocks. People from a C/C++/Java/C# language background don't have closures and as a result aren't sure what they are. Here's a brief explanation, those who have done a decent amount of programming in languages that have them won't find this interesting.
Closures have been around for a long time. I ran into them properly for the first time in Smalltalk where they're called Blocks. Lisp uses them heavily. They're also present in the Ruby scripting language - and are a major reason why many rubyists like using Ruby for scripting.
Essentially a closure is a block of code that can be passed as an argument to a function call. I'll illustrate this with a simple example. Imagine I have a list of employee objects and I want a list of those employees who are managers, which I determine with an IsManager property. Using C#, I'd probably write it like this.
public static IList Managers(IList emps) {
IList result = new ArrayList();
foreach(Employee e in emps)
if (e.IsManager) result.Add(e);
return result; }阅读剩余部分...
April 29, 2011
| 作者:白菜
|
分类:编程算法
提到mysql,我顺便讲讲序列。用过oracle的人都知道,orale没有类似mysql的AUTO_INCREMENT这样的自增长字段,实现插入一条记录,自动增加1.oracle是通过sequence(序列)来完成的。这样看起来,似乎mysql的自增长要比oracle序列的实现更好更方便。那我为什么还要提序列呢?有必要吗?
mysql的AUTO_INCREMENT可以设置起始值,但是不能设置步长,其步长默认就是1.(这里是错误的,可以通过修改系统变量设置步长,但其针对全局)
阅读剩余部分...
April 21, 2011
| 作者:白菜
|
分类:php,编程算法
这一次,我们讲讲前端页面缓存,包括浏览器缓存.
通常,前端的页面缓存主要有基于HHTP协议和基于浏览器和脚本两种。HTTP协议中有很多报头来描述缓存的。我们可以在HTML页面利用meta tag和PHP程序中通过header来控制.例如:
<?php
header('Cache-Control:max-age=86400, must-revalidate');//24小时
header('Last-Modified:'.gmdate('D, d M Y H:i:s').'GMT');
header('Expires:'.gmdate('D, d M Y H:i:s', time() + '86400').'GMT');
echo '我不刷新';再写个HTML文件c.htm:<html>
<body>
haha,<a href=cache.php>go</a>
</body>
</html>
我们请求127.1/c.htm,点击链接,然后利用浏览器的回退按钮,返回c.htm,再点击链接,如下图左所示,我们发现,当添加了缓存指令后,我们无论如何来回后退和点击链接,下面的网络请求URL这一条始终为灰色,表示浏览器并没有发起实际的网络请求,而是直接调用了存储在用户电脑中的缓存页,除非缓存时间过期,在这期间,即使是实际内容改变了,浏览器也不会去重新读取我们在服务器上的资源。你可以把echo的那一句修改后,再点击,会发现网络请求仍然为灰色。在这种情况下,只有以下三种情况浏览器才会去更新缓存:
(1)缓存到期
(2)缓存被清除;
(3)F5或 ctrl+F5强制刷新。(这一点各种浏览器处理可能存在差异,我的测试环境是firefox 4)
当我们屏蔽上面的header指令或者改用如下代码时//告诉客户端浏览器不使用缓存,HTTP 1.1 协议
header("Cache-Control: no-cache, must-revalidate");
//告诉客户端浏览器不使用缓存,兼容HTTP 1.0 协议
header("Pragma: no-cache");


阅读剩余部分...