转:趣题:老鼠与毒药问题的推广

今天的趣题来源于 IBM Ponder This 三月份的谜题

    大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

    这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ⋯⋯每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了。

    现在,有意思的问题来了:如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

  
    答案:7 只老鼠就足够了。事实上,7 只老鼠足以从 37 = 2187 个瓶子中找出毒药来。首先,把所有瓶子从 0 到 2186 编号,然后全部转换为 7 位三进制数。现在,让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子,让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子,等等。一星期之后,如果第一只老鼠死了,就知道毒药瓶子的三进制编号中,右起第一位是 2 ;如果第二只老鼠没死,就知道毒药瓶子的三进制编号中,右起第二位不是 2,只可能是 0 或者 1 ⋯⋯也就是说,每只死掉的老鼠都用自己的生命确定出了,三进制编号中自己负责的那一位是 2 ;但每只活着的老鼠都只能确定,它所负责的那一位不是 2 。于是,问题就归约到了只剩一个星期时的情况。在第二轮实验里,让每只活着的老鼠继续自己未完成的任务,喝掉它负责的那一位是 1 的所有瓶子。再过一星期,毒药瓶子的三进制编号便能全部揭晓了。

    类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)n 个瓶子中检验出毒药来。

refer:http://www.matrix67.com/blog/archives/4361

转:简单的验证码识别技术,学习笔记

Screenshot-C12-Aurora.pngScreenshot-C12-Aurora.png

原理

对于简单的验证码,使用的原理也相当的简单。
现在有两个长度一致的二进制的数字,1110111011101和1010111011100,比较他们的相似度可以使用XOR运算!

1110111011101 XOR 1010111011100 = 0100000000001

结果中,1的数目越小,相似度越高。现在比较两张单色的图片,也可以使用这样的方法。这两张图必须是规格相同的,
compare.png
把两张单色的图片进行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()

阅读剩余部分...

转:MySQL 数据库中删除重复记录的方法总结

演示数据


表结构:


descdemo;

+-------+------------------+------+-----+---------+----------------+

| Field | Type             | Null| Key| Default| Extra          |

+-------+------------------+------+-----+---------+----------------+

| id    | int(11) unsigned | NO  | PRI | NULL   | auto_increment |

| site  | varchar(100)     | NO  | MUL |         |                |

+-------+------------------+------+-----+---------+----------------+

2 rowsinset(0.00 sec)

数据:


1

2

3

4

5

6

7

8

9

10

11
mysql> select* fromdemo orderbyid;

+----+------------------------+

| id | site                   |

+----+------------------------+

|  1 | http://www.CodeBit.cn  |

|  2 | http://YITU.org        |

|  3 | http://www.ShuoWen.org |

|  4 | http://www.CodeBit.cn  |

|  5 | http://www.ShuoWen.org |

+----+------------------------+

5 rowsinset(0.00 sec)

当没有创建表或创建索引权限的时候,可以用下面的方法:


如果你要删除较旧的重复记录,可以使用下面的语句:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
mysql> deletefroma

    -> using demo asa, demo asb

    -> where(a.id > b.id)

    -> and(a.site = b.site);

Query OK, 2 rowsaffected (0.12 sec)

 

mysql> select* fromdemo orderbyid;

+----+------------------------+

| id | site                   |

+----+------------------------+

|  1 | http://www.CodeBit.cn  |

|  2 | http://YITU.org        |

|  3 | http://www.ShuoWen.org |

+----+------------------------+

3 rowsinset(0.00 sec)

如果你要删除较新的重复记录,可以使用下面的语句:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
mysql> deletefroma

    -> using demo asa, demo asb

    -> where(a.id < b.id)

    -> and(a.site = b.site);

Query OK, 2 rowsaffected (0.12 sec)

 

mysql> select* fromdemo orderbyid;

+----+------------------------+

| id | site                   |

+----+------------------------+

|  2 | http://YITU.org        |

|  4 | http://www.CodeBit.cn  |

|  5 | http://www.ShuoWen.org |

+----+------------------------+

