2007年11月19日

这是Solid State Group网站上的一篇很友好的文章,解决了我在设计中遇到的很多问题,故在此我翻译其文,并对原作者表示非常感谢!

查看原文:http://diger.cn/blog/?p=324
英文地址:  http://www.solidstategroup.com/page/1592

1、说明本文阐述了8条我们发现的在用CSS设计中有用的解决方案。

2、浏览器特定的选择器

当你想在一个浏览器里改变样式而不像在其他浏览器中改变时,这些选择器很有用。

IE6以下

   *html{}

IE 7 以下

*:first-child+html {} * html {}

只对IE 7

*:first-child+html {}

只对IE 7 和现代浏览器

html>body {}

只对现代浏览器(非IE 7)

html>/**/body {}

最新的Opera 9以下版本

html:first-child {}

Safari

html[xmlns*=”"] body:last-child {}

要使用这些选择器,请在样式前写下这些代码。例如:

#content-box {
width: 300px;
height: 150px;
}
* html #content-box {
width: 250px;
}
/* 重写上面的代码并且把宽度改为250PX
在IE6以下版本中适用。 */

3、在IE6中使用透明PNG图片

IE6的一个很难处理的BUG就是它不支持透明PNG图片。

你可能需要用一个重写的CSS的滤镜来解决这个问题:

*html #image-style {
background-image: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=”fil
ename.png”, sizingMethod=”scale”);
}

4、去掉连接虚线框

当你点击链接时,Firefox会在链接周围产生一个虚线外框。

这个很好解决,只需在a标签中添加outline:none就可以了。

a{
   outline:none;
}

5、对inline元素应用宽度。

如果你对一个inline元素使用宽度,它将只在IE6下起作用。

所以的HTML标签要么是Block的要么就是inline的。inline属性的标签有<span><a><strong>和<em>Block标签包括<div><p><h1><form>和<li>

你不能控制inilne标签的宽带,不过有一个方法是把标签属性从inline改为Block。

span{
   width:150px;
   display:block;
}

应用display:block能够把span标签变成block标签,从而控制它的宽度。

6、使一个固定宽度的网站居中。

为了让你的网站在浏览器中居中,可以为最外层Div添加position:relative属性,然后将margin设为auto。

#wrapper {
margin: auto;
position: relative;
}

7、图片替换技术

对于头部来说,永远是最好用文字而不是图片。在你必须要用图片的某个特殊地方最好使用隐藏文字的层的背景图片。这对于屏幕阅读和SEO非常有用,尽管依然使用很普通的文字,这可以联想到所有的优点。

HTML:

<h1><span>Main heading one</span></h1>

CSS:

h1 {
background: url(heading-image.gif) no-repeat;
}
h1 span {
position:absolute;
text-indent: -5000px;
}

正如你所见,我们对H1标签使用普通的HTML代码,用CSS来将图片替代文字。Text-indent把文字放到左边5000像素处,从而用户看不到它们。

8、最小宽度

IE的另外一个Bug就是它不支持min-width属性。min-width确实非常有用,特别是对于100%宽度的可变模板来说,因为他告诉浏览器停止收缩。

对于除IE6以外的所有浏览器来说你只需min-width:xpx;例如:

.container {
min-width:300px;
}

要让这些在IE6下起作用的话你要添加额外的努力!你需要创建两个DIV,一个包含着另一个。

<div class=”container”>
<div class=”holder”>Content</div>
</div>

然后你需要设置外面层的min-width:

.container {
min-width:300px;
}

现在又要IE hack起作用了,你需要写下以下代码:

* html .container {
border-right: 300px solid #FFF;
}
* html .holder {
display: inline-block;
position: relative;
margin-right: -300px;
}

当浏览器窗口调整外层宽度来适应直到它缩小到border的宽度时,这个时候它就不能够在缩小了。而holder层也会停止收缩。外层的边框宽度变成了内层的最小宽度。

9、隐藏水平滚动

要去除水平滚动条,可以在body中插入overflow-x:hidden属性。

body {
overflow-x: hidden;
}

这在你决意要用一个比浏览器款的图片或Flash时很有用。

2007年09月16日

Web开发的发展

    在过去一些的时候,Web开发人员并没有太多的去关注内存泄露问题。那时的页面间联系大都比较简单,并主要使用不同的连接地址在同一个站点中导航,这样的设计方式是非常有利于浏览器释放资源的。即使Web页面运行中真的出现了资源泄漏,那它的影响也是非常有限而且常常是不会被人在意的。

    今天人们对Web应用有了高更的要求。一个页面很可能数小时不会发生URL跳转,并同时通过Web服务动态的更新页面内容。复杂的事件关联设计、基于对象的JScript和DHTML技术的广泛采用,使得代码的能力达到了其承受的极限。在这样的情况和改变下,弄清楚内存泄露方式变得非常的急迫,特别是过去这些问题都被传统的页面导航方法给屏蔽了。

    还算好的事情是,当你明确了希望寻找什么时,内存泄露方式是比较容易被确定的。大多数你能遇到的泄露问题我们都已经知道,你只需要少量额外的工作就会给你带来好处。虽然在一些页面中少量的小泄漏问题仍会发生,但是主要的问题还是很容易解决的。

泄露方式

    在接下来的内容中,我们会讨论内存泄露方式,并为每种方式给出示例。其中一个重要的示例是JScript中的Closure技术,另一个示例是在事件执行中使用Closures。当你熟悉本示例后,你就能找出并修改你已有的大多数内存泄漏问题,但是其它Closure相关的问题可能又会被忽视。

现在让我们来看看这些个方式都有什么:

 1、循环引用(Circular References) — IE浏览器的COM组件产生的对象实例和网页脚本引擎产生的对象实例相互引用,就会造成内存泄漏。这也是Web页面中我们遇到的最常见和主要的泄漏方式;

 2、内部函数引用(Closures) — Closures可以看成是目前引起大量问题的循环应用的一种特殊形式。由于依赖指定的关键字和语法结构,Closures调用是比较容易被我们发现的;

 3、页面交叉泄漏(Cross-Page Leaks) — 页面交叉泄漏其实是一种较小的泄漏,它通常在你浏览过程中,由于内部对象薄计引起。下面我们会讨论DOM插入顺序的问题,在那个示例中你会发现只需要改动少量的代码,我们就可以避免对象薄计对对象构建带来的影响;

 4、貌似泄漏(Pseudo-Leaks) — 这个不是真正的意义上的泄漏,不过如果你不了解它,你可能会在你的可用内存资源变得越来越少的时候极度郁闷。为了演示这个问题,我们将通过重写Script元素中的内容来引发大量内存的"泄漏"。

循环引用

    循环引用基本上是所有泄漏的始作俑者。通常情况下,脚本引擎通过垃圾收集器(GC)来处理循环引用,但是某些未知因数可能会妨碍从其环境中释放资源。对于IE来说,某些DOM对象实例的状态是脚本无法得知的。下面是它们的基本原则:

 

Figure 1: 基本的循环引用模型

    本模型中引起的泄漏问题基于COM的引用计数。脚本引擎对象会维持对DOM对象的引用,并在清理和释放DOM对象指针前等待所有引用的移除。在我们的示例中,我们的脚本引擎对象上有两个引用:脚本引擎作用域和DOM对象的expando属性。当终止脚本引擎时第一个引用会释放,DOM对象引用由于在等待脚本擎的释放而并不会被释放。你可能会认为检测并修复假设的这类问题会非常的容易,但事实上这样基本的的示例只是冰山一角。你可能会在30个对象链的末尾发生循环引用,这样的问题排查起来将会是一场噩梦。

    如果你仍不清楚这种泄漏方式在HTML代码里到底怎样,你可以通过一个全局脚本变量和一个DOM对象来引发并展现它。

 <html>
    <head>
        <script language="JScript">
        var myGlobalObject;
        function SetupLeak()
        {
            // First set up the script scope to element reference
            myGlobalObject = document.getElementById("LeakedDiv");

            // Next set up the element to script scope reference
            document.getElementById("LeakedDiv").expandoProperty = myGlobalObject;
        }

        function BreakLeak()
        {
            document.getElementById("LeakedDiv").expandoProperty = null;
        }
        </script>
    </head>
    <body onload="SetupLeak()" onunload="BreakLeak()">
        <div id="LeakedDiv"></div>
    </body>
