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

Category Archives: Programming Language

启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!

原因1:给定目录下jvm.dll不存在。 对策:(1)重新安装jre或者jdk并配置好环境变量。(2)copy一个jvm.dll放在该目录下。 原因2:eclipse的版本与jre或者jdk版本不一致 对策:要么两者都安装64位的,要么都安装32位的,不能一个是32位一个是64位。 原因2的概率更大一些,原因1不太可能发生。   from:http://blog.csdn.net/zyz511919766/article/details/7442633/

龙生   04 Aug 2015
View Details

android studio 无法在可视化页面预览布局文件

Rendering Problems the following classes could not be found: android.support.v7.internal.widget.ActionBarOverlayLayout (Fix Build Path, Edit XML, Create Class) Tip: Try to build the project 是什么问题 把你的style文件中theme改一下 在Theme.AppCompat.Light.DarkActionBar前面加上Base. 如下 <!-- Base application theme. --> <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> </style> app-debug.apk

龙生   04 Aug 2015
View Details

MVC数据验证

前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解。System.ComponentModel.DataAnnotations 一、基础特性 一、Required 必填选项,当提交的表单缺少该值就引发验证错误。 二、StringLength 指定允许的长度 指定最大长度:

指定最短于最长限制:

三、RegularExpression 正则表达式能够匹配的字符串,如果不能匹配,则报一个验证错误

如邮箱格式验证:

四、Range Range特性用来指定数值类型值的最小值和最大值。

五、Remote 允许利用服务器端的回调函数执行客户端的验证逻辑。说白了就是支持AJAX验证。 需要引用命名空间:System.Web.Mvc; 这个写个异步验证用户名是否存在的DEMO:

Controller代码:

显示结果: 留意到,是通过AJAX发送UserName的值到服务器端判断过的。 六、Compare 用于确保模板对象的两个对象拥有相同的值。 例如,通常输入密码之后还要求用户再次确认密码,这时候就是Compare属性发挥作用的时候了。

以上特性需要 using System.ComponentModel.DataAnnotations;   同时需要注意Web.config里面的这两个选项是否设置为了true;

    二、自定义错误提示消息 每个特性都允许传递一个带有自定义错误提示消息的参数。

自定义错误消息,还有一个格式项,如

则{0}在输入的时候会被Name替换。 如果以上的验证方式还不够,你还可以自定义验证,到时候忘记了可以翻《Asp.net MVC3 高级编程》第127页。这里就不写DEMO了,用到再写。 三、显示和编辑注解 1、Display 如果使用的是直接EditorForModel实现的话,Display特性可以帮助你设置友好的显示名称 例如:

显示结果如下: 其次Display还支持显示属性的顺序,如

后面的顺序是显示编辑框的顺序,默认是10000,按升值排序。 2、ScaffoldColumn 隐藏Html辅助方法(如EditorForModel,DisplayForModel)显示一些属性。

虽然ScaffoldColumn可以做到不显示一些属性在页面上被编辑,但是如果提交的Form有这个属性值,模型绑定机制依然会绑定此属性值。要解除就要显式的[Bind]了,这个与本篇无关。此处不提。 3、DisplayFormat DisplayFormat特性可以用来处理属性的各种格式化选项。当属性包含空值时,可以提供可选的显示文本,也可以为包含标记的属性关闭HTML编码,还可以为运行时指定一个应用于属性值的格式化字符串。 例如:

这样,当有初始值的时候,显示的代码将如下所示: 注意是初始值,如果是直接填写的并不会有符号。来看Controller中设置的初始值:

此显示样式在提交回Controller中是没用的,因为模型绑定器将不能解析返回的价格值。怎么用自己斟酌,用于显示还是OK的。 4、ReadOnly 如果确保默认的模型绑定器不使用请求中的新值更新属性,可以给属性添加ReadOnly特性:

注意,此属性仍然会显示一个可编辑的文本框来显示Name,但是模型绑定器不会接收其值,因此只有模型绑定器考虑ReadOnly属性。 5、DataType DataType特性可以为运行时提供关于属性的特定用途的信息。 例如:

显示效果如下: 该属性可以用于指定多选按钮,单选按钮,密码输入框,等等类型的数据。 6、UIHint UIHint特性给Asp.net MVC运行时提供了一个模板名字,以备调用模板辅助方法如(DisplayFor和EditorFor)渲染输出时使用。也可以自定义自己的模板辅助方法来重写Asp.net MVC的默认行为。 7、HiddenInput HiddentInput在名称空间System.Web.Mvc中,它可以告知运行时渲染一个type特性值为"hidden"的输入元素。说白了就是<input type="hidden" value="xxx" /> 四、验证示例 首先新建一个MVC项目。添加如下代码,代码非常简单:一个Person_Model类 […]

