分类目录归档:未分类

解决WordPress的半角全角代码

喜欢折腾WordPress的童鞋,经常会在网上找一些函数代码,武装改造自己的主题,但是有时候从某个大虾站上复制来的代码,弄到自己主题上时常会提示错误或没有效果,令人失望,郁闷,却不知所以然。

其实不是因为代码不适合你的主题,是因为WordPress 会自动将函数代码中半角的单引号、双引号转换为全角标点,就算发表文章的时候用的是正确的符号,也是一样会自动转换的。虽然在页面上显示的还是半角标点, 但复制后却是全角的标点,造成函数代码无法运行(不知道WordPress 的开发者为什么要进行这些转换)。另外一段好的代码,可能已被转载无数次了,早已面目全非,想找到原文作者页面也非易事,对不懂函数代码者而言,手工修改 替换标点,很容易造成错误。所以这里规劝喜欢在自己博客上记录折腾WordPress心得体会或转载代码的童鞋,请按下面的方法,改造一下自己的 WordPress程序,不要弄一堆不能用的代码放在那,误人子弟。

禁用WordPress标点媒体自动转换功能:

方法网上N年前就有了,我在无插件实现WordPress代码高亮美化效果也提到过,这里再说一下:

修改 wp-includes/formatting.php 文件,把实现自动替换的相关语句注释掉。

// static strings      
$curl = str_replace($static_characters, $static_replacements, $curl);      
// regular expressions      
$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

将$curl 开头的两句代码注释掉,如下:

// static strings      
//$curl = str_replace($static_characters, $static_replacements, $curl);      
// regular expressions      
//$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

不过这个方法每次升级程序的时候,都需手动修改一下文件,如果有的童鞋嫌麻烦,可以安装专门为解决此问题而生的 Quotmarks Replacer 插件,效果一样。

 

来源:http://www.vsay.cn/solve-fraught-half-width-full-width-code-in-wordpress.html

TortoiseGit密钥的配置

TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥。也就是说使用ssh-keygen -C "username@email.com" -t rsa产生的密钥在TortoiseGit中不能用。而基于github的开发必须要用到rsa密钥,因此需要用到TortoiseGit的putty key generator工具来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥,配置步骤如下:

1)运行TortoiseGit开始菜单中的puttygen程序,如下图示
3684225970166192762
2)点击“Generate”按钮,鼠标在上图的空白地方来回移动直到进度条完毕,就会自动生一个随机的key,如下图示
3852266531262146339

如有需要,可以为密钥设置对应的访问密码,就是修改上图中“Key passphrase”和“Confirm passphrase”的值。

3)将上图中多行文本框的内容全选、复制,并粘贴到github账户的 SSH public key中,这就是适用于github的公钥。

4)点击上图中的“Save private key”按钮,将生成的key保存为适用于TortoiseGit的私钥(扩展名为.ppk)。
5)运行TortoiseGit开始菜单中的Pageant程序,程序启动后将自动停靠在任务栏中,图标显示为3247095331335508329,双击该图标,弹出key管理列表,如下图示
3866903230051100493

6)点击上图中的“Add Key”按钮,将第4步保存的ppk私钥添加进来,关闭对话框即可

7)经上述配置后,你就可以使用TortoiseGit进行push、pull操作了。

上述所用软件版本:TortoiseGit 1.5.2.0(git version 1.7.1.msysgit.0、PuTTYgen 0.60)

构建现代化网站的 20 个技巧

英文原文:20 tips for building modern sites

在过去几年中,我们与web开发者花了很多时间交流,听得最多的一件事情就是创建一个能很好的跨越各种类型浏览器版本与各种设备的网站有多么难。我们为 jQuery项目写代码的时候一直有这个问题。因此我们整理了20条编码模式与经验,它们是从出席无休止的会议和读了几百篇专稿中摘取出来的。我们希望能 在你建站的时候给你节省一些时间(和麻烦)。

跨浏览器基础

网站不需要在所有浏览器里渲染得一样

一件普遍被开发者所关心的事情是确保他们的网站在所有浏览器中渲染得一样,包括非现代的一些。那一般并不需要。更好的路线是考虑逐渐增强你的网站,对非现代浏览器的用户提供一个可靠的工作基线,而给用现代浏览器的用户提供一个更丰富的UI。

从固体模版开始以简化开发

许多的技巧已经创建进项目模版如HTML5 Boilerplate 以节省你一些时间。这些准则对以现代浏览器为目标的项目和需要旧浏览器(一直回退到IE6)支持的项目工作得一样好。

关注稳定的标准

当一个新又酷的特性出现的时候很容易令人兴奋,但其中的一些可能仍然在为技术参数实验、仍然在开发中。重要的是要记得,在规范发展的早期是很容易变化的,这有可能影响你的网站的稳定性和你的用户的体验。通过关注稳定的标准,你可以确保你的用户能获得他们期望的体验,你的网站会更易维护。

用IE兼容检测工具帮助你的网站迁移到基于标准的代码

标准是IE10的一个核心部分,帮助开发者迁移他们的代码以便能发挥这项长处,这对IE工程项目组来说无比重要。这就是为什么他们创造了IE兼容检测工具,它能实时分析你的网站,准确的找到通常问题的类型并给出解决方法。通过在你的代码中包括一个简单的JavaScript脚本文件,在你的页面你就能得到可视化的结果。它也可以被集成进Fidder HTTP 分析工具

谨慎使用polyfills和shims(模拟标准API)

如果你必须在不同浏览器实现系统的体验,polyfills和shims提供了代码和标签,可以帮助模拟标准的API和功能。需要谨记的是,确保你引入的代码适合你的需要,并且可以在日后维护。

开发时多浏览器测试

尽管相对以前,现代浏览器已经接近统一标准,但还是有不同。偶尔的多浏览器测试避免不会在最后一刻发现大问题——甚至已经上线了。确保查看所有浏览器调试器比如IE的F12 Dev Tools,检查有没有警告或错误信息。一些老浏览器比如IE7没有内建调试器,可以用Firebug Lite调试。或者使用跨浏览器解决方案如BrowserStack

用工具参与创建过程来检测错误和缩小文件大小

有好一批创建工具如 HTML validators, CSS validators, UglifyJSHint, 或者 GruntJS ,他们能找到潜在的问题,增强项目代码的标准,减少文件的大小提升性能。如果你的IDE或者代码编辑器支持它们,这些步骤就不会成为绊脚石。例如,Visual Studio提供了在创建过程中运行外部工具和合并/压缩脚本文件的能力。

HTML

总是使用标准模式避免怪癖模式

直接用<!DOCTYPE html>吧!现代化网站不需要怪癖模式,不需要考虑90年代中期为了兼容现代化的浏览器比如IE6和FireFox 2.大多数现今的网页在怪癖模式下要么文档声明无效,要么出现无关文本。很容易导致布局异常,而且很难调试。

理解有限向后兼容的HTML标签

新HTML5标签比如<section>,<header>和<footer>改善标签的语义化,但需要特殊的辅助 脚本让IE6,7和8认识他们。页面在太旧的浏览器或者禁止脚本时无法使用HTML5标签,那么使用<div>标签是对这些情况比较靠谱的解 决方法。

将CSS在HTML文件顶部引入

在文档body中引入CSS会导致页面全空,直到CSS加载后才显示。CSS文件应该放在HTML文档的head中,让浏览器尽早地读取他们。

将JS在HTML文件底部引入

浏览器会先检索、解析和执行加载的脚本,然后渲染剩余的页面内容,以防脚本创建新元素。脚本在底部后,浏览器可以一直渲染页面直到脚本加载完全,以便用户尽快加载页面显示出来。

避免HTML中脚本标签

不同于引入脚本,脚本标签需要浏览器停止渲染(处理脚本),阻碍后续资源文件的分析和下载。这导致页面初始加载减慢,甚至留下可怕的“空白页”体验。而且脚本分散在内联标签里很难维护