</html>

 你可以使用直接赋null值得方式来破坏该泄漏情形。在页面文档卸载前赋null值,将会让脚本引擎知道对象间的引用链没有了。现在它将能正常的清理引用并释放DOM对象。在这个示例中,作为Web开发员的你因该更多的了解了对象间的关系。

    作为一个基本的情形,循环引用可能还有更多不同的复杂表现。对基于对象的JScript,一个通常用法是通过封装JScript对象来扩充DOM对象。在构建过程中,你常常会把DOM对象的引用放入JScript对象中,同时在DOM对象中也存放上对新近创建的JScript对象的引用。你的这种应用模式将非常便于两个对象之间的相互访问。这是一个非常直接的循环引用问题,但是由于使用不用的语法形式可能并不会让你在意。要破环这种使用情景可能变得更加复杂,当然你同样可以使用简单的示例以便于清楚的讨论。

<html>
    <head>
        <script language="JScript">

        function Encapsulator(element)
        {
            // Set up our element
            this.elementReference = element;

            // Make our circular reference
            element.expandoProperty = this;
        }

        function SetupLeak()
        {
            // The leak happens all at once
            new Encapsulator(document.getElementById("LeakedDiv"));
        }

        function BreakLeak()
        {
            document.getElementById("LeakedDiv").expandoProperty = null;
        }
        </script>
    </head>
    <body onload="SetupLeak()" onunload="BreakLeak()">
        <div id="LeakedDiv"></div>
    </body>
</html>

 

 更复杂的办法还有记录所有需要解除引用的对象和属性,然后在Web文档卸载的时候统一清理,但大多数时候你可能会再造成额外的泄漏情形,而并没有解决你的问题。

这一节讲Closures引起的内存泄漏,最后我还是决定把Closures翻译成了闭包或闭包函数。而且又在KB中看到一个对Closures的解释,它是这么说的:

<HTML>
<HEAD>
<script language="javascript">
function initpage()
{
    window.setTimeout("window.location.reload()", 500, "javascript");
}
</script>
</HEAD>
<body onload="initpage()" >
<div class=’menu’ id=’menu’></div>
<script language=’javascript’>
hookup(document.getElementById(‘menu’));
function hookup(element)
{
    element.attachEvent( "onmouseover", mouse);
    function mouse ()
    {
    }
}
</script>
</body>
</HTML>

 

In this code, the handler (the mouse function) is nested inside the attacher (the hookup function). This arrangement means that the handler is closed over the scope of the caller (this arrangement is named a "closure").


 

闭包函数(Closures)

    由于闭包函数会使程序员在不知不觉中创建出循环引用,所以它对资源泄漏常常有着不可推卸的责任。而在闭包函数自己被释放前,我们很难判断父函数的参数以及它的局部变量是否能被释放。实际上闭包函数的使用已经很普通,以致人们频繁的遇到这类问题时我们却束手无策。在详细了解了闭包背后的问题和一些特殊的闭包泄漏示例后,我们将结合循环引用的图示找到闭包的所在,并找出这些不受欢迎的引用来至何处。

 

 

Figure 2. 闭包函数引起的循环引用

    普通的循环引用,是两个不可探知的对象相互引用造成的,但是闭包却不同。代替直接造成引用,闭包函数则取而代之从其父函数作用域中引入信息。通常,函数的局部变量和参数只能在该被调函数自身的生命周期里使用。当存在闭包函数后,这些变量和参数的引用会和闭包函数一起存在,但由于闭包函数可以超越其父函数的生命周期而存在,所以父函数中的局部变量和参数也仍然能被访问。在下面的示例中,参数1将在函数调用终止时正常被释放。当我们加入了一个闭包函数后,一个额外的引用产生,并且这个引用在闭包函数释放前都不会被释放。如果你碰巧将闭包函数放入了事件之中,那么你不得不手动从那个事件中将其移出。如果你把闭包函数作为了一个expando属性,那么你也需要通过置null将其清除。

    同时闭包会在每次调用中创建,也就是说当你调用包含闭包的函数两次,你将得到两个独立的闭包,而且每个闭包都分别拥有对参数的引用。由于这些显而易见的因素,闭包确实非常用以带来泄漏。下面的示例将展示使用闭包的主要泄漏因素:

<html>
    <head>
        <script language="JScript">

        function AttachEvents(element)
        {
            // This structure causes element to ref ClickEventHandler
            element.attachEvent("onclick", ClickEventHandler);

            function ClickEventHandler()
            {
                // This closure refs element
            }
        }

        function SetupLeak()
        {
            // The leak happens all at once
            AttachEvents(document.getElementById("LeakedDiv"));
        }

        function BreakLeak()
        {
        }
        </script>
    </head>
    <body onload="SetupLeak()" onunload="BreakLeak()">
        <div id="LeakedDiv"></div>
    </body>
</html>

 

    如果你对怎么避免这类泄漏感到疑惑,我将告诉你处理它并不像处理普通循环引用那么简单。"闭包"被看作函数作用域中的一个临时对象。一旦函数执行退出,你将失去对闭包本身的引用,那么你将怎样去调用detachEvent方法来清除引用呢?在Scott Isaacs的MSN Spaces上有一种解决这个问题的有趣方法。这个方法使用一个额外的引用(原文叫second closure,可是这个示例里致始致终只有一个closure)协助window对象执行onUnload事件,由于这个额外的引用和闭包的引用存在于同一个对象域中,于是我们可以借助它来释放事件引用,从而完成引用移除。为了简单起见我们将闭包的引用暂存在一个expando属性中,下面的示例将向你演示释放事件引用和清除expando属性。

<html>
    <head>
        <script language="JScript">

        function AttachEvents(element)
        {
            // In order to remove this we need to put
            // it somewhere. Creates another ref
            element.expandoClick = ClickEventHandler;

            // This structure causes element to ref ClickEventHandler
            element.attachEvent("onclick", element.expandoClick);

            function ClickEventHandler()
            {
                // This closure refs element
            }
        }

        function SetupLeak()
        {
            // The leak happens all at once
            AttachEvents(document.getElementById("LeakedDiv"));
        }

        function BreakLeak()
        {
            document.getElementById("LeakedDiv").detachEvent("onclick",
                document.getElementById("LeakedDiv").expandoClick);
            document.getElementById("LeakedDiv").expandoClick = null;
        }
        </script>
    </head>
    <body onload="SetupLeak()" onunload="BreakLeak()">
        <div id="LeakedDiv"></div>
    </body>
</html>

在这篇KB文章中,实际上建议我们除非迫不得已尽量不要创建使用闭包。文章中的示例,给我们演示了非闭包的事件引用方式,即把闭包函数放到页面的全局作用域中。当闭包函数成为普通函数后,它将不再继承其父函数的参数和局部变量,所以我们也就不用担心基于闭包的循环引用了。在非必要的时候不使用闭包这样的编程方式可以尽量使我们的代码避免这样的问题。

    最后,脚本引擎开发组的Eric Lippert,给我们带来了一篇关于闭包使用通俗易懂的好文章。他的最终建议也是希望在真正必要的时候才使用闭包函数。虽然他的文章没有提及闭包会使用的真正场景,但是这儿已有的大量示例非常有助于大家起步。

这一节非常的让人郁闷,不管是翻译过程还是文章内容本身。居然对DOM的这样简单操作区别都可以带来这么大的泄漏问题,真的是没有语言了。看完后欢迎说说你的感受,我的感受附在了文尾。


