iTimothy

君看一叶舟,出没风波里


  • 首页

  • 分类

  • 归档

  • 项目

  • 关于

快速开启、屏蔽Vista下的UAC提示

发表于 2009-02-02 | 分类于 技术控 | | 阅读次数:
字数统计: 455 字 | 阅读时长 ≈ 1 分钟

User Account Control (UAC) 是在 Windows Vista 中新加入的一种安全特性。利用UAC能够为系统的安全带来保障,而且,我们在运行程序的时候,能够针对不同的用户账户区分权限。但是UAC在使用过程中,也有不少的麻烦。特别针对我们个人用户而言,其实自己就是管理员,没必要让其他的人也用我们的电脑,而UAC的提示随处可见,频繁的提示,并且每次弹出UAC提示的时候,屏幕总是会变暗,让人很是不习惯。所以通常我在使用Vista的时候,会关闭掉UAC功能。

常见的关闭UAC的功能,其实就是直接进入控制面板–>管理工具–>本地安全策略–>本地策略–>安全选项–>用户帐户控制, 以管理员批准模式运行所有管理员,这个选项在默认的情况下是“已启用”,我们要关闭它,但是关闭后Vista的安全中心会提示:操作系统的总体安全性已降低。

其实启用与屏蔽UAC功能,还有一个很便捷的方法,就是修改注册表就可以实现了,并且关闭后安全中心也不会有提示。

所需要修改的键值在注册表的位置:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]

只要将下面两段修改注册表键值的脚本,分别保存成Disable_UAC.reg和Enable_UAC.reg文件,直接双击相应的文件导入注册表即可。

屏蔽UAC提示:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
“ConsentPromptBehaviorAdmin”=dword:00000000
“ConsentPromptBehaviorUser”=dword:00000000

启用UAC提示:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
“ConsentPromptBehaviorAdmin”=dword:00000002
“ConsentPromptBehaviorUser”=dword:00000001

怎样,用起来很方便吧? :-)

云计算杂谈–Windows Azure Service Platform

发表于 2008-11-26 | 分类于 技术控 | | 阅读次数:
字数统计: 1.2k 字 | 阅读时长 ≈ 4 分钟

在LA的软件开发者会议(PDC 2008)上,微软首席软件架构师Ray Ozzie宣布了微软的云计算战略以及云计算平台——Windows Azure Service Platform。押注于云计算,出售信息存储空间和云端计算能力,为全球用户提供数据中心,由此可见微软想在互联网平台和其竞争对手一搏的决心。

基于Windows Azure Service Platform,用户可以在不必搭建自己服务器群的情况下创建基于互联网的各种应用。或许从现在开始,我们的整个软件工业,都在面临一个巨大的转折点,从某种意义上说,是一场巨大的变革,从强大的桌面运算进化到在互联网上运行各种轻量级且便宜的各种应用,而用户的体验也不再仅仅局限于桌面应用,而是不断的延伸到互联网。Windows Azure以云计算为核心,提供了软件+服务的计算方法。它也是Azure服务平台的基础。Azure由微软主导开发,用于帮助开发者开发下一代应用程序。这些应用程序将可以跨越云端和专业数据中心,在PC、Web和手机间创造完美的,无缝的用户体验。

对于开发者而言,借助于Windows Azure的灵活性,我们能建立基于云计算的新应用,或者为已有的应用增加云计算的能力。更为方便的是,开发Azure Service应用,不需要开发人员进行其他前端知识的准备,通过充分利用现有的VS开发环境和.NET Framework的技术,我们就能搭建基于云计算的应用了。基于Azure Service 开放、灵活的架构设计,在不久的将来,还将针对更多的开发环境和开发语言提供支持。而Azure Service本身所提供的开放的,基于标准的通用性环境也提供了对众多互联网标准协议的支持,包括:HTTP, REST, SOAP, 和 XML.

一、Windows Azure Service 的服务结构 新的开发模式,新的技术,总是让人为之振奋,Windows Azure Service所提供的组件包括以下几种类型:

Windows Azure Windows Azure 是一个提供云计算服务的操作系统,作为Azure Service Platform的一部分,为开发、部署云服务以及管理提供环境。

Live Services 为用户可以在PC、手机、PC应用程序和Web网站上存储、共享、同步文档、照片、文件以及任何信息提供服务。

