2008年11月30日星期日

CSS调试工具Multiple IE - IE5 IE6 IE7 多版本共存

Web标准是一个潮流与趋势,现在很多网站已经非常重视网站的构建方式,但我们需要面对兼容各版本浏览器的问题,这是一个非常让我们头疼的问题,微软 IE7的推出,在网页设计时需要同时考虑兼容ie7前面的IE5/IE5.5/IE6各个版本。这给我们的CSS调试测试增加了难度,我们一台PC,如何 才能集成所有的这些浏览器环境呢?最近终于找到IE版本合集软件包Multiple_IE。强烈推荐给大家,大家升级到IE7后也可方便测试网页的兼容 性!



  过多的浏览器给 Web开发造成了困难,颇有抱怨的味道。不过抱怨归抱怨,对于安装有 IE7 的电脑,除非卸载 IE7,否则只能靠虚拟机的方式来运行 IE 的其它版本。有了 Multiple IE就可以在现有的系统上同时运行 IE 3 - IE7。这对网站设计者来说好处是不言而喻的。及大的方便了我们的开发工作,提高工作效率。

  Web标准是一个潮流与趋势,现在很多网 站已经非常重视网站的构建方式,但我们需要面对兼容各版本浏览器的问题,这是一个非常让我们头疼的问题,微软IE7的推出,在网页设计时需要同时考虑兼容 ie7前面的IE5/IE5.5/IE6各个版本。这给我们的CSS调试测试增加了难度,我们一台PC,如何才能集成所有的这些浏览器环境呢?最近终于找 到IE版本合集软件包Multiple_IE。强烈推荐给大家,大家升级到IE7后也可方便测试网页的兼容性!

  过多的浏览器给 Web开发造成了困难,颇有抱怨的味道。不过抱怨归抱怨,对于安装有 IE7 的电脑,除非卸载 IE7,否则只能靠虚拟机的方式来运行 IE 的其它版本。有了 Multiple IE就可以在现有的系统上同时运行 IE 3 - IE7。这对网站设计者来说好处是不言而喻的。及大的方便了我们的开发工作,提高工作效率。



  Mutiple IE确实是一个非常好的测试工具,强烈推荐的同时感谢!Mutiple IE非常好用,体积也不大,才10.3M,里面包括从IE3.0到IE6.0的所有版本,安装时可以根据您的需要自由选择,而且和IE7也没有冲突!对 WEB开发人员来说这个工具是不可或缺的!

  官方网站地址:http://tredosoft.com/Multiple_IE
  下载地址如下:http://tredosoft.com/files/multi-ie/multiple-ie-setup.exe

2008年11月26日星期三

什么是ETL ? [详细解说]

什么是ETL:

ETL即数据抽取(Extract)、转换(Transform)、装载(Load)的过程。它是构建数据仓库的重要环节。数据仓库是面向主题的、集成的、稳定的且随时间不断变化的数据集合,用以支持经营管理中的决策制定过程。数据仓库系统中有可能存在着大量的噪声数据,引起的主要原因有:滥用缩写词、惯用语、数据输入错误、重复记录、丢失值、拼写变化等。即便是一个设计和规划良好的数据库系统,如果其中存在着大量的噪声数据,那么这个系统也是没有任何意义的,因为“垃圾进,垃圾出”(garbage in, garbage out),系统根本就不可能为决策分析系统提供任何支持。为了清除噪声数据,必须在数据库系统中进行数据清洗。目前有不少数据清洗研究和ETL研究,但是如何在ETL过程中进行有效的数据清洗并使这个过程可视化,此方面研究不多。

本文主要从两个方面阐述ETL和数据清洗的实现过程:ETL的处理方式和数据清洗的实现方
法。

(1)ETL的处理方式

本文所采用的ETL方法是数据库段区域中的ETL处理方式,它不使用外部引擎而是使用数据库作为唯一的控制点。由于源系统SQLserver2000是关系数据库,它的段表也是典型的关系型表。成功地将外部未修改数据载入数据库后,再在数据库内部进行转换。数据库段区域中的ETL处理方式执行的步骤是提取、装载、转换,即通常所说的ELT。这种方式的优点是为抽取出的数据首先提供一个缓冲以便于进行复杂的转换,减轻了ETL进程的复杂度。

(2)ETL过程中实现数据清洗的实现方法

首先,在理解源数据的基础上实现数据表属性一致化。为解决源数据的同义异名和同名异义的问题,可通过元数据管理子系统,在理解源数据的同时,对不同表的属性名根据其含义重新定义其在数据挖掘库中的名字,并以转换规则的形式存放在元数据库中,在数据集成的时候,系统自动根据这些转换规则将源数据中的字段名转换成新定义的字段名,从而实现数据挖掘库中的同名同义。

其次,通过数据缩减,大幅度缩小数据量。由于源数据量很大,处理起来非常耗时,所以可以优先进行数据缩减,以提高后续数据处理分析效率。

最后,通过预先设定数据处理的可视化功能节点,达到可视化的进行数据清洗和数据转换的目的。针对缩减并集成后的数据,通过组合预处理子系统提供各种数据处理功能节点,能够以可视化的方式快速有效完成数据清洗和数据转换过程。

2008年11月19日星期三

测试 空间是否 支持 .htaccess

如何知道 一个空间是否支持 .htaccess 呢?

使用下面简单的方法就可以测试出结果:

首先在你的WEB根目录建一个 notfound.html , 内容如下:

404 Error , Test .htaccess


