存档

2010年8月 的存档

mod_cband中文手册[转]

2010年8月26日 wenhui 没有评论

mod_cband- 一个Apache HTTP Server Version 2下的针对每用户、每虚拟主机和每一目的的带宽控制模块

1. 各种指令中可以使用的单位:

* 传输速度限制单位:
o kbps, Mbps, Gbps- 每秒传输的比特数, 分别为: 1024,1024*1024 和 1024*1024*1024 bps
o kb/s , MB/s, Gb/s-每秒传输的字节数, 分别为: 1024,1024*1024 和 1024*1024*1024 b/s
o 默认单位是kbps

* 传输容量限额单位:
o K,M,G- 分别为: 1000,1000*1000 和 1000*1000*1000 字节
o Ki,Mi,Gi – 分别为: 1024,1024*1024 和 1024*1024*1024 字节
o 默认单位是K

* 时间限额单位:
o S , M , H , D, W- 秒,分钟,小时,天,周; 分别为: 1,60,3600,86400,604800 秒
o 默认单位是秒

2. 指令详解

指令名称:CBandDefaultExceededURL
描 述:指定当mod_cband侦测到发生虚拟主机或用用传输超限发生成,将把所有客户发起的请求重定向到的网址

注 意: 如果你没有指定要跳转的URL,则发送标准 503:Service Unavailable出
错信息
配置位置: Server config
语 法: CBandDefaultExceededURL URL

指令名称:CBandDefaultExceededCode
描 述:当超限发生时,发给用户的http错误码
配置位置:Server config
语 法:CBandDefaultExceededCode HTTP_CODE
例 子:CBandDefaultExceededCode 509

指令名称:CBandScoreFlushPeriod
描 述:为虚拟主机或用户设定一个请求数阀值,在达到阀值时将把请求数写到scoreboard文件中。 使用这个参数将有助于提高mod_cband的性能。
默 认 值:1
配置位置:Server config
语 法:CBandScoreFlushPeriod number_of_requests(请求数)
例 子:CBandScoreFlushPeriod 100
任意虚拟主机或用户,在达到指定的请求数之后,将被记入scoreboard

阅读全文…

nginx的二级域名匹配

2010年8月26日 wenhui 1 条评论

整了一个域名,涉及到将二级域名为数字的转到特定的目录下,这里用nginx的匹配$host来实现
下面是一个简单的配置,请看

#绑定域名
server_name *.abcd.com;
#匹配你的二级域名
if ( $host ~* (.*)\.yourdomain\.com)
{
   set $domain $1;
}
#定义目录
root  html/abc/$domain/;
location /
{
    root  html/abcd/$domain;
    index index.html index.php;
}
分类: nginx, 挨踢 标签:

让nginx的expires和防盗链都有效,应对nginx图片防盗链没用的情况!

2010年8月25日 wenhui 没有评论

注:在Nginx下,expires和防盗链(valid_referers)一起用的时候,会出现防盗链失效的情况!其详细状况如下:

expires有效,防盗链失效

location ~* ^.+\.(jpg|jpeg|gif|png|css|js|swf)$ {
access_log off;
root /opt/htdocs/career;
expires 1h;
#break;
}
location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip)$ {
valid_referers none blocked *.c1gstudio.com;
if ($invalid_referer) {
rewrite ^/ http://leech.c1gstudio.com/leech.gif;
return 412;
}
}

只有js和css的expire有效,防盗链有效

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip)$ {
valid_referers none blocked *.c1gstudio.com;
if ($invalid_referer) {
rewrite ^/ http://leech.c1gstudio.com/leech.gif;
return 412;
}
}
location ~* ^.+\.(jpg|jpeg|gif|png|css|js|swf)$ {
access_log off;
root /opt/htdocs/career;
expires 1h;
#break;
}

让expire和防盗链都有效

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.c1gstudio.com;
if ($invalid_referer) {
rewrite ^/ http://leech.c1gstudio.com/leech.gif;
return 412;
}
access_log off;
root /opt/htdocs/career;
expires 1h;
break;
}

PHP获取搜索引擎关键字的算法

2010年8月25日 wenhui 没有评论

下面的代码是PHP的

