Gridview排序和分页的基本机制

排序

  • 客户端PostBack。
  • 在Sorting事件中,取得排序的列及排序方向。
  • 调用DataSource的排序方法。
  • 重新DataBind

分页

  • Gridview读取全部的数据源数据。
  • 在PageIndexChanging事件中,取得要前往的页编号(e.NewPageIndex)
  • 数据绑定前,设置PageIndex属性,实现分页。

也就是说,分页完全是在ASP.NET中进行的,对于大量数据集就会有性能问题。
解:

下载Google App Engine站点的代码

GAE到目前为止并没有提供从站点上下载或备份代码的功能,本地的开发代码一旦丢失或损坏,就会有无法恢复的麻烦。所以本地代码用SVN之类的管理工具管理起来是很必要的。
Manatlan编写了一个工具,可以将整个GAE站点的代码打成zip包下载。是一个很简单的过程

      在根目录下根据manatlan的代码建立zipme.py。
      在app.yaml中加入handles: - url: /zipme script: zipme.py。
      访问youapp.appspot.com/zipme即可。

这个程序会通过google的身份认证来判断访问者是不是管理员。而且对于各个版本的代码,也可以分别下载了。
不过不能直接访问代码的确是GAE的明显缺陷。

  • 代码可能损坏或丢失而无法恢复
  • 使得合作开发模式也并不灵光,开发者之间需要其他渠道交换和维护代码。
  • 代码的版本和发布的版本不好对应。

所以相信这个问题很快会解决掉,至少能和Google Code结合在一起,代码管理和发布管理的功能集成起来。

Access中的事件和委托

实际上对.Net中的“委托(delegate)”的概念并不很懂。如果仅理解成自定义事件的话,在Access中也可以部分实现。

窗体2中的自定义事件FireFromF2被窗体1捕获处理,参数被传递。用法很简单,注意WithEvents关键字的使用。

accessevent1.png
accesseventf1.png

accesseventf21.png

上面的例子要求先f2开启状态下再打开f1才能成功注册事件(原因见最后的总结)。如果是子窗体的事件,就简单一些,应用更常见。

accesseventf31.png

总结

  • WithEvents设置了事件监听的钩子,这个钩子针对的是Object,是实例,而不是Class或类型。
  • 所以可以监听Application这样的全局物件,也可以监听某个具体的Form。但是不能对所有的Form(Access.Form类型)起作用。
  • VBA中不支持自动的up-casting;WithEvents也不支持对象数组。所以后期绑定的方法也基本行不通。

自动单元测试框架, PyUnit, tsqlunit, xUnit framework

Notes on Python自动单元测试框架

from widget import Widget
import unittest

class WidgetTestCase(unittest.TestCase):                   # 测试例(test case)
    def setUp(self):                                       # 测试前的初始化工作。
                                                           # 声明在unittest.TestCase中,自动调用。
        self.widget = Widget()
    def tearDown(self):                                    # 测试后的清理工作。
        self.widget = None

    def testSize(self):                                    # 自定义的测试方法。
        self.assertEqual(self.widget.getSize(), (40, 40))  # assertEqual是TestCase提供的工具。

    def testColor(self):                                   # 一个测试例中可以定义多个测试方法函数。
                                                           # 默认的测试方法函数名为runTest
        pass

def suite():                                               # 测试集(test suite)
    suite = unittest.TestSuite()                           # 函数返回TestSuite的测试集实例。
    suite.addTest(WidgetTestCase("testSize"))              # 测试集中加入测试方法。
                                                           # 多个测试方法组成一个测试集。
                                                           # 可以用unittest.makeSuite批量添加测试方法。
    return suite

if __name__ == "__main__":
    unittest.main(defaultTest = 'suite')                   # 执行测试
                                                           # 也可自定义执行测试的Runner
                                                           #     runner = unittest.TextTestRunner()
                                                           #     runner.run(suite)

自动生成测试例,批量测试

