2008年12月30日星期二

IE6 重复字符的bug及解决方法

当多个浮动的元素彼此跟随,中间加注释的时候,最后一个浮动元素内的文本偶尔会复制到最下面去。学名Duplicate Characters Bug

程序代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>多了一只猪</title>
</head>
<body>
<div style="width:400px">
<div style="float:left"></div>
<!-- -->
<div style="float:right;width:400px">↓这就是多出来的那只猪</div>
</div>
</body>
</html>


可以通过以下的办法来解决:
   
1、不放置注释。最简单、最快捷的解决方法
   
2、注释不要放置于2个浮动的区块之间。
    
3、将文字区块包含在新的<div></div>之间,如:<div style="float:right;width:400px"><div>↓这就是多出来的那只猪</div>& lt;/div>。
   
4、去除文字区块的固定宽度,与3有相似之处。
   
5、有的人在猪后加一个<br />或者空格,但只是消除现象。
   
6、不要给浮动元素设置多宽度,使其不会到达包含元素的底部,或者对最后一个元素设置margin-right: -3px;或者更小。
   
7、注释可以这样写:<!--[if !IE]>Put your commentary in here...<![endif]-->

2008年12月13日星期六

SEO Analysis

Title Tag Analysis
The maximum number of characters we recommend for this Tag is 60.
Meta Description Tag Analysis
The maximum number of characters we recommend for this Tag is 150.
Meta Keywords Tag Analysis
Our recommended maximum number of characters for this tag is 874.

IMG ALT Tag Analysis
This section is available in the Member's area of our site when using the Web Page Analyzer. Many search engines consider this area when indexing and looking for keywords. Optimizing this area is quite easy when you know what search engines are looking for.
Keyword Density Analysis
This section is available in the Member's area of our site when using the Web Page Analyzer. This is probably one of the most important ranking factors of a Web page and is easily optimized with our Keyword Density Manipulizer™. Not all keyword density tools analyze this properly. In fact, virtually all those we have tested are wrong! Having the right tool is a must. Our tools are developed by full text search engine development engineers. Getting the wrong information can mean complete SEO failure.

Top Keyword Phrase Analysis
This section is available in the Member's area of our site when using the Web Page Analyzer. Two and three word phrases account for more than 55% of searches done using major search engines as published by Rackstat.com. Properly optimizing for this can net you a ton of additional traffic you may be missing out on. Our two and three word phrase analysis reports helps you to identify and capitalize on this easly.

2008年12月12日星期五

Mysql enum & int 使用情况 (mysql没有必要枚举整型)

写程序时如果用到数据库建议向sqlite看齐,sqlite可没有enum.

Enum: 多用于固定不变的一些数据内容
比如:周一,周二,周三,,,,,,周日

Tinyint: 多用于表示状态(0,1,2,3....), 性能上来说不比 enum差.

Enum存取数据内容时是整型数据,也会把数据转为字符串来处理.
Tinyint存取是整型就是整型.


另外:
数据表有字段: Status enum('0','1','2','3') default 0;

update table set `Status`=0; //这时查看数据内容结果 Status='';

如果Status tinyint default 0; //同样操作数据内容就是 Statsus=0;


-------------------------------------------------------------------

mysql没有必要枚举整型

有些人习惯地把一些状态表示为整型,在mysql存储这些整型时,却转化成字符串,存在了枚举型的列中。这是不必要的。因为在mysql存储这

些枚举字符串时是把这样字符串做一个序列(index),然后存储相应的index值,比如

Enum_value index
NULL NULL 如果NULL是被允许的话
'' 0 一切在在插入时,被视为非法值的字符串,插入的都为空
'a' 1
'b' 2
... ...

也就是说,我们在插入值时,是插入的'a','b'等等字符串,但Mysql真正存储是则是右边的index.如果真得左边的ENUM也为整型值,则是不可取的。因为:
If you store a number into an ENUM column, the number is treated as an index, and the value stored is the enumeration member

