Thursday, 29 August 2013

Boundary determination of continuous records with the same classification

确定相同类型(条件)的连续记录区间段的方法

需要处理的问题是,有这样一组连续观测数据,(表名:obstable)
  Id,Value
  1,0
  2,0
  3,0
  4,5
  5,6
  6,15
  7,20
  8,20
  9,5
  10,0
  ...
现在想要知道,从哪个Id开始,到哪个Id为止,Value <= 5;哪个区间,Value > 5等等,类似的确定相同条件的记录,连续区间段的要求。常规的方法,是逐个读入数据序列,采用序贯处理的方法,判断、确定区段起止记录号。这里,尝试用SQL Query直接得到各区间段。(以条件 Value <= 5 为例)

1. 确定区间下界Id;
选取符合条件的记录序列,并排向下错开一个记录号。抓取无匹配的那个记录号,为区间开始记录号(下界Id)。
SELECT Value, AId
  FROM (SELECT Id AS AId, Value FROM obstable WHERE Value <= 5)
  LEFT JOIN (SELECT Id AS BId FROM obstable WHERE Value <= 5) ON AId = BId + 1
  WHERE BId IS NULL ORDER BY AId ASC
2. 确定区间上界Id;
类似的,选取符合条件的记录序列,并排向上错开一个记录号。抓取无匹配的那个记录号,为区间结束记录号(上界Id)。
SELECT Value, AId
  FROM (SELECT Id AS AId, Value FROM obstable WHERE Value <= 5)
  LEFT JOIN (SELECT Id AS CId FROM obstable WHERE Value <= 5) ON AId = CId - 1
  WHERE CId IS NULL ORDER BY AId ASC
3. 同时确定区间上下界Id;
把上述两个查询合并,同时给出区间的下界Id和上界Id。
SELECT Value, AId
  FROM (SELECT Id AS AId, Value FROM obstable WHERE Value <= 5)
  LEFT JOIN (SELECT Id AS BId FROM obstable WHERE Value <= 5) ON AId = BId + 1
  LEFT JOIN (SELECT Id AS CId FROM obstable WHERE Value <= 5) ON AId = CId - 1
  WHERE BId IS NULL OR CId IS NULL ORDER BY AId ASC
