IIS搜索引擎优化工具包

by sundy 3/1/2010 7:36:00 AM

【原文地址】 IIS Search Engine Optimization Toolkit

【原文发表日期】 Wednesday, June 03, 2009 9:53 AM

SEO (搜索引擎优化)是任何Internet网站需要在设计时考虑的重要因素之一。网站比率不低的Internet流量是由搜索引擎带来的,好的SEO技术能帮助进一步增加网站流量。

同样地,小的错误可以显著地影响你网站内容的搜索相关性,导致你错过你应该得到的流量。其中一些错误包括: 网站上多个URL通向同个内容,网页上的无效链接(broken links),标题、描述和关键词选择得不恰当,大量的视图,不合法的标识,等等。这些错误经常是非常容易修补的,其挑战性在于如何在网站上发现和精确定位这些错误。

推出IIS搜索引擎优化工具包

今天我们发布了一个新的免费工具,IIS搜索引擎优化工具包(IIS Search Engine Optimization Toolkit)的第一个beta,它将方便你对网站进行SEO分析,识别和修补网站上的问题。

你可以使用我本星期稍早介绍过的微软Web平台安装程序(WebPI)来安装IIS搜索引擎优化工具包。你可以使用IIS SEO 工具包主页上的“install now(现在就安装)”链接,通过WebPI来安装这个工具包。

安装完毕后,你在IIS 7管理工具中可以找到一个新的“Search Engine Optimization(搜索引擎优化)”节,内含若干个SEO工具:

More...

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Electronic Commerce | Flash,SilverLight Coming | Microsoft Domain

HttpWebRequest Detail

by sundy 11/3/2009 5:55:58 PM

Determining Whether the Device Is Connected

Most network applications need to know whether the device is currently connected to the network. A well-designed mobile application allows the user to make use of it even if the device isn’t connected. For example, if the device has lost wireless connectivity, it should be able to operate using data cached on the device, and then possibly re-sync with a server when network connectivity is regained.
There is no class in the .NET Compact Framework that raises events to inform an application when connection to the network is lost and regained. Instead, you must code with this eventuality in mind and make sure your application is tolerant of network outages. You might need to write code that polls for a network resource to determine when the device has network connectivity.

For example, if your application uses XML Web services, you might need to connect to the service to upload data changes and download data to the device when a network connection is available. In your application, you should write a method that uses the WebResponse class to send an HTTP GET request to a valid URL on the server where the XML Web service is located. If the HttpWebResponse.StatusCode property in the response equals HttpStatusCode.OK, connectivity to the server is confirmed. You should call this method from a TimerEvent of a System.Threading.Timer instance to poll the server at intervals; when the method succeeds, the application knows that it can make a successful HTTP connection to the server, so the interaction with the XML Web service or access to other network resources can proceed.
Understanding WebRequest and WebResponse Basics
The most important classes in the System.Net namespace are the WebRequest and WebResponse classes, which are abstract classes.

using System.Net;
using System.IO;

    WebRequest req = WebRequest.Create(uri);
    WebResponse res = req.GetResponse();    // GetResponse blocks until the response arrives
    Stream ReceiveStream = res.GetResponseStream();    // Read the stream into a string
    StreamReader sr = new StreamReader( ReceiveStream );
    string resultstring = sr.ReadToEnd();

Fetching a Resource Using HTTP

If the scheme of the URI is http:// or https://, the Create method returns an instance of the HttpWebRequest class. The GetResponse method of this instance makes a request to the resource and returns an HttpWebResponse instance that contains the response.

HttpGetSample
using System;
using System.IO;
using System.Net;

namespace NETCFDevelopersReference
{
class HttpGetSample
{
/**//// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
            HttpGetSample thisclass = new HttpGetSample();
            thisclass.getPage("target URL here"); // <-- EDIT THIS!
        }

public void getPage(String url) 
{
            WebResponse result = null;

try
{
                WebRequest req = WebRequest.Create(url);
                result = req.GetResponse();
                Stream ReceiveStream = result.GetResponseStream();

//read the stream into a string
                StreamReader sr = new StreamReader( ReceiveStream );
string resultstring = sr.ReadToEnd();

                Console.WriteLine("\r\nResponse stream received");
                Console.WriteLine(resultstring);
            }
catch(Exception exp) 
{
                Console.Write("\r\nRequest failed. Reason:");
                Console.WriteLine(exp.Message);
            }
finally
{
if ( result != null ) 
{
                    result.Close();
                }
            }

            Console.WriteLine("\r\nPress Enter to exit.");
            Console.ReadLine();
        }
    }
}

The Finally block ensures that the WebResponse object is closed, regardless of the success or failure of the program. This is important to ensure that network resources are not wasted.
Handling Errors
You get an exception of type UriFormatException when the URI cannot be parsed or an exception of type WebException for other errors. The Status property of WebException returns a value from the WebExceptionStatus enumeration. If Status is WebExceptionStatus.ProtocolError, the exception is a result of an HTTP protocol error. You can then access the WebException.Response property, which returns an HttpWebResponse object containing the response from the server. Use the HttpWebResponse.StatusCode property to find out the HTTP status code the server sent back, and use HttpWebResponse.StatusDescription to obtain the description string that corresponds to that status code.

Working with HTTP Headers

The HttpWebRequest class allows you to control the HTTP headers sent with your request, which you do by setting properties or by executing methods of the class.

HTTP Headers Sent

HTTP Header

Set By

Accept

HttpWebRequest.Accept property

Connection

HttpWebRequest.Connection and HttpWebRequest.KeepAlive properties

Content-Length

HttpWebRequest.ContentLength property

Expect

HttpWebRequest.Expect property

Date

Set to the current system date

Host

Not set

If-Modified-Since

HttpWebRequest.IfModifiedSince property

Range

HttpWebRequest.AddRange method

Referer

HttpWebRequest.Referer property

Transfer-Encoding

HttpWebRequest.TransferEncoding property (the HttpWeb­Request.SendChunked property must be true)

User-Agent

HttpWebRequest.UserAgent property

The HttpWebResponse instance exposes HTTP headers as properties in a similar way.

HTTP Headers Received

HTTP Header

Read By

Content-Encoding

HttpWebResponse.ContentEncoding property

Content-Length

HttpWebResponse.ContentLength property

Content-Type

HttpWebResponse.ContentType property

Length

HttpWebResponse.Length property

Server

HttpWebResponse.Server property

Both classes also have a Headers property that exposes HTTP headers as a System.Net.WebHeaderCollection instance. For example, instead of using the UserAgent property, you can add the User-Agent header using the following code:

HttpWebRequest req = (HttpWebRequest) WebRequest.Create(uri);
req.Headers.Add("User-Agent", "dotNETCF Test Program");
HttpWebResponse res = (HttpWebResponse) req.GetResponse();
String server = res.Headers["Server"];

