2009年10月30日星期五

Javascript dateDiff函数

[js]
function dateDiff(interval, date1, date2) {
var objInterval = {'D' : 1000 * 60 * 60 * 24, 'H' : 1000 * 60 * 60, 'M' : 1000 * 60, 'S' : 1000, 'T' : 1};
interval = interval.toUpperCase();
var dt1 = Date.parse(date1.replace(/-/g, '/'));
var dt2 = Date.parse(date2.replace(/-/g, '/'));
try {
return Math.round((dt2 - dt1) / eval('(objInterval.' + interval + ')'));
} catch (e) {
return e.message;
}
}
[/js]

说明:

  • interval 取值: d (day), m(minutes), s(second), t(毫秒), 不分区大小写.

  • 日期格式 yyyy (/-) (m)m (/-) (d)d

  • 使用方式 alert(dateDiff('D', '2007-4-1', '2007/04/19'));.

2009年10月29日星期四

胡言乱语

有很多话想述说
却不知该如何说起
也不知该述与何人听
...

每天晚上没完没了的梦
带来无尽的忧伤和思念
昨天晚上去了湘江边
看着平静的江面
感叹于这几个月来生活,工作和感情的变化
上一次坐在江边第一次和友人谈起这段不为人知的感情和让我爱恨交加的工作时
是从未曾想过现在会是这样~
换了工作却怎么也不适应~
换了住处却总是想回到原来的那个地方~
失去所有联络却无时无刻的不在想着要怎么联系~
...
与每个问及的朋友说
我在很努力的适应新的生活
事实好像也是我在努力的生活,工作~
只是,变得越来越不喜欢说话
就那样呆呆的的坐着都好
每天回到住处
掠过心中的总是满满的难以言语的疼痛和难受

流血的伤口,总有复合的盼望
而在心中永不肯痊愈的
是那不流血的创伤
多情应笑我
千年来,早生的岂止是华发
岁月已洒下天罗地网
无法逃脱的
是你的痛苦和我的忧伤

2009年10月28日星期三

恍然如梦

是的
我是在策划着假装偶然遇见你~
醒来后
装作忙碌的收拾这,收拾那~
但还是无法阻止奔向于你的心

...

下了车
走向早在网上查到的那个地址
还在心里默默的准备了若真要遇见你了该怎样说的借口~
当我还自怀疑自己是否方向正确时
却在偶然抬头见忽然好像看到了你的身影
一下又惊慌失措起来
赶快低下头
装作没有注意到你的样子
心里在想着难道真的就这样以陌路人的样子而过~

...

就在你走过我身边时
好像听到了你在叫我~
回头
假装很惊讶的看到你~
你问我到哪去
准备的答案还真派上用场了,呵~
又问到我工作的问题
我语无伦次的回答了好多~
却始终无法将目光放肆的看向于你~
...

期盼了那么久的遇见
却是这样
尽管我准备了千万次当遇见你时自己该怎样
可我始终不是一个好的演员
连找的借口都是那样的拙劣~
..

当我再次从恍惚中醒来
转过身去
想偷偷的看看你的背影时
你却早已消失于人海
...

心飞向了你离去的方向
再次掉转头时
失去了前行的目标了
我是多么的想干脆跟着你走算了
但是却又不敢
~

我怎么敢告诉你
我来到那里
其实仅仅就是因为想见你而已呢

...



以为见你后
思念可以减少一分
却才明白
见你后
思念越来越浓
很想天天躲在那个你经过的地方
就那样的默默的看着你都好
...

2009年10月27日星期二

jQuery 选择器

1 基础选择器

































名称

说明

举例

#id

根据元素Id选择

$("divId")选择ID为divId的元素

element

根据元素的名称选择,

$("a")选择所有<a>元素

.class

根据元素的css类选择

$(".bgRed")选择所用CSS类为bgRed的元素

*

选择所有元素

$("*")选择页面所有元素

selector1,
selector2,
selectorN

可以将几个选择器用","分隔开然后再拼成一个选择器字符串.会同时选中这几个选择器匹配的内容.

$("#divId,a,.bgRed")



2 层次选择器




























名称

说明

举例

ancestor descendant

使用"form input"的形式选中form中的所有input元素.即ancestor(祖先)为from,descendant(子孙)为input.

$(".bgRed div")选择CSS类为bgRed的元素中的所有<div>元素.

parent>child

选择parent的直接子节点child.child必须包含在parent中并且父类是parent元素.

$(".myList>li")选择CSS类为myList元素中的直接子节点<li>对象.

prev+next

prev和next是两个同级别的元素.选中在prev元素后面的next元素.

$("#hibiscus+img")选在id为hibiscus元素后面的img对象.

prev~siblings

选择prev后面的根据siblings过滤的元素
注:siblings是过滤器

$("#someDiv~[title]")选择id为someDiv的对象后面所有带有title属性的元素



3 基本过滤器


























































名称

说明

举例

:first

匹配找到的第一个元素

查找表格的第一行:$("tr:first")

:last

匹配找到的最后一个元素

查找表格的最后一行:$("tr:last")

:not(selector)

去除所有与给定选择器匹配的元素

查找所有未选中的input元素:$("input:not(:checked)")

:even

匹配所有索引值为偶数的元素,从0开始计数

查找表格的1、3、5...行:$("tr:even")

:οdd

匹配所有索引值为奇数的元素,从0开始计数

查找表格的2、4、6行:$("tr:odd")

:eq(index)

匹配一个给定索引值的元素
注:index从0开始计数

查找第二行:$("tr:eq(1)")

:gt(index)

匹配所有大于给定索引值的元素
注:index从0开始计数

查找第二第三行,即索引值是1和2,也就是比0大:$("tr:gt(0)")

:lt(index)

选择结果集中索引小于N的elements
注:index从0开始计数

查找第一第二行,即索引值是0和1,也就是比2小:$("tr:lt(2)")

:header

选择所有h1,h2,h3一类的header标签.

给页面内所有标题加上背景色:$(":header").css("background","#EEE");

:animated

匹配所有正在执行动画效果的元素

只有对不在执行动画效果的元素执行一个动画特效:


$("#run").click(function(){
$("div:not(:animated)").animate({left:"+=20"},1000);
});



4 内容过滤器




























名称

说明

举例

:contains(text)

匹配包含给定文本的元素

查找所有包含"John"的div元素:$("div:contains('John')")

:empty

匹配所有不包含子元素或者文本的空元素

查找所有不包含子元素或者文本的空元素:$("td:empty")

:has(selector)

匹配含有选择器所匹配的元素的元素

给所有包含p元素的div元素添加一个text类:$("div:has(p)").addClass("test");

:parent

匹配含有子元素或者文本的元素

查找所有含有子元素或者文本的td元素:$("td:parent")



可见性过滤器




















名称

说明

举例

:hidden

匹配所有的不可见元素


注:在1.3.2版本中,hidden匹配自身或者父类在文档中不占用空间的元素.如果使用CSSvisibility属性让其不显示但是占位,则不输入hidden.

查找所有不可见的tr元素:$("tr:hidden")

:visible

匹配所有的可见元素

查找所有可见的tr元素:$("tr:visible")



6 属性过滤器











































名称

说明

举例

[attribute]

匹配包含给定属性的元素

查找所有含有id属性的div元素:
$("div[id]")

[attribute=value]

匹配给定的属性是某个特定值的元素

查找所有name属性是newsletter的input元素:
$("input[name='newsletter']").attr("checked",true);

[attribute!=value]

匹配给定的属性是不包含某个特定值的元素

查找所有name属性不是newsletter的input元素:
$("input[name!='newsletter']").attr("checked",true);

[attribute^=value]

匹配给定的属性是以某些值开始的元素

$("input[name^='news']")

[attribute$=value]

匹配给定的属性是以某些值结尾的元素

查找所有name以'letter'结尾的input元素:
$("input[name$='letter']")

[attribute*=value]

匹配给定的属性是以包含某些值的元素

查找所有name包含'man'的input元素:
$("input[name*='man']")

[attributeFilter1][attributeFilter2][attributeFilterN]

复合属性选择器,需要同时满足多个条件时使用。

找到所有含有id属性,并且它的name属性是以man结尾的:
$("input[id][name$='man']")



7 子元素过滤器




























名称

说明

举例

:nth-child(index/even/odd/equation)

匹配其父元素下的第N个子或奇偶元素


':eq(index)'只匹配一个元素,而这个将为每一个父元素匹配子元素。:nth-child从1开始的,而:eq()是从0算起的!


可以使用:
nth-child(even)
:nth-child(odd)
:nth-child(3n)
:nth-child(2)
:nth-child(3n+1)
:nth-child(3n+2)

在每个ul查找第2个li:
$("ulli:nth-child(2)")

:first-child

匹配第一个子元素


':first'只匹配一个元素,而此选择符将为每个父元素匹配一个子元素

在每个ul中查找第一个li:
$("ulli:first-child")

:last-child

匹配最后一个子元素


':last'只匹配一个元素,而此选择符将为每个父元素匹配一个子元素

在每个ul中查找最后一个li:
$("ulli:last-child")

: οnly-child

如果某个元素是父元素中唯一的子元素,那将会被匹配


如果父元素中含有其他元素,那将不会被匹配。

在ul中查找是唯一子元素的li:
$("ulli:only-child")



8 表单选择器


























































名称

说明

解释

:input

匹配所有input,textarea,select和button元素

查找所有的input元素:
$(":input")

:text

匹配所有的文本框

查找所有文本框:
$(":text")

:password

匹配所有密码框

查找所有密码框:
$(":password")

:radio

匹配所有单选按钮

查找所有单选按钮

:checkbox

匹配所有复选框

查找所有复选框:
$(":checkbox")

:submit

匹配所有提交按钮

查找所有提交按钮:
$(":submit")

:image

匹配所有图像域

匹配所有图像域:
$(":image")

:reset

匹配所有重置按钮

查找所有重置按钮:
$(":reset")

:button

匹配所有按钮

查找所有按钮:
$(":button")

:file

匹配所有文件域

查找所有文件域:
$(":file")

Apache URL Rewrite Rule


<IfModule mod_setenvif.c>
<IfDefine SSL>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</IfDefine>
</IfModule>

# Fix certain PHP values
# (commented out by default to prevent errors occuring on certain
# servers)

<IfModule mod_php4.c>
php_value session.use_trans_sid 0
php_value register_globals 1
php_flag display_errors On
php_flag track_errors On
</IfModule>


#seo url
Options +FollowSymLinks
RewriteEngine On
RewriteBase /example/

RewriteRule ^(.*)coupon_products-(.*)-buy_now.html$
coupon_products.php?products_id=$2&action=buy_now&%{QUERY_STRING}
RewriteRule ^(\w*)\.html$ $1\.php
#seo url end

<Files 403.shtml>
order allow,deny
allow from all
</Files>

deny from 192.139.122.122

.htaccess 里修改PHP配置示例


<IfModule mod_php5.c>
php_value magic_quotes_gpc 0
php_value register_globals 1
php_value session.auto_start 0
php_value mbstring.http_input pass

php_value mbstring.http_output pass
php_value mbstring.encoding_translation 0
php_value memory_limit 32M
php_value post_max_size 16M
php_value upload_max_filesize 8M
</IfModule>

Raise onChange in IE and FF