4. 潜在的问题和改进方法;
上述查询,当区间中,有多个记录符合条件时,能依次给出下界Id和上界Id。但是,当区间中,只有一个符合条件的记录时,下界Id和上界Id相同。上述查询就只会给出一个Id,而不是给出两个相同Id,分别作为下界Id和上界Id。那么,在查看Id序列的时候,一旦出现单个记录区间和多个记录区间混合的情况,就无法判断哪个是下界Id、哪个是上界Id,从而出现混乱。
为避免出现这种潜在的混乱,有必要再附加上标志,看该Id是否是是下界Id,还是是上界Id,亦或皆是。
SELECT Value, AId, 1-AId+IFNULL(BId,AId) AS isLower, 1+AId-IFNULL(CId,AId) AS isUpper
  FROM (SELECT Id AS AId, Value FROM obstable WHERE Value <= 5)
  LEFT JOIN (SELECT Id AS BId FROM obstable WHERE Value <= 5ON AId = BId + 1
  LEFT JOIN (SELECT Id AS CId FROM obstable WHERE Value <= 5) ON AId = CId - 1
  WHERE BId IS NULL OR CId IS NULL ORDER BY AId ASC

这里,isLower,1:是下界Id,0:不是;isUpper,1:是上界Id,0:不是
5. 使用Union,同时确定区间上下界Id;
用Union的方法,把上述2、3两个查询合并,也能准确给出区间的下界Id和上界Id。遇到单个记录区间,能够分别给出上下界Id。方法简单,只是没啥技巧,傻傻的。
SELECT Value, AId
  FROM (SELECT Id AS AId, Value FROM obstable WHERE Value <= 5)
  LEFT JOIN (SELECT Id AS BId FROM obstable WHERE Value <= 5) ON AId = BId + 1
  WHERE BId IS NULL
UNION ALL
SELECT Value, AId
  FROM (SELECT
 Id AS AIdValue FROM obstable WHERE Value <= 5)
  
LEFT JOIN (SELECT Id AS CId FROM obstable WHERE Value <= 5) ON AId = CId - 1
  WHERE CId IS NULL

ORDER BY AId ASC
实际应用中,可以独立使用Query 1和Query 2,分别获取下界Id和上界Id。也可以用Query 4或5。

Friday, 14 October 2011

Subversion 1.7

Subversion, 现在该叫Apache Subversion, 10月11日发布新版本,1.7.0

Subversion 1.7的一个重大改变是,Working Copy Metadata Storage Improvements,提供了一个完整可重写的工作副本元数据管理系统(WC-NG)。其结果,就是中心化元数据存储。

在使用以前的Subversion时,工作副本中的每一个子目录,都包含一个.svn隐含目录。在1.7.0中,所有版本控制的相关元数据,都集中到工作副本的根目录下,唯一的.svn隐含目录中了。

1.7.0中,使用SQLite数据库,存储版本控制中的全部元数据(.svn/wc.db)。

Windows平台下的TortoiseSVN,亦作了相应的更新。针对上面的元数据存储机制的改变,TortoiseSVN提供了一个菜单选项,用以升级SVN工作副本。当然,升级以后,以前版本的SVN就处理不了新版的工作副本了。

Wednesday, 28 July 2010

Behind the Wizard (Cherokee + Django)

前一篇中,介绍了如何在Cherokee Web Server中,通过其内置的Django Wizard,整合Django项目。在建立了一个虚拟路径之后,就马上能够提供Django项目的Web服务了。

Ubuntu 10.04-2010-07-26-13-04-11 这个Wizard做了哪些事情呢?

1. Rule

Ubuntu 10.04-2010-07-28-09-32-55虚拟路径/firstonez,是一个关于路径的规则。所有对/firstonez的访问,都要应用此规则。

2. Handler

Ubuntu 10.04-2010-07-28-09-38-37 于此规则相对应的Handler,采用SCGI方式。即Cherokee Web Server通过SCGI协议,将对/firstonez的访问,转移给Django项目。具体的SCGI设置如下:

Ubuntu 10.04-2010-07-28-09-44-38 这里定义了SCGI所连接的信息源头(Information Sources),Django Wizard自动建立了一个名为“Django 11”的信息源,其对应的地址和端口为:127.0.0.1:43095。这里的端口号,是随机选取的空余端口。

3. Information Source

接下来,看看这个Information Source包含了哪些内容。

Ubuntu 10.04-2010-07-28-09-51-28“ Django 11”这个信息源,是在本机(localhost)运行的一个解析器。连接参数127.0.0.1:43095。解析器命令为:python /var/www/firstonez/manage.py runfcgiocol=scgi host=127.0.0.1 port=43095

4. Running

前一篇可以知道,在完成上述设置之后,就可以直接访问到Django项目页面。并没有预先,以SCGI方式启动Django项目。通过Port Scan的检查可以知道,在访问http://127.0.0.1/firstonez之前,端口43095并没有打开;一旦访问了这个URL之后,端口43095就“自动”打开了。为什么呢?

Cherokee Web Server,在企图转移访问到Information Source的时候,发现相应的端口未打开,会主动调用解析器启动命令,开启Django服务。也就是说,如果没有访问,Django项目就不会启动,端口也不会被打开。这样,就不需要在系统里,准备Django项目的启动脚本。Cherokee Web Server自己处理这一切。当然,看上去,Cherokee可以启动,但不能停止Django项目的运行。

5. Django Project

前一篇中,是在/var/www下,通过sudo方式,建立的一个新的Django项目。在生产环境中,这个往往是不现实的。其实也是没有必要的,完全可以在自己的home里面或是其他地方,建立自己的Django项目。

同时,在用Django Wizard建立虚拟路径的时候,虚拟路径(Web Directory)也不必和Django项目名称一样。

Monday, 26 July 2010

Serve the Django Project by Cherokee Web Server in Ubuntu

myhat123念了无数次Django,我一直没有去碰Django。刚好前日在VMWare里面,安装Ubuntu 10.04 LTS,顺便安装了下Django,算是给myhat123一个交代。

Cherokee Web Server,我以前只是偶有耳闻,也是没摸过。呵呵,也顺路一起了。

1. Installation of Django and Cherokee

Ubuntu里面,安装软件很省心。在Synaptic Package Manage里面,选择软件包:cherokee,python-django和python-flup,然后“Apply”安装。

当前安装的Cherokee版本是0.99.39-4.1,Django版本为1.1.1-2ubuntu1。

安装之后,Cherokee Web Server就已经开始运行了。系统也已经为建立Django项目作好准备。

2. First project of Django

打开一个终端窗口,跳转到“/ver/www”目录下,建立一个Django项目:

bigonez@ubuntu:~$ cd /var/www
bigonez@ubuntu:/var/www$ sudo django-admin startproject firstonez
bigonez@ubuntu:/var/www$ ls firstonez/
__init__.py manage.py settings.py urls.py

这样,就有了第一个Django项目,firstonez。

3. Configurate in Cherokee

接下来,需要配置Cherokee,使其服务新建的Django项目。在终端中,输入命令启动Cherokee管理器。

Ubuntu 10.04-2010-07-26-12-27-27

注意,这里的密码是一次性、临时使用的。下次再启动Cherokee管理器的时候,会换新的。Cherokee提供的是Web页面式的管理器,其端口为localhost:9090

在浏览器中输入localhost:9090,进入Cherokee管理器。

Ubuntu 10.04-2010-07-26-12-47-25

点击Virtual Servers,

Ubuntu 10.04-2010-07-26-12-53-00

进入缺省(Default) Virtual Server,

Ubuntu 10.04-2010-07-26-12-56-48

点击列表底部的Wizards,

Ubuntu 10.04-2010-07-26-13-04-11

在Wizards列表中,选择Category - Platforms,点击Wizard - Django后面的“Run Wizard”。

Ubuntu 10.04-2010-07-26-13-13-18

在Django Wizard中,输入Web路径名(/firstonez)和项目的实际路径(/var/www/firstonez)。

Ubuntu 10.04-2010-07-26-13-19-27

现在,/firstonez出现在列表中了。点击左边菜单下方的“Save Changes”中的“Save”,保存修改的Cherokee配置,重新启动Cherokee Web Server。

4. Access to the Django project

现在在浏览器中,输入http://localhost/firstonez,访问前面所建立的Django项目页面,如果看到这样的页面,那就是成功了。

Ubuntu 10.04-2010-07-26-13-36-13

呵呵,真够简单的。不是吗?

Monday, 19 July 2010

Work with JSON Data in Firefox

JSON (JavaScript Object Notation),作为轻量级的数据交换格式,被越来越广泛地应用在Web Application中。这里讨论的是,如何在Firefox里,有效、方便地和JSON数据打交道。

1. JSON (JavaScript Object Notation) Regular Format

JSON数据在使用上,是非常简单易用的。很多语言都提供了JSON数据的编码和解码函数。比如在PHP程序中,可以这样来输出JSON格式的数据。

   1: <?php

   2:     // data initial
   3:     $myData = array();
   4:  
   5:     // data update
   6:     $myData = ...;
   7:  
   8:     // JSON data encode and export
   9:     echo json_encode( $myData );
  10: ?>

在实际使用过程中,这样的处理方式已经能够使程序正常地运行了。

但是,这样输出的JSON数据并没有严格遵从JSON的标准定义格式。在PHP里面,缺省情况下,PHP程序输出的内容,其媒体类型(Internet media type)是“text/html”。然而,JSON真正定义的媒体类型应该是“application/json”。因此,JSON数据严格的使用方法应该是:

   1: <?php
   2:     ...
   3:  
   4:     // JSON data encode and export
   5:     header("Content-type: application/json");
   6:     echo json_encode( $myData );
   7: ?>

JSON数据本身是一样的,但输出的数据报文的头会有所区别。采用严格格式的JSON数据输出,当然还是有用的。它使得我们在Firefox里面,能够结构化显示JSON数据,提高应用开发的效率。

2. JSONView

JSONView,是Firefox里的一个插件。它的作用,处理“application/json”类型的数据,高亮、结构化显示JSON数据。此插件只对“application/json”类型的数据有效。在安装此插件之后,Firefox一旦发现此类数据,会自动调用JSONView显示。这里是,JSONView的显示例子。

JSONView Example

3. Firebug

使用Firefox,开发Web应用程序的,对Firebug应该非常熟悉。Firebug从版本1.4a11开始,就提供了对JSON数据的支持。这种支持的前提条件,也是JSON数据必须标记为“application/json”媒体类型。

Firebug中,显示上述JSON数据,如下:

Firbug Example

注意,Firebug显示的数据顺序,是排序过的,不是原始的JSON数据字段顺序。

通常,JSONView可以用来进行Web Service的初期调试,检查输出的JSON数据是否正常;Firebug则用于AJAX通讯模式下的,JSON数据测试。

Firebug中,对返回的Response数据块,是有限制的。当数据块的大小超过100k之后,Response表单就将超过部分,省略了。当然,JSON表单里显示出来的,还是列出了全部的数据,并没有省略。

JSONView,无法直接用于显示AJAX通讯过程的JSON数据。这需要在Firebug的Response表单中,从点击右键所弹出的菜单中,选择“Open Response in New Tab”。这样,AJAX过程中的数据,就在新的页面里看,用JSONView显示出来。

firbug 2 jsonview

此选项,会把收集到的数据,直接调用JSONView显示,不会发生额外的再次通讯。相对应的,“Open in New Tab”选项,则是把AJAX的URL在新的页面打开。相应的,还要再次访问该URL,才能获取数据显示。

Wednesday, 9 June 2010

No update on the dynamic web page with Safari Reader

Apple发布了Safari 5.0,其中一项新功能是,提供了Safara Reader模式。挺好的一项功能,没有那些花哨的东西,清爽多了。

目前,发现的一个大问题是,对于动态刷新的页面,Safari Reader只会显示页面初始载入时的内容。如果页面在显示过程中,出现动态改变,比如通过Ajax修改了文字,Reader模式还是去显示初始载入时的文字,而不会更新到变化以后的最新状态。显然,这是个Bug。

Tuesday, 1 June 2010

Pylons 1.0 Released

五月二十八日,Pylons终于发布1.0版。新闻通告,Pylons 1.0 Released

翻了一下自己以前的blog,从开始接触Pylons到现在,转眼过去四年有余,时间真快。