不要在HTML元素中使用内联脚本事件

例如<button onclick="validate()">Validate</button>。这种做法违反了标签、表示和行为之间的清爽原则。而且,如果相关的脚本实在文档底部加载,用户可能先点击了页面触发事件从而尝试调用脚本程序,但是其实脚本还没加载——引发错误!

CSS

熟悉和使用CSS级联规则

简单的id和class选择器是好用的,但是这也意味着标签混乱,到处是无法重用的的id和class。应该用标签,子元素标签,同列标签和,小部分的id和class标签组合,使css更简单和通用。避免使用“!imporant”。

面向未来的使用前缀特定属性

新草案制定时,一些浏览器厂商会通过添加前缀以实现可能支持的标准。为了确保CSS标签以后可用,带前缀的和标准的属性名称都用上最好。这篇文章还提供了一个JavaScript解决方法。

用优雅的CSS处理兼容性,而不是hack

CSS hack随着浏览器的更新,显得不可靠。解决方法是为html或body标签添加特定浏览器的class,并在css规则中使用。条件注释也可以在特定浏览器版本时使用需要的CSS文件。

JavaScript

总是将功能探测优先于浏览器(navigator.userAgent)探测。

判断是否存在一个特定功能(或错误)时,'userAgent'字符串是一个糟糕的指标。更严重的是,解析userAgent的代码是错误的。例如,一个 浏览器探测库期待主版本号是一个一位数字,所以会把Firefox 15报告为Firefox 1,把IE 10报告为IE 1!更可靠的是直接探测功能或问题,并用它作为代码分支决策的标准。我们推荐Modernizr,它是实现功能探测的最简单方法。

尽可能在Ready后立刻执行脚本

技术上 如jQuery的$(document).ready()使脚本在HTML页面加载完后立即执行,也是脚本可以安全执行的最早时刻。然而复杂的脚本会让页 面显得迟缓,并阻止用户立刻操作页面。所以,一些比如tooltip(提示框),dialog(对话框)在需要显示时初始化,不造成页面卡顿。

如果Ajax关系用户交互,越早请求越好

Ajax请求会花费很长时间,而且不需要等待HTML页面渲染就可以发起请求。所以,把$(document).ready()放在Ajax请求完成回调函数中更好。

延迟加载非必要的脚本(如Facebook Like,Google +1,Twitter)。

所有人都希望他们的网页在社交网络上流行,但是社交网络的脚本往往很大,可能会引起用户响应迟缓。请求这些脚本等待页面加载完毕,可以使页面响应更快。更妙的是,重新考虑这些按钮是否有必要,以及它们是否改善了你的页面整体体验。

 

来源: http://www.oschina.net/translate/cross-browser-best-practices?from=20130317

 

Adobe Acrobat 9 Pro 序列号激活码

分两步:
1、先进入电脑系统盘,删除以下两个文件:
第一个:系统盘(如C盘):/Documents and Settings/All Users/Application Data/FLEXnet
目录下的adobe_00080000_tsf.data文件,注意这个文件是隐藏的!删除此文件!

第二个:系统盘(如C盘):\Program Files\Common Files\Adobe\Adobe PCD\cache
目录下的cache.db文件,注意这个也是隐藏文件。删除此文件!

2、重新打开Adobe软件,尝试输入以下序列号之一:
1118-4756-9985-9882-7362-8611
1118-4612-5432-9405-1652-8740
1118-4418-0043-3745-4309-2816
1118-4018-6583-4956-2486-7805

WIN7路径:

C:\ProgramData\FLEXnet\adobe_00080000_tsf.data

C:\Program Files\Common Files\Adobe\Adobe PCD\cache\cache.db

来源:http://blog.sina.com.cn/s/blog_4a02f04a0100rt8c.html

Sphinx的GEO距离搜索问题备忘

最近项目用sphinx做地理搜索,可是结果总是不对,明明很近却搜不到

结果检查sphinx源文件:

static inline double sphSqr double )

{

return v*v;

}

float ExprGeodist_t::Eval const CSphMatch tMatch const

{

const double 6384000;

float plat tMatch.GetAttrFloat m_tGeoLatLoc );

float plon tMatch.GetAttrFloat m_tGeoLongLoc );

double dlat plat m_fGeoAnchorLat;

double dlon plon m_fGeoAnchorLong;

double sphSqr sin dlat/2 cos(plat)*cos(m_fGeoAnchorLat)*sphSqr(sin(dlon/2));

double 2*asin Min 1, sqrt(a) );

return (float)(R*c);

}

这跟网络上可以找到的常见的推算距离的方法有一点点小的区别就是没有把坐标转换成弧度

问题解决方法的地址是:http://www.god-object.com/2009/10/20/geospatial-search-using-sphinx-search-and-php/

感谢余雯同学的帮助.要不是这个办法我都有心改sphinx的源代码鸟

可见以后有问题不要急着改算法,说不定原本的算法还是有其存在的原因的.

切记切记.

附上解决办法:

$search->SetGeoAnchor('latitude', 'longitude', (float) deg2rad($_latitude), (float) deg2rad($_longitude));

传入坐标的时候把坐标角度转换成弧度即可.

备忘:

PHP版弧度计算:

function sphSqr($v){

return $v*$v;

}

function cacu_geo($loc_lat,$loc_lng,$geo_lat,$geo_lng){

$R 6384000;

$plat (float)$loc_lat;

$plon (float)$loc_lng;

$dlat $plat $geo_lat;

$dlon $plon $geo_lng;

$a sphSqr sin $dlat/2 cos($plat)*cos($geo_lat)*sphSqr(sin($dlon/2));

$c 2*asin min 1, sqrt($a) );

return (float)($R*$c);

}

MYSQL版本坐标计算(角度):