借鉴JUnit框架上的一个方案,用程序生成一个足够大的测试集。Write a suite( ) method that iterates through all of your
input data, creating a unique instance of your test case for each
unique input. The data is passed to the test cases through the
constructor, which stores the data in instance fields so it is
available to the test methods.

A similar solution,
pyUnit and dynamic test functions .

如果像我这样需要一个测试集,可以自动的无穷尽的pop出各种各样的,甚至是随机的测试例,或者是测试例的参数,而不是预先在测试集中(内存中)建立好所有的测试例,可以利用TestSuite的Iterator的特性实现。

TestRunner中的run方法,对TestSuite来说,仅仅是调用了其test方法。

class TextTestRunner:
    """ ... """
    def run(self, test):
        "Run the given test case or test suite."
        result = self._makeResult()
        startTime = time.time()
        test(result)
        stopTime = time.time()
        timeTaken = stopTime - startTime
        result.printErrors()
    """ ... """

所以可以重载TestSuite类,生成支持Iterator的测试集,自动生成测试例。代码如下

import unittest
class TheTestCase(unittest.TestCase):
    def __init__(self, n):
        unittest.TestCase.__init__(self)
        self.n = n
    def runTest(self):
        assert( self.n>3 )

class MyTestSuite(unittest.TestSuite):
    def __init__(self):
        unittest.TestSuite.__init__(self)
        self.i = 0
        self.N = 5
    def __iter__(self):
        return self

    def next(self):
        self.i += 1
        if self.i > self.N: raise StopIteration
        return TheTestCase(self.i)

    def run(self, result):
        for test in self:
            if result.shouldStop:
                break
            test(result)
        return result

def suite():
    return MyTestSuite()

if __name__=='__main__':
    unittest.main(defaultTest='suite')

xUnit Framework

结合这个tsqlunit框架 (不是很实用),可以粗略总结xUnit Framework构建的单元测试框架里的一些要点。

  • 集中格式化输出显示(PRINT)测试结果及报告。
  • 通过测试集、测试例组织管理测试代码,重用测试代码。
  • 自动加载测试例。
  • 统一测试例的接口(包括异常抛出),简化测试例编写。

Access (Jet SQL)中的function

MS Access是一种桌面型数据库引擎,基于Microsoft Jet database engine。一般用在很轻量级的应用上,以“方便”著称。其实某些方面也很强大,因为Jet SQL是有VBA集成在里面的。在写一些SQL作为query的时候,曾经因为发现Jet SQL内置的函数很少,而写了很多Dirty code。起码来说,没看到任何可用于非线性的计算函数(比如计算个人所得税时需要用到)。和T-SQL比较起来差的很远。直到最近发现可以使用VBA在SQL中,才发现这些问题不但可以解决,而且更容易了。

The Microsoft Jet database engine uses the Microsoft® Visual Basic® for Applications (or VBA) expression service to perform simple arithmetic and function evaluation. All of the operators used in Microsoft Jet SQL expressions (except Between, In, and Like) are defined by the VBA expression service. In addition, the VBA expression service offers over 100 VBA functions that you can use in SQL expressions.

SQL中的Function可以这样分为两种:Calculating fields和 SQL aggregate。自定义的聚集函数在SQL Server 2000里面也不支持,要到SQL Server 2005中才有。Calculating fields却可以利用VBA做出很多的扩展。

工具太容易上手,反而会使用户认识不到它全面的功能。微软的Office就是一个例子。

北京个人所得税计算的JET SQL Query:

SELECT
SalaryRMB,
IIF(SalaryRMB>1600,
    (SalaryRMB-1600)*
       IIF(SalaryRMB>=21600,0.25,
         IIF(SalaryRMB>=6600,0.20,
           IIF(SalaryRMB>=3600,0.15,
             IIF(SalaryRMB>=2100,0.10,0.05)  ) ))
      -IIF(SalaryRMB>=21600,1375,
         IIF(SalaryRMB>=6600,375,
           IIF(SalaryRMB>=3600,125,
             IIF(SalaryRMB>=2100,25, 0) ))),
0) AS SalaryTaxRMB
FROM tb_Salary