页面交叉泄漏(Cross-Page Leaks)

 

    这种基于插入顺序而常常引起的泄漏问题,主要是由于对象创建过程中的临时对象未能被及时清理和释放造成的。它一般在动态创建页面元素,并将其添加到页面DOM中时发生。一个最简单的示例场景是我们动态创建两个对象,并创建一个子元素和父元素间的临时域(译者注:这里的域(Scope)应该是指管理元素之间层次结构关系的对象)。然后,当你将这两个父子结构元素构成的的树添加到页面DOM树中时,这两个元素将会继承页面DOM中的层次管理域对象,并泄漏之前创建的那个临时域对象。下面的图示示例了两种动态创建并添加元素到页面DOM中的方法。在第一种方法中,我们将每个子元素添加到它的直接父元素中,最后再将创建好的整棵子树添加到页面DOM中。当一些相关条件合适时,这种方法将会由于临时对象问题引起泄漏。在第二种方法中,我们自顶向下创建动态元素,并使它们被创建后立即加入到页面DOM结构中去。由于每个被加入的元素继承了页面DOM中的结构域对象,我们不需要创建任何的临时域。这是避免潜在内存泄漏发生的好方法。

 <html>
    <head>
        <script language="JScript">
        function LeakMemory()
        {
            // Do it a lot, look at Task Manager for memory response
            for(i = 0; i < 5000; i++)
            {
                hostElement.text = "function foo() { }";
            }
        }
        </script>
    </head>
    <body>
        <button onclick="LeakMemory()">Memory Leaking Insert</button>
        <script id="hostElement">function foo() { }</script>
    </body>
</html>

    如果你运行上面的示例代码并使用任务管理器查看,当从"泄漏"页面跳转到空白页面时,你并不会注意到任何脚本泄漏。因为这种脚本泄漏完全发生在页面内部,而且当你离开该页面时被使用的内存就会回收。对于我们原本所期望的行为来说这样的情况是糟糕的。你希望当重写了脚本内容后,原来的脚本对象就应该彻底的从页面中消失。但事实上,由于被覆盖的脚本对象可能已用作事件处理函数,并且还可能有一些未被清除的引用计数。正如你所看到的,这就是貌似泄漏。在表面上内存消耗量可能看起来非常的糟糕,但是这个原因是完全可以接受的。

总结

    每一位Web开发员可能都整理有一份自己的代码示例列表,当他们在代码中看到如列表中的代码时,他们会意识到泄漏的存在并会使用一些开发技巧来避免这些问题。这样的方法虽然简单便捷,但这也是今天Web页面内存泄漏普遍存在的原因。考虑我们所讨论的泄漏情景而不是关注独立的代码示例,你将会使用更加有效的策略来解决泄漏问题。这样的观念将使你在设计阶段就把问题估计到,并且确保你有计划来处理潜在的泄漏问题。使用编写加固代码(译者注:就是异常处理或清理对象等的代码)的习惯并且采取清理所有自己占用内存的方法。虽然对这个问题来说可能太夸张了,你也可能几乎从没有见到编写脚本却需要自己清理自己占用的内存的情况;使这个问题变得越来越显著的是,脚本变量和expando属性间存在的潜在泄漏可能。

    如果对模式和设计感兴趣,我强烈推荐Scott的这篇blog,因为其中演示了一个通用的移除基于闭包泄漏的示例代码。当然这需要我们使用更多的代码,但是这个实践是有效的,并且改进的场景非常容易在代码中定位并进行调试。类似的注入设计也可以用在基于expando属性引起的循环引用中,不过需要注意所注册的方法自身不要让泄漏(特别使用闭包的地方)跑掉。

About the author 

    Justin Rogers recently joined the Internet Explorer team as an Object Model developer working on extensibility and previously worked on such notable projects as the .NET QuickStart Tutorials, .NET Terrarium, and SQL Reporting Services Management Studio in SQL Server 2005.
[全文完] 注意: 本翻译未经作者授权,任何转载责任自负。

新闻来源:中国计算机报
“如果看看微软的网站就会发现,它使用大量的Flash……”Adobe首席执行官 Bruce Chizen与微软再次针锋相对。在电子文档领域,Adobe与微软在几年前就开始交手,随着9月微软即将正式发布Silverlight,双方将在互联网富媒体领域展开新一轮竞争。
Silverlight到底是什么?它其实是一个跨浏览器、跨平台的插件,为网络带来下一代基于.NET的媒体体验和丰富的交互式应用程序。它也是一种新 的Web呈现技术,无论是在浏览器内、在多个设备上还是在桌面操作系统(如Apple Macintosh)中,用户都可以获得内容丰富、视觉效果绚丽的交互式体验。

因此,Silverlight尽管还未正式亮相,但已经被称为Flash杀手。要知道两年前Adobe以34亿美元收购Macromedia时,也正是冲着Flash来的。现在,Flash带来的收入已经超过Adobe总收入的1/2。这意味着Silverlight的发布使微软剑指Adobe的核心利润来源,双方竞争也随即升级。

  短兵相接

  从整个互联网发展趋势来看,表现形式已经从单一的文本形式,发展到3D图片、动画、音频、视频。“现在可以说是Hi-Fi的Web世界。”在近日举行的Microsoft Silverlight预览会上,微软中国有限公司平台与开发合作部总监林毅已经开始这样定义互联网世界。可以说Silverlight成为微软互联网战略的重要组成部分,而Flash则代表Adobe在设计、制图等传统领域之外的重要新兴市场。

  此外,互联网技术层面的发展趋势是控制性,简单说,就是在业务上表现为交互性,这样发展的必然就是网站的个性化和技术的丰富性。当然,Adobe清醒地认识到这点:Flash在今天所要做出的转变,是从网络动画领域转变到应用程序领域。Adobe眼中的视频不再仅仅是Flash两年前所看重的编辑,而是指整个工作流,包括实时编辑、后期制作、流媒体、DRM数字保护、发布等等。而微软的Silverlight从诞生之时起就不仅仅是客户端插件,它提供灵活的编程模型,可以很方便地集成到现有的网络应用程序中。它有一整套开发工具。去年微软刚刚推出的针对设计者的Microsoft Expression 套件,就可以通过XAML语言与微软针对程序开发者的Visual Studio结合起来,从而提高网站应用的效率。

  赛迪顾问软件产业研究中心总经理牟淑惠表示,整合是微软的最大竞争优势,expression套件提供了从构建网页、动画设计、多媒体资产管理等等一整套解决方案。这套解决方案为那些在竞争中寻找突破点的网站以及艺术设计类公司提供了一套很好的工具,可以更容易锁住用户,锁住用户也就锁住了市场竞争力。双方的设计工具套件惊人地相似:如Expression套件中的Web Designer、Image Designer对应Adobe的Dreamweaver、Illustrator,而Expression Blend则是用于创建连接Web的Windows用户体验的专业工具,体现混合协同开发,从名称上即表现出交互设计功能。除了功能强大的无代码交互外,从前端的界面元素,也可以直接关联到后端的编程语言和代码,处理更为复杂的交互。

  竞争门槛

  当然,早起一步的Flash不仅在全球拥有超过7亿的客户端用户,它更为专注于IT专业人士、创作人士、网络设计者或图片设计者等专业人士。但Adobe也不会墨守陈规。已经发生变化的一个情况是:它对低端市场逐渐重视。看看全球最大的视频分享网站YouTube,它让人人都想成为视频发行商,人人都想成为创作型人才。因此Adobe也推出了PhotoBucket和Remix等产品,并在考虑免费软件的商业模式。现在,重要的视频分享网站YouTube、Myspace都选用Flash Video Player来播放自己的视频。此外,尽管.NET、Visual Studio、MSDN是微软在程序开发者中占据主要市场的三大因素,但是设计者普遍使用的是Mac平台,这就让微软Expression套件的推广遇到难题。

  但是,即将正式上市的Silverlight也拥有自己更胜一筹的技术特性,让它更符合目前Hi-FiWeb世界的需求和更高的商业价值。在预览会上,微软给人印象最深的包括三个特性:流畅高清视频效果、对搜索优化的支持,以及商业解决方案。

  高清晰视频

  由于体积上的压缩和编码上的简单化,省略较多的画面细节,目前市场上广泛使用的视频格式的视频效果并不理想,难以满足较长时间观看的要求。而Silverlight支持720HD(High Definition),这是由电影电视工程师协会所提出的视频压缩标准,其技术基础来自微软的Windows Media Video(WMV-9)。因此,Silverlight具有高清视频质量,通过Windows Media技术,传输流量可降低46%,并且和现有的Windows Media流量配置方案兼容。如果采用下一代Windows Server系统中的IIS媒体包,流量还将进一步下降。VC-1编码的高清晰视频,也可以在当前网络条件下进行传输。

  此外,在播放效果上Silverlight非常流畅。它播出视频及动画的效果很好,不会因为传输或播放大量内容而影响播放质量—这一问题是现有技术普遍遇到的障碍,同时也对消费者体验造成巨大影响。而且,Silverlight读取数据及更新外观的时候,不会通过刷新整体页面来打断用户操作。

  而且Silverlight浏览器插件的安装程序简单,目前预览版的体积约为1.36MB。当用户遇到使用Silverlight开发的网页时,可以迅速安装这一插件。Silverlight内建的视频及动画广告解决方案灵活性很高,当传输广播类型的视频或是动画广告时,不会影响视频的质量,而这一问题是现有技术普遍遇到的问题。

  解决搜索难题

  Flash未能突破的关键技术之一就是对视频搜索引擎的支持。除了眩目的设计和动态的交互,Flash主要针对目前网站的商业目的,尤其是视频网站。因为,网页浏览量(Page View)对于网站的发展非常重要,而很大一部分浏览量来源于搜索结果。但目前大部分视频分享网站所使用的技术基本上都不支持SEO(搜索引擎友好),从而造成视频的搜索收录率偏低。这也是很多运营视频分享平台最为关心的地方。虽然有些网站采用元数据的方式来提高收录数量,但效果并不理想。

  而微软Silverlight中的页面描述采用XAML文件格式,而且并不编译成二进制文件,它天生支持SEO。另外,Silverlight中的各种资源文件均是作为单独文件方式存在,而不是作为二进制文件的内嵌式资源文件存在。这可以说是一个非常重要的技术商业特性。也就是说Silverlight不仅在视频设计表现形式上毫不逊色,而且很多用户可能会因为这一重要的技术背后潜在的重要商业价值而成为Silverlight第一批用户。

  技术商业价值

  Silverlight的另一个技术商业价值是它低成本的解决方案。微软Silverlight设计工具Expression和Visual studio结合起来,各大公司中超过一半的编程人员使用的是微软的技术,而Expression的学习成本比较低,两者的结合可以打破当前普遍存在的一个问题:设计及开发基于不同的平台,导致技术壁垒及开发成本过高。作为目前国内最大的BBS技术供应商,全球已有超过50万家独立网站采用了Discuz!的技术与产品。Discuz!NT产品经理王炳坤试用Silverlight后认为,对于开发人员来说,Silverlight可以充分利用他们既有的.NET开发技术,从而大大降低学习与培训成本。而且,业界目前普遍使用的解决方案,其工具以及服务器价格都非常高昂,尤其是服务器。而Silverlight的后台对服务器类型没有要求。因此,微软测算,如果以不限流量的解决方案价格对比,其价格仅是主流解决方案价格的十分之一。

  此外,越来越多的互联网内容提供商开始构建自己的在线休闲游戏平台。但由于国内恶意软件的现状,很多用户不敢下载相关的ActiveX控件,大大降低了在线休闲游戏的普及率。而Silverlight的独特性质则可以避免此问题。同时,其先天对于游戏特性的支持,也使它成为在线休闲游戏平台的第一选择。另一例子是,目前,业界常见的Windows边栏小工具大部分使用HTML形式呈现,内容表现单一。而Silverlight则可以提供更加丰富的表现形式,有助于提升用户忠诚度,并扩展赢利模式。

