星期五, 十二月 08, 2006

独自一个人旅行

今天上天涯看了一个19岁小女孩的日记,讲述她独自一个人去大城市旅行的故事。她很纯真又充满活力,很像我的妹妹。说起旅行的经历,我到是有的,去上海,去北京,去镇江......总是有人陪伴,自己一个人的经历很少很少。最近看了安藤忠雄的书,上面讲了许多他独自一个人旅行的经历。有时候突然想想,去哪里旅行不重要,最重要的是旅行当中,对自己的一种反思。

虽然我觉得我很能适应环境,但是我觉得我的适应能够不够强。每当到了新的环境的时候,都带着一种不安和惶恐。虽然每个人都有同样的不安,但是我的这种不安和惶恐可能还夹杂者些许的自卑。旅行对于我来说,我想是一种自我的历练,一种自我的思考后的萃取。我们的日常生活都是一种Routine Life,总是带着一成不变的样子,虽然总有些波澜,但小小的风波总不能让自己有一种紧迫感。

我突然一下明白安藤的话,他为何有一种紧迫感呢?因为他没有活在自己的一个小圈子里面,一副养尊处优的方式。而是选择一种从身体到心灵的历练,这种历练必须通过独自的反思,孤独地探索才能够找到。我有是虽然有目标,但是总是缺少一种紧迫感,缺少一种思维的深度,总是很难有一段时间去深刻地思考许多问题。
看来,我该计划一次独自的旅行,一次探索自己心灵的旅行。嗯,我决定了,要有一次独自的旅行。

ASP.NET 2.0 揭密

Author:Jayesh Patel, Bryan Acker, Robert McGovern
Translator:Ryan Chung

摘要:尽管ASP.NET 2.0 是100%相后兼容ASP.NET 1.1的,但是ASP.NET 2.0 引进了一些内部的改变。本篇文章将在代码模式,编译和页面生命周期等方面做一些概述。

介绍
对于专业的ASP.NET 2.0 开发人员,有关于ASP.NET 2.0的一个大问题就是ASP.NET 2.0的内部改变了什么。学习新的特性既开心又有趣,但是ASP.NET核心结构的改变对于像真正掌握技术的人来说更加重要。在本章中,我们将介绍ASP.NET 2.0 自从1.x版本开始的核心如何改变的。

本章的主题对于关心性能的开发人员和寻找优秀协调程序的构架师来说,将会非常有用。特别的,我们将研究代码模式、编译、页码的生命周期。扩展性、缓存和性能增强等方面的核心区域。

本文章的许多实例需要对于ASP.NET、Visual Basic.NET 或者C#语法的熟练掌握。对于特别的主题,我们将提供可运行的,参考性的文档做进一步的讨论。

代码模式(Code Model)
可能ASP.NET 2.0 内部工作方式的最明显的改变就是ASP.NET创建页面的方式。我们将会研究代码掩盖(code behind)的这些改变,以及这些改变如何冲击ASP.NET开发。

ASP.NET 1.x的代码模式
在ASP.NET 1.x 时代,开发人员有两种主要方法编写一个页面窗口(Web Form)。第一种方式就是使用传统的ASP模式,在ASPX页面中直接编写代码。这种方法叫做代码内联(code inline),对于简单的命令工作地很好。但是对于复杂地代码,编写内联代码将导致Web页面难以阅读,由于他们将页面的表示(HTML)同功能(code)混为一谈。

在ASP.NET中,默认的编码方法改变后有助于解决这个问题。业务逻辑和事件处理的代码写在一个单独的、只有代码的文件中,叫做code behind文件。这个code behind 模式将ASPX文件同一个只有代码的文件连接起来,这个ASPX文件包含了一些表达标签。通过将代码同表示层分离,开发团队可以让设计人员负责表示文档的设计,而开发人员负责代码文件,这样开发更快。



图1. ASP.NET 1.x 代码模式
Code behind的首要困难就是解决code behind文件同ASPX页面同步的方法。尽管从编程角度来看,ASPX页面继承于code behind文件,但是这两种文件实际通过一种更加复杂的关系连接起来。
继承的复杂度
ASP.NET的设计范例,就是开发人员使用Visual Studio.NET 往ASPX页面上拖放控件。Visual Studio将自动在code behind 文件中生成合适的支撑代码。如果ASPX页面中添加了控件,code behind 文件中也必须加入新的代码。换句话说,尽管继承关系指向其他地方,但是ASPX文件实际引导着code behind文件的设计。
编译复杂度
第二个同步问题就是编译文件的方法。所有的code behind 文件,以及他们的支持类,都在一个部件(assembly)中编译,然后在此Web程序的/bin目录下存储。一方面编译先于程序的部署,另一方面,ASPX页面在第一次被请求的时候在运行时(runtime)中编译。实际上ASP.NET运行时在他自己的临时配件中编译ASPX页面。
在这个过程中,ASPX页面可能在没有更新code behind 配件的情况下被改变。这就是,一个开发人员可能在部署之后,选择去修改一个属性或者改变一个控件的类型,但是code behind文件并不会改变,并且它的配件也不会重新编译。如果这个发生,程序将遭受不可预料的错误,因为code behind 文件和他们对应的ASP页面不匹配。
ASP.NET 2.0的代码模式
ASP.NET 2.0 继续提供代码内联(code inline)和代码掩盖(code behind)模式。对于代码内联模式,除了Visual Studio 2005 支持单文件开发的方式,只有很小的改变。特别的是ASPX页面现在更好地支持了IntelliSense。当你开始在括号内编写代码时,Visual Studio 将提供完成,帮助和插入代码的全部IntelliSense支持,
ASP.NET 2.0宣称ASP.NET 2.0的继承和编译,通过修改code behind 文件的特性,同code behind 模式发生关联。在 ASP.NET时代,code behind 不再是System.Web.UI.Page 类的实现,而是一个新的结构体叫做部分类(partial class)。部分类包括素有用户定义的代码,但是忽略掉所有通过Visual Studio.Net 在ASP.NET 1.x时代生成的测量和连接代码。当含有一个新的含有code behind 文件的ASPX页面被请求时,ASP.NET 2.0 运行时(runtime)实际上将ASPX和这个部分类连接成一个类,而不是两个独立的类。

Figure 2. ASP.NET 2.0 的模式
这个部分类使用一个新的关键字(Visual Basic 是Expands,或者在C#中是Partial),来表明在运行时此类中的代码要同另外一个类合并起来。简单说来,ASPX页面使用一个新的命令叫做compiewith,来表明它同code behind 文件的联系。最后的结果永远是一个编译的代码文件在一个配件里,而不是两个文件在不同的配件里。
比较Code Behind文件
如果你熟悉传统的ASP.NET 1.x code behind文件,你知道Visual Studio会插入自动生成的控件声明和实现代码。这个自动生成的代码是code behind文件和ASPX文件双向同步的直接结果。一个典型的ASPX页面的标签控件,将有一个对应的code behind 文件,包括许多行自动生成的代码:


namespace WebApplication1
{
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
private void Page_Load(object sender, System.EventArgs e)
{ }
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}


Listing 1. ASP.NET 1.x的一个Code Behind 文件
这个自动生成的代码不仅定义了标签控件(粗体的行),还声明了一个新的事件(Load),而且自动将这个事件添加到一个自动生成的方法包(Page_Load())。
对于每个你在ASP.NET 2.0中创建的code behind .aspx文件,ASP.NET生成一个更加干净的部分类,同你在code behind 文件中定义的部分类合并起来。这两个部分类合并成一个单独的类定义,在编译的时候作为你.aspx文件中的类提供服务的基类。


namespace ASP {
public partial class Webform1 : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e)
{
}
}
}


Listing 2. ASP.NET 2.0 的Code Behind 文件
The developer can access Label1 automatically and can add events as needed. For example, a Page_Load event can be added to initialize the label:
开发人员可以自动访问Label1,并且根据需要添加事件。例如,一个Page_Load事件可以添加来初始化此Label控件。


Namespace ASP{
public partial class Webform1 : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = "Hello ASP.NET 2.0";
}
}
}


