分类目录归档:Web开发

【原】解决WP的侧边栏错位或下沉的问题

WP总是时不时的出现侧边栏下沉或者错位的问题,很烦人。网上找了些资料,大部分都认为是更换主题造成的,即有些主题本身可能有问题,比如<div>不配对等,还有人说可能文章显示时的<more>标签放在了对齐标签里面造成的,总之原因千奇百怪,都没有一个可以一枪干掉问题的标准答案。

主题内部问题导致标签不配对是造成问题的原因之一;另一个,就是添加文章时也很容易造成错误,而且经常出现,可以肯定的是,百分之八九十都是新增文章造成的。

由于添加文章的时间不确定,出现问题的时间也不确定,时不时就发生一次,所以很难判断是哪篇文章导致了问题。如果仅仅是因为一些标签不配对造成的倒还好说,直接拿UE替换一下看看是不是数量一致就知道了。

这里介绍一个终极解决方案:使用xml检查器来检查,看看是否符合规范。

这里推荐Altova XMLSpy,相当好用的工具,可以网上找找,有很多破解版(阿弥陀佛,罪过)。

1、打开Altova XMLSpy,Ctrl+N新建一个文档,弹出文档类型选择框:

选择xhtml即可;

2、将你有问题的页面打开,右键查看源文件:

将源文件拷贝粘贴到XMLSpy,这时候,如果有问题,其实他已经在下面提示错误了:

 

4、最重要的一步来了:点击上面的“重新检查”按钮:

再看看编辑区,它自动定位到了有问题的地方!!!这就是关键所在:

爽了,你可以直接在页面中搜前面的那句话,就可以定位到有问题的文章和文章中的具体位置了。

我的直接搜这句话就找到了,问题是我前几天转了一篇文章,里面有些代码引用的地方,拷贝不全,导致了问题:

GData Objective-C API reimplements NSXMLElement and other related classes that Apple removed from the iPhone SDK.

6、找到了导致错误的位置,一切就真想大白了,自己看着办吧。

 

 

HTML元素(包括HTML5)的标签、属性及事件大全

本文收录了所有HTML元素(包括HTML5)的标签、属性及事件,以供参阅:

1、标签列表

标签 描述
<!–…–> 定义注释。
<!DOCTYPE> 定义文档类型。
<a> 定义超链接。
<abbr> 定义缩写。
<acronym> HTML 5 中不支持。定义首字母缩写。
<address> 定义地址元素。
<applet> HTML 5 中不支持。定义 applet。
<area> 定义图像映射中的区域。
<article> 定义 article。
<aside> 定义页面内容之外的内容。
<audio> 定义声音内容。
<b> 定义粗体文本。
<base> 定义页面中所有链接的基准 URL。
<basefont> HTML 5 中不支持。请使用 CSS 代替。
<bdi> 定义文本的文本方向,使其脱离其周围文本的方向设置。
<bdo> 定义文本显示的方向。
<big> HTML 5 中不支持。定义大号文本。
<blockquote> 定义长的引用。
<body> 定义 body 元素。
<br> 插入换行符。
<button> 定义按钮。
<canvas> 定义图形。
<caption> 定义表格标题。
<center> HTML 5 中不支持。定义居中的文本。
<cite> 定义引用。
<code> 定义计算机代码文本。
<col> 定义表格列的属性。
<colgroup> 定义表格列的分组。
<command> 定义命令按钮。
<datalist> 定义下拉列表。
<dd> 定义定义的描述。
<del> 定义删除文本。
<details> 定义元素的细节。
<dfn> 定义定义项目。
<dir> HTML 5 中不支持。定义目录列表。
<div> 定义文档中的一个部分。
<dl> 定义定义列表。
<dt> 定义定义的项目。
<em> 定义强调文本。
<embed> 定义外部交互内容或插件。
<fieldset> 定义 fieldset。
<figcaption> 定义 figure 元素的标题。
<figure> 定义媒介内容的分组,以及它们的标题。
<font> HTML 5 中不支持。
<footer> 定义 section 或 page 的页脚。
<form> 定义表单。
<frame> HTML 5 中不支持。定义子窗口(框架)。
<frameset> HTML 5 中不支持。定义框架的集。
<h1> to <h6> 定义标题 1 到标题 6。
<head> 定义关于文档的信息。
<header> 定义 section 或 page 的页眉。
<hgroup> 定义有关文档中的 section 的信息。
<hr> 定义水平线。
<html> 定义 html 文档。
<i> 定义斜体文本。
<iframe> 定义行内的子窗口(框架)。
<img> 定义图像。
<input> 定义输入域。
<ins> 定义插入文本。
<keygen> 定义生成密钥。
<isindex> HTML 5 中不支持。定义单行的输入域。
<kbd> 定义键盘文本。
<label> 定义表单控件的标注。
<legend> 定义 fieldset 中的标题。
<li> 定义列表的项目。
<link> 定义资源引用。
<map> 定义图像映射。
<mark> 定义有记号的文本。
<menu> 定义菜单列表。
<meta> 定义元信息。
<meter> 定义预定义范围内的度量。
<nav> 定义导航链接。
<noframes> HTML 5 中不支持。定义 noframe 部分。
<noscript> 定义 noscript 部分。
<object> 定义嵌入对象。
<ol> 定义有序列表。
<optgroup> 定义选项组。
<option> 定义下拉列表中的选项。
<output> 定义输出的一些类型。
<p> 定义段落。
<param> 为对象定义参数。
<pre> 定义预格式化文本。
<progress> 定义任何类型的任务的进度。
<q> 定义短的引用。
<rp> 定义若浏览器不支持 ruby 元素显示的内容。
<rt> 定义 ruby 注释的解释。
<ruby> 定义 ruby 注释。
<s> HTML 5 中不支持。定义加删除线的文本。
<samp> 定义样本计算机代码。
<script> 定义脚本。
<section> 定义 section。
<select> 定义可选列表。
<small> 将旁注 (side comments) 呈现为小型文本。
<source> 定义媒介源。
<span> 定义文档中的 section。
<strike> HTML 5 中不支持。定义加删除线的文本。
<strong> 定义强调文本。
<style> 定义样式定义。
<sub> 定义下标文本。
<summary> 定义 details 元素的标题。
<sup> 定义上标文本。
<table> 定义表格。
<tbody> 定义表格的主体。
<td> 定义表格单元。
<textarea> 定义 textarea。
<tfoot> 定义表格的脚注。
<th> 定义表头。
<thead> 定义表头。
<time> 定义日期/时间。
<title> 定义文档的标题。
<tr> 定义表格行。
<track> 定义用在媒体播放器中的文本轨道。
<tt> HTML 5 中不支持。定义打字机文本。
<u> HTML 5 中不支持。定义下划线文本。
<ul> 定义无序列表。
<var> 定义变量。
<video> 定义视频。
<xmp> HTML 5 中不支持。定义预格式文本。

2、HTML 5 标准属性

属性 描述
accesskey character 规定访问元素的键盘快捷键
class classname 规定元素的类名(用于规定样式表中的类)。
contenteditable
  • true
  • false
规定是否允许用户编辑内容。
contextmenu menu_id 规定元素的上下文菜单。
data-yourvalue value 创作者定义的属性。HTML 文档的创作者可以定义他们自己的属性。必须以 “data-” 开头。
dir
  • ltr
  • rtl
规定元素中内容的文本方向。
draggable
  • true
  • false
  • auto
规定是否允许用户拖动元素。
hidden hidden 规定该元素是无关的。被隐藏的元素不会显示。
id id 规定元素的唯一 ID。
item
  • empty
  • url
用于组合元素。
itemprop
  • url
  • group value
用于组合项目。
lang language_code 规定元素中内容的语言代码。
spellcheck
  • true
  • false
规定是否必须对元素进行拼写或语法检查。
style style_definition 规定元素的行内样式。
subject id 规定元素对应的项目。
tabindex number 规定元素的 tab 键控制次序。
title text 规定有关元素的额外信息。

3、全局事件属性

下面的表格列出了可插入 HTML 元素中以定义事件行为的标准事件属性。

  • Window 事件属性 – Window Event Attributes
  • 表单事件 – Form Events
  • 键盘事件 – Keybord Events
  • 鼠标事件 – Mouse Events
  • 媒介事件 – Media Events

1)Window 事件属性

window 对象触发的事件。

适用于 <body> 标签:

属性 描述
onafterprint script 在打印文档之后运行脚本
onbeforeprint script 在文档打印之前运行脚本
onbeforeonload script 在文档加载之前运行脚本
onblur script 当窗口失去焦点时运行脚本
onerror script 当错误发生时运行脚本
onfocus script 当窗口获得焦点时运行脚本
onhaschange script 当文档改变时运行脚本
onload script 当文档加载时运行脚本
onmessage script 当触发消息时运行脚本
onoffline script 当文档离线时运行脚本
ononline script 当文档上线时运行脚本
onpagehide script 当窗口隐藏时运行脚本
onpageshow script 当窗口可见时运行脚本
onpopstate script 当窗口历史记录改变时运行脚本
onredo script 当文档执行再执行操作(redo)时运行脚本
onresize script 当调整窗口大小时运行脚本
onstorage script 当文档加载加载时运行脚本
onundo script 当 Web Storage 区域更新时(存储空间中的数据发生变化时)
onunload script 当用户离开文档时运行脚本

