2007年8月3日星期五

《C++沉思录》阅读笔记(4)

1.OOP->使用继承和动态绑定的编程方式;
2.检查表不是任务清单,它的用途是帮助你回忆起可能会忘掉的事情,而不是来约束你;
(1)构造函数
(2)私有数据成员
(3)带参数的构造函数
(4)是否每个构造函数都初始化所有的数据成员
(5)析构函数
(6)虚析构函数
(7)需要复制构造函数
(8)赋值操作符
(9)赋值操作符能正确地将对象赋值给对象吗?
(10)定义关系操作符
(11)删除数组时采用delete[]
(12)在复制构造函数与赋值操作符参数中使用const
(13)如果函数有引用参数,其应该是const吗?
(14)适当声明成员函数为const
3.C++更适合于那些喜欢思考的程序员;

《C++沉思录》阅读笔记(3)

1.Murphy's Law 墨菲法则,一件事只要有可能变糟,就一定会变糟。
2.通常我们不可能为特定的工具挑选合适的问题;而应该为特定的问题挑选合适的工具,但目前我们常常会在没有分析问题前就决定了工具,这常常是因为商业意义或其它原因。有时我会在第一次技术讨论会上,在一段5分钟的简短需求说明后,听到项目经理斩钉截铁地提出要采用J2EE+***或者ASP.NET+***等方案,然后兴致勃勃地讲述该技术平台的优越性,宛然他是某家技术提供商所雇用的推销员。
3.C++主要设计目的是可移植性和可并存性,其可移植性与跨平台不是一个概念。在Java以前就有许多包裹着不同层次系统的语言,很显然Java是其中最成功的一个,而其由于商业推广目的,并不会强调移植性与跨平台间的概念差异。虽然从计算机科学家的角度来看,这样的差异是如此之大,以至于许多专家认同"Java不是跨平台,Java自己就是平台"。但对于程序工人来说,这样的差异是细小的。而对于商人来说,这样的差异是产生"现金流"的风道。
4.C++的目的不是安全,而是自由。我想随着软件工业的发展,C++与Java会不断分化,科学家使用C++,而商业系统中的技术工人则采用Java(或者与之类似的C#等)。

《C++沉思录》阅读笔记(2)

1.很多最成功、最有名的软件最初都是由少数人开发的;
2.软件业中,软件制造的规模和经济效益不成正比;
3.抽象是机器所不易而是人所擅长的工作,不同层次的抽象产生不同层次的系统,要厘清不同语言能赋予人不同的层次的抽象能力。有些抽象不是语言的一部分。
4.在某处很显然的约定在另一写地方会成为"隐讳"的细节而不为自己和他人所觉察、最终成为最难于Debug的Bug。
5.人应该成为工具的主人而不是依附工具的奴仆。

2007年8月2日星期四

C++沉思录阅读笔记(1)

实用和抽象是C++的本质特性。不要陷入教条主义的泥潭,但要尊重编程手册与智慧。在面对代码时要始终保持实用主义原则,而在确保程序正常工作的基础上,敢于挑战自我,用眼光考察代码的未来,用头脑抽象问题的本质。对于一个优秀的C++科学家来说。编程应是(1)集中考量问题的本质(2)定义一个类来抓住本质,确保其能工作(3)将其逐步抽象建立一个更一般问题的解决方案(4)在遇到符合这个本质的问题就采用该类。
思索是C++程序员的特权,因为从语言角度C++给于程序员最大的自由度。

2007年7月1日星期日

python过滤HTML代码小记

我常用Python来过滤HTML代码,其中一项工作是将网络上批量下载的文章进行重命名。一般操作是先下载索引页面(HTML),然后用FlashGet批量下载文件;用Python过滤索引页面以获取文件下载名与实际文件名的对应列表,最后转换为BAT文件批处理。
但我一直没有能解决如何判断A标签的class属性问题,因为我以前的代码是:
def start_a(self,attrs):
idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
print fileHref
if idText == 'a': #这里判断class的属性,有问题的
self.inValid = True
self.fileHrefs.append( fileHref )
def end_a(self):
self.inValid = False
其中判断A标签的class属性那段是有问题的。原因是我没有区分Python中数组与字符串的关系。今天我重读Python帮助后才意识到这一点。我的新代码如下:
def start_a(self,attrs):
idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
print fileHref
if idText == ['a'] : #用数组来判断
self.inValid = True
self.fileHrefs.append( fileHref [0]) #在序列数组中添加字符串而非子序列数组
def end_a(self):
self.inValid = False
这样就解决问题了。

2007年6月25日星期一

批量下载后的文件名过滤

用FlashGet批量下载文件后面临一个文件名更改过滤的问题。我的解决方案是:
1.在批量下载时,同时下载该网页的HTML文件;
2.用Python来过滤出对应的HTML文件;
3.将过滤文件修补成Bat文件,运行后则可批量更改名称;
=====================================================================
Python过滤源代码
# -*- coding: cp936 -*-
# yankchina@gmail.com
# 2007-06-26 pass

from sgmllib import SGMLParser
class MyHtmlFilter(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.inValid = False
self.fileHrefs = []
self.fileNames = []

def start_a(self,attrs):
#idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
#if idText == 'a01' :
self.inValid = True
self.fileHrefs.append( fileHref )
def end_a(self):
self.inValid = False


def handle_data(self, text ):
if self.inValid:
self.fileNames.append( text )


def FilteHtmlFile( inFileName,outFile ):
''' Filte Html File

'''
import os
if os.path.exists( inFileName ):
inFile = open( inFileName, "r")
parser = MyHtmlFilter()
parser.feed( inFile.read() )
inFile.close()
parser.close()
print len( parser.fileNames )
for i in range( len( parser.fileNames) ):
outFile.write( parser.fileHrefs[i][0] + " " + parser.fileNames[i]+ ".doc \n " )
print parser.fileNames[i]
print parser.fileHrefs[i]
print inFileName, len( parser.fileHrefs )

if __name__ == "__main__" :
outFileName = 'output.txt'
outFile = open( outFileName, "w" )
htmlFileName = "1.htm"
FilteHtmlFile(htmlFileName, outFile )
outFile.close()

2007年6月21日星期四

AutoIt的学习与开发心得

AutoIt3是一个Windows平台下的自动脚本工具,其脚本语言接近VBScript,但拓展了许多Windows平台的有效功能,如窗体控制、DLL调用、网络开发等。我下载了AutoIt3并进行了短期学习,开发了一个简单的脚本程序,用来在TotalCmd中调用创建一个Readme.txt文档。以前我经常手动创建这样的文档很烦人,而现在看着屏幕上一闪而过的Notepad,自有一种欣慰。
下面是程序脚本:
#cs ----------------------------------------------------------------------------
AutoIt 版本: 3.2.3.14第一版)
脚本作者: yankchina@gmail.com
Email: yankchina@gmail.com
QQ/TM:
脚本版本: 1.0
脚本功能: 新建一个名为Readme.txt的文档,并在文档首部写入日期和作者信息

#ce ----------------------------------------------------------------------------

; 脚本开始 - 在这后面添加您的代码.
Dim $AuthorInfor = "yankchina@gmail.com " ;作者信息
Dim $ReadmeFilePath = "F:\CacheTemp\" ; 默认保存路径
;如果有命令行参数,则取第一个命令行参数为文件保存位置
if $CmdLine[0] > 0 Then
$ReadmeFilePath = $CmdLine[1]
EndIf
Dim $ReadmeFileName = $ReadmeFilePath & "readme.txt"
;判断文件是否存在
Dim $FileIsExist = FileExists( $ReadmeFileName )
;以写模式打开文件,并写入题头信息
$file = FileOpen($ReadmeFileName,1)
; 检查文件是否正常打开
If $file = -1 Then
MsgBox(0, "错误", "无法打开目标文件"&$ReadmeFileName)
Exit
EndIf
;写入标题信息
if not $FileIsExist Then
FileWriteLine($file,"帮助说明文档")
FileWriteLine($file,$AuthorInfor)
EndIf
FileWriteLine($file,"")
FileWriteLine($file, getCommentLine("-",40) )
FileWriteLine($file,@YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN)

FileClose($file)
;运行记事本程序
Run("notepad.exe "& $ReadmeFileName) ;运行记事本程序
if WinWaitActive("readme.txt - 记事本") Then
Send("^{END}") ;下移到文件底部
Send("!+0") ;开启中文输入法
EndIf
;--------------------------------------------------------------------------
;获取一个注释字符串列
Func getCommentLine($CmtChar,$CmtNumber)
$ResultStr = ""
For $i = 0 to $CmtNumber -1
$ResultStr = $ResultStr & $CmtChar
Next
Return $ResultStr
EndFunc
;---------------------------------------------------------------------------

用AutoIt自带工具编译成exe文档后,在TotalCmd中设置一个自定义命令,参数是
%P,这样就可方便地在当前活动目录中创建Readme.txt文件了。