Network Transfer Encoding
All data transferred over the network is encoded. The Windows CE operating system uses Unicode to represent characters, but this requires at least 2 bytes to represent any character, which is not as efficient as the U.S. ASCII character set, which requires only one byte per character. But ASCII represents only commonly used characters in Western alphabets, so it is unusable in languages requiring other characters, such as European languages, Chinese, Japanese, or Arabic.

The compromise solution is to use character encodings. The most common of these is UTF-8, which is a variable-length multibyte encoding requiring a single byte for 7-bit characters that are in the U.S. ASCII character set and 2 bytes for characters outside it. This results in efficient encodings for Western alphabets and the flexibility to handle non-Latin characters.
The default encoding assumed by the HttpWebRequest and HttpWebResponse classes is UTF-8

You can determine the character set encoding of a response by getting the HttpWebResponse.CharacterSet property. However, beware, there is a trick to this! You must set the MediaType property on the request; otherwise, the CharacterSet property on the HttpWebResponse will be blank. Even then, CharacterSet will only return the character set encoding used if the first part of the Content-Type header returned with the response (which is the media type) matches the value you set in the MediaType property of the request.
For example, if you set HttpWebRequest.MediaType to “text/html” before calling HttpWeb­Request.GetResponse, and the Content-Type header returned with the response is “text/html; charset=utf-8”, the HttpWebResponse.CharacterSet property will contain the name of the character set encoding (“utf-8”) because the “text/html” media type sent in the first part of the Content-Type header matches the value set in HttpWebRequest.MediaType. If the media types differ, HttpWeb­Response.CharacterSet is a null string.

Decoding
HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
// You MUST set the MediaType property on the request, otherwise
// the CharacterSet property on the HttpWebResponse object will be
// blank.
    req.MediaType = "text/html";
    HttpWebResponse result = (HttpWebResponse) req.GetResponse();
// Note that the HttpWebResponse.ContentType property always
// returns the Content-Type header, which will be something like
// "text/html; charset=utf-8"
string contenttype = result.ContentType;
// Character set encoding may be something like ISO-10646-UCS-2, 
// or UTF-8, us-ascii etc
string charsetencoding = result.CharacterSet; 
//read the stream using the decoder
    Stream ReceiveStream = result.GetResponseStream();
    Encoding encode = System.Text.Encoding.GetEncoding(charsetencoding);
    StreamReader sr = new StreamReader( ReceiveStream, encode );

Using HTTP GET Query String
In the full .NET Framework, the System.Web.HttpUtility class provides methods to encode and decode URL-encoded data, but this class is not supported in the .NET Compact Framework. You must write your own code to handle URL encoding, such as the example code shown here:

UrlEncode
using System;
using System.IO;
namespace NETCFDevelopersReference
{
/// <summary>
/// Replacement for HttpUtility.UrlEncode
/// </summary>
public class HttpUtility
    {
public static string UrlEncode(string instring)
        {
            StringReader strRdr = new StringReader(instring);
            StringWriter strWtr = new StringWriter();
int charValue = strRdr.Read();
while (charValue != -1)
            {
if (((charValue >= 48) && (charValue <= 57)) // 0-9
                    ││((charValue >= 65) && (charValue <= 90)) // A-Z
                    ││((charValue >= 97) && (charValue <= 122))) // a-z
                    strWtr.Write((char) charValue);
else if (charValue == 32)    // Space
                    strWtr.Write('+');
else
                    strWtr.Write("%{0:x2}", charValue);
                charValue = strRdr.Read();
            }
return strWtr.ToString();
        }
    }
}

Using HTTP POST

To use POST, just set the HttpWebRequest.Method property to “POST” and then proceed as for GET. A typical HTML page shown in a Web browser posts data as key=value pairs, with the data URL-encoded, so your application must format the data in that way if that is what the Web server application expects. If you are simply posting application content or XML, just post it as is.

post
public void doPost(String url, String payload) 
    {
        WebRequest req = WebRequest.Create(url);
        req.Method = "POST";
        req.ContentType = "text/plain; charset=utf-8";
// Encode the data
byte[] encodedBytes = Encoding.UTF8.GetBytes(payload);
        req.ContentLength = encodedBytes.Length;
// Write encoded data into request stream
        Stream requestStream = req.GetRequestStream();
        requestStream.Write(encodedBytes, 0, encodedBytes.Length);
        requestStream.Close();
        WebResponse result = req.GetResponse();
    }

Alternatives to Cookies for Session State Support
The .NET Compact Framework implementation of the HttpWebResponse class does not support the Cookies property found in the full .NET Framework implementation. 
If you are using an ASP.NET application on the server, you can utilize the ASP.NET support for cookieless clients to track your smart device applications session. You enable this by setting cookieless to “true” in the sessionState configuration in the ASP.NET application’s Web.Config 
ASP.NET uses a munged URL to track sessions for cookieless clients, meaning it embeds a session ID into the response URI. For example, if your application makes a request to http://myserver/myserverapp.aspx, the response URI that returns to the client is actually something like http://myserver/(1en4l345qq203lr2f0h4xt45)/myserverapp.aspx. To the client, it looks like a server-side redirect. In the client application, this response URI is in the HttpWebResponse.ResponseUri property, so the client application need only use this URI for subsequent requests for the server application to be able to identify those requests as coming from that particular client.
Authenticating Requests with the NetworkCredential Class

WebRequest req = WebRequest.Create(url);
   NetworkCredential creds =
new NetworkCredential("andy", "pA55w0rd", "");
   req.Credentials = creds;
   WebResponse result = req.GetResponse();

Making Network Requests via a Proxy Server

//  Pass Proxy string and bypass local machine
   WebProxy myProxy = new WebProxy(
"http://myproxyserver.mine.com:8080", true);
// If  this proxy requires authentication
   myProxy.Credentials =
new NetworkCredential("loginname","password");
   Request.Proxy = myProxy;

Asynchronous Web Requests

HttpGetAsyncSampleMain.cs
using System;
using System.IO;
using System.Threading;

namespace NETCFDevelopersReference
{
class HttpGetAsyncSample 
{
public static void Main(string[] args) 
{
            HttpGetAsyncSample thisclass = new HttpGetAsyncSample();
            thisclass.Run();
        }

private bool isComplete;

public void Run()
{
            Console.WriteLine();
            Console.WriteLine("Test Program makes HTTP AsyncGet"
+ " to http://www.gotdotnet.com/team/netcf");
            Console.WriteLine("Press Enter to continue");
            Console.ReadLine();

            GetHttpAsync callit = new GetHttpAsync();
// Wire up to handle the complete event
            callit.GetComplete += new
                GetHttpAsync.GetCompleteHandler(this.GetCompleteHandler);
// Set the flag we will check for completion
            isComplete = false;

            Console.WriteLine("Making async call");
            callit.getPage("http://www.gotdotnet.com/team/netcf");

            Console.WriteLine("Main thread writes these dots, "
+ "while async fetch proceeds");
            Console.WriteLine("in secondary thread");
int count = 0;
while (!isComplete)
{
                Console.Write(".");
if (++count == 80) Console.WriteLine();
                Thread.Sleep(500); // Sleep for half a second
            }
            Console.WriteLine("\r\nResponse Received");
            Console.WriteLine("Press Enter to exit");
            Console.ReadLine();

return;
        }

protected void GetCompleteHandler()
{
// Event handler for get complete
            isComplete = true;
        }
    }
}