发现 fireEvent 时,确实兴奋了一把~~,终于找到可以手动触发 onchange 事件的呢~
试了下,老问题,又是 IE 和 FF 不兼容的问题...
还好,找到了解决的方法~~~
FF下,用如下的就可以搞定啦~
[js]
var e = document.createEvent('HTMLEvents');
e.initEvent('change', false, false);
document.form_test.test_text.dispatchEvent(e);
[/js]

测试代码如下:
[html]
<script type="text/javascript">
function justify_browser() {
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;

if (Sys.ie) return 1;
if (Sys.firefox) return 2;
if (Sys.chrome) return 3;
if (Sys.opera) return 4;
if (Sys.safari) return 5;
}


function button_onClick() {
document.form_test.test_text.value=parseInt(document.form_test.test_text.value) + 1;

browser_flag = justify_browser();

if (browser_flag == 1) {
document.form_test.test_text.fireEvent('onchange');
} else if (browser_flag == 2) {
var e = document.createEvent('HTMLEvents');
e.initEvent('change', false, false);
document.form_test.test_text.dispatchEvent(e);
}
}
[/js]
<form name="form_test" action="">
<input type="text" name="test_text"
onchange="alert(document.form_test.test_text.value);" readonly="readonly" value="0" />
<input type="button" onclick="button_onClick();" />
[/html]

JScript 条件编译变量

JScript 可以使用以下语句根据条件编译变量的值控制脚本的编译.既可以使用 JScript 提供的变量, 也可以使用 @set 指令或 /define 命令行选项定义自己的变量.


  • @cc_on 激活条件编译支持.

  • @if 根据表达式的值, 有条件地执行一组语句.

  • @set 创建使用条件编译语句的变量.

  • @cc_on, @if@set 语句激活条件编译.条件编译的一些典型用途包括在 JScript 中使用新功能、将调试支持嵌入到一个脚本中以及跟踪代码执行.



当编写由 Web 浏览器运行的脚本时, 总是将条件编译代码放在注释中.因此, 不支持条件编译的宿主可以忽略该代码.这是一个示例:
[js]
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
document.write("JScript Version 5.0 or better.<BR>");
@else @*/
document.write("You need a more recent script engine.<BR>");
/*@end @*/
[/js]
此示例使用特殊的注释分隔符, 仅当 @cc_on 语句激活条件编译之后才使用这些分隔符.不支持条件编译的脚本引擎显示一则消息, 建议需要使用新的脚本引擎, 而不会产生错误.支持条件编译的引擎根据引擎的版本编译第一个或第二个 document.write.请注意, 7.x 版表示 JScript .NET.有关更多信息, 请参见检测浏览器功能.

条件编译对于服务器端脚本和命令行程序也很有用.在这些应用程序中, 可使用条件编译将其他函数编译到一个程序中, 便于在调试模式下进行分析.
以下预定义变量可用于条件编译.

  • @_win32 如果在 Win32 系统上运行, 并且没有指定 /platform 选项或指定了 /platform:anycpu 选项, 则为 true; 否则为 NaN.

  • @_win16 如果在 Win16 系统上运行, 则为 true; 否则为 NaN.
  • @_mac 如果在 Apple Macintosh 系统上运行, 则为 true; 否则为 NaN.
  • @_alpha 如果在 DEC Alpha 处理器上运行, 则为 true; 否则为 NaN.

  • @_x86 如果在 Intel 处理器上运行, 并且没有指定 /platform 选项或指定了 /platform:anycpu 选项, 则为 true; 否则为 NaN.

  • @_mc680x0 如果在 Motorola 680x0 处理器上运行, 则为 true; 否则为 NaN.

  • @_PowerPC 如果在 Motorola PowerPC 处理器上运行, 则为 true; 否则为 NaN.

  • @_jscript 始终为 true.

  • @_jscript_build JScript 脚本引擎的内部版本号.

  • @_jscript_version 以 major.minor 格式表示 JScript 版本号的数字.

  • @_debug 如果在调试模式下编译则为 true; 否则为 false.

  • @_fast 如果在快速模式下编译则为 true; 否则为 false.



注意, JScript .NET 报告的版本号为 7.x.JScript 8.0 报告的版本号为 8.x.

在使用条件编译变量之前, 必须先打开条件编译.@cc_on 语句可打开条件编译.条件编译变量通常用于针对 Web 浏览器编写的脚本中.在为 ASP 或 ASP.NET 页或命令行程序编写的脚本中很少使用条件编译变量, 这是因为可以使用其他方法确定编译器的兼容性.

当编写用于网页的脚本时, 始终将条件编译代码放在注释中.这样, 不支持条件编译的宿主就可以忽略该代码.这是一个示例.
[js]
/*@cc_on
document.write("JScript version: " + @_jscript_version + ".<BR>");
@if (@_win32)
document.write("Running on 32-bit Windows.<BR>");
@elif (@_win16) document.write("Running on 16-bit Windows.<BR>");
@else document.write("Running on a different platform.<BR>");
@end @*/
[/js]

JS浮点精确运算

[js title="浮点数相加"]
function dcmAdd(arg1,arg2){
var r1, r2, m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2));
return (dcmMul(arg1,m)+dcmMul(arg2,m))/m;
}
[/js]


[js title="浮点数相减"]
function dcmSbt(arg1,arg2){
return dcmAdd(arg1,-arg2);
}
[/js]

[js title="浮点数相乘"]
function dcmMul(arg1,arg2){
var m=0,s1=arg1.toString(),s2=arg2.toString();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}
[/js]

[js title="浮点数除"]
function dcmDiv(arg1,arg2){
return dcmMul(arg1,1/arg2);
}
[/js]

JS 浮点取精度运算

toFixed()方法的修正
[js]
if(typeof(Number.prototype.toFixed)!="function")
{
Number.prototype.toFixed = function(d)
{
var s=this+"";if(!d)d=0;
if(s.indexOf(".")==-1)s+=".";s+=new Array(d+1).join("0");
if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0,"+ (d+1) +"})?)\\d*$").test(s))
{
var s="0"+ RegExp.$2, pm=RegExp.$1, a=RegExp.$3.length, b=true;
if (a==d+2){a=s.match(/\d/g); if (parseInt(a[a.length-1])>4)
{
for(var i=a.length-2; i>=0; i--) {a[i] = parseInt(a[i])+1;
if(a[i]==10){a[i]=0; b=i!=1;} else break;}
}
s=a.join("").replace(new RegExp("(\\d+)(\\d{"+d+"})\\d$"),"$1.$2");
}if(b)s=s.substr(1);return (pm+s).replace(/\.$/, "");} return this+"";
};
}
[/js]

使用:
[js]
var num = 12343.2455;
num = new Number(num);
num.toFixed(2);//取两位小数
[/js]

JS常用正则表达式

匹配中文字符的正则表达式: [u4e00-u9fa5]

匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:< (S*?)[^>]*>.*?|< .*? />
评注:上面这个也仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等


匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字

匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位

匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用


匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

在使用 RegularExpressionValidator 验证控件时的验证功能及其验证表达式介绍如下:
只能输入数字: ^[0-9]*$
只能输入n位的数字: ^d{n}$
只能输入至少n位数字: ^d{n,}$
只能输入m-n位的数字: ^d{m,n}$
只能输入零和非零开头的数字: ^(0|[1-9][0-9]*)$
只能输入有两位小数的正实数: ^[0-9]+(.[0-9]{2})?$
只能输入有1-3位小数的正实数: ^[0-9]+(.[0-9]{1,3})?$
只能输入非零的正整数: ^+?[1-9][0-9]*$
只能输入非零的负整数: ^-[1-9][0-9]*$
只能输入长度为3的字符: ^.{3}$
只能输入由26个英文字母组成的字符串: ^[A-Za-z]+$
只能输入由26个大写英文字母组成的字符串: ^[A-Z]+$
只能输入由26个小写英文字母组成的字符串: ^[a-z]+$
只能输入由数字和26个英文字母组成的字符串: ^[A-Za-z0-9]+$
只能输入由数字、26个英文字母或者下划线组成的字符串: ^w+$
验证用户密码: ^[a-zA-Z]w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,


只能包含字符, 数字和下划线。
验证是否含有 ^%&',;=?$"等字符:[^%&',;=?$x22]+
只能输入汉字:^[u4e00-u9fa5],{0,}$
验证Email地址:^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
验证InternetURL:^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$
验证电话号码:^((d{3,4})|d{3,4}-)?d{7,8}$

验证身份证号(15位或18位数字):^d{15}|d{}18$
验证一年的12个月:^(0?[1-9]|1[0-2])$正确格式为:01-09112
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$


匹配中文字符的正则表达式: [u4e00-u9fa5]
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/< (.*)>.*|< (.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

[js title="计算字符串的长度(一个双字节字符长度计2,ASCII字符计0)"]
String.prototype.len = function( ){
return this.replace([^x00-xff]/g,"aa").length;
}
[/js]

[js title="javascript中没有像vbscript那样的trim函数"]
String.prototype.trim = function() {
return this.replace(/(^s*)|(s*$)/g, "");
}
[/js]

[js title="利用正则表达式分解和转换IP地址"]
//IP地址转换成对应数值
function IP2V(ip) {
re = /(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式
if(re.test(ip)) {
return RegExp . $1 * Math.pow(255,3)) + RegExp . $2*Math.pow(255,2)) + RegExp.$3 * 255 + RegExp . $4 * 1
} else {
throw new Error("Not a valid IP address!")
}
}
[/js]

[js title="从URL地址中提取文件名的javascript程序"]
s = "http://www.livingelsewhere.net/page1.htm";
s = s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ; //Page1.htm
[/js]


利用正则表达式限制网页表单里的文本框输入内容
用正则表达式限制只能输入中文:
onkeyup="value=/blog/value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
用正则表达式限制只能输入全角字符:
onkeyup="value=/blog/value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
用正则表达式限制只能输入数字:
onkeyup="value=/blog/value.replace(/["^d]/g,'')" onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
用正则表达式限制只能输入数字和英文:
onkeyup="value=/blog/value.replace(/[W]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g, ''))"

jQuery 操作下拉列表框

[html]
<select name="select1" id="select1" size="10">
<option value="1">Option1</option>
<option valeu="2">Option2</option>
<option value="3">Option3</option>
<option value="4">Option4</option>
</select>
[/html]

1 取得 jQuery 对象


[js]
obj = $('#select1');
[/js]

2 取得Options 的长度


[js]
len = $('#select1 option').length
[/js]

3 遍历 option


[js]
for (var i = 0; i < len; i++) {
option_value = obj[0].options[i].value;
option_text = obj[0].options[i].text;
}
[/js]

4 取得所选值


[js]
obj_value = $('#select1').val();
[/js]

5 取得所选值对应的text


[js]
obj_text = obj[0].options[obj[0].selectedIndex].text;
[/js]

6 添加一个option


[js]
obj.append('<option value="5">Option5</option>');
[/js]

7 删除一个option


[js]
$('#select1 option[value="1"]').remove();
[/js]

jQuery获取textarea, text, radio, checkbox, select值

FROM: JQUERY获取text,areatext,radio,checkbox,select值

获取值



  • 文本框, 文本区域 $("#txt").attr("value");

  • 多选框 checkbox $("#checkbox_id").attr("value");

  • 单选组 radio $("input[@type=radio][@checked]").val();

  • 下拉框 select $('#sel').val();

  • 获取一组 radio 被选中项的值 var item = $('input[@name=items][@checked]').val();

  • radio 单选组的第二个元素为当前选中值 $('input[@name=items]').get(1).checked = true;

  • 获取 select 被选中项的文本 var item = $("select[@name=items] option[@selected]").text();

  • select下拉框的第二个元素为当前选中值 $('#select_id')[0].selectedIndex = 1;