其次在你的WEB根目录建一个 .htaccess (# touch .htaccess)文件,然后把下面的内容放进去:

RewriteEngine on
RewriteBase /
ErrorDocument 404 /notfound.html


保存完成之后,你访问一个不存在的页面或是路径,如果提示

404 Error , Test .htaccess


OK, 说明你的空间是支持.htaccess的。

如果没有反应你试一下设置文件的权限:
#chmod +r .htaccess


如果还不行,有可能你的空间就不支持.htaccess了。

说明一下:
.htaccess第一个应用是自定义错误页面,这使得你可以拥有自己的、个性化的错误页面(例如找不到文件时),而不是你的服务商提供的错误页或没有任何页面。这会让你的网站在出错的时候看上去更加专业。

任何你知道代码的错误(像404找不到页面),你都可以将其变成自定义页面,要做的只是在.htaccess文件里加入以下一段:

ErrorDocument errornumber /file.html

2008年11月18日星期二

视频: 少林寺插曲 牧羊曲

视频: 少林寺插曲 牧羊曲

王码五笔字根表(98&86)有图例

一款网友做的王码五笔字根表图片,收集一下 希望打/练五笔字根的朋友能够喜欢:













五笔字根助记词
WB-86版五笔字根助记词
11G 王旁青头戋五一
21H 目具上止卜虎皮
31T 禾竹一撇双人立,反文条头共三一
12F 土士二干十寸雨
22J 日早两竖与虫依
32R 白手看头三二斤
13D 大犬三(羊)古石厂
23K 口与川,字根稀
 
33E 月彡(衫)乃用家衣底
 
14S 木丁西
24L 田甲方框四车力
34W 人和八,三四里,
15A 工戈草头右框七
 
25M 山由贝,下框几
 
35Q 金勺缺点无尾鱼, 犬旁留儿一点夕,氏无七(妻)。

41Y 言文方广在四一
 
51N 已半巳满不出己,
  左框折尸心和羽。

42U 立辛两点六门疒
52B 子耳了也框向上

43I 水旁兴头小倒立
53V 女刀九臼山朝西
  
44O 火业头,四点米 54C 又巴马,丢矢矣,
45P 之宝盖,摘礻(示)衤(衣) 55X 慈母无心弓和匕,幼无力。

WB-98版五笔字根助记词

11G 王旁青头五夫一,
21H 目上卜止虎头具,
31T 禾竹反文双人立,
12F 土干十寸未甘雨,
22J 日早两竖与虫依,
32R 白斤气丘叉手提,
13D 大犬戊其古石厂,
23K 口中两川三个竖,
33E 月用力豸毛衣臼,
14S 木丁西甫一四里,
24L 田甲方框四车里,
34W 人八登头单人几,
15A 工戈草头右框七。
25M 山由贝骨下框集。
35Q 金夕鸟儿犭边鱼。

41Y 言文方点谁人去,
51N 已类左框心尸羽,

42U 立辛六羊病门里,
52B 子耳了也乃框皮,

43I 水族三点鳖头小,
53V 女刀九艮山西倒,
  
44O 火业广鹿四点米, 54C 又巴牛厶马失蹄,
45P 之字宝盖补礻衤。 55X 幺母贯头弓和匕。
WB-18030五笔字根助记词
11G 王旁青头戋五一,
21H 目止具头卜虎皮,
31T 禾竹反文双人立,
12F 土士二干十寸雨,
22J 日早两竖与虫依,
32R 白斤气头手边提,
13D 大犬三羊古石厂,
23K 口中一川三个竖,
33E 月乃用舟家衣下,
14S 木丁西在一四里,
24L 田甲方框四车力,
34W 人八登祭把头取,
15A 工戈草头右框七。
25M 山由骨头贝框几。
35Q 金夕犭儿包头鱼。

41Y 言文方广在四一,
51N 已类左框心尸羽,

42U 立辛两点病门里,
52B 子耳了也框上举,

43I 水族三点兴类小,
53V 女刀九巛臼山倒,
  
44O 火里业头四点米, 54C 又巴劲头私马依,
45P 之字宝盖补礻衤。 55X 绞丝互幺弓和匕。

注:11 戋读兼 13 羊指 35 犭读犬 45 衤读衣 53 巛读川 53 臼读旧 54 厶读私 55 幺读腰
高手点题秘诀:学五笔背字根就像张无忌学太极拳——记得越多,越是生疏。当然,必须是先记得滚瓜烂熟,然后再遗忘得一干二净,那才是高! 这道理就像一个经过打拼成功后的男人在树荫下乘凉,与另一穷汉在树荫下乘凉,完全两码事。

86 98 五笔字型表

五笔(86)部分难拆字表

王码五笔字型助记词助你快速记忆字根



五笔(98)部分难拆字表

王码五笔字型助记词助你快速记忆字根


86 五笔一级简码

王码五笔字型助记词助你快速记忆字根


五笔86二级简码

王码五笔字型助记词助你快速记忆字根


五笔98二级简码


王码五笔字型助记词助你快速记忆字根

星际争霸虫族任务第二关怎样将蛹送到传送点?

我用飞龙和口水把神打光了,还不行,
然后就想是不是用一只虫引一下路呢?
结果还不行,
最后想到用农民试一下,结果成功了。


---------- 试验结果 -------------
必须用一个农民去拿蛹(选中一个农民,右键点蛹),从你上面那个发光门拿到蛹,然后把农民点到发光门中间,只要保护好可以送到就可以了,任务就算完成了(过关)。

其实这一关没必要把所有神族部队都消灭,只要用一些人保护运送蛹的农民顺利到达目的地就过关了。

2008年11月17日星期一

You cannot prevent Internet Explorer 6 from caching HTTP pages by using META tags

SYMPTOMS


loadTOCNode(1, 'symptoms'); You create an HTML page that prevents page caching by using the following META tags.
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="Expires" content="-1"/>

However, when you use Microsoft Internet Explorer 6 to browse the page from a Web server in HTTP, the page is still available in the cache.

CAUSE


loadTOCNode(1, 'cause'); This issue occurs when the connection to the Web server is not a Secure Sockets Layer (SSL) connection. Over ordinary connections, MSHTML will only read the Expires tag, and Internet Explorer will set the Expiration header based on the Expires tag content value.

RESOLUTION



loadTOCNode(1, 'resolution'); To resolve this issue, set the Expires header and the No-cache header on the Web server that is hosting the HTML files that you do not want to be cached. On the Web server, you can set the Expires header and the No-cache header on the following items:

Web site
Directory
File

Therefore, you can control how files are cached on the client computer for these items.

For more information about content expiration in Internet Information Services (IIS), see the "Enabling Content Expiration" topic in the "Web Site Management" section of the IIS online documentation. The following is a link to IIS Help if you have IIS installed on the computer: http://localhost/iishelp (http://localhost/iishelp) For more information about how to configure IIS 5.0 for content expiration, click the following article number to view the article in the Microsoft Knowledge Base: 313561 (http://support.microsoft.com/kb/313561/) How to set HTTP headers for content expiration in Internet Information Services (IIS) 5.0 For more information about how to set the Expires header and the No-cache header for other Web server software, see the Web server's documentation.

WORKAROUND



loadTOCNode(1, 'workaround'); To work around this issue, use one of the following methods.

Method 1: Use SSL



loadTOCNode(3, 'workaround'); Serve the pages through an SSL connection. For more information about how to use SSL in IIS, click the following article number to view the article in the Microsoft Knowledge Base: 299875 (http://support.microsoft.com/kb/299875/) How to implement SSL in IIS

Method 2: Use an ASP file



loadTOCNode(3, 'workaround'); Use an ASP file to set the headers in the response from the Web server. The following is an example of a response.
<%Response.CacheControl = "no-cache" %>
<% Response.AddHeader"Pragma", "no-cache" %>
<% Response.Expires = -1 %>

For more information about how to configure ASP pages, click the following article numbers to view the articles in the Microsoft Knowledge Base:

2008年11月16日星期日

301重定向和302跳转的区别

301和302 Http状态有啥区别?

301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:
301 redirect: 301 代表永久性重定向(Permanently Moved),
302 redirect: 302 代表临时性重定向(Temporarily Moved ),
当然 Http 状态 200 标示没有任何问题发生。

301 重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。

301重定向是目前Chris.DL在对每个客户提供SEO服务时,必定会讲到的东西,过程中,往往会发现大家使用的都是302跳转,虽然最终看到的效果是一样的,但对搜索引擎来讲,301和302还是有区别的。

那么为什么不能用302呢?下面摘自Zac的一段文章内容


302重定向和网址劫持(URL hijacking)有什么关系呢?这要从搜索引擎如何处理302转向说起。从定义来说,从网址A做一个302重定向到网址B时,主机服务器的隐含意思是网址A随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。

实际上如果搜索引擎在遇到302转向时,百分之百的都抓取目标网址B的话,就不用担心网址URL劫持了。

问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。为什么呢?比如说,有的时候A网址很短,但是它做了一个302重定向到B网址,而B网址是一个很长的乱七八糟的URL网址,甚至还有可能包含一些问号之类的参数。很自然的,A网址更加用户友好,而B网址既难看,又不用户友好。这时Google很有可能会仍然显示网址A。

由于搜索引擎排名算法只是程序而不是人,在遇到302重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL劫持的可能性。也就是说,一个不道德的人在他自己的网址A做一个302重定向到你的网址B,出于某种原因, Google搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B上的内容,这种情况就叫做网址URL劫持。你辛辛苦苦所写的内容就这样被别人偷走了。



其实302的跳转本身是没有错的,但因为被一些作弊者用多了,Google当然对这个就比较敏感了,毕竟Google面对的是如此海量的数据,你难道不怕被误杀吗?

Google的官方内容一再强调用301来转移内容,况且,301和302在程序上的设置相差很小,既然如此,何必要冒险用302呢?

2008年11月15日星期六

解决 firefox 中不支持 cursor:hand (超连接小手)

firefox 中不支持 cursor:hand

style="cursor:hand;"

在IE中支持能正常显示成手;在firefox中却不能正常显示

使用下面方法可以支持 IE & Firefox两种浏览器:
style="cursor:pointer;"

用CSS 实现 image按钮 详解 带实例

今天遇到一个问题,写下来方便大家以后遇到同样的总是,不用再浪费时间去研究.
image button可以<input type="image" src="some.jpg" />来简单地实现。
但由于某些原因(比如下面的原因),我们可能希望使用CSS来实现image按钮。
原由:
<input type="image" ... 提交时会发现URL后面跟着x,y这样参数,看上去很不爽,对SEO来说更不爽,于是改成用 <input id="submit"....
下面就用了CSS实现 image 按扭:

////////////css //////////////////
.submitGo{
background-color: transparent;
border: 0px;
padding: 0px;
overflow: hidden;
font-size:0px; /* 把文字的大小设置为0,不显示文字 */
width: 82px; /* backgroud-image width */
height: 40px; /* backgroud-image height */
margin-left: 10px; /* 可以不用,我用来表示与前面输入框的距离的 */
cursor:pointer; /* 兼容IE,FF 放上去出现小手 */
background-image: url(../img/go.gif);
}
//////////// End css //////////////////
<input id="submit" value="Go" type="submit" class="submitGo">

以上代码,CSS图像按钮就完成了。提交时不会出现不想要的参数了.
如果不希望显示图片时,只需注释CSS定义或是把class去掉就可以了

Windows Internet Explorer 7 for Windows XP download 下载

IE7 for SP3版5月6日终于在官方下载中心提供下载了
文件名: IE7-WindowsXP-x86-chs.exe
版本: 7.0
发布日期: 2008/5/6
语言: 简体中文
下载大小:14.0 MB

系统要求
支持的操作系统: Windows XP Service Pack 2; Windows XP Service Pack 3


地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=9ae91ebe-3385-447c-8a30-081805b2f90b&DisplayLang=zh-cn

注意:
检查MD5,和以前的Internet Explorer 7.0.5730.13 简体版是一摸一样的,数字签名也是07年9月26号。可是不知道为什么写着更新日期是08年5月6日!!!

说明
在“文件下载”对话框中,执行以下操作之一:
要立即开始安装,请单击“打开”或“在当前位置运行该程序”。
要将下载项复制到计算机供以后安装,请单击“保存”或“将该程序保存到磁盘”。
有关已选定的下载项的详细信息(包括所有详细的安装说明),请返回 下载信息页.
如果 30 秒之后下载仍未开始,请单击此链接: 开始下载.
相关资源
Internet Explorer 团队博客
Internet Explorer 7 发行说明
Internet Explorer 网站
其他用户正在下载的内容
其他曾下载了 Windows Internet Explorer 7 for Windows XP 的用户还同时下载了:
Internet Explorer 7 for Windows XP 安全更新程序 (KB947864)
Internet Explorer 6 Service Pack 1
Internet Explorer 7 for Windows XP 安全更新程序 (KB950759)
Internet Explorer 7 for Windows XP Service Pack 2 安全更新程序 (KB931768)
Windows Live Messenger (2008 版)
相关下载
Windows Internet Explorer 7 for Windows Server 2003 SP1 or Windows Server 2003 SP2
用于 Windows Server 2003 x64 Edition 和 Windows XP x64 Edition 的 Windows Internet Explorer 7

2008年11月13日星期四

消重 Mysql row data 记录

今天处理数据时由于 loading data 重复导致数据内容重复,不得已要进行消重.
方法如下:

1.先找出重复数据内容的ID,把ID存文件或是临时数据表
装数据内容存在test DB 中,为了删除方便存两列数据内容:SQL, ID
下面例子,从Redirect_Log表中找出重复的ID,存在test.tmp_delete_repeat_data_081112表中.


create table test.tmp_delete_repeat_data_081112
select concat("delete from `Redirect_Log` where id=",id,";") sqls, id
from
`tracking_smarter`.Redirect_Log
group by SessionID,VisitTime,Status,SourceSite,CurRandStr
having count(*)>1


说明:group by SessionID,VisitTime,Status,SourceSite,CurRandStr 是因为我的这个数据表必须这些字段一起 distinct 才可能标示唯一性.

2.执行SQL语句进行删除这些重复的ID
首先把test.tmp_delete_repeat_data_081112 表的数据内容倒出到文件

select sqls into outfile '/tmp/w.sql' from tabl1;

然后把文件内容load进mysql就可以了

mysql -uroot -p tracking < /tmp/w.sql

上载文件表单的实现 -- 实例


<html><head>
<title>上载文件表单</title></head>
<body>
<form enctype="multipart/form-data" action="" method="post">
请选择文件: <br>
<input name="upload_file" type="file"><br>
<input type="submit" value="上传文件">
</form>
</body>
</html>
<?
$upload_file=$_FILES['upload_file']['tmp_name'];
$upload_file_name=$_FILES['upload_file']['name'];
if($upload_file){
$file_size_max = 1000*1000; // 1M限制文件上传最大容量(bytes)
$store_dir = "d:/"; // 上传文件的储存位置
$accept_overwrite = 1; //是否允许覆盖相同文件
// 检查文件大小
if ($upload_file_size > $file_size_max) {
echo "对不起,你的文件容量大于规定";
exit;
}
// 检查读写文件
if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {
echo "存在相同文件名的文件";
exit;
}
//复制文件到指定目录
if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {
echo "复制文件失败";
exit;
}
}
//客户端机器文件的原名称。
echo "<p>你上传了文件:" . $_FILES['upload_file']['name'] .'<br>';
//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
echo "文件的 MIME 类型为:" . $_FILES['upload_file']['type'] . '<br>';
//已上传文件的大小,单位为字节。
echo "上传文件大小:" . $_FILES['upload_file']['size'] . '<br>';
//文件被上传后在服务端储存的临时文件名。
echo "文件上传后被临时储存为:" . $_FILES['upload_file']['tmp_name'] . '<br>';

print_r($_FILES['upload_file']);
$Erroe=$_FILES['upload_file']['error'];
switch($Erroe){
case 0:
echo "上传成功"; break;
case 1:
echo "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break;
case 2:
echo "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"; break;
case 3:
echo "文件只有部分被上传";break;
case 4:
echo "没有文件被上传";break;
}
?>


如果使用 Curl 实现远程请求 实例

下面一个实例子,希望对大家有所帮助:


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL , 'ghxter.blogbot.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
curl_setopt($ch, CURLOPT_TIMEOUT , 5);
curl_setopt($ch, CURLOPT_USERAGENT , $_SERVER['HTTP_USER_AGENT']);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

var_dump($info);
var_dump($response)
?>

也可参考另一文章:curl_setopt($ch, CURLOPT_RETURNTRANSFER,1) 使用

Javascript 控制按扭只能点击一次

Javascript 控制按扭只能点击一次
<input type='submit' value='submit' onClick='this.disabled=true'>

<form action='nextpage.php' method='post' id='thisform'>
<input type='submit' value='submit' onclick='getElementById("thisform").submit();this.disabled=true'>
</form>

JavaScript : charAt , jtrim 几种去掉字串左右空格的方法


//-------------
function jtrim(sstr)
{
var astr="";
var dstr="";
var flag=0;
for (i=0;i{if ((sstr.charAt(i)!=' ')||(flag!=0))
{dstr+=sstr.charAt(i);
flag=1;
}
}
flag=0;
for (i=dstr.length-1;i>=0;i--)
{if ((dstr.charAt(i)!=' ')||(flag!=0))
{astr+=dstr.charAt(i);
flag=1;
}
}
dstr="";
for (i=astr.length-1;i>=0;i--) dstr+=astr.charAt(i);
return dstr;
}

javascript : getAttribute , RegExp 验证代码


<title>表单验证类 Validator v1.05</title>
<style>
body,td{font:normal 12px Verdana;color:#333333}
input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
table{border-collapse:collapse;}
td{padding:3px}
input{height:20;}
textarea{width:80%;height:50px;overflow:auto;}
form{display:inline}
</style>
<table align="center">
<form name="theForm" id="demo" method="get" onSubmit="return Validator.Validate(this,2)">
<tr>
<td>身份证号:</td><td><input name="Card" dataType="IdCard" msg="身份证号错误"></td>
</tr>
<tr>
<td>真实姓名:</td><td><input name="Name" dataType="Chinese" msg="真实姓名只允许中文"></td>
</tr>
<tr>
<td>ID:</td><td><input name="username" dataType="Username" msg="ID名不符合规定"></td>
</tr>
<tr>
<td>英文名:</td><td><input name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"></td>
</tr>
<tr>
<td>主页:</td><td><input name="Homepage" require="false" dataType="Url" msg="非法的Url"></td>
</tr>
<tr>
<td>密码:</td><td><input name="Password" dataType="SafeString" msg="密码不符合安全规则" type="password"></td>
</tr>
<tr>
<td>重复:</td><td><input name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"></td>
</tr>
<tr>
<td>信箱:</td><td><input name="Email" dataType="Email" msg="信箱格式不正确"></td>
</tr>
<tr>
<td>信箱:</td><td><input name="Email" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"></td>
</tr>
<tr>
<td>QQ:</td><td><input name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"></td>
</tr>
<tr>
<td>身份证:</td><td><input name="Card" dataType="IdCard" msg="身份证号码不正确"></td>
</tr>
<tr>
<td>年龄:</td><td><input name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"></td>
</tr>
<tr>
<td>年龄1:</td><td><input name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"></td>
</tr>
<tr>
<td>电话:</td><td><input name="Phone" require="false" dataType="Phone" msg="电话号码不正确"></td>
</tr>
<tr>
<td>手机:</td><td><input name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"></td>
</tr>
<tr>
<td>生日:</td><td><input name="Birthday" dataType="Date" format="ymd" msg="生日日期不存在"></td>
</tr>
<tr>
<td>邮政编码:</td><td><input name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"></td>
</tr>
<tr>
<td>邮政编码:</td><td><input name="Zip1" dataType="Zip" msg="邮政编码不存在"></td>
</tr>
<tr>
<td>操作系统:</td><td><select name="Operation" dataType="Require" msg="未选择所用操作系统" ><option value="">选择您所用的操作系统</option><option value="Win98">Win98</option><option value="Win2k">Win2k</option><option value="WinXP">WinXP</option></select></td>
</tr>
<tr>
<td>所在省份:</td><td>广东<input name="Province" value="1" type="radio">陕西<input name="Province" value="2" type="radio">浙江<input name="Province" value="3" type="radio">江西<input name="Province" value="4" type="radio" dataType="Group" msg="必须选定一个省份" ></td>
</tr>
<tr>
<td>爱好:</td><td>运动<input name="Favorite" value="1" type="checkbox">上网<input name="Favorite" value="2" type="checkbox">听音乐<input name="Favorite" value="3" type="checkbox">看书<input name="Favorite" value="4" type="checkbox"" dataType="Group" min="2" max="3" msg="必须选择2~3种爱好"></td>
</tr>
<td>自我介绍:</td><td><textarea name="Description" dataType="Limit" max="10" msg="自我介绍内容必须在10个字之内">中文是一个字</textarea></td>
</tr>
<td>自传:</td><td><textarea name="History" dataType="LimitB" min="3" max="10" msg="自传内容必须在[3,10]个字节之内">中文是两个字节t</textarea></td>
</tr>
<tr>
<td>相片上传:</td><td><input name="up" dataType="Filter" msg="非法的文件格式" type="file" accept="jpg, gif, png"></td>
</tr>
<tr>
<td colspan="2"><input name="Submit" type="submit" value="确定提交"><input onClick="Validator.Validate(document.getElementById('demo'))" value="检验模式1" type="button"><input onClick="Validator.Validate(document.getElementById('demo'),2)" value="检验模式2" type="button"><input onClick="Validator.Validate(document.getElementById('demo'),3)" value="检验模式3" type="button"></td>
</tr>
</form>
</table>
<script>
/*************************************************
Validator v1.05
code by 我佛山人
wfsr@msn.com
*************************************************/
Validator = {
Require : /.+/,
Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
IdCard : "this.IsIdCard(value)",
Currency : /^\d+(\.\d+)?$/,
Number : /^\d+$/,
Zip : /^[1-9]\d{5}$/,
QQ : /^[1-9]\d{4,8}$/,
Integer : /^[-\+]?\d+$/,
Double : /^[-\+]?\d+(\.\d+)?$/,
English : /^[A-Za-z]+$/,
Chinese : /^[\u0391-\uFFE5]+$/,
Username : /^[a-z]\w{3,}$/i,
UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
IsSafe : function(str){return !this.UnSafe.test(str);},
SafeString : "this.IsSafe(value)",
Filter : "this.DoFilter(value, getAttribute('accept'))",
Limit : "this.limit(value.length,getAttribute('min'), getAttribute('max'))",
LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
Range : "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
Custom : "this.Exec(value, getAttribute('regexp'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
Validate : function(theForm, mode){
var obj = theForm || event.srcElement;
var count = obj.elements.length;
this.ErrorMessage.length = 1;
this.ErrorItem.length = 1;
this.ErrorItem[0] = obj;
for(var i=0;i<count;i++){
with(obj.elements[i]){
var _dataType = getAttribute("dataType");
if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined") continue;
this.ClearState(obj.elements[i]);
if(getAttribute("require") == "false" && value == "") continue;
switch(_dataType){
case "IdCard" :
case "Date" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "Group" :
case "Limit" :
case "LimitB" :
case "SafeString" :
case "Filter" :
if(!eval(this[_dataType])) {
this.AddError(i, getAttribute("msg"));
}
break;
default :
if(!this[_dataType].test(value)){
this.AddError(i, getAttribute("msg"));
}
break;
}
}
}
if(this.ErrorMessage.length > 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
switch(mode){
case 2 :
for(var i=1;i<errCount;i++)
this.ErrorItem[i].style.color = "red";
case 1 :
alert(this.ErrorMessage.join("\n"));
this.ErrorItem[1].focus();
break;
case 3 :
for(var i=1;i<errCount;i++){
try{
var span = document.createElement("SPAN");
span.id = "__ErrorMessagePanel";
span.style.color = "red";
this.ErrorItem[i].parentNode.appendChild(span);
span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
}
catch(e){alert(e.description);}
}
this.ErrorItem[1].focus();
break;
default :
alert(this.ErrorMessage.join("\n"));
break;
}
return false;
}
return true;
},
limit : function(len,min, max){
min = min || 0;
max = max || Number.MAX_VALUE;
return min <= len && len <= max;
},
LenB : function(str){
return str.replace(/[^\x00-\xff]/g,"**").length;
},
ClearState : function(elem){
with(elem){
if(style.color == "red")
style.color = "";
var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
if(lastNode.id == "__ErrorMessagePanel")
parentNode.removeChild(lastNode);
}
},
AddError : function(index, str){
this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
Exec : function(op, reg){
return new RegExp(reg,"g").test(op);
},
compare : function(op1,operator,op2){
switch (operator) {
case "NotEqual":
return (op1 != op2);
case "GreaterThan":
return (op1 > op2);
case "GreaterThanEqual":
return (op1 >= op2);
case "LessThan":
return (op1 < op2);
case "LessThanEqual":
return (op1 <= op2);
default:
return (op1 == op2);
}
},
MustChecked : function(name, min, max){
var groups = document.getElementsByName(name);
var hasChecked = 0;
min = min || 1;
max = max || groups.length;
for(var i=groups.length-1;i>=0;i--)
if(groups[i].checked) hasChecked++;
return min <= hasChecked && hasChecked <= max;
},
DoFilter : function(input, filter){
return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
},
IsIdCard : function(number){
var date, Ai;
var verify = "10x98765432";
var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外'];
var re = number.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i);
if(re == null) return false;
if(re[1] >= area.length || area[re[1]] == "") return false;
if(re[2].length == 12){
Ai = number.substr(0, 17);
date = [re[9], re[10], re[11]].join("-");
}
else{
Ai = number.substr(0, 6) + "19" + number.substr(6);
date = ["19" + re[4], re[5], re[6]].join("-");
}
if(!this.IsDate(date, "ymd")) return false;
var sum = 0;
for(var i = 0;i<=16;i++){
sum += Ai.charAt(i) * Wi[i];
}
Ai += verify.charAt(sum%11);
return (number.length ==15 || number.length == 18 && number == Ai);
},
IsDate : function(op, formatString){
formatString = formatString || "ymd";
var m, year, month, day;
switch(formatString){
case "ymd" :
m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
if(m == null ) return false;
day = m[6];
month = m[5]*1;
year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
break;
case "dmy" :
m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
if(m == null ) return false;
day = m[1];
month = m[3]*1;
year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
break;
default :
break;
}
if(!parseInt(month)) return false;
month = month==0 ?12:month;
var date = new Date(year, month-1, day);
return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
}
}
</script>

linux scp 命令详解 使用示例

ssh(Secure Shell)是用来登录远程计算机和在远程计算机上执行命令的程序。它是用来替代rlogin和rsh,以及在不安全的网络环境下在两台计算机之间提供安全和加密的信息交流。X11连接和TCP/IP端口可以被转发到一个安全的通道里。

用下面的命令,登录远程计算机:

[test@demo]# ssh username@hostname

例如:

[test@demo]# ssh username@www.test.com
The authenticity of host 'www.test.com (*****)' can't be established.
RSA key fingerprint is 0e:c2:f6:f4:d9:86:9d:4b:c4:3d:77:e7:a4:bb:59:14.
Are you sure you want to continue connecting (yes/no)? yes
username@www.test.com's password:
Last login: Tue Oct 19 1999 18:13:00 -0400 from www.test.com
Welcome to www.test.com on Deepforest.


username是用来登录ssh服务器的用户名,是ssh服务器主机的地址或是IP。

scp
可以用这个命令把文件从本地计算机拷贝到远程计算机,或者反之,甚至可以在两台远程计算机之间用“scp”命令拷贝文件。把远程主机上的文件拷贝到当前目录的一个简单的方法如下。

用下面的命令把文件从远程主机拷贝到本地主机上:

[test@demo /]$ scp -pr username@hostname:/tmp ./ (把远程目录tmp和下面所有文件,文件来一起COPY到当前目录下面 -r 表拷贝目录

例如:

[username@demo]$ scp -p username@dev.test2.com:/tmp ./
Enter passphrase for RSA key 'username@dev.test2.com':

用下面的命令把文件从本地主机拷贝到远程主机上:

[username@demo /]$ scp -p /usr/bin/test username@hostname:/tmp/ (把目录/usr/bin/test文件夹和文件来所有内容SCP到目标服务器/tmp目录下面)

例如:

[username@demo]$ scp -p /usr/bin/test2 username@test:/var/tmp
username@test's password:

注意:“-p”选项表示文件的改变和访问时间属性以及权限,在拷贝过程中被保留。通常是需要这样的。

总之两个功能:
从当前服务器 SCP 到其它服务器 [current@server] scp ./file other@server:/home/tmp/
从其它服务器 SCP 到当前服务器 [current@server] scp other@server:/home/tmp/ ./

linux ls -- 列文件和文件夹 详解

ls

  ls 命令可以说是linux下最常用的命令之一。它有众多的选项,其中有很多是很有用的,你是否熟悉呢?下面列出了 ls 命令的绝大多数选项。

  -a 列出目录下的所有文件,包括以 . 开头的隐含文件。
  -b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
  -c 输出文件的 i 节点的修改时间,并以此排序。
  -d 将目录象文件一样显示,而不是显示其下的文件。
  -e 输出时间的全部信息,而不是输出简略信息。
  -f -U 对输出的文件不排序。
  -g 无用。
  -i 输出文件的 i 节点的索引信息。
  -k 以 k 字节的形式表示文件的大小。
  -l 列出文件的详细信息。
  -m 横向输出文件名,并以“,”作分格符。
  -n 用数字的 UID,GID 代替名称。
  -o 显示文件的除组信息外的详细信息。
  -p -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通
  文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。

  -q 用?代替不可输出的字符。
  -r 对目录反向排序。
  -s 在每个文件名后输出该文件的大小。
  -t 以时间排序。
  -u 以文件上次被访问的时间排序。
  -x 按列输出,横向排序。
  -A 显示除 “.”和“..”外的所有文件。
  -B 不输出以 “~”结尾的备份文件。
  -C 按列输出,纵向排序。
  -G 输出文件的组的信息。
  -L 列出链接文件名而不是链接到的文件。
  -N 不限制文件长度。
  -Q 把输出的文件名用双引号括起来。
  -R 列出所有子目录下的文件。
  -S 以文件大小排序。
  -X 以文件的扩展名(最后一个 . 后的字符)排序。

  -1 一行只输出一个文件。
  --color=no 不显示彩色文件名
  --help 在标准输出上显示帮助信息。
  --version 在标准输出上输出版本信息并退出。
  只列出子目录

  1. ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
  2. ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)


  计算当前目录下的文件数和目录数,下面命令可以分别计算当前目录下的文件和目录个数:

  # ls -l * |grep "^-"|wc -l ---- to count files
  # ls -l * |grep "^d"|wc -l ----- to count dir

  显示彩色目录列表,打开/etc/bashrc, 加入如下一行:

  alias ls="ls --color"

  下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:

  1. 蓝色-->目录
  2. 绿色-->可执行文件
  3. 红色-->压缩文件
  4. 浅蓝色-->链接文件
  5. 灰色-->其他文件
  ls -tl --time-style=full-iso sshd
  ls -ctl --time-style=long-iso

linux alias -- 别名 详细 讲解

 Linux用户经常会使用到Shell,也经常会和控制台打交道。但是这种CLI界面很难被已经习惯使用MS Windows的用户所接受,尤其是命令。Linux常用的Bash命令有一百多个,虽然一般情况下命令都非常简短,不过也有很多时候需要大量的是用参 数,这样,对很多初学者来说,背命令变成为最头疼的事情,这也是很多Linux初学者望而生畏。在这里,给大家说一个小技巧,一个可以使大家对控制台的操 作更得心应手的技巧——alias(别名)。

  在说这些之前,首先现说一下什么是Shell。我们通常所说的Linux,其实真正含义 是特指 Linux的Kernel(内核),内核就相当于Linux的核心、大脑,用户的所有操作,都是有Kernel来完成的,但是用户却又不是直接对 Kernel作所有的操作,为什么呢?因为用户与Kernel之间,并不能直接的沟通,用户不可以直接的发送指令给Kernel(不要问我为什么,因为就 是这个设计的,呵呵),那用户怎么与Kernel之间联系呢?很简单,这需要一个命令解释器,也就是Shell。Shell在Unix和Linux等众多 的类似操作中,但扮演这个一个非常重要的角色。他起到了连接用户与内核的功能,所有的用户指令,当输入之后,首先,是有Shell读取,然后解释给内核, 由内核来执行。这一点,不同于大家都非常熟悉的MS Windows和DOS。Shell可以完成对Linux的所有操作,其实大家最长接触的GUI界面,也就是X Window,也是通过图形的方式,完成Shell命令而已。常见的Shell有很多种,在这里举几个例子Bash,Csh,Ksh等等……我就不一一列 举了。我们这里只以Bash为例。

  通过前面的叙述,相信大家已经对Shell有了初步的认识,我们现在具体来说Bash的一个非常好 的功能 alias(别名)。顾名思义,别名,就是给一个命令取另外一个名字,他有什么用呢?用处很简单,举一个非常简单的例子:假设说现在有一个命令是 “abcdefgh”,这个命令有点长,如果频繁是用这个命令的话,不免会降低效率。那怎么办呢?我们就给他起个别名,就叫做“123”好了,简短又好 记。我们只需要一条命令就可以搞定:

  alias 123='abcdefgh' #注意,这里是单引号

  这样,你 就可以用123 来代替这个命令了,而且原来的abcdefgh这条命令依旧有效。这时,相信大家已经知道alias指令的用途了吧。我再举一个例子,如果你总是频繁做一 个操作,比如说"cd /home/name/Desktop/",如果你每次要对桌面的文件操作,你就每次都得输入一遍这条命令,有时候,就显的很烦人了。那我们为何不用 alias命令来搞定呢?

  alias zm='cd /home/name/Desktop/'

  这样,我们就可 以用zm这个简单的命令取代那一串输入了。不过这里大家要注意,每当你输入一次alias指令后,这个修改只在当前的Shell生效,也就是说,如果你重 新开启一个 Shell,或者重新登录之后,这些更改不会保留下来,那如果您希望你的更改是永久的,那怎么做呢?很简单,只需要把你的更改写入bash的配置文件就可 以了。你直接修改~/.bashrc文件(/home/username/.bashrc),这个文件是一个隐藏文件。用文本编辑器打开他,比如说vi。 然后在其中加入指令就可以了。

  我在最后附了一份我的配置文件,把里面的alias指令我用红色标明了,大家可以参考一下。

  相信大家这时候已经了解alias的用法了。你们是不是会马上会"alias dir='ls'"?呵呵……

  # ~/.bashrc: executed by bash(1) for non-login shells.

  # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)

  # for examples

  # If not running interactively, don't do anything

  [ -z "$PS1" ] && return

  # don't put duplicate lines in the history. See bash(1) for more options

  export HISTCONTROL=ignoredups

  # check the window size after each command and, if necessary,

  # update the values of LINES and COLUMNS.

  shopt -s checkwinsize

  # make less more friendly for non-text input files, see lesspipe(1)

  [ -x /usr/bin/lesspipe ] && eval "$(lesspipe)"

  # set variable identifying the chroot you work in (used in the prompt below)

  if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then

  debian_chroot=$(cat /etc/debian_chroot)

  fi

  # set a fancy prompt (non-color, unless we know we "want" color)

  case "$TERM" in

  xterm-color)

  PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

  ;;

  *)

  PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

  ;;

  esac

  # Comment in the above and uncomment this below for a color prompt

  #PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

  # If this is an xterm set the title to user@host:dir

  case "$TERM" in

  xterm*|rxvt*)

  PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'

  ;;

  *)

  ;;

  esac

  # Alias definitions.

  # You may want to put all your additions into a separate file like

  # ~/.bash_aliases, instead of adding them here directly.

  # See /usr/share/doc/bash-doc/examples in the bash-doc package.

  #if [ -f ~/.bash_aliases ]; then

  # . ~/.bash_aliases

  #fi

  # enable color support of ls and also add handy aliases

  if [ "$TERM" != "dumb" ]; then

  eval "`dircolors -b`"

  alias ls='ls --color=auto'

  #alias dir='ls --color=auto --format=vertical'

  #alias vdir='ls --color=auto --format=long'

  fi

  # some more ls aliases

  #alias ll='ls -l'

  #alias la='ls -A'

  #alias l='ls -CF'

  alias agi='sudo apt-get install'

  alias agr='sudo apt-get remove'

  alias reboot='sudo reboot'

  alias halt='sudo halt'

  alias update='sudo apt-get update'

  alias upgrade='sudo apt-get dist-upgrade'

  # enable programmable completion features (you don't need to enable

  # this, if it's already enabled in /etc/bash.bashrc and /etc/profile

  # sources /etc/bash.bashrc).

  if [ -f /etc/bash_completion ]; then

  . /etc/bash_completion

  fi