HttpGetAsyncSampleGetHttpAsync.cs
using System;
using System.Net;
using System.IO;
using System.Text;

namespace NETCFDevelopersReference
{
// The RequestState class is used to pass data
// across async calls
public class RequestState
{
public HttpWebRequest Request;

public RequestState()
{
            Request = null;
        }
    }

/**//// <summary>
/// Class makes asynchronous HTTP Get to remote URL
/// </summary>
public class GetHttpAsync
{
public delegate void GetCompleteHandler();
public event GetCompleteHandler GetComplete;

public void getPage(String url) 
{
try
{
                HttpWebRequest req =
                    (HttpWebRequest) WebRequest.Create(url);
// Create the state object
                RequestState rs = new RequestState();

// Add the request into the state 
// so it can be passed around
                rs.Request = req;

// Issue the async request
                req.BeginGetResponse(
new AsyncCallback(this.ResponseCallback), rs);
            }
catch(Exception exp) 
{
                Console.WriteLine("\r\nRequest failed. Reason:");
while (exp != null)
{
                    Console.WriteLine(exp.Message);
                    exp = exp.InnerException;
                }
            }
        }

private void ResponseCallback(IAsyncResult ar)
{
// Get the RequestState object from the async result
            RequestState rs = (RequestState) ar.AsyncState;

// Get the HttpWebRequest from RequestState
            HttpWebRequest req = rs.Request;

// Get the HttpWebResponse object
            HttpWebResponse resp =
                (HttpWebResponse) req.EndGetResponse(ar);

// Read data from the response stream
            Stream responseStream = resp.GetResponseStream();
            StreamReader sr =
new StreamReader( responseStream, Encoding.UTF8);
string strContent = sr.ReadToEnd();

// Write out the first 512 characters
            Console.WriteLine("Length: {0}", strContent.Length);
            Console.WriteLine(strContent.Substring(0, 
                strContent.Length < 512 ? strContent.Length : 512));

// Raise the completion event 
            GetComplete();

// Close down the response stream
            responseStream.Close();
        }
    }
}

---------------------------------------------------------------------

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Microsoft Domain

开源协议简介

by sundy 7/12/2009 5:26:00 AM

除了大家比较熟悉的GPL协议之外,开源界还有很多许可证,如LGPL许可证、BSD许可证等,下面就来一一介绍。

LGPL许可证

LGPL许可证是LESSER GENERAL PUBLIC LICENSE的简写,也叫LIBRARY GENERAL PUBLIC LICENSE,中文译为“较宽松公共许可证”或者“函数库公共许可证”。该许可证适用于一些由自由软件基金会与其它决定使用此许可证的软件作者所特殊设计的软件软件包─比如函数库(即Library)。
LGPL许可证

LGPL许可证,也是自由软件联盟GNU开源软件许可证的一种,大部分的 GNU软件,包括一些函数库,是受到原来的 GPL许可证保护的。而LGPL许可证,适用于特殊设计的函数库,且与原来的通用公共许可证有很大的不同,给予了被许可人较为宽松的权利,所以叫“较宽松公共许可证”。在特定的函数库中使用它,以准许非自由的程序可以与这些函数库连结。
当一个程序与一个函数库连结,不论是静态连结或使用共享函数库,二者的结合可以合理地说是结合的作品,一个原来的函数库的衍生品。因此,原来的通用公共许可证只有在整个结合品满足其自由的标准时,才允许连结。较宽松通用公共许可则以更宽松的标准允许其它程序代码与本函数库连结。例如,在少数情况下,可能会有特殊的需要而鼓励大家尽可能广泛地使用特定的函数库,因而使它成为实际上的标准。为了达到此目标,必须允许非自由的程序使用此函数库。一个较常发生的情况是,一个自由的函数库与一个被广泛使用的非自由函数库做相同的工作,在此情况下,限制只有自由软件可以使用此自由函数库不会有多少好处,故我们使用了LGPL许可证。

在其他情况下,允许非自由程序使用特定的函数库,可以让更多的人们使用自由软件的大部分。例如,允许非自由程序使用GNU C函数库,可以让更多的人们使用整个GNU作业系统,以及它的变形,GNU/Linux操作系统。

尽管LGPL许可证对使用者的自由保护是较少的,但它却能确保与此函数库连结的程序的使用者拥有自由,而且具有使用修改过的函数库版本来执行该程序的必要方法。

MPL许可证

MPL是The Mozilla Public License的简写,是1998年初Netscape的 Mozilla小组为其开源软件项目设计的软件许可证。MPL许可证出现的最重要原因就是,Netscape公司认为GPL许可证没有很好地平衡开发者对源代码的需求和他们利用源代码获得的利益。同著名的GPL许可证和BSD许可证相比,MPL在许多权利与义务的约定方面与它们相同(因为都是符合OSIA认定的开源软件许可证)。但是,相比而言MPL还有以下几个显著的不同之处:
◆ MPL虽然要求对于经MPL许可证发布的源代码的修改也要以MPL许可证的方式再许可出来,以保证其他人可以在MPL的条款下共享源代码。但是,在MPL许可证中对“发布”的定义是“以源代码方式发布的文件”,这就意味着MPL允许一个企业在自己已有的源代码库上加一个接口,除了接口程序的源代码以MPL许可证的形式对外许可外,源代码库中的源代码就可以不用MPL许可证的方式强制对外许可。这些,就为借鉴别人的源代码用做自己商业软件开发的行为留了一个豁口。

◆ MPL许可证第三条第7款中允许被许可人将经过MPL许可证获得的源代码同自己其他类型的代码混合得到自己的软件程序。

◆ 对软件专利的态度,MPL许可证不像GPL许可证那样明确表示反对软件专利,但是却明确要求源代码的提供者不能提供已经受专利保护的源代码(除非他本人是专利权人,并书面向公众免费许可这些源代码),也不能在将这些源代码以开放源代码许可证形式许可后再去申请与这些源代码有关的专利。

◆ 对源代码的定义