控制表单元素


文本框, 文本区域
[js]
$("#txt").attr("value",''); //清空内容
$("#txt").attr("value",'11'); //填充内容
[/js]

多选框 checkbox
[js]
$("#chk1").attr("checked",''); //不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
[/js]

单选组 radio
[js]
//设置value=2的项目为当前选中项
$("input[@type=radio]").attr("checked", '2');
[/js]

下拉框 select

[js]
$("#sel").attr("value",'-sel3'); //设置 value=-sel3 的项目为当前选中项
$("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel") //添加下拉框的 option
$("#sel").empty();//清空下拉框
[/js]

A 遍历 option 和添加, 移除option
[js]
function changeShipMethod(shipping) {
var len = $("select[@name=ISHIPTYPE] option").length
if(shipping.value != "CA") {
$("select[@name=ISHIPTYPE] option").each(function() {
if($(this).val() == 111) {
$(this).remove();
}
});
} else {
$("<option value='111'>UPS Ground</option>").appendTo($("select[@name=ISHIPTYPE]"));
}
}
[/js]

B 取得下拉选项的值
[js]
$(#testSelect option:selected').text();
//or
$("#testSelect").find('option:selected').text();
//or
$("#testSelect").val();
[/js]


补充部分


下拉框

[js]
var cc1 = $(".formc select[@name='country'] option[@selected]").text(); //得到下拉菜单的选中项的文本(注意中间有空格)
var cc2 = $('.formc select[@name="country"]').val(); //得到下拉菜单的选中项的值
var cc3 = $('.formc select[@name="country"]').attr("id"); //得到下拉菜单的选中项的ID属性值
$("#select").empty(); //清空下拉框//$("#select").html('');
$("<option value='1'>1111</option>").appendTo("#select")//添加下拉框的option
[/js]

解释: select[@name='country'] option[@selected] 表示具有 name 属性, 并且该属性值为 country 的 select 元素里面的具有 selected 属性的 option 元素; @ 开头的就表示后面跟的是属性.

单选框

[js]
$("input[@type=radio][@checked]").val(); //得到单选框的选中项的值(注意中间没有空格)
$("input[@type=radio][@value=2]").attr("checked",'checked'); //设置单选框value=2的为选中状态.(注意中间没有空格)
[/js]

复选框

[js]
$("input[@type=checkbox][@checked]").val(); //得到复选框的选中的第一项的值
$("input[@type=checkbox][@checked]").each(function(){ //由于复选框一般选中的是多个,所以可以循环输出
alert($(this).val());
});


$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾
[/js]

很郁闷, 用 jQuery 选择勾选上的复选框, 竟然在FF3.5下跑不了~
以前有问题也只是IE
在FF下, 还真是第一次碰到~
查了下资料~
真是我写法有问题, 汗~

100多个很有用的JavaScript函数以及基础写法大集合

FROM: 100多个很有用的JavaScript函数以及基础写法大集合


  • 输出空语句 document.write("");

  • 得到表单中元素的名称和值 document.getElementById("表单中元素的ID号").name(或value);

  • 注释为 //

  • 传统的HTML文档顺序是 document > html > (head,body)

  • 一个浏览器窗口中的DOM顺序是 window > (navigator,screen,history,location,document)

  • 值类型 String, Number, Boolean, Null, Object, Function

  • 数字转换成字符型 "" + 变量

  • 比较操作符有 ==等于, !=不等于, >, >=, <, <=

  • 声明变量使用 var来进行声明

  • 判断语句结构 if(condition){}else{}

  • 循环结构 for([initial expression];[condition];[upadte expression]) {inside loop}

  • 循环中止的命令是 break

  • 函数定义 function functionName([parameter],...){statement[s]}

  • 关闭文档的输出流 document.close();

  • 创建一个文档元素 document.createElement(), document.createTextNode()

  • 得到元素的方法 document.getElementById()

  • 复选按钮在JS中判断是否选中 document.forms[0].checkThis.checked (checked属性代表为是否选中返回TRUE或FALSE)

  • 单选按钮组(单选按钮的名称必须相同), 取单选按钮组的长度 document.forms[0].groupName.length

  • 单选按钮组判断是否被选中也是用 checked

  • 下拉列表框的值 document.forms[0].selectName.options[n].value (n有时用下拉列表框名称加上, selectedIndex来确定被选中的值)

  • 表示当前所属的位置 this

  • 当在超链接中调用 JS 函数时用 javascript 来开头后面加函数名

  • 在老的浏览器中不执行此JS<!-- //-->

  • 引用一个文件式的JS <script type="text/javascript" src="test.js"></script>

  • 指定在不支持脚本的浏览器显示的HTML <noscript></noscript>

  • 当超链和 ONCLICK 事件都有时, 则老版本的浏览器转向 a.html, 否则转向 b.html. <a href="a.html" onclick="location.href='b.html';return false">test</a>

  • JS的内建对象有 Array, Boolean, Date, Error, EvalError, Function, Math, Number, Object, RangeError, ReferenceError, RegExp, String, SyntaxError, TypeError, URIError

  • 换行 \n

  • all 代表其下层的全部元素

  • 焦点顺序 document.getElementByid("表单元素").tabIndex = 1

  • innerHTML 取得的值是表单元素的值

  • innerTEXT 取得的值和上面的一样,只不过不会把 <em> 这种标记显示出来

  • contentEditable 可设置元素是否可被修改, isContentEditable返回是否可修改的状态

  • isDisabled 判断是否为禁止状态, disabled设置禁止状态

  • addBehavior() JS调用的外部函数文件,其扩展名为.htc

  • window.focus() 使当前的窗口在所有窗口之前

  • blur()指失去焦点, 与focus()相反

  • select() 指元素为选中状态

  • 防止用户对文本框中输入文本 onfocus="this.blur()"

  • 取出该元素在页面中出现的数量 document.all.tags("div(或其它HTML标记符)").length

  • 添加到收藏夹 external.AddFavorite("http://www.google.com","Google");

  • 设置时间间隔 setInterval("expr", msecDelay)或setInterval(funcRef, msecDelay)或setTimeout

  • 模态显示在IE4+行, showModalDialog("URL"[,arguments][,features]);


  • document.write() 不换行的输出, document.writeln() 换行输出

  • document.body.noWrap=true; 防止链接文字折行

  • parseInt(string[,radix(代表进制)]) 强制转换成整型

  • parseFloat(string[,radix]) 强制转换成浮点型

  • isNaN(变量) 测试是否为数值型

  • 定义常量的关键字 const

  • 当文件中出现多个 form 表单时.可以用 document.forms[0], document.forms[1]来代替




数学函数



  • Math.PI() 返回圆周率

  • Math.SQRT2() 返回开方

  • Math.max(value1, value2) 返回两个数中的最大值

  • Math.pow(value1, 10) 返回value1的十次方

  • Math.round(value1) 四舍五入函数

  • Math.floor(Math.random()*(n + 1)) 返回随机数





日期函数列表



  • var today = new Date(); 定义日期型变量

  • dateObj.getTime() 得到时间

  • dateObj.getYear() 得到年份

  • dateObj.getFullYear() 得到四位的年份

  • dateObj.getMonth() 得到月份
  • ,
  • dateObj.getDate() 得到日

  • dateObj.getDay() 得到日期几

  • dateObj.getHours() 得到小时

  • dateObj.getMinutes() 得到分

  • dateObj.getSeconds() 得到秒

  • dateObj.setTime(value) 设置时间

  • dateObj.setYear(value) 设置年

  • dateObj.setMonth(value) 设置月

  • dateObj.setDate(value) 设置日

  • dateObj.setDay(value) 设置星期几

  • dateObj.setHours 设置小时

  • dateObj.setMinutes(value) 设置分

  • dateObj.setSeconds(value) 设置秒(注意 此日期时间从0开始计)



窗口 window



  • 遇到脚本错误时不做任何操作 window.onerror = doNothing;, 指定错误句柄的语法为 window.onerror = handleError;

  • 分为两种窗体输出 模态和非模态 window.showModaldialog(), window.showModeless()

  • 状态栏文字的设置 window.status='文字', 默认的状态栏文字设置 window.defaultStatus = '文字.';

  • FRAME的表示方式 [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName

  • parent 代表父亲对象, top代表最顶端对象

  • JS中指定当前打开窗口的父窗口 window.opener, 支持opener.opener...的多重继续

  • 打开窗口window.open()

  • 关闭一个窗口 window.close()

  • 窗口本身 self

  • 弹出提示信息 window.alert("字符")

  • 弹出确认框 window.confirm();

  • 提示输入框 window.prompt("message","defaultReply");

  • 关闭当前的窗口 window.close();

  • 窗口重定向 window.navigate("http://www.google.com");

  • 打印 window.print()

  • 窗口滚动条 window.scroll(x,y)

  • 窗口滚动到位置 window.scrollby

  • 指定当前显示链接的位置 window.location.href="URL"

  • 取出窗体中的所有表单的数量 document.forms.length

  • 当窗体第一次调用时使用的文件句柄 onload()

  • 当窗体关闭时调用的文件句柄 onunload()

  • window.location.reload() 刷新当前页面

  • parent.location.reload() 刷新父亲对象(用于框架)

  • opener.location.reload() 刷新父窗口对象(用于单开窗口)

  • top.location.reload() 刷新最顶端对象(用于多开窗口)

  • window.history.back() 返回上一页

  • window.history.forward() 返回下一页

  • window.history.go(n|history-url) 返回第 n 页, 也可以使用访问过的URL




字符串



  • var myString = new String("This is lightsword"); 字符串的定义

  • string1.indexOf("string2") != -1 返回字符串2在字符串1中出现的位置, -1 则说明没找到

  • stringA.substring(2, 6); 取出字符串中指定起点和终点的子字符串

  • string.charAt(n) 取该变量的第 n 位的字符

  • string.charCodeAt( n ) 返回第 n 个字符的ASCII码值

  • string.concat(string2) 字符串连接, 或用+=进行连接

  • string.indexOf(searchString, startIndex) 返回第一个出现的位置(从0开始计算)

  • string.lastIndexOf(searchString[, startIndex]) 最后一次出现的位置

  • string.match(regExpression) 判断字符是否匹配

  • string.replace(regExpression, replaceString) 替换现有字符串

  • string.split(separator) 返回一个数组存储值

  • string.substr(start[,length]) 取从第几位到指定长度的字符串

  • string.toLowerCase() 使字符串全部变为小写

  • string.toUpperCase() 使全部字符变为大写

  • string.length 取字符串长度



window.location 属性



  • protocol() http

  • hostname www.google.com

  • port 80

  • host www.google.com 80

  • pathname /index.html

  • hash #test 指跳转到相应的锚记

  • href 全部信息http://www.google.com./index.html



设置表单中所有文本型的成员的值为空
[js]
var form = window.document.forms[0]
for (var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type == "text"){
form.elements[i].value = "";
}
}
[/js]

窗口全屏大小
[js]
function fullScreen( ) {
this.moveTo(0,0);
this.outerWidth = screen.availWidth;
this.outerHeight = screen.availHeight;
}
window.maximize=fullScreen;
[/js]

退出之前使用的句柄
[js]
function verifyClose(){
event.returnValue="we really like you and hope you will stay longer.";
}
window.onbeforeunload = verifyClose;
[/js]

光标定位到文本框最后

文本框得到焦点时
若文本框中已有内容
在IE中
则会定位到文本框的第一个字符的位置
这就有点不方便了~
如下函数可以定位到最后
但在FF中是不需要用到这个的~
而且FF中没有 createTextRange()这个方法
所以
若要通用的话
则先需要判断浏览器了~

[js]
function getSelectPos(obj) {
var esrc = document.getElementById(obj);
if (esrc==null){
esrc=event.srcElement;
}
var rtextRange =esrc.createTextRange();
rtextRange.moveStart('character',esrc.value.length);
rtextRange.collapse(true);
rtextRange.select();
}
[/js]

Freebsd下用源代码安装DHCP服务

FROM: http://sunnypan.blog.edu.cn/user2/sunnypan/archives/2007/1725570.shtml
代码下载
isc-dhcp下载地址

编译安装
假设下载后的源代码放进/tmp目录
[bash]
cd /tmp
tar -zxvf dhcp-3.0.1.tar.gz
cd /dhcp-3.0.1
./configure
make
make install
[/bash]

配置
建立dhcpd.conf配置文件
[bash]
vi /etc/dhcpd.conf
[/bash]

文件内容如下(参照源码说明配置,个别参数作用不详)
[bash]
option domain-name "gettyying.gguo.com"; #dhcpd服务器名称
option domain-name-servers 202.96.128.143, 202.96.128.68; #DNS服务器地址
default-lease-time 28800;
max-lease-time 57600;
authoritative;

#重要,没有这一行不能启动dhcpd。
ddns-update-style none;
log-facility local7;

#分配ip、掩码、DNS服务器等信息

subnet 192.168.0.0 netmask 255.255.255.0 { #指定ip段
range 192.168.0.160 192.168.0.200; #ip地址分配范围
default-lease-time 28800; #默认ip地址租用时间,单位秒
max-lease-time 57600; #最大ip地址租用时间
option subnet-mask 255.255.255.0; #子网掩码
option broadcast-address 192.168.0.255; #广播地址
option routers 192.168.0.1; #网关地址
option domain-name-servers 202.96.128.143; #DNS服务器地址
}
[/bash]

启动DHCP服务

启动DHCP服务之前要创建dhcpd.leases空文件
[bash]
touch /var/lib/dhcp/dhcpd.leases
[/bash]
创建开机启动文件
[bash]
vi /usr/local/etc/rc.d/dhcpd.sh
[/bash]
内容如下:
[bash]
/usr/sbin/dhcpd fxp1 #fxp1为提供dhcp服务的网卡
chmod 777 /usr/local/etc/rc.d/dhcpd.sh #更改dhcpd.sh文件属性为可执行文件
[/bash]
至此DHCP服务安装完毕,服务器启动会自动运行dhcp,若要马上启动输入下面的命令
[bash]
/usr/local/etc/rc.d/dhcpd.sh
[/bash]
连接局域网的电脑可自动获取ip地址

CVSup

使用CVSup手册:
http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/cvsup.html#HANDBOOK-MIRRORS-CHAPTER-SGML-MIRRORS-CN-CVSUP

CVSup站点:
中央服务器
[text]
cvsup.FreeBSD.org
[/text]


中国大陆
[text]
cvsup.cn.FreeBSD.org
cvsup2.cn.FreeBSD.org
cvsup3.cn.FreeBSD.org
cvsup4.cn.FreeBSD.org
cvsup5.cn.FreeBSD.org
[/text]

FreeBSD ssh and bash

1 ssh安装配置
SSH服务在系统启动时就自行运行
[bash]
root@gguo:#vi /etc/rc.conf
[/bash]
添加如下或是修改:
[text]
sshd_enalbe="yes"
sshd_program="/usr/sbin/sshd"
sshd_flag=""
ifconfig_lnc0="dhcp"
[/text]

修改SSH配置
[bash]
root@gguo:#vi /etc/ssh/sshd_config
[/bash]

修改Permit RootLogin,使root用户可以远程访问
[text]
#Permit RootLogin no
Permit RootLogin yes
[/text]

启动SSH服务
[bash]
root@gguo:#/etc/rc.d/sshd start
[/bash]

查看是否启功了22号端口
[bash]
root@gguo:#netstat -aln | grep 22
[/bash]
SSH 服务默认端口是22,若在SSH的配置文件中已修改端口,则查看对应端口就OK

2 将shell改为bash
[bash]
root@gguo:#chsh -s /usr/local/bin/bash
[/bash]

FreeBSD6.0 下ports apache2+mysql5+php5

A 装apache2
[bash]
cd/usr/ports/www/apache2
make install clean
[/bash]
/usr/local/etc/apache2下找到apache2的配置文件httpd.conf,将ServerName前的#去掉,

改为:ServerName:freebsd 的IP地址:80

同时,将该freebsd的 hostname 改为该freebsd的IP地址
[bash]
/usr/local/sbin/httpd -k start
netstat -aln | grep 80
[/bash]
若有看到80端口处于listening状态,则安装成功

B 装mysql
[bash]
cd /usr/ports/databases/mysql50-server
make install clean
[/bash]

初始化数据库
[bash]
cd /usr/local/bin
mysql_install/db
[/bash]

增加用户mysql和用户组mysql
[bash]
pw group add mysql
pw user add mysql -g mysql
[/bash]

将存放数据库文件的mysql受权给用户mysql,用户组为mysql,假设数据文件在 /var/db/mysql 目录
[bash]
cd /var/db
chown -R mysql /var/db/mysql
chgrp -R mysql /var/db/mysql
[/bash]

修改mysql的密码
[bash]
cd /usr/local/bin
mysqladmin -u root -p password '新密码'
[/bash]

启动mysql
1)
[bash]
cd /usr/local/bin
mysqld_safe
[/bash]