Microsoft SQL Services Microsoft SQL Service作为Azure Service的一部分,扩展了原有Microsoft SQL Server的功能,是一种基于Web的分布式关系数据库。它提供的基于Web的服务包括查询、搜索以及同步数据到移动用户,远程办公系统以及商业合作伙伴。提供结构化、半结构化以及非结构化的数据存取服务。

Microsoft .NET Services Microsoft .NET Service 使开发松耦合结构的云端应用更为简单。所提供的功能与.NET Framework的工作流、访问控制等概念相似,但是提供了基于服务的实现。

Microsoft® SharePoint® Services & Dynamics® CRM Services 用于在云端提供针对业务内容、协作和快速开发的服务

二、Windows Azure Service开发流程

进行云端开发,首先需要下载微软所提供的相应的SDK。由于现在Azure Service还未推出正式版,所以我们能下载到的SDK是CTP版本。在Azure Services Developer Portal获取Windows Azure授权,还需要在Azure的官方站点申请邀请码并进行注册。 获取SDK和更多的信息,可以访问Azure的官方站点:http://www.azure.com/

在前面的介绍中,我们也看到,Azure 是一个灵活的平台,我们能利用它所提供的所有服务或者仅仅是某一项服务进行开发。开发人员能通过现有的Microsoft .NET Framework和Microsoft Visual Studio进行开发,编写基于web或是基于Mobile的应用,或者编写Web Service。在不久的将来,Azure会支持更多微软的或者非微软的开发语言和平台。

开发的流程也相对简单,一旦你完成编码,只需要将的应用部署到Windows Azure的云服务器,终端用户就能够通过Internet访问到你的应用了。

大致了解了Windows Azure,也让我对Azure服务平台的强大能力感到兴奋不已。或许在未来的应用中,Windows Azure能未我们带来的不仅仅是惊喜,而是一场变革。

Host WCF Service in WAS

发表于 2008-11-24 | 分类于 技术控 | | 阅读次数:
字数统计: 925 字 | 阅读时长 ≈ 3 分钟

WAS 是 Windows (Process) Activation Service 的缩写,是Windows Vista中所新增的一种进程宿主模型。WAS作为 IIS7.0 特有的新增功能,和以前IIS 6.0的功能相比更加强大,因为它提供并支持除HTTP之外的更多协议,比如TCP方式和Pipe(管道)方式。以下的文中,都把Windows (Process) Activation Service简称为WAS。利用WAS作为WCF(Windows Communication Foundation)的宿主,我们能充分利用WAS的很多优点,因为我们再也不用为非HTTP方式的WCF Service单独编写宿主程序了。而WAS本身的特点,也让我们的服务端程序能享受到只有以往的HTTP方式的WCF Service才能拥有的很多特性。本文也简单向大家分享一下怎样使用WAS来作为WCF Service的宿主。

以往的部署WCF Service的方式,大家一般会想到以下几种:

1. 使用WinForm或者控制台程序作为宿主
2. 使用Windows Service作为宿主

不管我们用怎样的方式来作为WCF Service的宿主,少不了的麻烦,都是需要单独编写Host程序,除此之外,就该轮到WAS了。WAS在Vista中,其实是由一个单独的Windows Service来实现的,如果我们仔细找找,就能找到,Windows Service的名称,就叫做”Windows Process Activation Service”。由此看来,WAS的进程和IIS进程在物理上是隔离开的,能为我们提供一个灵活、稳定的WCF Service宿主环境。WAS内部的工作机制,大致和ASMX WebService类似。

简单了解了WAS的特性,下面我们用一个netTcpBinding的WCF示例来演示怎样利用WAS来Host WCF Service:

首先,我们需要查看Vista的组件中,是否打开了WAS的功能,打开控制面板,打开“程序和功能”对话框,在”打开/关闭 Windows功能”对话框中,确保下面图中的功能项被打开:

其实在这一部操作之后,windows会自动帮我们在IIS中做好配置,不过为了放心,我们还是打开IIS确认一下设置是否正确。

首先是检查IIS站点中的绑定:

确保net.tcp方式,绑定到808端口

打开站点的高级设置,确认”已启用的协议”中,填有”net.tcp”,没有的话,可以补上。

