2007年1月所有随笔

认识自己

  犯错不怕,怕是犯了错不认识、不改过。木桶原理确实很有道理:“在实际生活当中人们惯于对自己长处的认可,却忽视对自身不足的认识”,如此一来人的一生终究难成大业。今天突然有这么一个想法,要是每天都空出半个钟头,想想今天所做的事,犯了什么错误,哪里做得不足,一一反省一下,不让错误在明天再次发生。可惜的是,有时知道自己某些做法不对,自己有什么缺点,但却懒得去改,久而久之让缺点慢慢变成习惯,难于改正,这样,这些习惯就会慢慢的腐蚀人的一生……,“认识自己”实在是太重要了!

给创业者的二十二个经典提示[转载]

  提示一:性格本不同,何必太偏执

  古希腊戴尔被伊神托所的入口出写着醒世语:“认识自己”,有的人适合于创业,有的人不适合,性格即命运,所以创业前人必须清楚的认识自己,不能够固执的认识别人能够创业成功,自己也不会失败。纵身跃入商海,从此踏上不归之路。

  提示二:败走麦城起阴云,重长轻短铸大错

  著名的木桶原理告诉人们:决定一只桶的容量,不是组成桶的最长的那快木快,而是最短的那快木版,决定一个人或一项事业成败的不是擅长或优势,而是缺陷或劣势。然而在实际中人们惯于对自己长处的认可,却忽视对自身不足的认识,在很多的关键时刻因为这些不足而导致了整个创业事业的失败。

  提示三:业有千百行,千万别错入

  创业千百万不能单纯的相信无论做什么生意,只要努力去做,一定会赚钱。有很多行业的生意,再努力也不来钱。这不是没有运气的问题,而是由整个宏观形势和产业结构所决定的。

  提示四:选对行业是前提

  不会定位还得亏选好一个行业并决定进入不能算是创业的起点。寻找并看准行内久市场才是序曲,如果找准行业,却不会对自己即将进行的活动进行市场定位,其创业的前途必然渺茫,而是随时可能上当吃亏。

  提示五:一个篱笆三个桩,不懂合作业难成

  俗话说:“一个巴掌拍不响”,生活中是这样,商场中也是这样当今,商界战场上硝烟四起,竞争异常激烈,想在这场上你死我活的战争中获胜,想象过去那样,单靠自己的力量,恐怕谁也都没有这个能力,即使有,亦难成大气候。

  提示六:创业发展要创新,失利终缘产品“旧”

  任何赚钱的产品,都逃不脱“投入期--成长期--成熟期--衰亡期”的演变规律,最终都会被淘汰,企业要发展,要不断的有钱赚,就必须不断的创新,走出旧的产品的“陷阱”,不断拥有新产品和新项目。

  提示七:莫言赚钱难,只因成本高

  成本降低对创业中的企业提高或稳定利润,是一个非常有效的办法,延误成本的降低是一种自杀行为。

  提示八:顾客之心要掌握,谨防竹篮打水空

  顾客是上帝,他们只会和那些能真正满足他们需要的公司打交道,对那些不懂他们需要的公司,总是避而远之的。

  提示九:广告时代靠宣传,酒香也怕巷子深

  很多创业者对广告不屑一顾,他们认为自己手中有过硬的产品,的确过硬的产品是一种致命的法宝,但如何把这种法宝打入市场却是件不容易的事。

  提示十:风物长宜放眼量,节税之道应早行

  创业开始之后,碰到的问题会很多,但最让人捆饶的是资金融通及税务的问题,这两方面如果不善于处理,掉进去,事业经营越大,面临的捆饶也就越多。

  提示十一:世上债务最烦人,不会讨债总吃亏

  现代商业如果没有信用,就是一潭死水永无繁荣之日.有信用,就有应收帐款,经过积累,疑聚,你有没有看到,你的许多帐款已成了难缠的“债”,你的帐面很漂亮,但是捞不上岸的债务成了你心头一大痛处,不会讨债,你使出浑身解术也无济于事。

  提示十二:自以为是失人心,不惜人才难长远

  在企业的建立,发展过程中,大量事例有力证明,人才是企业兴衰的关键,所谓得人才得天下,失人才者失天下,很多创业者失败的根本原因就是在于自以为是,对人才怠慢和轻蔑所致的。

  提示十三:身体力行诚可贵,事必躬亲不可取

  精力是有限的,创业者大部分时间应该花在寻找机会和与重大决策上,不必事必躬亲的面面俱到。

  提示十四:信息时代信息战,忽视信息失商机

  现代社会越来越变得离不开信息的支持,人们奉行信息就是金钱的信条,然而没有用的信息永远只是信息,变不成金钱,在信息爆炸的商业环境中,成堆的信息包围着你,如果冲不出去,就会被淹没。

  提示十五:谁人创业无风险,不敢举借是庸才

  很多人由于受传统观念的影响,不敢或不愿意用负责经营来进行创业活动,促进事业的发展,甚至把“既无内债,又无外债”的国债观念推广到企业的资金营运方面,似乎这是“自力更生”的象征,这种铸资和经营观念,看不到存在着可以利用的广大的社会资金固守着“无债”经营,因而只会束手无策其事业的发展,作为以个现代创业,既不要怕借债经营,敢于借入外部资金,又要避免盲目借债,其核心问题就在于,科学而慎重的做出合理的借入资金决策,以谋取可能而且最佳的经济效益。

  提示十六:经营感觉可培养,赚钱不必求别人

  现代经济生活中,一个创业者如果想让自己获得更大的成功,使自己的事业获得更加充分的发展就应当意识到在愈加愈激烈的商业竞争中,单纯依靠过去的所谓意志,体力去拼搏是难以获得成功的,以个成功的创业者依靠的是灵活,敏锐的头脑和科学,丰富的经营感觉去决定胜负。

  提示十七:天道不酬勤,价格有误区

  为事业费劲心机,相信天道酬勤,然而产品却仍然不畅销,为什么呢?其实很多时候最关键的问题不就在创业者的价格意识,很多创业者落后的价格意识,要么使产品定价过高使消费者望而却步,要么使产品过于实在而使消费者提不起消费的欲望。

  提示十八:不识政治走四方,盲人摸象梦难成

  自古以来,政治和经济便是一对紧密相连的孪生,在中国这种特殊的政治背景之下,创业要取得商业上的辉煌业绩,除了从经济方面入手之外,如果不懂政治,显然不能获得成功。

  提示十九:不战而屈人之兵,谈判无术妄自叹

  在现代经济生活中,谈判可以说是无时不在,无处不在,每一个要求的满足,每一项寻找的满足的需要,都可能诱发谈判,而创业企业过程中的各种问题更离不开谈判,如果创业者谈判无术,往往使自己的事业的经营中处于一种劣势的地位,发展处处受到限制。

  提示二十:人生健康是财富,工作狂人非所宜

  创业是一种富有挑战性和创造性的职业,而其中的艰辛也不是一般人所想象的,这些常使创业者感到一种压力,然而整个世界即将迎来21世纪的今天,那种工作狂式的生活方式正受到社会的抛弃,不会生活和休息的人,不是一个合格的创业者。

  提示二十一:不以为然轻法律,多半创业夭中途

  在创业者的过程中,懂法、知法、守法是一个必不可少的条件,创业者如果不懂法、不知法、不守法,其事业必然会夭折。

  提示二十二:人在商海是非多,防骗反骗须细思

  任何一个创业者在商海中搏击,都会遇到一些骗子所设的“陷阱”,或大或小.一旦这些骗子得利,创业者要么血本无亏,要么苦心经营事业顷刻之间化为乌有。