而在MPL(1.1版本)许可证中,对源代码的定义是:“源代码指的是对作品进行修改最优先择取的形式,它包括:所有模块的所有源程序,加上有关的接口的定义,加上控制可执行作品的安装和编译的‘原本’(原文为‘Script’),或者不是与初始源代码显著不同的源代码就是被源代码贡献者选择的从公共领域可以得到的程序代码。”

◆ MPL许可证第3条有专门的一款是关于对源代码修改进行描述的规定,就是要求所有再发布者都得有一个专门的文件就对源代码程序修改的时间和修改的方式有描述。

BSD许可证

BSD许可证原先是用在加州大学柏克利分校发表的各个4.4BSD/4.4BSD-Lite版本上面(BSD是Berkly Software Distribution的简写)的,后来也就逐渐沿用下来。1979年加州大学伯克利分校发布了BSD Unix,被称为开放源代码的先驱,BSD许可证就是随着BSD Unix发展起来的。BSD许可证现在被Apache和BSD操作系统等开源软件所采纳。
相较于GPL许可证和MPL许可证的严格性,BSD许可证就宽松许多了,一样是只需要附上许可证的原文,不过比较有趣的是,它还要求所有进一步开发者将自己的版权资料放上去,所以拿到以BSD许可证发行的软件可能会遇到一个小状况,就是这些版权资料许可证占的空间比程序还大。

QPL许可证

QPL是The Qt Public License的简称,是挪威一家机构创设的。QPL许可证的基本要求是获得源代码、修改源代码,并可将修改从原始代码中分离出来;修改可以按照作者的意愿被组合到新版本中;二进制代码可以和原始代码同名,这一点对于动态连接库来说尤其重要;任何人都可以修正错误,这对于系统的发布者来说很关键;修改过的软件可以按照满足QPL许可证基本要求的任何开源软件许可证进行发布。
QNCL许可证

QNCL许可证是Qt Non Commercial License的简称,是QPL许可证的“兄弟版”,就像GPL许可证与LGPL许可证的关系一样,QNCL许可证比QPL许可证更严格一些。
在修改和发布方面的规定,QNCL许可证与QPL许可证是一样的,差异就在于软件的范围方面,或者说在连接方面。QNCL许可证规定“假如一个应用程序给你提供了一个入口,使你有权使用QNCL许可证下的软件的功能开发程序、重复使用程序的某一部分或其他软件的某一部分,那么对该应用程序的使用视为是使用QNCL许可证下的软件的行为,该应用程序应受到QNCL许可证的约束”。QNCL许可证比QPL许可证更严格之处在于,QNCL许可证像GPL许可证那样,完全禁止根据本许可证得到的开放源码软件与其他非系统库函数连接的软件以其他许可方式一起发布。

Jabber许可证

Jabber许可证的全称是Jabber Open Source License,由美国Jabber.Com, Inc.公司提供。Jabber许可证在源代码的复制、发行规定方面基本上和其他许可证没有什么特别,但有一些细节规定值得借鉴:
◆ 可以将通过该许可证获得的源代码及修改过的源代码与其他类型的不受该许可证约束的代码结合,以新产品的形式发布,只要其中经该许可证获得的源代码及修改过的源代码能以与该许可证的要求类似的、符合OSI认证的其他开源软件许可证的方式发布。

◆ 明确了需将源代码置于公众可以得到的状态的时间至少应为12个月。

◆ 第三方对法定权利的声明。假如使用者发现通过本许可证获得的源代码及应用程序接口中有一方拥有的知识产权,应单独在源码的发布时冠以“LEGAL”为抬头的声明,写明知识产权权利要求的细节,提请源代码的接受者知道自己获得了哪些知识产权的授权,让源码的接受者知道如何与知识产权权利人联系。

◆ 细化了该许可证终止的情形,包括不按该许可证的要求发布和使用源代码、发生专利侵权诉讼。

Common许可证

Common许可证的全称是Common Public License。在满足OSIA开源软件许可证认证标准的前提下,Common许可证还有一些细节性的规定值得参考:
◆ 明确了专利授权。一般的开源软件都明确源代码的版权人将自己的修改权、复制权等版权权利向公众许可,但保留署名权,而Common许可证在此基础上还明确假如源代码中含有专利权,源代码专利权人将复制、使用的专有权利向公众许可。

◆ 规定可以将源代码及修改过的源代码与其他类型的不受本许可证约束的代码结合,以新产品的形式发布,只要其中经该许可证获得的源代码及修改过的源代码能按该许可证的要求发布即可。

◆ 细化了该许可证终止的情形,包括发生专利侵权诉讼。

◆ 明确了一个独立承担责任的原则,就是假如按该许可证使用源代码的使用者将获得的源代码应用于商业使用,那么他就要对在商业应用中出现的由于使用该源代码程序而产生的侵权诉讼承担完全责任。这一条规定是比较特殊的,绝大多数开源软件许可证都不这么要求。

IBM许可证

IBM许可证的全称是IBM Public License。在满足OSIA开源软件许可证认证标准的前提下,IBM许可证还有如下一些细节性规定:
◆ 明确了专利授权。一般的开源软件都明确源代码的版权人将自己的修改权、复制权等版权权利向公众许可,但保留署名权,而IBM许可证在此基础上还明确假如源代码中含有专利权,源代码专利权人将复制、使用的专有权利向公众许可。

◆ 细化了该许可证终止的情形,包括不按该许可证的要求发布和使用源代码、发生专利侵权诉讼等。

◆ 像Common许可证一样,IBM许可证也明确了独立承担责任原则,即假如按该许可证使用源代码的使用者将获得的源代码应用于商业使用,那么他就要对在商业应用中出现的、由于使用该源代码程序而产生的侵权诉讼承担完全责任。

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Flash,SilverLight Coming | Internet Communion | Java & OpenSource Domain | Microsoft Domain

Here we go again ; why Mono doesn't suck

by sundy 7/3/2009 11:49:00 AM

Here we go again – why Mono doesn’t suck

This post is a repost for something I sent to Linux Today. Their original message was here, where they invited people who don’t think Mono causes AIDS to justify themselves. I replied here. This is a repost, for the benefit of assorted aggregators. Some context may be lost by not reading the original “invitation” first.

—————————————————–

I am a member of the Debian Mono Group, Debian CLI Applications Team, and Debian CLI Libraries Team. I’ve been working on packaging for the Mono stack and applications which make use of it in Ubuntu (and Debian) for just under a year. And, fully aware of the flame war, threats and personal attacks which will follow, I’m going to take you up on your “invitation”. I speak for myself here – not for the Debian project, nor Ubuntu, not for the Mono project, nor for my employer.

Your request was for “a calm presentation of why Mono is desirable, why it is not a threat, and why it should be included in Ubuntu by default”. I’ll answer these three questions individually, then offer a general comment on your post, as well as the wider “anti-Mono” movement. This message is GPG-signed to ensure it is published unedited. The message as-sent will be made available at http://retro.apebox.org/herewegoagain.txt to allow people to verify authenticity signatures themselves.