抽象归纳数据结构,重用算法

有一句古语

程序 = 数据结构 + 算法

说得还是有深意的。在接触C++、面向对象、STL、Design pattern、消息机制等等技术过程中,逐渐发现,它们都包含围绕着那句古语而展开的思路,目的是重用

一般来说,都是对不同的数据结构(类型),应用同一个算法。算法被重用。

template method这个pattern是个典型的例子。

template method

基类(Abstract class)中的TemplateMethod()是个算法。这个算法对于所有派生类(Concrete class)都可以重用。

STL中很明确地实现了这个概念,对不用的container,算法都可以实现。

不论是template、inherintance还是任何其他的机制实现的重用,约束都是把代码重用到一类有相同接口(interface)的结构上

也就是说,把需要研究、表达、操作的对象,抽象出他们的共同特征(也就是接口),然后归纳为一个类别之后,就可以把同样的方法和手段,无差别应用到所有这个类别中所有的实例上了。这是就是重用的思想。是个个门类的科学技术的最重要的思路。

最近接触一些应用了消息机制的工作,归纳起来看,也可以把消息机制看作一种类似的抽象与重用的例子。消息循环是一个算法,它负责取从消息队列中出消息,然后把它实现执行。之所以能够执行是因为每个接受消息的object都可以把消息映射到对应的消息处理函数上,这些函数的接口固定。于是根据不同的消息,不同的程序就被执行了。整个消息队列机制实现了在一个任务(task/thread)中,用有限的代码(消息循环),无限地执行动态演变的程序。强大的算法,不是吗?

消息处理的接口,是个一致的接口。消息处理者之间也可以互相调用(SendMessage),避免了调用函数时要遵守的复杂的函数prototype,也不必因为函数prototype的更改影响其他程序。实现重用了。

list partterns in Matlab and Python

list partterns in Matlab and Python

A comparation between usage in Matlab against Python of the List variable as the most common and frequently utility in the languages.

Indexing

Key point of Indexing: Index, List to be filtered
Matlab

>> lst = rand(2,3) %@ the List to be filtered
lst =
0.4103 0.0579 0.8132
0.8936 0.3529 0.0099

>> i = lst > 0.5 %@ the Index, a list with integer elements
i =
0 0 1
1 0 0

>> lst(i) %@ the Result, get a new list from lst with elements indexed by i
ans =
0.8936
0.8132

>> lst(lst>0.5)=1
lst =
1.0000 0.0579 1.0000
1.0000 1.0000 0.0099

Append

Python

lst.append(obj)

Matlab
No declaration or additional appending operation.

>> clear
>> lst(2) = 1
lst =
0 1

>> lst(5) = 1
lst =
0 1 0 0 1

>> lst(length(lst)+1) = 9 %@ Appending operation
lst =
0 1 0 0 1 9

Sorting

>> lst=rand(3,4)
lst =
0.9501 0.4860 0.4565 0.4447
0.2311 0.8913 0.0185 0.6154
0.6068 0.7621 0.8214 0.7919
>> sort(lst) %@ Matrix sorting means “Sorts each column”.
ans =
0.2311 0.4860 0.0185 0.4447
0.6068 0.7621 0.4565 0.6154
0.9501 0.8913 0.8214 0.7919
>> sortrows(lst,1) %@ Each row treated as a element in List.
ans =
0.2311 0.8913 0.0185 0.6154
0.6068 0.7621 0.8214 0.7919
0.9501 0.4860 0.4565 0.4447

Random posts

  • Questions from Xiaoying
  • XSLT中的DISTINCT和GROUP
  • 放在U盘上,可以在Windows下运行的Ubuntu
  • 推荐8box的音乐专题:在忧伤的旋律中的情人节
  • 观山寨手机有感