[C#]善用VS中的Code Snippet来提高开发效率

mikel阅读(948)

前言
谈谈VS中的模板中, 我介绍了如何创建项目/项模板,这种方式可以在创建项目时省却不少重复性的工作,从而提高开发效率。在创建好了项目和文件后,就得开始具体的编码了,这时 又有了新的重复性工作,就是需要经常编写一些类似或者说雷同的代码,我们需要一种方法将这些代码管理起来,减少重复输入。
一个常见的例子,在使用for语句结构时,可能会有这样的代码:

Code
int[] array = { 12345 };
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}

或者

Code
List<string> names = new List<string> { "Anders""Bill""Clark""David"};
for (int i = 0; i < names.Count; i++)
{
    
if (names[i].StartsWith("A"))
    {
        Console.WriteLine(names[i]);
    }
}

显然,这两个for循环的代码很相似:输入for,选择一个变量用作索引,该变量有个上限值,还有几个括号和分号。而且绝大多数的for循环都是 如此,那么该如何减少重复输入呢? 可以想到的一种方法是把一段for循环的代码保存在某个地方,比如一个文件内,在需要for的地方,拷贝进来,把变量名、初始值、上限修改一下就可以用 了。
VS的开发者想的很周全,提供了Code Snippet功能,从而实现了上面的想法。它保存了for循环代码的模板,然后给它一个快捷键for。现在在编辑器中(需要是C#文件),输入for,连续按两下Tab键,就会出现下面的代码:

不 仅有了for的基本代码,还定位到了变量的名字处,如果需要可以修改变量名,假设改为index,后面的两个i会自动改为index,然后按Tab,光标 会跳至下一个深色显示的地方,即length,这里可以修改index的上限,然后回车,光标会跳至for循环的代码体:

是不是很方便呢?还有很多其它Snippet,比如输入cw,按两下Tab就出来Console.WriteLine()。
很多时候,同样的功能在不同语言内的表现是不同的,所以Code Snippet(以下简称Snippet)是特定于语言的,也就是说C#的Snippet不能用于VB.NET。VS2008中的Snippet支持C#、VB.NET、XML。
Snippet的管理
首 先VS2008提供了很多内置的Snippet,另外我们也可以将自己编写的或者他人编写的导入VS中。通过菜单Tools -> Code Snippets Manager(或按Ctrl+K, Ctrl+B),打开Code Snippets Manager窗口:

可以看到上面的Language列表,现在选中的是C#。可以通过Import方式来导入新的Snippet。在使用NUnit时,由于测试代码的特点,会有很多重复输入,所以Scott Bellware提供了NUnit的Snippet,我把它放在自己的博客来了:BellwareNUnitSnippet。现在把包里的.snippet文件导入。

嗯,可以使用了。比如,输入tc,按两下Tab,出来的代码是这样的:

输入TestCase的名称,回车,这样就可以输入测试代码了。观察一下这个Snippet,它的变化之处只有一个,就是TestCase处。
接下来我们来分析一下Snippet文件的结构,这样才能编写自己的Snippet。
Snippet定义文件解析
下 面来看看Snippet是如何实现的。根据上面tc的例子,我们可以猜想要存放Snippet,至少需要模板代码、占位符、语言类型、快捷键这几个关键信 息,每个Snippet都是如此。事实上,VS把这些信息保存在XML文件中,这些信息都对应着某些节点,这个与上一篇里的模板清单文件类似。
存放Snippet的文件是XML文件,不过它的扩展名是.snippet。一个Snippet文件可以包含多个Snippet,就像上面的BellwareNUnit.snippet那样。它的基本结构如下:

XML Code
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    
<CodeSnippet Format="1.0.0">
        
<Header>
            
<Title>Code Snippet for Debug.WriteLine method.</Title>
            
<Shortcut>dw</Shortcut>
            
<Author>Anders Cui</Author>
        
</Header>
        
<Snippet>
            
<Code Language="CSharp">
                
<![CDATA[
                Debug.WriteLine(“Text”);
                
]]>
            
</Code>
        
</Snippet>
    
</CodeSnippet>
    
<!– other snippets –>
</CodeSnippets>

现在新建一个XML文件,输入上面的代码,这里我们的Snippet是输入Debug.WriteLine代码。该文件的根节点为 CodeSnippets,可以包含多个<CodeSnippet>节点。注意它的命名空间,有了这个,在VS内编辑时就方便多了。
重点关注<CodeSnippet>节点,它即表示一条Snippet。它必须包含一个Format Attribute(老是看到Attribute和Property的讨论,故在此保留),用以表示Snippet版本。另外它必须包含两个子节点:<Header><Snippet>
对 于<Header>节点,最重要的是Title和Shortcut,即Snippet的名称和快捷键;另外还有SnippetTypes,它 可以包含若干个SnippetType节点,可有三种取值,Expansion、SurroundsWith、Refactoring。 Expansion允许代码插入在光标处;SurroundsWith允许代码围绕在选中代码两边(就像#region那样);Refactoring指 定了在C#重构过程中所使用的Snippet,在自定义Snippet中不能使用。如果该值不做设置,则Snippet可以放在任何地方。
要了解<Header>的更多信息,请参看这里
对于<Snippet>节点,它是实现代码模板的地方。它包含四个子节点。
1、 <Code>节点

  • Delimiter:分隔符,默认值为$,后面你会看到它的用法。
  • Kind:Snippet的类型,比如方法体、方法声明、类型声明等。
  • Language:所适用的语言类型,如C#、VB.NET、XML。

在我们上面的例子中,已经有了Code节点了,注意这里把代码包含在<![CDATA[]]>中,因为代码很可能会包含一些特殊字符。
在上面的tc Snippet中,按下Tab后,VS会选中TestCase,这样修改起来更为方便,对于上面的dw Snippet,我们自然希望VS选中”Text”部分,这需要下面的<Declarations>节点。
2、<Declarations>节点
该节点包含若干个<Literal>和<Object>节点。它们可以看作是占位符。<Literal>用于指定一些文本值,<Object>则用于声明模板中的对象。
详细信息请参看<Literal><Object>
这里需要把”Text”看作占位符,所以添加一个<Literal>节点:

XML Code
    <Snippet>
        
<Code Language="CSharp">
            
<![CDATA[
            Debug.WriteLine($text$);$end$
            
]]>
        
</Code>
        
<Declarations>
            
<Literal>
                
<ID>text</ID>
                
<ToolTip>Text to write</ToolTip>
                
<Default>"Text"</Default>
            
</Literal>
        
</Declarations>
    
</Snippet>

这里添加了一个占位符$text$,默认值为”Text”,行末的$end$是一个特殊的占位符,它表示当你按下回车后光标的位置
3. <Imports>节点
用于指定使用Snippet时应当向文件内添加的命名空间引用,不过只支持VB.NET。
4. <References>节点
用于指定使用Snippet时应当向添加的程序集引用,同样只支持VB.NET:(
好了,现在可以测试一下我们的Snippet了,将文件保存为.snippet文件,然后导入。

 
还不错吧?
Code Snippet 函数
前面说到,<Imports>和<References>节点只能用于VB.NET,而这里的Code Snippet函数则只能用于C#。
在<Literal>和<Object>节点中,都包含了子节点<Function>,这些函数是VS的一部分,有时会比较有用。共有三个函数:
1. GenerateSwitchCases(EnumerationLiteral),根据提供的枚举类型生成一个switch语句和一系列case语句,事实上,C#中已有这样的一个例子:

回车确认:

2. ClassName(),返回Snippet所在类的名称。
3. SimpleTypeName(TypeName),在Snippet所在的上下文中推断出TypeName参数的最简单形式。
下面以SimpleTypeName为例来看一下这些函数的用法:

XML Code
<Snippet>
    
<Code Language="CSharp">
    
<![CDATA[
    $NameOfDebug$.WriteLine($text$);$end$
    
]]>
    
</Code>
    
<Declarations>
        
<Literal>
            
<ID>text</ID>
            
<ToolTip>Text to write</ToolTip>
            
<Default>"Text"</Default>
        
</Literal>
        
<Literal Editable="false">
            
<ID>NameOfDebug</ID>
            
<Function>SimpleTypeName(global::System.Diagnostics.Debug)</Function>
        
</Literal>
    
</Declarations>
</Snippet>

这里比前面的Snippet添加了一个Literal,为什么需要这么做呢?我们知道System.Diagnostics命名空间默认情 况下是没有引用的,如果使用Debug类,还需要引用System.Diagnostics。这里的妙处在于VS会推断NameOfDebug的最简单形 式,如果没有引用System.Diagnostics,它会在Debug前面加上,否则就不会加上。
几条建议
首先,Snippet的定义都在XML中,因此也算得上是代码,所以在命名上与其它代码无异,都要选择更有意义或者相关性的名字。命名快捷键的一个做法是使用首字母的缩写,比如Assert.AreEqual(expected, actual);的快捷键为ae。
另外,记得填写ToolTip节点的内容,这些内容在使用Snippet时会看到。

其它工具

虽然Snippet可以简化代码输入,可是它本身的编写却并非很方便,使用一些可视化工具会更好,比如Snippet Editor,有兴趣可以试一下。
另外,这个世界还有很多人在编写Snippet,比如gotcodesnippets.com,所以在动手编写之前可以先搜索一下:)
小结
本文介绍了Code Snippet的使用和编写,它可以看作是代码片段的模板,在粒度上比项目/项模板更小,从而进一步提高了工作效率。
参考
《Professional Visual Studio® 2008 Extensibility》

作者:Anders Cui
出处:http://anderslly.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

[MVC]在asp.net mvc上应用新ASP.NET图表控件

mikel阅读(845)

微软去年11月发布了一个很酷的新ASP.NET服务器控件,<asp:chart />,可以免费用在ASP.NET 3.5中,而且还可以用在ASP.NET MVC。可以看新ASP.NET图表控件<asp:chart runat="server"/>

相关资源的下载链接:

  • Download the free Microsoft Chart Controls
  • Download the VS 2008 Tool Support for the Chart Controls
  • Download the Microsoft Chart Controls Samples
  • Download the Microsoft Chart Controls Documentation

    这位台胞的两篇相当不错的文章

    Microsoft Chart Controls 心得(1)

    Microsoft Chart Controls 心得(2) – 如何透過圖表傳值

  • 园子里的相关文章:
    ASP.NET图表控件
    我今天才知道ASP.NET图表控件发布了,附一个在线文档

    在这里有一篇文章简短介绍了Combining ASP.NET MVC and ASP.NET Charting Controls

    编辑Web.Config
    将控件的命名空间加到 (path: "<system.web><pages><controls>") :

    <add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting" assembly="System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    
    添加一个 httpHandler ("<httpHandlers>"下面) :
     <add path="ChartImg.axd" verb="GET,HEAD" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
    将chart 控件添加到view
    <p>
    <%
    System.Web.UI.DataVisualization.Charting.Chart Chart2 = new System.Web.UI.DataVisualization.Charting.Chart();
    Chart2.Width = 412;
    Chart2.Height = 296;
    Chart2.RenderType = RenderType.ImageTag;
    Chart2.Palette = ChartColorPalette.BrightPastel;
    Title t = new Title("No Code Behind Page", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold), System.Drawing.Color.FromArgb(26, 59, 105));
    Chart2.Titles.Add(t);
    Chart2.ChartAreas.Add("Series 1");
    // create a couple of series
    Chart2.Series.Add("Series 1");
    Chart2.Series.Add("Series 2");
    // add points to series 1
    foreach (int value in (List<int>)ViewData["Chart"])
    {
    Chart2.Series["Series 1"].Points.AddY(value);
    }
    // add points to series 2
    foreach (int value in (List<int>)ViewData["Chart"])
    {
    Chart2.Series["Series 2"].Points.AddY(value + 1);
    }
    Chart2.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
    Chart2.BorderColor = System.Drawing.Color.FromArgb(26, 59, 105);
    Chart2.BorderlineDashStyle = ChartDashStyle.Solid;
    Chart2.BorderWidth = 2;
    Chart2.Legends.Add("Legend1");
    // Render chart control
    Chart2.Page = this;
    HtmlTextWriter writer = new HtmlTextWriter(Page.Response.Output);
    Chart2.RenderControl(writer);
    %>
    </p>
    效果如下:
    mschartmvc 
    本文代码基于asp.net mvc rc版本:MVCCharting
    作者: 自由、创新、研究、探索……
    出处:http://shanyou.cnblogs.com/
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
    个人网站: http://www.openbeta.cn

    [SQL]SQL Server的存储过程和用户自定义函数

    mikel阅读(972)

    一.创建存储过程

     

    二.更改存储过程

         Alter PROC 会保留任何在为存储过程所建立的许可。它在系统对象中保留相同的对象ID,同时也允许保留其依赖性。譬如,如果存储过程A调用存储过程B,而又删除和重建 了存储过程B,这时就不再能看到这两者之间的依赖性。如果使用Alter修改存储过程B,其依赖性就仍然是存在的。

         Alter PROC 保留了任何其他需要调用该被修改存储过程对象上的依赖信息。如果执行Drop再执行Create,可以得到同Alter PROC几乎相同的结果,只除了一个较大的差别,如果先执行Drop再Create,你需要重新建立许可,以确定谁能访问该存储过程,谁不能访问该存储过 程。另外,再删除它之前,SQL SERVER会丢失对依赖它的任何过程、视图、触发器、函数的依赖性信息的追踪。     

    三.参数

         1.参数声明

              语法:@参数名 [AS] 数据类型 [ = 默认值 | NULL] [VARYING] [OUTPUT | OUT]

              注:在声明CURSOR类型的参数时,必须同时使用VARYING和OUTPUT选项。

              变量总是被初始化为NULL,而参数不同。如果没有为参数指定默认值,则在调用存储过程时要求必须提供参数的初始值。

         2.输出参数:OUTPUT

              从存储过程中往调用该存储过程的地方传递非记录集形式的信息。

    四.返回值

         1.正确的使用方式:用来确认存储过程的执行状态。

         2.RETURN:实际上,无论是否指定返回值,程序都会返回一个值。默认时,在存储过程完成时,SQL SERVER会自动返回一个值0。

    五.错误处理

     

    六.存储过程能提供什么

         1.创建可调用的存储过程

              存储过程可以调用其他存储过程(嵌套)。在SQL SERVER 2005 中,最多可以进行32层嵌套。

         2.安全

              像视图一样,可以创建一个返回记录集的存储过程,而不需要为用户提供访问该数据表的授权。

              允许某人有权执行存储过程,意味着他们可以在存储过程中进行任何操作,所提供的操作是在存储过程的上下文环境中被执行的。

         3.性能

              存储过程被创建后,第一次执行时,存储过程被优化,查询计划被编译并被缓存到系统中。当再次执行该存储过程时,存储过程如果在 内存中,则使用内存中的查询计划;如果不在,则重新编译,并添加到内存中。这意味着,当多次执行存储过程的时候,只需一次优化和编译的过程。

              (1)好的存储过程变坏时

              存储过程最重要的事情之一是:除非你手工干涉(使用WITH RECOMPILE选项),它们将基于或者是第一次运行,或者是查询中所包含的表的统计状态被更新时而优化。

              当一个存储过程包含的查询超过一条,并且依赖于参数的值来选择正确的查询来运行时,“一次优化,多次使用”的策略就会导致存储 过程性能降低的情况。当第一次执行存储过程时,它走过一些IF…ELSE…语句,并找到正确的查询来执行。不幸的是,这只是针对该特定时刻的正确 查询,只是它未知时刻的百分之几。在第一次之后的任何时候,存储过程选择不同的查询来运行,然而,它还是会使用基于第一次运行时刻的查询计划。这时,存储 过程的性能就被降低了。

              (2)WITH RECOMPILE

              仍然使用存储过程的安全性和代码区域化带来的好处,而同时可以忽略预编译代码方面的事情。这可以使你避过使用不正确的查询计划的问题,你可以针对当前的运行,确定创建新的计划。方法就是使用WITH RECOMPILE选项。

              首先,可以在运行时刻包括WITH RECOMPILE选项,如:EXEC [PROC] WITH RECOMPILE。这告诉SQL SERVER将现有的查询计划抛开,并创建一个新的计划,但是只针对这一次——就是说,只对执行该存储过程的这次使用WITH RECOMPILE选项。

              其次,也可以通过在存储过程中添加WITH RECOMPILE选项,让配置变成永久的,在Create或Alter PROC语句中的AS语句前直接添加该WITH RECOMPILE选项。这时,该存储过程在每次被运行的时候都被编译,而不管在运行时刻所选择的其他选项。

    七.用户定义函数(UDF)

         1.返回标量值的UDF

             (1)返回值类型:除了BLOB、游标(cursor)和时间戳(timestamp)之外,它可以返回任何有效的SQL Server数据类型(包括用户定义的数据类型!)。

             (2)与存储过程相比的好处:

                   a.不像存储过程,返回值的所有目的就是提供有用的数据块——对于存储过程,返回值是其执行成功或者失败的标志,并且,在失败的时候,针对失败的种类提供某些特定的信息。

                   b.可以在查询中内联执行函数(例如,可以将它作为Select语句的一部分包含进来),而存储过程却不可以。

         2.返回表的UDF

              (1)在大多数情况下,返回的表可以像其他表一样使用。可以在其上执行JOIN,甚至可以对结果应用Where条件。

              (2)确定性。用户定义的函数可以是确定的,也可以是非确定的。如果给定一系列指定的输入函数每次都可以返回准确的相同的值,那么该函数就被称作确定的。反之,则被称为非确定的。

                   只有当视图或计算列的结果可以被可靠地确定时,才允许在视图或计算列上构建索引。

                   可以使用OBJECTPROPERTY函数来进行这个检查。返回0代表是非确定的,返回1代表是确定的。

                   Select OBJECTPROPERTY(OBJECT_ID('[FUNCTIONNAME]', 'IsDeterministic')

    [Javascript]实现固定多层表头的总结与分享

    mikel阅读(841)

     前几天忙于table固定多层表头的实现,现对其实现过程进行总结如下:

      思路1:完全通过样式来实现,但实现过程中发现页面在Visual Studio 2008、Dreamweaver等开发工具中预览没有任何问题,但在IE显示的时候表头显示不正常,具体问题可参见 求“table固定多层表头”所遇问题的解答!   ,有博友说是“IE的BUG吧。实际的rowspan居然与位于第几行有关(顶部的没多,位于第二行的,多一行,位于第三行的,多二行……)。试几种方法都避不开。”,具体是什么原因到现在还没弄明白(此思路暂未能实现,具体原因还没找到,希望知道的博友帮忙回答一下);

      思路2:通过JS+样式来实现,先把完整表画在页面上,然后在页面加载后,利用脚本,把表头部分在原表中隐藏,之后,在这张完整数据表的上面加一个单独的表,这个表只装表头,不过在统一两个表的列宽的时候花费了我不少力气(此思路已实现)。
       
    思路2实现效果图:

    思路2实现代码:

    Code


    思路1实现固定单层表头(奇怪,使用同样的方法,对于实现固定单表头成功,但对于实现固定多层表头却有问题):

    效果图如下:

    实现代码:

    Code

     

         思路1实现固定单表头及固定列:
    效果图:

    实现代码:

    Code

    实现表头固定,表体可滚动的GridView:
    效果图:

    实现方式及代码可参考:http://blog.csdn.net/net_lover/archive/2006/10/10/1328729.aspx
    本文参考资料:
    http://www.dlmu.net/pe/webdesign/ShowArticle.asp?ArticleID=26970
    http://blog.csdn.net/szwangdf/archive/2008/07/31/2750468.aspx

    [C#]公交车路线查询系统后台数据库设计2

    mikel阅读(1043)

    数据库下载(该数据库已经输入了广州市350条公交车路线作为测试数据) 

     

    在《公交车路线查询系统后台数据库设计——查询算法》 一文中,已经实现了查询站点到站点的路线查询算法,但是,现实中用户不一定使用站点进行查询,而是使用地名。因此,公交车查询系统数据库必需记录地名与站 点的对应关系,在查询时将地名映射为站点。根据实际情况,某一地点附近通常有几个站点,因此,地名与站点之间是多对多的关系。显然,只需创建一个地名站点关系表stop_spot(Stop,Spot)用于储存这个关系即可。数据库关系图如下:

    注:

    Route:路线表
    Stop
    :站点表
    Spot
    :地名表
    stop_route
    路线站点关系表
    stop_spot
    :地名站点关系表

    1.路线和地名信息维护:

    以下函数用于维护公交车路线和地名的相关信息

    字符串分割函数(信息处理的及路线查询的存储过程都需要使用到该函数) : 

    SplitString

     

    插入新的公车路线: 

    InsertRoute

     

    插入新地名函数: 

    InsertSpot

     

    2.路线查询

    在《公交车路线查询系统后台数据库设计——查询算法》一文中,使用储存过程InquiryT0InquiryT1InquiryT2实现了站点到站点的查询,但是地名可能对应多个站点,因此,当进行地点到地点的查询相当于站点集到站点集的查询。因此,为了支持使用地名进行查询,将InquiryT0InquiryT1InquiryT2修改为站点集到站点集的查询:

    直达路线查询: 

    InquiryT0

     

    一次换乘查询: 

    InquiryT1

     

    二次换乘查询:

    InquiryT2

     

    综合查询: 

    Inquiry

     

    如要进行地名到地名的路线查询,必需先调用GetStopsOfSpot获取地名对应的所有站点,在调用Inquiry进行查询。 

    获取地名对应的站点: 

    GetStopsOfSpot

     

    使用地名查询乘车路线示例:

    declare @sps varchar(1024),@eps varchar(1024)
    set @sps=dbo.GetStopsOfSpot('起始地点名称')
    set @eps=dbo.GetStopsOfSpot('目的地点名称')
    exec Inquiry @sps,@eps

    [应用]检测你的ISP是否对BT实施了限制

    mikel阅读(925)

    根据各地不同网友的反映,有一些ISP有对BT进行限制,但由于bt还受种子等其他因素影响,所以有时不一定能判断是否是ISP进行限制还是种子不好的缘故。最近看到了Glasnost提供的一项服务可以让我们快速了解自己的ISP是否有限制BT下载速度。

    进入Glasnost,你可以选择全面测试(7分钟)和简单测试(4分钟)两种方式,点击测试时会提醒你安装一个Java plugin,安装好之后就可以继续测试了。在测试结果页面最后两项就可以看到结果,我的ADSL线路测试的结果如下,ISP未作限制。

    Is TCP traffic on a well-known BitTorrent port (6888) throttled?

    * There’s no indication that your ISP rate limits all downloads at port 6888. In our test, a TCP download on a BitTorrent port achieved at least 53 Kbps while a TCP download on a non-BitTorrent port achieved at least 40 Kbps. You can find details here.

    * There’s no indication that your ISP rate limits all uploads at port 6888. In our test, a TCP upload on a BitTorrent port achieved at least 58 Kbps while a TCP upload on a non-BitTorrent port achieved at least 73 Kbps. You can find details here.

    另外Glasnost还给出了世界各地测试的结果,其中加拿大和中国的限制最多,大家有兴趣也可以测试下本地的ISP看看是否有限制bt速度。

    (此图为全世界bt限制分布图,红色为有限制的区域)

    btest

    [Flex]Flex与.NET互操作系列文章索引

    mikel阅读(859)

     本系列文章主要介绍了关于Flex与.NET结合开发中的一些互操作性,包括网络通信、数据加载、数据传输、文件传输、以及应用于Flex与.NET协作开发的通信网关开源项目FluorineFx的相关知识点。

         开源项目FluorineFx就是专门针对.NET平台与Flex通信提供的AMF协议通信网关,我们可以通过FluorineFx很方便的完成与.NET的通信。

         FluorineFx官方提供了安装包的下载和在线文档,可以帮助我们有效的利用FluorineFx来开发。 

         FluroineFx官方网站http://www.fluorinefx.com/    

         FluroineFx下载地址:http://www.fluorinefx.com/download.html

         FluroineFx在线文档:http://www.fluorinefx.com/docs/fluorine/index.html

         

         本系列文章的程序开发环境选择如下:

         .NET:Microsoft Visual Studio 2008 + .NET Framework 3.5

         Flex:Adobe Flex Builder CS3 + Flex SDK 3.2

         FluroineFx:FluorineFx v1.0.0.15 (点击可下载)

         文章目录如下:

         1、Flex与.NET互操作(一):基于Socket的网络连接

         2、Flex与.NET互操作(二):基于WebService的数据访问(上)

         3、Flex与.NET互操作(三):基于WebService的数据访问(下)

         4、Flex与.NET互操作(四):使用HttpService、URLReqeust和URLLoader加载/传输数据 

         5、Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载

         6、Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx

         7、Flex与.NET互操作(七):了解FluorineFx的环境配置(远程对象、网关、通道、目的地)

         8、Flex与.NET互操作(八):使用FluorineFx网关实现远程访问   —-NEW

     

    版权说明

      本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

      作      者:Beniao

     文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

     

    [C#]MYOP简介

    mikel阅读(896)

    Manyou Open Platform(Manyou开放平台/MYOP)服务是由Comsenz公司为应用开发者提供的开放平台。

    MYOP被设计为能够满足大容量数据及频繁存取的需要,因此是应用服务器与UCenter Home用户网站之间的通信桥梁。MYOP通过专有API与UCenter Home进行通信,根据应用开发者的需要,调用UCenter Home的相应数据,并将其缓存,封装成若干API接口,以供应用开发者使用。

    由于UCenter Home被设计成可以在几乎任何支持PHP/MySQL的虚拟主机或服务器上使用,而应用开发者通常又需要大量频繁存取UCenter Home上的相关数据,以使得应用能够和UCenter Home用户网站紧密的整合,成为网站的一部分。因此,考虑到UCenter Home复杂的服务器环境及UCenter Home安装服务器运算能力、存储能力的限制,MYOP致力于分担UCenter Home服务器的数据存取压力,使得应用开发者能够尽可能不受到速度影响的,充分使用API接口满足自身需要。

    MYOP由较强运算能力的服务器集群构成,通过对UCenter Home用户网站数据的缓存及分布式处理,保证应用开发者对API响应速度的需求。由于MYOP与UCenter Home用户网站服务器只使用较为简单的数据同步和触发机制,同时确保无论API如何被应用调用,基本都不会影响到用户网站服务器的稳定运行。

    同时,MYOP能在一定程度上解决同一个应用运行于不同版本的UCenter Home上的兼容性问题。MYOP与UCenter Home之间的专有API接口,将尽可能的考虑不同版本UCenter Home的差异性问题,使得应用开发者不必过多受到UCenter Home版本差异性的困扰。但不可避免的是,如同所有软件产品一样,随着技术的发展,在UCenter Home产品架构进行重大升级或调整的情况下,有可能应用开发者仍然需要进行一些版本适配的工作,以确保应用可以完好的运行于新的产品中。

    MYOP与UCenter Home

    值得应用开发者注意的是,所有基于MYOP开发的应用程序,事实上逻辑层都是运行于应用开发者自己的服务器,经过MYOP的代理,或iframe方式,展现在各种UCenter Home用户网站上。因此MYOP提供的API,是一套真正实现一次编写,到处运行的协议。

    得益于MYOP与UCenter Home的紧密整合特性,对于访问者而言,在访问各种不同类型的UCenter Home用户网站时,例如股票SNS,旅游SNS,高校SNS,地区SNS等等,均会感觉到这些MYOP应用程序是运行在UCenter Home用户网站上,从而获得十分良好的使用体验,而实际上这些应用程序所实现的功能,是由UCenter Home+MYOP+应用服务器共同提供的。

    开始之前

    在您开始着手第一个基于MYOP的应用之前,请务必仔细阅读《MYOP应用服务协议》,在您完全理解、同意并遵守《协议》各项条款的基础上,方可开始进一步的工作。

    [测试]LoadRunner测试工具大全下载,破解,licence

    mikel阅读(907)

    目前的版本有7.8,8.0,8.1下面是他们的下载地址,大家看自己的情况下载

    安装程序资源

    (eMule资源)

    《工业标准级负载测试工具 LoadRunner》(LoadRunner)7.8 汉化版

    《LoadRunner 8.0 工业级测试工具》(LoadRunner 8.0)

    《负载测试》(MERCURY LOADRUNNER)V8.1[Bin]

    LoadRunner.V8.1.Chinese.Pack.iso

    LoadRunner.V8.1.iso

    (FTP资源)

    LoadRunner 8.1下载地址

    LoadRrunner 8.0下载

    最新LoadRunner8.1和中文包下载(请大家不要外传,只服务51testing,尽快下载)

    单线程,我自己测试,速度100k左右

    ftp://vodzy.com:vodzy.net@www.vodzy.com/LoadRunner.V8.1.Chinese/LoadRunner.V8.1.iso

    ftp://vodzy.com:vodzy.net@www.vodzy.com/LoadRunner.V8.1.Chinese/LoadRunner.V8.1.Chinese.Pack.iso

    教材资源

    不需要在网上找。安装了loadrunner 8.1中文包后,安装目录里面就是网络上面流传的一系列中文教程,所以不需要到处找。

     

    LoadRunner8.1的破解方法:

     

    LR8.1版本已经将7.8和8.0中通用的license封了,因此目前无法使用LR8.1版本,包括该版本的中文补丁。
    破解思路:由于软件的加密程序和运行的主程序是分开的,因此可以使用7.8的加密程序覆盖8.1中的加密程序,这样老的7.8和8.0中通用的license就可以使用了。
    操作步骤:
    1、用官方版的LR8.1安装,也可以安装中文补丁。安装包可以到51testing的ftp上下载
    地址是:
    ftp://edu.51testing.net
    用户名:gongju
    密码:51testing
    注:目前1testing上的ftp已经关闭,无法下载,请大家到处找找,应该有很多地方可以下的
    2、

    文件: LR8.1(中文版)破解方法大公布.rar
    大小: 179KB
    下载: 下载

    将LR7.8或者LR8.0(安装包或者安装后目录中的都可以)中的
    lm70.dll
    mlr5lprg.dll
    这两个文件复制并粘贴到LR8.1安装目录下的bin文件夹下,一般是C:\E:\Program Files\Mercury\LoadRunner\bin;
    lm70.dll 文件的描述是 with conbined license support,是一个license的支持文件;
    mlr5lprg.dll应该是一个保存license的文件。
    大家可以试一试,其实不要替换mlr5lprg.dll也是可以的,只替换lm70.dll文件,老的license一样能注册通过,但是软件的试用的license还在。
    3、运行LR8.1,打开license管理器,点击添加new license,将老license复制进去,OK,验证通过!
    7.8、8.0通用的license有:
    golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
    web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
    此方法适用于英文原版8.1和中文版8.1。

    2007年6月25日,补充一个500用户的license。在网上看到的,原文如下:

    =================================================================

    找到一个500VU的LoadRunner 8.0 Global licence,尽管已经过期,但在控制端改时间就可以解决,不会影响到测试。暂时解决了要测试大于100并发是要做多个控制端的问题。
    LoadRunner太贵了,按我们的需求,买正版需要250万 RMB, 我想这个价格在国内,没有多少家公司愿意买正版的。 难怪Mercury卖给HP竟然能卖到54亿美元,被盗版也活该。
    licence:
    BGAUGLIX-AJGI-AEIEKEKJJKEAFJP-BDFHW
    Valid until 31. 十月 2003 

     ========================================================

    另外一个licence,号称是1000个 无限制的。

    43BA53A2-9D620712-41909045 1000, unlimited

    ================================================

    独创的倒换注册表,实现的1000个global,10000个web用户的licence。欲要这个注册表文件,请联系博主。