奇迹出现msg errormsg问题,进来解决一下

喜欢卫斯理小说。 在路上。。。
( Fri, 13 May 2011 15:49:47 +0800 )
Description:
雨还在不停的下着,心情也低沉很多,无法诉说的痛苦在内心弥漫,有谁会愿意听自己苍白的述说,有时候也会问自己,究竟为什么对有些事无法原谅,其实说到底也不是无法原谅,而是有些东西根本就没法强迫。自己的痛苦也许只有自己知道了。真的好想大醉一场,可是,醒来后呢,又该怎么面对?唉!逃避不是解决问题的方法,可是不逃避又能如何。
( Wed, 11 May 2011 10:22:13 +0800 )
Description:
或者生活就是一场博弈,在年过而立之后,突然感觉对家庭生活越来越不理解了。生活中的成员都开始固执的认为自己是对的,是与非直接从理性认识的模糊不清突然变得非此即彼了。
固执的态度让人沉闷的不想说话,心情便也到了一个低谷,无语并不是无话可说,而是明知道说出来也没用还不如自己闭嘴。生活就慢慢地熬吧,消及地看待一下,终有一天我们是要挂到墙上的,何必呢!
只是生活的现实却让我时时感觉痛苦,内心的煎熬无法被理解,真的有欲哭无泪的感觉,可是忍痛的心还是得压在自己心里,毕竟已经是成年人了,误解就误解吧,懒得解释了。就让时间把彼此磨掉吧。
( Thu, 21 Apr 2011 17:14:22 +0800 )
Description:
这一天又这样过去了,疲惫的双眼看着电脑,觉得真是乏味到极点,可是日子总是要过的,已经而立之年了,不再是那个青葱岁月的年轻小伙子了,不知道生活究竟给自己带来了什么。
黄昏的明亮照耀着这个机关楼的小四合院,耳边又是唧唧喳喳的废话连篇,我的思维似乎僵化了,似乎这些都不再是现实,我就如同穿越到一个陌生的年代,一切都那么陌生,一切都那么虚幻。
只是还是要醒来,每一天,总是那样的难以闲暇,究竟是自己在过生活还是生活在过自己。醒来吧,还是要挣扎着醒来吧。
( Wed, 20 Apr 2011 10:26:27 +0800 )
Description:
今天天气很好,联想的***来***指导无线网卡的问题,没有想到联想的***还是很敬业的,这样的国企希望能做强做大。
( Tue, 13 Jul 2010 12:33:22 +0800 )
Description:
昨晚加班一夜,真的好累好累!
( Thu, 8 Jul 2010 10:59:45 +0800 )
Description:
昨天晚上加班到十点多了,今天上午却又在这儿等着那边的人先搞,这种极其不合理的安排充斥着每件事,充斥着每一天,每一刻。
不是说不想干,真的在这种不合理的安排下会把人的激情一点点磨没了。于是就变得在挫败的感觉中等待着日子的消磨。
西班牙胜了德国,战车杯具了。西班牙一路坎坎坷坷走来,竟然走到了决赛,尽管赛前是夺冠大热门,但首战遭败还是让人大跌眼镜,真的不容易。
已经很久没再写过日记了,是忙吗,还是逃避?我也分不清,终于还是又写了,又或者年龄大了,经历了很多事情,惆怅多了?多愁善感了?不知道,只知道喜欢一个人静静的呆一旁,检视着内心的另一个自己。在我和另一个“我”的对白中,我时时会紧张的攥紧拳头。慢慢的,我想说话,一个人的说话,甚或不想听一点的回信,尽管空旷,但却寂静。
( Wed, 7 Jul 2010 22:30:20 +0800 )
Description:
昨晚上没睡好,中午又去买东西,没午休,感觉好累啊。晚上加班的时候眼皮都在打架,真困。要睡了。晚上没精力看德西大战了。
( Wed, 11 Feb 2009 22:04:05 +0800 )
Description:
读文件的方法:
from pyExcelerator import *
sheets = parse_xls("E:\work_python\wx\对应400张卡卡号.xls")
这样 Execl 文档中的数据就存入变量 sheets 中了.
分析读出的数据
打印 sheets
sheets
[(u'\u4e3b\u53f7\u526f\u53f7', {(0, 1): u'62172168', (0, 3): u'8985302080853097600---8985302080853097999', (0, 0): 1.0, (0, 2): u'15338172168'}), (u'Sheet2', {}), (u'Sheet3', {})]
发现 sheets 为一个 list. 该 list 中, 第一个元素为 "工作表1", 第二个为 "工作表2"
即, sheets = [工作表1, 工作表2, ...]
打印 sheets[0]
sheets[0]
(u'\u4e3b\u53f7\u526f\u53f7', {(0, 1): u'62172168', (0, 3): u'8985302080853097600---8985302080853097999', (0, 0): 1.0, (0, 2): u'15338172168'})
sheets[0] 为一个 tuple. tuple 的第一个元素为 "工作表"的表名, 第二个元素为 "工作表"的内容.
即, sheets[0] = (工作表名, 工作表内容)
分析工作表内容.
打印 sheets[0][1]
sheets[0][1]
{(0, 1): u'62172168', (0, 3): u'8985302080853097600---8985302080853097999', (0, 0): 1.0, (0, 2): u'15338172168'}
内容存放在一个 dict 中, 坐标当键、内容为值。
因此 parse_xls 返回的结果结构如下图:
为了得到指定的元素, 比如表格1第1行第2列的元素:
sheets[0][1][(1,2)]
定义成函数:
read_xls = lambda x, y, z: sheets[x][1][(y,z)]
函数 read_xls 入参: 工作表格序号, 元素的行号, 元素的列号
发表于: 2008-04-13,修改于: 2008-04-13 01:02,已浏览584次,有评论1条 推荐 投诉
网友评论
不错,写的很详细,期待写出pyexcelerator排版功能
引文来源 ( Wed, 11 Feb 2009 22:03:29 +0800 )
Description:
使用pyExcelerator来读写Excel文件(转载)
在发现 xlrd 之后不久就发现了 pyExcelerator(可用新立得***) ,它与 xlrd 不同,它主要是用来写 Excel 文件,当然读也是没有问题的。下面就它的使用简单地介绍一下。
一、Excel文件读取 ***: python setup.py i tall
from pyExcelerator import *
sheets = parse_xls('d:/a.xls')
很简单,与 xlrd 不同。xlrd 需要先调用book = xlrd.open_workbook(filename)打开文档,然后再调用sh = book.sheet_by_index(i)来得到第几个sheet,然后再使用sh.cell_value(i, j)得到i行j列的单元格的值。操作多了一点。而上面的parse_xls(filename)则直接返回一个列表,每一项就是一个sheet的数据。每项是一个二元组(表名,单元格数据)。其中单元格数据为一个字典,键值就是单元格的索引(i,j)。如果某个单元格无数据,那么就不存在这个值。看似简单,但从处理上不象 xlrd 一样,可以知道每个sheet的最大行数和列数,然后进行循环。而使用 pyExcelerator 好象没有最大行数和列数,再加上空数据又不存在,因此在处理上相对麻烦一些。这样在处理上还需要注意。它与 xlrd 一样都支持 unicode ,但好象没有 xlrd 一样方便地判断单元格的类型的方法,感觉还是 xlrd 在功能上可能要强一些。当然这只是个人感觉,再加上只是看了看例子,并没有怎么使用。
二、Excel文件写入
这个才是重头。那么***好 pyExcelerator 之后,读了 Readme.txt 之后了解到它的文档正在进行当中,因此想多了解如何使用它需要看它所带的例子,甚至看源程序。下面是我从例子中了解的如何写一个 Excel 文档需要了解的。
为了方便,在导入这个模块中使用了import *的方式。
from pyExcelerator import *
首先导入模块,然后是生成工作薄。
w = Workbook()
接着是加入一个工作表(sheet)。
ws = w.add_sheet('Hey, Dude')
然后就可以保存了。
w.save('mini.xls')
上面的代码加在一起就是:
from pyExcelerator import *
w = Workbook()
ws = w.add_sheet('Hey, Dude')
w.save('mini.xls')
这就是最小的一个例子了,在例子中叫mini.py。你可以在例子目录下运行mini.py看一看是不是生成了一个空的Excel文件。
如果想加入中文很简单,改为:
#coding=cp936
from pyExcelerator import *
w = Workbook()
ws = w.add_sheet(u'这是中文')
w.save('mini.xls')
这样上面的执行结果是生成一个空Excel文件,但它的第一个sheet的名字为“这是中文”。就这样,只要保证你写入时使用unicode就行了。
空文件可以生成,那么如何插入单元格呢?
ws.write(i, j, value)
其中value为值,可以是unicode。
接着,我们可能想改变单元格的样式,如字体:
font0 = Font()
font0.name = 'Times New Roman'
font0.struck_out = True
font0.bold = True
style0 = XFStyle()
style0.font = font0
这样我们创建了一个字体,然后又生成了一个样式。注意,
真正起作用的是样式
,字体不过是样式中的一种效果。
这样在写入单元格时带着这个样式就行了,还是使用上面的write()方法:
ws.write(1, 1, 'Test', style0)
这是在名为ws的sheet中的第(1,1)单元格写入了值为"Test"的内容,并且它的样式为style0。
然后我们还可以设置单元格的边框: borders = Borders() borders.left = 5 style.borders = borders
上面创建了一个边框效果,设置了左边框,至于5是什么意思,我也不清楚,随便写的。然后放到样式中。上面的例子可以参考format.py程序。
发表于: 2008-07-28 ,修改于: 2008-07-28 20:46,已浏览419次,有评论0条 推荐 投诉
引文来源 ( Wed, 11 Feb 2009 22:02:58 +0800 )
Description:
Python操作Word、EXCEL,ACCESS
2009年01月22日 星期四 下午 06:13
python Excel 编程
1)Excel hyperlink:
xlsA = win32com.client.Di atch('Excel.A lication')
cell = xls.A .ActiveSheet.Cells(1,1)
cell.Hyperlink.Add(cell,'http://xxx')
2)Excel row/column count:
sht = xlsA .ActiveSheet
sht.Colum .Areas.Count
sht.Rows.Areas.Count
*************************
[1]使用PyExcelerator读写EXCEL文件(Platform: Win,Unix-like)
优点:简单易用 缺点:不可改变已存在的EXCEL文件。
PyExcelerator是一个开源的MS Excel文件处理python包。它主要是用来写 Excel 文件.URL: http://sourceforge.net/projects/pyexcelerator/
我没有找到关于PyExcelerator的文档。只是看到了limodou的一篇介绍。
http://blog.donews.com/limodou/archive/2005/07/09/460033.a x
这个包使用起来还是比较简单的:)。带了很多小例子,可以参照。
例mini.py.
=================================
#!/usr/bin/env python
# -*- coding: windows-1251 -*-
# Copyright (C) 2005 Kiseliov Roman
__rev_id__ = """$Id: mini.py,v 1.3 2005/03/27 12:47:06 rvk Exp $"""
"导入模块
from pyExcelerator import *
"生成一个工作薄
w = Workbook()
"加入一个Sheet
ws = w.add_sheet('Hey, Dude')
"保存
w.save('mini.xls')
=================================
[2]使用COM接口,直接操作EXCEL(只能在Win上)
优点:可以满足绝大数要求。缺点:有些麻烦。:-)
这方面的例子很多,GOOGLE 看吧:-). 文档也可以参看OFFICE自带的VBA EXCEL 帮助文件(VBAXL.CHM)。这里面讲述了EXCEL VBA的编程概念,
不错的教程!另外,《Python Programming on Win32》书中也有很详细的介绍。这本书中给出了一个类来操作EXCEL 文件,可以很容易的加以扩展。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from win32com.client import Di atch
import win32com.client
cla easyExcel: """A utility to make it easier to get at Excel. Remembering to save the data is your problem, as i error handling. Operates on one workbook at a time.""" def __init__(self, filename=None): self.xlA = win32com.client.Di atch('Excel.A lication') if filename: self.filename = filename self.xlBook = self.xlA .Workbooks.Open(filename) else: self.xlBook = self.xlA .Workbooks.Add() self.filename = '' def save(self, newfilename=None): if newfilename: self.filename = newfilename self.xlBook.SaveAs(newfilename) else: self.xlBook.Save() def close(self): self.xlBook.Close(SaveChanges=0) del self.xlA def getCell(self, sheet, row, col): "Get value of one cell" sht = self.xlBook.Worksheets(sheet) return sht.Cells(row, col).Value def setCell(self, sheet, row, col, value): "set value of one cell" sht = self.xlBook.Worksheets(sheet) sht.Cells(row, col).Value = value def getRange(self, sheet, row1, col1, row2, col2): "return a 2d array (i.e. tuple of tuples)" sht = self.xlBook.Worksheets(sheet) return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Value def addPicture(self, sheet, pictureName, Left, Top, Width, Height): "I ert a picture in sheet" sht = self.xlBook.Worksheets(sheet) sht.Shapes.AddPicture(pictureName, 1, 1, Left, Top, Width, Height) def cpSheet(self, before): "copy sheet" shts = self.xlBook.Worksheets shts(1).Copy(None,shts(1))
"下面是一些测试代码。
if __name__ == "__main__": PNFILE = r'c:\scree hot.bmp' xls = easyExcel(r'D:\test.xls') xls.addPicture('Sheet1', PNFILE, 20,20,1000,1000) xls.cpSheet('Sheet1') xls.save() xls.close()
******************************************************************************
python Word 编程
http://doc.zoomquiet.org/data/20051227094903/
import win32com from win32com.client import Di atch, co tants w = win32com.client.Di atch('Word.A lication') # 或者使用下面的方法,使用启动独立的进程: # w = win32com.client.Di atchEx('Word.A lication') # 后台运行,不显示,不警告 w.Visible = 0 w.Di layAlerts = 0 # 打开新的文件 doc = w.Documents.Open( FileName = filenamein ) # worddoc = w.Documents.Add() # 创建新的文档 # 插入文字 myRange = doc.Range(0,0) myRange.I ertBefore('Hello from Python!') # 使用样式 wordSel = myRange.Select() wordSel.Style = co tants.wdStyleHeading1 # 正文文字替换 w.Selection.Find.ClearFormatting() w.Selection.Find.Replacement.ClearFormatting() w.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2) # 页眉文字替换 w.ActiveDocument.Sectio [0].Headers[0].Range.Find.ClearFormatting() w.ActiveDocument.Sectio [0].Headers[0].Range.Find.Replacement.ClearFormatting() w.ActiveDocument.Sectio [0].Headers[0].Range.Find.Execute(OldStr, False, False, False, False, False, True, 1, False, NewStr, 2) # 表格操作 doc.Tables[0].Rows[0].Cells[0].Range.Text ='123123' worddoc.Tables[0].Rows.Add() # 增加一行 # 转换为html wc = win32com.client.co tants w.ActiveDocument.WebOptio .RelyOnCSS = 1 w.ActiveDocument.WebOptio .OptimizeForBrowser = 1 w.ActiveDocument.WebOptio .BrowserLevel = 0 # co tants.wdBrowserLevelV4 w.ActiveDocument.WebOptio .OrganizeInFolder = 0 w.ActiveDocument.WebOptio .UseLongFileNames = 1 w.ActiveDocument.WebOptio .RelyOnVML = 0 w.ActiveDocument.WebOptio .AllowPNG = 1 w.ActiveDocument.SaveAs( FileName = filenameout, FileFormat = wc.wdFormatHTML ) # 打印 doc.PrintOut() # 关闭 # doc.Close() w.Documents.Close(wc.wdDoNotSaveChanges) w.Quit()**************************************************
python ACCESS编程
因为使用的第三方组件用到python,所以需要了解python的数据库操作。
后来找到了方法,写了如下的sample:
import win32com.client
def db1(): print "Start db1." try: co = win32com.client.Di atch(r'ADODB.Co ection') co .Open('Provider=SQLOLEDB.1;Pa word=123456;Persist Security Info=True;User Catalog=ECI-SERVICE;Data Source=10.240.4.135') rs = win32com.client.Di atch(r'ADODB.Recordset') rs.Cursorlocation=3 rs.Open('select * from EBP_B_AS_ALERT',co ) rs.MoveFirst() for x in range(rs.RecordCount): if rs.EOF: print "End of records" break else: print rs.Fields.Item(1).Value rs.MoveNext() rs.Close() co .Close() except: print "Except, now."
用的是win32com 的exte ion。Python2.2.3 自身不带win32 exte ion,需要***win32all-162(win exte io ).exe。
引文来源 ( Sat, 13 Dec 2008 22:56:59 +0800 )
Description:
Using Py2Exe (Python)
Please su ort our
advertiser: Programming Forums
Py2Exe takes your Python code file and packages it into an executable file that you can distribute to a client that does not have Python i talled. The executable file contai your byte code, all the required modules and the Python interpreter. It is not a small file.
The i et is a template to run Py2Exe. For convenience, all the needed modification are done to the last line of the i et. It is best to have this i et, modified to accept your code file, and your code file in the same directory. Just follow the i tructio in the remark section.
Note that Py2Exe only works with the Windows OS, and is freely available from:
# Py2Exe version 0.6.3 setup file for co ole programs.
# If this is a windows GUI a lication replace the last line with
# windows = [{"script": 'myFile.py'}] )
# Enter the file name of your own .py code file in the last line, lets say it's test1.py
# so the last line should be: co ole = [{"script": 'test1.py'}] )
# then save this program as p2e_test1.py to the same directory where your code file is located
# Now run p2e_test1.py ...
# Two subfolders will be created, called build and dist.
# The dist folder contai your .exe file, MSVCR71.dll and w9xpopen.exe (needed for os.popen() only)
# Your .exe file contai your byte code, all needed modules and the Python interpreter.
# The MSVCR71.dll can be distributed, but is often already in the system32 folder.
# The build folder can be deleted.
# tested with Python24 and Py2Exe v0.6.3 by vegaseat 27may2006 from
distutils
sys # no arguments
"py2exe"
) # creates a standalone .exe file, no zip files
optio =
"py2exe"
"compre ed"
"optimize"
"ascii"
"bundle_files"
zipfile
# replace myFile.py with your own code filename here ...
co ole =
"script"
'myFile.py'
引文来源 ( Tue, 25 Nov 2008 22:36:37 +0800 )
Description:
用 Ecli e IDE 和 Apache Ant 构建工具进行 Pytho 开发
a.t.jamy 发表于 2006-5-23 21:37:00
用 Ecli e IDE 和 Apache Ant
构建工具进行 Python 开发 级别: 初级
2004 年 6 月 01 日
Python 是一种非常灵活强大的动态脚本编程语言,具有完整的面向对象特性。众多的支持者指出,Python 语言与其他语言相比能更快更有效地表达出他们的意图。但是从 Java 技术? 或 Microsoft .NET 刚刚转到 Python 的人会发现,功能丰富而精致的 IDE 和开发工具都不见了。那些开发人员可以从他们熟悉的 Java 开发工具中找到解决方案。本文着重介绍了如何使用基于 Java 技术的流行开发工具 Ecli e 和 Ant 进行 Python 开发。
多年以来, Java 语言和 Python 阵营之间一直存在大量的异花授粉现象。在这方面作出突出表率的可能是 Jython。这是一个纯粹用 Java 实现的 Python 运行时环境。按照这一说法,您将研究如何用 Ecli e IDE 和 Ant 构建与部署工具实现 Python 开发。Ecli e 和 Ant 是非常流行的工具,它们特性丰富、可扩展性强、而且开放源代码;Python 也具有相同的品质。PyDev 和 PyAntTasks 分别是 Ecli e 和 Ant 的扩展,有了它们就可能用这些 Java 工具开发 Python。本文从下载***所需的工具与扩展开始讲起。为了解释如何在 Python 开发中使用 Ecli e 和 Ant,我将用实际的 Python 代码例子读取 RSS 资源。
本文不会涉及 Ecli e、Ant、Python 的细节。有关这些话题的深入讨论,请参阅 参考资料 一节中的链接。
Python 支持情况
本文用到的软件都在 CPython 2.3 下测试过。除了几个异常情况之外,应该也能在 Jython 中运行。特别需要指出,PyDev 调试器目前不支持 Jython。另一个区别是通过 Jython 执行的脚本在从 PyDev 中运行之后就转入交互模式,这样就必须手动杀死。PyDev 编辑器与 Jython 的源代码兼容,Python Ant 任务除 py-doc 任务之外也和 Jython 兼容。
Ecli e 概述
Ecli e 是一个 Java 技术集成开发环境,由 IBM 开发,并开放其源代码。它是 IBM 商业软件 WebSphere A lication Development 环境以及其他多种工具的基础。Ecli e 的开发社区非常活跃,他们不仅开发 Ecli e 本身,还开发大量的插件供 Ecli e 使用。有关 Ecli e 和 Ecli e 插件的 Web 站点,请参阅 参考资料 一节中的链接。尽管从传统上讲 Ecli e 是一种 Java 开发工具,但是一些插件的存在使得在 Ecli e 中开发其他语言的程序成为可能,如 C/C++、Python 和 Perl。
在 Ecli e 中,源代码被组织到项目(project)中。项目可以加载、卸载和导入。Ecli e 用户界面的结构划分为视图(View)与编辑器(Editor)。视图与编辑器的例子包括:源代码大纲视图、Java 源代码编辑器、Python 源代码编辑器和文件系统导航视图。Ecli e 用户界面中最关键的隐含概念就是
视角(per ective)
。视角是通常在执行某种类型活动时一起使用的一组视图。Ecli e 中的标准视角包括:Debug、Java Browsing、Java、Java Type Hierarchy、Plug-in Development、CVS Repository Exploring、Resource 和 I tall/Update。目前还不存在单独的 Python 视角。在进行 Python 开发时,我通常使用 Resource 视角和 Debug 视角。
*** PyDev
首先,从 Ecli e Web 站点上下载 Ecli e(请参阅 参考资料 一节中的链接),并根据您的平台,按照下面的***指南*** Ecli e:
Ecli e 的更新机制使 PyDev 插件的***更加容易。从 Ecli e 中选择
Help Software Updates Update Manager
,启动 I tall/Update 视角。在左下角的 Feature Updates 视图中,将 PyDev 插件更新站点作为新的 Site Bookmark 添加到“Sites to Visit”文件夹下。Ecli e 的 PyDev 更新站点 URL 为 http://pydev.sf.net/updates/。现在,Feature Updates 编辑器中应该显示出“PyDev”这一特性。在 Feature Updates 编辑器中,展开
PyDev Other
,选择其中显示的 PyDev 特性(至少应该是 0.4.1)。然后选择 “I tall Now”***该特性。Ecli e 将下载 PyDev 插件,并将其***到 Ecli e 中。
导入样例项目
为访问本项目中使用的样例代码,可先下载 zip 文件(请参阅 参考资料一节),在文件系统中展开该 zip 文件,然后将其中的项目导入 Ecli e。导入项目的方法是先切换到 Resource 视角,选择
File Import
,再选择“Existing Project into Work ace”,然后选择您展开 zip 文件的位置。这时,Navigator 视图中应该出现 feedParserTest 项目。
样例项目中已经包含了 Fead Parser 通用资源解析库,该库按 Python 开放源代码许可协议发布。有关 Feed Parser 项目 Web 网站的链接,请参阅 参考资料 一节。
PyDev 漫游
现在开始学习如何通过已导入的项目了解 PyDev 的特性。PyDev 正处于开发过程中,但已经是非常高效的 Python 开发环境。现在的 PyDev 主要包括以下特性:
包含 Python 语法高亮显示特性的 Python 编辑器。 进行 Python 语法分析,并在 Python 编辑器和 Tasks 视图中高亮显示错误。 可将制表符转换成空格的选项。 Outline 视图显示导入的库、类以及函数。 终端视图中的 Python 堆栈跟踪信息可超链接到源代码中。 源代码内部的超链接;同一模块内的导入和函数调用可通过超链接进行导航。 从 Navigator 视图中运行 Python 脚本的能力。 调试器支持断点、代码单步执行以及显示变量的值。
PyDev 选项窗口
Window Preferences
,并选择 PyDev(请参阅图 1),便可访问 PyDev 选项。第一组选项可以改变 PyDev 在源代码中处理制表符的方式,还可以改变语法元素的颜色。
图 1. PyDev 选项窗口
设置 Python 解释器
PyDev Debug 选项可以选择 Python 解释器,供执行 Python 代码时使用。如果 PyDev 无法找到 Python 解释器,或者想使用别的解释器,可在此设置(请参阅图 2)。
图 2. PyDev Debug 选项
处理源代码
我的大部分 Python 工作都是在 Resource 视角中完成的。使用方法是先切换到 Resource 视角,然后在左上角的 Navigator 视图中双击 feedParserTest/src/feedparserTest/FeedparserTest.py 文件。Python 编辑器打开该文件,对 Python 语法进行解析,完成设置颜色和语法检查的工作(请参阅图 3)。
图 3. Python 编辑器
如果源代码中有任何错误,则显示在右下角的 Tasks 视图中显示出来。双击 Tasks 视图中的错误,便可找到那条讨厌的代码行。
Outline 视图在左下角,其中用一种便于浏览的结构显示出当前正在编辑的文件。导入的库、类、函数全都显示出来,通过双击 Outline 视图中的项目,便可以实现导航。PyDev 在编辑 Python 文件的过程中对齐进行预先解析的工作,同时更新 Outline 视图,执行语法检查,并用不同颜色显示语法元素。
编辑器的特性
PyDev 0.4 版在 Python 源代码编辑器中为函数和导入库加入了超链接的特性。如果在越过某项导入或函数调用(必须在 PYTHONPATH 目录中)的同时按下 Control 键,PyDev 就能显示出一个超链接,这样您可以在导入库或函数的源代码之间导航。请注意,为了在您自己的源代码中跨模块使用该特性(从一个模块链接到另一个模块),必须修改 PYTHONPATH 环境变量,在其中加入这些模块,这样 PyDev 就可以找到它们了。
人们已经开始将一些优异的源代码编辑特性加入最新版本的 PyDev 中,其中就包括代码块注释与取消注释,以及代码左右移位(请参阅图 4)。
图 4. PyDev 编辑器的其他特性
运行 Python 脚本
如果不能执行代码,那么 IDE 也不是太有用。为执行 Python 代码,可从 Navigator 视图中选择 feedparser.py 文件,用右键点击,然后选择
Python Run
。随后会显示 Python 的启动配置窗口(请参阅图 5)。
图 5. Python 启动配置
脚本执行时输出信息显示在 Co ole 窗口中。如果有错误出现,Co ole 窗口中将显示堆栈跟踪信息,其中的每一行都可以通过超链接找到 Python 源代码。
Python 调试器
Python 调试器是最近才加入 PyDev 插件中的。要使用调试器,可在 Python 编辑器中想中断的代码行的左侧点击,设置断点。在图 6 中,我在 feedparser.py 的 1830 行处设置了断点。然后在 Navigator 视图中选择这个 Python 模块,点击右键,选择“Python Debug...”。这时将显示与前面相似的一个启动配置窗口。点击
进入 Debug 视角,同时启动调试器。
图 6. Python 调试器
左上角的 Debug 视图显示当前正在执行的进程和线程,右上角的 Variables 视图显示当前运行域中的所有变量,Python 编辑器会显示调试器目前停在哪条语句上,同时所有的输出信息都显示与 Co ole 视图中。调试器可以通过 Debug 视图底部的按钮或 Run 菜单进行控制。
其他 Ecli e 特性
Ecli e 及其插件还具备很多其他的特性,可应用于 Python 开发中,如 XML 编辑器、UML 编辑器(不过大多数是以 Java 代码为中心),还有资源控制方面的插件。目前 Ecli e 插件站点上列出的插件几乎有 500 个(请参阅 参考资料 一节中的相关链接)。我将着重介绍一个对很多 Python 开发人员都特别有用的插件:Ecli e 发行版中已经包括的 CVS 插件,不过不会讨论细节内容。
Ecli e 中包括特性丰富的集成 CVS:
支持 SSH、 erver、ext 等连接方法。 基本 CVS 命令的支持:检出项目、提交变更、更新、向.cvsignore 中增加文件或模式等等。 文件合并查看。 在源代码控制中实现对文件不同之处的比较。 项目同步,并用资料库显示出删除和新增的内容。
还可以通过提供其他插件来支持其他源代码控制系统,如 ClearCase、Subversion、Visual SourceSafe 等。
Python 解释器支持 Python 代码的交互式执行。这种方式对于调试一段代码是非常有用的,因为不用把代码放进 Python 脚本中并执行脚本了。同时,Python 解释器的交互模式可以很容易地集成到 Ecli e 中。
要增加对 Python 交互式执行的支持,可通过
Run External Tools External Tools
增加一个 External Tool 启动程序。这时将打开 External Tool 启动程序配置窗口。在 Configuratio 列表中选择“Program”,然后点击“New”创建一个新的配置。将该配置命名为诸如 "pythonInteractive" 之类,然后设置 Location,令其指向您的 Python 解释器,接着,将 "-i" 作为唯一的参数传递进来(请参阅图 7)。
在 Common 选项卡下,选中复选框,使该配置在 External Tools 收藏夹菜单中显示出来。
图 7. Python 交互方式配置
要运行刚刚在 Ecli e 中创建的启动器,可选择
Run External Tools pythonInterpreter
。Python 解释器的输出显示在 Co ole 视图中。Co ole 中可输入 Python 命令并执行,就像从命令行中执行 Python 一样。为导入并在交互模式下使用模块,您需要将模块的位置增加到 PYTHONPATH 环境变量中。
在 Ecli e Co ole 中执行 Python 与用命令行执行的不同之处在于,无法启用命令历史特性(通过向上和向下的方向键实现),因为 Ecli e Co ole 会自己解释这些键。
在 Python 开发中使用 Ant
Python 会在它需要的时候自动编译模块。这意味着 Python 开发人员通常不必显式地对模块进行编辑。即便如此,有时候手工编译 Python 代码还是很有用的,同时,构建和部署过程中还有很多其他方面的内容可以自动化实现。这也正是构建工具的用武之地。
我将着重介绍来自 Java 编程世界中的 Apache Ant,这个工具可大量应用在 Python 开发中。Apache Ant 是 Java 编程领域内事实上的标准构建工具。它更加轻便,与 Java 技术结合得更好,可用于替代其他的构建工具。Ant 可以在支持 Java 编程语言的任何一种平台上运行。尽管我们需要的大多数构建特性 Ant 都已经提供了,但如果要将 Ant 用做 Python 构建工具,还是需要有一些关键的与 Python 相关的特性。我已经开发了若干定制的 Ant 插件(用 Ant 的行话讲叫做 task),可提供构建 Python 时需要的特定于 Python 的特性。
Ant 用 XML 作为描述构建的格式。build 文件组织为需要执行的目标。每一个目标都可能依赖于其他的目标。Ant 将根据您所请求执行的目标,以及一组依赖目标,来执行任何需要的目标。每一个目标都可能包含任意数量的 Ant 任务,而由 Ant 任务实际执行目标的工作。Ant 有很多内置的任务,可以完成诸如编译 Java 代码、生成文档、操纵文件和目录,同时第三方又提供了很多附加的任务。
*** Python Ant 库
我将通过为 feedparser 项目创建构建脚本来介绍 Ant 构建脚本和 Python Ant 任务的基础知识。为了使用 Python Ant 任务,您需要下载并***包含这些任务的 Java 库。首先,从 参考资料 一节中列出的 URL 中下载 Python Ant 任务库(pyAntTasks.jar)。然后,将 JAR 文件拷贝到 Ecli e 的 Ant 插件下的 lib 目录中。这应该是 Ecli e ***目录下形如 plugi /org.apache.ant_1.5.3 的子目录。
Python Ant 任务库拷贝完毕之后,必须在 Ecli e 中启用库。选择
Window Preferences
,然后选择
Ant Runtime
。将 Ant Home Entries 展开,其中可看到 Ecli e 使用的库(JAR 文件)列表。选择“ Add JAR”,然后从 Ecli e Ant 插件的 lib 目录中选择 Python Ant JAR 文件,就可以将刚刚拷贝的 Python Ant JAR 文件加入库列表中(请参阅图 8)。
您现在应该能够创建和运行包含 Python 任务的 Ant 构建脚本了。下面进入构建脚本内部!
创建构建脚本
我将逐步介绍如何创建一个简单的 Python 构建脚本(请参阅清单 1)。完整的构建脚本 build.xml 可从 feedParserTest 项目的顶层目录中找到。
< roject default="compile" taskdef resource="pyAntTasks.properties"/ < roperty value="src"/ target < y-compile dir="${src.dir}" pytho ath="${src.dir}" optimize="0"/ /target /project
先介绍一个只编译 Python 样例代码的构建脚本。< roject 标签总是构建脚本的根标签。taskdef 标签声明在整个构建脚本中使用的 Python 任务。在构建脚本的底部,可以定义 compile 目标。目标元素内部是 compile 运行期间执行的任务。特别的是 py-compile 任务,它负责从 src 目录开始,编译所有的 Python 代码。该任务会递归遍历所有的子目录,并编译所有的 Python 模块。脚本中没有采用将 src 目录硬编码到调用之处的方式,而是在构建脚本中定义了称为 src.dir 的属性。然后,在需要使用这个目录名的时候,就可以通过 ${src.dir} 来引用。
要运行构建脚本,可从 Ecli e 中打开它。Ecli e 具有内置的 Ant 构建脚本编辑和浏览功能。Outline 视图可以显示出构建脚本的结构。在 Navigator 视图中,选择该构建脚本,用右键点击,然后选择“Run Ant...”。选择 compile 目标,然后点击“Run”。构建脚本执行过程中的输出信息应该显示在 Co ole 视图中,表示运行成功。
Python 脚本执行任务
接下来将向构建脚本中加入新的目标,用于执行 Python 脚本(请参阅清单 2)。在本例中,可以将 RSS URL 作为参数来执行 feedparser.py 脚本。
上面的目标以 RSS URL 为唯一的参数来执行 feedparser.py 脚本。该目标声明为依赖于 compile 目标,所以后者将首先执行。实际上这一步并不是很必要,因为 Python 会根据需要自动编译源代码。如果您执行 run.feedparser 目标,就会运行 feedparser.py 脚本,同时将 RSS 的内容输出到 Co ole 中。
Python 文档任务
Python 的 API 文档编制机制与 Java 技术中的 JavaDoc 系统类似,称为 PyDoc。在构建脚本中加入清单 3 中列出的如下 XML 片断,可为所有的 Python 模块生成 PyDoc。
1: < roperty value="pydoc"/ 2: 3: target 4: mkdir dir="${pydoc.dir}"/ 5: /target 6: 7: target depends="init,compile" 8: < y-doc pytho ath="${src.dir}" destdir="${pydoc.dir}" 9: fileset dir="${src.dir}" 10: include / 11: /fileset 12: /py-doc 13: /target
从对上述 pydoc 目标的解析可看出,第 7 行声明了目标名称,并指出它依赖于 init 和 compile 目标。这意味着在运行 pydoc 目标之前,Ant 必须保证 init 和 compile 目标已经运行,如果没有,则首先运行这两个目标。
pydoc 目标所依赖的 init 目标在第 3 至第 5 行定义。 init 目标仅仅创建了一个存放 PyDoc API 文档文件的目录。如前所述,要为所生成文档的保存位置定义一个属性,名为 pydoc.dir。
第 8 行开始是 py-doc 任务。如前所述,您传入生成 pydoc 过程中所使用的 PYTHONPATH 。 destdir 属性告诉 py-doc 任务将生成的 HTML 文档输出到何处。
第 9 至第 11 行定义了在生成文档的过程中应该处理哪些 Python 源文件。文件集是 Ant 脚本中通用的结构,可用于定义所操作的一组文件。这是一种很强大的特性,它使您能够通过名字模式、布尔逻辑和文件属性来选择所要操作的文件。Ant 文档中有这方面的完整描述。本例中递归选择了“src”目录下的所有文件。
Python 单元测试任务
Python 中具有标准的单元测试框架(从 Python 2.3 开始。在 Python 2.2 中这只是可选模块),与 Java jUnit 框架十分类似。测试用例的结构与 jUnit 采用相同的方式。每一个待测试的类和模块通常都具有自己的测试类。测试类中包含测试装置(fixture),它们在 setUp 函数中初始化。每一个测试都编写为测试类中的一个独立的测试函数。unittest 框架会在测试函数之间循环往复,先调用 setUp 、再测试函数、然后清除( tearDown )测试函数。请参阅清单 4 中的样例。
清单 4. Python 单元测试模块
import unittest from rint import rint import feedparser cla FeedparserTest(unittest.TestCase): """ A test cla for the feedparser module. """ def setUp(self): """ set up data used in the tests. setUp is called before each test function execution. """ self.developerWorksUrl = "testData/developerworks.r " def testParse09R (self): """ Test a succe ful run of the parse function for a 0.91 RSS feed. """ print "FeedparserTest.testParse09RSS()" result = feedparser.parse(self.developerWorksUrl) rint(result) self.a ertEqual(0, result['bozo']) self.a ert_(result is not None) cha el = result['cha el'] self.a ert_(cha el is not None) chanDesc = cha el['description'] self.a ertEqual(u'The latest content from IBM developerWorks', chanDesc) items = result['items'] self.a ert_(items is not None) self.a ert_(len(items) 3) firstItem = items[0] title = firstItem['title'] self.a ertEqual(u'Build i tallation packages with solution i tallation and deployment technologies', title) def tearDown(self): """ tear down any data used in tests tearDown is called after each test function execution. """ pa if __name__ == '__main__': unittest.main()
上述清单是实现 feedparser 模块基本测试功能的测试类。完整的测试类见 feedParserTest 项目下的 src/feedparserTest/FeedparserTest.py。 setUp 函数负责准备整个测试过程中需要使用的测试装置,在本例中只有测试用的 RSS 文件的目录,测试函数将对其进行解析。 testParse09R 是真正的测试函数。这个函数调用 feedparser.parse 函数,传递测试用的 RSS 文件,输出解析结果,并通过 TestCase 类的 a ert 函数执行基本的检查统作。如果任何 a ert 的求值结果不是真,或是在执行过程中抛出任何异常,unittest 就会报告一次测试失败或错误。最后的两行负责在这个测试类内部运行测试,方法是直接运行该模块即可。
要独立运行该测试类,可以按前面所说的相同方式运行 FeedparserTest.py 模块。在 Ecli e Navigator 视图中选择 FeedparserTest.py,然后通过
Python Run
运行。此时显示启动配置窗口。除 Base 目录之外,其他都保持缺省值即可。Base 目录必须是 feedParserTest 项目的目录,这样才能在当前目录下找到 RSS 文件(testData/developerworks.r )。修改 base 目录的设置,然后点击“Run”。输出信息显示在 Co ole 上。
您也许希望我们编写的所有单元测试都能够作为构建的一部分自动执行。将下面清单 5 所示的构建片断加入构建脚本便可实现。
1: target depends="compile" 2: < y-test pytho ath="${src.dir}" dir="." 3: fileset dir="${src.dir}" 4: include / 5: /fileset 6: /py-test 7: /target
第一行是目标声明,这与其他的脚本相同。第 2 至第 6 行调用 py-test 任务。这部分代码将在“src”目录下查找所有以“Test.py”结尾的所有文件,并运行所有测试。 PYTHONPATH 设置为“src”,测试执行的当前工作目录就是当前目录(‘.’)。
运行目标的方法是先运行构建脚本,再选择执行“tests”目标。该目标将运行所有以“Test.py”结尾的测试用例,本例中仅有 FeadparserTest.py。
结束语
Ecli e 和 PyDev 插件的结合,以及 Apache Ant 与 Python Ant 任务一起使用,可以为 Python 开发提供完全集成的开发环境和构建/部署工具。这些工具尚在开发过程中,因此要经常查看是否有更新,如果您觉得特别希望看到某种特性,可以卷起袖管自力更生。
参考资料
下载 developerWorks Su cription 精选产品的免费试用版,这些产品可运行于 Linux 上,包括 WebSphere Studio Site Developer、WebSphere SDK for Web services、WebSphere A lication Server、DB2 Universal Database Personal Developers Edition、Tivoli Acce Manager 以及 Lotus Domino Server。下载链接在 developerWorks 的 区。想更快开始么?请自己访问产品使用文档和技术支持。
关于作者
Ron Smith 是 RPS Technologies, Inc 的创始人。这是一家软件开发与软件顾问公司,总部位于芝加哥地区。Ron Smith 为客户提供基于 J2EE 的企业应用程序发方面的咨询,同时也在 RPS Technologies 内部开发软件产品。可以通过 与 Ron 联系。
Re:用 Ecli e IDE 和 Apache Ant 构建工具进行 Pytho 开发
qiushuiyiren(游客)发表评论于2007-3-22 12:45:00
你好,我按照这篇文章的方法配置了我的ecli e但是在使用py ant task 时出现了以下的错误,
buildfile: d:\pythonwork\feedparsertest\build.xml
[taskdef] could not load definitio from resource pyanttasks.properties. it could not be found.
compile:
build failed
d:\pythonwork\feedparsertest\build.xml:37: could not create task or type of type: py-compile.
不知道是什么原因,能不能帮我看一下
邮箱是biyan1983@126.com
发表评论:
引文来源 ( Thu, 6 Nov 2008 09:32:19 +0800 )
Description: 在电脑的使用中往往会遇到各种各样的连接线。这些连接线外观上好像都差不多,但内部结构完全不同并且不能混用。如果在使用中这些连接线坏了,往往很多使用者都不知道应该怎么办,下面就给出这些常见的连接线的连线方法以便于修理或查找故障。在介绍之前先对一些市场常用名词做出解释。现在所有的接头都可以分为公头和母头两大类。
  公头:泛指所有针式的接头。
  母头:泛指所有插槽式的接头。
  所有接头的针脚有统一规定,在接头上都印好了的,连接时要注意查看。
  在接线时没有提及的针脚都悬空不管。
  下面给出串口,并口各针脚功能表以供高级用户维护电缆或接头时使用。