with that index. (However, this does not work with LOAD DATA, which treats all input as strings.) It's not advisable to

define an ENUM column with enumeration values that look like numbers, because this can easily become confusing. For example,

the following column has enumeration members with string values of '0', '1', and '2', but numeric index values of
1, 2, and 3.

ENUM的最多的个数也证明了这一点。
An enumeration can have a maximum of 65,535 elements.

同时,都知道程序的需求变化很快,尤其是WEB类的脚本程序。ENUM在表示状态时,也会面临着扩展状态所带来困扰。你必须改变表结构新的值被允许存入。

建议:表示状态类的最好用TINYINT。枚举不是不行,但至少它不是最好。

2008年12月10日星期三

Internet Explorer 中的 Cookie 的数字和大小限制

Microsoft Internet Explorer complies with following RFC 2109 recommended minimum limitations:

* 至少 300 Cookie
* 至少为 4096 字节每个 Cookie (如度量由组成 Cookie 非终端 Set-Cookie 标头的语法描述中字符的大小)
* 每个唯一的主机或域名称至少 20 个 Cookie

注意 these recommended minimum limitations appear in RFC 2109,section 6.3,"Implementation Limits"。 有关详细信息,请参见"参考"一节。

每个 Cookie 开头名称-值对。 此对之后通过零或用分号分隔的多个属性-值对。 为一个域名称,每个 Cookie 被限制为 4,096 字节。 这个总数可以作为一个名称-值对的 4 千字节 (KB) 存在或为最多 20 个名称 / 值对的总 4 KB。如果计算机没有足够的空间来存储 Cookie,该 Cookie 将被丢弃。 则不截尾取整。 应用程序应使用尽可能少的 Cookie 可能作为小型和一个 Cookie 尽可能。 此外,应用程序应该能够处理 Cookie 的丢失。

如果 Web 应用程序使用多个 19 自定义 Cookie,ASP 会话状态可能会丢失。 Internet Explorer 4.0 和更高版本允许每个域的 20 个 Cookie 总共。 因为如果您使用 20 个或更多自定义 Cookie ASPSessionID 是一个 Cookie,在浏览器被强制删除 ASPSessionID Cookie 并丢失该会话。

若要存储超过 20 个名称 / 值对域的可以通过连接多达该 Cookie 4,096 字节的限制每个 Cookie 几个名称 / 值对创建 Cookie 字典。当前,以便从客户端脚本中检索这些值,您必须分析 Cookie 手动。 但是,Active Server Pages 请求 和 响应 对象包括内置功能使用 Cookie 词典作为词典对象。 following sample code demonstrates of in ASP page cookie dictionary use:


%
Response.Cookies ("MyCookie")("a")="A"
Response.Cookies ("MyCookie")("b")="B"
Response.Cookies ("MyCookie")("c")="C"
Response.Cookies ("MyCookie")("d")="D"
Response.Cookies ("MyCookie")("e")="E"
Response.Cookies ("MyCookie")("f")="F"
Response.Cookies ("MyCookie")("g")="G"
Response.Cookies ("MyCookie")("h")="H"
Response.Cookies ("MyCookie")("i")="I"
Response.Cookies ("MyCookie")("j")="J"
Response.Cookies ("MyCookie")("k")="K"
Response.Cookies ("MyCookie")("l")="L"
Response.Cookies ("MyCookie")("a1")="A"
Response.Cookies ("MyCookie")("b1")="B"
Response.Cookies ("MyCookie")("c1")="C"
Response.Cookies ("MyCookie")("d1")="D"
Response.Cookies ("MyCookie")("e1")="E"
Response.Cookies ("MyCookie")("f1")="F"
Response.Cookies ("MyCookie")("g1")="G"
Response.Cookies ("MyCookie")("h1")="H"
Response.Cookies ("MyCookie")("i1")="I"
Response.Cookies ("MyCookie")("j1")="J"
Response.Cookies ("MyCookie")("k1")="K"
Response.Cookies ("MyCookie")("l1")="L"