然后是建立应用程序目录,这个目录等下会用来部署WCF的Service端程序。建立好目录后,也在”高级设置–已启用的协议”中,填上net.tcp

到这里,基本的host环境我们已经设置好了。下面来实现我们的服务端和客户端。

建立Contract [code] [ServiceContract] public interface IService1 { [OperationContract] string SayHello(string value); } [/code]

实现简单的Service类 [code] public class Service1 : IService1 { public string SayHello(string value) { return string.Format(“Hello,{0}”, value); } } [/code]

建立svc文件 [code] <%@ ServiceHost Language=”C#” Debug=”true” Service=”WCFLibrary.Service1” CodeBehind=”./App_Data/Service1.cs” %> [/code]

服务端的WCF配置 [code]

[/code]

其实endpoint只需要一个即可,为了方便通过svcutil.exe生成客户端代理,需要通过另外一个endpoint的mexTcpBinding来暴露元数据。这样当服务在发布好的时候,我们可以通过 Svcutil.exe net.tcp://Timothy-T61/WCFService/HelloService.svc/mex 来生成客户端代理了。

完成服务端的编写,直接将服务端程序,部署到刚才在IIS中添加的应用程序目录中。

客户端的wcf配置如下: [code]

[/code]

客户端拖放一个按钮,添加如下代码: [code] private void button1_Click(object sender, EventArgs e) { ClientProxy client = new ClientProxy(); MessageBox.Show(client.SayHello(“Timothy!”)); } [/code]

一切就绪,运行程序,点击按钮:

没有单独编写host程序,通过WAS,我们的服务端正常运行了。

从Windows 1.0到Vista启动画面回顾

发表于 2008-11-14 | 分类于 技术控 | | 阅读次数:
字数统计: 462 字 | 阅读时长 ≈ 2 分钟

首先声明,我不是MS的托。文中的图片和图片注释,来自cnBeta。 回顾从Windows 1.0到Windows vista的启动画面发展进程,不得不感叹图形用户界面的魅力,如果没有当年Windows迈出的这一步,或许我们今天仍然像当年的DOS那样敲着命令,又或许繁琐的操作命令,仍然让许多人对电脑操作的复杂性望而却步。但在今天,windows在桌面市场的高普及率仍然诠释着Bill的神话以及windows的魅力。在cnBeta看到“从Windows 1.0到Vista启动画面回顾”这篇新闻,很值得收藏。于是贴了过来,顺便也唠叨几句自己的想法。

以下是从Windows 1.0到Vista启动画面回顾:

1985.11.20Windows1.01 —— 最早的“蓝屏”

1987.11.1 Windows 2.03 ——微软标识成形

1990.5.22 Windows 3.0

1992.3.18 Windows 3.1 —— 首次出现窗口旗帜

1993.11.1 Windows for Workgroups 3.11

1993.7.27 Windows NT 3.1

1993.7.27 Windows NT 3.1 AdvancedServer

1994.9.21 Windows NT Workstation 3.5

1995.5.30 Windows NT Workstation 3.51

1995.5.30 Windows NT Server 3.51

1995.8.24 Windows 95 ——“蓝天白云”并突出显示了集成的IE浏览器

1996.8.24 Windows NT Workstation 4.0

1996.8.24 Windows NT Server 4.0

1998.6.25 Windows 98

2000.2.17 Windows 2000 Professional —— 第一次使用进度条

2000.9.14 Windows Millennium Edition

2001.10.25 Windows XP Home Edition —— 进度条改成了循环滚动样式

2001.10.25 Windows XP Professional Edition

2003.3.28 Windows XP 64-Bit Edition

2003.4.24 Windows Server 2003

2004.8.6 Windows XP SP2 —— Professional字样被去掉

2007.1.30Windows Vista—— 改用黑屏

2007.1.30 Windows Vista —— 第二部分,看来微软不过瘾,非要在Vista里加上两个启动画面。

还有现在的Windows Server2008 和即将发布的Windows 7,让我们拭目以待吧……

VS2008快捷键大全

发表于 2008-10-23 | 分类于 技术控 | | 阅读次数:
字数统计: 819 字 | 阅读时长 ≈ 3 分钟