龙生   03 Aug 2015
View Details

DataType枚举

此枚举用于指定要与数据列或参数关联的数据类型。 成员名称 说明 Custom 表示自定义的数据类型。 DateTime 表示时间上的一刻,以日期和当天的时间表示。 Date 表示日期值。 Time 表示时间值。 Duration 表示对象存在的一段连续时间。 PhoneNumber 表示电话号码值。 Currency 表示货币值。 Text 表示所显示的文本。 Html 表示一个 HTML 文件。 MultilineText 表示多行文本。 EmailAddress 表示电子邮件地址。 Password 表示密码值。 Url 表示 URL 值。

龙生   03 Aug 2015
View Details

ASP.NET MVC3更新出错:ObjectStateManager中已存在具有同一键的对象

[HttpPost] public ActionResult Edit(Person person) { if (ModelState.IsValid) { Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault(); //TODO db.Entry(person).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(person); } 上边代码试图在更新person到数据库前取出旧数据(oldperson)进行文件删除等操作,结果页面报错: 引用内容 ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。 若是不取旧数据,该段代码执行可以正常执行,经过一番测试,猜测原因是读取旧数据时,对象会被添加到db中,当执行"db.Entry(person)"时,试图把person也添加到db中,但person和先前添加对象的键值是一样的,因而报错,这也解释了为什么不取旧数据不出错。 下边提供三种解决方法: Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault(); //TODO oldperson.PicUrl = person.PicUrl; db.SaveChanges();   Person oldperson = db.People.AsNoTracking().Where(p => p.Id == person.Id).FirstOrDefault(); //TODO db.Entry(person).State = EntityState.Modified; db.SaveChanges();   Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault(); //TODO db.Entry(oldperson).CurrentValues.SetValues(person); db.SaveChanges(); from:http://www.mzwu.com/article.asp?id=3527

龙生   31 Jul 2015
View Details

移动 App 开发人员应该关注的 7 件事

Apple App Store里有130万的app,而Google Play则托管了140万的app。在竞争如此激烈的移动应用环境中如何确保我们制作的app能获得大量的下载量呢? 广受用户欢迎,并创下了上百万的下载量是每一个移动app开发人员的终极梦想。但是,这谈何容易呢! 在最近的一次网络研讨会上,Rahui Nischal,Nucleus Software Exports公司的高级产品经理,就谈到了开发人员要想创建有吸引力的移动app,所需要关注的几个关键方面。 1.理念是根本 一个移动app的成功取决于它是建立在什么样的核心理念上的。对于开发人员而言,第一步要做的是像目标用户那样思考,用他们的眼光去看待问题,并 在此基础上构建移动app,构建可以让他们的生活更简单的app。步步为营,不断地检查app与最终用户的相关性,积极调整产品以满足用户的需求。 2.单一的服务目标 一个移动app只需要具备单一的功能。确定你app的主要目的,然后钻研能否只通过一到两次点击就可以访问进入。 3.保持简单 保持一切简单化其实是最难的。如果移动开发人员可以成功地将复杂的技术隐藏在简单界面的后面,那么他就越靠近成功。 4.保持轻量级 三年前,Facebook的应用程序重达35-40M。现在,它只有大约10M。之所以会产生如此大的变化,是因为Facebook认识到,在印度和非洲——甚至连3G还尚未普及的区域,下载重量级的移动应用程序往往需要一段又长又难挨的时间。 由于现在的移动app都是面向全球的,所以开发人员最好能够创建轻量级的应用程序以便适应不同地域。 5.UI很重要 WhatsApp在推出之前从来不做广告。虽然现在网上提供了许多的聊天应用程序,但是WhatsApp的用户使用量还是达到了成倍的增长。它成功的秘诀就是干净和简单的UI。为了确保界面友好,我们在创造移动应用的时候需要关注三件事——愉悦性、实用性和功能性。 6.倾听用户的声音 应用程序在发布之后,开发人员应该时刻关注用户的反馈,更新进步,努力提供更新更好的功能。 7.了解用户行为 游戏“愤怒的小鸟”的开发人员发现,Android用户不喜欢为下载应用程序付费,而iOS用户,大多数则愿意购买app,但却讨厌在免费app上面看到任何广告。了解不同的用户行为,有助于移动开发人员为不同类型的用户创建令人满意的消费体验。 from:http://www.oschina.net/news/64613/mobile-app-developers-should-focus-on-7-things

龙生   28 Jul 2015
View Details

Membership的配置文件

Lucene的IndexWriter初始化时报Lock obtain timed out: NativeFSLock

有一次更新完代码启动系统,系统报如下异常:

 

经查,IndexWriter的构造函数在试图获取另外一个IndexWriter已经加锁的索引目录时就会抛出一个LockObtainFailedException。但是我们系统中并没有多个IndexWriter去指定同一个目录,走查代码才发现,原来是同一个初始化方法调用了两次,一次是spring监听器里调用的,另一个是另一同事测试方便,在static模块里调用的,导致同一个lucene上下文初始化方法被调用两次,建议static模块要慎用,因为它会悄悄神不知鬼不知自己悄悄被调用。

from:http://www.tuicool.com/articles/2UBVnq7

影响Lucene索引速度原因以及提高索引速度技巧

在网上看了一篇外文文章,里面介绍了提高Lucene索引速度的技巧,分享给大家。
先来看下影响索引的主要因素:

MaxMergeDocs
该参数决定写入内存索引文档个数,到达该数目后就把该内存索引写入硬盘,生成一个新的索引segment文件。
所以该参数也就是一个内存buffer,一般来说越大索引速度越快。
MaxBufferedDocs这个参数默认是disabled的,因为Lucene中还用另外一个参数(RAMBufferSizeMB)控制这个bufffer的索引文档个数。
其实MaxBufferedDocs和RAMBufferSizeMB这两个参数是可以一起使用的,一起使用时只要有一个触发条件满足就写入硬盘,生成一个新的索引segment文件。

RAMBufferSizeMB
控制用于buffer索引文档的内存上限,如果buffer的索引文档个数到达该上限就写入硬盘。当然,一般来说也只越大索引速度越快。
当我们对文档大小不太确定时,这个参数就相当有用,不至于outofmemory error.

MergeFactor
这个参数是用于子索引(Segment)合并的。
Lucene中索引总体上是这样进行,索引现写到内存,触发一定限制条件后写入硬盘,生成一个独立的子索引-lucene中叫Segment。一般来说这些子索引需要合并成一个索引,也就是optimize(),否则会影响检索速度,而且也可能导致open too many files。
MergeFactor 这个参数就是控制当硬盘中有多少个子索引segments,我们就需要现把这些索引合并冲一个稍微大些的索引了。
MergeFactor这个不能设置太大,特别是当MaxBufferedDocs比较小时(segment 越多),否则会导致open too many files错误,甚至导致虚拟机外面出错。

Note: Lucene 中默认索引合并机制并不是两两合并,好像是多个segment 合并成最终的一个大索引,所以MergeFactor越大耗费内存越多,索引速度也会快些,但我的感觉太大譬如300,最后合并的时候还是很满。Batch indexing 应 MergeFactor>10

加快索引的一些技巧:

• 确认你在使用最新的Lucene版本。

• 尽量使用本地文件系统

远程文件系统一般来说都会降低索引速度。如果索引必须分布在远程服务器,请尝试先在本地生成索引,然后分发到远程服务器上。
• 使用更快的硬件设备,特别是更快的IO设备

• 在索引期间复用单一的IndexWriter实例

• 使用按照内存消耗Flush代替根据文档数量Flush
在Lucene 2.2之前的版本,可以在每次添加文档后调用ramSizeInBytes方法,当索引消耗过多的内存时,然后在调用flush()方法。这样做在索引大量小文档或者文档大小不定的情况下尤为有效。你必须先把maxBufferedDocs参数设置足够大,以防止writer基于文档数量flush。但是注意,别把这个值设置的太大,否则你将遭遇Lucene-845号BUG。不过这个BUG已经在2.3版本中得到解决。

在Lucene2.3之后的版本。IndexWriter可以自动的根据内存消耗调用flush()。你可以通过writer.setRAMBufferSizeMB()来设置缓存大小。当你打算按照内存大小flush后,确保没有在别的地方设置MaxBufferedDocs值。否则flush条件将变的不确定(谁先符合条件就按照谁)。

• 在你能承受的范围内使用更多的内存
在flush前使用更多的内存意味着Lucene将在索引时生成更大的segment,也意味着合并次数也随之减少。在Lucene-843中测试,大概48MB内存可能是一个比较合适的值。但是,你的程序可能会是另外一个值。这跟不同的机器也有一定的关系,请自己多加测试,选择一个权衡值。

• 关闭复合文件格式
调用setUseCompoundFile(false)可以关闭复合文件选项。生成复合文件将消耗更多的时间(经过Lucene-888测试,大概会增加7%-33%的时间)。但是请注意,这样做将大大的增加搜索和索引使用的文件句柄的数量。如果合并因子也很大的话,你可能会出现用光文件句柄的情况。

• 重用Document和Field实例
在lucene 2.3中,新增了一个叫setValue的方法,可以允许你改变字段的值。这样的好处是你可以在整个索引进程中复用一个Filed实例。这将极大的减少GC负担。

最好创建一个单一的Document实例,然后添加你想要的字段到文档中。同时复用添加到文档的Field实例,通用调用相应的SetValue方法改变相应的字段的值。然后重新将Document添加到索引中。

注意:你不能在一个文档中多个字段共用一个Field实例,在文档添加到索引之前,Field的值都不应该改变。也就是说如果你有3个字段,你必须创建3个Field实例,然后再之后的Document添加过程中复用它们。

• 在你的分析器Analyzer中使用一个单一的Token实例
在分析器中共享一个单一的token实例也将缓解GC的压力。

• 在Token中使用char[]接口来代替String接口来表示数据
在Lucene 2.3中,Token可以使用char数组来表示他的数据。这样可以避免构建字符串以及GC回收字符串的消耗。通过配合使用单一Token实例和使用char[]接口你可以避免创建新的对象。

• 设置autoCommit为false
在Lucene 2.3中对拥有存储字段和Term向量的文档进行了大量的优化,以节省大索引合并的时间。你可以将单一复用的IndexWriter实例的autoCommit设置为false来见证这些优化带来的好处。注意这样做将导致searcher在IndexWriter关闭之前不会看到任何索引的更新。如果你认为这个对你很重要,你可以继续将autoCommit设置为true,或者周期性的打开和关闭你的writer。

• 如果你要索引很多小文本字段,如果没有特别需求,建议你将这些小文本字段合并为一个大的contents字段,然后只索引contents。(当然你也可以继续存储那些字段)

• 加大mergeFactor合并因子,但不是越大越好
大的合并因子将延迟segment的合并时间,这样做可以提高索引速度,因为合并是索引很耗时的一个部分。但是,这样做将降低你的搜索速度。同时,你有可能会用光你的文件句柄如果你把合并因子设置的太大。值太大了设置可能降低索引速度,因为这意味着将同时合并更多的segment,将大大的增加硬盘的负担。

• 关闭所有你实际上没有使用的功能
如果你存储了字段,但是在查询时根本没有用到它们,那么别存储它们。同样Term向量也是如此。如果你索引很多的字段,关闭这些字段的不必要的特性将对索引速度提升产生很大的帮助。

• 使用一个更快的分析器
有时间分析文档将消耗很长的时间。举例来说,StandardAnalyzer就比较耗时,尤其在Lucene 2.3版本之前。你可以尝试使用一个更简单更快但是符合你需求的分析器。

• 加速文档的构建时间
在通常的情况下,文档的数据来源可能是外部(比如数据库,文件系统,蜘蛛从网站上的抓取等),这些通常都比较耗时,尽量优化获取它们的性能。

• 在你真的需要之前不要随意的优化optimize索引(只有在需要更快的搜索速度的时候)

• 在多线程中共享一个IndexWriter
最新的硬件都是适合高并发的(多核CPU,多通道内存构架等),所以使用多线程添加文档将会带来不小的性能提升。就算是一台很老的机器,并发添加文档都将更好的利用IO和CPU。多测试并发的线程数目,获得一个临界最优值。

• 将文档分组在不同的机器上索引然后再合并
如果你有大量的文本文档需要索引,你可以把你的文档分为若干组,在若干台机器上分别索引不同的组,然后利用writer.addIndexesNoOptimize来将它们合并到最终的一个索引文件中。

• 运行性能测试程序
如果以上的建议都没有发生效果。建议你运行下性能检测程序。找出你的程序中哪个部分比较耗时。这通常会给你想不到的惊喜。
本翻译属于原创,转载时请注明出处,英文原版请查看:

http://wiki.apache.org/jakarta-lucene/ImproveIndexingSpeed

from:http://www.cnblogs.com/gaoweipeng/archive/2009/10/16/1584503.html

1 … 134 135 136 … 179