Response.Cookies("MyCookie").Expires = "12/31/2001"


For Each strKey In Request.Cookies
Response.Write strKey & " = " & Request.Cookies(strKey) & "

"
If Request.Cookies(strKey).HasKeys Then
For Each strSubKey In Request.Cookies(strKey)
Response.Write "->" & strKey & "(" & strSubKey & ") = " & _
Request.Cookies(strKey)(strSubKey) & "
"
Next
End If
Next
%


Note In Internet Explorer 5.0 and later,can use userData behavior to across sessions persist data. this behavior has greater than cookies capacity。

如果您使用 document.cookie 属性来检索该 Cookie 在客户端,将 document.cookie 属性可以检索仅 4,096 字节。 这个字节总数可以是 4 KB,一名称 / 值对或它可以是具有总大小为 4 KB 的最多 20 个名称 / 值对。

document.getcookie 函数在 Microsoft HTML 中调用 CDocument::GetCookie 方法。

for more information,click to view in Microsoft Knowledge Base article following article number:
820536 Document.Cookie 属性返回一个空字符串

官方看:http://support.microsoft.com/kb/306070/zh-cn

2008年12月8日星期一

PHP 从m个数中任取n个数的排列组合算法

从m个数中任取n个数的排列组合算法!

$n = array(1,2,3,4,5,6,7,8,9,10);
//$n = array(1,2,3,4);
/**
$n 数据数组
$m 组合串的长度
$s 用于缓存中间量
**/
function permutation($n, $m = 0, $s = ''){
static $results = array();

if($m == 0) {
$results[] = substr($s,1);//如果长度够了则赋值
}else {
for($i=0; $i < count($n); $i++) {
//echo "==$i===>".$s."\n";
permutation($n, $m-1, $s.','.$n[$i]);
}
}
return $results;
}

$t1 = microtime(true);
$rst = permutation($n, 2);
echo microtime(true) - $t1 ."\n";
//print_r($rst);

//////////////////
function combination($params){
foreach($params as $key => $val) {
$tmpArr = explode(',', $val);
if( 1 == count(array_unique($tmpArr))) {
continue;
}
sort($tmpArr);
$results[] = implode(',', $tmpArr);
}
$results = array_unique($results);

return $results;
}

$s = combination($rst);

print_r($s);
//exit;
function getCombinationCount($n, $k) {
//fscanf(STDIN,"%d,%d",$n,$k);
$r = 1;
while($k) $r *= $n--/$k--;
return $r;
}

echo count($s) . "===========" . getCombinationCount(10, 2);


exit;


加添一个快上N倍的算法:

var_dump(c(range(1,5), 2));

function c($ar,$n){
$c = count($ar);
if ($n>$c) return false; // parameter wrong
if ($c>50) return false; // too big array :)

$r = array();

$code = "";
$list = array();
for($i=1;$i<=$n;$i++){
$list[] = '$v'.$i;
$code .= 'foreach($ar as $k'.$i.'=>$v'.$i.'){';
if($i!=$n) $code .= 'unset($ar[$k'.$i.']);';
}
$code .= '$t = array('.join(',',$list).');';
$code .= 'sort($t);';
$code .= '$r[] = join(",",$t);';
for($i=$n-1;$i>0;$i--){
$code .= '}$ar[$k'.$i.']=$v'.$i.';';
}
$code .= '}';
/*
foreach($ar as $k1=>$v1){
unset($ar[$k1]);
foreach($ar as $k2=>$v2){
unset($ar[$k2]);
foreach($ar as $k3=>$v3){
$t = array($v1,$v2,$v3);
sort($t);
$r[] = join(',',$t);
}
$ar[$k2] = $v2;
}
$ar[$k1] = $v1;
}
*/
eval($code);
return array_values(array_unique($r));
}