原文来自:http://doc.linuxpk.com/5966.html

2008年11月12日星期三

喝酒......

喝酒象喝汤,此人在工商!
喝酒象喝水,肯定在建委!
人均一瓶不会剩,工作一定在财政!
喝酒不用劝,肯定在法院!
举杯一口干,必定是公安!
一口能干二两五,这人一定在国土!
喝掉八两都不醉,这人肯定在国税!
天天醉酒不受伤,老弟八成在镇乡!
白酒啤酒加红酒,肯定是个一把手!

[奇异搞笑]给软件工程师的一封求助信......

尊敬的软件工程师:
  去去,我将我的软件《女友7.0》升级为《太太1.0》,但很快我发现,它又生成一个新的软件《宝宝》,这个新软件占用了我大量的空间和宝贵的内存。
   另外,《太太1.0》又自动将自己安装到系统中所有软件的运行。我最喜欢的游戏程序,比如《扑克10.3》、《足球5.0》《打猎和捕鱼7.5》和《赛 马3.6》等,在《太太1.0》的将空下都无法运行。现在,我想将《太太1.0》恢复成《女友7.0》,但卸载工具在《太太1.0》的监空下无法工作,特 请求帮助。
  谢谢!
  遇到麻烦的软件用户

  (回复)
  亲爱的用户:
  你遇到的问题是许多拥护抱怨最多 的一个常见问题。很多人将《女友7.0》升级到《太太1.0》,以为这只是一个娱乐性的应用软件,但《太太1.0》其实是一个操作系统。想删除《太太 1.0》而还原到《女友7.0》是不可能的。你无法还原到《女友7.0》,因为《太太1.0》不支持这样做,详请请看《软件使用手册》中关于赡养费和子女 抚养费的条款。
  如果出现死机等严重情况,你最好重起机器,在DOS状态下输入指令:“C:APOLOGIZE(道歉)。”运气好的话,很快就能恢复正常。
   虽然《太太1.0》的维护成本很高,但他是一个很不错的软件,《太太1.0》的一些组件,比如:《打扫卫生3.0》、《烹调1.5》以及《管家婆 4.2》等都是费用有用的程序。需要特别注意的是,使用这些组件不当,系统会自动生《唠唠叨叨9.5》,系统效率会大减。提高使用效率的方法,就是去购买 新的软件补丁,我推荐《鲜花2.1》和《钻石5.0》这两宽软件。
  严重警告:千万不要安装《超短裙秘书3.3》,该软件与《太太1.0》无法兼容,一旦安装,将会对系统造成无法修复的损伤。祝你好运哦!
  软件工程师