More...

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Java & OpenSource Domain | Microsoft Domain

Visual Studio Team System 2010 中的敏捷规划工具(转)

by sundy 2/1/2009 2:54:00 PM

本文以 Visual Studio Team System (VSTS) 2010 的预发布版为基础。所有信息均有可能发生变更。

本文将介绍以下内容:

  • 产品和小版本规划
  • 产品积压工作簿
  • 容量规划和报表
  • 小版本积压工作簿

本文使用了以下技术:
VSTS 2010、VSTS Process for Agile Software Development 1.0

目录

长期规划
版本和小版本规划
VSTS 2010 Excel 工作簿
产品积压工作簿
容量规划
小版本积压工作簿
报表

“敏捷规划”存在语意矛盾吗?希望您不会这样认为,但在最近于洛杉矶召开的一次专项小组会议中,其中一位与会者指出其组织已从敏捷开发转为采用更为正式的方法。在经过进一步的询问后,她坦承其团队无法再根据其经理的口头要求进行代码修复并立即将修复结果部署到生产中。现在,她不得不使用正式的程序。对她而言,即意味着放弃了敏捷开发。

实际上她对敏捷开发的理解并不准确,但是我非常高兴她的组织能够制订正式的更改流程。敏捷并不是指盲目进行加速或出于速度考虑才选择敏捷的。相反,它是一种符合标准的规划方法并且其中融入了经验数据。

Visual Studio Team System (VSTS) 2010 引入了一些新的特性和功能来帮助敏捷团队进行规划。在本文中,我将向您介绍一些全新的产品积压工作簿、小版本积压工作簿以及一组新报表,它们可以帮助敏捷团队规划和管理版本和小版本。

长期规划

人们总是担心没有精确的长期规划,这已成为推广敏捷方法的主要障碍。在 2008 年度敏捷开发状况调查中,缺乏事先规划是受访组织在采用敏捷方法时最关注的问题。我怀疑对许多人来说,缺乏精确的长期规划就等同于缺乏协同规划。敏捷团队选择多个层级的规划并在瀑布式规划过程中进行期间修正,当然本来就该如此。

Steve McConnell 在软件评估的不确定性圆锥中指出,在项目中过早进行评估可能会得出不准确的结果,偏向高边的错误最高会达到 400%:“在项目早期,待构建软件本质的具体细节、特定需求的细节、解决方案的细节、项目规划、人员构成以及其他项目变数均不确定。这些因素的可变性会导致项目评估的可变性。”

当然,这并不意味着主管人员的管理策略是“我们不知道项目何时能完成,也不知道完成时会是什么样子”。它实际上是想说明团队规划版本的方法以及各版本中所完成工作的范围均存在变数。

图 1 产品和小版本积压

版本和小版本规划

对于敏捷团队而言,规划是在以下两个截然不同的层级完成的:版本规划和小版本规划。版本规划是一项高级规划活动,用于帮助敏捷团队查看各种功能或用户案例。积压中的项目随后被依次堆叠、评估并分配给一组小版本。请注意,在此阶段使用的是诸如 T 恤尺寸(小、中、大)等单位来执行评估的。其目的是粗略评估积压中各个项目的成本,而非精确的报价。这也有助于客户根据心目中的大致尺寸来依次堆叠需求。

在 Scrum 中,这组用户案例被存放在一个名为“产品积压”的列表中(请参见图 1)。每个小版本中需要处理的工作范围主要取决于团队进度。版本的定义主要取决于按照客户要求完成一组可靠需求的时间。例如,如果需要四个小版本才能实现第一组功能,则预计在第四个小版本后能形成第一个版本。

小版本规划是一项更为详细的规划活动,它在每个小版本开始之前执行。来自产品积压的高级用户案例将在核查后根据需要拆分成较小的用户案例。此时,团队已准备好将用户案例拆分成较小的案例并定义完成用户案例所需的任务。然后将会以小时为单位评估这些用户案例及相关联的任务。此时,团队可以了解到小版本的范围。

在敏捷团队的工具箱中,除索引卡和便笺外,经常还会发现 Microsoft Office Excel 这一工具。VSTS 2010 引入了两个新的 Excel 工作簿来帮助敏捷团队管理产品积压和小版本积压。但在介绍这两个工作簿之前,让我们先来快速了解一下 VSTS 2010 附带的新 Agile 过程模板。

VSTS 中的过程模板包括工作项类型、查询、报表以及文本指南。在这里工作项是关键实体。工作项可以是用户案例、任务、错误等。首先,在 Team Foundation Server (TFS) 中建立一个团队项目,然后在“New Team Project Wizard”(新建团队项目向导)中选择 VSTS Process for Agile Software Development v1.0 模板。此模板包括以下工作项类型:

  • 任务
  • 用户案例
  • 错误
  • 问题
  • 测试用例

您可以创建自己的工作项类型或自定义特定的工作项。要了解更多有关工作项自定义的信息,请参阅 Brian Randell 在 2008 年 12 月撰写的有关使用和自定义 TFS 过程模板的文章:“Team System:使用过程模板简化团队项目”。

接下来,我们将深入探讨 Excel 工作簿并了解这些工作项在开发过程中的流动方式以及它们如何帮助用户规划和管理价值流。

VSTS 2010 Excel 工作簿

在“敏捷性工具”一文中,Kent Beck 讨论了敏捷团队中存在的大量转换以及在考虑转换时对工具的需求。基于 Excel 的规划工作簿与 TFS 工作项跟踪的集成有助于最大程度地降低转换开销。通过使产品积压和小版本积压保持同步,可自动将用户案例或任务工作项的状态更新信息捕获到小版本积压中以生成各种报表,许多常见活动要么被淘汰,要么被优化。

在使用 VSTS 2010 来管理产品积压和小版本积压时,建议敏捷团队使用以下流程:

  • 使用 VSTS 2010 Agile 模板新建一个团队项目。
  • 通过将用户案例添加到产品积压工作簿或通过在 Visual Studio 中添加工作项来构建产品积压。
  • 根据各个项目在产品积压中的堆叠顺序,将其分配到某个小版本。默认情况下会创建 Iteration 0、Iteration 1 和 Iteration 2。可使用团队项目设置来创建更多的小版本。
  • 设置查询以从特定小版本中提取用户案例、任务及其他工作项,并将其映射到对应的小版本积压工作簿中。

这些工作簿与 TFS 之间的集成是通过查询实现的。图 2 显示了产品积压工作簿的配置。在 Excel 功能区中,在“Team”(团队)选项卡上选择“Work Items”(工作项)组,然后单击“Configure List”(配置列表)。这将打开“Configure List Properties”(配置列表属性)对话框。在这个对话框中,可选择一个 TFS 查询,而此查询的结果正是电子表格中所显示的内容。