再提供一下比快 N倍更快十倍的方法:
function array_combination(array $elements, $chosen)
{
$result = array();

for ($i = 0; $i < $chosen; $i++) { $vecm[$i] = $i; }
for ($i = 0; $i < $chosen-1; $i++) { $vecb[$i] = $i; }
$vecb[$chosen - 1] = count($elements) - 1;
$result[] = $vecm;

$mark = $chosen - 1;
while (true) {
if ($mark == 0) {
$vecm[0]++;
$result[] = $vecm;
if ($vecm[0] == $vecb[0]) {
for ($i = 1; $i < $chosen; $i++) {
if ($vecm[$i] < $vecb[$i]) {
$mark = $i;
break;
}
}
if (($i == $chosen) && ($vecm[$chosen - 1] == $vecb[$chosen - 1])) { break; }
}
} else {
$vecm[$mark]++;
$mark--;
for ($i = 0; $i <= $mark; $i++) {
$vecb[$i] = $vecm[$i] = $i;
}
$vecb[$mark] = $vecm[$mark + 1] - 1;
$result[] = $vecm;
}
}

return $result;
}


ini_set('memory_limit', '328M');
$n = 640 ; $m =2; $elements = range(1, $n);
$begin = microtime(TRUE);
$result = array_combination($elements, $m);
$end = microtime(TRUE);
echo "count: ".count($result) . PHP_EOL;
echo "time: ". 1000*($end-$begin) . " ms" . PHP_EOL;

echo '
';
//print_r($result);
echo '
';

/* output result
foreach($result as $indexes) {
foreach ($indexes as $index) {
echo $elements[$index] . "\t";
}

echo PHP_EOL;
}

*/

2008年12月7日星期日

JS 里用正则表达式替换字符串

方法如下:


//参数中的 g 表示全部匹配,i表示忽略大小写
//str='toaction=t23rue';
//str='toaction=t23rue';
str='toactioN=True';
str=str.replace(/toaction=[\w]+/gi,'toaction=false');
alert(str);


举一个使用的下面一个例子:


function addQueryString()
{
// thickbox query string
var tbString = $_('compStart').alt;

if($_('toaction').checked) tbString = tbString.replace(/toaction=[\w]+/gi,'toaction=true');
else tbString = tbString.replace(/toaction=[\w]+/gi,'toaction=false');

if($_('towinner').checked) tbString = tbString.replace(/towinner=[\w]+/gi,'towinner=true');
else tbString = tbString.replace(/towinner=[\w]+/gi,'towinner=false');

$_('compStart').alt=tbString;
}

Javascript 获取链接(url)参数的方法

摘要: 有时我们需要在客户端获取链接参数,一个常见的方法是将链接当做字符串,按照链接的格式分解,然后获取对应的参数值。本文给出的就是这个流程的具体实现方法。

当然,我们也可以用正则直接匹配,文章中也给出了一个正则的例子。

用正则匹配的方式:
Javascript:
<script language="JavaScript">
<!--
function getQueryStringRegExp(name)
{
var reg = new RegExp("(^|\\?|&)"+ name +"=([^&]*)(\\s|&|$)", "i");
if (reg.test('http://localhost/test.html?aa=bb&test=cc+dd&ee=ff')) {
return unescape(RegExp.$2.replace(/\+/g, " "));
}
return '';
};
//http://localhost/test.html?aa=bb&test=cc+dd&ee=ff
alert(getQueryStringRegExp('test'));
//-->
</script>


分解链接的方式:
Javascript:
<script type="text/javascript">
<!--
// 说明:Javascript 获取链接(url)参数的方法
// 整理:http://www.CodeBit.cn