Listing 3. 在一个新的 code behind 文件中添加事件
通过Visual Studio 2005可以生成事件的语法。最终的code behind 文件将会更加地短,并且跟任何自动生成的代码独立。ASP.NET运行时自动把ASPX中的控件同这个事件连接起来。换句话说,ASP.NET在运行时自动完成运行代码的生成,这个过去却是通过Visual Studio来完成的。
新的两步编译的好处就是这个可以让你把code-behind的类编译到一个二进制文件中,并且为了以后的修改支持像html一样部署.aspx文件,就像.aspx源文件是部分类型,跟 code-behind同时编译。
继承的复杂度
新的code behind 模式极大地减少了继承复杂度。因为ASPX页面不是直接地从code behind文件继承过来,code behind不再需要定义和支持ASPX文件中定义的控件。同样的,code behind 文件能够自动访问ASPX文件中的任何控件,而不必需要ASP.NET1.x所需的声明代码。所有这一切的实现是因为ASP.NET运行时自动添加所需的声明和事件到最终的编译文件。因为运行是负责这些任务,代码开发人员和Web开发人员不再需要担心这个问题了。
在设计事件,通过Visual Studio 2005 维护这种连接。Visual Studio环境平衡ASP.NET运行时的编译片,来保证代码开发人员和Web开发人员能够同步工作。
编译复杂度
因为新的code behind 文件同ASPX文件连接起来,并且在运行时内编译成一个单一而完整的类,编译复杂度消失了。Code behind 文件自动跟ASPX同步。甚至在新的编译模式中,仍然可以使用非同步的代码,但是这个主题能很快确定,因为最终的例外非常明显。
编译
感谢ASP.NET 1.x的页面模式,一个ASP.NET Web 页面的编译总是分成两个阶段。第一个阶段,code behind文件和其他的类编译成一个配件,然后单独的ASPX文件在运行时中编译。虽然这个模式有许多优点,但是有一些缺点。ASP.NET 2.0 对基本模式提供了许多选择,根据你特别的需要提供更广泛的编译选择。

ASP.NET 1.x的编译
ASP.NET 1.x的第一个编译模式导致了一个程序配件(包括所有编译的code behind代码和其他源文件),和在请求时对每个ASPX文件创建的一个临时的配件。在大多数情况下,编译器的优化,例如批处理,可能引起不同的临时ASPX文件在同样的配件中编译。在任何情况下,每个ASPX文件都被编译成一个临时配件,这样才能装载到ASP.NET 运行时中。



Figure 3. ASP.NET 1.x的编译
虽然这个模式有优点,但是有两个根本的缺点。第一,ASPX文件必须按照人类可读的方式部署到站点。如果你的开发人员使用代码内联模式,这就意味着一些或者所有你的业务逻辑可能同样要部署到一个最终服务器上。虽然IIS和ASPX.NET设置成禁止暴露原始的ASPX文件,但是一个聪明的黑客仍然可以通过各种方法访问Web服务器,然后访问文件。第二,任何人第一次请求一个Web页面的时候,它的相应时间比正常时间慢,因为ASP.NET运行时要编译这个ASPX文件。
一个开发人员唯一可以控制的过程就是是否批处理编译ASPX文件。在ASP.NET 1.x时代,你能在Web.config文件中修改标签配置批处理编译:
Listing 4. 配置批处理编译

在第一次Web页面请求时,批处理编译交换开始的时间来减少载入的时间。批处理编译的另外一个好处就是所有的ASPX文件都将编译成一个单独的临时配件,而不是每个页面生成一个配件。

ASP.NET 2.0的编译
对于一个Web程序,ASP.NET 2.0 提供了四种不同的编译模式:
1、一般模式(Normal)(ASP.NET 1.x)。在一个normal ASP.NET Web 程序中,code behind 文件编译成一个配件,并且存储在/bin目录中。Web 页面(ASPX)根据需要进行编译。这个模式对于大多数网站都有效。但是,这个编译过程造成任何ASP.NET页面的第一次请求度比后来的请求慢。ASP.NET 2.0 继续支持这种编译模式。
2、部署预编译模式(Deployment pre-compilation)。这是ASP.NET 2.0的一个新特性,可以让你的工程在部署之前完全编译。使用完全编译,所有的code behind 文件、ASPX文件、HTML、图像资源、以及其他后台代码都根据程序的大小和编译环境,编译成一到多个可执行配件。这些配件包括所有用于网站的编译代码、资源文件和配置文件,都不可以修改。这个编译方法提供了最高的性能和最强的安全,但是以牺牲在部署后无法修改为代价。如果你致力于打造高度视觉化和高度安全的网站,这个时最后部署的最佳选择。但是,如果你正在你本地的intranet中建造一个小的站点,并且这个站点在不断改变,部署预编译模式将时致命的。
3、ASP.NET 2.0 编译模式也允许你对你的程序预编译所有的code behind文件,仍然能可以更新你的代码。你可以把你的code behind和原始.aspx 文件(都是部分类)编译成一个单独的预编译类(页面的基本类)。如果你选择在运行的时候编辑你的.aspx文件,你必须简单地重新编译你的页面。
4、完全运行时编译(Full runtime compilation)。在另外一个部署预编译的极端情况下,ASP.NET 2.0 提供一个新的机制在运行时编译整个程序。你可以将你的不编译code behind 文件和任何其他相关的代码放到一个新的\code目录下,让ASP.NET 2.0 新建和维持一些引用,指向在运行时从这些文件生成的配件。在改变网站内容方面,这个选择提供了最好的灵活性,代价在服务器就是存储不编译的代码。
选择最好的编译方式取决于你的环境和需求。但是,编译模式仍然易用。即使你选择使用\code目录来存储你的code behind文件,你可能仍然使用全编译方式部署你的程序。
批处理编译
在ASP.NET 2.0当中,你可以用单一URL请求批处理编译任何程序。使用ASP.NET 1.x,批处理编译去掉了第一次网页请求的延迟,但是创造一个更长的开始的时间循环。另外,批处理编译仍然要求code behind 文件在部署前编译。
Web.config的批处理编译设置在ASP.NET 2.0中仍然有效。批处理编译的优点就是对于第一个用户,页面能够立即执行,并且ASP文件中的任何错误都会在批处理编译时发现。但是,批处理编译在程序开始的时候会有点延迟,并且在Web.config文件建立。我们需要注意的是,如果一个文件失败了,批处理会报错。

部署预编译
部署与编译可以让你创建一到多个配件,这些配件都是你的网站的可执行版本。最后的配件包括网站的可编译代码。HTML页面,资源,配置文件和ASPX页面都要单独拷贝。部署预编译要求使用一个叫做aspnet_compiler.exe的命令行工具。这个工具创建了一个目标部署目录,包括有配件的/bin目录,各种ASPX页面的根文件。这个工具还可以用来做原状预编译,类似于我们叫做的“魔术页面”的动作。这些根文件共享你的ASPX文件的名称,但是包含简单代码来调用编译配件。换句话说,ASPX页面都是简单的空壳,而不是全功能的页面。


星期六, 十二月 02, 2006

ASP .NET 2.0 的编译

编译是本书不着重讨论的主题之一,因为你不必了解过多的相关内容。但是,你要意识到编译的存在。当你向服务器提交你的Web窗体的时候,你的Web窗体和ASP.NET页面首先必须翻译成服务器能够理解的语言。这就叫做编译。你可以在图1看到.NET 2.0 工作的过程。

Translated by :Ryan Chung

编译器将你的代码转化成一种叫做中间代码的东西,或者可以叫做微软中间语言(Microsoft Intermediate Language)。这是一种独立于任何它所运行的PC的语言。.NET CLR (Common Language Runtime 公共运行时)能够理解这些中间代码,并且将他们改变成可以执行的代码,然后提供输出。然后输出作为一种回复被送回给用户。(实际上的过程还要繁琐一些,你将在14单元看到)在编译的过程中,你的页面将在语法上被认可,所以如果你已经下面任何的打字稿之一,他们将在编译的时候打上标记:
if (Paige.IsPostBack)
你的代码可以用两种方式编译:

Pre-Runtime Compilation(运行前编译):这是一种“正常的”方式(或者说这是一种“古老的方式”,这是在ASP .NET 1.1 使用的默认方式)。代码隐藏后的文件将被编译成一个集合器(assembly),并且存储在\bin 目录中。在需要窗体和.aspx再编译。

Full Runtime Compilation(完整运行编译):代码隐藏后的文件和任何其他有关的代码现在将放在App_Code目录中。当这些文件运行时,ASP .NET 2.0 此时将新建和维持跟从这些文件中生成的集合器的参照表。

星期三, 十一月 29, 2006

南京程序员俱乐部的聚会

11月20日参加了南京程序员俱乐部的聚会,上午在榴圆宾馆开的讲座,下午在1912吃的西餐。反正都不用出钱,所以吃的很有底气。不过会议的水平的确一般,好多人都是Newcomer,提的问题都是很Naive的。认识了林锐,挺搞笑的一个技术人员。不知道以后能否跟他合作