2)表单事件

由 HTML 表单内部的动作触发的事件。

属性 描述
onblur script 当元素失去焦点时运行脚本
onchange script 当元素改变时运行脚本
oncontextmenu script 当触发上下文菜单时运行脚本
onfocus script 当元素获得焦点时运行脚本
onformchange script 当表单改变时运行脚本
onforminput script 当表单获得用户输入时运行脚本
oninput script 当元素获得用户输入时运行脚本
oninvalid script 当元素无效时运行脚本
onreset script 当表单重置时运行脚本。HTML 5 不支持。
onselect script 当选取元素时运行脚本
onsubmit script 当提交表单时运行脚本

3)键盘事件

由键盘触发的事件。

属性 描述
onkeydown script 当按下按键时运行脚本
onkeypress script 当按下并松开按键时运行脚本
onkeyup script 当松开按键时运行脚本

4)鼠标事件

由鼠标或相似的用户动作触发的事件。

属性 描述
onclick script 当单击鼠标时运行脚本
ondblclick script 当双击鼠标时运行脚本
ondrag script 当拖动元素时运行脚本
ondragend script 当拖动操作结束时运行脚本
ondragenter script 当元素被拖动至有效的拖放目标时运行脚本
ondragleave script 当元素离开有效拖放目标时运行脚本
ondragover script 当元素被拖动至有效拖放目标上方时运行脚本
ondragstart script 当拖动操作开始时运行脚本
ondrop script 当被拖动元素正在被拖放时运行脚本
onmousedown script 当按下鼠标按钮时运行脚本
onmousemove script 当鼠标指针移动时运行脚本
onmouseout script 当鼠标指针移出元素时运行脚本
onmouseover script 当鼠标指针移至元素之上时运行脚本
onmouseup script 当松开鼠标按钮时运行脚本
onmousewheel script 当转动鼠标滚轮时运行脚本
onscroll script 当滚动元素滚动元素的滚动条时运行脚本

5)媒介事件

由视频、图像以及音频等媒介触发的事件。

适用于所有 HTML 5 元素,不过在媒介元素(诸如 audio、embed、img、object 以及 video)中最常用:

属性 描述
onabort script 当发生中止事件时运行脚本
oncanplay script 当媒介能够开始播放但可能因缓冲而需要停止时运行脚本
oncanplaythrough script 当媒介能够无需因缓冲而停止即可播放至结尾时运行脚本
ondurationchange script 当媒介长度改变时运行脚本
onemptied script 当媒介资源元素突然为空时(网络错误、加载错误等)运行脚本
onended script 当媒介已抵达结尾时运行脚本
onerror script 当在元素加载期间发生错误时运行脚本
onloadeddata script 当加载媒介数据时运行脚本
onloadedmetadata script 当媒介元素的持续时间以及其他媒介数据已加载时运行脚本
onloadstart script 当浏览器开始加载媒介数据时运行脚本
onpause script 当媒介数据暂停时运行脚本
onplay script 当媒介数据将要开始播放时运行脚本
onplaying script 当媒介数据已开始播放时运行脚本
onprogress script 当浏览器正在取媒介数据时运行脚本
onratechange script 当媒介数据的播放速率改变时运行脚本
onreadystatechange script 当就绪状态(ready-state)改变时运行脚本
onseeked script 当媒介元素的定位属性 [1] 不再为真且定位已结束时运行脚本
onseeking script 当媒介元素的定位属性为真且定位已开始时运行脚本
onstalled script 当取回媒介数据过程中(延迟)存在错误时运行脚本
onsuspend script 当浏览器已在取媒介数据但在取回整个媒介文件之前停止时运行脚本
ontimeupdate script 当媒介改变其播放位置时运行脚本
onvolumechange script 当媒介改变音量亦或当音量被设置为静音时运行脚本
onwaiting script 当媒介已停止播放但打算继续播放时运行脚本

[1]:定位属性的英文译文是:seeking attribute。


5个替代Apache和IIS的轻量级网络服务器

 作者:Roko Nastic 

说起Apache和IIS网络服务器,真可谓无人不知,其应用之广也是首屈一指。但是,出色的网络服务器可并不只有Apache和IIS。事实上,性能卓越,堪比Apache和IIS的其他网络服务器还有很多。

 

出色的网络服务器应该具备哪些条件呢?至少得达到如下要求:

  • 高可扩展性
  • 稳定
  • 易配置
  • 轻巧:CPU负载低,资源占用率低,内存占用率低

这些网络服务器大多都是免费的,几乎都可以用于提供轻量级,扩展性高的服务器网络解决方案,一些甚至在整体速度上超越了Apache和IIS。本文中,我们探讨如下五种Apache和IIS以外的网络服务器:

  • Nginx
  • LiteSpeed
  • Lighttpd
  • Hiawatha
  • Cherokee 

1. Nginx

 

Nginx开发于2002年,出自Igor Sysoev之手,2004年公开发布,用户数量连年攀升。Nginx是一款开放源代码,免费的HTTP服务器和反向代理服务器,也可以用作 IMAP/POP3服务器。得益于其超强的可扩展性,Nginx将可控低内存占用率功能与异步架构结合起来,从而达到降低内存使用率和资源占用率的效果。 Nginx性能卓越,环境稳定。目前,WordPress、SourceForge和 TorrentReactor将其作为首选的网络服务器。迄今为止,Nginx位列Apache和IIS之后,排名第三大网络服务器,市场占有率 7.65%。(数据来源:Netcraft公司2011年三月市场调查)

 

2. LiteSpeed

 

LiteSpeed也是一款普及率较高的网络服务器,2002年开发,所有权归LiteSpeed Technologies Inc公司。据说,LiteSpeed具有如下几大优势:

  • 速度超过Apache六倍
  • PHP内容分发速度超过Apache (with mod_php)50%
  • 在SSL层上速度超过Apache三倍

LiteSpeed是一款扩展性很强的网络服务器,性能优异,可以随意与Apache替换使用,而且与常用控制面板,例如cPanel,DirectAdmin等,协作良好。

 

3. Lighttpd

Lighttpd(读作“lighty”)是另外一种低内存占用率服务器,其性能卓异,而且稳定、灵活、高速。Lighttpd由Jan Kneschke开发,2003年发布。其CPU负载低,一大特色是应用了速度优化技术。Lighttpd对于那些饱受负载过高之苦的地方而言无异于雪中送炭。根据Netcraft公司2011年三月市场调查显示,Lighttpd目前排名第五,是YouTube、The Pirate Bay和Meebo等网站的首选网络服务器。

 

4. Hiawatha

 

Hiawatha是一种能够提供更强安全特性的Unix网络服务器,由Hugo Leisink在2002年开发,如今仍不断升级。上一个稳定的升级版本是v7.0,2010年2月发布。虽然Hiawatha主要为适用PHP环境而改进,它能够支持所有CGI/Fast CGI应用。Hiawatha提供许多安全特性,其中包括:

  • 防止SQL注入
  • 防止CSRF攻击
  • 防止DoS阻断服务攻击
  • 预防黑客潜入
  • 限制CGI应用的运行时间

Hiawatha网络服务器可以运行于Linux、BSD、MacOS X和Windows环境。

 

5. Cherokee

 

Cherokee是一种高速,易配置的网络服务器,可以支持FastCGI、SCGI、SSI、PHP、TLS和SSL等最新技术。Cherokee完全免费,可以用于提供灵活的解决方案。Cherokee网络服务器提供cherokee-admin(cherokee管理)接口,还配备有Cherokee Market渠道(注:Cherokee Market代表一种开发商与公司之间的销售渠道,对于用户而言,也是一种全新的购买安装网络应用程序的途径)。因此,Cherokee对于那些需要简单、可扩展、高速网络服务器的用户极具吸引力。

 

以上这些网络服务器会取代Apache或IIS吗?

 

一言蔽之,会。以上讨论的网络服务器大多都在速度和效率上优于Apache或IIS。尽管Apache和IIS在市场份额上独领风骚,这并不代表Apache和IIS的性能一定鹤立鸡群。值得一提的是,技术上,Nginx、Lighttpd和LiteSpeed甚至在某些方面略胜Apache和IIS一筹,而且经常在实地测试中表现更佳。

为什么您需要更换网络服务器呢?如果您觉得正使用的Apache或IIS服务器的速度不尽人意,比如说速度已经达到瓶颈,可能就该考虑换种更快更轻巧的了,可以从以上介绍的选择一款。目前,兼容性不再是个问题,因为多数网络服务器都具备跨平台兼容能力(可是如果您将在网络服务器上运行.NET程序,记得确保系统中安装有Mono Project)。以前,要用其他网络服务器替代Apache或IIS着实不易,如今则是小菜一碟。

原文链接:slodive

译文链接:伯乐在线

移动开发新宠:Lua语言

 

当移动开发成为如日中天的技术话题,这必将带动一些新的技术热点的兴起,之前并未广泛应用的Lua语言,因其灵活、轻量、高效的效率成为iSO平台上的新宠。 

Lua script

TIOBE编程语言流行度排行榜的统计数据来源于Google、Bing、Yahoo!等主流搜索引擎,以及各大技术网站发布的招聘信息,在很大程度上代表了编程语言的流行趋势。在本月的TIOBE编程语言排名中,Lua语言第一次进入了排行榜的前十名。