function getQueryString(name)
{
// 如果链接没有参数,或者链接中不存在我们要获取的参数,直接返回空
if(location.href.indexOf("?")==-1 || location.href.indexOf(name+'=')==-1)
{
return '';
}

// 获取链接中参数部分
var queryString = location.href.substring(location.href.indexOf("?")+1);

// 分离参数对 ?key=value&key2=value2
var parameters = queryString.split("&");

var pos, paraName, paraValue;
for(var i=0; i<parameters.length; i++)
{
// 获取等号位置
pos = parameters[i].indexOf('=');
if(pos == -1) { continue; }

// 获取name 和 value
paraName = parameters[i].substring(0, pos);
paraValue = parameters[i].substring(pos + 1);

// 如果查询的name等于当前name,就返回当前值,同时,将链接中的+号还原成空格
if(paraName == name)
{
return unescape(paraValue.replace(/\+/g, " "));
}
}
return '';
};

//http://localhost/test.html?aa=bb&test=cc+dd&ee=ff
alert(getQueryString('test'));
//-->
</script>

jquery 对 checkbox 实现全选效果 (checkbox控制 | button控制)

以下有两种方法:
1. 使用 checkbox 进行控制 全选checkbox
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Jquery click all </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<input type="checkbox" id="checkbox1" name="checkbox1" onClick="clickall(this);" >
<input type="checkbox" id="checkname1" name="checkname[]" value="1"/>1
<input type="checkbox" id="checkname2" name="checkname[]" value="2"/>2


<script type="text/javascript" language="javascript">
function clickall(cb){
if(cb.checked) {
$('input[@name="checkname[]"]').attr('checked',true);
} else {
$('input[@name="checkname[]"]').attr('checked',false);
}
}
</script>
</body>
</html>


2. 使用 Button 进行控制 全选checkbox
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Jquery click all </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<script type="text/javascript">
$(function() {
$("#checkall").click(function() {
$("input[@name='checkname[]']").each(function() {
$(this).attr("checked", true);
});
});
$("#delcheckall").click(function() {
$("input[@name='checkname[]']").each(function() {
$(this).attr("checked", false);
});
});
});
</script>
<input type='checkbox' id='id1' name='checkname[]' value='1' />value1
<input type='checkbox' id='id2' name='checkname[]' value='2' />value2
<input type='checkbox' id='id3' name='checkname[]' value='3' />value3
<input type="button" id="checkall" name="checkall" value="全选" />
<input type="button" id="delcheckall" name="delcheckall" value="取消全选" />
</body>
</html>

在js中声明变量时,什么时候需要var,什么时候不需要?

在js中声明变量时,什么时候需要var,什么时候不需要???

关键问题:
在function内部,用var是局部变量,不用var是全局变量。
这个问题不搞清楚,就不是风格的好坏了,可能会导致功能错误。
在function外,用不用都是全局变量。

理解“JS变量定义”的概念

首先,那种不用var就直接赋值的做法,javascript认为你第一次赋值的同时也就是做了定义。如果你是初学者,我建议不妨将这种做法看作一种不规范用法,你就当它根本不存在,问题就简单了。

var aString;
是纯粹的变量定义(但只能在函数内部用)

var aString = "100";
是变量定义,并同时赋值。在函数外部必须这么用,如果在函数内部,就等效于:
var aString;
aString = "100";

赋值可以无数次,定义只能一次!就好比一个人的性格可以不断改变,但出生只能有一次!

2008年12月4日星期四

apache rewrite Rule 详解

作为RewriteRule指令的第三个参数, Flags是一个包含以逗号分隔的下列标记的列表:

'redirect|R [=code]' (强制重定向 redirect)
以 http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution可以强制性执行一个外部重定向。
如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。
如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可.
另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端.
如, 重写``/~''为 ``/u/'',或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/的前缀,重写操作仍然会继续。通常,你会希望停止重写操作而立即重定向,则还需要使用'L'标记.

'forbidden|F' (强制URL为被禁止的 forbidden)
强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。

'gone|G' (强制URL为已废弃的 gone)
强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。
使用这个标记,可以标明页面已经被废弃而不存在了.