昨夜你又在我梦中出现

好久没有写诗了,最近难得雅兴,胡乱涂画了一首。给Nico看了一下,她说感情太强烈。我挺不满意这首的,因为没有什么感情,读起来感觉像70岁老太的脸一样干瘪。反正写诗对我来说,不过是一种自娱自乐,或者是跟好朋友交流的媒介而已。日此而已,自得其乐。



作者:木华 时间:2006-11-20

昨夜 你又在我梦中出现
还是那件银白的连衣裙
还是那头青丝拂面
端庄腼腆

为何 分别六年 两千一百多天
那梦中再现的一幕幕
仍然是昔日的瞬间

为何 梦中的那份真挚
在朦胧中
仍然带给我温暖

我早已知道
此生已无法延续那段缘
此生已无法回到那些天

昨夜 你又在我梦中出现
今夜 你是否还会与我见面

我的讲座

不知不觉当中,这学期已经做了好多场讲座,从讲技术的“ASP.NET 0 代码建网站”,到讲管理的“打造高效团队”。现在的我的演讲水平应该比以前有提高,因为以前讲的很多东西都是别人的,只有搞笑的那部分是自己的,而现在讲的很多东西,都是自己的感悟,自己的做法,搞笑的那部分还是自己的。
现在发现,办讲座可以极大地满足自己的虚荣心,同时也可以让自己的思想跟更多的人分享,何乐不为呢。现在发点照片,继续自恋一下。

















星期三, 十月 18, 2006

Nov.4th The Visit to Xixia Temple

很久都没有时间来把照片放上来,现在放上来,算是对国庆的一个总结。骑车去的栖霞山,离本部大概24公里,骑车花了一个半小时。整个来说栖霞山还是很不错的。先发点照片再说吧。
一行三个人,我,冯欣和鹿剑
还是我们卅
还是很帅的:)
长廊很长

星期四, 十月 12, 2006

Songs of my heart

When I write down this title, I recollect the title of Whitman’s poem the songs of innocent. Recently, most of my time has been spent on club’s trivial things. However, what made me sad was that the lost of many important club members. With the decrement of members, I am losing my confident to lead this club beyond the past.
I suspect whether I have the talent to lead this club to reach a higher target which I established before. Sometimes, I doubt that whether I have made the right choice for this club. It seems that I have lost the intuition to be decisive. Even many things I have done before, I find they become much harder than before. One of the most important crises is that I don’t have enough support. I think that not because the people beside me are not competent, but because they do not have enough time. So I have to take the responsibility to implement the promise I made before. Although I am an optimistic people, I am still easily affected by the settings. I don’t what is luck or what is not luck. I just think everything is not going smoothly. I have to tell lies. I have to do something that I think is no longer proper to me. But I choose to stay. I choose to stay something I am fascinated with.
Recently, I feel exhausted with sleepless. I know this is a symbol of overpressure which was familiar with. But, what’s fortunate, my heart is still beating smooth. I don’t feel it’s beating too fast.
Today I start to read a book about computer virus. PE is a kind of file format renown but strange to me. I think I can try to apply for MSRA. Just for a dream, like every people in Nanjing. I can arrange a time to Richard. I suddenly recognize. Ok, my journal is here. I should go back to read something about .NET 2.0 framework. It’s important to everyone who want to learn inside Windows.

星期三, 九月 27, 2006

A good person, am I?

这几天非常地忙,忙得没有时间看自己的书,编自己的程序,都是在帮朋友和老师的忙。是不是我总不喜欢拒绝别人,心中总有一种倾向,总希望被别人利用,总希望别人在遇到问题的时候,能够想起我,这样,显得我很有价值。所以,开学以后,每天都很忙很忙,可是自己一琢磨,好像大多数事情都不是自己的事情,都是别人的事情,当别人叫上我的时候,我总是很乐意地去帮忙,因为,那样感觉自己在被利用,可以有被利用的价值。所以自己一很忙。
不过我很乐意,当自己的价值通过帮助别人放大时,我真的很乐意。

星期三, 九月 20, 2006

CVS的使用

CVS作为一个使用方便的版本控制器,可以很好地帮助我们对软件源代码进行管理。但是,由于队员们很少或者从来没有使用过版本控制器,在使用中,出现了一下问题:
1.多人同时修改同一处代码。由于项目的分配不周全,许多人的任务不明确,我和小组的很多同学都做出同样的选择,就是在开始的时候选择简单的代码来进行编写,比如JSP语句和HTML标记,所以同样的代码可能同时被很多人修改,不停与服务器发生交互,版本升级过快,造成最后CVS的崩溃。
2.CVS提交没有对应的Comments。每次提交新代码的时候,很多人都没有同时对所提交的代码进行相应的Comments,所以不知道目前版本对一前版本有了什么样的改进,造成项目沟通不畅通。
3.CVS的管理不统一。由于许多人没有使用过CVS的经验,造成许多同学都喜欢随时更新,随时提交这样的情况,造成代码之间冲突,版本间冲突。
4.没有测试代码就提交。许多同学在没有写出详细的测试代码就将自己的东西提交,这样的后果就是将不合格的代码放入了服务器。当别人将这些不合格的代码下载运行时候,就非常容易造成出错,而且造成错误的原因不在自己而在别人,自己却不喜欢去修改。

为了正确的CVS使用的总结:
1.对于在CVSNT Control Panel的配置时,要注意:为了使相应的客户端能够比较好的连接上CVS Service,对于有关的选项就不要选。如下:
2.Lock Server Listen Local项,(不然的话,在提交/更新的时候会出问题)。
3.Use Local Users for Pserver Authentication Instead of Domain User(不然的话,不能实现小组的同)。
4.对于Local Service的端口要设成2402。否则在Eclipse中会出错的。
5.在使用CVS的时候,账户管理和控制非常重要,根据这次项目的经历,我觉得以后的项目管理

应该采用以下的一些方式:
1. 一个CVS仓库集中管理各项目。
2.CVS系统有自己的专用账户,与系统账户分开,便于管理。
3.各项目互相分离,互相不得访问。
4.在使用的时候要将代码互相的偶合度降低,所以好的设计必不可少。而且我们提交代码的时候应该每天在统一的时间提交或者完成了一个类,并且写好了相关的测试代码以后,才可以提交。

ASP.NET与Strusts JSP比较研究


构架比较
MVC非常适合于交互的分布式系统。MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。MVC(Model-View-Controller)把交互系统的组成分解成模型、视图、控制器三种部件。对于.NET和Struts 都提供了对MVC的支持,虽然殊途同归,不过他们的具体实现方法有一定区别。

ASP.NET的实现方式

图1 ASP.NET 实现MVC的流程图
首先为了将试图和控制器分离,在建立新的ASP页面的时候,可以将Page的代码同code的代码分开存放。ASP.NET通过Codebehind、用户控件(User Control)以及自定义控件Custom Control)等方法真正做到了代码的分离。页面的.aspx文件存放的仅仅是带有asp标签的html文件,而他的Controller则放在同名的.cs文件当中。在.aspx文件中通过属性标签 的CodeFile来串接。
控制器提供一个控制和处理请求的集中入口点,它负责接收、截取并处理用户请求;并将请求委托给分发者类,根据当前状态和业务操作的结果决定向客户呈现的视图。在这一部分主要定义了HttpReqDispatcher(分发者类)、HttpCapture(请求捕获者类)、Controller(控制器类)等,它们相互配合来完成控制器的功能。
新的ASP.NET提供了一些新的文件和目录提高程序的易扩展性:
Sitemap.xml 这个文件建立了系统的站点地图,可以很好的定义站点的层次结构,帮助使用面包屑(breadcrumbs)等工具。
/App_Data/ 此目录用于存放数据库的文件。这样在部署的时候,可以自动地将文件加入本地数据库服务器,特别对于新的SQL Server 2005, 可以在不做任何配制的情况下,完全自动地进行数据库添加。

Struts 实现方式

图2Struts的MVC模型
在Struts框架中Controller功能由ActionServlet和ActionMapping对象构成,核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。
Model部分由Action和ActionForm对象构成。所有的Action处理器对象都是开发者从Struts的Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。
View部分是通过JSP技术实现的。Struts提供了自定义的标记库,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装。

比较结果