在 IE7 里调试 VS.NET 2003 Web 应用程序出错

由于安全设置的原因,在 IE7 下调试 VS.NET 2003 项目时会出现如下错误:

试图运行项目时出错: 无法在 Web 服务器上启动调试。您不具备调试此应用程序的权限。此项目的 URL 位于 Internet 区域。有关更多信息,请单击“帮助”。

解决办法:

在 IE7 里 Internet 选项->“安全”->“自定义级别”里有“用户验证”,将登录改为“自动使用当前用户名和密码登录”。

DataSet 中的 Relations 属性

示例来自 MSDN,将四个表关联在一起,适应于在操作多表时,有时需要关联表有时不需要关联的情况下(见 CommunityServer 的 cs_shared_Threads_GetThreadSet 存储过程也属此类应用)。

using System;
using System.Data;
using System.Data.SqlClient;

namespace TestDataRelation
{

    class Program
    {
        static void Main()
        {
            PrintOrders("server=(local); uid=sa; pwd=; database=Test_DataSet_DataRelation");
        }

        private static void PrintOrders(string connectionString)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                DataSet customerOrders = new DataSet();

                connection.Open();

                SqlDataAdapter reader;

                reader = new SqlDataAdapter("SELECT * FROM Customers", connection);
                reader.Fill(customerOrders, "Customers");