'proxy|P' (强制为代理 proxy)
此标记使替换成分被内部地强制为代理请求,并立即(即, 重写规则处理立即中断)把处理移交给代理模块。
你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。
使用这个标记,可以把某些远程成分映射到本地服务器名称空间,从而增强了ProxyPass指令的功能。
注意: 要使用这个功能,代理模块必须编译在Apache服务器中。如果你不能确定,可以检查``httpd -l''的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能;如果没有,则必须启用mod_proxy并重新编译``httpd''程序。

'last|L' (最后一个规则 last)
立即停止重写操作,并不再应用其他重写规则。
它对应于Perl中的last命令或C语言中的break命令。这个标记可以阻止当前已被重写的URL为其后继的规则所重写。
举例,使用它可以重写根路径的URL('/')为实际存在的URL, 比如, '/e/www/'.

'next|N' (重新执行 next round)
重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。
它对应于Perl中的next命令或C语言中的continue命令。
此标记可以重新开始重写操作,即, 立即回到循环的头部。
但是要小心,不要制造死循环!

'chain|C' (与下一个规则相链接 chained)
此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。
它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配,则其后继的链接的规则会被忽略。
比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除``.www'' (此处不应该出现``.www''的)。

'type|T=MIME-type' (强制MIME类型 type)
强制目标文件的MIME类型为MIME-type。
比如,它可以用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射目录中的所有文件的MIME类型为``application/x-httpd-cgi''.

'nosubreq|NS' (仅用于不对内部子请求进行处理 no internal sub-request)
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。
比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。
对子请求,它不一定有用的,而且如果整个规则集都起作用,它甚至可能会引发错误。
所以,可以用这个标记来排除某些规则。

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理, 而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

'nocase|NC' (忽略大小写 no case)
它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,'A-Z' 和'a-z'没有区别。

'qsappend|QSA' (追加请求串 query string append)
此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。
如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

'noescape|NE' (在输出中不对URI作转义 no URI escaping)
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。
一般情况下,特殊字符(如'%', '$', ';'等)会被转义为等值的十六进制编码。
此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,
如:
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

可以使'/foo/zed'转向到一个安全的请求'/bar?arg=P1=zed'.

'passthrough|PT' (移交给下一个处理器 pass through)
此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。
举一个能说明其含义的例子: 如果要通过mod_rewrite的重写引擎重写/abc为/def,然后通过mod_alias使/def转变为/ghi,可以这样:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi

如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器, 它可以重写uri=/abc/...为filename=/def/..., 但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。
注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记。。 混合使用mod_alias和mod_rewrite就是个典型的例子。

For Apache hackers
如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。
Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。

'skip|S=num' (跳过后继的规则 skip)
此标记强制重写引擎跳过当前匹配规则后继的num个规则。
它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和'chain|C'标记是不同的!)

'env|E=VAR:VAL' (设置环境变量 environment variable)
此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。
此标记可以多次使用以设置多个变量。
这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via ) or CGI (如 $ENV{'VAR'})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。
使用它可以从URL中剥离并记住一些信息。

'cookie|CO=NAME:VAL:domain[:lifetime[:path]]' (设置cookie)
它在客户端浏览器上设置一个cookie。
cookie的名称是NAME,其值是VAL。
domain字段是该cookie的域,比如'.apache.org', 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。
注意
绝不要忘记,在服务器级配置文件中,Pattern是作用于整个URL的。 但是在目录级配置文件中, (一般总是和特定目录名称相同的)目录前缀会在pattern匹配时被自动删除,而又在替换完毕后自动被加上。此特性对很多种重写是必须的,因为,如果没有这个剥离前缀的动作,就必须与其父目录去匹配,而这并不总是可行的。
但是有一个例外: 如果替换串以``http://''开头, 则不会附加目录前缀, 而是强制产生一个外部重定向,或者(如果使用了P标记)是一个代理操作!

