2006-12-25
ASP中的CINT溢出,cint的最大值问题,呵呵
今天遇到一个十分龌龊的问题,以前做的一个ASP系统出现如下错误
Microsoft VBScript 编译器错误 错误 '800a03f 6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft VBScript 运行时错误 错误 '800a0006'
溢出: 'CINT'
*.asp,行232
经过仔细研究,原来是CINT不支持太大的数字,估计有一个数值范围吧,所以换成CLNG就解决问题了。
每个函数都可以强制将一个表达式转换成某种特定数据类型。
语法
CBool(expression)
CByte(expression)
CCur(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CSng(expression)
CStr(expression)
CVar(expression)
CStr(expression)
必要的 expression 参数可以是任何字符串表达式或数值表达式。
返回类型
函数名称决定返回类型,如下所示:
函数 返回类型 expression 参数范围
CBool Boolean 任何有效的字符串或数值表达式。
CByte Byte 0 至 255。
CCur Currency -922,337,203,685,477.5808 至922,337,203,685,477.5807。
CDate Date 任何有效的日期表达式。
CDbl Double 负数从 -1.79769313486232E308 至 -4.94065645841247E-324;正数从 4.94065645841247E-324 至 1.79769313486232E308。
CDec Decimal 零变比数值,即无小数位数值,为+/-79,228,162,514,264,337,593,543,950,335。对于 28 位小数的数值,范围则为 +/-7.9228162514264337593543950335;最小的可能非零值是 0.0000000000000000000000000001。
CInt Integer -32,768 至 32,767,小数部分四舍五入。
CLng Long -2,147,483,648 至 2,147,483,647,小数部分四舍五入。
CSng Single 负数为 -3.402823E38 至 -1.401298E-45;正数为 1.401298E-45 至 3.402823E38。
CStr String 依据 expression 参数返回 Cstr。
CVar Variant 若为数值,则范围与 Double 相同;若不为数值,则范围与 String 相同。
说明
如果传递给函数的 expression 超过转换目标数据类型的范围,将发生错误。通常,在编码时可以使用数据类型转换函数,来体现某些操作的结果应该表示为特定的数据类型,而不是缺省的数据类型。例如,当单精度、双精度或整数运算发生的情况下,使用 CCur 来强制执行货币运算。
应该使用数据类型转换函数来代替 Val,以使国际版的数据转换可以从一种数据类型转换为另一种。例如,当使用 Ccur 时,不同的小数点分隔符、千分位分隔符和各种货币选项,依据系统的国别设置都会被妥善识别。
当小数部分恰好为 0.5 时,Cint 和 CLng 函数会将它转换为最接近的偶数值。例如,0.5 转换为 0、1.5 转换为 2。Cint 和 CLng 函数不同于 Fix 和 Int 函数,Fix 和 Int 函数会将小数部分截断而不是四舍五入。并且 Fix 和 Int 函数总是返回与传入的数据类型相同的值。
使用 IsDate 函数,可判断 date 是否可以被转换为日期或时间。Cdate 可用来识别日期文字和时间文字,以及落入可接受的日期范围内的数值。当转换一个数字成为日期时,是将整数部分转换为日期,小数部分转换为从午夜起算的时间。
CDate 依据系统上的国别设置来决定日期的格式。如果提供的格式为不可识别的日期设置,则不能正确判断年、月、日的顺序。另外,长日期格式,若包含有星期的字符串,也不能被识别。
CVDate 函数也提供对早期 Visual Basic 版本的兼容性。CVDate 函数的语法与 CDate 函数是完全相同的,不过,CVDate 是返回一个 Variant,它的子类型是 Date,而不是实际的 Date 类型。因为现在已有真正的 Date 类型,所以 CVDate 也不再需要了。转换一个表达式成为 Date,再赋值给一个 Variant,也可以达到同样的效果。也可以使用这种技巧将其他真正的数据类型转换为对等的 Variant 子类型。
注意 CDec 函数不能返回独立的数据类型,而总是返回一个 Variant,它的值已经被转换为 Decimal 子类型。
cint() 是ASP中的函数
函数将一个表达式转化为数字类型
表达式 CInt(expression)
允许数据类型: 任何有效的字符均可
实例:
<%
f = "234"
response.write cINT(f) + 2
%>
返回结果: 236
转化字符"234"为数字"234",如果字符串为空,则返回0值
经常见到cint和clng的溢出出错,如果有检测函数就不会出这个问题,下面这两个函数是应朋友要求写的,看一下吧
'检测字符串是否是整数
function Is_Int(a_str)
if not isnumeric(a_str) or len(str) > 5 then
Is_Int = false
exit function
elseif len(str) < 5 then
Is_Int = true
exit function
end if
if cint(left(a_str , 4)) > 3276 then
Is_Int = false
exit function
elseif cint(left(a_str , 4)) = 3276 and cint(right(a_str , 1)) > 7 then
Is_Int = false
exit function
else
Is_Int = true
exit function
end if
end function
'检测是否是长整数
function Is_Lng(a_str)
if not isnumeric(a_str) or len(str) > 10 then
Is_Lng = false
exit function
elseif len(str) < 10 then
Is_Lng = true
exit function
end if
if clng(left(a_str , 9)) > 214748367 then
Is_Lng = false
exit function
elseif clng(left(a_str , 9)) = 214748367 and clng(right(a_str , 1)) > 7 then
Is_Lng = false
exit function
else
Is_Lng = true
exit function
end if
end function
2006-12-22
windows 2003 跑跑卡丁
1、右键——>我的电脑——>属性
2、“系统属性”下的“高级”
3、“系统属性——高级”下的“性能”——>“设置”
4、“性能选项”下的“数据执行保护”(重要!重点就是这个“数据执行保护”!!)
选择“除所选之外,为所有程序和服务启用数据执行保护”
之后选择添加,找到你的KartRider.exe,按确定,重起电脑(不知道重起是不是必须的,不过本人建议重起)
2006-12-06
IIS管理类(C#)
using System;
using System.Data;
using System.DirectoryServices;
using System.Collections;
namespace Aspcn.Management
{
///
/// IISManager 的摘要说明。
///
public class IISManager
{
//定义需要使用的
private string _server,_website;
private VirtualDirectories _virdirs;
protected System.DirectoryServices.DirectoryEntry rootfolder;
private bool _batchflag;
public IISManager()
{
//默认情况下使用localhost,即访问本地机
_server = "localhost";
_website = "1";
_batchflag = false;
}
public IISManager(string strServer)
{
_server = strServer;
_website = "1";
_batchflag = false;
}
///
/// 定义公共属性
///
//Server属性定义访问机器的名字,可以是IP与计算名
public string Server
{
get{ return _server;}
set{ _server = value;}
}
//WebSite属性定义,为一数字,为方便,使用string
//一般来说第一台主机为1,第二台主机为2,依次类推
public string WebSite
{
get{ return _website; }
set{ _website = value; }
}
//虚拟目录的名字
public VirtualDirectories VirDirs
{
get{ return _virdirs; }
set{ _virdirs = value;}
}
///
///定义公共方法
///
//连接服务器
public void Connect()
{
ConnectToServer();
}
//为方便重载
public void Connect(string strServer)
{
_server = strServer;
ConnectToServer();
}
//为方便重载
public void Connect(string strServer,string strWebSite)
{
_server = strServer;
_website = strWebSite;
ConnectToServer();
}
//判断是否存这个虚拟目录
public bool Exists(string strVirdir)
{
return _virdirs.Contains(strVirdir);
}
//添加一个虚拟目录
public void Create(VirtualDirectory newdir)
{
string strPath = "IIS://" + _server + "/W3SVC/" + _website + "/ROOT/" + newdir.Name;
if(!_virdirs.Contains(newdir.Name) || _batchflag )
{
try
{
//加入到ROOT的Children集合中去
DirectoryEntry newVirDir = rootfolder.Children.Add(newdir.Name,"IIsWebVirtualDir");
newVirDir.Invoke("AppCreate",true);
newVirDir.CommitChanges();
rootfolder.CommitChanges();
//然后更新数据
UpdateDirInfo(newVirDir,newdir);
}
catch(Exception ee)
{
throw new Exception(ee.ToString());
}
}
else
{
throw new Exception("This virtual directory is already exist.");
}
}
//得到一个虚拟目录
public VirtualDirectory GetVirDir(string strVirdir)
{
VirtualDirectory tmp = null;
if(_virdirs.Contains(strVirdir))
{
tmp = _virdirs.Find(strVirdir);
((VirtualDirectory)_virdirs[strVirdir]).flag = 2;
}
else
{
throw new Exception("This virtual directory is not exists");
}
return tmp;
}
//更新一个虚拟目录
public void Update(VirtualDirectory dir)
{
//判断需要更改的虚拟目录是否存在
if(_virdirs.Contains(dir.Name))
{
DirectoryEntry ode = rootfolder.Children.Find(dir.Name,"IIsWebVirtualDir");
UpdateDirInfo(ode,dir);
}
else
{
throw new Exception("This virtual directory is not exists.");
}
}
//删除一个虚拟目录
public void Delete(string strVirdir)
{
if(_virdirs.Contains(strVirdir))
{
object[] paras = new object[2];
paras[0] = "IIsWebVirtualDir"; //表示操作的是虚拟目录
paras[1] = strVirdir;
rootfolder.Invoke("Delete",paras);
rootfolder.CommitChanges();
}
else
{
throw new Exception("Can’’’’t delete " + strVirdir + ",because it isn’’’’t exists.");
}
}
//批量更新
public void UpdateBatch()
{
BatchUpdate(_virdirs);
}
//重载一个:-)
public void UpdateBatch(VirtualDirectories vds)
{
BatchUpdate(vds);
}
///
///私有方法
///
//连接服务器
private void ConnectToServer()
{
string strPath = "IIS://" + _server + "/W3SVC/" + _website +"/ROOT";
try
{
this.rootfolder = new DirectoryEntry(strPath);
_virdirs = GetVirDirs(this.rootfolder.Children);
}
catch(Exception e)
{
throw new Exception("Can’’’’t connect to the server ["+ _server +"] ...",e);
}
}
//执行批量更新
private void BatchUpdate(VirtualDirectories vds)
{
_batchflag = true;
foreach(object item in vds.Values)
{
VirtualDirectory vd = (VirtualDirectory)item;
switch(vd.flag)
{
case 0:
break;
case 1:
Create(vd);
break;
case 2:
Update(vd);
break;
}
}
_batchflag = false;
}
//更新东东
private void UpdateDirInfo(DirectoryEntry de,VirtualDirectory vd)
{
de.Properties["AnonymousUserName"][0] = vd.AnonymousUserName;
de.Properties["AnonymousUserPass"][0] = vd.AnonymousUserPass;
de.Properties["AccessRead"][0] = vd.AccessRead;
de.Properties["AccessExecute"][0] = vd.AccessExecute;
de.Properties["AccessWrite"][0] = vd.AccessWrite;
de.Properties["AuthBasic"][0] = vd.AuthBasic;
de.Properties["AuthNTLM"][0] = vd.AuthNTLM;
de.Properties["ContentIndexed"][0] = vd.ContentIndexed;
de.Properties["EnableDefaultDoc"][0] = vd.EnableDefaultDoc;
de.Properties["EnableDirBrowsing"][0] = vd.EnableDirBrowsing;
de.Properties["AccessSSL"][0] = vd.AccessSSL;
de.Properties["AccessScript"][0] = vd.AccessScript;
de.Properties["DefaultDoc"][0] = vd.DefaultDoc;
de.Properties["Path"][0] = vd.Path;
de.CommitChanges();
}
//获取虚拟目录集合
private VirtualDirectories GetVirDirs(DirectoryEntries des)
{
VirtualDirectories tmpdirs = new VirtualDirectories();
foreach(DirectoryEntry de in des)
{
if(de.SchemaClassName == "IIsWebVirtualDir")
{
VirtualDirectory vd = new VirtualDirectory();
vd.Name = de.Name;
vd.AccessRead = (bool)de.Properties["AccessRead"][0];
vd.AccessExecute = (bool)de.Properties["AccessExecute"][0];
vd.AccessWrite = (bool)de.Properties["AccessWrite"][0];
vd.AnonymousUserName = (string)de.Properties["AnonymousUserName"][0];
vd.AnonymousUserPass = (string)de.Properties["AnonymousUserName"][0];
vd.AuthBasic = (bool)de.Properties["AuthBasic"][0];
vd.AuthNTLM = (bool)de.Properties["AuthNTLM"][0];
vd.ContentIndexed = (bool)de.Properties["ContentIndexed"][0];
vd.EnableDefaultDoc = (bool)de.Properties["EnableDefaultDoc"][0];
vd.EnableDirBrowsing = (bool)de.Properties["EnableDirBrowsing"][0];
vd.AccessSSL = (bool)de.Properties["AccessSSL"][0];
vd.AccessScript = (bool)de.Properties["AccessScript"][0];
vd.Path = (string)de.Properties["Path"][0];
vd.flag = 0;
vd.DefaultDoc = (string)de.Properties["DefaultDoc"][0];
tmpdirs.Add(vd.Name,vd);
}
}
return tmpdirs;
}
}
///
/// VirtualDirectory类
///
public class VirtualDirectory
{
private bool _read,_execute,_script,_ssl,_write,_authbasic,_authntlm,_indexed,_endirbrow,_endefaultdoc;
private string _ausername,_auserpass,_name,_path;
private int _flag;
private string _defaultdoc;
///
/// 构造函数
///
public VirtualDirectory()
{
SetValue();
}
public VirtualDirectory(string strVirDirName)
{
_name = strVirDirName;
SetValue();
}
private void SetValue()
{
_read = true;_execute = false;_script = false;_ssl= false;_write=false;_authbasic=false;_authntlm=false;
_indexed = false;_endirbrow=false;_endefaultdoc = false;
_flag = 1;
_defaultdoc = "default.htm,default.aspx,default.asp,index.htm";
_path = "C:\\";
_ausername = "";_auserpass ="";_name="";
}
///
///定义属性,IISVirtualDir太多属性了
///我只搞了比较重要的一些,其它的大伙需要的自个加吧。
///
public int flag
{
get{ return _flag;}
set{ _flag = value;}
}
public bool AccessRead
{
get{ return _read;}
set{ _read = value;}
}
public bool AccessWrite
{
get{ return _write;}
set{ _write = value;}
}
public bool AccessExecute
{
get{ return _execute;}
set{ _execute = value;}
}
public bool AccessSSL
{
get{ return _ssl;}
set{ _ssl = value;}
}
public bool AccessScript
{
get{ return _script;}
set{ _script = value;}
}
public bool AuthBasic
{
get{ return _authbasic;}
set{ _authbasic = value;}
}
public bool AuthNTLM
{
get{ return _authntlm;}
set{ _authntlm = value;}
}
public bool ContentIndexed
{
get{ return _indexed;}
set{ _indexed = value;}
}
public bool EnableDirBrowsing
{
get{ return _endirbrow;}
set{ _endirbrow = value;}
}
public bool EnableDefaultDoc
{
get{ return _endefaultdoc;}
set{ _endefaultdoc = value;}
}
public string Name
{
get{ return _name;}
set{ _name = value;}
}
public string Path
{
get{ return _path;}
set{ _path = value;}
}
public string DefaultDoc
{
get{ return _defaultdoc;}
set{ _defaultdoc = value;}
}
public string AnonymousUserName
{
get{ return _ausername;}
set{ _ausername = value;}
}
public string AnonymousUserPass
{
get{ return _auserpass;}
set{ _auserpass = value;}
}
}
///
/// 集合VirtualDirectories
///
public class VirtualDirectories : System.Collections.Hashtable
{
public VirtualDirectories()
{
}
//添加新的方法
public VirtualDirectory Find(string strName)
{
return (VirtualDirectory)this[strName];
}
}
}
2006-12-04
。。。。。。。。。。
Morgan IT 18万+bonus,共25万左右
Google 17万9千多
NI 拿到手14万,四金全部是公司交。
MS atc 15.3万
百度 7000至8500,发14个月,每个季度有4500至6000的奖金。
美国道富银行IT部 8000至12000,发15个月
浙大网新恒天 9500×15
网易杭州研究院 9000至10000,发14个月
ask.com 9000至12000,发14个月
IBM CRL (7500+800+900)*12+7500*2.5+3.3万(住房补贴,三年10万,平均到一年。)
IBM CDL (7500+800)*12+7500*2.5+3.3万
nVidia 测试8000×15,研发10000×15,有期权。
(另一说9000×13,有期权)
Trilogy 16万左右
上海威盛 7500×13,不再提供宿舍
杭州威盛 6000×13
UT斯达康 6500/月,福利不错
腾讯 7000×13,年终奖金15000,但是没有住房公积金
MicroStategy 杭州职位每月12000,14个月,美国职位待遇不详
泰鼎 8000×13,年终奖2个月薪水左右
北京瞬联 9000至10000×12,第一年有10000元安家费
上海展讯 6500至7000,发14-16个月,有期权
Intel 8000×13,加上一些乱七八糟的补贴
华为 5500+1000,年终奖不定,几千到几万都有可能。
中兴 8-10万
2006-11-30
因为 mp3 是受限制格式,所以默认的linux 都不能播放mp3文件...Breeze 执行
sudo apt-get install gstreamer0.8-mad
如果是 Ubuntu 6.06 (Dapper Drake)
sudo apt-get install gstreamer0.10-plugins-ugly
更多其他格式
sudo apt-get install gstreamer0.8-plugins gstreamer0.8-plugins-multiverse gstreamer0.8-ffmpeg
如果是 Ubuntu 6.06 (Dapper Drake)
sudo apt-get install gstreamer0.10-ffmpeg gstreamer0.10-gl gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse libxine-extracodecs ffmpeg lame faad sox mjpegtools libxine-main1
如果需要 w32codecs,运行(dapper源目前不带2006-04-24)
wget -c ftp://ftp.nerim.net/debian-marillat/pool/main/w/w32codecs/w32codecs_20050412-0.0_i386.deb
sudo dpkg -i w32codecs_20050412-0.0_i386.deb
以下为引用内容:mplayer, xine and totem-xine can play MPEG-1, MPEG-2, MPEG-4 (e.g encoded with DivX, XviD, FFmpeg MPEG-4 etc.), QuickTime and other formats using built-in native codecs (mainly from FFmpeg). RealAudio and RealVideo 8 & 9, Windows Media 9 and some other formats are supported via external codecs, either Linux native (RealMedia) or Windows codecs (Windows Media 9, RealMedia) - this support has been bundled into the w32codecs package.
2006-11-28
新手的ubuntu安装日志
从认识Linux开始,一直都是使用的Redhat系列,刚接触ubuntu还有点不习惯。但是当你熟悉它了以后,一定会有一种爱不释手的感觉,我正是如此。代号为Dapper的ubuntu6.06定于6月1号发布,从早上一直等在电脑旁,哪知因为时差关系得等到北京时间下午5点左右才发布,那时刚好有急事出去了一天。6月2号一回来就迫不及待的下载,由于Dapper把LiveCD和InstallCD集成到了一起,只需要登录到图形界面双击 “Install”即可。
我在安装过程中也遇到一点点小麻烦,其中hdb6和hdb7大小分别应该是5G和20G,但是在它的分区管理里面显示的20G和5G,也就是反了过来,我就不知道我该相信分区名还是分区大小?我的20G里面全是有用的文档,最后一狠心选择了把ubuntu安装在“hdb6 20G”上面,我相信分区名是没有错的,系统装好了后验证了我的想法是对的。
一、配置中文环境
进入桌面的第一件事就是配置基本的中文环境,默认安装好后OpenOffice和Firefox都是英文版(在系统安装时可以按F2选择中文环境,则会自动下载中文支持包,但我这里速度不好,故使用下面的方法。),而且自带的SCIM没法使用,系统自带的中文字体也看不惯。解决上面的问题方法有3 步:
1、按照UbuntuChina的快速设置指南先更新了“源”,他们提供了4个不同的源地址,我选择了我这里比较快的“mirror.lupaworld.com源”(也是ubuntu 6.06 官方中文版下载镜像)。
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
sudo gedit /etc/apt/sources.list
用以下内容替换文件中的所有内容
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-security main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-updates main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-backports main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/ubuntu-cn/ dapper main restricted universe multiverse
或者
deb http://ubuntu.cn99.com/ubuntu/ dapper main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-updates main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-security main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-backports main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse
然后
sudo apt-get update
sudo apt-get dist-upgrade
2、然后使用sudo apt-get install language-support-zh安装中文支持环境,或者在“系统-系统管理-语言支持”里面把”Chinese”勾选上。
3、复制simsun.ttc字体到/usr/share/fonts/truetype下面。(我还是习惯使用宋体,WQY实在是看不习惯)
把上面的工作一做,OpenOffice/Firefox已经变成中文界面,使用Ctrl+空格也能直接调出输入法。既然系统自带强大的SCIM输入法,而且暂时也没发现它有什么不好的地方,那就省下安装小企鹅了。
二、调整字体大小
因为我还是比较习惯8pt的英文和9pt的中文宋体,于是找到这篇文章可以让它们共存。方法就是在/etc/fonts/fonts.conf中添加如下内容,然后在字体菜单里把字体设置为8pt就可以了。
如果想进一步了解fonts.conf可以参考这篇文章。
三、调整Firefox和一些系统中文字体过度柔化
(我是使用Bitstream Vera Serif+SimSun字体)
使用上面的方法,系统和Gnome软件的字体基本都在掌握之中了,但是在Firefox里面看网页还是不爽,感觉中文都过度的清晰了,习惯了Windows的朋友应该都喜欢点阵中文宋体来浏览中文,所以我们还得设置。
我发现了2种方法(推荐使用第二种):
1、由于只是浏览网页的问题,那么就对Firefox动手,在这里找到一个很好的方法,能解决这个问题。(升级到Firefox1.5.0.4不适用了)
把/usr/bin/firefox中第64 行改为:
if egrep '^(en|ja|kr|zh|bn|gu|hi|kn|ml|mr|ne|pa|ta|te)_'
2、还发现了使用sudo fontconfig-voodoo -f -s zh_CN这个命令可以解决问题,这里说是根据你指定的参数,将/usr/share/language-selector/fontconfig下面的文件链接到/etc/fonts/下面。
然后sudo gedit /etc/fonts/language-selector.conf
找到:
下面一行添加:
四、XMMS等Gtk1程序的中文显示问题。
sudo cp /etc/gtk/gtkrc.zh_CN /etc/gtk/gtkrc.zh_CN.utf-8
然后在XMMS中设置字体为:
-adobe-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1,-*-*-medium-r-normal--16-*-*-*-*-*-gb2312.1980-0,*-r-*-adobe-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1,-*-*-medium-r-normal--16-*-*-*-*-*-gb2312.1980-0,*-r-*
五、给Firefox安装Flashplayer。
sudo apt-get install flashplugin-nonfree
sudo update-flashplugin
六、基本工作算是做完了,接下来要做的就是安装几个必需的常用软件。以前在FC4上安装软件,虽说一般都有“for fc”的rpm包,但是安装ubuntu的软件可以用享受来形容,使用一句 sudo apt-get install xxx 就搞定一切。
于是马上把我的系统添上了 gftp/mplayer/bluefish/amule 这些东西,网页代码我用bluefish就足够了,别说Zend Studio就连Quanta我都用不着。
以上是我初次安装ubuntu 6.06的手记,如果需要更多的中文帮助可以查阅ubuntuchina wiki。参考《非官方新手入门指南》也是一个不错的选择。
可以说如果没有网络,我是没有信心把ubuntu用下去的。但是如果没有网络,我用电脑干什么呢?
2006-11-27
诺基亚厂家S60系列内部资料
S60资料大全之一诺基亚字符串*#06#:显示IMEI码。 *#0000#:第一行-软件版本,第二行-软件发布日期,第三行-手机型号。(我的手机是心机v5.27.0版本的,04年6月28 号发布。) *3370#(*efr#):开启EFR增强型全速率功能。 #3370#(#efr#):关闭EFR增强型全速率功能。 *4720#(*hra0#):可以开启HR增强型半速率功能。 #4720#(#hra0#):关闭HR增强型半速率编码功能。 *#92702689#:生产日期(*#0000#查询的是系统软件更新日期)。 *#746025625(*#sim0clock#):关掉SIM卡时钟(市面上的主流SIM卡均支持此功能,电池省电30%以上。解除休眠模式需在时钟功能选项中将其设定成显示时钟,并输入时间,再输入年月日即可)。 #7370#:在待机状态格式化手机,使其恢复至出厂状态(这个指令发出后,手机会予以警告,按“是”,就会要求输入手机锁码,初始为12345。然后就会自动关机进入format状态,并有背景灯和“NOKIA”字样。在背景灯没熄且手机没有其他反应时,等1-2分钟,直至格式化完成。接着手机会要求你输入时间、日期等等。保证手机电量充足,千万不要在这时断电或拔出电池,否则轻则要重新刷手机软件、重则会损伤硬件!)。 *#2820#:查询 6600蓝牙的蓝牙芯片地址(每个蓝牙设备都有唯一的地址)。 系统崩溃、无法进入待机画面时的格式化方法:如果你的系统损坏而无法进入待机画面,但启动时能看到“NOKIA”开机画面,可用下面的方法强行格式化系统,使系统恢复正常运行。同时按住拨号键、“*”键、“3”键,打开电源直到 “NOKIA”字样出现,此过程不能松开任何一个按键)。稍稍等几秒直至出现“Formating……/格式化……”字样,这时方可松开按键。过几分钟,系统格式化完成,手机自动重启并进入待机画面。这一过程一般需要两个人配合才能完成。6600内部文件详细解析 6600采用的是symbian的开放式系统的s60的平台。我们可以象使用计算机一样来使用6600。安装了seleq或file man后,我们就可以清晰,方便,快捷的管理其内部的资源。和计算机的管理方法基本相似。为了更好的玩转6600,我们就要象了解win98的系统文件一样了解6600的系统内部文件。下面我帮大家初步了解一下。 安装seleq后,进入c盘,主要的文件夹有c:\nokia;c:\system.其中nokia里面存放的是一些存储在手机上的图片,铃声,短片还有自带的游戏.这里需要注意的一个文件夹是c:\nokia\installs.这里面存放的是安装的手机上的游戏和软件的反安装文件.如果为了节省 c:\的空间,可以把这个文件夹里的反安装文件都剪切到e:\system\installs下面.另外还可以把手机自带的图片删除,能节省大约40k的空间.还可以把自带的游戏文件,c:\nokia\game里面的东西删除,又能节省大约30k的空间. 我们需要详细了解的应该是c:\ system这个文件夹.这里相当于手机的系统文件夹.这里面需要注意的有:apps,data,libs,mail,programs, favourites这几个文件夹.1.apps是我们安装软件,游戏的地方.这里面放的都是他们的程序文件.如果我们需要破解,汉化软件和游戏,就需要把相应的破解文件.app和汉化文件.rsc覆盖相应软件的app和rsc文件(安装到手机上的).2.data是数据文件夹,这里存放着手机上的一些数据资料.我们常用的有:6600的电话本文件为:c:\system\data\contacts.cdb.可直接备份.6600的记事本文件为:c:\ system\data\notepad.dat.可直接备份.realone播放记录:c:\system\data\ mediaplayer.dat,可直接删除.3.libs下面是一些软件的联接文件和库文件.尽量别动.否则会引起软件的出错.4.mail是存放短信的文件夹.如果要格式化手机,而又不想丢失短信的话,就直接把这个文件夹备份一个就可以了.格式化完毕,用备份的文件夹直接覆盖新的mail就可以了. 5.programs下面存放的是一些开机后长驻内存的软件.这些软件开机后会自动启动.如果删除,将导致一些软件无法开机自动启动了. 6.favourites收藏夹文件夹c:\system\favourites\xx.lnk记录着你的快捷键增加的文件的位置及名称. c盘还有一个文件需要注意,就是c:\system\mmcstore,这个文件当你的mmc设置了密码后会自动生成。这是个密码保留文件,当我们忘记mmc上的密码时,把这个文件通过文本的方式打开,就能看到密码了.如果你的mmc设置了密码,最好把这个文件备份一个.以防外一.c盘上需要注意的基本上就这些文件夹,希望大家能深入了解. d:盘主要是上网用的缓冲区,不用费心去了它. e:是我们的mmc.这里面和c:差不多.主要的还是system 这个文件夹,这个文件夹里面的一些具体用途和c上的一样.需要注意的是,如果你带卡格机,最好先把e:\system\sw_autoexec这个文件夹轻空.因为这里是开机后自动启动的文件夹,如果不轻空,可能会导致带卡格机后的无法正常进入功能表. z盘是固化的系统信息.我们刷机器升级的时候, 改的就是这里面的信息.具体的用途解析以后再详细写给大家.对于6600的软件,首先要安装的肯定是文件管理类软件.这里面有seleq, fileman,smartfileman.这3个软件.一般人用的是seleq,但是我推荐使用fileman.因为一是fileman比seleq所占用的内存空间要小,二是支持快捷键的使用(复制,剪接,粘贴一键到位),三是单独把收信箱给列了出来,不用自己辛苦去找.不过了fileman删除文件不用象seleq那样还要更改属性(隐藏和只读文件一样删除),这可以说是好事也是坏事,如果对于文件不是很了解的话,容易误删系统文件.而 smartfileman我觉得就没什么用了.不推荐.其实这3个文件的安装用读卡器都是很容易的,直接把解压以后的文件拷贝到mmc卡上的others 文件夹下,然后装如手机打开 文件管理 这个程序 就可以看到直接点击安装即可 没有其他说的那么复杂(这个是最简单的办法了). 然后可以安装一下内存管理的软件.这里有appman,stacker,taskman,spacedoubler。taskman的作用是1、方便设置快捷键,能将摇杆的四个方向定义为四个实用功能。 2、终止后台运行的程序。 3、压缩内存(效果一般)。 4、设置自动键盘锁。 appman的作用的管理运行的程序, 释放运行的内存,把应用程序设定为捷连.stacker的作用是释放运行的内存,压缩已安装的应用程序,把应用程序设定为捷连.spacedoubler 和stacker的作用差不多.这里面我推荐安装stacker.因为一是相对其他几个软件稳定,二是可以压缩已安装的应用程序(对于mmc卡空间比较紧张的特别实用). 接下来是看电子书的.其中有最经典的是smartviewer1.1优点:短小精悍,只有28k,前后翻页特别迅速,同时支持按键翻页(3和9)缺点: 每次阅读新书要重新选择编码为gbk gb12345 hz gb2312 big5这几个,书只能存储在目录下而不能从收件箱直接提取。 其次是qreader1.39,但是只有小字体。大字体出现乱码,翻页容易出现乱码。回翻是其致命伤,qreader回翻只能用控制杆,不能用键(往后翻有专用键,速度也不错)。然后是readm2.03。 看电影肯定要装smartmovie,支持.avi格式全屏播放。 mobiclipplayer这个也不错,不过支持的是.mo格式的(这种影片格式的网上还是比较少)关键是看flash动画。funinhand也是要装的,在线看电视就是要靠他了,虽然现在他说支持网络收音机,但是我试用了下只有西湖之声,而且打不开,汗~~~(呵呵,现在我们这50包月不限流量),不过我认为这个软件一是要包月,二是要gprs网络信号好的地方,要不然30秒就要缓冲一下。 上网的软件其中聊天的有agilemessenger (支持icq,msn,aol,yahoo,jabber),或者qq.sis ,qq.jar。 装qq.jar的要好一点,不用另外装字体就可以显示中文。上网软件我觉得最好的还是opera,支持的格式全面,基本上的网页都可以打开,可以全屏,我上6600的论坛用的就是他,但是要手机自带的 opera比较好,因为opera的破解无限试用汉化版本的对中文网页的支持不是很好。没有自带的opera 就装dorisbrowser这个也不错,其实netfront满好的,速度快,支持的格式也全,但是不支持中文网站。webviewer网页浏览的唯一优点是短小精干,只有50k,不象 opera有800多k,但是象打开6600论坛都比较困难很麻烦功略c里面:有nokia,和system两个folder c:\nokia\里面: images images_tn installs others sounds 说明: images里面全部可以删除,tn是缩略图,不管 install为空,记录传过来的sis文件的 others为空 sounds:为空 重要的是system: c:\system\apps\ 以后安装软件均装到这个文件夹,作用相当于电脑c盘的“program files” applnst\appinst.ini 初始大小52b 这个文件以后安装软件大小会变,主要记录安装软件的信息,重要 profileapp\dbprofile.db 3kb 这个文件以后安装软件大小会变,数据库主要记录安装软件的信息,重要 systemexplorer: seleq的程序,可以看出seleq的作用相当于电脑的"我的电脑"和ie的作用了 以上为c:\system\apps\全部初始内容,如果用seleq更改operator logo,则里面多个phone\oplogo \460_0_0.bmp 7kb c:\system\bootdata\ commondata.d00,17b 这个文件也永远不变 firstboot.dat 0b 这个文件永远都为0,我将该文件删除,重新启动后让输入时间和日期,查看后又回来了,多出了这个文件: simlanguage.dat 4b,传入电脑用记事本查看,内容为31,估计31定义了sim卡语言,表示简体,正好与下面那个 localedata。d31扩展名的31对应 haldata.dat 16b 永远不变 localedata.d31 70b 永远不变 c:\ system\data\ 这是个非常重要的folder,我将这里写的非常详细,新手删除时请仔细操作 \cbs里面有2个文件,cbs0.dat 大小71b永远不变,cbs1.dat,大小有变化,作用不清楚 \saveddecks 与网络服务有关, 初始时这里内容为空 \wapstore 为存储的网页或者缓存 applications.dat为程序数据记录,重要 bookmarks.db,为书签,记录wap地址的 btstate.dat 文件大小会变,作用不清楚 cacerts.dat为证书,就是你安装软件时查看证书的,nokia初始时允许的证书在这里 calendar为日历了,初始大小为365b cntmodel.ini与名片有关 contacts.cdb即为名片文件了! logdbu.dat 记录了通讯记录,包括电话,gprs流量等 mrouteragent.ini和mrouterclient.dat里面记录了手机与电脑连接(我用红外)的设置参数,也许修改某些数据项可以更细致的优化连接,以后慢慢研究了 nitz.dat大小不变,打开发现里面只有“1”一个字符,作用不清楚 smsreast.dat和smssegst.dat初始大小均为59b,看名称肯定与短信有关 template.n31,初始大小558b,具体作用不清楚,但是肯定与语言和地理位置设置有关 wapreast.dat, 初始59b,与wap有关 认识S60系统并巧妙节省空间 (NOKIA6600为例)我们既然要用肥六,当然首先要了解我们肥六的Symbian系统所支持的格式和在安装软件时的工作原理。 Symbian 系统所支持的有: *.sis(标准的Symbian OS操作系统的安装文件) *.app(一般都为解密文件) *.jar(一般为Kjava的软件或游戏) *.exe(最多的是注册器,只要输入自己手机的IMEI号码,就会生成一串数字,把它输入到手机里,那个软件就是完全版的了) *.jad (安装路径文件,现在一般都没有 *.txt(多为软件介绍和使用方法,E文的) *.html(多为软件介绍和使用方法,还有其软件的主页链接) *.pdf(多为软件介绍和使用方法,E文的) *.nfo(一般是解密者的介绍,可用手写版打开,有时里面会包涵软件的注册码) *.bk1(软件备份数据,里面会包涵软件的注册信息) *.rsc(操作系统的程序资源文件,现在一般是汉化文件,利用SeleQ或FileMan把此文件将源文件覆盖,即可完成汉化) 现在最常见的软件格式是SIS和JAR,首先SIS,在安装过程中,系统吧它装在C(E):\system\apps\中(这相当于电脑的"Program Files"),并在c(e):\system\install\里生成一个反安装文件,而且在"程序管理"中见到它的反安装程序图标是橙色的,点选查看属性能看到是"Symbian OS"格式。而JAR文件的解压缩后并不直接安装在C(E):\system\apps\中,而是先安装在C(E):\system\MIDlets\中,然后再在C(E):\system\apps\Registry\中(相当于电脑的开始菜单文件)创建一个相应的启动图标,而且在"程序管理"中见到是蓝色的,点选查看详情能看到"Kjava"格式。 手机装软件或者游戏不过是很简单的解压缩并拷贝文件到相应目录的过程。一般都先将安装文件传输到手机(或存贮卡)里,然后在手机里执行安装程序。但是Symbian系统装这些程序时是要先把文件压解到手机的存贮空间,然后再将解压出来的文件拷贝到你设置的安装路径,一般最常见的问题就出现在这里:在安装游戏或者软件时系统总是提示存贮空间不足,可是查看一下自己手机上的MMC卡使用情况,却明明还有很多可用空间。这令许多新手百思不得其解。因为在压解过程中,如果你的手机机身存贮空间不足,就会导致解压过程无法正常完成,系统会跳出"空间不足"的警告。就算你的MMC卡里还有上百兆甚至上G的空间也没有用。 了解安装原理后,再让我们来进一步压缩机身的可用空间。 本人用的软件是SELEQ,为了即使拿下MMC卡也能正常使用,我装去了机身存槠 SeletQ v1.65简体中文版 一般来说,每次安装完一个软件或者游戏,都会在c:\system\install\下生成一个和安装文件同名的反安装文件,一般是SIS格式的,不过这里的SIS文件是不能够直接运行的。而这些文件的作用是能让手机的"程序管理"识别出已安装的软件,并提供直接删除的功能。虽然说是个比较人性化的设计方式,不过...很多朋友都喜欢下载电子书到手机里,日积月累,手机中的电子书越来越多了,但,一打开"程序管理",问题就来了:一大堆的反安装目录弹了出来,打开"程序管理"也花了好几分钟,然后,删除一个电子书再等几分钟才能刷新目录。晕咯!要多久才能删光?一小时?两小时?鸟都睡着了吧大哥。其实用户完全可以不必理会系统的这种方式的设计,c:\system\install\目录中的所有文件都是可以删除的!并且不会对一安装的软件产生任何影响!大家可以用SELEQ进入该目录后将里面的全部删除掉,从而获得更多的C盘空间。不过删除后,手机的"程序管理"列表里就不会列出该软件,那么怎样对该软件进行删除呢? 很简单,如果装在机身存槠,就进c"\system\install\里找到相应软件的文件夹删除即可,同理,装在MMC卡的进e"\ system\install\里删。 要说一下,我们的肥六是Symbian 70的,系统比Symbian 60的做了改动。如果用户将软件装在 MMC的话,那么相应的反安装文件就会出现在e:\system\install\里而不是C盘,相对C盘就没有那么紧张,当然为了空间,大家大可以也删掉它们的反安装文件。 举例说一下,电子书的反安装文件都放在c(e):\system\install\Registry\里,大家可以直接把这个文件夹删掉就OK了,不过前提是没有安装其他JAVA程序。 具体如:我的TMQQ装在存贮卡里,用SELEQ找到它就在E:System\apps \[101ba748]\文件夹里,但却找不准到底哪个才是它的反安装文件,想要删它的反安装文件时,先在E:System\apps\ [101ba748]\里找到"[101ba748].txt文件",按"编辑文件"来查看,见到: "TM e:\system\MIDlets\ [101653ac]\20041104162218.jar" 这个就是它的JAR文件的存放地,注意这个地址中的"[101653ac]",这个就是它在反安装目录下的文件夹名,转到e:\system\install\Registry\里找到改文件夹,把它删掉,这样就万事大吉了,这样,在"程序管理"中就不会再出现它的反安装程序了。 还有,少数一些游戏如部分NG游,即使安装在E盘,但还是会在C:\system\apps\中也生成一个和E盘中同名的文件夹,主要是用来放游戏的存档文件.在删除游戏后,这些文件夹也大可以删除. 有些朋友喜欢听MP3或者想用手机看影片,在传输去手机时会弹出"内存不足"的警告,其实只要进入主菜单-信息-选项-设置-其他-将"使用中的存槠"改为"存槠卡",就可以解决这种问题了
2006-11-22
西门子SX1工程模式
1:serving cell(测试网络信号功能)
CH117 RX-063 -02
CI F641 C1+41 93
LAI 64F010 4810
TXPWR33 RXAM-104
C2+41 BSPA5 BA12
P0 P1
P2 P3
CH- 频道编号,GSM900M的范围是1~124,DCS1800的范围是512~885。西门子的在DCS1800系统中显示的数值要加上337 才是一般识别码中显示的 也就是联通移动使用的编码。
RX 显示接收到的信号强度(单位:-dBm),范围从RXAM ~ 0,
这个是负数值 一般如果小于-100dBm 那就不能通话了 一般在-40到-100之间 -50以上就是满格信号了
CI Cell ID,基站(BTS)编号, 西门子的是16进制的 F641(16进制)=63041 代表你在的基站编号为6304 在A小区
C1 路径损失参数,供手机决定频道选定的参数.C1值用以确保手机所在的频道,收发均有成功通讯的机会。
C2 基站重新选择参数。C2用以决定重新选择基地台的时机.
LAI 位置区识别码,使用GSM运营商代码和地区代码来表示。中国联通GSM,64F010;中国移动,64F000;
TXPWR 通话时手机的发射功率,单位dBm。所谓的某款手机辐射大,似乎应该指这项。但是手机的发射功率并不完全由手机本身决定,基站是可以进行调整的。
RXAM 可以接收的最低信号电平,越低越好。我的是-104,网上见过-111的。这值同手机信号有较大的关系。假设你的这个值是-96,那么当周围的信号是-97时,你的手机就会出现搜索网络了,别人的还有一格。
BSPA 当前网络使用帧
BA 频道分配
2: neighbour cell list(相邻小区列表)
S 当前使用基站 依次为 CH RX C1 C2
1 周围基站1 — – — – –
2 周围基站2 — – — – –
3 周围基站3 — – — – –
4 周围基站4 — – — – –
5 周围基站5 — – — – –
6 周围基站6 — – — – –
3.GPRS MONITOR
进入后显示:
GPRS#1
0022 G - - 4
46000 88F2 1574
0 - 2 10 01/7 FF
xxx—– C2IH900 < --x为上传状态
--x----- C2ID000 <--x为下载状态
S 0/22 2/09 0001
0000 0000 19 1
0000 0000 00 00
上面箭头中2行的C2表示的是连接速率。
C1----9.05Kbit/s
C2----13.4Kbit/s
C3----15.6Kbit/s
C4----21.4Kbit/s
按一下摇杆。进入GPRS#2,显示如下:
GPRS#2
1 I400
010.020.007.240 <--ip地址
3 1 2 04 31 03 0
CMWAP <--接入名称
现在上GPRS的时候不怕误接到cmnet被收费啦。
4.Accessories
这里会实时显示接到手机上的附件型号。
如:接上540数据线显示
Accessories:
[Devices]
Data Cable USB-USB
ID:DCA-540
Vibra locked
接耳机显示:
Accessories:
[Devices]
Headset mono
ID:HHS-510
要注意的是,在这里一插上附件就会有显示,拔掉的话显示消失。
不会像cc-monitor是显示进入时的状态(不会实时变化)。
5.Charge Monitor:
显示为:
Charge Monitor:
VMA 3936 STA WAIT
VME 3933 PPR 000
VMI 3933 CTY NONE
TBA +271 TEN +301
TIC 4957 TCD 0065
TLC 1178 BTY Lilo
TOU 0071
VMA VME VMI感觉是电池的电压,但是具体有什么不同也不清楚。
STA: 后面是充电的状态,显示“WAIT”时是待机,充电的时候显示“MAIN”
PPR: 待机的时候显示“000”,在刚开始充电的时候显示“100”,当电量充到到100%的时候,PPR的值开始下降,直到显示“000”的时候,充电完毕。
但是很早的时候就有人说过,65要是让他充到自己停的话,电量会从100%掉到95%左右。
我的建议,充电的时候,PPR下降到差不多60的时候就可以停止充电了。
TBA:电池的温度,单位摄式度,如上面的是27.1度。
TEN:环境温度,上面的是30.1度
有的人不太明白手机是怎么测试到这两个温度的,这里解释一下:
电池温度,是通过电池里面的保护电路测到的。而环境温度,是通过cup过热保护电路测到的。
BTY:电池的类型。Lilo表示的就是锂电池。
TIC:开机时间,单位5秒。每次开机都会回零。(感谢 polarbear_2003 提供)
TLC:从上一次充电的开机总时间,单位分钟,关机机不会回零。插直充到手机上的时候回零。
TCD:充电时间,从插直充到手机上开始计时,拔下停止。单位分钟。
6.ACCU Monitor:
显示为:
AkkuMon(1)
HOB3936 HIB3936
AVO3930 AVG3930
LOB3927 LIB3927
TEV3027 ADI0000
PLH3900 PLD0162
PLL3738 PL05 GSM
AST3350 ASI3550
UBT3936 CAP0075
其中LOB和 LIB的显示数值和Charge Monitor中vmi中的数值一样。可以大致认为就是电池的电压。
这个里面很有用的一个显示就是CAP
CAP后显示的就是电池剩余电量的百分比,如上面显示的就是还有75%。
2006-11-21
在UltraEdit中使用正则表达式
正则表达式 (UltraEdit Syntax):
% 匹配行首 - 表明要搜索的字符串一定在行首.
$ 匹配行尾 - 表明要搜索的字符串一定在行尾
? 匹配除换行符外的任一单个字符.
* 匹配任意个数的字符出现任意次数(不包括换行符)
+ 匹配前导字符或者表达式出现一次或者更多次(不包括换行符)
++ 匹配前导字符或者表达式不出现或者出现一次以上(不包括换行符)
^b 匹配页中断符
^p 匹配DOS文件的换行符
^r 匹配MAC文件的换行符(CR Only)
^n 匹配UNIX文件的换行符 (LF Only)
^t 匹配一个制表符
[ ] 匹配方括号中的单个的字符
删除空行: 替换 %[ ^t]++^p 为 空串
删除行尾空格: 替换 [ ^t]+$ 为 空串
删除行首空格: 替换 %[ ^t]+ 为 空串
每行设置为固定的4个空格开头: 替换 %[ ^t]++^([~ ^t^p]^) 为 " ^1"
每段设置为固定的4个空格开头: 替换 %[ ^t]+ 为 " "
(如果一行是以空格开始的,则视之为一段的开始行)
将一段合并为一行: 替换 [ ^t]++^p^([~ ^t^p]^) 为 ^1
(注意: 此处假定文本是以DOS方式回车换行 - CR/LF)
去掉HTML TAG: 替换 ^{<*>^}^{<*^p*>^} 为 空串
删除HTML中的所有: 替换 <[ ]++a *[ ]++href[ ]++=*> 为 空串
删除文本中指定的前2列字符: 替换 %?? 为 空串
在第4列后插入2列空白字符: 替换 %^(????^)^(?^) 为 "^1 ^2"
查找所有的数字: [0-9]+[.]++[0-9]+
查找所有的单词: [a-z]+
查找所有的网址: http://[a-z0-9^~`_./^-^?=&]+
注意: 替换的时候需要勾选使用正则表达式选项
2006-11-17
自己用的分页存储过程
(
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
--- print @strSQL
exec (@strSQL)
GO
2006-09-06
我也css了
/p>p>用web标准设计网站,过渡的方法主要是采用XHTML+CSS,css样式表是必不可少的。这就要求所有网页设计师必须熟练掌握CSS,如果你以前不常用,那么现在就开始学习吧。要制作符合web标准的网站,不懂CSS是设计不出漂亮的页面的。/p> p>事实上,所有表现的地方都需要用CSS来实现。我们以前都习惯用table来定位和布局,现在要改用DIV来定位和布局。这是思维方式的变化,一开始有些不习惯。呵呵,任何变革都会有阻力的,为了享受标准带来的"益处",放弃一些老的传统做法是值得的。/p> h3>外部调用样式表/h3>在以前,我们通常采用2种方法使用样式表: ul>li>页面内嵌法:就是将样式表直接写在页面代码的head区。类似这样: /li>/ul>span class="code">style type="text/css"> !-- body { background : white ; color : black ; } --> /style>/span> ul>li>外部调用法:将样式表写在一个独立的.css文件中,然后在页面head区用类似以下代码调用。 /li>/ul>span class="code">link rel="stylesheet" rev="stylesheet" href="css/style.css" type="text/css" media="all">/span> p>在符合web标准的设计中,我们使用外部调用法,好处不言而喻,你可以不修改页面只修改.css文件而改变页面的样式。如果所有页面都调用同一个样式表文件,那么改一个样式表文件,可以改变所有文件的样式。/p> h3>双表法调用样式表/h3> p>查看某些符合标准站点的原代码,你可能看到,在调用样式表的地方有如下2句:/p>span class="code">link rel="stylesheet" rev="stylesheet" href="css/style.css" type="text/css" media="all">/span> span class="code">style type="text/css" media="all">@import url( css/style01.css );/style>/span> p>为什么要写两次呢?/p> p>实际上一般情况下用外联法调用(就是第一句)就足够了。我这里使用双表调用只是一种示例。其中的"@import"命令用于输入样式表。而 "@import"命令在netscape 4.0版本浏览器是无效的。也就是说,当你希望某些效果在netscape 4.0浏览器中隐藏,在4.0以上或其它浏览器中又显示的时候,你可以采用"@import"命令方法调用样式表。/p>
h3>收藏夹小图标/h3> p>如果你将本站a href="javascript:window.external.AddFavorite%28" org="" 88="">加入收藏夹/a>,可以看到在收藏夹网址之前的IE图标变成了本站特别的图标img src="http://www.w3cn.org/article/step/2004/images/logo_w3cn_16x16.gif" alt="收藏夹小图标" height="16" width="16" />。要实现这样效果很简单,首先制作一个16x16的icon图标,命名为favicon.ico,放在根目录下。然后将下面的代码嵌入head区:/p> p>span class="code">link rel="icon" href="/favicon.ico" type="image/x-icon">/span>
span class="code">link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">/span>/p> h3>为搜索引擎准备的内容/h3> p>代码如下,替换成你自己站点的内容就可以:/p> ul>li>允许搜索机器人搜索站内所有链接。如果你想某些页面不被搜索,推荐采用a href="http://www.google.com/search?hl=zh-CN&ie=UTF-8&q=robots.txt%E7%94%A8%E6%B3%95&btnG=%E6%90%9C%E7%B4%A2&lr=lang_zh-CN" target="_blank">robots.txt方法/a>/li>/ul> span class="code">meta content="all" name="robots">/span> ul>li>设置站点作者信息/li>/ul> span class="code">meta name="author" content="ajie@netease.com,阿捷">/span> ul>li>设置站点版权信息/li>/ul> span class="code">meta name="Copyright" content="www.w3cn.org,自由版权,任意转载">/span> ul>li>站点的简要介绍(推荐)/li>/ul> span class="code">meta name="description" content="新网页设计师。web标准的教程站点,推动web标准在中国的应用">/span> ul>li>站点的关键词(推荐)/li>/ul> span class="code">meta content="designing, with, web, standards, xhtml, css, graphic, design, layout, usability, ccessibility, w3c, w3, w3cn, ajie" name="keywords">
/span>p>在开始正式内容制作之前,我们必须先了解一下web标准有关代码的规范。了解这些规范可以帮助你少走弯路,尽快通过代码校验。/p> h3>1.所有的标记都必须要有一个相应的结束标记/h3> p>以前在HTML中,你可以打开许多标签,例如/p>p>和/p>li>而不一定写对应的p>/p>和 /li>来关闭它们。但在XHTML中这是不合法的。XHTML要求有严谨的结构,所有标签必须关闭。如果是单独不成对的标签,在标签最后加一个 "/"来关闭它。例如:p>/p> span class="code">
/span>span class="code">img alt="网页设计师" src="images/logo_w3cn_200x80.gif" height="80" width="200" />/span> h3>2.所有标签的元素和属性的名字都必须使用小写/h3> p>title>和/title>title>是不同的标签。XHTML要求所有的标签 和属性的名字都必须使用小写。例如:/title>与HTML不一样,XHTML对大小写是敏感的,必须写成 。大小写夹杂也是不被认可的,通常dreamweaver自动生成的属性名字"onMouseOver"也必须修改成"onmouseover"。/p> h3>3.所有的XML标记都必须合理嵌套/h3> p>同样因为XHTML要求有严谨的结构,因此所有的嵌套都必须按顺序,以前我们这样写的代码:/p> span class="code">p>b>/b>/p>/span> p>必须修改为:/p> span class="code">p>b>/b>/p>/span> p>就是说,一层一层的嵌套必须是严格对称。/p> h3>4.所有的属性必须用引号""括起来/h3> p>在HTML中,你可以不需要给属性值加引号,但是在XHTML中,它们必须被加引号。例如:/p> span class="code">height=80>/height=80>/span> p>必须修改为:/p> span class="code">height="80">/height="80">/span> p>特殊情况,你需要在属性值里使用双引号,你可以用",单引号可以使用',例如:/p> span class="code">alt="say'hello'">/alt="say'hello'">/span> h3>5.把所有和&特殊符号用编码表示/h3> ul>li>任何小于号(),不是标签的一部分,都必须被编码为span class="code">& l t ;/span>/li>li>任何大于号(>),不是标签的一部分,都必须被编码为span class="code">& g t ;/span>/li>li>任何与号(&),不是实体的一部分的,都必须被编码为span class="code">& a m p;/span>/li>/ul> p>注:以上字符之间无空格。/p> h3>6.给所有属性赋一个值/h3> p>XHTML规定所有属性都必须有一个值,没有值的就重复本身。例如:/p> span class="code">/span> span class="code">input name="shirt" value="medium" type="checkbox">/span> p>必须修改为:/p> span class="code">/span> span class="code">input name="shirt" value="medium" checked="checked" type="checkbox">/span> h3>7.不要在注释内容中使“--”/h3> p>“--”只能发生在XHTML注释的开头和结束,也就是说,在内容中它们不再有效。例如下面的代码是无效的:/p> span class="code">!--这里是注释-----------这里是注释-->/span> p>用等号或者空格替换内部的虚线。/p> span class="code">!--这里是注释============这里是注释-->/span> p>以上这些规范有的看上去比较奇怪,但这一切都是为了使我们的代码有一个统一、唯一的标准,便于以后的数据再利用。/p>
p>CSS是Cascading Style Sheets(层叠样式表)的缩写。是一种对web文档添加样式的简单机制,属于表现层的布局语言。/p> h3>1.基本语法规范/h3> p>分析一个典型CSS的语句:/p> span class="code">p {COLOR:#FF0000;BACKGROUND:#FFFFFF}/span> ul>li>其中"p"我们称为"选择器"(selectors),指明我们要给"p"定义样式;/li>li>样式声明写在一对大括号"{}"中;/li>li>COLOR和BACKGROUND称为"属性"(property),不同属性之间用分号";"分隔;/li>li>"#FF0000"和"#FFFFFF"是属性的值(value)。/li>/ul> h3>2.颜色值/h3> p>颜色值可以用RGB值写,例如:span class="code">color : rgb(255,0,0)/span>,也可以用十六进制写,就象上面例子span class="code">color:#FF0000/span>。如果十六进制值是成对重复的可以简写,效果一样。例如:#FF0000可以写成#F00。但如果不重复就不可以简写,例如#FC1A1B必须写满六位。/p> h3>3.定义字体/h3> p>web标准推荐如下字体定义方法:/p> span class="code">body { font-family : "Lucida Grande", Verdana, Lucida, Arial, Helvetica, 宋体,sans-serif; }/span> ul>li>字体按照所列出的顺序选用。如果用户的计算机含有Lucida Grande字体,文档将被指定为Lucida Grande。没有的话,就被指定为Verdana字体,如果也没有Verdana,就指定为Lucida字体,依此类推,;/li>li>Lucida Grande字体适合Mac OS X;/li>li>Verdana字体适合所有的Windows系统;/li>li>Lucida适合UNIX用户/li>li>"宋体"适合中文简体用户;/li>li>如果所列出的字体都不能用,则默认的sans-serif字体能保证调用;/li>/ul> h3>4.群选择器/h3> p>当几个元素样式属性一样时,可以共同调用一个声明,元素之间用逗号分隔,:span class="code"> p, td, li { font-size : 12px ; }/span> /p> h3>5.派生选择器/h3> p>可以使用派生选择器给一个元素里的子元素定义样式,例如这样:/p>span class="code"> li strong { font-style : italic; font-weight : normal;} /span>p>就是给li下面的子元素strong定义一个斜体不加粗的样式。/p> h3>6.id选择器/h3> p>用CSS布局主要用层"div"来实现,而div的样式通过"id选择器"来定义。例如我们首先定义一个层/p>span class="code">div id="menubar">/div>/span>p>然后在样式表里这样定义:/p> span class="code">#menubar {MARGIN: 0px;BACKGROUND: #FEFEFE;COLOR: #666;}/span> p>其中"menubar"是你自己定义的id名称。注意在前面加"#"号。/p> p>id选择器也同样支持派生,例如:/p> span class="code">#menubar p { text-align : right; margin-top : 10px; }/span> p>这个方法主要用来定义层和那些比较复杂,有多个派生的元素。/p> h3>6.类别选择器/h3> p>在CSS里用一个点开头表示类别选择器定义,例如:/p> span class="code">.14px {color : #f60 ;font-size:14px ;}/span> p>在页面中,用class="类别名"的方法调用:/p> span class="code">span class="14px">14px大小的字体/span>/span> p>这个方法比较简单灵活,可以随时根据页面需要新建和删除。/p> h3>7.定义链接的样式/h3> p>CSS中用四个伪类来定义链接的样式,分别是:a:link、a:visited、a:hover和a : active,例如:/p> span class="code"> a:link{font-weight : bold ;text-decoration : none ;color : #c00 ;}
a:visited {font-weight : bold ;text-decoration : none ;color : #c30 ;}
a:hover {font-weight : bold ;text-decoration : underline ;color : #f60 ;}
a:active {font-weight : bold ;text-decoration : none ;color : #F90 ;} /span> p>以上语句分别定义了"链接、已访问过的链接、鼠标停在上方时、点下鼠标时"的样式。注意,必须按以上顺序写,否则显示可能和你预想的不一样。记住它们的顺序是“LVHA”。/p>
p>
/p>p>CSS布局与传统表格(table)布局最大的区别在于:原来的定位都是采用表格,通过表格的间距或者用无色透明的GIF图片来控制文布局版块的间距;而现在则采用层(div)来定位,通过层的margin,padding,border等属性来控制版块的间距。/p> h3>1.定义DIV/h3> p>分析一个典型的定义div例子:/p>span class="code">#sample{ MARGIN: 10px 10px 10px 10px;
PADDING:20px 10px 10px 20px;
BORDER-TOP: #CCC 2px solid;
BORDER-RIGHT: #CCC 2px solid;
BORDER-BOTTOM: #CCC 2px solid;
BORDER-LEFT: #CCC 2px solid;
BACKGROUND: url(images/bg_poem.jpg) #FEFEFE no-repeat right bottom;
COLOR: #666;
TEXT-ALIGN: center;
LINE-HEIGHT: 150%; WIDTH:60%; } /span> p>说明如下:/p> ul>li>层的名称为sample,在页面中用span class="code">div id="sample">就可以调用这个样式。 /div>/span>/li>li>MARGIN是指层的边框以外留的空白,用于页边距或者与其它层制造一个间距。"10px 10px 10px 10px"分别代表"上右下左"(顺时针方向)四个边距,如果都一样,可以缩写成"span class="code">MARGIN: 10px;/span>"。如果边距为零,要写成"span class="code">MARGIN: 0px;/span>"。注意:当值是零时,除了RGB颜色值0%必须跟百分号,其他情况后面可以不跟单位"px"。MARGIN是透明元素,不能定义颜色。 /li>li>PADDING是指层的边框到层的内容之间的空白。和margin一样,分别指定上右下左边框到内容的距离。如果都一样,可以缩写成"span class="code">PADDING:0px/span>"。单独指定左边可以写成"PADDING-LEFT: 0px;"。PADDING是透明元素,不能定义颜色。 /li>li>BORDER是指层的边框,"BORDER-RIGHT: #CCC 2px solid;"是定义层的右边框颜色为"#CCC",宽度为"2px",样式为"solid"直线。如果要虚线样式可以用"dotted"。 /li>li>BACKGROUND是定义层的背景。分2级定义,先定义图片背景,采用"url(../images/bg_logo.gif)"来指定背景图片路径;其次定义背景色"#FEFEFE"。"span class="code">no-repeat/span>"指背景图片不需要重复,如果需要横向重复用"span class="code">repeat-x/span>",纵向重复用"span class="code">repeat-y/span>",重复铺满整个背景用"repeat"。后面的"right bottom;"是指背景图片从右下角开始。如果没有背景图片可以只定义背景色span class="code">BACKGROUND: #FEFEFE/span> /li>li>COLOR用于定义字体颜色,上一节已经介绍过。 /li>li>TEXT-ALIGN用来定义层中的内容排列方式,center居中,left居左,right居右。 /li>li>LINE-HEIGHT定义行高,150%是指高度为标准高度的150%,也可以写作:span class="code">LINE-HEIGHT:1.5/span>或者LINE-HEIGHT:1.5em,都是一样的意思。 /li>li>WIDTH是定义层的宽度,可以采用固定值,例如500px,也可以采用百分比,象这里的"60%"。要注意的是:这个宽度仅仅指你内容的宽度,不包含margin,border和padding。但在有些浏览器中不是这么定义的,需要你多试试。 /li>/ul> p>下面是这个层的实际表现:/p> div id="sample"> p>这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,/p> p>这里是演示内容,这里是演示内容,/p> p>这里是演示内容,这里是演示内容,/p>这里是演示内容.../div> p>我们可以看到边框是2px的灰色,背景图片在右下没有重复,内容距离上和左边框20px,内容居中,一切和预想的一样。hoho,虽然不好看,但它 是最基本的,掌握了它,你就已经学会一半的CSS布局技术了。就是这样,不算难吧!(另一半是什么?另一半是层与层之间的定位。我会在后面逐步讲解。)/p> h3>2.CSS2盒模型/h3> p>自从1996年CSS1的推出,W3C组织就建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对 像包括段落、列表、标题、图片以及层/p>div>。盒模型主要定义四个区域:内容(content)、边框距(padding)、边界 (border)和边距(margin)。上面我们讲的sample层就是一个典型的盒。对于初学者,经常会搞不清楚margin,background -color,background-image,padding,content,border之间的层次、关系和相互影响。这里提供一张盒模型的3D 示意图,希望便于你的理解和记忆。p>/p>img alt="CSS2盒模型的3D示意图" src="http://www.w3cn.org/article/step/2004/images/cssbox3d.gif" height="400" width="500" /> h3>3.辅助图片一律用背景处理/h3> p>用XHTML+CSS布局,有一个技术一开始让你不习惯,应该说是一种思维方式与传统表格布局不一样,那就是:所有辅助图片都用背景来实现。类似这样:/p>span class="code">BACKGROUND: url(images/bg_poem.jpg) #FEFEFE no-repeat right bottom;/span> p>尽管可以用img src="" />直接插在内容中,但这是不推荐的。这里的"辅助图片"是指那些不是作为页面要表达的内容的一部分,而仅仅用于修 饰、间隔、提醒的图片。例如:相册中的图片、图片新闻中的图片,上面的3d盒模型图片都属于内容的一部分,它们可以用img src="" />元素直接插在 页面里,而其它的类似logo,标题图片,列表前缀图片都必须采用背景方式或者其他CSS方式显示。/p> p>这样做的原因有2点:/p> ul>li>将表现与结构彻底相分离(参考阅读另一篇文章:《a title="阅读理解表现与结构相分离" href="http://www.w3cn.org/article/tips/2004/43.html">理解表现与结构相分离/a>》),用CSS控制所有的外观表现,便于改版。 /li>li>使页面更具有易用性,更有亲和力。例如:盲人使用屏幕阅读机,用背景技术实现的图片就不会被朗读出来。 /li>/ul>
p>
/p>
p>
/p>p>
/p>
/div>/li>
2006-08-14
检测网站 服务器的状态
一个好不错的服务. 检测网站 服务器的状态。
http://www.siteuptime.com/users/statistics.php?Action=Stat&UserServiceId=39963
2006-06-27
cdn
实际上,内容分发布网络(CDN)是一种新型的网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN代 表了一种基于质量与秩序的网络服务模式。简单地说,内容发布网(CDN)是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内 容管理4个要件,而内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。总的来说,内 容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们 客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。据统计,采用CDN技术,能处理整个网站页面的 70%~95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。
与目前现有的内容发布模式相比较,CDN强调了网络在内容发布中的重要性。通过引入主动的内容管理层的和全局负载均衡,CDN从根本上区别于传统的内容发 布模式。在传统的内容发布模式中,内容的发布由ICP的应用服务器完成,而网络只表现为一个透明的数据传输通道,这种透明性表现在网络的质量保证仅仅停留 在数据包的层面,而不能根据内容对象的不同区分服务质量。此外,由于IP网的"尽力而为"的特性使得其质量保证是依靠在用户和应用服务器之间端到端地提供 充分的、远大于实际所需的带宽通量来实现的。在这样的内容发布模式下,不仅大量宝贵的骨干带宽被占用,同时ICP的应用服务器的负载也变得非常重,而且不 可预计。当发生一些热点事件和出现浪涌流量时,会产生局部热点效应,从而使应用服务器过载退出服务。这种基于中心的应用服务器的内容发布模式的另外一个缺 陷在于个性化服务的缺失和对宽带服务价值链的扭曲,内容提供商承担了他们不该干也干不好的内容发布服务。
纵观整个宽带服务的价值链,内容提供商和用户位于整个价值链的两端,中间依靠网络服务提供商将其串接起来。随着互联网工业的成熟和商业模式的变革,在这条 价值链上的角色越来越多也越来越细分。比如内容/应用的运营商、托管服务提供商、骨干网络服务提供商、接入服务提供商等等。在这一条价值链上的每一个角色 都要分工合作、各司其职才能为客户提供良好的服务,从而带来多赢的局面。从内容与网络的结合模式上看,内容的发布已经走过了ICP的内容(应用)服务器和 IDC这两个阶段。IDC的热潮也催生了托管服务提供商这一角色。但是,IDC并不能解决内容的有效发布问题。内容位于网络的中心并不能解决骨干带宽的占 用和建立IP网络上的流量秩序。因此将内容推到网络的边缘,为用户提供就近性的边缘服务,从而保证服务的质量和整个网络上的访问秩序就成了一种显而易见的 选择。而这就是内容发布网(CDN)服务模式。CDN的建立解决了困扰内容运营商的内容"集中与分散"的两难选择,无疑对于构建良好的互联网价值链是有价 值的,也是不可或缺的最优网站加速服务。
memcached使用笔记(转贴)

memcached使用笔记(转贴)
关键词: memcached使用笔记memcached使用笔记(转贴)
关键词: memcached= memcached使用笔记 =
--------------------------------------------------------------------------------
作者: 来源: 添加时间: 2005-11-11 12:00
= 第一.memcached是什么? =
memcached 事实上是一个分布式的存储缓存系统,它能够用来存储各种格式的数据,起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓 存系统。但是它本质上仍然只是一个缓存系统。 它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!
= 第二.memcached的安装: =
memcached安装前首先确定你的服务器上面安装了libevent库,下载地址( http://www.monkey.org/~provos/libevent/)。安装完了libevent,就可以直接安装memcached了, 下载它的源码( http://www.danga.com/memcached/download.bml)。
tar -zxvf memcached-1.1.11.tar.gz
cd memcached-1.1.11
./configure //这里必须先要configure, 它会检测你的系统情况,然后生成一个config.h文件和其它的几个文件,另外和其它的configure一样,你可以配置它的安装路径等等!默认应用程序安装在/usr/local/bin目录下!
make //编译
su //切换到root
make install //安装
exit //退出到普通用户!
这样就安装好了memcahced, 我们启动memcached就可使用这块缓存系统了! = 第三.memcached的使用: =
<1>. memcached的启动:
memcached的启动非常简单,它没有配置文件,只要配置好个别参数就可以使用了。下面我的一个实际应用的例子(具体说明一下):
memcached -d -m 64 -l 192.168.241.195 -p 11212
启 动的这个memcached为一个后台守护进程模式(-d), 然后缓存的空间为64M(-m), 监听(-l)服务器192.168.241.195的11212号端口(-p). 其实memcached的参数也非常的有限,我使用了memcached -h命令,它也就下面的几种参数格式:
-p port number to listen on
-l interface to listen on, default is INDRR_ANY
-d run as a daemon
-r maximize core file limit
-u assume identity of (only when run as root)
-m max memory to use for items in megabytes, default is 64 MB
-M return error on memory exhausted (rather than removing items)
-c max simultaneous connections, default is 1024
-k lock down all paged memory
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-h print this help and exit
-i print memcached and libevent license
<2>. memcached的客户应用连接
目 前memcached已经编写好了perl, php, phyton这几种语言的客户端连接类,要应用其他的语言进行连接也可以自己编写(根据它们的协议protocol.txt)。 我个人使用了一下php的客户端的应用, 非常的方便,但是起初我得php没有安装socket支持, 它的客户端连接类里面用到了socket函数,所以重新安装了php, 在configure的时候加入参数--enable-sockets, 就可以了!当然你的其他的需要的php支持一定别忘了同时也要装上哦! 接下来就是使用memcached了。这里是我的一个测试的程序(我在服务器上开了两个memcached应用, 两个端口):
require("MemCachedClient.inc.php"); //加载下载的客户端类函数
$optionsservers = array("192.168.241.195:11211");
$optionsdebug = false;
$memc = new MemCachedClient($options);
$myarr = array("one","two", 3);
$memc->set("key_one", $myarr);
$val = $memc->get("key_one");
echo $val[0]."\n"; // prints 'one'
echo $val[1]."\n"; // prints 'two'
echo $val[2]."\n"; // prints 3
echo "\n";
$optionsservers = array("192.168.241.195:11212");
new MemCachedClient($options);
$myarr = "dongdongdong";
$newmemc->set("key_one", $myarr);
$val = $newmemc->get("key_one");
echo $val."\n"; //prints 'dongdongdong'
?>
这个php的连接类定义了以下的函数:
MemCachedClient::MemCachedClient($options);
MemCachedClient::set_servers($servers);
MemCachedClient::get($key);
MemCachedClient::get_multi($keys);
MemCachedClient::set($key, $value, $exptime);
MemCachedClient::add($key, $value, $exptime);
MemCachedClient::replace($key, $value, $exptime);
MemCachedClient::delete($key, $time = 0);
MemCachedClient::incr($key[, $value]);
MemCachedClient::decr($key[, $value]);
MemCachedClient::disconnect_all();
MemCachedClient::set_debug($do_debug);
MemCachedClient::forget_dead_hosts();
MemCachedClient::error();
MemCachedClient::error_string();
MemCachedClient::error_clear();
也就是说它的缓存可以缓存各种格式的数据,并且保持原来的格式不变,包括文件,图形,以及数据库检索的结果!
其它的perl, python语言的应该和这个类似吧, 我没有试过!
= 第四.memcached的优点: =
就我个人认为, memcached的最大优点就是可以分布式的缓存数据。这也是它所解决的主要问题。
= 第五.memcached的应用展望: =
使 用了memcached以后, 我发现以前做过的很多的项目都可以应用它提高效率,包括最近做的“大单追踪”, “数码搜索”等等。当然既然memcahced是分布式的缓存系统,那么它就是建立了一个分布式的平台, 我们可以用它来进行分布式的记数, 因为对于一个键值key我们可以设置它的数值以及有效期在参数中,另外还可以重新设置这个键值的数值。 所以我总结了一下我们目前可以应用到的地方:
<1>.数据库检索结果的缓存,也就是说可以有机的和数据库结合起来应用,提高效率!我们可以这样来实现:
打开memcached服务器连接
编写sql语句, 同时算出它的一个hash值(也就是key值)
获取这个hash值的memcached保存数据!(get)
如果获取的这个hash值的数据存在。返回!
否则连接数据库查找。
把这个查找结果保存在memcached中(set),可以设置有效期
返回查找结果!
?>
<2>.分布式计数
<3>.分布式共享数据等等。
对memcached的实际使用以及性能分析,可以参考http://www.linuxjournal.com/article.php?sid=7451.html
= 实际使用: =
作 者在内网的192.168.241.195上面开了两个memcahced服务,端口分别为11211, 11212每个都只有64M的缓存区, 如果要测试的话可以直接用客户端程序连接这两个memcached服务,来保存自己的数据。并且根据实际可能要使用的空间,开辟新的缓存区的大小! 另外现在在编写原来的一个大单追踪的程序,现在http://192.168.241.109:5806/bill/memcached/all.php (原来的http://192.168.241.109:5806/bill/all.php ),想要测试它在实际应用的效果,。
= 对memcached的性能分析: =
编 写程序,1个对数据库直接连接访问读取数据n次,一个访问一次以后缓存到memcached中, 以后到memcached中获取数据100次, 统计它们的时间。由于实际环境的限制,现在总共对以下的几种情况进行了分析: 因为在32位架构的服务器上, 最多有4G的地址空间, 所以开辟每个虚拟存储器内存空间不要超过4G, 但是根据需要我们可以同时打开多个memcahced,从而解决的这方面的限制! memcached设置:memcached -d -m 2048 -p 9876
<1>对数据库在本地但是memcached不在本地的情况的时间统计
对数据库直接进行查询:(mysql机在本地)
bash-2.05$ time php notusememche.php 1>not.dong
real 0m14.897s
user 0m8.794s
sys 0m2.242s
使用memcache时候的结果:
bash-2.05$ time php usememche.php 1>usememche.dong
real 1m9.275s
user 0m29.797s
sys 0m2.469s
<2>对于数据库和memcached都在本地的测试!都是本地机(192.168.241.109):
I。onetime 使用memcached的结果:
bash-2.05$ time php usememche.php 1>usememcache.log
real 0m33.463s
user 0m28.900s
sys 0m3.483s
对数据库直接进行查询的结果:
bash-2.05$ time php notusememche.php 1>notusememche.log
real 0m13.812s
user 0m8.796s
sys 0m2.243s
II。secondtime 使用memcached的结果:
bash-2.05$ time php usememche.php 1>usememcache.log
real 0m31.770s
user 0m28.635s
sys 0m2.480s
对数据库直接进行查询的结果:
bash-2.05$ time php notusememche.php 1>notusememche.log
real 0m25.263s
user 0m8.997s
sys 0m2.287s
通过以上的测试,反而看不出来它真正能够提高效率的地方,每次测试它的效率总是比本地取数据库的效率还要低!但是memcached可以同时很方便的打开n多个,这是mysql所不能达到的!
另外,对于memcached, 还测试了当我们要传送的数据要比缓存大的时候的情况: 那么它会自动的把以前保存的数据给删除掉, 从而保存最新的数据!这个有利有弊吧,如果用它来备份数据的话,这样可能会产生数据丢失!
对memcached的实际使用以及性能分析,可以参考http://www.linuxjournal.com/article.php?sid=7451.html2006-06-08
雅虎网站的工作流程
网络产品设计:产品制作人写产品计划书,确定新产品或新功能的市场意义和经济效益,提交部门审批,同意 后,确认需要设计的部分,和用户体验研究员 (user researcher),信息建构师(information architect),视觉设计师(visual designer)、user interface designer,互动设计师(interaction designer),web developer,工程师(engineer)一起讨论需要的支持,然后订出时间计划分工合作。一般是先由用户体验研究员作调查、分析后由信息建构师设 计产品架构,然后由互动设计师作出互动流程,之后交给视觉设计师(visual designer)和user interface designer作出视觉设计。然后web developer把设计通过编写程序(html, dhtml, JavaScript)等等再现出来,最后交给工程师。做完后用户体验研究员需要做用户测试,QA(Quality assurance) 需要测验这一产品的每一步骤,确认产品的使用质量,如果有问题需要让工程师或相关人员解决。
小型项目的工作流程局往往限于有限的人力和时 间,经常是短、平、快:拿到brief,进行设计,综合意见,投放到网站,总结效果。比如广告设计,一般是我组织市场部开会,集体出创意,然后大家达成一 致意见。决定设计主题后发到德国和法国取得相关的翻译。按照雅虎的广告标准,我设计制作出最终的广告,交到广告发行部定期发行。广告运行两周后,拿到数据 信息,根据浏览量(page impressions),点击率(CTR: Click Through Rate),和conversion rate来分析广告效果,总结经验。
总结起来就是:
1. 产品制作人,写产品计划书。 |
谈谈个人感受,国内项目普遍流程就如bluedodo所说:策划+设计+制作+开发,普遍忽略的是第2, 3, 4,或者说是其他某个流程附带完成,第6前台开发也是只存在于大型正规公司,或者说有普遍进一步完善的趋势。
至 于UE, IA, ID 如何进行,我觉得没有绝对固定的模式,根据项目实际情况,关键在于团队的默契。不是说国内从业者不知道如何进行,而是根本没有这个习惯,把项目环节细分一 下,就很清楚各自职能了。这些流程的核心目的就是逐步保证产品质量,减少“前台开发”和“后台开发”的重复劳动。这方面国内人才确实极少,整体水平基本处 于幼稚阶段。
就Yahoo这个流程来看,应该是针对大型的应用型产品项目。看看人家在“确认设计需求”时,就需要几乎所有项目环节参与者进行综合讨论,让人狂汗不已;定开发计划都是大家讨论进行,而不是单方面强制决定,多么人性化啊。
2006-05-31
转:为自己·为老板·为员工
- 给人打工,首先肯定是为自己。养家糊口。
- 为了为自己,首先要为老板。为老板卖力,老板才能给工资、股份和期权。
- 要实现老板目标,必须组织队伍。队伍要有战斗力,小头目处处为自己手下着想。
- 这三者的利益,在企业处在上升期的时候,容易统一。企业发展停滞或者倒退的时候,矛盾就大了。
- 所以,上上策是保持事业蒸蒸日上。
- 正确的方向第一重要。所以,一定要在合适的时候,在合适的地方,干合适的事情。方向问题要一个月讨论一次,随时调整,修正。只要方向对,加以时日,早晚能成。
- 第二重要是要长远干,功败垂成最可惜。一定要等到收获期。怎样才能坚持住?
- 一个团队的价值=所创造的价值-成本。所以,在所创造价值还不确定的情况下,在成本上一定要保守。这样才能干得久,不容易崩盘。
- 第三、责权利明确后,容易做到公平,公平了,内部也就团结了。没有内耗的团结的精干的队伍能以一当十。
- 小团队做出大价值,员工分得自然多。这样作到了为员工。当然已经为了自己。当然也为了老板。
- 我一直不希望自己的队伍人太多。因为我对自己能干多大没把握。我喜欢在自己可控的范围内,按步就班地目标。最后算账大家都换算,就可以了。
2006-05-23
转:[MSN谈话] 关于技术和人生道路的问题
网友 说:
想向你请教下关于技术和人生道路的问题。话入正题吧,现在就是对做技术开发有点茫然。不知道是不是真的有前途或者有自己的奋斗目标。我本身来讲并不是对技术有狂热爱好的人,但是却进入了这个行业。
精于心,简于形 说:
哦,不一定非要爱好什么。我就不爱好软件开发。
网友 说:
恩。目前自己安慰自己就是这样。但是这样干下去也能干。但是消耗的是自己的热情和对生活的求索。人的精力和生命毕竟是有限的。
精于心,简于形 说:
我没觉得“狂热爱好”==“奋斗目标”==“有前途”。这不是一回事。
网友 说:
但是兴趣确实对自己的事业发展很关键啊。
精于心,简于形 说:
不一定。
网友 说:
我一直觉得“奋斗目标”==“有前途”。
精于心,简于形 说:
你不要把对“软件开发的爱好”和“寻找自己事业的兴趣”混淆起来。
精于心,简于形 说:
因为你也许这几年对软件开发有点兴趣。
网友 说:
恩。明白你的意思。爱好不等于塌实耐心的做事情。
精于心,简于形 说:
那么以后呢三年、五年、十年之后呢
精于心,简于形 说:
你能保证吗?如果保证不了的话,那么靠什么驱动你呢?所以,对软件开发的爱好,并不能保证你十年之内不迷茫!
网友 说:
很有道理,我目前给自己定的目标只有5年和一个大的概念
精于心,简于形 说:
所以,唯一能驱动你的,只有一件事情:寻找并发挥你的人生最大价值。除此之外,都是虚假的幻相。爱好能维持几年?面对生存危机,你的爱好实际上非常渺小。找不到自己的人生价值的人,会在三年之后脱离软件行业。
没有人能够提出自己的清晰定位。换句话说,没有人能够充当先知,即使是对自己。
找到你在这个行业、这个公司、这个项目是否能够发挥你的人生价值,是否能够激起你足够的欲望,包括金钱激起的欲望,包括职位激发的欲望等等。
爱好,只是骗骗入门的小孩子的。
你难道真地认为那些各大公司的Top Sales真的对销售感兴趣吗?
你真的认为他们是因为喜欢销售喜欢和客户打交道,而获得巨大成功的吗?
不是的,兄弟!他们不见得喜欢他们的工作性质。
但是他们之所以成功,而且乐此不疲,是因为他们从中发现了自己存在的巨大价值,他们来了,他们开始打仗,他们打胜了,他们得到了尊重,他们得到了回报,他们得到了金钱和职位,他们从中发现了自己的人生价值。
但绝对不是因为销售是他们的兴趣。
你总不会没有成功的喜悦?
总不会没有得道的顿悟?
总不会没有成就感?
如果有,就慢慢去体会这种喜悦。并且积累它。积累到一定程度,你就能够醍醐灌顶。
网友 说:
恩。这个我很赞同你。你和我原来接触的那些所谓的牛人确实不太相同
精于心,简于形 说:
就能领会什么是你的人生价值了。
网友 说:
也许我现在欠缺的就是一个一个的过程
精于心,简于形 说:
所以,先去积累成就感/顿悟/得道/喜悦这些感觉。
慢慢地就会达到TopSales的乐此不疲。
对事物本身的兴趣只是一个非常低级的趣味,每一个生物都有这种功能;但是,对于成就感,对于自身升华带来的乐趣,才是高等生物的功能。
网友 说:
但是这个积累的过程是要自我总结的。
精于心,简于形 说:
各个行业的新入门者都有这个疑问。这个问题普遍存在于各行各业。因为很多人对自己从事的行业并不见得有兴趣,那么就应该去发掘,寻找自己的人生价值。
不是生存压力驱动你的问题。
你恰恰说错了。应该是寻找一种成就感的问题,应该寻找良性刺激。
而不是使自己陷入恶性刺激的境地。
生存压力只是一种恶性刺激。使得你越来越不相信自己的能力.我们要的是良性刺激,是利用一个又一个的成就(大的、小的、微小的)来刺激自己让自己自我感觉良好。从而一再地在同一个源头继续按下电钮,因为你很清楚你会得到轻微的喜悦和刺激。
网友 说:
也许你工作时间长了是这样想,但是目前来讲本来就没有什么进步可言,还奢谈什么自我良好。
网友 说:
我觉得好象是在骗自己一样。
精于心,简于形 说:
于是你应激继续按下电钮,于是快感越来越多。
精于心,简于形 说:
每一件事物,我们都能够从中找到快感
网友 说:
不过有时候我宁可想到阴暗面。
精于心,简于形 说:
一个程序运行了,就有快感;
你比别人先找出问题,就有快感;
你比别人先一步搜索到资源,就有快感;
网友 说:
这个你说的也许是对的,但是自我的感觉确实是会有收获。
网友 说:
没有收获是不可能的。
精于心,简于形 说:
甚至于你比别人讲解程序讲得好,就有快感;
这就是成就感在慢慢积累.成就感是不区分来源的。
网友 说:
那我看不到方向怎么办呢?
精于心,简于形 说:
不用看到方向.我很奇怪,很多新人都想看到方向.但是即使是公司高层,你问他有方向吗?
他也不一定有!没有人是先知!所以不要再告诉我“没有方向”“找不到方向”之类的话。
因为你本来就不需要”方向”这种虚无缥缈又经常变化的东西来辅助你!
不要好高骛远去想一些其实没有人能想通的问题。
职场中,迷茫的高层多的是。所以,迷茫和高层并不冲突。不要把高层假想为睿智的先知。他们也有困惑有迷茫。但是之所以做到那么高,是因为他们每一步都走得很好。
[引申讲解] 关于技术和人生道路的问题
其实和网友的这番讨论所谈及的“抛弃”方向”和”爱好”的虚假幻象”,其思想来源可以追溯到禅宗的“看脚下”。这一点,我在对朋友的blog评论中曾经提及。
原评论如下:“
1: 高中的时候,同桌突然有一天发感慨说他找不到感觉了也不知道能不能考上大学,我当时给他讲了一个禅宗的小故事,黑夜里,老和尚和小和尚走山路,突然灯笼灭了,这时候小和尚问怎么办,老和尚说了一句话。我让同桌猜到底是什么回答。同桌猜了半天都不对。我说,很简单,答案就是:看脚下。
2: 人生有些阶段会企盼在黑暗中有熊熊火柱指引方向,但却不一定有火柱,必须你自己摸索前行。这时候,如何呢?看脚下。“在意我现在的在意”,就是适合的原则。
3: 缠脱只在自心。所以不用在意自己追求什么。孤云出岫,去留一无所系;朗镜悬空,静躁两不相干。“不知道自己应该追求什么, 在意什么”,这个心思本身就是魔障。
”
“看脚下”此典故出自于五祖法演:
一时,五祖法演率众弟子经行,至山亭小憩夜谈,将归时,灯油燃尽,即命就此情境各下一转语。时慧勤禅师曰:“彩凤舞丹霞。”远禅师云:“铁蛇横古路。”克勤禅师说:“看脚下。”法演说:“灭吾宗者,乃克勤尔!”
那么为什么要“灭吾宗”呢?实则是赞许!正因为克勤不作玄妙解会,所以高明一筹。
大家想必都知道“菩提本无树, 明镜亦非台。本来无一物,何处惹尘埃”和“身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。”的高下之分。那么为什么到了自己身上,却看不破呢?
追寻“方向”和“人生道路”,这就是“时时勤拂拭,勿使惹尘埃”,便已经落了下风。
平常心是道,要“平常”到连“平常心”的意识都没有,才是真正的平常心。这份平常心,是灭却浮华的清冷淡泊的悟心。
禅宗教导我们“活在当下”。此语直指人心,要人立地见性。当一切变成黑暗,后面的来路与前面的去路都看不见,如同前世与来生,都摸不着,我们要做的是什么?自然是看脚下,而不是拼命去寻求虚无缥缈的“方向”和“人生道路”。这些在当下,都是伪命题。
最后,我们模仿禅宗的回答方式来一次了结:
----“问:‘如何是玄中玄?’师云:‘玄 杀尔!’”。
---------“问:‘如何找到方向,知道自己追求什么?’吾云:‘方向和追求 杀尔!’”
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=752123
[点击此处收藏本文] 发表于 2006年05月24日 00:08:00
2006-04-29
实战:长期的IT外包合同如何实施与执行
公 司与客户签订的是一个长期的IT外包大合同,包括软件,硬件,服务等等。从另外一个角度来说,包括开发,维护,BI等等。这么大的合同客户与外包商是如何 实施与执行的?如何保证客户的Business一如既往地运行,并且还更好地受益于IT的外包呢?我试着从我的team角度,以及从我所能得到的信息尽量 来理解这个大的合同是如何实施与执行的。尽管这只是对这个IT外包大合同管中窥豹,但我希望我的文字也能让更多的人认识一个外包案例,也希望能和此案例有 兴趣的做IT外包的方方面面的专家和公司探讨。
我的team为客户公司各种信息 系统提供技术支持,是大IT外包合同下的一个维护 项目,负责客户business中的Europe和Asia区。客户的US business不在我team的support scope内,但有时候需要与US的一些team打交道。这里US port就不予仔细考虑。
由 于客户把IT外包给我们,客户方就不用招聘很多的IT人员,大部分的工作依照外 包合同都由外包服务提供者来完成(我们公司并不是客户唯一的外包商,某些方面的服务还外包给了其他专业公司,如HelpDesk的工作和服务器维护就外包 给了HP——HP的HelpDesk非常不错,而且服务器就是HP服务器^_^)。因此,绝大多数客户方的IT人员都是外包合同的执行参与者与项目管理 者。客户对自己的IT部门人员所进行的培训除了必要的business培训,就是leadership的培训。
客 户是一家全球500强企业,Business非常多,客户的IT工作量也非常 大。那么客户如何与外包商合作、沟通、实施这么大的外包合同呢?这就有必要提到外包商的customer relationship management team。 这个team和客户的management team密切合作,交换意见,共同研究合同的实施与改进,并致力于与客户关系的建立。因为合同签订的出发点就是双方都能从合同中受益,双方都有责任和义务 帮助对方提高Business和收益,要不然,这个长期的合同可能没多久就会被Close。
customer relationship management team经常会和客户一起评估当前的business以及IT的服务情况,做一些必要的变化。这不,去年Europe刚被merge into Asia的管理team,才一年的时间,由于这一年客户Business的变化,Europe的Business变的重要起来,今年就又要 seperate出去,成立独立的management team,方便更好地support Business。
客 户和BRM(Business relationship manager)一起评估project的大小,需要多少resource,然后我们(外包商)就开始project team的招兵买马,作为客户的Contract员工组成客户的IT部门。所谓Contract员工就是人是我们招的,和客户签聘用合同,我们为客户工 作,每个resource每小时多少钱客户付给我们公司,我们来进行人员管理,客户只关注项目上的事。(我们有时候叫自己公司为人贩子公司,从另一方面来 公司做的是目前时髦的人力猎头工作,只不过人都先招过来了,推荐合适的供客户挑选。呵呵)
客 户把整个IT部门分成很多team,各team负责不同的工作,彼此间又相互 支持。除了与程序直接打交道的各种Business team外,其中IT部门的HelpDesk team、Database workgroup、CTO team、Common application team和Ops team与我们team联系最密切。前面几个team一看就知道他们做什么的,我稍微解释一下Common application team和Ops team做什么。
Common application team顾名思义就是负责一些Common applications的,比如客户要求所有程序都是SSO(Single Sign On) enable的,这就需要有个系统能实现SSO的需求,保证程序的访问安全,并统一利用公司的员工信息库,保证信息的一致,防止各系统“各自为政”,减少 重复工作。客户是使用的Site Minder作为SSO服务器,那么SSO的配置与维护就是一个Common的工作,这就是Common application team要做的事。当然,还有很多这样的Common application。
Ops team一般负责系统的CCM(Change Control Management)中的deploy。如果系统做了改动,在客户同意执行change后,Ops team就会执行这次change。
除了以上这些team,IT部门还有Data Warehouse team,ERP team等其他team,虽然与他们也打交道,但由于不是经常性的,这里就不专门介绍。
好了,那么我们到底如何来support Business的呢?
所 有的team如何执行自己的职责在project的小合同中都有说明。其中如何处 理客户的issue与需求,哪些事情是哪个team的scope都在 escalation chart中明确定义了的,然后让HelpDesk拿着这些escalation chart来处理。HelpDesk是在做IT系统维护时各个IT support team与Business之间唯一的联系点(SPOC - Single point of Contact)。当然,这是理想状态,也有Business用户直接联系我们的。
HelpDesk 接到用户escalate的issue后,先自己做初步的分 析,如果HelpDesk能自己解决,问题就不会再往下传递了;如果是 Business方面的问题,用户把问题发到用户的队列中,并跟踪问题什么时候关闭;如果是我们系统技术方面的问题或Bug,HelpDesk就按照前面 定义的escalation chart,把问题dispatch到我们team的队列中;如果是其他team的范围也同样的process。因为所有的程序在交给我们team(或其 他team)之前就定义了程序的信息,专门有team来维护所有程序的信息。根据客户对所有Business的评估,把相应的程序分为不同的重要程度,这 样所有的问题也都根据对Business的影响程度定义了几种不同的紧急程度,再定义了每种紧急程度的问题需要在规定的时间内解决。用户定义了一些 metrics用来度量我们服务的质量,并规定了可需要达到的值。这些都在project的合同中定义,双方签字同意。这就是传说中的SLA (Service Level Agreement)^_^。相应地,我们也在我们公司(外包商)的project Plan中阐述客户的metrics,让所有member都知道并执行,保证meet客户的SLA。
当 问题被dispatch到我们的队列中后,我们就需要在SLA规定的时间内解 决问题。每周,专门的Monitor team会从工具中run出各个team这周服务的report,查看是否meet SLA。甚至那些对Business非常重要的系统每天就有report,然后report给management team。这也是客户对我们考核的一个重要指标。
由于我们中国的team要 support客户Europe和Asia的系统,欧 洲客户与中国有6个小时时差,这要求我们的team有灵活的上班安排,来 meet客户的Business时间。我们把team分成2部分,一部分support欧洲程序,一部分support亚洲程序。由于我们公司在中国只是 一个分公司,印度还有team,印度和中国也有2个小时时差,所以我们安排中国team上 下午班,这样下班不用太晚;印度team同样上 下午班,但他们和欧洲只有4个小时时差,这样就可以更好地meet客户的Business时间。
当 然有US的程序,上班时间又有些不同。在其他时间team的member提供 On Call support。所谓On Call Support就是说在这段时间内,如果我们support的系统有问题,用户或HelpDesk可以Call我们的工作Cell Phone,我们就可以马上登陆到内部工作环境,开始移动办公。
2006-04-25
iis 302 错误
今天的发现:
如果转向出现404 错误,那么客户端显示是404 错误,而iis 日志会纪录成 302 错误HTTP/1.1 404 Object Not Found
302 0 02006-03-10
XMLHTTP对象应用开发初体验

| XMLHTTP对象应用开发初体验 |
| MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。 创建XMLHTTP对象的语句如下: Set objXML = CreateObject("Msxml2.XMLHTTP") 或 Set objXML = CreateObject(“Microsoft.XMLHTTP”) ' Or, for version 3.0 of XMLHTTP, use: ' Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP") 对象创建后调用Open方法对Request对象进行初始化,语法格式为: poster.open http-method, url, async, userID, password Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示: http-method: HTTP的通信方式,比如GET或是 POST url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序 async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作 userID 用户ID,用于服务器身份验证 password 用户密码,用于服务器身份验证 XMLHTTP对象的Send方法 用Open方法对Request对象进行初始化后,调用Send方法发送XML数据: poster.send XML-data Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完 毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。 XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示: 值 说明 0 Response对象已经创建,但XML文档上载过程尚未结束 1 XML文档已经装载完毕 2 XML文档已经装载完毕,正在处理中 3 部分XML文档已经解析 4 文档已经解析完毕,客户端可以接受返回消息 客户机处理响应信息 客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的: ● responseTxt:将返回消息作为文本字符串; ● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用; ● responseStream:将返回消息视为Stream对象 ------就是下面这个很简单的JAVASCRIPT函数SEND(STR,URL)--------------- 使用到的是XMLDOM和XMLHTTP对象.用这种技术的好处是:全JS控制,方便/简单,比RDS或者remote好多了.(前提:服务器端和客户端都必须安装IE5或者更高版本),在俺贴的那个无刷新在线信息功能使用的也是这种技术.有兴趣的朋友可以看看.. function Send(Str,URL) //STR参数是传入的XML数据,你也可以传入其他文本数据. //不过这个函数需要服务器端处理之后返回XML数据,你也可以修改一下 //URL参数表示你所要处理数据的ASP文件地址 { var Http = new ActiveXObject("Microsoft.XMLHTTP") //建立XMLHTTP对象 var Dom = new ActiveXObject("Microsoft.XMLDOM") //建立XMLDOM对象 Http.open("POST",URL,false) //第一个参数的意思是,用"POST"方式发送数据.可以大到4MB,也可以换为"GET".只能256KB //第2个参数的意思是数据发送到哪个文件处理 //第3个参数意思是同步或异步方式.TRUE为异步,FALSE为同步 Http.send(Str) //开始发送数据.............嘟嘟.. Dom.async=false //设置为同步方式获取数据 Dom.loadXML(Http.responseText) //开始获取服务器端处理后返回的数据.我在这里设置必须为XML数据,否则出错. //你也可以自己修改.使返回的是2进制或者记录集数据................................. if(Dom.parseError.errorCode != 0) //检查是否发生获取数据时错误 { delete(Http) delete(Dom) return(false) } else { var Back = Dom.documentElement.childNodes.item(0).text //得到返回的XML数据,我这里假设处理程序只返回一行XML数据(一个节点) delete(Http) delete(Dom) return(Back) //函数返回数据.......................结束 } } VAR CAT = Send("<用户资料><姓名>谢柠檬姓名>用户资料>","HTTP://WWW.CHINAASP.COM/VIVA.ASP") //执行函数 IF(CAT == FALSE) { ALERT("对不起.处理程序返回的是FALSE.数据处理已经失败........") } ELSE { IF(EVAL(CAT)) { ALERT("OK.数据已经发送成功.兼以处理完成!!!!!!") } ELSE { ALERT("对不起.处理程序返回的是FALSE.数据处理已经失败........") } } ===============================VIVA.ASP============================ ON ERROR RESUME NEXT DIM BOBO DIM MOMO SET BOBO = SERVER.CREATEOBJECT("MICROSOFT.XMLDOM") BOBO.ASYNC = FALSE BOBO.LOAD REQUEST IF BOBO.PARSEERROR.ERRORCODE <> 0 THEN RESPONSE.WRITE("<程序处理结果><最终结果>FALSE最终结果>程序处理结果>") ELSE SET MOMO = BOBO.DOCUMENTELEMENT IF MOMO.CHILDNODES.ITEM(0).TEXT = "谢柠檬" THEN RESPONSE.WRITE("<程序处理结果><最终结果>TRUE最终结果>程序处理结果>") ELSE RESPONSE.WRITE("<程序处理结果><最终结果>FALSE最终结果>程序处理结果>") END IF END IF SET BOBO = NOTHING |