3 rowsinset(0.00 sec)

你可以用下面的语句先确认将被删除的重复记录:

阅读剩余部分...

转:Git安装使用手记

这篇主要是记录我在 Windows平台安装Git

先描述一下安装的需求:

· 用户端和服务器端的操作系统都是 

· 用户端要能透过 

· 无论是取出档案还是送交档案,都需要验证身分(输入账号密码)。

底下是安装步骤:

在 msysgit (Git for Windows)

由于我要让用户端可透过 HTTP协定来存取版本库,因此还要把Git安装目录下的bin\libiconv2.dll复制到安装目录下的libexec\git-core\底下。少了这个动作,将来透过HTTP存取版本库时,就会出现HTTP 500 Internal Server Error的讯息。如下图所示:

阅读剩余部分...

白马非马与面向对象

     类是对象的抽象组织,对象是类的具体存在。

  2200年前的战国时期,赵国平原君的食客公孙龙在骑着白马进城的时候,被守城官以马不能入城拦下,公孙龙即兴演讲,以一篇“白马非马”,驳倒了守城官,于是就骑着他的 (不是马的) 白马进城去了。此战,就是历史上最经典的一次对面向对象思维的阐述。

  公孙龙的“白马非马”一论如下:

“白马非马”,可乎?曰:“可。”曰“何哉?”曰:“马者,所以命形也;白者,所以命色也。命色者非命形也。故曰:‘白马非马’。”曰:“有白马不可谓无 马也。不可谓无马者,非马也?有白马为有马,白之,非马何也?”曰:“求马,黄、黑马皆可致;求白马,黄、黑马不可致。使白马乃马也,是所求一也。所求一 者,白者不异马也。所求不异,如黄、黑马有可有不可,何也?可与不可,其相非明。故黄、黑马一也,而可以应有马,而不可以应有白马,是白马之非马,审矣!”

  公孙龙乃战国时期的“名家”,名家的中心论题是所谓“名”(概念)和“实”(存在)的逻辑关系问题。名者,抽象也,类也。实者,具体也,对象也。从这个角度讲,公孙龙是我国早期的最著名的面向对象思维的学习者。

  “白马非马”这一论段的关键就在于“非”一字,公孙龙一再强调白马与马的特征,通过把白马和马视为两个不同的类,用“非”这一关系,成功地把“白马”与“马”的关系转移到“白马”这个类与“马”这个类的相等关系上,显然,二者不等,故“白马非马”。而我们常人的思维是,马是一个类,白马是马这个类的一个对象,二者属于从属关系。说“白马非马”,就是割裂马与白马之间的从属关系,偷换概念,故为诡辩也。

  白马非马,我们可以称之为诡辩;小熊猫非熊猫,这是不得不承认的事实。我们把这些问题抽象出来,实际上讨论的就是类与类之间的界定,类的定义等一系列问题,其中即涉及到了类与对象的本质问题,也涉及了类设计过程中的一些原则。

  要回答类与对象的本质这个问题,我想可以从“形”和“本”的角度来回答。
       这个问题就交给你来研究吧,试试写出java或者php版本的白马非马的代码

转:Closure

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; }

阅读剩余部分...

php开发指南第20章节选之mysql里的序列应用详解

提到mysql,我顺便讲讲序列。用过oracle的人都知道,orale没有类似mysql的AUTO_INCREMENT这样的自增长字段,实现插入一条记录,自动增加1.oracle是通过sequence(序列)来完成的。这样看起来,似乎mysql的自增长要比oracle序列的实现更好更方便。那我为什么还要提序列呢?有必要吗?

mysql的AUTO_INCREMENT可以设置起始值,但是不能设置步长,其步长默认就是1.(这里是错误的,可以通过修改系统变量设置步长,但其针对全局)

阅读剩余部分...

php开发指南之19章:缓存简介(四)

    这一次,我们讲讲前端页面缓存,包括浏览器缓存.
     通常,前端的页面缓存主要有基于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");
c1.pngc2.png

阅读剩余部分...

    Page :
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. ...
  9. 11