2006年4月15日
站长工具
eWebEditor网页编辑器
FCKEditor在线编辑器
HTML在线编辑器
所见即所得CSS编辑器
CSS整形與最佳化工具
颜色工具
配色方案创建工具二
在线网页配色器
网络辅助
超级转贴工具
易贴网络备忘录
超级编码转换器
查询工具
中国站长站查询工具
日梭万年历
世界网络查询工具
在线电子地图
全国报纸杂志电子版总汇
全息在线万年历
图片工具
Logo在线制作
IE版图像处理工具
图片仓库
Eoool在线图片制作
在线生成图片按钮的工具
在线生成条形码和印章的工具
字库字体在线工具
在线按钮制作工具
多媒体可视化开发系统
爱狗狗吧在线彩字生成工具
在线照片相框生成工具
加密解密
网页加密解密工具
计算工具
多功能计算器
在线手册
终极配色手册
迈至科ASP在线技术手册
XML官方指南中文版
Windows API 参考大全
VBScript 语言参考
VB API 参考手册
PHP用户手册
PHP编码规范
InnoDB 中文参考手册
文档对象模型中文手册
网页制作完全手册
默认行为中文手册
样式表滤镜中文手册
样式表中文手册
转载自:http://www.egil.cn/article.asp?id=333
posted @
2008-01-05 20:45 Q系列类、方法、变量…… 阅读(346) |
评论 (0) |
编辑 收藏
一、AS调用JS方法时出现同名方法(查看实例)
AS代码如下:
import flash.external.*;
var v = ExternalInterface.available;
t_btn.onRelease = function (){
//调用JS函数
var s = ExternalInterface.call("say","JS函数调用成功!")
//调用AS本地函数
s += say("\n本地函数调用成功!");
r_txt.text = s;
}
//AS本地函数
function say(s){
return s;
}
HTML代码:
//定义一个JS函数
function say(txt){
return txt;
}
可以看到在JS中定义了一个say方法供AS调用,现在我们在AS中定义了一个同名的say方法来验证它们是否会出现覆盖。结果证明它们不会覆盖,都工作得很好。(PS:不错~)
二、JS调用AS方法时出现同名方法(查看实例)
AS代码如下:
//导入包
import flash.external.*;
//提供JS访问的函数名
var _method:String = "say";
//指定本地函数中this变量的作用域,可设置为null留空
var e_area:Object = null;
//AS内部函数名
var method:Function = say;
//将函数注册到容器列表
var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, method);
↑ 这里返回的void因此无法转换为Boolean
//查看注册是否成功
if(wasSuccessful){
result_txt.text = "函数注册成功";
}
//本地的函数
function say(txt:String) {
result_txt.text = txt;
}
HTML代码如下:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh_cn" lang="zh_cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>javascript 调用 flash 方法</title>
<script language="javascript">AC_FL_RunContent = 0;</script>
<script src="AC_RunActiveContent.js" language="javascript"></script>
</head>
<body bgcolor="#ffffff">
<!--影片中使用的 URL-->
<!--影片中使用的文本-->
<!--
<p>你们好</p>
-->
<!-- saved from url=(0013)about:internet -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="550" height="400" align="middle" id="myFlash">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="flash读取css.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /> <embed name="myFlash" swLiveConnect="true" src="flash读取css.swf" quality="high" bgcolor="#ffffff" width="550" height="400" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
<SCRIPT LANGUAGE=JavaScript>
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
function myFlash_DoFSCommand(command, args) {
var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
alert (args);
}
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&
navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
document.write('<SCRIPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
document.write(' call myFlash_DoFSCommand(command, args)\n');
document.write('end sub\n');
document.write('</SCRIPT\> \n');
}
</SCRIPT>
<script>
//定义一个JS本地函数
function say(s){
thisMovie("myFlash").say(s);
//↑这里的demo指的是使用Object插入flash的时候指定的id和embed指定的name,例如:id="demo"和name="demo"
alert(s);
}
//浏览器兼容访问DOM,并且将 flash Object返回
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
</script>
<form name="www">
内容:<input type="text" name="sendText" maxlength="45" onChange="say(this.value)" >
</form>
</body>
</html>
可以看到在AS中定义了一个say方法供JS调用,现在我们在JS中定义了一个同名的say方法来验证它们是否会出现覆盖。结果证明它们不会覆盖,都工作得很好。(PS:也不错~)
通过上面的两个例子我们可以得出结论在使用ExternalInterface时即使定义了同名方法,也不会造成方法覆盖,你大可放心使用。
其余
============================================================
在论坛上经常看见有新手问到“我想让FLASH得到URL中的参数ID号,该怎么办?”“某某视频网站的FLASH播放器是如何播放不同ID的视频的?”...诸如此类问题看到了太多,每次都有一堆回帖,众说纷纭,里面难免有误导性质的回复。今天特结合自己平时工作中使用的心得对此类问题做一个小小的归纳。
我所指的
静态传值是区别于与服务端通信进行值传递的方式,例如LoadVars,XML,Remoting之类,后者暂且不在本文的讨论范围内,当你想让FLASH获取URL中的参数时,你为何不换个角度想了?其实我们可以让服务端动态生成SWF的的插入代码,主动将我们需要的参数“静态”传递给FLASH,FLASH直接用就可以了,根本不需要自己去拿,而以何种形式传递给FLASH,就是我所指的静态传值。我知道的可行的HTML与FLASH之间的静态传值方法有三种:
- SWF地址后使用参数传递符“?”
- FlashVars传递
- JS控制
下面来具体介绍下这三种方式的传递是如何工作的:
一、SWF地址后使用参数传递符“?”
我们知道,在ULR地址中使用参数传递符“?”可以以GET方式传递参数,例如http://www.v-sky.com?uid=12&uname=vsky,这里使用了参数传递符“?”,同时使用了连接符“&”做为变量分隔标识,以这种规范的格式来传递两个参数:uid=12和uname=vsky,那么服务端可以使用GET方式获取这两个值。
在FLASH中我们同样可以采用类似的方式来传递参数,HTML页面中插入SWF文件最常用的就是使用Object标签和Embed标签结合的方式,这也是Adobe的推荐方式:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="400" height="300" id="flashvars" align="center">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="demo.swf?uid=12&uname=vsky" />
<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />
<embed src="demo.swf?uid=12&uname=vsky" quality="high" bgcolor="#ffffff" width="400" height="300" name="flashvars" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
|
其中粗体部分对应的就是SWF文件的地址,那么我们可以在这个地址后面通过类似于URL中GET方式传参的方法来个SWF传递参数,例如上面代码在页面完全加载完毕时,它已经给SWF文件写入了两个变量:uid=12和uname=vsky。
二、FlashVars传递
你可以查阅FLASH帮助文档来看FlashVars的官方定义。其实在HTML语法中,这是一个被很多新手所忽视的属性,同样以上面的参数为例,下面用FlashVars来传递变量:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="400" height="300" id="flashvars" align="center">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="demo.swf" />
<param name="FlashVars" value="uid=12&uname=vsky" />
<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />
<embed src="demo.swf" FlashVars="uid=12&uname=vsky" quality="high" bgcolor="#ffffff" width="400" height="300" name="flashvars" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object> |
跟方式一相同,它也是直接给FLASH里添加了这两个变量。但我个人推荐使用此方式,结合SWFObject的使用,使用FlashVars来传递变量有很多好处,例如代码清晰,容易管理,浏览其兼容,符合标准。他们的结合使用在“为FLASH程序构造灵活的接口”一文中我已经做了介绍(PS:随后我会提供一个复杂点的、有说服力的实际应用来说明这种灵活接口的使用)。
三、JS控制
对于客户端页面中的资源,JS通过DOM结构来控制它们可以说是随心所欲的,FLASH也不例外,下面是Flash Player的Javascript方法一览表:
Play() —————————————- 播放动画
StopPlay()————————————停止动画
IsPlaying()———————————– 动画是否正在播放
GotoFrame(frame_number)—————- 跳转到某帧
TotalFrames()——————————- 获取动画总帧数
CurrentFrame()——————————回传当前动画所在帧数-1
Rewind()————————————-使动画返回第一帧
SetZoomRect(left,top,right,buttom)——-放大指定区域
Zoom(percent)——————————改变动画大小
Pan(x_position,y_position,unit)————使动画在x,y方向上平移
PercentLoaded()—————————-返回动画被载入的百分比
LoadMovie(level_number,path)———– 加载动画
TGotoFrame(movie_clip,frame_number)- movie_clip跳转到指定帧数
TGotoLabel(movie_clip,label_name)—— movie_clip跳转到指定标签
TCurrentFrame(movie_clip)————— 回传movie_clip当前帧-1
TCurrentLabel(movie_clip)—————–回传movie_clip当前标签
TPlay(movie_clip)—————————播放movie_clip
TStopPlay(movie_clip)———————-停止movie_clip的播放
GetVariable(variable_name)—————–获取变量
SetVariable(variable_name,value)———–变量赋值
TCallFrame(movie_clip,frame_number)—call指定帧上的action
TCallLabel(movie_clip,label)—————-call指定标签上的action
TGetProperty(movie_clip,property)——–获取movie_clip的指定属性
TSetProperty(movie_clip,property,number)———-设置movie_clip的指定属性
|
在这里我们只需要使用的是粗体标识的SetVariable方法,JS通过调用此方法能够直接更改SWF中的变量值。首先我们需要定义插入的SWF的ID,例如id为VskyDemo,那么我们可以通过下面的JS语句来完成SWF内部变量的设置:
window.document.VskyDemo.SetVariable("uid", 12); |
很简单吧,就是这样的。除非是涉及到了HTML中SWF之外元素跟它交互,否则我一般不使用JS来控制SWF里的变量,因为我总觉得怪怪的,呵呵,个人习惯吧。
多多实践,不要觉得这些小东西不起眼,小东西多了,聚结到一起了就是一个大的应用。
条条大路通北京,选择你自己喜欢的,自己认为便捷的方式就可以了,目前我是没有发现这三个方式存在功能上的缺陷。
======================================================================================
前言、JavaScript和Macromedia Flash的通信示例
原文地址: http://www.macromedia.com/support/flash/ts/documents/java_script_comm.htm
说明: 略作修改,主要是一些很初级的操作; 又很多相似的文章,不过这个很权威
下面是一些在Flash和使用Javascript的HTML文件直接通信的示例,每个示例都有简略的步骤
本文讨论了3种基本的Flash/Javascript通信方式:
Javascript 到 Flash的通信----使用Flash播放器的javascript方法
Flash 到 Javascript的通信----使用Flash的fscommand
Flash 到 Flash的通信----------使用本地连接对象或综合上2种技术
并不是所有的浏览器都很重视脚本.为了和Flash播放器通信,浏览器必须有内置的钩子以便Flash播放器可以'监听'.浏览器必须是下列的几种:
Netscape Navigator 3.0-4.7x, 和 Netscape 6.2或更高
(Windows 95/98/NT/2000/XP 或 MacOS; 允许Java和LiveConnect)
Internet Explorer 3.0 或更高
(仅Windows 95/98/NT/2000/XP; 允许ActiveX)
注意:Macintosh上的Internet Explorer和早期版本的Netscape6不支持这种方法.请查看本文的附加信息
一、Javascript到Flash的通信
这个例子演示了如何使用Flash的method把变量从HTML的input text 发送到该页面中的Flash文件中.HTML input的数据通过Flash的SetVariable方法传送到Flash文件中.
查看示例:示例
下载源文件: javascript_to_flash.zip(17k)
步骤:
Flash中
1.新建一个文件,保存为javascript_to_flash.fla
2.用文字工具在舞台上创建一个文本域
3.选择这个文本域,在属性面板中,从下拉列表中选择动态文本(Dynamic Text),在变量(variable)栏填上"myVar"
注意:最好的习惯是使用Instance,用myVar.text更改myVar的值.为了简单起见和兼容Flash4和Flash5,我们使用的是变量名的形式.
4.保存文件
5.发布HTML文件和SWF文件
Dreamweaver中
下一步的工作转移到Dreamweaver中了,当然也可以是其他的HTML编辑器
1.打开上一步发布的HTML文件
2.插入生成的SWF文件和OBJECT/EMBED标签
(1) Insert>Media>Flash,并选择这个Flash
(2) 切换到代码视图,我们需要修改被选中的<OBJECT>和<EMBED>标签
(3) 在OBJECT标签中,插入id="myFlash"
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
注意:如果你是粘贴复制代码的话,确保删除不必要的换行.否则可能会引起错误; id也可以在属性面板里直接输入
(4) 在EMBED标签中,插入name="myFlash"和swLiveConnect="true",确保没有使用id属性!代码应当是这样子的:
<embed src="javascript_to_flash.swf" quality=high width=366 height=142
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash"
name="myFlash" swLiveConnect="true">
</embed>
3.创建表单域
(1) 回到设计视图
(2) 插入文本域(Insert> Form Object> Text Field),如果询问是否添加表单域,选择是
(3) 把文本域的HTML标签修改成这样:
<input type="text" name="sendText" maxlength="45"
onChange="doPassVar(this)">
每当文本域内容发生变化时,onChange就被触发,doPassVar()函数就被调用
4.创建传递变量值的Javascript函数
复制下面的Javascript到<head></head>标签内
<SCRIPT LANGUAGE=JavaScript>
<!--
function doPassVar(args){
var sendText = args.value;
window.document.myFlash.SetVariable("myVar", sendText);
}
//-->
</SCRIPT>
5.保存文件,测试一下(F12)
二、Flash到Javascript的通信
从HTML可以发送数据到Flash,反过来也可以. 这个例子演示了如何应用Flash的Fscommand来发送数据到Javascript.
查看示例:示例2
下载源文件: flash_to_javascript.zip(10K)
简要步骤:
Flash中
新建一个文件,保存为flash_to_javascript.fla
创建一个文本域,设置成输入文本(Input Text),选择"border"以便我们能看到他,指定他的变量为inputVar
创建一个按钮,在按钮上添加如下的as:
on (release) {
fscommand ("send_var", inputVar);
}
保存文件,导出HTML和SWF
Dreamweaver中
1.打开导出HTML文件,修改<OBJECT>和<EMBED>标签,结果同上:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
<embed src="javascript_to_flash.swf" quality=high
width=366 height=142
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash" name="myFlash" swLiveConnect="true">
</embed>
2. 插入如下的Javascript到<Body>标签内:
<SCRIPT LANGUAGE=JavaScript>
<!--
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
function myFlash_DoFSCommand(command, args) {
var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
alert (args);
}
if (navigator.appName && navigator.appName.indexOf("Microsoft")
!= -1 &&
navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows
3.1") == -1) {
document.write('<SCRIPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
document.write(' call myFlash_DoFSCommand(command, args)\n');
document.write('end sub\n');
document.write('</SCRIPT\> \n');
}
//-->
</SCRIPT>
三、Flash和Flash的通信
通过上面两种方法的混和使用,同一HTML中两个或者更多的Flash直接可以相互传送消息. 从一个flash使用fscommand传送消息给Javascript,使用Flash的Javascript methods把消息传给另外一个flash
详细的看这里:Flash影片之间的通信示例
从Flash MX开始,local connection对象可以用来在flash之间传送消息. 这使得同一HTML中的或者位于两个浏览器窗口中的两个flash影片可以相互发送消息,而不必使用Javascript或者fscommand
详细的看这里:在Flash MX中使用local connection对象(英文)
本站的localConnection教程:http://www.flashempire.com/school/tutorview.php?id=327
附可控制Flash Player的Javascript方法:
一览表:
Play() ---------------------------------------- 播放动画
StopPlay()------------------------------------停止动画
IsPlaying()----------------------------------- 动画是否正在播放
GotoFrame(frame_number)---------------- 跳转到某帧
TotalFrames()------------------------------- 获取动画总帧数
CurrentFrame()------------------------------回传当前动画所在帧数-1
Rewind()-------------------------------------使动画返回第一帧
SetZoomRect(left,top,right,buttom)-------放大指定区域
Zoom(percent)------------------------------改变动画大小
Pan(x_position,y_position,unit)------------使动画在x,y方向上平移
PercentLoaded()----------------------------返回动画被载入的百分比
LoadMovie(level_number,path)----------- 加载动画
TGotoFrame(movie_clip,frame_number)- movie_clip跳转到指定帧数
TGotoLabel(movie_clip,label_name)------ movie_clip跳转到指定标签
TCurrentFrame(movie_clip)--------------- 回传movie_clip当前帧-1
TCurrentLabel(movie_clip)-----------------回传movie_clip当前标签
TPlay(movie_clip)---------------------------播放movie_clip
TStopPlay(movie_clip)----------------------停止movie_clip的播放
GetVariable(variable_name)-----------------获取变量
SetVariable(variable_name,value)-----------变量赋值
TCallFrame(movie_clip,frame_number)---call指定帧上的action
TCallLabel(movie_clip,label)----------------call指定标签上的action
TGetProperty(movie_clip,property)--------获取movie_clip的指定属性
TSetProperty(movie_clip,property,number)-设置movie_clip的指定属
posted @
2007-12-18 18:00 Q系列类、方法、变量…… 阅读(2940) |
评论 (2) |
编辑 收藏
alter table admin #<---- 表名
add CONSTRAINT `xxid_fk` #<---- 复合主键名称
FOREIGN KEY (`xxid`) #<---- 表字段名
REFERENCES `club`(`id`) #<---- 外键表名+字段名
posted @
2007-04-13 15:15 Q系列类、方法、变量…… 阅读(290) |
评论 (0) |
编辑 收藏
动态图片新闻,JS实现.
<script language="JavaScript">
var imgUrl=new Array();
var imgLink=new Array();
var imgText=new Array();
var picNum=0;
imgUrl[1]="图片地址一";
imgLink[1]="链接1";
imgText[1]="标题或简介或其它HTML内容1";
imgUrl[2]="图片地址二";
imgLink[2]="链接2";
imgText[2]="标题或简介或其它HTML内容2";
imgUrl[3]="图片地址三";
imgLink[3]="链接3";
imgText[3]="标题或简介或其它HTML内容3";
imgUrl[4]="图片地址四";
imgLink[4]="链接4";
imgText[4]="标题或简介或其它HTML内容4";
imgUrl[5]="图片地址五";
imgLink[5]="链接5";
imgText[5]="标题或简介或其它HTML内容5";
function NextPic(){
if(picNum<4) picNum++ ;//显示4个图片
else picNum=1;
if (document.all){
//下面注意,如果存在于FORM表单中,需要使用下面的方法,否则可直接使用name。
document.imgInit.filters.revealTrans.Transition=Math.floor(Math.random()*23);
document.imgInit.filters.revealTrans.apply();
document.imgInit.filters.revealTrans.play();
}
document.images.imgInit.src=imgUrl[picNum];
//如果不是图片,而是SWF等,可做判断,内容可在程序中做好,再放于下面。
focustext.innerHTML='<a href='+imgLink[picNum]+' target=_blank>'+imgText[picNum]+'</a>';
//设置翻页时间
theTimer=setTimeout('NextPic()', 3000);
}
function goUrl(){
window.open(imgLink[picNum],'_blank');
}
</script>
HTML代码中:
可以做到控件中
<TABLE cellPadding=0 width=100% border=0>
<TR>
<TD align=middle height="140" >
<div align='center'>
<a href='javascript:goUrl()'><img style="FILTER: revealTrans(duration=2,Transition=5)" src="javascript:NextPic()" width="170" height="120" border="1" id=imgInit name=imgInit></a></TD></TR>
<TR><TD align=middle height="38" ><div name=focustext id=focustext align='center'></div>
</div>
</TD></TR></TABLE>
posted @
2007-01-25 15:25 Q系列类、方法、变量…… 阅读(2650) |
评论 (1) |
编辑 收藏
生活规律34条
1.不说“不可能”。
2.凡事第一反应:找方法,而不是找借口。
3.遇到挫折对自己大声说:太棒了!
4.不说消极的话,不落入消极情绪,一旦出现立即正面处理。
5.凡事先订立目标,并且尽量制作“梦想版”。
6.凡事预先作计划,尽量将目标视觉化。
7.每一分,每一秒都做有用的事情。
8.随时用零碎的时间(如等人、排队等)做零碎的小活。
9.守时。
10.不要太依靠脑袋记忆,好脑子不如烂笔头。
11.随时记录灵感。
12.把重要的观念、方法写下来,并贴起来,随时提示自己。
13.走路比平时快30%。走路时,脚尖稍用力推进;肢体语言健康有力,不懒散、萎靡。
14.每天出门照镜子,给自己一个自信的笑容。
15.每天自我反省一次。
16.每天坚持一次运动。
17.听心跳1分钟(在做重要事前、疲劳时、心情烦躁时、紧张时)。
18.开会坐在前排。
19.微笑。
20.用心倾听,不打断对方说话。
21.说话时,声音有力。感觉自己声音似乎能产生有感染力的磁场。
22.说话之前,先考虑一下对方的感受。
23.每天有意识、真诚地赞美别人3次以上。
24.及时写感谢卡,哪怕是用便笺写。
25.不用训斥、指责的口吻跟别人说话。
26.控制自己,遇事第一反应是不要为自己辩解。
27.每天多做一件“分外事”。
28.不管任何方面,每天必须至少做一次“进步一点点”。
29.每天提前15分钟上班,推迟30分钟下班。
30.每天在下班前用5分钟的时间做一天的整理性工作。
31.定期存钱。
32.节俭。
33.时常运用“头脑风暴”。
34.恪守诚信,说到做到。
posted @
2007-01-25 15:24 Q系列类、方法、变量…… 阅读(295) |
评论 (0) |
编辑 收藏
Apache服务器的设置文件位于/usr/local/apache/conf/目录下,传统上使用三个配置文件httpd.conf,access.conf和srm.conf,来配置Apache服务器的行为。
httpd.conf提供了最基本的服务器配置,是对守护程序httpd如何运行的技术描述;srm.conf是服务器的资源映射文件,告诉服务器各种文件的MIME类型,以及如何支持这些文件;access.conf用于配置服务器的访问权限,控制不同用户和计算机的访问限制;这三个配置文件控制着服务器的各个方面的特性,因此为了正常运行服务器便需要设置好这三个文件。
除了这三个设置文件之外,Apache还使用mime.types文件用于标识不同文件
对应的MIME类型, magic文件设置不同MIME类型文件的一些特殊标识,使得 Apache 服务器从文档后缀不能判断出文件的MIME 类型时,能通过文件内容中的这些特殊标记来判断文档的MIME类型。
bash-2.02$ ls -l /usr/local/apache/conf
total 100
-rw-r--r-- 1 root wheel 348 Apr 16 16:01 access.conf
-rw-r--r-- 1 root wheel 348 Feb 13 13:33 access.conf.default
-rw-r--r-- 1 root wheel 30331 May 26 08:55 httpd.conf
-rw-r--r-- 1 root wheel 29953 Feb 13 13:33 httpd.conf.default
-rw-r--r-- 1 root wheel 12441 Apr 19 15:42 magic
-rw-r--r-- 1 root wheel 12441 Feb 13 13:33 magic.default
-rw-r--r-- 1 root wheel 7334 Feb 13 13:33 mime.types
-rw-r--r-- 1 root wheel 383 May 13 17:01 srm.conf
-rw-r--r-- 1 root wheel 357 Feb 13 13:33 srm.conf.default
事实上当前版本的Apache将原来httpd.conf、srm.conf与access.conf中的所有配置参数均放在了一个配置文件 httpd.conf中,只是为了与以前的版本兼容的原因(使用这三个设置文件的方式来源于NCSA-httpd),才使用三个配置文件。而提供的 access.conf和srm.conf文件中没有具体的设置。
由于在新版本的Apache中,所有的设置都被放在了httpd.conf中,因此只需要调整这个文件中的设置。以下使用缺省提供的httpd.conf为例,解释Apache服
务器的各个设置选项。然而不必因为它提供设置的参数太多而烦恼,基本上这些
参数都很明确,也可以不加改动运行Apache服务器。但如果需要调整Apache服务
器的性能,以及增加对某种特性的支持,就需要了解这些设置参数的含义。
关于Apache服务器的性能,在Internet上存在很大的争议,基本上使用Apache的使用者几乎都不怀疑它的优秀性能,Apache也支撑了很多著名的高负载的网站,但是在商业机构的评测中,Apache往往得分不高。很多人指出,在这些评测中,商业Web服务器及其操作系统往往由其专业公司的工程师进行过性能调整,而Free 的操作系统和Web服务器往往就使用其缺省配置或仅仅作很小的更改。需要指出的是,除了操作系统的性能调整之外,Apache 服务器本身的缺省配置绝不是最优化和最高效的,而是要适应几乎所有种类操作系统、所有种类硬件下的设置,多平台的软件不可能为特定平台和特定硬件提供最优化的缺省配置。因此要使用Apache的时候,性能调整是必不可少的。
在商业评测中忽略了的另一个事实是,评测时往往对不同种类的功能进行比
较,例如使用Apache的标准CGI 的性能与ISAPI,NSAPI等服务器端API比较,事实上Apache服务器与此可以比较的功能为modperl ,FastCGI,与ASP类似的功能为PHP等等,只不过由于Apache的开放模式,这些功能是由独立的开发组,作为独立的模块来实现的。但是在评测中,测试人员没有加入相应的模块评测其性能。
HTTP守护进程的运行参数
httpd.conf中首先定义了一些httpd守护进程运行时需要的参数,来决定其运行方式和运行环境。
ServerType standalone
ServerType定义服务器的启动方式,缺省值为独立方式standalone,httpd
服务器将由其本身启动,并驻留在主机中监视连接请求。在Linux下将在启动文件 /etc/rc.d/rc.local/init.d/apache中自动启动Web服务器,这种方式是推荐设置。
启动Apache服务器的另一种方式是inet方式,使用超级服务器inetd监视连接请求并启动服务器。当需要使用inetd启动方式时,便需要更改为这个设置,并屏蔽/etc/rc.d/rc.local/init.d/apache文件,以及更改/etc/inetd.conf并重起 inetd,那么Apache就能从inetd中启动了。
两种方式的区别是独立方式是由服务器自身管理自己的启动进程,这样在启
动时能立即启动服务器的多个副本,每个副本都驻留在内存中,一有连接请求不需要生成子进程就可以立即进行处理,对于客户浏览器的请求反应更快,性能较
高。而 inetd方式要由inetd发现有连接请求后才去启动http服务器,由于inetd 要监听太多的端口,因此反应较慢、效率较低,但节约了没有连接请求时Web服务器占用的资源。因此inetd方式只用于偶尔被访问并且不要求访问速度的服务器上。事实上inetd方式不适合http的突发和多连接的特性,因为一个页面可能包含多个图象,而每个图象都会引起一个连接请求,即使虽然访问人数造成教少,但瞬间的连接请求并不少,这就受到inetd性能的限制,甚至会影响由inetd启动的其他服务器程序。
ServerRoot "/usr/local"
ServerRoot用于指定守护进程httpd的运行目录,httpd在启动之后将自动将
进程的当前目录改变为这个目录,因此如果设置文件中指定的文件或目录是相对
路径,那么真实路径就位于这个ServerRoot定义的路径之下。
由于httpd会经常进行并发的文件操作,就需要使用加锁的方式来保证文件操作不冲突,由于NFS文件系统在文件加锁方面能力有限,因此这个目录应该是本地磁盘文件系统,而不应该使用NFS文件系统。
#LockFile /var/run/httpd.lock
LockFile参数指定了httpd守护进程的加锁文件,一般不需要设置这个参数, Apache服务器将自动在ServerRoot下面的路径中进行操作。但如果ServerRoot为NFS文件系统,便需要使用这个参数指定本地文件系统中的路径。
PidFile /var/run/httpd.pid
PidFile指定的文件将记录httpd守护进程的进程号,由于httpd能自动复制其自身,因此系统中有多个httpd进程,但只有一个进程为最初启动的进程,它为其他进程的父进程,对这个进程发送信号将影响所有的httpd进程。PidFILE定义的文件中就记录httpd父进程的进程号。
ScoreBoardFile /var/run/httpd.scoreboard
httpd使用ScoreBoardFile来维护进程的内部数据,因此通常不需要改变这个参数,除非管理员想在一台计算机上运行几个Apache服务器,这时每个Apache服务器都需要独立的设置文件htt pd.conf,并使用不同的ScoreBoardFile。
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf
这两个参数ResourceConfig和AccessConfig,就用于和使用 srm.conf 和 access.conf 设置文件的老版本Apache兼容。如果没有兼容的需要,可以将对应的设置文件指定为/dev/null,这将表示不存在其他设置文件,而仅使用 httpd.conf 一个文件来保存所有的设置选项。
Timeout 300
Timeout定义客户程序和服务器连接的超时间隔,超过这个时间间隔(秒)后服务器将断开与客户机的连接。
KeepAlive On
在HTTP 1.0中,一次连接只能作传输一次HTTP请求,而KeepAlive参数用于支持HTTP 1.1版本的一次连接、多次传输功能,这样就可以在一次连接中传递多个HTTP请求。虽然只有较新的浏览器才支持这个功能,但还是打开使用这个选项。
MaxKeepAliveRequests 100
MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数。将
其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。
KeepAliveTimeout 15
KeepAliveTimeout测试一次连接中的多次请求传输之间的时间,如果服务器
已经完成了一次请求,但一直没有接收到客户程序的下一次请求,在间隔超过了
这个参数设置的值之后,服务器就断开连接。
MinSpareServers 5MaxSpareServers 10
在使用子进程处理HTTP请求的Web服务器上,由于要首先生成子进程才能处理客户的请求,因此反应时间就有一点延迟。但是,Apache服务器使用了一个特殊技术来摆脱这个问题,这就是预先生成多个空余的子进程驻留在系统中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。在运行中随着客户请求的增多,启动的子进程会随之增多,但这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。但是空余的子进程副本不能光增加不减少,太多的空余子进程没有处理任务,也占用服务器的处理能力,因此也要限制空余副本的数量,使其保持一个合适的数量,使得既能及时回应客户请求,又能减少不必要的进程数量。
因此就可以使用参数MinSpareServers来设置最少的空余子进程数量, 以及
使用参数MaxSpareServers 来限制最多的空闲子进程数量,多余的服务器进程副
本就会退出。根据服务器的实际情况来进行设置,如果服务器性能较高,并且也
被频繁访问,就应该增大这两个参数的设置。对于高负载的专业网站,这两个值
应该大致相同,并且等同于系统支持的最多服务器副本数量,也减少不必要的副
本退出。
StartServers 5
StartServers参数就是用来设置httpd启动时启动的子进程副本数量,这个参数与上面定义的MinSpareServers和 MaxSpareServers参数相关,都是用于启动空闲子进程以提高服务器的反应速度的。这个参数应该设置为前两个值之间的一个数值,小于 MinSpareServers和大于MaxS pareServers都没有意义。
MaxClients 150
在另一方面,服务器的能力毕竟是有限的,不可能同时处理无限多的连接请
求,因此参数Maxclient s就用于规定服务器支持的最多并发访问的客户数,如果这个值设置得过大,系统在繁忙时不得不在过多的进程之间进行切换来为太多的客户进行服务,这样对每个客户的反应就会减慢,并降低了整体的效率。如果这个值设置的较小,那么系统繁忙时就会拒绝一些客户的连接请求。当服务器性能较高时,就可以适当增加这个值的设置。对于专业网站,应该使用提高服务器效率的策略,因此这个参数不能超过硬件本身的限制,如果频繁出现拒绝访问现象,就说明需要升级服务器硬件了。对于非专业网站,不太在意对客户浏览器的反应速度,或者认为反应速度较慢也比拒绝连接好,就也可以略微超过硬件条件来设置这个参数。
这个参数限制了MinSpareServers和MaxSpareServers的设置,它们不应该大
于这个参数的设置。
MaxRequestsPerChild 30
使用子进程的方式提供服务的Web服务,常用的方式是一个子进程为一次连接服务,这样造成的问题就是每次连接都需要生成、退出子进程的系统操作,使得这些额外的处理过程占据了计算机的大量处理能力。因此最好的方式是一个子进程可以为多次连接请求服务,这样就不需要这些生成、退出进程的系统消耗, Apache就采用了这样的方式,一次连接结束后,子进程并不退出,而是停留在系统中等待下一次服务请求,这样就极大的提高了性能。
但由于在处理过程中子进程要不断的申请和释放内存,次数多了就会造成一
些内存垃圾,就会影响系统的稳定性,并且影响系统资源的有效利用。因此在一个副本处理过一定次数的请求之后,就可以让这个子进程副本退出,再从原始的
httpd进程中重新复制一个干净的副本,这样就能提高系统的稳定性。这样,每
个子进程处理服务请求次数由MaxRe questPerChild定义。 缺省的设置值为30,
这个值对于具备高稳定性特点的Linux系统来讲是过于保守的设置,可以设置为1000甚至更高,设置为0支持每个副本进行无限次的服务处理。
#Listen 3000
#Listen 12.34.56.78:80
#BindAddress *
Listen参数可以指定服务器除了监视标准的80端口之外,还监视其他端口的
HTTP请求。由于FreeBSD系统可以同时拥有多个IP地址,因此也可以指定服务器只听取对某个BindAddress< /B>的IP地址的HTTP请求。如果没有配置这一项,则服务器会回应对所有IP的请求。
即使使用了BindAddress参数,使得服务器只回应对一个IP地址的请求,但是通过使用扩展的Listen参数,仍然可以让HTTP守护进程回应对其他IP地址的请求。此时Listen参数的用法与上面的第二个例子相同。这种比较复杂的用法主要用于设置虚拟主机。此后可以用 VirtualHost参数定义对不同IP的虚拟主机,然而这种用法是较早的HTTP 1.0标准中设置虚拟主机的方法,每针对一个虚拟主机就需要一个IP地址,实际上用处并不大。在HTTP 1.1中,增加了对单IP地址多域名的虚拟主机的支持,使得虚拟主机的设置具备更大的意义。
LoadModule mime_magic_module libexec/apache/mod_mime_magic.so
LoadModule info_module libexec/apache/mod_info.so
LoadModule speling_module libexec/apache/mod_speling.so
LoadModule proxy_module libexec/apache/libproxy.so
LoadModule rewrite_module libexec/apache/mod_rewrite.so
LoadModule anon_auth_module libexec/apache/mod_auth_anon.so
LoadModule db_auth_module libexec/apache/mod_auth_db.so
LoadModule digest_module libexec/apache/mod_digest.so
LoadModule cern_meta_module libexec/apache/mod_cern_meta.so
LoadModule expires_module libexec/apache/mod_expires.so
LoadModule headers_module libexec/apache/mod_headers.so
LoadModule usertrack_module libexec/apache/mod_usertrack.so
LoadModule unique_id_module libexec/apache/mod_unique_id.so
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_proxy.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
AddModule mod_auth_db.c
AddModule mod_digest.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
Apache服务器的一个重要特性就是其模块化的结构,这不但表现为其能在编
译时能通过新的模块加入新的功能,还表现为其模块可以动态加载入http服务程
序中,而不必载入不需要的模块。使用Apache的动态加载模块只需要设置好Load Module和AddModule参数就可以了,这种特性就是Apache的 DSO(Dynamic Shared Object)特性,然而要想充分使用DSO特性仍然不是一个简单的事情,不适当的改动这里的设置就可能造成服务器不能正常启动。因此如果不是要增加或减少服务器提供的功能,就不要改动这里的设置。
上面这些列表就显示了Linux下的缺省Apache服务器支持的模块,事实上很
多模块是没有必要的,不必要模块不会被载入内存。模块可以静态连接到Apache 服务器内部,也可以这样动态加载,将Apache的特性都编译成动态可加载模块是该Port的做法,而不是Apache的缺省做法,这样就以牺牲很小的性能的同时,带来极大的灵活性。
因而动态可加载的能力还是对性能有轻微的影响,因此可以重新编译Apache,将自己所需要的功能编译进Apache 服务器内部,可以让系统显得更为干净,效率也有轻微的提高。通常仅仅为了这一个目的就重新编译Apache是没有必要的,如果需要增加其他特性而重新编译 Apache,不妨在增加其他模块的同时将所有的模块都静态连接入Apache 服务器。有的使用者更喜欢动态加载模块,那么也不妨全部都使用动态加载模块。
这些模块都被放置到/usr/local/apache/libexec/目录下,每个模块对应Apache服务器的一个特性。详细解释每个模块的功能需要相当多的篇幅,其中比较重要的特性将在后面相应的地方中进行解释,而具体每个模块的功能及用法就需要查看Apache的文档。
#ExtendedStatus On
Apache服务器可以通过特殊的HTTP请求,来报告自身的运行状态,打开这个
ExtendedStatus 参数可以让服务器报告更全面的运行状态信息。
主服务器设置
Apache服务器需要各种设置,以定义自己使用各种参数以提供Web服务。对于使用虚拟主机的情况,除了在虚拟主机的定义项中覆盖的设置之外(有的设置必须重新定义),这里的设置也是虚拟主机的缺省设置。
Port 80
Port定义了Standalone模式下httpd守护进程使用的端口,标准端口是80。这个选项只对于以独立方式启动的服务器才有效,对于以inetd方式启动的服务器则在inetd.conf中定义使用哪个端口。
在Unix下使用80端口需要root权限,一些管理员为了安全的原因,认为 httpd 服务器不可能没有安全漏洞,因而更愿意使用普通用户的权限来启动服务器,这样就不能使用80端口及其他小于1024的端口,而必须使用大于 1024的端口来启动httpd,一般情况下8000或8080也是常用的端口。而Apache httpd服务器本身可以在以root权限打开80端口后再改变为普通用户身份进行运行,这样就减少了危险性,因而就不需要考虑这个安全问题。但是如果普通用户也想安装配置自己的WWW服务器,那么就不得不使用大于1024的端口。
User nobody
Group nogroup
User和Group配置是Apache的安全保证,Apache在打开端口之后,就将其本身设置为这两个选项设置的用户和组权限进行运行,这样就降低了服务器的危险性。这个选项也只用于 Standalone模式,inetd模式在inetd.conf中指定运行Apache的用户。由于服务器必须执行改变身份的setuid()操作,因此初始进程应该具备root权限,如果是使用非root用户来启动Aapche,这个配置就不会发挥作用。
缺省设置为nobody和nogroup,这个用户和组在系统中不拥有文件,保证了服务器本身和由它启动的CGI 进程没有权限更改文件系统。在某些情况下,例如为了运行CGI与Unix交互,也需要让服务器来访问服务器上的文件,如果仍然使用nobody和 nogroup,那么系统中将会出现属于nobody的文件,这对于系统安全是不利的,因为其他程序也会以nobody和nogroup的权限执行某些操作,就有可能访问这些nobody拥有的文件,造成安全问题。一般情况下要为Web服务设定一个特定的用户和组,同时在这里更改用户和组设置。
ServerAdmin you@your.address
配置文件中应该改变的也许只有ServerAdmin,这一项用于配置WWW服务器的管理员的email地址,这将在HTTP服务出现错误的条件下返回给浏览器,以便让Web使用者和管理员联系,报告错误。习惯上使用服务器上的webmaster作为WWW服务器的管理员,通过邮件服务器的别名机制,将发送到webmaster 的电子邮件发送给真正的Web管理员。
#ServerName new.host.name
缺省情况下,并不需要指定这个ServerName参数,服务器将自动通过名字解
析过程来获得自己的名字,但如果服务器的名字解析有问题(通常为反向解析不
正确),或者没有正式的DNS名字,也可以在这里指定IP地址。当ServerName设
置不正确的时候,服务器不能正常启动。
通常一个Web服务器可以具有多个名字,客户浏览器可以使用所有这些名字或IP地址来访问这台服务器,但在没有定义虚拟主机的情况下,服务器总是以自己的正式名字回应浏览器。ServerName就定义了Web服务器自己承认的正式名字,例如一台服务器名字(在DNS中定义了A类型)为 exmaple.org.cn,同时为了方便记忆还定义了一个别名(CNAME记录)为www.exmaple.org.cn,那么Apache自动解析得到的名字就为example.org.cn,这样不管客户浏览器使用哪个名字发送请求,服务器总是告诉客户程序自己为 example.org.cn。虽然这一般并不会造成什么问题,但是考虑到某一天服务器可能迁移到其他计算机上,而只想通过更改DNS中的www别名配置就完成迁移任务,所以不想让客户在其书签中使用 Linux 记录下这个服务器的地址,就必须使用ServerName来重新指定服务器的正式名字。
DocumentRoot "/www/"
DocumentRoot定义这个服务器对外发布的超文本文档存放的路径,客户程序请求的UR L就被映射为这个目录下的网页文件。这个目录下的子目录,以及使用
符号连接指出的文件和目录都能被浏览器访问,只是要在URL上使用同样的相对目录名。
注意,符号连接虽然逻辑上位于根文档目录之下,但实际上可以位于计算机
上的任意目录中,因此可以使客户程序能访问那些根文档目录之外的目录,这在
增加了灵活性的同时但减少了安全性。Apache在目录的访问控制中提供了 FollowSymLinks选项来打开或关闭支持符号连接的特性。
Options FollowSymLinks
AllowOverride None
Apache服务器可以针对目录进行文档的访问控制,然而访问控制可以通过两
种方式来实现,一个是在设置文件 httpd.conf(或access.conf)中针对每个目
录进行设置,另一个方法是在每个目录下设置访问控制文件,通常访问控制文件
名字为.htaccess。虽然使用这两个方式都能用于控制浏览器的访问,然而使用配置文件的方法要求每次改动后重新启动httpd守护进程,比较不灵活,因此主要用于配置服务器系统的整体安全控制策略,而使用每个目录下的.htaccess文件设置具体目录的访问控制更为灵活方便。
Directory语句就是用来定义目录的访问限制的,这里可以看出它的标准语法,为一个目录定义访问限制。上例的这个设置是针对系统的根目录进行的,设置了允许符号连接的选项FollowSymLinks ,以及使用AllowOverride None表示不允许这个目录下的访问控制文件来改变这里进行的配置,这也意味着不用查看这个目录下的相应访问控制文件。
由于Apache对一个目录的访问控制设置是能够被下一级目录继承的,因此对
根目录的设置将影响到它的下级目录。注意由于AllowOverride None的设置,使
得Apache服务器不需要查看根目录下的访问控制文件,也不需要查看以下各级目
录下的访问控制文件,直至httpd.conf(或access.conf )中为某个目录指定了
允许Alloworride,即允许查看访问控制文件。由于Apache对目录访问控制是采用的继承方式,如果从根目录就允许查看访问控制文件,那么 Apache就必须一级一级的查看访问控制文件,对系统性能会造成影响。而缺省关闭了根目录的这个特性,就使得Apache从httpd.conf中具体指定的目录向下搜寻,减少了搜寻的级数,增加了系统性能。因此对于系统根目录设置AllowOverride None不但对于系统安全有帮助,也有益于系统性能。
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
这里定义的是系统对外发布文档的目录的访问设置,设置不同的 AllowOverride选项,以定义配置文件中的目录设置和用户目录下的安全控制文件的关系,而Options选项用于定义该目录的特性。
配置文件和每个目录下的访问控制文件都可以设置访问限制,设置文件是由
管理员设置的,而每个目录下的访问控制文件是由目录的属主设置的,因此管理
员可以规定目录的属主是否能覆盖系统在设置文件中的设置,这就需要使用 啊AllowOverride参数进行设置,通常可以设置的值为:
AllowOverride的设置 对每个目录访问控制文件作用的影响
All 缺省值,使访问控制文件可以覆盖系统配置
None 服务器忽略访问控制文件的设置
Options 允许访问控制文件中可以使用Options参数定义目录的选项
FileInfo 允许访问控制文件中可以使用AddType等参数设置
AuthConfig 允许访问控制文件使用AuthName,AuthType等针对每个用户的认证机制,这使目录属主能用口令和用户名来保护目录 Limit 允许对访问目录的客户机的IP地址和名字进行限制
每个目录具备一定属性,可以使用Options来控制这个目录下的一些访问特性设置,以下为常用的特性选项:
Options设置 服务器特性设置
All 所有的目录特性都有效,这是缺省状态
None 所有的目录特性都无效
FollowSymLinks 允许使用符号连接,这将使浏览器有可能访问文档根目录 (DocumentRoot)之外的文档 SymLinksIfOwnerMatch 只有符号连接的目的与符号连接本身为同一用户所拥有时,才允许访问,这个设置将增加一些安全性
ExecCGI 允许这个目录下可以执行CGI程序 Indexes 允许浏览器可以生成这个目录下所有文件的索引,使得在这个目录下没有index.html(或其他索引文件)时,能向浏览器发送这个目录下的文件列表
此外,上例中还使用了Order、Allow、Deny等参数,这是Limit语句中用来根据浏览器的域名和 IP地址来控制访问的一种方式。其中Order定义处理Allow和Deny的顺序,而Allow、Deny则针对名字或IP进行访问控制设置,上例使用 allowfrom all,表示允许所有的客户机访问这个目录,而不进行任何限制。
UserDir public_html
当在一台Linux上运行Apache服务器时,这台计算机上的所有用户都可以有自己的网页路径,形如 http://example.org.cn/~user,使用波浪符号?..褂肈ISABLED作 UserDir的参数即可。
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#
这里可以看到Directory的另一个用法,即可以通过简单的模式匹配方法,针对分布在不同目录下的子目录定义访问控制权限。这样设置就需要Apache服务器对每个路径进行额外的处理,因此就会降低服务器的性能,所以缺省情况并没有打开这种访问限制。
这里可以看到另外一个语句Limit,Limit语句就是用来针对具体的请求方法来设定访问控制的,其中可以使用GET、POST等各种服务器支持的请求方法做Lim
it的参数,来设定对不同请求方法的访问限制。一般可以打开对GET、POST、 HEAD三种请求方法,而屏蔽其他的请求方法,以增加安全性。Limit语句中,可以用Order 、Allow、Deny,Allow和Deny中可以使用匹配的方法针对域名和IP进行限制,只是对于域名是从后向前匹配,对于IP地址则从前向后匹配。
DirectoryIndex index.html
很多情况下,URL中并没有指定文档的名字,而只是给出了一个目录名。那么Apache服务器就自动返回这个目录下由DirectoryIndex定义的文件,当然可以指定多个文件名字,系统会这个目录下顺序搜索。当所有由DirectoryIndex指定的文件都不存在时,Apache服务器可以根据系统设置,生成这个目录下的所有文件列表,提供用户选择。此时该目录的访问控制选项中的Indexes选项(Options Indexes )必须打开,以使得服务器能够生成目录列表,否则Apache将拒绝访问。
AccessFileName .htaccess
AccessFileName定义每个目录下的访问控制文件的文件名,缺省为.htaccess,可以通过更改这个文件,来改变不同目录的访问控制限制。
Order allow,deny
Deny from all
除了可以针对目录进行访问控制之外,还可以根据文件来设置访问控制,这
就是File语句的任务。使用File 语句,不管文件处于哪个目录,只要名字匹配,就必须接受相应的访问控制。这个语句对于系统安全比较重要,例如上例将屏蔽所有的使用者不能访问.htaccess文件,这样就避免.htaccess中的关键安全信息不至于被客户获取。
#CacheNegotiatedDocs
缺省情况下如果代理服务器和Apache服务器协商是否缓存其网页,Apache给
予否定的回答,不希望自己的网页被代理服务器缓存。然而这样就不能有效的利用代理服务器的优势,因此可以设置CacheNegotiatieDocs 选项, 使得代理服务器可以对网页进行缓存。然而即使不设置这个选项,有的代理服务器(或通过调整设置)也能对网页进行缓存。
UseCanonicalName On
打开这个UseCanonicalName是Web服务器的标准做法,因为客户发送的大部分请求都是对本服务器的引用,这样服务器就能使用 ServerName和Port选项的设置内容构建完整的URL,并回应客户,使浏览器能得到规范的URL。如果将这个参数设置为Off,那么 Apache将使用从客户请求中获得服务器的名字和端口值(支持HTTP 1.1的客户的请求中将会有这些信息),重新构建URL。
TypesConfig /usr/local/apache/etc/mime.types
TypeConfig用于设置保存有不同的MIME类型数据的文件名,在Linux下缺省设置为/usr/local/apache/etc/mime.types。
DefaultType text/plain
如果Web服务器不能决定一个文档的缺省类型,这通常表示文档使用了非标准的后缀,那么服务器就使用 DefaultType定义的MIME类型将文档发送给客户浏览器。这里的设置为text/plain,这样设置的问题是,如果服务器不能判断出文档的 MIME,那么大部分情况下这个文档为一个二进制文档,但使用 text/plain格式发送回去,浏览器将在内部打开它而不会提示保存。因此建议将这个设置更改为
application/octet-stream,这样浏览器将提示用户进行保存。
MIMEMagicFile /usr/local/apache/etc/magic
除了从文件的后缀出发来判断文件的MIME类型之外,Apache还可以进一步分
析文件的一些特征,来判断文件的真实MIME类型。这个功能是由mod_mime_magic 模块实现的,它需要一个记录各种MIME类型特征的文件,以进行分析判断。上面的设置是一个条件语句,如果载入了这个模块,就必须指定相应的标志文件magic的位置。
通常连接时,服务器仅仅可以得到客户机的IP地址,如果要想获得客户机的
主机名,以进行日志记录和提供给 CGI程序使用,就需要使用这个 HostnameLookups 选项,将其设置为On打开DNS反查功能。但是这将使服务器对每次客户请求都进行DNS查询,增加了系统开销,使得反应变慢,因此缺省设置为使用Off关闭此选项。关闭选项之后,服务器就不会获得客户机的主机名,而只能使用IP地址来记录客户。
ErrorLog /var/log/httpd-error.log
LogLevel warn
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent} "" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#CustomLog /var/log/httpd-access.log common
#CustomLog /var/log/httpd-referer.log referer
#CustomLog /var/log/httpd-agent.log agent
CustomLog /var/log/httpd-access.log combined
这里定义了系统日志的形式,对于服务器错误记录, 由ErrorLog、 LogLevel 来定义不同的错误日志文件及其记录内容。
对于系统的访问日志,缺省使用CustomLog参数定义日志的位置,缺省使用 combined 参数指定将所有的访问日志放在一个文件中,然而也可以将不同种类的访问日志放在不同的日志记录文件中,这是通过在 CustomLog中指定不同的记录类型来完成的。common表示普通的对单页面请求访问记录,referer表示每个页面的引用记录,可以看出一个页面中包含的请求数,agent表示对客户机的类型记录,显然可以将现有的combined 定义的设置行注释掉,并使用common、referer和agent作为CustomLog的参数,来为不同种类的日志分别指定日志记录文件。
显然,LogFormat是用于定义不同类型的日志进行记录时使用的格式, 这里
使用了以%开头的宏定义,以记录不同的内容。
如果这些参数指定的文件使用的是相对路径,那么就是相对于ServerRoot的
路径。
ServerSignature On
一些情况下,例如当客户请求的网页并不存在时,服务器将产生错误文档,
缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息。有的管理员更倾向于不对外显示这些信息,就
可以将这个参数设置为Off,或者设置为Email,最后一行将替换为对 ServerAdmin 的Email提示。
Alias /icons/ "/www/icons/"
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
Alias参数用于将URL与服务器文件系统中的真实位置进行直接映射,一般的
文档将在DocumentRoot 中进行查询,然而使用Alias定义的路径将直接映射到相
应目录下,而不再到DocumentRoot 下面进行查询。因此Alias可以用来映射一些
公用文件的路径,例如保存了各种常用图标的icons路径。这样使得除了使用符号连接之外,文档根目录(DocumentRoot)外的目录也可以通过使用了Alias映射,提供给浏览器访问。
定义好映射的路径之后,应该需要使用Directory语句设置访问限制。
ScriptAlias /cgi-bin/ "/www/cgi-bin/"
AllowOverride None
Options None
Order allow,deny
Allow from all
ScriptAlias也是用于URL路径的映射,但与Alias的不同在于,ScriptAlias 是用于映射CGI程序的路径,这个路径下的文件都被定义为CGI程序,通过执行它们来获得结果,而非由服务器直接返回其内容。缺省情况下CGI程序使用 cgi-bin目录作为虚拟路径。
# Redirect old-URI new-URL
Redirect参数是用来重写URL的,当浏览器访问服务器上的一个已经不存在的资源的时候,服务器返回给浏览器新的URL,告诉浏览器从该URL 中获取资源。这主要用于原来存在于服务器上的文档,改变了位置之后,而又希望能使用老URL能访问到,以保持与以前的URL兼容。
IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
当一个HTTP请求的URL为一个目录的时候,服务器返回这个目录中的索引文件。但如果一个目录中不存在缺省的索引文件,并且该服务器又许可显示目录文件列表的时候,就会显示出这个目录中的文件列表,为了使得这个文件列表能具有可理解性,而不仅仅是一个简单的列表,就需要前面的这些设置参数。
如果使用了IndexOptions FancyIndexing选项,可以让服务器产生的目录列
表中针对各种不同类型的文档引用各种图标。而哪种文件使用哪种图标,则使用
下面的 AddIconByEncoding、AddIconByType以及AddIcon来定义,分别依据MIME 的编码、类型以及文件的后缀来判断使用何种图标。如果不能确定文档使用的图标,就使用 DefaultIcon定义的缺省图标。
同样,使用AddDescription可以为不同类型的文档加入不同的描述。并且,
服务器还在目录下,查询使用ReadmeName和HeaderName定义的文件(自动加上 .
html后缀,如果没有发现,再使用.txt后缀进行搜索),如果发现了这些文件,
就在文件列表之前首先显示这些文件的内容,以使得普通目录列表具备更大的可
理解性。
IndexIgnore让服务器在列出文件列表时忽略相应的文件, 这里使用模式配
置的方式定义文件名。
AddEncoding x-compress Z
AddEncoding x-gzip gz
AddEncoding用于告诉一些使用压缩的MIME类型,这样可以让浏览器进行解压缩操作。
AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
AddLanguage it .it
LanguagePriority en fr de
一个HTML文档可以同时具备多个语言的版本,如对于file1.html文档可以具
备file1.html.en、file1.html.fr 等不同的版本,每个语言后缀必须使用 AddLanguage进行定义。这样服务器可以针对不同国家的客户,通过与浏览器进行协商,发送不同的语言版本。而LanguagePriority 定义不同语言的优先级,以便在浏览器没有特殊要求时,按照顺序使用不同的语言版本回应对file1.html 的请求。
这个国际化的能力实际的应用并不多。
#AddType application/x-httpd-php .phtml
#AddType application/x-httpd-php-source .phps
AddType参数可以为特定后缀的文件指定MIME类型,这里的设置将覆盖 mime.types中的设置。
#AddHandler cgi-script .cgi
AddHandler是用于指定非静态的处理类型,用于定义文档为一个非静态的文
档类型,需要进行处理,再向浏览器返回处理结果。例如上面注释中的设置是将以.cgi结尾的文件设置为cgi-script类型,那么服务器将启动这个 CGI程序以进行处理。如果需要在前面AliasScript定义的路径之外执行CGI程序,就需要使用这个参数进行设置,此后以.cgi结尾的文件将被当作CGI程序执行。
在配置文件、这个目录中的.htaccess以及其上级目录的.htaccess中必须允许执行CGI程序,这需要通过Options ExecCGI参数设定。
#AddType text/html .shtml
#AddHandler server-parsed .shtml
另外一种动态进行处理的类型为server-parsed,由服务器自身预先分析网页内的标记,将标记更改为正确的HTML标识。由于server- parsed需要对text/html 类型的文档进行处理,因此首先定义了对应的.shtml为text/html类型。
然而要支持SSI,还要首先要在配置文件(或.htaccess)中使用Options Includes允许该目录下的文档可以为SSI类型,或使用Options IncludesNOExec让执行普通的SSI标志,但不执行其中引用的外部程序。
另一种指定server-parsed类型的方式为使用XBitBack设置选项,如果将 XBitHack设置为On,服务器将检查所有text/html类型的文档(包括.html后缀的文档),如果发现文件属性具备执行位 “x",则服务器就认为它是服务器分析文档,需要服务器进行处理。推荐使用AddHandler进行设置,而将XBitBack 设置为Off,因为使用XBitBack将对所有的HTML文档都执行额外的检查,降低了效率。
#AddHandler send-as-is asis
#AddHandler imap-file map
#AddHandler type-map var
上面被注释的AddHandler用于支持Apache服务器的asis、map和var处理能力
。
# Action media/type /cgi-script/location
# Action handler-name /cgi-script/location
因为Apache内部提供的处理功能有限,因此可以使用Action为服务器定义外
部程序作为可处理的动态文档类型,这些外部程序与标准CGI程序相同,都是对输入的数据处理之后,再输出不同MIME类型的结果。例如要定义一个对特殊后缀wri都先执行wri2txt进行处理操作,再返回结果的操作,可以使用:
Action windows-writer /bin/wri2txt
AddHandler windows-writer wri
更进一步,可以直接使用Action定义对某个MIME类型预先进行处理操作,这
需要例子中第一种格式的Action 参数设置方式。这样设置方式就不再需要额外的AddHandler用来将处理操作与文件后缀联系起来,而是使用Action直接处理MIME类型的文件。但如果文档后缀没有正式的MIME类型,还需要先定义一个MIME类型。
#MetaDir .web
#MetaSuffix .meta
Meta信息是在文档发送给客户之前,预先发送给客户浏览器一些数据,因此
浏览器可以通过HEAD请求来访问这些Meta信息而不必真正通过GET来返回全部文档数据。服务器通常发送给浏览器的是一些标准的HTTP头信息,如果要想增加额外的信息,就需要使用MetaDir来定义Meta数据存放的目录, 而MetaS uffix用于指定包含Meta数据的文件后缀。
#ErrorDocument 500 "The server made a boo boo.
#ErrorDocument 404 /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
#ErrorDocument 402
http://some.other_server.com/subscription_info.html
如果客户请求的网页不存在,或者没有访问权限等情况发生时,服务器将产
生一个错误代码,同时也将回应客户浏览器一个标识错误的网页。
ErrorDocument就用于设置当出现哪个错误时应该回应客户浏览器那些内容,ErrorDocument的第一个参数为错误的序号,第二个参数为回应的数据,可以为简单的文本,本地网页,本地CGI程序,以及远程主机上的网页。
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4.0" force-response-1.0
BrowserMatch "Java/1.0" force-response-1.0
BrowserMatch "JDK/1.0" force-response-1.0
BrowserMatch命令为特定的客户程序,设置特殊的参数,以保证对老版本浏
览器的兼容性,并支持新浏览器的新特性。
#
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# Deny from all
# ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
#
用于设置访问控制的设置主要是针对目录和文件进行设置的,然而也可以针
对不同的URL进行访问控制的设置,这样就不必担心ScriptAlias、Alias是否将路径设置到了受控制的目录之外了。针对URL进行控制的语句为 Location语句,这样不但能对服务器上的文件、CGI提供保护,此外,它还能保护不能找到对应文件,而是由服务器本身提供的特殊功能URL。 http://servername/server-status用于报告当?..器的状态,http: //servername/server-info用于报告Apache 服务器的统计信息。与此相关的设置还有ExtendedStatus参数,可以让服务器输出更详细的的报告。
#
#ProxyRequests On
#
#
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#ProxyVia On
#CacheRoot "/www/proxy"
#CacheSize 5
#CacheGcInterval 4
#CacheMaxExpire 24
#CacheLastModifiedFactor 0.1
#CacheDefaultExpire 1
#NoCache a_domain.com another_domain.edu joes.garage_sale.com
#
Apache服务器本身就具备代理的功能,然而这要求加载入mod_proxy模块。这能使用IfModule语句进行判断,如果存在 mod_proxy模块,就使用ProxyRequests打开代理支持。此后的Directory用于设置对Proxy功能的访问权限设置,以及用于设置缓冲的各个参数设置。
虚拟主机
#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78
#
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common
#
#
缺省设置文件中的这些内容是用于设置命名基础的虚拟主机服务器时使用。
其中NameVirtualHost 来指定虚拟主机使用的IP地址,这个IP地址将对应多个 DNS名字,如果Apache使用了Listen 参数控制了多个端口,那么就可以在这里加上端口号以进一步进行区分对不同端口的不同连接请求。此后,使用 VirtualHost 语句,使用NameVirtualHost指定的IP地址作参数,对每个名字都定义对应的虚拟主机设置。
虚拟主机是在一台Web服务器上,可以为多个单独域名提供Web服务,并且每个域名都完全独立,包括具有完全独立的文档目录结构及设置,这样域名之间完全独立,不但使用每个域名访问到的内容完全独立,并且使用另一个域名无法访
问其他域名提供的网页内容。
虚拟主机的概念对于ISP来讲非常有用,因为虽然一个组织可以将自己的网页挂在具备其他域名的服务器上的下级往址上,但使用独立的域名和根网址更为正式,易为众人接受。传统上,必须自己设立一台服务器才能达到单独域名的目的,然而这需要维护一个单独的服务器,很多小单位缺乏足够的维护能力,更为合适的方式是租用别人维护的服务器。ISP也没有必要为一个机构提供一个单独的服务器,完全可以使用虚拟主机能力,使服务器为多个域名提供Web服务,而且不同的服务互不干扰,对外就表现为多个不同的服务器。
有两种设定虚拟主机的方式,一种是基于HTTP 1.0标准,需要一个具备多IP
地址的服务器,再配置DNS 服务器,给每个IP地址以不同的域名,最后才能配置Apache的配置文件,使服务器对不同域名返回不同的Web文档。由于这需要使用额外的IP地址,对每个要提供服务的域名都要使用单独的IP地址,因此这种方式实现起来问题较多。
可以在一个网络界面上绑定多个IP地址,Linux下需要使用ifconfig的 alias参数来进行这个配置,但此时会影响网络性能。
HTTP 1.1标准在协议中规定了对浏览器和服务器通信时,服务器能够跟踪浏
览器请求的是哪个主机名字。因此可以利用这个新特性,使用更轻松的方式设定
虚拟主机。这种方式不需要额外的IP地址,但需要新版本的浏览器支持。这种方
式已经成为建立虚拟主机的标准方式。
要建立非IP基础的虚拟主机,多个域名是不可少的配置,因为每个域名就对
应一个要服务的虚拟主机。因此需要更改DNS服务器的配置,为服务器增加多个C NAME选项,如:
linux IN A 192.168.1.64
vhost1 IN CNAME linux
vhost2 IN CNAME linux
基本的设置选项都是为了linux主机设定的,如果要为vhost1和vhost2设定
虚拟主机,就要使用VirtualHost语句定义不同的选项,在语句中可以使用配置文件前面中的大部分选项,而可以重新定义几乎所有的针对服务器的设置。
NameVirtualHost 192.168.1.64
DocumentRoot /www/data
ServerName linux.example.org.cn
DocumentRoot /vhost1
ServerName vhost1.example.org.cn
DocumentRoot /vhost2
ServerName vhost2.example.org.cn
这里需要注意的是,VirtualHost的参数地址一定要和NameVirtualHost定义
的地址相一致,必须保证所有的值严格一致,Apache服务器才承认这些定义是为这个IP地址定义的虚拟主机。
此外,定义过NameVirtualHost之后,那么对这个IP地址的访问都被区分不同的虚拟主机进行处理,而对其他IP地址的访问,例如127.0.0.1,才应用前面定义的缺省选项。
posted @
2007-01-25 15:22 Q系列类、方法、变量…… 阅读(390) |
评论 (0) |
编辑 收藏
http://pic1.blueidea.com/logo/logo.htm
posted @
2007-01-25 15:03 Q系列类、方法、变量…… 阅读(428) |
评论 (0) |
编辑 收藏
很多设计师认为做好了企业网站就一定能够做好行业网站的设计,其实对设计来说行业网站和企业网站的设计截然不同,对整个网站的创意、风格、整体框架布局、文字编排、图片的合理利用,空间的合理安排上面等…有着许多诸多的要求,需要考虑的面更广,面对的问题也会更多。对于一名优秀的网站设计师来说不能绝不能放过任何一点小细节,本篇文章简述的是设计师在做行业网站时所需考虑的一些问题。
一、网站风格/创意
风格(style)是抽象的。是指站点的整体形象给浏览者的综合感受。整体形象包括站点的版面布局,色彩,字体,浏览方式等…。如:我们觉得迪斯尼是生动活泼的而IBM则是专业严肃的。每一个网站都会给人们留下的不同感受。这里我们需要做到的是根据网站的定位做出网站特有的风格。除此我们还需要在风格同一上需要把握一下,其实这个风格的统一和传统的印刷出版物没什么区别。你网页上所有的图像、文字,包括像背景颜色、区分线、字体、标题、注脚什么的,都要统一风格,贯穿全站。这样子用户看起来舒服、顺畅,会对你的网站留下一个“很专业”的印象。而企业网站设计师往往就缺乏这一点,没有全局意思。
创意,所谓创意就是不拘一格?某些设计师在做创意的时候大费周章,做出来确实不可否认很有创意、很别致,但往往对于行业网站的客户为什么不能接受呢?此时不要太责怪客户的不识货,应该反思,抓住客户的需求。其实做行业网站不需要很多大的创意,也不要浪费过多的时间去追求如何个性、如何好看,我们只需要一点小小的创意贯穿全站,也许会使网站更生动更具有吸引力、更有思想,比如中国现车交易网(
http://www.chinaxcjy.com/)就是一个很好的案例,它把车的外形融入到网站中,使它脱颖而出。
二、网站LOGO
Logo 顾名思义就是站点的标志图案,logo最重要的就是用图形化的方式传递网站的定位和经营理念、同时便于人们识别。网站logo的设计过程中一般有以下三种思路:1.直接以网站网址作为logo。2.根据网站提供的产品/服务特点展开logo设计。3.以传递网站运营商的经营理念为特色。如:全球五金网 logo(
www.Wjw.cn)三、视觉流程
人们在阅读某种信息时,视觉总有一种自然的流动习惯,先看什么,后看什么,再看什么。在心理学的研究表明,一般的浏览习惯是从上到下、从左到右,在一个平面上,上松下稳而压抑。同样,平面的左松右稳。所以平面的视觉影响力上方强于下方,左侧强于右侧。这样平面的上部和中上部被称为“最佳视域”,也就是最优选的地方。在网页设计中一些突出或推荐的信息通常都放在这个位置。当然这种视觉流程只是一种感觉并非一种固定的公式,只要符合人们的心理顺序和逻辑顺序,就可以更为灵活地运用,在网页设计中,灵活而合理地运用直接影响到传达信息的准确与有效性。
四、网页框架与布局
网页布局大致可分为“国”字型、拐角型、“T”字型、“L”字型、综合框架型、Flash 型、变化型,在这里就不做一一论述了。其实在我们在做设计的时候并没有过多的去考虑什么形式,比如我们在一张纸看到一个圆形的东西,很容易可以联想到它像太阳,而有些人则联想到月亮等等…这都是一种形式比喻,最重要的是抓住客户的需求,把握网站的定位做处合理的框架布局。
1. 分辨率
网页的整体宽度可分为三种设置形式:百分比、象素、象素+百分比。通常在网站建设中以象素形式最为常用,行业网站也不列外。我们在设计网页的时候必定会考虑到分辨率的问题,科技发展到现在我们通常用的是1024*768和800*600的分辨率,现在网络上很多都是用到778个象素的宽度,在800的分辨率下面往往使整个网页很压抑,有种不透气的感觉,其实这个宽度是指在800*600的分辨率上网页的最宽宽度,不代表最佳视觉,不妨试试760~770的象素,不管在1024还是800的分辨率下都可以达到较佳的视觉效果。
2. 合理广告
在目前一些网站的广告(弹出广告、浮动广告、大广告、banner广告、通栏广告等等…)让人觉得很烦琐,更本就不愿意来看,有时连你这个网站都不上了,这样一来网站受到了严重的影响、广告也没达到广告的目的。这些问题都是我们在设计网站之前需要考虑、需要规划的内容之一。
浮动广告有两种,第一种是在网页两边空余的地方可以上下浮动的广告,第二种是满屏幕到处随机移动的广告。建议能使用第一种的情况下尽量使用第一种,不可避免第二种情况时尽量在数量上控制最多一个就好。如果数量过多会直接影响到用户的心理、防挨到用户浏览信息,适得其反。首页广告不宜过多适中即可。如在注册或者某个购买步骤的页面上最好不要出现过多的其他无关的内容让用户分心,避免客户流失等…
3.空间的合理利用
很多的网页都具有一个特点,用一个字来形容,那就是“塞”,它将各种各样的信息如文字、图片、动画等不加考虑的塞到页面上,有多少挤多少,不加以规范,导致浏览时会遇到很多的不方便,主要就是页面主次不分,喧宾夺主,要不就是没有重点,没有很好的归类,整体就像各大杂烩。让人难以找到需要的东西。有的则是一片空白失去平衡,也可以用个“散”字来形容。
并非要把整个页面塞满了才不觉得空,也并非让整个页面空旷才不觉得满,只要合理的安排、有机的组合,使页面达到平衡,既使在一边的部分大面积留空,同样不会让人感到空,相反这样会给人留下广阔的思考空间,给人回味又达到了视觉效果。
4.文字编排
在网页设计中,字体的处理与颜色、版式、图形化等其他设计元素的处理一样非常关键。
4.1文字图形化
文字图形化就是将文字用图片的形式来表现,这种形式在页面的子栏目里面最为常用,因为它具有突出,同时又美化了页面,使页面更加人性化加强了视觉效果。是文字无法达到的。对于通用性的网站弊端就是扩展性不强。
4.2强调文字
如果将个别文字作为页面的诉求重点,则可以通过加粗、加下划线、加大号字体、加指示性符号、倾斜字体、改变字体颜色等手段有意识地强化文字的视觉效果,使其在页面整体中显得出众而夺目。这些方法实际上都是运用了对比的法则。如果在更新频率低的情况下也可以使用文字图形化。
五、网站配色
1.用一种色彩。这里是指先选定一种色彩,然后调整透明度或者饱和度,(说得通俗些就是将色彩变淡或则加深),产生新的色彩,用于网页。这样的页面看起来色彩统一,有层次感。
2.用两种色彩。先选定一种色彩,然后选择它的对比色(在Photoshop里按ctrl+shift+I)再进行微小的调整。整个页面色彩丰富但不花稍。
3.用一个色系。简单的说就是用一个感觉的色彩,例如淡蓝,淡黄,淡绿;或者土黄,土灰,土蓝。也就是在同一色系里面采用不同的颜色使网页增加色彩,而又不花,色调统一。这种配色方法在网站设计种最为常用。
4.灰色在网页设计中又称为“万能色”,其特点是可以和任何颜色搭配,在使用时把握量避免网页变灰。
在网页配色中,尽量控制在三种色彩以内,以避免网页花、乱、没有主色的显现。背景和前文的对比尽量要大,(绝对不要用花纹繁复的图案作背景),以便突出主要文字内容、也使用户在浏览信息的时候不会觉得累。
六、常见问题
6.1分解大型表格
为了加快网页的浏览速度,尽可能避免用大型表格,因为浏览器必须等待整个表格的内容全部到达客户端,才能显示这个表格的内容,而文本或图像则是一边下载一边显示。同时我们制作网页时要尽量减少表格的深度、表格复杂化,这一点尤为重要可直接影响网页浏览速度、又给后面的程序添加带来了不必要的麻烦。
6.2网站导航要清晰
“您所在位置”在大型网站中是不可缺少的一部分,其作用表明您现在所处在的位置,使用户不会不知东西南北迷失在网站中。其次还有读者进入目的页的点击次数,不能超过三次。如果三次以上还找不到用户所要的信息,人家可就没有耐心陪你玩了!
6.3图片注解
在很多网站上我们都可以找到一个共同的缺点,当网速慢时有很图片都无法显示,又没有注解使得用户反感,如在注册时的按钮是图片做的又没加图片注解,而导致连注册都找不到,如果加了注解这些问题也就不成问题了!
6.4系统按钮
在我们做按钮的时候,要做成“按钮”的形式(type="button"),而不要做成“提交表单”的形式(type="submit"),方便以后程序设计。
6.5空链接、死链接
在一个优秀、专业的网站上是找不到任何一个空链接或死链接的情况,如果有这种情况会影响到用户对您网站的评价,所以我们在制作的时候尽量避免,避免办法就是提前做好链接,如果尚未完成的页面则链上“建设中…”的页面,加以解释。
6.6导航条
在大型的行业网站里面主导航条最好是用文字形式,避免使用图片或Flash做导航条、缩小网站扩展性。
6.7网站的扩展性
对于一个行业网站而言,网站的扩展性是相当重要的,随时都要考虑到网站需求的变化!
posted @
2007-01-25 14:49 Q系列类、方法、变量…… 阅读(374) |
评论 (0) |
编辑 收藏
一.前期准备工作
>> 明确市场定位
企业正式开发和建设一个WEB网站之前,须先清楚网站所提供产品或服务的对象是哪类群体—这是一个非常关键的问题。如果你的目标市场是那些富有的商业专业人士,那么网站设计应大方得体,简洁易用;但如果是年轻些的客户群体,则可以把版面做的生动活泼一些。总之要因人制宜。要记住:网站是要让目标客户看的,并吸引他们购买,所以永远要把客户的感受放在第一位。
>> 确定网站主题
企业的WEB网站应具有清晰鲜明的主题。要让访问者在读到主页的第一段话之后就能清楚该网站大致是做什么的,而且可以迅速了解到网站所提供的产品或服务。若网站提供了多种不同产品,不要把所有产品都罗列到一个网页中,我们建议大家分门别类,并对每种产品均设立相应的产品页。
>> 色彩选择及搭配
网站给用户留下第一印象的既不是网站丰富的内容,也不是网站合理的版面布局,而是网站的色彩。不同的色彩搭配会产生不同的效果,并可能影响到访问者的情绪。一个网站设计成功与否,在某种程度上取决于设计者对色彩的运用和搭配。因而确定网站的标准色彩是相当重要的一步。
色彩的数量:网站整体使用色彩以两到三种为宜。颜色过多会使网页看起来很花哨,但缺乏内在的美感。在颜色选择和搭配上可借鉴一些国际大公司网站,他们对颜色的选择相当审慎。
色彩的搭配:色彩搭配一定要合理,给人以和谐愉快的感觉。一般来说,适合于网页标准色的颜色有蓝色,黄/橙色,黑/灰/白色三大系列色。在颜色的搭配上,有几种比较经典的方案:红/黄/白; 蓝/白; 红/灰/白; 蓝/橙/白; 黄/灰/白。实在不行就去Google一下吧,找一个自己喜欢的网站,看看人家的颜色是怎么搭配使用的,或许会对你大有启发。
其它注意事项:避免采用纯度很高的单一色彩,这样容易造成视觉疲劳。避免使用过于明亮或对比过于强烈的颜色,它们会对眼睛造成伤害,如白底黄字等等。颜色对比过于接近或不合理的,如深底浅字,深底深字等(例如深蓝色底和黑字)也是设计之大忌。建议最好用浅色背景(当然白色最好),黑或深色文字。
>> 遵循K.I.S.S理念
老话说的好:Keep It Simple Stupid。Stupid在这里指“拙朴”,即务求最简洁直观。该设计理念被奉为网站设计、搜索引擎优化和网上商务的黄金规则之一。如果你的网站无法为访问者提供最直接的产品或服务信息,就等于你在把自己的潜在客户往竞争对手的网站上送。
二.设计三要素
无论一个网站是出于什么目的,若想取得最大的成功,则须保证网站的便利、快速和便宜。这是网站设计中最基本的三个要素。
要素一:便利性
保证客户可以用最小的努力得到他们要找的资料信息。要做到这样,你必须确保网站为用户提供了充分的便利性。根据这一原则,我们在网站设计中应:
>> 建立良好网站结构
在设计时不单需要考虑站点的外观是否漂亮,还需要考虑到搜索引擎是否能够很好地支持你的设计结构。我们不建议大家使用下面这些设计形式:
- Frames结构:具有导航清晰且方便维护的优点,但搜索引擎对这类网站在索引上仍有一定难度。
- Flash动画:网页视觉效果较好,但搜索引擎同样在检索上存在一定难度,而且影响网页的打开速度。
- 纯图片网页:搜索引擎一般认为这样的网站没有为用户提供实质的信息内容,因而是无足轻重的。
- 动态页面:具有容易维护和更新的优点,但必须了解:并非所有的搜索引擎都能够象对待静态页面一样来对待动态页面,此外宜使动态页面的参数可能少。
- Javascript/Java Applets:搜索引擎不支持Java Applets,此外Java设计的网站往往会影响网页的打开速度。
>> 内容第一,形式其次
与其在网站的图片和颜色上下足工夫,不如多花点时间在网站的内容上—客户最关心的莫过于产品的性能,质量等等。只要你的内容足够吸引人,即使象白底黑字般简单的设计也远远胜过那些华丽的版面设计。
>> 内容更新与沟通
企业Web站点建好后应不断补充以新的内容。站点信息的不断更新不但可以让浏览者了解到企业的发展动态,同时也会帮助企业建立良好的形象。
>> 增强网站可信度
互联网的非个人性容易使网民滋生某种程度的不信任感。你的客户是否能够信任你,这其实完全取决于你。
建议:可从以下几方面着手来增强网站的可信度
- 网站内容信息的完整性及真实可信性
- 网站导航清晰,更新及时且无错误链接
- 专业的网站设计
- 网站显著位置列出个人信息保密声明(隐私保护条款)
- 网站显著位置列出服务条款信息
- 清楚地说明所有收费项目
- 对顾客服务咨询做出快速回应
- 对网上支付,清楚说明如何保护信用卡信息
- 向客户发送交易确认电子邮件
- 对网站上发表的文章明确说明作者及来源
- 避免链接到不相关或者低质量的站点
>> 提供退款承诺
如果要向客户表明你的产品或服务的质量,再没有比这更好的办法了。
>> 提供便捷付款
作为世界上最成功的“网络零售业”典范之一,网上超市亚马逊(Amazon.com)年销售额达数十亿美元的骄人成绩一部分原因恐怕就要归功于其付款手续的便捷性。
对网上销售服务应确保整个付款手续清楚易用。尽量简化付款步骤,除了交易所必须的信息之外,千万别要求客户提供其它个人信息。
可经常查看网络日志中关于客户付款方面的信息。若总出现客户付款中途放弃退出的情况,则需要重新检查付款手续是否欠妥。
>> 充分利用客户推荐信息
一个网站上提供了客户对其产品或服务的推荐或赞赏性的话,则在一定程度上可以提高公司和产品的可信性。所以要充分利用客户或准客户对公司或产品的赞赏性的话语,不过在网上发布之前先须征得他们的同意。
>> 提供产品小贴士信息
从细节着手,向客户提供一些针对产品或服务所出现的问题的简单解决方案。
posted @
2007-01-25 14:38 Q系列类、方法、变量…… 阅读(328) |
评论 (0) |
编辑 收藏
这是一篇很好的总结文章,关于界面设计一些基本原则归纳,在设计的时候很有帮助
本文列举Jeff Johnson:《GUI设计禁忌》一书中提及的明确针对Web设计和笔者认为对Web设计有参考意义的设计原则和禁忌。设计Web项目时尽量参考一下基本原则,避免设计禁忌,应该能使Web项目的GUI上一个层次。
基本原则:
1、关注用户及其任务,而不是技术
2、首先考虑功能,然后才是表示
3、从用户的视角看问题,使用用户的词汇进行描述
4、不要向用户暴露实现细节
5、使常用的用户任务简单化,不要让用户解决额外的问题
6、保持一致性,引导用户的使用习惯
7、保持显示惯性,传递信息,而不仅仅是数据
8、设计应满足响应需求
禁忌:
1、同一页面包含重复功能的链接或按钮
2、将复选框用作单选按钮
3、无初始值的多选一设置
4、在非开/关设置中使用复选框
5、用文本框显示只读数据
6、单选按钮之间间隔太大
7、属性标记对齐方式不一致
8、当前无效的控件不充分置灰
9、显示对用户无意义的错误提示
10、不同的类型页面窗口显示相同的标题
11、窗口的标题和调用的命令不一致
12、要求用户输入随机数
13、相似的功能却有不一致的用户操作界面
14、取消按钮无法真正取消操作
15、网站结构反映公司的结构或网站升级的历史
16、返回按钮不能达到预期的目的
17、搜索选项过多,过度复杂
18、使用容易被忽略的隐藏的图片链接
19、需要向下滚动才能看到当前页的重要信息
20、图片按钮对鼠标按下操作没有视觉变化
21、无意义的虚假进度条
22、执行长时间的任务时鼠标指针不显示成忙状态
23、不考虑用户可能的人为的错误输入
24、认为好的UI就是漂亮的UI
25、盲目错误的使用页面模块化设计
posted @
2007-01-25 14:35 Q系列类、方法、变量…… 阅读(402) |
评论 (0) |
编辑 收藏
探讨形式美的法则,是所有设计学科共通的课题,那么,它的意义何在呢?在日常生活中,美是每一个人追求的精神享受。当你接触任何一件有存在价值的事物时,它必定具备合乎逻辑的内容和形式。在现实生活中,由于人们所处经济地位、文化素质、思想习俗、生活理想、价值观念等不同而具有不同的审美观念。然而单从形式条件来评价某一事物或某一视觉形象时,对于美或丑的感觉在大多数人中间存在着一种基本相通的共识。这种共识是从人们长期生产、生活实践中积累的,它的依据就是客观存在的美的形式法则,我们称之为形式美法则。在我们的视觉经验中,高大的杉树、耸立的高楼大厦、巍峨的山峦尖峰等,它们的结构轮廓都是高耸的垂直线,因而垂直线在视觉形式上给人以上升、高大、威严等感受;而水平线则使人联系到地平线、一望无际的平原、风平浪静的大海等,因而产生开阔、徐缓、平静等感受…… 这些源于生活积累的共识,使我们逐渐发现了形式美的基本法则。在西方自古希腊时代就有一些学者与艺术家提出了美的形式法则的理论,时至今日,形式美法则已经成为现代设计的理论基础知识。在设计构图的实践上,更具有它的重要性。形式美法则主要有以下几条:
和谐
对比与统一
对称
均衡
比例
视觉重心
节奏与韵律
联想与意境
和谐
宇宙万物,尽管形态千变万化,但它们都各按照一定的规律而存在,大到日月运行、星球活动,小到原子结构的组成和运动,都有各自的规律。爱因斯坦指出:宇宙本身就是和谐的。和谐的广义解释是:判断两种以上的要素,或部分与部分的相互关系时,各部分所给我们的感受和意识是一种整体协调的关系。和谐的狭义解释是统一与对比两者之间不是乏味单调或杂乱无章。单独的一种颜色、单独的一根线条无所谓和谐,几种要素具有基本的共通性和溶合性才称为和谐。比如一组协调的色块,一些排列有序的近似图形等。和谐的组合也保持部分的差异性,但当差异性表现为强烈和显著时,和谐的格局就向对比的格局转化。
对比与统一
对比又称对照,把反差很大的两个视觉要素成功地配列于一起,虽然使人感受到鲜明强烈的感触而仍具有统一感的现象称为对比,它能使主题更加鲜明,视觉效果更加活跃。对比关系主要通过视觉形象色调的明暗、冷暖,色彩的饱和与不饱和,色相的迥异,形状的大小、粗细、长短、曲直、高矮、凹凸、宽窄、厚薄,方向的垂直、水平、倾斜,数量的多少,排列的疏密,位置的上下、左右、高低、远近,形态的虚实、黑白、轻重、动静、隐现、软硬、干湿等多方面的对立因素来达到的。它体现了哲学上矛盾统一的世界观。对比法则广泛应用在现代设计当中,具有很大的实用效果。
对称
自然界中到处可见对称的形式,如鸟类的羽翼、花木的叶子等。所以,对称的形态在视觉上有自然、安定、均匀、协调、整齐、典雅、庄重、完美的朴素美感,符合人们的视觉习惯。平面构图中的对称可分为点对称和轴对称。假定在某一图形的中央设一条直线,将图形划分为相等的两部分,如果两部分的形状完全相等,这个图形就是轴对称的图形,这条直线称为对称轴。假定针对某一图形,存在一个中心点,以此点为中心通过旋转得到相同的图形,即称为点对称。点对称又有向心的“求心对称”,离心的“发射对称”,旋转式的“旋转对称”,逆向组合的“逆对称”,以及自圆心逐层扩大的“同心圆对称”等等。在平面构图中运用对称法则要避免由于过分的绝对对称而产生单调、呆板的感觉,有的时候,在整体对称的格局中加入一些不对称的因素,反而能增加构图版面的生动性和美感,避免了单调和呆板。
均衡
在衡器上两端承受的重量由一个支点支持,当双方获得力学上的平衡状态时,称为平衡。在平面构成设计上的平衡并非实际重量×力矩的均等关系,而是根据形象的大小、轻重、色彩及其他视觉要素的分布作用于视觉判断的平衡。平面构图上通常以视觉中心(视觉冲击最强的地方的中点)为支点,各构成要素以此支点保持视觉意义上的力度平衡(如图。在实际生活中,平衡是动态的特征,如人体运动、鸟的飞翔、野兽的奔驰、风吹草动、流水激浪等都是平衡的形式,因而平衡的构成具有动态。r
比例
比例是部分与部分或部分与全体之间的数量关系。它是精确详密的比率概念。人们在长期的生产实践和生活活动中一直运用着比例关系,并以人体自身的尺度为中心,根据自身活动的方便总结出各种尺度标准,体现于衣食住行的器用和工具的制造中。比如早在古希腊就已被发现的至今为止全世界公认的黄金分割比1:1. 618正是人眼的高宽视域之比。恰当的比例则有一种谐调的美感,成为形式美法则的重要内容。美的比例是平面构图中一切视觉单位的大小,以及各单位间编排组合的重要因素。
视觉重心
重心在物理学上是指物体内部各部分所受重力的合力的作用点,对一般物体求重心的常用方法是:用线悬挂物体,平衡时,重心一定在悬挂线或悬挂线的延长线上;然后握悬挂线的另一点,平衡后,重心也必定在新悬挂线或新悬挂线的延长线上,前后两线的交点即物体的重心位置。在平面构图中,任何形体的重心位置都和视觉的安定有紧密的关系。人的视觉安定与造形的形式美的关系比较复杂,人的视线接触画面,视线常常迅速由左上角到左下角,再通过中心部分至右上角经右下角,然后回到以画面最吸引视线的中心视圈停留下来,这个中心点就是视觉的重心。但画面轮廓的变化,图形的聚散,色彩或明暗的分布等都可对视觉重心产生影响。因此,画面重心的处理是平面构图探讨的一个重要的方面。在平面广告设计中,一幅广告所要表达的主题或重要的内容信息往往不应偏离视觉重心太远。
节奏与韵律
节奏本是指音乐中音响节拍轻重缓急的变化和重复。节奏这个具有时间感的用语在构成设计上是指以同一视觉要素连续重复时所产生的运动感。
韵律原指音乐(诗歌)的声韵和节奏。诗歌中音的高低、轻重、长短的组合,匀称的间歇或停顿,一定地位上相同音色的反复及句末、行末利用同韵同调的音相加以加强诗歌的音乐性和节奏感,就是韵律的运用。平面构成中单纯的单元组合重复易于单调,由有规则变化的形象或色群间以数比、等比处理排列,使之产生音乐、诗歌的旋律感,称为韵律。有韵律的构成具有积极的生气,有加强魅力的能量。
联想与意境
平面构图的画面通过视觉传达而产生联想,达到某种意境。联想是思维的延伸,它由一种事物延伸到另外一种事物上。例如图形的色彩:红色使人感到温暖、热情、喜庆等;绿色则使人联想到大自然、生命、春天,从而使人产生平静感、生机感、春意等等。各种视觉形象及其要素都会产生不同的联想与意境,由此而产生的图形的象征意义作为一种视觉语义的表达方法被广泛地运用在平面设计构图中。
随着科技文化的发展,对美的形式法则的认识将不断深化。形式美法则不是僵死的教条,要灵活体会,灵活运用。
posted @
2007-01-25 13:53 Q系列类、方法、变量…… 阅读(608) |
评论 (0) |
编辑 收藏
为了使界面设计有步奏,流程清晰明了. 所以对界面按系统设计划分层次. 界面设计时可分以下三个设计层次.
1 结构设计层:
产品的整体架构, 纸上完成的低保真原型.它主要是用来确定软件的结构,如:控件如何布局,窗体闲的如何切换。由设计师在纸上或一些工具上实现的不带数据流的简单界面原型.
2 视觉设计层:
根据结构层, 在原型的基础上,对影响用户视觉的界面元素层(负责显示信息,图片的层)以人机交互机制为依据进行进一步的设计.如:界面颜色,信息显示方式, 图标使用,字体大小颜色设定等.
3 交互设计层:
对届面中与影响用户操作的元素, 如操作反馈, 语言用法等,根据机制进行的设计。
为了设计者有规可循,根据用户界面设计的目标 ,制定了一些机制,可为开发人员的设计标准.
用户界面设计要以用户为中心,处处为用户设想。所以必须以用户为目标出发,从界面的元素,布局, 信息流,用户操作环境及人的心理生理特点出发,设立以下的机制。
1.界面布局机制
软件界面中人接触最多的,也是界面的基础。它与人的视觉, 记忆,手部操作都有关。
因此这机制的目标: 提高界面的可读性,舒适性,使操作时间最短
2.信息输出输入机制
界面与用户最基本的交流就是信息,因此需建立此机制。它与人的视觉, 记忆,手部操作都有关。
目标: 人性化,使用户明白系统所输入输出的信息, 减轻人脑和手的负担
3.防错机制
是人都会有错, 但是并不意味着让错误发生,尽量减少错误的发生,至少也不要增加不必要的错误。
目标: 尽量防止因人为或系统原因而产生错误
4.窗体闲切换机制
界面最常发生的是窗体切换, 也要考虑到对人得影响。
目标:使窗体闲切换更合理和方便
5.系统帮助机制
软件都少不了帮助系统, 因此也该考虑。
目标:减轻人脑和手的负担, 使系统更易用
6.系统反馈机制
反馈是系统与用户交互的基本元素之一, 也是常发生的 。所以也需为其定下机制。
目标:防止用户因不了解系统当前状态而犯错, 不耐烦, 不能及时处理工作
7.冗余机制
根据第二定律所设下的机制。
目标: 减少系统干扰用户, 加快执行速度
8.一致性机制
本来它是机制中的一个原则, 但是它却存在于各个机制中, 因此需另外提出以视强调~
posted @
2007-01-25 13:50 Q系列类、方法、变量…… 阅读(184) |
评论 (0) |
编辑 收藏
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键
<table border oncontextmenu=return(false)><td>no</table> 可用于Table
2. <body onselectstart="return false"> 取消选取、防止复制
3. onpaste="return false" 不准粘贴
4. oncopy="return false;" oncut="return false;" 防止复制
5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标
6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标
7. <input style="ime-mode:disabled"> 关闭输入法
8. 永远都会带着框架
<script language="javascript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
// --></script>
9. 防止被人frame
<SCRIPT LANGUAGE=javascript><!--
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>
10. <noscript><iframe src=*.html></iframe></noscript> 网页将不能被另存为
11. <input type=button value=查看网页源代码
onclick="window.location = 'view-source:'+ '
http://www.csdn.net/'">12. 怎样通过asp的手段来检查来访者是否用了代理
<% if Request.ServerVariables("HTTP_X_FORWARDED_FOR")<>"" then
response.write "<font color=#FF0000>您通过了代理服务器,"& _
"真实的IP为"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")
end if
%>
13. 取得控件的绝对位置
//javascript
<script language="javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"nleft="+l);
}
</script>
//VBScript
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
--></script>
14. 光标是停在文本框文字的最后
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart('character',e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">
15. 判断上一页的来源
asp:
request.servervariables("HTTP_REFERER")
javascript:
document.referrer
16. 最小化、最大化、关闭窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" value="Close"></OBJECT>
<input type=button value=最小化 onclick=hh1.Click()>
<input type=button value=最大化 onclick=hh2.Click()>
<input type=button value=关闭 onclick=hh3.Click()>
本例适用于IE
17.
<%
'定义数据库连接的一些常量
Const adOpenForwardOnly = 0 '游标只向前浏览记录,不支持分页、Recordset、BookMark
Const adOpenKeyset = 1 '键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
Const adOpenDynamic = 2 '动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
Const adOpenStatic = 3 '静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动
Const adLockReadOnly = 1 '锁定类型,默认的,只读,不能作任何修改
Const adLockPessimistic = 2 '当编辑时立即锁定记录,最安全的方式
Const adLockOptimistic = 3 '只有在调用update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等
Const adLockBatchOptimistic = 4 '当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的
Const adCmdText = &H0001
Const adCmdTable = &H0002
%>
18. 网页不会被缓存
HTM网页
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">
ASP网页
Response.Expires = -1
Response.ExpiresAbsolute = Now() - 1
Response.cachecontrol = "no-cache"
PHP网页
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
19. 检查一段字符串是否全由数字组成
<script language="javascript"><!--
function checkNum(str){return str.match(/D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>
20. 获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight
21. 怎么判断是否是字符
if (/[^x00-xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");
22.TEXTAREA自适应文字行数的多少
<textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>
23. 日期减去天数等于第二个日期
<script language=javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
}
cc("12/23/2002",2)
</script>
24. 选择了哪一个Radio
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>
25.获得本页url的request.servervariables("")集合
Response.Write "<TABLE border=1><!-- Table Header --><TR><TD><B>Variables</B></TD><TD><B>value</B></TD></TR>"
for each ob in Request.ServerVariables
Response.Write "<TR><TD>"&ob&"</TD><TD>"&Request.ServerVariables(ob)&"</TD></TR>"
next
Response.Write "</TABLE>"
26.
本机ip<%=request.servervariables("remote_addr")%>
服务器名<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间<%=now%>
IIS版本<%=Request.ServerVariables"SERVER_SOFTWARE")%>
脚本超时时间<%=Server.ScriptTimeout%>
本文件路径<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎<%=ScriptEngine & "/"& ScriptEngineMajorVersion &"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统<%=Request.ServerVariables("OS")%>
27.ENTER键可以让光标移到下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">
28. 检测某个网站的链接速度:
把如下代码加入<body>区域中:
<script language=javascript>
tim=1
setInterval("tim++",100)
b=1
var autourl=new Array()
autourl[1]="
http://www.njcatv.net/"autourl[2]="javacool.3322.net"
autourl[3]="
http://www.sina.com.cn/"autourl[4]="
www.nuaa.edu.cn"autourl[5]="
http://www.cctv.com/"function butt(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO onclick=window.open(this.form.url"+i+".value)><br/>")
document.write("<input type=submit value=刷新></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="链接超时"}
else
{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}
b++
}
function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl[i]+"/"+Math.random()+" width=1 height=1 onerror=auto('
http://"/;;;;;+autourl[i]+"')>")}
run()</script>
29. 各种样式的光标
auto :标准光标
default :标准箭头
hand :手形光标
wait :等待光标
text :I形光标
vertical-text :水平I形光标
no-drop :不可拖动光标
not-allowed :无效光标
help :?帮助光标
all-scroll :三角方向标
move :移动标
crosshair :十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize
1、 去掉IE的滚动条
有时候做好的网页明明没有超出窗口,可IE却偏偏给加上滚动条,这样看上去很不舒服,其实这也是可以通过一些小技巧避免的。具体如下:
<body style=”overflow-x:hidden”>…</body> //去掉X轴方向的滚动条
<body style=”overflow-y:hidden”>…</body> //去掉Y轴方向的滚动条
<body style=”overflow:hidden”>…</body> //去掉全部的滚动条
现在你看到的和你想像中的网页应该一样了吧,如果其中有什么不明白的地方可以参照注释中的说明。
2、 使网页中的复制无效
有方法防止网页被保存了(参见《你别看我的源代码》),可不可以也防止网页内容被复制呢?答案是当然可以。看看下面的例子你就会明白的。
<html>
<head>
<script language=”javascript”>
function nocopy() {
alert(“对不起,你不能非法复制本站内容”);
event.returnvalue=false;
}
</script>
</head>
<body oncopy=”nocopy()”>copyright by commander.</body>
</html>
这其实中是利用了document的一个oncopy事件,也就是说当发生复制事件时,弹出警告框,同时事件(event)的返回值为false使oncopy事件失效,从而达到防止复制的目的。
3、 用脚本控制浏览器
看到标题是不是有点不相信,那么试试下面的这几个例子吧!你一定会吃惊的。
在<body>和</body>之间加入如下代码:
<button onclick=”document.execCommand('open')”>打开</button>
<button onclick=”document.execCommand('saveas')”>另存为…</button>
<button onclick=”document.execCommand('print')”>打印</button>
上面其实都是利用了document.execCommand()这个内置的函数,其参数为相应的浏览器命令,还有很多命令就留给大家自己发现吧!
4、 IFrame也可以编辑文字
有没有想过除了表单(<form>)之外还有其它的网页元素可以编辑文字呢?只要使用IFrame的隐藏的一个属性就可以使IFrame成为一个文本编辑器。
<html>
<body onload=”editer.document.designMode='On'”>
<IFrame ID=”editer”></IFrame>
</body>
</html>
其中designMode属性表示IFrame的设计模式的状态(开/关),还在犹豫什么呢,快试试吧!
只要巧妙的利用这一特性就可以制作很多意想不到的效果。如果下面我们来做一个图片编辑器。
<html>
<body onload=”imgEditer.document.designMode='On';imgEditer.document.write('<img src=图片.gif>')”>
<IFrame id=”imgEditer”></IFrame>
</body>
</html>
用鼠标点击图片是不是有新的发现,其实大家只要利用自己的想象和充分利用这个属性一定能做出更多的花样来,别忘了到时候有什么新的东东,告诉我一声呀!(Email:BluePBoy@yesky.com)
5、 打开硬盘
这是打开硬盘的另一种方法,把它写出来只是想告诉大家,要达到同一个目的有很多种方法,这里就是利用了表单的Action属性达到的,其实打开硬盘有很多种方法,只是这种不太被人们注意,所以这里就选择了这种方法。
<form action=file ://c|><input type=”submit” value=”打开C盘”></form>
posted @
2007-01-25 13:48 Q系列类、方法、变量…… 阅读(237) |
评论 (0) |
编辑 收藏
正度纸张:787×1092mm
开数(正度) 尺寸 单位(mm)
全开 781×1086
2开 530×760 3开 362×781
4开 390×543 6开 362×390
8开 271×390
16开 195×271
注:成品尺寸=纸张尺寸-修边尺寸
大度纸张:850*1168mm
开数(正度) 尺寸 单位(mm)
全开 844×1162
2开 581×844 3开 387×844
4开 422×581 6开 387×422
8开 290×422
注:成品尺寸=纸张尺寸-修边尺寸
常见开本尺寸(单位:mm)
开本尺寸:787 x 1092
对开:736 x 520
4开:520 x 368
8开:368 x 260
16开:260 x 184
32开:184 x 130
开本尺寸(大度):850 x 1168
对开:570 x 840
4开:420 x 570
8开:285 x 420
16开:210 x 285
32开:203 x 140
正度纸张:787×1092mm
开数(正度) 尺寸 单位(mm)
全开 781×1086
2开 530×760
3开 362×781
4开 390×543
6开 362×390
8开 271×390
16开 195×271
注:成品尺寸=纸张尺寸-修边尺寸
大度纸张:850*1168mm
开数(正度) 尺寸 单位(mm)
全开 844×1162
2开 581×844
3开 387×844
4开 422×581
6开 387×422
8开 290×422
注:成品尺寸=纸张尺寸-修边尺寸
16开 大度:210×285 正度:185×260
8开 大度:285×420 正度:260×370
4开 大度:420×570 正度:370×540
2开 大度:570×840 正度:540×740
全开 大:889×1194 小:787×1092
名片
横版:90*55mm<方角> 85*54mm<圆角>
竖版:50*90mm<方角> 54*85mm<圆角>
方版:90*90mm 90*95mm
IC卡 85x54MM
三折页广告
标准尺寸: (A4)210mm x 285mm
普通宣传册
标准尺寸: (A4)210mm x 285mm
文件封套
标准尺寸:220mm x 305mm
招贴画:
标准尺寸:540mm x 380mm
挂旗
标准尺寸:8开 376mm x 265mm
4开 540mm x 380mm
手提袋:
标准尺寸:400mm x 285mm x 80mm
信纸 便条:
标准尺寸:185mm x 260mm 210mm x 285mm~
posted @
2007-01-25 13:47 Q系列类、方法、变量…… 阅读(160) |
评论 (0) |
编辑 收藏
通过基本色调生成10种不同灰度的相同色,并且能生成png文件。
http://slayeroffice.com/tools/color_palette/4096 Color Wheel Version 2.1
非常漂亮的自然色抓取工具,用鼠标点取颜色,非常方便。
http://www.ficml.org/jemimap/style/color/wheel.htmltechnicolor
用鼠标拖动滑杆,再根据基色生成系统推荐的色调,最棒的是还能根据你选择的颜色生成标准的css文件。
http://www.themaninblue.com/experiment/Technicolor/color scheme generator 2
这也许是至今为止最专业的调色板了。不但能根据选择的基色生成相关的配色方案,还有根据颜色的饱和度,明亮度等等只有在photoshop里看见的调节功能,系统还提供推荐方案,有专门为色盲和色弱者推荐的颜色方案。
http://wellstyled.com/tools/colorscheme/index-en.htmlcolr.org
从网站Url就能看出这也是一个专业的color site。color.org最酷的就是应用了tag,你可以输入forest(森林)这个词,系统自动根据你给出的词生成相关的颜色方案,输入love 后我得到的大多是粉红基色调,很准确吧!系统有11000多种颜色tag和20000种颜色方案、7000多个调色板。当然,这个tag。。这个tag不支持中文的...
http://colr.org/color blender
这个也是一个很有特色的调色板。输入两种截然不同的颜色,系统根据这两种颜色生成渐变色带。
http://www.meyerweb.com/eric/tools/color-blend/color schemer v2
这个是color scheme generator 2的另一个版本
http://www.colorschemer.com/online.htmlvisibone color lab
这是第一个根据网页安全色制作的调色板,使用简单,鼠标不停的点,直到碰上让你感觉满意的效果。
http://www.visibone.com/colorlab/RGB color charts
基于RGB原理的,不过系统生成的颜色很舒服。
http://lodestone.org/people/maria/design/colors.htmlfull screen picker
这是一个基于浏览器的颜色拾取器,想必下,这种工具还是使用客户端的程序比较方便些。
http://milov.nl/iambald/24.htmlcolormixers
一边拉滑杆,一边看颜色的变化,相当方便。
http://colormixers.com/mixers/cmr/以下也是一些color tools的相关链接:
http://www.colormatch.dk/http://slayeroffice.com/tools/color_palette/http://kohaistyle.com/scripts/quickcolorhttp://www.easyrgb.com/harmonies.phphttp://www.stcsig.org/usability/topics/colorblind.htmlhttp://color.twysted.nethttp://www.coolhomepages.com/cda/colorhttp://www.masternewmedia.org/2003/04/30/http://dev.sessions.edu/ilu/ilu_1.htmlhttp://www.technetguru.com/designhttp://www.mundidesign.com/webcthttp://graphicdesign.about.com/library/color/blweb2.htmhttp://www.pourpre.com/chromograf/en/http://www.webwhirlers.com/colors/wizard.asphttp://www.colorcoordinator.com/colorCoordinator.php当前最热门的十种颜色:
Moroccan blue :#081b55
Glazed ginger:#da4912
American beauty:#d31112
Ruby wine:#780e1a
Atmosphere:#c4a47b
Burnt olive:#565d10
Gloxinia:#530752
Rattan:#ffdc28
Moss:#a9a40c
Burnt orange:#fe690d
posted @
2007-01-24 15:01 Q系列类、方法、变量…… 阅读(366) |
评论 (0) |
编辑 收藏
提高blog访问量的秘技与非秘技提高blog访问量的秘技与非秘技
注:这里的Blog主要指在Blog托管网站申请的个人Blog
1、尽早申请blog,早申请一天就多一天被点击。比如LoveBNU的blog,除了量大以外,能高居前列最关键是申请得早......ft,呵呵
2、记住,"参数设置"是一个好东西,你可以在任何时候,不需要更新文章,改动一个参数,你的blog就会被列入首页"最新更新"之中......半个小时或者一个小时以后,虽然你从最新更新表上落了下来,你可以将上面更改过的参数改回来。(不准砸我鸡蛋,老婆说不让我告诉大家的,呜呜,我可承受了压力才说出来的,可以比得上315晚会揭黑批劣的英雄啊)
3、你的内容还是要好。但其实好是骗人的,不好照样可以,那你得持续更新啊......比如不断更新,告诉大家你是一个正正经经的blogger,blog是你的"生活方式",所以你需要每天叫嚷一下,"我更新了"。
4、好酒不怕巷子深,真的,如果你没打算卖,只想留着自己喝。可是如果你打算兜售一下自己,而且有暴露癖好,那一定要去各大版面贴广告。这是一个持续的行为,要把握一切机会,在bbs的各个版面随时以各种方式提到自己的blog。方法如下:我的blog又更新了。大家看我的blog啊。其实你写的这篇文章我在blog里面讨论过了。......
5、把你的blog转载到版面吧,真的,可以全部转载,对于那些精彩的文章,这是为了打品牌。还有就是转载一部分或者写个简介,提起大家的兴趣,引诱大家点击你的blog链接观看。
6、你的签名档还没有改成blog的广告?ft,太落后了。我的个人说明档和昵称都是blog广告了。还可以持续性的更换广告词。你看过精彩广告词吗?比如说 "我blog,我暴露,我存在",或者"人类文明史上最好的blog"......
7、想让你的文章变成"热门话题"吗?很简单,发表blog以后立刻让自己的好友去re文,插科打诨均可,如果不好意思麻烦别人,可以调动自己隐藏的若干马甲re文,或者干脆用自己的id直接re好了。把一篇文章分三段写进去,或者在写完文章以后re文贴很多补充材料......哇哇哇,谁脸皮厚,谁自己 re文多,谁就能上热门话题。当然,如果有人re了你的文章,你一定要很很很好客地再re才成......最好两人在这聊天......
8、你还想上"点击排行",哈哈,这个太容易了。在telnet方式下进入你的blog该篇文章,反复阅读,你没有心脏病吧,不要被疯狂增长的数字吓坏......
9、每隔半个小时自己点击自己blog一次,积少成多。
10、你一定要串门,去人家blog里面看看,在别人的blog里面re文来做自己的广告......对了,你一定要re他三四天前的文章,这样不会帮助他增长他的"热门话题"。
11、其实最好的办法,是和windtear商量,让他把他很大访问量的网站里面的某些个内容直接链接到你的blog页面上,光当,不要被访问量打败,要镇定自若偷偷欢喜。不过,你可能需要报告他一次,那有何妨呢?反正,反正,访问量第一嘛......
12、原创会比转载让你得到更多的尊重!但是,如果转载一些黄色笑话,光当,或者转载一些标题醒目的话题,比如,比如,"泡mm绝对有效的十大法则","瘦身九大法宝"......本人郑重声明,严禁转载"提高blog访问量的秘技与非秘技"一文!!!
13、贴图吧,别老土了,都是看图时代了。随便贴几张图,ppmm效果最好,轻松超过那些写字写得累死的老土。
14、如果没有人引用你的blog怎么办?你可以去公众网申请一个blog,反反复复引用你自己在smth的blog,呵呵,反正引用通告是通用的......谁砸我,我跟你没完。
15、时不时地对blog发表一下看法,既然大家都在blog,所以都关心对blog的看法。如果你写了一个"我最喜欢的几个blog",肯定受人欢迎,而且你还可以将之分为上下篇,或者上中下,或者甲乙丙丁......
16、高级秘技:去各大黄色网站贴文,"保证喷鼻血的裸体mm",然后链接到你自己的blog......看吧,你终于认识到那些没人说话或者说话很少的黄色网站究竟有多么大的阅读量了。当你看到自己blog访问量狂增以后,你也许就放弃blog,投身伟大的黄色事业......
17、选择没有人选择的blog分类目录,这样会给你带来意外的好处,因为你自己的文章就有机会出现在"分类主题"里面。
完了,大家都知道了,我就没有可混的了,痛哭啊...
posted @
2007-01-24 12:59 Q系列类、方法、变量…… 阅读(186) |
评论 (1) |
编辑 收藏
页面美工设计需要注意的几点
1、注意页面的分块,着手设计一个页面的时候,你必须根据所掌握的内容,以及其风格,对页面的整体进行分块。分块是一个非常必要且难以掌握的技巧。对于一般杂志来说,它们是有边的,这意味着杂志美工设计师有边可循,依靠边来形成立体感,依靠边来产生未尽的意韵;但是对于web页面,边的概念被淡化了,屏幕可以上下左右的拖动。所以此时分块显得非常必要,目的也就是产生边的效果。
分块可以用不同着色的色块、框、细线、排列整齐的英文等等,还可以混合使用,但是注意不要过于醒目,因为页面的重点在内容,而不在其他。
2、色彩的平衡与呼应。
1)色彩的平衡。色彩在页面中可以形成很多的效果,通过强烈的对比,可以突出页面的重点。还可以通过色彩调配,达到页面稳重度的改变。一般的情况下,页面上方的颜色总是很重,这样才能压住下面的颜色,如果不采取这种办法,整个页面将显得很不稳重,底下的文字图片,有飘出的意味。因此,要使整个页面显得很平衡,必须要有能镇住其他颜色的色彩。
2)色彩的呼应。一种比较突出的色彩,如果很突兀地放在页面中,无论你是突出重点也好,还是logo图标,都给整个页面带来了副作用。为此,你必须在相对称的位置加上该色系(对于页面并不醒目)的色彩以呼应,这样可以弱化这种视觉的冲击。
3、精确到1个像素
如果你是一个成功的页面设计者,你至少会在做出页面前已经把整个页面构思好了;如果你很宽容地对待图片中1个像素的差别,那说明你还不是很合格。
posted @
2007-01-24 12:58 Q系列类、方法、变量…… 阅读(186) |
评论 (0) |
编辑 收藏
您的电子商务每天都在变,您的通信地址会变,您的电话号码会变,您的传真、手机、BB机号码会变,您的公司名称也会变、您的雇员也会变。。。
唯有一样东西不会变,您的网址!对于您的电子商务,您的网址是您最大的品牌。
用“有目共睹”来形容时下网站宣传不过分。天上飘的,地下踩的,空气中游的,到处弥漫着网址。现在连人们的听觉都不放过,不信?如果您在上海的人民广场地铁车站,您就能听到报站声中也有网址。
人的触觉、嗅觉不能感觉到网址。不然,网址可以溶解在水中沐浴您的皮肤,掺在空气中让您闻,调入饭菜里让您尝。
我们将所能见到的网站宣传大致分类如下,您看看什么适合您,最大程度宣传您的网址。
公众出没的地方:广告牌、汽车外表、商店或公司招牌、街路横幅、建筑物外墙、灌木与花草修剪图案、路边美化告示牌、招标牌、海报、集会向导牌、场馆记分牌、地铁站台地面、商业街路面、游艇、气球、空中飞机坠帘
媒体:电视台、电台、报纸、杂志、电影院广告片、网络本身
印刷品:黄页、海报、实用小册子、入场券、传单、帐单、优惠券、邮局通知单、票据、价格表、时刻表、地图、慈善事业发行物
公司对外联络:生意名片、公司信纸、信封、传真抬头、电子邮件、产品目录、支票、传单、公司或财务声明、感谢信、竞标书、文件夹、电话答录机
产品附件:书签、鼠标垫、坐垫、餐厅餐巾纸、纸杯、糖果包裹物、汽车垃圾袋、饮料杯、软件banner广告、浏览器收藏夹、屏保程序图形、电子贺卡
礼品:购物袋、T恤衫,汗衫、帽子、领带、雨伞、钥匙圈、记事簿、笔、手提袋、粘贴小磁物、图章、粘贴便条纸、画板、台历、挂历、拐杖、窗刷等清洁工具、牙刷剃须刀等工具
在合适的时间和场合,向合适的人宣传您的网址,让他人象背英语单词一样记住您的网址。
posted @
2007-01-24 12:58 Q系列类、方法、变量…… 阅读(193) |
评论 (0) |
编辑 收藏
一. 什么是AJAX?
这个名字代表了异步JavaScript+ XMLHTTPRequest,并且意味着你可以在基于浏览器的JavaScript和服务器之间建立套接字通讯。其实AJAX并不是一种新技术,而是已经成功地用于现代浏览器中的若干成功技术的可能性组合。所有的AJAX应用程序实现了一种“丰富的”UI——这是通过JavaScript操作HTML文档对象模型并且经由XMLHttpRequest实现的精确定位的数据检索来实现的。典型的示例AJAX应用程序是Google Labs(
http://labs.google.com )的Google Maps和Google Suggest。这些应用程序现场监视用户输入并且提供实时的页面更新。最重要的是,在用户通过地图导航或输入一个查找字符串的同时,这些事件不需要刷新页面。
事实上,支持这些令人感到惊讶的应用的技术已经出现一段时间了,尽管它们要求复杂的技能以及使用浏览器的技巧。一些专利产品就提供了相似的能力——如Macromedia Flash插件,Java Applets或.NET运行时——在达到实用上已经有一段时间了。把一种可与服务器通话的脚本组件引入到浏览器中的思想早在IE 5.0中就已经存在。Firefox和其它流行的浏览器也加入到浏览器大军中并以一种内置对象形式支持XMLHTTPRequest。随着跨平台浏览器的出现,这些技术得到了认可并在2004年3月一家称为Adaptive Path的公司中正式提出了AJAX。
简而言之,由于来自于Google的支持和安装了一点可用的浏览器技术,加上为了一种"更好的用户体验",每个人都在把客户端技术添加到Web应用程序上。
二. AJAX与传统应用程序的区别
一个传统Web应用程序模型实际上是一种基本的事件——用户被迫提交表单以实现页面交换。也就是说,表单提交和页面传送无法得到保证:还有更坏的情形——用户需要再次点击。这与AJAX截然不同-——数据跨过线路而不是完整的HTML页面传输。这种数据交换是经由特定的浏览器对象:XMLHttpRequest实现的;再由适当的逻辑来处理每个数据请求的结果,页面的特定区域而不是完整的页面被更新。结果是更快的速度,更少的拥挤和更好的信息传送控制。
传统型"click-refresh"Web应用程序强迫用户中断工作过程而等待页面的重装。通过引入AJAX技术,一个客户端脚本能够异步地与服务器通话,而用户仍能保持输入数据。除了对用户透明之外,这样的异步意味着服务器可以有更多时间来处理请求。
传统Web应用程序把所有的处理代理到服务器并且强迫服务器进行状态管理。AJAX允许灵活划分应用程序逻辑以及客户和服务器之间的状态管理。这就消除了一种"click-refresh"依赖性并且提供更好的服务器可伸缩性。当该状态存储在客户端,你就不必跨越服务器来维持会话或保存/结束状态-其使用期限是由客户端来定义的。
三. AJAX——分布式的MVC
尽管AJAX应用程序依靠JavaScript来实现描述层,然而处理能力和知识库仍然存在于服务器上。此时,AJAX应用程序大量的与J2EE服务器通讯——把数据输入/输出Web服务和servlets。具有基于AJAX的描述层的J2EE应用程序和标准J2EE应用程序之间的区别首先在于,MVC是通过线路分布的。通过使用AJAX,视图是本地的,而模型和控制器是分布式的——这使得开发者能够灵活地决定哪些部件会是基于客户端的。具体地说,本地视图通过巧妙地操作HTML DOM而生成图形;控制器局部地处理用户输入并且根据开发者的判断扩展到服务器的处理——经由HTTP请求(Web服务,XML/RPC或其它)实现;模型的远程部分是根据客户端需要而下载的以达到实时更新客户端页面;并且状态是在客户端收集的。
在以后的AJAX文章中,我们将比较深入地讨论这里的每一种组件并提供有关它们联合在一起进行应用的示例。现在,先不多说,让我们详细地分析一个简单的AJAX示例。
四. 邮政区号校验和查询
我们将创建一个包含三个INPUT字段(Zip,City和 State)的HTML页面。我们将保证,只要用户输入邮政区号的前三个数字,该页面上的字段就会用第一个匹配的状态值填充。一旦用户输入了所有五位邮政区号数,我们将立即决定和填充相应的城市。如果邮政区号无效(在服务器的数据库没有找到),那么我们将把邮政区号的边界设置为红色。这样的可视化线索有助于用户并且在现代浏览器中已经成为一种标准(作为一实例,当Firefox找到一个HTML页面中的匹配关键字时,它会高亮与你在浏览器查找域输入的内容一致的部分)。
让我们首先创建一个简单的包含三个INPUT字段的 HTML:zip,city和state。请注意,一旦一个字符输入进邮政区号字段域中,即调用方法zipChanged()。JavaScript函数 zipChanged()(见下)在当zip长度为3时调用函数updateState(),而在当zip长度为5时调用函数up-dateCity ()。而updateCity()和updateState()把大部分的工作代理到另一个函数ask()。
Zip:<input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"
style="width:60"/>
City: <input id="city" disabled maxlength="32" style="width:160"/>
State:<input id="state" disabled maxlength="2" style="width:30"/>
<script src="xmlhttp.js"></script>
<script>
var zipField = null;
function zipChanged(){
zipField = document.getElementById("zipcode")
var zip = zipField.value;
zip.length == 3?updateState(zip):zip.length == 5?updateCity(zip):"";
}
function updateState(zip) {
var stateField = document.getElementById("state");
ask("resolveZip.jsp?lookupType=state&zip="+zip, stateField, zipField);
}
function updateCity(zip) {
var cityField = document.getElementById("city");
ask("resolveZip.jsp? lookupType=city&zip="+zip, cityField, zipField);
}
</script>
函数ask()与服务器进行通讯并分配一个回调函数来处理服务器的响应(见下列代码)。后面,我们将分析具有双重特点的resolveZip.jsp的内容-它根据zip字段中的字符数查找city或state信息。重要的是,ask()使用了具有异步特点的XmlHttpRequest,这样填充 state和city字段或着色zip字段边界就可以不必减慢数据入口而得以实现。首先,我们调用request.open()-它用服务器打开套接字频道,使用一个HTTP动词(GET或POST)作为第一个参数并且以数据提供者的URL作为第二个参数。request.open()的最后一个参数被设置为true-它指示该请求的异步特性。注意,该请求还没有被提交。随着对request.send()的调用,开始提交-这可以为POST提供任何必要的有效载荷。在使用异步请求时,我们必须使用request.onreadystatechanged属性来分配请求的回调函数。(如果请求是同步的话,我们应该能够在调用request.send之后立即处理结果,但是我们也有可能阻断用户,直到该请求完成为止。)
HTTPRequest = function () {
var xmlhttp=null;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (_e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (_E) { }
}
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
function ask(url, fieldToFill, lookupField) {
var http = new HTTPRequest();
http.open("GET", url, true);
http.onreadystatechange = function (){ handleHttpResponse(http, fieldToFill,lookupField)};
http.send(null);
}
function handleHttpResponse(http, fieldToFill, lookupField) {
if (http.readyState == 4) {
result = http.responseText;
if ( -1 != result.search("null") ) {
lookupField.style.borderColor = "red";
fieldToFill.value = "";
} else {
lookupField.style.borderColor = "";
fieldToFill.value = result;
}
}
}
为ask()所使用的HttpRequest()函数(见上)是一跨浏览器的XMLHTTPRequest的一个实例的构造器;稍后我们将分析它。到目前为止,请注意对于handleResponse()的调用是如何用一匿名函数包装的-这个函数是function() {handleHttpResponse(http,fieldToFill, lookupField)}。
该函数的代码是动态创建的并且在每次我们给http.onreadstatechange属性赋值时被编译。结果,JavaScript创建一个指向上下文(所有的变量都可以存取正在结束的方法-ask())的指针。这样以来,匿名函数和handleResponse()就能够被保证充分存取所有的上下文宿主的变量,直至到匿名函数的参考被垃圾回收站收集为止。换句话说,无论何时我们的匿名函数被调用,它都能无缝地参考request, fieldToFill和lookupField变量,就象它们是全局的一样。而且,每次ask()调用都将创建环境的一个独立拷贝,并且此时这些变量中保存有该函数将结束时的值。
现在,让我们分析一下函数handleResponse()。既然它能够在请求处理的不同状态下激活,那么该函数将忽略所有的情形-除了该请求处理完成之外-这相应于request.readyState属性等于4("Completed")。此时,该函数读取服务器的响应文本。与它的名字所暗示的相反,XmlHttpRequest的输入和输出都不必限于XML格式。特别地,我们的resolveZip.jsp(见源码中的列表1)返回普通文本。如果返回值为"unknown",那么该函数将假定邮政区号是无效的并且把查找字段(zip)边界颜色置为红色。否则,返回值被用于填充字段state或 city,并且zip的边界被赋予一种缺省颜色。
XMLHttpRequest-传输对象
让我们返回到我们的XMLHTTPRequest的跨浏览器实现。最后一个列表包含一个HttpRequest()函数-它向上兼容于IE5.0和 Mozilla 1.8/FireFox。为简化起见,我们只创建一个微软XMLHTTPRequest对象,而且如果创建失败,我们假定它是 Firefox/Mozilla。
该函数的核心是XMLHTTPRequest-这是一个本机浏览器对象,它为包括HTTP协议的任何东西与服务器之间的通讯提供方便。它允许指定任何 HTTP动词,头部和有效载荷,并且能够以异步或同步方式工作。不需要下载也不需要安装任何插件-尽管在IE的情形下,XMLHTTPRequest是一个集成到浏览器内部的ActiveX。因而,"Run ActiveX Control and Plugins"默认IE权限应该正好适合使用它。
最重要的是,XMLHTTPRequest允许一个到服务器的RPC风格的编程查询而不需要任何页面刷新。它以一种可预测的,可控制的方式来实现此-提供了到HTTP协议的所有细节的完整存取-包括头部和数据的任何定制格式。在以后的文章中,我们将向你展示其它一些业界协议-你可以在这些传输协议(如 Web服务和XML-RPC)之上运行-它们极大地简化大规模应用程序的开发和维护。
五.服务器端逻辑
最后,服务器端的resolveZip.jsp被从函数ask()中调用(见所附源码中的列表1)。这个resolveZip.jsp在两种由当前的邮政区号长度所区分的独立的场所下被调用(见zipChanged()函数)。请求参数lookupType的值或者是state或者是city。为简化起见,我们将假定,两个文件state.properties和city.properties都位于服务器中C驱动器的根目录下。 resolveZip.jsp逻辑负责用适当的预装载的文件返回查找值。
我们的支持AJAX的页面现在已经准备好了。
六.远程脚本技术-一种可选方法
一些更旧的AJAX实现是基于所谓的远程脚本技术。这种思想是,用户的行为导致经由IFRAME对服务器进行查询,而服务器用JavaScript作出响应,该脚本一旦到达客户端立即被执行。这与XMLHttpRequest方法相比存在较大的区别,在后者情况下,服务器响应数据而客户端解释数据。其好处是这种解决方案支持更旧的浏览器。
基于IFRAME示例的HTML部分(见所附源码中的列表2)与我们在XMLHTTPRequest场合下所用的极相似,但是这次我们将引入另外一个IFRAME元素-controller:
Zip:<input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"
style="width:60" size="20"/>
City: <input id="city" disabled maxlength="32" style="width:160" size="20"/>
State:<input id="state" disabled maxlength="2" style="width:30" size="20"/>
<iframe id="controller" style="visibility:hidden;width:0;height:0"></iframe>
我们保持每次击键都调用zipChanged()一次,但是这一次,从zipChanged()中被调用的函数ask()(见所附源码中的列表3)负责设置IFRAME的src属性,而不是调用一个XMLHTTPRequest:
function ask(url, fieldToFill, lookupField){
var controller = document.getElementById("controller");
controller.src= url+"&field="+fieldToFill.id+"&zip="+lookupField.id;
}
服务器端逻辑由一个粗略的resolveZip.jsp(见所附源码中的列表4)所描述。它与它的XMLHTTPRequest对应物相区别-它返回 JavaScript语句,这些语句设置变量字段lookup和city的全局值,而且一旦它到达浏览器即从全局窗口的执行上下文中调用函数 response()。
函数response()是一修改版本的handleResponse()-这一函数可以免于处理未完成的请求(详见本文所附源码中的列表2)。
七. 难题
为简化起见,让我们"俯看"一下在我们的示例代码中的一些重要的问题:
1.事实-XMLHTTPRequest对象实例和回调函数调用在被使用以后并没被破坏-在每次调用后这有可能导致内存泄漏。适当编写的代码应该破坏或重用对象池中的这些实例。而且,客户端必须使用与服务器软件相同的对象管理技术。
2.在大多数情况下,错误往往得不到有效处理。例如,在方法ask()中对request.open()的调用可能引发一个异常,这是必须要捕获和处理的,即使在浏览器中没有设置JavaScript异常自动捕获功能。而handleResponse()函数又是另外一个例子。它必须要为可能的服务器端和通讯错误而检查headers和responseText值。在发生错误的情况下,它必须尽力恢复并/或者报告错误。正确开发的AJAX应用程序要尽可能避免"提交"松散的数据,因为往往存在线路断开和其它低级通讯的问题-所以这些程序必须建立一个强壮的和自恢复的框架为此提供支持。
3.当前服务器端框架提供相当多的功能-它们可以与一种自由刷新方法和谐相处。例如,让我们考虑一个定制的在指定时间内的服务器端认证的问题。在这种情况下,我们必须拦截到XMLHTTPRequest调用的安全系统响应,显示登录屏幕,然后在用户被认证后重新发出请求。
所有的这些问题只是一些典型的用低级API工作的任何应用程序代码,而且所有这些问题都能被解决。好消息是,解决这些问题所需要的技术十分相似于大多数Java开发技术,如Web服务,定制标签和XML/XSLT。唯一的区别在于,现在这些技术以下列形式用于客户端:
·Web服务-使用SOAP/REST/RPC等简单通讯标准
·客户端定制标签-打包丰富的客户端控件并集成AJAX功能
·数据操作-基于XML和基于XSLT技术
八. 小结
AJAX方法能够向人们提供一种与桌面应用程序相同的丰富的互联网体验。但是,我们必须有选择地使用AJAX技术,如当你仍在线购物时,你绝对不想让你的信用卡通过后台处理就悄悄地开始付款。AJAX会成为一种持续的动力吗?我们当然希望这样。在过去的五年时间内我们一直在努力开发AJAX应用程序并且能证明它是健全并且很有效的。然而,它要求一个开发者必须精通大量技术而不是在传统的"click-refresh"Web应用程序中所使用的那些。
posted @
2007-01-24 12:56 Q系列类、方法、变量…… 阅读(187) |
评论 (0) |
编辑 收藏
功能齐全的发送PHP邮件类
PHP--下面这个类的功能则很强大,不但能发html格式的邮件,还可以发附件
<?php
class Email {
//---设置全局变量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 发件人
var $mailSubject = ""; // 主题
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $mailAttachments = ""; // 附件
/* 函数setTo($inAddress) :用于处理邮件的地址 参数 $inAddress
为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址
默认返回值为true
**********************************************************/
function setTo($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i++){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailTo = implode($addressArray, ",");
return true; }
/**************************************************
函数 setCC($inAddress) 设置抄送人邮件地址
参数 $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,
使用逗号来分割多个邮件地址 默认返回值为true
**************************************************************/
function setCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i++){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailCC = implode($addressArray, ",");
return true; }
/***************************************************
函数setBCC($inAddress) 设置秘密抄送地址 参数 $inAddress 为包涵一个或多
个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址 默认返回值为
true
******************************************/
function setBCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i++)
{ if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入数组中
$this->mailBCC = implode($addressArray, ",");
return true;
}
/*****************************************************************
函数setFrom($inAddress):设置发件人地址 参数 $inAddress 为包涵邮件
地址的字串默认返回值为true
***************************************/
function setFrom($inAddress){
if($this->checkEmail($inAddress)){
$this->mailFrom = $inAddress;
return true;
} return false; }
/**********************
函数 setSubject($inSubject) 用于设置邮件主题参数$inSubject为字串,
默认返回的是true
*******************************************/
function setSubject($inSubject){
if(strlen(trim($inSubject)) > 0){
$this->mailSubject = ereg_replace( "n", "",$inSubject);
return true; }
return false; }
/****************************************************
函数setText($inText) 设置文本格式的邮件主体参数 $inText 为文本内容默
认返回值为true
****************************************/
function setText($inText){
if(strlen(trim($inText)) > 0){
$this->mailText = $inText;
return true; }
return false;
}
/**********************************
函数setHTML($inHTML) 设置html格式的邮件主体参数$inHTML为html格式,
默认返回值为true
************************************/
function setHTML($inHTML){
if(strlen(trim($inHTML)) > 0){
$this->mailHTML = $inHTML;
return true; }
return false; }
/**********************
函数 setAttachments($inAttachments) 设置邮件的附件 参数$inAttachments
为一个包涵目录的字串,也可以包涵多个文件用逗号进行分割 默认返回值为true
*******************************************/
function setAttachments($inAttachments){
if(strlen(trim($inAttachments)) > 0){
$this->mailAttachments = $inAttachments;
return true; }
return false; }
/*********************************
函数 checkEmail($inAddress) :这个函数我们前面已经调用过了,主要就是
用于检查email地址的合法性
*****************************************/
function checkEmail($inAddress){
return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$",$inAddress));
}
/*************************************************
函数loadTemplate($inFileLocation,$inHash,$inFormat) 读取临时文件并且
替换无用的信息参数$inFileLocation用于定位文件的目录
$inHash 由于存储临时的值 $inFormat 由于放置邮件主体
***********************************************************/
function loadTemplate($inFileLocation,$inHash,$inFormat){
/* 比如邮件内有如下内容: Dear ~!UserName~,
Your address is ~!UserAddress~ */
//--其中”~!”为起始标志”~”为结束标志
$templateDelim = "~";
$templateNameStart = "!";
//--找出这些地方并把他们替换掉
$templateLineOut = ""; //--打开临时文件
if($templateFile = fopen($inFileLocation, "r")){
while(!feof($templateFile)){
$templateLine = fgets($templateFile,1000);
$templateLineArray = explode($templateDelim,$templateLine);
for( $i=0; $i<count($templateLineArray);$i++){
//--寻找起始位置
if(strcspn($templateLineArray[$i],$templateNameStart)==0){
//--替换相应的值
$hashName = substr($templateLineArray[$i],1);
//--替换相应的值
$templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName);
}
}
//--输出字符数组并叠加
$templateLineOut .= implode($templateLineArray, "");
} //--关闭文件fclose($templateFile);
//--设置主体格式(文本或html)
if( strtoupper($inFormat)== "TEXT" )
return($this->setText($templateLineOut));
else if( strtoupper($inFormat)== "HTML" )
return($this->setHTML($templateLineOut));
} return false;
}
/*****************************************
函数 getRandomBoundary($offset) 返回一个随机的边界值
参数 $offset 为整数 – 用于多管道的调用 返回一个md5()编码的字串
****************************************/
function getRandomBoundary($offset = 0){
//--随机数生成
srand(time()+$offset);
//--返回 md5 编码的32位 字符长度的字串
return ( "----".(md5(rand()))); }
/********************************************
函数: getContentType($inFileName)用于判断附件的类型
**********************************************/
function getContentType($inFileName){
//--去除路径
$inFileName = basename($inFileName);
//--去除没有扩展名的文件
if(strrchr($inFileName, ".") == false){
return "application/octet-stream";
}
//--提区扩展名并进行判断
$extension = strrchr($inFileName, ".");
switch($extension){
case ".gif": return "image/gif";
case ".gz": return "application/x-gzip";
case ".htm": return "text/html";
case ".html": return "text/html";
case ".jpg": return "image/jpeg";
case ".tar": return "application/x-tar";
case ".txt": return "text/plain";
case ".zip": return "application/zip";
default: return "application/octet-stream";
}
return "application/octet-stream";
}
/**********************************************
函数formatTextHeader把文本内容加上text的文件头
*****************************************************/
function formatTextHeader(){ $outTextHeader = "";
$outTextHeader .= "Content-Type: text/plain;
charset=us-asciin";
$outTextHeader .= "Content-Transfer-Encoding: 7bitnn";
$outTextHeader .= $this->mailText. "n";
return $outTextHeader;
} /************************************************
函数formatHTMLHeader()把邮件主体内容加上html的文件头
******************************************/
function formatHTMLHeader(){
$outHTMLHeader = "";
$outHTMLHeader .= "Content-Type: text/html;
charset=us-asciin";
$outHTMLHeader .= "Content-Transfer-Encoding: 7bitnn";
$outHTMLHeader .= $this->mailHTML. "n";
return $outHTMLHeader;
}
/**********************************
函数 formatAttachmentHeader($inFileLocation) 把邮件中的附件标识出来
********************************/
function formatAttachmentHeader($inFileLocation){
$outAttachmentHeader = "";
//--用上面的函数getContentType($inFileLocation)得出附件类型
$contentType = $this->getContentType($inFileLocation);
//--如果附件是文本型则用标准的7位编码
if(ereg( "text",$contentType)){
$outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: 7bitn";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
$textFile = fopen($inFileLocation, "r");
while(!feof($textFile)){
$outAttachmentHeader .= fgets($textFile,1000);
}
//--关闭文件 fclose($textFile);
$outAttachmentHeader .= "n";
}
//--非文本格式则用64位进行编码
else{ $outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: base64n";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
//--调用外部命令uuencode进行编码
exec( "uuencode -m $inFileLocation nothing_out",$returnArray);
for ($i = 1; $i<(count($returnArray)); $i++){
$outAttachmentHeader .= $returnArray[$i]. "n";
}
} return $outAttachmentHeader;
}
/******************************
函数 send()用于发送邮件,发送成功返回值为true
************************************/
function send(){
//--设置邮件头为空
$mailHeader = "";
//--添加抄送人
if($this->mailCC != "")
$mailHeader .= "CC: ".$this->mailCC. "n";
//--添加秘密抄送人
if($this->mailBCC != "")
$mailHeader .= "BCC: ".$this->mailBCC. "n";
//--添加发件人
if($this->mailFrom != "")
$mailHeader .= "FROM: ".$this->mailFrom. "n";
//---------------------------邮件格式------------------------------
//--文本格式
if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == ""){
return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
}
//--html或text格式
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments == ""){
$bodyBoundary = $this->getRandomBoundary();
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
//--设置 MIME-版本
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
//--添加邮件主体和边界
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
//--添加html标签
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--发送邮件
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
//--文本加html加附件
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != ""){
$attachmentBoundary = $this->getRandomBoundary();
$mailHeader .= "Content-Type: multipart/mixed;n";
$mailHeader .= ' boundary="'.$attachmentBoundary. '"'. "nn";
$mailHeader .= "This is a multi-part message in MIME format.n";
$mailHeader .= "--".$attachmentBoundary. "n";
$bodyBoundary = $this->getRandomBoundary(1);
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--获取附件值
$attachmentArray = explode( ",",$this->mailAttachments);
//--根据附件的个数进行循环
for($i=0;$i<count($attachmentArray);$i++){
//--分割 $mailHeader .= "n--".$attachmentBoundary. "n";
//--附件信息
$mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
}
$mailHeader .= "--".$attachmentBoundary. "--";
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
return false;
}
}
?>
使用方法:
<?
Include “email.class”
$mail->setTo("a@a.com"); //收件人
$mail-> setCC("b@b.com,c@c.com"); //抄送
$mail-> setCC("d@b.com,e@c.com"); //秘密抄送
$mail->setFrom(“f@f.com”);//发件人
$mail->setSubject(“主题”) ; //主题
$mail->setText(“文本格式”) ;//发送文本格式也可以是变量
$mail->setHTML(“html格式”) ;//发送html格式也可以是变量
$mail->setAttachments(“c:a.jpg”) ;//添加附件,需表明路径
$mail->send(); //发送邮件
posted @
2007-01-24 12:56 Q系列类、方法、变量…… 阅读(176) |
评论 (0) |
编辑 收藏
解密ZEND加密后的PHP
先下载http://pecl.php.net/get/vl...
执行
#tar -xzf vld-0.8.0.tgz //解压
#mv vld-0.8.0 vld //重命名
#cd -R vld ../php-4.3.8/ext //拷贝vld目录到php的解压目录下的ext中
#cd php-4.3.8
#rm configure //删除configure,因为下面的buildconf会重新生成新的configure
#./buildconf //如果出现错误,就按提示加上相应的参数.
#./configure --with-mysql --with-apxs2=/usr/www/bin/apxs --enable-vld 重新检查php
#make 编译
#make install 安装
服务器必须先安装ZendOptimizer
运行Zend后的文件,查看源代码就可以看到了.
未测试
下载地址 http://www.huanle.net/down...
执行
#tar -xzf vld-0.8.0.tgz //解压
#mv vld-0.8.0 vld //重命名
#cd -R vld /php-4.3.8/ext //拷贝vld目录到php的解压目录下的ext中
#cd php-4.3.8
#rm configure //删除configure,因为下面的buildconf会重新生成新的configure
#./buildconf //如果出现错误,就按提示加上相应的参数.
#./configure --with-mysql --with-apxs2=/usr/www/bin/apxs --enable-vld 重新检查php
#make 编译
#make install 安装
服务器必须先安装ZendOptimizer
运行Zend后的文件,查看源代码就可以看到了.
方法二:
只要你有linux主機,再裝一個程序,就能瀏覽源碼了.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_vld.h"
#include "srm_oparray.h"
static zend_op_array* (*old_compile_file)(zend_file_handle* file_handle, int type TSRMLS_DC);
static zend_op_array* vld_compile_file(zend_file_handle*, int TSRMLS_DC);
static void (*old_execute)(zend_op_array *op_array TSRMLS_DC);
static void vld_execute(zend_op_array *op_array TSRMLS_DC);
function_entry vld_functions[] = {
{NULL, NULL, NULL}
};
zend_module_entry vld_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"vld",
vld_functions,
PHP_MINIT(vld),
PHP_MSHUTDOWN(vld),
PHP_RINIT(vld),
PHP_RSHUTDOWN(vld),
PHP_MINFO(vld),
#if ZEND_MODULE_API_NO >= 20010901
"0.8.0",
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_VLD
ZEND_GET_MODULE(vld)
#endif
ZEND_BEGIN_MODULE_GLOBALS(vld)
int active;
int skip_prepend;
int skip_append;
int execute;
ZEND_END_MODULE_GLOBALS(vld)
ZEND_DECLARE_MODULE_GLOBALS(vld)
#ifdef ZTS
#define VLD_G(v) TSRMG(vld_globals_id, zend_vld_globals *, v)
#else
#define VLD_G(v) (vld_globals.v)
#endif
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("vld.active", "0", PHP_INI_SYSTEM, OnUpdateBool, active, zend_vld_globals, vld_globals)
STD_PHP_INI_ENTRY("vld.skip_prepend", "0", PHP_INI_SYSTEM, OnUpdateBool, skip_prepend, zend_vld_globals, vld_globals)
STD_PHP_INI_ENTRY("vld.skip_append", "0", PHP_INI_SYSTEM, OnUpdateBool, skip_append, zend_vld_globals, vld_globals)
STD_PHP_INI_ENTRY("vld.execute", "1", PHP_INI_SYSTEM, OnUpdateBool, execute, zend_vld_globals, vld_globals)
PHP_INI_END()
static void vld_init_globals(zend_vld_globals *vld_globals)
{
vld_globals->active = 0;
vld_globals->skip_prepend = 0;
vld_globals->skip_append = 0;
vld_globals->execute = 1;
}
PHP_MINIT_FUNCTION(vld)
{
ZEND_INIT_MODULE_GLOBALS(vld, vld_init_globals, NULL);
REGISTER_INI_ENTRIES();
old_compile_file = zend_compile_file;
old_execute = zend_execute;
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(vld)
{
UNREGISTER_INI_ENTRIES();
zend_compile_file = old_compile_file;
zend_execute = old_execute;
return SUCCESS;
}
PHP_RINIT_FUNCTION(vld)
{
if (VLD_G(active)) {
zend_compile_file = vld_compile_file;
if (!VLD_G(execute)) {
zend_execute = vld_execute;
}
}
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(vld)
{
zend_compile_file = old_compile_file;
zend_execute = old_execute;
return SUCCESS;
}
PHP_MINFO_FUNCTION(vld)
{
php_info_print_table_start();
php_info_print_table_header(2, "vld support", "enabled");
php_info_print_table_end();
}
static int vld_check_fe (zend_op_array *fe, zend_bool *have_fe TSRMLS_DC)
{
if (fe->type == ZEND_USER_FUNCTION) {
*have_fe = 1;
}
return 0;
}
static int vld_dump_fe (zend_op_array *fe TSRMLS_DC)
{
if (fe->type == ZEND_USER_FUNCTION) {
fprintf(stderr, "Function %s:
", fe->function_name);
vld_dump_oparray(fe);
fprintf(stderr, "End of function %s.
", fe->function_name);
}
return ZEND_HASH_APPLY_KEEP;
}
#ifdef ZEND_ENGINE_2
static int vld_dump_cle (zend_class_entry **class_entry TSRMLS_DC)
#else
static int vld_dump_cle (zend_class_entry *class_entry TSRMLS_DC)
#endif
{
zend_class_entry *ce;
zend_bool have_fe = 0;
#ifdef ZEND_ENGINE_2
ce = *class_entry;
#else
ce = class_entry;
#endif
if (ce->type != ZEND_INTERNAL_CLASS) {
zend_hash_apply_with_argument(&ce->function_table, (apply_func_arg_t) vld_check_fe, (void *)&have_fe TSRMLS_CC);
if (have_fe) {
fprintf(stderr, "Class %s:
", ce->name);
zend_hash_apply(&ce->function_table, (apply_func_t) vld_dump_fe TSRMLS_CC);
fprintf(stderr, "End of class %s.
", ce->name);
} else {
fprintf(stderr, "Class %s: [no user functions]
", ce->name);
}
}
return ZEND_HASH_APPLY_KEEP;
}
/* {{{ zend_op_array vld_compile_file (file_handle, type)
* This function provides a hook for compilation */
static zend_op_array *vld_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
zend_op_array *op_array;
if (!VLD_G(execute) &&
((VLD_G(skip_prepend) && PG(auto_prepend_file) && PG(auto_prepend_file)[0] && PG(auto_prepend_file) == file_handle->filename)
(VLD_G(skip_append) && PG(auto_append_file) && PG(auto_append_file)[0] && PG(auto_append_file) == file_handle->filename)))
{
zval nop;
ZVAL_STRINGL(&nop, "RETURN ;", 8, 0);
return compile_string(&nop, "NOP" TSRMLS_CC);;
}
op_array = old_compile_file (file_handle, type TSRMLS_CC);
if (op_array) {
vld_dump_oparray (op_array);
}
zend_hash_apply (CG(function_table), (apply_func_t) vld_dump_fe TSRMLS_CC);
zend_hash_apply (CG(class_table), (apply_func_t) vld_dump_cle TSRMLS_CC);
return op_array;
}
/* }}} */
/* {{{ void vld_execute(zend_op_array *op_array TSRMLS_DC)
* This function provides a hook for execution */
static void vld_execute(zend_op_array *op_array TSRMLS_DC)
{
// nothing to do
}
/* }}} */
posted @
2007-01-24 12:56 Q系列类、方法、变量…… 阅读(2079) |
评论 (0) |
编辑 收藏
了解和掌握下面几个命令将会有助于您更快地检测到网络故障所在,从而节省时间,提高效率。
Ping
Ping是测试网络联接状况以及信息包发送和接收状况非常有用的工具,是网络测试最
常用的命令。Ping向目标主机(地址)发送一个回送请求数据包,要求目标主机收到请求后给予答复,从而判断网络的响应时间和本机是否与目标主机(地址)联通。
如果执行Ping不成功,则可以预测故障出现在以下几个方面:网线故障,网络适配器配置不正确,IP地址不正确。如果执行Ping成功而网络仍无法使用,那么问题很可能出在网络系统的软件配置方面,Ping成功只能保证本机与目标主机间存在一条连通的物理路径。
命令格式:
ping IP地址或主机名 [-t] [-a] [-n count] [-l size]
参数含义:
-t不停地向目标主机发送数据;
-a 以IP地址格式来显示目标主机的网络地址 ;
-n count 指定要Ping多少次,具体次数由count来指定 ;
-l size 指定发送到目标主机的数据包的大小。
例如当您的机器不能访问Internet,首先您想确认是否是本地局域网的故障。假定局域网的代理服务器IP地址为202.168.0.1,您可以使用 Ping避免202.168.0.1命令查看本机是否和代理服务器联通。又如,测试本机的网卡是否正确安装的常用命令是ping 127.0.0.1。
Tracert
Tracert命令用来显示数据包到达目标主机所经过的路径,并显示到达每个节点的时间。命令功能同Ping类似,但它所获得的信息要比Ping命令详细得多,它把数据包所走的全部路径、节点的IP以及花费的时间都显示出来。该命令比较适用于大型网络。
命令格式:
tracert IP地址或主机名 [-d][-h maximumhops][-j host_list] [-w timeout]
参数含义:
-d 不解析目标主机的名字;
-h maximum_hops 指定搜索到目标地址的最大跳跃数;
-j host_list 按照主机列表中的地址释放源路由;
-w timeout 指定超时时间间隔,程序默认的时间单位是毫秒。
例如大家想要了解自己的计算机与目标主
www.cce.com.cn之间详细的传输路径信息,可以在MS-DOS方式输入tracertwww.cce.com.cn。
如果我们在Tracert命令后面加上一些参数,还可以检测到其他更详细的信息,例如使用参数-d,可以指定程序在跟踪主机的路径信息时,同时也解析目标主机的域名。
Netstat
Netstat命令可以帮助网络管理员了解网络的整体使用情况。它可以显示当前正在活动的网络连接的详细信息,例如显示网络连接、路由表和网络接口信息,可以统计目前总共有哪些网络连接正在运行。
利用命令参数,命令可以显示所有协议的使用状态,这些协议包括TCP协议、UDP协议以及IP协议等,另外还可以选择特定的协议并查看其具体信息,还能显示所有主机的端口号以及当前主机的详细路由信息。
命令格式:
netstat [-r] [-s] [-n] [-a]
参数含义:
-r 显示本机路由表的内容;
-s 显示每个协议的使用状态(包括TCP协议、UDP协议、IP协议);
-n 以数字表格形式显示地址和端口;
-a 显示所有主机的端口号。
Winipcfg
2000以上系统CMD下是 ipconfig
Winipcfg命令以窗口的形式显示IP协议的具体配置信息,命令可以显示网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关等,还可以查看主机名、DNS服务器、节点类型等相关信息。其中网络适配器的物理地址在检测网络错误时非常有用。
命令格式:
winipcfg [/?] [/all]
参数含义:
/all 显示所有的有关IP地址的配置信息;
/batch [file] 将命令结果写入指定文件;
/renew_ all 重试所有网络适配器;
/release_all 释放所有网络适配器;
/renew N 复位网络适配器 N;
/release N 释放网络适配器 N。
在Microsoft的Windows 95及其以后的操作系统中,都可以运行以上命令。
posted @
2007-01-24 12:55 Q系列类、方法、变量…… 阅读(235) |
评论 (0) |
编辑 收藏
使用MYSQL进行数据库备份,有很正规的数据库备份方法,同其他的数据库服务器有相同的概念,但有没有想过,MySQL会有更简捷的使用文件目录的备份方法,而且又快有好。
一、数据备份捷径
因为这个方法没有得到官方正式文档的验证,我们暂称为试验吧。
目的:备份hostA主机中一个mysql数据库TestA,并恢复到到hostB机中
试验环境:
操作系统:WinNT4.0,Mysql3.22.34,phpMyAdmin 2.1.0
在hostA中安装mysql数据库并建立TestA数据库
hostB机安装mysql数据库,没有TestA数据库
方法步骤:
启动phpMyAdmin察看HostA和HostB中的数据库列表,在HostB中没有TestA数据库
找到HostA中mysql的安装目录,并找到数据库目录data
在我的试验环境中,这个目录是
C:mysqldata
找到对应数据库名称的子目录
C:mysqldataTestA
粘贴拷贝到HostB的Data目录下,是HostA同HostB Mysql数据目录下的文件相同。
刷新HostB的phpMyAdmin察看一下数据库列表,我们看到TestA已经出现,并且作查询修改等操作都正常,备份恢复恢复成功。
试验结论:Mysql的数据库可以通过文件形式保存,备份,恢复只要将相应文件目录恢复即可,无需使用其它工具备份。
二、正规的方法(官方建议):
导出要用到MySQL的mysqldump工具,基本用法是:
mysqldump [OPTIONS] database [tables]
如果你不给定任何表,整个数据库将被导出。
通过执行mysqldump --help,你能得到你mysqldump的版本支持的选项表。
注意,如果你运行mysqldump没有--quick或--opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。
mysqldump支持下列选项:
--add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。
--add-drop-table
在每个create语句之前增加一个drop table。
--allow-keywords
允许创建是关键词的列名字。这由在列名前面加表名的方法做到。
-c, --complete-insert
使用完整的insert语句(用列名字)。
-C, --compress
如果客户和服务器均支持压缩,压缩两者间所有的信息。
--delayed
用INSERT DELAYED命令插入行。
-e, --extended-insert
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)
-#, --debug[=option_string]
跟踪程序的使用(为了调试)。
--help
显示一条帮助消息并且退出。
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--fields-terminated-by=...
这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。
LOAD DATA INFILE语法。
-F, --flush-logs
在开始导出前,洗掉在MySQL服务器中的日志文件。
-f, --force,
即使我们在一个表导出期间得到一个SQL错误,继续。
-h, --host=..
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。
-l, --lock-tables.
为开始导出锁定所有表。
-t, --no-create-info
不写入表创建信息(CREATE TABLE语句)
-d, --no-data
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!
--opt
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。
应该给你为读入一个MySQL服务器的尽可能最快的导出。
-pyour_pass, --password[=your_pass]
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。
-P port_num, --port=port_num
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)
-q, --quick
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。
-S /path/to/socket, --socket=/path/to/socket
与localhost连接时(它是缺省主机)使用的套接字文件。
-T, --tab=path-to-some-directory
对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和-- lines--xxx选项来定。
-u user_name, --user=user_name
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。
-O var=option, --set-variable var=option
设置一个变量的值。可能的变量被列在下面。
-v, --verbose
冗长模式。打印出程序所做的更多的信息。
-V, --version
打印版本信息并且退出。
-w, --where='where-condition'
只导出被选择了的记录;注意引号是强制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
最常见的mysqldump使用可能制作整个数据库的一个备份:
mysqldump --opt database > backup-file.sql
但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:
mysqldump --opt database mysql --host=remote-host -C database
由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:
mysqladmin create target_db_name
mysql target_db_name < backup-file.sql
posted @
2007-01-24 12:54 Q系列类、方法、变量…… 阅读(227) |
评论 (0) |
编辑 收藏
posted @
2007-01-24 12:54 Q系列类、方法、变量…… 阅读(148) |
评论 (0) |
编辑 收藏
因为这篇文章很有价值,掌握后确实可以从linux的初学者变成linux好手,掌握了它就等于完全入了linux的门,不愧是本年度学习linux命令的最佳帖子。
所以请版本最好把它锁定一个靠前的位置,以便让更多的人可以看到这篇文章,让更多的人从初学者变成好手。
如果本篇没有被锁定,如果对你有用的话,请签收它,以便让它一直可以被大家看到。
如下是linux最常用的命令及用途,当全部掌握以后,就没人敢说你不会linux。
版权所有其实指的是版板归大家所有,你可以用自己的名字发表,也可以借我的大名宣传一下,as you like.
大家共享资源,共同进步,中国的软件事业才能有希望!
如果这篇文章加快了你成为linux高手的脚步,促使你创建一间linux公司,奋斗后战胜了redhat, 最终击败了微软,那时你再...
basic command
ls:
ls
ls –a “显示隐藏文件”
ls –l “显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行”
ls --color=never *.so > obj “不显示文字颜色,将所有so文件记录到obj文件中”
cd:
cd
cd /
cd ../ “到上一级目录”
cd ../.. “到上二级目录”
cd ~ “goto user directory”
rm:
rm
rm -fr directory “delete the directory without ask”
cp:
cp source target
cp –av soure_dir target_dir “将整个目录复制,两目录完全一样”
cp –fr source_dir target_dir “将整个目录复制,并且是以非链接方式复制,当source目录带有符号链接时,两个目录不相同”
mv:
mv source target
diff:
diff dir1 dir2 “compare dir1 and dir2, if files in dir1 but not in dir2, it will be list”
diff file1 file2 “compare file1 and file2,if any difference, he will tell you”
comm:
comm file1 file2 “compare file and file2, if any difference, the difference will be list”
echo:
echo message “display some characters in the console”
cat:
cat file “display the file’s content in the console”
export:
export LC_ALL= “define variable LC_ALL is NULL”
export DISPLAY=0:0 “define variable DISPLAY is 0:0”
date:
date “list the time”
find:
find -name path file “find file in the path”
grep:
grep -ir “chars” path “find chars in the path”
vi:
vi file “file edit tools “
lynx:
lynx "text base browser"
man:
man command "help command"
startx:
startx “run GUI system”
reboot:
reboot “reboot computer”
halt:
halt “shutdown computer”
init:
init 0 "shut down all service"
init 1 "restart all service"
init 6 "reboot script"
advance command
tar:
tar xfzv file.tgz “uncompress file.tgz in the current directory”
tar xfzv file.tgz -C target_path “uncompress file.tgz in the appoint directory”
tar cfzv file.tgz source_path “compress appoint file to appoint tar ball”
gzip:
gzip -d source target " compress file"
unzip:
unzip source "un compress file"
dmesg:
dmesg "show kernel booting information"
uname:
uname -R " show kernel version"
more:
ls | more " 分页显示 information"
strings:
strings file "list file chars"
less:
less “list file chars,分页显示”
rpm:
rpm -i program.rpm "install program"
rpm2targz:
rpm2targz program.rpm program.tgz " reforamt rmp to tar ball"
su:
su root " su user to root"
suloin:
sulogin /dev/tty4 "waiting login in tty4"
chmod:
chmod a+x file " let file can be excute"
chmod 666 file " let file can be write "
mknod:
mknod /dev/hda1 b 3 1 " make a block device "
mknod /dev/tty1 c 4 1 " make a chare device "
touch:
touch /tmp/running " touch a file "
sleep:
sleep 9 " console sleep 9 seconds"
lpd:
lpd stop
lpd start
lpd restart "restart printer service"
lpr:
lpr file.txt "print a file ot printer"
zhprint:
zhpinrt -gb file.txt "print a chinese file to printer"
disk command
fdisk
fdisk /dev/hda "creat or delete disk partition"
cfdisk
cfdisk /dev/hda "creat or delete disk partition"
mount:
mount -t ext2 /dev/hda1 /mnt “把/dev/hda1装载到 /mnt目录”
mount -t iso9660 /dev/cdrom /mnt
mount-t smb //192.168.1.5/sharedir /mnt -o username=id,password=id
mount -t nfs 192.168.1.1:/sharedir /mnt
umount:
umount /mnt “umount /mnt directory”
umount /dev/hda1 “umount device /dev/hda1”
sync:
sync "write all cache into disk"
e2fsck:
e2fsck /dev/hda1 "check disk"
e2fsck -p "check and automatic repair disk"
e2fsck -y "check and Assume "yes" to all questions"
e2fsck -c "Check disk bad blocks"
mkfs:
mkfs /dev/hda1 "format pratitionk"
mkswap:
mfks /dev/hda9 "format a swap partition"
swapon:
swapon /dev/hda9 "use a swap partition"
swapoff:
swapoff /dev/hda9 " close a swap partion"
lilo:
lilo "/etc/lilo.config is needed"
lilo -C lilo.conf
"configure disk boot loader"
rdev:
rdev bzImage "show root file system"
rdev bzImage /dev/hda1 "define /dev/hda1 as root file system"
df:
df "show mounted partition use information"
dd:
dd if=root.ram of=/dev/ram0
dd if=/dev/fd0 of=root.ram
dd if=/dev/zero of=root.ram bs=1024,count=1024
who:
who "show logined user"
whoami:
whoami "show who am I"
whereis:
whereis command "show where is the command"
programer command
gcc:
gcc hello.c “compile hello.c,default is a dynamic program”
gcc hello.c -o hello “compile hello.c and out put file as hello”
gcc -static -o hello hello.c “compile a static program”
strace:
strace netscape "trace and list all open/write file by netscape program"
ps:
ps
ps –ef "show running program pid"
kill:
kill -9 500 "kill PID 500"
killall:
killall -9 netscape "kill program netscape"
top:
top "show system cpu and memory use information"
free:
free "show free memory"
time:
time program "calculate program run time"
configure command
ifconfig:
ifconfig eth0 192.168.1.1 “define first Ethernet’s IP is 192.168.1.1”
ifconfig down eth1 “disable seconde Ethernet”
hostname:
hostname -F id.com “define hostname is id.com”
route:
route del default “delete default router”
route add default gw 192.168.1.1 metric 1 “add 192.168.1.1 as a default route”
adduser:
adduser id "add a new user"
userdel:
userdel id "delete user id"
userlist:
userlist "list logined user"
passwd:
passwd id "change id's login password"
passwd -d id "delete id's login password"
chown:
chown id /work "let the /work to be id's directory"
probe:
probe rtl8139 "veriry driver"
lsmod:
lsmod "list already install driver"
insmod:
insmod rtl8139.o "install a driver"
insmod sb.o io=0x280 irq=7 dma=3 dma16=7 mpu_io=330
rmmod:
rmmod rtl8139 "delete a driver from system"
gpm:
gpm -k "kill mouse"
gpm -t ps2 "run ps2 mouse"
Xconfigure:
Xconfigure "configure X-windows option"
turboservice:
turboservier "configure turbo linux servier"
turboftp:
turboftp "configure turbo linux ftp server"
turbotelnet:
turbotelnet "configure turbo linux telnet server"
turbonetcfg:
turbonetcfg "configure network options"
turboppp:
turboppp "configure ppp dialog options"
turboappchecfg:
turboappchecfg "configure turbo linux appche server"
network command
telnet:
telnet 192.168.1.1
telnet iserver.com
ftp:
ftp 192.168.1.1
ftp iserver.com
dhcp:
dhcp "run dhcp server"
ping:
ping 163.com
ping 202.96.128.68 "check network"
posted @
2007-01-24 12:53 Q系列类、方法、变量…… 阅读(257) |
评论 (0) |
编辑 收藏
如果 MySQL 正在运行,首先杀之: killall -TERM mysqld。
启动 MySQL :/usr/bin/safe_mysqld --skip-grant-tables & 就可以不需要密码就进入 MySQL 了。
然后就是 >use mysql >update user set password=password("new_pass") where user="root"; >flush privileges; 重新杀 MySQL ,用正常方法启动 MySQL 。
Redhat的safe_mysqld在/usr/bin下,而使用tarball缺省安装在/usr/local/bin下。
posted @
2007-01-24 12:48 Q系列类、方法、变量…… 阅读(196) |
评论 (0) |
编辑 收藏
1、合作。不要随便与人合作,与人合作要考虑好利与弊。如果有想法尽快去干,一个人努力的干,卖命的干。干到差不了,有资本了,可以与人短期性的合作。与人合作目标要明确。
2、努力。工作要努力,随随便便过日子过四五年也是过,稍微努力的过四五年也是过,努力的过四五年也是过,何不努力好好的干。如果努力的过好毕业后的四五年,这对我们以后的人生很有帮助。
3、吃苦耐劳。不要怕吃苦。在创业阶段,我们要的是名气,是经验,有时候在保本的情况下可以以低价策略来和别人竞争。我们出卖的是点脑力活,力气活,年轻人,睡一觉起来什么都恢复了。
4、目标。生活要有目标,不仅仅是事业(赚钱)的目标,其他方面也要有目标,如爱情方面的目标,健康、家庭方面的目标。各个目标都要重视。只赚了钱,不算人生的成功。
5、虚心学习。多与比自己大的人(长辈)/ 成功人事。交流学习,要虚心听取认真分析他们的意见和建议,一面自己以后走弯路。
6、了解社会。多了解社会。多实践。多分析某些社会现象的因果厉害关系。认真分析身边发生某些事情。正视社会的阴暗面。分析社会上某些不良风气,不要清高自傲。也不要随波逐流。某些时候半事情,也需要这方面的帮助。
7、自由。出来外面做事情,关键是自由,愉快,能学到知识。每走一步都要分析,不要因某一小点利益限制了自己的自由。
8、计划。给自己定一个五年计划,十年规划。每季度做什么事情,每个月做什么事情。甚至每天做什么事情,有个计划,有个目标比较好。不要每天浑浑噩噩。几年后你会发现,几年来一直没有目标,什么也没有做成。
9、胆量。你是工人的子弟,或是农民的儿子,难免思想狭隘。不要盲目。盲从,也不要胆小怕事。多锻炼,大胆去做事情,只要不违法。大胆去做。即使失败了,也为下次积累经验。“商场如战场” ,这句话一点不假。想想,在战场上,不是你死就是我亡。
10、谋略。人生活在社会上,就是要用自己的智慧谋略和别人都智斗勇。即使某些人的成功,不是电视小说里说的那么偶然的。有其必然性。生活中不玩点小技巧(犯法的不做。害人的不做)。哪能那么容易就成功。
11、不要害怕贫穷。也许你家里没有几十万是百万。大胆的去做事情,不要怕贫穷。即使我们事情做失败了,我们大不了回到起点。还是穷人。
12、学习。不断充实自己。学习新的知识。多学点技能。为以后作准备。也可作为以后的娱乐消遣。如:驾驶技术,炒菜做饭,毛笔字等。
13.、惜时。如果以上你都做了,我估计你的时间过得很快。我常听某某人说:“这一辈子,就象昨天今天一样。”,毛泽东说“天地转,光阴迫。一万年太久,只争朝夕。”“ 三是八年过去弹指一挥间。”,不要因碌碌无为而悔恨!!!
posted @
2007-01-24 12:45 Q系列类、方法、变量…… 阅读(150) |
评论 (0) |
编辑 收藏
Evan Williams是Blogger的创始人,也是podcast服务网站Odeo的创始人和CEO。他根据自己的体会,列出了Web创业应该遵循的10条戒律(Ten Rules for Web Startups),摘录并评注如下:
收缩:专注于一个尽可能小的可能存在的难题,而你又能够解决这个难题。不要想着什么都做,贪多嚼不烂,搞不好就成了模仿者。小可以变大,船小好调头,小可以带给你很多优势,缝隙市场可以变成一个大市场。不要试图把1亿上网用户都当成你的用户,没用,能真正解决一部分用户的一部分需求,就足够你玩儿的。
差异:要记住很多人都在做着跟你一样的事情,而其中一个是Google。在这个市场上,专才比通才有用。不一定要做多么领先的事情,寻常的事情你同样可以做得跟别人不一样,比如Google。起名字也不要用那些通用词汇,比如像博客网、中国博客网、亚洲博客网、世界博客网之类的,太多了没人分得清谁是谁。
随意:随意的网络要大于刻意的网络,因为人们还要生活。创建一种服务让它适应并对人们每天的生活有所助益,而不要要求太多的承诺或改变他们的身份。放轻松,很多时候,偶然的需要让你的服务更有价值,就像Skype上偶然发生的对话。既然生活本身就是随意的、偶然的,不要总是试图限制用户。
挑剔:这一点适用于很多方面:服务的特性、员工、投资者、合作伙伴、记者采访等等。如果感觉某样东西不太对劲,就放一放。Google最强大的力量之一,就是他们乐于对机会、快钱、可能的雇员以及交易说不。但很多人太心切,太怕错过这村没这店,所以往往来者不拒,最终将会后悔。
以用户为中心:用户体验就是一切。你的整个公司都必须建立在这上面,如果你不懂什么叫以用户为中心的设计,赶快学,雇用懂的人。把对的特性做对,远超过添加一百个特性。Ajax是为了让网站更互动,而不是因为它很性感。API是为了让开发者更容易为用户增加价值,而不是为了去取悦geek们。
自我本位:伟大的产品从来都是来自一个人自身的渴求。创造你自己需要的产品,成为你自己产品的用户,雇用你的产品的用户,按你自己的愿望改善它。另一方面,避免在费用、用户、或者有可能妨碍你改善产品等方面,跟大公司做交易。因为你小他们大,你很难说不。
饥渴:有选择永远好过没选择,最好的办法就是有收入。要为你的产品设计出收费模式并在6个月内开始有进项,这样你才会有市场费用。而且,有收入也会让你在融资或收购谈判中,处于更有利的位置。不过在中国可能没这么简单,为了赚钱而让服务变形的事总是在发生着。
苗条:保持低成本是一种Web创业智慧。能使用互联网上现有的服务,就不要花钱买。如果你希望被大公司收购,就更不能让自己显得很庞杂,小公司更容易被收购。Tim O'Reilly说过,如果你看到一家公司在市场活动上花很多钱,你可以肯定地知道,这不是一家Web 2.0公司。充分利用互联网现成的资源,也是一种能力。
灵活:要学会改变计划。Pyra最初要做的是一个项目管理程序,而不是Blogger。Flickr最初要做的是游戏。Ebay最初也只是想销售拍卖软件。最初的设想几乎永远都是错的。一开始就认定自己是对的,很可能撞上南墙。要把创业过程,变成一个BETA过程,不断debug,不断调整,不断改进。
平衡:初创公司是什么样?目光迷离、睡眠不足、垃圾食品充饥、咖啡提神……还有呢?要知道,自然要求健康的平衡,当平衡成为你的公司的一部分,你就拥有了一样秘密武器。需要玩儿命,也需要玩儿。一个充满活力的平衡的团队,也会给人更多的信任和期待。
谨慎(这个是额外的奖励):不要拿上面的戒律当成金科玉律,凡事总有例外。
posted @
2007-01-24 12:44 Q系列类、方法、变量…… 阅读(145) |
评论 (0) |
编辑 收藏
控制横向和纵向滚动条的显隐?
<body style="overflow-y:hidden"> 去掉x轴
<body style="overflow-x:hidden"> 去掉y轴
<body scroll="no">不显
--------------------------------------------------------------------------------
表格变色
<TD onmouseover="this.style.backgroundColor='#FFFFFF'"
onmouseout="this.style.backgroundColor=''"
style="CURSOR: hand">
--------------------------------------------------------------------------------
禁止复制,鼠标拖动选取
<body ondragstart=window.event.returnValue=false oncontextmenu=window.event.returnValue=false onselectstart=event.returnValue=false>
--------------------------------------------------------------------------------
普通iframe页面
<iframe name="name" src="main.htm" width="450" height="287" scrolling="Auto" frameborder="0"></iframe>
--------------------------------------------------------------------------------
iframe自适应高度
<iframe name="pindex" src="index.asp" frameborder=false scrolling="auto" width="100%" height="100%" frameborder=no onload="document.all['pindex'].style.height=pindex.document.body.scrollHeight" ></iframe>
--------------------------------------------------------------------------------
IE地址栏前换成自己的图标&可以在收藏夹中显示出你的图标
<link rel="Shortcut Icon" href="favicon.ico">
<link rel="Bookmark" href="favicon.ico">
--------------------------------------------------------------------------------
字号缩放
越来越多的人长时间的泡网,眼镜的普及率也越来越高,让文字大点,让更多的用户看的更清楚。
<script type="text/javascript">
function doZoom(size)
{document.getElementById('zoom').style.fontSize=size+'px';}
</script>
<span id="zoom">需要指定大小的文字</span>
<a href="javascript:doZoom(16)">大</a> <a href="javascript:doZoom(14)">中</a> <a href="javascript:doZoom(12)">小</a>
--------------------------------------------------------------------------------
select挡住div的解决方法
在div里加入下面的代码,根据需要调整就可以了。
<iframe src="javascript:false" scrolling="no" frameborder="0" style="z-index:-1;position:absolute; top:5px; left:2px;width:168;height:100px;">
</iframe>
--------------------------------------------------------------------------------
iframe(嵌入式帧)自适应高度
填写的嵌入地址一定要和本页面在同一个站点上,否则会提示“拒绝访问!”。对跨域引用有权限问题,请查阅其他资料。
<iframe name="guestbook" src="gbook/index.asp" scrolling=no width="100%" height="100%" frameborder=no onload="document.all['guestbook'].style.height=guestbook.document.body.scrollHeight"></iframe>
--------------------------------------------------------------------------------
跳转菜单新窗口
<select name="select" onchange="window.open(this.options[this.selectedIndex].value)">
<option value="http://www.microsoft.com/ie"> Internet Explorer</option>
<option value="http://www.microsoft.com"> Microsoft Home</option>
<option value="http://msdn.microsoft.com"> Developer Network</option>
</select>
--------------------------------------------------------------------------------
flash透明选项
<param name="wmode" value="transparent">
--------------------------------------------------------------------------------
添加到收藏夹和设为首页
<a href=# onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.makewing.com/lanren/');">设为首页</a>
<a href="javascript:window.external.AddFavorite('http://www.makewing.com/lanren/','懒人图库')">收藏本站</a>
--------------------------------------------------------------------------------
记录并显示网页的最后修改时间
<script language=JavaScript>
document.write("最后更新时间: " + document.lastModified + "")
</script>
--------------------------------------------------------------------------------
节日倒计时
<Script Language="JavaScript">
var timedate= new Date("October 1,2002");
var times= "国庆节";
var now = new Date();
var date = timedate.getTime() - now.getTime();
var time = Math.floor(date / (1000 * 60 * 60 * 24));
if (time >= 0)
document.write( "现在离"+times+"还有: "+time +"天")
</Script>
--------------------------------------------------------------------------------
加在HEAD里
禁止缓存
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">
--------------------------------------------------------------------------------
让IFRAME框架内的文档的背景透明
<iframe src="about:<body style='background:transparent'>" allowtransparency></iframe>
--------------------------------------------------------------------------------
打开窗口即最大化
<script language="JavaScript">
<!-- Begin
self.moveTo(0,0)
self.resizeTo(screen.availWidth,screen.availHeight)
// End -->
</script>
--------------------------------------------------------------------------------
加入背景音乐
<bgsound src="mid/windblue[1].mid" loop="-1"> 只适用于IE
<embed src="music.mid" autostart="true" loop="true" hidden="true"> 对Netscape ,IE 都适用
--------------------------------------------------------------------------------
滚动
<marquee direction=up height=146 onmouseout=start() onmouseover=stop() scrollAmount=2>滚动信息
</marquee>
--------------------------------------------------------------------------------
防止点击空链接时,页面往往重置到页首端
代码“javascript:void(null)”代替原来的“#”标记
--------------------------------------------------------------------------------
文字或图片弹出指定大小的窗口
在body中加入
<script language="JavaScript" type="text/JavaScript">
function MM_openBrWindow(theURL,winName,features) {window.open(theURL,winName,features);}
</script>
弹出代码
<a href="#" target="_self" onClick="MM_openBrWindow('windows01.htm','','width=550,height=380')" width="550" height="380" border="0">图片或文字</a>
--------------------------------------------------------------------------------
flash按钮加链接
on (press) {
getURL("http://www.makewing.com","_blank");
}
--------------------------------------------------------------------------------
跳转页面代码
<meta http-equiv="refresh" content="5;url=http://www.makewing.com">
--------------------------------------------------------------------------------
细线分隔线
<hr noshade size=0 color=#C0C0C0>
--------------------------------------------------------------------------------
网页中的自动换行
<td style="word-break:break-all">就搞定了。
完整的是
style="table-layout: fixed;WORD-BREAK: break-all; WORD-WRAP: break-word"
--------------------------------------------------------------------------------
消除ie6自动出现的图像工具栏,设置 GALLERYIMG属性为false或no .
<IMG SRC="mypicture.jpg" HEIGHT="100px" WIDTH="100px" GALLERYIMG="no">
--------------------------------------------------------------------------------
禁止页面正文内容被选取
<body oncontextmenu="return false" ondragstart="return false" onselectstart ="return false" onselect="document.selection.empty()" oncopy="document.selection.empty()" onbeforecopy="return
false"onmouseup="document.selection.empty()">
--------------------------------------------------------------------------------
不能点右键,不用CTRL+A,不能复制作!
<body oncontextmenu="window.event.returnValue=false"
onkeypress="window.event.returnValue=false"
onkeydown="window.event.returnValue=false"
onkeyup="window.event.returnValue=false"
ondragstart="window.event.returnValue=false"
onselectstart="event.returnValue=false">
</body>
--------------------------------------------------------------------------------
IE浏览器支持一个 Body 属性 bgproperties,它可以让背景不滚动:
<Body Background="图片文件" bgproperties="fixed">
--------------------------------------------------------------------------------
随机变换背景图象(一个可以刷新心情的特效)
<Script Language="JavaScript">
image = new Array(4); //定义image为图片数量的数组
image [0] = 'tu0.gif' //背景图象的路径
image [1] = 'tu1.gif'
image [2] = 'tu2.gif'
image [3] = 'tu3.gif'
image [4] = 'tu4.gif'
number = Math.floor(Math.random() * image.length);
document.write("<BODY BACKGROUND="+image[number]+">");
</Script>
--------------------------------------------------------------------------------
flash载入影片
on (release)
{
loadMovie("1-01.swf", "_root.loaderclip");
}
--------------------------------------------------------------------------------
图片表单按钮
<form id="form1" name="form1" method="post" action="">
<img src="login.gif" width="62" height="22" onclick="document.form1.submit()" />
</form>
--------------------------------------------------------------------------------
左右阴影背景的CSS定义方法
body {
text-align:center;
background-repeat: repeat-y;
background-position: center;
background-image: url(../images/bg.jpg);
}
--------------------------------------------------------------------------------
划过链接 手型鼠标
style="cursor:hand"
--------------------------------------------------------------------------------
如何关闭层
<div id="Layer1"></div>
<a href="#" onClick="Layer1.style.display='none'">关闭层</a>
--------------------------------------------------------------------------------
关闭窗口的脚本
<a href=javascript:close()>[关闭窗口]</a>
--------------------------------------------------------------------------------
如果文字过长,则将过长的部分变成省略号显示
<DIV STYLE="width: 120px; height: 50px; border: 1px solid blue;overflow: hidden; text-overflow:ellipsis">
<NOBR>就是比如有一行文字,很长,表格内一行显示不下.</NOBR>
</DIV>
--------------------------------------------------------------------------------
进入主页后自动最大化
<script>
self.moveTo(0,0)
self.resizeTo(screen.availWidth,screen.availHeight)
</script>
--------------------------------------------------------------------------------
凹陷文字
<div style="width:300px;padding:20px;overflow:hidden;word-wrap:break-word;word-break:break:all; font-size:12px; line-height:18px; background-color:#eeeeee;">
<font disabled>
怎么样,我凹下去了吧?<br>
你不想试试吗?<br>
<a href="http://www.lenvo.cn/">www.lenvo.cn</a></font>
</div>
--------------------------------------------------------------------------------
运行代码框
<script>
function Preview()
{var TestWin=open('');
TestWin.document.write(code.value);}
</script>
<textarea id=code cols=60 rows=15>
posted @
2007-01-24 12:39 Q系列类、方法、变量…… 阅读(228) |
评论 (0) |
编辑 收藏
posted @
2007-01-24 12:38 Q系列类、方法、变量…… 阅读(181) |
评论 (0) |
编辑 收藏
目前互联网上流行一种病毒,确实令人头疼,当我启动IE时,就会不定期弹出一些垃圾广告或者黄色网站的窗口。在注册表中查到它和另一个地址有关。删除该键值后仍会从新出现。用卡巴斯基反病毒Personal 的10.21病毒库,只能除去sucy.exe及sucy.dll。删除sucy.exe及sucy.dll后,注册表中无显示。启动IE 问题依旧。总是不定期弹出一些垃圾广告或者黄色网站的窗口。确实让人头疼费解,那么我们应该如何防治呢?经过百般测试和试验,总结出来了一点小技巧,来帮助大家解决这一苦不堪言的痛楚:
第一步:打开开始菜单→运行→输入regsvr32 NaviHelper.dll -u
第二步:重新启动以后,除Windows \system32下的“NaviHelper.dll”和“Host.dat”就可以搞定了。
您不妨也试一试,反正我是将那让人痛恨的圾广告或者黄色网站自动强行弹出的窗口给封杀了,现在再也不用为垃圾广告侵占我的IE而烦恼了!
posted @
2007-01-24 12:37 Q系列类、方法、变量…… 阅读(240) |
评论 (0) |
编辑 收藏
JavaScript 参考教程
现在我们将开始讨论更“实际”的话题——文档对象(DOM)。文档对象是指在网页文档里划分出来的对象。在 JavaScript 能够涉及的范围内有如下几个“大”对象:window, document, location, navigator, screen, history 等。下面是一个文档对象树,你可以看到对象下包含对象的“壮观”情景。要引用某个对象,就要把父级的对象都列出来。例如,要引用某表单“applicationForm”的某文字框“customerName”,就要用“document.applicationForm.customerName”。
下表中有些对象是全小写的,有些是以大写字母开头的。以大写字母开头的对象表示,引用该对象不使用下表列出的名字,而直接用对象的“名字”(Id 或 Name,下面有讲解),或用它所属的对象数组指定。
这里我们不准备讲解对象的“事件”,虽然我们也会列出对象所能响应的事件。我们将会在下一章“事件处理”中讲解事件。
navigator 浏览器对象
反映了当前使用的浏览器的资料。
属性
appCodeName 返回浏览器的“码名”(?),流行的 IE 和 NN 都返回 'Mozilla'。
appName 返回浏览器名。IE 返回 'Microsoft Internet Explorer',NN 返回 'Netscape'。
appVersion 返回浏览器版本,包括了大版本号、小版本号、语言、操作平台等信息。
platform 返回浏览器的操作平台,对于 Windows 9x 上的浏览器,返回 'Win32'(大小写可能有差异)。
userAgent 返回以上全部信息。例如,IE5.01 返回 'Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)'。
javaEnabled() 返回一个布尔值,代表当前浏览器允许不允许 Java。
screen 屏幕对象
反映了当前用户的屏幕设置。
属性
width 返回屏幕的宽度(像素数)。
height 返回屏幕的高度。
availWidth 返回屏幕的可用宽度(除去了一些不自动隐藏的类似任务栏的东西所占用的宽度)。
availHeight 返回屏幕的可用高度。
colorDepth 返回当前颜色设置所用的位数 - 1:黑白;8:256色;16:增强色;24/32:真彩色
window 窗口对象
最大的对象,它描述的是一个浏览器窗口。一般要引用它的属性和方法时,不需要用“window.xxx”这种形式,而直接使用“xxx”。一个框架页面也是一个窗口。
属性
name 窗口的名称,由打开它的连接()或框架页()或某一个窗口调用的 open() 方法(见下)决定。一般我们不会用这个属性。
status 指窗口下方的“状态栏”所显示的内容。通过对 status 赋值,可以改变状态栏的显示。
opener 用法:window.opener;返回打开本窗口的窗口对象。注意:返回的是一个窗口对象。如果窗口不是由其他窗口打开的,在 Netscape 中这个属性返回 null;在 IE 中返回“未定义”(undefined)。undefined 在一定程度上等于 null。注意:undefined 不是 JavaScript 常数,如果你企图使用“undefined”,那就真的返回“未定义”了。
self 指窗口本身,它返回的对象跟 window 对象是一模一样的。最常用的是“self.close()”,放在标记中:“关闭窗口”。
parent 返回窗口所属的框架页对象。
top 返回占据整个浏览器窗口的最顶端的框架页对象。
history 历史对象,见下。
location 地址对象,见下。
document 文档对象,见下。
方法
open() 打开一个窗口。用法:open(, <窗口名称字符串>, <参数字符串>);
:描述所打开的窗口打开哪一个网页。如果留空(''),则不打开任意网页。
<窗口名称字符串>:描述被打开的窗口的名称(window.name),可以使用'_top'、'_blank'等内建名称。这里的名称跟“”里的“target”属性是一样的。
<参数字符串>:描述被打开的窗口的样貌。如果只需要打开一个普通窗口,该字符串留空(''),如果要指定样貌,就在字符串里写上一到多个参数,参数之间用逗号隔开。onload; onunload; onresize; onblur; onfocus; onerror
例:打开一个 400 x 100 的干净的窗口:
open('','_blank','width=400,height=100,menubar=no,toolbar=no,
location=no,directories=no,status=no,scrollbars=yes,resizable=yes')
参数
|
|
top=# |
窗口顶部离开屏幕顶部的像素数 |
left=# |
窗口左端离开屏幕左端的像素数 |
width=# |
窗口的宽度 |
height=# |
窗口的高度 |
menubar=... |
窗口有没有菜单,取值yes或no |
toolbar=... |
窗口有没有工具条,取值yes或no |
location=... |
窗口有没有地址栏,取值yes或no |
directories=... |
窗口有没有连接区,取值yes或no |
scrollbars=... |
窗口有没有滚动条,取值yes或no |
status=... |
窗口有没有状态栏,取值yes或no |
resizable=... |
窗口给不给调整大小,取值yes或no |
open() 方法有返回值,返回的就是它打开的窗口对象。所以,
var newWindow = open('','_blank');
这样把一个新窗口赋值到“newWindow”变量中,以后通过“newWindow”变量就可以控制窗口了。
close() 关闭一个已打开的窗口。
用法:window.close() 或 self.close():关闭本窗口;
<窗口对象>.close():关闭指定的窗口。
如果该窗口有状态栏,调用该方法后浏览器会警告:“网页正在试图关闭窗口,是否关闭?”然后等待用户选择是否;如果没有状态栏,调用该方法将直接关闭窗口。
blur() 使焦点从窗口移走,窗口变为“非活动窗口”。
focus() 是窗口获得焦点,变为“活动窗口”。不过在 Windows 98,该方法只能使窗口的标题栏和任务栏上的相应按钮闪烁,提示用户该窗口正在试图获得焦点。
scrollTo() 用法:[<窗口对象>.]scrollTo(x, y);使窗口滚动,使文档从左上角数起的(x, y)点滚动到窗口的左上角。
scrollBy() 用法:[<窗口对象>.]scrollBy(deltaX, deltaY);使窗口向右滚动 deltaX 像素,向下滚动 deltaY 像素。如果取负值,则向相反的方向滚动。
resizeTo() 用法:[<窗口对象>.]resizeTo(width, height);使窗口调整大小到宽 width 像素,高 height 像素。
resizeBy() 用法:[<窗口对象>.]resizeBy(deltaWidth, deltaHeight);使窗口调整大小,宽增大 deltaWidth 像素,高增大 deltaHeight 像素。如果取负值,则减少。
alert() 用法:alert(<字符串>);弹出一个只包含“确定”按钮的对话框,显示<字符串>的内容,整个文档的读取、Script 的运行都会暂停,直到用户按下“确定”。
confirm() 用法:confirm(<字符串>);弹出一个包含“确定”和“取消”按钮的对话框,显示<字符串>的内容,要求用户做出选择,整个文档的读取、Script 的运行都会暂停。如果用户按下“确定”,则返回 true 值,如果按下“取消”,则返回 false 值。
prompt() 用法:prompt(<字符串>[, <初始值>]);弹出一个包含“确认”“取消”和一个文本框的对话框,显示<字符串>的内容,要求用户在文本框输入一些数据,整个文档的读取、Script 的运行都会暂停。如果用户按下“确认”,则返回文本框里已有的内容,如果用户按下“取消”,则返回 null 值。如果指定<初始值>,则文本框里会有默认值。
事件
history 历史对象
历史对象指浏览器的浏览历史。鉴于安全性的需要,该对象收到很多限制,现在只剩下下列属性和方法。
属性
length 历史的项数。JavaScript 所能管到的历史被限制在用浏览器的“前进”“后退”键可以去到的范围。本属性返回的是“前进”和“后退”两个按键之下包含的地址数的和。
方法
back() 后退,跟按下“后退”键是等效的。
forward() 前进,跟按下“前进”键是等效的。
go() 用法:history.go(x);在历史的范围内去到指定的一个地址。如果 x < 0,则后退 x 个地址,如果 x > 0,则前进 x 个地址,如果 x == 0,则刷新现在打开的网页。history.go(0) 跟 location.reload() 是等效的。
location 地址对象
它描述的是某一个窗口对象所打开的地址。要表示当前窗口的地址,只需要使用“location”就行了;若要表示某一个窗口的地址,就使用“<窗口对象>.location”。
注意 属于不同协议或不同主机的两个地址之间不能互相引用对方的 location 对象,这是出于安全性的需要。例如,当前窗口打开的是“www.a.com”下面的某一页,另外一个窗口(对象名为:bWindow)打开的是“www.b.com”的网页。如果在当前窗口使用“bWindow.location”,就会出错:“没有权限”。这个错误是不能用错误处理程序(Event Handler,参阅 onerror 事件)来接收处理的。
属性
protocol 返回地址的协议,取值为 'http:','https:','file:' 等等。
hostname 返回地址的主机名,例如,一个“http://www.microsoft.com/china/”的地址,location.hostname == 'www.microsoft.com'。
port 返回地址的端口号,一般 http 的端口号是 '80'。
host 返回主机名和端口号,如:'www.a.com:8080'。
pathname 返回路径名,如“http://www.a.com/b/c.html”,location.pathname == 'b/c.html'。
hash 返回“#”以及以后的内容,如“http://www.a.com/b/c.html#chapter4”,location.hash == '#chapter4';如果地址里没有“#”,则返回空字符串。
search 返回“?”以及以后的内容,如“http://www.a.com/b/c.asp?selection=3&jumpto=4”,location.search == '?selection=3&jumpto=4';如果地址里没有“?”,则返回空字符串。
href 返回以上全部内容,也就是说,返回整个地址。在浏览器的地址栏上怎么显示它就怎么返回。如果想一个窗口对象打开某地址,可以使用“location.href = '...'”,也可以直接用“location = '...'”来达到此目的。
方法
reload() 相当于按浏览器上的“刷新”(IE)或“Reload”(Netscape)键。
replace() 打开一个 URL,并取代历史对象中当前位置的地址。用这个方法打开一个 URL 后,按下浏览器的“后退”键将不能返回到刚才的页面。
frames[]; Frame 框架对象
请参阅“使用框架和 Cookies”一章。
document 文档对象
描述当前窗口或指定窗口对象的文档。它包含了文档从到的内容。
用法:document (当前窗口)
或 <窗口对象>.document (指定窗口)
属性
cookie 关于 cookie 请参看“使用框架和 Cookies”一章。
lastModified 当前文档的最后修改日期,是一个 Date 对象。
referrer 如果当前文档是通过点击连接打开的,则 referrer 返回原来的 URL。
title 指标记里用定义的文字。在 Netscape 里本属性不接受赋值。
fgColor 指标记的 text 属性所表示的文本颜色。
bgColor 指标记的 bgcolor 属性所表示的背景颜色。
linkColor 指标记的 link 属性所表示的连接颜色。
alinkColor 指标记的 alink 属性所表示的活动连接颜色。
vlinkColor 指标记的 vlink 属性所表示的已访问连接颜色。
方法
open() 打开文档以便 JavaScript 能向文档的当前位置(指插入 JavaScript 的位置)写入数据。通常不需要用这个方法,在需要的时候 JavaScript 自动调用。
write(); writeln() 向文档写入数据,所写入的会当成标准文档 HTML 来处理。writeln() 与 write() 的不同点在于,writeln() 在写入数据以后会加一个换行。这个换行只是在 HTML 中换行,具体情况能不能够是显示出来的文字换行,要看插入 JavaScript 的位置而定。如在
标记中插入,这个换行也会体现在文档中。
clear() 清空当前文档。
close() 关闭文档,停止写入数据。如果用了 write[ln]() 或 clear() 方法,就一定要用 close() 方法来保证所做的更改能够显示出来。如果文档还没有完全读取,也就是说,JavaScript 是插在文档中的,那就不必使用该方法。现在我们已经拥有足够的知识来做以下这个很多网站都有的弹出式更新通知了。
当然也可以先写好一个 HTML 文件,在 open() 方法中直接 load 这个文件。
anchors[]; links[]; Link 连接对象
用法:document.anchors[[x]]; document.links[[x]]; ;
document.anchors 是一个数组,包含了文档中所有锚标记(包含 name 属性的标记),按照在文档中的次序,从 0 开始给每个锚标记定义了一个下标。
document.links 也是一个数组,包含了文档中所有连接标记(包含 href 属性的标记和标记既有 name 属性,又有 href 属性,则它既是一个 Anchor 对象,又是一个 Link 对象。
在 IE 中,如果在标记中添加“id="..."”属性,则这个对象被赋予一个标识(ID),调用这个对象的时候只需要使用“”就行了。很多文档部件都可以用这个方法来赋予 ID,但要注意不能有两个 ID 相同。标记里的 target 属性是一样的。onclick; onmouseover; onmouseout; onmousedown; onmouseup
anchors 和 links 作为数组,有数组的属性和方法。单个 Anchor 对象没有属性;单个 Link 对象的属性见下。
属性
protocol; hostname; port; host; pathname; hash; search; href 与 location 对象相同。
target 返回/指定连接的目标窗口(字符串),与
事件
applets[] Java小程序对象
它是一个数组,包含了文档中所有的 Applet 对象(Java 小程序)。作为一个数组,有数组的属性和方法。关于单个 Applet 对象的属性和方法,我引用一句话:“Applet 对象继承了 Java 小程序的所有公共属性和方法。”(英文原句:The Applet object inherits all public properties of the Java applet./The Applet object inherits all public methodss of the Java applet.) 因为本人很厌恶 Java 小程序,所以对它的什么“公共”“私有”的问题不感兴趣,也就没有探讨了。
embeds[] 插件对象
它是一个数组,包含了文档中所有的插件(
forms[]; Form 表单对象
document.forms[] 是一个数组,包含了文档中所有的表单(
标记中加上“name="..."”属性,那么直接用“document.<表单名>”就可以引用了。
Form 对象的属性
name 返回表单的名称,也就是
属性。
method 返回/设定表单的提交方法,也就是属性。
target 返回/设定表单提交后返回的窗口,也就是属性。
encoding 返回/设定表单提交内容的编码方式,也就是属性。
length 返回该表单所含元素的数目。方法
reset() 重置表单。这与按下“重置”按钮是一样的。
submit() 提交表单。这与按下“提交”按钮是一样的。
事件
onreset; onsubmit
以下从“Button”到“Textarea”都是表单的元素对象。
Button 按钮对象
由“”指定。引用一个 Button 对象,可以使用“<文档对象>.<表单对象>.<按钮名称>”。<按钮名称>指在标记中的“name="..."”属性的值。引用任意表单元素都可以用这种方法。
属性
name 返回/设定用指定的元素名称。
value 返回/设定用指定的元素的值。
form 返回包含本元素的表单对象。
方法
blur() 从对象中移走焦点。
focus() 让对象获得焦点。
click() 模拟鼠标点击该对象。
事件
onclick; onmousedown; onmouseup
Checkbox 复选框对象
由“”指定。
属性
name 返回/设定用指定的元素名称。
value 返回/设定用指定的元素的值。
form 返回包含本元素的表单对象。
checked 返回/设定该复选框对象是否被选中。这是一个布尔值。
defaultChecked 返回/设定该复选框对象默认是否被选中。这是一个布尔值。
方法
blur() 从对象中移走焦点。
focus() 让对象获得焦点。
click() 模拟鼠标点击该对象。
事件
onclick
elements[]; Element 表单元素对象
<表单对象>.elements 是一个数组,包含了该表单所有的对象。一般我们不用该数组,而直接引用各个具体的对象。
Hidden 隐藏对象
由“”指定。
属性
name 返回/设定用指定的元素名称。
value 返回/设定用指定的元素的值。
form 返回包含本元素的表单对象。
Password 密码输入区对象
由“”指定。
属性
name 返回/设定用指定的元素名称。
value 返回/设定密码输入区当前的值。
defaultValue 返回用指定的默认值。
form 返回包含本元素的表单对象。
方法
blur() 从对象中移走焦点。
focus() 让对象获得焦点。
select() 选中密码输入区里全部文本。
事件
onchange
Radio 单选域对象
由“”指定。一组 Radio 对象有共同的名称(name 属性),这样的话,document.formName.radioName 就成了一个数组。要访问单个 Radio 对象就要用:document.formName.radioName[x]。
单个 Radio 对象的属性
name 返回/设定用指定的元素名称。
value 返回/设定用指定的元素的值。
form 返回包含本元素的表单对象。
checked 返回/设定该单选域对象是否被选中。这是一个布尔值。
defaultChecked 返回/设定该对象默认是否被选中。这是一个布尔值。
方法
blur() 从对象中移走焦点。
focus() 让对象获得焦点。
click() 模拟鼠标点击该对象。
事件
onclick
Reset 重置按钮对象
由“”指定。因为 Reset 也是按钮,所以也有 Button 对象的属性和方法。至于“onclick”事件,一般用 Form 对象的 onreset 代替。
Select 选择区(下拉菜单、列表)对象
由“指定的元素名称。
length 返回 Select 对象下选项的数目。
selectedIndex 返回被选中的选项的下标。这个下标就是在 options[] 数组中该选项的位置。如果 Select 对象允许多项选择,则返回第一个被选中的选项的下标。
form 返回包含本元素的表单对象。
方法
blur() 从对象中移走焦点。
focus() 让对象获得焦点。
事件
onchange
options[]; Option 选择项对象
options[] 是一个数组,包含了在同一个 Select 对象下的 Option 对象。Option 对象由“指定。因为 Submit 也是按钮,所以也有 Button 对象的属性和方法。至于“onclick”事件,一般用 Form 对象的 onsubmit 代替。
Text 文本框对象
由“”指定。Password 对象也是 Text 对象的一种,所以 Password 对象所有的属性、方法和事件,Text 对象都有。
Textarea 多行文本输入区对象
由“
posted @
2006-11-27 12:47 Q系列类、方法、变量…… 阅读(402) |
评论 (0) |
编辑 收藏
du -sh 文件或目录名
用法:du [选项]... [文件]...
总结每个<文件>的磁盘用量,目录则取总用量。
长选项必须用的参数在使用短选项时也是必须的。
-a, --all write counts for all files, not just directories
-B, --block-size=SIZE use SIZE-byte blocks
-b, --bytes print size in bytes
-c, --total produce a grand total
-D, --dereference-args dereference FILEs that are symbolic links
-h, --human-readable 以容易理解的格式印出文件大小 (例如 1K 234M 2G)
-H, --si 类似 -h,但取 1000 的次方而不是 1024
-k 即 --block-size=1K
-l, --count-links 连硬链接的大小也计算在内
-L, --dereference 找出任何符号链接指示的真正目的地
-S, --separate-dirs 不包括子目录的占用量
-s, --summarize 只分别计算命令列中每个参数所占的总用量
-x, --one-file-system skip directories on different filesystems
-X FILE, --exclude-from=FILE Exclude files that match any pattern in FILE.
--exclude=PATTERN Exclude files that match PATTERN.
--max-depth=N print the total for a directory (or file, with --all)
only if it is N or fewer levels below the command
line argument; --max-depth=0 is the same as
--summarize
posted @
2006-11-03 13:20 Q系列类、方法、变量…… 阅读(622) |
评论 (0) |
编辑 收藏
Thunderbird 前卫的中文附件处理导致落后邮件客户端兼容问题的解决
posted @
2006-10-26 16:27 Q系列类、方法、变量…… 阅读(394) |
评论 (0) |
编辑 收藏
调用方法:
将整个htmlArea解压到需要修改的html文件的同级目录下的htmlarea目录下。
<head>和</head>之间加入:
代码:
<style type="text/css">
at import url(htmlarea/htmlarea dot css);
</style>
<script type="text/javascript">
_editor_url = "htmlarea"; // omit the final slash
</script>
<!-- load the main HTMLArea files -->
<script type="text/javascript" src="htmlarea/htmlarea.js"></script>
<script type="text/javascript" src="htmlarea/lang/gb.js"></script>
<script type="text/javascript" src="htmlarea/dialog.js"></script>
<script type="text/javascript" src="htmlarea/popupwin.js"></script>
<script type="text/javascript">
var editor = null;
function initEditor(){
editor = new HTMLArea("textareaname");
editor.generate();
return false;
}
</script>
然后将<body>改为
代码:
<body onload="initEditor()">
调用的时候使用
<html:textarea styleId="textareaname" property="textareaname" rows="20" style="width:100%" />
记得上面的name必须和上面script中制定的new HTMLArea("xx")里面的东西一样!另外 style="width:1000%"也必须有
如果使用jsp的c:out那么记得加入escapXml即可
<c:out value="${requestScope.NewsInfo.memo}" escapeXml="false"/>
posted @
2006-10-21 22:55 Q系列类、方法、变量…… 阅读(2986) |
评论 (3) |
编辑 收藏
在%TOMCAT_HOME%/webapp/ROOT 目录下面有一个 "你好.html",想要读取他就要设置一下 %TOMCAT_HOME%/conf/server.xml文件中的,关于Connector的描述,修改后如下:
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="80" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
posted @
2006-10-20 04:08 Q系列类、方法、变量…… 阅读(237) |
评论 (0) |
编辑 收藏
hibernator是用来专门测试HQL语句是否合法的工具,使用她可以不用编写JUNIT就可以测试自己的HQL语句是否可以从数据库中获得数据,对于新手来说特别适用
从http://hibernator.sourceforge.net/下载hibernator她是一个专门为eclipse提供的插件,下载那个完整包(WITHLIB),然后把文件释放到eclipse的plu-ing目录中,重新启动eclipse
这样eclipse就得到的一个新的“视图”,可以通过点击视图选单进入
但是一开始当我进入这个视图,并且在左边点击右键选择“Add”选项的时候,的确是出来了工程名,选择之后填写详细的数据库连接信息:
URL:jdbc:mysql://localhost:3306/3cgame
Driver:com.mysql.jdbc.Driver
但是点击“完成”按钮后说什么也不给出现左边的设置成功的标志,而是在LOG里面出现下面的错误提示:
Ignoring resources in Project output: /www3c/WebRoot/WEB-INF/classes
解决方法其实很简单,在上面下载回来的那个完整的LIB包中找到hibernator.jar包,将其拷贝到工程目录的/WEB-INF/lib目录下面,然后刷新eclipse资源就OK了!
posted @
2006-10-03 16:31 Q系列类、方法、变量…… 阅读(969) |
评论 (1) |
编辑 收藏
GregorianCalendar cal
=
new
GregorianCalendar();
Date now
=
new
Date();
cal.setTime(now);
cal.setFirstDayOfWeek(GregorianCalendar.MONDAY);
//
设置一个星期的第一天为星期1,默认是星期日
SimpleDateFormat dateutil
=
new
SimpleDateFormat(
"
yyyy-MM-dd
"
);
System.out.println(
"
now=
"
+
dateutil.format(cal.getTime()));
//
今天
cal.add(GregorianCalendar.DATE,
-
1
);
System.out.println(
"
now=
"
+
dateutil.format(cal.getTime()));
//
昨天
cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.MONDAY);
System.out.println(
"
now=
"
+
dateutil.format(cal.getTime()));
//
本周1
cal.set(GregorianCalendar.DAY_OF_MONTH,
1
);
System.out.println(
"
now=
"
+
dateutil.format(cal.getTime()));
//
本月1日
posted @
2006-09-24 19:15 Q系列类、方法、变量…… 阅读(1523) |
评论 (1) |
编辑 收藏
问题关键字:utf-8、jsp、cookie、action
使用
String value = java.net.URLEncoder.encode(中文);
Cookie cookie = new Cookie("key",value);
response.addCookie(cookie);
然后在jsp页面中使用:
<%
for(int i = 0 ;i < cookies.length ; i ++)
{
temp = cookies[i];
if(temp.getName().equals("key"))
out.print(java.net.URLDecoder.decode(temp.getValue()));
}
%> 这样就解决问题了
关键在于使用 java.net.URLEncoder.encode(中文);的字符传递,使用: java.net.URLDecoder.decode(转换后的字符);
这两个工具
posted @
2006-09-23 03:02 Q系列类、方法、变量…… 阅读(2049) |
评论 (0) |
编辑 收藏
//建立动态表单--从xml中读取
DynaActionFormClass dynaClass = DynaActionFormClass.createDynaActionFormClass(mapping.getModuleConfig().findFormBeanConfig("adminDistrictAddForm"));
//实例化动态表单
DynaValidatorForm _adminDistrictAddForm = (DynaValidatorForm) dynaClass.newInstance();
//赋值
_adminDistrictAddForm.set("id",id);
_adminDistrictAddForm.set("name",district.getName());
posted @
2006-09-18 15:45 Q系列类、方法、变量…… 阅读(516) |
评论 (1) |
编辑 收藏
Validator內建了許多基本驗證器,以下說明幾個常用的驗證器作用與基本設定方式:
required 驗證指定的欄位內容是否填寫,可判定只有空白的情況,設定範例如下:
<field property="email" depends="required"/> mask 驗證欄位內容是否符合所設定的regular expression,設定範例如下:
<field property="zipCode" depends="mask">
<arg0 key="pre.displayname0"/>
<var>
<var-name>mask</var-name>
<var-value>^\d{5}\d*$</var-value>
</var>
</field> email 檢查電子郵件格式,例如:
<field property="mail" depends="email">
<arg0 key="pre.displayname0"/>
</field> creditCard 檢查信用卡號碼格式,例如:
<field property="cardnumber" depends="creditCard">
<arg0 key="pre.displayname0"/>
</field> maxLength、minLength 驗證欄位的字元數是否符合設定的最大長度或最小長度限定,下面是maxLength的設定範例:
<field property="message" depends="maxLength">
<arg0 key="pre.displayname0"/>
<arg1 key="pre.displayname1"/>
<var>
<var-name>maxLength</var-name>
<var-value>100</var-value>
</var>
</field> range 驗證欄位的值是否在設定的範圍,例如:
<field property="priority" depends="range">
<arg0 key="pre.displayname0"/>
<var>
<var-name>max</var-name>
<var-value>100</var-value>
</var>
<var>
<var-name>min</var-name>
<var-value>0</var-value>
</var>
</field> date 驗證欄位內容是否符合日期格式,例如:
<field property="date" depends="date">
<arg0 key="pre.displayname0"/>
<var>
<var-name>datePattern</var-name>
<var-value>MM/dd/yyyy</var-value>
</var>
</field> datePattern 不檢查在日期上是否補足0,例如7/23/1978是可以的,如果使用datePatternStrict則要補上0,例如07/23/1978。
byte、short、integer、long、float、double 檢查欄位值資料型態,例如:
<field property="number" depends="integer">
<arg0 key="pre.displayname0"/>
</field>
posted @
2006-09-07 12:04 Q系列类、方法、变量…… 阅读(292) |
评论 (0) |
编辑 收藏
requiredif:根据
条件来决定是否要进行验证。
条件:通常是指跟同一个Form里的其它字段的关系。
例:
这个例子要得到的结果:
如果department为空的时候name就不能为空。反之,departmetnt非空时,name可以为空.
html:
<html:form action=/doaction>
<html:text property=name />
<html:text property=department />
</html:form> validations.xml
<form-validation>
<formset>
<form name=user>
<field property=name depends=requiredif> ----使用requiredif验证器
<arg0 key=firstname resource=false/>
<var>
<var-name>field[0]</var-name> ----相关联的第一个字段.从0开始
<var-value>departmentname</var-value> ----相关联的字段名称
</var>
<var>
<var-name>fieldTest[0]</var-name> ----条件fieldValue[0.1..] fieldTest[0.1..]
<var-value>NULL</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
相关:
fieldTest[]:NULL,NOTNULL,EQUAL 三个值
当测试条件等于EQUAL时,判断字段的值是否等于变量fieldValue[]的值
posted @
2006-09-03 23:11 Q系列类、方法、变量…… 阅读(826) |
评论 (0) |
编辑 收藏
摘要:
Struts下面的动态建立、组装“动态表单”(代码级别、非xml声明)〔原创〕
作者:邱洋
QQ:1964477
有一个动态的form(DynaValidatorForm)adminGroupModifyForm
有一个jsp文件包括以下代码:
<html:formaction="/adminGroupModify">
<html:textproperty="name">
</html:form>
现在要做的是动态的向name设置值,那么我们就在Action中动态生成adminGroupModifyForm,方法如下 阅读全文
posted @
2006-08-31 23:27 Q系列类、方法、变量…… 阅读(322) |
评论 (0) |
编辑 收藏
在win xp的命令行下输入:
netsh ini ip reset c:\resetlog.txt
posted @
2006-08-25 12:34 Q系列类、方法、变量…… 阅读(1440) |
评论 (0) |
编辑 收藏
作者:邱洋
QQ:1964477
虽然在hibernate中有show_sql选项,但是显示出来的语句大多类似
select * from xxx where value=?
但是有时候我们需要得到完整的SQL语句,怎么办呢?使用P6SPY就可以完成这个任务
p6spy是一个开源软件,它可以跟踪任何使用jdbc的应用产生的数据库操作。特别适合于监控ejb服务器产生的 sql statements。
官方网址:http://www.p6spy.com/
目前p6spy 适用的应用服务器包括jboss, atg, orion, jonas, iplanet, weblogic, websphere, resin and tomcat.
下面我介绍一下p6spy在tomcat应用程序上安装的步骤:
(1)http://www.p6spy.com/download.html,下载zip包
(2)解压出p6spy.jar spy.properties两个文件
(3)将p6spy.jar 放入应用程序的WEB-INF/lib目录,将spy.properties放入WEB-INF/classes目录
(4)修改spy.properties
realdriver =com.mysql.jdbc.Driver 将这行前面的#去掉
logfile = c:/spy.log 修改一个你需要的日志文件名
(5)修改hibernate.xml,修改connection.driver_class的值为com.p6spy.engine.spy.P6SpyDriver
(6)重启tomcat
(7)这样在c:/下的spy.log记录了数据库的访问情况。
posted @
2006-08-21 00:52 Q系列类、方法、变量…… 阅读(6758) |
评论 (5) |
编辑 收藏
有以下字符串,我要获取其中的E-MAIL地址:
String emailmessage="<qdragon@126.com>Q龙,龙少<longshao@126.com>;嘿嘿<eee@www.com>"; 最终我要的输出为:
qdragon@126.com,longshao@126.com,eee@www.com编程方法如下:
public static String escpMailAddress(String str)
{
if (str==null || str.length()==0)
return null;
//得到处理后的email地址,地址规则: <qdragon@abc.com>中文,<qdragon@abc.com>中文
Pattern patter = Pattern.compile("<(.*?)>"); //?是最小匹配
Matcher mather = patter.matcher(str);
boolean result = false;
StringBuffer sb = new StringBuffer();
int start,end;
//循环找到E-MAIL地址
for(;;)
{
result = mather.find();
if (!result)
break;
start = mather.start();
end = mather.end();
sb.append(str.substring(start, end).replaceAll("<*>*","")+",");
}
return sb.toString();
}
这样就完成了需要的功能!其中关于正则表达式中值得注意的知识如下:
*表示匹配0个或多个字符,是贪婪的(Greedy),即尽可能多地匹配字符,.*表示尽可能多地匹配非\r\n的字符
*?称为是懒惰的星号,即尽可能少地匹配字符,马上会去检测后面的字符是否满足.*?后的模式,如果不满足,则回溯;一旦后面的字符串满足模式abc,则马上停止了
*+不知道,倒是有 + 和 +?。+表示匹配1个或多个字符,是贪婪的;+?是懒惰的,在匹配一个字符之后会去检测后面的字符是否满足.+?后的模式,如果不满足,则回溯
posted @
2006-08-18 22:37 Q系列类、方法、变量…… 阅读(1354) |
评论 (1) |
编辑 收藏
Here's how to get hibernate-tools 3.1beta4 to work, disabling any MyEclipse Hibernate functionality (NOTE: This is only meant as a workaround if you absolutely NEED hibernate-tools, following the steps below might seriously screw your Eclipse/MyEclipse installation. So please only proceed if you really know what you're doing!)
OK, on to the gory details...
以下翻译开始
- Locate the MyEclipse install location, it should contain two folders "plugins" and "features". Let's call this $MYECLIPSE.
进入MyEclipse目录,然后将找到plugins和feature两个目录,下面我们将MyEclipse的目录叫做$MYECLIPSE
- Create two folders named "disabled_plugins" and "disabled_features" in $MYECLIPSE.
在$MYECLIPSE建立两个空白目录disabled_plugins和disabled_feature
- Move the MyEclipse Hibernate feature (folder: $MYECLIPSE/features/com.genuitec.myeclipse.hibernate_4.0.100 ) to the "disabled_features" folder
把“$MYECLIPSE/features/com.genuitec.myeclipse.hibernate_4.0.100”目录移动到disabled_features中
- Move the following folders from $MYECLIPSE/plugins to "disabled_plugins":
- com.genuitec.eclipse.hibernate_4.0.100
- com.genuitec.myeclipse.hibernate_4.0.100
- org.hibernate.eclipse.console_4.0.100
- org.hibernate.eclipse.mapper_4.0.100
- org.hibernate.eclipse_4.0.100
把$MYECLIPSE/plugins 中以上的五个目录或文件拷贝到 disabled_plugins目录中
- Last step: remove the dependency from the main MyEclipse feature. Open the file $MYECLIPSE/features/com.genuitec.myeclipse.enterprise.workbench_4.0.100/feature.xml.
Locate the following snippet:
最后一步,修改“$MYECLIPSE/features/com.genuitec.myeclipse.enterprise.workbench_4.0.100/feature.xml”这个文件,找到下列代码
Code: |
<includes id="com.genuitec.myeclipse.hibernate" version="4.0.100" name="MyEclipse Hibernate Support"/>
|
... and comment it out, like:
注解它,修改后的代码如下
Code: |
<!-- <includes id="com.genuitec.myeclipse.hibernate" version="4.0.100" name="MyEclipse Hibernate Support"/> -->
|
Now restart Eclipse (preferably using "-clean" switch), install hibernate-tools 3.1 (if you have not already done so) and enjoy!
重新启动MyEcliplse然后按照正常安装插件的方式安装 Hibernate tools 3.1
posted @
2006-06-09 15:13 Q系列类、方法、变量…… 阅读(1806) |
评论 (0) |
编辑 收藏
作者:余旭东
本文献给广大linux的爱好者
有人居然说设置radius要卖钱,本人花了几天的功夫,看了些资料,终于成功设置radius服务器,现在贴出来和大家分享。
笔者用的平台是RedHat Linux 7.2
一、安装mysql
本人用的是光盘上的RPM包
rpm –ivh mysql-3.23.41.1.i386.rpm
rpm –ivh mysql-devel-3.23.41.1.i386.rpm
rpm –ivh mysql-server-3.23.41.1.i386.rpm
rpm –ivh mysqlclient9-3.23.22-6.i386.rpm
启动mysql服务
service mysqld start
更改mysql的root密码(注意:mysql的root 和系统的root是2个不用的概念)
mysql –uroot –p
创建radius数据库
creat database radius;
use mysql;
update user set password=password(‘你的密码’) where user=’root’;
允许远程机器连接
update user set host=’%’ where user=’root’;
退出及重新启动mysql
quit
service mysqld restart
二、安装openSSL
本人也是用的光盘上的RPM包
rpm –ivh openssl095a-0.9.5a-11.i386.rpm
rpm –ivh openssl096-0.9.6-6.i386.rpm
三、安装freeradius
从http://www.freeradius.org上下载free...本文版本是0.8.1
编译和安装
tar xvfz freeradius.tar.gz
cd xvfz freeradius-0.8.1
./configure
make
make install
建立mysql的数据库raius的表
cd src/modules/rlm_sql/drivers/rlm_sql_mysql
mysql –uroot –p密码 radius < db_mysql.sql
更改freeradius的设置
cd /usr/local/etc/raddb
更改radiusd.conf,让其支持sql (如下面所说)
authorize {
preprocess
chap
mschap
suffix
sql
}
accouting {
….
sql
…
}
更改sql.conf
server=”localhost”
login=”root”
password=”mysql的root的密码”
radius_db=”radius”
更改 client.conf支持所用的NAS具体可以看该文档,要注意的是secret是NAS和radius服务器的共享密码
数据库加入测试账号
加入组
mysql –uroot –p密码 radius
insert into radgroupreply (groupname,attribute,op,values) values ('user','Auth-Type',':=','Local');
insert into radgroupreply (groupname,attribute,op,values) values ('user','Service-Type',':=','Framed-User');
insert into radgroupreply (groupname,attribute,op,values) values ('user','Framed-IP-Address',':=','255.255.255.254');
insert into radgroupreply (groupname,attribute,op,values) values ('user','Framed-IP-Netmask',':=','255.255.255.0');
加入测试账号
insert into radcheck (username,attribute,op,value) values ('test','User-Password',':=','test')
测试账号加入组
insert into usergroup (username,groupname) values ('test','user');
四、启动radius服务、测试账号
启动到debug模式
radiusd –X
有时候会报找不到文件rlm_sql_mysql这个时候只要把库文件加入系统搜索的目录里
比如:
cp /usr/local/lib/* /usr/lib
测试账号
radtest test teset localhost 0 testing123
如果能看到radius的应答,恭喜服务器设置成功了。
本人才疏,如果本文有错误,请大家指正,并欢迎一起讨论。
本文作者:余旭东
Email: netwolf@163.com
如要转载,请注明作者和来源
posted @
2006-05-18 16:33 Q系列类、方法、变量…… 阅读(634) |
评论 (1) |
编辑 收藏
MySQL集群配置(max)
|
|
一、介绍 ======== 这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。
注意! 虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。
另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。
下面假设这3台服务的情况:
Server1: mysql1.vmtest.net 192.168.0.1 Server2: mysql2.vmtest.net 192.168.0.2 Server3: mysql3.vmtest.net 192.168.0.3
Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低,只需对Server3的系统进行很小的调整并且无需安装MySQL,Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。
二、在Server1和Server2上安装MySQL ================================= 从
http://www.mysql.com
上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz 注意:必须是max版本的MySQL,Standard版本不支持集群部署!
以下步骤需要在Server1和Server2上各做一次 # mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/ # cd /usr/local/ # groupadd mysql # useradd -g mysql mysql # tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz # rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz # mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql # cd mysql # scripts/mysql_install_db --user=mysql # chown -R root . # chown -R mysql data # chgrp -R mysql . # cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chmod +x /etc/rc.d/init.d/mysqld # chkconfig --add mysqld
此时不要启动MySQL!
三、安装并配置管理节点服务器(Server3) ===================================== 作为管理节点服务器,Server3需要ndb_mgm和ndb_mgmd两个文件:
从
http://www.mysql.com
上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# mkdir /usr/src/mysql-mgm # cd /usr/src/mysql-mgm # tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz # rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz # cd mysql-max-4.1.9-pc-linux-gnu-i686 # mv bin/ndb_mgm . # mv bin/ndb_mgmd . # chmod +x ndb_mg* # mv ndb_mg* /usr/bin/ # cd # rm -rf /usr/src/mysql-mgm
现在开始为这台管理节点服务器建立配置文件:
# mkdir /var/lib/mysql-cluster # cd /var/lib/mysql-cluster # vi config.ini
在config.ini中添加如下内容:
[NDBD DEFAULT] NoOfReplicas=2 [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] # Managment Server [NDB_MGMD] HostName=192.168.0.3 #管理节点服务器Server3的IP地址 # Storage Engines [NDBD] HostName=192.168.0.1 #MySQL集群Server1的IP地址 DataDir= /var/lib/mysql-cluster [NDBD] HostName=192.168.0.2 #MySQL集群Server2的IP地址 DataDir=/var/lib/mysql-cluster # 以下2个[MYSQLD]可以填写Server1和Server2的主机名。 # 但为了能够更快的更换集群中的服务器,推荐留空,否则更换服务器后必须对这个配置进行更改。 [MYSQLD] [MYSQLD]
保存退出后,启动管理节点服务器Server3: # ndb_mgmd
启动管理节点后应该注意,这只是管理节点服务,并不是管理终端。因而你看不到任何关于启动后的输出信息。
四、配置集群服务器并启动MySQL ============================= 在Server1和Server2中都需要进行如下改动:
# vi /etc/my.cnf
[mysqld] ndbcluster ndb-connectstring=192.168.0.3 #Server3的IP地址 [mysql_cluster] ndb-connectstring=192.168.0.3 #Server3的IP地址
保存退出后,建立数据目录并启动MySQL:
# mkdir /var/lib/mysql-cluster # cd /var/lib/mysql-cluster # /usr/local/mysql/bin/ndbd --initial # /etc/rc.d/init.d/mysqld start
可以把/usr/local/mysql/bin/ndbd加到/etc/rc.local中实现开机启动。 注意:只有在第一次启动ndbd时或者对Server3的config.ini进行改动后才需要使用--initial参数!
五、检查工作状态 ================ 回到管理节点服务器Server3上,并启动管理终端:
# /usr/bin/ndb_mgm 键入show命令查看当前工作状态:(下面是一个状态输出示例)
[root@mysql3 root]# /usr/bin/ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.1 (Version: 4.1.9, Nodegroup: 0, Master) id=3 @192.168.0.2 (Version: 4.1.9, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.3 (Version: 4.1.9)
[mysqld(API)] 2 node(s) id=4 (Version: 4.1.9) id=5 (Version: 4.1.9)
ndb_mgm>
如果上面没有问题,现在开始测试MySQL: 注意,这篇文档对于MySQL并没有设置root密码,推荐你自己设置Server1和Server2的MySQL root密码。
在Server1中:
# /usr/local/mysql/bin/mysql -u root -p > use test; > CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER; > INSERT INTO ctest () VALUES (1); > SELECT * FROM ctest;
应该可以看到1 row returned信息(返回数值1)。
如果上述正常,则换到Server2上重复上面的测试,观察效果。如果成功,则在Server2中执行INSERT再换回到Server1观察是否工作正常。 如果都没有问题,那么恭喜成功!
六、破坏性测试 ============== 将Server1或Server2的网线拔掉,观察另外一台集群服务器工作是否正常(可以使用SELECT查询测?
|
posted @
2006-05-15 13:59 Q系列类、方法、变量…… 阅读(617) |
评论 (1) |
编辑 收藏
java面试题集
原始地址:http://blog.csdn.net/softj/archive/2006/05/04/707992.aspx
基础知识:
1.C++或Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
2. Java的接口和C++的虚类的相同和不同处。
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。
3. 垃圾回收的优点和原理。并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
4. 请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
5. 请讲一讲析构函数和虚函数的用法和作用。
6. Error与Exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,
Exception表示需要捕捉或者需要程序进行处理的异常。
7. 在java中一个类被声明为final类型,表示了什么意思?
表示该类不能被继承,是顶级类。
8. 描述一下你最常用的编程风格。
9. heap和stack有什么区别。
栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
堆是栈的一个组成元素
10. 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)。
public class BigInt()
{
int[] ArrOne = new ArrOne[1000];
String intString="";
public int[] Arr(String s)
{
intString = s;
for(int i=0;i<ArrOne.leght;i++)
{
11. 如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现
12,谈谈final, finally, finalize的区别。
final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
13,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
14,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.ASP?id=704&page=1
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
第四,&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
15,HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
16,Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
17,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 Assertionerror。它用于调试目的:
assert(a > 0); // throws an Assertionerror if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。
18,GC是什么? 为什么要有GC? (基础)。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
19,String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
20,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
21,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
22,sleep() 和 wait() 有什么区别? 搞线程的最爱
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
23,Java有没有goto?
Goto?java中的保留字,现在没有在java中使用。
24,数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
25,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
26,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
posted @
2006-05-08 23:50 Q系列类、方法、变量…… 阅读(197) |
评论 (0) |
编辑 收藏
QCurses是什么?
QCurses是对Linux/Unix下面终端界面库curses的C++封装,可以快速开发基于curses的界面程序,新版本的QCurses更是增加了qcs脚本与解释器使其成为快速开发基于字符界面的开发利器!
基于需要QCurses主要提供平台为SCO UNIX5.X的操作系统,如果有其他系统的需要可以发信息告知我,我会考虑加入下一个版本中。
QQ:1964477
MSN:qxk2001@hotmail.com
E-MAIL:qxk2005@gmail.com
QCurses旧版本的主页是:http://qclass.xbhome.com/
新版本的主页正在制作中。
新版本功能简述(待续):
- 编写qcurses程序只需要编写“.qcs”脚本文件即可进行qcurses程序编写,脚本内容类似于html文档,而qcurses自带的解释器类似于IE浏览器,这样编程人员就可以从繁杂的代码编写中解放出来专心进行业务层的代码编写了。
- 新版本的qcurses支持网络传输,自带一个类似于Apache的服务器,同时使用qcurses自带的解释器就可以进行网络程序开发,因为每个程序的界面都已经使用QCS脚本编写好了,因此网络中传输的仅仅是文本文件了,而这些文件在本地进行解析并且动态生成界面,同时可以将这个界面中相关的数据提交给qcurses的网络服务器,而业务层的实现就可以在这里做到
- 待续……
posted @
2006-04-26 20:40 Q系列类、方法、变量…… 阅读(213) |
评论 (0) |
编辑 收藏
一、系统属性中的项目∶
鼠标右健单击桌面上的"我的电脑",选择"属性",打开"系统属性"对话框
1.关闭系统还原
找到系统还原选项, 如果你不是老噼里啪啦安装一些软件(难道你比我还厉害),你也可以去掉,这样可以节省好多空间。将"在所有盘中禁用系统还原"前面的囗中打钩,点击"应用"。
2. 去掉"更新"选项:
对于大多数的用户来说,Windows XP的Windows Update功能似乎作用不大,多数程况下,补丁越多系统越慢,我们可以去掉它,操作步骤如下:点击"自动更新"选项卡,将"保持我的计算机最新"前面的"囗"内的勾取消,然后点击"应用"。
3. 打开DMA传输模式∶
选"硬件"选项卡,定"设备管理器"在设备管理器里展开"IDE ATA/ATAPI 控制器"前面的"+"号,可看到"主要通道"和"次要通道",右键点击"主要通道"或"次要通道",选属性,在属性窗口中点"高级"选项卡 ,将所有的传送模式都设定为"使用DMA(若用的)" ,系统就会自动打开DMA支援(在BIOS里也应该要先设为支援DMA),然后点击"确定"。
4.为IRQ中断请求排优先次序
为IRQ中断请求排优先次序计算机的每一个主要部件都设了个IRQ中断号。这里就是要通过修改每个IRQ请求的优先次序达到优化目的。这里主要的优化对象是系统/CMOS实时钟,它通过主板来提升性能。首先,要确定你想要哪个组件获得更高的性能,然后找到这个硬件正在使用的IRQ中断号。怎么找呢?打开控制面板里的系统属性(也可以按键盘上的Windows+Break热键组合打开它)。选中"硬件"选项卡,然后点击"设备管理器"按钮。右键点击要查IRQ号的组件,选择"属性",然后点击"资源"选项卡。这里可以看到设备正在使用的IRQ中断号(如果没有IRQ中断号,选择另一个设备)。把中断号记下来,然后运行注册表编辑器regedit,找到注册表中的HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/PriorityControl 位置。我们要在这里建立一个名为IRQ#Priority(其中"#"是具体的IRQ中断号)的DWORD双字节值,然后把它的值设为1。譬如说,我的系统CMOS实时钟的IRQ中断号是8,我要建立的键名就是IRQ8Priority。重新启动计算机之后,就会发现刚优化过的组件性能有所提高。笔者强烈建议用这个方法优化系统CMOS实时钟,因为它能改善整块主板的性能。当然也可以把多个IRQ中断号优先级提高,但这样做的效果没那么好,而且有可能造成系统不稳定。要把这个优化设置撤消的话,只要把刚才建立的注册表键值删掉就OK了。
5.关闭"远程桌面"功能
顾名思义,这个功能就是让你可以让别人在另一台机器上访问你的桌面。可以说,在一个网络环境中,比如单位的局域网,这个功能很有用(要在防火墙没有限制的情况下)。比如你有问题了可以向同事求助,他可以不用到你的跟前,直接通过"远程桌面"来访问你的机器帮你解决问题。我个人认为这个功能有一定的不安全因素在里面,并且,计算机也不是时时都在出问题,所以我的建议关掉它,否则你不用它就等于白白浪费内存。
6.优化"视觉效果"设置
Windows XP在操用界面方面,的确是好看多了,不过好看的背后是以消耗大量内存作为代价的,如果你的内存没有256MB以上,最好还是优化一下你的"视觉效果"功能。右键单击"我的电脑",点击属性,点击"高级",在"性能"一栏中,点击"设置",点击"视觉效果",在这里可以看到外观的所有设置,可以手工去掉一些不需要的功能。
7.优化"启动和故障恢复"设置
如果在你的系统崩溃时发现你的硬盘使劲儿的响,那是因为Windows XP正在写DUMP文件呢,如果你不打算把这个文件寄给微软(浪费电话费),那么它又有什么用呢?所以笔者的建议是关闭。右键单击"我的电脑",点击属性,点击"高级",在"启动和故障恢复"一栏中,点击"设置",其中的"系统失败"一栏中,建议改为∶自动重新启动,不转存。
8. 禁用"错误汇报"功能
这个功能可以在你的Windows XP发生错误的时候,系统自动收集一些错误资料然后发送给微软公司,以便其完善他们的操作系统(又一个浪费电话费且没用的功能)。笔者建议关掉它。如果这个功能对你没有用,那又何必让它占用着你的内存呢?右键单击"我的电脑",点击属性,点击"高级"→"错误汇报",选择"禁用错误汇报"功能。
9.自定义虚拟内存的大小
在"高级"选项卡中的"虚拟内存"栏目内点"更改"按钮。选择"自定义大小",在"初始大小值"和"最大值"框内同时输入同一数值,该数值的大小=你的物理内存大小的2.5倍即可,(如果你的内存是128M的即输入576,内存越大所用的倍数越小。如果你有512M以上的内存即可禁用虚以内存,选择"无分页文件")。输入数值后,一定要点击"设置"按钮,看到上面框内的数值改变了才生效,然后点确定,关闭窗口。
二、显示属性中的项目∶
右键单击桌面空白处,选择"属性",打开"显示 属性"
1.关闭休眠支持
关闭"休眠支持"因为休眠功能占的硬盘空间约250M, 所以关闭比较好,屏幕保护程序-->电源-->休眠--取消"启用休眠"前面囗内的勾(不要打勾)(不过:我觉得休眠还是有用的。)
2.电源使用方案
其中"关闭监视器"建议选择30分钟为宜,而"关闭硬盘"这里选择"从不",因为对硬盘进行关闭的话,再重新启动对磁头有很大的伤害.
3.刷新率
一般情况下你把刷新率设置在75Hz以上显示器就没有闪烁感,你就会感觉很舒服。而刷新率和显示器的带宽有关系,带宽越大其刷新率就越高。另外,俺建议你不要使用额外的刷新率,因为这相当于是对显示器进行超频,而且和对CPU的超频相比伤害更大!只要你的显示器刷新率达到85Hz就足够了,而不必刻意追求更高的刷新率,反而会大大减少了显示器的寿命。
三、组策略中的项目∶
开始-运行-键入 gpedit.msc ,打开"组策略"窗口
1. 取消限制可保留带宽
展开 "管理模板"中的"网络" , 展开 "QoS 数据包调度程序", 在右边窗右键单击"限制可保留带宽" ,在属性中的"设置"中有"限制可保留带宽" ,选择"已禁用",确定即可。当进行完上述修改并应用后,用户应该在网络连接的属性对话框内的一般属性标签栏中能够看到 "(QoS 数据包调度程序)"。如果没有该条目,说明修改没有成功,QoS仍然在占用着20%的带宽。Home版不支持该操作,无法去除该限制!
有必要说明一下,但还是留着让大家参考!
关于xp或2003有20%的"保留带宽",有这样一个推论:去掉后速度提升20%,xp在带宽上做了手脚。这些说法在网上广为流行,然而你费时费力去掉这个限制后,却发现速度并没有提升!
据我所知,这个方法最早来源于《电脑报》,直到今天这个所谓的"技巧"还在网上广为流传。所以,我觉得有必要在这儿说一下。
其实根本不用去掉。
这个20%带宽并非"保留",是指在使用QoS 应用程序编程接口 (API)的程序最多在每个接口基础链路上可以申请预留20%的带宽,但是如果此程序并未充分利用,这些带宽仍然可以被其他程序所用。
在微软的《技术资源规划》中指出:除非有应用程序专门请求优先的带宽,否则在 Windows XP PC 上运行的应用程序可以共享所有的网络带宽。但如果做出请求的应用程序没有发送数据,则这些"预定"的带宽仍可用于其它应用程序。 。。。默认情况下,对终端系统的每个接口上的基础链路而言,应用程序可以预定的合计带宽最多可为该基础链路速度的 20%。如果预定了带宽的应用程序没有发送足够的数据来充分利用带宽,则预定带宽中未被使用的部分将仍可用于同一主机上的其它数据流。
可见,所谓20%的保留带宽纯属个别人断章取义,误导视听而已。
四、控制面板中的项目∶
1. 调用系统声音方案
与以往的Windows操作系统相比,Windows XP提供了更加优秀的声音方案,但系统默认却没有调用该方案。为了激活该方案,我们需要执行下列操作:打开"控制面板",选择"声音、语音、音频设备"项,从中找到"修改声音方案"的任务栏,在打开的对话框中选择"Windows默认",此时系统会提示用户是否保存以前的声音方案设置,用户可以选择"否"并点击"确认",完成修改。
2.在关机时清理页面文件
打开"控制面板",点击"管理工具"→"本地安全策略"→"本地策略"→"安全选项",双击其中"关机:清理虚拟内存页面文件"一项,点击弹出选单中的"已启用"选项,单击"确定"即可。
五、注册表中的项目∶
点击开始菜单,选择"运行",然后输入"regedit"回车。即可打开注册表编辑器
1.加速XP的开关机缩短等待时间
找到HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control, 将 WaitToKillServiceTimeout 的佰设为:1000或更小 ( 原设定值:20000 )。找到 HKEY_CURRENT_USER/Control Panel/Desktop 键,将右边视窗的WaitToKillAppTimeout 改为 1000, ( 原设定值:20000 )即关闭程序时仅等待1秒。将 HungAppTimeout 值改为:500( 原设定值:5000 ), 表示程序出错时等待0.5秒。
2.让系统自动关闭停止响应的程序
打开注册表 HKEY_CURRENT_USER/Control Panel/Desktop 键, 将 AutoEndTasks 值设为 1 ( 原设定值:0 )
3.提升Prefetcher服务性能
Windows XP自带了一个名为Prefetcher的服务,这个服务管理着Windows启动时的程序初始,其中指定的程序可以在以后使用中快速载入。Prefetcher在默认情况下就是打开的,不过它的性能还可以进一步提升。打开注册表编辑器,在注册表中找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/MemoryManagement/PrefetchParameters,其中有一个键值名为EnablePrefetcher,多数情况下它的值是3。推荐设置值是5,在我的机子上,设为5的时候工作状态最佳。可以随便试试不同的数值,直到找到最适合自己机子的值为止。也可以把Prefetcher禁用掉,只需把值设为0就可以了。不过,除非是为了测试用途,一般人都不会傻到把它设为0.
4. 不加载DLL文件
浏览器在使用之后往往会有部分DLL文件在内存中缓存好长一段时间,相当大一部分内存会被不用的DLL文件点用。为了防止这种事情发生,找到注册表如下位置HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer接下来建立一个名为AlwaysUnloadDLL,值为1的双字节值。如果想要去除这项优化,只需把该键值设为0(也可以干脆把键删掉)。注意:该项优化要在Windows重新启动后才生效。
5. 完全关闭Windows XP文件保护功能
此招慎用,从注册表中找到HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon,修改"SFCDisable"键值"FFFFFF9D",如果需要重新启用该功能,重新设置为"0"就可以了。
6. 加快窗口显示速度
加快窗口显示速度:我们可以通过修改注册表来改变窗口从任务栏弹出,以及最小化回归任务栏的动作,步骤如下:打开注册表编辑器,找到HKEY_CURRENT_USER/Control Panel/Desktop/WindowMetrics子键分支,在右边的窗口中找到MinAniMate键值,其类型为REG_SZ,默认情况下此健值的值为1,表示打开窗口显示的动画,把它改为0,则禁止动画的显示,接下来从开始菜单中选择"注销"命令,激活刚才所作的修改即可。
7.设置启动信息或增加警告信息
如果在启动Windows XP时,希望显示一些自己定义的个性化信息,可以按以下步骤来操作:找到HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon子键分支,双击在它下面的LegalNoticeCaption健值名称,打开"编辑字符串"窗口,在"数值数据"文本框中输入信息对话框的标题,比如"你好,欢迎使用本机器",然后双击LegalNoticeText,在随后出现的"编辑字符串"窗口中输入想要显示的警告信息,比如"请不要随意修改本机的设置,谢谢!",单击"确定"按钮,重新启动即可看到修改后的效果了。
8.每次启动时保持桌面设置不变
我们可以通过修改注册表来保护我们的桌面设置,无论做了什么样的修改,只要重新启动之后桌面就会恢复原样。步骤如下:找到HKEY_CURRENT_USERS/Software/Microsoft/Windows/CurrentVersion/Polices/Explorer子键分支,在它的下面找到NoSaveSettings,其类型为REG_SZ,将其键值改为"0",或者直接删除该键值项,重新启动系统使设置生效。
9.修改鼠标右键菜单
修改鼠标右键菜单我们知道在98下可以通过注册表来修改鼠标右键菜单,其实在WinXP中也可以。方法如下:这里以在鼠标右键菜单上添加"用DOS窗口在这里浏览"为例。打开注册表编辑器,找到HKEY_CLASSES_ROOT/Directory/shell,然后选中它,点击鼠标右键,新建一个主键,取名为"DOS",然后选中新建的主键,在右边双击默认字符串值,在弹出的对话框中输入"用DOS窗口在这里浏览",然后选中新建的主键,再建立一个主键,取名为"command",选中"command"主键,修改默认值为"cmd.exe /k /"cd %/""即可。检查:在任意一个文件夹上按下鼠标右键,可以在弹出的菜单里面看到"用DOS窗口在这里浏览",选择用DOS窗口在这里浏览,按下鼠标左键,看到没有,DOS窗口弹了出来!
10.修改系统ID号
修改系统ID号(ID号在WinXP里面很重要)在系统属性里面的常规标签下我们可以看到一串数字,如:55661-005-0809362-22169等等。这就是ID号。正版的WinXP每一套的ID号是不相同的(应该可以猜到我的目的了吧?),那么我们可不可以修改呢?当然可以(废话!如果不可以就没有必要写这篇文章了)。跟我来,看看我的本领!1)ID号是存放在注册表里面的。主要放在这几个键值下:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Registration的字符串ProductIdHKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/User inFORMation的字符串产品标识 /*如果没有使用向微软注册的话,这里不会出现*/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion的字符串ProductIdHKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion的字符串ProductId以上4个地方就是在注册表中存放ID的键值,修改的时候要同时修改,修改完以后再看系统属性里面的常规标签,以免修改失败,导致ID还原。
11.修改版本号
Windows里面有一个内部版本号(正式版的是:2600.xpclient.010817-1148),这个版本号也是存放在注册表中的,具体位置是HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion,它用一个字符串来记录,修改这个名字叫做BUILDLAB的字符串就可以修改你的XP的版本号。
12.清除共享文件夹
WINDOWS XP操作系统一个比较不友好的用户界面是在"我的电脑"窗口上半部分显示所有共享的文件夹,如果用户设置的共享文件夹较多,每当打开"我的电脑"窗口时,就会列有很多共享文件夹信息。如何删除这些信息显示呢?使用注册表编辑器,并寻找这个主键/"HKEY_LOCAL_MACHINE/SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/EXPLORER/MyComputer/NameSpace/DelegateFolders/",在该主键下有一个名为{59031A47-3F72-44A7-89C5-5595FE6B30EE}的副键,删除该副键便可清除那些共享文件夹信息。上述修改无需重新启动便可生效。
13. 加快开始菜单的显示速度
WINDOWS XP系统默认的开始菜单显示较慢,但用户可以通过编辑注册键值来加快显示,具体方法是:打开注册表编辑器,寻找/"HKEY_CURRENT_USER/CONTROL PANEL/DESKTOP/MENUSHOWDELAY/"主键,系统默认值为400,用户可以根据自己的喜好适当调小该键值,如200,最低可设为"0"。
14.启动时禁止自动调用"WINDOWS MESSENGER"
为了推广微软公司推出的即时聊天程序/"WINDOWS MESSENGER/",WINDOWS XP操作系统的默认设置是在系统启动时便调用该程序。但如果你并不习惯使用该程序,可以通过删除/"HKEY_CURRENT_USER/SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/RUN/MSMSGS/"此键来实现。
也可在MESSENGER里设置,打开MESSENGER,工具--选项--首选项--把"在windows启动时运行windows messenger"前的钩去掉就OK了.
15.禁用页面文件
HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/CONTROL/SESSION MANAGER/MEMORY MANAGEMENT禁用内存页面文件"PAGING EXECUTIVE",在正常情况下,XP会把内存中的片断写入硬盘,我们可以阻止它这样做,让数据保留在内存中,从而提升系统性能。要注意的是,拥有很多内存的用户(256M以上)才好使用这个设置。这个设置的名字正如它的功能一样,叫"DISABLEPAGINGEXECUTIVE"。把它的值从0改为1就可以禁止内存页面文件调度了。
也可在性能选项--高级--虚拟内存那里点更改--无分页文件
16.提升系统缓存
HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/CONTROL/SESSION MANAGER/MEMORY MANAGEMENT把LARGESYSTEMCACHE键值从0改为1,WINDOWS XP就会把除了4M之外的系统内存全部分配到文件系统缓存中,这意味着XP的内核能够在内存中运行,大大提高系统速度。剩下的4M内存是用来做磁盘缓存的,在一定条件下需要的时候,XP还会分配更多一些。一般来说,这项优化会使系统性能得到相当的提升,但也有可能会使某些应用程序性能降低。正如前面所说的,必须有256M以上的内存,才好激活LARGESYSTEMCACHE,否则不要动它。
17.输入/输出性能
这个优化只对SERVER用户才有实在意义--它能够提升系统进行大容量文件传输时的性能。在默认情况下,这个键值在注册表中是不存在的,必须自己建一个,在HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/CONTROL/SESSION MANAGER/MEMORY MANAGEMENT下建一个DWORD(双字节值)键值,命名为IOPAGELOCKLIMIT。多数人在使用这项优化时都发现8到16M字节之间性能最好,具体设什么值,可以设进去试试看哪个值可以获得最佳性能。记住这个值是用字节来计算的,因此,譬如你要分配12M的话,就是12 * 1024 * 1024,也就是12582912。跟前面的内存优化一样,只有当你的内存大于256M的时候才好更改这里的值。
18.设置CPU二级缓存容量
WINDOWS XP无法自动检测处理器的二级缓存容量,需要我们自己在注册表中手动设置,首先打开:HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/CONTROL/SESSION MANAGER/MEMORY MANAGEMENT/,选择"SECONDLEVELDATACACHE",根据自己所用的处理器设置即可,例如PIII COPPERMINE/P4 WILLAMETTE是"256",ATHLON XP是"384",P4 NORTHWOOD是"512"
说明一下,但是该项还是保留给大家参考.
在众多的XP优化技巧中,较为流行的一种说法是Windows XP系统需要用户手工打开CPU的二级缓存,这样才能使CPU发挥出最大效率。这种说法流传相当广泛,现在使用率最高的Windows系统优化软件之一的"Windows 优化大师"也是持这种观点,在它的优化设置栏中就有优化CPU二级缓存的选项。
我们先看看这个所谓的优化技巧是怎样告诉我们的。
【Windows XP系统中,默认状态下CPU二级缓存并未打开。为了提高系统性能,我们可以通过修改注册表,或使用"Windows优化大师"等软件来开启它。
运行注册表编辑器,展开HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Memory Management分支,双击右侧窗口中的"SecondLevelDataCace",然后在弹出的窗口中直接填入当前计算机所使用的CPU的二级缓存容量即可。
赛扬处理器的二级缓存为128KB,应将其值设置为80(16进制,下同)。PⅡ、PⅢ、P4均为512KB二级缓存,应设置为200;PⅢE(EB)、P4 Willamette只有256KB二级缓存,应设置为100;AMD Duron只有64KB二级缓存,应设置为40;K6-3拥有256KB二级缓存;Athlon拥有512KB二级缓存;Athlon XP拥有256KB二级缓存;Athlon XP(Barton核心)拥有512KB二级缓存。
使用Windows优化大师也可以正确设置CPU的二级缓存:启动Windows优化大师,选择"系统性能优化",在"文件系统优化"中,最上面就是关于CPU二级缓存的设置项。拖动滑块到相应的位置后,保存设置并重新启动计算机即可。】
事实真的是这样吗?
我们在微软的知识库中找到了如下的内容:"HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/Memory Management"中的SecondLevelDataCache键的值只有在Windows XP系统从硬件抽象层(Hardware Abstraction Layer )读取CPU二级缓存(L2)失败时才会读取SecondLevelDataCache键的数据。而且SecondLevelDataCache键值=0的意义是二级缓存为256KB。
在一篇知识库文章中我们还找到了"Do not change the SecondLevelDataCache entry "这样的话,在文章中指出一些第三方资料宣称修改SecondLevelDataCache键的值可以提高系统性能是不正确的。二级缓存的数值是由操作系统检测并且完全不受SecondLevelDataCache值的影响。
从微软知识库的文章中我们可以看到,所谓的Windows XP系统需要用户手动打开二级缓存这种说法是错误的。Windows XP系统是根据硬件抽象层读取CPU的二级缓存数值。只有在读取失败时才会读取SecondLevelDataCache的值,而且SecondLevelDataCache的默认数值0所代表的意义就是二级缓存为256KB,而不是表示关闭。所以CPU的二级缓存在任何时候都是开启的,用户没有必要再自行修改。
『转自PCONLINE』
19.加速共享文件夹查看速度
这是一项很棒的优化,在找到这项优化之前,我经常在漫长地等待窗口显示其它机子上的共享目录中敲破头皮。通常情况下,当WINDOWS XP连接到其它计算机时,会检查对方机子上所有预定的任务--这真是多余,而且还会让你等上30秒钟,实在太糟糕了。所幸的是,很容易就可以把这个过程给禁掉。首先,在注册表中找到HKEY_LOCAL_MACHINE/SOFTWARE/MICROSOFT/WINDOWS/CURRENT VERSION/EXPLORER/REMOTECOMPUTER/NAMESPACE。在这里面,应该有个{D6277990-4C6A-11CF-8D87-00AA0060F5BF键。只需把它删掉,重新启动计算机后,WINDOWS就不再检查预定任务了,速度明显提高!
20.优化NTFS文件系统
NTFS的好处不用说了吧,但也有不足。取消更新最后一次磁盘访问,这样对于容量大的分区,会减慢速度。运行"REGEDIT",在HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTOLSET/CONTROL/FILESYSTEM)中,加DWORD,数值为1。
21.卸载无用的动态链接
资源管理器经常在内存中留下无用的动态链接,为了消除这种现象,你可以打开注册表编辑器,设置键值:HKEY_LOCAL_MACHINE/SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/EXPLORER
ALWAYSUNLOADDLL=DWORD: 1将其设为0,这一功能就会被关闭。注意:为了让设置生效,需要重新启动计算机。六、系统启动设置中的项目∶
点击开始菜单,选择"运行",然后输入"MSCONFIG"回车。
这是一个系统内置的WINDOWS设置工具。我们要动手脚的是(启动)选项卡,点击"启动"选项卡,这个选项卡中显示了WINDOWS启动时运行的所有程序。这里没有一个程序对WINDOWS来说是生死悠关的,所以放心大胆地把不要的去掉。把你不想要随系统启动而启动的程序前的勾勾去掉之后,WINDOWS启动会快些,同时空闲的系统资源也会多出一些。
七、系统清理∶
1. 删除WINDOWS强加的附件∶
用记事本打开/WINDOWS/INF/SYSOC.INF(先将文件复制一个作为备用),用查找/替换功能,在查找框中输入",HIDE"(一个英文逗号紧跟HIDE),将"替换为"框设为空。并选全部替换,这样,就把所有的,HIDE都去掉了,保存并退出,再运行"添加-删除程序",就会看见"添加/删除 WINDOWS 组件"中多出了好几个选项;这样你可以删除那些对于你来说,没有用的附件。
2. 删除系统文件备份
开始--运行SFC.EXE /PURGECACHE (一般用户是不怎么用的)
3. 删除WINDOWS驱动备份文件
WINDOWS/DRIVER CACHE/I386目录下的DRIVER.CAB文件 (73M)
4.删除帮助文件
删除WINDOWS/下的HELP文件夹帮助文件(减掉40多M) (使用中文汉化包的文件大小为92兆,刚开始使用XP的最好别删)
5.删除备用的DLL文件
删掉/WINDOWS/SYSTEM32/DLLCACHE下文件(减去200--300MB)。(这是备用的DLL文件,只要你拷贝了安装文件,完全可以这样做。)
6.把我的文档、IE的临时文件夹、用户变量临时文件和系统临时文件夹都转到其他分区,如D:/TEMP。
(同时对系统的速度,和硬盘都有好处,如果使用的是双系统,最好把两个系统的IE临时文件都放在同一个文件夹,这样既加快速度有节省空间)。1)右键点击"我的文档"--属性--移动--移动到∶D:/TEMP。 2)右键点击桌面上的"INTERNET EXPLORER"--"属性"--在"常规"选项卡中的"INTERNET临时文件"栏目中点击"设置"按钮,在弹出的"设置对话框"中,点击"移动文件夹",选择路径为E:/TEMP,然后点"确定"再"确定"。 3)在系统属性中点"高级"选项卡,点"环境变量"接钮,分别选择用户变量下的TEMP、TEM和系统变量下的TEMP、TEM,点编辑,然后将变量值改为E:/TEMP,点击确定。
7. 删除/WINDOWS/IME下不用的输入法
删除/WINDOWS/IME下不用的输入法! (日文,韩文,繁体中文输入法,84.5MB) (到底哪个是哪个自己研究一下吧!有时候也要自己动动脑子的,锻炼一下吧!)
8.清除预读文件
当XP使用一段时间后,预读文件夹里的文件会变的很大,里面会有死链文件,这会减慢系统时间。建议,定期删除这些文件。(C:/WINDOWS/PREFETCH)
9.请查找USER.DMP文件并删掉
有程序出错,硬盘会响很久,而且会占用很多空间。如果你以前遇到过这种情况,请查找USER.DMP文件并删掉,可能会省掉几十M的空间。这是出错程序的现场,对我们没用。
posted @
2006-04-21 15:39 Q系列类、方法、变量…… 阅读(865) |
评论 (0) |
编辑 收藏
格式为:
gcc -fPIC -W -Wformat -Wimplicit -Wmissing-prototypes -Wparentheses -Wstrict-prototypes -Wswitch -Wunused -c qcdefine.cpp qcobject.cpp qcwindow.cpp
gcc -G -o libqcurses.so qcdefine.o qcobject.o qcwindow.o
以前在第二步的时候,一直用 -shared 进行动态链接库的编译,但是编译器一直报错,今天在网络上终于找到了解决办法!原来sco unix下面编译共享库居然是使用 -G 而不是 -shared,这个-shared选项在Linux下面我一直用着很不错,但是在sco unix下面就从来没有成功过,终于在网上找到了一个强人的答题:
http://lists.trolltech.com/qt-interest/2000-09/thread00470-0.html
里面的强人说:On SCO you need -G not -shared.
真是厉害!!!
posted @
2006-04-21 15:38 Q系列类、方法、变量…… 阅读(317) |
评论 (0) |
编辑 收藏
今天无聊闲逛EZ的时候,发现有一个人发表了“寂静岭”的FLASH版本,抱着新奇的想法去看了一下,是用flash做的,还不错,但是无聊之际用右键点击了这个flash动画,选中了里面的“高级”按钮,自然的就在新窗口中打开了FLASH的老家主页
http://www.macromedia.com/cn/,但是随之而来的是莫名的疑问,怎么在FLASH主页中的LOGO位置出现来ADOBE???第一个反应是被黑了,但是后来一看,几乎每一页都是这样,“难道曾经的网页三剑客,曾经与photoshop对着干的firework轰然倒塌了?以前那些网上人们做的评论还历历在目,所为:‘firework比photoshop更加适合网站图片的处理等等’,而现在唯一能在网页图像处理方面能够与photoshop抗衡的软件的所属公司竟然被photoshop的所属公司收购,那么就意味着以后adobe将一支毒大?下一个版本的photoshop将命名为什么?HomePageImageWorkstation吗?”,再去网上GOOGLE查询一下才发现,原来真的证实了我的想法是正确的。
相关新闻概述:
Adobe系统公司今日正式宣布收购Macromedia[2006年4月18日],收购方式是通过股票来进行置换,价值为34亿美元。
posted @
2006-04-18 00:57 Q系列类、方法、变量…… 阅读(992) |
评论 (3) |
编辑 收藏
1. 你们的项目组使用源代码管理工具了么?
应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。
2. 你们的项目组使用缺陷管理系统了么?
应该用。ClearQuest太复杂,我的推荐是BugZilla。
3. 你们的测试组还在用Word写测试用例么?
不要用Word写测试用例(Test Case)。应该用一个专门的系统,可以是Test Manager,也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。
4. 你们的项目组有没有建立一个门户网站?
要有一个门户网站,用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现,15分钟就搞定。买不起SPS 2003可以用WSS (Windows Sharepoint Service)。
5. 你们的项目组用了你能买到最好的工具么?
应该用尽量好的工具来工作。比如,应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费,所以说是"你能买到最好的"。
6. 你们的程序员工作在安静的环境里么?
需要安静环境。这点极端重要,而且要保证每个人的空间大于一定面积。
7. 你们的员工每个人都有一部电话么?需要每人一部电话。而且电话最好是带留言功能的。当然,上这么一套带留言电话系统开销不小。不过至少每人一部电话要有,千万别搞得经常有人站起来喊:"某某某电话"。《人件》里面就强烈谴责这种做法。
8. 你们每个人都知道出了问题应该找谁么?
应该知道。任何一个Feature至少都应该有一个Owner,当然,Owner可以继续Dispatch给其他人。
9. 你遇到过有人说"我以为…"么?
要消灭"我以为"。Never assume anything。
10. 你们的项目组中所有的人都坐在一起么?
需要。我反对Virtual Team,也反对Dev在美国、Test在中国这种开发方式。能坐在一起就最好坐在一起,好处多得不得了。
11. 你们的进度表是否反映最新开发进展情况?
应该反映。但是,应该用Baseline的方法来管理进度表:维护一份稳定的Schedule,再维护一份最新更改。Baseline的方法也应该用于其它的Spec。Baseline是变更管理里面的一个重要手段。
12. 你们的工作量是先由每个人自己估算的么?
应该让每个人自己估算。要从下而上估算工作量,而不是从上往下分派。除非有其他原因,比如政治任务工期固定等。
13. 你们的开发人员从项目一开始就加班么?
不要这样。不要一开始就搞疲劳战。从项目一开始就加班,只能说明项目进度不合理。当然,一些对日软件外包必须天天加班,那属于剥削的范畴。
14. 你们的项目计划中Buffer Time是加在每个小任务后面的么?
不要。Buffer Time加在每个小任务后面,很容易轻易的就被消耗掉。Buffer Time要整段的加在一个Milestone或者checkpoint前面。
15. 值得再多花一些时间,从95%做到100%好值得,非常值得。
尤其当项目后期人困马乏的时候,要坚持。这会给产品带来质的区别。
16. 登记新缺陷时,是否写清了重现步骤?
要。这属于Dev和Test之间的沟通手段。面对面沟通需要,详细填写Repro Steps也需要。
17. 写新代码前会把已知缺陷解决么?
要。每个人的缺陷不能超过10个或15个,否则必须先解决老的bug才能继续写新代码。
18. 你们对缺陷的轻重缓急有事先的约定么?
必须有定义。Severity要分1、2、3,约定好:蓝屏和Data Lost算Sev 1,Function Error算Sev 2,界面上的算Sev 3。但这种约定可以根据产品质量现状适当进行调整。
19. 你们对意见不一的缺陷有三国会议么?
必须要有。要有一个明确的决策过程。这类似于CCB (Change Control Board)的概念。
20. 所有的缺陷都是由登记的人最后关闭的么?
Bug应该由Opener关闭。Dev不能私自关闭Bug。
21. 你们的程序员厌恶修改老的代码么?
厌恶是正常的。解决方法是组织Code Review,单独留出时间来。XP也是一个方法。
22. 你们项目组有Team Morale Activity么?
每个月都要搞一次,吃饭、唱歌、Outing、打球、开卡丁车等等,一定要有。不要剩这些钱。
23. 你们项目组有自己的Logo么?
要有自己的Logo。至少应该有自己的Codename。
24. 你们的员工有印有公司Logo的T-Shirt么?
要有。能增强归属感。当然,T-Shirt要做的好看一些,最好用80支的棉来做。别没穿几次就破破烂烂的。
25. 总经理至少每月参加次项目组会议要的。
要让team member觉得高层关注这个项目。
26. 你们是给每个Dev开一个分支么?
反对。Branch的管理以及Merge的工作量太大,而且容易出错。
27. 有人长期不Check-In代码么?
不可以。对大部分项目来说,最多两三天就应该Check-In。
28. 在Check-In代码时都填写注释了么?
要写的,至少一两句话,比如"解决了Bug No.225(给bug编号)"。如果往高处拔,这也算做"配置审计"的一部分。
29. 有没有设定每天Check-In的最后期限?
要的,要明确Check-In Deadline。否则会Build Break。
30. 你们能把所有源码一下子编译成安装文件吗?
要的。这是每日编译(Daily Build)的基础。而且必须要能够做成自动的。
31. 你们的项目组做每日编译么?
当然要做。有三样东西是软件项目/产品开发必备的:1. bug management; 2. source control; 3. daily build。
32. 你们公司有没有积累一个项目风险列表?
要。Risk Inventory。否则,下个项目开始的时候,又只能拍脑袋分析Risk了。
33. 设计越简单越好越简单越好。
设计时候多一句话,将来可能就带来无穷无尽的烦恼。应该从一开始就勇敢的砍。这叫scope management。
34. 尽量利用现有的产品、技术、代码千万别什么东西都自己Coding。BizTalk和Sharepoint就是最好的例子,有这两个作为基础,可以把起点提高很多。或者可以尽量多用现成的Control之类的。或者尽量用XML,而不是自己去Parse一个文本文件;尽量用RegExp,而不是自己从头操作字符串,等等等等。这就是"软件复用"的体现。
35. 你们会隔一段时间就停下来夯实代码么?
要。最好一个月左右一次。传言去年年初Windows组在Stevb的命令下停过一个月增强安全。Btw,"夯"这个字念"hang",第一声。
36. 你们的项目组每个人都写Daily Report么?
要写。五分钟就够了,写10句话左右,告诉自己小组的人今天我干了什么。一则为了沟通,二则鞭策自己(要是游手好闲一天,自己都会不好意思写的)。
37. 你们的项目经理会发出Weekly Report么?
要。也是为了沟通。内容包括目前进度,可能的风险,质量状况,各种工作的进展等。
38. 你们项目组是否至少每周全体开会一次?
要。一定要开会。程序员讨厌开会,但每个礼拜开会时间加起来至少应该有4小时。包括team meeting, spec review meeting, bug triage meeting。千万别大家闷头写code。
39. 你们项目组的会议、讨论都有记录么?
会前发meeting request和agenda,会中有人负责主持和记录,会后有人负责发meeting minutes,这都是effective meeting的要点。而且,每个会议都要形成agreements和action items。
40. 其他部门知道你们项目组在干什么么?
要发一些Newsflash给整个大组织。Show your team's value。否则,当你坐在电梯里面,其他部门的人问:"你们在干嘛",你回答"ABC项目"的时候,别人全然不知,那种感觉不太好。
41. 通过Email进行所有正式沟通
Email的好处是免得抵赖。但也要避免矫枉过正,最好的方法是先用电话和当面说,然后Email来确认。
42. 为项目组建立多个Mailing Group
如果在AD+Exchange里面,就建Distribution List。比如,我会建ABC Project Core Team,ABC Project Dev Team,ABC Project All Testers,ABC Project Extended Team等等。这样发起Email来方便,而且能让该收到email的人都收到、不该收到不被骚扰。
43. 每个人都知道哪里可以找到全部的文档么?
应该每个人都知道。这叫做知识管理(Knowledge Management)。最方便的就是把文档放在一个集中的File Share,更好的方法是用Sharepoint。
44. 你做决定、做变化时,告诉大家原因了么?
要告诉大家原因。Empower team member的手段之一是提供足够的information,这是MSF一开篇的几个原则之一。的确如此,tell me why是人之常情,tell me why了才能有understanding。中国人做事喜欢搞限制,限制信息,似乎能够看到某一份文件的人就是有身份的人。大错特错。权威、权力,不在于是不是能access information/data,而在于是不是掌握资源。
45. Stay agile and expect change 要这样。
需求一定会变的,已经写好的代码一定会被要求修改的。做好心理准备,对change不要抗拒,而是expect change。
46. 你们有没有专职的软件测试人员?
要有专职测试。如果人手不够,可以peer test,交换了测试。千万别自己测试自己的。
47. 你们的测试有一份总的计划来规定做什么和怎么做么?
这就是Test Plan。要不要做性能测试?要不要做Usability测试?什么时候开始测试性能?测试通过的标准是什么?用什么手段,自动的还是手动的?这些问题需要用Test Plan来回答。
48. 你是先写Test Case然后再测试的么?
应该如此。应该先设计再编程、先test case再测试。当然,事情是灵活的。我有时候在做第一遍测试的同时补上test case。至于先test case再开发,我不喜欢,因为不习惯,太麻烦,至于别人推荐,那试试看也无妨。
49. 你是否会为各种输入组合创建测试用例?
不要,不要搞边界条件组合。当心组合爆炸。有很多test case工具能够自动生成各种边界条件的组合--但要想清楚,你是否有时间去运行那么多test case。
50. 你们的程序员能看到测试用例么?
要。让Dev看到Test Case吧。我们都是为了同一个目的走到一起来的:提高质量。
51. 你们是否随便抓一些人来做易用性测试?
要这么做。自己看自己写的程序界面,怎么看都是顺眼的。这叫做审美疲劳--臭的看久了也就不臭了,不方便的永久了也就习惯了。
52. 你对自动测试的期望正确么?
别期望太高。依我看,除了性能测试以外,还是暂时先忘掉"自动测试"吧,忘掉WinRunner和LoadRunner吧。对于国内的软件测试的现状来说,只能"矫枉必须过正"了。
53. 你们的性能测试是等所有功能都开发完才做的么?
不能这样。性能测试不能被归到所谓的"系统测试"阶段。早测早改正,早死早升天。
54. 你注意到测试中的杀虫剂效应了么?
虫子有抗药性,Bug也有。发现的新Bug越来越少是正常的。这时候,最好大家交换一下测试的area,或者用用看其他工具和手法,就又会发现一些新bug了。
55. 你们项目组中有人能说出产品的当前整体质量情况么?
要有。当老板问起这个产品目前质量如何,Test Lead/Manager应该负责回答。
56. 你们有单元测试么?
单元测试要有的。不过没有单元测试也不是不可以,我做过没有单元测试的项目,也做成功了--可能是侥幸,可能是大家都是熟手的关系。还是那句话,软件工程是非常实践、非常工程、非常灵活的一套方法,某些方法在某些情况下会比另一些方法好,反之亦然。
57. 你们的程序员是写完代码就扔过墙的么?
大忌。写好一块程序以后,即便不做单元测试,也应该自己先跑一跑。虽然有了专门的测试人员,做开发的人也不可以一点测试都不做。微软还有Test Release Document的说法,程序太烂的话,测试有权踢回去。
58. 你们的程序中所有的函数都有输入检查么?
不要。虽然说做输入检查是write secure code的要点,但不要做太多的输入检查,有些内部函数之间的参数传递就不必检查输入了,省点功夫。同样的道理,未必要给所有的函数都写注释。写一部分主要的就够了。
59. 产品有统一的错误处理机制和报错界面么?
要有。最好能有统一的error message,然后每个error message都带一个error number。这样,用户可以自己根据error number到user manual里面去看看错误的具体描述和可能原因,就像SQL Server的错误那样。同样,ASP.NET也要有统一的Exception处理。可以参考有关的Application Block。
60. 你们有统一的代码书写规范么?
要有。Code Convention很多,搞一份来发给大家就可以了。当然,要是有FxCop这种工具来检查代码就更好了。
61. 你们的每个人都了解项目的商业意义么?
要。这是Vision的意思。别把项目只当成工作。有时候要想着自己是在为中国某某行业的信息化作先驱者,或者时不时的告诉team member,这个项目能够为某某某国家部门每年节省多少多少百万的纳税人的钱,这样就有动力了。平凡的事情也是可以有个崇高的目标的。
62. 产品各部分的界面和操作习惯一致么?
要这样。要让用户觉得整个程序好像是一个人写出来的那样。
63. 有可以作为宣传亮点的Cool Feature么?
要。这是增强团队凝聚力、信心的。而且,"一俊遮百丑",有亮点就可以掩盖一些问题。这样,对于客户来说,会感觉产品从质量角度来说还是acceptable的。或者说,cool feature或者说亮点可以作为质量问题的一个事后弥补措施。
64. 尽可能缩短产品的启动时间要这样。
软件启动时间(Start-Up time)是客户对性能好坏的第一印象。
65. 不要过于注重内在品质而忽视了第一眼的外在印象程序员容易犯这个错误:太看重性能、稳定性、存储效率,但忽视了外在感受。而高层经理、客户正相反。这两方面要兼顾,协调这些是PM的工作。
66. 你们根据详细产品功能说明书做开发么?
要这样。要有设计才能开发,这是必须的。设计文档,应该说清楚这个产品会怎么运行,应该采取一些讲故事的方法。设计的时候千万别钻细节,别钻到数据库、代码等具体实现里面去,那些是后面的事情,一步步来不能着急。
67. 开始开发和测试之前每个人都仔细审阅功能设计么?
要做。Function Spec review是用来统一思想的。而且,review过以后形成了一致意见,将来再也没有人可以说"你看,当初我就是反对这么设计的,现在吃苦头了吧"
68. 所有人都始终想着The Whole Image么?要这样。项目里面每个人虽然都只是在制造一片叶子,但每个人都应该知道自己在制造的那片叶子所在的树是怎么样子的。我反对软件蓝领,反对过分的把软件制造看成流水线、车间。参见第61条。
69. Dev工作的划分是单纯纵向或横向的么?
不能单纯的根据功能模块分,或者单纯根据表现层、中间层、数据库层分。我推荐这么做:首先根据功能模块分,然后每个"层"都有一个Owner来Review所有人的设计和代码,保证consistency。
70. 你们的程序员写程序设计说明文档么?
要。不过我听说微软的程序员1999年以前也不写。所以说,写不写也不是绝对的,偷懒有时候也是可以的。参见第56条。
71. 你在招人面试时让他写一段程序么?
要的。我最喜欢让人做字符串和链表一类的题目。这种题目有很多循环、判断、指针、递归等,既不偏向过于考算法,也不偏向过于考特定的API。
72. 你们有没有技术交流讲座?
要的。每一两个礼拜搞一次内部的Tech Talk或者Chalk Talk吧。让组员之间分享技术心得,这笔花钱送到外面去培训划算。
73. 你们的程序员都能专注于一件事情么?
要让程序员专注一件事。例如说,一个部门有两个项目和10个人,一种方法是让10个人同时参加两个项目,每个项目上每个人都花50%时间;另一种方法是5个人去项目A,5个人去项目B,每个人都100%在某一个项目上。我一定选后面一种。这个道理很多人都懂,但很多领导实践起来就把属下当成可以任意拆分的资源了。
74. 你们的程序员会夸大完成某项工作所需要的时间么?
会的,这是常见的,尤其会在项目后期夸大做某个change所需要的时间,以次来抵制change。解决的方法是坐下来慢慢磨,磨掉程序员的逆反心理,一起分析,并把估算时间的颗粒度变小。
75. 尽量不要用Virtual Heads 最好不要用Virtual Heads。
Virtual heads意味着resource is not secure,shared resource会降低resource的工作效率,容易增加出错的机会,会让一心二用的人没有太多时间去review spec、review design。一个dedicated的人,要强过两个只能投入50%时间和精力的人。我是吃过亏的:7个part time的tester,发现的Bug和干的活,加起来还不如两个full-time的。参见第73条。73条是针对程序员的,75条是针对Resource Manager的。
posted @
2006-04-15 12:57 Q系列类、方法、变量…… 阅读(1865) |
评论 (3) |
编辑 收藏