                reader = new SqlDataAdapter("SELECT * FROM Orders", connection);
                reader.Fill(customerOrders, "Orders");

                reader = new SqlDataAdapter("SELECT * FROM OrderDetails", connection);
                reader.Fill(customerOrders, "OrderDetails");

                reader = new SqlDataAdapter("SELECT * FROM Products", connection);
                reader.Fill(customerOrders, "Products");

                connection.Close();

                DataRelation customerOrdersRelation = customerOrders.Relations.Add("CustOrders", customerOrders.Tables["Customers"].Columns["CustomerID"], customerOrders.Tables["Orders"].Columns["CustomerID"]);
                DataRelation orderDetailRelation = customerOrders.Relations.Add("OrderDetail", customerOrders.Tables["Orders"].Columns["OrderID"], customerOrders.Tables["OrderDetails"].Columns["OrderID"], false);
                DataRelation orderProductRelation = customerOrders.Relations.Add("OrderProducts", customerOrders.Tables["Products"].Columns["ProductID"], customerOrders.Tables["OrderDetails"].Columns["ProductID"]);

                // 打印所有订单及订单详情
                foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
                {
                    Console.WriteLine("客户 ID: " + custRow["CustomerID"] + "\t客户姓名: " + custRow["CustomerName"]);
                    Console.WriteLine("----------------------------------------");

                    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
                    {
                        Console.WriteLine("  订单号: " + orderRow["OrderID"]);
                        Console.WriteLine("\t订单日期: " + orderRow["OrderDate"]);

                        foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRelation))
                        {
                            Console.WriteLine("\t Product: " + detailRow.GetParentRow(orderProductRelation)["ProductName"]);
                            Console.WriteLine("\t Quantity: " + detailRow["Quantity"]);
                        }

                        Console.WriteLine();
                    }
                }

            }
        }
    }

}

MSDN:

请注意,当为 Customers 表和 Orders 表创建 DataRelation 时,没有为 createConstraints 标志指定任何值(默认为 true)。它假定 Orders 表中的所有行都具有一个存在于父 Customers 表中的 CustomerID 值。如果 CustomerID 存在于 Customers 表之外的 Orders 表中,则 ForeignKeyConstraint 将引发异常。

如果子列可能包含父列不包含的值,添加 DataRelation 时请将 createConstraints 标志设置为 false。在该示例中,对于 Orders 表和 OrderDetails 表之间的 DataRelation,createConstraints 标志将设置为 false。这样,应用程序就可以返回 OrderDetails 表中的所有记录并只返回 Orders 表中记录的子集,而不会生成运行时异常。

float:left 和 margin-left

在 IE6,float:left 和 margin-left一起使用时有 BUG,如:

<div>
    <div style="float:left; margin-left:5px" id="d1">左边有 10 px,而不是 5 px</div>
    <div style="float:left">紧跟 d1</div>
</div>

IE 7 和 Firefox 没有此问题。

CommunityServer 2.1 的 CSCopy 类

  此类支持序列化,此类的主要动作是根据子类的默认构造函数创建一个子类实例,objects 字段是 Hashtable 类型,存放一个键值对,它的键的类型是 Type 类型,值类型是 ConstructorInfo 类型,也就是它存放的是代表子类的构造函数的类型,作用是利用此构造函数类实例 Invoke 出子类的一个实例。

  CSCopy 类还有一个虚拟的成员函数 Copy(),一般地,子类继承时重写此类,然后在子类的 Copy() 函数里调用基类的 CreateNewInstance() 函数(或用 base.Copy())创建对象后,将子类中各成员变量的值赋给新创建的实例。如:

    public override object Copy()
    {
        Thread thread = base.Copy() as Thread;  // 调用 Thread 类的默认构造函数创建的实例

        // 以下的赋值是将当前对象(看到都用 this 了吧)的各成员变量的值赋给新对象,
        // 也就等于 Copy 一个副本,呵呵,从类名都可以看出来
        thread.MostRecentPostAuthor = this.MostRecentPostAuthor;
        thread.MostRecentPostAuthorID = this.MostRecentPostAuthorID;
        thread.AuthorID = this.AuthorID;
        thread.Status = this.Status;
        thread.IsSticky = this.IsSticky;
        thread.StickyDate = this.StickyDate;
        thread.MostRecentPostID = this.MostRecentPostID;

        return thread;
    }

    继承此类的子类一般是需要将对象 Copy 一份,然后另作它用。如:

    public virtual String RenderedBody(PostTarget target)
    {
        Post p = this.Copy() as Post;

        if (p.Section != null)
            CSEvents.PreRenderPost(p,p.Section.ApplicationType,target);
        else
            CSEvents.PreRenderPost(p,ApplicationType.Unknown,target);

        return p.FormattedBody;
    }