Ctrl+m+Crtr+o折叠所有大纲 Ctrl+M+Crtr+P: 停止大纲显示 Ctrl+K+Crtr+C: 注释选定内容 Ctrl+K+Crtr+U: 取消选定注释内容 Ctrl+J : 列出成员 智能感知Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关 Ctrl+B,N / Ctrl+K,N: 移动到下一书签 Ctrl+B,P: 移动到上一书签 Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 反向渐进式搜索 Ctrl+F: 查找 Ctrl+Shift+F: 在文件中查找 F3: 查找下一个 Shift+F3: 查找上一个 Ctrl+H: 替换 Ctrl+Shift+H: 在文件中替换 Alt+F12: 查找符号(列出所有查找结果) Ctrl+Shift+V: 剪贴板循环 Ctrl+左右箭头键: 一次可以移动一个单词 Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。 Ctrl+Shift+L: 删除当前行 Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态 Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态

Ctrl+E,S: 查看空白 Ctrl+E,W: 自动换行 Ctrl+G: 转到指定行 Shift+Alt+箭头键: 选择矩形文本 Alt+鼠标左按钮: 选择矩形文本 Ctrl+Shift+U: 全部变为大写 Ctrl+U: 全部变为小写代码快捷键 Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息 Ctrl+K,I: 快速信息Ctrl+E,U / Ctrl+K,U: 取消选定注释内容 Ctrl+K,M: 生成方法存根 Ctrl+K,X: 插入代码段 Ctrl+K,S: 插入外侧代码 F12: 转到所调用过程或变量的定义窗口快捷键Ctrl+W,W: 浏览器窗口 Ctrl+W,S: 解决方案管理器 Ctrl+W,C: 类视图 Ctrl+W,E: 错误列表 Ctrl+W,O: 输出视图 trl+W,P: 属性窗口 Ctrl+W,T: 任务列表 Ctrl+W,X: 工具箱 Ctrl+W,B: 书签窗口 Ctrl+W,U: 文档大纲 Ctrl+D,B: 断点窗口 Ctrl+D,I: 即时窗口 Ctrl+Tab: 活动窗体切换 Ctrl+Shift+N: 新建项目 Ctrl+Shift+O: 打开项目 Ctrl+Shift+S: 全部保存 Shift+Alt+C: 新建类 Ctrl+Shift+A: 新建项 Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关 Ctrl+B,N / Ctrl+K,N: 移动到下一书签 Ctrl+B,P: 移动到上一书签 Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 反向渐进式搜索 Ctrl+F: 查找 Ctrl+Shift+F: 在文件中查找 F3: 查找下一个 Shift+F3: 查找上一个 Ctrl+H: 替换 Ctrl+Shift+H: 在文件中替换 Alt+F12: 查找符号(列出所有查找结果) Ctrl+Shift+V: 剪贴板循环 Ctrl+左右箭头键: 一次可以移动一个单词 Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。 Ctrl+Shift+L: 删除当前行 Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态 Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态 Ctrl+M,P: 停止大纲显示 Ctrl+E,S: 查看空白 Ctrl+E,W: 自动换行 Ctrl+G: 转到指定行 Shift+Alt+箭头键: 选择矩形文本 Alt+鼠标左按钮: 选择矩形文本 Ctrl+Shift+U: 全部变为大写 Ctrl+U: 全部变为小写

Blog updated

发表于 2008-07-30 | 分类于 站点日志 | | 阅读次数:
字数统计: 163 字 | 阅读时长 ≈ 1 分钟

今天上网才发现,原来PJBlog有更新了。去作者主页看了看,才知道原来发布了一个V2.8的里程碑版本,后续还有一系列更新。于是我立马去把我的blog升级成PJBlog3了,呵呵。总体看来作者这次改动很大,尤其是blog后台界面,美化了不少的地方,还增加全静态化功能 ,提高了访问的性能。 文章表情也更新了很多。看来作者是下了大功夫的,不更新太对不起作者的劳动成果了 希望这个版本不会有太多的bug。

打完收工……

Linq to SQL 的更新冲突与管理

发表于 2008-07-02 | 分类于 技术控 | | 阅读次数:
字数统计: 1.3k 字 | 阅读时长 ≈ 5 分钟