原文件来自:http://www.tianya.cn/publicforum/content/no04/1/746983.shtml

2008年11月11日星期二

赶集卖猪(加长版)经济危机的故事

前面说到哈佛经典案例,赶集卖猪的故事,好故事一直就是聪明人发明的,其中不乏天才。在河蟹娱乐看到了赶集卖猪的强化版。解释了经济由发展到危机的步步转化。不错,帮经济没学好的像小草一样的同学补一下经济课。

一男赶集卖猪,天黑遇雨,二十头猪未卖成,到一农家借宿。

少妇说:家里只一人不便。

男:求你了大妹子,给猪一头。

女:好吧,但家只有一床。

男:我也到床上睡,再给猪一头。

女:同意。

半夜男与女商量,我到你上面睡,女不肯。

男:给猪两头。

女允,要求上去不能动。

少顷,男忍不住,央求动一下,女不肯。

男:动一下给猪两头。女同意。

男动了八次停下,女问为何不动?

男说猪没了。

女小声说:要不我给你猪……

天亮后,男吹着口哨赶30头(含少妇家的10头)猪赶集去了……

哈佛导师评论:要发现用户潜在需求,前期必须引导,培养用户需求,因此产生的投入是符合发展规律的。

(加强篇)

另一男得知此事,决意如法炮制,遂赶集卖猪,天黑遇雨,二十头猪未卖成,到一农

借宿

少妇说:家里只一人不便。

男:求你了大妹子,给猪一头

女:好吧,但家只有一床。

男:我也到床上睡,再给猪一头。

女:同意。

半夜男商女,我到你上面睡,女不肯。

男:给猪两头。

女允,要求上去不能动。

少顷,男忍不住,央求动一下,女不肯。

男:动一下给猪两头。女同意。

男动了七次停下,女问为何不动?

男说:完事了~~~女:……

天亮后,男低著头赶2头猪赶集去了……

哈佛导师评论:要结合企业自身规模进行谨慎投资,谨防资金链断裂问题

又一男得知此事,决意如法炮制兼吸取教训,遂先用一头猪去换一粒伟哥,事必,天亮后,男吹着口哨赶38头(含少妇家的18头)猪赶集去了……

哈佛导师评论:企业如果获得金融资本的帮助,自身经营能力将得到倍增。

知道此法男多,伟哥供不应求,逐渐要2头,3头猪换一粒伟哥。

哈佛导师评论:这就是通货膨胀。

当猪价格涨到16头一粒的时候,哈佛导师评论:该男已经进入边际成本,除了拥有对自身能力的自信和未来良好愿望以外,实际现猪流已经为零。

但换猪男越来越多,卖伟哥的决定,扩展生产能力,推出一种次级伟哥,如果你缺一头猪,只要你承诺可以到该女房中一夜,就可以先借,事成后补交猪款,这个方法大大

促进了伟哥销售。

哈佛导师评论:这就是贷款,让企业可以根据未来的收益选择借支流动资金

伟哥专卖店后来在即使你一头猪都没有,只要你承诺可以到该女房中一夜,就可以先

借,事成后补交猪款。

哈佛导师评论:这就是金融创新,让现在的人花未来的钱,反正等你老了未来的钱你