<?php
$q='http://www.baidu.com/s?wd=%E9%80%9A%E8%BF%87%E7%9C%8B%E6%89%8B%E7%9B%B8%E4%B8%8E%E5%A5%B3%E7%94%9F%E8%BF%9B%E8%A1%8C%E8%BA%AB%E4%BD%93%E6%8E%A5%E8%A7%A6&ie=utf-8 ';
//$_SERVER['HTTP_REFERER']
//根据url取得utf-8关键词
function searchword($form){
    global $url;//本站域名
    if(empty($form)||strpos($form,$url)===false){return null;}
    list($enginer,$keys)=explode('?',trim($form));
    $is_utf8=false;
    parse_str($keys,$query);
    if(strpos($enginer,'baidu')!=false){
        $Keyword= $query["wd"]?$query["wd"]:$query["word"];
        $is_utf8=($query["ie"]=='utf-8')?true:false;
    }elseif(strpos($enginer,'google')!=false){
        $Keyword= $query["q"];
        $is_utf8=($query["ie"]=='gb2312'||$query["ie"]=='gb')?false:true;
    }elseif(strpos($enginer,'soso')!=false){
        $Keyword= $query["w"];
        $is_utf8=false;
    }elseif(strpos($enginer,'sogou')!=false){
        $Keyword= $query["query"];
        $is_utf8=false;
    }elseif(strpos($enginer,'youdao')!=false){
        $Keyword= $query["q"];
        $is_utf8=(strtolower($query["ue"])=='gb2312')?false:true;
    }elseif(strpos($enginer,'bing')!=false){
        $Keyword= $query["q"];
        $is_utf8=true;
    }else{
         $Keyword=null;
    }
    return urldecode($is_utf8?$Keyword:iconv("gb2312","utf-8",$Keyword));
}
echo searchword($q);
?>
分类: PHP, 脚本 标签: ,

DotDeb的GPG key现在变了,大家请注意更新

2010年8月24日 wenhui 没有评论

dotdeb制做的新版php53和mysql5很受广大系统管理员的厚爱,现在它们的GPG key更改了,原来的失效了 ,因此请大家勿必要更新

gpg –keyserver keys.gnupg.net –recv-key 89DF5277
gpg -a –export 89DF5277 | sudo apt-key add -

分类: linux, 系统 标签:

通往GTD的一百步

2010年8月20日 wenhui 没有评论

来源:http://www.lifebang.com/archives/322