前段时间工作中的一个新需求,有机会用到了Linq to SQL。使用后的第一感觉,就是方便很多,也为整个项目节约了一大把的开发时间,甚至代码量也少了很多。不过在程序的实际运行中,始终会遇到一些莫名其妙的异常,最令人不解的,就是“System.Data.Linq.ChangeConflictException: Row not found or changed.” 。当初凭自己和同事的判断,可能是数据库的数据异常所导致,后来发觉这个异常出现得越来越频繁,于是上MSDN查了查,原来是Linq中一个常见的问题:更新冲突。 这个词说起来比较玄乎,其实再平常不过了。下面可以通过一个简单的例子,来重现这个异常。 建立一个普通的测试表:LinqTest(如图)

 在测试表中,插入一条测试数据(如图)

![](/pics/linq2.jpg)

 测试代码如下:

[code] namespace LinqTest { class Program { static void Main(string[] args) {

        TestDataContext db = new TestDataContext();

        db.Log = Console.Out;
        var result = from p in db.LinqTests
                     where p.ID == 1
                     select p;

        var info = result.FirstOrDefault();

        if(info != null)     //插入断点
        {
            info.Age = 25;
            db.SubmitChanges();
        }

        Console.ReadLine();

    }

}

} [/code]

在测试代码中,将DataContext的日志定向到Console的输出部分,这样方便我们观察Linq实际执行的SQL语句是什么。重现的时候,我们需要在注释的地方,插入断点进行测试。对于示例中的代码,在正常情况下,是不会有错误的。执行过后,我们可以在Console的输出中,看到实际执行的SQL语句(如图)

再进行第二次调试,首先,恢复Age的数据到以前的样子。下面我们运行到断点处,然后偷偷去SQL Server Management Studio中,手动修改数据,将原始数据中的Age,由24,改为22。然后回到VS2008的IDE,按F5继续运行程序,这个时候,你会发现异常出现了(如图)

再回到Console的输出,查看,执行的SQL语句和刚才的一样。这就是问题的所在,在正常运行状态下,Linq在运行时,会把数据库的数据缓存到实体对象中,这是一种理想化的情况,并且在更新时,Linq会默认把除更新字段外的所有字段,作为Update语句中的Where条件。但是,如果此时有另外的程序,在访问数据库,并修改数据库数据的时候,比如刚才把Age改为22。此时Linq缓存起来的数据和实际数据库中的数据产生了不一致的情况。Linq此时仍然把被修改过的字段,作为Update的Where条件,但是数据库中Age早就被我们改过了,不再是25,Where条件始终匹配不到原有的数据。这时,就会抛出所谓的:“System.Data.Linq.ChangeConflictException: Row not found or changed.”异常。

产生此异常,主要是Linq缓存数据和实际数据库数据不一致的情况造成。解决次问题的情况,主要有几种:

1.比较简单的方法,不使用Linq提供的SubmitChanges()方式提交更改,而直接执行SQL语句,例如:
 db.ExecuteCommand("Update [dbo].[LinqTest] SET Age=25 Where ID = @p0", 1);
这样虽然比较方便,但是感觉又回到了直接写SQL的时代,毕竟Linq to SQL的目的,就是为了让我们看不见SQL,避免写复杂的SQL语句,而直接操作实体对象,这样也可以避免程序可读性差、不便于维护。所以除非万不得已,还是不太推荐使用此方法。

2.参考MSDN的资料,采用Linq提供的解决更新冲突的方法,在异常中捕获冲突,然后手动解决冲突:

[code] try { db.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict); } catch (System.Data.Linq.ChangeConflictException ex) { foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts) { //以下是解决冲突的三种方法,选一种即可

    // 使用当前数据库中的值,覆盖Linq缓存中实体对象的值
    occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

    // 使用Linq缓存中实体对象的值,覆盖当前数据库中的值
    occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);

    // 只更新实体对象中改变的字段的值,其他的保留不变
    occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
}

// 这个地方要注意,Catch方法中,我们前面只是指明了怎样来解决冲突,这个地方还需要再次提交更新,这样的话,值    //才会提交到数据库。
db.SubmitChanges();

}

[/code]