表示层的开发
对于表示层的开发,ASP.NET有很大的优势,原因:1、ASP提供了强大且多样的ASP控件标签,而且标签格式统一,易学。比如对于登陆,ASP.NET 2.0 提供了独立的Login控件,可以完全实现验证,跟数据库比较,增加新的用户,管理角色等等一些列活动,并且不需要开发人员写出任何代码。

开发环境
对于开发环境的配置,JSP由于有太多平台,规则不统一,所以学习成本庞大,并且不提供相关的帮助文件,很难查找资料。

对于设计模式的应用
由于J2EE大量的使用设计模式,并且Struts本身就使用了许多设计模式,比如分发者模式。但是ASP.NET并没有提出设计模式等实现方式,MVC这个框架也是没有完全实现,而Struts却完整地提供了完整的解决方案。

配置管理
由于Struts频繁地使用配置文件struts-config.xml来管理,这种集中的管理,造成一种耦合,这样开发人员如果进行修改的时候,必须对应修改struts-config.xml文件,这个非常麻烦,并且不利于项目的分配。所以,struts团队开发不容易。

部署和调试
由于ASP.NET在Visual Studio 2005 中集成了一个WEB服务器Casi,可以直接将代码自动部署到里面,不需要用户的操作。在实际部署的时候,也只需要将程序部署到IIS就可以了。所以微软的整个调试是非常方便的。

总结
综上所述,如果要快速开发界面美观的程序,使用ASP.NET无疑非常的方便的。但是隐藏了许多开发的细节和实现过程,对于要提高编程能力的人来说,这个显而易见的不是个好的结果。并且微软很少使用和提到设计模式,在对实践MVC等设计模式的时候,并没有给出很好的意见。

星期三, 八月 16, 2006

不能忘记公平和正义

太多的事情,毒奶粉,毒大米,现在终于到了有毒的药了。每当我悲愤地抱怨这个社会的时候,都有许多专家,许多朋友,许多"学者",都会拍拍我的肩膀,淡淡地说:这个就是现实,这个就是社会,不必愤世嫉俗,不必斤斤计较,你不能改变什么,好好读你的书吧。当很多次面对这样的问题以后,我开始乖了,我也开始对别人说:不要抱怨社会,不要怪罪政府,这些都是改革,都是发展带来的阵痛,未来是光明的,中国是伟大的,生活是美好的。


但是,就是这些看起来"正常"的话,正在泯灭我们的良知,正在扼杀我们的"正义感"。我们把本来不合理的各种现象,都归咎于改革中的副产品,是不可抗拒的因素。我承认事物的矛盾,虽然我不是一个马克思主义者。但是,我们不能泯灭我心中的良知,在我慢慢在麻木的时候,我被朗咸平教授的话惊醒,让我知道,这个世界上,仍然有一个肩负着强大社会责任感的人存在,仍然有一个有着非凡勇气的人的存在,仍然有一个有着愿意冒着风险和压力,与各种恶势力斗争的人存在。我想,这定是因为有一股天地间长存的那股浩然正气,就是对于正义和公平的追求。


记得大二的时候,我主动辞退班长一职,就是不愿看见某些人利用权力,践踏公平和良知,看见贪婪和专制横行。所以,我选择辞职,表示一种抗议。因为,我不愿意跟这种人合作,更厌恶跟这种人一起,玩弄权术。因为,我还有良知,我还有正义感。


现在,我仍然有正义感,可能没有以前那么强烈。我的力量的确渺小,我的声音的确微弱。我仍然能够做到一些东西,比如对于社会的黑暗,不在胡乱承认他的必然性。我会去思考,思考如何改变,可能我现在没有力量去改变,但是,等到我可以说出自己声音的时候,我会尽自己的力量,维护公平和正义。


Powered by Zoundry

星期日, 八月 13, 2006

决定放弃统一中国的梦想

喜欢玩《三国志》,因为可以实现自己统一中国的豪迈之情。


开始不怎么知道三国的历史,本人从来没有读过《三国演义》,四大名著也一本都没有看过。唯一记得的几个三国人物,要不就是电子游戏里面出现的人物,要不就是初中课文《赤壁之战》里面的,现在还记得一个词语"鸡肋",送给的是杨修。


后来开始喜欢三国是因为收看了易中天的《品三国》。三国的历史就在他的品读中,变得十分有趣。易先生喜欢用看似非常八卦和娱乐的词语来描述三国历史,这本身就非常有趣。再加上易先生饱尝诗书,这档节目变得有趣又耐看。


这次出了《三国志11》,赶紧买了,结果是日文版,所以放弃。终于等到出中文版了,台湾人汉化的,可能是台湾文化跟中原文化实在相差太远,他们受日本文化影响又特别深,翻译出来的真是不敢恭维,出来了一些日语单词,比如"达人"啊,汗一个。



选的刘备,玩了一天,招募了许多高手,荀彧,陈琳,田丰,还有赵子龙,文猷,连曹操都在我手下。不过游戏太过缓慢,玩了一天,才攻下4座城,还有20多个城市,不知道还要打多久。我攻下了董卓的陈留后,吕布天天带着军队骚扰我,我根本没有喘息的机会,感觉变成了消耗战和持久战,实在受不了,我的城邦太少,禁不起这个消耗。


所以,还是决定放弃,统一中国的梦想,不是那么容易实现的。




Technorati :

Powered by Zoundry

星期一, 八月 07, 2006

[翻译]配置ASP .NET 2.0 应用服务来使用SQL Server 2000 or SQL Server 2005

原作:Scott Guthrie 翻译:Ryan Chung
原文地址:http://weblogs.asp.net/scottgu/archive/2005/08/25/423703.aspx

过去几周以来,有个问题我被大家问过了许多次:“我怎么设置新的ASP.NET Membership,角色管理(Role Management)以及个性服务(Personalization Service)来使用一般的SQL Server,而不是SQL Express?” 这篇Blog将带你通过一些简单的步骤了解如何完成这个设置。

快速浏览:什么是新的ASP .NET 2.0 应用服务

ASP .NET 2.0 包括一些内建的“生成区”(Building Block)应用服务。我们叫做他们“生成区”是因为他们都是有用的核心框架,用来形成当今Web应用的超级大众的解决方案。并且,最终能够为开发人员提供非常高的生产效率和节省时间的方法。


他们包括:一个Membership API 来管理用户名/密码,管理安全证书;一个 Roles API 可以支持将用户映射到逻辑组;一个profile API 用来储存浏览网站的授权和匿名用户的任意属性(例如:他们的邮编,性别,主题参数等等);一个Personalization API 用来储存控制用户参数(这个是最常被用于WebPart的特性);一个Health Monitoring API 用来追踪和收集运行状态和Web程序产生的任何错误信息;一个Site Navigation API 用来定义一个用于程序的层次并且构建浏览UI(菜单,树状图,以及其他的一些小东西),这样可以将上下文的细节基于用户在站点中目前所处的位置。

ASP .NET 应用服务API 被设计成可插入式的,并且不可以被实现,意思就是API不能看见储存他们的实现细节。相反,API通过调用“providers”——这是一些类来实现特殊的“提供合同(provider contract)”,并且被定义为一个抽象类,其中包括一个方法/属性集,这样API才能够实现。

ASP .NET 2.0 发行了一些内建的提供者,包括:对应本地SQL Express 数据库的SQL Express 提供者,对应完整的SQL Servers的 SQL 2000/2005提供者,对实现应活动目录(Active Directory)或者活动目录应用模式(Active Directory Application Mode)的活动目录提供者,对于在文件系统中建立XML文件来浏览网站的XML提供者。

这个模式的优美体现在,如果你不喜欢目前的提供者,或者你想要在正使用的数据存储文件中集成这些API,那么你可以启用一个提供者并且把它插入到系统中。例如:你可能已经有了一个数据库,存有用户名/密码,或者你有的是一个LDAP(Lightweight Directory Access Protocol
)系统,你想将他们整合到一起。那么你只需要实现MembershipProvider 合同(contract)作为一个类,并且注册到你程序的web.config文件(下面会详细介绍)中,并且在ASP.NET中都调用Membership API,这样就可以委派到你的代码中了。

默认的SQL Express 提供者

大多数ASP.NET 2.0的应用服务程序都使用内建的SQL Express 提供源者来配置。这个提供者将在你第一次使用其中的应用服务时,自动为你创建一个新的数据库,并且提供一个非常方便的开始方法,避免了许多设置麻烦(就只是在窗口中的SQL Express,你会很好的使用它)。注意SQL Express数据库也可以进行升级,来运行于完整的SQL Server 实例中,所以使用SQL Express 来建立程序可以在你的系统得到广泛成功之后,方便地升级到一个高容量,集成的,很少安全错误的8 处理器SQL系统中。