2)
[bash]cd /usr/local/share/mysql
./mysql.server start/stop/restart
[/bash]

3)
[bash]
cd /usr/local/libexec
mysqld
[/bash]

C 安装PHP5
[bash]
cd /usr/ports/lang/php5
make install clean
[/bash]

D 用php的内置函数访问mysql,需装php5-mysql
[bash]
cd /usr/ports/databases/php5-mysql
make install clean
[/bash]

No input file specified

检测方法如下:
1. 如果html也出现404错误,那么就是document root 设置的有问题
2. 检查脚本文件的权限, 可能PHP或者web server不能读取它
3. SCRIPT_FILENAME设置错误

用nginx做WEB服务器时,经常出现的是SCRIPT_FILENAME设置错误
在windows和freebsd下配置时
我就都出现了,汗~
其他的不太清楚
就我实践的来看
SCRIPT_FILENAME 这个是要指定为绝对路径的~

[bash]
root=/usr/data/www
[/bash]

[bash]
fastcgi_param SCRIPT_FILENAME /usr/data/www$fastcgi_script_name;
[/bash]

另外
PHP 配置文件中

[bash]
cgi.fix_pathinfo=1
[/bash]

Nginx 介绍

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

  因为 Nginx 的文档大部分是俄文的,Nginx 的中文维基的目的是帮助使用中文世界的用户安装、配置和交换有关 Nginx 的使用经验。大部分文档源自Aleksandar Lazic 的工作。有关本维基本身的问题请直接询问Cliff Wells

  Nginx 可以在大多数 Unix like OS 上编译运行,并有 Windows 移植版。目前 Nginx 的开发版为 0.7.x,稳定版为 0.6.x,历史稳定版为 0.5.x,建议使用 0.6 系列作为生产版本。 Nginx 的源代码使用 2-clause BSD-like license。

  Nginx 的中文维基:http://wiki.codemongers.com/NginxChs

Nginx 的中文站: http://www.nginx.cn

  为什么选择Nginx ?
Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响 应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的 CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上 是毫无用处的。就稳定性而言,nginx比lighthttpd更胜一筹。

Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。

Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。

Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。

Nginx代码质量非常高,代码很规范,手法成熟,模块扩展也很容易。特别值得一提的是强大的Upstream与Filter链。 Upstream为诸如reverse proxy,与其他服务器通信模块的编写奠定了很好的基础。而Filter链最酷的部分就是各个filter不必等待前一个filter执行完毕。它可以 把前一个filter的输出做为当前filter的输入,这有点像Unix的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在 模块接收完后端服务器的整个请求之前把压缩流转向客户端。

Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能。

Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务(Nginx并不支持cgi方式运行,原因是可以减少因此带来的一些程序上的漏洞。所以必须使用FastCGI方式来执行PHP程序), 也可以支持作为 HTTP代理服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.

Nginx概述

HTTP基础功能:

  处理静态文件,索引文件以及自动索引;

  反向代理加速(无缓存),简单的负载均衡和容错;

  FastCGI,简单的负载均衡和容错;

  模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;

  SSL 和 TLS SNI 支持;

  IMAP/POP3 代理服务功能:

  使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;

  使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;

  认证方法:

  POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;

  IMAP: IMAP LOGIN;

  SMTP: AUTH LOGIN PLAIN CRAM-MD5;

  SSL 支持;

  在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

  支持的操作系统:

  FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;

  Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;

  Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;

  MacOS X (10.4) PPC;

  结构与扩展:

  一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;

  kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;

  kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;

  sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;

  输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;

  10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。

  最小化的数据拷贝操作;

  其他HTTP功能:

  基于IP 和名称的虚拟主机服务;

  Memcached 的 GET 接口;

  支持 keep-alive 和管道连接;

  灵活简单的配置;

  重新配置和在线升级而无须中断客户的工作进程;

  可定制的访问日志,日志写入缓存,以及快捷的日志回卷;

  4xx-5xx 错误代码重定向;

  基于 PCRE 的 rewrite 重写模块;

  基于客户端 IP 地址和 HTTP 基本认证的访问控制;

  PUT, DELETE, 和 MKCOL 方法;

  支持 FLV (Flash 视频);

  带宽限制;

  实验特性:

  内嵌的 perl

  通过 aio_read()/aio_write() 的套接字工作的实验模块,仅在 FreeBSD 下。

  对线程的实验化支持,FreeBSD 4.x 的实现基于 rfork()

  Nginx 主要的英语站点是 http://sysoev.ru/en/

  英语文档草稿由 Aleksandar Lazic 完成 点击。

  ==常见问题(FAQ)==

  某些不工作 (URL重写, 代理, 路径, ...)

  例如: 如URL重写(rewrite)不工作了或者是unix的路径(/$PATH)的问题云云...

  请仔细阅读 [NginxDebugging] 并且逐行看错误日志。

  如果你没找到错误 打起精神 试着到IRC或邮件列表里说明一下你碰到的问题。

  有没有其它类似的Web服务器

  Cherokee

  Lighttpd (Lighty)

  thttpd

  关于各自的优缺点请使用自己喜欢的搜索引挚查找

  对于chroot的支持是否在计划之中?

  有人知道吗?

  在什么情况下使用Nginx比使用squid要好? 反之亦然。

  大体上来说nginx主要用于反向加速代理而不是像squid那样做为常规代理服务器。Nginx的最大优势在于高负载情况下内存和CPU的低消耗。 我不认为squid能给你带来比nginx更好的性能。

  有没有人能给出一个完整的.conf配置文件来详细的解读一下怎么配置和测试 IMAP 模块, 而不只是关于 IMAP 的只言片语啊?

  依照 [NginxImapProxyExample] 开始你的配置. 关于不同配置参数的具体信息, 请查看 [NginxMailCoreModule] 页。

  示例1: 用运行于apache上的php脚本做后端验证

  示例2: 使用运行于同一个服务器的 nginx-embedded-perl 模块作为 imap/pop代理和认证后端

  怎么让Nginx成为以postfix做为后端的SMTP代理?

  有人知道不?

  Nginx使用什么算法来实现负载均衡? 它能实现基于连接数的负载均衡吗?

  目前Nginx使用简单的轮巡算法,所以无法做基本链接计数的负载均衡。这个可能会在将来的版本中有所改变。

  我能关闭从代理服务器到后端服务器的缓存吗或者使用上传进度特性?

  基于 太多人询问下面的问题:

  我能为了得到上传进度而关闭代理的缓存吗

  使用nginx我怎么才能给用户显示上传进度

  ...
  到目前为止 (2007-Apr-26) 还没有办法关闭到后端服务器的缓存