3. 这个方法也比较简单,也即MSDN中所说的Pessimistic Concurrency Control  。 我们可以来设定哪些字段需要放入Where条件,哪些字段不需要,这样就可以控制更新时候的条件匹配尺度。具体做法,就是在Linq to SQL Designer中,把一些字段的UpdateCheck属性设置为Never,这样,这些字段在更新的时候,就不会再出现在Where条件中了。其实比较推荐的做法,就是在表中设立主键,因为更新的时候,只要把主键作为Where条件,就可以单独的确立一行数据了。把除主键外的字段属性中UpdateCheck设置为Never即可。

关于Linq to SQL中如何管理更改冲突的更多资料,可以在MSDN找到 http://msdn.microsoft.com/zh-cn/library/bb399389.aspx

救救绵竹!

发表于 2008-05-16 | 分类于 随笔 | | 阅读次数:
字数统计: 1.4k 字 | 阅读时长 ≈ 4 分钟

高洪珠特注:我将此文发到我的天涯和新浪博客上,发到天涯杂谈上。泣请大家尽量将此文转发到各个网站上,各个论坛上,转到你们的博客上,我谢谢你了,绵竹的灾民谢谢你了,绵竹谢谢你了!!!!!!!!

  我以一个难民的身份逃到成都,在亲戚家里住着。其实一个很大的原因就是为了上网,作为一个自愿者也好,作为一个义工也好,把灾区绵竹最真实的情况发出去。让更多的人知道,让上级部门知道,希望绵竹能尽快得到有效的救助。   我离开绵竹之前,绵竹城区的十万左右的难民住在户外,天下着大雨。避雨的东西作用不大,有些人干脆就没有。余震不断。人都变成神经质了,风吹草动都以为是地震,真正震起来的时候反而麻木了。   城区的难民完全在自力更生,在自救。政府和部队都抽不出手来管城里的人,因为山区和农村的灾情更加严重。拉屎拉尿也没有地方,这样下去,会造成很恶劣的卫生情况,甚而导致急病的发生。   最佳救助时间正在过去,甚至被浪费。

  应该说,绵竹和德阳电视台向上面和全国人民反映绵竹灾情的力度很不够。你们的报道怎么可以还是站在领导的角度来表扬他们指挥有方什么的呢?给外人的感觉是绵竹的灾不重,误导了外地人和更上级的领导;应该多报些真实的灾情呀!   在成都看电视的时候,很多都在说汶川,北川,其实绵竹的情况一点也不比那些地方好,甚至更加严重!   我不知道绵竹报灾的时候是不是尽量往小里报,难道是习惯了吗?

  临近山区的乡下民房几乎全垮了,不少人被埋,凶多吉少。救助效果不好,特别是头一两天,由于缺乏这方面的常识和经验,使很多难民失去了生还的可能。而外地的求援人员又没有到位。那么大一个东汽厂,头一天多居然只有自救!全靠温总理去了,援救的力度才得以加大,可是人命关天,拖不起啊!

  山区非常严重。房屋垮塌,山体下滑,很多人死了。几个山区乡镇通讯和交通瘫痪,根本没有消息。   遵道镇政府垮了,工作人员被活埋,死伤严重。   九龙镇的街道也垮了。   马尾的街也垮了。   吉祥寺垮了,众僧和信众被埋。   汉旺镇政府垮了,街道垮了。   深山中的金花镇垮了。伤亡惨重。   深山中的天池乡政府垮塌,两边的山把房子埋了。   深山中的清平乡垮了。   国家大型企业东方汽轮机厂若干分厂垮了,伤亡惨重!   死亡无数!

  学校成了重灾区。   东汽中学当时正在上课,楼垮了,很多师生被埋,救活者极少,头天,很多自愿者看到听到活人却无力救活。东汽技校(汉旺校区)也垮了。   九龙幼儿园的孩子正在午睡,楼垮了,80多名孩子被埋,头天救了二十来个出来,救出来的活着的也很少。   马尾学校。   九龙学校。   遵道学校。   五福学校。   天池学校。   金花学校。   天池学校。   清平学校。   我边流泪边打下这些学校的名字。那里的太多的师生啊!   死亡和失踪的数字无法准确统计。

  清平磷矿垮塌得非常厉害。   其它的磷矿,煤矿我还不知道,但肯定不敢想像!

  绵竹火葬厂堆了很多尸体,又无法烧。如果再不处理,就会引发瘟疫,希望有关部门采取断然措施,就地埋葬。甚至完全可以使用万人坑的形式,大灾之际非常时期,救活人要紧!!这件事情拖不得了!腐烂的气味已经开始传递了。周围一两里的人都只能戴着口罩来防止那难闻的味道,可是防得了吗?   希望相关部门立即组织人力深埋尸体,同时做一些必要的消毒处理

  由于山体滑坡,堵了水路,如果水越积越多,再遇大雨暴雨的话,随时都可能引起山洪爆发,如果这样的话,后果将更加无法想像!

  绵竹水电气全部中断,衣食住行都成了问题。食品和药品告急!   十三号就有人在哄抬物价了,卤肉卖五十五一斤了。鸡蛋卖两块钱一只了。这个现象也应该制止。   关键是应该尽快运物资去了!   救救绵竹,救救绵竹!