我如何将SQL Express提供源改变成为SQL Server提供源呢?

如果你想要使用完整地SQL Sever 2000或者 SQL Server 2005 数据库实例,而不是SQL Express, 你可以跟随一下步骤:

Step 1:新建或者得到一个空白地SQL 数据库实例
在这步中,你将创建或者得到一个到空白标准SQL数据库实例的连接字符串。

Step 2:给你的SQL数据库提供ASP.NET模式

在你的Winodws中打开命令行窗口,运行aspnet_regsql.exe程序,它同ASP.NET 2.0一起安装在你的目录C:\WINDOWS\Microsoft.NET\Framework\v2.0.xyz下。

注意这个程序可以在基于模式窗口或者使用命令行的界面间切换(可以添加一个-? 符号查看切换选项)。

使用向导你一个创建一个模式,表格和sprocs来内建SQL提供者来同ASP.NET 2.0一起工作。下面的画面将一步步地教你怎么做。


图1 向导开始


图2 选择第一个


图3 记得填写你的服务器和你要选择的数据库


图4 确认创建,执行一堆sql代码



图5 创建成功

一旦你按照向导完成了设置,所有的数据库模式和支持应用服务的sprocs都已经安装和调试完毕(注意:如果你的数据库管理人员希望清楚地知道到底发生了什么,我们同样可以提供先前framework目录下原始的.sql文件,你的数据库管理人员可以浏览这些文件,或者手动地运行他们来安装数据库)。

Step 3: 将你地web.config文件指向这个新的SQL 数据库

ASP.NET 2.0 现在你的web.config中支持一个新的字段叫做””,他被用来存储连接字符。这是一个非常好的东西,从数据库管理员的观点来看,新的ASP.NET Admin 和MMC嵌入现在都提供一个基于GUI的界面来控制和管理一下东西:


图6 IIS中的ASP.NET设置

ASP.NET 2.0 现在同样支持任何储存在web.config文件中字段的加密,所以现在同样可以安全地存储私人数据例如conectstrings,而不必自立编写任何加密代码。

ASP.NET 2.0 推出了一个内建地字符串叫做“LocalSqlServer”,它默认设置为使用SQL Express数据库,并且默认开启了使用Membership, Roles, Personaliztion, Profile 和 Health Monitoring。

最简单让你的程序自动利用你新创建SQL 数据库的方法,就是在你的本地 web.config 中代替这个“LocalSqlServer”设置的connectstring值。

例如,如果我在本地机器中创造我的数据库,实例名为“appservicedb”,并且使用Windows集成安全模式连接,我可以将我的本地web.config修改为:









点击保存后,所有内建的应用程序都将使用你新创建和定义的SQL Server 数据库。

注意:上面方法的弊端就是,我重新使用了“LocalSqlServer”连接字符串名称,如果或者当我在另外一台机器上部署我的数据库的时候,这个字符串让人感到有点怪异。如果我想要用我自己的连接字符串来命名“LocalSqlServer”,我可以通过添加一个完全新的连接字符串名称来实现,然后将现在的提供源指向这个新的连接字符串名称,进而代替默认的LocalSqlServer连接字符串。

我希望我说的这些有用。

Scott

P.S.在以后的Blog中,我将实际地使用前面提到的新API来实践


翻译后记:这篇文章,作者的英文水平垃圾的可以,虽然他是计算机高手,不过写作起来从句滥用,分词滥用,很难读懂,有使用了一些idioms,搞得我头大了。不过总算翻译完了。我选择这篇文章,主要是因为我遇到同样的问题。此人的博客不过,喜欢ASP.NET的朋友不妨经常去坐坐。

星期六, 八月 05, 2006

Searching for good books

I 've noticed that my blog may be seen by my foreign friends. Therefore, writing in English is a good method to implement my thought of international.


I love books when I was young. Maybe that's because I am a quiet boy and I like to sit without shouting and noise. Although my parents sometimes bought some toys which were seems luxurious during my young age, books were always the best toy for me. My mother is a big bookworm and she bought a lot of books of novels and travel stories. She loves read the stories and used to worry about the fate of the roles. Although she seldom read books of other fields, she has her own attitude towards books. My home was full of newspaers and magzines. Eventually, selling old newspapers and old magzines were pleased for a boy to make his money. The price usually is not very high ranging from 30 cents to 50 cents according to the quality. Because our family people love the books, the quality were often high.



Powered by Zoundry

星期四, 八月 03, 2006

国际化

虽然说了断网,没有去论坛,没有下无聊的东西,不过呢,邮件还是要收,正事还是要干。最近开始用ICQ同老外聊天,其实第一次用ICQ是6年多前,那个时候还是高二,报着一颗学习先进知识,学习先进文化,发展外语能力的心态,投入了ICQ的怀抱。那个时候就在ICQ里认识了一些朋友。


一个是瑞士的,告诉我她的爱好是骑马,感觉自己的爱好打电子游戏,在骑马面前似乎显得相形见拙,所以改称自己的爱好是作诗。虽然我也真的写写诗,那都是在语文晚自习打发无聊时光的玩意,难以见人。扔给她几句后,无奈中西方文化差异太大,她的文学造诣也是在太低,还是不懂我的诗,唉~ ~


还有一个是墨西哥的。我用蹩脚的英语和她带着西班牙风味的英语热烈的交流着,后来还鬼使神差地给她写了一封信。我现在可以想象当时的英语估计连自己都没怎么读懂,还是寄给她了,花了我6块多的邮资(心有戚戚焉)。某天她发来邮件,大概是几个月后,我都几乎忘记了这件事情,她说她收到了,表示感谢。Oh my god! 这就是我的第一封跨国邮件。


后来高考喽,没时间上网了,也不怎么喜欢用ICQ了,老是遇到一些变态的人,让我第一次学会了一个单词,cybersex,就是一个网上的老外的第一句话里面的单词。ICQ也渐渐没落,没有多少人再用了。


六年后的今天,再次拿起ICQ的武器,继续抱着了解世界,学习英语的心态。三十年河东,三十年河西。如今的ICQ,早已今非昔比,跟几百个陌生人发了句Hello,只换来几个人的回复。真正能聊的,也就2个人,都是韩国人。看来,Korean people are really friendly to Chinese people。 一看其他人的资料,似乎都出自某几个国际卖淫集团的控制,发展网络Sex的,当时我的那个失望啊~~ 不知道哪里再能找到像ICQ这么好的English Corner了。


说了这么半天的废话,还是要说说国际化的问题。国际化首先要解决的是语言的问题。我遇到的那两位韩国朋友,都会一点点中文,有的还认识几个汉字。这让我非常意外,试问有几个人会去学韩语,至少我身边的没有。那天遇到家教的小孩,说他们学校专门有个韩国人班,都是跟他们一样的高中生,大概30多个人,全部来中国学汉语的,平时跟他们在一起学习生活,以后就进中国的大学。我们都把孩子送到国外去,去Australia,去New Zealand,去England,去US但是他们真正后来帮助中国进行国际化的有几个。每年送出去的几十万人,回来的又有几个。国际化,不是一个口号,是真正的一种学习的态度,去参与这个世界的活动。


最后,说点对教育的见闻。都说中国的应试教育,抹杀创造力,说中国大陆学生压力大。在ICQ上面打听一下后,似乎不全是。在中国香港,能够高中毕业升入大学的只占高中总人数的九分之一,在日本,高中学生每天睡觉时间不足5个小时,在韩国,初中生的暑假只有一周。所以,整个亚洲地区,都是应试教育,都压力大。后来看报道,美国也好不到哪里去。MIT,这个著名学府,每年考试期间都有人自杀,学生为了缓解压力,组织全校性的裸奔活动。那可是真的裸奔,几百个人,光条条地在学校里狂奔,估计也跟西班牙的奔牛节一样,是道吸引眼球的风景。所以,自杀,虽然真的很可惜,可是对那些没有选择死亡的人,那些可能在心里跟他们一样,在不停裸奔的人,无疑是个欣慰。


Powered by Zoundry

星期日, 七月 30, 2006

决定断网一段时间

每天上网,每天QQ,每天Email,我累了,需要告别网络一段时间了