SELECT 6384000 ASIN(SQRT(

POWER(SIN((31.218992 abs(31.218992)) pi()/180 2), 

2)  COS(31.218992 pi()/180 COS(abs(31.218992) 

pi()/180)  POWER(SIN((121.431241 121.431480) 

pi()/180 2), 2) )) as  distance

PHP版本坐标计算(角度):

function rad($d)

{

   return $d 3.1415926535898 180.0;

}

function GetDistance($lat1, $lng1, $lat2, $lng2)

{

   $EARTH_RADIUS 6384.000;

   $radLat1 rad($lat1);

   $radLat2 rad($lat2);

   $a $radLat1 $radLat2;

   $b rad($lng1) rad($lng2);

   $s asin(sqrt(pow(sin($a 2), 2) + cos($radLat1) cos($radLat2) pow(sin($b 2), 2)));

   $s $s $EARTH_RADIUS;

   $s round($s 10000) 10000;

   return $s;

}

 

来源: http://blog.sina.com.cn/s/blog_3f1a25310100wrlj.html

FortifySCA

Fortify SCA简介
   Fortify SCA 是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析, 分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并给予整理报告。扫描的结果中不但包括详细的安 全漏洞的信息,还会有相关的安全知识的说明,以及修复意见的提供。

1.Fortify SCA 扫描引擎介绍:
   Foritfy SCA主要包含的五大分析引擎:
?? 数据流引擎:跟踪,记录并分析程序中的数据传递过程所产生的安全问题。
?? 语义引擎:分析程序中不安全的函数,方法的使用的安全问题。
?? 结构引擎:分析程序上下文环境,结构中的安全问题。
?? 控制流引擎:分析程序特定时间,状态下执行操作指令的安全问题。
?? 配置引擎:分析项目配置文件中的敏感信息和配置缺失的安全问题。
?? 特有的X-Tier™跟踪器:跨跃项目的上下层次,贯穿程序来综合分析问题

2. Fortify SCA 的工作原理:
   Foritfy SCA 首先通过调用语言的编译器或者解释器把前端的语言代码(如JAVA,C/C++源代码)转换成一种中间媒体文件NST(Normal Syntax Tree)将其源代码之间的调用关系,执行环境,上下文等分析清楚。然后再通过上述的五大分析引擎从五个切面来分析这个NST,匹配所有规则库中的漏洞特 征,一旦发现漏洞就抓取出来。最后形成包含详细漏洞信息的FPR结果文件,用AWB打开查看。

Fortify SCA 扫描的结果如下:
   Fortify SCA 的结果文件为.FPR文件,包括详细的漏洞信息:漏洞分类,漏洞产生的全路径,漏洞所在的源代码行,漏洞的详细说明及修复建议等。如下图:

3.Fortify SCA支持的平台:

4.Fortify SCA支持的编程语言:

5.Fortify SCA plug-In 支持的有:

6.Fortify SCA目前能够扫描的安全漏洞种类有:
   目前Fortify SCA可以扫描出约300种漏洞,Fortify将所有安全漏洞整理分类,根据开发语言分项目,再细分为8个大类,约300个子类,具体详细信息可登录Fortify 官方网站fortify.com/vulncat/">http://www.fortify.com/vulncat/ 进行查询:

Code Correctness: Call to GC.Collect()
Missing Check against Null
Object Model Violation: Just One of Equals() and GetHashCode() Defined
Often Misused: Authentication
Unchecked Return Value
Code Correctness: Class Implements ICloneable
Code Correctness: Missing [Serializable] Attribute
Code Correctness: Misspelled Method Name
Code Correctness: null Argument to Equals()
Dead Code: Unused Field
Dead Code: Unused Method
Null Dereference
Obsolete
Unreleased Resource
JavaScript Hijacking: Vulnerable Framework
Poor Logging Practice: Use of a System Output Stream
System Information Leak
Trust Boundary Violation
ASP.NET Misconfiguration: Request Validation Disabled
ASP.NET Misconfiguration: Trace Output
Poor Error Handling: Empty Catch Block
Poor Error Handling: Overly Broad Catch
Poor Error Handling: Program Catches NullReferenceException
Command Injection
Cross-Site Scripting
Denial of Service
HTTP Response Splitting
Log Forging
Path Manipulation
Resource Injection
SQL Injection
SQL Injection: NHibernate
Setting Manipulation
ASP.NET Bad Practices: Use of Impersonation Context
ASP.NET Misconfiguration: Persistent Authentication
Access Control: Database
Insecure Randomness
Password Management
Password Management: Hardcoded Password
Password Management: Weak Cryptography
Privacy Violation
ASP.NET Bad Practices: Non-Serializable Object Stored in Session
Code Correctness: Call to System.gc()
Code Correctness: Erroneous finalize() Method
EJB Bad Practices: Use of AWT/Swing
EJB Bad Practices: Use of Class Loader
EJB Bad Practices: Use of Sockets
EJB Bad Practices: Use of Synchronization Primitives
EJB Bad Practices: Use of java.io
J2EE Bad Practices: Sockets
J2EE Bad Practices: getConnection
Missing Check against Null
Missing Check for Null Parameter
Object Model Violation: Erroneous clone() Method
Object Model Violation: Just one of equals() and hashCode() Defined
Often Misused: Authentication
Poor Style: Explicit Call to finalize()
Statistical: Checked Return Value
Statistical: Function Return Unused
Statistical: Unassigned Return Value
Unchecked Return Value
Code Correctness: Call to Thread.run()
Code Correctness: Class Does Not Implement Cloneable
Code Correctness: Erroneous Class Compare
Code Correctness: Erroneous String Compare
Code Correctness: Misspelled Method Name
Code Correctness: null Argument to equals()
Dead Code: Expression is Always false
Dead Code: Expression is Always true
Dead Code: Unused Field
Dead Code: Unused Method
Null Dereference
Obsolete
Poor Style: Confusing Naming
Poor Style: Empty Synchronized Block
Poor Style: Identifier Contains Dollar Symbol ($)
Poor Style: Redundant Initialization
Poor Style: Value Never Read
Unreleased Resource: Database
Unreleased Resource: Streams
J2EE Bad Practices: Leftover Debug Code
JavaScript Hijacking: Ad Hoc Ajax
JavaScript Hijacking: Vulnerable Framework
Poor Logging Practice: Logger Not Declared Static Final
Poor Logging Practice: Multiple Loggers
Poor Logging Practice: Use of a System Output Stream
System Information Leak
System Information Leak: Missing Catch Block
Trust Boundary Violation
Unsafe Mobile Code: Access Violation
Unsafe Mobile Code: Inner Class
Unsafe Mobile Code: Public finalize() Method
Unsafe Mobile Code: Unsafe Array Declaration
Unsafe Mobile Code: Unsafe Public Field
Poor Error Handling: Empty Catch Block
Poor Error Handling: Overly Broad Catch
Poor Error Handling: Overly Broad Throws
Poor Error Handling: Program Catches NullPointerException
Poor Error Handling: Return inside Finally
Poor Error Handling: Unhandled SSL Exception
Command Injection
Cross-Site Scripting
Denial of Service
HTTP Response Splitting
Log Forging (debug)
Log Forging
Missing XML Validation
NUMBER Taint Sources
Path Manipulation
Process Control
Resource Injection
SQL Injection
SQL Injection: Hibernate
Setting Manipulation
Struts: Erroneous validate() Method
Unsafe JNI
Unsafe Reflection
Access Control: Database
Insecure Randomness
Password Management
Password Management: Hardcoded Password
Password Management: Password in Redirect
Password Management: Weak Cryptography
Privacy Violation
Code Correctness: Double-Checked Locking
J2EE Bad Practices: Non-Serializable Object Stored in Session
J2EE Bad Practices: System.exit
J2EE Bad Practices: Threads
Race Condition: Singleton Member Field
Race Condition: Static Database Connection
Session Fixation

来源: http://www.itsafty.com/code/fortysga.html

 

Fortify SCA简介
   Fortify SCA 是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析, 分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并给予整理报告。扫描的结果中不但包括详细的安 全漏洞的信息,还会有相关的安全知识的说明,以及修复意见的提供。

1.Fortify SCA 扫描引擎介绍:
   Foritfy SCA主要包含的五大分析引擎:
?? 数据流引擎:跟踪,记录并分析程序中的数据传递过程所产生的安全问题。
?? 语义引擎:分析程序中不安全的函数,方法的使用的安全问题。
?? 结构引擎:分析程序上下文环境,结构中的安全问题。
?? 控制流引擎:分析程序特定时间,状态下执行操作指令的安全问题。
?? 配置引擎:分析项目配置文件中的敏感信息和配置缺失的安全问题。
?? 特有的X-Tier™跟踪器:跨跃项目的上下层次,贯穿程序来综合分析问题

2. Fortify SCA 的工作原理:
   Foritfy SCA 首先通过调用语言的编译器或者解释器把前端的语言代码(如JAVA,C/C++源代码)转换成一种中间媒体文件NST(Normal Syntax Tree)将其源代码之间的调用关系,执行环境,上下文等分析清楚。然后再通过上述的五大分析引擎从五个切面来分析这个NST,匹配所有规则库中的漏洞特 征,一旦发现漏洞就抓取出来。最后形成包含详细漏洞信息的FPR结果文件,用AWB打开查看。

Fortify SCA 扫描的结果如下:
   Fortify SCA 的结果文件为.FPR文件,包括详细的漏洞信息:漏洞分类,漏洞产生的全路径,漏洞所在的源代码行,漏洞的详细说明及修复建议等。如下图:

3.Fortify SCA支持的平台:

4.Fortify SCA支持的编程语言:

5.Fortify SCA plug-In 支持的有:

6.Fortify SCA目前能够扫描的安全漏洞种类有:
   目前Fortify SCA可以扫描出约300种漏洞,Fortify将所有安全漏洞整理分类,根据开发语言分项目,再细分为8个大类,约300个子类,具体详细信息可登录Fortify 官方网站fortify.com/vulncat/">http://www.fortify.com/vulncat/ 进行查询:

Code Correctness: Call to GC.Collect()
Missing Check against Null
Object Model Violation: Just One of Equals() and GetHashCode() Defined
Often Misused: Authentication
Unchecked Return Value
Code Correctness: Class Implements ICloneable
Code Correctness: Missing [Serializable] Attribute
Code Correctness: Misspelled Method Name
Code Correctness: null Argument to Equals()
Dead Code: Unused Field
Dead Code: Unused Method
Null Dereference
Obsolete
Unreleased Resource
JavaScript Hijacking: Vulnerable Framework
Poor Logging Practice: Use of a System Output Stream
System Information Leak
Trust Boundary Violation
ASP.NET Misconfiguration: Request Validation Disabled
ASP.NET Misconfiguration: Trace Output
Poor Error Handling: Empty Catch Block
Poor Error Handling: Overly Broad Catch
Poor Error Handling: Program Catches NullReferenceException
Command Injection
Cross-Site Scripting
Denial of Service
HTTP Response Splitting
Log Forging
Path Manipulation
Resource Injection
SQL Injection
SQL Injection: NHibernate
Setting Manipulation
ASP.NET Bad Practices: Use of Impersonation Context
ASP.NET Misconfiguration: Persistent Authentication
Access Control: Database
Insecure Randomness
Password Management
Password Management: Hardcoded Password
Password Management: Weak Cryptography
Privacy Violation
ASP.NET Bad Practices: Non-Serializable Object Stored in Session
Code Correctness: Call to System.gc()
Code Correctness: Erroneous finalize() Method
EJB Bad Practices: Use of AWT/Swing
EJB Bad Practices: Use of Class Loader
EJB Bad Practices: Use of Sockets
EJB Bad Practices: Use of Synchronization Primitives
EJB Bad Practices: Use of java.io
J2EE Bad Practices: Sockets
J2EE Bad Practices: getConnection
Missing Check against Null
Missing Check for Null Parameter
Object Model Violation: Erroneous clone() Method
Object Model Violation: Just one of equals() and hashCode() Defined
Often Misused: Authentication
Poor Style: Explicit Call to finalize()
Statistical: Checked Return Value
Statistical: Function Return Unused
Statistical: Unassigned Return Value
Unchecked Return Value
Code Correctness: Call to Thread.run()
Code Correctness: Class Does Not Implement Cloneable
Code Correctness: Erroneous Class Compare
Code Correctness: Erroneous String Compare
Code Correctness: Misspelled Method Name
Code Correctness: null Argument to equals()
Dead Code: Expression is Always false
Dead Code: Expression is Always true
Dead Code: Unused Field
Dead Code: Unused Method
Null Dereference
Obsolete
Poor Style: Confusing Naming
Poor Style: Empty Synchronized Block
Poor Style: Identifier Contains Dollar Symbol ($)
Poor Style: Redundant Initialization
Poor Style: Value Never Read
Unreleased Resource: Database
Unreleased Resource: Streams
J2EE Bad Practices: Leftover Debug Code
JavaScript Hijacking: Ad Hoc Ajax
JavaScript Hijacking: Vulnerable Framework
Poor Logging Practice: Logger Not Declared Static Final
Poor Logging Practice: Multiple Loggers
Poor Logging Practice: Use of a System Output Stream
System Information Leak
System Information Leak: Missing Catch Block
Trust Boundary Violation
Unsafe Mobile Code: Access Violation
Unsafe Mobile Code: Inner Class
Unsafe Mobile Code: Public finalize() Method
Unsafe Mobile Code: Unsafe Array Declaration
Unsafe Mobile Code: Unsafe Public Field
Poor Error Handling: Empty Catch Block
Poor Error Handling: Overly Broad Catch
Poor Error Handling: Overly Broad Throws
Poor Error Handling: Program Catches NullPointerException
Poor Error Handling: Return inside Finally
Poor Error Handling: Unhandled SSL Exception
Command Injection
Cross-Site Scripting
Denial of Service
HTTP Response Splitting
Log Forging (debug)
Log Forging
Missing XML Validation
NUMBER Taint Sources
Path Manipulation
Process Control
Resource Injection
SQL Injection
SQL Injection: Hibernate
Setting Manipulation
Struts: Erroneous validate() Method
Unsafe JNI
Unsafe Reflection
Access Control: Database
Insecure Randomness
Password Management
Password Management: Hardcoded Password
Password Management: Password in Redirect
Password Management: Weak Cryptography
Privacy Violation
Code Correctness: Double-Checked Locking
J2EE Bad Practices: Non-Serializable Object Stored in Session
J2EE Bad Practices: System.exit
J2EE Bad Practices: Threads
Race Condition: Singleton Member Field
Race Condition: Static Database Connection
Session Fixation

来源:http://www.itsafty.com/code/fortysga.html

Apache Lucene 3.x推荐教程

介绍:

Apache Lucene 是一个基于 Java 的全文检索工具包,你可以利用它来为你的应用程序加入索引和检索功能。Lucene 目前是著名的 Apache Jakarta 家族中的一个开源项目,也是目前最为流行的基于 Java 开源全文检索工具包。

第一部分:概述

  1. 我们在很多地方都可以看到搜索功能

  • Windows系统中的有搜索功能:打开"我的电脑",按"F3"就可以使用查找的功能,查找指定的文件或文件夹。搜索的范围是整个电脑中的文件资源。
  • Eclipse中的帮助子系统:点击HelpàHelp Contents,可以查找出相关的帮助信息。搜索的范围是Eclipse的所有帮助文件。
  • 在BBS、BLOG等系统中提供的搜索文章的功能,如这里的贴吧的例子。搜索的范围是系统内的文章数据(都在数据库中)。
  • 搜索引擎,如Baidu或Google等,可以查询到互联网中的网页、PDF、DOC、PPT、图片、视频等。下图是使用百度搜索的效果:

 

以上的查询功能都类似。都是查询的文本内容,都是相同的查询方式,即找出含有指定字符串的资源,不同的只是查询范围(分别为硬盘、所有帮助文件、数据库、互联网)。

 

  1. 什么是全文检索

对于搜索,按被搜索的资源类型,分为两种:可以转为文本的、多媒体类型。我们上一节提到的搜索功能都是搜索的可以转为文本的资源(第一种)。注意,百度或谷歌提供的音乐或视频搜索不是多媒体搜索,他们是按文件名搜索。在智能手机上有一款音乐搜索的软件,可以让他听10秒钟的音乐,然后他就能上网找出这段音乐的名称、演奏者等信息。这是多媒体搜索。

按搜索的方式,上一节提到的搜索功能都是不处理语义,只是找出包含指定词的所有资源(只对词进行匹配)。下图就是显示"中国的首都是哪里"这个搜索要求对应的结果,可以看到,是没有"北京"这个结果的,结果页面都是出现了这些词的网页:

 

全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本。全面、准确和快速是衡量全文检索系统的关键指标。

关于全文检索,我们要知道:1,只处理文本。2,不处理语义。3,搜索时英文不区分大小写。4,结果列表有相关度排序。

在信息检索工具中,全文检索是最具通用性和实用性的。

  1. 学完后能做什么

我们使用Lucene,主要是做站内搜索,即对一个系统内的资源进行搜索。如BBS、BLOG中的文章搜索,网上商店中的商品搜索等。使用Lucene的项目有Eclipse、Jira等。一般不做互联网中资源的搜索,因为不易获取与管理海量资源(专业搜索方向的公司除外)。

所以,学完Lucene后我们就可以为自已的系统增加全文检索的功能。跟这个学习内容相关的练习为:为"传智手播客贴吧"增加搜索其中的文章的功能。

  1. 全文检索不同于数据库搜索

全文检索不同于数据库的SQL查询。(他们所解决的问题不一样,解决的方案也不一样,所以不应进行对比)。在数据库中的搜索就是使用SQL,如:SELECT * FROM t WHERE content like '%ant%'。这样会有如下问题:

  • 匹配效果:如搜索ant会搜索出planting。这样就会搜出很多无关的信息。
  • 相关度排序:查出的结果没有相关度排序,不知道我想要的结果在哪一页。我们在使用百度搜索时,一般不需要翻页,为什么?因为百度做了相关度排序:为每一条结果打一个分数,这条结果越符合搜索条件,得分就越高,叫做相关度得分,结果列表会按照这个分数由高到低排列,所以第1页的结果就是我们最想要的结果。
  • 全文检索的速度大大快于SQL的like搜索的速度。这是因为查询方式不同造成的,以查字典举例:数据库的like就是一页一页的翻,一行一行的找,而全文检索是先查目录,得到结果所在的页码,再直接翻到这一页。

 

所以数据库搜索不能替代全文检索。

  • 第二部分:入门
  1. 基础概念1(HelloWorld前)

全文检索就如同ORM,是一个概念。ORM的框架有很多种:Hibernate、TopLink、iBatis等,我们之前学习的是Hibernate。同样的,全文检索领域中也有多种框架,Lucene就是其中的一个用开源的全文检索框架。

Lucene的主页为:http://lucene.apache.org/。本文档中所使用的Lucene为3.0.1的版本。以下两小节是Lucene中重要的概念。

  1. 全文检索的工作流程

如果信息检索系统在用户发出了检索请求后再去互联网上找答案,根本无法在有限的时 间内返回结果。所以要先把要检索的资源集合放到本地,并使用某种特定的结构存储,称为索引,这个索引的集合称为索引库。由于索引库的结构是按照专门为快速 查询设计的,所以查询的速度非常快。我们每次搜索都是在本地的索引库中进行,如下图:

 

从图片上可以看出,我们不仅要搜索,还要保证数据集合与索引库的一致性。所以对于全文检索功能的开发,要做的有两个方面:索引库管理(维护索引库中的数据)、在索引库中进行搜索。而Lucene就是操作索引库的工具。

 

  1. 使用Lucene的API操作索引库

 

索引库是一个目录,里面是一些二进制文件,就如同数据库,所有的数据也是以文件的形式存在文件系统中的。我们不能直接操作这些二进制文件,而是使用Lucene提供的API完成相应的操作,就像操作数据库应使用SQL语句一样。

对索引库的操作可以分为两种:管理与查询。管理索引库使用IndexWriter,从索引库中查询使用IndexSearcher。Lucene的数据结构为Document与Field。Document代表一条数据,Field代表数据中的一个属性。一个Document中有多个Field,Field的值为String型,因为Lucene只处理文本。

我们只需要把在我们的程序中的对象转成Document,就可以交给Lucene管理了,搜索的结果中的数据列表也是Document的集合。

有了这些概念,可以写HelloWorld了,其他的概念可以在写完HelloWorld后再进行说明。

 

  1. 基础概念2(HelloWorld后)

    1. 索引库结构——倒排序索引

我们需要对文档进行预处理,建立一种便于检索的数据结构,以此来提高信息检索的速度,这种数据结构就是索引。目前广泛使用的一种索引方式是倒排序索引。

倒排序索引的原理就如同查字典。要先查目录,得到数据对应的页码,在直接翻到指定的页码。不是在文章中找词,而是从目录中找词所在的文章。这需要在索引库中生成一个词汇表(目录),在词汇表中的每一个条记录都是类似于"词à所在文档的编号列表"的结构,记录了每一个出现过的单词,和单词出现的地方(哪些文档)。查询时先查词汇表,得到文档的编号,再直接取出相应的文档。

 

把数据转成指定格式放到索引库中的操作叫做建立索引。建立索引时,在把数据存到索引库后,再更新词汇表。进行搜索时,先从检索词汇表开始,然后找到相对应的文档。如果查询中仅包含一个关键词,则在词汇表中找到该单词,并取出他对应的文档就可以了。如果查询中包含多个关键词,则需要将各个单词检索出的记录进行合并再取出相应的文档记录。

如果词汇表中有一个词"传智播客"对应的文档编号列表为"1"。现在又有添加了一个包含"传智播客"的文档,则词汇表中的"传智播客"词后对应的编号列表变成了"1,2"。因为关键词的数量受实际语言的限制,所以不用担心词汇表会变的很大。

  1. 索引文件的检索与维护,更新是先删除后创建

维护倒排索引有三个操作:添加、删除和更新文档。但是更新操作需要较高的代价。因为文档修改后(即使是很小的修改),就可能会造成文档中的很多的关键词的位置都发生了变化,这就需要频繁的读取和修改记录,这种代价是相当高的。因此,一般不进行真正的更新操作,而是使用"先删除,再创建"的方式代替更新操作。

  1. 建立索引的执行过程(Store、Index)

在建立索引时,先要把文档存到索引库中,还要更新词汇表。如下图:

 

  1. 我们做的操作:把数据对象转成相应的Document,其中的属性转为Field。
  2. 我们做的操作:调用工具IndexWriter的addDocument(doc),把Document添加到索引库中。
  3. Lucene做的操作:把文档存到索引库中,并自动指定一个内部编号,用来唯一标识这条数据。内部编号类似于这条数据的地址,在索引库内部的数据进行调整后,这个编号就可能会改变,同时词汇表中引用的编号也会做相应改变,以保证正确。但我们如果在外面引用了这个编号,前后两次去取,得到的可能不是同一个文档!所以内部编号最好只在内部用。
  4. Lucene做的操作:更新词汇表。把文本中的词找出并放到词汇表中,建立与文档的对应关系。要把哪些词放到词汇表中呢,也就是文本中包含哪些词呢?这就用到了一个叫做Analyzer(分词器)的工具。他的作用是把一段文本中的词按规则取出所包含的所有词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。如下图:

 

在把对象的属性转为Field时,相关代码为:doc.add(new Field("title", article.getTitle(), Store.YES, Index.ANALYZED))。第三与第四个参数的意思为:

枚举类型 枚举常量 说明
Store NO 不存储属性的值
YES 存储属性的值
Index NO 不建立索引
ANALYZED 分词后建立索引
NOT_ANALYZED 不分词,把整个内容作为一个词建立索引

说明:Store是影响搜索出的结果中是否有指定属性的原始内容。Index是影响是否可以从这个属性中查询(No),或是查询时可以查其中的某些词(ANALYZED),还是要把整个内容作为一个词进行查询(NOT_ANALYZED)。

  1. 从索引库中搜索的执行过程(QueryParser、TopDocs、ScoreDoc)

在进行搜索时,先在词汇表中查找,得到符合条件的文档编号列表。再根据文档编号真正的去取出数据(Document)。如下图:

 

  1. 把要查询字符串转为Query对象。这就像在Hibernate中使用HQL查询时,也要先调用Session.createQuery(hql)转成Hibernate的Query对象一样。把查询字符串转换成Query是使用QueryParser,或使用MultiFieldQueryParser。查询字符串也要先经过Analyzer(分词器)。要求搜索时使用的Analyzer要与建立索引时使用的Analzyer要一致,否则可能搜不出正确的结果。
  2. 调用IndexSearcher.search(),进行查询,得到结果。此方法返回值为TopDocs,是包含结果的多个信息的一个对象。其中有totalHits 代表决记录数,ScoreDoc的数组。ScoreDoc是代表一个结果的相关度得分与文档编号等信息的对象。
  3. 取出要用到的数据列表。调用IndexSearcher.doc(scoreDoc.doc)以取出指定编号对应的Document数据。在分页时要用到:一次只取一页的数据。

 

  1. HelloWorld

  • 准备场景
  • 添加Lucene环境
  • 完成功能
    • 建立索引
    • 从索引库中搜索

 

要加入的jar包有:

  • lucene-core-3.0.1.jar(核心包)
  • contrib\analyzers\common\lucene-analyzers-3.0.1.jar(分词器)
  • contrib\highlighter\lucene-highlighter-3.0.1.jar(高亮)
  • contrib\memory\lucene-memory-3.0.1.jar(高亮)
    • 第三部分:深入
  1. 索引库管理

    1. IndexWriter

构造方法1:IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl)

 

