从Windows 1.0到Vista启动画面回顾

140 views 十一月 15, 08 by Timothy

首先声明,我不是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快捷键大全

370 views 十月 23, 08 by Timothy

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

115 views 七月 31, 08 by Timothy

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

Linq to SQL 的更新冲突与管理

244 views 七月 03, 08 by Timothy

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

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

测试代码如下:

[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

救救绵竹!

102 views 五月 16, 08 by Timothy

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

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

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

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

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

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

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

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

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

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

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

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

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

113 views 四月 01, 08 by Timothy

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

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

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

184 views 三月 29, 08 by Timothy

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

开发运行环境:
Windows Vista Ultimate
.NET Framework 3.5
Microsoft Visual Studio 2008

点击下载此文件

Dynamic Plugins Manager (三) Demo

208 views 三月 29, 08 by Timothy

下面来演示一下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点,这些功能的演示,截图比较麻烦,大家可以直接使用测试程序测试即可。

Page: 27 of 49 1 ... 23 24 25 26 27 28 29 30 31 ... 49