轻量级脚本语言Lua在开发者中正变得越来越流行,这与移动应用开发的升温密不可分。以iPhone为代表的移动平台,为不少开发者提供了新的应用展示空间,也为支持iOS系统的应用开发带来了巨大商机。包括大获成功的游戏《愤怒的小鸟》在内,不少iPhone和iPad流行应用都使用了Lua作为游戏脚本。

Lua语言最大的优势在于其轻量级脚本和高效的运行效率,这一得天独厚的优势让Lua在以娱乐和用户体验而著称的iOS系统之上大有用武之地。

小巧的Lua语言来自于巴西里约热内卢天主教大学于1993年启动的实验性项目。Lua语法简洁优美,解释器由标准C编写。以快速小巧著称的Lua拥有在目前所有脚本引擎中最快的运行速度,这样的特性让Lua成为用作嵌入式脚本的最佳选择。

Lua代码几乎能在所有操作系统和移动终端上编译运行,同时Lua提供了LuaJIT项目(http://luajit.org/),针对特定目标平台为开发者提供即时编译功能,进一步增强Lua的执行效率。

Lua的设计初衷并非意图构建完整的应用,而是嵌入在应用程序中为应用提供灵活的扩展和定制功能,所以Lua仅提供了基本的数学运算和字符串处理等函数库,而并未涵盖程序设计的方方面面。

在语言兼容性上,Lua一开始就瞄准了具有广泛应用场景的C和C++,让C/C++编写的代码可以很方便地调用Lua脚本,同时C/C++函数也能够在Lua脚本中调用。与C/C++代码的良好交互性,让Lua在应用程序开发中有着广泛的应用基础。

Lua最流行的应用场景是在游戏中作为处理逻辑的脚本,即用来编写游戏的任务脚本,以实现游戏的可配置性和可扩展性。在游戏中Lua脚本的加载不需重启服务器,尽管脚本的运行效率低于编译好的二进制代码,但目前CPU速度已完全能够让Lua脚本迅速解释执行。

在以《魔兽世界》为代表的网络游戏中,几乎所有的插件都是使用解释性的脚本Lua编写,核心的C++代码只占全部代码中的很小一部分比重。

目前Lua语言的最新版本是5.2 Beta,如果你也准备在移动应用开发中尝试嵌入Lua脚本,在熟悉语法之后,便可移步Lua开源项目站点luaforge.net或Lua开发者站点lua-users.org的Wiki库,下载感兴趣的Lua程序脚本,开启Lua脚本的学习之旅。

2011-07-08 10:41 | 来源:《程序员》

本文作者:高昂,关注开源社区,也是OSGeo中国和InfoQ中文站成员。

BugZilla在Win7下安装与配置-IIS7+mysql秘籍

不加“秘籍”不表我倒腾了一天的辛苦啊!

本来想说说BugZilla或者bug管理的重要性,但是想想,你懂的,否则咋会来这里?但我还是想说,真的很有必要,有3个人以上的项目,无论项目多小,bug管理就很必须了。

下面说说本文的重要性,但是想想,你懂的,Win7+IIS7,现在资料很少很少,配置起来很不顺利,所以,你懂的。

关键点:

1、iis7的配置

windows7旗舰版默认是没有安装iis的,所以需要你自己添加。这个吗,推荐你看看这篇文章:

http://www.360doc.com/content/10/0624/19/1872066_35018211.shtml

但是有一点必须注意!BugZilla是cgi写的,后台解释器是Perl,大神啊,我安装IIS7的时候没注意这点,后面的失败全拜此所赐啊!所以,在安装IIS7的时候,一定要勾选CGI模块解释器!

另外,最好在安装ActivePerl之前配置好IIS7.

2、安装和配置ActivePerl

这里又可以参照一个帖子:

http://www.roboby.com/install_bugzilla_in_windows.html

其中有些地方不可照搬,因为你用的是win7,而他的是xp

3、“-T”的问题

如果你碰到提示cgi文件的-T问题,那么恭喜你,你基本成功了!最有一个-T的问题,就是个参数问题。

我们在配置perl.exe作为cgi解释器时,给perl.exe传递的参数是 “perl.exe ‘%s’ %s”,正确的应该是:“perl.exe  -T ‘%s’ %s”!

 

 

BugZilla在Windows下的安装与配置(win7+apache+myql+php)

Apache下配置CGI并配置bugzilla(win7+apache+myql+php)

 

1.安装Apache并配置CGI环境

去Apache网站上下载 2.0.52版本的Apache。直接默认安装到C:\Program Files\Apache Group\Apache2目录下。一切采用默认配置,无需太复杂说明。(如果你安装了其他Web服务器,如IIS、WPS等,占用了80端口的话,你可以在Apache安装的时候,选择使用其他端口,如8080等。或者把IIS的所有Web站点停止也是一个好办法)
安装完成之后,需要对C:\Program Files\Apache Group\Apache2\conf\httpd.conf文件进行编辑。
1.1
如果端口需要修改,可能需要修改该文件中的
Listen 80——> Listen 8080
1.2
修改DocumentRoot参数的路径到C:/Bugzilla,注意,不能写成C:\Bugzilla,而且,同时需要修改DocumentRoot参数行下面的第一个<Directory>的参数,如下所示:
DocumentRoot “C:/Bugzilla”
<Directory “C:/Bugzilla”>
1.3
配置CGI访问,需要把下面这一句前面的#给去掉
AddHandler cgi-script .cgi
1.4
修改Options Indexes FollowSymLinks 参数行
Options Indexes FollowSymLinks ——> Options Indexes FollowSymLinks ExecCGI
同时修改紧随其后的AllowOverride None为AllowOverride All,并且在这一行之后添加一行如下内容,用来告诉Apache,将使用perl来执行.cgi程序文件。
ScriptInterpreterSource Registry-Strict
1.5
为Apache启动的默认文件添加一个index.cgi。如下修改
DirectoryIndex index.html index.html.var——>DirectoryIndex index.html index.html.var index.cgi
1.6
在window的运行中,输入regedit,打开注册表,在HKEY_CLASSES_ROOT下面新建项.cgi,在.cgi下面新建项Shell,在Shell下面新建项ExecCGI,在ExecCGI下面新建Command项,然后修改Command项的默认值为C:\Perl\bin\perl.exe -T
重启Apache就可以了。(可以直接在cmd窗口下输net stop Apache2或者net start Apache2来停止和重启Apache服务,也可以打开管理工具中的服务来停止和启动Apache)

2.配置Bugzilla

打开cmd窗口,进入Bugzilla安装目录
cd Bugzilla
perl checksetup.pl
说明一下,这里需要执行两次perl checksetup.pl,第一次执行的时候,主要是检查Bugzilla需要的Perl的Modules是否正确安装,如果没有问题,则会在c:\Bugzilla目录下生成一个localconfig文件,这个文件用来配置本地的一些信息,以便checksetup.pl程序能够生成Bugzilla需要的数据库内容。
如果第一次执行后没有问题,我们需要编辑localconfig文件的内容。
$cvsbin = “c:/bugzilla/win32/cvs.exe”;
$interdiffbin = “c:/bugzilla/win32/interdiff.exe”;
$diffpath = “c:/bugzilla/win32”;

$db_host = “localhost”; # where is the database?
$db_port = 3306; # which port to use
$db_name = “bugs”; # name of the MySQL database
$db_user = “bugs”; # user to attach to the MySQL database
$db_pass = ”; # 诚如我先前所说,这个地方,我第一次执行perl checksetup.pl没有问题,但是第二次执行的时候,一直提示DBI不能访问mysql数据库的问题。我也试着修改checksetup.pl文件,可是没有用。修改db_name和db_user等信息都没有用,最后无意中把数据库用户bugs的密码设置为空就通过了,再把root的密码改为空,用root帐号测试也通过了,到现在都还不知道具体的原因。见鬼!

修改完成之后,我们再次执行perl checksetup.pl,希望你不要象我一样,碰到这种奇怪的问题。OK,如果你看到一堆的Creating table XXXX … 直到要求你需要输入管理员的邮箱,管理员的真实姓名,管理员的密码都没有出错,那么,恭喜你!

3 .测试一下

到了这一步,基本上来说,是可以通过http://localhost进行Bugzilla系统的访问了。如果没有出现预期的首页界面,可以到C:\Program Files\Apache Group\Apache2\logs下查看一下error.log文件记录。我在测试过程中,也碰到不能出现首页面的问题。然后没有办法,根据错误信息到google上去搜索,才发现有很多介绍Bugzilla在Windows下安装的文章。(黎叔的语气:唉,大意了,大意了!)不过后来还是坚持把这些内容写下来,主要是因为我用的软件版本基本上都是最新的,而且,Bugzilla 2.18增强了图表功能,升级的人还是有吧,嘿嘿。

我碰到的第一个问题,就是所有的.cgi文件的第一行“#!/usr/bin/perl -wT”造成的问题,我按照晚上有人的提示,说修改为#!c:/perl/bin/perl.exe -wT就可以了,真的就可以了,然后发现基本上所有的.cgi文件都要修改,非常麻烦。但是,按照bugzilla的帮助文档的说法,我设置了windows的注册表和增加了ScriptInterpreterSource Registry-Strict这一句,应该就没有问题了,但是为什么还是有问题呢?(我也不知道,不要问我!但是我晚上回到家里,用家里的计算机配置出来的就没有这个问题,不需要进行修改,又见鬼了!)

4.汉化

http://sourceforge.net/projects/bugzilla-cn下载Bugzilla_cn 0.9版本,然后把压缩文件中的.css文件解压到c:\bugzilla\css目录中覆盖,把压缩文件中的cn目录解压到C:\bugzilla\template。

我以为可以了,进入http://localhost去看,还是没有改变,看来我还是有点单纯。又去google了一把,发现了一个方法,就是修改C:\bugzilla\Bugzilla下的Template.pm文件,把其中的my $languages = trim(Param(‘languages’))这一行注释掉,然后修增加一行 my $languages = “cn”; 保存后,无需重启apache,重新进入http://localhost,出现一堆乱码,改一下IE的编码为GB2312就可以了。

注意,有人说,可以修改c:\bugzilla下面的globals.pl文件中的信息,结果我找了半天没有找到,估计新版本的Bugzilla已经不在该文件中设置了。另外一个方法,直接进入http://localhost/editparams.cgi页面,设置languages和defaultlanguage两个输入框内容为cn,保存,重新登陆就可以了。设置结束后,发现每个页面进入都是乱码,都需要在IE浏览器中修改编码为GB2312才能正常显示,无所谓,这是Apache的设置问题,再次打开C:\Program Files\Apache Group\Apache2\conf\httpd.conf文件,找到AddDefaultCharset的行,这里默认是ISO-8859-1,修改为GB2312,重启Apache服务,一切搞定。

摘至阿水博客:http://hi.baidu.com/ashuy

Ubuntu linux下安装Eclipse PDT步骤

作者 FarLee 2010年3月21日 16:48:08

在Ubuntu Linux下进行PHP开发,首先可以安装搭建 LAMP 环境和 phpmyadmin 这个Mysql 数据库管理工具,之后选择一个FTP传工具如:Filezilla,最后我们还要选择PHP开发工具,Ubuntu自带的Gedit纯文本编辑做一般的代码文本的修改足够,但要实现一些项目和调试等功能就不行了,所以我们还是最好还是选择一款IDE开发环境,这里我们选择了Eclipse (PDT)。

Eclipse 最初由IBM公司开发的IDE开发环境贡献给开源社区,优点很多了,什么跨平台、免费开放源代码、自由IDE(集成开发环境)等等。最初只是用于java语言开发,再添加Eclipse插件就可以应用于其他语言如 C/C++(CDT)、Perl、Ruby,Python、telnet 和数据库的开发。PHP也一样,在Eclipse 中安装 PDT(PDT: PHP Development Tools) 插件就可以当作 PHP开发工具了。PDT 同时支持XDebug 和 Zend Debugger 这两种调试工具。

Eclipse PDT 下载

如果你以前没有安装过Eclipse,那么不用先安装Eclipse,再安装PDT插件了。Eclipse官方网站直接提供了All in one 打包下载的版本,包括了PDT 2.1-SR2, Eclipse 3.5-SR2, Mylyn和其他PHP开发必须的插件。进入ALL IN ONE PDT 下载页面,选择适合的Linux版本,如 eclipse-php-galileo-SR2-linux-gtk.tar.gz 下载过来即可。

Eclipse PDT 安装步骤

1. 安装Eclipse 开发环境 JDK / JRE

Eclipse 是运行于Java虚拟机中的,所以必须先安装Java环境才能进行开发测试。在这里可以选择下载JDK 或者JRE。JRE(Java Runtime Environment)是运行环境,JDK(Java Development Kit)是开发环境,JDK开发环境中包括JRE运行环境。所以如果只是使用Eclipse开发PHP程序,JDK不是必须的,JRE即可;如果同时也要进行Java语言的开发,那么JDK才是必须的。

在Ubuntu 中安装了JDK就不用再安装JRE了,如安装了JRE,再安装JDK会重新再装一个JRE。打开Ubuntu终端,使用命令:
sudo apt-get install sun-java6-jre 或 sudo apt-get install sun-java6-jdk

或使用Ubuntu新立得软件包管理器,搜索jdk找到 sun-java6-jdk ,选中刷新–标记以便升级–应用。安装JDK完毕即可。

Update:Ubuntu 10.04 lucid将sun-java6-jdk/jdk 移除了,ubuntu官方推荐使用openjdk-6,但是安装defaut-jdk/jre时出现很多依赖性问题,无法安装。既然它指出仍然可以使用sun-java6-jdk/jdk,在源里面加入system->Administration->Software Sources->other sources->Add ,添加deb http://archive.canonical.com/ lucid partner

2. 安装 Eclipse PDT

将下载过来的Eclipse PDT压缩包 (All-In-One Linux x86/GTK 2 32-bit)解压到适当的适当的目录中,只要jdk/jre环境搭建好,Eclipse解压文件夹放在哪里没关系。执行解压终端命令:

sudo tar -zxvf ‘/home/farlee/下载/eclipse-php-galileo-SR2-linux-gtk.tar.gz’

解压到了/home/farlee 目录下,Eclipse解压缩后,不用再./configure #make install之类的安装即可使用。

3. 添加Eclipse应用程序图标

在Ubuntu 桌面左上角应用程序的编程菜单中添加Eclipse 快捷方式图标:
sudo gedit /usr/share/applications/eclipse.desktop

在Gedit打开的文件中加入下面的代码:

[Desktop Entry]
Encoding=UTF-8
Name=Eclipse
Comment=Eclipse IDE
Exec=/home/farlee/eclipse/eclipse  //改成自己安装Eclipse可执行文件的目录路径
Icon=/home/farlee/eclipse/icon.xpm  //改成自己的Eclipse 图标路径
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;  //指应用程序;编程

保存退出即可。在该图标中右键可以将Eclipse添加到桌面启动器。

4. Eclipse 设置工作区

设置工作区Wrkspace为自己的 www 目录即可。

最后再安装一个XDebug PHP调试工具就更好了。

原创文章,转载请注明出处:远方博客
本文固定链接:http://farlee.info/archives/ubuntu-linux-eclipse-pdt-jdk-jre-php.html

感谢作者分享!

xampp + PDT eclipse php开发环境搭建

1.下载和安装配置XAMPP

我下载的是,XAMPP Lite(精简版) ZIP 压缩包,下载地址

http://www.apachefriends.org/zh_cn/xampp-windows.html

根据xampp的文档描述,解压到根目录意味着您可以直接使用,不需要先运行“setup_xampp.bat”进行配置

(参见:http://www.apachefriends.org/zh_cn/xampp-windows.html#1721)

所以我的解压路径是 C:/xampplite

运行 xampp-control.exe,启动 apache

访问 http://localhost/xampp/phpinfo.php

可以看到apache使用的PHP配置文件为:C:\xampplite\apache\bin\php.ini

打开php.ini,在最后加入以下配置信息,以启用xdebug

Php.ini 配置代码

;载入Xdebug
zend_extension_ts="c:/xampplite/php/ext/php_xdebug.dll"
;xdebug配置
[Xdebug]
;开启自动跟踪
xdebug.auto_trace = On
;开启异常跟踪
xdebug.show_exception_trace = On
;开启远程调试自动启动
xdebug.remote_autostart = On
;开启远程调试
xdebug.remote_enable = On
;收集变量
xdebug.collect_vars = On
;收集返回值
xdebug.collect_return = On<
;收集参数
xdebug.collect_params = On
  • 重启apache,后刷新 phpinfo.php 页面,如果能见到 XDebug 的信息,就说明配置成功2.安装配置eclipse pdt到 下载安装JRE到 http://www.eclipse.org/pdt/downloads/ 下载 PDT All In Ones解压后,运行双击eclipse.exe运行pdt,选择workspace(我的是E:/pdt-ws)打开window -> perference -> PHP->PHP executables新增一个executable:

    Name: xampplite-php

    Executable path: C:\xampplite\php\php.exe

    PHP ini file: C:\xampplite\apache\bin\php.ini

    PHP Debugger: XDebug

    打开window -> perference -> PHP->Debug,设置:

    PHP Debuger: XDegug

    Server: Default

    PHP Executable: xampplite-php

    uncheck “Break at first line”

    3.调试php项目

    新建项目proj1,并新建一个index.php,输入适当的PHP代码,然后设一个断点

    打开apache配置文件 httpd.conf,在最后增加:

    Httpd.conf代码

  • Alias /proj1 E:/pdt-ws/proj1/
    Alias /proj1/ E:/pdt-ws/proj1/
    <Directory "E:/pdt-ws/proj1/">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    </Directory>
  • 重启apache回到eclipse pdt,右击index.php,选择 Debug As –> PHP Web Page 就可以进行断点调试了
  •  

    本文来源信息:

    更新: 2011-05-18 来源: 互联网

    http://it.chinawin.net/softwaredev/article-124e2.html

    深入认识JavaScript中的this指针

      this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。

      和其他面向对象的语言不同,JavaScript中的this指针是一个动态的变量,一个方法内的this指针并不是始终指向定义该方法的对象的,在上一节讲函数的apply和call方法时已经有过这样的例子。为了方便理解,再来看下面的例子:

    以下是引用片段:
    <script language=”JavaScript” type=”text/javascript”>
    <!–
    //创建两个空对象
    var obj1=new Object();
    var obj2=new Object();
    //给两个对象都添加属性p,并分别等于1和2
    obj1.p=1;
    obj2.p=2;
    //给obj1添加方法,用于显示p的值
    obj1.getP=function(){
          alert(this.p); //表面上this指针指向的是obj1
    }
    //调用obj1的getP方法
    obj1.getP();
    //使obj2的getP方法等于obj1的getP方法
    obj2.getP=obj1.getP;
    //调用obj2的getP方法
    obj2.getP();
    //–>
    </script> 

      从代码的执行结果看,分别弹出对话框显示1和2。由此可见,getP函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。在obj1的getP方法中,this就指向了obj1对象,而在obj2的getP方法中,this就指向了obj2对象,并通过this指针引用到了两个对象都具有的属性p。

      由此可见,JavaScript中的this指针是一个动态变化的变量,它表明了当前运行该函数的对象。由this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。实际上,前面介绍的apply方法和call方法都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的方法作为另一个对象的方法运行。

      每个对象集合的元素(即属性或方法)也是一个独立的部分,全局函数和作为一个对象方法定义的函数之间没有任何区别,因为可以把全局函数和变量看作为window对象的方法和属性。也可以使用new操作符来操作一个对象的方法来返回一个对象,这样一个对象的方法也就可以定义为类的形式,其中的this指针则会指向新创建的对象。在后面可以看到,这时对象名可以起到一个命名空间的作用,这是使用JavaScript进行面向对象程序设计的一个技巧。例如:

    以下是引用片段:
    var namespace1=new Object();
    namespace1.class1=function(){
        //初始化对象的代码
    }
    var obj1=new namespace1.class1(); 

      这里就可以把namespace1看成一个命名空间。

      由于对象属性(方法)的动态变化特性,一个对象的两个属性(方法)之间的互相引用,必须要通过this指针,而其他语言中,this关键字是可以省略的。如上面的例子中:

    以下是引用片段:
    obj1.getP=function(){
          alert(this.p); //表面上this指针指向的是obj1

    来自csdn论坛

    WCF 配置过程

    1. 确保已安装 .NET Framework 3.0。 有些示例依赖于 .NET Framework 3.5 版,因此如果打算运行它们,则应确保已安装 .NET Framework 3.5。

    2. 确保已经安装 ASP.NET。 有关如何安装 ASP.NET 的信息,请参见 Internet 信息服务承载说明

    3. 如果在安装 WCF 后安装了 IIS,则必须在 IIS 中注册相应的脚本映射。 如果运行的是 Windows Vista 或 Windows Server 2008,则应确保已执行步骤 2 中的 HTTP 激活过程。如果使用的是 Windows XP SP2 或 Windows Server 2003,请运行下面的命令。 注意   如果使用的是 Windows Vista 或 Windows Server 2008,请不要运行此命令。

        Copy image复制代码
      "%WINDIR%"Microsoft.Net"Framework"v3.0"Windows Communication Foundation"ServiceModelReg.exe" -r

    4. 如果已安装 .NET Framework 3.5,请运行下面的命令。

        CopyCode image复制代码
      "%WINDIR%"Microsoft.Net"Framework"v3.5"WFServicesReg.exe" /c

    5. 按照防火墙说明启用示例使用的端口。

    6. 从此页下载安装程序文件。

    7. 运行 Setupvroot.bat 批处理文件。

      • 创建一个名为 ServiceModelSamples 的虚拟目录。

      • 创建名为 %SystemDrive%”Inetpub”wwwroot”servicemodelsamples 和 %SystemDrive%”Inetpub”wwwroot”servicemodelsamples”bin 的磁盘目录。

      • 如果想要手动设置这些目录,请参见虚拟目录设置说明

      Note注意:

      此过程只能在计算机上执行一次。

    8. 您必须向在其下生成示例的帐户授予对 %SystemDrive%”inetpub”wwwroot 的修改权限。 在生成过程中,某些 Web 承载的示例会尝试将已编译的二进制文件复制到以上位置,如果您没有设置相应权限,则生成过程将中断。 另外,也可以保持权限不变,并以管理员身份运行 SDK 命令提示或 Visual Studio。 注意   如果未完成此步骤,IIS 承载的所有示例都将在生成时失败。 请确保正确设置权限,或者同时以管理员身份运行 SDK 命令提示和 Visual Studio。

    9. 在计算机上创建一个 C:”logs 目录,以供某些需要此目录的示例(例如扩展对错误处理和错误报告的控制示例)使用,并向该文件夹授予适当的帐户写访问权限。 对于 Windows Vista 和 Windows Server 2008,该帐户为 NT Authority”Network Service;对于 Windows XP 和 Windows Server 2003,该帐户为 ASPNET。

    10. 运行 Setupcerttool.bat 文件:

      • 生成 FindPrivateKey 工具。

      • 在 %ProgramFiles%”ServiceModelSampleTools 中创建一个目录。

      • 将 FindPrivateKey 复制到此目录。

      使用证书且承载于 IIS 中的示例需要使用此工具。

    11. 自承载(不承载于 IIS 中)的示例需要在计算机上注册要侦听的 HTTP 地址的权限。 用于 HTTP 命名空间保留的权限由用于运行该示例的用户帐户提供。 默认情况下,管理员帐户具有注册任何 HTTP 地址的权限。 必须为非管理员帐户授予示例所使用的 HTTP 命名空间的权限。 有关配置命名空间保留的信息,请参见Configuring HTTP and HTTPS。

    12. 有些示例需要使用消息队列。 有关安装说明,请参见安装“消息队列 (MSMQ)”

    注意   出于安全目的,请在完成这些示例后通过运行名为 Cleanupvroot.bat 的批处理文件移除虚拟目录定义和在安装步骤中授予的权限。

     

    ( 本文转载自MSDN,仅供参照和学习之用)

     

    开发一个适合Ajax+JSON+jQuery环境使用的多功能页码栏

    事由:由于最近在测试开发的一个ASP.NET MVC的项目需要用到页码栏(并且需要用到AJAX+JSON传输数据),而微软发布的.NET3.5 CTP 的MVCTOOLKIT里面又没有提供,网上找了下似乎也没有太称心的,于是就自己动手做一个。

    由于这个项目用到页码栏的地方大多是后台,所以既然不考虑SEO,本着效率第一的原 则,决定全部使用js(jQuery)+Ajax+JSON的模式。我把js开发框架确定在了jQuery上。起先想叫“jPager”,想起来好像 JAVA已经有一个JPager了,那就叫jPagerBar。

    先确定一下这个插件在项目中必须满足的几个要求:

    1、页数不确定,根据记录条数和每页显示记录数自动生成

    2、样式不确定,必须可以根据页面需要应用不同样式

    3、必须可以自动缩略多余的页码,比如总共有100页,当浏览第50页时,可以省略1-49及51-100之间的部分页码,并且这个延伸显示的页码数量可以由自己设定

    4、提供“上一页”“下一页”按钮,并且可以自己设定对应的值或图形

    5、记录为空时,隐藏页栏,显示友好的空记录信息

    6、属于附加要求:由于该空间可能用于不提供AJAX/JSON数据的页面或者由于 配合SEO需要,同时兼顾POST+AJAX方式和GET直接请求页面(如.aspx)两种方式,并且逻辑和输出尽量分离以便日后需要直接HTML输出时 (SEO需要),由js转换为C#语言。

    7、同一页面中可以多次重复调用,互不影响,并兼容IE/FF

    这里先列出完成以上几点必须提供的API,然后我会把源代码全部发上来:

    调用:ShowPageBar([containerId] ,[url] , [attr]);

    解释:

    参数名称

    类型

    说明

    containerId

    字符串

    提供装载页码栏的容器标签的客户端ID(用于定位,如div)

    url

    字符串

    如果使用GET方法请求页面(最普通的页码栏换页方式),提供需要请求的URL(如果为POST,此url可为空值,有页面指定,稍后源代码中可见)

    attr

    hashtable

    页码栏参数,为hash数据具体包括如下表“表二”

    表二 attr hash参数说明:

    [attr]参数名称

    类型

    说明

    style

    字符串

    css样式,默认”technorati”等,可自己设置(我的示例中使用了网上提供的一套Web2.0的样式,大家也可以自己定制)

    totalCount

    整数

    总记录条数

    pageCount

    整数

    没页显示记录条数,默认为20

    showPageNumber

    整数

    缩略显示页码的阀值(如页码为50,则相邻只显示50 – showPageNumber到50 +showPageNumber的页码),默认为3

    currentPageIndex

    整数

    当前页码

    onclick

    字符串

    页码单击事件(如果采用单击事件,并且包含“return false”字段,则url将被忽略),插件会把“{pageindex}”自动替换为当前页码

    barMark

    字符串

    数据显示区域的Mark标签(<a name=[ barMark]></a>),备用

    noRecordTip

    字符串

    如果没有记录,显示的友好提示

    preWord

    字符造

    “上一页”按钮显示的字样

    nextWord

    字符串

    “下一页”按钮显示的字样

    jQuery源代码如下(PageBar-1.1.1.js):

    /**//*
    插件名称:jPagerBar
    主要功能:对生成的GridView进行客户端加工,对指定的列进行分组并归类显示,更多新功能还在开发中
    当前版本号:1.1.1
    发布日期:2008/2/22

    作者:TNT2 (SZW on cnblogs) QQ:63408537(加位好友请说明来意) Email:szw2003@163.com www.56MAX.com

    版权及相关说明:
    1、作者对此插件保留所有权利。本插件本着开源、交流、共同进步的宗旨,以免费形式为大家无偿提供。修改、引用请保留以上说明信息,否则将视同为主动盗用本插件。
    2、为保证本插件的完整性、安全性和版本统一性,解决任何单位和个人将此插件代码修改后以个人名义或“jGridViewBar”及类似名称发布,一旦发现,作者将不遗余进行力地进行追查、打击、曝光
    3、作者对此插件保留最终解释权。

    如有任何问题或意见、建议,欢迎与作者取得联系!让我们共同进步!
    ======================================================================================================================
    */

    function ShowPageBar(containerId , url , attr)
    {

    var style = (attr[“style”] == null)? “technorati” : attr[“style”];//class样式
    var totalCount =( attr[“totalCount”]==null || attr[“totalCount”] == 0) ? 0 : attr[“totalCount”];;//parseInt()//总记录条数
    var pageCount = (attr[“pageCount”] == null || attr[“pageCount”] == 0) ? 20 : attr[“pageCount”];//attr[“pageCount”];//每页记录数
    var showPageNumber = (attr[“showPageNumber”] == null || attr[“showPageNumber”] == 0) ? 20 : attr[“showPageNumber”];//attr[“showPageNumber”];//显示页码数量
    var currentPageIndex = attr[“currentPageIndex”];//当前页
    var onclick = attr[“onclick“];//onclick参数,如果包含“return false”,则连接转为跳到barMark(暂留接口,其实return false后一般情况下href将失效。)
    var barMark = attr[“mark”];//onclick后跳转到的<a name=”barMark”></a>标签
    var noRecordTip = attr[“noRecordTip”];//没有记录提示(支持HTML)
    var preWord = (attr[“preWord”] == null)? ” < ” : attr[“preWord”];//上一条记录文字,默认为“ < ”
    var nextWord = (attr[“nextWord”] == null)? ” > ” : attr[“nextWord”];//下一条记录文字,默认为“ > ”

    //输出设置
    var barID = containerId + “_pageBar”;
    //var barDiv = (“#”+barID);
    //添加PageBar层
    (“#”+containerId).html(“<div id=””” + barID + “”” class=””” + style + “””></div>”);
    //输出设置 结束

    //如果没有记录,返回空记录提示
    if(totalCount==0)
    {
    (“#”+barID).html(noRecordTip);
    return false;
    }

    pageCount = (pageCount == null || pageCount == 0) ? 20 : pageCount;//每页显示记录数
    var totalPage = parseInt((totalCount-1) / pageCount) +1;//总页数

    showPageNumber = (showPageNumber == null || showPageNumber == 0) ? 3 : showPageNumber;
    currentPageIndex = (currentPageIndex == null || currentPageIndex <= 0 || currentPageIndex > totalPage) ? 1 : currentPageIndex;

    var backPageStyle = (currentPageIndex <= 1) ? “disabled” : “”;
    var nextPageStyle = (currentPageIndex >= totalPage) ? “disabled” : “”;

    var firstDisplayPageEnd = 0;//从第1页显示到xx页
    var bodyDisplayPageStart = 0;//当前页临近最左页码
    var bodyDisplayPageEnd = 0;//当前页临近最右页码
    var endDisplayPageStart = 0;//从第xx页显示到最后一页

    //设定 bodyDisplayPageStart
    bodyDisplayPageStart = (currentPageIndex – showPageNumber <= 1) ? 1 : currentPageIndex – showPageNumber; // (ViewData.pageIndex – ViewData.showPageNumber <= ViewData.showPageNumber) ? ViewData.showPageNumber + 1 : ViewData.pageIndex – ViewData.showPageNumber;

    //设定 bodyDisplayPageEnd
    bodyDisplayPageEnd = (currentPageIndex + showPageNumber >= totalPage) ? totalPage : currentPageIndex + showPageNumber;

    //设定 firstDisplayPageEnd
    if(bodyDisplayPageStart > 1)
    {
    if(bodyDisplayPageStart – showPageNumber <= 1)
    firstDisplayPageEnd = bodyDisplayPageStart – 1;
    else
    firstDisplayPageEnd = showPageNumber;
    }
    else
    {
    firstDisplayPageEnd = 0;
    }

    //设定 endDisplayPageStart
    if(bodyDisplayPageEnd < totalPage)
    {
    if(bodyDisplayPageEnd + showPageNumber >= totalPage)
    endDisplayPageStart = bodyDisplayPageEnd + 1;
    else
    endDisplayPageStart = totalPage – showPageNumber + 1;
    }
    else
    {
    endDisplayPageStart = totalPage + 1;
    }

    /**//******** 备用算法 Start ********/

    // //设定 firstDisplayPageEnd
    // if (currentPageIndex – showPageNumber > 0 && bodyDisplayPageStart > currentPageIndex – showPageNumber)
    // firstDisplayPageEnd = (showPageNumber >= totalPage) ? 0 : showPageNumber;
    // else
    // firstDisplayPageEnd = 0;

    // //设定 endDisplayPageStart
    // if (bodyDisplayPageEnd < totalPage)
    // endDisplayPageStart = (bodyDisplayPageEnd + showPageNumber < totalPage) ? totalPage- showPageNumber + 1 : totalPage+1;
    // else
    // endDisplayPageStart = totalPage+1;
    //
    // //alert(bodyDisplayPageEnd +”<” +totalCount +”- “+showPageNumber);
    // ////设定补充首尾
    // if(bodyDisplayPageStart > 1 && firstDisplayPageEnd == 0)
    // firstDisplayPageEnd = (bodyDisplayPageStart > showPageNumber)? showPageNumber : bodyDisplayPageStart – 1;
    // if(bodyDisplayPageEnd < totalPage && endDisplayPageStart > totalPage)
    // endDisplayPageStart = (bodyDisplayPageEnd < totalPage – showPageNumber)? totalCount – showPageNumber + 1 : bodyDisplayPageEnd + 1;//MS第一个判断有点多余 TNT2
    /**//******** 备用算法 End ********/

    //页面参数设定结束

    //开始输出
    //alert((“#”+barID).html());

    // 上一条
    if(currentPageIndex <= 1)
    (“<span class=””” + backPageStyle + “””>” + preWord + “</span>”).appendTo((“#”+barID));
    else
    (GetPageLink(currentPageIndex-1,currentPageIndex,preWord,onclick,url,barMark)).appendTo((“#”+barID));

    //first
    for (var i = 1; i <= firstDisplayPageEnd; i++)
    (GetPageLink(i,currentPageIndex,i,onclick,url,barMark)).appendTo((“#”+barID));

    //省略号
    if (firstDisplayPageEnd + 1 < bodyDisplayPageStart)
    (“<span> </span>”).appendTo((“#”+barID));

    //body
    for (var i = bodyDisplayPageStart; i <= bodyDisplayPageEnd; i++)
    (GetPageLink(i,currentPageIndex,i,onclick,url,barMark)).appendTo((“#”+barID));

    //省略号
    if (bodyDisplayPageEnd + 1 < endDisplayPageStart)
    (“<span> </span>”).appendTo((“#”+barID));

    //end
    for (var i = endDisplayPageStart; i <= totalPage; i++)
    (GetPageLink(i,currentPageIndex,i,onclick,url,barMark)).appendTo((“#”+barID));

    // >
    if(currentPageIndex >= totalPage)
    (“<span class=””” + nextPageStyle + “””>” + nextWord + “</span>”).appendTo((“#”+barID));
    else
    (GetPageLink(currentPageIndex + 1 ,currentPageIndex,nextWord,onclick,url,barMark)).appendTo((“#”+barID));

    //alert((“#”+barID).html());
    }

    //页码标签链接
    function GetPageLink(linkPageIndex ,currentPageIndex,text,onclick,url,barMark)
    {
    var pageData = “?page=”;//string.Format(“{0}page=”, (Request.QueryString.Count == 0) ? “?” : “&”) + “{0}”;//页码参数

    onclick = (onclick != null)? “onclick=””” + onclick + “””” : “”;
    onclick = onclick.replace(“{pageindex}”,linkPageIndex);
    href = (onclick != null && onclick.indexOf(“return false”) != -1)?”href=””#” + barMark + “”” “:”href=””” + url + pageData + linkPageIndex + “”” “;

    var linkHTML = “”;

    if(linkPageIndex == currentPageIndex)
    linkHTML = “<span class=””current””>” + text + “</span>”;
    else
    linkHTML = “<a ” + href + onclick + “>” + text + “</a>”;

    return linkHTML;
    }

    我们在HTML中这样调用:


    var pageCount = 15;//每页计数
    var totalRecord = 0;
    var pagerStyle = “flickr”;//jPagerBar样式
    ShowPageBar(“pageDataList1_Pager”,//[containerId]
    “<%= Request.Url.AbsolutePath %>”,//[url]
    {style:pagerStyle,mark:”pageDataList1Mark”,
    totalCount:msg.totalCount,showPageNumber:3,pageCount:pageCount,currentPageIndex:pageIndex,noRecordTip:” 没有记录”,preWord:”上一页”,nextWord:”下一页”,
    onclick:”TurnToPage({pageindex});return false;”}//[attr]
    );

    上面代码中的msg是我最后获取的JSON数据,msg.totalCount是一个总记录的计数,在这里您可以从msg.data(JSON数据列表)的计数获取,我在此多加这个totalCount只是为了防止测试过程中数据“失真”而引发的bug的掩盖,特此说明。

    一般我们还需要一个Handler来获取JSON数据(Handler1.ashx)已升级:

    namespace jPagerBar.Handler
    {
    /**//// <summary>
    /// codebehindclassname 的摘要说明
    /// </summary>
    [WebService(Namespace = “http://tempuri.org/”)]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Handler1 : IHttpHandler
    {

    public void ProcessRequest(HttpContext context)
    {

    //获取数据

    if (context.Request.RequestType == “POST”)
    {
    //设置行为参数
    string action = context.Request.Form[“action”].ToString();//动作
    string kind = (action.StartsWith(“g_”)) ? action.Replace(“g_”, string.Empty) : string.Empty;//分类查找 前缀
    string orderString = (context.Request.Form[“orderby”].ToString());//排序
    string order = “ascending”;//排序:升序 TOD目前都为升序,这里留一个接口
    string orderBy = (!string.IsNullOrEmpty(orderString)) ? orderString.Substring(0, orderString.Length – 2) : “ID”;//要排序的字段,如果为空,默认为”ID”
    if (orderString.EndsWith(“_d”))
    {
    order = “descending”;//排序:降序
    }

    int pageCount = int.Parse(context.Request.Form[“pageCount”].ToString());//每页显示记录数
    int pageIndex = int.Parse(context.Request.Form[“pageIndex”].ToString());//当前页
    int skipRecord = (pageIndex – 1) * pageCount;//跳过记录数

    XElement dsXML = CreateDataSorce();//创建并获取模拟数据源

    //获取数据
    var dsLinq =
    (order == “ascending”) ?
    (from x in dsXML.Descendants(“DataTemp”)
    where ((!string.IsNullOrEmpty(kind)) ? (x.Element(“Group”).Value == kind) : (x.Element(“Group”).Value != null))
    orderby x.Element(orderBy).Value ascending
    select new DataSourceModel()
    {
    ID = x.Element(“ID”).Value,
    Group = x.Element(“Group”).Value,
    Colum1 = x.Element(“Colum1”).Value,
    Colum2 = x.Element(“Colum2”).Value,
    Colum3 = x.Element(“Colum3”).Value
    })
    :
    (from x in dsXML.Descendants(“DataTemp”)
    where ((!string.IsNullOrEmpty(kind)) ? (x.Element(“Group”).Value == kind) : (x.Element(“Group”).Value != null))
    orderby x.Element(orderBy).Value descending
    select new DataSourceModel()
    {
    ID = x.Element(“ID”).Value,
    Group = x.Element(“Group”).Value,
    Colum1 = x.Element(“Colum1”).Value,
    Colum2 = x.Element(“Colum2”).Value,
    Colum3 = x.Element(“Colum3”).Value
    });

    int totalCount = dsLinq.Count();//记录总数,在此只起到示范作用,客户端的记录总数可以从JSON数据的data计数获取
    //var dsFinalList = (order == “a”) ?
    // dsLinq.OrderBy(x=>x.).Skip(skipRecord).Take(pageCount).ToList() :
    // dsLinq.OrderByDescending(orderby).Skip(skipRecord).Take(pageCount).ToList();

    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    sb.Append(“{“);
    sb.Append(“totalCount:”);
    sb.Append(totalCount.ToString());
    sb.Append(“,data:”);
    sb.Append(ToJSON(dsLinq.Skip(skipRecord).Take(pageCount).ToList()));
    sb.Append(“}”);

    context.Response.ContentType = “text/plain”;
    context.Response.Write(sb.ToString());
    context.Response.End();
    }

    }

    //创建数据源(用XML模拟)
    private XElement CreateDataSorce()
    {
    string dataSourceFilePath = HttpContext.Current.Server.MapPath(“~/App_Data/DataSource.xml”);

    if (!File.Exists(dataSourceFilePath))
    {
    //设置模拟数据源
    XElement dsInfos = new XElement(“jPagerBar”);
    Random rdn = new Random();
    for (int i = 1; i <= 300; i++)
    {
    //分类数据(模拟)
    //string[] groups = new string[] { “G1”, “G2”, “G3”, “G4” };
    string guid=Guid.NewGuid().ToString().Replace(“-“,””);//用Guid产生随机代码
    //生成模拟数据
    XElement dsInfo = new XElement(“DataTemp”,
    new XElement(“ID”, i.ToString(“000”)),
    new XElement(“Group”, “Group”+rdn.Next(0,5).ToString()),
    new XElement(“Colum1”,guid.Substring(0,3) + “_C1 in ” + i.ToString()),
    new XElement(“Colum2”, guid.Substring(3,3) + rdn.Next(100).ToString() + “_C2 in ” + i.ToString()),
    new XElement(“Colum3”, guid.Substring(6,3) + rdn.Next(100).ToString() + “_C3 in ” + i.ToString())
    );
    dsInfos.Add(dsInfo);//填充数据
    }

    //保存
    dsInfos.Save(dataSourceFilePath);
    }

    return XElement.Load(dataSourceFilePath);
    }

    public static string ToJSON(object obj)
    {
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    return serializer.Serialize(obj);
    }

    //private static void GetJSON(XElement dsXML)
    //{
    // var dsLinq = (from x in dsXML.Descendants(“DataTemp”)
    // select new DataSourceModel()
    // {
    // ID = x.Element(“ID”).Value,
    // Group = x.Element(“Group”).Value,
    // Colum1 = x.Element(“Colum1”).Value,
    // Colum2 = x.Element(“Colum2”).Value,
    // Colum3 = x.Element(“Colum3”).Value
    // });
    // int totalCount = dsLinq.Count();//记录总数,在此只起到示范作用,客户端的记录总数可以从JSON数据的data计数获取
    // System.Text.StringBuilder sb = new System.Text.StringBuilder();
    // sb.Append(“{“);
    // sb.Append(“totalCount:”);
    // sb.Append(totalCount.ToString());
    // sb.Append(“,data:”);
    // sb.Append(ToJSON(dsLinq.ToList()));
    // sb.Append(“}”);
    //}

    public bool IsReusable
    {
    get
    {
    return false;
    }
    }
    }

    //数据源结构
    public class DataSourceModel
    {
    public string ID { get; set; }
    public string Group { get; set; }
    public string Colum1 { get; set; }
    public string Colum2 { get; set; }
    public string Colum3 { get; set; }
    }
    }

    上面我用XML模拟了一个数据源,正好顺便尝试了一下Linq to XML:)如果您是使用.NET2.0的话,也可改成XMLDocument的方式或者从自己的数据源获取。

    这里我们看一下基本效果:
    基本状态:

    如果超过相邻页数地阀值的页码用...替代:

    下面我们升级一下,可以自定义没页显示得条数和跳至的页码:

    光这样当然是不够的,如果用户输入了无效的值,会引发无效的服务器响应,我们需要在客户端就过滤:

    一共300条数据,每页10条,只能显示30页,要31页当然就错了。当然这里我的验证过程只是提供了一条思路,还可以有更多的丰富。(咦?光影魔术手不注册还会有水印?)

    刚才我说的需要能自定义样式,当然也不能少:

    或者这样:

    或者这样:

    ========以下为新增功能

    新增筛选、排序功能

    这个项目是开源的,大家可以在这里下载:/Files/szw/jPagerBar.rar

    友情提醒一下:
    1、这个Demo默认为.net3.5,您也可体提取到别的.net版本中运行。
    2、这个项目的开发背景是ASP.NET MVC,为了比较直观,我用WebForms创建了这个Demo,如果有什么疏漏,请大家多多包涵,并且不吝指出其中的错误或者可以改进的地方。
    3、因为MVC和WebForms的输出方式有所不同,大家在这里可能看不到太多和.NET有关的东西,对应的

    .ascx文件我会在jPagerBar最终版本发布后,发布上来,当然大家也可以做成UI。

     

    本文来自:http://www.bx115.com/showart.asp?art_id=3483

    Ajax实现安全登录

     

    放暑假之前,在网上闲逛,不知怎么的就逛到了CoolCode.CN,看到了andot老师的文章《安全登录系统的设计与实现方案》,深受启发,决定将其进行实际应用。但是文章中仅仅指出了大致的流程,并没有描述具体操作方法。经过一下午+一晚上的摸索,终于将其实现。本文就将介绍我在实践过程中的一些感想和经验。

    平时我们在非SSL加密连接的网站上递交登录表单都是使用明文提交密码,服务器收到客户端递交的密码之后,用相应的加密算法加密(比如MD5或者是SHA1,本文以MD5为例),与数据库中MD5过的密码进行比对,判断用户是否合法。但是在这种情况下,一旦用户发送的明文密码被截获,用户的安全就受到了严重威胁。

    依据andot老师的文章,使用Javascript+PHP实现安全登录的最简便安全的方法就是服务器提供随机字串并将其存储,Javascript在客户端使用MD5将随机数和密码合并进行运算,将MD5过的字符串提交给服务器,服务器方也作相同的运算,与客户端提交的结果进行比对,就可以判断用户的身份了。这样,就算截获中途传输的数据,也只是一个MD5过的密码和一个一次性的随机字符串再次MD5运算的产物而已,随机字符串一旦使用过就会被立即销毁,无法再次验证,没有丝毫用处。而就算中途截获随机字符串,若不知道密码原文,依然无法向服务器递交合法的验证字符串。密码原文只在客户端浏览器上出现,不通过网络传输,每次提交的验证用的密码都不同,连服务器都不知道原文是什么,从而达到保护密码原文的目的。
    大致原理清楚之后,下面就是具体工作流程。

    首先,用户在客户端填写表单,点击提交按钮,触发Javascript。Javascript异步向服务器端请求随机字符串,服务器端生成字符串,储存于SESSION,同时作为XML发送回客户端。客户端的Javascript收到XML并进行解析,得到随机字符串。

    随后,Javascript取得用户输入的密码原文,将其进行MD5。之后将MD5之后的密码与服务器发来的随机字符串再次进行MD5。

    之后,Javascript将加密过后的密码与用户名提交给服务器,服务器用SESSION中的随机字符串与数据库中的密码进行MD5并销毁SESSION中的随机字符串,将结果与用户提交的结果进行比对,判断用户身份。如果通过验证,服务器将用户的状态、帐号等信息存储与SESSION。
    最后,服务器将登陆状态再次通过XML返回给客户端,如果返回成功,则客户端显示登陆成功,并将浏览器重新定向至相关页面。至此登陆过程结束。

    事实上,这个过程非常简单,实现起来只需要5个Javascript函数,一个用来创建XMLHttpRequest对象,一个用来向服务器申请随机字符串,一个用来取得随即字符串,一个用来向服务器发送用户提交的用户名和密码,一个用来取得登陆结果并判断是否需要重定向。如果还需要一个进度条或者是当前登录状态的显示,至需要再增加一到两个控制页面显示的函数就可以了。

    下面是AJAX代码:

    /*
    * SAFE LOGIN
    * Version 0.2 Copyright (C) Dgwxx 2006.
    * See http://www.dgwxx.net for more info.
    */

    var xmlHttp;

    setStatus(“准备…”, “green”);

    function createXMLHttpRequest() {
    if (window.ActiveXObject) {
    xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”);
    }
    else if (window.XMLHttpRequest) {
    xmlHttp = new XMLHttpRequest();
    }
    }

    function requestRndCode() {
    setStatus(“正在请求验证码…”, “green”);
    createXMLHttpRequest();

    var url = “user.php?action=rnds&timeStamp=” + new Date().getTime();

    xmlHttp.open(“GET”, url, true);
    xmlHttp.onreadystatechange = processRndcode;
    xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
    xmlHttp.send(null);
    }

    function processRndcode(){
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
    setStatus(“正在处理验证码…”, “green”);
    var rndcode = xmlHttp.responseXML.getElementsByTagName(“rndcode”)[0].firstChild.data;
    sendVerifyRequest(rndcode);
    }
    }

    function sendVerifyRequest(rndstr) {
    setStatus(“发送验证请求…”, “green”);
    createXMLHttpRequest();

    var url = “user.php?action=verify&timeStamp=” + new Date().getTime();
    var loginuser = document.getElementById(“loginuser”).value;
    var loginpwd = document.getElementById(“loginpwd”).value;
    var sendpwd = hex_md5(rndstr + hex_md5(loginpwd));

    xmlHttp.open(“POST”, url, true);
    xmlHttp.onreadystatechange = processVerifyRequest;
    xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
    xmlHttp.send(“loginuser=” + loginuser + “&loginpwd=” + sendpwd);
    setStatus(“正在等待服务器回应…”, “green”);
    return false;
    }

    function processVerifyRequest() {
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
    setStatus(“正在处理验证…”, “green”);
    var val = xmlHttp.responseXML.getElementsByTagName(“passed”)[0].firstChild.data;

    if (val == “true”) {
    setStatus(“验证成功…”, “green”);
    setTimeout(“window.location.href=’config.php'”,500);
    } else {
    setStatus(“验证失败…”, “red”);
    }
    }
    }

    function setStatus(message, fontColor) {
    document.getElementById(“status”).innerHTML = “<font color=” + fontColor + “>安全验证状态 : ” + message + ” </font>”;
    }

    PHP分配随机字符串的代码:

    <?
    $rnd_code = md5($nowtime_stamp . $sitename);
    $_SESSION[‘rnd_user_key’] = $rnd_code;
    header(“Content-type:application/xml”);
    echo ‘<?xml version=”1.0″ encoding=”UTF-8″ ?>
    <response>
    <rndcode>’.$rnd_code.'</rndcode>
    </response>’;
    ?>

     

     

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

    本文为转载,转载必须确保本文完整并完整保留原作者信息和本文链接

    E-mail: khler@163.com

    QQ:     23381103

    MSN:   pragmac@hotmail.com

    原文:http://www.phpli.com/ajax/yingyong_30.html

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

     

     

     

     

     

     

    Js 调用 WebService心得总结

     
    页面: 
      <INPUT type=”button” value=”Button” onclick=”getdata()”><br>
      <span id=”div1″ class=”list”></span>
       <script language=javascript>
         setInterval(getdata,1000); //动态定时调用
       </script>
    脚本:
       <SCRIPT ID=”clientEventHandlersJS” LANGUAGE=”javascript”>
      function getdata()
      {
        var index=0;   
        docSubmit =new ActiveXObject(“Microsoft.XMLDOM”);
        docSubmit.async = false;   
        docSubmit.load(“http://localhost/WebApplication1/Service1.asmx/GetData?maxval=5”);   
        docSubmit.loadXML(docSubmit.xml.replace(/&lt;/g,”<“).replace(/&gt;/g,”>”));
           
        var s=””;  
        nodeList=docSubmit.documentElement.getElementsByTagName(“ds”);
        for (i=0;i<nodeList.length;i++)
        {
         s=s+nodeList(i).selectSingleNode(“KeShimch”).text+'<br>’;
        }
        div1.innerHtml =””;
        div1.innerHTML=s;
        div1.style.visibility=”visible”;       
      }   
      </script>
     
    //如果返回是个字符串:
       <SCRIPT ID=”clientEventHandlersJS” LANGUAGE=”javascript”>
       function chang()
       {         
        docSubmit =new ActiveXObject(“Microsoft.XMLDOM”);
        docSubmit.async = false;  
        docSubmit.load(“http://localhost/Advertisement/ADService.asmx/GetADCode?ADID=1”);  
            
        var s=docSubmit.documentElement.text;  
        
        window.alert(s);    
        td_AD.innerHTML=s;        
       }   
       //setInterval(chang,2000);//间隔执行      
      </script>
     
    注意:
    在fromework1.0和1.1是有区别的,
    在1.1的 machine.config (C:\WINNT\Microsoft.NET\Framework\v1.1.4322\CONFIG),默认webservice去除了post,get方法
    你可在你的 machine.config 中加上 或者 只在 webServices 项目的 Web.config 的<system.web>里加上:
    <webServices>
         <protocols>
           <add name=”HttpPost” />
           <add name=”HttpGet” />
         </protocols>
    </webServices>
    否则,在ie地址栏输入 webServices 访问地址串时,提示:请求格式无法识别。
    还有
    docSubmit = new ActiveXObject(“MSXML2.DOMDocument”);  //1.0
    换成
    docSubmit =new ActiveXObject(“Microsoft.XMLDOM”);  //1.1
    --------------------------
    web服务方法:
      [WebMethod]
      public string GetData(string maxval)
      {   
       BaseClass.DbManagerSql dbm=new BaseClass.DbManagerSql();
       string strSql=”select * from s_KeShi where Keshidm>”+maxval;
       DataSet ds=dbm.Query(strSql);
       return ds.GetXml();
      }
    返回的xml数据:
      <?xml version=”1.0″ encoding=”utf-8″ ?>
      <string xmlns=”http://tempuri.org/”>
    <NewDataSet>
    <ds> <KeShidm>6</KeShidm> <KeShimch>财务部</KeShimch> </ds>
    <ds> <KeShidm>7</KeShidm> <KeShimch>政工部</KeShimch> </ds>
    <ds> <KeShidm>8</KeShidm> <KeShimch>安质部</KeShimch> </ds>
    <ds> <KeShidm>9</KeShidm> <KeShimch>电管部</KeShimch> </ds>
    <ds> <KeShidm>10</KeShidm> <KeShimch>运输公司</KeShimch> </ds>
    <ds> <KeShidm>11</KeShidm> <KeShimch>局长</KeShimch> </ds>
    <ds> <KeShidm>202</KeShidm> <KeShimch>变电站</KeShimch></ds>
    </NewDataSet>
    </string>

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

    本文为转载,转载必须确保本文完整并完整保留原作者信息和本文链接

    E-mail: khler@163.com

    QQ:     23381103

    MSN:   pragmac@hotmail.com

    原文:http://www.webasp.net/article/28/27619.htm

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