构造方法2:IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl),第三个参数指定,true表示建立新的索引库或覆盖现有的索引库(删除后重建);false表示使用已有的索引库,如果不存在,就报错。

 

commit()

rollback()

close()

  1. 使用IndexDao封装对索引库的增删改查1

提出问题:所有的数据(对象),我们都要存到数据库中。对于要进行搜索的数据,还要存到索引库中,以供搜索。一份数据同时存到数据库与索引库中(格式不同),就要想办法保证他们的状态一致。否则,就会影响搜索结果。

 

解决思路:对于上一段提出的问题:保证索引库中与数据库中的数据一致(只要针对要进行搜索的数据)。我们采用的方法是,在数据库中做了相应的操作后,在索引库中也做相应的操作。具体的索引库操作,是通过调用相应的IndexDao方法完成的。IndexDao类似于数据库层的Dao。

我们目前只关注IndexDao中的每个方法的作用(怎么用起来方便就怎么设计)。现在不需要关心IndexDao的每个方法怎么实现,因为那是下一步的事情。设计IndexDao如下:

 

IndexDao的使用:

PublishAction.execute(){ // 发表文章

actionForm à article对象

articleDao.save( article ); // 保存到数据库

articleIndexDao.save( article ); // 保存到索引库

}

DeleteAction.execute(){ // 删除文章

articleDao.delete( id ); // 从数据库中删除

articleIndex.delete( id ); // 从索引库中删除

}