注意
为了对目录级配置启用重写引擎,你必须在这些文件中设置``RewriteEngine On'', 并且打开``Options FollowSymLinks'。
如果管理员对用户目录禁用了FollowSymLinks, 则无法使用重写引擎。这个限制是为了安全而设置的。

以下是所有可能的替换组合及其含义:

在服务器级配置中(httpd.conf),对这样一个请求 ``GET /somepath/pathinfo'':


Given Rule Resulting Substitution
---------------------------------------------- ----------------------------------
^/somepath(.*) otherpath$1 not supported, because invalid!
^/somepath(.*) otherpath$1 [R] not supported, because invalid!
^/somepath(.*) otherpath$1 [P] not supported, because invalid!
---------------------------------------------- ----------------------------------
^/somepath(.*) /otherpath$1 /otherpath/pathinfo
^/somepath(.*) /otherpath$1 [R] http://thishost/otherpathvia external redirection
^/somepath(.*) /otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpathvia external redirection
^/somepath(.*) http://thishost/otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfovia external redirection
^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfovia external redirection (the [R] flag is redundant)

^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfovia internal proxy

在/somepath的目录级配置中
(即, 目录/physical/path/to/somepath的.htaccess文件中包含 RewriteBase /somepath)
对这样一个请求``GET /somepath/localpath/pathinfo'':

Given Rule Resulting Substitution
---------------------------------------------- ----------------------------------
^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo
^localpath(.*) otherpath$1 [R] http://thishost/somepath/otherpath/pathinfovia external redirection
^localpath(.*) otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^localpath(.*) /otherpath$1 /otherpath/pathinfo
^localpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfovia external redirection
^localpath(.*) /otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^localpath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfovia external redirection
^localpath(.*) http://thishost/otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^localpath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfovia external redirection
^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfovia external redirection(the [R] flag is redundant)
^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfovia internal proxy


举例:

要重写这种形式的URL:
/ Language /~ Realname /.../ File

/u/ Username /.../ File . Language

可以把这样的对应关系保存在/path/to/file/map.txt映射文件中, 此后,只要在Apache服务器配置文件中增加下列行,即可:

RewriteLog /path/to/file/rewrite.log
RewriteMap real-to-user txt:/path/to/file/map.txt
RewriteRule ^/([^/]+)/~([^/]+)/(.*)$ /u/${real-to-user:$2|nobody}/$3.$1

SEO常用名词

SEO常用名词
与Source Code有关的SEO常用语:
1. Title Tag /Meta Title
<title>Smarter.com Comparison Shopping: Compare Prices, Discounts & Reviews on Millions of Products</title>
2. Meta Description
<Meta NAME="description" content="Shop and save at Smarter.com: Compare prices, coupons and rebates from thousands of online stores to get the lowest price. Before you buy, see products up-close in video reviews. Read shopping blogs, buying guides and unbiased product and website reviews to find out how other consumer's rate their purchases. There are millions of items for sale online. Comparison shop to find the right one for you at the best prices on the Internet." />
3. Meta Keyword
<meta NAME="keywords" content="comparison shopping, compare prices, product reviews, merchant reviews, compare products, shop and compare, best price, purchase and buy online, shop & save, store, shop at home, Smarter.com, site, internet, links, cost, website, consumer information, service" />
4. Other Meta Tag:
<meta content="index,follow" name="robots" />
<META NAME="ROBOTS" CONTENT="NOYDIR">
<META NAME="ROBOTS" CONTENT="NOODP">
<META name="y_key" content="5308ed89f65f99e8" />
<meta content="www.smarter.com" name="copyright" />