也花不动。

消息一出,换猪男越来越多,有人找伟哥专卖店,这个项目太好了,我们把它变成优质基金,对外销售债卷,你们也就可以分享我的收益,如何?

结果伟哥专卖店觉得甚好,于是该公司把换猪男分三类,一类是拿现猪换的,一类是一部分现猪贷的,一类是完全没有现猪借的,发行三种债卷。大家踊跃而上。纷纷购买

伟哥专卖店的债卷,伟哥专卖店生意太好,就把债卷销售外包给另外一家公司运作,该公司也一并大发其财,公司越做越大,甚至可以脱离实际伟哥销售情况来发行,给自己和伟哥专卖店带来巨大的现金收益。

哈佛导师评论:这就是专业的人做专业的事,从实体经营到资本运作,经济进入了更高的层次。

为了防止自己债卷未来有损失,该公司决定给它买上保险,这样债卷销售就更容易,

因为一旦债卷出现问题,还可以获得保险公司的赔付,哇,债券公司销售这下子太好了,保险公司也获得巨大平白无故的保险收入。

哈佛导师评论:这就是风险对冲,策略联盟,提高了企业的抗风险能力,也保护了消费者利益。

换猪男太多,排长队等待,该女无法承受,说老娘不干了,我搬家,一时间有无数拥有伟哥的欠猪男。

哈佛导师评论:这是个别现象,属于市场的正常波动,不会影响整个经济。

结果该女迟迟不肯搬回。一部分欠猪男没有收入,只好赖帐,结果大量债卷到期无法换现猪吃,债卷公司一看,一粒伟哥16头猪,这哪里还得起,宣布倒闭

哈佛导师评论:这是次贷危机,不会影响整个金融行业。

哪里晓得债卷公司还把债卷上了保险,保险公司一看,这哪里赔得起,于是也宣布要倒闭。

哈佛导师评论:这是金融危机,还不会影响整个实体经济。

后文:据说该女已搬到中国定居。

原文请看:http://www.daocaoshen.cn/post/maizhu2.html

谷歌解析美国富翁购物秘笈:最有钱人最爱网购

 【艾瑞网消息】在经济衰退浪潮中,尽管中产阶级始终占据媒体的头条,百万富翁们其实也具有话题性。为了近距离的观察富翁们在这些日子是如何购物的,谷歌与一家市场机构联合调查了那些年龄在24-64岁之间,最为富有的购物者(年收入至少百万以上)。

  谷歌的零售经理就此次调查接受了采访。

  问:市场人员和零售人员对于百万富翁的最大的误解是什么?

  答:有一种根深蒂固的见解,认为富人是非常懒惰的人。他们不指导这些富有的客户其实有多缺时间。参与我们调查的富翁,有90%经常处于紧张的工作中。

  问:那么他们什么时候购物呢?

  答:只要他们有时间。而且经常是在网上。基本上所有接受访问的百万富翁(94%)说他们在最近的六个月内做过奢华的购买。而拥有类似高端店铺的 人们总是花大量的金钱和时间,用于创造超棒的店内购物经历。但56%的百万富翁实际上更喜欢在零售商的网站内购买,而不是访问店铺。比起一般的富人。百万 富翁更喜欢应用百货共公司的站点和奢侈品牌的站点。

  问:他们与一般的富人还有什么不同呢?

  答:他们想从网上了解的信息如此之多,我们对此很惊异。举个例子,超过90%的百万富翁说他们总是阅读在线消费者评论。而一般富裕人群的这一比例为68%.购买衣物时,在线广告对93%的百万富翁有影响,而只对62%的一般富人有影响。

  问:他们如何决定该购买什么呢?

  答:网络有绝对的影响力,82%的回答者说他们用网络。口碑位于第二位,其比例为78%.杂志位于第三位,其比例为68%.

  问:即便是最奢华的店铺,其销售也已经开始下降。消费者信心降到最低点。这些购物者受了多大影响?

  答:我们知道,这些高端客户就像所有的人一样,会有所退缩。在过去的几个月内,他们未必比中产消费者损失的更多。但按照财富比例来推算,钱的总量显然要大得多。

  问:但是缩减是相对的,是吗?

  答:是的,一般富裕程度的网络购物者在奢侈品上一年大约花6万美元。而百万富翁的花费是3倍以上。大约为20万美元。

  问:消费品零售商是否误读了他们的客户?

  答:某种程度上是这样的。比如说。如果你问中产购物者,伟大的客户服务是什么。他们会谈到诸如方便和灵活之类的事情。如果你问零售商,他们经常认为这个问题与客户是否得到友好的问候相关。

  问:零售者应该怎么做?

  答:我们很清楚的看到,本季的促销和降价开始的比以往要早。富裕的人们也会受到降价的打动。人们有钱总是有理由的。他们能挣钱是因为他们聪明。 他们会去购物,在购物时会比较大量的条款。在今年,价格当然会比以往更多的加以考虑。价格有弹性、商品多选择,都是非常重要的。

  问:品牌销售商们在营销上应该做何改变呢?

  答:当营销费用减少、消费者在产品上花费减少的时候,尽可能高效的使用钱,获得最佳的ROI,这比以往任何时候都重要。如果你知道人们在线寻找你的商品,就要保证人们能找到它。

2008年11月9日星期日

万科停工 传深圳项目每天亏损一辆悍马

来源:华夏时报 时间:2008-11-08 04:43

11月3日,万科上海公司证实,原定于2009年6月30日竣工的上海万科城花新园的住宅楼已停工。而该项目负责人之一的汤小菁表示,6月份时还做过城花新园的宣传和推介活动,项目一直在顺利进行中。

  “万科是第一家公开、鲜明地宣布推迟项目新开工的公司,表明公司对房地产市场的短期前景持偏悲观的判断。”乘星行有限公司总裁李骁认为,这种判断与万科面临的巨大压力不无关系。

  停工隐情

  万科城花新园位于上海市闵行区属七宝板块的中春路上。之前有媒体报道该楼盘的项目名为“闵行区七宝镇187号地块”,地块为配套商品房用地,上海万科于2005年9月获批取得该土地使用权,总价款为30015万多元,折合楼板价2710元/平方米。

  对于项目突然停工,万科上海公司公关部李嫣向《华夏时报》记者表示:“因为在规划、设计上要做调整,这个项目已经停下来。”

  “万科也许是对该楼盘利润预期过低和建成后没法及时销售出去而停工的。”李骁认为,楼盘建成大概需要一年半左右的时间,但如果市场行情不好,按目前的市场价万科的利润空间比较少。而另一个重要原因是,如果对在建楼盘继续投入大量建设、营销成本后却无法卖出去,那么将恶化万科已经不容乐观的现金流。

  购房者对房价下跌的预期很高,在这种价格下调预期的状况下,新建的商品房面临巨大的不可预测的价格风险,中瑞市场研究公司总经理朱锋对《华夏时报》记者表示:“现在的楼盘普遍面临着价格困境。新楼盘不敢开盘,低了觉得赚得少,而开得过高又没有销售量。”而在地方政府对施工要求放缓的环境下,停工、缓建成为不得已的选择。

  资金回笼是考验

  爱建证券在对万科三季度季报研究中发现,万科的存量房大幅增长,房产销售速度进一步减慢。截至报告期末,万科的存货已高达873.76亿元,在未来市场交易不被看好的前景下,这些没有被消化的房产存在很大的兑现风险。

  有业内专家表示,今年万科压力过大,是因为去年万科“吃得太多”,扩张得过于厉害,以至于今年“消化不良”。

  万科年报显示,在上海的项目从之前的9个急增到22个,大部分新增的项目都是在2007年地产高峰期拿下的。

  由于市场低迷、销售不景气,降价促销导致公司销售费用大幅增长,光大证券的研究报告显示,今年万科管理费用上升了39%,营业税增加了56%,营业成本上升68%,营业费用则上升了74%。

  在各种成本大幅上扬的同时,销售业绩却不佳,现金流更不容乐观。今年三季度,万科实现销售金额114.9亿元;较上年同期减少31.9%。

  销售资金回笼的不畅严重影响了万科的资金流动性。今年三季度报告期末万科拥有货币资金199.4亿元(其中包括今年9月份万科顺利发行的59亿元公司债券),但公司的短期借款和一年内到期的长期借款合计为170.7亿元。支出的增加、收入的减少,使万科利润大幅下挫。今年第三季度报告显示,公司第三季度净利润下降13.42%。

  “目前保持充足的现金流对万科十分重要,将资金转移到可以即期销售的项目上以回笼资金是当务之急。因此削减新项目投入便在情理之中了。”五合智库上海总经理邹毅认为,万科只是以“规划调整”、“周边道路施工”等原因来解释停工的原因,但把不能在短期内回笼资金的项目停下来以收缩战线,才是最终的目的。

开工计划下调

  综合各项经营状况,光大证券认为,预计今年万科净利润增长率超过15%的这一指标已经很难完成。然而万科在2006年的利润增长率为69.7%,2007年的增长率为110.81%。

  “万科在去年拿的土地价格比较高,如果将其建设完工,在当前和未来都面临相当大的风险。”地产评论家叶檀认为,一方面建设项目需要投入大量现金,这会进一步增加其现金流压力;另一方面,即使将项目顺利建成,其利润也将大幅削减,而且能否顺利将房产转为现金也是一个巨大的未知数。由此,在扩大销售量的同时,停工、缩产、减少开支,则成为其必然选择。

  “去年万科的融资渠道比较广,还可以联合国外基金等进行多渠道的融资。但今年美国金融危机使寻求海外合作的选择机会也大大减小了。”佑威地产研究中心主任薛建雄认为。

  今年的三季度报中万科表示将进一步下调今年的开工计划,在上半年减少165万平方米开工面积的基础上,开工面积再调减约110万平方米,以更好地匹配市场的销售节奏。上海和深圳项目的暂停施工只是万科今年整体收缩战略的一部分。

  业内人士认为,目前被媒体爆出来的停工也许只是其中一部分,今后会看到另外的停工案例。

  相 关

  “深圳项目每天亏损一辆悍马”

11月5日上午,《华夏时报》记者来到停工两个月的万科金域东郡二期工程现场,对于该项目停工原因,万科董秘肖莉回应说是受交通道路没修好的影响,但在现场记者发现道路畅通无阻,工地上堆满钢铁建材,可见之前并未因为道路而影响开工。

  停工解释矛盾

  万科金域东郡二期工程停工已经两个月了,有业主透露万科已经申请停工两年,但是万科对此给予了否认。

  据还在看守的建筑公司工作人员说,停工后建筑商开始撤退,已经搬走了很多施工建材,但两个月过去了,打好的桩子都还没拔下来,他说剩下的这些很快都会拖走,不知道什么时候再开工,要等万科的通知。

  万科深圳公司新闻发言人曾公开表示,是因为业主维权影响停工,而肖莉回应则说是受交通道路没修好的影响,但记者在现场看到的情况则不尽相同。记者随同几个业主开车前往二期工程,道路都已畅通无阻,工地上堆满钢铁建材,可见之前并未因为道路而影响开工。

  肖莉对停工的解释,让外界感到疑惑,有业内人士分析认为,既然道路不是影响停工的原因,万科高层的搪塞,让人觉得万科对外发表的言论不真实,这样会使万科的公信力大大下降。

GROUP_CONCAT()妙用

GROUP_CONCAT()是MySQL数据库提供的一个函数,通常跟GROUP BY一起用,具体可参考MySQL官方文挡:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat。

先来看一下这个函数的语法:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])

下面就演示一下这个函数所带来的方便之处,首先建立一个学生选课表student_courses,并填充一些测试数据。

CREATE TABLE student_courses (
student_id INT UNSIGNED NOT NULL,
courses_id INT UNSIGNED NOT NULL,
KEY(student_id)
);
INSERT INTO student_courses VALUES (1, 1), (1, 2), (2, 3), (2, 4), (2, 5);

若要查找学生ID为2所选的课程,则使用下面这条SQL:

mysql> SELECT student_id, courses_id FROM student_courses WHERE student_id=2;
+------------+------------+
| student_id | courses_id |
+------------+------------+
| 2 | 3 |
| 2 | 4 |
| 2 | 5 |
+------------+------------+
3 rows IN SET (0.00 sec)