2007年09月15日

 今天之所以理,因为填写了"淘宝UDE团队招聘"的叶子,感觉这样的招聘还是满有新意的,通过填写表单,做题来了解应聘用户.

 中间提到要填blog,我就添了一下,发现我的blog已是草长蝇飞了.唉,激活一下.

 写点东西.

 

2006年04月06日

  放眼2005年的B/OSS领域,令人应接不暇的并购事件频频发生,可谓风云变换,高潮迭起。能源和黄金市场的迅速膨胀,使得传统IT领域不再为风险投资者的最爱,股东对IT公司平庸的业绩没有信心。在全球普遍的低利率及企业现金过剩等诸多因素的推动下,迫使许多公司不得不通过大宗并购来寻得新商机,两家业务相似的公司开始考虑合并、削减重合部分的成本、收获更多利润。同时,席卷全球的下一代网络建设热潮和运营商转型的大趋势,使得软件厂商需要具备更强的势力和解决方案的能力,B/OSS领域的并购活动出现了前所未有的高涨。
岁末年初,对2005年发生在B/OSS领域的并购事件进行回顾与盘点, 寻访历史的见证人,倾听当事人的心声,以便提纲挈领地向业界展示中国B/OSS的魅力风景线。

一、最疯狂的并购:Oracle吞并Siebel

  美国东部时间9月12日,甲骨文正式宣布,将以每股10.66美元的价格合计58.5亿美元的股票和现金并购竞争对手Siebel。拉里?埃里森对Siebel垂青已久,在过去三年里多次向Siebel Systems创始人汤姆?西贝尔抛橄榄枝,屡次遭到回绝。持续几年业绩低迷之后,全球最大的CRM领导厂商Siebel终于还是未能走出颓局,股东们由于缺乏信心,没等到Q3财出来,就择了个低价抛售,CRM领域最优秀的厂商终究成为Oracle的囊中之物。继当年成功鲸吞PeopleSoft之后,拉里?埃里森的收购战车继续滚滚前行。

  点评:全球CRM的市场容量不足以存活一家十亿美元级别的软件公司,SIEBEL这样恐龙,难以维持持续十几亿美元业绩,最终难以为继。Oracle在连续收购两个大型CRM巨头厂商之后,给其产品整合和企业管理带来了前所未有的挑战。与SAP的应用软件解决方案之争,将更加激烈。

二、最轰动的并购:Amdocs收购朗新

  北京时间2005年6月20日, Amdocs与朗新公司达成协议,amdocs以3000万美金的价格将朗新公司并入Amdocs公司,朗新成为Amdocs 公司的一部分,并第一时间发布了“强强联手 共创辉煌”的宣言。Amdocs是全球领先的计费和客户服务(CC&B)软件公司,可谓是行业的巨鳄!有着近800名员工的朗新则从1996年开始,就长期服务于中国电力和电信行业,多年来公司稳步发展,可谓是业界最有势力的厂商之一,所以本次并购可谓惊动国内外。
  国内B/OSS领域的发展方向的问题,一直是仁者见仁,智者见智。
  赞誉一方认为:在Amdocs领先的技术,全球的专家和强劲的财务支持下,朗新将更好的为客户提供支持,使他们有能力满足市场瞬息变换的需求和实现整合的客户管理。这次并购将使加速朗新在中国市场的发展,使之有能力为客户提供最全面的国际领先的产品线和更加高品质的服务。

  悲观一方认为:徐长军在其湖北老乡汪潮涌的协助下,将当年实达系的股权进行清理,顺利引入Intel和高盛,而最终却没有选择国内上市,而是与以区区3000万美金的价格与Amdocs联手,这着实让那些关爱民族软件发展的圈内人士大跌眼镜。以朗新为例,一直在辛苦培育和摸索软件和市场,坚持了十余年,刚看到曙光、稍微成熟一些的时候,轻易被国外厂商摘了果子!国内的SI一步步丧失了国产自主软件发展的道路,而成为国际厂商在中国乃至全球廉价的软件工厂和本地化的维护队伍,这终将是一种悲哀!
  点评:朗新在探索一条很独特的发展之路,目前来看,短期内,最有可能借amdocs走上国际舞台。伴随CSG、Siebel、amdocs陆续到中国跑马圈地,中国的B/OSS领域也真正进入了与“狼”共舞的时代!此事件已经过去了半年,据了解,徐总在私下场合多次表示,现在自己比以前轻松了。然而,笔者观察到,挑战依旧很艰巨,截止目前,两家公司基本上是独立运作,产品和管理的融合是一个长久的过程。占有朗新公司三分之一分额的电力部分,依旧保留,尽管徐总曾在公开场合表示,Amdocs并没有削弱电信行业业务的想法,应该还会帮助朗新在电力行业进步,然而让一个全球公司,单独为中国的垄断的电力行业长期保留产品线,似乎缺少说服力。从2005年朗新在电信行业的发展来看,除了在网通大丰收之外,其它运营商的市场实在是泛善可陈,而按当初的协议,Amdocs会根据未来几年朗新的业绩,做一些追加投资,此部分是否带来新的风险,目前尚不得而之。

