这几天真的是忙到爆掉……但是总还有一个期待:我们公司苏州项目的重建计划明天就要报送总部批。到晚上8点,终于将林林总总的材料全部上传、分发。明天一早去上海再进行一些最终的准备,下午进行“过堂”。
晚上离开办公室的时候,和我苏州的老板开玩笑:晚上你要回去烧香,祈祷明天能一次性过!她淡定的说:你以为我没有烧过咩?
好吧……
晚上到家,匆匆吃好饭——一口气吃了四个面巾塞肉——再看看PPT,写点notes,准备明天“领导”们可能的问题。不能出错啊。
今天是周末,晚上没有逼着他写作业,我们两个吃西瓜。
他随口说了一句:这个西瓜怎么这么多籽啊!说了这句后,大概是马上反应到我和他有“每日一问”的习惯,同时觉得如果刚才的那句话被我认为是他今天的提问,会不会太简单,所以马上接了一句“诶,我要想想今天的问题!”
我接过他的话头,说他其实已经问了一个很好的问题。
大自然中的植物要靠种子来繁衍。对于一般的植物来说,不能移动、无法抵抗动物的吞食,它们要生存繁衍,需要用一种策略,就是大量的种子的散播。即使大部分种子在散播后无法继续生长成新的植物,但是种子的数量实在巨大,所以总有可以“漏网”的,然后再担负起新的繁衍的任务。
西瓜是这样、蒲公英也是这样。
随着进化,动物一次繁育的后代数量就没有那么夸张了。老母猪可能一胎生10几头小猪,而老虎、狮子一胎一般只有一个后代,人也是如此,大部分是一胞胎,会有双胞胎,三胞胎以上就很少见了。
这实际是个食物链的层次(hierarchy)的反应。越是在食物链高端的,一次繁衍后代的数量就相对大幅减少。
于是我顺便给他讲了一下食物链中的任何一个链条都不能丧失的情形。
他说,那么食物链最高端的灭绝会如何呢?这个问题很容易解答。
他最后问,人是不是在食物链最高端?如果人灭绝了会怎样?
我几乎是不假思索的回答:人当然是在食物链最高端。人灭绝了也会有灾难。
Peter又追问道:会有怎样的灾难呢?
我这时也突然感觉到有点不对。
人要是灭绝了,会怎样?也许地球会变得更好也说不定啊……
这两天在试着看Go语言,Go语言的文档很丰富——但是是英文的,我看当然没有问题,但是有几次恶作剧的想,能不能修改一下把各个内置库函数的说明改成中文呢?
我随便找了一个proc.go文件,将其改为UTF 8编码,然后修改其文档为中文,在命令行下效果是这样的:
这个当然不好。我搜索了一些站点,在这里找到了解决方案:
http://pjq.me/wiki/doku.php?id=tips:enable-utf8-cmd
最终效果是:
最好玩的就是看老彼得拼命想问题……
昨天提了一个比较中规中矩的问题:电脑是怎么发明的。
这个问题是我比较擅长回答的。所以我从Eniac开始,讲到图灵,讲到电脑处理的三个要素:输入、处理、输出。
===
星海学校今年的电脑课是Logo语言。这是一门“古老”的语言。
今天老彼得问了两个问题:世界上最富有的人是谁?世界上最便宜的货币是什么? 这两个问题查了百度都有答案:
于是他接着问道什么叫通货膨胀。
我简单的解释道就是货币发行量远远超过了社会物质总量。
于是他接着问为什么在考虑了货币汇率后,美国的物价还是比中国低?
这个回答分两部分:一部分是通货膨胀的原因;另一部分牵涉到经济学中很复杂——至少我认为很复杂——的东西。比如劳动生产率、本位货币等。我只是简单的给他讲了一下。
====
老彼得提到六年级体育也将成为挑战。有市里的检查,不过他还是很有信心,只是要提高水平:跑的更快、跳的更远等等。
他还告诉我他当上了语文组长。
算来和老彼得一起混的日期也不短了,将近7年了。他从“幼幼幼幼园”大班开始到现在的六年级。
我大概也只能勉为其难称为一个勉强合格的老爸了:我至今不能记住他的衣服在哪里,第二天又要穿什么,做早饭也比较马马虎虎……
只是我总保证在家的时候和他一起玩、帮他学习。
今天晚上我们重拾过去的“每周一问”的习惯。他提了一个很“幼稚”的问题:为什么1+1=2?这个问题其实不容易回答——虽然他认为这个问题很简单,我可以简单的回答一下,然后他就可以去玩了!
今天为老彼得开通了一个Wiki专题:小学6年级英语学习。
顺便谈谈我对小学英语学习的看法。
我自认英语水平还可以。但是我开始学英语是从初一开始的,入门教材是《跟我学》(Follow Me),电视还是9寸的黑白,老师是胡文仲和Katherine Flower,后来是袁士槟。关于这段历史,网上记录不多,但是这篇文章还是讲述的非常详细,值得一看。
我对中国人学习英语的看法向来一致:不要太早,在中文还没有学好之前(或者说打下一定基础之前),不适合学习第一门外语(一般就是英语了)。
所以,老彼得在5年级之前,我都没有怎么让他专注英语,只是在假期让他跟着Follow Me的碟片去看。反正这5年来他的英语也没有怎么学,但是考试成绩也还不差,没有低过95分。这次我之所以要开始抓他的英语,一则是他在加拿大呆了100多天,有了和外国人交流、生活的体验;二来是我觉得和我当年学习英语的时间差不多了。如何抓他的英语也费了我一番脑子。最终我决定用Wiki的方式。我给他注册了一个帐号,这样他可以在Wiki上提出他的问题,我也可以针对性的回答。今天一早我和他沟通了一下,貌似他还很接受这样的方式。看以后的情况吧。
好吧,我忏悔:今天的内容很少,根本不是一天的内容。但是,考虑到今天是周末啊…… 今天我只是开始做一些分页构件的准备工作。
========
分页当然很重要。但是在Symfony 1.4之前,其提供的Paginator构件其实并不很恰当:它融合了相关数据集返回、构造实际的导航条这两个本来一个属于M,一个属于V的工作。按照Quick-and-Dirty的原则来说,这样做也无可厚非,只是会破坏Synfony一直推崇的MVC分离的原则。
所以,回头一想,如果开发者要自己开发一个Paginator就会很简单:获得相关的数据集由M去完成。这个步骤中的一个关键是获得符合筛选条件的总记录数,我们当然不能傻乎乎的将所有记录返回然后count一遍,应该在数据库服务器端就完成这个统计。由于今天我们不是做M端,也不是做V端——啊?那我们今天讲虾米?!——所以我会另开一文。
今天只是准备工作:测试。
按照TDD的思路,在实现一个功能之前,就先描述好这个功能应该获得什么输入,得到什么输出是非常好的习惯。
在分页模块中,有一个功能是必须实现的,即:已知总记录数(n),每页显示记录数(rpp),需要知道总共要多少页(p)。 一般的算法就是p=ceil(n/rpp)。但是这样的算法对不对?比如,如果总记录数正好是每页记录数的整数倍,那会不会出问题? 对于这种验证,用单元测试就会很方便。 首先编写Paginator类,其中有一个函数是getTotalPages:
// srctrrsywxBundleUtilityPaginator.php
namespace trrsywxBundleUtility;
class Paginator
{
private $page;
private $total;
private $style;
public function __construct()
{
$this->page = 1;
}
/*
* var recCount: the total count of records
* var $rpp: the record per page
*/
public function getTotalPages($recCount, $rpp)
{
if ($rpp == 0)
{
$rpp = 20; //This is forced in this. Need to get parameter from configuration
}
$r = ceil($recCount / $rpp);
return $r;
}
}
然后创建对应的测试单元软件:
// srctrrsywxBundleTestsUtilityPaginatorTest.php
namespace trrsywxBundleTestsUtility;
use trrsywxBundleUtilityPaginator;
class PaginatorTest extends PHPUnit_Framework_TestCase
{
public function testGetTotalPage()
{
$paginator = new Paginator;
$r = $paginator->getTotalPages(1, 0);
$this->assertEquals(1, $r);
$r = $paginator->getTotalPages(10, 20);
$this->assertEquals(1, $r);
$r = $paginator->getTotalPages(20, 20);
$this->assertEquals(1, $r);
$r = $paginator->getTotalPages(21, 20);
$this->assertEquals(2, $r);
$r = $paginator->getTotalPages(100, 20);
$this->assertEquals(5, $r);
$r = $paginator->getTotalPages(110, 20);
$this->assertEquals(6, $r);
$r = $paginator->getTotalPages(110, 10);
$this->assertEquals(11, $r);
}
}
在命令行中,运行如下命令:
phpunit -c app srctrrsywxBundleTestsUtility
如果一切顺利,那么就会得到:OK (1 test, 7 assertions)这样的提示。否则,就一定是某个用例下出了问题,需要针对这样的问题进行处理。
【本文收录于[go4pro.org]】
只放效果图:

从左到右分别是:
看来主要问题还是出现在Calibre对ePub的转换上。其它来自Office的PDF文件都非常清晰。