输出结果有3条记录,说明学生ID为2的学生选了3、4、5这3门课程。
放在PHP里,必须用一个循环才能取到这3条记录,如下所示:

<?php
...
foreach ($pdo->query("SELECT student_id, courses_id FROM student_courses WHERE student_id=2") as $row) {
$result[] = $row['courses_id'];
}
...
?>

而如果采用GROUP_CONCAT()函数和GROUP BY语句就显得非常简单了,如下所示:

mysql> SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 3,4,5 |
+------------+---------+
1 row IN SET (0.00 sec)

看见没,在PHP里就不用循环了,如下所示:

<?php
...
$row = $pdo->query("SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id");
$result = explode(',', $row['courses']);
...
?>

当然分隔符还可以自定义,默认是以“,”作为分隔符,若要改为“|||”,则使用SEPARATOR来指定,例如:

mysql> SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '|||') AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;
+------------+-----------+
| student_id | courses |
+------------+-----------+
| 2 | 3|||4|||5 |
+------------+-----------+
1 row IN SET (0.00 sec)

除此之外,还可以对这个组的值来进行排序再连接成字符串,例如按courses_id降序来排:

mysql> SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id;
+------------+---------+
| student_id | courses |
+------------+---------+
| 2 | 5,4,3 |
+------------+---------+
1 row IN SET (0.02 sec)

2008年11月8日星期六

PHP 纯粹分页类 超强 超好用 有范例

<?php
class Pager {
private $_perPage; //每一页记录数
private $_totalItems; //总记录数
private $_totalPages; //总共页数
private $_currentPage; // 当前页序号
private $_listStart; //当前头条记录ID
private $_listEnd; //当前最后条记录ID
private $_pageStart; //第一页
private $_pageEnd; //最后页
private $_listPage; //循环显示当前分页列表
private $_listItems; //循环显示当前分页列表条数
private $_pageData; //当前要显示的记录
private $_linkData; //页面传递的变量
private $_startId; //从数据库读出的启始id

public function __construct($totalItems, $perPage, $linkData){
$this->_listItems = 11;
$this->_currentPage = max((int)$_REQUEST['pageId'], 1); //当前的页序号
$this->_perPage = $perPage; //每一页记录数
$this->_totalItems = $totalItems; //总记录数
$this->_totalPages = ceil($totalItems / $perPage); //总页数
$this->_listStart = ($this->_currentPage - 1) * $perPage + 1; //当前头条记录ID
$this->_listEnd = ($this->_currentPage != $this->_totalPages) ? $this->_currentPage * $perPage : $totalItems;//当前最后条记录ID
$this->_startId = $this->_listStart; //从数据库读出的启始id
$this->_linkData = $_SERVER['PHP_SELF'] . $linkData; //传递的变量
}
public function startId(){ //从数据库读出的启始id
return $this->_startId;
}
public function totalItems(){ //总记录数
return $this->_totalItems;
}
public function totalPages(){ //总页数
return $this->_totalPages;
}
public function listStart(){ //当前头条记录ID
return $this->_listStart;
}
public function listEnd(){ //当前最后条记录ID
return $this->_listEnd;
}
public function currentPage(){ //当前页
return $this->_currentPage;
}
public function linkData() { //传递的变量
return $this->_linkData;
}
public function pageStart(){ //第一页
return $this ->_pageStart = '<a href="'.$this->_linkData.'&pageId=1"><FONT title="首页" face="webdings">9</FONT></a>';
}
public function pageEnd(){ //最后页
return $this ->_pageEnd = "<a href=".$this->_linkData."&pageId=".$this->_totalPages."><FONT title=尾页 face=webdings>:</FONT></a>";
}
public function upPage(){ //上一页
$upPage = '';
if($this->_currentPage > 1 && $this->_currentPage <= $this->_totalPages){
$up = $this->_currentPage-1;
$upPage = "<a href=".$this->_linkData."&pageId=".$up."><FONT title=上页 face=webdings>7</FONT></a>";
}
return $upPage;
}
public function downPage(){ //下一页
$downPage = '';
$down = $this->_currentPage+1;
if($this->_currentPage < $this->_totalPages) {
$downPage = "<a href=".$this->_linkData."&pageId=".$down."><FONT title=下页 face=webdings>8</FONT></a>";
}
return $downPage;
}
public function listPage(){ //循环显示当前分页列表
$middlePage = ceil($this->_listItems/2);
if($this->_currentPage <= $middlePage && $this->_currentPage != ""){ //当前页面小于等于中间页,
$start = 1 ;
if($this->_totalPages < $this->_listItems) { $end = $this->_totalPages; }
else {$end = $this->_listItems;}
}elseif(($this->_currentPage + $middlePage) > $this->_totalPages){ // 中间到最后页之间
if($this->_totalPages < $this->_listItems) { $start = 1 ; }
else { $start = $this->_totalPages - $this->_listItems + 1; }
$end = $this->_totalPages;
}else{
$start = $this->_currentPage - $middlePage + 1 ;
$end = $this->_currentPage + $middlePage - 1 ;
}

// 显示列表
for($i = $start; $i <= $end; $i++){
if ($this->_currentPage == $i) { $this->_listPage .= "<strong> ".$i." </strong>&nbsp;"; }
else { $this->_listPage .= "<a href=".$this->_linkData."&pageId=".$i.">".$i."</a>&nbsp;"; }
}
return $this->_listPage;
}
public function jumpPage(){
$jumpPage = '<div><select name="pageId" onchange="location=\''.$this->_linkData.'&pageId=\'+this.value;">'; //页面跳转
for($i = 1; $i <= $this->_totalPages; $i++){
if($i == $this->_currentPage) $selected = ' selected';
$jumpPage .= '<option value="' . $i .'" '.$selected.'>'.$i.'</option>';
unset($selected);
}
return $jumpPage .= '</select> 页</div>';
}
}

///范例
$totalItems = 100; //总记录
$perPage = 7;
$page = new Pager($totalItems, $perPage ,"?a=b&c=6");
//for($i = $page->startId(); $i <= $page->startId() + $perPage; $i++){
for($i = $page->startId(); $i <= $page->listEnd(); $i++){
$data[] = array($i,$i+1);
}
echo "当前开始ID:".$listStart = $page->listStart();echo "<br>";
echo "当前结束ID:".$listEnd = $page->listEnd();echo "<br>";
echo "第一页:".$pageStart = $page->pageStart();echo "<br>";
echo "最后页:".$pageEnd = $page->pageEnd();echo "<br>";
echo "上一页:".$upPage = $page->upPage();echo "<br>";
echo "下一页:".$downPage = $page->downPage();echo "<br>";
echo "列表显示:".$listPage = $page->listPage();echo "<br>";
echo "跳转页:".$jumpPage = $page->jumpPage();echo "<br>";
//echo $page->linkData();
//print_r($data);
echo "<table border=1 width=100><tr><td align=center>N</td><td align=center>N+1</td></tr>";
foreach ($data as $key0 => $value0) {
echo "<tr>";
foreach ($value0 as $key1 => $value1) {
echo "<td align=center>$value1</td>";
}
echo "</tr>";
}
echo "</table>";
?>

2008年11月7日星期五

TP-LINK产品复位大全(路由器初始化恢复出厂默认值)

宽带路由器类:

1)、具有M1、M2灯的TL-R4XX路由器复位方法:

在路由器的前/后面板上有一个小孔,旁有单词:Reset;
关闭路由器的电源,找一如笔尖类的尖物按住Reset键;
给路由器加电,等待约3-10秒钟,待M1和M2灯同时闪烁三次后可松手,复位成功;
注意复位后路由器将会恢复为出厂设置,默认登陆IP是192.168.1.1;默认用户名和密码是admin/admin,登陆时请注意 你的电脑的IP地址是不是在192.168.1.0网段!

2)、不具有M1、M2灯的路由器复位方法:

TL-R420复位方法:按下reset键约2秒后松开,路由器将恢复到出厂默认值。默认管理地址:192.168.1.1,默认用户名口令:admin/admin;

TL-R400+复位方法:关闭电源,按住reset按钮,然后打开电源,约过5秒钟松开按钮,路由器将恢复到出厂默认值。默认管理地址:192.168.123.254,默认用户名口令:admin/admin;

TL-R400 复位方法:按下reset键约2秒后松开,路由器将恢复到出厂默认值。默认管理地址:192.168.123.254,默认用户名口令:admin/admin。

无线类:

1)、无线路由器的复位方法:

TL- WR3xx/TL-WR5xx/TL-WR6xx复位方法:先关闭电源,然后按住RESET键不放,这时候再开启电源,等到system灯快闪三次后松开 RESET键,路由器将恢复到出厂默认值。默认管理地址:192.168.1.1,默认用户名口令:admin/admin;

TL-WR240+/WR240 2.0复位方法:在加电情况下按住RESET按钮约10秒钟后松手,路由器将恢复到出厂默认值。默认管理地址:192.168.1.1,默认用户名口令:admin/admin;

WR245 1.0版复位方法:加电状态下,按住RESET键5秒钟以上,路由器将恢复到出厂默认值。默认管理地址:192.168.1.1,默认用户口令admin/admin;

WR245 2.0 复位方法:关闭电源,按住此按钮,然后打开电源,约过3秒钟,System指示灯先灭后亮,路由器将恢复到出厂默认值。默认管理地址:192.168.1.1,默认用户名口令:admin/admin。

2)、无线AP的复位方法:

TL-WA501G复位方法:先关闭电源,然后按住RESET键不放,这时候再开启电源,经过3秒钟,SYSTEM灯先灭后亮,AP将恢复到出厂默认值。默认管理地址:192.168.1.1,默认用户名口令:admin/admin;

TL- WA200/TL-WA200+复位方法:加电状态按住RESET按钮5-10秒,当WLAN指示灯由熄灭变为慢慢闪亮,表示复位成功;3.0版本的IP 地址为192.168.1.100,默认用户名密码 admin/admin,而3.1版本的IP地址为192.168.1.1,默认用户名密码 admin/admin。

交换机类:

具有reset键的交换机:TL-SL2210web、TL-SL2218web、TL-SL2428web、TL-SL2452web、TL- SG2109web、TL-SG2216web、TL-SG2224web。这几款交换机复位方法与路由器的复位方法相同:先断电,按住RESET键不松手,通电同时,看到所有灯都闪烁即复位成功。默认管理地址是192.168.0.1,默认用户名和密码是supervisor/supervisor;

TL- SF2226P+/TL- SL2226P+复位方法:使用TP-LINK SSU管理程序,点击“设备”->“恢复出厂设置”,交换机将恢复到出厂默认值。默认管理地址是192.168.0.100,默认用户名和密码是admin/admin;

TL-SF2108P, TL-SF2109P, TL-SF2808P, TL-SF2216P, TL-SF2224P, TL-SF2232P, TL-SL2226P, TL-SF2008, TL-SF2117P, TL-SF1016V, TL-SF1024V, TL-SG2008复位方法:这系列交换机使用TP-LINK SSC程序进行管理,不需要使用用户名和密码即可登录;

TL- SF3226P,TL-SF3008、TL-SF3117P和部分WEB管理型交换机复位方法:通过串口连接交换机,使用超级终端登陆交换机,在启动交换机之前有一个提示界面,按CTRL—B键进入bootmenu,看到“Please Input Bootrom password:”后直接回车,然后在出现的界面里选择“3:Restore factory default setting”,将交换机恢复到出厂设置,最后选择“5:Reboot”即可。默认管理地址是192.168.0.1,默认用户名和密码是 supervisor/supervisor。

ADSL类:

TD-8800复位方法:在不断电的情况下,连续按reset键三次,指示灯全部闪烁,复位成功。默认管理地址:192.168.1.1,默认用户名口令:admin/admin;

TD-8810/ TD-8610复位方法:先断电,再按住reset键,然后打开电源,等待大约3秒钟,复位成功。默认管理地址:192.168.1.1,默认用户名口令:admin/admin;