———————————————————————————— 下面是绵竹籍的北京大学大四学生谢佳秋提供的信息,大家相互转告。

随性随缘 评论日期:2008-5-15 18:32      这是德阳的一个捐款渠道,你把他贴到你博客正文吧。已经获得证实了。      德阳驻京办捐助热线:01068002582,捐助账户名:德阳市人民政府驻北京联络处,账号:087507120100330004291,开户行:中国光大银行北京西城支行。   ————————————————————————————————

Dynamic Plugins Manager (五) Plugins Manager 源码下载

发表于 2008-04-01 | 分类于 我的拙作 | | 阅读次数:
字数统计: 42 字 | 阅读时长 ≈ 1 分钟

今天和同事一起把Plugins Manager放在了google code上面。大家可以从下面的地址获取所有的源码了。

http://code.google.com/p/dynamic-plugins-manager/

Dynamic Plugins Manager (四) 插件及Demo源码下载

发表于 2008-03-29 | 分类于 我的拙作 | | 阅读次数:
字数统计: 57 字 | 阅读时长 ≈ 1 分钟

这里提供了插件的Demo程序,和编译好的Plugin Manager下载。 Plugin Manager的代码待整理后放上来。[cool]

开发运行环境:

Windows Vista Ultimate .NET Framework 3.5 Microsoft Visual Studio 2008

点击下载此文件

Dynamic Plugins Manager (三) Demo

发表于 2008-03-29 | 分类于 我的拙作 | | 阅读次数:
字数统计: 573 字 | 阅读时长 ≈ 2 分钟

下面来演示一下Plugins Manager,先看看我们事先做好的Interface和两个具体实现的插件.

Interface,接口定义: [code] using System; using System.Collections.Generic; using System.Linq; using System.Text;

namespace Component { public interface IComponent { string Invoke(); } } [/code]

整个接口,只声明了一个Invoke方法,这也是具体的插件必须实现的一个方法。

第一个插件类 class1.cs [code] namespace Component {

public class Class1 : MarshalByRefObject,IComponent
{
    string message = string.Empty;
    int number;
    float number2;

    public Class1(string input, int num)
    {
        message = input;
        number = num;
        number2 = 0;
    }

    public Class1(int num1, float num2)
    {
        message = "none";
        number = num1;
        number2 = num2;
    }

    public string Invoke()
    {
        return "This is TestLibrary. member---message:" + message + "number:" + number.ToString() + "number2:" +number2.ToString();
    }
}

}

[/code]

第二个插件类 class2.cs
[code]

namespace Component { public class Class2 : MarshalByRefObject,IComponent { public Class2() { }

    public string Invoke()
    {
        return "This is TestLibrary2 without construct param";
    }
}

}

[/code]


这里我们看到区别,第一个插件,需要构造函数,第二个插件不需要构造函数,所以在配置文件中,第二个插件可以关闭掉ConstructParam这个节点。

下面我们将Class1.cs编译好,放到插件目录中,改名为TestLibrary.dll,将Class2.cs直接改名为TestLibrary2.cs,放到插件目录中。 演示的目的:插件1需要在加载时,构造初始化函数,而插件2不需要。 插件1,是已经编译好的dll,不需要实时编译,但是插件2需要。

下面是测试的截图

1.插件目录,一个放入编译好的dll,一个放入.cs源码

2.启动测试程序,看到2个插件都已经被加载

3.此时,再查看插件的目录,我们会看到Plugin Manager为我们编译,并生成的插件2的dll

4.查看插件的日志记录