5. Meta Tag
Meta Title + Meta Description + Meta Keyword
6. H Tag/Header Tag
<H1>…</H1>, <H2>…</H2> etc.
7. Alt Tag
alt=” ” (适用于图片), title=””(适用于文字链接)
8. List Tag
<ul>, <ol>, <li> and <dl>, <dt>, <dd> etc.
9. Frame Tag
<frame>, <iframe>, <frameset> etc.
10. Nofollow Tag
<a href="/email.php?url=aHR0cDovL3d3dy5zbWFydGVyLmNvbS8=" rel="nofollow" >Email this Page</a>
11. <P> Tag
<p>Monday I came to you with some expiring Dell deals, and if those didn't spark your interest, maybe this HP deal will.</p>

与SEO技术相关的常用语:
SE - 搜索引擎
SERP - 搜索引擎结果页面
Search Engine Ranking/Ranking - 搜索引擎排名
Keyword Density - 关键词密度
Page Rank (简称PR值) - Google衡量网页重要性的工具,测量值范围为从1至10分别表示某网页的重要性。Google工具栏可以随时获得某网页的PR值。
Inbound Link = External Links (外部链接)- 被其他网站链接的数量
Outbound link - 一个网站链接到其他网站的数量
Internal links (内部链接)- 本网站页面之间的链接
Backward Links(反向链接)= Internal Links + External Links - 外部链接与内部链接的总和
Open Directory Project (简称ODP) - 目录索引网站,如Dmoz,Yahoo,Google
Redirection - 跳转,有301,302两种跳转方式
404/Not Found Page
Link Popularity: 链接广度
友情链接/交换链接/Reciprocal Link
One-way Link
Three-way Link
Paid Link
Hidden Link/Text/Content
SPAM = Link Spam + Content Spam - 在SEO领域里,它指的是一种有目的有计划地提高网站在搜索引擎排名的作弊技术,一旦被发现,网站将会被屏弊
Link Spam - 作弊链接/恶意链接(也有称作:link farms 链接工厂)
Keyword Stuffing - 关键词堆砌
Deceptive redirects 欺骗性重定向 - 指把用户访问的第一个页面(争夺排名页)迅速重定向至另一个内容完全不同的页面。
Shadow Domain - 这是最常见的欺骗性重定向技术,通过欺骗性重定向使用户访问另外一个网站或页面。
Doorway Page 门页- 也叫“桥页”。是为某些关键字特别制作的页面,专为搜索引擎设计,目的是提高特定关键词在搜索引擎中的排名所设计的富含目标关键词的域名,且重定向至另一域名的真实网站。搜索引擎的Spiders往往忽略对那些自动重定向到其它页的页面的检索。
Spider = Robot = Bot = Slurp – 搜索引擎爬虫
Mirror Sites/Duplicate Sites (镜象站点) - 通过复制网站的内容并分配以不同域名和服务器,以此欺骗搜索引擎对同一站点或同一页面进行多次索引。现在大多数搜索引擎都提供有能够检测镜象站点的适当的过滤系统,一旦发觉镜象站点,则原站点和镜象站点都会被从索引数据库中删除。
Duplicate Content - 複製的內容通常指的是一個頁面上的內容是從網上別的地方COPY來的,不努力工作 就想得到好排名。GOOGLE有一套很出名的過濾機制去尋找複製文本,一旦它發現兩個或更多同樣的文本它就會評估這些文檔去看哪一個是他們收錄時間最長 的,最新的網頁會被刪除或排在比較靠後的結果中。

一个强大的屏幕捕捉程序


一个强大的屏幕捕捉程序,不仅能捕捉 Windows 下的屏幕,也能捕捉 DOS 的。存盘支持的图形格式也很多。SnagIt对于系统并不会要求太高,凡Windows 98/95/NT 皆可使用,而且只要有 Windows 支持的打印机,就可以设定打印机输出,若有设定 32 位的 MAPI,还可以以电子邮件方式来输出。

sn:DBMLC-FCB3V-A33GA-JDCYY-ZB387


下载地址:http://www.chinaz.cn/soft/9620.htm

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>";
?>

博客归档