服务器上共享了一部连载漫画,刚开始发现迅雷的盗链下载很厉害,就用 .htaccess 屏蔽了迅雷下载。而后来下载的人越来越多,其它多线程下载软件的威力也不容小视,Apache 平均每秒钟就要新开 3 个线程,遇到集群下载,还真有点吃不消。
平时,服务器上50来个进程在运行,耗内存480M左右;
下载集中的时候,服务器上300多个进程在运行(绝大多数是httpd),内存最高消耗1.5G,到达当前VPS允许使用的最大内存。
看来不对多线程下载进行限制是不行了,好在这个问题在 Apache 下解决起来并不是难事。不想重新编译 httpd,就用 DSO 模式安装非官方mod_limitipconn:
wget http://dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2
tar xjvf mod_limitipconn-0.23.tar.bz2
cd mod_limitipconn-0.23
make
make install
这里安装的版本是适合 Apache 2.2.X 的,理论上也可以用在 Apache 2.0.X 上,如果更老的 Apache 1.3,自己去看吧….mod_limitipconn.c。
安装好后需要编辑 httpd.conf :
vim /usr/local/apache/conf/httpd.conf
找到 ExtendedStatus On 这行,如果前面有 # 号注解,就删除 #。
再搜索 mod_limitipconn.so 找到这行:
LoadModule limitipconn_module modules/mod_limitipconn.so
上面这行应该是在安装的过程中自动添加到 httpd.conf 里面的,保留,把如下内容添加到它的下面:
<IfModule mod_limitipconn.c>
<Location /Velvet_Kiss>
MaxConnPerIP 2
</Location>
</IfModule>
保存 httpd.conf 退出,重启Apache,就可以去测试效果了。
<Location /Velvet_Kiss>的意思是,Apache 只会限制 Velvet_Kiss 目录下同 IP 的链接数。比如,如果还有一个目录叫 /download,那么用户只能开 2 个线程下载 /Velvet_Kiss 目录下的文件,却可以开多线程下载 /download 目录下的文件。Linux 下 Apache 的目录结构通常是这样的,/home/user1/public_html/xxxx,设置限制多线程下载目录的时候,我们只需要 /xxxx 就可以了,不需要绝对路径。<Location />是对全站进行限制。
MaxConnPerIP 2 的意思自然是同 IP 下最多只能开启两个线程下载,其余的线程将遭遇“Service Temporarily Unavailable”。
Apache限制多线程下载的一些扩展命令:
NoIPLimit img/*
#表示对 img 文件夹不进行限制
OnlyIPLimit audio/mpeg video
#仅对声音/视屏等多媒体文件进行限制下载
来源:http://www.onepx.com/apache-limit-downloads.html
平时,服务器上50来个进程在运行,耗内存480M左右;
下载集中的时候,服务器上300多个进程在运行(绝大多数是httpd),内存最高消耗1.5G,到达当前VPS允许使用的最大内存。
看来不对多线程下载进行限制是不行了,好在这个问题在 Apache 下解决起来并不是难事。不想重新编译 httpd,就用 DSO 模式安装非官方mod_limitipconn:
wget http://dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2
tar xjvf mod_limitipconn-0.23.tar.bz2
cd mod_limitipconn-0.23
make
make install
这里安装的版本是适合 Apache 2.2.X 的,理论上也可以用在 Apache 2.0.X 上,如果更老的 Apache 1.3,自己去看吧….mod_limitipconn.c。
安装好后需要编辑 httpd.conf :
vim /usr/local/apache/conf/httpd.conf
找到 ExtendedStatus On 这行,如果前面有 # 号注解,就删除 #。
再搜索 mod_limitipconn.so 找到这行:
LoadModule limitipconn_module modules/mod_limitipconn.so
上面这行应该是在安装的过程中自动添加到 httpd.conf 里面的,保留,把如下内容添加到它的下面:
<IfModule mod_limitipconn.c>
<Location /Velvet_Kiss>
MaxConnPerIP 2
</Location>
</IfModule>
保存 httpd.conf 退出,重启Apache,就可以去测试效果了。
<Location /Velvet_Kiss>的意思是,Apache 只会限制 Velvet_Kiss 目录下同 IP 的链接数。比如,如果还有一个目录叫 /download,那么用户只能开 2 个线程下载 /Velvet_Kiss 目录下的文件,却可以开多线程下载 /download 目录下的文件。Linux 下 Apache 的目录结构通常是这样的,/home/user1/public_html/xxxx,设置限制多线程下载目录的时候,我们只需要 /xxxx 就可以了,不需要绝对路径。<Location />是对全站进行限制。
MaxConnPerIP 2 的意思自然是同 IP 下最多只能开启两个线程下载,其余的线程将遭遇“Service Temporarily Unavailable”。
Apache限制多线程下载的一些扩展命令:
NoIPLimit img/*
#表示对 img 文件夹不进行限制
OnlyIPLimit audio/mpeg video
#仅对声音/视屏等多媒体文件进行限制下载
来源:http://www.onepx.com/apache-limit-downloads.html
话说某日有见54chen真人秀,在六体膜拜之后,鉴于之前也有看过REST的一些东东,于是便有了本文,正文如下:
REST(Representational State Transfer表述性状态转移)是一种体系架构,它为客户端和服务器之间的数据交互提供了指导。它将客户/服务器通信这种计算模型抽象到了Web层面。
REST最早是在Roy Thomas Fielding博士的博士论文中提出的,REST是一种针对网络应用的设计和开发方式,是一种风格,可以降低开发的复杂性,提高系统的可伸缩性。
REST强调如下的体系架构概念。
1、网络上的所有事物都被抽象为资源(resource);
2、每个资源对应一个唯一的资源标识(resource identifier),
3、通过通用的连接器接口(generic connector interface)对资源进行操作;
4、对资源的各种操作不会改变资源标识;
5、所有的操作都是无状态的(stateless)。
REST对于信息的核心抽象是资源,一个资源是一组实体的概念上的映射,而REST使用一个资源标识符来标识组件之间交互所涉及到的特定资源。REST连接器提供了访问和操作资源的值集合的一个通用接口。在这里所有的操作中,它们都是无状态的,这样就不必在多个请求之间保存状态,不必考虑上下文的约束,从而允许服务器组件迅速释放资源,并进一步简化其实现,从而提高系统的可伸缩性。
现在我们就一个简单的示例演示下REST。
在我们的示例中以Javascript为客户端,与HTTP服务器体系架构配合工作,使用URL作为资源标识,并将HTTP作为连接器接口。
客户端的代码:
如上所示,我们在客户端创建XMLHttpRequest对象,并且通过这个对象实现通过HTTP对服务器的操作GET、PUT、POST和DELETE以检索和修改资源。HTTP则把对每一个资源的操作都限制在了4个之内:GET、POST、PUT和DELETE。HTTP的这四个方法分别对应我们常见的CRUD操作,具体对应关系如下 :
C(Create) <==> POST
R(Read/Retrieve) <==> GET
U(Update) <==> PUT
D(Delete/Destroy) <==> DELETE
虽然HTTP提供了这4个方法,但是在某些情况下,PUT和DELETE方法是不可用的,于是我们在这里使用GET方法和POST方法进行替代。另外,在JS操作时,需要注意同源策略(Same Origin Policy,SOP),考虑跨域的问题。
服务端代码:
来源:http://www.phppan.com/2010/10/ajax-rest/
REST(Representational State Transfer表述性状态转移)是一种体系架构,它为客户端和服务器之间的数据交互提供了指导。它将客户/服务器通信这种计算模型抽象到了Web层面。
REST最早是在Roy Thomas Fielding博士的博士论文中提出的,REST是一种针对网络应用的设计和开发方式,是一种风格,可以降低开发的复杂性,提高系统的可伸缩性。
REST强调如下的体系架构概念。
1、网络上的所有事物都被抽象为资源(resource);
2、每个资源对应一个唯一的资源标识(resource identifier),
3、通过通用的连接器接口(generic connector interface)对资源进行操作;
4、对资源的各种操作不会改变资源标识;
5、所有的操作都是无状态的(stateless)。
REST对于信息的核心抽象是资源,一个资源是一组实体的概念上的映射,而REST使用一个资源标识符来标识组件之间交互所涉及到的特定资源。REST连接器提供了访问和操作资源的值集合的一个通用接口。在这里所有的操作中,它们都是无状态的,这样就不必在多个请求之间保存状态,不必考虑上下文的约束,从而允许服务器组件迅速释放资源,并进一步简化其实现,从而提高系统的可伸缩性。
现在我们就一个简单的示例演示下REST。
在我们的示例中以Javascript为客户端,与HTTP服务器体系架构配合工作,使用URL作为资源标识,并将HTTP作为连接器接口。
客户端的代码:
function rest() {
var XMLHttpFactories = [
function () {return new XMLHttpRequest()},
function () {return new ActiveXObject("Msxml2.XMLHTTP")},
function () {return new ActiveXObject("Msxml3.XMLHTTP")},
function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];
var xmlhttp = false;
for (var i = 0; i < XMLHttpFactories.length; i++) {
try {
xmlhttp = XMLHttpFactories[i]();
} catch (e) {
continue;
}
break;
}
// 建立XMLHttpRequest对象
this.xmlhttp = xmlhttp;
}
rest.prototype._get = function(url, data) {
var xmlhttp = this.xmlhttp;
xmlhttp.open ('GET', url + "&" + data, false);
xmlhttp.send (null);
return xmlhttp.responseText;
};
rest.prototype._post = function(url, data) {
var xmlhttp = this.xmlhttp;
xmlhttp.open ('POST', url, false);
xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xmlhttp.setRequestHeader ("Content-Length", data.length);
xmlhttp.send (data);
return xmlhttp.responseText;
};
rest.prototype.get = function(url, data) {
url = url += "?op=GET";
return this._get(url, data);
}
rest.prototype.post = function(url, data) {
url = url += "?op=POST";
return this._post(url, data);
}
rest.prototype.put = function(url, data) {
url = url += "?op=PUT";
return this._post(url, data);
};
rest.prototype.del = function(url, data) {
url = url += "?op=DELETE";
return this._get(url, data);
};
function t() {
var restobj = new rest();
document.write (restobj.get("http://localhost/test/service.php", "content=GET Content"));
document.write (restobj.post("http://localhost/test/service.php", "content=POST Content"));
document.write (restobj.put("http://localhost/test/service.php", "content=PUT Content"));
document.write (restobj.del("http://localhost/test/service.php", "content=DELETE Content"));
}
t();
var XMLHttpFactories = [
function () {return new XMLHttpRequest()},
function () {return new ActiveXObject("Msxml2.XMLHTTP")},
function () {return new ActiveXObject("Msxml3.XMLHTTP")},
function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];
var xmlhttp = false;
for (var i = 0; i < XMLHttpFactories.length; i++) {
try {
xmlhttp = XMLHttpFactories[i]();
} catch (e) {
continue;
}
break;
}
// 建立XMLHttpRequest对象
this.xmlhttp = xmlhttp;
}
rest.prototype._get = function(url, data) {
var xmlhttp = this.xmlhttp;
xmlhttp.open ('GET', url + "&" + data, false);
xmlhttp.send (null);
return xmlhttp.responseText;
};
rest.prototype._post = function(url, data) {
var xmlhttp = this.xmlhttp;
xmlhttp.open ('POST', url, false);
xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xmlhttp.setRequestHeader ("Content-Length", data.length);
xmlhttp.send (data);
return xmlhttp.responseText;
};
rest.prototype.get = function(url, data) {
url = url += "?op=GET";
return this._get(url, data);
}
rest.prototype.post = function(url, data) {
url = url += "?op=POST";
return this._post(url, data);
}
rest.prototype.put = function(url, data) {
url = url += "?op=PUT";
return this._post(url, data);
};
rest.prototype.del = function(url, data) {
url = url += "?op=DELETE";
return this._get(url, data);
};
function t() {
var restobj = new rest();
document.write (restobj.get("http://localhost/test/service.php", "content=GET Content"));
document.write (restobj.post("http://localhost/test/service.php", "content=POST Content"));
document.write (restobj.put("http://localhost/test/service.php", "content=PUT Content"));
document.write (restobj.del("http://localhost/test/service.php", "content=DELETE Content"));
}
t();
如上所示,我们在客户端创建XMLHttpRequest对象,并且通过这个对象实现通过HTTP对服务器的操作GET、PUT、POST和DELETE以检索和修改资源。HTTP则把对每一个资源的操作都限制在了4个之内:GET、POST、PUT和DELETE。HTTP的这四个方法分别对应我们常见的CRUD操作,具体对应关系如下 :
C(Create) <==> POST
R(Read/Retrieve) <==> GET
U(Update) <==> PUT
D(Delete/Destroy) <==> DELETE
虽然HTTP提供了这4个方法,但是在某些情况下,PUT和DELETE方法是不可用的,于是我们在这里使用GET方法和POST方法进行替代。另外,在JS操作时,需要注意同源策略(Same Origin Policy,SOP),考虑跨域的问题。
服务端代码:
<?php
/**
* REST后台程序简单示例
*/
class Resource {
public function get($request) {
echo 'content=', $request['content'], "; get resource Successful<br />";
}
public function post($request) {
echo 'content=', $request['content'], "; post resource Successful<br />";
}
public function put($request) {
echo 'content=', $request['content'], "; update resource Successful<br />";
}
public function delete($request) {
echo 'content=', $request['content'], "; delete resource Successful<br />";
}
}
$request = $_REQUEST;
$op = $request['op'];
$op = strtolower($op);
$ops = array(
'get' => 1,
'post' => 1,
'put' => 1,
'delete' => 1,
);
if (!isset($ops[$op])) {
die('input error!');
}
$resource = new Resource();
$resource->$op($request);
?>
/**
* REST后台程序简单示例
*/
class Resource {
public function get($request) {
echo 'content=', $request['content'], "; get resource Successful<br />";
}
public function post($request) {
echo 'content=', $request['content'], "; post resource Successful<br />";
}
public function put($request) {
echo 'content=', $request['content'], "; update resource Successful<br />";
}
public function delete($request) {
echo 'content=', $request['content'], "; delete resource Successful<br />";
}
}
$request = $_REQUEST;
$op = $request['op'];
$op = strtolower($op);
$ops = array(
'get' => 1,
'post' => 1,
'put' => 1,
'delete' => 1,
);
if (!isset($ops[$op])) {
die('input error!');
}
$resource = new Resource();
$resource->$op($request);
?>
来源:http://www.phppan.com/2010/10/ajax-rest/
背景:原因很简单,需要交换两块网卡的原因是mysql是Lamp打包软件的一个配置好的多网卡,应对两个网卡已经配置好了,而我是虚拟机,只能装一块网卡,于是否,出现如下问题:
我就需要换网卡了,或者修改eth0到eth1,呵呵。当然也可以修改mysql配置。阅读全文
linux-Jack-Xiang:/usr/local/mysql/bin # ./mysqld_safe --user=mysql
eth1: error fetching interface information: Device not found
./mysqld_safe: line 24: [: !=: unary operator expected
eth1: error fetching interface information: Device not found
./mysqld_safe: line 24: [: !=: unary operator expected
我就需要换网卡了,或者修改eth0到eth1,呵呵。当然也可以修改mysql配置。阅读全文
Total Commander必知快捷键
复制文件——F5
同目录复制——Shift + F5
剪切——F6
重命名文件——Shift + F6
批量重命名——F1或Ctrl + M
排序
按名称——Ctrl + F3
按扩展名——Ctrl + F4
按日期——Ctrl + F6
按大小——Ctrl + F5
取消排序——Ctrl + F7
窗口显示方式设置
显示文件名和扩展名——Ctrl + F1
显示详细信息——Ctrl + F2
显示目录树——Ctrl + F8
预览窗口——Ctrl + Q
刷新窗口中的内容——Ctrl + R
显示文件或文件夹大小——空格
--------------------------------------------------------------------------------
F1——批量重命名
F2——选定文件名
F3——用TC内置的关联程序快速查看文件内容
F4——编辑文件内容——
F5——从一侧窗口复制选定文件到另一侧窗口中的当前文件夹
F6——从一侧窗口剪切选定文件到另一侧窗口中的当前文件夹;重命名时删除完整的路径只保留文件名即可
F7——新建文件夹,名称默认为当前选定文件/文件夹的名称
F8——删除文件
F9——张学思版,复制文件名
F10——张学思版,比较文件内容
F11——张学思版,选定当前目录下同类型所有文件
F12——张学思版,复制选定文件的完整路径
--------------------------------------------------------------------------------
Ctrl+F1——列表模式显示文件,仅显示文件名
Ctrl+F2——显示文件详细信息(默认正常模式)
Ctrl+F3——按照文件名排序
Ctrl+F4——按照文件扩展名排序
Ctrl+F5——按照文件日期排序
Ctrl+F6——按照文件大小排序
Ctrl+F7——不排序
Ctrl+F8——显示文件树。切换到该模式后需要通过Ctrl+F1 或Ctrl+F2换到正常模式
Ctrl+F9——打印文件
Ctrl+F10——显示所有文件
Ctrl+F11——显示可执行文件
Ctrl+F12——自定义显示文件类型
--------------------------------------------------------------------------------
Shlift + F1——设置自定义列显示模式
Shlift + F2——张学思版,选定所有文件
Shlift + F3——张学思版,以lister显示文件
Shlift + F4——新建文本文档
Shlift + F5——同一目录内复制文件
Shlift + F6——重命名文件
Shlift + F7——比较左右两个窗口中的文件
Shlift + F8——张学思版,彻底删除文件
Shlift + F9——暂无
Shlift + F10——显示关联试图,类似于鼠标右键的效果
复制文件——F5
同目录复制——Shift + F5
剪切——F6
重命名文件——Shift + F6
批量重命名——F1或Ctrl + M
排序
按名称——Ctrl + F3
按扩展名——Ctrl + F4
按日期——Ctrl + F6
按大小——Ctrl + F5
取消排序——Ctrl + F7
窗口显示方式设置
显示文件名和扩展名——Ctrl + F1
显示详细信息——Ctrl + F2
显示目录树——Ctrl + F8
预览窗口——Ctrl + Q
刷新窗口中的内容——Ctrl + R
显示文件或文件夹大小——空格
--------------------------------------------------------------------------------
F1——批量重命名
F2——选定文件名
F3——用TC内置的关联程序快速查看文件内容
F4——编辑文件内容——
F5——从一侧窗口复制选定文件到另一侧窗口中的当前文件夹
F6——从一侧窗口剪切选定文件到另一侧窗口中的当前文件夹;重命名时删除完整的路径只保留文件名即可
F7——新建文件夹,名称默认为当前选定文件/文件夹的名称
F8——删除文件
F9——张学思版,复制文件名
F10——张学思版,比较文件内容
F11——张学思版,选定当前目录下同类型所有文件
F12——张学思版,复制选定文件的完整路径
--------------------------------------------------------------------------------
Ctrl+F1——列表模式显示文件,仅显示文件名
Ctrl+F2——显示文件详细信息(默认正常模式)
Ctrl+F3——按照文件名排序
Ctrl+F4——按照文件扩展名排序
Ctrl+F5——按照文件日期排序
Ctrl+F6——按照文件大小排序
Ctrl+F7——不排序
Ctrl+F8——显示文件树。切换到该模式后需要通过Ctrl+F1 或Ctrl+F2换到正常模式
Ctrl+F9——打印文件
Ctrl+F10——显示所有文件
Ctrl+F11——显示可执行文件
Ctrl+F12——自定义显示文件类型
--------------------------------------------------------------------------------
Shlift + F1——设置自定义列显示模式
Shlift + F2——张学思版,选定所有文件
Shlift + F3——张学思版,以lister显示文件
Shlift + F4——新建文本文档
Shlift + F5——同一目录内复制文件
Shlift + F6——重命名文件
Shlift + F7——比较左右两个窗口中的文件
Shlift + F8——张学思版,彻底删除文件
Shlift + F9——暂无
Shlift + F10——显示关联试图,类似于鼠标右键的效果
SSI固然不能替代CGI或者其他动态页面技术,但它是在页面中插入众多小型的动态片段的优秀方法,而无须大量额外的操作。
粘贴部分,如下:
包含一个CGI程序的输出结果
这也是SSI很常见的一个用途:包含一个CGI程序的输出,比如人人喜欢的"点击计数器"。
<!--#include virtual="/cgi-bin/counter.pl" -->
包含一个标准页脚
当你管理一个拥有许多页面的站点,你会发现对所有页面同时做改动是很痛苦的,尤其是在试图对所有页面维持某种标准视觉效果的时候。
使用包含一个页眉/页脚的方法,可以减轻修改的负担。你只要制作一个页脚文件,并用include命令包含到每个页面即可。include元素能按file属性或virtual属性判断应该包含的文件。file属性是一个相对于当前目录的文件路径,即不能是一个绝对路径(以"/"开头)或包含"../"的路径。virtual属性可能更有用,它是一个相对于被提供的文档的URL ,可以以"/"开头,但必须与被提供的文档位于同一服务器上。
<!--#include virtual="/footer.html" -->
来源:http://www.phpchina.com/resource/manual/apache/howto/ssi.html
粘贴部分,如下:
包含一个CGI程序的输出结果
这也是SSI很常见的一个用途:包含一个CGI程序的输出,比如人人喜欢的"点击计数器"。
<!--#include virtual="/cgi-bin/counter.pl" -->
包含一个标准页脚
当你管理一个拥有许多页面的站点,你会发现对所有页面同时做改动是很痛苦的,尤其是在试图对所有页面维持某种标准视觉效果的时候。
使用包含一个页眉/页脚的方法,可以减轻修改的负担。你只要制作一个页脚文件,并用include命令包含到每个页面即可。include元素能按file属性或virtual属性判断应该包含的文件。file属性是一个相对于当前目录的文件路径,即不能是一个绝对路径(以"/"开头)或包含"../"的路径。virtual属性可能更有用,它是一个相对于被提供的文档的URL ,可以以"/"开头,但必须与被提供的文档位于同一服务器上。
<!--#include virtual="/footer.html" -->
来源:http://www.phpchina.com/resource/manual/apache/howto/ssi.html
【创业邦讯】周鸿祎认为,在中国做天使投资人比美国难做。美国这么多年天使投资人标准还是10万美金,这是中国10年前的标准,而现在在中国投一个初创项目没有100万美金很难起步,特别是互联网公司。究其原因,一是小公司雇人很难,大公司给点股票就把小公司的团队收购了。第二,中国互联网用户都被人控制了,"连我这样都被打的头破血流,更不要谈这些创业者了。"
周鸿祎是在12月1日由《创业邦》杂志主办的2010年创业邦年会上发表上述观点的,此次会议的主题是"2010:创新+成长",暨"创业邦100 "年度颁奖盛典。值得一提的是,周鸿祎是2009年创业邦评选的年度创业人物。
在周鸿祎眼里,小公司靠抄袭没有出路的,一定会淹没在众多的克隆者中间,如果敢抄袭大公司的商业模式,一没有钱,二没有人,三没有商业资源,如果不能标新立异、与众不同,你抄袭大公司没有意义。所以作为新的创业公司,一定要把创新变成你的文化,要忍受住抄袭的诱惑,做微创新。
何谓微创新?周鸿祎的定义是:一,大道至简。今天已经是消费者驱动的世界里,不是比拼有多少种功能,有多少奇妙的技术,只是看能为用户创造什么价值,能不能用。怎么让产品变得更加简单也是一种创新。二,聚焦。有很多成功的东西不是很均衡的,都是一点打动用户内心,但是其他的很粗糙,大家觉得这个东西很好,那赶快加大投入,再乘胜追击。三,不要做平台。做平台的人,往往是很有经验的人,有些创业者没有经验反而容易聚焦,有些有经验的人最容易犯这样的错误,经常从产业宏观的角度看问题,比如谈3G的未来趋势。而实际上用户不关心产业整合,用户只问拿来产品能有什么用。
周鸿祎还强调,创业者迈出的第一步很重要,而第一步就从用户出发:解决用户的一个问题,要么让用户觉得很爽,要么觉得很开心,要么很便宜,总之是解决了一个巨大的问题。一个用户体验的提升可以翘动大市场,所有成功的公司都是从细微的点开始切入的。这个点也可以理解是微创新。
所以,公司小、结构扁平的情况下,每个人都要把自己当成客服经理、产品经理去倾听用户的声音,形成自外而内、自下而上的方式。周鸿祎说,"我就是360最大的产品经理。"
昨日,奇虎360对外发布了新的杀毒软件产品,仍坚持免费。这是奇虎360和腾讯QQ发生纠纷后首次推出的新产品。据介绍,这款新产品创造了杀毒软件四引擎模式。奇虎360董事长周鸿祎表示,不会因3Q大战放弃隐私保护的产品开发。奇虎近期还更改了标志,周鸿祎说,"原来的标志太过有棱角,新改后的标志会更加温和。而且以后不会只考虑用户利益,也会考虑别的公司的感受。"
来源:http://news.cyzone.cn/news/2010/12/02/176725.html
周鸿祎是在12月1日由《创业邦》杂志主办的2010年创业邦年会上发表上述观点的,此次会议的主题是"2010:创新+成长",暨"创业邦100 "年度颁奖盛典。值得一提的是,周鸿祎是2009年创业邦评选的年度创业人物。
在周鸿祎眼里,小公司靠抄袭没有出路的,一定会淹没在众多的克隆者中间,如果敢抄袭大公司的商业模式,一没有钱,二没有人,三没有商业资源,如果不能标新立异、与众不同,你抄袭大公司没有意义。所以作为新的创业公司,一定要把创新变成你的文化,要忍受住抄袭的诱惑,做微创新。
何谓微创新?周鸿祎的定义是:一,大道至简。今天已经是消费者驱动的世界里,不是比拼有多少种功能,有多少奇妙的技术,只是看能为用户创造什么价值,能不能用。怎么让产品变得更加简单也是一种创新。二,聚焦。有很多成功的东西不是很均衡的,都是一点打动用户内心,但是其他的很粗糙,大家觉得这个东西很好,那赶快加大投入,再乘胜追击。三,不要做平台。做平台的人,往往是很有经验的人,有些创业者没有经验反而容易聚焦,有些有经验的人最容易犯这样的错误,经常从产业宏观的角度看问题,比如谈3G的未来趋势。而实际上用户不关心产业整合,用户只问拿来产品能有什么用。
周鸿祎还强调,创业者迈出的第一步很重要,而第一步就从用户出发:解决用户的一个问题,要么让用户觉得很爽,要么觉得很开心,要么很便宜,总之是解决了一个巨大的问题。一个用户体验的提升可以翘动大市场,所有成功的公司都是从细微的点开始切入的。这个点也可以理解是微创新。
所以,公司小、结构扁平的情况下,每个人都要把自己当成客服经理、产品经理去倾听用户的声音,形成自外而内、自下而上的方式。周鸿祎说,"我就是360最大的产品经理。"
昨日,奇虎360对外发布了新的杀毒软件产品,仍坚持免费。这是奇虎360和腾讯QQ发生纠纷后首次推出的新产品。据介绍,这款新产品创造了杀毒软件四引擎模式。奇虎360董事长周鸿祎表示,不会因3Q大战放弃隐私保护的产品开发。奇虎近期还更改了标志,周鸿祎说,"原来的标志太过有棱角,新改后的标志会更加温和。而且以后不会只考虑用户利益,也会考虑别的公司的感受。"
来源:http://news.cyzone.cn/news/2010/12/02/176725.html
1, 插入排序算法
1.1 直接插入排序
/*
* Insert sort algorithm.
* O(n^2)
*
* 说明:该算法把要排序的元素分成,已排好的有序区和代排序区。
* 然后在代排序区中拿一个元素插入到有序区中,使得有序区
* 不断扩大,而代排序区不断减少。
*
*/
int insert_sort(int a[], int num)
{
int i, j, key;
for (i = 1; i < num; i++) {
// 取一个代排序元素作为当前元素
key = a[i];
// 把i之前大于a[i]的元素向后移动一个位置,注意边界;
for (j = i; j > 0 && a[j-1] > key; j--) {
a[j] = a[j - 1];
}
// 在合适的位置安放当前元素,此时j就是合适的位置,因为j以前的元素都比当前元素小
a[j] = key;
}
return OK;
}
1.2 希尔排序
/*
* Shell sort.
*/
int shell_sort(int a[], int len)
{
int gap, i, j, temp;
for (gap = len/2; gap > 0; gap /= 2) { //gap 是增量
for (i = gap; i < len; i++) { //对增量值为gap的元素进行插入排序
temp = a[i];
for (j = i; j >= gap; j-=gap) {
if (temp < a[j - gap])
a[j] = a[j - gap];
else
break;
}
a[j] = temp;
}
}
return OK;
}
分析: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
2, 交换排序
2.1 冒泡排序
/*
* 冒泡排序
* 每一趟把最大的元素沉到最后去.
*/
int bubble_sort(int a[], int len)
{
int i, j, tmp;
// 0...len是无序区
for (i = 0; i < len; i++) { //最多做len-1趟排序
for (j = len - 1; j > i; j--) { //对当前无序区a[i..len-1]自下向上扫描
if (a[j] < a[j-1]) { //把最小的元素交换到i位置,并把i加1
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
}
}
}
return OK;
}
分析:由于该算法每趟都要经过n步的比较,而一共要进行n次这样的比较;所以时间复杂度为: O(n^2)
2.2 快速排序
快速排序是一种分治的递归算法.将数组S排序的基本算法由以下四步组成:
1) 如果S中元素个数是0或1,返回
2) 取S中任一元素v,称为枢纽元素
3) 将S分为两个不相交的集合,一个S1={x>v} 一个全S2={x<v}
4) 返回 quicksort(S1),继续v,继而quicksort(S2)
对于第3步枢纽元素的选择,选择好的枢纽元素将会大大提高程序的效率,所以如何选择好的枢纽元素,成为一个设计上的决策.
.如何选择枢纽元素?
常用的想法是直接选择第一个元素作为枢纽元素,但是有时候第一个元素并不是最好的,会造成算法整体效率下降,这里<参考1>给出一种选择枢纽元素的策略:
三数中值分割法选择枢纽元素: 即使用数组最左端和最右端以及中心元素三个元素的中间值作为枢纽元素.
待续...
参考书籍:
1,<<数据结构与算法分析>> Mark Allen Weiss
2,<<数据结构>> 严蔚明 <<数据结构 c语言描述>> 高一凡
http://student.zjzk.cn/course_ware/data_structure/web/PAIXU/paixu8.2.2.1.htm
1.1 直接插入排序
/*
* Insert sort algorithm.
* O(n^2)
*
* 说明:该算法把要排序的元素分成,已排好的有序区和代排序区。
* 然后在代排序区中拿一个元素插入到有序区中,使得有序区
* 不断扩大,而代排序区不断减少。
*
*/
int insert_sort(int a[], int num)
{
int i, j, key;
for (i = 1; i < num; i++) {
// 取一个代排序元素作为当前元素
key = a[i];
// 把i之前大于a[i]的元素向后移动一个位置,注意边界;
for (j = i; j > 0 && a[j-1] > key; j--) {
a[j] = a[j - 1];
}
// 在合适的位置安放当前元素,此时j就是合适的位置,因为j以前的元素都比当前元素小
a[j] = key;
}
return OK;
}
1.2 希尔排序
/*
* Shell sort.
*/
int shell_sort(int a[], int len)
{
int gap, i, j, temp;
for (gap = len/2; gap > 0; gap /= 2) { //gap 是增量
for (i = gap; i < len; i++) { //对增量值为gap的元素进行插入排序
temp = a[i];
for (j = i; j >= gap; j-=gap) {
if (temp < a[j - gap])
a[j] = a[j - gap];
else
break;
}
a[j] = temp;
}
}
return OK;
}
分析: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
2, 交换排序
2.1 冒泡排序
/*
* 冒泡排序
* 每一趟把最大的元素沉到最后去.
*/
int bubble_sort(int a[], int len)
{
int i, j, tmp;
// 0...len是无序区
for (i = 0; i < len; i++) { //最多做len-1趟排序
for (j = len - 1; j > i; j--) { //对当前无序区a[i..len-1]自下向上扫描
if (a[j] < a[j-1]) { //把最小的元素交换到i位置,并把i加1
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
}
}
}
return OK;
}
分析:由于该算法每趟都要经过n步的比较,而一共要进行n次这样的比较;所以时间复杂度为: O(n^2)
2.2 快速排序
快速排序是一种分治的递归算法.将数组S排序的基本算法由以下四步组成:
1) 如果S中元素个数是0或1,返回
2) 取S中任一元素v,称为枢纽元素
3) 将S分为两个不相交的集合,一个S1={x>v} 一个全S2={x<v}
4) 返回 quicksort(S1),继续v,继而quicksort(S2)
对于第3步枢纽元素的选择,选择好的枢纽元素将会大大提高程序的效率,所以如何选择好的枢纽元素,成为一个设计上的决策.
.如何选择枢纽元素?
常用的想法是直接选择第一个元素作为枢纽元素,但是有时候第一个元素并不是最好的,会造成算法整体效率下降,这里<参考1>给出一种选择枢纽元素的策略:
三数中值分割法选择枢纽元素: 即使用数组最左端和最右端以及中心元素三个元素的中间值作为枢纽元素.
待续...
参考书籍:
1,<<数据结构与算法分析>> Mark Allen Weiss
2,<<数据结构>> 严蔚明 <<数据结构 c语言描述>> 高一凡
http://student.zjzk.cn/course_ware/data_structure/web/PAIXU/paixu8.2.2.1.htm
昨天配置好两块网卡可以同时上网.但安装完active directory 后,电脑在启动到正在准备网络连接很慢很慢.终于启动后,我查看了一下日志事件.就是在访问DNS的时候时间比较长.
真是奇怪,我只有两快网卡,但日志上还有一快,真是莫名其妙.后来才知道,原来我安装了emule后产生了虚拟网卡.
想办法删掉.是在我的电脑右击属性--在设备管理器---查看-- 显示隐藏的设备-把那个虚拟的网卡卸载.
启动快多了.爽!
你可以通过这个链接引用该篇文章:http://janeluo520.bokee.com/viewdiary.11963901.html
真是奇怪,我只有两快网卡,但日志上还有一快,真是莫名其妙.后来才知道,原来我安装了emule后产生了虚拟网卡.
想办法删掉.是在我的电脑右击属性--在设备管理器---查看-- 显示隐藏的设备-把那个虚拟的网卡卸载.
启动快多了.爽!
你可以通过这个链接引用该篇文章:http://janeluo520.bokee.com/viewdiary.11963901.html
一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。
本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。
二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。
三、Daemon程序编写规则
编写Daemon程序有一些基本的规则,以避免不必要的麻烦。
1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。
2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。
3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。
4、设置文件创建mask为0,避免创建文件时权限的影响。
5、关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。
另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。在使用syslog前需要首先启动syslogd程序,关于syslogd程序的使用请参考它的man page,或相关文档,我们就不在这里讨论了。
四、一个Daemon程序的例子 编译运行环境为Redhat Linux 8.0。
我们新建一个daemontest.c程序,文件内容如下:
使用如下命令编译该程序: gcc -Wall -o daemontest daemontest.c编译完成后生成名为daemontest的程序,执行./daemontest来测试程序的运行。
使用ps axj命令可以显示系统中已运行的daemon程序的信息,包括进程ID、session ID、控制终端等内容。
部分显示内容:
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1098 1101 1101 1074 pts/1 1101 S 0 0:00 -bash 1 1581 777 777 ? -1 S 500 0:13 gedit 1 1650 1650 1650 ? -1 S 500 0:00 ./daemontest 794 1654 1654 794 pts/0 1654 R 500 0:00
ps axj 从中可以看到daemontest程序运行的进程号为1650。
我们再来看看/var/log/messages文件中的信息: Apr 7 22:00:32 localhost
daemontest[1650]: program started.
显示了我们在程序中希望输出的信息。
我们再使用kill 1650命令来杀死这个进程,/var/log/messages文件中就会有如下的信息:
Apr 7 22:11:10 localhost daemontest[1650]: program terminated.
使用ps axj命令检查,发现系统中daemontest进程已经没有了。
五、参考资料
Advanced Programming in the Unix Environment W.Richard Stevens
来源:http://www.q.cc/2007/04/27/10980.html
本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。
二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。
三、Daemon程序编写规则
编写Daemon程序有一些基本的规则,以避免不必要的麻烦。
1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。
2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。
3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。
4、设置文件创建mask为0,避免创建文件时权限的影响。
5、关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。
另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。在使用syslog前需要首先启动syslogd程序,关于syslogd程序的使用请参考它的man page,或相关文档,我们就不在这里讨论了。
四、一个Daemon程序的例子 编译运行环境为Redhat Linux 8.0。
我们新建一个daemontest.c程序,文件内容如下:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>
int daemon_init(void)
{
pid_t pid;
if((pid = fork()) < 0) return(-1);
else if(pid != 0) exit(0); /* parent exit */
/* child continues */
setsid(); /* become session leader */
chdir("/"); /* change working directory */
umask(0); /* clear file mode creation mask */
close(0); /* close stdin */
close(1); /* close stdout */
close(2); /* close stderr */
return(0);
}
void sig_term(int signo)
{
if(signo == SIGTERM)
/* catched signal sent by kill(1) command */
{
syslog(LOG_INFO, "program terminated.");
closelog(); exit(0);
}
}
int main(void)
{
if(daemon_init() == -1)
{
printf("can't fork self\n"); exit(0);
}
openlog("daemontest", LOG_PID, LOG_USER);
syslog(LOG_INFO, "program started.");
signal(SIGTERM, sig_term); /* arrange to catch the signal */
while(1) { sleep(1); /* put your main program here */ }
return(0);
}
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>
int daemon_init(void)
{
pid_t pid;
if((pid = fork()) < 0) return(-1);
else if(pid != 0) exit(0); /* parent exit */
/* child continues */
setsid(); /* become session leader */
chdir("/"); /* change working directory */
umask(0); /* clear file mode creation mask */
close(0); /* close stdin */
close(1); /* close stdout */
close(2); /* close stderr */
return(0);
}
void sig_term(int signo)
{
if(signo == SIGTERM)
/* catched signal sent by kill(1) command */
{
syslog(LOG_INFO, "program terminated.");
closelog(); exit(0);
}
}
int main(void)
{
if(daemon_init() == -1)
{
printf("can't fork self\n"); exit(0);
}
openlog("daemontest", LOG_PID, LOG_USER);
syslog(LOG_INFO, "program started.");
signal(SIGTERM, sig_term); /* arrange to catch the signal */
while(1) { sleep(1); /* put your main program here */ }
return(0);
}
使用如下命令编译该程序: gcc -Wall -o daemontest daemontest.c编译完成后生成名为daemontest的程序,执行./daemontest来测试程序的运行。
使用ps axj命令可以显示系统中已运行的daemon程序的信息,包括进程ID、session ID、控制终端等内容。
部分显示内容:
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1098 1101 1101 1074 pts/1 1101 S 0 0:00 -bash 1 1581 777 777 ? -1 S 500 0:13 gedit 1 1650 1650 1650 ? -1 S 500 0:00 ./daemontest 794 1654 1654 794 pts/0 1654 R 500 0:00
ps axj 从中可以看到daemontest程序运行的进程号为1650。
我们再来看看/var/log/messages文件中的信息: Apr 7 22:00:32 localhost
daemontest[1650]: program started.
显示了我们在程序中希望输出的信息。
我们再使用kill 1650命令来杀死这个进程,/var/log/messages文件中就会有如下的信息:
Apr 7 22:11:10 localhost daemontest[1650]: program terminated.
使用ps axj命令检查,发现系统中daemontest进程已经没有了。
五、参考资料
Advanced Programming in the Unix Environment W.Richard Stevens
来源:http://www.q.cc/2007/04/27/10980.html
代码:
来源:http://blog.chinaunix.net/u2/84280/showart_2311724.html
#!/bin/bash
#author Sky
PATH="/var/PROGRAM/MANAGEMENT/modules/xbash:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:"
LANG=zh_CN
export PATH LANG
RESINHOME="/data/resin-pro-3.1.8"
PLUGIN_HOME=$RESINHOME/pconline_plugin
JAVAHOME="/usr/java/jdk1.6.0_06"
PLUGIN_MC="java_memcached-release_2.0.1.jar"
PLUGIN_LOG4J="log4j-1.2.15.jar"
PLUGIN_NAME="mcheathychk.jar"
#############enviroment initialize###################
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_MC ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_MC $JAVAHOME/jre/lib/ext/
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_LOG4J ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_LOG4J $JAVAHOME/jre/lib/ext/
####################################################
############
# 主机信息 #
############
INTF=$(netstat -rn | tail -1 | awk '{print $NF}')
IP=$(ifconfig $INTF | awk '/inet addr/{ split($2,tmp,":") ; print tmp[2] }')
HOST_NAME=$(hostname --short)
##########
#邮件环境#
##########
#CHARTSET="zh_CN."
MAIL_CLIENT=""
MAIL_SENDER=""
MAIL_SERVER=""
case $IP in
192.168.230.*|192.168.1[0-1].*|192.168.238.*|202.9.1.*)
MAIL_SERVER="202.2"
;;
*)
MAIL_SERVER="192.168.8."
;;
esac
##########
for resin in `cat /etc/mods.conf | grep resind | grep -v "#" | awk -F":" '{print $2}' | xargs`
do
######get relate configuration#####################
JAVAHOME=`cat $resin | grep "JAVA_HOME=" | awk -F"=" '{print $2}'`
RESINHOME=`cat $resin | grep "RESIN_HOME=" | awk -F"=" '{print $2}'`
CONF_NAME=`cat $resin | grep "SEARCH_STR=" | awk -F"=" '{print $2}' | sed 's/\"//g'`
APP_HOME=`cat $RESINHOME/conf/$CONF_NAME | grep "<web-app id=\"/\" root-directory=\"" | awk -F"=" '{print $3}' | sed "s#\"##g" | sed "s#/>##g"`
CONF_MC=$APP_HOME/WEB-INF/classes/memcached.properties
###################################################
if [[ -e $CONF_MC ]] ; then
servers=`cat $CONF_MC | grep "servers" | awk -F"=" '{print $2}'`
for server in `echo $servers | awk -F"," '{for( i=0;i<$NF;i++) {print $((i+1))}}' | xargs`
do
#echo $server
echo $server | awk -F":" '{print $1,$2}' | \
while read dip port
do
if /sbin/iptables -nL | grep -q "$dip"
then
######解封###############
/sbin/iptables -D OUTPUT -p tcp -s $IP -d $dip --dport $port -j REJECT --reject-with tcp-reset 2> /dev/null
fi
done
##############Test Memcache################
stats=`$JAVAHOME/bin/java -jar $RESINHOME/pconline_plugin/$PLUGIN_NAME $server 2> /dev/dull`
#echo "stats="$stats
if [[ $stats == "MCOK" ]] ; then
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo "mcchk_$agentname=0"
else
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo $server | awk -F":" '{print $1,$2}' | \
while read dip port
do
/sbin/iptables -A OUTPUT -p tcp -s $IP -d $dip --dport $port -j REJECT --reject-with tcp-reset
done
echo "mcchk_$agentname=1"
echo $agentname"_"$server" is bad" | env MAILRC=/dev/null charset="$CHARTSET" from="$MAIL_SENDER" smtp="$MAIL_SERVER" \
nail -n -s "$HOST_NAME($IP)MC had bad information" $MAIL_CLIENT
fi
done
else
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo "mcchk_$agentname=0"
break
fi
done
#author Sky
PATH="/var/PROGRAM/MANAGEMENT/modules/xbash:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:"
LANG=zh_CN
export PATH LANG
RESINHOME="/data/resin-pro-3.1.8"
PLUGIN_HOME=$RESINHOME/pconline_plugin
JAVAHOME="/usr/java/jdk1.6.0_06"
PLUGIN_MC="java_memcached-release_2.0.1.jar"
PLUGIN_LOG4J="log4j-1.2.15.jar"
PLUGIN_NAME="mcheathychk.jar"
#############enviroment initialize###################
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_MC ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_MC $JAVAHOME/jre/lib/ext/
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_LOG4J ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_LOG4J $JAVAHOME/jre/lib/ext/
####################################################
############
# 主机信息 #
############
INTF=$(netstat -rn | tail -1 | awk '{print $NF}')
IP=$(ifconfig $INTF | awk '/inet addr/{ split($2,tmp,":") ; print tmp[2] }')
HOST_NAME=$(hostname --short)
##########
#邮件环境#
##########
#CHARTSET="zh_CN."
MAIL_CLIENT=""
MAIL_SENDER=""
MAIL_SERVER=""
case $IP in
192.168.230.*|192.168.1[0-1].*|192.168.238.*|202.9.1.*)
MAIL_SERVER="202.2"
;;
*)
MAIL_SERVER="192.168.8."
;;
esac
##########
for resin in `cat /etc/mods.conf | grep resind | grep -v "#" | awk -F":" '{print $2}' | xargs`
do
######get relate configuration#####################
JAVAHOME=`cat $resin | grep "JAVA_HOME=" | awk -F"=" '{print $2}'`
RESINHOME=`cat $resin | grep "RESIN_HOME=" | awk -F"=" '{print $2}'`
CONF_NAME=`cat $resin | grep "SEARCH_STR=" | awk -F"=" '{print $2}' | sed 's/\"//g'`
APP_HOME=`cat $RESINHOME/conf/$CONF_NAME | grep "<web-app id=\"/\" root-directory=\"" | awk -F"=" '{print $3}' | sed "s#\"##g" | sed "s#/>##g"`
CONF_MC=$APP_HOME/WEB-INF/classes/memcached.properties
###################################################
if [[ -e $CONF_MC ]] ; then
servers=`cat $CONF_MC | grep "servers" | awk -F"=" '{print $2}'`
for server in `echo $servers | awk -F"," '{for( i=0;i<$NF;i++) {print $((i+1))}}' | xargs`
do
#echo $server
echo $server | awk -F":" '{print $1,$2}' | \
while read dip port
do
if /sbin/iptables -nL | grep -q "$dip"
then
######解封###############
/sbin/iptables -D OUTPUT -p tcp -s $IP -d $dip --dport $port -j REJECT --reject-with tcp-reset 2> /dev/null
fi
done
##############Test Memcache################
stats=`$JAVAHOME/bin/java -jar $RESINHOME/pconline_plugin/$PLUGIN_NAME $server 2> /dev/dull`
#echo "stats="$stats
if [[ $stats == "MCOK" ]] ; then
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo "mcchk_$agentname=0"
else
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo $server | awk -F":" '{print $1,$2}' | \
while read dip port
do
/sbin/iptables -A OUTPUT -p tcp -s $IP -d $dip --dport $port -j REJECT --reject-with tcp-reset
done
echo "mcchk_$agentname=1"
echo $agentname"_"$server" is bad" | env MAILRC=/dev/null charset="$CHARTSET" from="$MAIL_SENDER" smtp="$MAIL_SERVER" \
nail -n -s "$HOST_NAME($IP)MC had bad information" $MAIL_CLIENT
fi
done
else
agentname=`echo $resin | awk -F"_" '{print $2}'`
echo "mcchk_$agentname=0"
break
fi
done
来源:http://blog.chinaunix.net/u2/84280/showart_2311724.html
Mysql主从同步延迟受到多种因素影响, 比如大事务, 从库查询压力, 网路延迟等; 这些比较常见; 但还受到主从机器系统时钟差的影响,这一点可能容易被忽视。
总结一点导致主从库出现延迟的原因有可能是:大事务、从库查询压力大、网络本身有延迟。另外一点就是主从时钟的影响。即系统时间受到了影响!
查看的参数:Seconds_Behind_Master
这个参数有两种理解
一种理解是来源于Mysql手册上的描述,大体意思是这个时间是从库SQL线程处理的最近的日志事件的时间戳减去从库IO线程处理的最近一条日志记录的时间戳得到的, 可以简单理解为从库SQL线程与IO线程所处理的最近的日志事件的时间戳差;这个计算方式给人的感觉不是在计算主从延迟,而是在计算从库上两个线程的处理的日志的时差。
另一种理解来源于《High Performace Mysql》上的的描述,大体意思这个参数反映的结果是当前系统时间减去从库IO线程所处理的最近一条日志记录的时间戳;但这个说法有一个明显的不太让人信服的地方,就是如果机器的系统时间相差比较大怎么办? 显然, 如果系统时间相差比较大的话,以这样的方式计算主从延迟毫无意义。
通过查看源码发现这个值应该是这样理解的:
这个值是通过在主库上执行SELECT UNIX_TIMESTAMP()来取得主库的系统时间, 然后去减从库的当前系统时间。
原来系统时间差还真的对主从同步延迟参数Seconds_Behind_Master有影响。
那我就有一个疑问了。如果保证我的主从库的系统时间一致的话是不是就说我们主从复制延迟不存在呢?
那这种大事务、查询、那就不会影响到它了吗?
困惑。。。。
来源:http://blog.chinaunix.net/u2/84280/showart_2320627.html
总结一点导致主从库出现延迟的原因有可能是:大事务、从库查询压力大、网络本身有延迟。另外一点就是主从时钟的影响。即系统时间受到了影响!
查看的参数:Seconds_Behind_Master
这个参数有两种理解
一种理解是来源于Mysql手册上的描述,大体意思是这个时间是从库SQL线程处理的最近的日志事件的时间戳减去从库IO线程处理的最近一条日志记录的时间戳得到的, 可以简单理解为从库SQL线程与IO线程所处理的最近的日志事件的时间戳差;这个计算方式给人的感觉不是在计算主从延迟,而是在计算从库上两个线程的处理的日志的时差。
另一种理解来源于《High Performace Mysql》上的的描述,大体意思这个参数反映的结果是当前系统时间减去从库IO线程所处理的最近一条日志记录的时间戳;但这个说法有一个明显的不太让人信服的地方,就是如果机器的系统时间相差比较大怎么办? 显然, 如果系统时间相差比较大的话,以这样的方式计算主从延迟毫无意义。
通过查看源码发现这个值应该是这样理解的:
这个值是通过在主库上执行SELECT UNIX_TIMESTAMP()来取得主库的系统时间, 然后去减从库的当前系统时间。
原来系统时间差还真的对主从同步延迟参数Seconds_Behind_Master有影响。
那我就有一个疑问了。如果保证我的主从库的系统时间一致的话是不是就说我们主从复制延迟不存在呢?
那这种大事务、查询、那就不会影响到它了吗?
困惑。。。。
来源:http://blog.chinaunix.net/u2/84280/showart_2320627.html
ASP代码
'a=15
'b=20
'response.Write(a\b) '0 提取到整数部分
'response.Write(a/b) .75 提取到小数部分
'/浮点除法a/b \整数除法a\b
a=35
b=20
'response.Write(a\b) '1 整数部分
response.Write(a/b) '1.75 带小数
PHP代码
$a=15;
$b=20;
echo floor($a/$b); //0
echo $a/$b; //0.75
$a=35;
$b=20;
echo floor($a/$b); //1
echo $a/$b; //1.75
实现的功能一样的
来源:http://blog.chinaunix.net/u2/84280/showart_2357507.html
'a=15
'b=20
'response.Write(a\b) '0 提取到整数部分
'response.Write(a/b) .75 提取到小数部分
'/浮点除法a/b \整数除法a\b
a=35
b=20
'response.Write(a\b) '1 整数部分
response.Write(a/b) '1.75 带小数
PHP代码
$a=15;
$b=20;
echo floor($a/$b); //0
echo $a/$b; //0.75
$a=35;
$b=20;
echo floor($a/$b); //1
echo $a/$b; //1.75
实现的功能一样的
来源:http://blog.chinaunix.net/u2/84280/showart_2357507.html
http://blog.sina.com.cn/s/blog_48c95a1901018nq1.html
libssh2:(configure: error: The required libssh2 library was not found. You can obtain that package from http://sourceforge.net/projects/libssh2/,可通过yum install libssh2-devel.x86_64 解决,不用下源码包)
https://www.libssh2.org/download/
ssh2:
http://pecl.php.net/package/ssh2
读取公钥的脚本:
摘自:http://www.4wei.cn/archives/1002295
php中的ssh2模块学习
阅读全文
libssh2:(configure: error: The required libssh2 library was not found. You can obtain that package from http://sourceforge.net/projects/libssh2/,可通过yum install libssh2-devel.x86_64 解决,不用下源码包)
https://www.libssh2.org/download/
ssh2:
http://pecl.php.net/package/ssh2
读取公钥的脚本:
摘自:http://www.4wei.cn/archives/1002295
php中的ssh2模块学习
阅读全文