Category: 编程、软件、技术

  • 任氏有无轩一些小的改动

    这几天一直在“小打小闹”的改进我的任氏有无轩。

    今天完成了一个小功能:

    在书籍详细页面显示该书被访问几次以及上次访问的时间。

    由于我对处理文本文件(必然会牵涉到的正则)不是很熟,所以还是用数据库来完成。

    遇到的一个意想不到的问题是如何写日期/时间类型。

    最早我将数据类型定义为datetime,但是在写入时如果用string变量,出现:

    Fatal error: Call to a member function format() on a non-object in G:wwwrsywx2SymfonyvendordoctrinedballibDoctrineDBALTypesDateTimeType.php on line 44

    的错误。

    如果用Datetime变量,出现:

    Can't convert object Datetime to string

    错误。 最后我是用一个bigint来直接存储时间戳的方式解决问题……这个世界清静了……

    效果如下:

  • 任氏有无轩改版彻底完成

    折腾了很久,终于将我的任氏有无轩改版到4.0。

    这次的改版经历了很长时间。

    首先是用Symfony 2.X,这对我是个挑战,因为我之前都是基于Symfony 1.4.X来编写站点的。Symfony的一个最大的特点就是每次大的版本升级都会引入全新的东西,需要开发者去适应,这是闹哪套!

    Symfony 2首先是基于namespace,因此必须有PHP 5.3+的版本支持。我的主机在BlueHost上,应该说BH是很保守的虚拟主机服务商,在外界已经普及使用PHP 5.3的时候,它还死撑着用PHP 5.2。我还为此专门去信询问,回复是他们还要测试。没有这个最基本的平台,我的开发也就没有了动力。

    幸好,BH主机从善如流,一口气开始支持PHP 5.3/5.4,所以我才又重拾开发。

    其次是版面的设计。这要感谢前令狐,在7月份的第一届G4PCC上,他介绍了Bootstrap这个框架。这个框架的存在让我精神一振,因为它可以让一个程序员(而不是美工师)设计出比较优雅、简介的页面。通过简单的摸索,我就已经上手了。

    (more…)

  • 用Win8这两天

    这两天手贱,装了Win8。说说感想。

    界面和操作

    界面和操作暂时还没有那么不堪忍受。

    我这几天基本是在玩Metro的应用,感觉界面更简洁、更清爽,对于Content Consumer来说,是好事。我截取一个微博的界面:

    对于内容消费者,和轻量内容创建者来说,这是方向。

    输入法

    微软这次提供的输入法终于有了很大的进步,使我暂时还没有用别的输入法的想法。

    邮件/日程/联系人

    终于,微软的内置邮件程序可以支持OWA了!我可以直接收我公司Exchange的邮件了!我可以只要使用Office的学生和家庭版了!当然,也可以同步公司的日程和联系人了!内牛满面啊!

    吐槽点**我真的对微软很Orz!**

    • 我的LiveID在游戏中无法登录XBOX Games!目前我还不知道是不是墙的问题。
    • 我从市场装了一个Microsoft Mahjong。最后游戏胜利的时候会hang住啊!有木有!
    • 我还装了一个Adera的游戏。必须要登录才能玩啊!
    • 中文、英文切换有时失灵啊!会禁止IME啊!
  • DokuWiki后台升级

    今天升级了我的维客后台。我用的是DokuWiki。

    感觉界面清爽了不少。

    另外,安装了一个插件:MarkDownExtra。有了这个插件,只要我创建的页面后缀设置为md,就可以直接用MarkDown的语法了。

    给大家看个效果:

    markdown_in_wiki

    这么一来,可以基本解决Wiki没有离线编辑器的困扰。

  • 在Windows 7英文版的命令行中显示UTF 8中文

    这两天在试着看Go语言,Go语言的文档很丰富——但是是英文的,我看当然没有问题,但是有几次恶作剧的想,能不能修改一下把各个内置库函数的说明改成中文呢?

    我随便找了一个proc.go文件,将其改为UTF 8编码,然后修改其文档为中文,在命令行下效果是这样的:

    这个当然不好。我搜索了一些站点,在这里找到了解决方案:

    http://pjq.me/wiki/doku.php?id=tips:enable-utf8-cmd

    最终效果是:

  • 博客的新主题

    今天给我的博客换了个主题:Suffussion。

    这个主题是在是……太复杂了!!!

    不过效果一流,希望大家喜欢!

  • 重构“任氏有无轩”——第四天

    好吧,我忏悔:今天的内容很少,根本不是一天的内容。但是,考虑到今天是周末啊…… 今天我只是开始做一些分页构件的准备工作。

    ========

    分页当然很重要。但是在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]

  • 重构“任氏有无轩”——第三天

    今天继续加深书籍详细信息页面的构造。

    在G+上95对我的进展发了一个评论:

    再加上点自动抓取网上共享章节的功能

    对这个要求,我只能说我只能实现一点点。我将在详细信息页面中构造一个显示豆瓣对应书籍的信息的部分。

    另外,我要实现一个功能是在这个页面中编辑书籍tags的功能。

    (more…)

  • 重构“任氏有无轩”——第二天

    重构进入第二天——熟悉我风格的人都知道,这不是真正的第二天。

    今天主要进行书籍详细信息页面的创建,以及对书籍封面的处理。

    页面的创建继续使用Bootstrap来完成,用到的元素包括Hero Unit,Table等。我这里不进行详细的展开。

    相较之前的页面,我准备在新的页面中加入书籍的封面。这里的一个问题是:不是所有我收藏的书我都扫描了封面——以后也许会的,但是目前的话,我觉得用一个类似缺省封面的设计是比较好的。

    (more…)