三、产品互补的并购:Comverse并购CSG 

  Englewood时间,10月7日,也就是中国人黄金周度假回来后的第一天,关于Comverse收购CSG的消息浮出水面,从公告上来看,是这样描述Comverse公司的:the world’s leading provider of software and systems enabling network-based multimedia enhanced communications services,实际这家在美国NSDQ上市的公司早在九十年代就进入中国,并在广州和另外一个城市设有办事处,在国内做一些短信、彩信相关增殖业务平台的系统。在收购的当天,CSG CEO Alan Michels在给其客户和合作伙伴公开信中认为,这是一个exciting news!
  
  CSG创建于1982年,总部位于美国Colorado,主要提供固网、移动、宽带、CATV、IP和能源领域的计费帐务和客户服务解决方案,足迹涉及全球40多个国家和地区,于2002收购朗讯公司的Kenan产品线,同年收购 IBM公司的ICMS产品线,并于2003收购Davinci Technologies。一个拥有2500名员工,坚持了20多年的公司,在$251 million cash的诱惑下,终究选择了被收购,资本市场再次显示其难以抗拒的强大力量!
点评:继九月Siebel被Oracle收购之后的, 又一大应用软件厂商被收购,与拉里?埃里森的的同行并购不同,本事件可以理解为BSS解决方案的厂商CSG与偏OSS解决方案Comverse强强联合、优势互补,合并后的公司产品线将更全,在3G时代,这种前后台一体化的B/OSS解决方案,将有独特优势。 

  此事件引发了另一轮的思考,在电信也高速发展的今天,曾经高举COTS解决方案的厂商,相继轰然倒下,这是否暗示定制服务厂商的春天来临?
多年来在Customer Care and Billing领域,CSG高举产品化大期,自1999年随Lucent来到中国,已先后赢得北京、上海、四川、浙江电信的集中计费帐务项目,以及吉林通信的采集预处理项目,作为早期进入中国的COTS厂商之一,于2005年在中国成立分公司,一度为业界关注的热点,国内相当一部分SI和运营商已经相当熟悉其Data Mediation、Kenan BP产品。本次收购,会对CSG在中国的发展带来什么变数?中国的CSG和Comverse office是否合并?将来是否继续延续Kenan BP相关的产品研发工作?新公司在中国的发展战略和市场定位?所有这些疑问,我想都将在2006年一一解开!

 四、豪猪取暖的联姻:神州数码收购思特奇 

  2005年11月17日,神州数码控股有限公司(0816.HK)在香港联交所发布公告称,已通过间接全资附属子公司神州数码软件有限公司,收购北京思特奇资讯技术软件公司约71.04%的权益。根据公告,神州数码软件有限公司将会支付现金人民币5612.16万元,收购对方71.04%的股权。收购后的思特奇将易名为北京神州数码思特奇信息技术股份有限公司,传说中的IT界的“神奇”公司经历一年的风雨路程,终于诞生了。
  点评:此前坊间一直流传这一个关于此事件IT童话,神州数码是国内最大的IT分销商,做分销是专家,每年近100亿的营业额,可谓是一个IT财主,而其在B/OSS领域仅仅依靠200余人的电信行业软件本部,隶属于神州数码IT服务集团的电信服务业务,占据神州数码整体业务的比重极小,业绩也很一般,毕竟能力和市场都有限(主要为安徽、河南移动的BOSS,北京联通的综合营帐),所以,更象一个“文盲财主”!至于思特奇,在B/OSS领域有了十年积累,是国家规划布局内108家重点扶持软件企业之一,在电信行业去年销售合同收入达到1亿元,掌握黑龙江、吉林、四川、山西四省BOSS市场,足够以一个教授的身份自居。只可惜,公司在国内其它运营商中寻求发展机会,却屡屡见效甚微。所以,对一个300多人的二流厂商来说,没有上市,又很少融资,虽然是教授,但迫于种种无奈,始终只能是一个“穷教授”。时至今日,大财主也顾不得颜面问题,将自己的文盲儿子托养给教授,寄希望儿子上了大学,文盲财主变成书香门第,穷教授也改善了生活,按郭为一年前的说法,没准“两个有优秀基因的公司,可以诞生一个出色的孩子”!
   
  有部分圈内人士不看好此次合作的前景,认为纵使合并了,年营业额不足3亿的神奇公司无法给郭为带来大的惊喜,那我们就当这是一次“豪猪取暖”吧!不过,既然可以收购思特奇的话,完全可以再收购几个小公司,延续神奇的IT童话!

五、见效最快的并购:中兴软创收购南方电信系统软件公司
  2004年11月中兴软创开始与广州南方电信系统软件有限公司进行接洽,2005年2月开始谈妥,2005年3月双方开始签署协议,2005年下半年开始全面合作与融合,迅速获得重庆、广西、河南的CRM集中项目。
  点评:广州南方电信系统软件有限公司于1999年开始创建,其前身为南方通信系统软件有限公司,成立于1993年,略发展方针为"立足广东,拓展全国",拥有江西、海南、西藏、广东电信(部分)、广东移动(部分)等BSS系统。中兴软创作为一个B/OSS领域的后来者,不可能从零开始,一点点去积累,要想迅速进入这个新的行业,并且获得所需要的资源,收购是一个行之有效的途径。时逢中电信和中网通支撑系统省集中的特殊时机,中兴软创以不足1000万RMB的费用,以三个月的时间,快刀斩乱麻得成功收购南电的市场和180余人的队伍,在2005年赢得12个省集中系统,一举跃为固网领域最大的SI,这让那些觊觎B/OSS行业市场却一直在踌躇不前的公司和投资者格外眼红,也证明了B/OSS行业竞争虽大空间犹在。
  这是2005年B/OSS领域见效最快的一次并购,快得甚至让许多圈内的朋友想到了当年宏智的快速扩张,所以在挤身市场先驱者行列的时候,如何确保队伍稳定、强化管理成为中兴软创的新挑战。

六、奢侈的并购:IBM收购Micromuse公司

  2005年12月14日IBM公司宣布,将以8.65亿美元收购Micromuse公司,根据最终的协议,IBM将以每股10美元的价格收购Micromuse公司的股票,这个价格比星期二的收盘价高出40%,价格似乎高得有些惊人,而且是现金交易。收购完成后,Micromuse公司将在IBM的Tivoli软件部下工作,其产品也将融合到IBM的软件和硬件中,整个收购工作将于明年第一季度完成。
  点评:在IT和业务网管方面,IBM虽然有Tivoli对阵HP的Openview。但是,HP与compaq合并后,引入了原compaq的电信核心网级的网管产品Temip,目前正在整合在Openview产品线中,并在国内拿下四川电信OSS部分综合告警的单子。因此,IBM购入Micromuse,补充其网管产品线在电信级网管方面的不足,据说是早有考虑了,而且,Muse在全球1,700 多个客户,其中包括全球最大的 20 家运营商,产品在金融、保险、企业和政府机构都有应用,范围很广,所以,从IBM以高出前一天股票价格40%的8.65亿美元收购价的行为来看,这是一个奢侈的现金收购行为,这种游戏IBM玩得起,也乐此不疲!
Micromuse的旗舰产品 Netcool?被整合入IBM Tivoli家族系列后,能否继续发挥其在多个行业和领域的产品优势我们拭目以待!IBM逐渐退出应用软件领域的时候,重新收购Muse,更象一个通过收购打击竞争对手的行为。

七、捉摸不透的并购:亚信并购兰德电信运营支持业务部门

  美国东部时间11月17日,亚信宣布,该公司已签署协议,收购浙大网新兰德科技股份有限公司的电信运营支持业务部门!亚信将收购浙大网新兰德科技股份有限公司电信运营支持业务部门的所有资产、知识产权和运营合同。亚信总裁兼首席执行官张振清表示,“此次收购将提升亚信在电信软件解决方案领域里的领先地位,进一步加强公司的核心业务。”
