一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Backend

浅谈ThreadPool 线程池

相关概念:     线程池可以看做容纳线程的容器;     一个应用程序最多只能有一个线程池;     ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池;     每排入一个工作函数,就相当于请求创建一个线程; 线程池的作用: 线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。 如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止。 什么时候使用ThreadPool? ThreadPool 示例一 : ThreadPool_1.cs using System; using System.Text; using System.Threading; namespace 多线程 { public class Example { public static void Main() { // Queue the task.             ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); Console.WriteLine("Main thread does some work, then sleeps."); Thread.Sleep(1000); Console.WriteLine("Main thread exits."); } static void ThreadProc(Object stateInfo) { // No state object was passed to QueueUserWorkItem, // so stateInfo is null.             Console.WriteLine("Hello from the thread pool."); } } } ThreadPool 示例二 : ThreadPool_2.cs using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace CS_Test { class ThreadPool_Demo { // 用于保存每个线程的计算结果         static int[] result = new int[10]; //注意:由于WaitCallback委托的声明带有参数, //      所以将被调用的Fun方法必须带有参数,即:Fun(object obj)。         static void Fun(object obj) { int n = (int)obj; //计算阶乘             int fac = 1; for (int i = 1; i <= n; i++) { fac *= i; } //保存结果             result[n] = fac; } static void Main(string[] args) { //向线程池中排入9个工作线程             for (int i = 1; i <= 9 ; i++) { //QueueUserWorkItem()方法:将工作任务排入线程池。                 ThreadPool.QueueUserWorkItem(new WaitCallback(Fun),i); // Fun 表示要执行的方法(与WaitCallback委托的声明必须一致)。 // i   为传递给Fun方法的参数(obj将接受)。             } //输出计算结果             for (int i = 1; i <= 9; i++) { Console.WriteLine("线程{0}: {0}! = {1}",i,result[i]); } } } } ThreadPool的作用: 参考来源: C#多线程学习(四) 多线程的自动管理(线程池)  [叩响C#之门]写给初学者:多线程系列( 十一)——线程池(ThreadPool) from:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html

龙生   30 Jun 2014
View Details

盘点前 10 名的免费跨浏览器测试工具

在多个平台上测试多种浏览器不但是很困难的 – 它几乎不可能的,因为没有那些好的测试工具。今天,我们就为大家提供很多涉及到跨浏览器测试的选择,并且告诉你那些“顶级的浏览器测试工具”,你应该使用哪一个。 这前10名的免费跨浏览器测试工具没有特定的顺序,因为他们对于任何特定的设备都同样有效。如果你手动去测试,可能既困难又耗费时间。因为你只能不断的安装更多的浏览器在你的设备上。 不要忘了在下面评论一下,留点反馈信息来改善我的博客质量额。如果你喜欢这篇文章,可能有兴趣看看其他相关的一些文章: 1. Browsera Browsera 可以测试和报告在您的网站上的跨浏览器布局的差异和脚本错误。 Browsera不同于其他跨浏览器测试服务。其他服务,如Litmus,Browsershots,BrowserLab,以及 SuperPreview,它们仅仅截取每一个特定的页面,你必须具体再分析才行。 官方网站 2. BrowserStack BrowserStack提供实时的,基于Web的浏览器测试的能力。可以即时访问每个桌面和移动浏览器(目前超过300个),具有在内部服务器进行本地测试的能力,并且提供一个安全的设置。 官方网站 3. Lunascape Lunascape是一款免费的三重引擎的浏览器。这意味着,你可以用三叉戟(IE),蛤蚧(火狐)和Webkit(Chrome和Safari)运行和测试一个新的网站,并且可以排在一起比较渲染引擎的效果。 官方网站 4. CrossBrowserTesting CrossBrowserTesting允许用户与超过100分辨率/浏览器/操作系统组合,测试他们的网站。它还为移动网络浏览器提供重要的支持,因为现在的互联网流量正从主要的桌面电脑用户向移动用户进行转移。 官方网站 5. Browserling Browserling和Testling作为我们部署测试流程的一部分,是基于我们公布的JavaScript库的PubNub JavaScript的用户群。这可以对快速测试所有的JavaScript环境提供一流的服务。 官方网站 6. Browsershots Browsershots可以为你设计的网页在不同的操作系统和浏览器中进行屏幕截图。这是一个免费开源的在线Web应用程序,开发人员提供了一个简单方法来测试在他们的网站在一个地方的浏览器兼容性。 官方网站 7. Litmus Litmus 提供跨浏览器网页测试,而且可以发送到你电子邮件进行预览。只要填写一个网址,它就会告诉你怎样适应当下流行的Web浏览器。 官方网站 8. Spoon Spoon 是一个很好的资源,它可以让你实时使用最流行的浏览器测试你的网站,包括Opera,火狐,Chrome和Safari等。 不过IE浏览器是不允许的,因为微软不提供许可。 官方网站 9. Sauce Labs Sauce Labs 提供了一个相当独特的跨浏览器测试体验。它并不是简单地把你的网站在不同的浏览器进行截图,而是室可以让你记录你网站的实时测试效果。 官方网站 10. Ghostlab Ghostlab提供同步测试滚动,点击,重新加载等,并形成信息输入到所有的连接设备,这意味着你可以测试整个用户体验,而不仅仅是一个简单的页面。 官方网站 总结:已经工作的时候很少用到专业的浏览器测试工具。大都是用个ieTest加上火狐和chrome就搞定一切了,多了也就是用个在线网页测试工具。一些细微的兼容性测试也是自己慢慢修改,费时又耗力。想要确保代码在各种主流浏览器的各个版本中都能正常工作,建议还是用一下上面提供的这些浏览器兼容性测试工具吧,应该能够事半功倍! 注:原文参考自:Top 10 Great Free Cross Browser Testing Tools 。本文由欲思原创编译,部分翻译删改或有误请谅解。 稿源:欲思博客 » 盘点前10名的免费跨浏览器测试工具 from:http://www.oschina.net/news/53246/free-cross-browser-testing-tools

龙生   30 Jun 2014
View Details

lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)

//封装类   [csharp] view plaincopyprint? using System;   using System.Collections.Generic;   using System.Linq;   using System.Web;   using Lucene.Net.Analysis;   using Lucene.Net.Index;   using Lucene.Net.Documents;   using System.Reflection;   using Lucene.Net.QueryParsers;   using Lucene.Net.Search;   namespace SearchTest   {       /// <summary>       /// 盘古分词在lucene.net中的使用帮助类       /// 调用PanGuLuceneHelper.instance       /// </summary>       public class PanGuLuceneHelper       {           private PanGuLuceneHelper() { }             #region 单一实例           private static PanGuLuceneHelper _instance = null;           /// <summary>           /// 单一实例           /// </summary>           public static PanGuLuceneHelper instance           {               get               {                   if (_instance == null) _instance = new PanGuLuceneHelper();                   return _instance;               }           }           #endregion             #region 分词测试           /// <summary>           /// 分词测试           /// </summary>           /// <param name="keyword"></param>           /// <returns></returns>           public string Token(string keyword)           {               string ret = "";               System.IO.StringReader reader = new System.IO.StringReader(keyword);               Lucene.Net.Analysis.TokenStream ts = analyzer.TokenStream(keyword, reader);               bool hasNext = ts.IncrementToken();               Lucene.Net.Analysis.Tokenattributes.ITermAttribute ita;               while (hasNext)               {                   ita = ts.GetAttribute<Lucene.Net.Analysis.Tokenattributes.ITermAttribute>();                   ret += ita.Term + "|";                   hasNext = ts.IncrementToken();               }               ts.CloneAttributes();               reader.Close();               analyzer.Close();               return ret;           }           #endregion             #region 创建索引           /// <summary>           /// 创建索引           /// </summary>           /// <param name="datalist"></param>           /// <returns></returns>           public bool CreateIndex(List<MySearchUnit> datalist)           {               IndexWriter writer = null;               try               {                   writer = new IndexWriter(directory_luce, analyzer, false, IndexWriter.MaxFieldLength.LIMITED);//false表示追加(true表示删除之前的重新写入)               }               catch               {                   writer = new IndexWriter(directory_luce, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);//false表示追加(true表示删除之前的重新写入)               }               foreach (MySearchUnit data in datalist)               {                   CreateIndex(writer, data);               }               writer.Optimize();   […]

龙生   27 Jun 2014
View Details

使用Lucene.Net实现全文检索

目录 一 Lucene.Net概述 二 分词 三 索引 四 搜索 五 实践中的问题   一 Lucene.Net概述 Lucene.Net是一个C#开发的开源全文索引库,其源码包括“核心”与“外围”两部分。外围部分实现辅助功能,而核心部分包括: Lucene.Net.Index 提供索引管理,词组排序。 Lucene.Net.Search 提供查询相关功能。 Lucene.Net.Store 支持数据存储管理,主要包括I/O操作。 Lucene.Net.Util 公共类。 Lucene.Net.Documents 负责描述索引存储时的文件结构管理。 Lucene.Net.QueryParsers 提供查询语法。 Lucene.Net.Analysis 负责分析文本。 全文检索流程如下: 一个简单的全文检索实例: 创建索引: 关键代码形如:

查询: 关键代码形如:

二 分词 (一)内置分词器 分词(切词)是实现全文检索的基础,之所以我们能够让机器理解我们的自然语言,是因为有了分词的帮助。分词工作由Analyzer类完成,它负责把文本切成Token序列,Token就是索引中的单词。Lucene.Net在两个地方用到分词:创建文档索引和分析搜索关键字。其过程示意如下: 由此可知,在创建索引和搜索时,必须使用同样的分词器,保证其切出相同的Token才能检索到结果。(Lucene.Net把查询关键字中的单词叫做“Term”,Term和Token的文本是一样的,只是某些属性不一样。) Lucene.Net实现了一些分词器,其对英文支持较好,但是对中文支持欠佳。 针对内置分词器测试结果如下: 关键代码形如:

可见,除了StandardAnalyzer外,其它分词器对中文基本无法处理,需要用户自行解决。 (二)分词过程 分词实际是由以下类型完成: 查看WhitespaceAnalyzer的部分源码如下:

由此可见,WhitespaceAnalyzer的工作都是交给WhitespaceTokenizer来完成的,并且没有使用筛选器,这也与之前测试的结果相符。我们可以利用TokenStream的派生类型来实现自定义分词器。 例如修改上述代码来得到一个新的分词器,功能类似WhitespaceAnalyzer,不同的是将大写字母变为小写,其代码形如:

(三)中文分词 显然,用户可以自定义分词器,来实现中文分词。但是,大多数用户不熟悉中文分词算法,同时也没有时间和精力来实现自定义分词,毕竟分词并不是我们系统的核心功能。因此,笔者引用了另一个中文分词组件——盘古分词。测试结果如下: 盘古分词使用步骤如下: Setp 1:添加相关程序集引用   这里需要添加2个程序集,PanGu.dll(盘古分词的核心组件)和PanGu.Lucene.Analyzer.dll(盘古分词的Lucene组件)。 Step 2:添加中文分词库 Step 3:添加并设置配置文件 Step 4:在Lucene.Net使用盘古分词 PanGu.Lucene.Analyzer.dll中定义了Analyzer的派生类型Lucene.Net.Analysis.PanGu.PanGuAnalyzer,与Tokenizer的派生类Lucene.Net.Analysis.PanGu.PanGuTokenizer,语法与Lucene.Net内置分词器相同。 Step 5:维护分词库 使用DictManage.exe管理和维护词库: 三 索引 (一)索引的存储结构 为了方便索引大量文档,Lucene.Net中的一个索引包括多个子索引,叫做Segment(段)。每个Segment包括多个可搜索的文档,叫做Document;每个Document包括多个Field;每个Field又包括多个Term。综上所述,Lucene.Net的索引文件的逻辑结构如下: 索引文件的物理表示如下: Lucene.Net把一个文档写入索引时,首先生成这个文档的到排索引,然后再把文档的倒排索引合并到段的倒排索引中。 (二)常用类型 Directory Lucene.Net的Directory类型实现索引的存储。常用类型继承树如下: IndexWriter 负责将索引写入Directory。Lucene通过设置缓存来提供写索引的速度,IndexWriter有几个参数来调整缓存的大小,控制Segment的数量,以及写索引的频率: 合并因子(mergeFactor) 这个参数决定一个索引块中可以存放多少文档(Document)以及把磁盘上的索引段(Segment)合并成一个大索引段的频率。该参数默认值为10。在默认情况下,缓存中Document数达到10时,所有的文档将写入一个新的Segment。并且,如果Directory的Segment的个数达到10,这10个索引块会被合并成一个新的Segment。对于大量文档来说,这个值大一些会更好。可以通过“SetMergeFactor(int mergeFactor)”方法来设置、 最小合并文档数(minMergeDocs)、最大缓存文档数(maxBufferedDocs) 默认值为10,它决定缓存中Document数量达到多少才能将他们写入磁盘。该值越大越消耗内存,I/O操作越少。(本处,笔者也有些糊涂,笔者感觉两者类似,不知道具体区别,若理解有误还请读者赐教。) 最大合并文档数(maxMergeDocs) 默认值为Integer.MAX_VALUE,它决定一个索引段(Segment)中的最大文档(Document)数。该值越大越高效,因为默认值以及很大了所以不用改变。 最大域长度(maxFieldLength) 默认值10000,表示截取该域中的前10000个Term,前10000个以外的Term将不被索引和检索。该值可在索引中随时更改,并即时生效(仅对之后的操作生效,一般该值设置为Integer.MAX_VALUE)。 IndexWriter的常用方法包括: Flush/Commit Flush方法与Commit方法相同,都是把缓存中的数据提交,可以清除缓存。 Close 无论是否发生异常都必须调用Close方法,该方法将对文件进行解锁,并完成Flush方法的功能。 Optimize Optimize方法用于优化索引,执行相当耗时。 Document 包含了可索引文档的信息。每个Document都有一个编号,但该编号并非永远不变。 Field 类似实体的某个属性,就像数据库中的一个列,其成员如下: (可以看到,Index的某些字段我给出的相同的注释,这是因为向下兼容的目的而具有相同的作用。注:高亮显示将用的TermVector。) […]

龙生   26 Jun 2014
View Details

utf8_unicode_ci与utf8_general_ci的区别

当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。

utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。

utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的校对规则相比,比较正确性较差)。

例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:

Ä = A

Ö = O

Ü = U

两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:

ß = s

但是,对于utf8_unicode_ci下面等式成立:

ß = ss

对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。

from:http://www.chinaz.com/program/2010/0225/107151.shtml

在Visual Studio 2012使用单元测试

本人之前很少使用单元测试,总觉得平时的工作写得代码够多了,单元测试还要再编码,增加大量工作量,相信不少程序猿也是这么认为吧。

但是我认为,在必要的时候正确运用单元测试,可以大大缩短代码的调试时间,正所谓磨刀不误砍柴工,在此建议仍不会单元测试的,还是学一下吧。当然本人在单元测试方面还是菜鸟,无论是鸡蛋鲜花都欢迎。

最近公司请微软的人做了一些关于使用VS2012进行单元测试的小培训,小生微做笔记,结合朦胧的记忆,在此自行总结,并分享之。废话少说,先上笔记:

1.先写单元测试(依我愚见,应该是接口先行,如果有的话) -> 测试失败 -> 以最小的改动(即编写实际代码)使测试通过(而在VS2012中已经不能通过现有项目直接生成测试项目了,我觉得这个功能还是应该保留,微软总是这副德行,强迫用户适应他们的产品,但是又不得不适应);

2.不因单元测试而追加功能(代码),即逻辑不受单元测试影响;

3.改变了代码的逻辑(增删改),应及时运行单元测试;

4.在测试方法声明Attribute —— TestCategory("分类或特征名");

5.在单元测试项目添加Fakes程序集分离外部依赖(如数据库访问,获取配置信息等);

6.初始化单元测试类中的成员等信息,可添加方法并声明Attribute[TestInitialize](方法需为public);

7.测试自动化。

以下我将通过自己编写代码来验证上述笔记中的部分要点。有些未涉及,以后再尝试了。

1.新建一个单元测试项目,并添加类XmlSerializationTest,代码如下:

由于我这个项目是对Xml序列化进行测试,因而前提是项目中已存在了一个UserModel类,并且在单元测试项目中添加相应引用

接下来在编写实际的代码,微软讲师建议我们先在测试项目编写,待通过单元测试后再将代码移到相应的项目下面。

 XmlSerialization

现在整个解决方案结构如下图所示

保证整个解决方案生成成功之后点击菜单“测试” -〉 “运行” -〉 “所有测试”,发现测试不通过,于是就按照第一点笔记,以最小改动使测试通过。

修改WriteXml方法为:

运行测试通过。对于返回值为bool的方法,个人建议进行至少两次Assert,也就是分别对返回true和false进行Assert,因而我们再对WriteXml方法添加一个测试方法,

运行测试,不通过,所以我得要好好改我的代码了,在改动当中坚持执行我的第三点笔记,改动代码及时运行单元测试。

我们发现这个类的构造函数多了一个参数,是对象序列化后保存的路径,且该类对应的测试类都需要用到,因而我希望在每次测试进行单元测试前先将对象的构建,这就是第六点笔记提供的“声明Attribute[TestInitialize]”(注意必须是public方法,我用private方法运行测试是不通过)。改造后的测试类如下:

还可以分析测试代码的覆盖率,如下图所示在测试资源管理器点击“运行”下的相应选项。

居然是100%,真不知道这个东西微软是怎么分析出来的。

把类XmlSerializationTest移到相应的项目,更改命名空间,在测试项目添加相应引用,测试通过。

将解决方案添加到TFS源码管理,我这边是用的是微软云TFS免费版。

收工。

VS提供了很多类型的测试,负载、UI等等测试,感觉还是蛮强大的。

from:http://www.cnblogs.com/FreeDong/archive/2013/06/10/3129625.html

新入行程序员应知的十个秘密

初出茅庐的你带着仍残留墨香的毕业证书踏上工作岗位,马上就被书上没写的规则和各种繁杂的日常事务来了个下马威。这样的故事实在是司空见惯,编程工作也不例外。

没有几个学生能 100% 为自己的第一份真正的工作做好准备。如果你不想成为其中之一,请学学以下这 10 项无需手把手指导就能学会的基本技能:

1、版本控制系统(VCS)

VCS 也许是计算机课程最大的疏漏。这些课程光记得教如何写代码,但却往往忘记教学生如何去管理代码。每一个程序员都应该懂得利用 Git 或 Subversion 有效地创建 repository(仓库),编辑与提交代码,进行分支与合并,了解项目工作流。

2、学会写作

身为程序员要写的不只有代码。你还要写项目的发布说明,给版本控制写提交消息,在系统里面写漏洞报告。这些和许多地方都需要清晰有效的文字交流—但这个技能计算机科学却很少强调。

3、正则表达式

正则表达式本身就是一门语言,每一个现代程序员都要擅长。每一门现代语言都支持正则表达式或者有相关标准库。如果代码需要校验某字符串是否含有 5 个字符、1 个破折号和 1 个数字,你应该马上就能写出 /^[A-Z]{5}-\d$/。

4、库的使用

现在已经是 2014 年,所以没人需要用正则表达式从 URL 析取主机名了。因为每一门现代编程语言都有执行常用功能的标准库。

程序员需要明白,那些经过开发、测试和调试的代码通常要比自己重新写的代码更好。更重要的是,无需编写的代码实现起来要快得多。

5、SQL

很多人的 SQL 都是在工作中学会的。数据库怎么会是选修课呢?有不用数据库的吗?

把数据存进平面文件的时代已经结束了。一切东西都要进出数据库,而 SQL 则是存取数据的语言。这是一门说明性语言,不是程序语言,所以用它来解决问题时需要新的思考方式。每一个程序员都应该了解数据库标准化基础,能够执行 SELECT(及 INNER、OUTER JOIN)、INSERT、UPDATE 和 DELETE。

6、会用IDE、编辑器及CLI工具

只懂用锯子的木匠永远也无法出师,所以计算机专业毕业的人只懂 Notepad 或 pico 令人惊诧。编程工具帮助操纵代码及其他数据,令程序员生活变得容易。所以每一个程序员都应该知道命令行、shell 脚本、find、grep 及 sed 的使用。

7、调试

每一个程序员都应该知道利用交互式调试器或在代码中点缀一些输出语句来调试程序。通过逐步求精来跟踪问题的能力实在是太重要了。

8、防错性编程

错误总是难免的,哪怕是明星程序员也不例外。失控是世界的常态,出错毫不奇怪。防错性编程正是理解了这个事实。如果东西不会不出错,我们就不会检查文件打开成功与否,不会检查客户 ID 是否合法数字,不用测试代码是否允许正确。

程序员需要知道,编译器告警是有用的工具,可让我们生活得更舒适,而不是要避而远之的麻烦事。每一个程序员都应该知道为什么每一个 PHP 程序都要这样开头:

set_error_reporting(E_ALL)

每一个 Perl 程序都要写上这些语句:

use strict; use warnings;

9、团队协作

很少编程工作会让你自己一个人完成,如果你经常这么做,智力会受损,表现会变弱。你的代码必须与别人的交互或者混合。再有才的程序员,如果无法与别人协作,都会给项目造成负面影响,并迅速成为组织的负担。

10、利用现有代码

在学校的时候,每一次作业都是一个新项目。但现实世界不是这样的。对于刚工作的人来说,所接到的第一项任务往往是修改代码漏洞。然后,再在现有代码库的基础上为现有系统增加一个小功能。设计新代码那是几个月后的事情,如果幸运的话。

 

[本文编译自:blog.newrelic.com]

from:http://www.oschina.net/news/52607/10-secrets-learned-software-engineering-degree-probably-didnt

 

System.MissingMethodException:Method not found:+解决方案

中文版本提示:System.MissingMethodException: 找不到方法:… 英文版本提示:System.MissingMethodException: Method not found:… 导致此异常的原因是引用程集版本冲突,通常可能是因为同一个项目(DLL)被多个项目(DLL)引用,导致新加的方法找不到,但是不会抛编译期异常,而是抛运行期异常。跟踪调试的时候根本无法运行到调用的地方,所以,很容易导致该解决该问题无从下手。 个人觉得这应该是VS的一个BUG,我用的是VS2008,不知道其它版本有没有同样的问题。 解决方法:修改引用的项目的AssemblyInfo.cs下的版本号,重新编译、发布。   问题解决方法: 不是补丁问题也不是版本号修改。问题发生在,提示找不到的方法,有的版本中确实未找到。替换使用的方法问题解决。 can’t get hostname for your address     Navicat for Mysql 远程连接数据库 出现 1042-Can’t get hostname for your address 错误! 是什么问题。 编辑/etc/my.cnf,在:[mysqld]内添加一行:skip-name-resolveMySQL 忽略数据库表名大小写修改/etc/my.cnf,在 [mysqld] 内添加一行:lower_case_table_names=1 from:http://blog.csdn.net/jglie/article/details/6863067

龙生   05 Jun 2014
View Details

2014 年最流行的 Java 应用服务器

去年我们发布了 2013 年 Java 应用服务器市场调查。为了验证这个报告是否发送了变化,我们采集了从2月到5月的 783 给不同的配置点。数据通过启动的类路径进行收集,查询类似于 “grep -i tomcat classpath.log”. 我们发现这个结果跟去年的差别不大,如下图所示: Tomcat 仍然以 41% 比例高居榜首,不过比起 2013 年的 43% 略有下降。Jetty 占 31% 排第二,而 JBoss/WildFly 占 18%。 via plumbr from:http://www.oschina.net/news/52299/most-popular-application-servers-in-2014

龙生   30 May 2014
View Details

ASP.NET中BasePage的几种设计方式

使用它主要是为了复用代码的公用部分下面是整理出来三种实现方式:准备工作:1 先在BasePage.cs中创建部分类BasePage 比在创建接下来用到的用于演示的方法BaseLoad代码:public partial  class BasePage : System.Web.UI.Page{        protected void BaseLoad()        {            string code = Request.QueryString["id"];            if (String.IsNullOrEmpty(code))            {                Response.End();            }        }}2 使用BasePage.cs的Default.aspxDefault.aspx.cs代码:public partial class Default : BasePage{        protected  void Page_Load(object sender, EventArgs e)    {        //do something    }}一、重写BasePage的OnLoad方法,该方法会触发OnLoad事件BasePage.cs代码:public partial  class BasePage : System.Web.UI.Page{    protected override void OnLoad(EventArgs e)    {        BaseLoad();        base.OnLoad(e);    }}二、在构造函数中把BaseLoad注册到基类的this.Page.PreLoad事件BasePage.cs代码:public partial  class BasePage : System.Web.UI.Page{    public BasePage()    {        this.Page.PreLoad += BaseLoad;    }}三、这种方式让继承他的子类方式看起来有些怪异(不能在里面使用Page_Load)BasePage.cs 代码:public abstruct class BasePage : System.Web.UI.Page{    protected void Page_Load()    {        string code = Request.QueryString["id"];        if (String.IsNullOrEmpty(code))        {            Response.End();        }        PageLoad();        }    protected […]

龙生   29 May 2014
View Details
1 223 224 225 282