安装Nginx

  模块依赖性

  gzip 模块需要 zlib 库

  rewrite 模块需要 pcre 库

  ssl 功能需要 openssl 库

  预先编译好的安装包

  Nginx在一些Linux发行版和BSD的各个变种版本的安装包仓库中都会有,通过各个系统自带的软件包管理方法即可安装。需要注意的是,很多预先编译好的安装包都比较陈旧,大多数情况下还是推荐直接从源码编译。

  官方源代码下载

  点击下载源代码

  特定平台的安装和记录

  Nginx 在 Slackware 上的编译安装脚本

  Nginx 在ubuntu和debian上的安装及脚本, debian针对nginx包的官方下载站点

  使用源代码进行构建

  Nginx 使用 Unix 下常用的 './configure && make && make install' 过程来编译安装。

  configure 脚本确定系统所具有一些特性,特别是 nginx 用来处理连接的方法。然后,它创建 Makefile 文件。


  configure 支持下面的选项:

  --prefix= - Nginx安装路径。如果没有指定,默认为 /usr/local/nginx。

  --sbin-path= - Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为/sbin/nginx。

  --conf-path= - 在没有给定-c选项下默认的nginx.conf的路径。如果没有指定,默认为/conf/nginx.conf。

  --pid-path= - 在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为 /logs/nginx.pid。

  --lock-path= - nginx.lock文件的路径。

  --error-log-path= - 在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为 /logs/error.log。

  --http-log-path= - 在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为 /logs/access.log。

  --user= - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。

  --group= - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。

  --builddir=DIR - 指定编译的目录

  --with-rtsig_module - 启用 rtsig 模块

  --with-select_module --without-select_module - Whether or not to enable the select module. This module is enabled by default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure.

  //允许或不允许开启SELECT模式,如果 configure 没有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+), rtsig(实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法) SELECT模式将是默认安装模式

  --with-poll_module --without-poll_module - Whether or not to enable the poll module. This module is enabled by default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure.

  --with-http_ssl_module - Enable ngx_http_ssl_module. Enables SSL support and the ability to handle HTTPS requests. Requires OpenSSL. On Debian, this is libssl-dev.

  //开启HTTP SSL模块,使NGINX可以支持HTTPS请求。这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl

  --with-http_realip_module - 启用 ngx_http_realip_module

  --with-http_addition_module - 启用 ngx_http_addition_module

  --with-http_sub_module - 启用 ngx_http_sub_module

  --with-http_dav_module - 启用 ngx_http_dav_module

  --with-http_flv_module - 启用 ngx_http_flv_module

  --with-http_stub_status_module - 启用 "server status" 页

  --without-http_charset_module - 禁用 ngx_http_charset_module

  --without-http_gzip_module - 禁用 ngx_http_gzip_module. 如果启用,需要 zlib 。

  --without-http_ssi_module - 禁用 ngx_http_ssi_module

  --without-http_userid_module - 禁用 ngx_http_userid_module

  --without-http_access_module - 禁用 ngx_http_access_module

  --without-http_auth_basic_module - 禁用 ngx_http_auth_basic_module

  --without-http_autoindex_module - 禁用 ngx_http_autoindex_module

  --without-http_geo_module - 禁用 ngx_http_geo_module

  --without-http_map_module - 禁用 ngx_http_map_module

  --without-http_referer_module - 禁用 ngx_http_referer_module

  --without-http_rewrite_module - 禁用 ngx_http_rewrite_module. 如果启用需要 PCRE 。

  --without-http_proxy_module - 禁用 ngx_http_proxy_module

  --without-http_fastcgi_module - 禁用 ngx_http_fastcgi_module

  --without-http_memcached_module - 禁用 ngx_http_memcached_module

  --without-http_limit_zone_module - 禁用 ngx_http_limit_zone_module

  --without-http_empty_gif_module - 禁用 ngx_http_empty_gif_module

  --without-http_browser_module - 禁用 ngx_http_browser_module

  --without-http_upstream_ip_hash_module - 禁用 ngx_http_upstream_ip_hash_module

  --with-http_perl_module - 启用 ngx_http_perl_module

  --with-perl_modules_path=PATH - 指定 perl 模块的路径

  --with-perl=PATH - 指定 perl 执行文件的路径

  --http-log-path=PATH - Set path to the http access log

  --http-client-body-temp-path=PATH - Set path to the http client request body temporary files

  --http-proxy-temp-path=PATH - Set path to the http proxy temporary files

  --http-fastcgi-temp-path=PATH - Set path to the http fastcgi temporary files

  --without-http - 禁用 HTTP server

  --with-mail - 启用 IMAP4/POP3/SMTP 代理模块

  --with-mail_ssl_module - 启用 ngx_mail_ssl_module

  --with-cc=PATH - 指定 C 编译器的路径

  --with-cpp=PATH - 指定 C 预处理器的路径

  --with-cc-opt=OPTIONS - Additional parameters which will be added to the variable CFLAGS. With the use of the system library PCRE in FreeBSD, it is necessary to indicate --with-cc-opt="-I /usr/local/include". If we are using select() and it is necessary to increase the number of file descriptors, then this also can be assigned here: --with-cc-opt="-D FD_SETSIZE=2048".

  --with-ld-opt=OPTIONS - Additional parameters passed to the linker. With the use of the system library PCRE in FreeBSD, it is necessary to indicate --with-ld-opt="-L /usr/local/lib".

  --with-cpu-opt=CPU - 为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

  --without-pcre - 禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 "location" 配置指令中的正则表达式也需要 PCRE 。
 --with-pcre=DIR - 指定 PCRE 库的源代码的路径。

  --with-pcre-opt=OPTIONS - Set additional options for PCRE building.

  --with-md5=DIR - Set path to md5 library sources.

  --with-md5-opt=OPTIONS - Set additional options for md5 building.

  --with-md5-asm - Use md5 assembler sources.

  --with-sha1=DIR - Set path to sha1 library sources.

  --with-sha1-opt=OPTIONS - Set additional options for sha1 building.

  --with-sha1-asm - Use sha1 assembler sources.

  --with-zlib=DIR - Set path to zlib library sources.

  --with-zlib-opt=OPTIONS - Set additional options for zlib building.

  --with-zlib-asm=CPU - Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro

  --with-openssl=DIR - Set path to OpenSSL library sources

  --with-openssl-opt=OPTIONS - Set additional options for OpenSSL building

  --with-debug - 启用调试日志

  --add-module=PATH - Add in a third-party module found in directory PATH

  在不同版本间,选项可能会有些许变化,请总是使用 ./configure --help 命令来检查一下当前的选项列表。

  示例 (最好能在同一行):

  ./configure \

  --sbin-path=/usr/local/nginx/nginx \

  --conf-path=/usr/local/nginx/nginx.conf \

  --pid-path=/usr/local/nginx/nginx.pid \

  --with-http_ssl_module \

  --with-pcre=../pcre-4.4 \

  --with-zlib=../zlib-1.1.3

  Example on Ubuntu/debian with libgcrypt11-dev, libpcre3-dev and libssl-dev installed (choose EITHER --with-md5 OR --with-sha1, but not both; on debian and ubuntu, they should both point to /usr/lib)

  ./configure --with-openssl=/usr/lib/ssl/ --with-md5=/usr/lib

  An Ubuntu Edgy .deb for version 0.5.2 can be found here: nginx_0.5.2-1_i386.deb.

  (NOTE: According to an October 2006 message md5 was used in a now broken http cache module and sha1 is used in an incomplete mysql library module and so are currently not needed.)

MYSQL 1067 错误总结

安装WNMP,用的是MYSQL免安装版的,参照手册一步步下来,得到的却是1067错误,谷歌了下,有很多,也试了很多,但都未成功,到最后,功夫不负苦心人,终于成功启动 :D

趁此机会,整理一下:

1. 修改my.ini
[bash]
[mysqld]
#设置basedir指向mysql的安装路径
basedir=c:/mysql
datadir=c:/mysql/data
[/bash]

2. net start mysql 时启动失败
运行如下命令:
[sql]
mysqladmin-u root -p shutdown
net start mysql
[/sql]

3. 检查Mysql目录有没有给系统的System用户权限。

4.删除其余的my.ini 文件。

5.检查c:/my.cnf 文件配置是否正确



6.
[bash]
[Client]
user=root
password=xxxxxxxx
[/bash]


7. 在C:\windows里找my.ini,删除,再启动winmysqladmin.exe界面,重新配置mysql,保存my.ini就可以,重新启动mysql

8.查MYSQL日志,禁用INNODB如下:
[sql]
[mysqld]
skip-innodb
[/sql]

MySQL 的几个实用字符串函数

CONCAT() 连接一个或者多个字符串
[sql]
mysql> SELECT CONCAT('a');
+-------------+
| CONCAT('a') |
+-------------+
| a |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT('a', 'b', 'c');
+-----------------------+
| CONCAT('a', 'b', 'c') |
+-----------------------+
| abc |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT a, b, CONCAT(a, b) AS c FROM tbl_1;
+---+------+------+
| a | b | c |
+---+------+------+
| 1 | a | 1a |
| 2 | b | 2b |
| 3 | c | 3c |
| 4 | d | 4d |
+---+------+------+
4 rows in set (0.00 sec)
[/sql]

注: Oracle的 CONCAT() 只能连接两个字符串,MySQL的 CONCAT() 在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
[sql]
mysql> SELECT a, b, c, CONCAT(a, b, c) AS d FROM tbl_2;
+---+------+------+------+
| a | b | c | d |
+---+------+------+------+
| 1 | a | a | 1aa |
| 2 | | a | 2a |
| 3 | | b | 3b |
| 4 | c | c | 4cc |
| 5 | NULL | d | NULL |
+---+------+------+------+
5 rows in set (0.00 sec)
[/sql]

但Oracle的 CONCAT() 连接的时候,只要有一个字符串不是NULL,就不会返回NULL


CONCAT_WS() 表示有分隔符的字符串连接
[sql]
mysql> SELECT CONCAT_WS('-', 'a', 'b', 'c');
+-------------------------------+
| CONCAT_WS('-', 'a', 'b', 'c') |
+-------------------------------+
| a-b-c |
+-------------------------------+
1 row in set (0.00 sec)
[/sql]

和 CONCAT() 不同的是, CONCAT_WS() 函数在执行的时候, 不会因为NULL值而返回NULL
[sql]
mysql> SELECT CONCAT_WS('-', 'a', 'b', 'c', NULL);
+-------------------------------------+
| CONCAT_WS('-', 'a', 'b', 'c', NULL) |
+-------------------------------------+
| a-b-c |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT a, b, c, CONCAT_WS('-', a, b, c) AS d FROM tbl_2;
+---+------+------+-------+
| a | b | c | d |
+---+------+------+-------+
| 1 | a | a | 1-a-a |
| 2 | | a | 2--a |
| 3 | | b | 3--b |
| 4 | c | c | 4-c-c |
| 5 | NULL | d | 5-d |
+---+------+------+-------+
5 rows in set (0.00 sec)
[/sql]