图 2 Excel 工作簿中的查询

查询是在团队项目中创建的。默认情况下,在建立团队项目时,会创建一个名为 Work Items\Team Queries\Workbook Queries 的文件夹。在此文件夹下,您会发现有关产品积压和小版本积压工作簿的默认查询。

为了更好地理解工作簿的工作原理,让我们看一看 2008 年 10 月发布的 VSTS 2010 和 .NET Framework 4.0 CTP 中包含的 DinnerNow 示例应用程序。(可以在 Team Suite 开发人员中心找到最新的 CTP 下载。)产品积压和小版本积压工作簿均可在团队资源管理器的 \DinnerNow\Documents\Shared Documents 文件夹中找到。

产品积压工作簿

产品积压主要用作应用程序中客户所需的需求列表。我听说有些团队在指代一组高级需求时也使用事迹或主题之类的术语。将这组需求收集到一个列表中、确定其优先级并在较高级别评估它们,这些操作可帮助回答此规划阶段的两个重要问题:

  1. 1. 应用程序有哪些需求?
  2. 2. 它的价格是多少?很显然,其答案只能通过评估得出。我曾看到过有的团队在此阶段使用案例分数、T 恤尺寸或小时来进行评估。

通过回答这些问题,团队可以更好地了解此版本或接下来的几个版本的大致情况以及这些版本的预计完成时间。通常会存在预算或计划限制,如即将进行的广告活动、法律要求或季节性活动等。这有助于规划版本的范围,因为您可以根据此限制来管理版本的范围。

如果为版本设置了目标日期,则在发布时间框架内,可通过确定将哪些需求包括在小版本中来管理工作范围。例如,如果规划始于 12 月而发布日期定在 6 月,则实际上需要运行四到五个小版本(假定为一个月的小版本)才能完成此工作。

如果目标日期比较灵活,则发布计划将取决于完成最低限度的一组需求所需的时间。例如,如果可以在三个小版本内完成最低限度的一组必需功能,则可以设置在三个小版本后出现版本 1。如果可在五或六个小版本内完成下一组功能,则设置在这五或六个小版本后出现版本 2。

图 3 显示了 DinnerNow 项目的产品积压工作簿。您看到的是用户案例的积压。在这些用户案例中,其中多个已被分配给特定的小版本,并且某些已在 Iteration 0 和 Iteration 1 中完成。很显然,在开始一个新项目时,首先要从空白工作簿开始构建这些高级用户案例。

图 3 产品积压工作簿

这些电子表格上的各列是工作项中的字段,它们依次存储在 TFS 数据存储库中。Excel 和 TFS 之间的集成会使 Excel 中增加一个“Team”(团队)功能区(请参见图 4),利用其中的菜单项可将积压中的项目发布到 TFS 中、可利用 TFS 中更新的工作项来刷新积压,此外还有许多其他功能。

图 4 Excel 功能区中的 Team 选项卡

积压中的每一行都被存储为 TFS 中的一个工作项,如图 5 所示。经过这种形式的集成后,使用 Visual Studio 的团队成员现在可从 Visual Studio 自身中更新用户案例和其他工作项。现在,不必在不同工具之间进行切换即可更新用户案例、评估结果或剩余工作的状态。

图 5 TFS 中的工作项

容量规划

作为版本规划的一部分,敏捷团队将在电子表格中花费大量时间来新增用户案例、对其进行评估,以及更为重要的,确定它们的优先级。但是,密切关注版本的状态也同样非常重要。产品积压工作簿包括一个容量规划工作簿。通过评估用户案例及其工作所在的小版本,此工作簿可对小版本自身的快速处理提供很大帮助。

容量规划是规划版本时的一项重要活动。它有助于了解可在各个小版本中完成的功能。此计算中的关键数据点是进度。进度是在某个小版本中,团队所完成的工作量。如果恰好有来自先前小版本的数据,则它将是最佳入手点。

图 6 使用先前的小版本来计算进度

这通常被称为“根据昨天的天气进行预报”。实际上,如果 TFS 数据仓库可用,则容量规划电子表格可从其中提取历史数据。如图 6 所示,我可以选择 Iteration 1 作为从中获取历史数据的小版本,并可以键入开始日期、结束日期以及团队成员数。在本例中,进度为 816 小时,这意味着团队可以在 Iteration 1 中完成 816 个小时的工作。如果对此数据不满意,团队可以在开始时使用一个估计值,而在规划未来的小版本时使用第一个小版本的进度。

在容量规划电子表格中,可指定小版本的日期范围、团队成员的数量以及小版本期间的任何中断情况(如节假日)。通过将此数据与用户案例评估和进度相结合,可创建一个能够大体给出小版本工作负荷的图表。如果发现评估的工作超过了预期的容量限制,则您可能会希望在不同的小版本之间移动用户案例以得到一个合理的分配。

在我的示例中,我并未在 Iteration 2 中规划任何工作。我可以将积压中的一些剩余用户案例添加到 Iteration 2 中。现在,容量图表将如图 7 所示。这是一种非常不错的情形——评估工作并没有超出容量限制。

图 7 为小版本 Iteration 2 分配了工作的容量图表

项目启动后,也可以使用产品积压工作簿来了解各种用户案例的整体状态。但是,通过“剩余工时和进度”、“剩余工作”和“案例进展”等报表可以了解更为详细的信息。这些报表均包括在 Agile 模板中,可在团队项目的 Report 文件夹中找到。我将在本文的稍后部分介绍这些报表。

小版本积压工作簿

小版本是敏捷团队的一项关键活动。经常使用 Scrum 的敏捷团队非常熟悉它,将其称为“冲刺”。小版本的持续时间通常各不相同。对于使用极限编程的团队,小版本的周期为一到两周;而使用 Scrum 的团队通常有为期四周的冲刺。

小版本规划有助于定义特定小版本的范围。在小版本规划会议期间,团队通常会分析针对特定小版本分配的用户案例、收集详细的需求信息、添加相关联的任务以及评估完成每项任务所需的时间。在此会议中,产品拥有者以及团队其余成员将根据以下因素来确定用户案例的优先级:依赖关系、成本评估、详细需求以及特定案例的重要性不如当初预期的可能证据。

首先,我们来看一下 DinnerNow 团队项目中的小版本积压。在团队项目中的 Shared Documents 文件夹下包含名为 Iteration 0、Iteration 1 和 Iteration 2 的文件夹。在其中的每个小版本文件夹中,您都会看到小版本积压。每个小版本积压工作簿都会连接到一个特定查询,它只针对该特定小版本用户案例和任务。

如果添加了其他工作项类型(如功能、主题或事迹),则需要将其添加到此查询中,以便可以在列表中提取出这些额外工作项。DinnerNow 团队项目中已有多个任务被作为子项添加到 Iteration 2 的用户案例中。但通常情况下,作为小版本规划会议的一部分,团队会添加这些任务并对其进行评估以得到一个满意的 Iteration 2 小版本规划。图 8 显示了小版本积压。