点评:兰德在电信业的优势是其在MSS相关的管理软件市场,亚信收购的仅仅是其最薄弱的运营支持业务部门,该部门仅仅拥有北方电信几个省的业务。
  亚信对固网B/OSS领域觊觎已久,但夕日的互联网架构师,以不足500万RMB的价格收购一个不关痛痒的兰德,其在宣布的内容中,对收购金额更是难以启齿!北方各省的业务系统在常人眼里,都无法看作正常的省集中Reference,至于,兰德该部门约30余人,更不是亚信缺少的技术人员,甚至可能有所重叠,所有这些似乎并不利于其去争取CTG-MBOSS改造中的大单!真要是想长期驻留在电信领域的话,收购一个有技术、有市场、规模略大一些的公司,似乎是更好的选择!难道是押宝改造后的北方十省的3G BOSS市场?抑或是想传说中的那样,尽快剥离非核心业务,多收购整合一些电信市场BOSS地盘,以求尽快卖一个好价格?总之,既非产品互补,又不是收购市场,让人捉摸不透!

 八、迟到的并购:亚信并购上海长江子公司

  美国时间12月29日亚信宣布收购上海长江技术开发公司旗下电讯运营支持集团。亚信表示,此举将促进其在电讯软件解决方案市场的业务,同此前收购兰德一样,本次并购未披露有关收购的财务细节。 
  点评:上海长江仅仅拥有福建联通一个省的综合营帐,之所以说是迟到的并购,是因为亚信在2004年就有收购长江的想法。回到2004年年中,随着宏智事件的发生,亚信将当时以林立欣为代表的宏智联通事业部的销售团队和部分技术人员网罗到旗下,欲借江湖混沌之际扩大在联通的地盘,当时就有传言亚信会收购陆和和上海长江(此时的长江坐拥福建和河南联通的综合营帐市场)。时逢河南联通综合营帐项目招标,当时,亚信因无法拿出书面材料以证明公司要收购长江而被东软抢走河南联通CRM,痛失在联通扩大其势力范围的机会。
在兵败中原之后,2005年年底时,亚信终究还是选择了收购长江,只可惜这个时候,留给亚信的已经仅仅是福建的综合营帐了。很多业内人士都替亚信惋惜,早知今日,何必当初呢?从这个故事上来看,亚信的董事会,或者说一切以数字说话的Nasdaq的做法,是不是也或多或少制约了其公司发展呢?

 九、关键的并购:华为收编山东浪潮软件队伍


2005年年初,在多方的关照下,华为在成功击败联创,中途接手山东移动的BOSS项目,于2005年2月左右正式签署合同。此前山东移动的BOSS一直有浪潮软件承建,华为中标后收编浪潮BOSS相关软件队伍,其BOSS产品线也以山东的版本为基础。
点评:从2004年下半年开始,华为欲进军BOSS市场的传言不绝而耳!尽管华为已经网罗宏智的一些BOSS人员,并接管湖北和青海移动BOSS,但真正树立华为在BOSS领域的地位和影响力的,还是其在山东一战,此战攸关华为在BOSS领域是否立得起来。通过收编当年山东浪潮软件的技术人员,扩充技术力量,通过分三批进行割接,所有系统于2005年9月顺利上线,这个项目对已经一只脚踏进BOSS之河的华为来说意义深远,所以本次收购可谓是2005其关键的一次并购!


 十、戏剧的并购:佳都多元合作

  佳都国际是一个多元化的公司,其在电信行业的佳都集成这两年却一直在走下坡路,一度邀来九七的鼻祖卢捍华组建了“南邮佳都电信OSS实验室”,依靠在广西电信、江苏网通、重庆网通等市场勉强维持运作。
  2005年年初,传出佳都集成与承建辽宁通信CRM项目的BMI合作的消息。卢捍华老师也前往上海BMI进行了洽谈,然而,此后不见,再次传出佳都与福富在福建合作承建CRM项目的消息。进入年底,随着广西电信的省集中项目,被中兴软创一举拿下,佳都集成的一部分团队加盟中兴软的消息也不胫而走。
  
  点评:短短一年,如此多的变数,只能让人哑然失笑,十足戏剧性!


  回顾2005年并购B/OSS领域的,并购一直比较活跃,马太效应又一次起到了作用,资本市场再次展示了其无穷的力量和魅力,对于开展收购的大型企业来说,并购正在为它们在平淡的经济增长和激烈的竞争环境中带来新增长。和任何其他行业一样,在这些创纪录的数字中也蕴含著令人担忧的迹象,例如:私人资本交易中部分公司的债务加重;公司加速发展带来的管理危机;并购后依旧我行我素,缺少必要约束,并没有发挥彼此优势,甚至逐渐失去原来的优势;并购带来的新旧企业文化的冲突等!并购终究只是一个手段,并购成功不是最后的成功,在经济全球化的今天,B/OSS领域也需要向深度广度发展, 随着运营商IT建设日趋理性,行业内的并购将是一个必然过程。
 
  进入2006年,当我们看到了分众传媒CEO江南春和聚众传媒CEO虞锋这两个昔日剑拔弩张、分外眼红的同城冤家为了将企业做大做强,第一次主动将行业内旗鼓相当的两家公司联合起来时候,我们也期待B/OSS行业的管理者能够摆脱狭隘的老板心态,在2006年有更多遵循市场规则的联合和并购出现,当然我们更为并购后成功的整合而喝彩,希望有更多的企业为历史留下浓墨重彩!

2005年11月04日



一、showModalDialog和showModelessDialog有什么不同?
  showModalDialog:被打开后就会始终保持输入焦点。除非对话框被关闭,否则用户无法切换到主窗口。类似alert的运行效果。
  showModelessDialog:被打开后,用户可以随机切换输入焦点。对主窗口没有任何影响(最多是被挡住一下而以。:P)

二、怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口?
  在被打开的网页里加上<base target="_self">就可以了。这句话一般是放在<html>和<body>之间的。

三、怎样才刷新showModalDialog和showModelessDialog里的内容?
  在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能弹出菜单。这个只能依靠javascript了,以下是相关代码:

<body onkeydown="if (event.keyCode==116){reload.click()}">
<a id="reload" href="filename.htm" style="display:none">reload…</a>

  将filename.htm替换成网页的名字然后将它放到你打开的网页里,按F5就可以刷新了,注意,这个要配合<base target="_self">使用,不然你按下F5会弹出新窗口的。

四、如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。
  <input type="button" value="关闭" onclick="window.close()">
  也要配合<base target="_self">,不然会打开一个新的IE窗口,然后再关掉的。

五、showModalDialog和showModelessDialog数据传递技巧。
  (作者语:本来想用一问一答形式来写的,但是我想不出这个怎么问,所以只好这样了。)
  这个东西比较麻烦,我改了好几次了不是没办法说明白(语文水平越来越差了),只好用个例子说明了。
  例子:
    现在需要在一个showModalDialog(或showModelessDialog)里读取或设置一个变量var_name

      一般的传递方式:
        window.showModalDialog("filename.htm",var_name)
        //传递var_name变量
      在showModalDialog(或showModelessDialog)读取和设置时:
        alert(window.dialogArguments)//读取var_name变量
        window.dialogArguments="oyiboy"//设置var_name变量
    这种方式是可以满足的,但是当你想在操作var_name同时再操作第二个变理var_id时呢?就无法再进行操作了。这就是这种传递方式的局限性。
    
      以下是我建议使用的传递方式:
        window.showModalDialog("filename.htm",window)
        //不管要操作什么变量,只直传递主窗口的window对象
      在showModalDialog(或showModelessDialog)读取和设置时:
        alert(window.dialogArguments.var_name)//读取var_name变量
        window.dialogArguments.var_name="oyiboy"//设置var_name变量

        同时我也可以操作var_id变量
        alert(window.dialogArguments.var_id)//读取var_id变量
        window.dialogArguments.var_id="001"//设置var_id变量

        同样还可以对主窗口的任何对象进行操作,如form对象里的元素。
        window.dialogArguments.form1.index1.value="这是在设置index1元素的值"