GROUP_CONCAT() 可用来行转列
GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

[sql]
mysql> SELECT * FROM tbl_2;
+----+------+------+
| a | b | c |
+----+------+------+
| 15 | 2 | c |
| 14 | 2 | a |
| 13 | 1 | c |
| 12 | 1 | b |
| 11 | 1 | a |
+----+------+------+
5 rows in set (0.00 sec)
[/sql]

以 b 分组,把 c 字段的值打印在一行,逗号分隔(默认)
[sql]
mysql> SELECT b, GROUP_CONCAT(c) FROM tbl_2 GROUP BY b;
+------+-----------------+
| b | GROUP_CONCAT(c) |
+------+-----------------+
| 1 | c,b,a |
| 2 | c,a |
+------+-----------------+
2 rows in set (0.00 sec)
[/sql]

以 b 分组,把 c 字段的值打印在一行,分号分隔
[sql]
mysql> SELECT b, GROUP_CONCAT(c SEPARATOR ';') FROM tbl_2 GROUP BY b;
+------+-------------------------------+
| b | GROUP_CONCAT(c SEPARATOR ';') |
+------+-------------------------------+
| 1 | c;b;a |
| 2 | c;a |
+------+-------------------------------+
2 rows in set (0.00 sec)
[/sql]

以 b 分组,把去冗余的 c 字段的值打印在一行,逗号分隔
[sql]
mysql> SELECT b, GROUP_CONCAT(DISTINCT c SEPARATOR ';') FROM tbl_2 GROUP BY b;
+------+----------------------------------------+
| b | GROUP_CONCAT(DISTINCT c SEPARATOR ';') |
+------+----------------------------------------+
| 1 | a;b;c |
| 2 | a;c |
+------+----------------------------------------+
2 rows in set (0.00 sec)
[/sql]

以 b 分组,把 c 字段的值打印在一行,逗号分隔, 以 c 排倒序
[sql]
mysql> SELECT b, GROUP_CONCAT(c ORDER BY c DESC) FROM tbl_2 GROUP BY b;
+------+---------------------------------+
| b | GROUP_CONCAT(c ORDER BY c DESC) |
+------+---------------------------------+
| 1 | c,c,b,b,a,a |
| 2 | c,c,a,a |
+------+---------------------------------+
2 rows in set (0.00 sec)
[/sql]


REPEAT() 用来复制字符串
REPEAT('复制的字符串', 复制的份数)
[sql]
mysql> SELECT REPEAT('a', 2);
+----------------+
| REPEAT('a', 2) |
+----------------+
| aa |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT REPEAT('a', 3);
+----------------+
| REPEAT('a', 3) |
+----------------+
| aaa |
+----------------+

mysql> SELECT a, b, REPEAT(b, 3) AS c FROM tbl_1;
+---+------+------+
| a | b | c |
+---+------+------+
| 1 | a | aaa |
| 2 | b | bbb |
| 3 | c | ccc |
| 4 | d | ddd |
+---+------+------+
4 rows in set (0.00 sec)
[/sql]


SUBSTR() 截取字符串
[sql]
mysql> SELECT * FROM tbl_1 WHERE SUBSTR(b, 1, 3) = 'str';
+----+------+------+
| id | a | b |
+----+------+------+
| 10 | 3 | stri |
+----+------+------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTR('string', 1, 3);
+------------------------+
| SUBSTR('string', 1, 3) |
+------------------------+
| str |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTR('string', -1, 3);
+-------------------------+
| SUBSTR('string', -1, 3) |
+-------------------------+
| g |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTR('string', -3, 3);
+-------------------------+
| SUBSTR('string', -3, 3) |
+-------------------------+
| ing |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTR('string', 0, 3);
+------------------------+
| SUBSTR('string', 0, 3) |
+------------------------+
| |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT SUBSTR('string', 1, -1);
+-------------------------+
| SUBSTR('string', 1, -1) |
+-------------------------+
| |
+-------------------------+
1 row in set (0.00 sec)
[/sql]


UCASE() OR UPPER() 将字符串转为大写
[sql]

mysql> SELECT UCASE('string');
+-----------------+
| UCASE('string') |
+-----------------+
| STRING |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT UCASE(b) FROM tbl_1;
+----------+
| UCASE(b) |
+----------+
| A |
| A |
| B |
| C |
| STRI |
+----------+
5 rows in set (0.00 sec)
[/sql]


LOWER() OR LCASE()
[sql]
mysql> SELECT LOWER('string');
+-----------------+
| LOWER('string') |
+-----------------+
| string |
+-----------------+
1 row in set (0.00 sec)
[/sql]


LOCATE()
[sql]
mysql> SELECT LOCATE('t', 'string');
+-----------------------+
| LOCATE('t', 'string') |
+-----------------------+
| 2 |
+-----------------------+
1 row in set (0.00 sec)
[/sql]


POSITION()
[sql]
mysql> SELECT POSITION('t' IN 'string');
+---------------------------+
| POSITION('t' IN 'string') |
+---------------------------+
| 2 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT POSITION('T' IN 'STRING');
+-----------------------------------------+
| POSITION('T' IN 'STRING') |
+-----------------------------------------+
| 4 |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT POSITION('t' IN 'STRING');
+---------------------------------------+
| POSITION('t' IN 'STRING') |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.01 sec)

mysql> SELECT POSITION('T' IN 'STRING');
+---------------------------------------+
| POSITION('T' IN 'STRING') |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.00 sec)
[/sql]

数据库的索引

使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓 (lname) 列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

在数据库关系图中,您可以在选定表的 索引/键 属性页中创建, 编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。
注意: 并非所有的数据库都以相同的方式使用索引。

作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的。
索引列

可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值的行。

如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。

确定索引的有效性:

  • 检查查询的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以选择的对象。

  • 对新索引进行试验以检查它对运行查询性能的影响。

  • 考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。

  • 检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。

  • 检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。



索引类型
根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引, 主键索引和聚集索引。

  • 唯一索引
    唯一索引是不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。

  • 主键索引
    数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

  • 聚集索引
    在聚集索引中,表中行的物理顺序与键值的逻辑 (索引) 顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

事务的ACID特征

ACID指的是Atomic(原子的), Consistent(一致的), Isolated(隔离的)以及 Durable(持续的),它们代表着事务处理应该具备的四个特征:

  • 原子性 组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分

  • 一致性 在事务处理执行之前和之后,数据是一致的

  • 隔离性 一个事务处理对另一个事务处理没有影响

  • 持续性 当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来


前面有人问我事务的特征时
竟然一个都记不起来了~
顿时~(@^_^@)~红了脸~
数据库,一直以来
我都认为是我在大学时期唯一认真学过的一门课~
现在,竟也成了这样了
该说是时间无情吗?

sudo and su

Sudo is a standard way to give users some administrative rights without giving out the root password. Sudo is very useful in a multi user environment with a mix of server and workstations. Simply call the command with sudo:
[bash]
sudo /etc/init.d/dhcpd restart # Run the rc script as root
sudo -u sysadmin whoami # Run cmd as an other user
[/bash]

Configuration

Sudo is configured in /etc/sudoers and must only be edited with visudo. The basic syntax is (the lists are comma separated):
[bash]
user hosts = (runas) commands # In /etc/sudoers
[/bash]


  • users
    one or more users or %group (like %wheel) to gain the rights

  • hosts
    list of hosts (or ALL)

  • runas
    list of users (or ALL) that the command rule can be run as. It is enclosed in ( )!

  • commands
    list of commands (or ALL) that will be run as root or as (runas)




Additionally those keywords can be defined as alias, they are called User_Alias, Host_Alias, Runas_Alias and Cmnd_Alias. This is useful for larger setups. Here a sudoers example:

[bash]
cat /etc/sudoers
[/bash]

[bash]
# Host aliases are subnets or hostnames.Host_Alias DMZ = 212.118.81.40/28
Host_Alias DESKTOP = work1, work2

# User aliases are a list of users which can have the same rights
User_Alias ADMINS = colin, luca, admin
User_Alias DEVEL = joe, jack, julia
Runas_Alias DBA = oracle,pgsql

# Command aliases define the full path of a list of commands
Cmnd_Alias SYSTEM = /sbin/reboot,/usr/bin/kill,/sbin/halt,/sbin/shutdown,/etc/init.d/
Cmnd_Alias PW = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root # Not root pwd!
Cmnd_Alias DEBUG = /usr/sbin/tcpdump,/usr/bin/wireshark,/usr/bin/nmap

# The actual rules
root,ADMINS ALL = (ALL) NOPASSWD: ALL # ADMINS can do anything w/o a password.
DEVEL DESKTOP = (ALL) NOPASSWD: ALL # Developers have full right on desktops
DEVEL DMZ = (ALL) NOPASSWD: DEBUG # Developers can debug the DMZ servers.

# User sysadmin can mess around in the DMZ servers with some commands.
sysadmin DMZ = (ALL) NOPASSWD: SYSTEM,PW,DEBUG
sysadmin ALL,!DMZ = (ALL) NOPASSWD: ALL # Can do anything outside the DMZ.
%dba ALL = (DBA) ALL # Group dba can run as database user.

# anyone can mount/unmount a cd-rom on the desktop machines
ALL DESKTOP = NOPASSWD: /sbin/mount /cdrom,/sbin/umount /cdrom
[/bash]

The su utility requests appropriate user credentials via PAM and switches to that user ID (the default user is the superuser). A shell is then executed.

PAM is used to set the policy su(1) will use. In particular, by default only users in the wheel group can switch to UID 0 (root). This group requirement may be changed by modifying the pam_group

section of /etc/pam.d/su. See pam_group for details on how to modify this setting.
By default, the environment is unmodified with the exception of USER, HOME, and SHELL. HOME and SHELL are set to the target login's default values. USER is set to the target login, unless the target login has a
user ID of 0, in which case it is unmodified. The invoked shell is the one belonging to the target login. This is the traditional behavior of su. Resource limits and session priority applicable to the original user's login class (see login.conf(5)) are also normally retained unless the target login has a user ID of 0.

The options are as follows:


  • -f
    If the invoked shell is csh(1), this option prevents it from reading the ``.cshrc'' file.


  • -l
    Simulate a full login. The environment is discarded except for HOME, SHELL, PATH, TERM, and USER. HOME and SHELL are modified as above. USER is set to the target login. PATH is set to /bin:/usr/bin. TERM is imported from your current environ- ment. Environment variables may be set or overridden from the
    login class capabilities database according to the class of the target login. The invoked shell is the target login's, and su will change directory to the target login's home directory. Resource limits and session priority are modified to that for the target account's login class.


  • -
    (no letter) The same as -l.


  • -m
    Leave the environment unmodified. The invoked shell is your login shell, and no directory changes are made. As a security precaution, if the target user's shell is a non-standard shell (as defined by getusershell(3)) and the caller's real uid is non- zero, su will fail.


  • -s
    Set the MAC label to the user's default label as part of the user credential setup. Setting the MAC label may fail if the MAC label of the invoking process is not sufficient to transition to the user's default MAC label. If the label cannot be set, su will fail.


  • -c
    class Use the settings of the specified login class. Only allowed for the superuser.