图 8 包含子任务的小版本积压

TFS 现在支持分层工作项,这将允许您创建父/子树。在本例中,以下新任务被作为子任务添加到用户案例“用户应该能够通过手机使用 DinnerNow”中:

  • 确定 UI 的哪些部分用于手机
  • 针对 UI 使用卡堆栈体系结构
  • 识别大多数大众化手机
  • 减少下订单时所需的按键次数

此时,团队已做好了进行任务分配的准备。每个团队成员在选择工作量时需要考虑的因素包括该小版本的团队成员容量、领域专门技术以及团队成员加入团队的时间长短。

小版本积压工作簿还包含一些附加表单,可帮助在规划和执行时处理其他方面的问题。容量规划工作簿类似于产品积压工作簿中的工作簿。可使用此工作簿来了解团队的容量。

在规划期间以及小版本自身执行期间,负载平衡工作簿将派上用场。当出现有关某个特定用户案例的最新信息时、当发现针对某个任务的技术依赖关系时或者当某个团队成员变为不可用时,敏捷团队将在整个小版本过程中持续进行规划以执行期间修正。这些具体情况要求更新任务分配,而这正是负载平衡工作簿发挥作用的地方。

另一有趣的工作簿是用于进度跟踪的工作簿。熟悉板球运动的人们都知道术语“当前得分率”和“所需得分率”。这两个统计数据可以准确给出某个团队在比赛中的表现。通常情况下,如果所需得分率高于当前得分率,则击球团队必须加快速度才能避免失败。另一方面,如果当前得分率高于所需得分率,则表明击球团队形势不错。

在熟悉板球的读者邀请我打球之前,我想说的是其他统计数据(如出局人数和剩余轮数)对于全面了解比赛情况而言也都非常重要。在敏捷项目中也同样如此。进度跟踪表可让您快速了解在某个小版本中完成用户案例的当前团队进度和所需进度。就像板球一样,其他统计数据(如剩余天数)对于全面了解您在小版本中的进展情况也十分重要。例如,如果当前进度赶不上所需进度,则团队可能不得不缩小范围。再次重申,关键在于要让客户了解这种状况并对团队进行必要的调整。

报表

当然,您不必成为一位狂热的板球迷也可以开始利用 VSTS 2010 来管理项目。您可以借助各种报表来监视项目的进展情况(如剩余工时和剩余工作)。

图 9 显示了 Iteration 1 的剩余工时报表。剩余工时报表显示出已完成工作的小时数、剩余工作的小时数以及进度。从图表中的剩余小时数可以看出,团队并未完成分配给此小版本的所有任务。

图 9 剩余工时图表

趋势线也显示了这一状态。正如图表所显示的,实际趋势线表明在 Iteration 1 中,按照此团队的速度将无法准时完成工作。在此小版本过程中,团队可监视剩余工时并进行必要的期间修正,也可以让客户了解到发布计划可能会受到影响。

剩余工作报表也非常有用。如图 10 所示,团队在完成工作的过程中始终保持稳定的进度。在此小版本过程中,未向积压添加任何额外工作,这是一个好迹象。在接近小版本终点的时候,团队的进度也逐渐放缓,并导致未能完成任务。

图 10 剩余工作

正如您看到的,VSTS 2010 的敏捷规划工具和工作簿为团队提供了一个 Excel 前端,此外还提供了从版本规划到小版本规划以及从测试执行到编译质量等过程中捕获和挖掘数据的集成数据存储库。这为规划和管理敏捷项目的经理和团队中的开发和测试人员提供了一个极好的工具——使得他们可以协同工作、评估进度、必要时进行更改以及管理整个项目。此集成消除了敏捷团队在收集数据和生成报表时需要执行的许多手动和单调的活动。

如需更加倚重数学原理的不同方法来实现高级规划,请参考 James McCaffrey 博士撰写的有关此问题的测试运行专栏

Ajoy Krishnamoorthy 是 Microsoft 模式和实施方案小组的产品规划主管。在此之前,Ajoy 是 Microsoft Visual Studio Team System 的高级产品经理。其间 Ajoy 负责产品管理、战略和市场营销。他在曾担任过的多个职务(包括开发人员、架构师和技术项目经理)方面拥有超过 10 年的咨询经验。您可以浏览其博客,网址为:blogs.msdn.com/ajoyk

Currently rated 3.0 by 10 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Microsoft Domain

WCF中P2P通信功能开发软件

by sundy 12/29/2008 7:01:00 AM

在我们多数人考虑点对点 (P2P) 应用程序时,自然而然就会想到即时消息传送应用程序、简单文件共享程序和游戏。一般情况下,在我们考虑分布式应用程序设计时,已经习惯于默认选择客户端/服务器模型,几乎很少会想到 P2P 模型,哪怕是一闪而过的念头,尤其是对于业务应用程序更是如此。我们为什么都关注于客户端/服务器模型,其主要原因很简单:P2P 应用程序的开发过程一惯都成本高昂且耗时过长。

从传统意义来说,P2P 应用程序开发所面临的难题包括:需要开发用于消息交换的专用协议;必须查找并连接隐藏在“网络地址转换”(NAT) 或防火墙背后的某应用程序的实例;需要支持在广域网 (WAN) 中定位各应用程序所需的惯常基础结构。尽管上述难题可以克服,但已造成大量阻碍,这样就导致我们很多人都从未想过 P2P 应用程序所能提供的杰出的协作功能。
这些阻碍将随着 Windows Vista? 和附带的 .NET Framework 3.0 版本的发布而明显改善。在将 Windows Vista 的增强功能与“对等名称解析协议”(PNRP)、People Near Me (PNM) 和 Windows? Communication Foundation 中引进的 PeerChannel 功能相结合的情况下,我们又向 P2P 应用程序跨进了一大步。我个人期望在发布 Windows Vista 之后,P2P 的舞台会更加绚丽多彩。

Windows Vista 中的 P2P 开发是一个极其广泛的主题,没有任何一篇文章可以将其阐述完整。因此,我不会去尝试完成这样一个不可能的任务,而是会介绍 Windows Vista 中一些不同的 P2P 技术,并为您对 P2P 开发工作提供背景资料。
除了假定您已基本了解 Windows 窗体之外,我还假设您已略微熟悉 Windows Communication Foundation 应用程序的编写。如果情况并非如此,您可能希望通过阅读 Windows SDK 或 wcf.netfx3.com/content/resources.aspx 中的部分内容开始起步。