UpdateAction.execute(){ // 更新文章

actionForm à article对象

articleDao.update( article ); // 更新数据库中的相应数据

articleIndexDao.update( article ); // 更新索引库中的相应数据

}

 

 

  1. 使用工具类做对象与Document之间的相互转换

我们在应用程序中使用对象表示数据。在数据库中使用的是表记录,所以存在来回转换的问题。同样,要索引库中使用的是Document,也存在来回转换的问题。如下图:

 

对于一个要进行搜索的实体对象,我们会写一个对应的工具类,其中有两个方法:

Document Object2Document(Object object); // 对象àDocument

Object Document2Object(Document doc); // Documentà对象

在转换时,对象中的属性对应Document中的Field。由于Lucene只处理文本,所有所有的属性值在存储前都要先转成字符串。使用构造方法:Field(String name, String value, Store store, Index index)。

 

Store与Index都是枚举类型。Store:指定是否把当前属性值的原始内容存储到索引库中。如果存储(YES),在搜索出相应数据时这个属性就有原始的值;如果不存储(NO),得到的数据的这个属性的值为null。Index:指定是否建立索引(词汇表)。建立索引才能被搜索到。不可以不存储也不建立索引(没有意义)。

// Store 指定当前字段的数据要不要存到索引库中

// Index 指定当前字段的数据是否可以被搜索(是否更新词汇表)

 