断网,因为无聊。起初跟互联网的新婚生活是甜蜜的,去MIT的Open Course,看各大论坛一个个振奋人心的消息,上MSDN下载课程视频,关注社会和人生。但是,渐渐的,懒惰,这个七宗罪之一的作怪,我开始留恋于天涯的八卦帖,猫扑的找抽帖,东传的是非帖。如果这是我的生活的话,我选择拒绝,拒绝平庸的生活,无聊的生活,八卦的生活。从来都认为生活是丰富多采的,拒绝被平庸和无聊包围,当发现自己被平庸和无聊包围的时候,那就选择改变。


断网,因为遇见。当遇见一个曾经让你海枯石烂的人再次遇见,当曾经的一幕幕又再次浮现时,还是引证了那句话,“总有一些人会让你挥之不去,总有一些事会让人刻骨铭心”。那份情怀,可能依旧,那段身影,可能依旧,但那天边的云彩,早已经变换颜色..... 有时候,那频频回眸的双眼,早已注定有个人会遮住你的视线。断了,就断了,既然选择断了,那际遇的欣喜,只会带来流年的悲哀。断了,就断了,不是想断了那份牵挂,只是想断了那份依恋。断了,就断了,不是想从此不在相见,只是想给自己空间......

断网,因为太多是是非非,太多岁月蹉跎。开了QQ,少不了好友的絮絮叨叨,少不了同学的废话连篇,更少不了垃圾邮件。我很珍惜友情,我很爱我的朋友,这是真挚的爱,不带任何利益的取舍,不带任何附加条件。不过,人都有超越平庸的想法,都有超越琐碎的观念。不喜欢再跟无聊的女生唠叨,不喜欢再跟答非所问的女生缠绵,不喜欢口是心非的赞美,不喜欢漫无目的的海侃。所以,还是断了吧。断了,只是默默地离开一段时光,选择一种自我、真我的生活,选择一种远离喧嚣和是非的生活。在离开的时光里,少不了我的祈祷,少不了我的关心,少不了我的祝福......

断网,因为试着学会改变。不能改变环境,不能改变朋友的性格,不能改变时钟一分一秒地向前滴答滴答,能改变的,就只有自己,自己思考的方式,自己学学的方式,自己的生活态度。断网,是选择告别平庸的开始,是让生活变得丰富的开始,是面对新的挑战的开始。

断了,就断了,带着憧憬和希望

断了,就断了,带着遗憾和留恋

断了,真的,就断了

星期三, 七月 26, 2006

[翻译]介绍Data Source 控件

原作:David Sussman 翻译:Ryan Chung



ASP.NET 2.0 带有许多类型的Data Source 控件,他们分别适合于同各种的数据类型相匹配工作。这些控件如下:



1、 SqlDataSource控件可以连接大多数关系数据库。这个名字中的Sql表示可以理解SQL语言的数据库。这包括大多数使用关系格式的数据库。注意Sql不只是表示Microsoft SQL Server数据库管理系统,SqlDataSource控件对于特定的数据库,在许多的提供源(provider)使用特定的提供源。默认的提供源是对应Microsoft SQL Server的。另外的提供源对应Oracle。两者都用托管代码实现,托管代码是最坚固的选择,.NET Framework ASP.NET 2.0 提供了其他的提供源同任何可以使用OLEDB的数据库交流(OLEDB表示Object Linking and Embedding for Database的大写字母缩写)。因为OLEDB是一个古老的标准,它几乎包括所有其他的数据库管理系统,包括IBM DB2 MySQL,和SAP 然而,OLEDB连接的提供源不是用托管代码编写的。这就意味着它无法满足所有.NET 技术的要求,但是它仍然可以同.Net 配合工作。我们可以盼望第三方开发商发布更多的Data Source 控件和提供源,并且希望他们是使用合适的托管代码。


2、 AccessDataSource控件是SqlDataSource控件的特例,包括一个对Microsoft Access优化后的提供源。


3、 XMLDataSource控件可以连接XML数据源。


4、 SiteMapDataSource控件,作为XMLDataSource控件的一个特殊形式,是ASP.NET 2.0 Web应用程序站点地图的特殊优化结构。


5、 ObjectDataSource控件连接你自己创建的商业对象。


无论你使用的是什么Data Source控件,数据源控件将在可以在你的ASP .NET 2.0 页面使用一系列行为。包括连接到数据库和其他的授权行为,例如读取和写入数据,这个需要数据绑定控件来显示数据,并且接受用户的输入。




翻译后记


整篇翻译比较简单,就是一个词不知道怎么翻译,provider,最后向来想去,翻译成"提供源",也不知道对不对,如果误导了大家,还请海涵,罪过罪过……





Technorati :
Del.icio.us :
Ice Rocket :
Flickr :
Buzznet :
43 Things :

Powered by Zoundry

星期二, 七月 25, 2006

前有馒头,后有石头

其实《一个馒头引发的血案》跟《疯狂的石头》,并没有什么可比较的地方。一个是纯粹的自娱自乐,一个是基本有血有肉的故事。但他们首先的功能都差不多,就是没有煽情,没有板起面孔的说说教,都回归了基本的功能--娱乐。


但是人们都喜欢搬一些理论出来,不停地对作品解构,对作品分析,以致于对导演的创作灵感,投资方,以致于对整个电影产业的影响来个解剖。这让我想起,每次高考的阅读题,都会莫明其妙地让我们分析可能关作者屁事的中心思想。


但我想谈的是,电影的功能到底是什么,我们需要什么样的电影。


这个时代,是一个缺少阅读时代,是一个多媒体的时代,是一个眼球不断被强迫的时代。电影,电视这些媒体正在让我们年青人不断汲取种种信息,我们习惯于慵懒地躺在沙发上,傻傻地摁着遥控器。我们也习惯于放弃思考,所有的活动都变成了显示屏幕前的鼠标点点。所以,我们不能忽略电影在这个时代,扮演起了传播文化,传播社会的良知,传播我们生活的传统的角色。


一个小小的保安科长,身体不好,社会地位不高,样子不帅,家境不佳,最要命的是,运气也不怎么好。但就这样的一个小人物,其实不断地传达着我们数千年来,一直坚持的道德底线,就是责任感和力所能及的对义的维护。虽然这个男主角,有那么多的江湖气息,和市井味道,但是我们不会忘掉他的责任感和正义感。这种正义感所引起的我们的同情,是我们看见他把所谓的假石头作为生日礼物挂在女朋友的脖子上的时候,大家会心的一笑。


这个就是电影所传达的思想,就在这种会心一笑中体现了出来。笑,表示我们接受,表示我们赞同,表示我们对于导演这种安排的支持。一种传统的,对于正义和责任感的传达,不在需要投资个数千万,搭一个宏大的布景,搞几个飞天走地的杀手,调数千个群众演员,需要的是,我们对于正义和良知的认可。而且这种正义是在我们身边就存在的,可以亲眼见到,亲身感受的。


让我又想起了另外一步电影《天狗》。这不电影太过于震撼,太让愿意思考的人感慨良多。但那些不愿意思考的人呢,他们怎么去感受社会的良知,怎么去感受我们应当担负的责任?那么,可能就像那个小科长一样,当我们认可他的坚守的时候,我们切实地感到了这种坚守和渴望。


最后,在绕回来说说馒头吧。其实我们不需要馒头,只是需要馒头出来后那么多的是是非非,需要的是看完馒头后,大家都会意味深长的一句:"哇靠,这个我才看懂了!"


作者:木华



欢迎光临我的Blog:ryanzhang.blogspot.com(需要代理)





Technorati :
Del.icio.us :
43 Things :

Powered by Zoundry

星期三, 七月 19, 2006

ING

看了部韩国电影,《恋爱进行时》,它有个英文名ing,很好的名字。虽然电影的故事不怎么样,还是老掉牙的一个故事,一个敏感的,得了不治之症的,漂亮的女主角和一个看起来玩世不恭的,帅气的男主角的故事。连任务的开场都那么老套,一个内向的,甚至说有点自闭的女孩,对爱情抱有完美的向往和憧憬,慢慢爱上一个爱讨女孩子欢心的帅哥。

情节的老套,就不用我再一一赘述。但明显感觉到,导演似乎是学摄影出生的,整部片子的用光,配色和机位的选择,都十分耐看。那个看起来就让我想起小S的厚嘴唇女孩,在导演和摄影的装扮下,变得异常美丽。特别是摄影对光的选择,真是恰到好处,那夕阳的余晖泛照在乌黑的头发上的金色,那暴雨下花花绿绿的伞同黄色的交通指挥员的对比,都让不怎么出彩的电影变得十分耐看。