P2P 基本原理:网格网络
在深入探讨具体的 P2P 技术之前,研究 P2P 应用程序的一些基本原理很重要。对初学者而言,P2P 应用程序是一个与该应用程序的其他实例直接相连的应用程序。在 P2P 语言中,该应用程序的每个实例都叫做一个节点。通常将这些节点连接和命名后的组合称为网格。因此,推动 P2P 应用程序开发的技术经常被称作网格技术。PNRP、PeerChannel(在 Windows Communication Foundation 中)和 PNM 都是 Windows Vista 中网格技术的例子。
网格技术 所有 Windows Vista 网格技术所生成的网格在拓扑结构上都大致相同。通常来讲,网格拓扑是网格中各节点间连接模式的抽象体现。为了解释清楚,请在脑海中设想一个网格。我敢断定,您所设想的网格在某种程度上与图 1 中所示的网格相似。
120uk00s2b7n
图 1 全连接网格
图 1 所示网格中四个节点中的每个节点都与网格中的其他所有节点相连。换言之,如果网格中有 N 个节点,则每个节点都保持 N-1 个连接。我们将达到此标准的网格视为全连接网格。全连接网格很少被用作适合的方法;要了解原因,让我们注意一下各节点间的连接。

More...

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Microsoft Domain

[PDF] Microsoft SQL Server 2005 For Dummies

by sundy 11/11/2008 3:33:00 PM
1 vote, average: 1 out of 51 vote, average: 1 out of 51 vote, average: 1 out of 51 vote, average: 1 out of 51 vote, average: 1 out of 5

Cover

Editorial Reviews

Product Description

 

  • Now updated to reflect the much-anticipated “Yukon” release of SQL Server, this friendly guide shows database developers and administrators as well as those who use database application how to get up to speed fast
  • Offers a gentle introduction to relational database design and shows how to build databases, create database applications, and maintain and optimize database performance
  • Covers the major new features of the “Yukon” release-including analysis services, reporting services, and notification services

Download Description
Now updated to reflect the much-anticipated “”Yukon”" release of SQL Server, this friendly guide shows database developers and administrators as well as those who use database application how to get up to speed fast Offers a gentle introduction to relational database design and shows how to build databases, create database applications, and maintain and optimize database performance Covers the major new features of the “”Yukon”" release-including analysis services, reporting services, and notification services

From the Back Cover
Check out enhanced security, Integration Services, Reporting Services, and more

What’s new in SQL Server 2005? Plenty, and this guide will help make it all clear! You’ll get the rundown on how to create databases, create queries using the traditional Transact-SQL language, work with the Common Language Runtime, use the new user interface to manage SQL Server 2005, generate business intelligence applications, and more — in plain English.

Discover how to:

  • Formulate and run queries
  • Create databases, tables, and relationships
  • Create stored procedures and triggers
  • Secure your data and protect it from loss
  • Create business intelligence applications
  • Maintain a SQL Server system

About the Author
Andrew Watt (Scotland, UK) is a Microsoft Most Valuable Professional (MVP). He specializes in Microsoft technologies, including the SQL Server database and InfoPath. He is an independent consultant and experienced computer book author. He first used SQL Server in version 7.0. He is using SQL Server 2005 beta in the beta programs since August 2003.

[ Download ]

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Microsoft Domain

明日给白杰.NET班代课开始,很期待他们的小班

by sundy 11/2/2008 2:43:46 PM

小班效果一定会比较好 。

白杰学生的自主性一定也比较好 。

很期待他们

这第一个阶段的内容主要是这些课程:

l 版本控制SVN

l 关系型数据库

l 数据库设计和实现

l C# Language & .NET

l UML

l 桌面分布式开发

l 项目实践

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Microsoft Domain

微软将发布云计算平台产品Windows Azure

by sundy 10/28/2008 8:35:00 AM
     周一,在洛杉矶软件开发者大会上,微软首席架构师Ray Ozzie向外界透露微软将推出其云计算产品Windows Azure,这被业界看成是微软进军云计算的重要一步。Ray Ozzie表示,微软将和亚马逊、IBM以及其它对手竞争一样,出售信息存储空间和云端计算能力,为全球用户提供数据中心。

北京时间10月28日消息,据国外媒体报道,周一,在洛杉矶软件开发者大会上,微软首席架构师Ray Ozzie向外界透露微软将推出其云计算产品Windows Azure,这被业界看成是微软进军云计算的重要一步。
 
  Ray Ozzie表示,微软将和亚马逊、IBM以及其它对手竞争一样,出售信息存储空间和云端计算能力,为全球用户提供数据中心。Windows Azure可以让用户在不必搭建自己服务器群的情况下创建基于互联网的各种应用。

  软件工业正在经历巨大的转变:从强大的桌面运算进化到在互联网上运行各种轻量级且便宜的各种应用。Ray Ozzie的谈话表示微软也已经开始转变并跟上这种发展的趋势。不过,微软适应这种变化相当缓慢,在其先前推出的所谓"云计算"产品中,微软通过订阅方式提供一些商业服务器软件,在"Live"品牌下提供各种互联网服务。

  Windows Azure将是为云计算提供的平台产品,就像Windows对PC,Windows Mobile对手机的意义一样。不仅微软自己的应用可以运行在Windows Azure上,其他公司的应用也可以运行在其上。

  这对微软云计算策略来说是个根本性的改变。业界认为,微软推出Windows Azure将是对Google在云计算领域有力的回击,此外,Windows Azure也是对亚马逊最近推出的弹性计算云(EC2 Elastic Compute Cloud)回应。

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Microsoft Domain | Newscaster

微软发布VS2010和.net Framework 4.0社区技术预览版

by sundy 10/28/2008 8:13:00 AM
微软现在正在美国洛杉矶举行PDC2008,而会议的主角之一Visual Studio也刚刚放出了CTP(社区技术预览版),现在已经可以下载到,此次放出的只有英文版,而且不是安装文件,文件被封装在一个虚拟机镜像文件之中,需要通过虚拟机进行安装使用.








微软现在正在美国洛杉矶举行PDC2008,而会议的主角之一Visual Studio也刚刚放出了CTP(社区技术预览版),现在已经可以下载到,此次放出的只有英文版,而且不是安装文件,文件被封装在一个虚拟机镜像文件之中,需要通过虚拟机进行安装使用

首先下载Virtual PC 2007(免费软件)
http://www.microsoft.com/downloads/details.aspx?FamilyId=28C97D22-6EB8-4A09-A7F7-F6C7A1F000B5&displaylang=en

然后下载镜像文件,加载后可用
下载:Microsoft Pre-release Software Visual Studio 2010 and .NET Framework 4.0 CTP

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Microsoft Domain | Newscaster

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.
© Copyright 2007 - 2008 Design by Sundy Linghua-Zhang 蜀ICP备08108648号

About the author

Name of author Author name
Something about me and what I do.

E-mail me Send mail

Calendar

<<  September 2010  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

Recent comments

Authors

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010

Sign in