索引设置的一些建议:

1) 尽量减少不必要的存储

2) 不需要检索的内容不要建立索引

3) 非文本格式需要提前转化

4)需要整体存放的内容不要分词

 

NumericUtils与DateTools

如果属性的类型不是字符串,则要先进转换:如果是数字类型,使用NumericUtils。如果是日期类型,则使用DataTools。

  1. 实现IndexDao中的方法:建立、删除、更新索引

索引库的管理操作操作是通过类IndexWriter完成的。创建实例是使用构造方法:IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl)。用完后要调用IndexWriter.close()方法释放资源。

 

  1. 建立索引:保存文档到索引库中。
    1. 把数据转成Document对象的形式。
    2. 调用方法IndexWriter.addDocument(Document doc)

 

  1. 删除索引:删除所有包含指定Term的文档。
    1. 生成用于确定要删除的文档的Term
    2. 调用方法IndexWriter.deleteDocuments(Term term)

说明:在生成Term时,一般。如果有多个文档含有指定的Term,则都会被删掉。

 

  1. 更新索引:实际执行的是先删除,后创建的操作。(参见前面的索引文件的检索与维护)
    1. 把要更新后的对象转为Document对象
    2. 生成用于确定要更新的文档的Term
    3. 调用方法IndexWriter.updateDocument(Term term, Document doc)

说明:如果有多个文档含有指定的Term,更新后就只有一条记录(删掉所有,再创建一个)。如果没有文档含有指定的记录,不会报错,更新后有一条(新创建的)记录。

 

 

  1. 索引库文件优化

    1. 合并索引库文件

IndexWriter.optimize()

indexWriter.setMergeFactor(int)

 

 

  1. 使用RAMDirectory

Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。

Lucene的索引存储位置使用的是一个接口(抽象类),也就可以实现各种各样的实际存储方式(实现类、子类),比如存到文件系统中,存在内存中、存在数据库中等等。Lucene提供了两个子类:FSDirectory与RAMDirectory。

  1. FSDirectory:在文件系统中,是真实的文件夹与文件。
  2. RAMDirectory:在内存中,是模拟的文件夹与文件。与FSDirectory相比:1因为没有IO操作,所以速度快。2,因为在内存中,所以在程序退出后索引库数据就不存在了。

 

索引库的相关操作:

  1. 合并索引库:Directory.addIndexes()
  2. 索引的优化:IndexWriter.optimize()

看看Compass中的Directory的子类,怎么存到数据库中的。

  1. 在索引库中搜索(查询语法与Query对象)

    1. IndexSearcher

在索引库中进行搜索是使用类IndexSearcher。创建其实例的构造方法为:IndexSearcher (Directory path)。用完后要调用IndexSearcher.close()方法释放资源。

  1. 通过QueryParser解析用户的查询字符串进行搜索

  1. QueryParser与MultiFieldQueryParser

查询分析器,处理用户输入的查询条件。把用户输入的非格式化检索词转化成后台检索可以理解的Query对象。使用的构造方法为:QueryParser(Version matchVersion, String f, Analyzer a)

 

  1. MultiFieldQueryParser

是QueryParser的子类。与父类相比,MultiFieldQueryParser可以在多个属性中搜索。使用的构造方法为:MultiFieldQueryParser(Version matchVersion, String[] fields, Analyzer analyzer)

  1. 通过构建各种Query对象进行查询(Query的子类)

Query:抽象类,必须通过一系列子类来表述检索的具体需求。

 

TermQuery

关键词查询

NumericRangeQuery

范围查询。使用静态方法构造实例:

newIntRange(final String field,

Integer min, Integer max,

final boolean minInclusive, final boolean maxInclusive)

newLongRange(final String field,

Long min, Long max,

final boolean minInclusive, final boolean maxInclusive)

newFloatRange(final String field,

Float min, Float max,

final boolean minInclusive, final boolean maxInclusive)

newDoubleRange(final String field,

Double min, Double max,

final boolean minInclusive, final boolean maxInclusive)

WildcardQuery

通配符查询

PhraseQuery

短语查询

public void add(Term term, int position)

public void setSlop(int s)

 