PCVCBlog 加了分页功能

  利用元旦两天的假期研究了一下 CommunityServer 2.1 SP1 的几个分页功能,为 PCVCBlog 加上了分页功能,PCVCBlog 提供了两个分页控件,一个是简单型的,一个是多功能型的,多功能的型的跟 baidu.com 和 google.com 的分页一样。同时数据库读取方面也是利用了 SQL Server 2005 的一个新功能:ROW_NUMBER() 函数。分页浏览时是按需读取,也就是根据 PageSize 大小从数据库读取指定条数的记录。在前台只需要指定一下 PageSize 的大小即可:

<Blog:AggregateBlogList runat="server" PageSize="5" />

最后一天假期,下雨了

  好不容易可以整天休息,无奈天空不作美,下起了雨,郁闷!

  凡事都往好的方面想就会好过点,下雨了,我又可以研究 .net 了,又可以学到东西了,也不错嘛,要是下午雨停了,就出去走走,也不能老面对电脑,一天面对9-10小时还不够啊,一年365天,可能有360天是这样度过的,这样做人真没意思,做程序员真没意思……可现在还由不得你做主,不经过风雨怎么能见彩虹!

  外面还是细雨濛濛,漱口洗脸先……

对 ASP.NET 控件的一点理解(整理)

Web 服务器控件和 Html 服务器控件


  一般地,在用 ASP.NET 开发 Web 应用程序时,时时刻刻都与控件打交道,可以说是无处不在,其实 Web 窗体页(.aspx 页)也是控件。

  ASP.NET 控件分为 Web 服务器控件(简称 Web 控件)和 Html 服务器控件(简称 Html 控件),都是运行在服务器端。两者有什么区别呢?

  我们平时用的 HTML 标记,如 <a>、<input> 等,是无法用程序来控制它们的,需用其它如 JavaScript 等程序语言才能得以控制。在 ASP.NET 程序里,我们可以在 HTML 标记加上 runat="server",就可以将相应的 HTML 标记变成 HTML 服务器控件,从而可以以编程的方式来控制这些 HTML 标记。引用(http://www.dvbbs.net/tech/net/2006051268338.asp):


  至于 Html 标注和 Html 控件之间的区别很明显,Html 控件是运行于服务器端,Html 标注是运行于客户端。具体来说:当 ASP.NET 网页执行时,会检查标注有无 runat 属性,如果标注没有设定,那么 Html 标注就会被视为字符串,并被送到字符串流等待送到客户端,客户端的浏览器会对其进行解释;如果 Html 标注有设定 runat="server" 属性,Page 对象会将该控件放入控制器,服务器端的代码就能对其进行控制,等到控制执行完毕后再将 Html 控件的执行结果转换成 Html 标注,然后当成字符串流发送到客户端进行解释。

  对于 Web 服务器控件,是 Web 窗体页中用来定义 Web 应用程序用户界面的组件,是 Web Forms 编程模型的基本元素,尽管 Web 服务器控件呈现为 HTML,但它们的对象模型不一定反映 HTML 语法。

  1、Asp.net 服务器控件提供更加统一的编程接口,如每个 Asp.net 服务器控件都有 Text 属性。

  2、隐藏客户端的不同,这样程序员可以把更多的精力放在业务上,而不用去考虑客户端的浏览器是 ie 还是 firefox,或者是移动设备。

  3、Asp.net 服务器控件可以保存状态到 ViewState 里,这样页面在从客户端回传到服务器端或者从服务器端下载到客户端的过程中都可以保存。

  4、事件处理模型不同,Html 标注和 Html 控件的事件处理都是在客户端的页面上,而 Asp.net 服务器控件则是在服务器上。


创建自定义服务器控件


  一、简述:


  创建用户控件或服务器控件一般是继承于 System.Web.UI.Control 类或 System.Web.UI.WebControls.WebControl 类。如 Web 用户控件(.ascx 页)继承于 System.Web.UI.UserControl 类,后者继承于 System.Web.UI.TemplateContorl 类,后者又继承于 System.Web.UI.Control 类,而 Web 窗体页(.aspx 页)也继承于 System.Web.UI.TemplateContorl 类,为什么中间要多出这些类呢?这些中间类都主要是提供一些共享的属性、方法和事件,总不能把所有的功能都放在 Control 类吧。TemplateContorl 类为 Page 类和 UserControl 类提供一组基本功能。而 Control 类为所有 ASP.NET 服务器控件提供共享的属性、方法和事件,它作为开发自定义 ASP.NET 服务器控件时的派生源的主要类(为什么要说“的主要类”是因为开发这些控件时往往还要实现其它接口以完成更多功能)。咱们平时用得最多的 TextBox 控件则是继承于 System.Web.UI.WebControls.WebControl 类。后者同样也是继承于 System.Web.UI.Control 类。

  Control 没有任何针对用户界面 (UI) 的功能。如果要创建没有 UI 的控件或者组合其他呈现它们自己的 UI 的控件,则从 Control 派生。如果要创建具有 UI 的控件,则从 WebControl 或 System.Web.UI.WebControls 命名空间中的任何控件派生,该命名空间为自定义控件提供适当的起点。

  System.Web.UI.WebControls 命名空间包含一些呈现为 HTML 标记的类,如 TextBox 控件和 ListBox 控件。该命名空间还包含一些不在网页上呈现、但支持数据操作的类,如 SqlDataSource 类和 ObjectDataSource 类。其他一些控件(如 GridView 控件和 DetailsView 控件)支持数据显示和编辑。WebControl 类用作 System.Web.UI.WebControls 命名空间中许多类的基类。


  二、例子:

  1. 一个 MSDN 的例子,创建一个从 Control 类继承且无 UI 功能的控件:


    // MyControl.cs
    using System;
    using System.Web.UI;

    namespace DemoControl
    {
        public class MyControl : System.Web.UI.Control
        {
            protected override void Render(HtmlTextWriter writer)
            {
                if (HasControls() && (Controls[0] is LiteralControl))
                {
                    writer.Write("<H2>Your Message : ");
                    Controls[0].RenderControl(writer);
                    writer.Write("</H2>");
                }
            }
        }
    }

    然后在 aspx 页注册该控件并使用:

    // Test.aspx
    <%@ Page Language="C#" %>
    <%@ Register TagPrefix="UC" Namespace="DemoControl" Assembly="Demo" %>

    <UC:MyControl runat="server">
        <asp:Literal runat="server" Text="http://pcvc.net" />
    </UC:MyControl>

    运行结果:

    <H2>Your Message : </H2>
    http://pcvc.net


  2. 还是 MSDN 的例子:


    namespace SpanControl
    {
        using System;
        using System.Web.UI;
        using System.Web.UI.WebControls;
   
        // Renders the following HTML:
        // <span onclick="alert('Hello');" style="color:Red;">Custom Contents</span>
   
        public class MyWebControl : WebControl
        {
            public MyWebControl() : base(HtmlTextWriterTag.Span)
            { }

            [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
            protected override void AddAttributesToRender(HtmlTextWriter writer)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "alert('Hello');");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "Pointer");
                base.AddAttributesToRender(writer);
            }

            [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.Write("Custom Contents");
                base.RenderContents(writer);
            }
        }
    }

    在 aspx 页注册该控件并使用:

    // spancontrol.aspx
    <%@ Page Language="C#" %>
    <%@ Register TagPrefix="UC" Namespace="SpanControl" Assembly="Demo" %>

    <UC:MyWebControl runat="server" />

    运行结果:

    <span onclick="alert('Hello');" style="color:Red;cursor:Pointer;">Custom Contents</span>

新一年又开始了

今天是元旦,我还得值班,明后天休息,也没什么安排。

回想 2006 年好像也没做什么,一片空白,唯一一件喜事就是结婚,然后去泰国。公司方面仍然如旧,没什么新的发展,公司网站除了改版还是改版,也赶了一下 web 2.0 的潮流,什么博客、群等,这是好现象,说明思想还是在进步的。

2007 年有什么打算?……

还是拭目以待吧……