导演也很小心地选择了许多让人想起自己初恋的场景。初恋=单车+牵手+雨伞... 每个人都有不同的初恋,相同的都是,女孩子遇见自己喜欢的人的那种不安,男孩子的愣头愣脑,还有第一次牵着手的那份甜蜜。

下面是从电影中截取的几个画面,觉得摄影把女主角拍的十分好看,又让我学到了不少摄影的创作技巧。







How cool a nice girl with smoking and listening with earphone
The sweet view of back
Unbrellas in the rain

The tears with reminiscence




I like the side light which makes people more illusional


The first time when you hold my hand, the world seems freeze

青春

青春不是年华,而是心境;青春不是桃面、丹唇、柔膝,而是深沉的意志,恢宏的想象,炙热的恋情;青春是生命的深泉在涌流。青春气贯长虹,勇锐盖过怯弱,进取压倒苟安。如此锐气,二十后生而有之,六旬男子则更多见。年岁有加,并非垂老,理想丢弃,方堕暮年。

岁月悠悠,衰微只及肌肤;热忱抛却,颓废必致灵魂。忧烦,惶恐,丧失自信,定使心灵扭曲,意气如灰。

无论年届花甲,拟或二八芳龄,心中皆有生命之欢乐,奇迹之诱惑,孩童般天真久盛不衰。人人心中皆有一个无线电台,只要你从天上人间接收美好、希望、欢乐、勇气和力量的信号,你就青春永驻,风华常存。

一旦天线下降,锐气便被冰雪覆盖,玩世不恭、自暴自弃油然而生,即使年方二十,实已垂垂老矣;然则只要竖起天线,捕捉乐观信号,你就有望在八十高龄告别尘寰时仍觉年轻。

On Youth- Samuel Ullman

Youth is not a time of life; it is a state of mind; it is not a matter of rosy cheeks, red lips and supple knees; it is a matter of the will, a quality of the imagination, a vigor of the emotions; it is the freshness of the deep springs of life. Youth means a tempera-mental predominance of courage over timidity, of the appetite for adventure over the love of ease. This often exists in a man of 60 more than a boy of 20. Nobody grows old merely by a number of years. We grow old by deserting our ideals.

Years may wrinkle the skin, but to give up enthusiasm wrinkles the soul. Worry, fear, self-distrust bows the heart and turns the spring back to dust.

Whether 60 or 16, there is in every human being’s heart the lure of wonder, the unfailing childlike appetite of what’s next and the joy of the game of living. In the center of your heart and my heart there is a wireless station: so long as it receives messages of beauty, hope, cheer, courage and power from men and from the Infinite, so long are you young.

When the aerials are down, and your spirit is covered with snows of cynicism and the ice of pessimism, then you are grown old, even at 20, but as long as your aerials are up, to catch waves of optimism, there is hope you may die young at 80.

星期日, 七月 16, 2006

[翻译]SQL中的连接

第四章 连接

感觉像个老手了?让我马上把你这种感觉击碎吧(开个玩笑)!尽管我们已经学习了基本的语句,但是他们只是我们将要学习的语句的一小部分。简单说来,你只使用一张表是干不了什么事情的,特别是在一个高度规格化的数据库中。

一个规格化的数据库就是为了防止数据重复,节省存储空间,提高运算性能和提高数据的完整性,而讲大一点的表格划分成许多小一点的表格的数据库。它对于关系数据库是重要且必不可少的,但这同样以为着你将对付这里,那里的各种数据。

我们将在第八章扩展了解规格化的概念。现在,我们只是记住数据库越规整,你将越有可能不得不将许多表格连接起来,以得到你想要的数据。

在本单元,我们将给你介绍通过使用各种JOIN语句,把许多表格结合成一个结果集(Result Set)的过程。他们包括
❑ INNER JOIN
❑ OUTER JOIN (both LEFT and RIGHT)
❑ FULL JOIN
❑ CROSS JOIN

我们同样将学习不止一种语句结构来实现连接,只有一种特别的语句结构才是正确的选择。此外,我们将学习UNION操作符,它可以用来将两个搜索的结果结合成一个。

连接
当我们在一个规格化的环境里进行操作时,我们经常遇到这样的情况,就是我们需要的信息不是只来源于同一个表格。在其他的情况下,我们需要的所有信息是来源于一个表格,但我们需要设置的一些条件则来源于另外一个表格。在这种情况下,正是JOIN语句大显身手的地方。

一个JOIN并不是看起来那么简单——把两个表格的各种信息放到一个结果集里。我们可以把结果集看成是一个“虚拟”表格。它也有排和列,列有数据类型。实际上,在第七章,大家将看到如何象一个表格一样对待结果集,并且用它来进行其他查询。

究竟一个JOIN 操作是如何将两个表里面的信息放到一个结果集的?噢,这个取决于你是如何描述把这些数据放在一起的方式的——这就是为何这里有四种JOIN的原因。所有JOIN操作的共同点就是将一个同另外一个或一个以上的记录相配,然后形成两个记录相结合的超集。

例如,我们以一个叫做表格Film的记录为例

FilmID
FilmName
YearMade
1
My Fair Lady
1964


接着是叫做表格Actor的记录:

FilmID
FirstName
LastName
1
Rex
Harrison

使用JOIN操作,我们可以将两个完全分开的表格的记录创建到一个记录中。
FilmID
FilmName
YearMade
FirstName
LastName
1
My Fair Lady
1964
Rex
Harrison

这个JOIN操作(至少在表面上)用一对一的关系将记录连接起来。我们用一个Film记录连接了一个Actors记录。

让我们把问题拓展一点,来看看你是否能够理解现在发生的一切。我已在Actor表格中加入了另外一条记录:

FilmID
FirstName
LastName
1
Rex
Harrison
1
Audrey
Hepburn

让我们来看看我们连接这个非常相似的Film表格后的结果:
FilmID
FilmName
YearMade
FirstName
LastName
1
My Fair Lady
1964
Rex
Harrison
1
My Fair Lady
1964
Audrey
Hepburn

正如你可以看见的,结果改变了一点-我们不再把事情看作是一对一的,而是一对二,或者更确切的说是一对多关系。我们可以使用在Film表格中无限多次使用单独一条记录来完成关于匹配的Actor表格中信息。你主要到他们怎么匹配的吗?当然,他们通过匹配两个表格的FilmID来形成共同的记录。我们使用的例子,它只有很有限的记录,但可以真实地形成同样地结果,无论我们使用的是什么JOIN类型。现在就让哦我们来看看不同JOIN了行的特点吧。

内联(INNER JOINs)

内联(INNER JOINs)与一般的连接很不一样。很多连接都是基于一个或多个基本区域来匹配记录,但是内联只返回你将用来连接的任何列的记录。在我们先前的例子中,每个记录至少会在结果集中出现一次,但是这样的情况在现实生活中非常稀少。让我们修改一下我们的表格,来看看我们将从内联中得到什么。这是我们的Film表格:

FilmID
FilmName
YearMade
1
My Fair Lady
1964
2
Unforgiven
1992


还有Actor表格:

FilmID
FirstName
LastName
1
Rex
Harrison
1
Audrey
Hepburn
2
Clint
Eastwood
5
Humphrey
Bogart

使用内联,我们的结果集将会是:

FilmID
FirstName
LastName
1
Rex
Harrison
1
Audrey
Hepburn
2
Clint
Eastwood

请注意Bogart已经被排除在结果集之外。这是因为它在Film表格中没有匹配的记录。如果在两国表格中都没有匹配的记录,那么查询的记录也不会返回。好了,理论够多的了,让我们试试这些代码。

内联(INNER JOIN)的首选代码应该是这个样子:
SELECT

星期六, 七月 15, 2006

[Learning Diary]-Fundemental Skills of T-SQL

After a day's lerning, the foundation of T-SQL is accomplished. Although I fell exhausted and dizzy, I am felicitate that I have achieved something. Today I came across a friend in Hongkong loved Chopin as same as me. We chatted a lot about Chopin. The great blind composer Bach's story encouraged me a lot today. Thank god, today I don't waste too much time!
Tomorrow I will continue learning SQL Server 2005. I am going to fininsh the book at the end of next week!

星期四, 七月 13, 2006

One Mantain Can't Contain Two Tigers