TD-8830/ TD-8831复位方法:在不断电的情况下,按住reset键持续10秒钟左右,然后松开,复位成功。默认管理地址:192.168.1.1,默认用户名口令:admin/admin。

2008年11月6日星期四

什么是跨站攻击?跨站攻击是什么意思?

跨站攻击,即Cross Site Script Execution(通常简写为XSS)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

业界对跨站攻击的定义如下:“跨站攻击是指入侵者在远程WEB页面的HTML代码中插入具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面,嵌入其中的脚本将被解释执行。”由于HTML语言允许使用脚本进行简单交互,入侵者便通过技术手段在某个页面里插入一个恶意HTML代码,例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失。如这句简单的Java脚本就能轻易获取用户信息:alert(document.cookie),它会弹出一个包含用户信息的消息框。入侵者运用脚本就能把用户信息发送到他们自己的记录页面中,稍做分析便获取了用户的敏感信息。

跨站攻击有多种方式,典型的方式有两种:

其一,由于HTML语言允许使用脚本进行简单交互,入侵者便通过技术手段在某个页面里插入一个恶意HTML代码——例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失。

其二,XST攻击描述:攻击者将恶意代码嵌入一台已经被控制的主机上的web文件,当访问者浏览时恶意代码在浏览器中执行,然后访问者的 cookie、http基本验证以及ntlm验证信息将被发送到已经被控制的主机,同时传送Trace请求给目标主机,导致cookie欺骗或者是中间人攻击。

XST攻击条件:

1、需要目标web服务器允许Trace参数;

2、需要一个用来插入XST代码的地方;

3、目标站点存在跨域漏洞。

XST与XSS的比较:

相同点:都具有很大的欺骗性,可以对受害主机产生危害,而且这种攻击是多平台多技术的,我们还可以利用Active控件、Flash、Java等来进行XST和XSS攻击。

优点:可以绕过一般的http验证以及NTLM验证

用apache+mysql+php在win2003架设web服务器,扫描服务器:

提示 www (80/tcp)

http TRACE 跨站攻击

你的webserver支持TRACE 和/或 TRACK 方式。 TRACE和TRACK是用来调试web服务器连接的HTTP方式。

支持该方式的服务器存在跨站脚本漏洞,通常在描述各种浏览器缺陷的时候,把"Cross-Site-Tracing"简称为XST。

攻击者可以利用此漏洞欺骗合法用户并得到他们的私人信息。

解决方案: 禁用这些方式。

如果你使用的是Apache, 在各虚拟主机的配置文件里添加如下语句:

RewriteEngine on

RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)

RewriteRule .* - [F]

XSS和脚本注射的区别?

并非任何可利用脚本插入实现攻击的漏洞都被称为XSS,因为还有另一种攻击方式:“Injection”,即脚本注入或者是讲脚本注射,他们之间是有区别的,他们的区别在以下两点:

1、( Injection)脚本插入攻击会把我们插入的脚本保存在被修改的远程WEB页面里,如:sql injection,XPath injection.这个很常见,好象前几个月很多安全网站被黑就是因为脚本里存在注入漏洞,而被一些人利用的。

2、跨站脚本是临时的,执行后就消失了。这个就不同于我们现在讨论的XSS/CSS 了,今天讲的是在页面中插入脚本,这样谁来访问谁的浏览器就执行,如果不被删掉或者是修改编辑的话,就一直存在的。

什么类型的脚本可以被插入远程页面?

主流脚本包括以下几种:

HTML

Java

VB

ActiveX

Flash

如何防范XSS跨站攻击?

在你的WEB浏览器上禁用java脚本,具体方法,先打开你的IE的internet选项,切换到“安全”页,有个“自定义”级别,点他出现如下窗口,禁用就可以了。但是好象不太可能,因为一旦禁用,很多功能就丧失了,这个方法是下策。

还有不要访问包含〈〉字符的连接,当然一些官方的URL不会包括任何脚本元素。

如果你的站点程序含论坛,留言板,以及其他程序中含提交数据格式的,没有很好过滤机制,请马上下载升级程序或是停止使用ubb这样的功能,避免造成更多的问题。

跨站脚本执行漏洞的成因,形式,危害,利用方式,隐藏技巧

【漏洞成因】

原因很简单,就是因为CGI程序没有对用户提交的变量中的HTML代码进行过滤或转换。

【漏洞形式】

这里所说的形式,实际上是指CGI输入的形式,主要分为两种:

1.显示输入

2.隐式输入

其中显示输入明确要求用户输入数据,而隐式输入则本来并不要求用户输入数据,但是用户却可以通过输入数据来进行干涉。

显示输入又可以分为两种:

1. 输入完成立刻输出结果

2. 输入完成先存储在文本文件或数据库中,然后再输出结果

注意:后者可能会让你的网站面目全非!

而隐式输入除了一些正常的情况外,还可以利用服务器或CGI程序处理错误信息的方式来实施。

【漏洞危害】

大家最关心的大概就要算这个问题了,下面列举的可能并不全面,也不系统,但是我想应该是比较典型的吧。

1. 获取其他用户Cookie中的敏感数据

2. 屏蔽页面特定信息

3. 伪造页面信息

4. 拒绝服务攻击

5. 突破外网内网不同安全设置

6. 与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等

7. 其它

一般来说,上面的危害还经常伴随着页面变形的情况。而所谓跨站脚本执行漏洞,也就是通过别人的网站达到攻击的效果,也就是说,这种攻击能在一定程度上隐藏身份。

【隐藏技巧】

出于时间的考虑,我在这里将主要讲一下理论了,相信不是很难懂,如果实在有问题,那么去找本书看吧。

1. URL编码

比较一下:

http://www.5460.net/txl/login/login.pl?username= &passwd=&ok.x=28&ok.y=6

http://www.5460.net/txl/login/login.pl?username=%3C%68%31%3E&passwd=&ok.x=28&ok.y=6

你觉得哪个更有隐蔽性?!

2. 隐藏在其它对象之下

与直接给别人一个链接相比,你是否决定把该链接隐藏在按钮以下更好些呢?

3. 嵌入页面中

让别人访问一个地址(注意这里的地址不同于上面提到的URL),是不是又要比让别人按一个按钮容易得多,借助于Iframe,你可以把这种攻击变得更隐蔽。

4. 合理利用事件

合理使用事件,在某些情况上可以绕过CGI程序对输入的限制,比如说前些日子的SecurityFocus的跨站脚本执行漏洞。

【注意事项】

一般情况下直接进行类似alert(document.cookie)之类的攻击没有什么问题,但是有时 CGI程序对用户的输入进行了一些处理,比如说包含在’’或””之内,这时我们就需要使用一些小技巧来绕过这些限制。

如果你对HTML语言比较熟悉的话,绕过这些限制应该不成问题。

【解决方法】

要避免受到跨站脚本执行漏洞的攻击,需要程序员和用户两方面共同努力:

程序员:

1. 过滤或转换用户提交数据中的HTML代码

2. 限制用户提交数据的长度

用户:

1. 不要轻易访问别人给你的链接

2. 禁止浏览器运行JavaScript和ActiveX代码

附:常见浏览器修改设置的位置为:

Internet Explorer:

工具->Internet选项->安全->Internet->自定义级别

工具->Internet选项->安全->Intranet->自定义级别

Opera:>文件->快速参数->允许使用Java

文件->快速参数->允许使用插件

文件->快速参数->允许使用JavaScript

【常见问题】

Q:跨站脚本执行漏洞在哪里存在?

A:只要是CGI程序,只要允许用户输入,就可能存在跨站脚本执行漏洞。

Q:跨站脚本执行漏洞是不是只能偷别人的Cookie?

A:当然不是!HTML代码能做的,跨站脚本执行漏洞基本都能做。

$_SERVER['SCRIPT_NAME'] 与 $_SERVER['PHP_SELF'] 有什么区别?

首先看一下手册:

“PHP_SELF”
当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。 如果 PHP 以命令行方式运行,该变量在 PHP 4.3.0 之前无效。

“SCRIPT_NAME”
包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。

用个例子比较容易理解:

http://127.0.0.1/test/scripts/phpinfo.php/abc.php?sourc=asdfa&sadf-asdf=asdf

_SERVER["SCRIPT_NAME"] /shopping/scripts/phpinfo.php
_SERVER["PHP_SELF"] /shopping/scripts/phpinfo.php/abc.php

其中(/abc.php) 它是不存在的.


另外还有一个,我没有测试过:

通常在本机测试 $_SERVER['SCRIPT_NAME'] 跟 $_SERVER['PHP_SELF'] 大概看不出有什么不同,但是放到某些虚拟主机上就不一样了.

DreamHost 上的 PHP 是以 CGI 方式执行,二者就有明显不同的差异。

echo $_SERVER['SCRIPT_NAME']; // 输出/cgi-system/php.cgi
echo $_SERVER['PHP_SELF']; // 输出 /admin/gg.php

看出有什么不同了吧? ^^


注意$_SERVER['PHP_SELF']可能引起的跨站攻击.

通常我们使用

$PHP_SELF = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];

来获得当前运行脚本的路径。但是在做一些URL拼合的过程中可能引发XSS跨站攻击。
示例:

<?php
$PHP_SELF = $_SERVER['PHP_SELF'] ? $_SERVER["PHP_SELF"] : $_SERVER["SCRIPT_NAME"];
echo '<a href="' . $PHP_SELF . '">aaa</a>';


触发方式:http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E

解决方法:

$_SERVER['SCRIPT_NAME'] ? $_SERVER["SCRIPT_NAME"] : htmlspecialchars($_SERVER["PHP_SELF"]);



注解:使用http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E执行脚本时,$_SERVER['SCRIPT_NAME']值为/script.php,未包含恶意的脚本。另外,即使最终使用的是$_SERVER['PHP_SELF']的值,也会被htmlspecialchars转义。

资料来源:http://www.sebug.net/vulndb/2748

谷歌浏览器Chrome的用户代理字符串 User Agen

浏览器头信息中 User Agent 字符串提供该浏览器最重要的识别信息。以下是 Google Chrome 谷歌浏览器的 User Agent:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13
从中可以得出,Google Chrome 使用 Apple WebKit 引擎,因此浏览效果类似于 Safari。果然,除 Safari 使用自家的字体渲染技术外,Google Chrome 效果大致与 Safari 相当。加上速度极快的V8引擎解析Javascript,使 Google Chrome 体验要远超 Safari。

比较 Internet Explorer 7 的 User Agent:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1; .NET CLR 2.0.50727)
比较 Firefox 3.0.1 的 User Agent:
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
在网页开发中,这些数据是很有用的。最常用的地方就是 Javascript 判断浏览器,从而执行不同的指令Hack浏览器或者运行不同的效果。

浏览器的 User Agent 详解

userAgent是一个只读字符串,声明了浏览器用于HTTP请求的用户代理头的值,User Agent 字符串在每次浏览器 HTTP 请求时发送到服务器,所以服务器就知道了用户是使用什么浏览器来访问的。一般说来,它是在navigator.appCodeName的值之后加上斜线和 navigator.appVersion的值构成的。

例如User Agent 字串为:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)
表示使用 Maxthon 2.0 浏览器,使用 IE7 内核,操作系统为 Windows XP.

附:什么是Windows NT

Windows NT是基于OS/2 NT的基础编制的。OS/2是由微软和IBM联合研制,分为微软的Microsoft OS/2 NT与IBM的IBM OS/2。协作后来不欢而散,IBM继续向市场提供先前的OS/2版本,而微软则把自己的OS/2 NT的名称改为Windows NT,即第一代的Windows NT 3.1。Windows NT是纯32位操作系统,采用先进的NT核心技术。NT即新技术(New Technology)。

Windows NT是Microsoft推出的面向工作站、网络服务器和大型计算机的网络操作系统,也可做PC操作系统。它与通信服务紧密集成,提供文件和打印服务,能 运行客户机/服务器应用程序,内置了Internet/Intranet功能,已逐渐成为企业组网的标准平台。

Windows NT引入了NTFS、共享、用户账户、域、工作群组、权利、权限、安全审核等概念。

下面是微软发布的Windows NT的主要版本:

Microsoft Windows NT 3.1