并口针脚功能一览表
25针串口功能一览表
联机线的连接方法
  联机线主要用于直接把两台电脑连接,分为串口(com1,com2)联机线和并口(lpt1)联机线。比较早一点的AT架构的电脑的串口有为9针,和25针两种,现在的ATX架构的电脑两个串口全部是9针。打印机的接口也是25针的但功能、外观上与AT架构的25针串口不一样。于是联机线就分为4种(9针对9针串口联机线,9针对25针串口联机线,25针对25针串口联机线,25针对25针并口联机线)其中3种串口连接,一种并口连接。并口联机线和串口联机线最大的差别就是速度,前者明显快于后者。这些直接电缆连接线的两个头完全相同可以互换的连线方法如下表:
  首先我们必须准备2个连接头,以及大约1.5米的联机线,联机线应该选用带屏蔽的多芯线,把多余未用的芯全部接在接头的金属壳(地线)作为屏蔽用。
串口连机线一览表
并口联机线一览表
打印机连接线的
  现在使用的打印机连接线端口是25针公头的,和并口联机线使用的接头针脚数一样,但打印机连接线的两个头是不一样的,分别接电脑和打印机不能互换。
  首先准备一个25针接头,和一个36线打印口接头。并且先将25针接头的18-25针脚连接在一起。把36线打印口接头的19-30脚连接在一起。然后使用一根芯把这两组连接在一起。其余线的线方法如下表:
打印机连接线一览表
连接完成以后一定要认真检查看是否有错误!!避免不必要的情况发生。
外置调制解调器连接线
  现在所使用的外置调制解调器的连线,有两头,一头是通过串口连接电脑,另一头直接连接到调制解调器。连接调制解调器的是用的25针公头,也有用9针的这个连接头与25针串口连接母头有区别。连接电脑可以使用9针母头,也可以使用25针母头。
  首先准备9针或25针母头1个。连接调制解调器的25针公头1个。带屏蔽的多芯连接线1米左右。连接方法如下: 串口转接线
  这种转接线适用于9针串口和25针串口的转换。
  首先,根据需要(9转25或25转9)选择两个转接头。选择方法如下:
  9针转25针(9针公头,25针母头)。25针转9针(25针公头,9针母头)。然后使用尽量短的带屏蔽的多芯连接线。连接方法如下表 U 连接线
  U 全称Universal Serial Bus(通用串行总线)是用于将适用USB的外围设备连接到主机的外部总线结构,其主要是用在中速和低速的外设,USB的电缆有四根线,两根传送的是5V的电源,对于一些外设可以直接利用它来供电。另外的两根是数据线,数据线是单工的,在整个的一个系统中的数据速率是一定的,要么是高速,要么是低速。U 的针脚定义如下:
  如果在某个接口或连接线上面看到u 标志图,就可以确定为u 设备无疑。并且当使用者把u 设备在机器运行的时候连接到电脑上,操作系统会立即探测到u 设备并且自动***相应的驱动程序完全不需要使用者操心,这就是它的不关机下的真正即插即用。制作u 连接线首先要有两个u 公头,u 有4个芯,所以我们只需要5根芯(第五根芯将u 接头的金属部分连接)的线就可以了,不过使用屏蔽的多芯连接线把多的芯连接到u 接头的金属部分效果会更好。
引文来源 ( Sun, 2 Nov 2008 21:45:31 +0800 )
Description:
  在当今的计算机世界里,使用率最高的两种文档方式分别是Microsoft Word的Doc格式和Adobe Acrobat的Pdf格式文件。由于微软的渗透,我们现在所使用的绝大部分文稿或报告的格式都是Doc的,而Pdf格式的文件由于其在网络上传输的便利和安全性,也被广泛的使用。但两者由于所处的公司不同,出于商业目的,互相不能直接打开使用。因此,也就给我们广大的文件用户增添了很大的麻烦。
  最近笔者就曾遇到了这么一个情况,我的老板搞到一份50多页的Pdf格式的文件,由于删除、编写的不方便,让我将这篇文档转换为Doc格式的文件,他以为很简单的事情,让我熬了一个通宵,才复制、粘贴完成,而且得到的文件格式与原来的Pdf格式相去甚远。所以,寻找合适的两种格式的转换方式,是一件“功在当代”的大事。
  1、Doc格式文件转换为Pdf文件
  Doc文件向Pdf格式转换还是比较容易的,主要通过Adobe 公司提供的Adobe Distiller虚拟服务器实现的,在***了Adobe Acrobat完全版后,在Windows系统的打印机任务中就会添加一个Acrobat Distiller打印机,如图1所示:
  现在比较流行的DoctoPdf类软件如Pdfprint等的机理都是调用Adobe Distiller打印机实现的,如果想把一个Doc文件转换为Pdf文件,只要用Office Word打开该Doc文件,然后在“文件”—“打印”中选择Acrobat Distiller打印机即可,如图2所示:
这样,就可以很轻松的将Doc格式的文件转换为Pdf文件。
  2、Pdf格式文件转换为Doc文件
  Pdf格式文件向Doc文件转换相对比较难,因为Pdf格式与Doc格式解码格式不同,在Pdf下的回车符、换行符以及相关的图片格式无法直接转换为Doc文件,笔者之前一直使用复制文本,然后粘贴到Word中实现Pdf向Doc格式的转换。
  今天突然发现了一款非常好的Pdf向Doc格式转换的工具,ScanSoft PDF Converter for Microsoft Word v1.0。它是由ScanSoft公司同微软共同组队开发了一个全新的Office 2003 插件。该插件可以帮助你通过Word直接将Pdf文档转换为Word文档,并且完全保留原来的格式和版面设计。
  这个名为 ScanSoft PDF Converter for Microsoft Word 的插件是首先捕获Pdf文档中的信息,分离文字同图片,表格和卷,再将其统一到Word格式。现在你可以重新利用早先你从网络上下载或Email中收到的Pdf文件中的信息,而无需添加任何其他软件。
  ScanSoft PDF Converter for Microsoft 已经非常紧密的同Office 2003整合在一起了,有两种方式可以将Pdf格式转换成Doc文件。
  第一种方式,在Microsoft Word 2003中你可以直接通过“文件”—“打开”来打开Pdf文件。ScanSoft PDF Converter for Microsoft Word插件会自动弹出了,如图3所示,经过转换后我们就可以得到想要的Doc文件。
  第二种方式,ScanSoft公司也已经开发了基于此的Smart Tag(Office 2003中重要的功能元件)能够轻松的通过右键来将PDF文件转换成为 Microsoft Word 文件(如图4所示)。
  注意,在***ScanSoft PDF Converter for Microsoft Word的时候建议关闭正在运行的Office Word,Internet Explorer和Outlook等软件。
  以上就是我在实践中发现的Word文件与Pdf文件相互转换的方法,拿出来与大家共享!
引文来源 ( Thu, 23 Oct 2008 09:59:06 +0800 )
Description: 在一个用户进程进行I/O操作时,它首先调用“打开”获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述用户在打开的文件或设备上进行I/O操作的进程。然后这个用户进程多次调用“读/写”以传输数据。当所有的传输操作完成后,用户进程关闭调用,通知操作系统已经完成了对某对象的使用。 TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/O操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。首先,进行网络操作的两个进程在不同机器上,如何建立它们之间的联系?其次,网络协议存在多种,如何建立一种通用机制以支持多种协议?这些都是网络应用编程界面所要解决的问题。 在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面──套接字(socket)在网络软件中被广泛应用,至今已引进微机操作系统DOS和Windows系统中,成为开发网络应用软件的强有力工具,本章将要详细讨论这个问题。 进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe)、命名管道(named ipe)和软中断信号(signal),UNIX ystem V的消息(me age)、共享存储区(shared memory)和信号量(semaphore)等,但都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(proce ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。 按照OSI七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocol ort,简称端口)的概念,用于标识通信的进程。 端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之。 类似于文件描述符,每个端口都拥有一个叫端口号(port umber)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。
端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己与该端口号联系起来(绑扎)。TCP/IP端口号的分配中综合了上述两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-know ort),即使钥纪纪同机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP均规定,小于256的端口号才能作保留端口。 网络通信中通信的两个进程分别钥纪纪同的机器上。在互连网络中,两台机器可能位涌纪纪同的网络,这些网络通过网络互连设备(网关,网桥,路由器等)连接。因此需要三级寻址: 不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(低价先存),有的存高位字节(高价先存)。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,它们均含在协议头文件中。 两个进程间的通信链路称为连接。连接在目纪纪表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。 在网络分层结构中,各层之间是严格单向依赖的,各层次的分工和协作集中体现在相量纪纪之间的界面上。“服务”是描述相量纪纪之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。下层是服务提供者,上层是请求服务的用户。服务的表现形式是原语(primitive),如系统调用或库函数。系统调用是操作系统内核向网络应用程序或高层协议提供的服务原语。网络中的n层总要向n+1层提供比n-1层更完备的服务,否则n层就没有存在的价值。 在OSI的术语中,网络层及其以下各层又称为通信子网,只提供点到点通信,没有程序或进程的概念。而传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制,流量控制,数据排序(报文排序),连接管理等问题,为此提供不同的服务方式: 面向连接服务是***系统服务模式的抽象,即每一次完整的数据传输都要经过建立连接,使用连接,终止连接的过程。在数据传输过程中,各数据分组不携带目的地址,而使用连接号(co ect ID)。本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。TCP协议提供面向连接的虚电路。 无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复与重传,不保证传输的可靠性。UDP协议提供无连接的数据报服务。 在网络传输中,两个连续报文在端-端通信中可能经过不同路径,这样到达目的地时的顺序可能会与发送时不同。“顺序”是指接收数据顺序与发送数据顺序相同。TCP协议提供这项服务。 保证应用程序接收的数据无差错的一种机制。检查差错的方法一般是采用检验“检查和(Checksum)”的方法。而保证传送无差错的方法是双方采用确认应答技术。TCP协议提供这项服务。 在字节流服务中,由于没有报文边界,用户进程在某一时刻可以读或写任意数量的字节。为保证传输正确或采用有流控制的协议时,都要进行缓存。但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。 在数据传送过程中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息,如UNIX系统的中断键(Delete或Control-c)、终端流控制符(Control-s和Control-q),称为带外数据。逻辑上看,好象用户进程使用了一个独立的通道传输这些数据。该通道与每对连接的流相联系。由于Berkeley Software Distribution中对带外数据的实现与RFC 1122中规定的Host Agreement不一致,为了将互操作中的问题减到最小,应用程序编写者除非与现有服务互操作时要求带外数据外,最好不使用它。 在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基涌纪纪户/服务器模式的TCP/IP。 3. 接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。 2. 服务进程一般是先涌纪纪户请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。 SOCKET PASCAL FAR ocket(int af, int type, int rotocol) 该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type 描述要建立的套接字的类型。参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此,socket()系统调用实际上指定了相关五元组中的“协议”这一元。 当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下: int PASCAL FAR ind(SOCKET , co t truct ockaddr FAR * ame, int amelen) 参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name 是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namelen表明了name的长度。 地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对套接字地址结构必须有明确认识。例如,UNIX BSD有一组描述套接字地址的数据结构,其中使用TCP/IP协议的地址结构为: short in_family /*AF_INET*/ u_short in_port /*16位端口号,网络字节顺序*/ struct in_addr in_addr /*32位IP地址,网络字节顺序*/ 这两个系统调用用于完成一个完整相关的建立,其中co ect()用于建立连接。无连接的套接字进程也可以调用co ect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立“连接”,便能判断该端靠纪纪可操作。而accept()用于使服务器等待来自某客户进程的实际连接。 int PASCAL FAR co ect(SOCKET , co t truct ockaddr FAR * ame, int amelen) SOCKET PASCAL FAR accept(SOCKET , truct ockaddr FAR* addr, int FAR* addrlen) 参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。addr 指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址族决定。addrle 为客户方套接字地址的长度(字节数)。如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。 accept()用于面向连接服务器。参数addr和addrlen存放客户方的地址信息。调用前,参数addr 指向一个初始值为空的地代码如尿崩,谁与我争疯
随笔 - 23, 文章 - 0, 评论 - 659, 引用 - 0
接上篇
在线Demo
地址:
服务器:网通
端口:不要禁用1234端口应该就可以访问
注意:连了数据库的,时间仓促肯定有漏洞,不要捣乱哈:)
登录用户: 1.用户名:牛头人战士 密码:000000 权限:有全部菜单页面,不能进行数据库的更改操作(不影响录入体验)
      2.用户名:老虎MM 密码:000000 权限:少两个菜单页面,不能进行数据库的更改操作(不影响录入体验)
      3.用户名:admin 密码不公开 权限:所有权限
      注:以上的实现都是通过权限管理s配置出的哈,没有任何硬编码