例:add( new Term("name", "lucene", 1);

add(new Term("name", "教程", 3);

代表搜索的是"Lucene ?教程",?表示中间隔一个词。

setSlop(2);

代表这两个词中间可以最多隔2个词

BooleanQuery

public void add(Query query, Occur occur)

 

Occur 用于表示布尔查询子句关系的类,包括:

Occur.MUST,Occur.MUST_NOT,Occur.SHOULD。

 

  1. MUST和MUST:取得连个查询子句的交集。
  2. MUST和MUST_NOT:包含MUST并且查询结果中不包含MUST_NOT的检索结果。
  3. SHOULD与SHOULD,表示"或"关系,最终检索结果为所有检索子句的并集。

 

使用时注意:

  1. 单独使用MUST_NOT:无意义,检索无结果。(也不报错)
  2. MUST_NOT和MUST_NOT:无意义,检索无结果。(也不报错)

 

  1. 单独使用SHOULD:结果相当于MUST。
  2. SHOULD和MUST_NOT:此时SHOULD相当于MUST,结果同MUST和MUST_NOT。
  3. MUST和SHOULD:此时SHOULD无意义,结果为MUST子句的检索结果。

 

 

// 关键词查询

@Test

public void testTermQuery() { }

// 范围查询

@Test

public void testRangeQuery() { }

// 通配符查询

@Test

public void testWildcardQuery() { }

// 短语查询

@Test

public void testPhraseQuery() { }

// 布尔查询

@Test

public void testBooleanQuery() { }

 

 

  1. 支持分页

 

  1. 排序(相关度排序与自定义排序)

通过改变文档Boost值来改变排序结果。Boost是指索引建立过程中,给整篇文档或者文档的某一特定属性设定的权值因子,在检索时,优先返回分数高的。通过Document对象的setBoost()方法和Field对象的setBoost()方法,可以分别为Document和Field指定Boost参数。不同在于前者对文档中每一个域都修改了参数,而后者只针对指定域进行修改。默认情值为1F,一般不做修改。

 

使用Sort对象定制排序。Sort支持的排序功能以文档当中的域为单位,通过这种方法,可以实现一个或者多个不同域的多形式的值排序。时间类型的属性采用STRING常量。

 

 

  1. 按相关度排序

1,相关度得分是在查询时根据查询条件实进计算出来的

2,如果索引库据不变,查询条件不变,查出的文档得分也不变

  1. 按指定的字段排序

If you want to be able to sort results by a Field value, you must add it as a Field that is indexed but not analyzed, using Field.Index.NOT_ANALYZED.

  1. 过滤(Filter)

使用Filter可以对搜索结果进行过滤以获得更小范围的结果。使用Filter对性能的影响很大(有可能会使查询慢上百倍)。

使用NumericRangeFilter。也可使用相应的查询实现一样的效果。

  1. 高亮(Highlight)

需要的jar包为:

contrib\highlighter\lucene-highlighter-3.0.1.jar

contrib\memory\lucene-memory-3.0.1.jar

 

// 生成高亮器

Formatter formatter = new SimpleHTMLFormatter("<span class='kw'>", "</span>");

Scorer scorer = new QueryScorer(query);

Highlighter highlighter = new Highlighter(formatter, scorer);

highlighter.setTextFragmenter(new SimpleFragmenter(20));

 

// 使用高亮器:对content属性值进行摘要并高亮

String text = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "content", doc.get("content"));

// 如果进行高亮的属性值中没有要搜索的关键字,则返回null

if (text != null) {

doc.getField("content").setValue(text);

}

  1. Analyzer(分词器:结构与常用的中文分词器)

    1. 分词器结构

创建索引与进行搜索要使用同一个分词器。

 

 

分词器的一般工作流程:

  1. 切分关键词
  2. 去除停用词

3,对于英文单词,一般要还做:英文单词的所有字母转为小写

 

说明:形态还原,是去除单词词尾的形态变化,将其还原为词的原形。这样做可以搜索出更多有意义的结果。如搜索sutdent时,也可以搜索出students,这是很有用的。

  1. 停用词

有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响,例如英文的"a、an、the、of",或中文的"的、了、着",以及各种标点符号等,这样的词称为停用词(stop word)。文本经过分词之后,停用词通常被过滤掉,不会被进行索引。在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。排除停用词可以加快建立索引的速度,减小索引库文件的大小。

 

  1. 对英文的的处理

  2. 中文分词器

中文的分词比较复杂,因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如在"帽子和服装"中,"和服"就不是一个词。对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词。

  • 单字分词:就是按照中文一个字一个字地进行分词。如:"我们是中国人",
    效果:"我"、"们"、"是"、"中"、"国"、"人"。(StandardAnalyzer就是这样)。
  • 二分法分词:按两个字进行切分。如:"我们是中国人",效果:"我们"、"们是"、"是中"、"中国"、"国人"。(CJKAnalyzer就是这样)。
  • 词库分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。如:"我们是中国人",效果为:"我们"、"中国人"。(使用极易分词的MMAnalyzer。可以使用"极易分词",或者是"庖丁分词"分词器、IKAnalyzer)。

 

 

其他的中文分词器有:

  1. 极易分词:MMAnalyzer,最后版本是1.5.3,更新时间是2007-12-05,不支持Lucene3.0
  2. 庖丁分词:PaodingAnalzyer,最后版本是2.0.4,更新时间是2008-06-03,不支持Lucene3.0

 

 

中文分词器使用IKAnalyzer,主页:http://www.oschina.net/p/ikanalyzer。

实现了以词典为基础的正反向全切分,以及正反向最大匹配切分两种方法。IKAnalyzer是第三方实现的分词器,继承自Lucene的Analyzer类,针对中文文本进行处理。具体的使用方式参见其文档。

注意:扩展的词库与停止词文件要是UTF-8的编码,并且在要文件头部加一空行。

  1. 测试分词器

/**

*使用批定的分词器对指定的文本进行分词,并打印结果

* @param analyzer

* @param text

* @throws Exception

*/

private void testAnalyzer(Analyzer analyzer, String text) throws Exception {

System.out.println("当前使用的分词器:" + analyzer.getClass());

 

TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));

tokenStream.addAttribute(TermAttribute.class);

 

while (tokenStream.incrementToken()) {

TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class);

System.out.println(termAttribute.term());

}

}

  1. 练习

  1. 文件搜索。数据在文件夹中(文件)。
  2. 文章搜索。数据在数据库中(记录)。

 


相关文章阅读及免费下载:

Lucene Ranking算法分析

Lucene Payload 的研究与应用

Lucene排序 Payload的应用

Apache Lucene3.0结果排序原理 操作 示例

更多《Apache Lucene文档》,尽在开卷有益360  http://www.docin.com/book_360

 

 

几种Web服务器比较 (Apache、IIS、Lighttpd、Nginx、LiteSpeed、Zeus)

注意到有这款服务器nginx。没听过,一查有了下文。其中有一个还是听过的。对照翻译了下文。
Apache and IIS are the most common web servers in use today, but they are far from alone. There is a huge amount of web server software out there, both free and commercial.
到目前,Apache和IIS是用的最为普遍的Web服务器,但是它们太过单一,在此之外这里还有许多Web服务器软件,或是免费的或是商业的。
In this article we present four popular alternative web servers: Lighttpd, Nginx, LiteSpeed and Zeus. The first two are free and open source while the other two are commercial, closed-source alternatives. What they all have in common is that they focus on high performance.
本文我们介绍四种最受欢迎的Web服务器: Lighttpd, Nginx, LiteSpeed 和 Zeus。 前两个都是免费且开源的,而另两种都是商业的,闭源的。它们的共同点在于都着重于高性能上。
We will also take a look at how many websites are actually using these web servers.
我们看看有多少网站实际上在使用它们。
But first a brief presentation of each of one:
首先一个简短的介绍其中之一:
Lighttpd

Brief info: Pronounced “Lighty”, Lighttpd is as the name implies a small, lightweight web server which has a low memory footprint and light CPU load. Lighttpd is a good alternative to serve static content but it has also gained recognition in the Ruby on Rails and PHP communities.

Lighttpd 的名称暗示小,轻量级web服务器,占用内存小且cpu负荷低。Lighttpd 是服务于静态内容的不错选择。然而它更被公认为是用在Ruby 和 PHP 上。
Used by: Wikimedia (Wikipedia), Sourceforge, YouTube, The Pirate Bay, Meebo, Imageshack, Sendspace, Mininova.
Cost: Free
Open Source: Yes
OS platforms: Linux, freeBSD, Solaris, MacOS X, Windows (under Cygwin)
Homepage: http://www.oschina.net/p/lighttpd
Nginx