Microsoft Windows NT 3.5

Microsoft Windows NT 3.51

Microsoft Windows NT 4.0

从5.0版开始,Windows NT只是简单地称为Windows了,下面的版本是后来的版本:

Microsoft Windows 2000 (Windows NT 5.0)

Microsoft Windows XP (Windows NT 5.1)

Microsoft Windows Server 2003 (Windows NT 5.2)

2007年1月30日,微软正式发行了最新的NT版本:

Microsoft Windows Vista (6.0)


对于 Web 开发人员,可以通过编程来识别出使用什么浏览器访问本站点.

例如:

在 ASP.NET 中使用 Request.Header[”User-Agent”] 得到浏览器的 User Agent,也可以使用 Request.UserAgent 来获取;

Java 中使用 request.getHeader(”User-Agent”) 来获得;

PHP 中的相应代码如下:$_SERVER[HTTP_USER_AGENT].

傲游 1.x 系列的 UserAgent 值是 “Maxthon”,傲游 2.0 的 UserAgent 值是 “Maxthon 2.0″.

所以只需要通过程序在 User-Agent 字符串中查找是否出现 “Maxthon” 或者 “Maxthon 2.0″,就能够知道用户是否通过傲游访问该站点.



2008年11月5日星期三

Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

配置虚拟主机重启apache服务时有以下输出:

Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

原来是因为没有调协默认的ServerName,在httpd.conf中添加:


ServerName 127.0.0.1

重启,OK没有问题了。

如何使用CentOS光盘通过yum来安装X Window System

使用过CentOS的兄弟们一定知道有个非常方便软件安装工具yum,这个工具可以从互联网上安装需要 的软件。yum的方便是与RedHat的rpm对比而言的,rpm的使用经常是让人非常沮丧的,因为即使有一个依赖的软件包没有安装,rpm都会给我们无 情的返回Failed Dependencies,特别对于那些复杂软件的安装,yum显得是非常方便的。

然而当我们没有连接到Internet,仅仅有CentOS的DVD介质光盘时,仍然可以使用yum来进行软件安装。本文描述了如何在仅仅支持文本模式的CentOS进行X Window安装。

(1) mount CentOS DVD光盘到 /media/cdrom

mount /dev/cdrom /media/cdrom

(2) 给yum指定 /media/cdrom 作为它的软件安装源(移除无法连接的.repo,否则会有Error信息)

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum/repos.d/CentOS-Base.repo.bak

设定 /etc/yum/repos.d/CentOS-Media.repo

[c5-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-beta

注意:确认baseurl中的文件夹位置上有DVD介质源,需要制定RPM-GPG-KEY或者通过 rpm –import RPM-GPG-KEY来引入所有的RPM包的Public Key

(3) 安装 "X Window System" & "GNOME Desktop Environment"

yum –enablerepo=c5-media groupinstall "X Window System"

yum –enablerepo=c5-media groupinstall "GNOME Desktop Environment"

注意:在安装过程有会有提示,输入y即可

(4) 客户端启动XManager Passive模式

(5) 在服务器运行测试应用

xclock -display 192.168.40.1:0.0

如果在XManager的客户端上看到Xclock的窗口就说明,XWindow安装成功了。

CentOS环境下安装Oray的花生壳Linux客户端

在CentOS环境下安装Oray的花生壳客户端的步骤如下:

(1) 下载 phlinux10.tar.zip 文件

(2) 解压缩后,选择 phlinux-1.0-install.redhat.tar.gz 文件进行再次解压缩

(3) 运行安装脚本 source install.sh

(4) 在版本比较高的CentOS,可能出现如下错误,主要原因是stdc++版本库版本过高

/usr/local/phlinux/phlinux: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory

(5) 应该安装兼容版本,在CentOS 5.1 DVD光盘中安装如下文件

rpm -ivh /media/iso/CentOS/compat-libstdc++-33-3.2.3-61.i386.rpm

(6) 重新运行安装脚本 source install.sh

(7) 输入用户名/密码,此时应该可以看到phlinux安装成功

(8) 在/etc/rc.d/init.d/下touch一个phlinux的文件,并chmod +x phlinux,内容如下:

/usr/local/phlinux/phlinux -d

(9) 修改机器名 vi /etc/host; vi /etc/sysconifg/network;

(10) 重新启动

大功告成,:)

linux tar命令 实战详解

tar命令

tar [-cxtzjvfpPN] 文件与目录 ....
参数:
-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
   例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
   『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!
范例:

范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]#
tar -cvf /tmp/etc.tar /etc<==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc<==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc<==打包后,以 bzip2 压缩
# 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。
# 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~
# 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~
# 上述指令在执行的时候,会显示一个警告讯息:
# 『tar: Removing leading `/" from member names』那是关於绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,
# 就得要加上 z 这个参数了!这很重要的!

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,
# 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,
# 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc
# 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!

范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
# 我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,
# 就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!

范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!
[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc
# 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!

范例六:在 /home 当中,比 2005/06/01 新的文件才备份
[root@linux ~]# tar -N "2005/06/01" -zcvf home.tar.gz /home

范例七:我要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~
# 这分别代表 standard output, standard input 与管线命令啦!
# 这部分我们会在 Bash shell 时,再次提到这个指令跟大家再解释啰!


来源:http://www.21andy.com/blog/20060820/389.html

linux tar命令详解

tar命令
tar可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。
语法:tar [主选项+辅选项] 文件或者目录
使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。
主选项:
c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。
t 列出档案文件的内容,查看已经备份了哪些文件。
u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
x 从档案文件中释放文件。
辅助选项:
b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。
f 使用档案文件或设备,这个选项通常是必选的。
k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。




Linux下的压缩文件剖析

对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap。可是Linux就不同了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕:)

  在具体总结各类压缩文件之前呢,首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另它的工具将这一大堆文件先打成一个包,然后再就原来的压缩程序进行压缩。
  Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:
  tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:
  # tar -cf all.tar *.jpg
  这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
  # tar -rf all.tar *.gif
  这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
# tar -uf all.tar logo.gif
  这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

  # tar -tf all.tar
  这条命令是列出all.tar包中所有文件,-t是列出文件的意思
  # tar -xf all.tar
  这条命令是解出all.tar包中所有文件,-t是解开的意思
  以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。
  1) tar调用gzip
  gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:
  # tar -czf all.tar.gz *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz
  # tar -xzf all.tar.gz
  这条命令是将上面产生的包解开。
  2) tar调用bzip2
  bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例说明一下:
  # tar -cjf all.tar.bz2 *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2
  # tar -xjf all.tar.bz2
  这条命令是将上面产生的包解开。
3)tar调用compress

  compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:
  # tar -cZf all.tar.Z *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z
  # tar -xZf all.tar.Z
  这条命令是将上面产生的包解开
  有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:
  1)对于.tar结尾的文件
  tar -xf all.tar
  2)对于.gz结尾的文件
  gzip -d all.gz
  gunzip all.gz
  3)对于.tgz或.tar.gz结尾的文件
  tar -xzf all.tar.gz
  tar -xzf all.tgz
  4)对于.bz2结尾的文件
  bzip2 -d all.bz2
  bunzip2 all.bz2
  5)对于tar.bz2结尾的文件
  tar -xjf all.tar.bz2
  6)对于.Z结尾的文件
  uncompress all.Z
  7)对于.tar.Z结尾的文件
  tar -xZf all.tar.z
  另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:
  1)对于.zip
  linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
  # zip all.zip *.jpg
  这条命令是将所有.jpg的文件压缩成一个zip包

# unzip all.zip
  这条命令是将all.zip中的所有文件解压出来

  2)对于.rar
  要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux
不是免费的;然后安装:
  # tar -xzpvf rarlinux-3.2.0.tar.gz
  # cd rar
  # make
  这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
  # rar a all *.jpg
  这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。
  # unrar e all.rar
  这条命令是将all.rar中的所有文件解压出来
  到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在Linux下解开而烦恼了。而且以上方法对于Unix也基本有效。
  本文介绍了linux下的压缩程式tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、zip、unzip、rar、unrar等程式,以及如何使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行操作。

轻松制作Favicon。非常好用的一个工具!

轻松制作Favicon。非常好用的一个工具!

Favicon的使用已经成为了一种流行,是网站个性的标志。

我们可以使用下面的地址轻松制作Favicon。

http://www.chami.com/html-kit/services/favicon/


调用favicon的方法

   浏览器调用Favicon的原则是首先在网页所在的目录下寻找Favicon.ico文件,如果没有,便到网站的根目录下寻找。

   因此,在网页中使用Favicon最简单的办法便是将制作好的图标文件命名为Favicon.ico,然后将其上传到网站的根目录即可。

   如果您需要将Favicon.ico放到其他目录下,或者希望让不同的网页显示不同的Favicon,就需要在网页Html文件中做设定了,具体设置也很简单,在Html中的<head>部分加入如下的代码:

程序代码

<link rel=”icon” href=”/dir/favicon.ico” mce_href=”/dir/favicon.ico” type=”image/x-icon”>

<link rel=”shortcut icon” href=”/dir/favicon.ico” mce_href=”/dir/favicon.ico” type=”image/x-icon”>

2008年11月3日星期一

什么是 SNS, SNS是什么 ?

SNS是什么?它是Social Networking Service的缩写,译为中文就是社会网络服务的意思。从微软的MSN Spaces和Yahoo的Yahoo! 360°中,我们可以看到SNS最大的特征在于能够让我们建立一个属于私人的可以和朋友在网上交流的天地。

SNS提供给每个用户的是建立自己和朋友在网上交流的服务。而每个用户都有自己的朋友,都可以利用SNS建立自己独特的朋友圈。如此自然就形成了一个庞大 的联系网络,这样提供以兴趣为基础的社群服务也就是顺理成章的事情了。换句话来说,信任是人际关系的基础,而SNS又是建立在人与人彼此了解的基础上,目 的就是让用户通过SNS邀请其他用户组成自己的独立网络社会。

如果以前像内容网站、聊天工具那样的网络服务做的一切是在吸引用户,那么SNS做的正是在“使用”用户,让用户自己来参与构建整个SNS网络社会。

SNS玩的是什么把戏
对于SNS这个新生事物,很多人可能还没有亲自体验,不过从现有的几个SNS网站来看,它们虽然拥有较为全面的功能,但是都只抓取最核心的功能,并且将使 用的难度降到最低。从创建Blog、发布文章、上传相片以及邀请好友,整个操作过程都可以在向导帮助下点击鼠标轻松完成,甚至还可以直接对相片进行一些简 单的后期处理。用户通过这些服务来共享自己的收藏品,邀请其他用户来欣赏、来交流,SNS提供的这一切都能让用户自己来决定,自己来控制共享的范围。

比如MSN Spaces和Yahoo! 360°的Blog、网页相册、媒体分享、IM交流等系列功能都一应俱全,既可以仅仅将它作为一个Blog,也可以把它作为自己的网上相册和音乐分享站。 这些共享的内容,用户都能设置共享的权限,也就是用户能够针对MSN或者Yahoo!上的好友进行单独共享。

国内的SNS即将热起来
Plaxo(http://www.plaxo.com)、FeedBurner(http://www.feedburner.com)等国外SNS的 成功融资会让很多网站开始浮想联翩。在国内,腾讯公司推出的Q-Zone开始提供Blog服务,虽然暂时还没有其它的SNS服务,但是QQ用户忠实度非常 高,在线人数和时长保证了有效的“社会性”。新浪也有很多SNS方面的工具:交友、iAsk、VIVI,而且据说新浪的Blog已经在进行中了,将它们整 合为一个SNS网站并不存在技术方面的制约。同样,搜狐、网易、TOM等等门户网站也都在打算做自己的SNS。

从BBS到QQ类IM软件,都是聚合人气为目的而迅速蹿红,因此我们可以大胆预测SNS的热潮即将到来,今天的网络以新的方式,带给人们新的生活。SNS正在重写网络生活的DNA。SNS is coming,are you ready?

附:
MSN Spaces——http://spaces.msn.com
Yahoo! 360°——http://360.yahoo.com
Google——http://orkut.com

博客归档