权限判断的边界
由于项目是基于MVC的,除去数据权限不说,功能权限的判断边界做在MVC 的Action上无疑是最好的选择,因为无论是一个页面,还是一个按钮,还是一次查询,都是通过Action请求实现的。这样我们只需要在每个Action请求执行之前进行权限判断就可以了,也不用折腾RBAC里的资源+操作=权限 这么麻烦。 菜单权限和功能权限
其实在MIS项目中,大多数的权限判断粒度还是页面级的,再加上我们还需要根据权限动态生成用户的菜单,所以我们把权限分成菜单权限和功能权限
菜单权限:在用户登录验证后,每个页面的请求都必须通过权限验证。
功能权限:默认客户进入页面后,页面的相关操作默认都不判断,只对显示维护出的功能权限进行权限判断。
这样有几个好处:一般情况下权限的配置简单了,因为只需要配置粗粒度的页面权限即可使用;增加了效率,不必每个Action执行之前都判断权限(虽然都做了缓存,但能少判断一次还是好的);完全不影响细粒度的权限判断,随时都可以增加对任何一个Action的权限判定 如何取Action功能权限
我们通过反射把所有的Action权限全部取出来,这样在维护选取的时候就比较方便了,也不会产生录入错误,如下图:
大家用Demo可以体验到我们模糊输入Action名称就可以找到我们想要的Action的,因为是配置选取用也不用担心什么反射的效率问题,其实大家从demo可以看到速度还是挺快的,在我真实的项目中Action中有上万个,拉出来一样是瞬时的,所以我觉得有时候吧,也别过于谈反射色变,呵呵
通过反射获取所有Action的代码如下:
ActionPermi ion
GetAllActionByA embly()
var result
ActionPermi ion
var types
A embly.Load(
Demo.HIS.MVC
).GetTypes();
foreach
(var type
(type.BaseType.Name
BaseController
如果是Controller
var members
type.GetMethods();
foreach
(var member
members)
(member.ReturnType.Name
ActionResult
如果是Action
ActionPermi ion();
ap.ActionName
member.Name;
ap.ControllerName
member.DeclaringType.Name.Su tring(
, member.DeclaringType.Name.Length
去掉Controller后缀
[] attrs
member.GetCustomAttributes(
(System.ComponentModel.DescriptionAttribute),
(attrs.Length
ap.Description
(attrs[
System.ComponentModel.DescriptionAttribute).Descriptio result.Add(ap);
result;
返回的IList
ActionPermi ion
就是系统中所有Action的集合,大家可看到我们通过BaseController找到了项目中所有的Controller,再通过ActionResult找到Controller中所有的Action。
不知道大家注意下拉出的Action有个描述属性,这个属性是通过在Action上定义DescriptionAttribute实现的,这样通过反射就能取到中文描述了,例如:
为了实现页面的选取方便,我们还要实现对IList
ActionPermi ion
分页和模糊查询,因为是变量级集合,这里我们使用Linq查询就可以了,代码如下:
[Description(
访问功能权限管理页面
[ViewPage]
ActionResult ActionPermi ion()
View();
} 代码
ActionPermi ion
QueryActionPlist(
ActionPermi ion
allActio =
GetAllActionByA embly();
(from a
allActio where
a.ActionName.ToLower().Contai (query.ToLower())
select a).Count();
var result
(from a
allActio where
a.ActionName.ToLower().Contai (query.ToLower())
select a).Skip(start).Take(limit);
ActionPermi ion
(result);
} 把权限判断相关的数据都缓存起来提高效率
我们把当前登录用户的:用户信息,拥有菜单权限,拥有功能权限 放在Se ion里
我们把需要托管的所有Action功能权限放在 A liction全局应用程序变量里
这样我们所有的权限相关判断都是从缓存中取数据,不需要频繁访问数据了。
相关代码懒得贴了,自己去下载的源码里翻吧....注意一下缓存相关都是通过ICache这个接口出的,搜一下就能找到 如何对每个Action进行拦截,在它执行之前判断权限
最土的办法就是在每个Action加一段权限判断的代码,哈哈...如果我要这样做的话,估计要被大家的砖头拍死。
看过本系列
的朋友应该就能想到,这是一个典型的AOP应用场景。
由于A .net MVC的Filter机制其实就是Aop,所以我们直接使用它。熟悉A .net MVC的朋友估计知道里面其实自带的有一个AuthorizeAttribute的ActionFilter,但基本就是个玩具,本来我想继承它重写的,但无奈里面的filterContext没有ActionDescriptor属性,所以干脆不要它自己写个ActionFilter,代码如下:
System;
System.Collectio .Generic;
System.Linq;
System.Text;
System.Web.Mvc;
System.We using
System.Security.Principal;
Demo.HIS.Infrastructure.Facade.Authority;
name ace
Demo.HIS.MVC.CommonSu ort.Filter
< ummary
权限拦截
/summary
[AttributeUsage(AttributeTargets.Cla |
AttributeTargets.Method, AllowMultiple
cla AuthorizeFilterAttribute : ActionFilterAttribute
override
OnActionExecuting(ActionExecutingContext filterContext)
(filterContext
ArgumentNullException(
filterContext
var path
filterContext.HttpContext.Request.Path.ToLower();
/Main/Login
.ToLower()
/Main/UserLogin
.ToLower())
忽略对Login登录页的权限判定
[] attrs
filterContext.ActionDescriptor.GetCustomAttributes(
(ViewPageAttribute),
var isViewPage
attrs.Length
当前Action请求是否为具体的功能页
.AuthorizeCore(filterContext, isViewPage)
根据验证判断进行处理
注:如果未登录直接在URL输入功能权限地址提示不是很友好;如果登录后输入未维护的功能权限地址,那么也可以访问,这个可能会有安全问题
(isViewPage
filterContext.Result
HttpUnauthorizedResult();
直接URL输入的页面地址跳转到登陆页
filterContext.Result
ContentResult { Content
JsHelper.ShowError('抱歉,你不具有当前操作的权限!')
功能权限弹出提示框
权限判断业务逻辑
protected
virtual
AuthorizeCore(ActionExecutingContext filterContext,
isViewPage)
(filterContext.HttpContext
ArgumentNullException(
httpContext
filterContext.HttpContext.User.Identity.IsAuthenticated)
判定用户是否登录
var user
CurrentUser();
获取当前用户信息
var controllerName
filterContext.RouteData.Values[
controller
].ToString();
var actionName
filterContext.RouteData.Values[
].ToString();
(isViewPage
&am am (controllerName.ToLower()
&am am actionName.ToLower()
masterpage
如果当前Action请求为具体的功能页并且不是MasterPage页
(user.MenuPermi ion.Count(m
m.ControllerName
controllerName
&am am m.ActionName
actionName)
var actio =
ContainerFactory.GetContainer().Resolve
IAuthorityFacade
().GetAllActionPermi ion();
所有被维护的Action权限
(actio .Count(a
a.ControllerName
controllerName
&am am a.ActionName
actionName)
如果当前Action属于被维护的Action权限
(user.ActionPermi ion.Count(a
a.ControllerName
controllerName
&am am a.ActionName
actionName)
a.我的AuthorizeFilterAttribute继承了ActionFilterAttribute
b.重写ActionFilterAttribute的OnActionExecuting(ActionExecutingContext filterContext)方法,这个方法表示在每个Action执行之前处理
c.返回页面的Action上面要加ViewPageAttribute,这样我在Filter里才能区分当前Action是否为页面(注:由于是在Action执行之前,无法通过获取ActionResult的类型来判断)
d.权限判断和处理的逻辑自己看贴的代码里的注释,已经写的很清楚了
在哪儿加这个AuthorizeFilterAttribute呢?一个一个给Action或Controller加都太麻烦了,还记得我们所有的Controller都继承了BaseController吗?在他上面就完事了呗!这样整个系统要不权限就靠BaseController上的一个AuthorizeFilterAttribute说了算~,BaseController如下:
name ace
Demo.HIS.MVC.CommonSu ort
所有Controller都要继承的基类
[AuthorizeFilter]
[ExceFilter]
cla BaseController : Controller
} 使用FormsAuthentication实现登录验证
用户登录验证用的是.Net自带的Forms验证,它默认通过加密的cookies来实现用户的登录判断
登录代码如下:
[ExtResult]
[Description(
用户登录
ActionResult UserLogin()
loginName
Request[
logi ame
Ho User.GetPwdMD5(Request[
AuthorityFacade.Validate(loginName, pwd))
ValidationException(
用户名密码错误,或用户状态不可用
FormsAuthentication.SetAuthCookie(loginName,
加入from验证票据
Cache.RemoveSe ionCache(
currentuser
清空当前用户信息缓存
.JsonFormat(
ExtResult { succe =
注销代码如下:
注销登陆
ActionResult Logout()
FormsAuthentication.SignOut();
Cache.RemoveSe ionCache(
currentuser
清空当前用户信息缓存
.JsonFormat(
ExtResult { succe =
} 大伙期待的源码
虽然是从公司实际项目中扒出来的,但整个设计,思想,架构和关键代码基本都是我一个人搞的,而且业务相关的东西我都去掉了所以大家可以随便用。
里面可能涉及到不少东西还没有讲到,在以后的系列中会详细说明。
另外有人说源码编译报错缺少HibernatingRhinos.NHibernate.Profiler.A ender.DLL,你可以把这个DLL删除,再根据错误信息删除一行代码即可,这个其实是之前讲过的NHProfiler,NH生成SQL查看工具用的DLL。
源码:
数据库(估计用SQLSERVER的比较多,所以我把数据库从oracle改成了SqlServer2005,直接附加就可以了):
  权限管理这部分暂时就介绍到这里 ,以后有机会再给大家介绍数据权限,权限与工作流引擎集成,单点登录,多级授权等复杂的权限管理实现。大家可以看到上面介绍权限管理还是有些特点的:
1.充分利用MVC特点;
2.思路清晰;
3.验证逻辑简单;
4.维护方便;
5.没有效率问题;
6.和其他代码完全解耦毫无依赖;
7.非常灵活能满足绝大多数需求;
8.扩展方便;
我想通过这个权限管理的例子和相关讨论,大家应该明白一个道理,只有真正适合自己当前项目的业务和技术特点的技术方案才是好方案。
在技术水平有限的情况下盲目追求什么通用,什么全适应,往往实现费时费力还不讨好。
在软件开发这个领域,真正的高手不在于写高深的代码;玩弄艰涩的术语;也不会不考虑实际价值,为了用技术而用技术;也不会胡吹海吹,堕落到为了赚钱就放弃技术。
理论和实践结合才是王道
还是那两句老话,软件开发没有银弹,一切为了需求 写这个系列的初衷主要还是想感谢.Net技术社区里的各位朋友,长期以来大家贡献的资料文章给我的工作和学习都有很大帮助。
也是受同事 影响,本人潜水多年突然良心发现,觉得自己也应该对.Net技术社区做一点力所能及的事,所以写下此系列。
写这玩意儿一不求出名二不求搞头衔三不求赚钱,再加上本人个性,所以写的比较随意粗糙,有时还有恶搞。哈哈,没有啥严格的排版,也没有严谨的书面用语,有时候还有点针对性,如有不适还望大家海涵
大伙捧场我就写着Ha y~~
最后祝愿大家春节快乐吧,本系列春节之后再更新.....
绿色通道:
posted on 2010-01-25 08:44
阅读(15862) 2 [
  我爱编码
功能权限是可以模糊查询的
2010-01-25 12:16 |  
  牛逼 ,是mvc1.0的还是2.0的
2010-01-25 12:29 |  
  弱弱的问一句,为啥DemoHisSite.c roj这个项目无法打开,我的是VS2008,是需要***什么组件还是怎么弄?
2010-01-25 12:31 | [
  wanwei
@帝之晓
要装下ASP.NET MVC1.0
2010-01-25 12:44 |  
  我也支持!
2010-01-25 12:46 |  
  谢谢,支持啊
2010-01-25 12:47 |  
  炫哥超级无敌璇璇璇的头像!
2010-01-25 12:50 |  
  很强大,支持。
2010-01-25 13:09 |  
  登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?
2010-01-25 14:07 |  
  五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?
我也有这样的问题.
2010-01-25 14:48 | [
  五味果
@kyle_ckzx
是不是数据库没连上 debug一下
2010-01-25 14:55 |  
  网页错误详细信息
用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
时间戳: Mon, 25 Jan 2010 07:06:07 UTC
消息: 'result.msg' 为空或不是对象
行: 76
字符: 14
代码: 0
完全的错误信息!
2010-01-25 15:06 |  
  提个问题,是不是每个action上都要加一个filter来控制这个action的权限?如果是,为什么不直接在ActionInvoker里实现权限控制。
2010-01-25 15:17 | [
  Nick Wang (懒人王)
Nick Wang (懒人王):提个问题,是不是每个action上都要加一个filter来控制这个action的权限?如果是,为什么不直接在ActionInvoker里实现权限控制。
显然不是 这位老兄明显没认真看贴
2010-01-25 15:23 |  
  非常感谢弦哥分享!!
有个问题!登录(admin,其他帐号也一样)后左边的菜单不显示,直接是空的!
环境:XP,IE7,VS2008,MVC1.0,NH2.1.1(应该不会影响,只用了个查看HQL的那个DLL)
跟踪调试后发现,GetMenuTree方法中的list有6条记录,返回的JSON中也是1个对象和5个子项!
后改用 FIREFOX 居然奇迹般的好了!!Chrome还未试!
2010-01-25 15:29 | [
  jectZhou
晕倒 IE8,IE8兼容模式,Chrome我都测试过没问题呀
你试试在线demo,如果在线demo没问题,估计还是你本地部署有问题哇
2010-01-25 16:08 |  
  文盲过来支持一下楼主。
2010-01-25 16:14 |  
  传说中的弦哥
额 感谢弦哥!CHROME也通过!就IE7不行!在线测试也OK(IE7)!我估计也是我机器配置的问题!我再看看!谢谢!
2010-01-25 17:25 |  
  看看,学习下
2010-01-25 17:27 |  
  非常好,那个查询效果是不是也展示出来
2010-01-25 17:36 |  
  支持你!
2010-01-25 17:39 |  
  太好了 继续学习MVC
2010-01-25 21:48 |  
  弦哥问一下。。我下载你的代码里面看里面有几个关联表没有映射文件。那删除里面表的记录怎么做的。
2010-01-26 10:46 |  
  IE8 ,opera 10.1左侧导航显示不了.其它CHROME没有问题! 在线测试 没有问题.不知道上面的兄弟找到问题没有!
2010-01-26 11:12 |  
  弦哥,问一下,为什么我的老在把Controller实例注册到了unity容器这个地方报错,而且在IE7下面也没有数据显示.能否公开一下你的开发环境,还有一些部署要求?不胜感激!
2010-01-26 11:19 | [
  啊文
啊文:弦哥问一下。。我下载你的代码里面看里面有几个关联表没有映射文件。那删除里面表的记录怎么做的。
NH自动的 关联表不用写映射文件
2010-01-26 12:26 | [
  Jerry Gao
Jerry Gao:弦哥,问一下,为什么我的老在把Controller实例注册到了unity容器这个地方报错,而且在IE7下面也没有数据显示.能否公开一下你的开发环境,还有一些部署要求?不胜感激!
把Controller实例注册到了unity容器报错 这个没关系的,主要由于引用的js或c 找不到引起的,不影响
浏览器兼容问题 我的demo是对的呀,我demo和放出的源码是同一套代码
2010-01-26 12:27 |  
  同样的问题,在IE下左边的菜单出不来,谷歌浏览器可以显示。
2010-01-27 15:14 |  
  永远支持跟宇宙一样强大的弦哥!
2010-01-28 00:56 |  
  kyle_ckzx:
五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?
我也有这样的问题.
我也有这样的问题,我的是Ie8+vs2008+sql2005
2010-01-28 13:07 |  
  小贩:
kyle_ckzx:
五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?
我也有这样的问题.
我也有这样的问题,我的是Ie8+vs2008+sql2005
这个应该是IIS的问题,搜一下IIS怎么配置MVC。
2010-01-31 12:32 | [
  小贩
@kyle_ckzx
把项目在IIS里配置成一个网站 而不是网站下的子目录
2010-01-31 22:24 |  
  小贩:
kyle_ckzx:
五味果:
登陆时报错
行: 76
错误: 'result.msg' 为空或不是对象
怎么解决?
我也有这样的问题.
我也有这样的问题,我的是Ie8+vs2008+sql2005
我的也有相同的问题,但肯定不是数据库连接的问题,不知道什么源因
2010-02-01 14:17 |  
  顶一下 LZ
2010-02-01 18:16 |  
  file:///C:/Documents%20and%20Settings/Administrator/桌面/1.jpg
2010-02-02 17:25 |  
  炫哥:
Default页的 httpHandler.Proce Request(HttpContext.Current);报错如下;
找不到方法:“System.Web.Mvc.ActionDescriptor System.Web.Mvc.ActionExecutedContext.get_ActionDescriptor()”。
为什么 小菜不会
2010-02-02 17:27 |  
  用IIS网站配置你默认的8008端口来打开网站有问题,点了登陆没反映了。
后来用VS2008开发服务器来打开,登陆正常了。
这是什么问题?请问IIS需要怎么配置才可以呢?
2010-02-08 16:03 |  
  你好!下载了你的项目,杂怎么都调试不了,总是加载不了DemoHisSite
项目,出错为尚未配置DemoHisSite为虚拟目录,为什么在vs中调试也要配置虚拟目录,期待大哥,指点。。谢谢!!
2010-02-19 13:45 |  
  舞之鑫
我发现VS使用.NET Framework提供的那个开发用的IIS运行的话在IE下有问题,MasterPage左面的导航树出不来。可能是因为这样弦哥配置成使用IIS的,再说使用自带的那个开发用的IIS占内存,还是直接用真实环境的IIS比较好。
解决你的问题可以:用VS打开解决方案,右键未成功加载那个项目 = 编辑项目文件 = 修改如下配置节点
WebProjectPropertie gt;
UseIISTrue/UseIIS
AutoA ignPortTrue/AutoA ignPort
DevelopmentServerPort1986/DevelopmentServerPort
DevelopmentServerVPath//DevelopmentServerVPath
NTLMAuthenticatio gt;False/NTLMAuthenticatio gt;
UseCustomServerFalse/UseCustomServer
CustomServerUrl
/CustomServerUrl
SaveServerSettingsInUserFileFalse/SaveServerSettingsInUserFile
/WebProjectPropertie gt;
在IIS中建立相应的WebSiteA ,然后右键重新加载那个未成功加载的项目。
弦哥快点写啊,我假期看了两本ExtJs的书就为关注你接下来的系列呢^_^
2010-02-20 19:41 |  
  DemoHisSite,不好加载,于是用记事本改了url,可以载入了;但是运行时,提示:服务器应用程序不可用
我的IIS是5.1
2010-02-21 11:41 |  
  期待后续呀
2010-02-21 16:48 |  
  把 IISUrl
删除就可以了撒。
。。。。。。。
我天天来看!
玄哥 不更新。。心里挖凉挖凉的。。。把之前的看了好几篇 每次都有新收获
2010-02-22 15:42 |  
  警告 1 元素 命名空间“
”中的“PropertyGroup”。 的子元素 命名空间“
”中的“MvcBuildViews”。 无效。应为可能元素的列表: 命名空间“
”中的“Property”。。 D:\Downloads\HISDemo\DemoHisSite\DemoHisSite.c roj 14 6 杂项文件
错误 2 当前上下文中不存在名称“HibernatingRhinos” D:\Downloads\HISDemo\Demo.HIS.FrameWork\Repository\Nhb\Se ionBuilder.cs 19 13 Demo.HIS.FrameWork
错误 3 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Core
错误 4 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Infrastructure.Repositories
错误 5 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Repositories
错误 6 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Infrastructure.Facade
错误 7 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Repositories\bin\Debug\Infrastructure.Repositories.dll” Infrastructure.Facade
错误 8 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Infrastructure.Facade
错误 9 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Facade\bin\Debug\Infrastructure.Facade.dll” Demo.HIS.MVC
错误 10 未能找到元数据文件“D:\Downloads\HISDemo\Infrastructure.Core\bin\Debug\Infrastructure.Core.dll” Demo.HIS.MVC
错误 11 未能找到元数据文件“D:\Downloads\HISDemo\Demo.HIS.FrameWork\bin\Debug\Demo.HIS.FrameWork.dll” Demo.HIS.MVC
2010-02-23 17:08 |  
  这是怎么回事啊?
2010-02-23 17:09 |  
  为什么我的在输入用户和密码后点击登陆就会报这个错:
Ho User is not ma ed [select count(u) from Ho User as u
where u.LoginName=:LoginName and u.Pwd=:Pwd and u.State=:State]
在验证用户名与密码是否正确的地方报这个错,找了好久,郁闷,请高手帮忙解决一下...
2010-02-27 09:23 |  
  Jerry Gao
public bool IsExistUser(string userid, string pa word)
var query = Se ion.CreateQuery(@" elect count(*) from UserInfo as u
+ where u.UserId=:U and u.Pa Word=:P)
.SetString(U, userid)
.SetString(P, pa word);
return query.UniqueResultlong() 0;
我是这样的
2010-03-03 17:36 |  
  玄哥, 我将WEB改成IIS,不用VS默认的,之后就报如下错误:
“/DemoHisSite”应用程序中的服务器错误。
--------------------------------------------------------------------------------
The current type, DemoHisSite.Controllers.IFormsAuthentication, is an interface and ca ot be co tructed. Are you mi ing a type ma ing?
但如果用VS默认的WebServer就不会报错,只是用IE7浏览的时候,没有导航菜单,用Firefox倒是可以浏览。
除了上面的错误外,我想请教下:这种MVC程序的发布要如注意什么,现在开发都用VS默认的来调试,等发布的时候,出现很多莫名的错误,很是头大,请玄哥指点指点
2010-03-08 23:37 |  
  一直想看,一直没时间看,哪曾想看了之后,迎接我的是震撼。
2010-03-12 16:45 |  
  弦哥你贼猛啊!!
噢! 档案日期:2004-07-01 00:00:00 ~ 2004-08-01 00:00:00
2004-07-31 01:42:11
《雷雨》
演出:北京人民艺术剧院
时间:July 30, 2004 19:30
地点:北京人艺首都剧场 看过两场的雷雨。
去年4月3日看过一场,据说都是梅花奖的演员演的,每一个角色在每一幕里有不同的人来演。我觉得效果比较搞笑(可能是因为排练的比较仓促)。
但是有个好处就是,可以比较不同演员的演技,高低上下很容易看清楚。 这次看有不同的感受。
首先说说好的地方:音响很好。开场的雷声,有点说书的时候惊堂木的感觉,挺好玩的。灯光做的很好,闪电效果不错。 这个版本的繁漪(龚丽君饰),偶觉得有些恐怖有余,温柔不足。繁漪出现在四凤窗外的时候,加上电闪雷鸣的效果,足够的恐怖。
还有一点细节,就是第一幕的时候,吃完药繁漪跑上楼的一段。演的时候,先是慢慢的类似模特走台步似的,快到门口的时候才变成带着哭声跑下场,好像转折的有点突兀。
不太习惯这次把繁漪作为主角。 个人觉得,原剧本的序幕和尾声,有一个铺垫和最后交待结局的作用。不明白为什么大多数的演出,都把这两部分裁掉。 最后想说,想起王小波的文章
,很同意里面的观点,经典作品是好的,但看的次数不可太多。
这个剧大概从中学就学过了,没有任何情节上的悬念了。至于表演艺术我是没看出什么好来。至于舞美,音乐,我还不如看好莱坞大片。 现在觉得,戏只是戏,所谓的经典其实也不过如是。
2004-07-30 00:15:57
上次听cease说“所有商场的专柜、专卖都是介个样子地”
想起来,偶去年买衣服的时候的一个反例。
品牌:GUESS。商家:首都时代广场LCX vs. 国贸 。 LCX部分5折,部分8折。国贸无折扣。偶问了国贸里的GUESS专卖店店员,她说LCX店和她们的上家(进货渠道吧)不同,所以折扣活动不同。(不过好想没怎么见过国贸里面的店打折的)
结果偶第二天又去LCX买的衣服。
不过也可能因为当时闹SARS,管的不严。
品牌:Calvin Klein Jea 。商家:首都时代广场LCX vs. Sogo 。 LCX送一个什么东西(本来想找,但是现在不知道是什么了),Sogo什么都没有。
相关文章
2004-07-29 22:51:59
fan-theatre上看到的(原文 ),
在blog上记一下。
里面有fan-theatre上面的版主参加制作的,呵呵。
这个偶要去看
严重期待中。。。。。。
《新娘》
契诃夫逝世一百周年纪念小剧场戏剧演出
青年剧作展参演剧目
  主办单位:北京人艺演出中心·林兆华戏剧工作室·九个剧场
  艺术总监:林兆华
  制作人:老象、王悦
  编  剧:安莹
  导  演:姬沛
  舞美设计:杨凯强
  灯光设计:田建平
  造型设计:刘红曼
  音响设计:王剑峰
  宣传统筹:老象、小慢
  主  演:刘琰、郑麟、王攀、冯芒、谢滨、于枫
演出时间及地点:
2004年8月26日至9月3日北京人艺小剧场(星期一休息)
  2004年9月15日至19日上海话剧艺术中心·戏剧沙龙
票  价:
订票***:
北京:(010)65263337、65250996
       
上海:(021)64730123、64734567
主题网站:
泛剧场 www.fan-theatre.com
鸣  谢:
北京两人世界西餐厅
概  述:
  《新娘》是俄罗斯文学大师安东·契诃夫生前最后一部短篇小说。
主人公是一个有文化有教养的女性。懵懵懂懂地,她向往着新的生活。结婚前夕,她经历了一次重大的思想转折,认识到自身生活的庸和无聊而与之告别……
剧情简介
  本剧描述了公司职员苏小雅的婚前故事,她是一个喜欢顺其自然,从不拒绝别人的姑娘。由于新郎回国日程紧张,婚事的操办全凭热心的霍家嫂子张罗;新郎的哥哥,则是一个回到家后什么都不想管只是一门心思迷恋武侠剧的单位科员;侄子年轻,乐于形而上的思考,但却没有能力解决实际问题;老太太和善睿智。距婚礼还有十几天的时候,小雅来到霍家,她直面的是对人生、情感以及“结婚”这个事件本身分别有着各自态度的所有人,当然也包括她自己……
媒体报道:
  北京晚报文娱快递 2004年7月27日
  “青年剧作展”首演契诃夫
  《新娘》是俄罗斯文学大师安东·契诃夫生前最后一篇短篇小说,被评论界称为“浓缩了大师一生思想的精华”。在纪念契诃夫逝世一百周年之际,一群年轻的创作者希望用《新娘》向大师致敬,同时小剧场戏剧《新娘》将作为北京人艺演出中心、林兆华戏剧工作室以及“九个剧场”联合主办的“青年剧作展”的首演剧目,将于8月26日至9月3日在北京人艺小剧场演出八场。剧组还受到上海话剧艺术中心的邀请,将于9月13日至19日赴上海演出。
  小说《新娘》的主人公是一个有文化有教养的女性,在结婚前夕经历了一次重大的思想转折,认识到自身生活的平庸和无聊而与之告别……青年编剧安莹没有止步于把原小说舞台化,她选择了将当下都市人的生活状态和真实思考呈现舞台上,平和、舒服的讲述生活。
  青年女导演姬沛觉得每个人对自身的生活质量的标准、要求是不一样的,这是现代任何人都会遇到的困惑,而人们必须经历困惑才能进行选择。《新娘》由平均年龄不到30岁的创作和制作团体打造而成,演员全部进行过专业训练,拥有丰富的表演经验,其中饰演老太太的谢滨还是一位职业京剧演员。罗颖
2004-07-29 00:27:25
本来打算买一辆以前的那种黑色的凤凰或者永久26的车。
上个周末出去看了看。发现,只在北新桥附近找到两家在卖永久的车。
据说凤凰的那种车已经不出了。 一个大一点的店,据说是国营的,要价388。另外一个小店要348。 我觉得车做的比较粗糙,而且装的也不怎么样,小店那辆装的比大店的好些。印象中永久的车质量还是不错的。 这个星期在逛逛捷安特再说。
2004-07-29 00:25:12
在Embedded system上面写code写惯了,Windows程序忘了太半。今天找这个就花了半天的时间。
抄一下。
A resizable property sheet within a view
Rating:
Ole Le ert
August 6, 1998
I have an SDI a lication, where the main view co ists of a CTabCtrl. In order to avoid handling the page changes myself, I decided to try to use a CPropertySheet i tead. This gave me some problems handling resizing of the property sheet, when the user resizes the view.
Microsoft Knowledge Base article Q143291 gave a partial a wer: How to resize the CPropertySheet at startup.
I tried to manipulate the code from Q143291 so it did what I wanted. And it worked! It flickers quite a lot though, but it is good enough for me.
Please study Q143291 as well. You may find a better way of doing this. All the resizing stuff is in the subcla ed CPropertySheet. And that is kind of neat, IMHO.
I have moved most of the stuff from OnInitDialog into Resize, and added
to the subcla ed CPropertySheet Resize. The rest of the CPropertySheet stuff is from Q143291. The view stuff is mine.
pParent = GetParent();
pParent-GetClientRect(&am rectParent);
Note that I don't use OK / Cancel / A ly butto . It should be a trivial matter to move these butto in OnInitDialog as well. You can see how to do this in Q143291.
How do you implement a resizable property sheet within a view? Check this:
1. Subcla CPropertySheet.
2. Use only one co tructor:
CResizablePropertySheet::CResizablePropertySheet(CWnd* pParentWnd)
:CPropertySheet(AFX_IDS_APP_TITLE, pParentWnd)
// AddPage here
CResizablePropertySheet::Resize()
// Find parent
CWnd* pParent;
CRect rectParent;
pParent = GetParent();
(pParent ==
AfxMe ageBox(Ca ot resize property sheet. Sheet has no parent, MB_ICONEXCLAMATION | MB_OK | MB_APPLMODAL);
// Get parents client area
pParent-GetClientRect(&am rectParent);
// Resize the sheet
// First find relative change
CSize sizeRelChange;
CRect rectWindow;
GetWindowRect(&am rectWindow);
ScreenToClient(&am rectWindow);
sizeRelChange.cx = rectWindow.Width() - rectParent.Width();
sizeRelChange.cy = rectWindow.Height() - rectParent.Height();
rectWindow.right -= sizeRelChange.cx;
rectWindow.bottom -= sizeRelChange.cy;
// Then resize the sheet
MoveWindow(&am rectWindow);
// Resize the CTabCtrl
CTabCtrl* pTab = GetTabControl();
ASSERT(pTab);
pTab-GetWindowRect(&am rectWindow);
ScreenToClient(&am rectWindow);
rectWindow.right -= sizeRelChange.cx;
rectWindow.bottom -= sizeRelChange.cy;
pTab-MoveWindow(&am rectWindow);
// Resize the active page
CPropertyPage* pPage = GetActivePage();
ASSERT(pPage);
// Store page size in m_rectPage
pPage-GetWindowRect(&am m_rectPage);
ScreenToClient(&am m_rectPage);
m_rectPage.right -= sizeRelChange.cx;
m_rectPage.bottom -= sizeRelChange.cy;
pPage-MoveWindow(&am m_rectPage);
BOOL CResizablePropertySheet::OnInitDialog()
BOOL bResult = CPropertySheet::OnInitDialog();
Resize();
bResult;
3. Add protected CRect m_rectPage.
4. Create public member Resize():
5. Overload OnInitDialog:
6. Define user-defined me age WM_RESIZEPAGE (WM_USER + 111 or something). Add ON_MESSAGE(WM_RESIZEPAGE, OnResizePage) to the me age map. Remember to define afx_msg LRESULT OnResizePage(WPARAM wParam, LPARAM lParam) in the header file. OnResizePage:
LONG CResizablePropertySheet::OnResizePage(UINT, LONG)
// Resize the page using m_rectPage, which was set in
// Resize().
CPropertyPage* pPage = GetActivePage();
ASSERT(pPage);
pPage-MoveWindow(&am m_rectPage);
7. Handle ID_APPLY_NOW (add ON_COMMAND(ID_APPLY_NOW, OnA lyNow) to the me age map. Remember to define afx_msg void OnA lyNow() in the header file).
OnA lyNow:
CResizablePropertySheet::OnA lyNow()
// The sheet resizes the page whenever the a ly button is clicked.
// So we need to resize it to what we want.
PostMe age(WM_RESIZEPAGE);
BOOL CResizablePropertySheet::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
NMHDR* pNMHDR = (LPNMHDR) lParam;
// The sheet resizes the page whenever it is activated
// so we need to resize it to what we want
(pNMHDR-code == TCN_SELCHANGE)
// user-defined me age needs to be posted, not sent, because
// page must be resized after TCN_SELCHANGE has been proce ed.
PostMe age(WM_RESIZEPAGE);
CPropertySheet::OnNotify(wParam, lParam, pResult);
CResizablePropertySheet* m_pResizablePropertySheet;
8. Overload OnNotify:
9. Add private member
to your CView-derived cla . Initialize this member to NULL in the co tructor.
10. Override OnInitialUpdate in your CView-derived cla :
CResizableView::OnInitialUpdate()
CView::OnInitialUpdate();
// create the property sheet
m_pResizablePropertySheet =
CResizablePropertySheet(
(!m_pResizablePropertySheet-Create(
WS_CHILD | WS_VISIBLE, 0))
TRACE(Ca ot create property sheet!\ quot;);
m_pResizablePropertySheet;
m_pResizablePropertySheet =
CResizableView::OnSize(UINT nType,
CView::OnSize(nType, cx, cy);
// Resize property sheet
(m_pNetDefPropertySheet !=
m_pResizablePropertySheet-Resize();
11. Handle WM_SIZE in your CView-derived cla :
2004-07-28 00:20:42
中午去华堂(亚运村)吃饭的时候看到的。
时间截至到8月1日。
貌似都是夏装。 Only的没怎么看。
Jack &am Jones短袖衬衣摆出来的比较多。
周五下班的时候再去淘淘看。
(刚刚转到Sho ing。
斑竹cease说:
介个信息没有太大爆破力啦,
因为现在这几个品牌统一折扣,
所有商场的专柜、专卖都是介个样子地~~~^_^)
唉,偶还是太土啊。这个都不知道。汗。。。。
2004-07-27 00:36:54
我的一个朋友开了一个linux服务器。以前我都是问到IP,直接连上去。
6月28日,他申请了dynd 。
可是我用那个一直都连不上linux服务器了。 我就察看ping的地址,居然两小时内换了5个,而且都不对。(那天我那个朋友很晚才关机器,之前没有重新拨号什么的)。反正一直都没有搞好。 今天朋友给了另外的DNS服务器地址,可以正常解析的。
试验用ADSL自动获取的DNS,解析的结果还是不对。
但是DNS设置为北京电信的一个DNS(202.106.196.115),或者是我朋友提供的DNS,都能得到正确的结果。 貌似ADSL自动获取的DNS解析有问题。
ADSL自动获取的DNS是: 202.106.46.151 202.106.0.20
DNS解析不对,太可怕了!
我朋友举了很好的例子,嗯,抄过来:“想想如果WINDOWSUPDATE.MICROSOFT.COM失错的,或者哪个银行的IP错了。”
2004-07-26 00:13:58
白天去买电。买了200度。发现只收了86元,看了单子,单价0.43。
好奇怪,以前都是0.44的。现在不都在说电力紧张,还要限电云云的。
怎么会降价呢?
2004-07-25 00:50:23
听一个朋友讲的。
说是一个朋友的朋友,去官园小商品市场买东西。看上了一个棒球帽。
摊主要价50,然后她还到了8块。然后还是不满意。
正巧官园的管理员是她的朋友,于是她就叫来她的朋友(也就是官园的管理员)。
管理员问摊主,你多少钱进的啊?
摊主:两块。
管理员:你5块钱卖给她吧。
唉,我一直以来都只能砍到一半以下一点。还是手太软啊。
2004-07-25 00:20:06
在VC6里面的方法。当然也可以用Bound Checker。
不过偶还不知道怎么在linux下面检查Memory leak。
偶都是在模拟器上检查。linux下面如果有也不知道。
Enabling Memory Leak Detection
The primary tools for detecting memory leaks are the debugger and the CRT debug heap functio . To enable the debug heap functio , include the following statements in your program:
#define CRTDBG_MAP_ALLOC
#include < tdlib.h
#include crtdbg.h Note The #include statements must be in the order shown here. If you change the order, the functio you will use may not work properly.
By including crtdbg.h, you map the malloc and free functio to their Debug versio , _malloc_dbg and _free_dbg, which keep track of memory allocation and deallocation. This ma ing occurs only in a debug build (in which _DEBUG is defined). Release builds use the ordinary malloc and free functio .
The #define statement ma the base versio of the CRT heap functio to the corre onding Debug versio . You do not a olutely need this statement, but without it, the memory leak dump will contain le useful information.
Once you have added the statements shown above, you can dump memory leak information by including the following statement in your program:
_CrtDumpMemoryLeaks();
When you run your program under the debugger, _CrtDumpMemoryLeaks di lays memory leak information in the Output window. The memory leak information looks like this:
Detected memory leaks!
Dumping objects -
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.c (20) : {18}
normal block at 0x00780E80, 64 bytes long. Data: < CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
If you do not use the #define _CRTDBG_MAP_ALLOC statement, the memory leak dump would look like this:
Detected memory leaks!
Dumping objects -
{18} normal block at 0x00780E80, 64 bytes long. Data: < CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Without _CRTDBG_MAP_ALLOC defined, the di lay shows: a.. The memory allocation number (i ide the curly braces). b.. The block type (normal, client, or CRT). c.. The memory location in hexadecimal form. d.. The size of the block in bytes. e.. The contents of the first 16 bytes (also in hexadecimal).
With _CRTDBG_MAP_ALLOC defined, the di lay also shows you the file where the leaked memory was allocated. The number in parentheses following the filename (20, in this example) is the line number within the file.
To go to the line in the source file where the memory is allocated a.. Double-click on the line in the Output window that contai the filename and line number. -or- b.. Select the line in the Output window that contai the filename and line number and pre F4.
_CrtSetDbgFlag
Calling _CrtDumpMemoryLeaks is easy enough if your program always exits in the same place, but what if your program can exit from multiple locatio ? I tead of putting a call to _CrtDumpMemoryLeaks at each po ible exit, you can include the following call at the begi ing of your program:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
This statement automatically calls _CrtDumpMemoryLeaks when your program exits. You must set both bit fields, _CRTDBG_ALLOC_MEM_DF and _CRTDBG_LEAK_CHECK_DF, as shown above.
Setting the CRT Report Mode
By default, _CrtDumpMemoryLeaks dum memory leak information to the Debug pane of the Output window, as described above. You can reset this to dump to another location using _CrtSetReportMode. If you use a library, it may reset the output to another location. In that case, you can set the output location back to the Output window using the following statement:
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
For information on using _CrtSetReportMode to send output to other locatio , see _CrtSetReportMode.
See Also
Detecting and Isolating Memory Leaks
2004-07-24 23:23:59
主题: 在评论里说:“
偶的blog首页用了javasrcipt。
就是一个随鼠标有星星跳来跳去的效果。
怎么会到了偶的blog首页,就“非法操作”呢?
刚刚还有朋友能看呢?
唉,懒得自己写,抄来一段代码。没想到是这样。
看来还要看看这段代码才行。郁闷。 先去掉它。
嗯,把这个代码贴出来先,免得忘了。
唉,还要学javascript先。
< cript language=JavaScript
if (document.all){
//To add more stars simply add more colours in below array!!
colours=new Array('ff0000','00ff00','3366ff','ff00ff','ffa500','ffffff','fff000')
//Alter nothing below!!
amount=colours.length;
YgetDelay=0,XgetDelay=0,Ydelay=0,Xdelay=0,step=0.2,currStep=0,my=0,mx=0;
document.write('div id=ie style=" osition:a olute;top:0;left:0 quot gt lt;div style=" osition:relative');
for (i=0; i amount; i++)
document.write('div id=iestar quot; style=" osition:a olute;top:0px;left:0px;height:50px;width:50px;font-family:Courier New;font-size:5px;color:'+colours[i]+' adding-top:20px;text-align:center./div');
document.write('/div/div');
gstep=1;
function iMouse(){
my=event.y;mx=event.x;
document.onmousemove=iMouse
function dim(){
ini-=gste dt=setTimeout('dim()',10);
if (ini 2){
clearTimeout(dt);
glow();
function glow(){
ini+=gste gt=setTimeout('glow()',10);
if (ini 14){
clearTimeout(gt);
function stars(){
ie.style.top=document.body.scrollTo for (i=0; i amount; i++) { var layer=iestars[i].style; layer.filter='glow(color='+colours[i]+', strength='+ini+')'; layer.top= Ydelay+100*Math.sin((5*Math.sin((currStep-15.99)/10))+i*70)*Math.sin((currStep)/10)*Math.cos((currStep+i*25)/10); layer.left=Xdelay+180*Math.cos((5*Math.sin((currStep-15.99)/10))+i*70)*Math.sin((currStep)/10)*Math.cos((currStep+i*25)/10); }
currStep+=ste }
function delay(){
Ydelay = YgetDelay+=(my-YgetDelay)*1/20;
Xdelay = XgetDelay+=(mx-XgetDelay)*1/20;
stars();
setTimeout('delay()',10);
delay();
glow();
/script
2004-07-24 00:28:34
上次说因为买了赖声川《剧场》所以后半个月都要吃绿豆汤。
可是每次都要煮很长时间。
昨天想先用凉水泡一泡。昨天晚上加的水,水比较少,绿豆比较多。早上的时候看的时候,发现豆子都发起来了。于是加了点水。
回来时候也没有看。
刚才准备做明天的份了。
发现绿豆长豆芽啦!
不知道这样有没有问题,会不会坏啊?
绿豆汤要改成水煮豆芽啦。嗯,水煮豆芽,我喜欢。
2004-07-24 00:26:53
多谢 指点。peano curve就是能填充一个矩形的曲线。
查到这个曲线有一个应用,在计算机生成光线的时候用Hilbert曲线生成的光线具有很好的一致性。(具体是什么意思,要再查查资料,或者去找做图像的同学问问去)
Peano Curve
curve which can be written as a
Dickau, R. M. Two-Dime ional L-Systems.
Hilbert, D. " Uuml er die stetige A ildung einer Linie auf ein Flache tück.
Math. A .
, 459-460, 1891.
Peano, G. Sur une courbe, qui remplit une aire plane.
Math. A .
, 157-160, 1890.
Wagon, S.
New York: W. H. Freeman, p. 207, 1991.
Eric W. Wei tein. Peano Curve. From
--A Wolfram Web Resource.
Peano-Go er Curve
originally called a
by R. W. Go er and M. Gardner. Mandelbrot (1977) su equently coined the name Peano-Go er curve. The
bounds the ace that the Peano-Go er curve fills.
Dickau, R. M. Two-Dime ional L-Systems.
Mandelbrot, B. B.
San Francisco, CA: W. H. Freeman, 1977.
Trott, M.
Champaign, IL: Wolfram Media, . 13 and 84, 1999.
Eric W. Wei tein. Peano-Go er Curve. From
--A Wolfram Web Resource.
Plane-Filling Function
which ma a one-dime ional
into a two-dime ional area. Plane-filling functio were thought to be impo ible until
discovered the
in 1891.
Plane-filling functio are often (imprecisely) defined to be the limit of an infinite sequence of ecified curves which fill the
without
, hence the more popular term
. The term " lane-filling functio quot; is preferable to
because curve informally co otes
(i.e., range) of some continuous function, but the
of a plane-filling function is a solid patch of two- ace with no evidence of the order in which it was traced (and, for a de e set, retraced). Actually, all that is needed to rigorously define a plane-filling function is an arbitrarily refinable corre ondence between contiguous subintervals of the domain and contiguous subareas of the range.
True plane-filling functio are not
. In fact, because they map closed intervals onto closed areas, they ca ot help but overfill, revisiting at least twice a de e su et of the filled area. Thus, every point in the filled area has
at least
one inverse image.
Bogomolny, A. Plane Filling Curves.
Wagon, S. A Space-Filling Curve. §6.3 in
New York: W. H. Freeman, . 196-209, 1991.
Eric W. Wei tein. Plane-Filling Function. From
--A Wolfram Web Resource.
2004-07-23 01:40:23
看到一个朋友不在线的时候,MSN的状态是Mobile。
但是最近那个朋友都不在线,没有办法问。
很奇怪,于是自己设了一下自己的***等等。
另外在注册Mobile Device的时候里面没有中国地区的,于是就没有注册这个。 很想知道,我不在线的时候,别人看我的状态是不是Mobile,还是就是offline呢?
2004-07-23 01:17:32
MP3 Encoder是收费的么?
最近用了Motorola的一款芯片。提供一个库,可以把wav 转成 mp3,反正就是多一个录音功能。没想到Moto说压缩的算法要收费,不是他们收,是算法研究者。 很奇怪。因为我见过PC上用的LGPL的MP3压缩的软件。LAME 但是现在连的时候,只有这个页面刷两三次可以刷出来,再往下就看不到了。唉,THE Great Wall啊。 我想知道的是,Moto说的究竟是针对Encoder,用了别人的lib,别人因此收费;还是不管用谁的encoder,都要给算法的研制者钱? 单纯的算法之类是可以有专利并且收费么? 咳咳,以后有时间找找看。现在还感冒呢。
现在有open source的歌曲压缩格式,OGG。不过用的人很少,网上也很少见到这种格式的歌曲。
2004-07-22 00:13:16
我感冒了。
ft,前两天天气闷热,于是把空调开到23度。
结果感冒了。现在主要表现是鼻塞。
于是今天在家里,连电扇都不开,把所有窗户都关上,闷着。
现在屋里的温度已经闷到了30度啦。
赶快好起来吧。
PS. 今天中午吃了吉野家的金***鱼土豆泥。
嗯,金***鱼很少,只有拇指大的一点,很碎的样子,应该是罐头里面的。
除了土豆,还有红萝卜,和一点沙拉酱。
可能有今天感冒的缘故,反正吃起来不甚好吃。
而且很少,就是类似KFC鸡汁土豆泥那样的小碗。写的有65克。
单买要3.5元,不划算。
2004-07-21 00:47:16
cj60lib。很好玩。
可以做出类似Outlook的界面
类似VC的界面
还有类似文件管理器的界面
2004-07-20 00:23:33
昨天(19日周一),早上上班,在惠新东街,中日医院往北第一个红绿灯处。
大约早上9:30分。红灯,大家都停在路口。侧前面隔了两三辆车的地方,有一个女孩子站在一辆自行车的后面。开始我都没想别的,只是以为是骑车带人的,到路口下车了。
突然,那个女孩子把手伸向前面骑车的gg的腰包的拉锁。我还没往小偷方面想。这时正好变灯,那个gg发觉了。
是小偷! 那个小偷看起来好像是维族的小孩子。 原来只在电视上看到过偷拍的天桥上行窃的。没想到现在还有这样的,利用大家的思维惯性,让其他人以为就是个骑车带人的。 大家上街都注意些吧。
2004-07-19 00:17:13
我现在只喝白水。
很早的时候学家里人喝茶。茶,我喝过种类的不多,想想好像也只有绿茶和花茶,相比较而言,还是比较习惯绿茶。后来不常喝茶,主要还是我懒,懒的总忘记在水里加一点茶叶,同时也懒的去洗喝茶时候留下的茶渍。喝茶的时候亦是没有什么讲究,所以到茶道馆里什么品香、品茶还要在那里等上老半天,我只好以猜看杯子外面的篆字以消磨时光。总之,我对于茶没有特别的喜好,我对它的印象好像清茶一样是清淡的。
咖啡,我常喝的还是速溶的。现在住的地方,还有公司里面都有煮咖啡的工具,煮咖啡倒是非常好玩的。不知道为什么,我喝咖啡不觉得有提神的作用,反倒有时候觉得有催眠的作用,尤其是中午的时候,如果吃完饭,再喝一杯咖啡的话,会比不喝还要困。可能是我的神经比较粗吧。
可乐,印象中很小的时候喝的可乐绝对有能让当时的我窒息的药味,可是现在喝的总觉得有一丝甜味的,喝多了牙齿都难受的很。遂戒之。
果汁,好喜欢茹梦的桃汁,可惜现在好多超市里面都没有买的了。
酒,啤酒我一直觉得很难喝,前些时候尝了点百威,度数比较低,基本没有什么味道。嗯,美帝的东西还是不错的。白酒不能喝,否则,不知道会睡多久。
2004-07-18 03:00:06
《暗恋桃花源》
首先抄一段表坊里面对这个戏的简介: 一九八六年三月三日,表演工作坊推出第二部作品《暗戀桃花源》,由賴聲川構思,主持集體即興創作而成,由李立群、金士傑、丁乃竺、顧寶明、劉靜敏、金士會、管管等十一人演出。這一齣由時裝悲劇和古裝喜劇交織而成的複雜作品,孕含了豐富的時代意義和人性***同的夢想和無奈。觀眾哭完了又笑、笑完了又哭,兩個劇團因誤會而同時在劇場中彩排,在嚴肅氣氛中不斷鬧出笑話,而在打鬧中又牽引出許多嚴肅的主題。 我看的这个VCD是后来,拍成电影的那个。一直没有找到剧场的版本,不过电影版也基本上保留了剧场感,我觉得96%以上的镜头都是在舞台上,看起来很过瘾。 金士杰,李立群,这个电影版中还有林青霞,戏演的非常出色。我觉得用什么样的话来形容都不过分。 这次看最大的感受还是在情节上的。
暗恋是一个悲剧的故事,是讲一对男女互相倾慕,但是由于战乱失去联系。很多年后,男的年老住院,为完成心愿,登报找人。结果找到后才知道两人其实都在台北。
桃花源则是一个喜剧,李立群出演捕鱼人老陶,在武陵的时候,他老婆春花另外找了一个情人袁老板。老陶误入桃花源之后,竟然见到了一对男女,长的和春花和袁老板一模一样,他们两个在一起过这幸福的生活。若干年后老陶回到武陵的家的时候,发现春花已经嫁给了袁老板,而且已经生了孩子,但是他们过的并不好。 我觉得桃花源在说一个模式,结婚。。。平淡的生活。。。出现外遇。。。break。。。另一个开始。。。失望
我想暗恋中的两个人物,江滨柳和云之凡如果没有失去联系,两个人结合之后,会不会也是会陷入类似桃花源里面的模式呢?我觉得很有可能会是这样的。
相比之下,也许暗恋才更美好一些。
也许自己一个人的话,就不会有失望吧。
下面引一些表坊91年演出的图片
相关参考
2004-07-17 20:42:45
偶师傅在 偶的一个blog 的评论里面说
所以就在这里写一下。
偶记得MSN online status,偶是从
上面抄的,可是刚才去看怎么不见了,莫非记错了,汗。。。
首先所有的代码加在“参数设定”-“首页其他信息”里面。
先吧偶用的代码贴一下,然后解释。
tr td width=100% bgcolor=#BCCAF2 < align=centerfont color=#FFFFFF size=2 < an style=font-weight: 700; background-color: #BCCAF2联系方式/ a gt lt;/font/td
tr td width=100% tr tdfont size=2Mail:davidzhi [at] 263 [dot] net/a/font /td /tr tr tdfont size=2MSN:isaaczhi [at] hotmail [dot] com/font/td /tr tr td
My MSN is online?!-- Begin Online Status Indicator code --
!-- http://www.onlinestatus.org/ --
A HREF=http://www.foxinus.cz:8085/me age/m /isaaczhi@hotmail.com
IMG SRC=http://www.foxinus.cz:8085/m /isaaczhi@hotmail.com
align=a middle border=0 ALT=MSN Online Status Indicator
onerror=this.onerror=null;this.src='http://www.foxinus.cz:8085/image/m unknown.gif' quot gt lt;/A
!-- End Online Status Indicator code -- /td /tr /td
下面进行注释。注释使用
粉红色,我使用的是html的注释格式
tr td width=100% bgcolor=#BCCAF2
! bgcolor is back ground color < align=centerfont color=#FFFFFF size=2 < an style=font-weight: 700; background-color: #BCCAF2联系方式/ a gt lt;/font/td
! 上面的部分基本不用修改,除了前景和后景色
tr td width=100% tr tdfont size=2Mail:davidzhi [at] 263 [dot] net/a/font /td
! 这里的email地址改成你自己的就成啦。我不用@是为了不想让垃圾邮件很容易扫描得到我的email addre /tr tr tdfont size=2MSN:isaaczhi [at] hotmail [dot] com/font/td /tr
! 这里的m 改成你自己的就成啦。 tr td
My MSN is online?
!-- Begin Online Status Indicator code --
!-- http://www.onlinestatus.org/ --
A HREF=http://www.foxinus.cz:8085/me age/m /isaaczhi@hotmail.com
IMG SRC=http://www.foxinus.cz:8085/m /isaaczhi@hotmail.com
align=a middle border=0 ALT=MSN Online Status Indicator
onerror=this.onerror=null;this.src='http://www.foxinus.cz:8085/image/m unknown.gif' quot gt lt;/A
!-- End Online Status Indicator code --
! 这里的m online status是从一个网站上得到的,详细见后文 /td /tr /td
MSN online status代码取得
然后进入Usage
选择一个OSI host,一般来说选Uptime大的就好啦。
比如进入
设置Medium:为m User id:为你的m 号
其它的,都有默认值,可以不用填。当然也可以自己设置为一些自己设定的图。
然后点Get HTML code,就可以看到另一个页面
HTML code to put on your web page:
!-- Begin Online Status Indicator code --
!-- http://www.onlinestatus.org/ --
A HREF=http://www.foxinus.cz:8085/me age/m /isaaczhi@hotmail.com
IMG SRC=http://www.foxinus.cz:8085/m /isaaczhi@hotmail.com
align=a middle border=0 ALT=MSN Online Status Indicator
onerror=this.onerror=null;this.src='http://www.foxinus.cz:8085/image/m unknown.gif' quot gt lt;/A
!-- End Online Status Indicator code --
Forum code to put in your signature in a discu ion forum:
[URL=http://www.foxinus.cz:8085/me age/m /isaaczhi@hotmail.com][IMG]http://www.foxinus.cz:8085/m /isaaczhi@hotmail.com[/IMG][/URL]
Alternate forum code if the above doe 't work:
[URL=http://www.foxinus.cz:8085/me age/m /isaaczhi@hotmail.com][IMG]http://www.foxinus.cz:8085/m /isaaczhi@hotmail.com[/IMG][/URL]
把其中的
!-- Begin Online Status Indicator code --
!-- http://www.onlinestatus.org/ --
A HREF=http://www.foxinus.cz:8085/me age/m /isaaczhi@hotmail.com
IMG SRC=http://www.foxinus.cz:8085/m /isaaczhi@hotmail.com
align=a middle border=0 ALT=MSN Online Status Indicator
onerror=this.onerror=null;this.src='http://www.foxinus.cz:8085/image/m unknown.gif' quot gt lt;/A
!-- End Online Status Indicator code --
取代我的代码中的相应部分(就是注释里面
蓝色表示的部分
对了还有一个问题,就是你的MSN中必须要设置所有人都可以看到你的状态。如果你设了只让你允许的人看到你的状态的话,这个MSN online status就不能看到你的online status,只能显示offline。
相关文章
2004-07-17 09:32:49
刚才打***的时候,家里人都出去了。
先写在Blog上。祝我爸爸生日快乐!
2004-07-16 11:34:43
先谢谢帮我买书的朋友(虽然我这个朋友可能也不常看我这个weblog),还是先赞一个
好兴奋。
虽然是繁体版的(内地还没出)。
虽然花了HK$512.00再加上运费等等。
虽然准备下半个月天天喝绿豆汤。
虽然最近没有什么时间来看。
虽然。。。。
虽然有那么多虽然,但还是开心的很。
2004-07-16 03:24:49
n.[植][化]乳汁,乳胶,橡胶。 from 《金山词霸》2002
唉,我真是个土人。
2004-07-15 00:10:39
google 提供一端代码,可以在自己的主页上加入google搜索。 下面是它的原始代码:
搜索代码:
!-- Search Google --
FORM method=GET action=http://www.google.com/search
TABLE bgcolor=#FFFFFFtrtd
A HREF=http://www.google.com/intl/zh-CN/
IMG SRC=http://www.google.com/logos/Logo_40wht.gif
border=0 ALT=Google align=a middle/A
INPUT TYPE=text name=q size=31 maxlength=255 value=
INPUT TYPE=hidden name=hl
value=zh-CN
INPUT type=submit name=btnG
value=Google 搜索
/td/tr/TABLE
/center
!-- Search Google --
效果如下: 我现在遇到一个问题,就是直接加入上面代码之后,搜索英文没有问题,搜索中文的时候,回来的很多都是????
后来看了看google出去的连接,发现它默认用的是UTF-8的编码方式。但是水木blog用的是GB2312的编码方式。
于是在上面的代码中加入了一些语句,解决了上面说的乱码的问题。(
的是我新加的)
另外一个是加入一个搜索域的选项, (这个的代码用
的是换行用的。
最后的效果,可以看我的blog的首页。 tr
!-- Search Google --
FORM method=GET action=
TABLE bgcolor=#FFFFFFtrtd
A HREF=
IMG SRC=
border=0 ALT=Google align=a middle/A
INPUT TYPE=text name=q size=31 maxlength=255 value=
INPUT TYPE=hidden name=hl value=zh-CN
INPUT TYPE=hidden name=ie value=gb2312
i ut type=hidden name=domai value=
type=radio name=sitesearch value= web i ut type=radio name=sitesearch value=
checked
INPUT type=submit name=btnG value=Google 搜索
/td/tr/TABLE
/center
!-- Search Google --
2004-07-14 00:12:22
看了lani blog的文章
之后食欲大开,但是家里面没有沙拉酱了。虽然最好的方法就是lani说的“去买”。
但是突发奇想,想看看是不是自己也能做。下面是从网上找的资料。
的是我的注释。 自制水果沙拉 2004年07月01日15:09 都市女报 from   商场里卖的沙拉酱含奶油成分,吃了容易发胖,而自制沙拉酱,既简单方便,又经济实惠,具体步骤如下:   1.取5个鸡蛋煮熟(煮老一点),去壳,将蛋清和蛋黄分开待用。
hoho,5个鸡蛋,太多啦,现在家里没有那么多啦。等周末买了再做这种。   2.炒勺置火上,加入花生油约100克,待油七成热时加入少许花椒,炸出香味后将花椒捞出,再加入南酒约10克,食盐和味精适量,晾凉待用。根据个人喜好还可加入胡椒粉,或改食盐为白糖。
油还是按容积来算比较容易,按克算,用天平或者称多麻烦啊。还有什么是南酒?没听说过。   3.将蛋黄加入油汁中,用勺子抿碎,拌匀(如有食品搅拌器更好),使之成糊状。   至此,沙拉酱就做好了,然后选新鲜的蔬菜,如黄瓜、莴苣、水萝卜、红心萝卜、荸荠、芹菜等可生吃的品种,还有胡萝卜、藕、土豆、芋头等蒸熟后可用的品种,水果可选苹果、梨、桃子、菠萝等汁少的品种,还有煮熟的蛋清都切成1厘米见方的小丁状,加上自制沙拉酱拌匀,一份色泽鲜艳,味美可口,营养丰富的沙拉就完成了。这道食品特别受到小朋友们的喜爱,对那些不爱吃饭的小朋友来说,妈妈们还可以加上火腿丁,荤素搭配,让孩子既当菜又当饭,赶快试试吧! 文/沁雪 无蛋沙拉酱制法 from 原料:冷藏鲜奶100克,奶粉30克,,盐5克,糖70克,沙拉油150克,柠檬原汁150克。 作法:先将原料倒入果汁机打1分钟,再慢慢的倒入沙拉油,等成桨糊状时,倒入柠檬,拌匀即成自制无蛋沙拉酱。
这个更快,搅拌就行啦。沙拉油真是好东西。 注:①沙拉油即为大豆色拉油,柠檬汁可改为用白醋。 ②倒入沙拉油时必须少量,慢慢的倒入不可太快,否则不会凝固。 ③一般市售沙拉酱是用蛋黄作为原料。 ④自制沙拉酱一次用不完可放入冰箱冷藏。 附自制沙拉酱的方法 from  * 蛋黄沙拉酱   这是一种很常规的沙拉酱,往生鸡蛋的蛋黄上倒少许色拉油,慢慢地用筷子打匀,再加入少许油,重复几遍,够用即可,然后再放入芥末酱、盐和胡椒粉,直到成为凝固状。
这个这个用的是生鸡蛋,我要糊涂啦。
  * 水果沙拉酱   把时令水果草莓、樱桃、苹果、菠萝等用搅拌机打成汁,加入鲜奶油,不仅漂亮,而且纯天然的色彩会让胃口大开,口味也会特别清爽可口。
faint,这明明是果汁吗,竟然骗我说是水果沙拉酱。
  * 油醋沙拉酱   这是一种热量较低,适合减肥期间的女性的沙拉。在橄榄油中加入红酒(或香草醋、苹果醋)、盐、胡椒粉拌匀即可。
橄榄油可是很贵贵的东西啊!偶在燕莎的地下见过,一小瓶不到1000克(800克还是900克偶记不清啦),要49元啊!另外这是沙拉酱? 自制素沙拉酱 from 不贴上来可惜了,好东西应该大家分享,但劝告没时间的人还是放弃了吧,味道确实不错哟嘿嘿 配方和制作方法 1、原料:
这个有具体的数字,我喜欢    奶粉30克,
    牛奶(或者三花淡奶)100克,    白糖50克,
    胡椒粉少许,    植物油层100--150克    鲜柠檬汁(也可用白醋)60克。   2、做法:    (1)先把奶粉、牛奶、白糖和胡椒粉加入搅拌机打匀。
    (2)然后一边搅拌一边缓慢加入植物油,油的份量视浓稠度而定,油多则更稠。    (3)最后加入柠檬汁拌匀即可。
   注:最好用新鲜柠檬自己榨汁较好;(1)和(2)两道工序一定要用搅拌机,用手工打不好。 土豆沙拉 from 一直很钟情吉野家的土豆泥沙拉,可惜后来换成了茶碗蒸,所以经常自己做来吃。
(偶就没有吃过吉野家的土豆泥沙拉,现在好像卖的是金***鱼土豆泥)。
不过既然是自己动手,最好连沙拉酱也自己动手做。
(遇到同道啦,偶也想自己做)。
上网查了一些关于自制沙拉酱的资料,又咨询了一些有经验的人,再加上以前的失败经验,总算成功了。 先把土豆洗干净放在笼屉上蒸
(lani说用微波炉也可以的,嗯,我喜欢用微波炉)
,这个时候就取一个鸡蛋的蛋黄(两人份)放在大碗里,加一小茶勺色拉油,用钢勺抽打(如果有蛋打更好了)。抽打的时候一定要按一个方向,同时一点一点的往里加色拉油,然后继续抽打。开始加油一定要少量,否则不能很好的进行乳化反应。
(乳--化--反--应--,头大啊,化学出来啦,偶就头疼化学)。
等蛋液有一些粘稠度的时候,可以多加点油然后再抽打,直到蛋液变成很粘稠的糊状为止(比炼乳还要粘稠一些)。如果嫌酱太粘稠可以稍微加一点柠檬汁或者用白醋代替。这是一个很艰辛的过程,抽打不同于一般搅拌,一定要把劲甩上。胳膊会很累,不过建议不要用搅拌机,一是因为不好刷洗,另外我怀疑剪切力过大会破坏已产生的平衡。
(可是前面的文章说最好用搅拌器。不过鉴于我现在还没有,就不用啦)。
自制沙拉酱听别人叙述可能永远也掌握不好尺度,自己试验一次就能领会了。 沙拉酱也可以一次做多一点,装在干净干燥的瓶子里保存。这时候土豆就差不多蒸好了,好的程度就是用筷子可以很容易的戳进去。把土豆拿出来放凉然后剥皮,刀子上沾着水切成块。加入沙拉酱、盐适量和白胡椒粉少量搅拌就可以吃了。如果是土豆泥沙拉,可以把土豆碾碎以后混合沙拉酱,再加入各色的蔬菜粒就可以了。
(下面就是土豆沙拉的图啦) 自制沙拉酱 from    配料:色拉油500克、蛋黄1个、盐少许、香料少许。 制作:用一个不锈钢盒,将水分擦干,将蛋黄放入,用打蛋器抽打起泡,加入色拉油继续抽打搅拌使油和蛋黄完全融和成粘稠状,加入盐、白糖即可。
这个色拉油要用500克,只用一个蛋黄,那不是还都是油么。哈哈。这个最不可信。 好了现找这么多。有空的周末,做一次沙拉酱试试。看起来很好玩的。
相关文章
2004-07-13 01:19:06
是GPL的。
用的时候可以装在一张软盘,或者做成可启动的光盘。
要用memtest86来启动。然后会来做测试。
不过那个网站现在访问不了了。不知道是Great Wall在起作用呢。还是因为前些时候欧洲专利法(这个可以参考 ),而关闭了网站。
以前的网址是:
如果有需要,我这里有一些备份。可以email索取。
我知道这个是当时修内存的时候,给su ort写信,他们给我的回信中说的。
下附他们回信:
建議您使用其他測試軟體如
Memtest
做進一步測試
下載途徑為
www.memtest86.com,
版下載完畢後執行安裝
. 程式將要求插入磁片
. 您只要重開機
磁片就會自動執行程式
如果有出現任何錯誤就表示記憶體是有問題的
需要送回維修
而無任何
的話那可排除內存故障問題了。該
MEMTEST
不會自動停,需手動。
2004-07-12 21:17:00
前些时候内存坏了,上周五代理告诉我说从原厂返回来了。但是周末他们旅游,不上班。于是我等啊等啊,等到了今天才把内存拿回来。
又有512 + 256 M 可以用了。
下面是以前给他们的su ort写的email,就是描述我机器的状况。后来查出的原因据说是掉了四个电阻(太夸状了)。不过我一直很疑惑我第一次去代理那里的时候,竟然在他们的机器上可以用!
我用的机器出现这样的现象:
键之后,
界面没有出现,所有的灯一直在闪。
我移除了很多设备,最后去掉一根
的内存之后,系统可以正常使用了。(之前一直都是可以使用的) 我现在的内存配置是
256M + 512M
两个都是**
生产的。购买的时间不同。
266的, 256M
(微星)
845 Ultra
DDR DIMM Slots (1 to 3)
,我以前的插法是
Slot1 = 512M, Slot2 = 256M
我当日的下午,到中关村的经销商去。结果,在他们的机器上,可以进入
系统。(不过,后来我回想起来,有一点奇怪,就是他们的机器好想没有自检画面,直接就是
启动的画面)
我回家之后,尝试只用
,在不同的
上面。在
的时候,还是系统无法启动;
Slot2 or Slot3
的时候,
的界面可以过,但是启动
的时候(我试了
Windows 2K and WinXP
),启动的进度条快完了的时候,机器就自动重启了。
我也尝试过
Slot1 = 256M
Slot2 or Slot3 = 512M
的情况。情况是
界面可以过,但是还是没有办法正常启动。没有启动成功,机器就自动重启了。
现在,我只用
的内存,在
,可以正常使用机器。所以我还是怀疑那根
内存有些问题。
2004-07-12 00:41:09
Idomeneo 《伊多梅尼欧》
Die Entfuhrung aus dem Serail(The Abduction from the Seraglio) 《后宫诱逃》
Cosi fan tutte(Women Are Like That) 《女人心》
懒得去找了,先记在这里吧。
2004-07-11 15:21:45
blog里面的
,想转一些喜欢的莫扎特的歌剧。
又名《唐璜》,《唐·璜》或者《瑭璜》(Don Giova i)
据传说这个剧是直到演出前的晚上,莫扎特才写完了最后一个音符。
关于唐璜风流韵事的统计数字:意大利有640人,德国是231个,法国是100个,土耳其 91个,西班牙多达1003个,总共2065次!
(前面无聊的加了这么多东东,是因为摘要的时候下面的flash摘得不全,会引起blog显示的问题。)
(找了好几个的连接都不能用。就这一个可以)
网上的片段1是个flash的,不过只有声音没有图
《唐·乔瓦尼》
  二幕喜歌剧,达庞泰编剧,莫扎特谱曲,1787年10月29日,在布拉格国家剧院首次公演。这次首演大获成功,就像《费加罗的婚礼》那样,使布拉格城为之沸腾起来。因《费加罗》一剧而对这位作曲家无比风靡的布拉格听众们,对此剧抱着热切的期待,当亲任指挥的莫扎特出现在乐队池中的时候,就报以春雷般的掌声欢迎他。
  可是莫扎特本人却对音乐和歌手抱着极大的不安。原因是,前作的《费加罗》博得那样热烈的成功后,一直担心着这部新作是否也能获得所有听众的欢心。不过,一切都很顺利、圆满,结果还是被称赞为这是在布拉格上演过的最优秀歌剧。
  1788年5月7日在维也纳的首演,由于某些因素作了若干的修改,但效果远不如布拉格那场好。 1792年在威玛演出时(此时莫扎特已经去世),歌德十分欣赏这部歌剧,在给席勒的信中他说:“这是一部无与伦比的作品,莫扎特死后就再也不可能看到这样好的作品了。”
  这部歌剧取材于一个古老的传奇故事,《唐》(Don),在意大利语中是“先生”之意。是对西班牙男子的一种尊称。在民间传说中,这一故事又被叫做《惩奸记》,被法国著名喜剧作家莫里哀编成剧本,取名为《石客筵》。
  剧情简介:
  贵族青年唐·乔瓦尼是一个好色之徒,他夜闯老骑士唐·佩德罗的女儿安娜的闺房,因安娜喊叫又杀死了前来援救女儿的老骑士。此后,他又对村姑泽琳娜起了歹心,被唐·乔瓦尼遗弃的艾尔维拉与安娜的未婚夫奥塔维欧一起揭露了他的真面目。在教堂的墓地里,玩世不恭的唐·乔瓦尼竟站在老骑士的石像前邀请石像到他家里去吃晚饭。石像果然来到了唐·乔瓦尼,一声巨响,地面裂开,唐·乔瓦尼这个恶棍被石像拉进了阴曹地府。
  演奏时间:
  序曲:6分 第一幕:82分 第二幕: 80分
  时间:17世纪
  地点。西班牙塞维利亚。
  剧中人物:
  唐·乔瓦尼 花花公子 男中音
  唐·佩德罗 统领、老骑士 男低音
  安娜 统领女儿 女高音
  艾尔维拉 唐·乔瓦尼女友 女高音
  奥塔维欧 安娜之未婚夫 男高音
  莱波雷洛 唐·乔瓦尼仆人 男低音
  马塞托 村民 男低音
  泽琳娜 马塞托的未婚妻 女高音
  贵族、妇女、宾客,卫兵、乐师及仆从等。
  故事发生于17世纪中叶的西班牙
  剧情介绍:
  序曲
  据说是莫扎特只花一夜就谱成的这首序曲,是用奏鸣曲式写成的。以D小调二分之二拍子行板做为序奏,取之第二幕第五场“石像应邀赴约”的主题音乐,在通常的情况中,莫扎特的序曲是不使用歌剧中的旋律的,而是以几乎不同的曲思去酝酿出歌剧的气氛,所以此处的作法算是一个例外。
  乐曲的开头是总奏的强奏和弦,接着又以弦乐的弱奏出不祥的和弦,这段落是在石像出现处奏出的。随后第一小提琴那不安的旋律,是在乔瓦尼迎接石像、跟他打招呼处演奏的。接着,莱波雷洛害怕的模样,由小提琴刻画出来。气氛变得更为阴森,渐强奏上升后又以弱奏下降的乐句,是由第一小提琴和长笛奏出的。这是石像对乔瓦尼叙述来访理由时的乐句。
  以上好像在暗示唐·乔瓦尼命运的序奏告一段落,速度出现急剧的变化,转人D大调的更快快板后,就流泻到晴朗的主部中。这时奏出第一小提琴在欢天喜地的歌唱、管乐给予应答的第一主题。经过华丽的过门,出现轻快地跳跃的第二主题。
  发展部是从第二主题开始的,两个主题做过简单的展开后,接到通常的再现部中,以C大调结束这首序曲。但音乐并不切断,立刻接到第一幕第一场中。不过,后来为了一般的演奏会之用,莫莫扎特又特别为它追加—段尾奏。
  第一幕第一景:统领佩德罗官邸花园
  乔瓦尼是塞维利亚出名的花花公子,某晚他潜入佩德罗爱女安娜的闺房,意图调戏她。而安娜已许配给奥塔维欧为妻。
  乔瓦尼的仆人莱波雷洛身披上巨大的斗篷,在住宅的庭院中走来走去。在引接自序曲的管弦乐前奏中幕启后,莱波雷洛愤愤不平地唱出:“不分昼夜为主人效劳,无论风吹雨打都得忍受,连睡觉和用餐都不能随心所欲。但愿我也能成为绅士,把伺候别人的事一脚踢开。这阵子主人在屋里享乐,而我却必须在屋外把风。”由于发觉有人来了,他就很快躲在阴暗处。
  这时唐·乔瓦尼被安娜追着从屋里跑出来,他一直把脸遮住怕被人看出是谁。这个三重唱从安娜的“即使被杀也不让你逃掉”开始,到乔瓦尼的“不能让她知道我是谁”,然后是吓呆的莱波雷洛在树后嘀咕说:“这是什么样的骚动”结束。
  听到这些吵闹声,安娜的父亲统领佩德罗出现,安娜发现父亲出来了,就把乔瓦尼的手放掉,跑回家里。老统领向乔瓦尼要求决斗,他却用:“我不跟老人斗”而加以拒绝,可是老统领仍然拔剑相向。莱波雷洛还是躲在树后,心脏猛跳着观看情况的发展。这时管弦乐以写实的手法描写这场决斗。
  很快地,老人因受到致命伤而倒在血泊中,呼吸困难地叫喊着:“救命啊!”这时唐·乔瓦尼则自语说:“这是可怕的罪孽!”然后加入在阴暗处发抖的莱波雷洛,又形成短小的三重唱,不一会儿,老统领便断气了。
  接着,唐·乔瓦尼把莱波雷洛叫出来,这个胆小的仆人害怕地问:“死去的是谁?是一位老头子?”两人乘黑夜潜逃。
  这时安娜、奥塔维欧和仆人们登场。安娜发觉父亲来过这里,奥塔维欧则说一定要要保护老统领。很快地安娜和奥塔维欧发现倒在地上的骑士长,知道父亲被杀死后,安娜因无比悲痛而昏倒。这时管弦乐巧妙地表达出发现父亲倒地时的惊讶和知道已死去时的悲痛。
  奥塔维欧命令仆人进去拿药,两三名仆人急忙离去。他对安娜昏倒的事也感到悲伤,但过一会儿,她便清醒过来。仆人回来后,奥塔维欧要他们把老统领的遗体搬走,然后安慰着安娜。这时宣叙调结束,进入两人的二重唱,安娜哀悼去世父亲奥塔维欧在安慰她,安娜请未婚夫替父亲报仇,然后在他们一起发誓的二重唱中结束。
  第二景:乔瓦尼府第前的广场
  唐·乔瓦尼回家之后,若无其事,又与男仆莱波雷洛计划新的风流行动。突然“飘来香味”,发觉有妇女走近了,于是两人就躲起来观察情况。这时穿着旅行装的艾尔维拉出现了。她曾被唐·乔瓦尼遗弃,嘴里尽管念着要报仇,其实心底还是强烈地被他吸引。
  在轻快前奏后,艾尔维拉激动地唱出咏叹调:《阿,有谁能告诉我》,她说:“那个使自己蒙羞的无情男人在何处?如果能再看到他,我一定要复仇!”这时躲在阴暗处的唐·乔瓦尼听了这悲痛的话后,并未发觉她就是艾尔维拉,从旁插入“可怜的女人”的歌声,莱波雷洛则感慨地说:“他又发现猎物了”。
  当乔瓦尼叫着:“姑娘”时,艾尔维拉就闻声转过身,两人面对面后都吓一跳,艾尔维拉立刻怒斥乔瓦尼是狼心狗肺的东西。乔瓦尼想解释,但并不顺利,只好向莱波雷洛求助,悄悄地逃走了。莱波雷洛为了安慰愤怒的艾尔维拉,拿出一本记事簿请她看,然后告诉她遇到这种倒霉情况的人不只是她而已,并唱出下一首著名的咏叹调:《目录歌》。他说:“夫人,这是一本情人目录”,请读一读我主人的情人目录吧。意大利有640人,德国是231个,法国是100个,土耳其 91个,西班牙多达1003个。她们是乡下姑娘、婢女、城市妇女、伯爵夫人、男爵夫人,以及公爵夫人,他网罗了各种不同阶级、各种体型和各种年龄。”
  他还唱出:“对金发女郎他就称赞她的美丽,对棕色姑娘他就夸赞她的贤淑,冬天最好是肥胖的女人,夏天酷爱瘦俏的姑娘。说大个子气宇非凡,称矮个子是小巧玲珑。年纪大的是充实,但最感兴趣的,还是未经世故、天真烂漫的小姑娘。不管是否有钱,是否难看,只要是女人就行。这下你该明白了吧?”唱完他就退场。
  听过这些话,艾尔维拉终于明白自己是受骗者之一,于是他发誓必雪此恨,然后她也离开了。
  第三场唐·乔瓦尼府邸附近村庄的广场
  穿上庆典服装的男女农民们,纷纷登场。最前头的是村庄里最漂亮的泽琳娜,以及她的未婚夫马塞托。
  随着管弦乐热闹的前奏,大伙儿都登场了先由泽琳娜唱出:“恋爱的姑娘们请勿错失良机,如果芳心悸动,且瞧这个能治愈的灵药”,合唱立刻跟这愉快歌声唱和。
  接着,马塞托就以泽琳娜的相同旋律唱着:“多情的年轻人啊,可别到处猎艳。儍瓜有时也会走运,我就是一个幸运的男人。”跟前面一样,合唱也随着唱和。然后泽琳娜和马塞托唱出了二重唱:《大家共享快乐吧,愉快地载歌载舞》。最后又是合唱。
  唐·乔瓦尼为顺利地逃过艾尔维拉而感到欣慰,带着莱波雷洛登场,当看到有不少美女时,他又怦然心动了。唐·乔瓦尼和众人很客气地打过招呼后,立刻走近泽琳娜和马塞托身边,询问两人的名字。不久,莱波雷洛就宣布说,乔瓦尼愿意招待大家到他的府邸。这时,马塞托不肯把泽琳娜单独留在此地而跟村人们一起先走,乔瓦尼说:“泽琳娜由我加以保护,你安心地先走一步。”当马塞托还是不听话时,乔瓦尼就拔出利剑吓唬他,如果你不照着做就会后悔莫及。
  被唬住的马塞托尽管很愤怒,也只好照着乔瓦尼的话去做,于是开始唱出了咏叹调:《是,知道了,老爷!》然后对乔瓦尼说:“我是无可奈何的,只好先走了。”然后又对泽琳娜斥责说:“你这靠不住的女人!最后又讽刺地唱出:”这或许是一件好事,高贵的老爷将把你教导成贤慧淑女。”这句话充满了嘲笑的味道。这段咏叹调过后,马塞托、莱波雷洛和村人们一起退场。
  这时乔瓦尼对泽琳娜说:“这样的美人儿嫁给马塞托这种粗人,简直是一朵花插在牛粪上。” 泽琳娜回答说:“因为早就订婚,所以不得不嫁给他。”听到乔瓦尼的甜言蜜语后,她真的心动了,虽然泽琳娜担心彼此的身份悬殊,但乔瓦尼要她不必挂虑,建议一起到他的别墅举行婚礼,唐·乔瓦尼以无比甜蜜的旋律开始他的诱惑泽琳娜,然后要她马上跟他一起前往。可是泽琳娜还在犹豫是否该跟他走。由于唐·乔瓦尼很执着,泽琳娜的防线终于被击溃,当乔瓦尼再一次催促:“走吧”时,她就回答说:“好”,然后唱出幸福的二重唱:《那么手拉着手吧》。这是一首二重唱中最优美的作品,把莫扎特的天才展露无遗。
  二重唱后当他们手挽着手转身要离开时,艾尔维拉正好出现。艾尔维拉除了愤怒地痛斥这只色狼外,还庆幸自己及时营救了这位天真无知的姑娘。听了这些话,泽琳娜为之花容失色,而唐·乔瓦尼则告诉艾尔维拉,这只是短暂的游戏。
  根本不理睬唐·乔瓦尼胡说的艾尔维拉,激动地唱出这首短小的咏叹调:《阿,远离这骗子》她忠告泽琳娜说:“我就是前车之鉴,请相信我的话,对他保持戒心吧!”唱完以后,艾尔维拉就带着泽琳娜离去。
  当乔瓦尼哀叹今天运气实在很坏时,奥塔维欧引着安娜登场。乔瓦尼虽然担心麻烦又要降临了,可是一听安娜是来要求和他建立友情的,他终于加释重负,而且答应聆听她的倾诉。原来是,安娜根本不记得上次侵犯她的色狼面貌,反而前来向乔瓦尼请求替自己的父亲报仇。这时艾尔维拉又出现了。她先唱出:“不可相信他的话,他还想欺骗你”,由于发觉艾尔维拉模样很奇怪,安娜和奥塔维欧就同情地唱道:“很美,但很可怜”,而乔瓦尼则解释说:“她的神经有点怪”。
  这时,艾尔维拉拼命要让安娜和奥塔维欧认清唐·乔瓦尼是一名恶棍,而唐·乔瓦尼则坚持说这个女人神经错乱。因艾尔维拉说得很认真、诚实,安娜和奥塔维欧终于怀疑起来,等他们仔细端详唐·乔瓦尼的脸以后,判断艾尔维拉的话可能是正确的。这是一段用行板写作的、充满紧张感的四重唱。
  四重唱以后,艾尔维拉马上退场。唐·乔瓦尼就表示他也不明白这个女人有何目的,只说愿意尽力效劳,说完就走掉了。
  这时安娜想起来,唐·乔瓦尼最后要离开前说的话,和侵入自己房间的男人所说的一样,由宣叙调中,管弦乐生动地传达出,安娜的激动心情。奥塔维欧惊讶地问起那天夜里的经过,她就极具戏剧性地说:“深夜里,有一个身穿斗篷中的男人潜入我的房间,我虽然被他抓住,但拼命挣扎,终于逃出他的魔掌。”(听到这儿,奥塔维欧才松了一口气。)“当我大声叫喊着想捉住这男人追到屋外时,恰好父亲来到。不料两人决斗后,父亲却被杀了。”就这样,安娜把那天夜里发生的事一五一十地说出来。
  这个宣叙调告一段落后就进入咏叹调中。安娜对奥塔维欧说:“你已经知道谁要侵犯我的贞操”,并请求他为去世的父亲复仇。这段咏叹调,表情尽管不是很激动的,却洋溢着热切的心意,要求奥塔维欧有强烈的意志。唱完此曲后,安娜独自退场。 独自留在舞台上的奥塔维欧,一直无法想象这样高贵的男士怎么会做出如此卑鄙行为。他说必须要查明真相。如果是真的,就一定报仇。此处已经清楚地表达出奥塔维欧审慎、认真的性格。
  这首咏叹调在布拉格首演时根本没有,而是此剧在维也纳首演时,莫扎特就加入这段咏叹调,目的是为了平息他的心情。由于写得比较甜蜜,于是和安娜的前一首咏叹调形成鲜明对比。这时他以优美的曲调唱出:《她的幸福就是我的愿望》,他说:“她的快乐就是我的快乐,她的痛苦也是我的痛苦”,唱完后也退场。
  接着,莱波雷洛和唐·乔瓦尼相继出现。莱波雷洛埋怨着说:“我必须设法离开这个胡作非为的主人”,可唐·乔瓦尼根本就没有察觉,还向他探问事情的始末。莱波雷洛告诉他,把大伙儿招待到府邸后,为了安慰马塞托,就让大家畅饮美酒,正当玩得很开心时,泽琳娜和艾尔维拉出现了,艾尔维拉对大家破口大骂,莱波雷洛就把她推到屋外,把大门关紧。唐·乔瓦尼听了便开心地大叫:“干得好!后面的事情让我来处理”,然后唱出了一首快活的咏叹调:《香槟之歌》。他想象着即将来到的狂欢,物我俱忘地引吭高歌,显示出他的乐天性格与强烈的生命力。他愉快地唱道:“畅饮美酒后就狂舞作乐。街上只要看到女人就把她带进来,小步舞曲、佛利亚舞曲,或是阿勒曼舞曲,任君挑选。在这段时间内,我不刻意挑出对手,到明天早晨名册上又将增加10个人。”
  第4场唐·乔瓦尼府邸的庭院
  被邀参加宴会的村庄年轻男女,正在庭院中等候,泽琳娜和马塞托也在人群里。马塞托对泽琳娜最近的行为感到有些生气,泽琳娜正在设法安抚他。不过,马塞托还是怒骂她不知羞耻,泽琳娜只好告诉他:“你就骂个痛快吧,直到火气消散。”然后唱出了首咏叹调:《请你打我吧,马塞托》她说:“打这可怜的泽琳娜吧,想拔掉我的头发,还是想挖掉我的眼睛,悉听尊便。啊,你不敢这么做吧。请你平心静气,好好和我过日子。”
  马塞托虽然知道一些真相,还是被泽琳娜说服了。这时从舞台后方传来唐·乔瓦尼的声音:“好,准备了”,马塞托听了就躲起来。
  此时马塞托唱着:《快,快,在他还没出现前我必须躲起来》,他想躲在隐蔽处监视唐·乔瓦尼的举动。狼狈的泽琳娜很不愿意单独被留下。
  不久,穿得很神气的唐·乔瓦尼,在仆人的陪伴下精神抖擞地出现,他要在场的人们进屋,这些话是仆人们用合唱代为传达的,于是大伙儿就鱼贯而入。
  这时音乐变成行板,泽琳娜虽然想躲开,仍然被乔瓦尼发现,于是把她拉到较为隐秘之处,不料跟马塞托碰个正着,唐·乔瓦尼吓了一跳,但很快就镇定下来,随着屋内传出的音乐,很有礼貌地把他们两人带到屋里。 音乐逐渐阴暗后,安娜、艾尔维拉和奥塔维欧等三人戴着假面,经过化装后在舞会中登场。当、艾尔维拉开始唱出:“拿出勇气,设法窥探这个男人的真面目”后,奥塔维欧和安娜就唱出他们的决心。这时从屋内传出舞会上所奏小步舞曲的乐音,这是一首妇孺皆知的名曲。
  莱波雷洛打开窗子后,看到屋外的三人,就报告主人有三位客人来了,唐·乔瓦尼命令他把门打开,将三人引入屋内。三人虽然判断乔瓦尼一定是色狼,可是只有奥塔维欧又踌躇起来,不过,最后三人还是应邀走入舞厅。在他们身后关门的莱波雷洛又自言自语道:“主人绝对不会错失这猎艳的机会。”窗户被关紧后,小步舞曲的曲调就听不见了。音乐突然变成严肃的慢板,由带着假面具的三人唱出复仇的三重唱,他们都祈求神的相助。
  第五场 唐·乔瓦尼家中的大客厅
  后方可以看到两个大房间,分别坐着乐团团员。这时恰好跳完一首舞曲。
  接着管弦乐奏出快板的愉快曲调,唐·乔瓦尼和莱波雷洛开心地和客人们周旋。尽管客人很多,乔瓦尼还是制造机会向泽琳娜调情,看到未婚妻因而乐不可支时,马塞托却独自哀叹。不久,安娜等三人登场,习惯地跟主人和莱波雷洛打过招呼后,一起唱出:《自由万岁》的五重唱。舞台上的第一个乐团,又奏起刚才在屋外听到的小步舞曲。唐·乔瓦尼要莱波雷洛缠住马塞托,自己却开始悄悄地引诱泽琳娜。莱波雷洛热情地劝马塞托和别的姑娘跳舞。
  这时第二乐团开始调音,当唐·乔瓦尼和泽琳娜一起翩翩起舞时,乐队立刻奏出:《对舞曲》。不久,第一乐队又在调音,莱波雷洛强迫马塞托跳舞时,就开始奏出了圆舞曲。这时交错般出现三首拍子相异的舞曲。在不知不觉间,唐·乔瓦尼已经把泽琳娜带入房间。看到这情景的马塞托气得脸红脖子粗,莱波雷洛怕引发不愉快的事,立刻跟着他们追过去。突然传来泽琳娜的悲鸣声,舞蹈立刻停止,听到呼救声,安娜、艾尔维拉和奥塔维欧马上走到屋门口。这时出现的唐·乔瓦尼把戏弄女人的责任推给仆人莱波雷洛,拧着他的脖子走出来。
  其实,很多人都看到了刚才丑剧的真相,不再受唐·乔瓦尼之骗。就在这骚动之间,泽琳娜从别的门逃了出来,向大家揭发乔瓦尼的企图。
  这时众人异口同声地诅咒说:“这个恶棍,你的脑袋必遭天罚!”面对众怒,乔瓦尼和莱波雷洛则尴尬地唱道:“不知道我的主人该怎么办才好。脑海中是一片混乱。尽管如同在狂风暴雨中,我的主人必须处变不惊”。
  第二幕 第一场 路上,附近有艾尔维拉所住的家。
  靠路边墙上有窗子,这时是傍晚,舞台逐渐暗下来。乔瓦尼和莱波雷洛上台唱着二重唱。乔瓦尼唱:“随他去吧,小丑”,这时他在安慰因前夜发生的事而想辞去仆人工作的莱波雷洛,后来,莱波雷洛坚持让乔瓦尼给他假期,为了留下他,唐·乔瓦尼就取出一包金币给莱波雷洛,结果他勉强妥协了。唐·乔瓦尼申述一阵子他的爱情论后,为了开始引诱新的对象、艾尔维拉的婢女,莱波雷洛虽然很憎恶主人的这种做法,还是跟主人换穿衣服去了。
  这时,艾尔维拉出现在她家有窗口的阳台上,艾尔维拉唱着:“她尽管谴责唐·乔瓦尼,但内心还是被他所迷。听到这歌声,乔瓦尼就躲在莱波雷洛身后,一想到还可以利用艾尔维拉。于是他开始用甜言蜜语向艾尔维拉倾诉懊悔之意,他的声音好像嚎啕大哭一般,并夸张地表示自己想去自杀。莱波雷洛担心着谎言被揭穿。
  艾尔维拉半信半疑地听着他的话,终于掉进这假哭的陷阱中。此处唐·乔瓦尼呼唤着艾尔维拉:“下来吧”,随后即将出现的小夜曲开头的旋律。莱波雷洛很同情艾尔维拉怎么这样简单就相信乔瓦尼的谎言,但唐·乔瓦尼则为自己的机智感到沾沾自喜。尽管莱波雷洛万分的不情愿,唐·乔瓦尼还是命令他,等艾尔维拉下来后,务必模仿自己的音调与语气好好把她纠缠住,然后悄悄地躲起来。
  艾尔维拉出来后,真的把换装的莱波雷洛误以为是乔瓦尼,两人间就交换出热烈的情话。莱波雷洛发觉假戏成真后,觉得很开心。在阴暗处窥视的乔瓦尼突然模仿杀人者的粗暴声大声叫喊,两人吓破胆子,相携落荒而逃。去除阻碍后,乔瓦尼立刻走到窗口下拿起曼陀铃,开始高唱一段短歌。这就是著名的唐·乔瓦尼的小夜曲:《请到窗边来》在这首甜美的意大利风情歌中,他要姑娘出来安慰他,要她务必让乔望尼看清面容。
  这时有几个农夫拿着***上场,发现了唐·乔瓦尼。因为他穿的是莱波雷洛的衣服,只能一直以莱波雷洛的身份跟他们交谈,表示自己是色狼的仆人,对主人的行为也感到气愤,说着自己也加入他们的行列,要去捉唐·乔瓦尼。
  这时乔瓦尼就像指挥官一样开始唱出:“一半从这边走,一半走那边,大家分头去找。”他还表示说:“乔瓦尼并没走远,只要找到他就痛打一顿吧!”等他向大家说明这个色狼的模样后,大伙儿便从左右两边分别退场。接着,他又对马塞托说:“你留下来跟我走”。
  当唐·乔瓦尼确定农民们都走远以后,劝马塞托打消想杀死唐·乔瓦尼的念头,可马塞托根本不听劝告,乔瓦尼把他痛打一顿后就扬长而去。
  一听到马塞托发出的悲鸣,泽琳娜赶来了。获悉事情的始末之后,他告诉未婚夫这灾祸是因为嫉妒心太强,不过她唱起了明朗可爱的咏叹调:《药师之歌》温柔地安慰了他。她说:“情人呵,请用这个灵药,你可知道,我要献给你什么药吗?请喝下它,这是任何药房都没有的灵药。如果你想要,我就给你一点吧。若是想知道在哪里,嘿,就是这儿。”说罢,就把马塞托的手拉到自己的胸前。唱完后,和马塞托一起退场。
  第二场 安娜家黑暗的中庭,进出口有三个,正面是正门,四周被廊柱包围。
  莱波雷洛和艾尔维拉一起进来。这位仆人还穿着主人的衣服。他很想尽快从这女人身边脱逃,于是把艾尔维拉带到这比较阴暗的地方,艾尔维拉正在奇怪怎么被拉到这里,而莱波雷洛随即想出借口说,要观察一下四周的情况,然后溜走了。
  只有艾尔维拉一个人时,她唱着:“一个人单独在这黑暗的地方实在很可怕”。当莱波雷洛在寻找出口的时候,穿着丧服(因在骑士长葬礼后)的奥塔维欧和安娜,在手执火炬者的陪伴下从大门走进来,结果,他无法离开。
  奥塔维欧安慰着安娜说:“请拭去眼泪”,但安娜因悲伤过度,想要自杀。莱波雷洛好不容易找到另一道出口,不料艾尔维拉也跟来了,两人正想走出去时,和正要进来的马塞托与泽琳娜碰个正着。
  听到马塞托和泽琳娜的惊叫声后,安娜和奥塔维欧发现了穿着唐·乔瓦尼服装的莱波雷洛,把他看成是仇敌的四个人就高喊着:“不能让他活着!”吓坏了的艾尔维拉便拼命解释:“他是我的丈夫,请大家饶他一命。”但四个人却不肯答应。看情势已经无法平息众怒,莱波雷洛就脱掉外衣,热大家看清自己真正的身份,然后跪在地上乞求大家宽恕,大伙儿看到后惊讶无比。
  突然,音乐变成很快的快板,莱波雷洛开始唱出:“我的头脑一片混乱,除非有奇迹出现,否则休想从这可怕的风暴中脱逃”。这时大家也跟着唱出:“我的头脑一片混乱,这是一件多么奇怪的事”。
  在这段六重唱中,当莱波雷洛和艾尔维拉摸黑寻找出口的时候,小提琴奏出颇具特色的音调,产生了美妙效果。觉得自己儍呼呼的安娜,很快带着仆人退场。莱波雷洛受到众人的一顿臭骂。在马塞托大叫:“大家一起把他杀掉”后,莱波雷洛就唱出了《啊!各位请饶了我》的咏叹调。他表示愿意把一切经过招出来,对在场的每一位做了详细的解释。这是非常着急,又极富表情的咏叹调。这个机警的家伙,边唱边往出口移去,最后一转身就溜掉了。然后又向大家表示说,自己要去告发这名杀人犯。
  奥塔维欧也向大伙儿拜托说:“请安慰我的恋人”,他要大家在自己不在的期间内好好安慰安娜,并发誓一定带回报仇的信息。这是一首旋律极为优美的咏叹调,有相当高雅的抒情性,但很不容易唱好。这段咏叹调在维也纳首演时,因扮演者认为演唱困难而被删除了。
  此剧在布拉格首演时,第二场到此结束,可是在维也纳上演时,莫扎特却追加两首新歌。其中的一首,就是泽琳娜和莱波雷洛的宣叙调和二重唱。这时,泽琳娜把莱波雷洛抓住并加以嘲弄,让他出丑。这是为了取悦维也纳人的,一般演出此剧时都不取用。
  第三场 室内(维也纳演出时追加的场面)
  此时的艾尔维拉以复杂的心情叙述着她可怜的恋爱:“那个人犯了多么可怕的罪!我仿佛看到天谴将降临他身上。我的内心是多么的矛盾心。”这段宣叙凋的管弦乐写得无比巧妙,预想降临天谴的地方,以及描述矛盾心情的段落,都有着惊人的暗示力。
  接着艾尔维拉又用咏叹调唱出了飘摇不定的心情:“我虽然被他遗弃过,却很同情他;虽然很想报仇,可是当他陷入险境时又不忍心了。”此曲也是在维也纳首演时,由于饰演这角色的歌手拼命要求能唱一首较长的咏叹调而新追加的。这是一首炫耀技巧的乐曲。
  第四场 佩德罗的墓地
  这是被低墙围住的墓地。在几个骑马雕像中,竖立着老骑士的立像。月夜。还穿着莱波雷洛服装的唐·乔瓦尼,傻笑着越过矮墙,自言自语说:“躲在这里倒是个好地方,这是美好的夜晚。”不过,他还是担心莱波雷洛出什么意外。突然,莱波雷洛出现了,唐·乔瓦尼把他叫住,这时这位仆人就把自己所遇的倒霉事全部说出来。
  接着,唐·乔瓦尼讲述说:“有一位仰慕我的姑娘,叫莱波雷洛陛下,后来被发觉我是乔瓦尼后,众人就想追捕我,于是我逃到这里。”这时,乔瓦尼不时开心地狂笑,可是突然音乐变成慢板,在管弦乐伴奏上传来严肃的声音:“你的狂笑只止于今夜” 莱波雷洛听了吓破胆子,想拔腿就跑,可是唐·乔瓦尼却问:“你是谁”然后环顾四周,又回来观看着每一座石像。
  突然又传来:“无耻者”的声音,这时唐·乔瓦尼终于发现了老骑士的石像,害怕得发抖的莱波雷洛读出墓志铭:“我在此等待杀我的恶棍,我要复仇。”接着,唐·乔瓦尼又命令莱波雷洛大声向石像说,邀请他今晚到家用晚餐,莱波雷洛也只好照做。
  他唱着:《伟大的统领殿下》,可是由于实在很害怕,无法照唐·乔瓦尼的命令说出邀请他的话。
  唐·乔瓦尼开心地吓唬着莱波雷洛。被逼得没法子,莱波雷洛终于说出邀请的话。而石像居然说出:“嗯”,吓坏的莱波雷洛说石像答应了。唐·乔瓦尼起初不信,他仔细端详后,真的看到石像在点头,这时的他才开始全身发毛,但依旧对石像喊着:“用嘴回答!”而石像则说出一个字:“好。”这时的唐·乔瓦尼双手冒汗了,他拉着动也不动的莱波雷洛说:“准备回家”后一起退场。
  第5场 安娜府邸的一室
  这时安娜和奥塔维欧在一起。奥塔维欧说,如果两人的婚期再延后,他实在无法忍受了。埋怨安娜的心绪总是想着死去的父亲,对自己的爱情变成是一片空白。
  当奥塔维欧责备说:“这样太过份了”时,安娜反问:“什么叫过份 ? 我心里还是有爱情的。”在这宣叙调后,安娜又唱出了咏叹调《请不要把我想成是不亲切的女人》她说:“有那么一天,神一定会在我头上微笑”唱完后安娜就退场。
  第六场 唐·乔瓦尼府邸的大厅
  大餐桌上已经准备好晚餐。边上有几名乐师。唐·乔瓦尼登场后命令奏乐,他要莱波雷洛在旁伺候,然后开始用餐。唐·乔瓦尼那狼吞虎咽的模样,令人感到无比惊讶。接着所奏的是萨第的“两人吵架之间”的音乐。这时莱波雷洛终于躲起来偷吃佳肴,猛喝美酒。
  很有趣的是,第三段音乐所奏的是莫扎特《费加罗的婚礼》中著名的咏叹调《花蝴蝶呵,不再能飞了》的音乐。当《费加罗的婚礼》在布拉格演出时,这首咏叹调最受当地听众的热爱,莫扎特也许是为了使他们开心,于是在此处又编入此曲。
  演奏到这段音乐时,唐·乔瓦尼发现莱波雷洛满嘴油腻,满脸通红,知道他偷喝了很多酒,于是就命令他:“清楚地回答”,或是“吹吹口哨”,让他出洋相。像这样快活的场面持续一段时间后,舞台气氛突然变成充满悲剧性。
  这时艾尔维拉激动地跑进来,并跪下说:“这是最后一次,一切我都原谅你了。”唐·乔瓦尼实在不知道她的意思,于是也跟着跪下,这时,乐师们退场,艾尔维拉哀求说:“请别嘲笑我。希望你改变一下生活方式。”唐·乔瓦尼还是搞不懂,只能表示:“请和我一起用餐吧”。唱出这句话时所用的旋律,是当时流行的一首歌谣。莱波雷洛被艾尔维拉的真诚所感动,但看到唐·乔瓦尼无动于衷时,艾尔维拉火冒三丈,气得飞奔离去。
  一会儿艾尔维拉尖叫着又跑回来,找到别的出口后慌张地逃走了。唐·乔瓦尼命令莱波雷洛:“出去看看”,莱波雷洛一到门口也吓魂不附体发出悲声。他全身发抖,好下容易移动发软的双脚回到屋里,就赶紧把房门关上说:“洁白的大理石男人,阴森森地走过来了!”但唐·乔瓦尼还不知道发生了什么事。这时,传来敲门的声音。由于惊吓过度,莱波雷洛实在不敢去开门,唐·乔瓦尼就亲自拿着灯去开门。这时莱波雷洛就钻进餐桌下。只见石像走进来了。这时胆大胡为的唐·乔瓦尼也吓得全身起了鸡皮疙瘩,心惊胆战地迎接石像。莱波雷洛从桌下探出脑袋,担心自己也会被杀。唐·乔瓦尼命令莱波雷洛再去准备一份食物时,石像阻止说:“我不是来吃饭的,我有别的目的。”
  接着石像就表示,为了回敬这次的招待,要唐·乔瓦尼到他的地方。尽管莱波雷洛提醒他说:“不便前往”,但唐·乔瓦尼还是答应:“我会去的”。当石像说:“请伸出手作为应允的证明”时,乔·唐瓦尼就伸手去握石像的手。他发觉这只手冷得可怕,当他想缩回时却无法抽掉。石像说:“这是最后时刻,悔改吧”,可是唐·乔瓦尼还是顽强地说:“不!”“你这恶徒已无药可救,没有时间了”,石像说完就转身离去。紧接着,大厅四周突然升起烈火,大地在震动、崩烈。这时唐·乔瓦尼才真的感到恐惧。此时从地下传来:“这是罪人的报应”的声音,这是一段魔鬼们的合唱,唐·乔瓦尼因烈火的焚烧,痛苦地哀号着,不久就连同烈火一起掉入地下。看到主人痛苦的模样,莱波雷洛也吓破胆子乱叫。接着安娜、艾尔维拉、奥塔维欧、泽琳娜和马塞托一起上场。除安娜外的四位主角们异口同声地问:“恶棍在哪里?”接着安娜才说:“只有我亲眼看到这个男人被捕,心中的痛苦才有可能消除”。原来躲藏着的莱波雷洛,这时也走出来向大家报告刚刚发生的事,并且说:“主人已经到遥远的地方”。由于艾尔维拉亲眼看到石像走到这大厅,大家才相信莱波雷洛所言不虚。
  这时奥塔维欧立刻请求安娜和他结婚,但安娜说,她必须再守孝一年,奥塔维欧因了解她的心境,只好同意。艾尔维拉则决定进女修道院度过她的余生。泽琳娜和马塞托商谈着马上回家准备婚事。莱波雷洛希望能找到一位正经的好主人。最后六人一起唱着:《这就是恶人应有的结局》,幕落。
  第二幕第一景:艾尔维拉家中 泽琳娜已受雇为艾尔维拉的侍女,乔瓦尼对泽琳娜仍然穷追不舍。他灵机一动,遂以金钱打动了莱波雷洛,命他与自己互换衣服伪装,并要他潜入艾尔维拉室内,纠缠女主人,他自己则去勾引他想了好久而未到手的泽琳娜。马塞托及几位武装的村民闻声而出,乔瓦尼极力装成波莱雷洛的模样,以图不为识破。然而被马塞托看出破绽,乔瓦尼则先下手为强,乘马塞托不备时,用手***柄重袭使其昏倒。泽琳娜闻声跑出,见其夫已卧地呼救,唱出动人抚慰的咏叹调:《亲爱的,听我细述》(Verdrai,Carino,Sei Buonimo)。扶马塞托进室,乔瓦尼已逃逸无踪。第二景:安娜宅邸一庭园 莱波雷洛与艾尔维拉走出,莱波雷洛还伪装成乔瓦尼,因怕艾尔维拉识破,蓄意逃脱,所以先把艾尔维拉带到阴暗室内。这时奥塔维欧与安娜穿着孝服走上来,莱波雷洛与艾尔维拉从另一出口来时,巧遇对面走来的马塞托、泽琳娜与奥塔维欧。莱波雷洛只好暴露身份,再求他们手下留情,马塞托因对乔瓦尼恨之入骨,要大家杀之。
  第三景:佩德罗的墓园 男仆莱波雷洛逃脱后,将经过情形报告主人,但乔瓦尼毫无悔意仍极愉快,又计划另一步的暴行。当此时,一个空虚的声音,向他提出警告,要他立即悔改,否则后悔莫及,原来是那被杀的佩德罗的石像在说话。花花公子乔瓦尼仍毫不知羞,反嘲弄之,竟敢邀请石像参加他的宴会。第四景:安娜家中 安娜和奥塔维欧谈情说爱的情景。第五景:乔瓦尼寓中一餐厅 宴会开始,大家兴高采烈地痛饮,艾尔维拉奔进来对乔瓦尼说:“这是最后一次机会,过去的可不必提”。乔瓦尼则若无其事地答说:“一起用餐吧!”艾尔维拉终于认清乔瓦尼的为人,气愤而出。不久,石像竟然应约而来,并对乔瓦尼说不是为宴会而来,乃是有要事办理。先答谢乔瓦尼的盛情,并回邀他握手为约,乔瓦尼此时想挣脱已来不及,地板崩裂,冒出火焰,乔瓦尼觉悟自己恶贯满盈,终于葬身火海,沦人地狱。这时合唱表示魔鬼的呼唤:《罪有应得》。第六景;莱波雷洛将乔瓦尼的死讯转告众人,大家皆为完成了复仇而欢呼,奥塔维欧与安娜相约完婚,艾尔维拉则削发为修女,终其余生。泽琳娜与马塞托相偕回家,莱波雷洛则准备找一好主人。最后是大家唱的六重唱:《这是恶人的末路》,全剧结束。
相关文章
2004-07-11 14:22:42
blog里面的
,也想转一点。
先贴两个网上找的片断连接,都是mp3的 另外加一个介绍(下面wiki文章里没有的):法国戏剧家博马舍在18世纪70年代创作了“费加罗三部曲”的三部戏剧,分别是《塞维利亚的理发师》、《费加罗的婚礼》和《有罪的母亲》。前两部被谱成了曲,18世纪的莫扎特选择了第二部,19世纪的罗西尼选择了第一部。
  如果你还没有看过罗西尼的歌剧《塞维利亚的理发师》的介绍,建议把这两个故事联系起来读,因为这两个故事是相互有关联的。
下面转载的内容来自 内容在
下发布。
费加罗的婚礼
(Le Nozze di Figaro)是
最杰出的三部
中的一部
,完成于
(Lorenzo da Ponte)根据法国
(Beaumarchais)的同名
改编而成。
作品背景
博马舍的《费加罗的婚礼》是他在十八世纪七十年代创作了总称为费加罗三部曲中的第二部,于1784年4月27日在巴黎
首演,其时法国正处于大革命的前夕,这部喜剧对揭露和讽刺封建贵族起了很大的作用。虽然这部喜剧在整个欧洲都获得好评,但奥地利皇帝
却禁止在维也纳上演这一剧目。莫扎特所请的脚本作家达·彭特是当时的宫廷诗人,由于他多次出面争取,最终皇帝于第二年为了缓和国内的一些冲击而口头批准改编后的歌剧可以上演。莫扎特用了两年时间谱曲,他在创作这部歌剧时保留了原作的基本思想,那愚蠢而又放荡的贵族老爷同获得胜利的聪明仆人之间的鲜明对照即为整个剧情发展和音乐描写的基础。
《费加罗的婚礼》的
部分短小精致,可算是名曲之一。莫扎特采用了
的手法,歌剧中的音乐主题虽然没有出现,但是总的风格保持-致,都是以
形式写就的。由
带出的两个主题一快一缓,很好的交待了全剧幽默、机智、快活的基调。也因其完整,充满活力而且效果显著,颇能调动气氛,这段序曲常常脱离歌剧而单独演奏。
费加罗这一角色是全剧的亮点,莫扎特以传统的喜歌剧手法为其谱曲,在急口令式的歌唱同时又赋予了人物坚定机智的性格,他在第一幕第八场中送凯鲁比诺去当兵时所唱的
“从军歌”最有名,因其曲调轻松活泼,耳熟能记,所以广为传唱。罗西娜这个角色不同于其在《塞维利亚的理发师》中是花腔
,此处她属于抒情女高音,优雅而矜持,因为这个人物的矛盾复杂的心理,所以较难把握,如在第二幕中的摇唱曲。与她相对的是苏珊娜,其相当于歌剧中丫鬟的角色,因此莫扎特给出的唱段比较活泼质朴,其中还用了大量的
。此剧中另一个女高音是童仆凯鲁比诺,她的咏叹调比较天真可爱。莫扎特用轻快跳跃的旋律、简洁明快的乐句生动地描绘了一个情窦初开的少年那不安定的心态。在《费》中有着多处重唱,对于剧情的展开及人物性格的刻画都启着重要的作用。在第三幕的第十场,罗西娜与苏珊娜写信时的两重唱不仅曲调,歌词也极为优美。做着同一件事的两个人所怀着的不同的感情在重唱中的到了充分的体现。另外,在第二幕中有一段很长的重唱,一重一重的把剧情推向戏剧冲突的高潮。从伯爵怀疑夫人的房间里藏有男人而开始的两重唱,到门打开后苏珊娜出现的三重唱,接着园丁加入成为四重唱,最后以七重唱结束。
1786年5月1日,《费加罗的婚礼》于维也纳
首演,由莫扎特本人亲自担任指挥。由于此剧题材敏感,上演期间国内的贵族大为愤慨,皇帝个人虽然很欣赏这部作品,但迫于压力,曾多次要求莫扎特删改内容。德语版本于1790年在柏林上演。
剧情大纲
十七世纪中叶,西班牙Seville近郊
第一幕:
今天晚上,费加罗(Figaro,男中音)将和苏姗娜(Susa a,女高音)结婚,婚礼就在他们的主人阿尔玛维瓦伯爵(Count Almaviva,男中音)家里举行。这个时候,两个人正在他们的新房里忙碌,苏姗娜坐在镜子前面梳妆打扮,而一旁的费加罗则苦思冥想如何安排伯爵送的大床。
费加罗打量着房间的每一个角落,比划着适合放置新床的位置。苏姗娜转头叫他看看自己装扮得是否得体。见费加罗不置一词,苏姗娜便对他说老爷把这间离他卧室不远的屋子给他俩很值得怀疑,他们要当心。说完,苏姗娜被人叫了出去。费加罗想着如果老爷真的不怀好意的话,他也有办法对付。
外面,巴尔托洛医生(Bartolo,男低音)和他的女管家玛赛琳娜(Marcellina,女高音)来了,她拿出一张字据,上面写着:我借了您的钱,如无力偿还,便和您结婚,费加罗。这老女人很喜欢费加罗,听说他今晚要结婚,所以着急的想请医生帮忙,以此为理由来阻止。医生曾是罗西娜的监护人,以前由于费加罗的干预使他在无奈之中把罗西娜嫁给了伯爵,所以一直怀恨在心,眼看着报仇的机会来了,感到非常痛快,答应玛赛琳娜的请求后便立刻离开去办理。
苏姗娜进房间的时候看到自己的情敌玛赛琳娜,心中有气,但两人都十分克

参考资料

 

随机推荐