5.插件的调用 选中TestLibrary,点击Invoke按钮:

选中TestLibrary2,点击Invoke按钮:

6.插件的动态卸载和发布 a.动态卸载,可以直接使用Plugins Manager的UnloadPluginByName直接通过程序调用卸载。也可以手动打开插件的配置文件,将EnablePlugin设置为False b.动态发布,直接在插件目录中,建立一个新的子目录,然后将插件的dll和xml配置文件直接拷入即可 关于第6点,这些功能的演示,截图比较麻烦,大家可以直接使用测试程序测试即可。

Dynamic Plugins Manager (二) 配置及实现分析

发表于 2008-03-29 | 分类于 我的拙作 | | 阅读次数:
字数统计: 729 字 | 阅读时长 ≈ 2 分钟

整个Plugins Manager是一个基于dll的程序集,开发平台,基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢?没别的原因,只要是为了尝试一下Linq to XML [cool]

使用改组件,需要在应用程序中,添加引用。另外,还需要在应用程序中,建立相关的配置项:

[code]

[/code]

PluginsPath是插件的主目录,里面通过子目录的方式,存放不同的插件。Plugins Manager在启动的时候,会遍历插件主目录,并搜寻可加载的插件。

LogPath是插件的日志目录,里面的日志文件,会详细记载插件管理器当前的运行情况。

另外,在Plugins Manager中,区别不同的插件,是根据不同的插件名称来决定的,这取决于插件dll的命名。 对于不同的插件,Plugins Manager也提供不同的特性配置文件。配置文件是.xml文件,命名需要和插件dll相一致。 下面是一个配置文件的示例: [code]

Component.Class1 True

D:\MyCode\C# Projects\DynamicPlugInsApp\ITestInterface\bin\Debug\ITestInterface.dll

[/code]

TypeName:插件的类名,和具体的插件命名空间和类名有关,Plugins Manager根据配置文件提供此相关信息,通过.NET的反射技术,生成具体的插件Instance EnablePlugin:插件开关,True表示当前插件可用,False表示阻止Plugins Manager加载此插件。该开关可以在Plugins Manager运行前设定,也可以在Plugins Manager运行时动态更改。Plugins Manager会检测配置文件变化,并留意EnablePlugin开关,以决定是否动态加载或者卸载该插件。 ConstructParams:此节点,及其子节点,用以读取插件是否需要在运行时初始化构造函数。子节点用以描述构造函数中的参数,以及类型,和初始化的值。构造初始化函数,也是在.NET的反射中实现。这里要注意,节点顺序和构造函数参数顺序有关。如果插件不需要构造函数,可以关闭此节点。 ReferenceList:此节点用以需要动态编译的插件,如果插件代码中还引用了其他的程序集,需要在此进行描述。

此外,插件还提供了事件通知功能,供应用程序进行响应和处理,实现的事件类型有以下几种:

[code] public enum PluginEventType { PluginLoadOver, //所有插件加载完毕 PluginAdded, //插件新增完毕 PluginRemoved, //插件卸载完毕 PluginStopped, //插件管理器已停止 PluginStarted //插件管理器已启动 } [/code]

插件的事件参数定义如下,只包含简单的事件类型和文本描述:

[code]
public class PluginEventArgs : EventArgs
{
    #region Private Members
    public PluginEventType EventType { get; set; }
    public string EventMessage { get; set; }
    #endregion

    public PluginEventArgs(PluginEventType eventtype, string message)
    {
        EventType = eventtype;
        EventMessage = message;
    }

}

[/code]

以上是使用该插件,需要配置的地方,下一篇日志,将演示该插件的Demo.

1…323334…47
Timothy

Timothy

Timothy的技术博客,记录技术以及生活点滴

564 日志
8 分类
1187 标签
RSS
github twitter
Links
  • ZWWoOoOo
  • 花開未央
  • 守望轩
  • 大漠说程序
  • ChengBo
  • BlueAndHack
  • 程序员小辉
  • 子痕的博客
  • WoodenRobot
  • VPS大佬
  • 毕扬博客
  • VPSDad
  • 猫爪导航
  • ss1271的奋斗
  • Kian.Li
  • YoungForest
  • Fred's Blog
  • Jacklandrin
© 2025 Timothy
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4