The -l (or -) and -m options are mutually exclusive; the last one specified overrides any previous ones.

If the optional args are provided on the command line, they are passed to the login shell of the target login. Note that all command line arguments before the target login name are processed by su itself, everything
after the target login name gets passed to the login shell.

By default (unless the prompt is reset by a startup file) the superuser prompt is set to # to remind one of its awesome power.


ENVIRONMENT
Environment variables used by su:


  • HOME
    Default home directory of real user ID unless modified as specified above


  • PATH
    Default search path of real user ID unless modified as specified above.


  • TERM
    Provides terminal type which may be retained for the substituted user ID.


  • USER
    The user ID is always the effective ID (the target user ID) after an su unless the user ID is 0 (root).


  • FILES
    /etc/pam.d/su PAM configuration for su.



EXAMPLES
[bash]
su man -c catman
[/bash]
Runs the command catman as user man. You will be asked for man's password unless your real UID is 0.
su man -c 'catman /usr/share/man /usr/local/man /usr/X11R6/man' Same as above, but the target command consists of more than a single word and hence is quoted for use with the -c option being
passed to the shell. (Most shells expect the argument to -c to be a single word). su -c staff man -c, catman /usr/share/man /usr/local/man /usr/X11R6/man Same as above, but the target command is run with the resource limits of the login class staff. Note: in this example, the first -c option applies to su while the second is an argument to the shell being invoked.
[bash]
su -l foo #Simulate a login for user foo.
su - foo #Same as above.
su - #Simulate a login for root.
[/bash]

入侵*NIX类服务器详解

FROM: 网络

在网上有许多网友提出这样的问题:究竟网站的主页是如何被黑的?黑客们到底是如何入侵服务器的?

在讨论这部分知识前,读者需要知道入侵网站是非法的;但是在网络上找到网站的入侵漏洞并通知该网站是受到欢迎的。为什么要这样寻找入侵漏洞或入侵哪,闻名的黑客H ackalot 说过“入侵网站是利用所学的知识来学习新的知识的一种办法”,这也就是中国人所常说的“温故而知新”。

原理
尽管为服务器设计软件的软件工程师们想方设法提高系统的安全性,然而由于系统管理员的水平参差不齐或安全意识底下,往往给黑客提供了入侵的机会。

其实每一个黑客都有自己独到的方法。笔者对于入侵网站服务器的资料收集了很多,但是因为实际情况的不同,往往造成许多方法的失效;由此可见,每一个网站的情况都不同,需要入侵者区分对待。假设深圳的线路比北京的线路要好的多,从而给了词典穷举很大的方便,深圳用户就可以依靠这个优势在线攻击口令,作为北京的用户就需要优先考虑其它办法了。针对这么多的入侵手段,笔者参考 Hackalot 先生这位黑客界名人的一篇文章给大家介绍一下入侵网站的基本步骤。

分析一部分的主页被黑的事例可以发现使用入侵者最热衷于入侵 Web服务器FTP服务器,因为相对来说这是最简单的两种途径。在假设读者对 UNIX 系统和 WEB SERVER 的知识不曾了解的情况下,笔者给出下面的步骤。

A. 了解要入侵的系统

现在网络上用作服务器的操作系统以 UNIX 和 Linux 为主流,假如要入侵这些系统则必须对它们有一个了解。

大部份在 DOS 上使用的指令在 UNIX 及 Linux 上都有对应的指令(因为早期的dos开发借鉴了UNIX),以下列出在使用 SHELL帐号 (shell account)时最主要的一些指令对应的dos指令:

  • help = help

  • cp = copy

  • mv = move

  • ls = dir

  • rm = del

  • cd = cd


要看谁同也在该系统上用户可以键入who指令,要知道系统上某一位使用者的资料, 可以键入finger

B. 破解密码

在UNIX操作系统中, 所有系统使用者的密码都存放在一个文件中,这个文件存放在/etc/passwd这个文件里,这个文件里的帐号的密码都已经都已经经过重新编译(DES 加密),并且都是单向编译(one-way encrypted)。

但是还是有些程序可以得到这些原始的密码。笔者向大家推荐一个破解密码的程序Cracker Jack,它也是一个使用字典来对字典文件进行穷举的软件。首先 Cracker Jack 会把字典文件里的每一个值进行编译,然后将编译过的值与密码文件中的内容进行比较,得到相同的结果就会报告对应的未经编译密码。这个软件巧妙的绕过密码无法反编译的限制,使用穷举比较获得密码。使用这种原理获得密码的工具有许多,读者可以到网络上去搜寻一下。

C. 获得密码文件

这是最困难的一部分。很明显,假如管理员有那么一个密码文件的话,当然不会放在那里让其它人舒舒适服的拿到的。入侵者必须找到好方法以不进入系统的方式拿到密码文件。这里笔者向大家介绍两种方法,大家可以试试,有可能会成功。

1)
tc目录在FTP服务上不会被锁住,入侵可以用FTP client程序使用 anoymouse 匿名帐号登陆,然后检查一下/etc/passwd是否为匿名设置了被读取的权限,假如有马上备份下来使用软件解码。

2)
一些系统中,cgi-bin目录下会有个叫PHF的文件,假如预备入侵的服务器上有的话那就要方便的多了。因为 PHF答应使用者对网站系统里的文件作远端读取,以此为据,用户可以使用浏览器抓取p asswd文件,只要在浏览器地址栏中键入URL:http://xxx.xxx.xxx/cgi-bin/phf?Qalias=x
/bin/cat /etc/passwd
,其中xxx.xxx.xxx 是要入侵的网站名。

假如这两种方法都行不通的话,那入侵者必须实施其它的办法了。

在有些情况下入侵者找到的密码文件的第二部分是X!或者*,那么说明该密码文件已经被锁死,这是系统管理员使用的加强安全的手段之一。但是将密码文件完全隐藏起来的情况是不太有的。通常情况下都会有未经锁死的密码文件备份在系统中,这样入侵者就可以加以利用,比如:入侵者通常会寻找/ etc/shadow 目录或类似的目录,看能否找到密码文件的备份。

D. 建立自己的shell帐号

经过二、三两个要害的步骤入侵者终于拿到了要害的密码文件,并且破解出了密码。现在可以运行TELNET程序,登陆主机了。当连上服务器时服务器会向你显示自己的一些信息,通常是UNIX、linux, aix, irix, ultrix, bsd 甚至是 DOS 和VAX/Vms;然后是 Login 提示符出现在屏幕上,这时键入得来的帐号和密码即可登陆系统。此时入侵者就可以利用自己的UNIX知识做自己喜欢做的事了。

最后对一份密码文件做一个分析,该文件内容如下:
[text]
root:1234aaab:0:1:Operator:/:/bin/csh
nobody:*:12345:12345::/:
daemon:*:1:1::/:
sys:*:2:2::/:/bin/csh
sun:123456hhh:0:1:Operator:/:/bin/csh
bin:*:3:3::/bin:
uucp:*:4:8::/var/spool/uucppublic:
news:*:6:6::/var/spool/news:/bin/csh
audit:*:9:9::/etc/security/audit:/bin/csh
sync::1:1::/:/bin/sync
sysdiag:*:0:1:Old System
Diagnostic:/usr/diag/sysdiag:/usr/diag/sysdiag/sysdiag
sundiag:*:0:1:System
Diagnostic:/usr/diag/sundiag:/usr/diag/sundiag/sundiag
tom:456lll45uu:100:20::/home/tom:/bin/csh
john:456fff76Sl:101:20:john:/home/john:/bin/csh
henry:AusTs45Yus:102:20:henry:/home/henry:/bin/csh
harry:SyduSrd5sY:103:20:harry:/home/harry:/bin/csh
steven:GEs45Yds5Ry:104:20:steven:/home/steven:/bin/csh
::0:0:::
[/text]
其中以 : 分成几个栏位,比如:tom:456lll45uu:100:20:tomchang:/home/tom:/bin/csh的含义是:

  • User Name: tom

  • Password: 456lll45uu

  • User NO: 100

  • Group NO: 20

  • Real Name: tom chang

  • Home Dir: /home/tom

  • Shell: /bin/csh



读者可以发现以上诸如nobody, daemon, sys, bin, uucp, news, audit, sysdiag、sundiag 等的密码栏位都是*,也就是说这些帐号的密码都已锁死,无法直接利用。

值得注重的是,许多系统在首次安装后会有一些缺省帐号和密码,这给投机主义的黑客带来方便,以下就是一些UNIX下缺省的帐号和密码。

























































ACCOUNTPASSWORD 
rootroot 
syssys/system /bin
binsys/bin
mountfsysmountfsys 
admadm 
uucpuucp 
nuucpanon 
anonanon 
useruser 
gamesgames 
installinstall 
reboot供“command login”使用
demodemo 
umountfsysumountfsys 
syncsync 
adminadmin 
guestguest 
daemondaemon 


其中 root, mountfsys, umountfsys, install(有时候 sync 也是) 等都是root级别的帐号, 也就是拥有了sysop (系统管理员)的权限。

最后有必要介绍一下UNIX的日志文件。很多入侵者不希望侵入的电脑追踪他们,那到底如何做那。

系统管理员主要依靠系统的 LOG,即我们时常所说的日志文件来获得入侵的痕迹及入侵者进来的IP和其他信息。当然也有些管理员使用第三方工具来记录侵入电脑的信息,这里主要讲的是一般 UNIX 系统里记录入侵踪迹的文件。

UNIX 系统有多个版本,各个系统有不同的LOG文件,但大多数都应该有差不多的存放位置,最普通的位置就是下面的这几个:

  • /usr/adm 早期版本的UNIX

  • /var/adm 新一点的版本使用这个位置

  • /var/log 一些版本的Solaris,Linux BSD,Free BSD使用这个位置


  • /etc 大多数UNIX版本把utmp放在此处,一些也把wtmp放在这里,这也是 syslog.conf的位置



下面列举一些文件的功能,当然他们也根据入侵的系统不同而不同。

  • acct 或 pacct 记录每个用户使用的命令记录

  • access_log 主要使用来服务器运行了NCSA HTTPD,这个记录文件会有什么站点连接过你的服务器

  • aculog 保存着你拨出去的MODEMS记录

  • lastlog 记录了用户最近的登陆记录和每个用户的最初目的地,有时是最后不成功登陆的记录;


  • loginlog 记录一些不正常的登陆记录

  • messages 记录输出到系统控制台的记录,另外的信息由syslog来生成


  • security 记录一些使用UUCP系统企图进入限制范围的事例

  • sulog 记录使用su命令的记录

  • utmp 记录当前登录到系统中的所有用户,这个文件伴随着用户进入和离开系统而不断变化


  • utmpx UTMP的扩展

  • wtmp


  • syslog 最重要的日志文件,使用syslogd守护程序来获得



日志信息:

  • /dev/log 一个UNIX域套接字,接受在本地机器上运行的进程所产生的消息

  • /dev/klog 一个从UNIX内核接受消息的设备

  • 514 端口 一个INTERNET套接字,接受其他机器通过UDP产生的syslog消息

  • Uucp 记录的UUCP的信息,可以被本地UUCP活动更新,也可有远程站点发起的动作修改,信息包括发出和接受的呼叫,发出的请求,发送者,发送时间和发送主机

  • lpd-errs 处理打印机故障信息的日志

  • ftp日志 执行带 -l 选项的ftpd能够获得记录功能

  • httpd日志 HTTPD服务器在日志中记录每一个WEB访问记录

  • history日志 这个文件保存了用户最近输入命令的记录

  • vold.log 记录使用外接媒介时碰到的错误记录

