in

SDT Community Server

SDT Forums, Blogs, Photos server.

Floating Heart

No description is bad.

June 2006 - Posts

  • 计算电脑的耗电量

    Posted Jun 30 2006, 07:10 PM by wicky with no comments
    Filed under:
  • 使用非默认的Oracle Client

    CDA需要使用Oracle 10g Client,而同一台机器上的其他程序暂时都是使用Oracle 8i Client,默认Client是Oracle 8.1.7。如何是好呢? 

    一个简单的解决方案:
    Web.config:
      <appSettings>
        <add key="oracleClientPath" value="c:\oracle\ora10g\bin" />
      </appSettings>

    Global.asax:
        void Application_Start(object sender, EventArgs e)
        {
            Application.Lock();
            ...
            string oracle = Config.OracleClientPath;
            if (!String.IsNullOrEmpty(oracle))
            {
                string path = Environment.GetEnvironmentVariable("path");
                path = String.Format("{0}{1}{2}", oracle, (oracle[oracle.Length - 1] == ';' ? "" : ";"), path);
                Environment.SetEnvironmentVariable("path", path);
            }
            ...
            Application.UnLock();       
        }

     

  • "System.Data.OracleClient requires Oracle client software version 8.1.7 or greater" with Oracle 9i/10g

    Problem Description
    -------------------

    When running an application using the Oracle9i Release 2 (9.2.0.1.0) install
    of client software and that attempts to connect to an Oracle database with the
    Authenticated User privilege (such as when you use Microsoft's Internet
    Information Server (IIS)) through any of the following programmatic interfaces

    1. Oracle Provider for OLE DB
    2. Microsoft OLE DB Provider for Oracle
    3. Oracle ODBC Driver
    4. Microsoft ODBC for Oracle
    5. Oracle Objects for OLE (OO4O)
    6. Microsoft .NET Framework Data Provider for Oracle


    you may receive one of the following errors:


    (1) Oracle Provider for OLE DB

    (a) Error Type: Microsoft OLE DB Service Components (0x80070005)

    Access is denied.


    (b) OraOLEDB.Oracle Provider is not registered on the local machine


    (2) Microsoft OLE DB Provider for Oracle

    (a) Error Type: Microsoft OLE DB Provider for Oracle (0x80004005)

    Oracle client and networking components were not found. These
    components are supplied by Oracle Corporation and are part of the
    Oracle Version 7.3.3 or later client software installation. Provider
    is unable to function until these components are installed.


    (b) Error Type: Microsoft OLE DB Provider for Oracle (0x80004005)

    Oracle error occurred, but error message could not be retrieved
    from Oracle.


    (3) Oracle ODBC Driver

    (a) Error Type: Microsoft OLE DB Provider for ODBC Drivers (0x80004005)

    Specified driver could not be loaded due to system error 5 (Oracle
    in OraHome92).


    (4) Microsoft ODBC for Oracle

    (a) The Oracle(tm) client and networking components were not found.
    These components are supplied by Oracle Corporation and are part
    of the Oracle Version 7.3 (or greater) client software installation.

    You will be unable to use this driver until these components have
    been installed.


    (b) Error number: -2147467259

    Error Description: [Microsoft][ODBC Driver Manager] Driver's
    SQLAllocHandle on SQL_HANDLE_ENV failed


    (5) Oracle Objects for OLE

    (a) while using a GLOBAL.ASA file

    Error Type: Active Server Pages (0x0)

    An error occurred while creating object 'OraSession'.


    (b) not using a GLOBAL.ASA file

    Error Type: Microsoft VBScript runtime (0x800A0046)

    Permission denied: 'CreateObject'


    (6) Microsoft .NET Framework Data Provider for Oracle

    (a) System.DllNotFoundException: Unable to load DLL (oci.dll).
    at System.Data.OracleClient.DBObjectPool.GetObject(Boolean&
    isInTransaction)
    at System.Data.OracleClient.OracleConnectionPoolManager.
    GetPooledConnection(String encryptedConnectionString,
    OracleConnectionString options, Boolean& isInTransaction)
    at System.Data.OracleClient.OracleConnection.OpenInternal
    (OracleConnectionString parsedConnectionString, Object transact)
    at System.Data.OracleClient.OracleConnection.Open()
    at WCWSItemAvailability.ETAAvailability.SingleAvailability(String
    ItemNumber, String BusinessUnit, Int32 OrderQty, Int32&
    AvailableQty, Int32& OnHandQty, String& ETADate, Int32& Error)
    at WCWSItemAvailability.ETAAvailability.XMLAvailability(String
    XMLInput)


    (7) Other miscellaneous errors

    (a) The Specified Module Could Not Be Found

    (b) ORA-00604: error occurred at recursive SQL level 1
    ORA-12705: invalid or unknown NLS parameter value specified

    (c) Unable to load DLL (OraOps9.dll):
    ...
    [DllNotFoundException: Unable to load DLL (OraOps9.dll).]

    (d) System Error 998 trying to run ASP page


    Solution Description
    --------------------

    Oracle 9.2 Client software requires that you give the Authenticated User
    privilege to the Oracle Home by following these steps:

    1. Log on to Windows as a user with Administrator privileges.

    2. Launch Windows Explorer from the Start Menu and and navigate to the
    ORACLE_HOME folder. This is typically the "Ora92" folder under the
    "Oracle" folder (i.e. D:\Oracle\Ora92).

    3. Right-click on the ORACLE_HOME folder and choose the "Properties" option
    from the drop down list. A "Properties" window should appear.

    4. Click on the "Security" tab of the "Properties" window.

    5. Click on "Authenticated Users" item in the "Name" list (on Windows XP
    the "Name" list is called "Group or user names").

    6. Uncheck the "Read and Execute" box in the "Permissions" list under the
    "Allow" column (on Windows XP the "Permissions" list is called
    "Permissions for Authenticated Users").

    7. Re-check the "Read and Execute" box under the "Allow" column (this is
    the box you just unchecked).

    8. Click the "Advanced" button and in the "Permission Entries" list make
    sure you see the "Authenticated Users" listed there with:

    Permission = Read & Execute
    Apply To = This folder, subfolders and files

    If this is NOT the case, edit that line and make sure the "Apply onto"
    drop-down box is set to "This folder, subfolders and files". This
    should already be set properly but it is important that you verify this.

    9. Click the "Ok" button until you close out all of the security properties
    windows. The cursor may present the hour glass for a few seconds as it
    applies the permissions you just changed to all subfolders and files.

    10. Reboot your computer to assure that these changes have taken effect.
    (wicky note: maybe restart IIS ok)

    Re-execute the application and it should now work.


    Explanation
    -----------

    If you install Oracle9i Release 2 (9.2.0.1.0) on a computer running Windows
    with an NTFS partition, the contents of ORACLE_HOME directory will not be
    visible to users who are authenticated on that machine. These permissions
    were not set properly when the software was installed.

    Applications that were working fine with previous versions of Oracle software
    will stop working when they upgrade to Oracle 9.2.

    NOTE: The application will continue to work if the user has logged onto the
    machine as an Administrator.

    Any application that is using the Authenticated User privilege will not work.
    A notable example would be IIS which might service some of the requests based
    on the Authenticated User privileges.

    To demonstrate the problem in further detail, you can log on to the operating
    system as an authenticated machine user. You won't be able browse the contents
    of the ORACLE_HOME directory demonstrating your inability to load any Oracle
    DLLs
    or make a connection.


    Additional Information
    ----------------------

    The above error messages may not only be encountered when using Oracle 9.2
    client software but may also exists when running into general permissions
    issues using third party products on a Windows platform.

    Posted Jun 28 2006, 01:26 PM by wicky with no comments
    Filed under: ,
  • Unable to debug: The binding handle is invalid

    If you get error message box:

    'Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor named 'COMPUTERNAME'. The binding handle is invalid.'

    check the Terminal Service status, start it.

  • .NET Tools and Utilities

    http://bdn1.borland.com/article/borcon/files/3102/paper/3102.html

    Learn about all the utilities you get with .NET which can make your programming life a lot simpler.

  • SimpleCache

    ASP.Net提供很好的缓存对象和页面的机制(System.Web.Caching)。

    其中缓存对象是可以用在Web和WinForm程序里面的。

    比如: 

            public static void InitDropDownList(DropDownList ddl, string tableName, string valueField, 
             string textField, int options, string selectedValue) { DataTable dt = null; object o = SimpleCache.Get(tableName); if (o != null) { dt = o as DataTable; } if (dt == null) {
                   ...... dt = _db.ExecQuery(sql); //cache it for 1 hour SimpleCache.Insert(tableName, dt, null, DateTime.Now.AddHours(1), SimpleCache.NoSlidingExpiration); }             ...... }
    具体用法可以参看System.Web.Caching.Cache类。
     
  • TextBox.ReadOnly in ASP.Net 2.0 and SimpleTextBox.ClientReadOnly

    有时候,我们不希望用户直接编辑TextBox,而是希望通过客户端脚本的方式来设置内容,一般的做法是设置TextBox的属性ReadOnly为true。但在ASP.NET 2.0里有了变化,设置了ReadOnly为true的TextBox,在服务器端不能通过Text属性获取在客户端设置的新内容,在Reflector里比较一下LoadPostData的实现

    .NET 1.1中,

    bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
          string text1 = this.Text;
          string text2 = postCollection[postDataKey];
          if (!text1.Equals(text2))
          {
                this.Text = text2;
                return true;
          }
          return false;
    }

    .NET 2.0中,

    protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
          base.ValidateEvent(postDataKey);
          string text1 = this.Text;
          string text2 = postCollection[postDataKey];
          if (!this.ReadOnly && !text1.Equals(text2, StringComparison.Ordinal))
          {
                this.Text = text2;
                return true;
          }
          return false;
    }

    就可以看出,如果设置了ReadOnly为true,从客户端传回的新的值是不被设置到Text属性的。(微软真是无聊啊。。。)

    网上有几种建议:
    http://blogs.msdn.com/irenak/archive/2006/05/03/589085.aspx
    http://blog.joycode.com/saucer/archive/2006/05/11/75741.aspx

    TextBox1.Attributes["readonly"] = "true";
    TextBox1.Attributes["contentEditable"] = "false";
    还有一个方法是服务器端不设置,在客户端设置用脚本设置readOnly=true就可以得到更新的Text值。

    为此SimpleTextBox添加了ClientReadOnly属性(想不到更好的名字啦)。

     

  • AJAX入门之深入理解JavaScript中的函数

           概述

      函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解。JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递。在继续讲述之前,先看一下函数的使用语法:

    function func1(…){…}
    var func2=function(…){…};
    var func3=function func4(…){…};
    var func5=new Function();

      这些都是声明函数的正确语法。它们和其他语言中常见的函数或之前介绍的函数定义方式有着很大的区别。那么在JavaScript中为什么能这么写?它所遵循的语法是什么呢?下面将介绍这些内容。

      认识函数对象(Function Object)

      可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名来进行调用。在JavaScript解释执行时,函数都是被维护为一个对象,这就是要介绍的函数对象(Function Object)。

      函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,例如日期对象(Date)、数组对象(Array)、字符串对象(String)都属于内部对象。这些内置对象的构造器是由JavaScript本身所定义的:通过执行new Array()这样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。

      在JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date一样,可以通过new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。为了便于理解,我们比较函数对象的创建和数组对象的创建。先看数组对象:下面两行代码都是创建一个数组对象myArray:

    var myArray=[];
    //等价于
    var myArray=new Array();
    同样,下面的两段代码也都是创建一个函数myFunction:
    function myFunction(a,b){
          return a+b;
    }
    //等价于
    var myFunction=new Function("a","b","return a+b");

      通过和构造数组对象语句的比较,可以清楚的看到函数对象本质,前面介绍的函数声明是上述代码的第一种方式,而在解释器内部,当遇到这种语法时,就会自动构造一个Function对象,将函数作为一个内部的对象来存储和运行。从这里也可以看到,一个函数对象名称(函数变量)和一个普通变量名称具有同样的规范,都可以通过变量名来引用这个变量,但是函数变量名后面可以跟上括号和参数列表来进行函数调用。

      用new Function()的形式来创建一个函数不常见,因为一个函数体通常会有多条语句,如果将它们以一个字符串的形式作为参数传递,代码的可读性差。下面介绍一下其使用语法:

    var funcName=new Function(p1,p2,...,pn,body);

      参数的类型都是字符串,p1到pn表示所创建函数的参数名称列表,body表示所创建函数的函数体语句,funcName就是所创建函数的名称。可以不指定任何参数创建一个空函数,不指定funcName创建一个无名函数,当然那样的函数没有任何意义。

      需要注意的是,p1到pn是参数名称的列表,即p1不仅能代表一个参数,它也可以是一个逗号隔开的参数列表,例如下面的定义是等价的:

    new Function("a", "b", "c", "return a+b+c")
    new Function("a, b, c", "return a+b+c")
    new Function("a,b", "c", "return a+b+c")

      JavaScript引入Function类型并提供new Function()这样的语法是因为函数对象添加属性和方法就必须借助于Function这个类型。
    函数的本质是一个内部对象,由JavaScript解释器决定其运行方式。通过上述代码创建的函数,在程序中可以使用函数名进行调用。本节开头列出的函数定义问题也得到了解释。注意可直接在函数声明后面加上括号就表示创建完成后立即进行函数调用,例如:

    var i=function (a,b){
           return a+b;
    }(1,2);
    alert(i);

      这段代码会显示变量i的值等于3。i是表示返回的值,而不是创建的函数,因为括号“(”比等号“=”有更高的优先级。这样的代码可能并不常用,但当用户想在很长的代码段中进行模块化设计或者想避免命名冲突,这是一个不错的解决办法。

      需要注意的是,尽管下面两种创建函数的方法是等价的:

    function funcName(){
           //函数体
    }
    //等价于
    var funcName=function(){
           //函数体
    }

      但前面一种方式创建的是有名函数,而后面是创建了一个无名函数,只是让一个变量指向了这个无名函数。在使用上仅有一点区别,就是:对于有名函数,它可以出现在调用之后再定义;而对于无名函数,它必须是在调用之前就已经定义。例如:

    <script language="JavaScript" type="text/javascript">
    <!--
    func();
    var func=function(){
           alert(1)
    }
    //-->
    </script>

      这段语句将产生func未定义的错误,而:

    <script language="JavaScript" type="text/javascript">
    <!--
    func();
    function func(){
          alert(1)
    }
    //-->
    </script>

      则能够正确执行,下面的语句也能正确执行:

    <script language="JavaScript" type="text/javascript">
    <!--
    func();
    var someFunc=function func(){
          alert(1)
    }
    //-->
    </script>


      由此可见,尽管JavaScript是一门解释型的语言,但它会在函数调用时,检查整个代码中是否存在相应的函数定义,这个函数名只有是通过function funcName()形式定义的才会有效,而不能是匿名函数。

      函数对象和其他内部对象的关系

      除了函数对象,还有很多内部对象,比如:Object、Array、Date、RegExp、Math、Error。这些名称实际上表示一个类型,可以通过new操作符返回一个对象。然而函数对象和其他对象不同,当用typeof得到一个函数对象的类型时,它仍然会返回字符串“function”,而typeof一个数组对象或其他的对象时,它会返回字符串“object”。下面的代码示例了typeof不同类型的情况:

    alert(typeof(Function)));
    alert(typeof(new Function()));
    alert(typeof(Array));
    alert(typeof(Object));
    alert(typeof(new Array()));
    alert(typeof(new Date()));
    alert(typeof(new Object()));

      运行这段代码可以发现:前面4条语句都会显示“function”,而后面3条语句则显示“object”,可见new一个function实际上是返回一个函数。这与其他的对象有很大的不同。其他的类型Array、Object等都会通过new操作符返回一个普通对象。尽管函数本身也是一个对象,但它与普通的对象还是有区别的,因为它同时也是对象构造器,也就是说,可以new一个函数来返回一个对象,这在前面已经介绍。所有typeof返回“function”的对象都是函数对象。也称这样的对象为构造器(constructor),因而,所有的构造器都是对象,但不是所有的对象都是构造器。

      既然函数本身也是一个对象,它们的类型是function,联想到C++、Java等面向对象语言的类定义,可以猜测到Function类型的作用所在,那就是可以给函数对象本身定义一些方法和属性,借助于函数的prototype对象,可以很方便地修改和扩充Function类型的定义,例如下面扩展了函数类型Function,为其增加了method1方法,作用是弹出对话框显示"function":

    Function.prototype.method1=function(){
          alert("function");
    }
    function func1(a,b,c){
          return a+b+c;
    }
    func1.method1();
    func1.method1.method1();

      注意最后一个语句:func1.method1.mehotd1(),它调用了method1这个函数对象的method1方法。虽然看上去有点容易混淆,但仔细观察一下语法还是很明确的:这是一个递归的定义。因为method1本身也是一个函数,所以它同样具有函数对象的属性和方法,所有对Function类型的方法扩充都具有这样的递归性质。

      Function是所有函数对象的基础,而Object则是所有对象(包括函数对象)的基础。在JavaScript中,任何一个对象都是Object的实例,因此,可以修改Object这个类型来让所有的对象具有一些通用的属性和方法,修改Object类型是通过prototype来完成的:

    Object.prototype.getType=function(){
           return typeof(this);
    }
    var array1=new Array();
    function func1(a,b){
          return a+b;
    }
    alert(array1.getType());
    alert(func1.getType());

      上面的代码为所有的对象添加了getType方法,作用是返回该对象的类型。两条alert语句分别会显示“object”和“function”。

      将函数作为参数传递

      在前面已经介绍了函数对象本质,每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变量,再通过这个变量名进行函数调用。作为一个变量,它可以以参数的形式传递给另一个函数,这在前面介绍JavaScript事件处理机制中已经看到过这样的用法,例如下面的程序将func1作为参数传递给func2:

    function func1(theFunc){
          theFunc();
    }
    function func2(){
          alert("ok");
    }
    func1(func2);

      在最后一条语句中,func2作为一个对象传递给了func1的形参theFunc,再由func1内部进行theFunc的调用。事实上,将函数作为参数传递,或者是将函数赋值给其他变量是所有事件机制的基础。

      例如,如果需要在页面载入时进行一些初始化工作,可以先定义一个init的初始化函数,再通过window.onload=init;语句将其绑定到页面载入完成的事件。这里的init就是一个函数对象,它可以加入window的onload事件列表。

      传递给函数的隐含参数:arguments

      当进行函数调用时,除了指定的参数外,还创建一个隐含的对象——arguments。arguments是一个类似数组但不是数组的对象,说它类似是因为它具有数组一样的访问性质,可以用arguments[index]这样的语法取值,拥有数组长度属性length。arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,例如:

    function func(a,b){
         alert(a);
         alert(b);
         for(var i=0;i<arguments.length;i++){
               alert(argumentsIdea);
         }
    }
    func(1,2,3);

      代码运行时会依次显示:1,2,1,2,3。因此,在定义函数的时候,即使不指定参数列表,仍然可以通过arguments引用到所获得的参数,这给编程带来了很大的灵活性。arguments对象的另一个属性是callee,它表示对函数对象本身的引用,这有利于实现无名函数的递归或者保证函数的封装性,例如使用递归来计算1到n的自然数之和:

    var sum=function(n){
          if(1==n)return 1;
          else return n+sum(n-1);
    }
    alert(sum(100));

      其中函数内部包含了对sum自身的调用,然而对于JavaScript来说,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用一个全局变量,不能很好的体现出是调用自身,所以使用arguments.callee属性会是一个较好的办法:

    var sum=function(n){
          if(1==n)return 1;
          else return n+arguments.callee(n-1);
    }
    alert(sum(100));

      callee属性并不是arguments不同于数组对象的惟一特征,下面的代码说明了arguments不是由Array类型创建:

    Array.prototype.p1=1;
    alert(new Array().p1);
    function func(){
           alert(arguments.p1);
    }
    func();

      运行代码可以发现,第一个alert语句显示为1,即表示数组对象拥有属性p1,而func调用则显示为“undefined”,即p1不是arguments的属性,由此可见,arguments并不是一个数组对象。

      函数的apply、call方法和length属性

      JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:

    Function.prototype.apply(thisArg,argArray);
    Function.prototype.call(thisArg[,arg1[,arg2…]]);

      从函数原型可以看到,第一个参数都被取名为thisArg,即所有函数内部的this指针都会被赋值为thisArg,这就实现了将函数作为另外一个对象的方法运行的目的。两个方法除了thisArg参数,都是为Function对象传递的参数。下面的代码说明了apply和call方法的工作方式:

    //定义一个函数func1,具有属性p和方法A
    function func1(){
          this.p="func1-";
          this.A=function(arg){
                alert(this.p+arg);
          }
    }
    //定义一个函数func2,具有属性p和方法B
    function func2(){
          this.p="func2-";
          this.B=function(arg){
                 alert(this.p+arg);
          }
    }
    var obj1=new func1();
    var obj2=new func2();
    obj1.A("byA");    //显示func1-byA
    obj2.B("byB");    //显示func2-byB
    obj1.A.apply(obj2,["byA"]); //显示func2-byA,其中[“byA”]是仅有一个元素的数组,下同
    obj2.B.apply(obj1,["byB"]); //显示func1-byB
    obj1.A.call(obj2,"byA");  //显示func2-byA
    obj2.B.call(obj1,"byB");  //显示func1-byB

      可以看出,obj1的方法A被绑定到obj2运行后,整个函数A的运行环境就转移到了obj2,即this指针指向了obj2。同样obj2的函数B也可以绑定到obj1对象去运行。代码的最后4行显示了apply和call函数参数形式的区别。

      与arguments的length属性不同,函数对象还有一个属性length,它表示函数定义时所指定参数的个数,而非调用时实际传递的参数个数。例如下面的代码将显示2:

    function sum(a,b){
          return a+b;
    }
    alert(sum.length);

      深入认识JavaScript中的this指针

      this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。

      和其他面向对象的语言不同,JavaScript中的this指针是一个动态的变量,一个方法内的this指针并不是始终指向定义该方法的对象的,在上一节讲函数的apply和call方法时已经有过这样的例子。为了方便理解,再来看下面的例子:

    <script language="JavaScript" type="text/javascript">
    <!--
    //创建两个空对象
    var obj1=new Object();
    var obj2=new Object();
    //给两个对象都添加属性p,并分别等于1和2
    obj1.p=1;
    obj2.p=2;
    //给obj1添加方法,用于显示p的值
    obj1.getP=function(){
          alert(this.p); //表面上this指针指向的是obj1
    }
    //调用obj1的getP方法
    obj1.getP();
    //使obj2的getP方法等于obj1的getP方法
    obj2.getP=obj1.getP;
    //调用obj2的getP方法
    obj2.getP();
    //-->
    </script>

      从代码的执行结果看,分别弹出对话框显示1和2。由此可见,getP函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。在obj1的getP方法中,this就指向了obj1对象,而在obj2的getP方法中,this就指向了obj2对象,并通过this指针引用到了两个对象都具有的属性p。

      由此可见,JavaScript中的this指针是一个动态变化的变量,它表明了当前运行该函数的对象。由this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。实际上,前面介绍的apply方法和call方法都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的方法作为另一个对象的方法运行。

      每个对象集合的元素(即属性或方法)也是一个独立的部分,全局函数和作为一个对象方法定义的函数之间没有任何区别,因为可以把全局函数和变量看作为window对象的方法和属性。也可以使用new操作符来操作一个对象的方法来返回一个对象,这样一个对象的方法也就可以定义为类的形式,其中的this指针则会指向新创建的对象。在后面可以看到,这时对象名可以起到一个命名空间的作用,这是使用JavaScript进行面向对象程序设计的一个技巧。例如:

    var namespace1=new Object();
    namespace1.class1=function(){
         //初始化对象的代码
    }
    var obj1=new namespace1.class1();

      这里就可以把namespace1看成一个命名空间。

      由于对象属性(方法)的动态变化特性,一个对象的两个属性(方法)之间的互相引用,必须要通过this指针,而其他语言中,this关键字是可以省略的。如上面的例子中:

    obj1.getP=function(){
          alert(this.p); //表面上this指针指向的是obj1
    }


      这里的this关键字是不可省略的,即不能写成alert(p)的形式。这将使得getP函数去引用上下文环境中的p变量,而不是obj1的属性。

     

    Posted Jun 21 2006, 08:36 PM by wicky with 2 comment(s)
    Filed under:
  • SimpleJSProgress & SimpleSelect

    SimpleControls.Web新增了2个控件:

    SimpleJSProgress: javascript进度条。

    SimpleSelect: 这个经典Tools.Net控件(TSelect)终于移植进了Simple Web。
    算法基本上没有变化,慢慢再优化吧。

    毫无疑问,Tools.Net的存在意义将越来越小了。

     欢迎各位测试并使用。

  • Bill Gates将在2008年退休

    微软近日公布了一系列消息,其中最为重要的应该就是有关微软掌门人Bill Gates的退休消息。微软表示他们的主席Bill Gates将在2008年7月退休,Gates将从现在开始逐步移交手上的工作。



    Bill Gates是和Paul Allen一起在1975年成立了微软公司,一直做为公司的掌舵人。前些年Gates辞去了微软CEO的职务,将大部分精力放到了开发工作上,退休后这部分工作将由微软目前的首席技术官Ray Ozzie接管。

    退休后,Gates将保留微软主席的职务,Bill和Melinda Gates基金会的工作也将继续下去,夫妻二人已经投入了300亿美元帮助学校、卫生组织以及世界范围内的慈善机构。
     
     
    Posted Jun 17 2006, 08:30 AM by wicky with no comments
    Filed under:
  • 中国人民志愿军朝鲜清长之战(围歼美国王牌海军陆战第一师和陆军第七师)

    我也来一篇。
    ==========
      
         英勇的志愿军,可能在后人看来不可思议。 “中国从他们的胜利中一跃成为一个不能再被人轻视的世界大国??如果中国人没有于1950年11月在清长战场稳执牛耳,此后的世界历史进程就一定不一样。”
      
          ____________摘自英国牛津大学战略学家罗伯特·奥内尔博士着《清长之战》。
      
          长津湖是朝鲜北部最大的湖泊,由发源于黄草岭的长津江向北在柳潭里和下碣隅里之间形成长津湖,最后注入鸭绿江。公元1950年11月中美两支王牌军在这里展开的一场改变历史进程的战斗。当时志愿军的第一次战役刚刚结束,“联合国军”虽遭志愿军迎头阻击,但 仍然认为中国是“象征性出兵”,“并不是不可悔的势力”。 因此即迅速集中其全部侵朝部队兵力,发动一次能“结束朝鲜战争的总攻势”,企图将志愿军赶过鸭绿江,占领全朝鲜,并要在十二月二十五日前结束朝鲜战争。
      
         为了查清志愿军参战兵力和意图,从11月6日开始,“联合国军”以部分兵力对朝鲜进行试探性进攻,东线美军主要是海军陆战队第1师和步7师,还编有英国、土耳其各一个旅共约9万余人沿黄草岭推进。美军步兵第七师一部沿丰山向北,南韩军首都一师据守明川 。蛰伏在长津湖地区,准备攻击这支强大的”联合国军”部队的是志愿军九兵团。该兵团由20军、26和27军组成。
      
         在11月21日,20军隐蔽进到柳塘里西南,27军潜到柳塘里和新兴里北部,26 军作为预备队由厚昌地区向长津湖靠近。九兵团的部队是准备台湾战役的主力,每个军都是四四制加强营甚至都是五五制,共计有近15万人。由于长期在南方作战,部队没有任何寒区作战经验和思想准备,很多人都还是第一次看到雪。美国形容这支经验丰富的部队行动非 常诡秘,在美军24小时不间断的侦察中,也能将10多万人的部队神不知鬼觉地潜到长津湖周围。志愿军虽然人数优势,但其给养和装备极其缺乏,部队防寒装备是空白。
      
        九兵团的战士大多来自南方。长津湖地区是朝鲜北部最为苦寒的地区,海拔在 1000至2000米之间,林木茂密,道路狭小,人烟稀少,夜间最低温度接近摄氏零下 40度,当年又是50年不遇的严冬。志愿军士兵穿着都是是华东温带的冬季服装,团以上干部的棉衣还没有发放。原准备在辽阳、沈阳等地稍事休息并换装,但由于朝鲜战况紧急,20军的列车开进山海关时,总参谋部派高级参谋拦住列车宣读了中央军委“紧急入朝”的 命令。十几列火车只在沈阳稍停片刻,就继续火速开进。停车的时候,东北边防部队看见入朝部队如此单薄的衣装大吃一惊,立即动员干部战士脱下身上的衣帽换给这些部队,但数量极少,而且部队停车时间极短,连当时脱下的衣服很多来不及送上列车。这些被冻得瑟瑟的 部队依旧士气高昂,在缺乏地图的情况下,雄赳赳气昂昂地跨过了鸭绿江,隐没在朝鲜冰雪皑皑的群山中。因为美军的空中优势,白天无法行动,只能在夜间行军赶路。当地朝鲜人冬季晚上都不到户外的,而志愿军则要雪夜行军。在第一天行军中,就冻伤了700余人。志 愿军每个班只有1~2床棉被,士兵休息时,将它垫在雪地上,大家挤在被子上只是保持不被冻僵,根本谈不上取暖。美军白天掌握着制空权,九兵团本来稀少的汽车也被炸得所剩无几。志愿军辎重装备无法运送,所有重型装备都被留在后方,部队轻装携轻便火炮徒步行军 。 由于体力有限,部队只到战斗打响前这些部队少至两天,多至9天已经没有吃上一顿热饭,有的只能靠打死的马匹和牲畜为生那时候还没有开始用炒面作口粮。在冷得浑身战抖的同时,还得靠吃冰雪解渴。
      
         沿长津湖行进的美军部队主力是海军陆战一师,这支部队是美国的骄傲。陆战一师参加过太平洋战争中瓜岛和冲绳最艰苦的战斗,与誓死不降拼命作战的日军精锐浴血奋战,而且所向披靡。在太平洋战争中,曾有陆战1师的美军士兵用手紧握手榴弹伸进日军地堡爆炸, 防止日军手榴弹推出,可见其战斗精神非比一般。当听到美军步兵第7师已经进入鸭绿江边惠山镇的消息后,这支部队高昂的士气达也到了顶峰,尽管严寒也出乎美军意料,但他们利用空投补充防寒装备,一路大踏步地向北推进。
      
         11月27日,长津湖一带开始普降大雪,气温到了摄氏零下40多度,气候严寒给作战和弹药补给都带来了极大困难,但是为了抓住美军兵力拉得分散、尚未发现志愿军集结的有利时机,九兵团果断决定发动进攻。
      
         黄昏,在冰天雪地里已经隐蔽守侯了6天,而且又冻又饿的志愿军九兵团义无返顾地向强大的“联合国军”起了猛烈突袭。两支王牌军在冰天雪地中,展开了人类历史上罕见的惨烈交锋。
      
         对美军来说,志愿军的攻击来得很突然,部队仿佛是从地下冒出来一样向美军猛烈冲击。尽管此前志愿军派出过侦察分队潜入美军后方,有的还进行了破坏活动,美军侦察兵也曾发现长津湖附近山上有小股不明部队活动,但美军还是被打了个措手不及。第二十军和第二 十七军的步兵们经过一夜战斗,把一字纵队行进的机械化美军陆战第一师切成了四段。最初很多美国兵都是在睡袋里面被打死或者俘虏的。由于重型火炮全部未能跟进。只有少量轻便火炮伴随步兵行动,无法对迅速用坦克防护起来的美军防御阵地形成实质性威胁。志愿军携 带的迫击炮炮管因受冻收缩炮弹根本放不进去,轻机枪必须时常拨动枪机撞针才能保证随时都能打响,能用的武器只有步枪、冲锋枪、刺刀和手榴弹,手榴弹竟然成了“重武器”。
      
         当冲锋号吹响时,被冻得快神智不清的志愿军士兵立即从雪地爬起来,猛攻公路上的美军纵队,也有很多因为卧倒时间长已经被冻死没能起来,还有许多勇敢的士兵拖着被冻得坏死的腿冲锋。完全被钢铁包裹起来的美陆战第一师和美步兵第七师的部队同样是久经沙场的 王牌劲旅,老练且极其顽强。虽然被打了个措手不及,但美军的应变能力不俗,战术也很独特。他们将200辆坦克在几个被围地点迅速构成环形防御圈,顽强的支撑,机械化集中火力横扫潮水般进攻的志愿军部队。美军工兵在很短的时间里,冒着炮火迅速开辟临时机场或 空投场,一些美军飞机也顶着枪林弹雨降落,后撤伤员,同时运来武器弹药和御寒装备。美军夜间进行了顽强的防守,坚持白天再依靠强大的地空火力掩护,向攻击部队发动猛烈反扑。志愿军部队基本全是步兵,只配置了少量轻炮兵。装备多数是日制的友□叁八步枪,有部 分M1 卡宾枪和汤姆森冲锋枪,轻机枪是捷克式、布伦式等。步行翻山越岭携带迫击炮炮弹也很有限,相对于美军的自动武器和坦克装甲车,志愿军火力严重不足。志愿军的步兵在战斗中是不太可能得到自己多少炮火支援的,伴随步兵的志愿军炮兵只有少得可怜的弹药,因此只能 靠丰富的战斗经验和顽强的战斗意志,尽可能隐蔽接近到手榴弹投掷距离,然后突然投出大量手榴弹,紧接着发动猛烈冲击,以此战术打垮对手。
      
         夜幕是这种战术最好的保护伞,志愿军的士兵们能利用夜色风雪掩护,隐蔽接近公路上的美军。志愿军最大的敌人是严寒。 部队毫无寒区作战经验,冻伤减员异常严重,大大超过了战斗减员。就是在这样情况下,还一再成功突入美军阵地,但都因火力不足,冻伤严重,不能于当晚解决战斗,天亮后遭到美军凶猛的反击又不得不一再撤出。美陆战第一师确实是美国军队中最为凶悍的部队,西方人 内心的荣誉与尊严,促使美军士兵也战斗得异常凶猛顽强。为对付志愿军近战,美军不断向附近发射照明弹,将战场照得如同白昼。他们用加兰德步枪和勃郎宁自动步枪、机枪、M3冲锋枪等构成密集的近防火力圈,拼命开火阻挡志愿军浪潮般的突然进攻,大口径机枪和迫 击炮配合坦克拦截远处不断运动接近的志愿军散兵线。美军士兵后来称这种不间断的拼命齐射为“疯狂时刻”。一些美军的机枪由于整夜都在连续射击,在零下40度的气温里也打得滚烫而产生卡壳。美军炮兵迅速展开牵引榴弹炮对周围山地上的目标开火,用炮火配合飞机 将志愿军可能隐蔽接近的地段反复的“犁”。美军依仗强大的火力压制四处冒出来的志愿军进攻部队,很快稳住了战线,争取时间建立自己的袋形防御阵地。即便是美军精良的武器装备在严寒中也麻烦不断。有些枪支被冻住撞针瞎火,车辆熄火,稍不注意发动机水箱就被冻 裂等等。
      
         十个小时连续的战斗使美军的武器也达到了使用的极限,黎明时分,一些机枪发生卡壳。部分美军携带的弹药也快耗尽,志愿军的攻势却仿佛没完没了。“只要美军火力稍弱,四处就响起冲锋号和哨声、喇叭声, 又冒出凶猛进攻的中国人和横飞的手榴弹”。一些美军士兵祈祷剩下的弹药能撑到天亮空投的时候。长津湖全线整个晚上都在猛烈的交战,第一夜战斗打成了胶着状。在夜间的战斗中,经验丰富的美军发现志愿军比瓜岛和冲绳的日军难对付,那些曾令美军胆寒的日军敢死队 只是些刻板冲锋的呆瓜而已,尽管狂热和气势汹汹,但很多缺乏战斗经验,用机枪一下就能扫倒大片。而志愿军步兵却冷静和老练得多,遇上扫射就迅速卧到,利用地形不断跃进,有时候一个班集中火力也不容易打中不断运动靠近的志愿军步兵。美军上尉斯比尔描述“我们 飞机和大炮的火力是相当强的,经过几十分钟压制的轰炸与轰击之后,满以为敌人的阵地一定已经被摧毁了,而且飞机的侦察也向我们证实这一点,但是当我们的步兵向前冲锋夺取敌阵的时候,却遭到密集的机关枪与手榴弹回击,我们真不明白敌人那边是怎么回事”整个2 8日白天,美军都在设法打通被截断各部阵地。美军指挥官们意识到遇上了“极其强硬的对手”,美国空军的文件也记载:中国军队是亚洲的一支游击军队,来自农民的士兵每天只吃很少一点口粮就能作长途行军。他们的士兵在中国的多年内战中已经习惯于夜间行军、作战 和昼间隐蔽了。中国军队善于偷偷摸摸行动,受过高度的训练,而且生活简朴,是联合国军地面和空中部队很难对付的敌手。 曾经战无不胜的美国陆战一师此刻终于明白再无继续推进的可能,剩下的事情就是如何突出重围了。美军战斗素质相当不错,美军指挥人员将航空兵和地面火力充分发挥到了极点,协同作战水平也非常高超,近距空中支援的飞机在两军相距50米的距离内仍然敢用凝固汽油 弹进行攻击,给志愿军阻击部队造成了惨重的伤亡。美军飞机沿志愿军可能的射击线投下大量的凝固汽油弹和高爆炸弹,所谓阵地只是全部积雪被烤干、焦黑滚烫的泥地,原先急造的简易掩体也早被美军炮火“翻耕”犁平了。接近阵地的双方士兵都是靠弹坑作掩护进行拉锯 战。柳潭里的美陆战第一师第五、第七团冒着严寒和漫天大雪连续5次凶猛冲击挡住其道路的二十七军第七十九师的 1282和1240高地。美军的燃烧弹将志愿军阵地炸成一片火海。双方在被烧得滚烫的焦土阵地上反复争夺,几度易手。下碣隅里的美军也拼命向第二十军的部队反扑。迎面相对冲锋的双方士兵打光弹夹中的子弹后,跟本来不及装填就已经撞在了一起,只好用工兵铲对 劈、刺刀对刺、枪托对砸。饥寒交迫的志愿军士兵体力不及身高马大的美军,在极其顽强的战斗意驱使下,用牙咬或拉响自己身上的手榴弹。
      
         还有些打红眼的美军士兵与志愿军士兵互相拉对方身上的手榴弹。整个阵地到处是一片枪声、爆炸声和喊声,还有劈断骨头的声音。两支劲旅相遇,战斗异常惨烈。战斗开始10个小时后,志愿军九兵团就减员达上万人。美军整个白天发挥最顽强的进攻精神并付出重大 伤亡后,依旧没有突出重围。志愿军迅速歼灭被围美军的企图也没有实现。
      
         28日夜幕降临后,志愿军又加强了凶猛的攻势。二十七军的第八十师不顾重大伤亡,向内洞峙美军步兵第七师第叁十二团一个营和炮兵、坦克各一部发动猛攻。凭借轻武器和手榴弹及肉搏战,将其指挥所摧毁。迫使剩余美军撤往新兴里。在极度饥饿、疲乏、很多士兵 被冻得神智不清的情况下,衣着蓝缕单薄的八十师坚忍不拔的步兵们,拖着冻坏的腿依旧顽强追击机械化的美军。少数部队虽于当晚一度突入新兴里,但因兵力不足,冻伤减员太大,只好撤出战斗。
      
         此时第八十师已经减员达叁分之二。二十军的五十八师通过极其艰难的浴血奋战将美军的阵地压缩。在这些战斗中,很多志愿军士兵早就打完了携带的弹药,靠拣美军的武器弹药继续战斗。战斗中伤员流血不太多,热血和伤口马上就被冻住了。中弹倒地的伤员因为寒冷 和伤痛不停的战抖,尽管很多伤员都极力支撑坚持作战,但不久就逐渐昏迷死去。在那种气温和场合,对于交战双方的人员来说受伤基本等于死亡。志愿军士兵都在战斗,伤员比战斗人员还多,没法全部救护。即便被救助后送,遥远的回程路上没有防寒被服伤员也支持不了 多久。志愿军将士的体力消耗已经到了极限,很多人被冻结在阵地上,但在荣誉、尊严和顽强意志的驱使下,凭借高超的作战技能,一直保持强劲的进攻势头。美军将士们的耐力也快发挥到极限了,很多美军士兵在2天的连续战斗中,仅凭借一小块巧克力支撑,还有的士兵 在连续2天战斗中,用报废了好几枝自动步枪,美军人员也有不少被冻结在地面上,要靠敲冰或撕扯衣裤才能爬起来。但美军物资条件毕竟比志愿军优越得多。幸亏有机械化车辆,美军才得以救下部分伤员。美步兵第七师师属第五十七炮兵营营长卡罗·D·曾顿斯中校评价 “中国兵这样多,这样顽强地反复进攻的事从未见过。”“他们冒着严寒和陆战队的炮火源源而来,其视死如归的精神令陆战队员们肃然起敬!”“对这场战斗,我感觉是强烈的,因为我失去了所有的战友。我们伤亡惨重。我从未见过像这样的战斗。我曾经在二战中,遇到 过德军最后一次大反攻,但也不似长津湖之战这样激烈。那情景真是不堪回首。”
      
         交战双方在经过了两天的全线混战后,才相互了解了对手的情况。志愿军发现柳潭里有美陆战第一师第五团2个营、第七团和炮兵第十一团2个营;新兴里有美步兵第七师第叁十一团两个营和第叁十二团第一营及师属炮兵第五十七营和坦克分队,下碣隅里为美陆战第一 师师部和第一团2个营、第五团1个营和1个坦克营;杜仓里为有美步兵第叁师第七团,这样,在柳潭里、新兴里、下碣隅里地区被围的美军部队,共有4个团、1个坦克营、3个炮兵营,总兵力为1万余人。比原来估计的数量竟然多出一倍。而美军也发现了志愿军的一些 新出现的番号有5个师之多。
      
         28日入夜后双方才开始作调整了。初生牛犊不畏虎的志愿军虽然战斗经验和技能经过10多年的战争已经炉火纯青,但由于出国作战与国内战争不同,而且言语不通,朝语联络员过少,当地基层政权解体或者软弱无力,情报来源不及时也不准确,使部队难以掌握敌情 和时机。志愿军的统率机关也缺乏外军知识,对美军的指挥系统、编制、装备、空中优势、机动能力等缺乏了解,甚至有误解。很多军官囿于国内战争的经验,把美军师、团、营等同于国民党军的编成和兵力、火力,形成错觉;这支军队此前没机械化的作战经验,对大规模 的机械化战争的特点认识不足。 尽管如此,中国人的智慧和狡诘依旧成功地在美国人眼皮底下将10余万军队瞒天过海,并把美军打了个措手不及。为了集中兵力各个歼灭美军,志愿军九兵团决定首先调集绝对优势兵力歼灭新兴里的美军部队,然后转移兵力逐个歼灭柳潭里、下碣隅里的美军。29日,第 八十师调整建制,整理战斗组织继续战斗,同时第八十一师主力会同第八十师围歼新兴里地区的美军。第二十七军预备队第九十四师准备随时投入战斗。为配合第二十七军攻歼新兴里之敌,同时决定第二十军第五十八师、第二十七军第七十九师也分别对下碣隅里、柳潭里的 美军进行钳制性攻击。第二十军第八十九师对杜仓里之美步兵第叁师第七团暂取守势。为准备第二步围歼柳潭里的美军,第二十军第五十九师暂归第二十七军彭德清军长指挥。此时,九兵团的26军还在陷在朝鲜北部山区的风雪中,他们已经断粮而且冻伤严重,正挣扎着赶 来增援。
      
         当志愿军刚开始运动部队调集兵力时,美军却先动了手。拥有各种先进侦察手段的美军的情报也没有比志愿军好多少。这导致美军一路大踏步的前进,虽有侦察兵发现少许志愿军活动的征候,却当作北朝鲜的散兵游勇。可见其指挥机关糊涂程度远在其对手之上。直到美 军遭到袭击并经过了两天异常艰苦的战斗后,才如梦方醒。美军发现整个部队分布在长达70公里的山沟里并被切成了数段,如不打通各袋形防御地域的交通联络,逐走当道据守的志愿军,很有可能在中国人没完没了的攻击下全军覆没。于是下碣隅里和古土里的美军部队, 分别向第二十军第五十八师和第六十师阵地猛烈进攻,企图打开接应新兴里和柳潭里美军部队的通道。
      
         29日拂晓,美陆战第一师部队在飞机坦克配合下来势汹汹,向下碣隅里东南角 1071。1高地发起一次又一次的猛烈冲击。1071。1高地处在新兴里、柳潭里和下碣隅里“Y”字型叁岔交点位置上,其地位对双方的重要不言而喻。据守高地的是第二十军第五十八师第一七二团第叁连第叁排,指挥员是第二十军著名的战斗英雄杨根思。不可否认 美军士兵的勇敢顽强,可惜他们这回一头撞上了更勇敢顽强的对手。 28岁的杨根思是新四军出身的老兵,参加过淮海战役等大小数十次战役战斗,多次荣立战功,长津湖战役前他已经是着名的战斗模范和爆破英雄。
      
         当29日上午10时,美陆战第一师发起八次冲击后,阵地上活着的人只剩下杨根思和两名伤员,所有的弹药已经打光了。增援部队尚在途中,美军又发起了第九次冲锋。这些身经百战的志愿军士兵对死亡和战斗已经习以为常,战斗对于他们就像农民的耕作,无所谓恐 惧和紧张。当面临人员伤亡殆尽,不可能再次守住阵地的时候,杨根思最惦记的是将那挺贵重的重机枪带走交给后面的部队,没有什么豪言壮语。两名快耗尽体力的伤员受命带着重机枪离开时,只是冒着炮火站直了冻饿数天的身子,给连长行了个军礼作为永别。当美军再次 冲上阵地时,杨根思引爆了炸药。随后不久,志愿军步兵们又顶着美军铺天盖地的炮火,向那个阵地发动了第十次反击。
      
         29日下午美军开始出败招了。古土里、堡后庄、真兴里地区的美陆战队第一师第一团1个步兵营和1个坦克营、英国皇家陆战队及韩军陆战队一部1000余人,在50 余架飞机的掩护下,向志愿军第二十军第六十师富盛里、小民泰里一线阵地猛烈进攻,企图打通与被包围的下碣隅里、新兴里、柳潭里美军部队之间的联系。这个特遣队有步兵2个连、坦克2个连(中型坦克20辆)、汽车160辆,美陆战队第一师预备指挥所和英军的第 41指挥分遣队,其最高指挥官是英军德赖斯代尔海军中校,所以这支特遣队就被称作“德赖斯代尔特遣队”。在四周都是大量不断突击的志愿军部队的情况下,这样的兵力出援于事无补。这支部队为对手创造了在运动中予以歼击的极好机会。
      
         对于火力薄弱的志愿军来说,离开袋形阵地运动的美军部队比固守的美军好对付得多。守卫富盛里的第二十军第一七九团这下终于逮住了机会,奋力狙击这支美军。很多志愿军士兵腰捆数颗手榴弹,仰卧在公路上,以自己的血肉之躯堵住敌人的钢铁怪物。但手榴弹奈何 不了坦克,却把后面的美英军步兵炸倒不少。战斗十分惨烈,并且双方都不顾一切。志愿军利用黄昏对手失去飞机掩护的有利情况下,对其实施坚决的反冲击。终于在入夜后将其包围在富盛里以北的公路上。
      
         经彻夜激战,特遣队已处于疲惫混乱状态。特谴队坦克用机枪和火炮为其步兵开路,但是在志愿军的火力狙击下,特谴队步兵无法跟上坦克,还是动弹不得。坦克步兵相互脱离,最后坦克大部分突围退回古土里, 而步兵分队全部被拉下。“这支失去了装甲车辆掩护的特谴队立刻被经验丰富的中国人分割成了许多小块,陷入混战中”。午夜后,志愿军派出被俘的美军劝降,而特谴队一名叫麦克劳林的美军少校仍幻想等天亮以后飞机来救援,企图拖延到早晨6点。但一七九团提出最后 通牒,限他在5分钟内投降。5分钟时间到,一七九团立刻发起攻击,遭到猛烈攻击后,仅存的240人的特谴队残部抵抗决心和待援希望全部瓦解,于是在麦克劳林少校率领下全体投降。其中美军中校1名,少校2名,英、美、土耳其军士兵179名,南朝鲜军 53名,日本人3名,国民党特工人员2名。在这个被美军称为“活地狱溪谷”的谷地,志愿军迫使了美军一个建制部队投降。
      
        29日14时,柳潭里的美陆战第一师部队向第二十七军第七十九师阵地攻击,并空投伞兵百余名配合。此前志愿军第七十九师部队已经伤亡惨重,但临时拼凑起来的人员依旧击溃了美军的这次猛烈进攻。11月30,被冻伤的九兵团副司令员陶勇亲临新兴里,指挥第八 十师和第八十一师主力和第二十七军全军炮兵,从东、西、南、北四个方向同时向新兴里美军猛烈攻击。提着“重武器”手榴弹的战士们蜂涌冲向美军的坦克防御圈内。美军坦克难以暇接和招架。由于距离太近,一些坦克的机枪和榴弹射到了其他坦克上。虽然前面冲锋的志 愿军被成群地扫到,但后面的步兵利用坦克炮塔转向另一面的时候,成功的接近坦克和冲进美军防御圈与美国兵血肉相搏。尽管美军同样亡命反击,但次日拂晓依旧被压缩至狭小地区。
      
         11月30日13时,第叁十一团长麦克劳恩上校见伤亡惨重,待援无望,便乘天色还早,用电台召来40余架飞机掩护,以10余辆坦克为先导,沿公路向南突围。美军的空军地面引导人员乘坐装甲车,在跟随大队后撤的同时,不断引导飞机用凝固汽油弹把道路附近 炸成一片火海,以阻止志愿军蜂拥接近。美军的飞行员技术高超,投弹轰炸距离之近,使一些美军车辆都被烤得直冒青烟。尽管有些接近公路的志愿军部队陷入火海,但稍远处的部队却仍然向快速撤退的美军追来。
      
         这种情景使经历过瓜岛血战的陆战一师的美军老兵也惊心动魄、目瞪口呆。志愿军的第八十师和第八十一师在伤亡惨重,有些步兵团在只剩几十个人的情况下仍然不停的进攻。不久,整个战斗全部变成了连续不断的混战,双方阵地混杂一团。前来支援的美军飞机开始无 法分清下面的部队是那一方,美军炮兵也只能对远处的志愿军增援进行遮断射击,而无法直接对特谴队进行炮火支援。在混战中,特遣队指挥官团长麦克劳恩上校被击毙。虽然美军出动大量航空兵掩护这支部队突围到泗水里和后浦地区,但人员所剩无几的志愿军八十师和八 十一师像猎犬一样紧咬不放,双方所有部队都已经乱了建制,指挥官无法传达任何命令,士兵也不可能收到什么上级命令。全部战斗都快成了小股人员漫山遍野的打斗和对射。在连续20多个小时的战斗和打斗中,特遣队继任指挥官费恩也被击毙。
      
         这种近距离的混战美军难以占上风。至12月1日,美军步兵第七师3000多人的特遣队被志愿军全部消灭,第31团的团旗被缴获。这是在朝鲜志愿军第27军创造的一次歼灭美军一个建制团的范例。
      
         12月1日,进至清津、惠山镇等地的美军开始向咸兴地区撤退,柳潭里的陆战第五团和第七团也在大量飞机坦克支援下全力冲出包围,向下碣隅里靠拢。而志愿军的冻饿减员已达到惊人的地步,战斗异常惨烈、悲壮。坚守死鹰岭1519主峰的五十九师一七七团临时 拼凑的一支部队英勇奋战,用收集来的手榴弹,铺天盖地的投向冲击的美军,总共打垮了敌人8次冲击。
      
         这片阵地上的积雪被炮火烤化,冷风一吹就又把剩余60多名志愿军守军都冻在泥雪中。当美军突围行动开始后,他们中多数人腿已经冻得坏死,被结在地上动弹不得,只能看着美军丢弃冻坏的重装备,沿着死鹰岭山下公路向东撤退。最后这些生还者由团指挥所和医护 人员撬开冰块背下来的。志愿军第八十一师第二四二团第五连奉命在美军撤退途中设伏。当战斗打响后,却无人站起来冲锋。已经展开战斗队形的整整一个连的干部战士,全部冻死在简易的掩体中。一百多人的连队,幸存者仅仅是一个掉队战士和传达命令的通讯员。第六十 师第一八零团二连在守卫黄草岭1081高地时全连都冻死在阵地上,许多士兵的手冻结在步枪上无法分开。
      
         这些顽强的士兵在连续几个昼夜摄氏零下40度的严寒中,没有一点热食进口,依旧静静的埋伏在冰冷的雪地里。美军从来没有经历过在如此恶劣天气下的如此强大和持续的进攻。只有陆战一师还保持着高昂的士气,在奋力打通路线。其他的部队全部被连续上百个小时 的战斗弄得疲惫不堪。所幸美军的航空兵一直在支撑周围的局面。飞机不停的连续轰炸,减缓了志愿军的追击和拦截。一些美军飞行员连续数十小时出动。由于美军航空兵的阻击,志愿军第二十六军虽然不顾一切地赶路,但山路遥远崎岖,部队陷在过膝大雪中连滚带爬地前 进,又遭到美军不停的轰炸,迟至12月6日晚才挣扎着到达预定位置。
      
         此前志愿军第六十师部队受命把从下碣隅里至古土里乃至真兴里道路上的桥梁全部炸毁,特别是下碣隅里向南到古土里之间的水门桥,以封锁美军南逃之路。
      
         12月4日,第六十师将架在峡谷的断崖上的水门桥炸毁。被阻在桥北机械化的美国陆战一师同志愿军的步兵围绕断崖附近的制高点进行了一番激烈争夺,美军调集一大批火力才好不容易阻止了志愿军的进攻势头。
      
         美国空军也在6日上午9时半,出动8架运输机,将8套钢制的车辙桥板和木制的车辙桥组件空投到古土里环状阵地内。当天美军的工兵就将水门桥架通。志愿军第二十军把被美军遗弃的车辆和坦克弄到路中间当路障, 并布设一些临时的爆炸物和狙击手。美军陆战第一师的工兵在坦克掩护下用推土机很快予以清除。
      
       美军工兵效率相当高,他们冒着射击抢修道路和桥梁。陆战第一师机械化作业的工兵分队很快修复桥梁和道路,甚至重新修筑了迂回的简易道路。当晚,美陆战第一师第五、第七团在志愿军密集的火力狙击下潮水般冲过水门桥,与先期到达的美陆战第一师师部和第一团会合 。此时,志愿军凭着双脚不停的追击机械化的美军。
      
         美军车辆在山下公路南撤,不停地与山上羚羊般奔跑追赶的志愿军步兵交火。有时掉队得只剩10多人的志愿军步兵却狂追着有坦克和汽车的上千美军。虽然一些志愿军零散部队抄到了美军前面发动狙击,但毕竟力量太弱,没法阻止美军大批的机械化部队。
      
         12月12日,陆战一师经过浴血奋战,终于与美军第叁师回合。在整个战役中虽然有不少南朝鲜部队跟随美军推进,但战斗打响后就很少能看见他们的影子。这些南朝鲜部队的士兵都是穷苦的市民和学生,以及一些日伪时期的旧军人。很多人是因为二战后生活艰难而 到军队谋生,没有见过什么大阵势。战斗开始后,这些部队就四散了,有些混杂在美军队伍中,有的凭借熟悉情况,干脆丢掉武器,换上平民服装抄小道跑回了兴南。现居住在韩国光州的金姓退休警察曾是南朝鲜老兵,在战争中跑过6次之多。志愿军部队也在战斗地域附近 遇上过不少这样形迹可疑、不兵不民的南朝鲜逃兵,因为战斗正酣,没有工夫搭理这些赤手空拳的人,随他们叁五成群地四散逃去。最后的追击战主要是志愿军的第二十六军和第二十七军,二十军已经筋疲力尽伤亡惨重,还因为追击美军跑得漫山遍野,正在设法收拢。
      
         十二月十七日,美军终于撤退抵达连浦兴南港地区,在其海空军的火力掩护下从海上撤回朝鲜南部。海军人员第一眼看见陆战队士兵是一幅人不人鬼不鬼的模样,他们胡子拉碴、眼窝深陷、衣裳蓝缕、走路遥遥晃晃,有的人衣服在战斗中破损,披了朝鲜百姓的衣服御寒 ;还有的人极度疲劳一到驻地倒地便睡着。一群叫花子般的陆战队员为了尊严,披着残破的大衣和拖拉着开了底的军靴整队高唱军歌行进。而狂追而来的中国人却保持着东方人特有的含蓄和耐性,先期到达兴南的小股部队只是用拣来的迫击炮闷头向城内美军开火。
      
         此时,兴南附近的山头全部在美国海军舰艇的炮火射程内,神经过敏的美国巡洋舰只要稍微发现山上有动静便开始进行炮击,那些美军的运输舰和驱逐舰也紧跟着开火。其实志愿军的26和27军主力部队还在几十公里外,冻饿得体力消耗到了极限,都快爬不动了,官 兵们靠拣食品和武器弹药勉强支撑着追击美军。
      
         那些掉队的美军士兵在遇到这些消瘦得像骷髅一般的中国士兵后,他们没有被俘的沮丧,更多的是获救的欣喜,因为如果不找到交战的任何一方并被收容的话,是很难在荒凉的冰天雪地里生存下去的。尽管战斗残酷和自己补给不足,美军俘虏被志愿军宽厚的收容对待。 那些连续作战断粮已经20余日的志愿军,却千方百计搜罗食物让美军被俘人员填饱肚子。
      
        中华民族宽容善良和坚忍不拔的优良品质在这些军人身上体现得很完美,以至于被俘的一些美军士兵战后选择永久定居在中国。同样被冻得半死的美军终于分批撤上了船,但在兴南港口堆积的大批军需物资没有时间装载撤走,于是在最后一批美军登船后,陆战队的 工兵们进行爆破,这大概是二战以来,除原子弹外的最大的一次爆炸,整个港口飞上了天,仓库和码头的钢梁被抛到数百米的空中。那些在几公里外山头上的志愿军士兵都被震倒,看着就快到手的大批的给养被这样毁掉,把这些20余天没有吃过几顿饭的这些士兵快心痛死 了。
      
        十二月二十四日,志愿军先头部队终于进入元山港、兴南地区及沿海港口,整个地区已经找不到任何一个美军士兵了。至此,这场历史上最悲壮艰苦的战役全部结束。
     
    =================================
            不管我们今天如何向美国人发誓我们离强大还差得远,都不可能让他们放心。经过朝鲜战争后我们已经不得不为声名所累,不得不为美国顽固的担忧和遏制付出代价。我们已经不可能再当麦克阿瑟眼中的纸老虎、幻想让韬光养晦的计谋得以瞒天过海。

      还可以数出很多这样的负面后果,它们在自己的角度上看都是真实的。

      但是,且让我们的脚向上抬一尺,再上一层楼。

      让目光将民族、国家和五百年江河日下的历史收在眼底…我们看到了什么?

      中国这本书在被世界打开之后,历史的每一页都在证明我们是劣等的黄色人种中的劣等民族。不需要在这里历数那数不清的屈辱篇章,最后的结果是,作为国家所经历的一切衰亡,在世人眼里意味着关于每一中国人的特质的判断:在智力、精神、体质、心灵等等的一切 方面,中国人本质上是低下的、奴性的、胆怯的、虚弱的、自私的。当每一个黄脸的中国人面对着西方人时,他都背负着这样的民族国家的命运给他烙下的这个先天判断,想把自己个人和民族分割开来的一切努力都是可笑的。不仅仅是敌人,就是中国人的西方同情者和朋友 ,也对中国人的精神状态抱着负面的评价。所以麦克阿瑟将中国当时的一切警告视为虚张声势的恫吓时,他其实是有理由的,就像李奇微所描述的,“麦克阿瑟动辄压制批评他的人,斥责他们根本‘不懂得东方人的思想’”。麦克阿瑟是懂得他眼睛中长期存在的那种东方人 的。他有充份根据藐视懦弱的中国人的言辞,因为即使赤色中国真的愚蠢地出兵,那将只是为他们创造了回到石器时代的机会。

      现在我们知道了,事实是麦克阿瑟“自己在判断敌人意图时,却完全误入歧途”,事实是万众视之若神的麦帅以最大的跟头结束了他的戎马生涯。但有多少人意识到了,晚节不保的麦克阿瑟所代表的转折性的历史意义,和对我们每一个中国人的生命意义?数百年里第一 次为我们每一中国人抹去了那种黑色胎记的,是那些藐视一切、胆大妄为、勇往直前的志愿军将士。是他们证明了懂得东方人的麦克阿瑟们不懂得东方人。许多西方历史书专门描述了他们化装成南韩军队大摇大摆地向美军哨兵枪口行进,并蒙混过关将敌营一举拿下的战例。 有哪些怯弱的人能受得住那向枪口行进中的心跳?有谁曾相信死气沉沉的黄种人可以演出这样的神奇活剧?

      所以,每一个要自尊的中国人,和民族一体,在五十年前重新出生了。朝鲜战争不仅是人们说的中国的“立国之战”,它还是我们每一个愿意当中国人东方人的个体的重新定义之战。这不仅仅指在西方人的眼里、在西方的价值体系中的地位,中国人曾经也不相信自己有 这样的精神状态和能力,自己认同那种先天判断的中国人曾经不是少数。没有朝鲜战争,中华人民共和国将会被广泛认为是由愚民所组成的三流国家,她在世界民族之林中的资格是没有证明的。日本根本上是被美国和苏联击败的,中共49年的胜利只是以国民党军队为坐标 ,这在美国人那里是不算数的。只有通过世界的,当代最严厉的考验,中国人的武装力量--那中国男人的精神力量的集中体现--才能让我们在世界的席位上安然入座。

      有人说过,任何民族在走向复兴的道路上,没有精神的复兴是不可能的,朝鲜战争为中华民族的复兴和强大提供了这样的最有力的精神支持。

      在“中国精神的百年跨越”一文中,我写道:

      “然后我想起朝鲜战场上的中国血。当今天的庸人们在为每一笔得失纠缠时,一切其实都是再清楚不过的事情。这是中国人第一次使用列强“同样的说话方式来赢得他们的尊重”。这回是美国的将军称中国人为勇士。当中国今天还这样站立着,是因为黄继光在前面,是 因为中国当年在上甘岭站立着。我们今天每时每刻都在感受到他们的尊严。这就是为什么印度人开航空母舰美国人可以熟视无睹,中国人却是模拟战中的恶梦。因为军事推理的前提来自近五十年前的长津湖和汉江雪:如果这样的士兵掌握了和我们同样的技术装备将会怎么样 ?”

      李奇微说:“要不是我们拥有强大的火力,经常得到近距离空中支援,并且牢牢地控制着海域,中国人可能已经把我们压垮了。”

      这就是那些在朝鲜殊死而战的中国人,他们改变了中国的位置,他们改变了我们的面孔,他们对我们每一个中国人有恩,他们给我们留下了无穷的精神财富,他们所获得的,超越了一切其他得失的评判。那些死在寒冷和烈火中的志愿军将士,是中国在世界史上死得最有 价值的中国人。我们谁有资格去“怜悯”这些英雄的生命的丧失?真正珍视他们生命的价值的,是坚持他们为之献身的那种精神财富。借口志愿军死伤重大而言他的人,其实没有必要掩饰自己的灵魂。在这里,人的内心阴阳晨暮,均洞若观火。这是因为那生和死筑成的分水 岭,是国家和人的价值的标尺,是人心的明镜。当你听到有人恣意嘲笑志愿军的时候,你只能感到对这些不具有基本的羞耻感的懦夫们的厌恶和怜悯。这种人只有三种可能:或者是极端的愚昧,或者是极端的奴性,或者两种兼而有之。曾经有一位以“忠贞报国”和“民主自 由”的口号来为林彪翻案的人,在同一篇文章里嘲弄志愿军不怕死是“愚昧”。你我只能为他也是黄种人也能讲中文而感到极大遗憾。除了与之割席而坐,你别无选择。

      在中华民族国家和人的历史长河中,朝鲜战争是凤凰迎风更生的火焰。

      中国人感谢为恢复国家和人的尊严而燃烧的志愿军将士们!!!
     
    Posted Jun 16 2006, 12:45 PM by wicky with 1 comment(s)
    Filed under:
  • C#中的Nullable Type和??操作符

    The ?? operator returns the left-hand operand if it is not null, or else it returns the right operand.

    以前我们会这么写:

    string param = Request.Params["param"];
    if ( param == null )
    {
        param = defaultValue;
    }

    string param = Request.Params["param"] == null ? defaultValue : Request.Params["param"];

    现在这么写就可以了:

    string params = Reqeust.Params["param"] ?? defaultValue;

    够简单了吧。 

    定义Nullable Type:

    int? a = null;
    int b = 1;
    int c = a??0 + b;

     

  • 起来起来起来起来!。。。

    2006世界杯Excel电子表格
    Posted Jun 07 2006, 12:25 PM by wicky with 1 comment(s)
    Filed under:
  • 法医故事 - 母爱

    http://blog.sina.com.cn/u/48ab86a00100024p


    当我看到肇事车辆的时候,它已经静静的停在交警队的院子里。一辆很普通的桑塔纳,如果不是绕到它的前面,你能看见前保险杠撞坏了一点,前挡风玻璃在最上面的地方破了,车顶的铁皮也有点凹陷,你还真看不出来这辆车仅仅在两天之前撞了人。
     
    其实这不是我的本职工作。检验车辆自然有专业人员,我并不懂该如何检验车辆。但是,在交通事故中我还是喜欢去看看肇事的车辆,如果能看得到的话。读到后面大家就会明白,那是因为这样可以让我知道我该重点检查死者或者伤者的哪个部位。
     
    这是一起司空见惯的交通事故。这辆桑塔纳把一个挑着担子的农民撞了。据肇事司机说这个农民挑着担子突然冲过来,他根本来不及刹车。周围的目击证人都没看清楚具体怎么回事,只听见一声闷响,车祸就已经发生了,被撞的人躺在地上,血流遍地,而货担里面的蔬菜撒了一地。
     
    坦率的说这种案件中我对肇事司机和受害人的证词(如果有的话)都不太相信。因为双方都会尽量想办法减轻自己的责任。这起案件被撞的人没有死。但他也说不了话了,我知道他两天前被撞了之后很快被送进了就近一家医院的骨科。
     
    拨了几个电话,很快我就知道管床的医生正好是我的一个朋友,平时我管他叫“铁匠”,他要去做手术了我会开玩笑:“又去打铁了?”
     
    我之所以叫他铁匠,是有两个原因,第一是他的确十分健壮,用北方话来说就是“浑身疙瘩肉”那种,很像我心目中的铁匠;第二个我在外科的经历让我知道,骨科医生拿着些什么髓内针、螺丝、钢板、钢丝之类的做手术的时候给我的感觉他们好像不是在做一个精密的手术,而是在打铁一样,甚至有可能因为比如说一块钢板和患者的骨胳并不完全符合等等原因,他们得要真的在手术台上把那块钢板拿来敲敲打打,呵呵。
     
    在他的带领下我很快走到就在护士办公室对面的重症监护室。这时候的伤者在日光灯的照射下显得特别的苍白。这应该原本是一个健壮的小伙子,我知道他19岁,高大的身材显得病床似乎应该再长一点。可是这个时候满身的医疗器械让他看上去有点怪异:头部裹着的绷带占据了大半个脑袋,众多的白纱布里面一边冒出一根橡胶管,看来这是个广泛的脑损伤,左右脑都由损伤,而且医生还认为有可能慢慢积起来的血液会再次挤压脑组织,所以干脆把淤血引出来。气管做了切开,呼吸机正在有规律的运动着;手上、脚上还都在输液;他的下肢则装了一个古怪的外固定架:5根钢针垂直从皮肤里面冒出来,然后又被一个充满关节的不锈钢家伙一起联接起来。这告诉我伤者可能是一个开放性粉碎性骨折;这种情况下内固定的钢板很难固定,而且容易引起感染,所以只好加上这麽个古怪的东西(当然它的好处也有的:可以随时调节)。
     
    受伤的部位和我想的一模一样:汽车的前保险杠撞在了他的左腿上,然后由于惯性的作用他倒向了汽车的挡风玻璃(这个可能和平常想象不一样,但是回忆一下初中的物理学你就会明白了),头部撞在了车顶和挡风玻璃之间,再然后他极有可能飞了出去,落在地上,虽然这次落地到底给他带来些什么损伤我还看不出来。不过到这里损伤就停止了,因为我没有看见象某些案件那样伤者身上还有因为刹车刹不住在伤者身上留下的碾压痕迹。
     
    但是目前我还看不出一些更具体的情况,比如说受伤者被撞的时候身体的姿态。如果说肇事司机说的是真的,那么伤者应该是侧面被撞击。但是目前伤者全身都是纱布,浑身又布满了医疗器械,我还真的没办法检查清楚。


    看来我只有求助于我的医生朋友了。车祸当晚铁匠亲自动的手术,加上又是管床医生,应该是对病人了如指掌的,先听了听铁匠对患者病情的意见。他很不乐观:患者的颅骨碎裂得很严重,手术中切开头皮颅骨几乎掉了下来;上矢状窦(紧贴颅骨的一根从前到后拇指粗细“血管”)严重撕裂,我知道这里的血窦直径很大,但是特殊的组织结构(缺乏有弹性的平滑肌)会让哪怕是修补的针眼都严重渗血,因此不到48小时两根头部的引流管已经引流出200ml淤血,按道理他想再做个CT,看看引流是否充分(留在颅内更加危险),但是家属没钱了;脑组织广泛挫伤,手术中他就不得不切除了部分坏死的脑组织,而且一边给颅骨开了一个大窗户,给脑组织减压;现在脑水肿严重,患者已经出现脑疝症状(脑组织严重受压,挤到了别的地方,这往往是死亡的前兆)。他甚至认为伤者之所以现在还活着只不过是因为年轻而旺盛的生命力,如果换一个年纪稍微大一点的现在早已经在太平间了。
     
    相形之下,患者腿部的粉碎性骨折只不过是疥癣之患,但是那却是我的关注焦点之一。我拿来了术前的X光片,想仔细研究一下。很遗憾不是所有的案件都会像教科书一样,教科书里这种情况会造成所谓的“楔形骨折”,也就是骨折碎片加起来好像一个三角形,尖端指着汽车行进的方向,而底面就是撞击面。我曾经在无数的交通事故中看见过这种骨折,它甚至能告诉我们逃逸车辆原来的行进方向;但是这一次它失灵了,5-6块碎骨一团乱麻一样彼此之间重叠着,交叉着,一个平面的X光片根本容纳不下这么多信息,只看见一团糟。
     
    我得说人体结构之复杂,会给我们带来很多困扰,比如说这种情况,如果是一截木棍被撞,那么它的断端指向的方向就是受力的方向,但是人体就不同了,碎裂的骨片会受到肌肉的牵拉,会受到组织的缠绕......
     
    正在我和我的朋友在护士办公室连比划带画图的讨论着他手术之中见到患者骨折情况的时候,我听到对面的病房传来的一声并不太响亮的女声:“卖牛!”只见一个中年男人走了出来,蹲在门口,愣愣的望着墙角,一声不响大口大口的抽着烟;一个女人走出来,嘴角带着坚强和委屈,眼眶红红的,显见刚才还哭过;手上拿着医院的一次性脸盆,到洗漱间去了。
     
    显见这是伤者的父母。我苦笑了一下,这也是我司空见惯的。肇事司机在法院判决之前玩一点赖皮屡见不鲜,甚至还有在判决之后还拒不执行的,现在离事故解决还早的很那,首先是20日之内我的鉴定书和车辆检测报告,然后是事故责任认定书,然后是可能旷日持久的诉讼......而家属显见来自农村,已经无力支付医疗费用。卖牛!我知道牛对农民意味着什么,那是来年的希望!
     
    我无言以对,我只能继续做好我的法医。


    我和铁匠的讨论不得不马上停止了,虽然我还是不得要领:医院又来了一个患者,一个玩滚轴的时候不小心(是单纯的不小心吗?)从两米高处摔下的孩子,显然他的脚骨折了。我不禁哑然失笑,我们的电视台在拍摄这种运动复杂技巧的时候手段可以称得上是炉火纯青,连我这个外行都觉得看得目眩神迷,但是是不是也该给孩子们一个提醒,这项运动也是有风险的呢?

    我觉得我和铁匠这次沟通最大的障碍是由于我们职业的不同造成的:他关心的是患者的治疗,比如说下肢的骨折他关心的是能不能很好的复位,会不会有死骨形成;而我关心的是损伤的机制以及成因,但这却不属于他的职业范围,因此每当遇到这样的问题的时候,我还是必须自己去看X片,所以放射科的医生也很熟悉了,我转身来到了放射科,既然腿部的骨折没帮上我什么忙,我只有在头部的CT片上碰碰运气了。

    我得感谢美国这个品牌的螺旋CT。一般的CT显示的都是一个个人体的横断面,但是这台CT(当然只能在医生的电脑上,或者确切的说是图形工作站上)却可以根据这些横断的影像资料把颅骨三维重建起来,结果是我可以对患者的颅骨任意角度任意切面进行观察,而这一切我都只需要把鼠标拖拽几下。没有它的帮助我可就麻烦多了:在我读本科的时候根本还没有横断解剖这门功课,CT片我勉强能看懂,但是要在心里形成这样的一个三维图像就不可能了。

    这一切都不是科幻,我得告诉大家我写的最多算纪实,决不会出现任何科幻的成分。我一直对这套系统垂涎三尺,但是无论是它的硬件还是软件的价格都让我望而却步;好在我最近好不容易弄到了一套可以在我的个人电脑上完成这一过程的软件,虽然它没有放射科的那么完美;这就是为什么当我的评论中出现了一位参加过虚拟人软件设计的技术人员我会那么激动的原因。

    在放射科这套软件的帮助下我很快弄清了车祸撞击的过程:当然最先还是桑塔纳最突出的前保险杠撞在了伤者的腿部;然后是车辆的挡风玻璃和车顶交界处撞到了伤者的后脑,造成了一个凹陷性骨折;然后是伤者飞出去,撞在坚硬的地面造成了一个所谓“同心圆”骨折(好像我们在桌子上打鸡蛋,鸡蛋的裂缝会由一个个环形组成,中间再加上一根根放射状排开的裂缝);这两者是如此的不同以至于我一眼就可以区别出它们,然后我还可以根据所谓的“T”字原则证实我的判断:当由后一次撞击造成的骨折遇到前一次撞击造成的骨折的时候,会不再往下延伸,在局部形成一个小小的“T”字(显然先撞倒车上才会飞出去撞倒地上);这也解释了为什么铁匠做手术的时候会颅骨几乎掉下来:一前一后两处骨折由于这些骨折线交汇在了一起。

    这证明肇事司机在撒谎。显然伤者正好好走在路上(但他也没有按照交通规则走在人行道上),司机由于某种缘故没有看见他,甚至没有减速就重重的撞在了行人的身上;至于是什么缘故或者说司机当时到底在干什么这就不是我的专业范围了,不过按交警朋友的说法,肇事司机后来承认他当时在接电话(这又是一个司空见惯的原因!)。

    我的工作告一段落了,因为关系到责任认定这一部分的鉴定书是有期限的,我必须在20天以内完成。但是我的工作并没有结束,因为还有伤者的最后损伤程度以及后遗症的鉴定很有可能还是会由我来完成(这一部分由于现在还在治疗中,显然我无法完成)。所以每次有机会(这些机会要么是交通事故,要么是人体伤害给我的)去铁匠那家医院,我都会顺便了解一下伤者的情况,一个月过去了,奇迹没有发生,伤者还离不开呼吸机,也就是说他脑干管理呼吸运动的那一部分最基本的生命中枢还没有任何活力;铁匠是一个极端负责的医生,我亲眼见过他因为病情紧急而在医院走廊上奔跑的情景:走廊的地面会因为他而震动,每次出现这种情形我都会会心的微笑着,因为我也曾经是这样的一名外科医生。我总是在想这种震动可能可以赶走死神吧?但是这一次他也灰心了,因为一个月后再苏醒的可能性就极小了;而这个时候家属不仅是把牛卖了,房子也搭了进去,可是在这种情况下这一点钱够干什么?房子的钱还不够一个礼拜的医疗费用(农村的房子本来就不值钱,还急着要脱手)。铁匠也很心痛,甚至组织了一次医院的募捐,但是还是杯水车薪,无济于事。伤者的父母分成了两拨,父亲在老家专门借钱,我可以想像他会因为借贷无门在故乡渡过了多少个不眠之夜;母亲则在医院照看着孩子,因为实在是没有钱进行“全静脉营养”(这种情况伤者不能吃东西,营养需要通过静脉补充),她甚至学会了用胃管注射牛奶;但是伤者还是一天天瘦弱下去,而且看不到任何苏醒的迹象。

    这一天铁匠实在是忍受不了了,他给伤者做了一个脑电图:没有任何迹象表明伤者还有脑部的活动,他开始劝伤者的母亲放弃。但伤者母亲唯一的回应是当天拿出了卖血的钱要求再给儿子注射一次静脉营养。


    (今天,恰巧是三八妇女节,谨以此