一山不容二虎!搞了几天的SQL Server 不能安装的问题,今天终于搞定了。傻乎乎地重装了系统,还改了注册表,动用了一切可以想到的牛B方法。最后终于发现,自己是在作Mission Impossible:在Windows XP 上面安装SQL Server 2005 Enterprise Edition。就是因为自己马虎,没有看清左下角的logo,是Enterprise Edition,不是Developer Edition。
一山不容二虎,说的是AntiVirus 的事情。我开始用的是Kaprspkey 5.0 personal, then I change to use another software ewido introduced by many people on internet. Then I download it and install it. But later I found that the CPU resourece keeps on 100%. After I checked all the details, I discovered that the are not cooperative. Gosh, I have to delete one, although i like both of them.

星期日, 七月 09, 2006

翻译-SQL Server中的几类数据库

原作:Robert Vieira 《Beginning SQL Server™ 2005 Programming 》
翻译:Ryan Chung 时间:2006-7-9

Master Database

无论哪个版本或者任何客户的修改,每个SQL Server都有master database。这个数据库保存了一个特别的表(系统表)集合,记录整个系统的内容。例如,当你在服务器上创建一个新的数据库的时候,将在master 数据库中的sysdatabase表中添加一个条目。所有扩展的和系统的存储过程,无论他们是用在哪个数据库的,都存储在这个数据库中。显然由于几乎所有描述你服务器的信息都存储在这个数据库中,这个数据库对于你的系统很关键,而且无法删除。在master database中的这些系统表格,当然也十分重要。他们能够决定在执行操作前额的某些对象是否存在。比如,如果你想创建一个对象,它已经存在于每个数据库中,你将得到一个错误。如果你想强制执行,有可以试试,看看是否可以登陆这个数据库中的sysobject表。如果可以,你就可以在创建之前删除这个对象。

The model Database

原型数据库(Model Database)是个合适的名字,某种意义上看来它是基于一个数据库拷贝的原型。原型数据库可以成为任何你创建的新数据库的模板。这意味着只要你愿意,如果你想要改变任何标准新建数据库的情况,你可以通过修改原型数据库实现。比如,你可以在每个你创建的数据库中添加审计表格(Audit Tables)。你也可以将系统中创建的每个新数据库放入一些用户组。注意由于这个数据库是其他数据库的模板,所以它是必不可少的,并且无法必须保存在系统内,无法删除。
当你修改原型数据库的时候,必须牢记一些事情。如果你你将原型数据库修改成100MB大小,你将无法创建小于100MB的数据库了。还有一些其他的缺陷,不便详说。对于90%的安装用户,我不推荐修改这个数据库。

msdb 数据库

msdb数据库是SQL Agent 进程存储系统任务的地方。如果你计划每夜备份一个数据库,那么在msdb中就会有条项目。计划执行一次存储的过程,就会在msdb中留下一条项目。

tempdb 数据库
tempdb是你的服务器中的关键工作区域之一。无论你执行多么复杂,多么冗长的查询,SQL Server都将建立临时表格来处理,这就是在tempdb中实现的。无论什么时候你创建一个你自己的临时表格,都会创建在tempdb中,尽管有会认为你是在当前书库苦中创建的表格。无论什么时候你需要临时存储一些数据,可能都存储在tempdb中。
tempdb 与其他数据库完全不同。不光是它的对象的临时性,还有这个数据库本身的临时性。它的一个显著特征就是,它是你系统中唯一的数据库,在你每次开始运行SQL Server的时候都会完全重建。

pubs 数据库
啊啊啊,pubs 数据库!它真就像一位老朋友。pubs现在只是一个微软网站上单独的下载例子来安装,并且首先可以用来支持培训的文章和书籍,比如本书。Pubs完全与SQL Server无关。它只是提供给你培训和试验的相容的(Consistent)场所。在本书中,你只是偶尔遇到使用pubs的时候。

Northwind 数据库
如果你以前在Access和Visual Basic上拥有变成经验,那么你大概已经熟悉Northwind数据库了。Northwind数据库从SQL Server 7.0 开始加入,但是从SQL Server 2005开始又被去处了。Northwind 很像pubs,必须同基本SQL Server 的安装独立(幸运的是,它是同样的例子的下载和安装)。Northwind是本书着重讨论的数据库之一。

翻译感想:
以前没有系统的学习过SQL Server数据库,现在好好学习一下,发现还有很多东西不知道。很多术语不知道翻译的对不对,比如“entry”我翻译成“项目,条目”,“audit”翻译成审计。希望朋友们可以来指正。

[转载]安装SQL Server 2005 性能计数器错误的解决方法--试过,挺好的

现在,微软推出了 Sql Server 2005 简体中文版,不过大家基本上都是使用的 Sql Server 2005 的 Express 版,不过这个版本的管理界面并不好,所以我删除了这个版本,开始安装 Developer Edition 版。不过,在安装开发版的时候,安装程序在检查系统需求的时候,出现了如下图的错误信息:

















查看安装帮助后,发现有这一段话:1 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击“开始”、“运行”,然后在“打开”中键入 regedit.exe,再单击“确定”。在 Windows 2000 中,使用 regedt32.exe 启动注册表编辑器。
2 定位到以下注册表项:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib]
"Last Counter"=dword:00000ed4 (5276)
"LastHelp"=dword:00000ed5 (5277)
3 上一步的“Last Counter”值 (5276) 必须与以下注册表项中“Perflib\009”的“Counter”项的最大值匹配,并且上一步的“Last Help”值 (5277) 必须与以下注册表项中“Perflib\009”的“Help”项的最大值匹配。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009]
注意 009 是英文中的一个示例。“Last Counter”和“Last Help”值是由 Windows 动态分配的;这两个值会因计算机的不同而不同。
4 如有必要,可修改“\Perflib”项中的“Last Counter”和“Last Help”值的值:在右侧窗格中,右键单击“Last Counter”或“Last Help”,单击“修改”,再单击“Base = "Decimal"”,在“值数据”中设置值,再单击“确定”。如有必要,对另一个项重复以上过程,然后关闭注册表编辑器。
5 再次运行 SQL Server 安装程序。我完全按照以上叙述的步骤修改了注册表,可是始终出现这个问题。后来经过分析,发现原因有两个,即注册表值中的数字与实际数字不符合,还有就是根本不应该修改009这个注册表项中的值。因为我们使用的大多数是简体中文系统。所以修改方式如下:首先打开 “控制面板” --> “管理工具” 后,双击 “性能”,显示出性能分析器界面,在右边的控制台节点中展开 “性能日志和警报”后,用鼠标选择 “性能计数器”。然后双击右边窗口的 “System Overview”,显示 System Overview 属性窗口。

在窗口中的 “添加对象” 和 “添加计数器” 按钮分别单击一次,但单击后显示的窗口不要去动,直接选择取消。分别单击两个按钮后,单击缺定关闭 System Overview 属性窗口,然后关闭性能窗口。然后在 “开始” --> “运行”中输入 regedit,开启注册表编辑器。定位到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib处,在右边的树形目录下可以看到Perflib目录下有004和009两个子目录。在Sql Server 2005 的安装帮助文件中说的是需要查看009目录的注册表项,而我们大部分人使用的是简体中文的操作系统,所以不能按帮助中说的,而是需要注意004目录中的内容。打开004 目录中的内容,可以看到如下图:

我们分别双击 “Counter” 项 和 “Help” 项,察看其中的最后的数字,如下图:Counter 项的内容:
Helper 项内容


这时候,我们知道,Counter 项的数字是5556,Helper项的内容是5557。然后,操作注册表编辑器的左边的目录树,定位到Perflib目录下,并注意检查右边窗口的 “Laster Counter”项和“Laster Help”项的值,并把Laster Counter的值改成刚才记录下的Counter值5556,把Laster Help 的值改成刚才记下的 Help的值5557。

要注意的是,修改数字的时候,输入的时候必须选则基数是 “十进制”,否则数字将不匹配,Sql Server 2005 检查将再次失败。然后关闭注册表编辑器,开始安装 Sql Server 2005 ,绝对可以安装成功。注意:我上面说的5556和5557的数字,每个人每台计算机的数字都是不同的,所以必须要一步步来,检查出准确的数字填入,而不是直接看到5556/5557填写,这样还不行的。

我自己把上面的值胡乱改了改,就安装成功了。莫明奇妙!

The light and shadow of my university

Real Billboard
The Great Hall

The Gym

The Gate of Southeast University


Wu Jianxiong Memorial

Photo Album

Real KTV spirit for real people




You konw you become important part of my life


My dormintory mates, how are you recently?

Smile and always smile


When we were young, we were really young

Happy tears to the future

Graduation is important to everyone