仿select 下拉列表

CSS 代码
[css]
body{ font-size: 12px;}
.c_dropdown{float:left;text-align:left;}
.button_style{
width: 125px;
border:1px solid #43d227;
padding:0 15px 0 0;
height:26px;
color:#146a00;
line-height:24px;
text-align:left;
cursor:pointer
}

*.button_style{_line-height:20px;}

.c_dropdown ul{
display:block;
position:absolute;
left:0;
z-index:9999;
border:1px solid #43d227;
margin:0;
padding:0;
height:auto;
width:140px;
background:#fff;
text-align:left;
list-style:none;
top:-1px;
}
.c_dropdown ul li {
overflow:hidden;
margin:1px 0;
display:block;
height:28px;
margin:0;
color:#666;
line-height:28px;
text-decoration:none;
text-indent:3px;
border-bottom:1px solid #e7e7e7;
}
*.c_dropdown ul li {*line-height:26px;*overflow:hidden}
.c_dropdown ul li a:hover{color:#fff;background:#666}
.c_dropdown .c_dropdown_current a{color:#146a00}
.active {color: #FF0000;}
[/css]

JS 代码
[js]
var checkdown_list;
var show_dropdown = false;
$(function() {
$("#dropdown").click(function(event) {
if (show_dropdown) {
hide();
} else {
show();
event.stopPropagation();
}
}).focus(function() {
checkdown_list = true;
});

$('#dropdown_list li').click(function(event){
checkdown_list = true;
event.stopPropagation();
});
});

function show(obj) {
if (null != checkdown_list) {
hide();
}
show_dropdown = true;
$("#dropdown_list").show();
$(document).bind("click", hide);
$('#dropdown').trigger('focus');
}

function hide(obj) {
if (checkdown_list != null &amp;&amp; show_dropdown) {
$("#dropdown_list").hide();
$('#dropdown').toggleClass('active');
$(document).unbind("click", hide);
checkdown_list = null;
show_dropdown = false;
}
}
[/js]

HTML 代码
[html]
<div class="c_dropdown">
<div id="dropdown" class="button_style"><span id="selected_bifg_id_10">未分组</span></div>
<div style="position: relative; height: 0px; z-index: 9999;">
<ul id="dropdown_list" class="checkList" style="display:none;">
<li><span><input id="multi_friend_1" name="fs_checkbox" type="checkbox" />朋友</span></li>
<li>
<span><input id="multi_friend_2" name="fs_checkbox" type="checkbox" />同学</span></li>
<li><span><input type="text" value="新建分组" /></span></li>
</ul>
</div>
</div>
[/html]
demo: 仿select 下拉列表demo

jQuery 表格效果代码

[js]
$(function() {
$('.pickme tbody tr:odd').addClass('odd');
$('.pickme tbody tr').hover(
function() { $(this).addClass('highlight'); },
function() { $(this).removeClass('highlight'); }
).click( function() {
$('.selected').removeClass('selected');
$(this).addClass('selected').find('input').attr('checked','checked');
});
});
[/js]

2009年10月24日星期六

Javascript 之 事件冒泡(Event Bubbling)

IE4x, 介绍一种新的处理事件的方法----事件冒泡. 对 Html 和 Javascript 来说这是全新的, 但是在许多其他的环境中他早已经被应用, 如: windows, os/2, HyperCard等.

起始的时候, IE4x 直接将一个事件引向的他的指定目标, 例如: 如果一个按钮被单击, 那么这个按钮就是他的目标.如果已经为这个对象定义好了事件处理程序, 那么这个事件就会调用事件处理程序, 如果没有定义任何处理程序, 或者事件处理程序的返回值为 'true' (为 'false' 将会取消事件),那么这个事件会向这个对象的父级对象传播, 进行处理, 这个事件会一直在整个对象层次中冒泡, 直到他被处理, 或者他到达对象层次的最顶层, document 对象.

为了弄清这个机制, 你必须要对 IE4x 中的 DOM 模型有一些基本的了解. 所有的文档内容, 包括元素和属性, 都是可访问, 可操纵的. 换句话说, 在 IE4x 中, 每个元素都被组织成一个对象, 包含的对象层次中.因此在页面上的每个元素, 都可能是事件源.

就想W3C工作草案中描述的那样.

  • 所有的元素都能够产生事件

  • 将有交互事件, 更新事件和, 更改事件.

  • 事件模型将会对用户的交互做出反应.

  • 事件传输机制将允许默认行为的重写.

  • 事件将会在文档的对象结构中冒泡.

  • 事件是同步的.

  • 事件将会用一个中立的方式被定义.

  • 将提供事件绑定的接口.


事件冒泡是很有用的, 因为他允许多个操作被集中处理.他可以让你在对象层的不同级别捕获事件.

下面来看个例子:
[html]
<p onClick="functionName()">
This is a paragraph, and <b> these are bold words in the paragraph</b></p>
[/html]

自从页面上的每个单独的元素被描绘成一个对象以后, 可以为 <p>标记提供一个 onClick 事件处理程序.例如当你单击单词: 'words' 的时候, click 事件会直接指向 P 元素进行处理,如果 P 元素有合适的事件处理程序,将会处理这个事件, 事件将会停止他的传递过程.当你单击单词 'these' 的时候, 这个事件首先被发送到元素 B,因为 B 也被表现为一个对象, 因为他没有 click 事件的处理程序, 所以这个事件被冒泡给他的父元素,这个段落处理了该事件.如果 IE4x 不支持事件的冒泡, 以上所说的情况也不可能发生.

阻止事件冒泡
[js]
//如果提供了事件对象, 则这是一个非IE浏览器
if ( e && e.stopPropagation ) {
//因此它支持 W3C 的 stopPropagation()方法
e.stopPropagation();
} else {
//否则, 我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
}
return false;
[/js]

阻止浏览器的默认行为
[js]
//如果提供了事件对象, 则这是一个非IE浏览器
if ( e && e.preventDefault )
//阻止默认浏览器动作(W3C)
e.preventDefault();
} else {
//IE中阻止函数器默认动作的方式
window.event.returnValue = false;
}
return false;
[/js]

2009年10月22日星期四

Freebsd+nginx+php+mysql+zend

A. 进入系统后,准备cvs更新
[bash]
cd /usr/ports/net/cvsup-without-gui
cp /usr/share/examples/cvsup/ports-supfile /etc/ports-supfile
# vi /etc/ports-supfile
[/bash]
将其中的 #default host=CHANGE_THIS.FreeBSD.org 一行改为
default host=cvsup4.FreeBSDchina.org

更新ports
[bash]
/usr/local/bin/cvsup -g -L 2 /etc/ports-supfile
[/bash]

B. 安装mysql
[bash]
cd /usr/ports/databases/mysql51-server
make WITH_CHARSET=gbk WITH_XCHARSET=all WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes BUILD_STATIC=yes SKIP_DNS_CHECK=yes WITHOUT_INNODB=yes install clean
cp /usr/local/share/mysql/my-large.cnf /usr/local/etc/my.cnf #mysql的优化参数,也可以手动修改
rehash
mysql_install_db --user=mysql #初始化mysql
/usr/local/bin/mysqld_safe & #启动mysql
/usr/local/bin/mysqladmin -u root password newpass #修改root密码,newpass是需设置的密码
[/bash]

关闭mysql可以使用 mysqladmin -u root -p shutdown

C. 安装php
[bash]
cd /usr/ports/lang/php5
make config #配置编译参数
make install clean
cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini
[/bash]

修改 php.ini 配置文件
[bash]
cgi.fix_pathinfo=1
[/bash]

D. 安装php5-extensions
[bash]
cd /usr/ports/lang/php5-extensions/
make config
make install clean
[/bash]

E. 安装Zend Optimizer
[bash]
cd /usr/ports/devel/ZendOptimizer/
make #不要安装,只需要下载解包
cd /usr/ports/devel/ZendOptimizer/work/ZendOptimizer-*
./install-tty #会出现一个文字的安装界面,只是最后一步,不要选择apache就可以了
vi /usr/local/etc/php.ini
[/bash]
插入zend的路径,一般来说,上面的安装会自动加入下面的文字,假如没有,请手动添加。
[bash]
[Zend]
zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.0
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.0
zend_optimizer.version=3.3.0a
zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so
[/bash]

小提示:安装zend,在freebsd下面,目前只有支持到php5.1.x,对于php5.2.x还不能支持,因为zend还没有为php5.2.x开发版本,在网上查了好多关于解决此类的问题,但得到的结果是,zend可以顺利安装,phpinfo也显示zend正常了,但程序无法调用,即zend没有工作,也就是目前无法解决,我想只有等到zend php5.2.x的版本后,才可以解决此问题,也希望哪位已经解决此类问题的兄弟,share一下你的经验。假如你非要使用zend,那就请你将php降到5.1.x,或者你不当心已经升级了ports,那建议你可以安装php4.x,毕竟目前php4.x还通用于大部分的环境

F. 安装nginx
[bash]
cd /usr/ports/www/nginx/
make install
[/bash]

H. 安装lighttpd,得到fastcgi 见注释
[bash]
cd /usr/ports/www/lighttpd/
make install
rehash
[/bash]

I. 配置nginx
[bash]
# user nobody
[/bash]
改为如下:
[bash]
user www
[/bash]

[bash]
location / {
root /usr/local/www/nginx;
index index.html index.htm;
}
[/bash]

在index.html前面添加一个index.php
[bash]
location / {
root /data/web/www.jk0086.com/htdocs;
index index.php index.html index.htm;
}
[/bash]

[bash]
#location ~ \.php$ {
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script.name;
# include fastcgi_params;
#}
[/bash]

将前面的#去掉,修改为如下,假设 document root 为 /usr/local/www/nginx
[bash]
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/nginx$fastcgi_script.name;
include fastcgi_params;
}
[/bash]

J. 配置spawn-fcgi
[bash]
/usr/local/bin/spawn-fcgi \
-a 127.0.0.1 -p 9000 -u www -g www -C 64 -f /usr/local/bin/php-cgi
[/bash]
参数说明:监听 127.0.0.1 的 9000 端口,进程数为64(如果服务器内存小于3GB,可以只开启25个进程),用户为www
10) 这边请注意启动顺序,先启动fastcgi,再启动nginx
Nginx.conf由于经常需要修改,即经常需要重启nginx,因此这边写了一个启动脚本,请查看:
[bash]
#!/usr/local/bin/bash
case $1 in
start)
/usr/local/sbin/nginx
;;
stop)
killall -9 nginx
;;
test)
nginx -t -c /usr/local/etc/nginx/nginx.conf
;;
restart)
ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP
;;
show)
ps -aux|grep nginx
;;
esac
[/bash]

保存为nginx.sh使用方法为:
[bash]
nginx.sh start #启动nginx
nginx.sh stop #停止nginx
nginx.sh restart #重启nginx
nginx.sh test #测试nginx.conf的准确性
[/bash]

K. 安装phpMyAdmin
[bash]
cd /usr/ports/databases/phpmyadmin
make install
mv /usr/local/www/phpmyadmin /usr/local/www/nginx
cd /usr/local/www/nginx/phpmyadmin
vi config.inc.php #修改phpMyAdmin的配置文件
[/bash]

注: lighttpd 的spawn-fcgi 现在已成为独立项目