Duff @ Zaadz列举了GTD从入门到大师可以做的一百件事情,每个月照着这张表数一数,争取能达到90以上!

    初段

  1. 我已经从头到尾读完了Getting Things Done这本书。
  2. 我随身携带日程表。
  3. 我只用日程表记录约会和有固定日期的活动。
  4. 我有一个真的收件箱(不是电子版)而且每天都用。
  5. 我有一个电子邮箱,按照我所希望的方式设置妥当。
  6. 我有一个语音信箱,按照我所希望的方式设置妥当。
  7. 我有办法随时记录自己的想法,无论用笔记本、电脑还是录音笔。
  8. 我在合适的地方和场合保存有“下一步活动”列表。
  9. 我有一个主要项目列表。
  10. 我听过GTD语音读物。
  11. 我记录“待处理”事件列表。
  12. 我有一个借出借入清单。
  13. 在我的电脑上有一个专门存放下载文件的目录。
  14. 我有一个轻松快捷的提醒文件或者方法。
  15. 我有一个轻松快捷地使用纸笔记录的方式,比如使用自动标签条。
  16. 在我的“下一步活动”列表中都是可执行的活动,没有仍然包含多个步骤的项目。
  17. 我每周都做计划回顾。
  18. 我维护一个“以后也许会做的事情”的清单,并且定期审阅、修改。
  19. 我有一个固定的办公空间。
  20. 我有所有需要的办公用品。
  21. 如果需要,我有一个移动办公空间。
  22. 我的电脑文件以最高效率的方式安排妥当。
  23. 我每周参加一个以GTD方法为中心的高效小组的活动。
  24. 在我头六个月实施GTD的过程中,每天晚上以“我如何去做”为题写GTD日记。
  25. 我每周和每月回顾GTD日记,掌握自己的进步。
  26. 中级

  27. 我已经坚持实施GTD3到6个月。
  28. 我已经读了两遍Getting Things Done
  29. 我已经听了很多遍Getting Things Done的有声读物,已经耳熟能详。
  30. 我总是让“待做事项”有始有终。
  31. 我总是保持“借出/借入”清单有借有还。
  32. 我总是保证电子邮件收件箱在每天下午五点以前被处理完。
  33. 我总是保证下午五点前处理完桌子上的收件箱。
  34. 我总是在下午五点前处理完语音留言。
  35. 我总是每天处理完我的电脑里的收件箱目录。
  36. 我总是在每天五点前处理完各种收件箱系统。
  37. 我坚持在固定时间完成每周总结。
  38. 我没有在任何地方毫无头绪的堆放没有整理过文件资料。
  39. 在我的提示系统或者日程表中安排每年有几天专门清理文件。
  40. 如果有对人生不同层次的各种目标,在我的提示系统或者日程表中每季度安排几天总结这些目标。
  41. 至少每周反省一下自己对人生的更高目标,比如在每天早上,激励自己。
  42. 每周定期审阅更新自己的主要项目列表。
  43. 早上为一天做准备工作,晚上做回顾。
  44. 熟悉主流GTD在线工具,以及它们的优缺点。
  45. 我找到了适合我,并每日使用的GTD系统,无论是在线系统还是纸笔。
  46. 清理我的收件箱时,我会从头处理到尾,而不是突然去做其中某项看上去很容易的。
  47. 我熟悉脑图的使用,能够使用软件或者纸笔在合适的时候做脑图。
  48. 我了解五个自然计划模式的步骤,使用它们来指导个人计划和安排会议。
  49. 我了解评价每日工作优先级的三重模型,并且按照这种方式安排工作,或者我找到了更好的方法。
  50. 我了解选择行动的四条准则,并且按照这种方式工作,或者找到了更好的方法。
  51. 我尝试过GTDGmail等高效的email软件,或者找到了更好的适合我的方法。
  52. 高级

  53. 我已经坚持使用GTD系统超过六个月。
  54. 我订阅了GTD Connect并听过其中很多内容。
  55. 我听过43folders关于David Allen的podcast
  56. 我成功帮助三个人实施GTD方法。
  57. 我阅读过David Allen的其它关于个人效率的书籍。
  58. 我在每天1/4到1/2的工作时间中已经达到行云流水的工作状态。
  59. 如果能在我的系统中记录的东西,我从不把它们装在脑子里。每天我都会记录下我的想法、下一步要做的事情和项目。
  60. 我已经读烂了Getting Things Done,上面满是我的笔记。
  61. 要回的电话我都会24小时内回复,从不遗忘。
  62. 要回的信件也都会在24小时内回复。
  63. 如果我在收件箱里放入什么东西,我确信自己总会搞定它,或者我心安理得的知道为什么还没有做完。
  64. 如果我答应别人做什么事情,我一定完全相信自己会去做,否则我会及时告诉别人我做不了。
  65. 对需要我操心的各种事情和工作不再有低层次水平的焦虑感。
  66. 心止如水,我不需要的东西我从不看第二眼。
  67. 我的文件系统总是得到实时更新。
  68. 我是我所认识的人中最有条理的。
  69. 我从没有搞砸任何一项工作。
  70. 我已经记不得上次无法按照自己的GTD系统工作是什么时候了。
  71. 我看到别人搞砸自己的工作就不爽,因为我已经无法理解他们怎么会那样。
  72. 我从有4年GTD成功经验的人那里得到指导。
  73. 我了解GTD系统的优缺点,因为我已经开始研究其它的效率系统。
  74. 我的系统已经变成习惯,不再需要勉强自己执行。
  75. 我清楚看到自己的每日工作是如何让自己达到人生的一个个高度的。
  76. 我感到自己如此的高效和清醒,以至于我的创造力前所未有的爆发,并且我有办法抓住它们,将它们实现,只要我愿意。
  77. 我会坚定的说“不”,因为我总是清楚自己该做什么,什么对自己来说最重要。
  78. 大师

  79. 我已经坚持使用GTD系统达一年之久。
  80. 我的系统已经超稳定运行达六个月之久。
  81. 我的系统已经经过数次升级,为提高效率更换过工具,以适合我的生活方式。
  82. 我已经成功指导过10个人实施GTD系统,最久的超过六个月。
  83. 我轻易就可以做到提前10分钟赴约,并且做好准备,头脑清醒。
  84. 我在工作中总是处于一种行云流水的状态。
  85. 我从不用咖啡或者糖来刺激自己。我已经形成一种自激励。
  86. 除非万不得已,我不和做事没条理的人一起工作。
  87. 我是众所周知的说到做到的人。
  88. 我按照一个明智的计划锻炼身体,促进自己的健康、力量、心肺功能、灵活性和健壮。
  89. 我每天定时早起,然后轻松自如的进入GTD状态。
  90. 我定期做心灵训练。
  91. 我有一个个人事业成长的读书列表,定期完成。
  92. 我经常尝试新的效率工具,但只在最需要的时候,不是为了尝试而尝试。
  93. 当我承诺要做什么事,那件事就算完成了,无论要花多少精力,有多麻烦。
  94. 项目计划和脑图对我来说就象呼吸一样自然。
  95. 我把很多日常杂事分配给别人或者自动化,以至于不需要在亲自去完成。
  96. 我周围都是和我一样高效的人。
  97. 我有几个比我更高效的导师,并经常去拜访他们。
  98. 我的生活空间就象一个禅师宗庙,每件事有始有终。
  99. 我都办公室可以让人专注凝神半个。人们常常说在我的桌旁坐着感到多么的平和。
  100. 如果我愿意,我可以靠教别人怎么高效生活为生。实际上我还没有提,已经有人这么要求我了。
  101. 我可以自己写一本关于效率的书。或者我已经写了。
  102. 我总是比自己预料的更早的时候达到自己的目标。
  103. 工作和生活,其乐无穷。
