2009年5月23日
在重构mapkit过程中,感觉有一些经验可以对以后的工作有一定帮助,特记录如下:
0 软件设计的主要考量因素是“响应变化”和“易于理解”。所以可以简单推论:需求不会变化的部分可以写死;包、类、接口的数量越少越好。或者说,我们只应该在如下情况下分解对象:需求可能变化、对应领域概念不同、生命周期不同。
1 软件包分为领域层和应用层。领域层包含核心的稳定的业务概念和业务逻辑,主要是Plain Old Object。应用层分为基本对象和扩展对象,主要是基于某个应用框架而派生的对象,比如都是UI组件。
2 不同类型的对象之间分解主要用事件、接口、抽象基类来实现。
3 事件类型应该对应事件源类型,如果严格遵守一个事件源类型一个事件类型,在代码冗余度上会有所增加,但扩展性和可读性的改善是巨大的。
4 事件是只读值对象,宁可重复,尽可能不要考虑继承和重用。如果需要重用事件,那么事件基类中应该不含任何事件类型,事件具体类中只含事件类型。
5 接口应该只用在领域层中或者作为RPC访问的模拟。应用层的基本对象和扩展对象间使用基类而不是接口来解耦,因为应用层本来就是基于某个应用层框架,应当充分利用基础设施,同时减少抽象层次和减少整个包的类、接口数量。
6 接口应当尽可能避免副作用,也就是说每次访问同一接口,产生的效果应当相同。所以如果一个接口中包含setter或者addItem这样的方法,应当尽可能改造成基类+只读接口。只读接口是说只包含无副作用方法和getter的接口。
7 考虑使用只读值对象:构造器中确定所有参数,然后只有getter方法。考虑使用PlainOldBean:无参构造器+getter+setter。
8 避免循环引用:A.prop=new B(); B.prop1=new A(); 有可能可以考虑属性赋值:A implements IDe; a.p1;a.p2; B implments IDe; b.p1=a.p1;b.p2=a.p2;
9 类和接口命名应当遵守明确的规范,并保证唯一性。
10 应当采用自底向上重构的方法进行设计:先完成功能,然后分解出基类或者接口或者事件使之通用化,这个过程通过不断地重构实现。
2009年3月16日
今天晚上在外面走了一圈,发现现在和北京地气的同步率高多了,不过北京光污染太严重,看不到星辰很难做大尺度同步。
上帝一定只是观察者,因为一旦涉入,就不可能全身而退。
我看见风吹进千家万户,世间众相像是一出没有剪辑的悲喜剧,人人都觉得自己是生活的主角,其实一个都不是。
我看见风吹进历史的扭曲轨迹,天地如果只是一瞬,万物是不是真的无足轻重?
超越性的存在究竟是救赎还只是画饼充饥?
当人超越自己,去把“我”的定义泛化,去模仿神,去感受神,是不是必然最终化为尘土的人也就成了不生不灭的神?
2009年2月27日
首先说明的是,这个标题并不准确。Flash已经火了很久了,从无处不在的弹出式广告、到网络视频、到各种休闲游戏,Flash几乎是网页嵌入媒体的事实标准。但随着actionscript 3、Flex相继推出,现在的flash和之前的flash已经完全不是一个概念,之前的面向帧的动画工具变成了面向对象的客户端平台。所以说“终于轮到flex火了”也许更合适。
但是,这次风潮说到底不是flex的胜利,而是flash的胜利。Flash作为一个平台的革命是一切的基础,无论是ActionScript 3的演进还是flex框架的引入,都是一个被极其广泛应用的Flash平台的角色变化的必然结果。与此相比,silverlight的基础就要弱小很多,silverlight的插件在windows上的安装一直有各种问题,别说跨平台使用了。再加上历史造成的部署量的巨大差距,到目前为止,silverlight始终不能作为客户端平台的严肃选择。虽然silverlight提供了更好的RAD工具,更多的宣传资金,甚至在某些特定功能更优秀的功能,但这场追赶仍然是一个impossible mission。
在RIA领域角逐的解决方案主要有Flash/AS3/Flex、Silverlight/.NET/XAML、Applet/Java、Applet/JavaFX、ActiveX/VB*和AJAX几种,现在看企业应用最多的还是传统的Applet/Java和ActiveX,最有前景的是Flash/AS3和AJAX。Silverlight和Applet/JavaFX是一类问题,技术新、部署少,但有可能在企业内部得到一些应用,尤其是MS和Sun自己分别的BP。
从情感的角度,AJAX仍然是最Web的解决方案,不需要依赖于某个封闭的插件,一切都是开放的和易于管理的。但是AJAX因为IE的Suck变得问题多多,IE是使用最多的浏览器,也是性能最差、功能最少的浏览器,这使AJAX的在很多用户的机器上表现很差。这也许能通过Firefox、Chrome、Safari、Opera这样的正常的浏览器的市场占有率提高,通过Google这样的有力量的互联网收益者的努力来得到一些改变。但是从开发者的角度,AJAX是痛苦的、混乱的、低性能的和没有future-promise的,这是一个大问题。
所以,ActionScript增长迅速就不足为奇了,如下图(http://radar.oreilly.com/assets_c/2009/02/TM_qtr_py_Prog_Lang.html):

这张图另外一个看点是objective c增长达到惊人的965%,obj-c是apple的默认语言,这反映了apple用户和开发者的巨大增长。所以仍然认为Windows+IE就是
一切的观点,是应该变一变了。
下面就该投入到actionscript的轰轰烈烈的学习了……
P.S. 鉴于flex builder还是收费,flashdevelop是目前比较好的一个选择。
P.S. 很多资源在openflash.org上可以找到
P.S. flex cookbook有点只见树木 不见森林 不是很适合入门
2009年2月21日
嗯,最近很忙、很累,个人时间大多充公,%#¥&…… 不过这个抓票程序早就说要贴出来了,这是推不掉的,所以……看代码:

Code
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import datetime
import pyquery
__tickets = []
def __parse_ticket(segment):
ticket = {}
ticket["url"] = segment(".c1 a").attr("href")
ticket["describer"] = segment(".c2 a").text()
ticket["type"] = segment(".ppz").text()
ticket["date"] = segment(".c3").text()
ticket["publish"] = segment(".c4").text()
if ticket["url"]:
__tickets.append(ticket)
def fetch_tickets(first_station, last_station, seat_type="", logon_date=None):
params = {}
params["T"] = "Ticket"
params["Cat"] = "sale"
params["From"] = first_station
params["q"] = last_station
params["Cat2"] = seat_type
if logon_date:
params["Cat1"] = str(logon_date.month) + "月"
params["Cat3"] = str(logon_date.day) + "日"
else:
params["Cat1"] = ""
params["Cat3"] = ""
kuxun_url = "http://piao.kuxun.cn/search.php?" + urllib.urlencode(params)
doc = pyquery.PyQuery(url = kuxun_url)
doc(".back").each(__parse_ticket)
tickets = __tickets __tickets = [] return tickets
主要就是用了一个pyquery库,这个库可以像jquery那样用css selector遍历网页,速度也很快。做网页爬虫应该是非常方便的一个选择。
有一个问题,就是有些网页需要登录以后才允许看到一些内容。Classicning同学在用爬虫抓过饭否的信息,(貌似是直接用正则表达式?),用过一个很不错的方法,就是记录下自己登录时的sessionid来作为请求的一个参数,但这个方法貌似在某种程度上算是饭否的安全性bug,不知道他后来有没有研究出更通用的一些方法,有机会再向他请教吧。
----------------------------
完了
回家收拾行李

飞机



酒店

食肆

海

红领巾路

通向未知之路

街头涂鸦

中外涂鸦大比拼……

汕头的水饺比北方精致许多

汕头街头

又是飞机

首都机场

地铁十号线

北京又趁我出差下了一场雪

终于打道回府

2009年1月10日
瞎搞一篇 并不准确 切勿信以为真
tao of dynamic script
道可道 非常道 a defined function always can be attached to another definition
名可名 非常名 a assigned variable always can be assigned again
无名天地之始 every thing is inherited from Nothing
有名万物之母 and any object is created by the class instantiation
故常无欲以观其妙 so the signiture (of a function or an object) tells the the essence
常有欲以观其徼 but the definition would determine the outcome
此两者同出而异名 同谓之玄 the signature and the definition are different names for one purpose. we can call them in one name: "lexical"
玄之又玄 众妙之门 the unified and dynamic grammar composed of "lexical"s will make programming easier
2009年1月9日
2008年11月17日
2008年11月5日
摘要: 开发过程改进软件产业帮助各行各业优化管理或改进过程,而软件开发过程本身仍然充满了英雄主义和浪漫主义的味道。无疑,开发过程这种挑战性和不确定性吸引了大量优秀的人才进入这个行业,但是开发过程的低效带来的问题显然要严重得多。所以从软件开发活动一开始,人们改进开发过程的努力就从来没有停止过。持续集成Martin Fowler提出了持续集成(Continuous Integration)的概念(http:/...
阅读全文