六、多个showModelessDialog的相互操作。
  因为光说很费劲,我就偷点懒,直接用代码来说了,如果不明白的话那就直接来信(oyiboy#163.net(使用时请将#改成@))问我吧。

  以下代码的主要作用是在一个showModelessDialog里移动别一个showModelessDialog的位置。

  主文件的部份js代码。
  var s1=showModelessDialog(‘控制.htm’,window,"dialogTop:1px;dialogLeft:1px") //打开控制窗口
  var s2=showModelessDialog(‘about:blank’,window,"dialogTop:200px;dialogLeft:300px")  //打开被控制窗口

  控制.htm的部份代码。
  <script>
    //操作位置数据,因为窗口的位置数据是"xxxpx"方式的,所以需要这样的一个特殊操作函数。
function countNumber(A_strNumber,A_strWhatdo)
{
A_strNumber=A_strNumber.replace(‘px’,”)
A_strNumber-=0
switch(A_strWhatdo)
{
case "-":A_strNumber-=10;break;
case "+":A_strNumber+=10;break;
}
return A_strNumber + "px"
}
  </script>
  <input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,’-')" value="上移">
  <input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,’-')" value="左移">
  <input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,’+')" value="右移">
  <input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,’+')" value="下移">

  以上关键部份是:
    窗口命名方式:var s1=showModelessDialog(‘控制.htm’,window,"dialogTop:1px;dialogLeft:1px")
    变量访问方式:window.dialogArguments.s2.dialogTop

  这个例子只是现实showModelessDialog与showModelessDialog之间的位置操作功能,通过这个原理,在showModelessDialog之间相互控制各自的显示页面,传递变量和数据等。这要看各位的发挥了。


2005年11月01日

1.初始会商,主要是收集该站点的关键信息,包括站点的目标读者.要发布的内容.开发Web服务器平台;

2.概念开发,设计师根据收集的信息,开始构思,通常,设计师要把这些构思用草图的形式呈现给顾客,这个草图要有整个网站的结构,不同的布局.设计及导航;

3.内容综合,当决定了设计师的设计,设计师开始制作一些初始图样,这些图样用PHOTOSHOP那样的程序来创建,然后,设计师将图样打印出来配合文字;

4.HTML布局和导航,一旦客户同意了这些内容综合,设计师开始编制Web页面,导航器也被编制到页面中,使客户第一次真正体验一下;

5.图形制作,如果客户同意了站点的外观和感受,设计师将大量制作所需的图形,并进行优化;

6.内容流程,客户的书面材料利用各种网页技术(CSS、JAVA、FLASH),有机的和相关的图形整合在一起;

7.测试,在站点被提交给客户之前,设计师要彻底测试每个Web页面和联结,利用清单,进行修补;

8.交付,一旦签收,客户要经常进行他们的测试,找出排版和内容方面的错误,做完了这些次要的修正后,正式启用站点.

这套完整的计划可以用1-12个月来完成,平均完成时间为4个月.当站点启用后,要进行跟踪调查,以确定人们如何使用站点。经过6-12个月的运行之后,重新收集数据,开始重新设计,然后这个Web设计过程再开始一遍!

2005年10月31日

ASP

L-Blog: http://www.loveyuki.com
由Loveyuki自主开发的基于 ASP+Access 的小型单用户BLOG,目前似乎已经停止更新了,但是用户群相当大,而且是国内相当多的BLOG系统的鼻祖。

oblog: http://www.oioj.net
多用户Blog,目前占据ASP多用户BLOG的大部分市场,2.X商业版已经实行免费,很值得继续关注与期待的国内作品。

SLblog:http://SLblog.com
多用户Blog,刚发展起来的,更新很快,感觉像是oblog和missblog的结合体,同时首创了Blog系统无限级分类和用户栏目的无限级分类,多功能在现编辑器。但界面不是很美观,好在模板和程序分离,方便修改。

Misslog: http://www.misslog.com/blog
多用户blog,每个blog可以有多个用户参与创作与维护,团队功能很强大!

LBS: http://www.voidland.com/blog
LBS早期基于L-Blog架构,自从LBS2推出以后,大部分属于自己的创作,模板很多,用户群也逐渐庞大。

Z-Blog: http://www.rainbowsoft.org/zblog/
今年发展相当快的Blog系统,官方提供了想当丰富的支持,也创造了比较好的交流环境,这是他的一大亮点。

PJBlog: http://www.pjhome.net/
基于ASP的单用户BLOG系统,由于其插件异常丰富,可扩展的功能很多,比较适合喜欢功能饱满的朋友。

Alpar’s Blog: http://blog.fz0132.com
基于L-Blog架构,但是作了相当大程度的修改,全面兼容LBS^2 的Style,目前版本模板采用DIV+CSS,很值得期待后续发展。

nblog: http://blog.nowans.com/
一个基于Access的个人Blog程序,全生成静态页面,刚开始起步。

blogx: http://www.blanksoft.com/blogx/

d2kblog: http://www.d2ksoft.com/
国外一个BLOG系统,支持多国语言页面内容和页面样式分离。

KeeBlogSystem: http://keesky.com/blog/
XUL后台管理,很有特点的一个BLOG系统。

ASP.NET

.Text: http://scottwater.com/Dottext/default.aspx
很有名的ASP的blog系统,官方暂无静态化(对每页生成静态的html页面)版本,国内donews使用该软件。

BlogX: http://www.simplegeek.com/CategoryView.aspx/BlogX
程序是英国人编写的,国内 BLANKSOFT.COM 进行了汉化和修改。

dasBlog: http://www.dasblog.net
功能比较齐全,对FireFox的支持不怎么好。

PHP

Okphp BLOG: http://cn.okphp.com/
基于PHP+MYSQL开发的多用户BLOG系统,部分代码ZEND,主要特点能够很好地和许多论坛程序无缝兼容。

BlogHoster: http://www.webligo.com
国外的一个多用户商业BLOG系统,基于PHP+MYSQL,简洁明快的风格。

exBlog: http://www.exblog.net/
基于PHP/MySQL平台开发,注重稳定效率和兼容性,使用了 PHPLIB 的模板系统,提供WAP接口。

Pixelpost PhotoBlog: http://www.pixelpost.org/
国外的由图片系统和博客系统融合来的新型博客,已经由落伍的 星 完成汉化。

bMachine: http://boastology.com
国外老牌BLOG系统,同时支持文本数据库和MySQL数据库,支持中文搜索。

7log: http://www.7log.com
比较早的能够生成静态页面的BLOG系统,目前开发进度停滞。

O-blog: http://www.phpblog.cn/
需在PHP+MYSQL环境下运行,主要特色对静态生成有很大的灵活度,作者风色默默无闻地开发也让人钦佩。

pigface blog: http://www.flashforweb.com/
一个简单的BLOG,具备所有BLOG必须的功能,基于PHP+MYSQL。

bo-blog: http://www.bo-blog.com/
文本数据库,现在发展似乎遇到了瓶颈,发展不如年初那么火热,但是一样有很多追随者。

C-Blog: http://www.saysay.cn
由 Coolsky 自主开发的基于 PHP+Smarty模版引擎+ADODB组件 的小型单用户BLOG,目前提供2个版本:php+mysql版本 和php+access版本,能够生成静态页面。

SaBlog: http://www.4ngel.net/blog/angel/
安全天使小组开发的一套BLOG系统,功能不断在完善,优点在于安全性很高。

Simple PHP Blog: http://www.simplephpblog.com/
国外一个轻便的blog系统,包含中文语言文件。

yo2blog: http://www.oneoo.com/
一个简单小巧快捷的 blog 程序,使用假性目录结构生成类静态 HTML 页面链接。

sBLOG: http://www.sblog.cn/
国外一款基于PHP+MySQL的BLOG系统,模板遵循W3C规范,并提供mod_rewrite功能支持。

b2: http://www.cafelog.com php
blog的老祖宗,操作简单,容易上手,现在好像停止了开发。

b2evolution: http://www.b2evolution.net
B2多用户版,有很多风格和插件。

wordpress: http://www.wordpress.org
架站比MT简单一点,功能也很全面,应该是支持blog的首选。它有最强的模版功能,已经开始有限范围内测试多用户的新版。

pivot: http://www.pivotlog.net
PHP+XML,没有使用数据库,有中文语言包,

nucleus: http://www.nucleuscms.org
这个也是比较老牌的程序了,有中文语言包!

M-logger: http://miracle.shakeme.net
文本储存数据。

drupal: http://www.drupal.org
功能强大,在多用户支持上尤为突出。它看起来更像一个内容发布系统(CMS)而不是一个纯blog软件,所以仅仅只想使用blog功能的朋友就用不着扛着这门炮了。

Pmschine: http://www.pmachine.com
这个估计是blog的元老了,不过现在已经商业化了,新版本名叫Expression Engine,在国内可以免费下载!

bBlog: http://dev.bblog.com/
一个非常简洁好用的blog,汉化版: http://www.xptop.com/lei/

serendipity: http://www.s9y.org
功能很多,每个功能以模块方式安装,界面也很容易修改。

Plog http://www.plogworld.org/php
blog里的最好作品了,真正的多用户,不过目前官方网站打不开,不知道是不是偶的网络问题,呵呵!

Plainslash: http://www.51zhao.com/plainslash/
文本blog程序,作者很久没更新了,但现在blog的基本功能都有了。

CGI

movable Type: http://www.movabletype.org
一个cgi程序的blog软件,应用最为广泛,大陆不算十分多,香港台湾的80%以上的独立blog站点都是通过它架设的。插件众多,基本需要的功能都能实现,它支持多用户blog。

Greymatter: http://www.noahgrey.com/greysoft/
是一个类似 Movable Type 的Blog程序非常简单,也是生成静态文件。

HUS Reviv: http://supermanc.51.net/norman/blog.cgi
国人开发的,功能很强大,但由于cgi语言的问题,安装调试比较复杂,而且很占资源。

Blosxom: http://www.blosxom.com
很老的一个程序了,也可能是世界上最小的blog系统了,只有一个文件却实现了blog的大部分功能!

JSP

Roller:http://www.rollerweblogger.org/page/project
国外运用想当广泛的一套BLOG系统。

DLOG4J: http://dlog4j.sourceforge.net/
国人开发的,已经申报SourceForge项目 中文官方站: http://www.javayou.com

TM: http://www.terac.com
一个功能强大的blog,支持文件上传、RSS、评论、WYSIWYG 编辑器等功能,多种语言(含简体中文)

2005年10月22日

非常cool的图片软件!

 Picasa

http://picasa.google.com/assets/screenshot.jpg

数秒钟内就可找到并欣赏计算机上的图片。
可以从 Google 网站上下载的免费软件。
Picasa 是一款可帮助您在计算机上立即找到、修改和共享所有图片的软件。每次打开 Picasa 时,它都会自动查找所有图片(甚至是那些您已经遗忘的图片),并将它们按日期顺序放在可见的相册中,同时以您易于识别的名称命名文件夹。您可以通过拖放操作来排列相册,还可以添加标签来创建新组。Picasa 保证您的图片从始至终都井井有条。

Picasa 还可以通过简单的单次点击式修正来进行高级修改,让您只需动动指尖即可获得震撼效果。而且,Picasa 还可让您迅速实现图片共享–可以通过电子邮件发送图片、在家打印图片、制作礼品 CD,甚至将图片张贴到您自己的 blog 中。

免费下载:http://picasa.google.com/download/index.html

2005年10月19日

如果你曾参与过网络开发,那么对你来说,利用远程脚本调用能力、通过AJAX(Asynchronous JavaScript + XML)来开发应用软件的最新趋势也就不足为奇了。毕竟,这一技术多年前就已出现,只是与浏览器不兼容罢了。微软一直宣称ActiveX为解决方案,但随着AJAX技术的不断升温,这一情况已经改变。现在让我们深入探究AJAX革命,以及微软的参与和方案。


AJAX是什么?

定义AJAX可不象指向W3C网页那样简单,因为它是几种技术的组合。它包括如下技术:

* XHTML 和 CSS 的标准表示;
* 使用文档对象模型DOM(Document Object Model)实现动态显示及用户交互;
* 使用 XML 、XSLT和XMLHttpRequest进行数据交换及操作;
* 使用 JavaScript 将所有技术绑定在一起。

AJAX与传统网络开发的最大不同在于采用了远程脚本调用技术。远程调用技术允许用户方的JavaScript语言向服务器发送数据请求,而不用刷新网页。这一任务是通过JavaScript语言与XMLHttpRequest对象来实现的。远程脚本调用将一部分处理过程转移到客户(浏览器),这大大减少了向网络服务器的呼求数目。

微软首次将XMLHttpRequest对象作为一个ActiveX对象应用在Windows IE5中。与这个ActiveX组件一同首次开发的还有Outlook Web Access。研发Mozilla计划的工程师推出了Mozilla 1.0(及Netscape 7)的兼容本地版,苹果公司也在他们的Safari 1.2中增加了这一支持。在一份提议的W3C标准中也包含了类似的功能。与此同时,XMLHttpRequest对象实际上已成为技术标准。

“中间人”

传统的网络应用软件首先向HTTP服务器触发一个用户行为或请求的呼求。反过来,服务器执行某些任务,再向发出请求的用户返回一个HTML页面。这是一种不连贯的用户体验,服务器在处理请求的时候,用户多数时间处于等待的状态。

AJAX则不同。它通过在用户与服务器之间引入一个中间媒介,从而消除了网络交互过程中的处理—等待—处理—等待缺点。用户的浏览器在执行任务时即装载了AJAX引擎。AJAX引擎用JavaScript语言编写,通常藏在一个隐藏的框架中。它负责编译用户界面及与服务器之间的交互。AJAX引擎允许用户与应用软件之间的交互过程异步进行,独立于用户与网络服务器间的交流。

AJAX不断升温

AJAX正受到大型公司Google及Amazon的关注。Google已将AJAX广泛应用于其开发的Gmail、Google Suggest和Google Maps等网络应用软件中。(确实,在最近所有开发或改进的主要产品中,Google在AJAX方面投入了大量资金。)同样,Amazon也推出了应用AJAX技术的A9搜索引擎。每天都有许多类似的例子涌现。

微软的AJAX

当然,微软也在着手开发更为完善的AJAX。它即将推出代号为Atlas的AJAX工具。Atlas的功能超越了AJAX本身,包括整合Visual Studio的调试功能。另外,新的ASP.NET控件将使客户端控件与服务器端代码的捆绑更为简便。Atlas客户脚本框架(Atlas Clent Script Framework)也使与网页及相关项目的交互更为便利。但Visual Studio 2005中并不包含此项功能。

微软最近宣布Atlas客户脚本框架将包含如下内容(详细资料请访问Atlas计划网站):

* 一个可扩展的核心框架,它添加了JavaScript功能:如生命同时期管理、继承管理、多点传送处理器和界面管理。
* 一个常见功能的基本类库,有丰富的字符串处理、计时器和运行任务。
* 为HTML附加动态行为的用户界面框架。
* 一组用来简化服务器连通和网络访问的网络堆栈。
* 一组丰富的用户界面开发控件,如:自动完成的文本框、动画和拖放。
* 处理浏览器脚本行为差异的浏览器兼容层面。

上述内容只是一个初步的框架。在确切的产品发布之前,这些内容很可能会有所改变。如果你等不及微软的产品,可以先试用一下免费的微软.NET框架Ajax.NET库。

AJAX的缺点

AJAX要求用户的浏览器支持JavaScript语言。尽管这并不是主要的问题,不过也要加以考虑。同样,这些应用软件必须经过严格的测试来适应不同的浏览器及平台。但是,这种情形只对基于浏览器的应用软件而言,并不包括目标浏览器可被控制的局域网在内。

用户对AJAX的抱怨主要集中在浏览器后退功能的失效上,因为在AJAX下,页面的动态更新并不被浏览器认为是进入另一个网页。不过,用IFRAME中的一个常用方法就可以解决该问题。

AJAX面对的另一个批评让我觉得很有趣,有人认为AJAX不过是为了推销旧技术而引入的新名词而已。这也许是对的,但至少它所包含的技术是成熟且经过测试的。

旧瓶装新酒

AJAX技术在网络开发界并不新奇,但总的来说,它对所有主流浏览器的广泛支持使其更易于为网络开发界所接受并加以应用。AJAX所应用的技术成熟而稳定。利用它你能够开发出丰富的应用软件,从而减少服务器的响应时间,这样用户的等待时间也相应减少 .