分类: GTD, 生活 标签:

使用ssh-keygen,实现免密码登陆linux[转]

2010年8月19日 wenhui 没有评论

来源:http://baiqiuyi.com/linux/ssh-sshkeygen-linux.html

1.本机创建ssh密钥

debian:~# ssh-keygen

2        拷贝密钥到“被登陆机”输入密码,

debian:~/.ssh#scp id_rsa.pub 192.168.0.7:~/.ssh/

3        ssh到“被登陆机”把密钥改成 “authorized_keys”

debian:~/.ssh# mv id_rsa.pub authorized_keys

4       ssh 192.168.0.7 这样就实现无密码登陆

分类: linux, 系统 标签:

Debian上rsync的用法[转]

2010年8月19日 wenhui 没有评论

来源:http://baiqiuyi.com/linux/debian-rsync.html
胖子注:这里的同步是指备份服务器主动获取被备份服务器的数据
晕了,怎么还有朋友来信问rsync的用法..都写了3篇文章关于rsync啦。
首先安装rsync…

debian:# aptitude install rsync

然后执行rsync的命令…

rsync -zvrtopg -e ssh –delete root@192.168.0.8:/var/log/ /root/0.8/

如果ssh不是默认端口的话,-e ’ssh -p 端口号’ 在使用rsync备份这篇文章讲过怎么用rsync来同步,还有当rsync遇到非默认端口的ssh说过rsync非ssh默认端口的用法。
在上面的例子中,rsync是命令, -e ssh是指用ssh的协议,root是用户名,ip就是被同步的机器,/var/log/是远程服务器的路径,/root/0.8/这个文件夹是备份机的路径。

-v :详细模式输出。
-z :对备份的文件在传输时进行压缩处理。
-r :对子目录异地归模式处理。

-t :保持文件的时间信息。
-o :保持文件的属主信息。
-p :保持文件的权限。
-g :保持文件的属组信息。
–delete :在本地删除服务器上没有的文件,保持备份机和服务器的真正同步。

分类: 挨踢 标签: ,

ExtJS Grid 获得选中项数据[转]

2010年8月18日 wenhui 没有评论

来源:http://hi.baidu.com/bluelotus7/blog/item/e0e36e039687c880d43f7c8c.html

Grid的数据源是store,我们有时需要做点击某一个项而触发一定的事件,在这个处理过程中,我们不免需要得到点击的那个项,如何获得相应的数据呢?

首先,来看看怎么写触发事件。假设变量_grid就是一个GridPanel的句柄(或者说引用),我们要对实现双击GridPanel中的某一项时触发一个event。那么我们只需要

_grid.addListener(‘celldblclick’,function(grid, rowIndex, columnIndex, e){
//Todo Something here
});

function中的4个参数的含义,我们来参看下文档。
celldblclick : ( Grid this, Number rowIndex, Number columnIndex, Ext.EventObject e )
Fires when a cell is double clicked
(如果你希望是单击,可以把celldblclick换成cellclick)
我们已经可以得到点击的那个项所对应的列索引和行索引,接下来要做的就是靠这两个重要的索引去帮助找出你想要的数据。我们假设,记录(Record)的field为['pid','name','gender','birthday'].
那么我们先获得Store,使用GridPanel的getStore()方法。
方法原型是:getStore() : DataSource ,这里的DataSource其实就是Ext.data.Store.
然后我们使用getAt( Number index ) : Ext.data.Record方法去得到点击触发事件的那个记录(Record),
得到了Record后怎么办呢?注意哦,这里的Record的用法并不是像Json那样直接用属性去取值的。
而是需要使用方法get( String name ) : Object
这时,虽然返回的是Object,其实就已经是String了,可以直接alert或者做其他的处理。

_grid.addListener(‘celldblclick’,function(grid, rowIndex, columnIndex, e){
var s=grid.getStore();
var x=s.getAt(rowIndex);
alert(x.get(‘pid’));
});

分类: Extjs, 脚本 标签: ,

PHP实现多服务器session共享之memcache共享[转]

2010年8月13日 wenhui 没有评论