Brief info: Pronounced “engine X”, Nginx is a lightweight web server and reverse proxy. originally written by Igor Sysoev for Rambler.ru (Russia’s second most visited website). Nginx is known for stability and simple configuration in addition to its low resource consumption. It can also act as an IMAP/POP3 proxy.

Nginx 是一款轻量级web服务器和反向代理。最初由Igor Sysoev 编写。它的出名在于其稳定性和简单的配置,除此之外低资源消耗。 还有它可以作为IMAP/POP3协议。
Used by: Yellow Pages, Hulu, Zimbra, the Friends for Sale Facebook app, Rambler, and it also seems that WordPress.com just started using it instead of LiteSpeed.
Cost: Free
Open Source: Yes
OS platforms: Linux, FreeBSD, Solaris, MacOS X
Homepage: http://www.oschina.net/p/nginx
LiteSpeed

Brief info: LiteSpeed is a commercial web server designed specifically for large websites. One of LiteSpeed’s advantages is that it can read Apache configurations directly which makes it easy to integrate with existing products to replace Apache. The server is lightweight and as the name implies very fast.

LiteSpeed 一种被特别设计用作大型网站的商业web服务器。 其中一个优势就是它能直接读取Apache 的配置信息。并轻易将它现有的产品结合在一起来代替Apache 。这种服务器是轻量级的就如它的名字暗示出非常快。
Used by: WordPress (until recently at least, but now WordPress.com appears to be using nginx), Twitter, GigaOm, Bravenet.
Cost: Free to $1,299 depending on the edition.
Open Source: No
OS platforms: Linux, FreeBSD, Solaris, MacOS X
Homepage: http://www.ruanku.com/p/litespeedtech-web-server
Zeus

Brief info: Zeus web server is a high performance web server. It has received PC Magazine Editors’ Choice award and also the eWeek/PC Magazine Innovation in Infrastructure award. Zeus is a highly flexible enterprise product.

Zeus web server 是一个高性能的web服务器。它曾被PC Magazine Editors’ Choice 授过奖并且eWeek/PC Magazine Innovation 也授予过它奖项。Zeus 是一种高度灵活的企业产品。
Used by: Sony, Telefónica, Virgin media, phpBB.
Cost: $1,700 up to two physical CPUs; $850 per additional CPU.
Open Source: No
OS platforms: Linux, FreeBSD, Solaris, HP-UX
Homepage: http://www.ruanku.com/p/zeus-web-server
How many websites are using these web servers?

According to Netcraft, Lighttpd is currently the most common of these four web servers. On April 1, the numbers of websites for each were as follows:
有多少网站在使用它们?
根据Netcraft统计,Lighttpd 是当前这四种服务器中最普遍的。在4月1日统计到的网站数字。
Lighttpd: 1,495,308
Nginx: 1,018,503
LiteSpeed: 668,030
Zeus: 420,477
These positions were not always the same, though. As you can see by the following graph, which shows the numbers from January 2006 to April 2008, the situation has changed significantly over time.
然而这个形势并不一直是一样的。通过下图你可以看到从2006年1月到2008年4月,形势随着时间而改变着。

The graph is based on data from Netcraft (their web server survey archives).
The huge leap for Lighttpd in January-March of 2007 is most likely due to one or more web hosting or domain registration companies switching over to Lighttpd either for their regular pages, or for parked pages, or both. If anyone knows what happened there in more detail, please feel free to let us know in the comments.
2007年1月到3月,很可能归咎于一个或多个web服务商或域名注册公司转变使用Lighttpd 。发生了什么如果有人知道的更详细些……
Interestingly, the number of servers using the Zeus web server has remained quite constant over the last two years, and even decreased a little. That said, it is mainly an enterprise solution, so this is perhaps not so surprising.
非常有趣的是,过去两年使用Zeus 作为服务器的数量维持在一个非常恒定的状态。而且减少了一点点。可以说,它主要是针对企业解决方案。所以从这点上是不值得惊讶的。
The two web servers that have been growing the fastest lately are Nginx and LiteSpeed. Nginx recently passed the one-million-websites mark.
Nginx 和 LiteSpeed 这两种服务器增长速度很快。近来Nginx 已经超过了一百万个站点
These numbers of course still pale next to Apache’s roughly 83 million websites, but there is no doubt that these alternative web servers are gaining in popularity. Who knows, one of them may be just right for you?
当然这些数字对于Apache的大概8300万来说不值一提。但仍无置疑的是这些可供选择的服务器越来越受欢迎。有谁知道,其中之一很可能是非常适合你的?

来源:http://yang2001.blog.51cto.com/25307/810154

Zend Studio 常用快捷方式

删除:
CTRL+B  重构项目
CTRL+D  删除一行
CTRL+DELETE 删除后一个词
CTRL+BACKSPACE  删除前一个词
CTRL+SHIFT+DELETE  删除光标开始处到行尾

搜索:
CTRL+E | 搜索已打开的文件名
CTRL+F | 打开本文件的搜索/替换 ,只搜索当前文件
CTRL+H | 打开搜索替换窗口 ,可搜索整个磁盘、工作集
CTRL+K | 查找下一个
CTRL+SHIFT+K | 查找上一个
CTRL+L | 转到文件某一行

CTRL+M | 将当前编辑窗口最大化/还原
CTRL+N | 新建
CTRL+O | 快速大纲, 列出文件中的所有变量和方法,对阅读类文件时很有用
CTRL+P | 打印
CTRL+W | 关闭打开的文件

CTRL+数字键 | 可以收起/展开代码段

(CTRL + 1可以批量修改变量名)

CTRL+/ | 单行注释
CTRL+BACKSPACE | 删除光标前一个单词,这个单词的定义由ZEND自已理解,如前面是符号,就删除一个符号,前面是一个单词就删除一个单词
CTRL+SHIFT+/ | 先选中代码块后,按组合键可注释代码块
CTRL+SHIFT+\ | 取消块注释
Tab/Shift+Tab | 增加/减少代码缩进
ALT+ENTER | 查看当前文档的属性
CTRL+SHIFT+F | 快速格式化代码样式,可选择ZF的代码格式 ( PS 如何设置格式化的样式,可在“首选项” -> “代码样式” -> “格式化程序” 里设置)
ALTER+ ->或<- | 在编辑过的位置前进或后退
CTRL+SHIFT+L | 显示所有快捷键列表(个人称之为“新手键”)
CTRL+F12 | 打开任务(
| PS:任务 个人定义某一个特定的工作集,如你要完成一个注册模块,有三个文件config.php register.class.php register.php
| 你可以将这些文件保存成一个任务register ,只要打开register就能同时打开这三个文件
| )
CTRL+F9 | 激活任务
CTRL+SHIFT+F9 | 取消任务
F11 | 调试当前文件
CTRL+F11 | 运行
F3 | 打开声明 ,在工作集下可用
SHIFT+F2 | 打开PHP手册帮助,查看函数的详细说明

CTRL+HOME 或 CTRL+END | 光标移到文件头或到文件尾
SHIFT+HOME 或SHIFT+END | 选中从光标处到行首或行尾的文字
CTRL+SHIFT+M | 搜索方法名

Zend Studio调试快捷键(来源于互联网)

F9 | 添加/删除断点 所有代码部分
F10 | 逐过程。单步执行调试文件到下一行
F5 | 开始执行。执行调试文件,直到遇到断点。
F8 | 调试URL。打开调试URL对话框
F12 | 概要文件URL。打开profile URL对话框
Shift+F8 | 添加监视点。打开添加监视点对话框
Shift+F11 | 跳出。单步执行到返回后执行的第一行
F11 | 逐语句。单步执行到下一被执行的行
Shift+F10 | 执行到光标行。执行代码到光标所在行。
Ctrl+F5 | 无中断的执行脚本
Shift+F5 | 停止调试器
Ctrl+Alt+B | 在浏览器中显示

 

来源:http://blog.163.com/wang_7380031@126/blog/static/5590587020114604017873/