php5.3.8中编译pdo_mysql的艰难历程

我们的一个项目,用了PDO_MYSQL拓展,准备迁移服务器,新环境需要编译安装环境。昨天,运维同事抽空编译了一下,一直编译不上pdo_mysql,同时,公司的一款新webgame临近上线,他们实在太忙,我这个三流运维技术的程序员来试试吧。

运维同事描述:
服务器系统版本:Linux version 2.6.32-71.el6.x86_64 (mockbuild@c6b6.centos.org) (gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC) ) #1 SMP Fri May 20 03:51:51 BST 2011

编译PHP的参数

...
tar zxvf $soft_dir/php-5.3.8.tar.gz -C $soft_tmp
cd  $soft_tmp/php-5.3.8
 ./configure  --prefix=$soft_install/php --with-config-file-path=$soft_install/php/etc --with-mysql=$soft_install/mysql --with-mysqli=mysqlnd  --with-gd=$soft_install/gd --with-jpeg-dir=$soft_install/jpeg --with-png-dir=$soft_install/png --with-freetype-dir=$soft_install/freetype --enable-bcmath --with-mcrypt  && make && make install
...

之后再次编译 pdo_mysql 拓展

...
cd $soft_tmp/PDO_MYSQL-1.0.2/
$soft_install/php/bin/phpize
./configure --with-php-config=$soft_install/php/bin/php-config  --with-pdo-mysql=$soft_install/mysql/  && make && make install
...

之后, shell里执行 php -i 和 php -m都没有看到 pdo_mysql拓展。搜pdo_mysql,在将路径添加到php.ini中,仍找不到这个扩展,判断为编译失败。

这里是将pdo_mysql作为一个拓展引入使用的。在php5.3中,PHP开发组把mysqlnd作为默认的连接MYSQL的数据库驱动来使用,据官方描述,节省内存40%,速度更快,当然或许是为了解决许可协议的问题。之前PHP连接MYSQL,是调用MYSQL官方提供的C/C++编写的lib_mysql的dll/so,来实现。这个类库同样可以给PYTHON等脚本语言调用,只要按照API规范来。我们改用mysqlnd之后,就不用再为了lib_mysql去安装mysql client了。详情见:mysqlnd插件mysqlnd_ms的介绍
两种方法都可以,运维同事都尝试了,由于时间关系,他们没做过多的尝试研究,就转向更紧急的项目了。

运维同事下载使用的PDO_MYSQL拓展的地址是 http://pecl.php.net/package/PDO_MYSQL ,里面用很耀眼的颜色,标注如下几行字

This package is not maintained anymore and has been superseded. Package has moved to channel http://svn.php.net/viewvc/php/php-src/trunk/ext/pdo_mysql/, package ext/pdo_mysql.

也就是说,早在2006年5月1(我是根据最后一个打包文件日期猜的,或许不准)之后,PHP已经将这个pdo拓展放到PHP源码的 ext/pdo_mysql下内置了。这里的这个包,将不会在更新维护了。

在PHP官方文档上对pdo_mysql使用mysqlnd的时候,是这么描述的
在php5.3中,已经支持mysqlnd作为数据库连接驱动了。而在将来的php5.4中,将变为默认的连接驱动。如图:

mysqlnd-pdo_mysql

开启这个类库的

./configure --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

之后,我的编译参数如下

./configure  --prefix=/usr/local/services/php --with-config-file-path=/usr/local/services/php/etc --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd --with-mysqli=mysqlnd  --with-iconv-dir=/usr/local/services/libiconv --disable-phar --with-gd=/usr/local/services/gd --with-jpeg-dir=/usr/local/services/jpeg --with-png-dir=/usr/local/services/png --with-freetype-dir=/usr/local/services/freetype --enable-bcmath --with-mcrypt

区别是使用php内置的pdo_mysql类库,使用mysqlnd作为连接驱动。

make之后,提示如下错误

soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1070: undefined reference to `mysql_eof'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1070: undefined reference to `mysql_fetch_row'
ext/mysql/php_mysql.o: In function `zif_mysql_error':
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1727: undefined reference to `mysql_error'
ext/mysql/php_mysql.o: In function `zif_mysql_errno':
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1758: undefined reference to `mysql_errno'
ext/mysql/php_mysql.o: In function `php_mysql_do_connect':
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:705: undefined reference to `mysql_get_client_version'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:963: undefined reference to `mysql_init'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:976: undefined reference to `mysql_options'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:980: undefined reference to `mysql_real_connect'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1002: undefined reference to `mysql_options'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:706: undefined reference to `mysql_get_client_version'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:844: undefined reference to `mysql_init'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:850: undefined reference to `mysql_options'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:853: undefined reference to `mysql_real_connect'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:871: undefined reference to `mysql_options'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:989: undefined reference to `mysql_error'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:992: undefined reference to `mysql_errno'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:898: undefined reference to `mysql_ping'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:899: undefined reference to `mysql_errno'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:901: undefined reference to `mysql_real_connect'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:911: undefined reference to `mysql_options'
/data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:862: undefined reference to `mysql_error'

这种错误,让我手足无措,GOOGLE搜了下,也没找到相关案例,而且,一直被墙,打不开国外网页。百度搜的结果,还是算了。(中文还行,E文的话,百度确实不行,尤其是程序相关)
之后,尝试make clean,清除之前的编译结果缓存之类。
再次make,有个小意外

ERROR: invalid PHP executable specified by TEST_PHP_EXECUTABLE  = .....

再次搜索,这倒是很多网友遇到过,大部分的建议就是无视这个错误,不影响编译。照做。make install ,一路挺顺畅。

接着,php -i / php -m 也没发现pdo_mysql模块。
郁闷无比,决定看下web下的phpinfo结果,发现居然有了。问题终于解决了。。。万岁。。

可是!!!
1,为啥php -i 、php -m 的结果里看不到呢? 思考,为什么呢?
结合刚刚的报错,联想到CLI 模式下的php 脚本(以及相关的php.ini)跟刚刚从web下访问的php程序不是同一个。检查环境变量,以及切换到编译好的目录下执行php -i,发现pdo_mysql、mysqlnd等相关添加的模块了。

2,php.ini里没启用pdo_mysql拓展,为什么还能看的到呢?
这次使用的是PHP内置的类库,不是以新拓展方式加载运行的,所以,不用更改php.ini,再添加相关so路径。

综上所述,文章没有高深的东西,只是有几个需要细心的点。
1,以官方文档为准,一切跟着官方文档来,不轻易采信网络上网友提供的编译参数,包括这边博文。不论对方是老手、大牛,还是其他什么什么有威望的人。他们提供的方法或许跟你当前的环境不一致,时间也相差很大,或许相隔好几年了。
2,确认得到的结果是准确的,怎么说呢,文中的例子中php-i的路径不是我们新编译的,而是之前编译,或者yum安装的,一定要到自己编译的程序目录下,用自己新编译的脚本去执行测试,获得测试结果,下结论,不为了偷懒,不敲路径,直接写程序名进行测试。
3,遇到诡异的错误,我总会想要一个全新的系统,进行安装,以确保不被各种冗余、缓存等垃圾文件干扰。例子中用了make clean进行清除相关缓存,来解决文件缓存问题。(感谢@ivon_lee 的帮助)
4,自动安装脚本要及时更新,当然,不是意味着追求最新版本。例子中的pdo_mysql的拓展,官方提供了更好的方式,不论是效率,资源占用,都有更好的提升,为啥不使用呢。

备注:mysqlnd 的相关有点对比见http://developer.51cto.com/art/200903/115995.htm

PS:文中出现的我搜索无果两次错误,如果有人知道,请告诉我,谢谢。

WEB开发安全与运维安全浅见

前段时间,同事LeeQueen为公司同事做了个《安全意识防护》的PPT,效果很好,各位新同事也知道日常公工作中,不太注意到的隐私保护问题。PPT中也提到了一些社会工程学的案例,提到了某团购网站前台人员被声称是新开礼品公司的工作人员,以填写信息就送礼品为由,获取到此团购网站的所有员工联系方式。后此团购网站的高层打电话回访,得知对方是猎头公司[详情见乌云网的链接]。此案例非常典型,讨论也尤为激烈,可谓是非常成功的培训。

此次培训之后,职业欠钱[sina微博][腾讯微博]让我给我们开发部门的PHP程序员同事们做一次PHP开发、运维时候一些安全注意事项。由于我在安全这块资历较浅,没有经验,我了解的大家都懂,这个话题太高深,我的水平完全不够,没法写这个PPT。而且,同事里有好几位安全界的前辈,我怎可关公面前耍大刀呢。上次写过一次关于正则表达式PPT,也就是一个月之前,深刻的体会到写PPT的痛苦,尤其是排版。实在不想写了。

后来,经常看到网上的安全工程师提到程序员安全意识较差,以至于同样的危险代码,危险程序,却屡次不改。当然,不是程序员不想改,而是程序员不太理解代码形成安全漏洞的原因。为此,我也觉得有必要提高一下我们程序员的安全意识了。

PPT中写了网络上常见的漏洞,形成原因,漏洞原理,防护建议等;也列举了近年来跟WEB相关的安全漏洞,以程序员的视角理解漏洞原理,并给出修复建议。这些建议仅供参考,不是正确答案。 由于本人水平原因,PPT中难免有错误,请见谅。也请安全界工程师指正。

借用网友的一句话,作为程序员,尽量要做到“知其然,知其所以然”,多多关注web安全,不要给安全工程师添麻烦,不能丢了程序员的脸。

做人要有气节,不能丢了我们弄PHP的脸

同时,公司招聘PHP程序员,地点上海,公司规模为150人+,做网络游戏研发、运营。招聘条件以及待遇之类的,可以通过以下方式联系我,我们私聊。

http://weibo.com/cfc4nx
http://t.qq.com/cfc4nx
邮箱:cfc4n@博客域名点COM

最后,PPT是周末两天写的,这两天老婆挺着6个月的大肚子,为我做饭,老婆实在是太辛苦了,感谢我老婆。
PS:讨厌写PPT[流泪]。

在线阅读:

下载到本地:
PPT下载:web开发与运维安全浅见PPT下载,猛点这里
更多亮点在PPT的备注里,各位一定要看备注。转载的朋友麻烦保留PPT完整,包括招人信息。尤其是备注要保留。
——-
PPT在2011/09/19 更新了,更换匹配NGINX 对URI中PHP脚本的正则,考虑到了拓展名为 .phpa .phpb .phpc之类的情况。主要是更换了正则匹配的图,更改了正则内容。

YSLOW法则中,为什么yahoo推荐用GET代替POST?

背景:
上上周五,公司前端工程师培训,提到前端优化的一些技巧,当然不能少了yahoo yslow的优化法则。其中有这么一条“Use GET for AJAX Requests”,这些法则从最开始的14条,到现在的35条,一直都时刻关注的。可这么一条的原因我却一点都不清楚。在提问的环节里,我对yahoo WEB前端优化法则推荐AJAX中,使用GET代替POST的原因有疑问,便请教前端工程师。我们的工程师说GET的话,浏览器发送一个包,POST会发两个等等。我对这个解释仍带有疑问,甚至怀疑。培训结束后,我随便搜索了一下,并没有得到理想的结果,可能很少人对Yahoo这么有权威的组织提出的优化法则产生怀疑,也很少人想知道为什么建议这么做,更多的人会唯命是从,墨守成规。之后,我又看了遍优化法则,看到一条是推荐开发者使用AJAX缓存的,这时,一个“伟大”的想法在我脑袋中一闪,莫非是GET请求可以缓存,而POST不可以?接着,我把我这个“伟大”的猜测告诉我的同事们,当初已经是下班时间,好多同事都离开公司,我也匆忙收拾东西下班了,没有仔细查找答案。

周末期间,脑袋中频繁的闪现这个问题,仍对我的想法有怀疑,Yahoo前端这么牛X的团队的想法,岂是我这样的菜鸟能这么容易的猜测推断到的?我对我当初的推测的怀疑就像“小时候就怀疑小JJ绝对不是只用来撒尿那么简单”一样坚定。但向我这么懒惰的同学,实在找不出一点时间来验证我这个想法,空闲的时间宁愿多打几盘CS。一直拖到现在,台风来了,在家宅两天,头都睡扁了,也找不出不写这篇文章的理由。

验证Yahoo推荐的理由:
验证XHR请求中yahoo推荐用GET代替POST做法的理由

POST is implemented in the browsers as a two-step process: sending the headers first, then sending data. So it’s best to use GET
POST请求分两步:发送http headers,再发送http data

HTML+JS代码:

 <body>
<script src="jquery.1.3.2.js"></script>
<form method="post" action="">
<select name="option" id="option">
	<option value="POST" name="POST">POST</option>
	<option value="GET" name="GET">GET</option>
</select>
	<input  id="button"  type="button" value="POST提交">
</form>
<script language="JavaScript">
<!--
$('#button').click(function(){
	var option = $('#option').val();
	$.ajax({
		type: option,
		url:"cc.php",
		data: "name=cfc4n&option="+option,
		success: function(msg){
			alert(msg);
		}
	});
});
//-->
</script>
 </body>

抓包工具:wireshark
提示:wireshark(1.2.5版)在抓http包的时候,会默认合并packet reassembly选项,记得全部去掉。如下图(edit–>Preferences)

wireshark去掉 packet reassembly选项

我分别发了一个GET、一个POST的XHR(XMLHttpRequest)请求,其数据包如下:

XHR HTTP请求中GET与POST发送的数据包详情


如上图,GET请求发送的数据包为第一个红框内的结果;POST请求发送的数据包为第二个红框内结果,但多了一个第12条数据包(粉红色框内),从10.0.0.108(我的PC)发往98.126.129.106(www.cnxct.com的服务器IP,也就是表单提交的目标服务器IP),wireshark给出的信息是“Continuation or non-HTTP traffic”,这个提示就是说,本次数据包是接着上一次的HTTP请求发的,没有HTTP header,只有http data。
详情如下图
XHR HTTP POST请求的header部分数据:

XHR HTTP POST请求的header部分数据

XHR HTTP POST 请求的DATA部分:

XHR HTTP POST 请求的DATA部分

XHR HTTP POST 请求的DATA部分

结论?:
果然,如伟大的YAhoo前端团队所说,XHR HTTP的POST请求会分为两步,先发HTTP HEADER,再发HTTP DATA部分。

然而,新的疑问又来了。为什么要分为两部?谁(例如W3C这种机构)规定的?每个浏览器都是这样的么?分两次比一次的的效率更高吗?

继续:
带这我新的疑问,又进行了如下尝试:先分浏览器,IE8、Firefox5.0、Chrome13分别发送XHR GET 、XHR POST请求,抓包对比结果。

我惊奇的发现(细心的同学会注意到第三张图中,有椭圆形的框标出那些结果的浏览器是Chrome13),Firefox5发送POST的数据包确是没有像yahoo前端优化法则中提到的那样,分为两次,两个包发送,而是一次完成http headers和 http data的发送。如下图:

firefox5在发送XHR POST请求时的数据包

firefox5在发送XHR POST请求时的数据包


大家可以从图中看到line-based text data:application/x-www-from-urlcoded下面就是POST的数据。
这时,又有很多疑问产生了,其他浏览器呢?IE的所有版本都会分两次发么?Firefox的其他版本呢?
当我想一个一个尝试抓包对比的同时,幸运的搜到了关于我这个疑问的PDF(Analysis_of_browser_specific_characteristics.pdf)
其中,提到firefox大部分版本在XP、WIN7、UBUNTU、MAC OS等系统上都是以1个包来实现的,其他常见浏览器都是分为两个包。

相比大家很清楚的知道,HTTP(TCP)完成一次事务,通讯次数越多,越有可能出现故障(网络延迟等因素),开销越大,浏览器(客户端)、服务端都要再进行一次TCP通讯,而且,需要一定的时间。对于我们追求更高的用户体验,需要HTTP通讯都避免到这些缺点,而各大浏览器开发商为何仍这么做呢?firefox的做法是最好的吗?

上面的PDF里,模拟了各种网络环境,比如网络延迟、网络丢包等情况,分别来对比POST请求的1次包和2次包的优缺点。得出的结论是:当网络环境好的情况下,1次包跟2次包的在时间上差别基本可以无视。而在网络环境差的情况下,(2次包)TCP的验证数据包完整性上,有非常大的优点,客户端先告诉服务端即将发送的数据包大小,MD5等标识,当服务端告诉客户端收到(ACK包)的时候,客户端再次向服务端发送POST 的DATA。假如网络环境不好,网络延迟、丢包的时候,服务端会等待(延迟时),客户端重发POST的DATA数据到服务单,来确保本次请求的完整性。

撰写这个PDF的作者在他的博客里详细的描述了写这个博客的起因,以及结果,还有一些关于与yahoo yslow前端团队的一些沟通过程,大家可以在这里阅读下(yahoo 的前端团队好像不太友好,哈)。

结论:
通过参考这个PDF,以及我自己做的抓包测试,让我了解Yahoo YSLOW前端团队的这个推荐(他们没详细的说为啥这么推荐,只是简单的提了下GET请求产生TCP一个包;POST请求,产生2个TCP包。甚至都没告诉我们Firefox的多数版本[可能是所有版本]都是发一个TCP包的。更详细、更深层原因也没说,这里还得感谢下http://loadimpact.com的作者)。

备注:
这里提供下我抓包测试时候的数据包(截图用到的数据包中包含我的一些cookie,没上传。这里的是我新抓的,各位见谅),各位可以参考下,如果我的文字、方向有错,欢迎指出。
IE8、FF5、Chrome13发起XHR请求数据包

当你读到这里时,我承认,我骗了你,文章的内容不光是标题中所写的,为何推荐使用POST代替GET,更多的是抓去TCP、HTTP通讯包来验证各个浏览器是否如YSLOW所述的那样分2次包的过程,以及2次包与1次包的优缺点(PDF中)。希望你看到最后的时候,忘记标题讲的是什么。

编译xhprof时的一个小意外

新项目基本开发完毕,剩余收尾工作。趁美工调整新UI的时间,赶紧在测试机上安装PHP的性能检测利器xhprof。
下载地址http://pecl.php.net/package/xhprof,这里有tar包,我下了http://pecl.php.net/get/xhprof-0.9.2.tgz

tar zxvf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cp -r xhprof_html xhprof_lib <directory_for_htdocs> # 应用程序所在目录,其中xhprof_lib是生成统计数据用到的类库。xhprof_html是查看统计数据的时候,用到的类库。
cd extension
/usr/local/php/bin/phpize
./configure
make
make install

之后,遍完成了。一路很“顺利”。
php.ini如下设置

extension=xhprof.so
; 存放目录,这个目录用来存放统计程序性能生成的数据。要有读写权限。
xhprof.output_dir=/var/xhprof_data

代码中,程序头部如下设置:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

程序最下面:

$xhprof_data = xhprof_disable();
include_once "./xhprof_lib/utils/xhprof_lib.php";
include_once "./xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');
echo 'http://<xhprof-ui-address >/index.php?run='.$run_id.'&source=xhprof';//source的值就是save_run的第二个参数的值。其中,网址就是上面保存xhprof_html的路径。

之后遍看到统计数据结果了。

可是,当我查看[View Full Callgraph]的时候,却提示如下:Error: either we can not find profile data for run_id 4d7f0bd99a12f or the threshold 0.01 is too small or you do not have ‘dot’ image generation utility installed.,这TMD神马玩意?是什么错呢?
关于dot的介绍,xhprof在这里写出来了:
http://mirror.facebook.net/facebook/xhprof/doc.html

dot (image generation utility): The callgraph image visualization ([View Callgraph]) feature relies on the presence of Graphviz “dot” utility in your path. “dot” is a utility to draw/generate an image for a directed graph.

GOOGLE了半天,也没找到可用的信息。问了下群里的同学,大牛老王告诉俺,xhprof绘制的是png图,系统(graphviz-2.24.0)不支持。才知道绘图的dot拓展没装成功。我的操作系统是UBUNTU 10.10 SERVER版的,也就是dot 不支持PNG。赶紧再次编译下graphviz,看看提示信息有什么缺少的。果然:

options:
  cgraph:        No (disabled by default - experimental)
  codegens:      No (disabled by default - deprecated)
  digcola:       Yes
  expat:         No (missing library)
  fontconfig:    No (missing fontconfig-config)
  freetype:      No (missing freetype-config)
  glut:          No (missing GL/glut.h)
  gts:           No (gts library not available)
  ipsepcola:     No (disabled by default - C++ portability issues)
  ltdl:          Yes
  ortho:         No (disabled by default - experimental)
  png:           No (missing png.h)

png: No (missing png.h)果然。。。。
赶紧到libpng官网down分源码,再次编译一下。
SF.NET上地址是 http://sourceforge.net/projects/libpng/files/libpng15/1.5.1/,我下的是http://sourceforge.net/projects/libpng/files/libpng15/1.5.1/libpng-1.5.1.tar.gz/download ,一气呵成,很顺利。
再次编译graphviz的时候,提示如下:

 ortho:         No (disabled by default - experimental)
  png:           Yes

好了,内牛满面。之后就是 make&make install了。
当打开[View Full Callgraph]的时候,果然是性感的资源占用统计图了。
展示下效果图:
优化前:

xhprof性能监控图优化前

xhprof性能监控图优化前

找到问题所在,稍微调试:

xhprof性能监控图找到问题,调试中

xhprof性能监控图找到问题,调试中

最终代码优化结果:

xhprof性能监控图优化结果

xhprof性能监控图优化结果

盗梦空间之胡思乱想

最近没事总爱胡思乱想。昨日看了《初恋50次》,查了一下大脑的记忆系统。发现,原来人脑子里有一个叫“海马体”的东西来负责记忆。

今早开始胡思乱想,梦是什么?想了一段时间得到如下图的结论。(注:这是本人的胡思乱想。没有啥科学根据。)

我解释下这个图,当人体的感观系统得到信息时,会以一种编码方式传递给大脑。大脑会把这种编码传递给记忆体。记忆体会短暂存储这种信息,然后会选择是否转换成长期记忆。这种感观,大脑,记忆互相联通时的状态就是现实。

  那梦是什么状况呢。当人熟睡的时候感观进入休息状态。但是大脑不休息,记忆体不休息。存贮在记忆体里的记忆会和大脑互相传递。这就形成了梦。所以梦是,大脑和记忆体之间互相交流产生的。

  如果我们破解了记忆体存储记忆的方式。(例如硬盘是以二进制的方式存储的)那么我们就可以记忆移植了,盗梦也不再是,只有在科幻片中才可能出现的事了。

程序员的谦逊编程

译注:开发人员如何从无休止的需求、项目进度中摆脱烦躁的心态,这是每个人都值得思考的话题。无意间看见了这篇文章,恐于太长遂将其精简翻译,错误之处难免欢迎指正。

同时如果你有有关程序员修身养性的观点和心得,欢迎说说你的看法。

-- Split --

其实每个程序员或多或少都会有个毛病,就是具有某种有强烈的“优越感”。而这种“优越感” 有可能成为激励自身不断发展的动力,同时也有可能成为其职场中的绊脚石。

程序员的这种心态,源自自身掌握的技术、以及多年积累的经验。正如上面所言,这种心态 能使其一切都力求完美、同时准确按照自己的思路行事,能使其技术不断的提升。而另一方 面,如果将这种态度套用给身边其他的人(包括陌生人、同事、朋友甚至家庭),则会发现 他的生活将会如履薄冰 — 他们只会看见完美的一面而忽略了更多更需要关注的事物。

总而言之,越早发现并解决这一问题,越对自身有利。套用 GeraldWeinberg 在《计算机编程心理学》中的一段话

这种想法是程序员必须解决的,他们对待自己的代码犹如对待自己身体的
一部分,因此他们拒绝所有的负面评价。相反,它们(指代这种心态)应
该及时的引导到正途,使其发挥真正的效用。人非圣贤,这不仅仅是心态
更是精神上的境界,并非所有人都能达到,但仍旧值得去尝试。

症状

那么,你如何得知这种“优越感”正在伤害到自己?除了应付那些没完没了的催促项目进度的 电话,以及给同事擦屁股的优化工程,其它的现象并非显而易见。

其实就我个人而言,时常也会自我责备,这就能窥出事态的严重。例如一方面你对项目疲于 奔命,而同时却忽略身边的人对你表达的看法(该死,这个时候我应该放下手头的工作听他 们说完的)。或者你“假装”静下心来听取他们的意见,但不就繁杂的工作却让你左耳进右耳 出。

其他的些症状

  • 如上面所说的,不会妥善处理批评
  • 不放心同伴的代码,经常性地对他们进行代码审查(Review)
  • 报复性的编写大量充斥着错误的代码
  • 个人的消极心态,对自身和团队造成不利的影响
  • 必须要求进行测试,但出发点却是炫耀
  • 对事物的看法仅仅局限于个人或者本职位的角度

这不仅仅是你个人的事情,编程以及项目开发实际上是团队活动。了解到这些,你将会意识到 你的心态将会直接影响到你的同事。

事实就是这样,当我对您的代码提出写意见甚至批评时,你应该听、并且认
真的听,这样你才能理解我的看法。

有可能最糟糕的情况就是,即便早已经收到其他同事的提醒,当事人已经陷入此泥潭无法自拔。

准则

让我们回到文章的题目本身,正如上面的例子中看到,“谦逊编程”不是编程技术本身,而是 种态度,但它的确会比你掌握的某种技术要有用的得多。

行为准则的确能改变人的心态,下面是些不成文的建议,或许你可以尝试下

  • 不要草率的宣布你的决定,在大多数情况下,你应该和你们的同事们讨论
  • 不要使用这些论调,这非常让人感到不适:“这是见过的最糟糕的代码了”,换之你可以这样说,“我有个更好的解决方案,要不看看?”
  • 不要轻易认为他们没有考虑到你想的方式,即便很不幸是这样,应该善意的提醒。例如“你觉得我这个看法怎么样…”
  • 不要无理由的批评你认为很弱智的现象,例如“我觉得 DBA 脑门子被夹了,这个字段竟然使用 INT 型”

更多的,可以参考 Tech Republic 中的“谦逊编程”十条诫律

  • 理解和接受你将犯下的“错误”。
    重点是及早的发现你已经犯下的错误,当代码投入使用以后,改动起来就会非常的困难。
  • 你的代码不能代表你的人。
    记住始终要 Review 你的代码,即便你已经认为无懈可击,经验证明总能发现些错误。
  • 不管怎么样,有些“奇技淫巧”总能派上用场,而可能这些技巧别人知道的比你更多。
    如果你坚持不耻下问,你的同伴总能分享你更多。
  • 不要在完全没有沟通的情况下,自作多情的进行代码重构。
    当你确定要更改别人的代码时,必须加上良好的修改记录,这也是出于对他人的种尊重。
  • 对待那些新手要保持充分的尊重、细心以及耐心。
    记住当他们成长起来后,能帮你解决的问题会比你想象中的还要多。
  • 唯一不变的是变化。
    怀着开放的心态对待变化,对于各种需求、平台甚至开发工具的变更,应该是迅速适应而不是牢骚满腹 — 这样解决不了问题。
  • 真正的权威来自学识,而不是立场。
    权威源自学识、尊重源自权威。
  • 优雅的接受失败。
    最终你的一些观点将会被推翻,即便你有能力证明你的观点是正确的,请不要重复的争辩。帮助其他人意识到这点的最好工具,就是你的理解以及时间。
  • 不要成为“办公室男”。
    不要在昏暗的办公室里独自喝着可乐敲着代码。当与外界隔绝,离开同伴的视线,也就说明你离开了一个开放、合作的环境。
  • 批判代码而不是编写它的人。
    要知道你的意见可以影响到代码也可以影响到其人,如果你想尝试下如何打击别人的自信并造成冲突,那么尝试下吧。

此文转载自:http://www.gracecode.com/archives/2971/ ,自勉自勉。

为什么使用ubuntu server的会被鄙视?

由于个人经历原因,我在06年经Dancefire推荐,才认识ubuntu的。时至今日,已有5、6年了。对着ubuntu有着莫名的喜爱。ubuntu桌面版的易用性,友好性,使得我这个菜鸟很容易的入门了。
如今,在公司的svn服务器系统选择上,我也选了ubuntu。
近期,重写了passport系统,出于好奇心,好奇自己的登录程序的并发处理能力、占用资源情况等,想压力测试一下,并不是项目真正完成的时候进行的测试。测试环境一切都是ubuntu的apt之后默认安装的配置。测试中发现瓶颈在DB,顺便让DBA帮看下哪里需要优化的。不想却被一位同事鄙视(善意的鄙视)一番,嘲笑我选择了ubuntu server。我很纳闷,我对linux不熟悉,找不到强有力的理由来反驳。不过,我觉得,不选择ubuntu的理由不能是向他所说的“哪有公司用ubuntu server?”。容我直白的说,如果真的这么想的话,我觉得这可能有些“井底之蛙”了。可能是ubuntu pc版本的界面,比较漂亮,安装软件更傻瓜化,点点鼠标的事情。软件的源很多,基本不用编译等等这些原因,认为使用ubuntu的人都是菜鸟级的。认为全是命令行的界面,所有软件都亲自编译那才叫高手。。。如果要是从内核上找优点,论证这些强项,我会更容易接受你的看法。
比起快速部署,我想,ubuntu server应该比centos之类redhat系的要快的多吧。至于觉得安装的没有编译的效率高,这些可以通过配置文件来设置吧。ubuntu更新比较频繁,可能在升级生,不会很平滑。
对于比较那种linux的server比较好的这种比较,就跟比较 asp.net、PHP、jSP、python等脚本语言比较牛B一样没有意义。更多的在于使用者,而不在于语言本身。如何选择,就看哪种自己更熟悉,更习惯。当然,我也是瞎扯了。我对linux基本不熟悉的。

顺便附上2011年-01-19的linux市场份额图:

2011年-01-19的linux市场份额图

其中,centos占了29%,ubuntu占了12.3%,也算不少了吧。

原文地址:http://w3techs.com/technologies/details/os-linux/all/all

正则表达式与数学(方程式、线性方程)

大清早的打QQ去,收到一位网友的信息。问得是正则表达式判断素数的。去年看到过,没记录下来。
正则表达式如下:

^1?$|^(11+?)\1+$ 可以判断素数(换成n个1的形式,n为数字的大小。比如5转换为11111;3转换为111;2转换为11。)

什么是素数?
初中学的吧。我们老师当初教我们的是“质数”。看下概念:
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。

这个正则表达式是什么意思?
【^1?$|^(11+?)\1+$】中间用【|】分开。【|】在正则语法里,表示“或”,作用于其前后两个单元。(还是不明白的看下面,明白的跳过下面这段)

比如【ab|cd】可以匹配“ab”、也可以匹配“cd”,意思是除了“ab”就是“bc”,如果想匹配“abd”、“acd”那【|】的作用域得改下,加个范围
改成【a(b|c)】(匹配结果分配组)或者【a(?:b|c)d】(匹配结果不分配组,更高效率)。

继续刚刚的正则,分为两个分支,其一为【^1?$】和【^(11+?)\1+$】。其中【^】脱字符在正则语法中,除了在中括号【[]】中都是代表开头的意思,在中括号中的表示非。
第一个分支【^1?$】匹配的是“1”或者“”(空字符串)。
第二个分支【^(11+?)\1+$】,先看下括号内的【(11+?)】匹配的是字符“1”后面接着【1+】就是1到无数个1。后面的【?】问号表示非贪婪,就是尽量少的匹配。
接着往后看【\1+】中,【\1】表示引用已匹配的第一个组的结果。也就是第一个【()】括号匹配的结果。同理【\2】就是第二个括号捕获的结果。(小提示:上面提到的【(?:)写法就是不分配组,这样引用的话,就引用不到了】)
【+】就是1到无数个了。这个表达式我们可以这么看。【(11+?)】看成数学中的1+n,其中n为大于0的正整数。外面的【\1+】也就是引用前面这个组的次数。理解成m倍,其中m为大于0的正整数。
那整个表达式就是(1+n)*m。因为n、m都大于0,那么1+n肯定大于1,最小为2,最大为无穷大;m最小为1,最大为无穷大。
那么,一个大于2的正整数的任何大于零的倍数永远都是合数,也就是非素数。

再回过头来看看这个表达式。匹配的分别为0个或1个字符串“1”,也就是数字0,数字1。和其他所有合数。整个表达式,如果成功匹配就是非素数,如果不匹配就是质数。这就是对的了。

if (preg_match('/^1?$|^(11+?)\1+$/i', $subject)) {
	#不是素数
} else {
	# 是素数
}

小提示:此鉴定是否为素数方法仅研究学习用,不能用到正式程序中,字符串过长,会造成非常恐惧大的回溯

英文博客地址:http://blog.stevenlevithan.com/archives/algebra-with-regexes

在上面的博文中,有提到两个方程式与正则表达式,我们一起来研究下。

  • 二元方程17x + 12y = 51,其表达式【^(.*)\1{16}(.*)\2{11}$】。很好理解。【(.*)】也就是0到无数个【.】点号。(这里是接着上文说的,其实,【.】点号想表示的是字符“1”)
    也就是0到无数个1,后面【\1】引用一次。后面【{16}】就是16次。作用于前面的【\1】,也就是16次引用。加上开始的【(.*)】一共正好17次。后面一个就不说了,跟这个一样。
    正则引擎会依次尝试【(.*)】中0到无数个字符“1”,0个字符“1”,1个字符“1”,2个字符“1”一直增加的尝试。直到成功,否则要尝试完所有字符“1”的最大个数(这里是51个字符“1”)。
  • 二、三元方程式11x + 2y + 5z = 115,其表达式为【^(.*)\1{10}(.*)\2{1}(.*)\3{4}$】,理解就跟上面那个一样。注意【\2】、【\3】值得是第2,第3个括号捕获的内容,别看花眼了。

——————-分割线——————
上面几个有意思的数学题都是将整数转换为对应个数的字符“1”。下面这个,是转换为二进制数的。
先吃饭,以后再写。

奇妙数学大世界

 长期以来,一个令人困惑的现象是:一些同学视数学如畏途,兴趣 淡漠,导致数学成绩普遍低于其他学科。
这使一些教师、家长乃至专家、学者大伤脑筋! “兴趣是最好的老师。”对任何事物,只有有了兴趣,才能产生学
习钻研的动机。兴趣是打开科学大门的钥匙。 对数学不感兴趣的根本原因是没有体会到蕴含于数学之中的奇趣和
美妙。
  一个美学家说:“美,只要人感受到它,它就存在,不被人感受到, 它就不存在。”
对数学的认识也是这样。 有人说:“数学真枯燥,十个数字来回转,加、减、乘、除反复用,
真乏味!” 有人却说:“数学真美好,十个数字颠来倒,变化无穷最奇妙!” 认为枯燥,是对数学的误解;感到了兴趣,才能体会到数学的奥妙。 其实,数学确实是个最富有魅力的学科。它所蕴含的美妙和奇趣,
是其他任何学科都不能相比的。
  尽管语文的优美词语能令人陶醉,历史的悲壮故事能使人振奋,然 而,数学的逻辑力量却可以使任何金刚大汉为之折服,数学的浓厚趣味 能使任何年龄的人们为之倾倒!茫茫宇宙,浩浩江河,哪一种事物能脱 离数和形而存在?是数、形的有机结合,才有这奇奇妙妙千姿百态的大 千世界。
数学的美,质朴,深沉,令人赏心悦目;数学的妙,鬼斧神工,令
人拍案叫绝!数学的趣,醇浓如酒,令人神魂颠倒。 因为它美,才更有趣;因为它有趣,才更显得美。美和趣的和谐结
合,便出现了种种奇妙。
  这也许正是历史上许许多多的科学家、艺术家,同时也钟情于数学 的原因吧!
数学以它美的形象,趣的魅力,吸引着古往今来千千万万痴迷的追
求者。

66.出门旅行
某人出门旅行了22天。坐火车、汽车和骑自行车,各走了全部路程的
1 1 1
。骑自行车的速度是火车速度的 ,是汽车速度的 。你知道他坐火车、
3 8 4
乘汽车、骑自行车各是多少时间吗?
解:这是一道行程问题。路程、速度、时间是行程问题的三个要素。
从题中“各走了全部路程的 1 ”,可知坐火车、汽车和骑自行车所行
3
的路程是一样的。 根据“路程一定、速度和时间成反比例关系”,若把骑自行车的时间当
1
作“1”,坐火车的时间只是骑自行车时间的 ,同样,乘汽车的时间
8
只是骑自行车时间的 1 。
4
旅行共用了 22 天,骑自行车的时间便是:
1 1
22天÷(1+ + )
4 8
=22天÷ 13
8
8
=22天×
11
= 16天
坐火车的时间是:
1

16天×
8

= 2 天

乘汽车的时间是:
1

16天×
4

= 4天

67.退瓶换水

  暑假中,宁宁、尧尧等五个同学结伴到花果山旅游。他们走得又累又渴, 便到商店买了一扎(10 瓶)汽水。喝完后,营业员说,空瓶她们收回,要钱 也行,换汽水 3 瓶换 1 瓶也可以。宁宁说:“全部换汽水!”结果,把换来 的汽水喝了,空瓶又换了汽水。最后一只空瓶也没留下,你知道他们一共喝 了多少瓶汽水吗?
  解:这道题如果用普通的换来换去的办法也能求得结果,但是太麻烦, 如果数量大,换的次数多了,很容易出错。
巧妙的思维方法是将它“分割压缩”,大题化小,寻找规律。 可以这么想:要先向营业员借 1 瓶,再买 2 瓶,喝完后,正好是 3 只空
瓶,把空瓶都交给营业员,就正好互不欠帐了。 这么一想,买 2 瓶汽水就可以喝到 3 瓶了。
因此,买一扎 10 瓶汽水,再加上退瓶后换来的汽水,共可以喝到: 解法 1:10+10÷2
=10+5
=15(瓶)
解法 2:3×(10÷2)
=3×5
=15(瓶)

68.年龄乘积

  芳芳、丽丽、倩倩三个同学年龄都依次相差 1 岁,一个比一个大。三个 人年龄相乘得出的积是 504。
她们三人年龄各是多大?
  解:从题中“年龄依次相差 1,一个比一个大”。可断定:三人的年龄 是三个连续的整数。
  “三个连续数的积是 504,求这三个数”。把题目变换成这样叙述,就 便于思考了。
  既然 504 是三个连续数的积,那么 504 的质因数必然包含这三个数的全 部质因数。
思路只要进入这个阶段,这道看似很难的问题,便容易解决了。
只要将 504 分解成质因数相乘的形式,再设法把质因素的积分成三个连 续数,便可以了。

经过分析,将质因数作下面的分组,便符合要求:
504=(2×2×2)×(3×3)×7
=8×9×7
=7×8×9
即:芳芳 7 岁、丽丽 8 岁、倩倩 9 岁。

69.鲨鱼长度

  有一条大鲨鱼,它的身长等于头长加上尾长,它的尾长又等于身长的一 半加上头长。已经知道这条鲨鱼头长 3 米。你能算出这条鲨鱼的全长是多少 吗?
  解:题中鲨鱼的头长已知是 3 米,身长=头长+尾长,尾长=头长+身长一 半。
咱们据此可画个示意图: 由图可见,只要求出尾长,则身长可求,因此,求鲨鱼的尾长是解题的
关键!
这道题趣在只告知鲨鱼的头长,身长尾长都不知,却要我们求出鲨鱼的 全长来。初看似乎无从下手,但是画出示意图后,便暴露出了解题的关键。

尾长的求法,可作如下推导: 尾长=头长+身长÷2
=头长+(头长+尾长)÷2
2 尾长=2 头长+头长+尾长(等式两端都×2) 尾长=3 头长
=3×3
   =9(米) 全长=头长+身长+尾长
=3+(3+9)+9
=3+12+9
  =24(米) 如果学习了方程,用方程解就简化了: 设鲨鱼尾长为 x 米,可得,
x + 3
x = 3+
2
2x = 6+x+3
x=9
身长=3+9=12 全长=3+12+9=24(米)

70.油桶重量

  哥哥是个汽车驾驶员,小明经常看到他拿着油桶直接向车内加油,便问: “哥哥,每次加多少机油,有数吗?”哥哥说:“咋能没数呢!瞧,我这桶 连油一共重七千克,现在油已用去一半了,连桶还有四千克。”
“桶里净油是多少,还是不知呀!”小明又问。 哥哥笑了笑说:“真是个书呆子!一算不就知道了!” 小明不再问了,他用心地思考着。一会儿,真的算出来了,连油桶的重
量都知道了。 哥哥听了他的答案后,高兴得连连叫好:“不是书呆子,是洋学生。” 你知道小明是怎么算的吗?
解:可以先画个线段图:

连桶共重 7 千克,现在只剩下 4 千克了,那么用去多少油呢?
7-4=3(千克) 这 3 千克就是油的一半,全部油便是:
(7-4)×2
=3×2
  =6(千克) 桶重便是:7-6=1(千克) 还可先求桶的重量:
  

再求油的重量:

4×2-7=1(千克)

7-1=6(千克)

              71.阶梯级数

科学家爱因斯坦做过这样的问题:
  一条长长的阶梯,如果你每步跨 2 阶,那么最后余 1 阶;如果每步跨 3 阶,那么最后剩下 2 阶;如果每步跨 5 阶,最后剩 4 阶;如果每步跨 6 阶, 最后剩 5 阶;只有当你每步跨 7 阶时,才正好走完,一阶也不剩。问这条阶 梯最少有多少阶?
解:这个题目换一种说法,就是:
一条长阶梯,它的阶数被 2 除余 1,被 3 除余 2,被 5 除余 4,被 6 除余
5,被 7 能整除,求至少有多少阶? 这样,把题目压缩简化了,可以方便思考。题中共有 5 个条件,可以分
两步解决。
  第一步,根据“阶数被 2 除余 1,被 3 除余 2,被 5 除余 4,被 6 除余 5” 这四个条件,可知只要在阶数上加 1,就是 2、3、5、6 四个数的倍数了。
2、3、5、6 的最小公倍是:30
所以 29(30-1)便是满足这四个条件的最小自然数。 第二步,第五个条件是“能够被 7 整除”,29 显然不能满足这个条件。
怎样才能满足这个条件呢?用 29 作基数,连续加上 2、3、5、6 的最小公倍
30,便可得到:29+30=59 59+30=89 89+30=119??得出的和,经过计算, 如果能被 7 整除了,那么答案便找到了。这里 119÷7=17 已经符合目标了, 便不必再加下去。119 便是台阶的最小数目。

72.蜻蜓、蜘蛛、蝉

  生物小组一次到野外采集生物标本,他们共捉到蜻蜓、蜘蛛、蝉三种小 动物共 18 只。他们算了一下,共有 118 条腿和 20 对翅膀。大家知道蜘蛛是
8 条腿,蜻蜓有 6 条腿和 2 对翅膀,蝉有 6 条腿和 1 对翅膀。你能算出这三 种小虫各是多少只吗?
解:初看这个题目很复杂,似乎无从着手。 可先把条件疏理清楚:

假定 18 只都是蜘蛛,那么应共有腿:
8×18=144(条)
  实际只有 118 条腿,多了 144-118=26(条)腿。为什么会多呢?因为每 只蜘蛛比每只蜻蜓或蝉都多 2 条腿。把蜻蜓和蝉也当作蜘蛛计算了。这样, 就有 26÷2=13(只)都当作蜘蛛了。从而蜘蛛的只数可求:
              18-13=5(只)
下一步再来算蜻蜓和蝉各是几只。
假如 13 只都是蜻蜓,每只蜻蜓 2 对翅膀,共有 13×2=26(对)翅膀。 实际只有 20 对翅膀,多了 26-20=6(对)翅膀,为什么会多呢?因为蜻
蜓是 2 对翅膀,蝉只有 1 对翅膀,把蝉当蜻蜓有 1 只就多 2-1=1(对)翅膀。
说明有 6 只蝉也当作蜻蜓了!实际蜻蜓只有 13-6=7(只)。 列成综合式是:
(18×8-118)÷(8-6)
=(144-118)÷2
=26÷2
=13(只)????????蜻蜓和蝉的只数
18-13=5(只)???????蜘蛛的只数
(13×2-20)÷(2-1)
=(26-20)÷1
=6÷1
=6?????????????蝉的只数
13-6=7(只)???????蜻蜓的只数

73.剩余问题

  有一篮鸡蛋,5 个 5 个数余 1,6 个 6 个数余 3,7 个 7 个数余 5。这篮鸡 蛋至少有多少个?
  解:这道题实质就是“求被 5 除余 1,被 6 除余 3,被 7 除余 5 的最小 自然数是多少?”
我们可以用“层层剥笋”的方法来解决它。
第一步先满足“被 5 除余 1”的条件:用 1 连续加上 5 的得数都符合,6、
11、16、21、26??在计算过程中,要使得数满足第二个条件“被 6 除余 3”, 即停止。21÷6=3??3 便不再加下去了。
  第二步,用 21 这个数再连续加上 5 和 6 的最小公倍数 30,直到和能满 足第三个条件:被 7 除余 5。
21+30=51 51+30=81 81+30=111
111+30=141 141+30=171 171+30=201
好了,201÷7=28??5 符合第三个条件了,便停止再加。所以,至少有
201 个鸡蛋。 验算一下:
201÷5=40??1
201÷6=33??3
201÷7=28??5

74.点燃蜡烛

  为了预防停电,尧尧准备了一些蜡烛放在书橱里。他发现粗蜡烛和细蜡 烛长短虽一样,但是一支粗蜡烛能连续点燃 5 小时,细蜡烛只能点燃 4 小时。 有一天,兄弟俩同时点亮蜡烛做功课。过了一段时间后,粗蜡烛的长度
是细蜡烛的 4 倍。他头脑一转,向弟弟提了个问题: 你能从蜡烛燃烧的长度算出我们学习了多长时间么? 解:蜡烛点燃的时间,就是兄弟俩学习的时间。
1
粗蜡烛可点燃5小时,每小时烧去长度的 ,细蜡烛可点燃4小时,
5
每小时烧去长度的 1 。
4
可用方程求解:
设:蜡烛点燃了 x 小时
1 x
粗蜡烛x小时烧掉了长度的 x =
5 5
细蜡烛x小时烧掉了长度的 1 x = x
4 4
把整支蜡烛看作“单位 1”,则:

x
1 – = (1 -
5
x
1 – = 4 – x
5
x
x – = 4 – 1
5

x
)×4
4

4
x = 3
5
x = 33 / 4
两支蜡烛已经点燃了3 3 小时,也即兄弟俩的学习时间。
4

75.行程问题

  休息日弟弟和妈妈一同去姥姥家。他们走了 1 小时后,哥哥发现带给姥 姥的礼品忘在家里。便立刻带上礼品去追。可爱的小花狗,也跟着飞奔而去。 它追上弟弟后,又立即返回到哥哥这里,再返回追弟弟,就这样,不停地在 哥哥和弟弟之间跑来跑去,直到兄弟俩相遇了。如果弟弟每小时行 2 千米, 哥哥每小时行 6 千米,小花狗的时速是 16 千米,你能算出在哥哥追上弟弟时, 小花狗一共跑了多少千米?
  解:表面看,这题很难:小花狗在兄弟俩之间往返不停地跑动,兄弟俩 之间的距离又是逐渐地缩短,又没有告诉小花狗一共跑了多少趟,小花狗跑 的路程怎么求呀?
如果思路误入这个歧途,问题便难解了。 我们应该这么想:
  已经告知了小花狗的速度是 16 千米/小时,只要知道时间,便可求出小 花狗共跑了多少路程。
  哥哥追上弟弟所用的时间,就是小花狗跑的时间。因为从哥哥出发时, 它就一直没停往返于哥哥和弟弟之间。
思考到这一步,便容易解决了。
哥哥与弟弟的速度差是:
6-2=4(千米) 即每经过 1 小时,哥哥便可追上弟弟 4 千米。 弟弟先出发 1 小时,哥哥追上他需用:
              2÷4=0.5(小时)
即哥哥用半小时,便可追上弟弟。 小花狗在这半个小时中,一直不停地往返奔跑,它每小时速度是 16 千
米,那么 0.5 小时它跑了多少路程呢?
16×0.5=8(千米)

列成综合算式是:

16×[2÷(6-2)]
=16×[2÷4]
=16×0.5
=8(公里)

一个看似难解的问题,竟是这么简单!

76.参赛人数

向阳小学举行《小学生数学报》知识竞赛,四年级参加比赛的人数占参
加比赛的总人数的 1 ,五年级与六年级参加比赛的人数比是11∶13,
3
五年级参加比赛的比六年级少 8 人,三个年级各有多少人参加比赛?
解:因为五六年级参赛比为 11∶13,那么这两个年级人数的总份数为

?
11+13 = 24份,所以五年级参赛人数占总参赛人数的?1?
?

1? 11 11
? × = ,
3? 24 36

六年级参赛人数占参赛总人数的?1 ?
?

1? 13
3? × 24

= 13 ,有了五六年级参
36

加比赛的占参加比赛总人数的几分之几,再利用五六年级人数差与分率差的 对应关系,便能求出总人数,然后分别求出各年级参赛人数。
  也可以这么求:因为五六年级参加比赛的人数比是 11∶13,所以五年级 参赛人数是 11 份,六年级是 13 份,即五年级比六年级少 2 份,五年级又比 六年级少参加 8 人,这样就可以分别求出五六年级参赛各有多少人,再求出 四年级参加比赛的人数。
解法 1:
①求出参赛总人数:

8÷(

1

13 11
- )
36 36

= 8÷
18
= 144(人)
②各个年级的参赛人数:
1

144×
3

= 48(人)??四年级

解法 2:

11
144×
36
144× 13
36

= 44(人)??五年级

= 52(人)??六年级

①五年级参赛人数:
8÷(13-11)×11
=8÷2×11
=4×11
=44(人)
②六年级参赛人数:
8÷(13-11)×13
=8÷2×13
=4×13
=52(人)
③四年级参赛人数:

1 1
(44+52)÷(1- )×
3 3
= 96÷ 2 × 1
3 3
3 1
= 96× ×
2 3
= 48(人)

答:四年级参加比赛 48 人,五年级参加比赛 44 人,六年级参加比赛 52
人。

77.测洞深

  勘察队员在一个山坡上发现一个石洞,黑洞洞的望不见底。他想测量一 下石洞的深度,可是身边只有一根长绳,绳的长度也不知道。
  后来他想了一个办法:将绳折成 3 折放下井底,上端比井口低 1 尺;他 又把绳子折成 2 折放入井底,上端高出井口与他身高相等。他知自己穿靴戴 帽的高度恰好 6 尺。于是便很快算出了洞深,连绳长也知道了。
你知道他是怎样计算的吗?
解:将绳折3折,长度便是原长的 1 ,折2 折长度便是绳长的 1 。
3 2
1 1
根据问题的数据,可知绳长的 比它的 长7尺(1尺 + 6尺)。
                         2 3
这7尺恰是绳长的 1 。
6
解法 1:
(1+6)×6=42(尺)???????绳长
  42÷2-6=15(尺)????????洞深 或:42÷3+1=15(尺)
解法 2:
1 1
(1 + 6)÷( – )
2 3
1
= 7÷
6
= 42(尺)?????????????绳长
1

42×

- 6 = 15(尺)????????洞深
2
或:42 × 1 +1 = 15(尺)
3

随机应变

  急智类题目,大多情节单纯,内容直白,数字简单,凭借生活经验,可 以直接口算答案,解题的技能反映出“急中生智”、“随机应变”的本领。 由于这类题目初看简单,一些人解答时不假思索脱口而出。但是常见的 情况是,答得越快,错得越多!当别人点破迷津时,才恍然大悟,虽然解法
同样简单,但思路却必须拐个弯儿。 简单的问题本应极易求解,但是错误的比例甚至比解复杂的问题还高。
果真是“看花容易绣花难”!因此,这类问题,也可称作“简单的难题”。 简单的难题中,寓含着复杂的道理。如果能顺利地解决这类简单的问题, 再遇到同类的复杂问题,也便得心应手了。如锯木段与植树问题,渡河方法
与计算机程序等等,都有着密切的联系。 解这类题,对培养、训练思维的深刻性和敏捷性,对提高解题和应变能
力,都有极大的帮助。

1.几天剪完

一块 10 米长的布,每天剪去 2 米,几天可以剪完?
解:一些人会不加思考地回答:5 天剪完。他们的算法是:10 米÷2 米
=5(天)
其实最后一次剪开的是 4 米,因此只用 4 天便可剪完。即,10÷2-1=4
(天)

2.用时多少

  一根长 12 米的木料,截成都是 2 米长的木段,每截一段都需 5 分钟,全 部截完需多长时间?
解:12 米长木料,截成 2 米一段,只需截割 5 次。共需时间为:
5×(12÷2-1)=5×5=25(分)

3.几次渡完

  河里只有一条能坐 5 人的空船,现有 10 人需要过河,需往返几次才能全 部过河?
解:要是算成:10÷5=2(次),便大错特错了!
  因为小船每次只能坐 5 人,船到对岸,还需 1 人将船撑回来,实际每次 仅过河 4 人,两次船过 8 人,最后,对岸只剩 1 人,仍需船开回再渡。所以, 必须 3 次才能全部过河。
  
4.多少只鸡

  如果 3 只母鸡 3 天能下 3 个蛋,那么,要在 100 天内,得到 100 只鸡蛋, 需多少只鸡?
  解:3 只鸡 3 天下 3 只蛋,3 只鸡 1 天只生 1 只蛋,所以 3 只鸡 100 天 内就可以得到 100 只鸡蛋。
  
5.分装水果

  有 12 千克水果,分装在 4 个袋里,每袋都装了 4 千克,而且没有空袋, 这是怎么回事?
解:把最后一袋水果,连同袋子都装入剩余的一个袋内了。

6.棋子距离

  桌上摆放着 5 枚棋子,相邻的两个棋子间距离都是 4 厘米,两端两个棋 子间距离是多少?
解:5 枚棋子只有 4 个间隔,因此,首尾两棋子间的距离是:
4×(5-1)=16(厘米)

7.哪排更长

  有两列队形:一列 10 人,每两人间距 1 米;另一列 15 人,每两人间距 半米。哪一列队形更长?
解:10 人队列,共有 9 个间距,每个间距是 1 米,所以全长 9 米。
15 人队列,共有 14 个间距,每个间距是 0.5 米,全长只有 0.5×(15
-1)=7 米。
当然是 10 人队列更长些。

8.几种信号

  一只船上有红、黄、蓝三种颜色的信号旗,一共可以表示多少种不同的 信号?
解:挂一面旗,只有红、黄、蓝 3 种信号。 挂两面旗,有:红黄、红蓝,黄红、黄蓝,蓝红、蓝黄,共 6 种信号。 挂三面旗,有:红黄蓝、红蓝黄,黄红蓝、黄蓝红,蓝黄红、蓝红黄,
也是 6 种信号。
所以,三种颜色的旗共可表示 15 种不同的信号。

9.放大镜看角

一个角只有 30°,用 3 倍的放大镜看应是多少度?
解:仍是 30°。

10.抓住两根

  在一个建筑工地的支架上吊下两根绳子,因为两根绳间距较大,一个人 能抓住这一根,就够不到另一根,但是必须两根同时都抓住,才能继续下面 的工程。
  后来,他终于想出了办法,并没用任何辅助器具,把两根绳子抓到手里 了。
他用了什么办法?
  解:他先摆一根绳子,让它大幅度地摇摆起来,然后撒手去抓另一根绳 子,当前一根绳摆过来的时候,便迅速地抓住它。
  
11.通过桥洞

  一批装载集装箱的机帆船,必须通过一座桥洞。可桥洞离水面比集装箱 顶距水面还矮 1 厘米。
  可是后来船长想了个巧妙的办法,竟然使所有船只顺利通过了。你知道, 船长用了什么办法吗?
  解:船长用增加船的装载量,使船吃水更深一些,船在水面上的高度便 降低了。这样,直到增加的重量足以使船身下沉到大于 1 厘米时,船只便可 从桥洞中通过了。
  
12.智过独木桥

  李大叔挑着两个空箩筐进城买菜。当他通过独木桥时,后面紧跟着一个 小孩,紧接着对面也来了一个小孩。两个小孩把李大伯夹在了独木桥中间, 他们谁也不肯往回走,独木桥又不能并行两人。李大伯急中生智,使两个小 孩各奔前程,谁都没有往回走。
李大伯用的是什么办法呢?
  解:李大伯让两个小孩坐在箩筐里,让扁担在肩上转了一下,两个小孩 便互换位置了。
  这些问题在实际生活中似乎不可能存在,可是在工厂中生产零件的流水 线上,却可能出现两种流程相交,必须想出类似于此的解决办法,因此,它 的实际意义是不容忽视的。
  
13.狗、羊、菜

  有位老人带着一只小狗、一只小羊和白菜来到河岸。但是渡河时只允许 主人带三件物品中的一件,可是不论在河的哪一边,狗和羊、羊和白菜都不 能无人照管而同时放在一起,因为狗会咬羊,羊会吃菜。
老人该怎样过河才能不受损失?
  解:老人先带羊过河,留下小狗和白菜,空船渡回。第二次带狗过河, 若把狗、羊都留下,则狗会咬羊,老人将羊带回,只留下狗在对岸。第三次 带菜过河,留下羊,到对岸后留下菜,空船回。最后再把羊带过河。这样, 便毫无损失了。
想想看,还可以怎么办?

    14.还有几个角

把一块正方形的硬纸板,剪去一个角后,还会有几个角?
  解:这类问题是不应该简单的用“4-1”的方法来解决,要具体问题具 体对待。
由于剪法不同,可能出现下述三种情况:

图(一)的剪法还剩三个角。 图(二)的剪法还剩四个角。角没有减少。 图(三)的剪法还剩五个角,增加了一个角。

15.暗中取球

  木箱里有黑、白两种球各 10 个,如果在暗中取球,一次只取一只,最少 取几次才会有一对颜色相同的球?
  解:题中问的是最少取几次才能有一对颜色相同的球。所以,取一次可 能是黑或白,取第二次则非黑即白。只要与第一次颜色相同就会得到一对同 颜色的球。因此至少用二次。
  若问最多几次可得不同色的球,情况就不同了。每种颜色的球都是 10 只,有可能前 10 次取的是同一种颜色的球,但到第十一次则肯定可得一对不 同颜色的球了。
  
16.煎饼时间

  用平底锅每次能煎两个饼,每煎熟一个饼正反面各需 1 分钟,因此一只 饼从入锅到煎熟共需要 2 分钟。照这样,煎三个饼最少要用多少分钟?
  解:煎三只饼至少需要三分钟。方法是:第一次放入两个饼,一分钟后, 取出一只放进第三只,同时将第二只翻转。再煎 1 分钟,取出煎熟的第二只, 将第一只放入煎反面,同时将第三只翻转,再过 1 分钟,便都煎熟了。
17.楼梯台阶
  董尧尧从一楼走到三楼共跨 36 个台阶,如果每层楼的台阶相同,他走到 六楼共跨多少个台阶?
解:如果你的解法是:
          36÷3×6=72(个) 便错误了!因为从地面到三楼实际只经过两层楼的台阶。同样,从一楼
到六楼也只跨五层楼梯。 正确的解法是:
36÷(3-1)×(6-1)
=36÷2×5
     =90(个) 即从一楼到六楼共跨 90 个台阶。
     
18.试开门锁

  每个锁都有一把钥匙,小亮家有三把钥匙三把锁,但是他分不清哪个钥 匙开哪把锁,只好试开。要保证每把锁都配上自己的钥匙,最多需试几次? 最少需试几次?
解:最多需试 3 次。
  如用 A 钥匙试开,若不是 1 锁和 2 锁,则定是 3 锁,不必再试。用 B 钥 匙试开 1 锁,若不是,定是 2 锁。余下的一把钥匙必然是 1 锁的。
最少只需试开 2 次。 每试一把钥匙都恰巧能开,则余下最后一把便不必再试了。

19.池塘水草

  一种水草繁殖力极强,放在水面上它的覆盖面积每天都扩大一倍。一个 池塘将水草放进后仅 20 天,池塘的水面就被全部覆盖。
现在问你:当水草把池塘的一半覆盖时,用了多少天?
  解:人们思考问题大多“从头想起”,用这种思路本题便无法解决。因 此,有时便需要“倒过来想”。
  这种水草,每天的面积扩大一倍,20 天将水塘全部覆盖,这就是说,在 第 19 天时,它只覆盖了池塘的一半面积。
瞧,“倒过来想”之后,问题这么容易就解决了。

20.睡了几小时

学校组织登山,回家后董尧觉得很累,他把闹钟对准 9 点,心想明天睡
到 9 点再起,反正是星期日不用到校。于是他 8 点钟便入睡了。请问到闹铃 响时,他一共睡了多少小时?
解:很多同学的解法是:
12-8+9=13(小时) 其实他忽略了一个重要因素:在 12 点前,闹钟到 9 点时便起闹了。从他
入睡到响铃,实际只有 1 个小时。

21.时钟敲响

一只报时钟,敲响 5 下要用 20 秒,敲响 10 下,要用多少秒? 解:一般人会脱口而出:40 秒! 他们的算法是:20÷5×10=40(秒)
但实际敲 5 响只有 4 个间隔,敲 10 响只有 9 个间隔。 因此,每一间隔需用时间是:
20÷(5-1)=20÷4=5(秒) 敲 10 响需用的时间是:
5×(10-1)=5×9=45(秒) 这类题与锯木段算法是相似的。

22.猴王分桃

  猴王有 10 只小猴子,一天它摘来一些桃子。小猴子一个个急着要吃。猴 王眼睛一眨说:“别急,别急,我把桃子分一半给每只小猴,你们再退回一 只,好吗?”
  小猴子听说每人可以分得总数的一半,只退回一只,连声说:“好,好, 好!”
  于是,猴王将桃子给每个小猴分发下去。10 只小猴都分完了,猴王的手 里还剩 2 只桃子。
你知道猴王一共有多少只桃子?
解:猴王只有 2 只桃子。 小猴子最后才明白受骗了,它们谁都两手空空,一只桃子也没捞着。

23.如何渡河

  十队公安干警,为执行任务,必须渡过河去。可是桥已被破坏,河水又 深。幸好有两个小朋友驾舟玩耍,可是船太小,每次只能乘坐一个大人或两 个小孩。
最后,他们竟用这条小船全部过了河。你知道他们是怎样渡过去的吗?
解:他们渡河的办法是:

①两个小孩先过河,留 1 人在对岸,另一个小孩将船划回。
②一个战士上船,小孩留下。
③到对岸后,战士留下,对岸的小孩将船划回。 这样,重复①~③的办法,直至全部过河。 这个过程画成流程方框图,就更一目了然了。

24.分苹果

  妈妈买来 10 只苹果,她把盛苹果的篮子交给姐姐,说:“你们 5 个小朋 友,每人 2 只。但我要求篮子里要留下 2 个,否则谁也不准吃”。
  姐姐想了一会,真的按妈妈的要求将苹果分开了:5 个小朋友,每人 2 只,篮子里仍有 2 只。
你知道,姐姐是怎么分的吗?
解:姐姐让每个小朋友拿走 2 只,最后她连篮子和苹果一起拿走了。

25.乘车人数

  一天,同学和老师共同乘汽车到海滨浴场去,董尧尧发现车上的老师、 男同学、女同学加起来数目的和恰巧与三个数相乘的积相等。他编了一道数 学题,问乘车的一共是多少人?一些同学却解不出来。你会解吗?
解:
老师、男同学、女同学一共是 6 人。 即:1+2+3=1×2×3=6

              26.奶奶记错了

媛媛问奶奶:“电影票放在哪?” 奶奶说:“放在那本《快算技巧 100 例》的 53~54 页之间”。 “奶奶,你一定记错了!”媛媛十分肯定。 你知道,媛媛根据是什么?
解:因为 53~54 页是同一页书的两面,中间怎么能夹电影票呢?

27.看电影

  两个妈妈和两个女儿一同去看电影。可是她们只买了 3 张票,便顺利的 进了电影院。这是怎么回事?
解:因为看电影的就是 3 个人:奶奶、妈妈、孙女。

28.剪绳

  有人将一根绳子从中间用剪刀剪断,剪完后仍是一根绳子。这是怎么回 事?
  解:有两种可能:①这是一根首尾相接的环形绳子。②若不是环形绳, 必是中间有绳结,剪去的只是多余的结头。
  
29.散步

  尧尧和爸爸用均匀的速度在马路上散步。他们从第 1 根电杆到第 12 根电 杆,整整用了 6 分钟。
爸爸问:“仍用这样的速度,再过 6 分钟,我们会走到第几根电杆?” 尧尧说:“那当然是第 24 根罗!” “不对!”爸爸笑了。“你再想想!”
  解:从第 1 根到第 12 根电杆,用了 6 分钟。继续走下去,是从第 12 根 开始的,而不是从第 13 根开始的。因此,再走 6 分钟,只能到达第 23 根, 而不是第 24 根。
  
30.赶车

  火车站离出发地点 2 里,某人必须在两分钟内赶到才能乘上车。他先以 每小时 30 里的速度赶完 1 里,那么剩下的 1 里要用怎样的速度才能乘上车? 解:出发地点离火车站 2 里,要在 2 分钟内赶到,每分钟必须走 1 里。 他先用每小时(60 分钟)30 里的速度走完 1 里,这样的速度实际每分钟
走了:
30 里÷60=0.5 里 走完 1 里已经用了 2 分钟。 所以,他赶不上车了!

31.一只小船

  一只小船只能载重 100 千克。一个体重 100 千克的爸爸,带着他的两个 体重共 50 千克的孩子能用这只小船过河吗?
解:能。方法是: 先让两个孩子乘船渡河,至对岸时留下一人,另一人将船渡回,留下孩
子,让父亲乘船过河,到对岸后,再由原先留下的孩子将船渡回,而后两人 一起上船渡过对岸。

32.至少几只

  河里有一群鸭,一只的前面有两只,两只的后面有一只,还有一只在中 间,这群鸭至少是多少只?
解:至少 3 只,排成一列纵队。

33.剩下几支

  办公室里点燃着 10 支蜡烛,风吹灭了 2 支,过了不久,又吹灭了 1 支。 把门窗关好后,便 1 支也没有熄灭。请问最后还剩下几支?
  解:总数 10 支蜡烛,被风吹灭了 3 支,此后便一直燃烧下去了。说明 最后剩下的只有灭掉的 3 支,其余的都燃烧尽了。
  
34.烟商的损失

  一位顾客要买 2 元的香烟。他给了 5 元钱,烟商没有零钱可找,便向其 他商人兑换成 5 张 1 元的票子。顾客拿着香烟和找回的 3 元钱走了。一会儿 兑换钱的商人说那 5 元的钱是假的,烟商只得给他一张真的 5 元钞票。在这 个过程中烟商损失了多少钱和烟?
解:烟商损失了 5 元现金和价值 2 元的香烟。

35.留下几人

20 名运动员报数后,10~20 号退出,其余留下,留下的运动员是几人?
  解:你若脱口而出,认为留下 10 人,那就错了。因为 10~20 号退出, 说明在 10 号前的运动员都留下了,而 10 号前是 9 号,所以留下 9 人。
  
36.共有几只鸭

  河里有一行鸭,2 只前面有 3 只,3 只后面有 2 只,2 只中间还有 3 只, 这行鸭一共有几只?
一共有 5 只鸭子。

37.开出汽车

汽车站每隔 10 分钟开出一辆汽车,请问一小时开出多少辆汽车?
  解:一小时是 60 分钟,每 10 分钟开出一辆,加上开始开出的一辆,一 共开出:
1+60÷10
=1+6
=7(辆)

38.正数、倒数

  同学们排队去看电影,小明排在正数第 9 人,倒数第 10 人,这队一共有 多少个同学?
  解:小明排在正数第 9 人,说明他前面有 8 人,倒数第 10 人,说明他 后面有 9 人,再加上小明,这队的人数是:
(9-1)+(10-1)+1
=8+9+1
=18(人)

39.牧羊

  一个牧羊人,第一天发现少了 2 只羊羔,第二天发现又少了 2 只羊羔, 第三天他认真地寻找了一下,发现羊群中有一只披着羊皮的狼,原来羊羔被 这只披着伪装的狼吃掉了。请问,这狼一共吃了几只羊羔?
  解:第一天少 2 只,是把伪装的狼也当作羊数了,实际被狼吃了 3 只羊, 第二天实际就是少了 2 只,所以一共被狼吃了 5 只羊羔。
  
40.做工

  两个父亲和两个儿子做工挣了 3600 元,但当他们平均分款时,每人却得 了 1200 元。
你认为这样的事情可能吗?
解:可能。两个父亲和两个儿子是祖孙三人。

41.试卷相同

  在一次数学测验中,尽管老师监视很严,考试时间又很短,学生根本不 可能作弊。可是改卷时却发现两张完全相同的试卷。
你认为这种情况可能发生吗?
  解:人们受思维定势的影响,总以为凡是试卷都被学生做过了,却忽略 了会有一题没做交白卷的人。
有两个同学交了白卷,所以他们的试卷完全相同。

42.男孩女孩

  排队时要求在每一个男孩后面站一个女孩,同时每一个女孩后面要站一 个男孩。至少要几个人才能站成这样的队形?
解:两人。一个男孩和一个女孩背靠背地站着即成。

43.登楼

  某人从地上登上四层楼需要 3 分钟。他以同样的速度,从地上登上八层 楼需要多少分钟?
解:有人说 8 层是 4 层的 2 倍,用的时间也必然是 2 倍,即:3×2=6
(分钟)。这样答便错了!
  实际从地上到四层只爬 3 段楼梯,而从四层到八层却必须爬 4 段楼梯, 所以总共用 7 分钟。
  
44.哪车更近

  554 号列车以每小时 80 公里的速度从连云港开往徐州,513 号列车以每 小时 100 公里的速度从徐州开往连云港,当他们在途中相遇时,哪列车离徐 州更近些?
解:距离相等。

45.车过山洞

一列长 1000 米的列车,以每分钟 1000 米的速度前进。 请问,它穿过 1000 米长的山洞需要多长时间?
  解:车速每分钟 1000 米,通过 1000 米长的山洞,有人会脱口而出,1 分钟通过呗!
  其实他忽略车身长 1000 米这个因素。车头进入山洞到车身离开山洞,列 车运行的距离实际是“车身+洞长”,因而必须 2 分钟才能通过山洞。
  
46.烟向何方

如果列车以每小时 120 公里的速度向北行驶,此时南风的风速是每小时
30 公里。想想看,列车烟囱里冒出的烟应飘向何方?
解:因为车速快于风速,烟囱里冒出的烟仍是向南的。

47.药瓶装水

  用 100 毫升的药水瓶装水,因为瓶子的刻度没有到达瓶口,你有什么办 法只用这只瓶,知道它装满了水,水的体积是多少?
解:关键是求出瓶口没有刻度那部分的体积。 先不将水注满,量出刻度。再将瓶子塞上瓶盖倒立,看刻度减少了多少,
减少的数字便是没有刻度那部分的体积。加上 100 毫升后的得数便是满瓶水 的体积(1 毫升为 1 立方厘米)。

48.多少钱?

爸爸买来了一些橘子。 儿子问:“橘子多少钱 1 斤?”
  爸爸说:“我身上的钱,若买 3 斤余 2 角,若买 4 斤便缺 3 角钱。自己 算吧!”
儿子算不出。
你能帮他算算:橘子是多少钱 1 斤?爸爸身上是多少钱吗?
  解:从买 3 斤可以余 2 角,买 4 斤则少 3 角,可知若再给爸爸 3 角钱, 便可多买 1 斤橘子。说明橘子每斤的价是:2 角+3 角=5 角。从而爸爸身上 的钱也便可知。
(2+3)÷(4-3)=5÷1=5(角)????橘每斤价
5×3+2=17(角)=1.7(元)?????爸爸的钱

49.侦察过桥

  敌人在一条大桥的中间设一个了望哨,每隔 5 分钟巡视一次。桥上不准 任何人进出。
  侦察员小王想通过大桥,深入敌后。可是桥很长,约走 7 分钟。怎么办? 最后小王终于想出了办法,大摇大摆地通过了大桥。
你知道小王想了什么办法吗?
  解:敌人每 5 分钟巡视一次,可是通过大桥却需 7 分钟。这就是说,凡 是想进出的人,都不能逃出敌人的眼睛。过桥似乎是不可能的。
  但是侦察员小王却利用敌人每隔 5 分钟巡视一次的规律,悟出了过桥的 办法:他趁敌人第一次巡视刚刚进屋,便迅速过桥,等敌人第二次巡视时, 他已到达了望哨的另一侧,便迅速转过身来往回走,敌人自然要阻止他,令 他返回。这正是小王所希望的,便装着无可奈何的样子,再次转过身来往回 走。这样,便大摇大摆地通过大桥,深入到敌人的后方了!
  
50 挑出假币

  某人将一枚假银元混进了一堆真银元中,从外表上无法区分,只知道假 银元是灌铅的,比真银元重。
现在给你一架天平,要求在 50 枚银币中将假币挑出,至少需要称几次? 解:若每次称 2 枚,有可能需称 25 次。这种办法最笨拙。 较好的办法是:将 50 枚银币一分为二,各放在天平一端,假币必在重的
一端。然后,再将重的这段分成 12 和 13 两份,从 13 枚中取出 1 枚,若恰巧 取出的这枚就是假币,则天平两端必然平衡。这样只需两次便挑出了假币。 如果天平不平衡,则假币在重的一端,再将 12 平分两份再称??这样下
去,最多用六次便可以挑出假币。 所以,最少也需两次。

51 几只苹果

  妈妈从街上买回一篮苹果。她分一半给王大娘。路过姥姥家,又将余下 的苹果留下一半给姥姥。回到家时,将一半分给小华,余下的一半分给丽丽。 这时妈妈的篮子里只剩一只苹果了。你知道妈妈一共买多少只苹果吗?
解:这类问题用倒过来想很容易解决。 篮子里只剩一只苹果是分一半给丽丽后余下的,没分给丽丽时,应是 2
只苹果。这 2 只苹果又是分给小华一半后余下的,可知未分前有 4 只苹果?? 这样,一直追溯下去,便找到了答案。
解法 1:

解法 2:用分数解:

1×2×2×2×2=16(只)

1 ? ?1?

1? ? ?1 ?

1? ? ?1 ?

1? ? ?1 ? 1?

? ? ? ? ?
? 2? ? 2? ?
1 1 1 1

? ? ?
2? ? 2?

? 1? ? ? ?
2 2 2 2
= 16(只)
即:妈妈共买 16 只苹果。

          52.半数加半个

小明问:“王叔叔,你的西瓜是多少个?” 王叔叔笑着说:“第一个人买去半数加半个,第二人买去剩下的半数加
半个,第三个人买去第二个人买后的半数加半个,最后余下的被我送给了军 属张爷爷,仍是半数加半个。”
小明疑惑的问:“这么说,你的西瓜是切开来卖的了?” “切开?拿走的都是完整的呀!”王叔叔说。 小明皱起了眉:这是怎么回事呢? 解:王叔叔送给军属张爷爷 1 个西瓜:
           0.5+0.5=1(个) 第三个人买走了 2 个西瓜,之前王叔叔有西瓜:
        (1+0.5)×2=1.5×2=3(个) 第二个人买前,王叔叔有西瓜:
(3+0.5)×2=7(个) 第一个人买前,王叔叔有西瓜:
(7=+0.5)×2=15(个)
  这样,第一个人买 15 的一半又半个是 8 个。第二个人买余下 7 个的半数 加半个是 4 个。第三个人买再次余下 3 个的一半加半个是 2 个。送给军属张 爷爷的恰是 1 个。
  
53.难分的桃

一群猴子摘了一堆桃,便将它等分成几堆,可是总是分不均:分成 2 份,
余 1 个;分成 3 份,余 2 个;分成 4 份,余 3 个;分成 5 份,余 4 个;分成
6 份,余 5 个。 猴子摘的桃至少有多少个呢?
解:从几次分桃的余数看,总是缺 1 个。假如在这堆桃上增加 1 个,分
成 2、3、4、5、6 份都恰好整分,也就是这堆桃子加 1 后,便是 2、3、4、5、
6 的公倍数了!
  题中问这堆桃至少有多少个?只要求出 2、3、4、5、6 的最小公倍数, 再将加进的 1 个减去便是这堆桃子数。
2、3、4、5、6 的最小公倍数是 60。 所以这堆桃子是:60-l=59(个)。

54.六把空椅

  某人请客,来了许多客人。接着又来了三对夫妇,其中一对年轻夫妇没 带孩子,其余两对夫妇各自都带一个孩子。
  此时客厅里只有 6 把空椅子,主人刚要去借椅子,客人说:“不必了, 刚好够坐。”说着便都坐下了。
  大家一看,果然 6 把椅刚好坐满,而且每把椅子上只坐一个人,并没有 站着的。
你能说出这是怎么回事吗?
  解:按照常规思维,三对夫妇已经是 6 个人,再加上他们中带来的孩子, 应是 8 个人。
  可是事实是:6 把椅子刚好坐满,而且一椅一人,没有站着的,更没有 2 人坐一椅的。
真是怪事儿! 如果跳出常规思维框框,想到这三对夫妇间会不会存在某种亲缘关系,
也即父母与孩子的关系,便会豁然开朗:没带孩子的年轻夫妇,原来是另外 两对夫妇的孩子!这样,便恰好是 6 个人,正好坐满了 6 把椅子。
答案竟是这么简单!

55.至少几只猫

  小华抱了只猫从屋里出来,大声喊道:“妈妈咱们家来了一些猫!屋里 四个墙角,每个墙角蹲一只,每一只前面都有 3 只猫。”
“这么多猫呀!”妈妈也很惊奇,“一共是多少只呀?” “多少只你自己算嘛!”小华说。 妈妈思考了一会,说:“加上你这只,一共是 17 只吧!” 小华听了直摇头。
妈妈算的不对吗?为什么?
解:问题的关键是怎样理解“每只猫前面都有 3 只猫”这句话。 因为所谓“前面”,并没有距离的限制,紧挨着面前称“前面”,稍远
一些也称“前面”。所以,每一个墙角前面的猫都有 3 只猫在它的前面。这 样,屋内四个墙角四只猫,加上小华抱着的猫,总共只有 5 只猫。

56.装满水缸

  学雷锋小组每天给军属王奶奶送 4 桶水,王奶奶早、中、晚三餐用去 3 桶。
王奶奶的水缸能容 10 桶水,照这样,需要几天,水缸的水才能装满?
  解:你也许这样想:每天送 4 桶用去 3 桶,水缸里只剩下 1 桶。水缸总 共可装 10 桶水,10 天就满了!
这样便大错特错了!
  其实到第六天,水缸里已积存了 6 桶水,第七天再送去 4 桶,水缸便装 满了!
  
57.虫蛀的厚度

  一部书共两册,并排地摆在书架上:一只可恶的蛀虫,从第一册的第一 页咬起,一直咬到第二册的最后一页。两册书每册的内页厚 3 厘米,封面和
封底各厚 1 厘米。请你细心地算一下,这只蛀虫一共咬了多少厘米厚度?
4
小明的计算方法是:
1.两册书的内页共厚:
3×2=6(厘米)
2.两册书的封面和封底共厚:
1 ×4 = 1(厘米)
4

3.蛀虫咬的厚度是:

小明算得正确吗?

6+1=7(厘米)

  解:虫蛀的厚度,一些人的思路和小明一样,认为这样做是正确的,其 实却错了!
题中已经告知,两册书并排在书架上,蛀虫是从第一册的第一页,一直
咬到第二册的最后一页。实际第一册的封面和第二册的封底都没有咬透,咬 透的是两册书的内页和第一册的封底及第二册的封面。
因此,虫蛀的厚度应是:
1
3×2 + ×2
4
1
= 6 +
2
= 6 1 (厘米)
2

58.共用时间

  尧尧家离学校 300 米,他每分钟走 50 米。一天上学时走了 100 米时想起 忘了带劳动工具。便仍按原来的速度回家拿工具。
请问这次上学尧尧共用几分钟?
  解:因为尧尧走到中途又返回,一些人往往在这个关键处出错,有的算 成 10 分钟,有的却算成 8 分钟。
  其实,尧尧从 100 米处返回,再返回到离家 100 米处,共走了三个 100 米,离学校还有 200 米。
因此共用的时间是: 解法 1:

解法 2:

解法 3:

[(300-100)+100×3〕÷50=10(分)

(100÷50)×3+(300-100)÷50=6+4=10(分)

300÷50+100×2÷50=6+4=10(分)

59.六棒四形

  尧尧手里摇晃着 6 根小棒棒,高声地招呼着:“喂,喂,喂!比智力, 看本领,6 根棒能围四个三角形。”开始时,同学们以为他故意闹着玩的, 谁都知道,一个三角形有三条边,6 根棒围成四个三角形,简直是天方夜谭! 后来,尧尧竟认真起来了:“不信?咱们打赌。”同学们便围上来,叫 尧尧摆给大家看看。只见尧尧不慌不忙,胸有成竹。摆好后,大家一数,果
然是围成了四个三角形。 你能知道,尧尧的小棒是怎么摆放的吗?
  解:这个问题,按照常规思维是不可能的!在同一个平面上,6 根小棒 不论怎么摆,也无法围成四个三角形。
遇到“死胡同”,思路必须及时调整方向! 假如不在同一平面上,比如把有的小棒立起来摆会怎样呢? 只要思路跳到这一步,便可以找到答案了! 尧尧的摆放方法是:

  瞧,6 个小棒围成了立着三个三角形,加上平面上的一个,正好是四个 三角形。
  
60.杯子不坏

  “爷爷常常提出一些奇怪的问题”,宁宁说,“夏天我和爷爷在 100 米 高的楼顶上乘凉,爷爷拿着他手里的玻璃杯说,我把杯子扔向天空,当杯子 落下 100 米时却并没摔坏,这可能吗?”
“大家说,楼下是不是铺了很厚的棉花或海绵等极柔软的东西?” “爷爷说,不,是光滑的水泥地面。” “大家又说,那就是你这杯子很特殊。” “爷爷说,也不,是普普通通的玻璃杯子。” “大家都认为,这是不可能的。可是,最后听爷爷讲了道理,却是真的。” 你能说出是什么道理么? 解:爷爷提的问题真够怪的:普普通通的玻璃杯,从 100 米高的楼顶扔
下,落到水泥地面上还摔不坏,这怎么可能呢? 一般人都是这样认为的。
  遇到这种问题,要认真地推敲题中的条件。爷爷说的是:在 100 米高的 楼顶,把杯子向天空掷去,这就是说,玻璃杯离地面的高度必定是大于 100 米。
再看看爷爷的问题是什么:当杯子下落 100 米时,却并没有摔坏,这可
能吗? 啊!明白了!
杯子下落 100 米时,还没有到达地面哩,它怎么会坏呢?

61.磅秤称牛

  小朋友都知道曹冲称象的故事。曹冲是先把大象放在船上,记下水位。 再让大象下船,向船上放石头,使石头的重量与大象的重量水位一致,最后 称出石头的重量,把一个当时的难题解决了。
  现在有一头体重约七、八百斤的黄牛,准备宰杀。可是屠宰场只有一台 最多只称五百斤的磅秤,要求只用这架磅秤,称出牛的重量,应如何解决呢? 解:当然不能把牛杀掉,肢解以后再称,那样就没有思考价值了。
  牛的重量超出磅秤限量几百斤,又不准把牛肢解以后再称,这可真是个 难题。
只要开动脑筋想办法,总会找到解决的途径的。 想想,除了秤还有什么能称东西?天平也可以。不可能用天平称牛,然
而,天平称东西的方法,却给我们提供思路:它一端放砝码,一端放物品, 两端平衡,便称出了物体的重量。
  有了,在磅秤旁放一块与底座水平的木板,让牛前足踏在磅秤底座上, 后足踏在木板上,称出一个重量,而后再把牛调个方向站立,让它后足踏在 磅秤底座上,再称出一个重量,这样,将两次称得的重量相加,就是牛体的 总重量。
难题也便解决了!

62.天气情况

已经是晚上九点了,董尧尧仍在复习功课,外面忽然下起雨来了。 爷爷说:“尧尧,考考你,再过 48 小时,会不会出太阳?” 尧尧觉得爷爷在开玩笑:“我又不是气象员,怎么能知道两天以后会不
会晴天?” 可是当爷爷说出答案后,尧尧佩服得连连点头称“是”。 请问:爷爷怎么会知道 48 小时后的天气情况的?
解:寻找一个问题的答案时,必须细心地分析题中的所有条件。 尧尧忽略了爷爷问他的时候恰是“晚上九点”,因而便不可能断定 48
小时后会不会出太阳。
  从晚上九点开始,再过 48 小时,正好是第三天晚上九点,不论天气是阴 是晴,断定是不可能出太阳的。
  
63.巧分苹果

  奶奶拿来 16 只苹果,说:“把它分成三份,然后再吃。元元的要比倩倩 的少 3 个,却比尧尧多 2 个。谁算好了,谁先拿走”。
元元不会分,倩倩也不会分,最后还是尧尧给分好了。 你知道应该怎么分吗?
  解:根据奶奶的要求,倩倩比元元多 3 个,元元比尧尧多 2 个,则倩倩 比尧尧多 5 个。以尧尧作标准,从总数去掉 2+5=7(个),余下的除以 3 便 是尧尧应分的苹果。所以,
尧尧得:[16-(2+5)]÷3=3(个) 元元得:3+2=5(个) 倩倩得:5+3=8(个)

64.贵 1 元

  某人买一个瓶子和一个软木塞,共花 1.10 元。他问店家:“瓶子和软木 塞各是多少钱?”
店家回答:“瓶子比软木塞贵 1 元!”
“这么说,瓶子 1 元,软木塞 0.1 元喽。”某人答道。 可是,店家直摇头。你知道为什么吗?
解:如果软木塞是 0.1 元,瓶子 1 元,那么瓶子比软木塞贵 1-0.1=0.9
(元)了。所以这样的回答是错误的。 正确的算法应该是:
软术塞价:(1.1-1)÷2=0.1÷2=0.05(元) 瓶子价:1.1-0.05-1.05(元)

65.每打邮票

我们知道 5 角 1 枚的邮票每打是 12 张,你能知道 1 元 1 枚的邮票,每打应有多少张么?
  解:有人也许会回答:1 元 1 枚的邮票每打应有 6 张。因为 1 元是 5 角 的 2 倍,5 角的 1 打是 12 枚,1 元 1 打的张数必
缩小 2 倍。 这么回答便错了!
因为邮票不论面值大小,每打都一律是 12 张。

66.仅有 12 个

  我国有 12 亿人口,每人都有一个,而全国却仅有 12 个。你知道是什么 吗?
  解:每人都有一个属相:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、 犬、猪共 12 个。
  
67.长胡子山羊

  山坡上有 20 只山羊,其中母山羊有 12 只,你能知道长胡子的山羊是多 少只么?
  解:山羊不论公、母,都长胡子。题中并不是问公山羊有多少只的,所 以长胡子的山羊仍是 20 只。
  
68.查车票

  某人乘火车外出旅游。听说查票了,他忙掏出了自己的车票。列车员和 乘警走进了他所在的 3 号车厢后,看了他的车票。这时,他发现这节车厢里
的人有车票的只占 1 。
3
奇怪的是,列车员和乘警却什么也没说,便走了。这是什么原因呢?
解:列车员和乘警是负责检查车票的,可是车厢里的人有票的只占

1
,他们却不闻不问地走了,这现象确实奇怪。
3
原因是:一般人总认为车厢里会有许许多多的乘客。其实 3 号车厢中只
有这位游客,加上两位查票的才3个人,持票的只占 1 ,想到这一步,原
3
因便找到了!

69.取硬币

  一天,倩倩要猜谜语,爷爷却要她解一个难题:有一块 4 米见方的地毯, 平铺在地上。正中放着 1 枚硬币,不准用别的东西勾取,也不许踩在地毯上 或爬上地毯,只能亲自用手拿到硬币。
有什么办法可以解决呢?
  解:地毯 4 米见方,显然伸手是够不到的。不准勾取、不准踏上地毯, 初一看是无法解决的,如果地毯能变小些就好了!
想到这一步,问题就接近解决了: 从某一边开始,将地毯慢慢地卷起来,这样就可以根据要求,亲手取到
硬币了。

70.啤酒钱

  张伯伯在饭店吃饭,连啤酒共付 10 元钱。饭菜钱比啤酒钱多 4 元。张伯 伯喝啤酒花了多少钱?
  解:有人会这么做:10 元-4 元=6 元。便说饭菜用 6 元,啤酒用 4 元。 可是这样饭菜只比啤酒钱多 2 元了!
正确的做法是:
(10-4)÷2=6÷2=3(元)?????啤酒钱
   10-3=7(元)??????????饭菜钱 或:(10+4)÷2=14÷2=7(元)????饭菜钱
10-7=3(元)??????????啤酒钱

71.没有摔伤

  某人虽没有特殊本领,可是他从十层大楼的窗户中跳了出来,却没有摔 伤。这是怎么回事呢?
  解:十层大楼,人人都一下子联想到它有几十米高。但是题目中并没有 说明某人是从哪一层的窗户向外跳的。想到这一步,原因便找到了:
  某人是从第一层的窗户向外跳的,这样,并不需要特殊技术,自然也不 会摔伤。
  
72.无人让座

  五年级二班是个学雷锋先进中队,人人都文明礼貌、助人为乐。一次全 班乘汽车外出春游。中途上来一位瘸腿老人,可是全班 35 个同学没有一个起 身让座的,这是什么原因?
  解:按照常理,少先队员对一个身体不好的老人是应该让座的,更何况 事情又发生在学雷锋先进中队里。但是全班 35 人却没有一个起身让座的,着 实令人奇怪!
  感到奇怪是总认为汽车中已经坐满了人。如果汽车中本来就存在“空 位”,队员们还需要让座吗?思路跳到这里,原因便找到了。
  
73.老鹰叼鸟

树上有 10 只小鸟,被突然出现的老鹰叼走了 1 只,树上还有几只小鸟?
  解:若是问剩下的鸟,应有 9 只。问的是树上的鸟,应该是一只也不会 有,全部被老鹰吓跑了!
  
         74.锯三角板

一块三角形木板,锯去一个角,还有几个角?
  解:三角形板如果锯去一个角,它的角不仅不会减少,还增加了一个角, 这与普通的减法可不同。三减去一却变成四了。
  
75.蛙落水池

  一只青蛙掉进了水泥池里,池深 1 米,青蛙每次能跳 0.5 米。它多少次 能跳出池来?
解:两个 0.5 米便是 1 米。也许有人会说:两次能跳上来! 这样答是不符合实际的。其实,它永远也跳不上来。

76.海水上涨

  一人在轮船的舷梯上,距海面只有 100 厘米。此时海水每 5 分钟上涨 50 厘米。如果他不迅速离开舷梯,半小时后会怎样?
  解:半小时后海水上涨了:50 厘米×(30÷5)=300 厘米。此人原来距 海面只有 100 厘米。但是,不要忽略“水涨船高”这个因素,他不会被水吞 没的。
  
77.铅坯零件

  一个铅坯可以制一个零件,每 6 个零件的下脚料,又可再熔成一个零件 坯。现在有 36 个铅坯,共可做几个零件?
  解:36 个铅坯除做了 36 个零件外,下脚料仍可做 36÷6=6 个零件。第 二次制成的 6 个零件,下脚料仍能做一个零件。所以,36 个铅坯总共可以做 的零件是:
       36+36÷6+6÷6= 36+6+1=43(个) 你也是这么想的吗?
       
78.门牌号码

  董尧尧说,他家的门牌号码是个两位数,两个数字的和是 6,两个数的 积是两数商的 9 倍。
你能知道他家的门牌号码吗?
解:用尝试的方法便可找到答案。
从“号码是两位数,数字和是 6”,而 6 分解成两个数,只有三种可能:
①1,5 ②2,4 ③3,3。再根据“两个数的积是两个数商的 9 倍”来分析三 种情况,①与②两种组合都不符合要求,只有第③种组合是适宜的。
所以,董尧尧家的门牌号码是 33。 元元问倩倩:“今年几岁了?”

79.现在几岁

倩倩说:“我 3 年后的岁数是 3 年前岁数的 3 倍,是爸爸告诉我的。” 可是,元元却算不出。你会算吗?
  解:倩倩 3 年后的岁数是“现在的岁数+3”,三年前的岁数是“现在的 岁数-3”。据此,可以列方程。
设:倩倩今年为 x 岁,则
3×(X-3)=X+3
3X-9=X+3
3X-X=3+9
2X=12
X=6
即:倩倩今年是 6 岁。

80.矿石体积

  尧尧在海州的锦屏山上捡到一些小矿石。他想把这些大大小小的矿石体 积都算出来。可是这些小矿石一块块都是不规则形体。后来,他竟用一只 500 毫升的量杯把矿石的体积都算出来了。你知道他是怎么做的吗?
  解:尧尧先在量杯中注入一些水,记下水的刻度(体积),而后把矿石 投进水里,这时水的刻度必然升高。
  尧尧用水面升高后的刻度,减去未投矿石前水面的刻度,它们的差,就 是投进那块矿石的体积。这样,便可把一块块小矿石的体积都计算出来了。
  
81.间隔几人

15 位同学排成一列横队,从左边数尧尧是第 10 名,从右边数亮亮是第
10 名。 请你算一算:尧尧和亮亮中间隔着多少人? 解:可以这么想:
  从左数,尧尧是第 10 名;从右数,亮亮是第 10 名。10+10=20,可是全 部只有 15 人,说明多出的 5 人(20-15)是重复计数了,即,这 5 个人都被 数了两次。
  要求尧尧和亮亮中间隔着几个人,还应该再从 5 人中将尧尧和亮亮减 去。即:
10+10-15-2=3(人)

82.谁献书多

尧尧、亮亮和元元都有一些课外书。尧尧的书比亮亮的书多,亮亮的书
比元元的书多,他们各自拿出 1 献给班级图书箱。谁献的书最多?
       5
解:因为各人所有的课外书数量是: 尧尧的书>亮亮的书>元元的书。
所以,各献出 1 后,仍是:
5
尧尧书的 1 >亮亮书的 1 >元元书的 1 。
5 5 5
可知,尧尧献出的书最多。

83.俐俐的钱

宁宁和俐俐两人共有 18 元钱。如果宁宁把自己的钱平均分成 3 份,拿出
1 份给俐俐。那么,俐俐的钱就是宁宁剩下的钱 3 倍还多 2 元。你能知道俐 俐原来是多少钱吗?
解:宁宁将钱拿出 1 份给俐俐,俐俐若去掉 2 元,便正好是宁宁剩下钱 的 3 倍了。如图:

从总钱数去掉 2 元后,两人的钱正好相当于宁宁剩下钱数的 4 倍
(3+1=4)。所以, 宁宁的钱原有:
(18 – 2 )÷(3 + 1)÷〔1 – 1 〕 = 16÷4 ÷ 2 = 6(元)

俐俐原有的钱是:

3 3

18-6=12(元)。

84.牛奶和水

尧尧倒满一杯牛奶。喝了 1 后,再倒满水,又喝了一杯的 1 ,又倒满
6 3
水后喝了半杯。最后用水加满杯,一次喝干。 尧尧喝的水多还是牛奶多? 解:尧尧喝的水与牛奶的总量其实与怎样喝法没有关系。
  因为喝下去的牛奶,总量是一杯;喝下去的水,总量也是一杯。是同样 多的。
即都是:

1 1 1
+ +
6 3 2

1 2 3
= + + = 1
6 6 6

85.什么时间

  某人夜里醒后,听到钟声敲了一下,大约过了数十分钟,又敲了一下, 再过了数十分钟后,又敲了一下。他家的钟并没有毛病。你能判断第三次敲 钟是什么时间吗?
  解:自鸣钟报时,都是每隔数秒钟敲一下。可是某人夜里听到的三声敲 响,却是相隔数十分钟,他家的钟又没有毛病,这究竟是什么原因呢?
  首先断定当时不会是三点,也不会是两点,因为敲钟的间隔不同平常。 若是午夜一点半,只有两声,且间隔是 30 分钟,那么第一声是怎么回事呢? 对了,是刚醒后听到的,那时正是午夜 12 点半的一响被他听到了。
由此可断定:当时正是 1 时半。

86.喜鹊和麻雀

  树上有 4 只喜鹊,还有 5 只麻雀。后来飞走了 5 只。请问:这 5 只中至 少有几只麻雀?
  解:因为喜鹊总共只有 4 只。假定这 4 只喜鹊全飞走了,那么,5 只中 至少要有 1 只麻雀。
  
87.方阵人数

  一队战士排成方阵。战士小王的前、后、左、右,数到他都是第四。你 能知道这个方阵总共有多少名战士么?
  解:小王的前、后、左、右人数相等,说明他正居方阵正中,数到他是 第四,说明他前、后、左、右各有 3 人,连他自己便是 7 人,也即方阵的边 长。
可知总共有战士:7×7=49(人)。

88.董尧尧换书

  暑假里,董尧尧拿着一些课外书与同学交换着看。每到一位同学家,就 把自己从家里带出的书一半送给同学,这位同学又把自己的书送给尧尧一 本。就这样,尧尧到了几位同学家。当他高高兴兴回家时,手里还剩下 2 本 书。
想一想,董尧尧开始时从家里拿出多少本书?
  解:尧尧回家时拿着的 2 本书,其中 1 本是最后一位同学给他的,另一 本是自己从前一家带来的书拿出一半后剩下的。依此追溯上去,可知他开始 时从家里拿出的书也是 2 本。
  
89.打乒乓球

  尧尧、亮亮和元元,三人一起练乒乓球。他们约定只玩 1 小时,两两对 打,每人玩的时间要相同,请问:他们每人各打多少分钟才合理?
  解:因为是双人对打,每人都要打两次,所以约定时间是 1 小时,按一 个人计算便是 2 小时了。
每人打的时间一样长短,就是由 3 个人来平分 2 小时的时间。即,
          60×2÷3=40(分) 也就是,每人可以打 40 分钟。
          
90.对时

  尧尧一觉醒来,床头的小钟却静止在 5 点上了。他忙上足了发条,可是 却不知应该调在几点上,只得到朋友家去看钟点。
  朋友家的电子钟是十分准确的。他看了朋友家的钟,回家后稍一计算, 便把钟拨准了。
你能知道尧尧是怎样判断和拨准小钟的么?
  解:尧尧已经把停钟上足了发条,便可知道钟上的离家时间和回家时 间。
  到朋友家去,可从朋友家的钟上知道从到达到离开时共耽搁了多少时 间。
  从离家的全部时间减去在朋友家的全部时间,得出往返路程的时间,只 要知道到朋友家单程所用的时间,便可把自己的小钟拨准了。
  
奇趣游戏

  数学游戏是根据数学的法则、规律编制而成的寓学于乐活动资料,内容 生动有趣,扑朔迷离。局外人常常苦思不解。揭穿了秘密,却又令人恍然大 悟。
数学游戏形式很多。有猜数、猜谜游戏,对奕游戏,演示游戏,等等。 猜数游戏是要对方按规定要求,进行一系列运算。尽管各人开始所写的
数各不一样,但结果都在表演者预料之中。 演示游戏是借助必要的工具,如图、表、骰子之类,要对方在规定的器
具上选数。表演者的器具是运用一定的数学原理编制而成的,根据对方提供 的信息,通过简单的运算,便可猜中对方的所选。
  对奕游戏,是两人或多人按照一定的程序,取数或移动棋子,而后决定 胜负。
  数学游戏,既可娱乐身心,令人兴味盎然,又能活跃思维,增长智慧, 从中更可以领悟到数学的无穷妙趣。
  
1.瞒不住

  表演者说:“咱们都做过‘虫蚀算’的题目了,现在请各位任意写一个 多位数。”
他的话音刚落,有人说:“写好了!” “那就请你把这个数的各位数字加起来。”表演者说,“从你写的多位
数中减去这个和。在减得的差中,你随便瞒下一个数字,把余下的数字告诉 我,我能马上猜出你瞒下了几。这就叫‘瞒不住’。”
大家觉得很玄乎,便纷纷按照要求写数、计算了。 俐俐写的数是:4567923。
按要求计算过程是:
4+5+6+7+9+2+3=36
4567923-36=4567887
他将 8 字瞒了一个,告诉表演者余下的数字是:4、5、6、7、8、7。 只见表演者稍一思索,果断地说:“8 字被你瞒了一个。” 众人问:“是么?”
俐俐惊诧地点点头。
接着,玲玲说:“我计算的结果瞒了一个,还剩 3、2、4、5、6、7。” 原来玲玲这次写的是:7654321。
计算过程是:
7+6+5+4+3+2+1=28
7654321-28=7654293 她颠倒着将数字报了出来,暗暗地瞒下了 9。 只见表演者马上回答说:“你瞒下的数字若不是 0,必定是 9。” 果然瞒不住!
众人奇怪:表演者掌握了什么诀窍呢?
解:任何一个多位数,减去它自身的数字和,所得的差必定是 9 的倍数。 根据被 9 整除的数的特征,表演者只要将对方报出的数加起,看所得的
和与 9 的倍数相差几,差数便是被瞒住的数。
如俐俐报出的数是 4、5、6、7、8、7,这几个数字和为 37,而比 37 大
的 9 的倍数是 45,37 比 45 少 8,所以断定被瞒下的数字是 8。 玲玲报的数字和是:3+2+4+5+6+7=27,27 恰是 9 的倍数,对方若
瞒下的不是 0,则比 27 大的 9 的倍数是 36,36-27=9,所以,瞒下的非 0
即 9。

2.只抓尾巴

  表演者举起一张数字卡片,上面写着“667”。接着说,这是他的“数字 侦探”。
众人忙问:“它能侦探什么?” 表演者说:“当然是侦探数字喽!三位以内的自然数,只要尾巴被它接
触到,它就侦探出这个数的全部!” “咱们悄悄地写下一个数,它也能侦探出吗?”有人怀疑地问。 “那当然!”表演者说,“你们尽管写吧,一位数、两位数、三位数都
行!” 众人纷纷报告:“写好啦!”
  表演者说:“请把写的数与我的秘密侦探 667 相乘,只要把积的尾数告 诉我,抓住了尾巴,各人原先写的数,我便全部知道。”
  有人怀疑:咱们写的数千差万别,位数也各不相同,667 能有这么大的 神通?
  表演者见观众迷惑的神情,忙接着说:“与 667 相乘,积的位数肯定不 少,但是我要的尾数却不多:你写的若是一位数,就只告知我积的最后一位; 是两位数的,也只要积的最后两位数;是三位的,只要积的最后三位数。”
表演者刚交待清楚,报数的便此起彼落:
“我的尾数是 9!”
“那你写的一定是 7。”表演者随口应答。 “我的尾数是 82。”
“你写的是 46!”
“我的尾数是 442。” “你写的是 326!”
??
一问一答,速度快得像爆米花,没有提出不同意见的。 表演者十分自信说:“我的侦探 667,只要抓住一点信息,便能迅速顺
藤摸瓜,使全部真相大白,从来没有失误。”
众人不解:667 是怎么侦探的呢?
  解:667×3=2001,任何三位以内的数与 2001 相乘,积的尾数必定仍 是原数。
表演者要求用对方所想的数与 667 相乘,他只要将对方告知的尾数再乘
以 3,则必然是原数了!
如对方告知尾数是 9,9×3=2 7 ,可知对方想的数是 7 即 667×7=
4669。

3.魔钟

  表演者拿着一个自己制作的画在硬纸上的钟面,神秘地说:“别看我这 钟面很不起眼,可是,它却是个魔钟!”
“魔钟?怎么个魔法?”众人齐声问。 “这钟面上共有十二个数字,”表演者说,“你在心里随便记一下,我
用小杆在数字上点几下,就知道你心里想的数是几。” 大家听了兴趣倍增,都想立即试试。 表演者说:“是这样,我在钟面上点一下,你就把所想的数加上 1,当
你加到 20 时,我的小杆必然指在你所想的数上。” 有趣!果真是这样,那真的是魔钟了!大家将信将疑。 “那就试试吧!”表演者将钟面挂在墙上,面露笑容,充满自信。 一位观众在心里默默地记下 11,表演者用小杆在钟面的数字上点点敲
敲,如同让小杆与数字对话一般。
最后,正当观众默数到 20 时,表演者的小杆恰巧落在“11”上! 后来众人悄悄地商定默记“4”。 只见表演者又用小杆在钟面上敲点了起来,他每敲点一次,观众就在心
里默默地加上 1,从 4 开始,恰加到 20 时,表演者的小杆又落到 4 点上不动
了。
众人迷惑不解:真是个魔钟! 解:表面上看,表演者用小杆随意敲点的,实际他是按照一定律指点的。 钟面上只有 12 个数字,要点到 20 为止,则表演者便用 20-12-1=7。
为什么这样呢?因为点数是从对方默记的数开始的,20 便是对方默记的数+
12+自身重复 1 次的和。
  表演者在开始点数时是随意的,当点完了 7 后,便必须从 12 点开始,按 逆时针方向点下去,当对方默数到 20 时,表演者的小杆必然落在默记的数 上。
如对方默记“4”。表演者随意点 7 次,4+7=11,到此,表演者必须从
12 开始,按逆时针顺序往下点。当小杆指到 4 时,自然便是对方所默记的数 了。
若对方要求数到 21 为止,则 21-12-1=8,开始的 8 次可以任意点,
到第 9 次,便应从 12 开始按顺序敲点了。

4.你算我取

表演者拿出一副扑克牌。 “哈,要比赛扑克呀?”有人问,“是抓乌龟,还是争上游?” 表演者说:“咱们玩的都是和数学有关系的,不仅可以娱乐身心,还能
促进思维、启迪智慧!” “那就更好啦!怎么玩法?”大家争相询问。
  “这么办吧:你们在 A~K13 张牌中任意默记一张。”表演者说话间将扑 克交给了观众,“我说算式,你们计算。最后,我便能从这副牌中,将你们 默记的那张牌取出来。”
这游戏也挺新鲜。 大家便取出一张“6”默记在心,然后把牌插入,又认真洗了几遍,交给
了表演者,忙说:“快取吧,我们记的是哪一张?” “咱们这个游戏叫‘你算我取’,你们还没算呢!”表演者说,“把你
们刚才记的那张牌的点数,乘以 2,加上 3,再乘以 5,最后减去 25。将结果 告诉我。”
大家很快在心里算出了结果:
(6×2+3)×5-25=50 忙说:“这么算结果得 50!”
表演者听后,胸有成竹地展开了牌,从中检出一张,高高举起。
众人一看,果然是“6”! 重新试了几次,表演者每次都正确地取出对方所默记的牌。真是奇妙! 解:假设对方默记的点数为 x,根据表演者的要求,列成方程是:
(2x+3)×5-25=50
10x+15-25=50
10x-10=50
10x=60
               x=6 根据方程式的特点,表演者可以随自己需要,要求对方将默记的数进行
加、减、乘、除。如要求对方将默记的点数乘以 8,加上 12,除以 4,再减
去 5,则可列方程式:
(8x+12)÷4-5=2x+3-5=2x-2 这样,假定对方告知你最后的结果是 22,表演者便作如下的运算:(22
+2)÷2=12。因为这 22 是对方默记数的 2 倍减 2 得到的,再倒推回去,自 然便是他们默记的数了!

5.心心相印

  表演者仍拿着一副牌,向大家说:“现在不必计算了。你们任意默记一 张,就以它作基数,我抽出一张牌,你们就默默地加上 1,我再抽一张,你 们又加上 1??这样,我抽了若干张牌后便停止了。奇怪的是,我最后抽出 的这张牌竟然与你们默记的那张牌点数相同。–这就叫‘心心相印’”。
  表演者说罢,将扑克牌展成扇形,请观众背着他任抽一张。众人抽了张 “9”,随即又插进全副牌中,并将牌洗了几次。
  表演者说:“现在开始,我从这副牌中拿一张,你们便在基数上加 1?? 当你们数到‘25’时,请说声‘停’。”
于是,表演者一张一张地抽牌,众人心里默默地往 9 上一个一个地加。 一会儿,众人说:“停!”
这时,只见表演者抽出的一张恰巧是 9 点! 果然心心相印:大家默记的数与表演者最后抽出的数,都是 9 点!
  解:到 25 停,就是众人默记的牌点与表演者抽牌张数的和是 25。扑克 牌最大的点数是 13。25-13=12,当表演者抽到 12 张牌时,连同基数的那 张牌恰是 13。
到这时,表演者不能再随意地抽牌,必须从 K(13)开始,按逆序数从
大到小顺次抽牌,当对方要求停止时,必然抽到点数与对方默记数相同的点 数。

6.底牌总和

  表演者拿着一副完整的扑克,非常自信地说:“这副扑克,你们可以任 意将它分成几堆,我虽然没有看见各堆最底层那张扑克的点数,但是我能将 各堆最底层那张牌点数的总和都算出来。”
这简直太神奇了! 众人便取来了全副扑克,动手分牌。
  “还有几个问题需要说明。”表演者说,“第一,请把 A、K、Q、J 和大 王、小王都当作 1;第二,底牌是几点,便用它作基数,每添一张算加 1,到
10 为止,算作一堆,每堆都是这样堆法;第三,最后要告诉我共分几堆,并 把无法成堆的余牌交给我。
众人明白了要求后,便秘密地分牌了。
  他们分别以 A、Q、5、4、3、6、7 作为底牌基数,共分成了七堆。最后 余下 2、4、9、Q 不能成 10,作为余牌,交给了表演者。
  奇怪的是:当表演者知道共分七堆,并接过余牌后,稍做思索,便说: “底牌点数的总和是 27!”
众人随即翻开底牌,逐个累加,果然是 27。 即:A+Q+5+4+3+6+7
=1+1+5+4+3+6+7
 =27 大家重新分堆,又表演了几次,表演者的答案百发百中。 表演者是怎么知道的呢?
解:按照表演者要求的那样,各堆牌存在一定的规律:每堆的基数增加
1,这一堆的张数便减少 1。例如底牌是 1 的堆是 10 张,底牌是 2 的堆只有 9 张了,底牌是 8 的堆只有 3 张。又因每堆至 10 张为止,增加一堆,底牌总和 便增加 11。全副扑克总计 54 张。
由此,可得出计算公式如下:
底牌点数总和=堆数×11-(54-剩余张数)
      =堆数×11+剩余张数-54 根据这个公式,题中的算式是:
7×11+4-54
=77+4-54
=27

7.数字长龙

表演者说:“咱们来搞个数字长龙吧。”接着他交待了方法:“一共需
要 11 个人参加写数,第一个人写一个不是 0 的数;第二个人写一个与第一个 人不相同的数,也不准写 0;第三个人写的数,必须是他前边两人所写数的 和;第四个人写的数,又必须是二、三两人写数的和,以后都按这样的规律, 即后一人写的数是他前两人写的数的和,一直到第十一个人为止。”
众人齐声说:“明白了!” “这样,数字长龙写好后,我只问第一个人和第八个人写的数,便可立
即告诉大家:这十一个数的总和来。”表演者补充说。 于是有十一个人,他们秘密地写下了:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ (11)
4 7 11 18 29 47 76 123 199 322 521 表演者问:“第一个人写的数是多少?”
回答:“4”。 “第八个人写的数是多少?” 对方答:“123!”
表演者立即告诉大家:你们 11 个人写出的数,总和是 1357。
  大家似信非信,有的用笔,有的用计算器,进行计算验证,折腾了好一 会,果然准确无误!
接着,这 11 个人又重新变换写数,尽管数字排得像长龙,总和不用说就
更长了!可是表演者仍然只问第一、第八个人写的数,便立即说出 11 个人写 数的总和了!
解:如果把题中的数字转化成式子,第八个数与总和间的关系,便一目
了然。
  设第一人写的数为 a,第二个人写的数为 b,则 11 个人写的数,便分别 为:
① ② ③ ④ ⑤ ⑥ ⑦
4 7 11 18 29 47 76
a,b,a+b,a+2b,2a+3b,3a+5b,5a+8b,
⑧ ⑨ ⑩ (11)
123 199 322 521
8a+13b,13a+21b,21a+34b,34a+55b
相加的结果,十一个数总和为 89a+143b=(8a+13b)×11+a,其中
8a+13b 恰好是第八个数,乘以 11 又可以简便计算,因而表演者便很快求出:
123×11+4=1353+4=1357

8.十问知底

表演者说:“上面是 11 个人写数,只有 11 个数。假如扩大范围,在小
于 1024 范围内任想一个数,让你猜,你需多少次才能猜中?” “这可很难说了,”有人回答说,“把所有的数问遍,需一千零二十四
次,准猜中了!” “那还算什么能耐?”表演者说,“我最多只提十个问题,对方也只需
要回答‘是’或‘不是’,便可以了。” 有人想了个“187”,说:“我想好了,允许你问一百次,看能猜中不?” 表演者说:“最多十问,大家可以作证。”
于是问答开始了。 表演者问:“大于 512 么?” 对方答:“不是!”
“大于 128 么?” “是!”
“大于 192 么?” “不是!”
“大于 160 么?”
“是!”
“大于 176 么?” “是”
“大于 184 么?”
“是!”
“大于 188 么?” “不是!”
“大于 186 么?”
“是!”
表演者大声说:“你想的数在 188 和 186 之间,肯定是 187 了!” 果然没用十问便猜中了!
表演者提的问题,隐含着什么奥妙呢?
解:表演者的问题巧妙地利用了“折半”策略。
1024 连续“折半”的结果是:512、256、128、64、32、16、8、4、2、
1 共十个数。 表演者先折半提问,根据对方回答的“是”或“不是”,用加加、减减
折半数字,逐步缩小猜数范围。如问:“大于 128 么?”对方答“是”,则
在 128 上加它的半数(128+64=192)再问,对方答“不是”,则减去 64 的折半(192-32=160)??这样继续问下去,最后便“水落石出”了!
折半思想,有着重要的应用价值。 例如,某地的地缆线忽然中断了,数千米长的距离,怎么查找故障?
1
用“折半”思想便很容易解决。查线员先在发生故障地段的 处进行
2
测量,确定故障在哪一端,在有故障的一端,仍取它的 1 处测量??依此
2
检测下去,逐步缩小范围,最多抽查十处,故障的准确位置便可找到了!

9.召之即来

表演者说:“新学期开始,大家都喜欢一些吉祥话语,互相祝贺,是吧?” 众人齐声说:“当然啦!吉利话让人听起来愉快、舒畅!” “我可以用数学语言把大家喜欢的吉祥语呼唤出来!”表演者说。 有人说:“我想在新的一年里‘万事如意’!你能召来吗?” “万事如意!好!”表演者说,“数学语言就叫做 3451 吧!” 接着表演者要求:“凡是要求这个祝贺语的人,都把自己年龄告诉俐俐,
由俐俐算出大家年龄的和。” 一会儿,俐俐回答:“算好了!”
  表演者说:“请男同学将这个和用 3 乘,再加上自己的出生年、月、日 数,比如 1982 年 7 月 5 日生,便在年龄和上加 1982、7 和 5,再将自己身高 的整厘米数(零头不计)也加上。
  “女同学将年龄和用 2 乘,也加上自己的出生年数、月数、日数和身高 的整厘米数”。
不一会,各人都说:“也算好啦!”
  表演者接着说:“因为数字 9 最大,9 本身就是吉祥数,请各人将自己 的得数用 9 乘,最后把积的各位数字加起来,直到得出一位数为止。”
按照要求,俐俐的计算过程是:
1.全部参加人的年龄和是:67 岁。
2.用 2 乘这个和(俐俐是女的),再加自己的出生年月日和身高:
67×2+1983+6+13+143=2279
3.乘以 9:2279×9=20511
4.积的各位数字和:2+0+5+1+1=9 表演者说:“算好了,我们便请‘万事如意’出来:请各人将得数再乘
以 300,加上 751!算好的,请报结果!”
俐俐计算得最快:
5.9×300+751=3451! 紧接着,人人都异口同声地说:“得数是 3451!” 于是大家手舞足蹈,高声呼喊:“3451–万事如意!”
解:这仍是根据被 9 整除的数的特征设计出来的。在得出“9”之前的
各种运算:年龄和,出生年月日??都是表演者故意设计的迷魂阵,实质是 要把得数乘以 9,再求积的数字和。
  一旦求出了积的数字和(也必然最终得 9),便可根据需要,随心所欲 地安排算式,直至使它得出预定的数字。
  如:可以要各人用加得的 9 去除 27000,得到的商再加 451,这样,同样 可以得到 3451。
  表演者说:“以往每次我们都只猜一个数,现在我来表演一次连猜两个 数。”
每次猜一个数已经很不容易,连猜两个数就更玄乎了。可能吗? 只见表演者从容地说:“你们各人可以任写一个比 1 大的一位数。” 话音刚落,众人说:“写好啦!”
  “将你写的数减去 1,再乘以 5,再减去 2,再乘以 2。”表演者一句一 顿地交待方法。
  
瑶瑶写的是 9,按要求,他不停地计算:
     9-1=8 8×5=40 40-2=38 38×2=76 表演者接着说:“在得数上再随意加上一个自然数。将结果告诉我。” 瑶瑶加上 4:76+4=80,便大声报告:“我的得数是 80!” 表演者沉着地说:“你先写的数是 9,后加的数是 4。”
果然连猜两数! 接着,其他人也报告了结果。尽管各人开始写的数和最后加上的数,都
各不相同,但是一个个都被表演者准确地猜中了。 大家非常奇怪,表演者是怎么知道的呢? 解:根据表演者确定的规则,设参加者先后写的两个数为 x 和 y,可列
为:
[(x-1)×5-2]×2+y
化简后为:10X-14+y
  其中 x 为十位数,y 为个位数,当对方报出的数加上 14 之后,便恢复了 原数。
  如对方报出结果是 80,表演者便在心中算出 80+14=94,十位数 9 便是 原先写的数,个位数 4 便是后加的数。
若对方原先写的是两位数,表演者计算后,个位是其后加的数,剪掉个
位,余下的数便是原先写的数。
如对方写 15,依规则,运算过程便是:
15-1=14 14×5=70 70-2=68
68×2=136 136+7=143
表演者的算法是:
143+14=157 便知对方后加的数是 7,原先写的数是 15。

apache RewriteMap MapSource自定义规则使用手记

10.1期间,一位朋友问我一个apache的 Rewrite规则中一个高级语法RewriteMap的用法问题。其想要实现的是这个功能,有个多用户的blog,用户访问的时候,是用三级域名访问的。比如http://cfc4n1.blog.cnxct.com,http://cfc4n2.blog.cnxct.com这种三级域名。在服务器上,是对三级域名做泛解析。每个三级域名都生成了一个静态的html主页文件。由于用户数量较多,linux ext硬盘格式上同一目录文件太多,检索文件的速度会有折扣,遂将文件打散到不同的目录下。打散方式是以用户名【三级域名中的cfc4n1,cfc4n2等】的MD5值的每隔两位作为一个目录。MD5的默认长度是32位,每隔两位分一次目录的话,那就有16级目录。每级目录的目录名是2个字符,每个字符的有16种可能【0-9a-f】,那么每级目录的目录数为256个目录,16级的话就有4096个目录。每个目录存1000个文件的话,可以存放4096000个文件,这样做,即可以把文件均匀打散到各个小目录中,同时,每个目录下的文件数又不是很多。当用户访问的时候,取目录里的用户名,计算MD5hash,做字符分割,重写到对应的目录下的文件中,如果文件不存在,则重写到生成这个文件的动态页面中。

到apache手册里找了下RewriteMap的用法

RewriteMap MapName MapType:MapSource

遂顺手在.htaccess里这么写了

RewriteMap cfc prg:/var/www/1.php
RewriteRule ^([a-f0-9-]+)\.blog\.cnxct\.com ${cfc:$1} [L,PT]

然后访问一个三级域名试试。结果提示500 http 错误。到apache日志里看到如下

/var/www/.htaccess: RewriteMap not allowed here

搜了半天,不知道是什么错误,只好再次看手册,这时候,才发现rewritemap的作用域却是server config, virtual host,真汗了一下。自己没认真看手册。
改到virtual host里之后,重启apache,结果,还是http 500。再到错误日志里查个究竟。里面记录的确实(13)Permission denied: mod_rewrite: could not start RewriteMap program /var/www/1.php。呃,权限,权限。。赶紧chmod了一下。再次启动,却提示404。。。 /0a/c1/…./…html那种MD5字符串切割之后的文件找不到。但目录里确实是存在的啊。又到日志里查看,原来却是/0a/c1/…../…html\r 文件无法找到了。为什么地址后面多个\r呢?打开MapSource的脚本文件,才看到里面PHP操作流的结束字符里是“\r\n”了,去掉\r 才可以。

总结一下使用APACHE URL REwrite的RewriteMap方法要注意以下几点:

  • 作用域-server config, virtual host,其他配置里无效。
  • 自定义规则MapSource中流的结束符要跟操作系统符合,linux的要用“\n”,同时,切记在win平台编辑脚本传到linux上的时候,文件换行符要用linux格式的,不然,同样会出现问题。
  • 要给apache赋予对脚本的读权限。
  • apache会在启动的时候,将自定义规则的脚本读取到内存中,之后,再次修改脚本时,不会立刻生效,需要重启 apache
  • apache 的error.log中会记录[warn] mod_rewrite: Running external rewrite maps without defining a RewriteLock is DANGEROUS!这样的错误日志,在apache2.conf【我的系统是ubuntu,其他linux在httpd.conf中】中添加RewriteLock /etc/apache2/script/cfc.lock来指定RewriteLock的文件位置。记得给apache对script目录下有读写权限。

自定义脚本的代码格式如下:

<?php
while($in = trim(fgets(STDIN)))
        fputs(STDOUT, getfile($in)."\n");
function getfile($str)
{
//函数判断文件是否存在等逻辑
}
第 1 页,共 20 页12345...1020...最旧 »

CNXCT小组的博客 is Stephen Fry proof thanks to caching by WP Super Cache