作/译者:叶金荣(Email:imysql@imysql.cn ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。

本文是 PHP实现多服务器session共享之NFS共享的延续,不过这次,我采用memcache来存储session了,memcache的安装请看这里: 搭建高效、可靠、稳定的WEB服务器 — 二、) 安装MySQL、memcache。
接下来,再自定义一套session处理机制,关于session的实现方法我就不再多讲,直接贴程序了。

connect(MEMCACHE_HOST , MEMCACHE_PORT))
{
die(‘Fatal Error: Can not connect to memcache host ‘. MEMCACHE_HOST .’:’. MEMCACHE_PORT);
}

return TRUE;
}
// }}}

/** {{{ sessOpen($pSavePath, $name)
*
* @param String $pSavePath
* @param String $pSessName
*
* @return Bool TRUE/FALSE
*/
public function sessOpen($pSavePath = ”, $pSessName = ”)
{
self::$mSessSavePath = $pSavePath;
self::$mSessName = $pSessName;

return TRUE;
}
// }}}

/** {{{ sessClose()
*
* @param NULL
*
* @return Bool TRUE/FALSE
*/
public function sessClose()
{
return TRUE;
}
// }}}

/** {{{ sessRead($wSessId)
*
* @param String $wSessId
*
* @return Bool TRUE/FALSE
*/
public function sessRead($wSessId = ”)
{
$wData = self::$mMemcacheObj->get($wSessId);

//先读数据,如果没有,就初始化一个
if (!empty($wData))
{
return $wData;
}
else
{
//初始化一条空记录
$ret = self::$mMemcacheObj->set($wSessId, ”, 0, SESS_LIFTTIME);

if (TRUE != $ret)
{
die(“Fatal Error: Session ID $wSessId init failed!”);

return FALSE;
}

return TRUE;
}
}
// }}}

/** {{{ sessWrite($wSessId, $wData)
*
* @param String $wSessId
* @param String $wData
*
* @return Bool TRUE/FALSE
*/
public function sessWrite($wSessId = ”, $wData = ”)
{
$ret = self::$mMemcacheObj->replace($wSessId, $wData, 0, SESS_LIFTTIME);

if (TRUE != $ret)
{
die(“Fatal Error: SessionID $wSessId Save data failed!”);

return FALSE;
}

return TRUE;
}
// }}}

/** {{{ sessDestroy($wSessId)
*
* @param String $wSessId
*
* @return Bool TRUE/FALSE
*/
public function sessDestroy($wSessId = ”)
{
self::sessWrite($wSessId);

return FALSE;
}
// }}}

/** {{{ sessGc()
*
* @param NULL
*
* @return Bool TRUE/FALSE
*/
public function sessGc()
{
//无需额外回收,memcache有自己的过期回收机制

return TRUE;
}
// }}}

/** {{{ initSess()
*
* @param NULL
*
* @return Bool TRUE/FALSE
*/
public function initSess()
{
$domain = ‘.imysql.cn’;

//不使用 GET/POST 变量方式
ini_set(‘session.use_trans_sid’, 0);

//设置垃圾回收最大生存时间
ini_set(‘session.gc_maxlifetime’, SESS_LIFTTIME);

//使用 COOKIE 保存 SESSION ID 的方式
ini_set(‘session.use_cookies’, 1);
ini_set(‘session.cookie_path’, ‘/’);

//多主机共享保存 SESSION ID 的 COOKIE
ini_set(‘session.cookie_domain’, $domain);

//将 session.save_handler 设置为 user,而不是默认的 files
session_module_name(‘user’);

//定义 SESSION 各项操作所对应的方法名:
session_set_save_handler(
array(‘MemacheSession’, ‘sessOpen’), //对应于静态方法 My_Sess::open(),下同。
array(‘MemacheSession’, ‘sessClose’),
array(‘MemacheSession’, ‘sessRead’),
array(‘MemacheSession’, ‘sessWrite’),
array(‘MemacheSession’, ‘sessDestroy’),
array(‘MemacheSession’, ‘sessGc’)
);

session_start();

return TRUE;
}
// }}}

}//end class

}//end define

$memSess = new MemacheSession;
$memSess->initSess();
?>

然后,在项目程序的头文件中直接包含 MemacheSession.inc.php 即可,并且以前的程序不用做任何改动。

特别感谢:黑夜路人 的 实现基于Memcache存储的Session类。

备注:memcache PECL 未来版本中,可以直接设置 php.ini 来这定自己的 session.save_handler,大致如下:

session.save_handler = memcache
session.save_path = “tcp://host:port?persistent=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2″

分类: PHP, 脚本 标签: ,