问题:北京东单-东邪 15:14:04
问一个问题
中间我让运维给几十个服务器的cron,加了新的cron,他们是咋批量加的啊(我自己加的话,的手动一个一个服)
【点击】Chris 15:18:21
有个工具是在一台服务器上执行命令,其他服务器都跟着执行
方案:
1.有批量运行的工具如上面:有个工具是在一台服务器上执行命令,其他服务器都跟着执行
2.有一个zoomkeeper来实现多个服务器同步执行。(集群)
这儿主要讲:
puppet运维自动化之cron管理:
http://www.w3ccollege.org/puppet/operation-and-maintenance-automation-puppet-resources-management-cron-instance.html
阅读全文
问一个问题
中间我让运维给几十个服务器的cron,加了新的cron,他们是咋批量加的啊(我自己加的话,的手动一个一个服)
【点击】Chris 15:18:21
有个工具是在一台服务器上执行命令,其他服务器都跟着执行
方案:
1.有批量运行的工具如上面:有个工具是在一台服务器上执行命令,其他服务器都跟着执行
2.有一个zoomkeeper来实现多个服务器同步执行。(集群)
这儿主要讲:
puppet运维自动化之cron管理:
http://www.w3ccollege.org/puppet/operation-and-maintenance-automation-puppet-resources-management-cron-instance.html
阅读全文
参见手册 date()与strtotime()
date("Y-m-d H:i:s")
CURRENT_TIMES*****P() or NOW()
DATE_FORMAT(date,format)
now() curtime() datetime()
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-11-29 11:14:55 |
+---------------------+
1 row in set (0.00 sec)
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 11:14:31 |
+-----------+
1 row in set (0.00 sec)
实例
下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间:
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')
结果类似:
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
题目内容:
1、MySQL取得当前时间的函数是?,格式化日期的函数是
2、写出 SQL语句的格式 : 插入 ,更新 ,删除
表名User
Name Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15
(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
(b) 请用sql语句把张三的时间更新成为当前系统时间
(c) 请写出删除名为张四的全部记录
3、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别
4、MySQL自增类型(通常为表ID字段)必需将其设为(?)字段
5、以下请用PHPMYADMIN完成
(一)创建新闻发布系统,表名为message有如下字段
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量
(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下
comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
文章id 文章标题 点击量 回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
(三)上述内容管理系统,表category保存分类信息,字段如下
category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单
date("Y-m-d H:i:s")
CURRENT_TIMES*****P() or NOW()
DATE_FORMAT(date,format)
now() curtime() datetime()
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-11-29 11:14:55 |
+---------------------+
1 row in set (0.00 sec)
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 11:14:31 |
+-----------+
1 row in set (0.00 sec)
实例
下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间:
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')
结果类似:
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
题目内容:
1、MySQL取得当前时间的函数是?,格式化日期的函数是
2、写出 SQL语句的格式 : 插入 ,更新 ,删除
表名User
Name Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15
(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
(b) 请用sql语句把张三的时间更新成为当前系统时间
(c) 请写出删除名为张四的全部记录
3、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别
4、MySQL自增类型(通常为表ID字段)必需将其设为(?)字段
5、以下请用PHPMYADMIN完成
(一)创建新闻发布系统,表名为message有如下字段
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量
(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下
comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
文章id 文章标题 点击量 回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
(三)上述内容管理系统,表category保存分类信息,字段如下
category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单
经过两个月的时间,简单做(ZTD)系列终于完结。希望这一套系统确实使你有所帮助。简单做(ZTD)系列主要介绍了时间管理的十个好习惯的培养,在这篇文章中,将对每个习惯做一个简介,具体的请参考全文。
阅读全文
阅读全文
要限制 網站/網頁/檔案 下載速度, Apache 有提供 bw 的模組, 可以設定最大下載速度.
阅读全文
阅读全文
首先安装完php后最好保留当时安装的文件,比如我的路径/export1/soft
cd php-5.1.6/ext/soap
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config –enable-soap
make
make install
编译后的soap.so文件保存在了/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922目录下
修改php.ini文件
手工修改:查找/usr/local/webserver/php/etc/php.ini中的extension_dir = “./”
修改为extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20050922/”
并在此行后增加如下,然后保存:
extension = “soap.so”
重新启动apache,ok 我们就已经能看到扩展的soap模块了。
如果还要扩展别的模块可以一次类推,这里还有点要说明,如果做了zend,php.ini文件是在/usr/local/php/etc下的,但是我们这边重新编译后,它回放到/usr/local/php/lib下。所以这里要注意一下。
来源:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2010/1014/6598.html
cd php-5.1.6/ext/soap
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config –enable-soap
make
make install
编译后的soap.so文件保存在了/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922目录下
修改php.ini文件
手工修改:查找/usr/local/webserver/php/etc/php.ini中的extension_dir = “./”
修改为extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20050922/”
并在此行后增加如下,然后保存:
extension = “soap.so”
重新启动apache,ok 我们就已经能看到扩展的soap模块了。
如果还要扩展别的模块可以一次类推,这里还有点要说明,如果做了zend,php.ini文件是在/usr/local/php/etc下的,但是我们这边重新编译后,它回放到/usr/local/php/lib下。所以这里要注意一下。
来源:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2010/1014/6598.html
自1999年起我就开始发掘一些科技公司,并帮助它们运营。我最近的一个公司是 fabulis.com 。下面是从干这行中得到的57条经验。我可以列出更多,但恐怕会令你厌烦。 阅读全文
Banshee 是一个 PHP 开发 Web 网站的框架,主要特点是安全和易用,使用 MVC 模式,使用 XSLT 的模板,支持 MySQL 数据库。
该版本升级了 CKEditor 到3.4.1 版本,使用 SlimStat 来替换 Google Analytics,同时还包含一些bug的修复。
下载 地址 http://www.banshee-php.org/download
Tokyo Cabinet的tcutil.c提供了一套不错的C语言Utility API函数库,可以作为标准C函数库的一个增强。其中的一部分函数增加了申请内存失败、非数值等异常处理,例如tcmalloc()、tccalloc()、tcatoi(),另一部分提供了增强字符串处理、内存池、正则、文件操作、编码转换、压缩、Array List、Hash Map等。
上午和《独孤九剑》游戏的程序经理开会,约定了我们开发的KE游戏运营平台及中间件,与独孤九剑服务器端进程,进行各种功能交互的详细通信协议。C开发的中间件daemon,采用HTTPS/SSL REST协议与Nginx+PHP游戏运营平台通信,采用TCP二进制协议、信号与游戏进程通信。
昨晚,移动硬盘连接电脑的USB线突然被碰掉,再插入,提示移动硬盘的分区未格式化,上面的重要数据差点丢失,还好用CHKDSK /F修复了。得定时做个备份了,是再买块硬盘,还是用云存储?如果能找到一款能够便捷地进行本地加密后再上传,下载后再解密的软件,保护数据隐私,云存储或许也是个不错的选择。
上午和《独孤九剑》游戏的程序经理开会,约定了我们开发的KE游戏运营平台及中间件,与独孤九剑服务器端进程,进行各种功能交互的详细通信协议。C开发的中间件daemon,采用HTTPS/SSL REST协议与Nginx+PHP游戏运营平台通信,采用TCP二进制协议、信号与游戏进程通信。
昨晚,移动硬盘连接电脑的USB线突然被碰掉,再插入,提示移动硬盘的分区未格式化,上面的重要数据差点丢失,还好用CHKDSK /F修复了。得定时做个备份了,是再买块硬盘,还是用云存储?如果能找到一款能够便捷地进行本地加密后再上传,下载后再解密的软件,保护数据隐私,云存储或许也是个不错的选择。
3月28日,戴志康释出了传说以久的内部代号为UltraX的体验版。大概是希望借用discuz已有的巨大号召力,UltraX在发布之前还是改成了discuz!X。阅读全文
最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到MySQL的时候,发现MySQL的连接超时关闭了,于是就出现了“MySQL server has gone away”这样的错误提示,解决这个问题,我的经验有以下两点,或许对大家有用处:
第 一种方法:
当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。
第二种方法:
这也是我个人认为最好的方法,即检查 MySQL的链接状态,使其重新链接。
可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的 API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过 mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧:
这是我的的数据库操 作类中间的一个函数
function ping(){
if(!mysql_ping($this->link)){
mysql_close($this->link); //注意:一定要先执行数据库关闭,这是关键
$this->connect();
}
}
我需要调用这个函数的代码可能是这样子的
$str = file_get_contents(’http://www.tianqiyugao.net’);
$db->ping();//经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接
$db->query(’select * from table’);
ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。
经 过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。
来源:http://www.sablog.net/blog/MySQL-server-has-gone-away/
第 一种方法:
当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。
第二种方法:
这也是我个人认为最好的方法,即检查 MySQL的链接状态,使其重新链接。
可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的 API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过 mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧:
这是我的的数据库操 作类中间的一个函数
function ping(){
if(!mysql_ping($this->link)){
mysql_close($this->link); //注意:一定要先执行数据库关闭,这是关键
$this->connect();
}
}
我需要调用这个函数的代码可能是这样子的
$str = file_get_contents(’http://www.tianqiyugao.net’);
$db->ping();//经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接
$db->query(’select * from table’);
ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。
经 过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。
来源:http://www.sablog.net/blog/MySQL-server-has-gone-away/
Apache日志不记录图片文件设置方法是
httpd.conf 设置如下:
<FilesMatch "\.(ico|gif|jpg|png|bmp|swf|css|js)">
SetEnv IMAG 1
</FilesMatch>
CustomLog logs/access_log combined env=!IMAG
虚拟机的日志也一样配置。
来源:http://www.sablog.net/blog/apache-donot-log-images/
httpd.conf 设置如下:
<FilesMatch "\.(ico|gif|jpg|png|bmp|swf|css|js)">
SetEnv IMAG 1
</FilesMatch>
CustomLog logs/access_log combined env=!IMAG
虚拟机的日志也一样配置。
来源:http://www.sablog.net/blog/apache-donot-log-images/
C++可以用string
头文件
#include <string>
using namespace std;
string a,b;
string c;
c=a+b;
c就是a连接b的结果了
头文件
#include <string>
using namespace std;
string a,b;
string c;
c=a+b;
c就是a连接b的结果了
1 #include <string>
string str="12345";
int b=atoi(str.c_str());
2
【转】C++ int,char,string,CString类型转换(整理总结)
#include <string> //使用C++标准库的string类时
using namespace std; //同上
#include <sstream>
#include <iostream>
#include <stdlib.h> //要将string类和int类型直接转换最好有这些包含,
//因为自己写一个转换函数比较方便,函数定义参考如下
string getstring ( const int n )
{
std::stringstream newstr;
newstr<<n;
return newstr.str();
}
string 转 CString
CString.format(”%s”, string.c_str());
char 转 CString
CString.format(”%s”, char*);
char 转 string
string s(char *);
string 转 char *
char *p = string.c_str();
CString 转 string
string s(CString.GetBuffer());
1,string -> CString
CString.format(”%s”, string.c_str());
用c_str()确实比data()要好.
2,char -> string
string s(char *);
只能初始化,在不是初始化的地方最好还是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C—string
1.data(),返回没有”\0“的字符串数组
2,c_str(),返回有”\0“的字符串数组
3,copy()
—————————————————————
CString与int、char*、char[100]之间的转换- -
CString与int、char*、char[100]之间的转换- -
CString互转int
将字符转换为整数,可以使用atoi、_atoi64或atol。
而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函数的功能很强,值得你研究一下。
void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss=”1212.12″;
int temp=atoi(ss);
CString aa;
aa.Format(”%d”,temp);
AfxMessageBox(”var is ” + aa);
}
sart.Format(”%s”,buf);
CString互转char*
///char * TO cstring
CString strtest;
char * charpoint;
charpoint=”give string a value”;
strtest=charpoint;
///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());
标准C里没有string,char *==char []==string
可以用CString.Format(”%s”,char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。
CString转换 char[100]
char a[100];
CString str(”aaaaaa”);
strncpy(a,(LPCTSTR)str,sizeof(a));
3 string 转int
itoa(i,num,10);
i 需要转换成字符的数字
num 转换后保存字符的变量
10 转换数字的基数(进制)10就是说按照10进制转换数字。还可以是2,8,16等等你喜欢的进制类型
为了您的安全,请只打开来源可靠的网址
打开网站 取消
来自: http://hi.baidu.com/buptyoyo/blog/item/de1d94c6060429a38226ac37.html
string str="12345";
int b=atoi(str.c_str());
2
【转】C++ int,char,string,CString类型转换(整理总结)
#include <string> //使用C++标准库的string类时
using namespace std; //同上
#include <sstream>
#include <iostream>
#include <stdlib.h> //要将string类和int类型直接转换最好有这些包含,
//因为自己写一个转换函数比较方便,函数定义参考如下
string getstring ( const int n )
{
std::stringstream newstr;
newstr<<n;
return newstr.str();
}
string 转 CString
CString.format(”%s”, string.c_str());
char 转 CString
CString.format(”%s”, char*);
char 转 string
string s(char *);
string 转 char *
char *p = string.c_str();
CString 转 string
string s(CString.GetBuffer());
1,string -> CString
CString.format(”%s”, string.c_str());
用c_str()确实比data()要好.
2,char -> string
string s(char *);
只能初始化,在不是初始化的地方最好还是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C—string
1.data(),返回没有”\0“的字符串数组
2,c_str(),返回有”\0“的字符串数组
3,copy()
—————————————————————
CString与int、char*、char[100]之间的转换- -
CString与int、char*、char[100]之间的转换- -
CString互转int
将字符转换为整数,可以使用atoi、_atoi64或atol。
而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函数的功能很强,值得你研究一下。
void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss=”1212.12″;
int temp=atoi(ss);
CString aa;
aa.Format(”%d”,temp);
AfxMessageBox(”var is ” + aa);
}
sart.Format(”%s”,buf);
CString互转char*
///char * TO cstring
CString strtest;
char * charpoint;
charpoint=”give string a value”;
strtest=charpoint;
///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());
标准C里没有string,char *==char []==string
可以用CString.Format(”%s”,char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。
CString转换 char[100]
char a[100];
CString str(”aaaaaa”);
strncpy(a,(LPCTSTR)str,sizeof(a));
3 string 转int
itoa(i,num,10);
i 需要转换成字符的数字
num 转换后保存字符的变量
10 转换数字的基数(进制)10就是说按照10进制转换数字。还可以是2,8,16等等你喜欢的进制类型
为了您的安全,请只打开来源可靠的网址
打开网站 取消
来自: http://hi.baidu.com/buptyoyo/blog/item/de1d94c6060429a38226ac37.html
11月19日上午消息,在腾讯与360大战趋于平静时,奇虎360董事长周鸿祎首次在公开场合出现出席2010创业家年会,他在演讲中总结本次大战的两个感悟,一是用户支持,二是行业应团结合作,并表示如果能让行业开放付出什么代价都值得。
周鸿祎在谈及近日大战时,表示目的是希望让中国互联网更加开放。“互联网已经形成的行业巨头,他们总希望格局50年不变,他们永远在赚大钱,大公司跟创新是矛盾的,只有小的创业者不愿意遵循已有的游戏规则,所才有动力去创新。”
对于这一次前所未有的大战,周鸿祎说有两个感悟。“第一个感悟是用户支持了我们。关键的时候用户的力量对你的支持,是一个创新公司当面对垄断巨头,这是唯一所能依靠最大的力量。因为比钱比人比资源,我们依然是一个创业公司,还是一句话,只有重视用户才能脚踏实地。”
“第二个感悟,很多创业者,我们每一个人要做微创新,每一个人都微不足道,但我认为我们各个行业,特别是互联网的创业者,我希望大家一定要能够多相互合作、相互团结起来。”周鸿祎说。
周鸿祎指出,如果很多创业公司、创业者都能够呼吁创新、反对抄袭、反对垄断,如果通过这个事件让行业有所反思,每个公司都能够改变,让这个行业更加开放,有更多的新的创业公司能够成功,“这次我们付出什么样的代价都是值得。”阅读全文
周鸿祎在谈及近日大战时,表示目的是希望让中国互联网更加开放。“互联网已经形成的行业巨头,他们总希望格局50年不变,他们永远在赚大钱,大公司跟创新是矛盾的,只有小的创业者不愿意遵循已有的游戏规则,所才有动力去创新。”
对于这一次前所未有的大战,周鸿祎说有两个感悟。“第一个感悟是用户支持了我们。关键的时候用户的力量对你的支持,是一个创新公司当面对垄断巨头,这是唯一所能依靠最大的力量。因为比钱比人比资源,我们依然是一个创业公司,还是一句话,只有重视用户才能脚踏实地。”
“第二个感悟,很多创业者,我们每一个人要做微创新,每一个人都微不足道,但我认为我们各个行业,特别是互联网的创业者,我希望大家一定要能够多相互合作、相互团结起来。”周鸿祎说。
周鸿祎指出,如果很多创业公司、创业者都能够呼吁创新、反对抄袭、反对垄断,如果通过这个事件让行业有所反思,每个公司都能够改变,让这个行业更加开放,有更多的新的创业公司能够成功,“这次我们付出什么样的代价都是值得。”阅读全文
我觉得首先还是看这位兄弟的两篇文章后实践Ok后再接着看吧,那两篇文章写得很好,如下:
http://hi.baidu.com/doyoueat/blog/item/2593153a88604b3371cf6c65.html
http://hi.baidu.com/doyoueat/blog/item/f3b48320f13f2e0f4d088d5a.html
以上两篇文章,博主是实践Ok了的。。。。:)
下载php源码
进入源码路径假如说是 /data/soft/php-5.2.5/
进入ext 目录
./ext_skel --extname=cpptest
进入 cpptest 目录 修改 config.m4
变化主要是这几行
PHP_ARG_ENABLE(cpptest, whether to enable cpptest support,
Make sure that the comment is aligned:
[ --enable-cpptest Enable cpptest support])
以下几行主要用来指定源代码是 c++的
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, "", EXTRA_LDFLAGS)
PHP_NEW_EXTENSION(cpptest, cpptest.cpp, $ext_shared)
然后 mv cpptest.c cpptest.cpp
修改 cpptest.cpp
20 extern "C" {
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "php.h"
26 #include "php_ini.h"
27 #include "ext/standard/info.h"
28 #include "php_cpptest.h"
29 }
用 extern c 把原来的c 的 头文件包起来 让其兼容c++
#ifdef COMPILE_DL_CPPTEST
ZEND_GET_MODULE(cpptest)
#endif
修改为如下:
72 BEGIN_EXTERN_C()
73 ZEND_GET_MODULE(cpptest)
74 END_EXTERN_C()
用 BEGIN_EXTERN_C() 还有 END_EXTERN_C() 把 ZEND_GET_MODULE(cpptest) 包起来,最关键是:
#include "cpptest.h"
这个cpp的头文件要放在:
extern "C" { 的花括号里!!!
using std::string;
extern "C" {
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "cpptest.h"
否则会出现编译错误:错误:‘char* PHP_HELLO()’的早先声明有‘C++’链接 错误:与带有‘C’链接的新声明冲突,
再加入:
#ifdef COMPILE_DL_EXT_NAME
BEGIN_EXTERN_C()
ZEND_GET_MODULE(ext_name)
END_EXTERN_C()
#endif
为此,特别注意!!!
------------------------------------------------------------------------------------------------------------
然后可以 随便测试进入几个c++的 头文件
30 #include <iostream>
31 #include <string>
32 #include "cpptest.h"
33 using std::string;
修改一下示例
160 PHP_FUNCTION(confirm_cpptest_compiled)
161 {
174 int len;
175 char *strg;
176 strg=estrdup(PHP_HELLO());
177 std::cout<<strg<<std::endl;
178 len=strlen(strg);
179 RETURN_STRINGL(strg, len, 0);
180 // std::cout<<"hello world"<<std::endl;
181 }
182 char * PHP_HELLO()
183 {
184 string str("aaaaaa");
186 char * cp;
187 cp=estrdup(str.c_str());
188 return cp;
190
191 }
然后添加 cpptest.h
定义 PHP_HELLO()
char * PHP_HELLO();
然后 phpize
./configure --with-php-config=/data/app/php/bin/php-config
make
makeinstall
在 phpini中 引用 so文件
下边就可以测试啦
阅读全文
http://hi.baidu.com/doyoueat/blog/item/2593153a88604b3371cf6c65.html
http://hi.baidu.com/doyoueat/blog/item/f3b48320f13f2e0f4d088d5a.html
以上两篇文章,博主是实践Ok了的。。。。:)
下载php源码
进入源码路径假如说是 /data/soft/php-5.2.5/
进入ext 目录
./ext_skel --extname=cpptest
进入 cpptest 目录 修改 config.m4
变化主要是这几行
PHP_ARG_ENABLE(cpptest, whether to enable cpptest support,
Make sure that the comment is aligned:
[ --enable-cpptest Enable cpptest support])
以下几行主要用来指定源代码是 c++的
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, "", EXTRA_LDFLAGS)
PHP_NEW_EXTENSION(cpptest, cpptest.cpp, $ext_shared)
然后 mv cpptest.c cpptest.cpp
修改 cpptest.cpp
20 extern "C" {
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "php.h"
26 #include "php_ini.h"
27 #include "ext/standard/info.h"
28 #include "php_cpptest.h"
29 }
用 extern c 把原来的c 的 头文件包起来 让其兼容c++
#ifdef COMPILE_DL_CPPTEST
ZEND_GET_MODULE(cpptest)
#endif
修改为如下:
72 BEGIN_EXTERN_C()
73 ZEND_GET_MODULE(cpptest)
74 END_EXTERN_C()
用 BEGIN_EXTERN_C() 还有 END_EXTERN_C() 把 ZEND_GET_MODULE(cpptest) 包起来,最关键是:
#include "cpptest.h"
这个cpp的头文件要放在:
extern "C" { 的花括号里!!!
using std::string;
extern "C" {
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "cpptest.h"
否则会出现编译错误:错误:‘char* PHP_HELLO()’的早先声明有‘C++’链接 错误:与带有‘C’链接的新声明冲突,
再加入:
#ifdef COMPILE_DL_EXT_NAME
BEGIN_EXTERN_C()
ZEND_GET_MODULE(ext_name)
END_EXTERN_C()
#endif
为此,特别注意!!!
------------------------------------------------------------------------------------------------------------
然后可以 随便测试进入几个c++的 头文件
30 #include <iostream>
31 #include <string>
32 #include "cpptest.h"
33 using std::string;
修改一下示例
160 PHP_FUNCTION(confirm_cpptest_compiled)
161 {
174 int len;
175 char *strg;
176 strg=estrdup(PHP_HELLO());
177 std::cout<<strg<<std::endl;
178 len=strlen(strg);
179 RETURN_STRINGL(strg, len, 0);
180 // std::cout<<"hello world"<<std::endl;
181 }
182 char * PHP_HELLO()
183 {
184 string str("aaaaaa");
186 char * cp;
187 cp=estrdup(str.c_str());
188 return cp;
190
191 }
然后添加 cpptest.h
定义 PHP_HELLO()
char * PHP_HELLO();
然后 phpize
./configure --with-php-config=/data/app/php/bin/php-config
make
makeinstall
在 phpini中 引用 so文件
下边就可以测试啦
阅读全文
我想找一个类似于java中split那样的函数,支持C++字符串分割
比如
aabe(bbb)iefjij(bbb)(bbb)
用(bbb)分割得到
aabe
iefjij
fjdkfji
注:不用CString
今天用c++写了个分割字符串的函数,老是内存报错。在网上搜搜发现c的一个函数就可以搞定。
汗啊
c++
==========
find实现方法:函数参数类型:int =sting.find(string);
c++ substr的用法问题:
我的代码是这样的:
#include <iostream>
#include<string>
using namespace std;
void main()
{
string a;
getline(cin,a);
cout<<a.length()<<endl;
cout<<a.substr(1,1);
}
输出结果为输入的第二个字符,我很好奇substr中的两个参数是怎么截取中间部分的,还有这个函数的起始字符是用0来表示么?
最佳答案
下面给出解释:
substr 方法
返回一个从指定位置开始,并具有指定长度的子字符串。
参数
start
必选。所需的子字符串的起始位置。字符串中第一个字符的索引为 0。
length
可选项。返回的子字符串中包含的字符数。
备注
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到字符串的结尾。
看了上面这些应该就会明白了!!
来源:http://group.gimoo.net/review/60574
比如
aabe(bbb)iefjij(bbb)(bbb)
用(bbb)分割得到
aabe
iefjij
fjdkfji
注:不用CString
今天用c++写了个分割字符串的函数,老是内存报错。在网上搜搜发现c的一个函数就可以搞定。
汗啊
c++
==========
#include "stdafx.h"
#include <windows.h>
//查找字符串中的制定字符,并返回字符的位置
int strstrFindPos(char srcstr[],char deststr[] )
{
int j=0;
for (int i=0;srcstr[i]!='\0';i++)
{
if (deststr[0]==srcstr[i])
{
while (deststr[j]!='\0'&&srcstr[i+j]!='\0')
{
j++;
if (deststr[j]!=srcstr[i+j])
{
break;
}
}
}
if (deststr[j]=='\0')
{
return i;
}
}
return -1;
}
//截取字符串中的位置1到位置2的字符串
char* substr(char *des, char *src, int start, int end)
{
int i =0;
while(*src != '\0')
{
if((i >= start)&&(i<=end))
{
*des= *src; //[*]
des++;
};
i++;
src++;
};
*des= '\0';
return des;
}
int main(int argc, char* argv[])
{
char *cCode = "XXXXXX000000000000000000000001XXXXXX1111111111111111111111111112XXXXXX2222222222222222222223XXXXXX";
char *cAllCode = new char[];
char *cTempCode = new char[];
char *cNeedCode= new char[];
char *cOnlyCode ="XXXXXX";
char *cMyData = NULL;
int iPos = -1;
if ( cCode != NULL)
{
strcpy(cAllCode,cCode);
}
do{
substr(cTempCode, cAllCode,6,lstrlen(cAllCode));
iPos = strstrFindPos(cTempCode,cOnlyCode);
if (iPos > -1)
{
substr(cNeedCode,cTempCode,0,iPos -1);
printf("cNeedCode : %s \n" , cNeedCode);
substr(cAllCode, cTempCode,iPos,lstrlen(cTempCode));
}
}while (iPos > -1);
// delete cTempCode;
// delete cNeedCode;
delete cAllCode;
return 0;
}
#include <windows.h>
//查找字符串中的制定字符,并返回字符的位置
int strstrFindPos(char srcstr[],char deststr[] )
{
int j=0;
for (int i=0;srcstr[i]!='\0';i++)
{
if (deststr[0]==srcstr[i])
{
while (deststr[j]!='\0'&&srcstr[i+j]!='\0')
{
j++;
if (deststr[j]!=srcstr[i+j])
{
break;
}
}
}
if (deststr[j]=='\0')
{
return i;
}
}
return -1;
}
//截取字符串中的位置1到位置2的字符串
char* substr(char *des, char *src, int start, int end)
{
int i =0;
while(*src != '\0')
{
if((i >= start)&&(i<=end))
{
*des= *src; //[*]
des++;
};
i++;
src++;
};
*des= '\0';
return des;
}
int main(int argc, char* argv[])
{
char *cCode = "XXXXXX000000000000000000000001XXXXXX1111111111111111111111111112XXXXXX2222222222222222222223XXXXXX";
char *cAllCode = new char[];
char *cTempCode = new char[];
char *cNeedCode= new char[];
char *cOnlyCode ="XXXXXX";
char *cMyData = NULL;
int iPos = -1;
if ( cCode != NULL)
{
strcpy(cAllCode,cCode);
}
do{
substr(cTempCode, cAllCode,6,lstrlen(cAllCode));
iPos = strstrFindPos(cTempCode,cOnlyCode);
if (iPos > -1)
{
substr(cNeedCode,cTempCode,0,iPos -1);
printf("cNeedCode : %s \n" , cNeedCode);
substr(cAllCode, cTempCode,iPos,lstrlen(cTempCode));
}
}while (iPos > -1);
// delete cTempCode;
// delete cNeedCode;
delete cAllCode;
return 0;
}
find实现方法:函数参数类型:int =sting.find(string);
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
string a = "aaaAlice";
int pos = a.find("Alice");//pos = 3;
printf("%d\n",pos);
}
#include <string.h>
using namespace std;
int main()
{
string a = "aaaAlice";
int pos = a.find("Alice");//pos = 3;
printf("%d\n",pos);
}
c++ substr的用法问题:
我的代码是这样的:
#include <iostream>
#include<string>
using namespace std;
void main()
{
string a;
getline(cin,a);
cout<<a.length()<<endl;
cout<<a.substr(1,1);
}
输出结果为输入的第二个字符,我很好奇substr中的两个参数是怎么截取中间部分的,还有这个函数的起始字符是用0来表示么?
最佳答案
下面给出解释:
substr 方法
返回一个从指定位置开始,并具有指定长度的子字符串。
参数
start
必选。所需的子字符串的起始位置。字符串中第一个字符的索引为 0。
length
可选项。返回的子字符串中包含的字符数。
备注
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到字符串的结尾。
看了上面这些应该就会明白了!!
来源:http://group.gimoo.net/review/60574
经常有人问,你怎么这么大胆子跟腾讯打?他人多、钱多、产品多、用户黏性大、有自家媒体平台、有这种那种人脉资源。
我当然怕,而且也一直在躲腾讯,我也曾发短信给马化腾,想用资本合作的方法化解他对360的猜忌。马化腾是腾讯帝国的皇帝,坐到那个位子上看任何客户端,怎么都会觉得他们要夺权,要篡位。
其实,早在2008年,我就开始考虑这样一个问题:腾讯来了怎么办?
那个时候,360安全卫士的装机量已经过亿,但是我高兴不起来。我早就说过,做互联网的人,一定会遇到三个无法回避的问题:生、死、腾讯。腾讯就像一个天花板,你怎么长都要碰上他。他发现你长个儿了,就会自动往下沉,压缩你的生存空间,再把你压回小个子。
任何做客户端的都怕腾讯,怕就怕两个:第一个它模仿,做得虽然不如你好,但跟你差不多。而且,模仿在法律上根本没有办法限制。第二个,它的推广平台厉害,一天好几次给用户推,时间一长安装量自然就上去了。要是这样推不成,那就强行安装,QQ一升级,莫名其妙就多了一款QQ软件。这种方法再不行,那就往主程序里面捆。
马化腾自己也跟我说过,腾讯的策略就是这样,你做一个,我也做一个,让对手长不大。实在遏制不住,那就强行安装。当强行安装的时候,这说明腾讯很重视你了,但这不是好事。
今年春节,腾讯强行安装QQ医生,一夜之间市场覆盖率超过了40%,而且刻意避开北京、上海、广州,怕激起大批意见领袖的反对。像这样的推广是很让用户反感的,所以强行安装的开关应该是在马化腾手里的。这说明,马化腾是点了头的。
360一心一意做安全,根本不想去惹腾讯,我们也明白自己的实力。所以,我赶紧把春节放假的骨干召回来,在产品上下功夫。最后,QQ医生的体验不好,用户纷纷卸载,市场覆盖就落回到10%去了。
随后,QQ医生升级为电脑管家,全面抄袭360安全卫士。甚至有网友发现,QQ电脑管家的使用说明里还有“360安全中心”的字样。今年五一和中秋节,采取后台静默安装的方法。所谓静默安装,其实就是神不知鬼不觉地装进用户电脑里面,比强行安装还要恶劣。
QQ电脑管家完全符合2006年互联网协会规定的流氓软件八项标准,马化腾还是互联网协会副理事长。
腾讯公司这种不负责任的乱干,不仅对360来说是不公平的,而且使得互联网安全得不到保证。
有人会说我在装,拿着互联网安全这个大帽子来说事。我告诉你,他们推出QQ电脑管家,我们就在专业的安全论坛“卡饭”下载几个流行木马,测试结果是QQ电脑管家的木马查杀率很低。但是,QQ电脑管家的界面跟360安全卫士非常相似,用户可能会被诱导卸载了360安全卫士,替换成一个不能杀木马、不能保证安全的QQ电脑管家。
这说明,腾讯推QQ 电脑管家,不仅以流氓方式强行推广,而且根本没有社会责任感。
中国互联网很乱,丛林法则,弱肉强食。原因何在?就是因为中国的第一大互联网公司不愿意承担社会责任,反而是以流氓的方式对待竞争对手。如果你是个创业公司,抄袭别人的产品,强制推广一下自己的产品,别人也可以理解,因为对创业公司来说,生存是第一位的。但是,你每年收入200多亿元,市值3000多亿元,像团购这样的苍蝇上的那点肉也都不放过,也要跟创业公司去抢。
当腾讯胁迫用户二选一,逼着用户卸载360 软件,这更让我认识到这样一个事实:当一家企业处于垄断地位的时候,用户利益肯定是要让位于商业利益的。为了自己的商业利益,腾讯可以不顾用户的电脑安全,诱导用户安装木马查杀能力极差的QQ电脑医生;可以逼迫用户放弃自己喜欢的产品;可以故意制造360安全浏览器和部分QQ产品的不兼容。
可以这样说,创业企业必须要依靠提高用户体验的方式去竞争,而垄断企业更喜欢用伤害用户利益、伤害用户体验的方式去竞争。
我以前犯过这样的错误,眼里只有竞争对手,忘记了用户的利益。但现在互联网上,有很多人都在重蹈我当年的错误。我敢说,这样下去,他们肯定要失败。
况且,这几年来,我们做了这么多安全产品,细心发觉用户需求,在用户体验上很下功夫,用户很喜欢。这些产品,凝聚我们好几百人的心血,都是加班加点干出来的。你一个抄袭,一个强行安装,就要把我们的努力全给废了。
不仅对360是这样,腾讯对任何有发展潜力的软件都是如此。最近,腾讯抄袭UCWeb浏览器、抄袭酷狗音乐,分别被两个公司的创始人曝光。UCWeb的首席执行官俞永福在新浪微博(http://t.sina.com.cn)上不无讽刺地说:“如果三五岁孩子间抢饭吃,我们可以忍受,但是十三五岁的大孩子与三五岁孩子一起抢饭吃,就要谈谈规矩的问题。人身体长大了,自己的心智也要长大,知道什么是对的,什么是错的,什么是令人尊重的,什么是被人鄙夷的。”
但是,在互联网上,对腾讯公司这个庞然大物动不动就抄袭别人的劳动成果,根本没有什么有效的办法。当腾讯把抄袭+强制安装做到极致的时候,被抄袭的创业公司就只能是死路一条了。
所以,360不能再躲着腾讯了,360必须要抗争,为自己,为安全。
但是,要不被腾讯压制死,360自己的竞争策略也必须要有改变。其实,我们的思路很简单。腾讯做QQ电脑管家的目标就是要把360赶出市场,那我们就做一个产品,跟QQ结合在一起,让用户喜欢它,那么腾讯就赶不走我们了。简单的说,第一它要让QQ更安全,更好用,用户才会喜欢;第二要完全合法,不能用非法的手段去竞争。我们的目标也很简单,就是腾讯必须要尊重用户的利益,对待互联网创新企业必须要公平竞争。
强制弹窗、强制升级、强制扫描、强制推广,腾讯的商业模式就是建立在“强制”这两个字上。扣扣保镖让用户的QQ更安全,用户还可以管理QQ的弹窗和插件。它让用户更自由,所以用户很喜欢扣扣保镖对腾讯的商业模式产生了威胁,于是被腾讯诬蔑为非法外挂、超级大病毒。
在中国,互联网的竞争环境很恶劣。垄断势力不仅仗势欺人,用自己的市场地位欺负创业公司,甚至不惜牺牲用户的权益,强行胁迫用户卸载其他软件。它的门户网站利用新闻从业资格,张贴攻击竞争对手的大字报,变成了制假、造假的基地。这种垄断者肆无忌惮的霸道做法一天不改,互联网创新者一天就没活路,中国网民享受更多新、酷的服务的合法权益就会受到伤害。
在带领360往前冲的这几年,我曾经遇到过很多困难时刻。与既得利益集团做斗争,我承认有时候我会沮丧,会失望。但我还是有些个人英雄主义情结的,我是想改变一些东西,会让人们活得更好。
况且,我不是一个人在战斗,我身后还有亿万360用户,他们信任360,希望我们把互联网做得更安全;我背后还有充满激情和梦想的360团队,他们和我一样希望改变这个世界。
一想到这里,我就再次充满战斗力。想一想,360做安全这么多年,把用户放在心上,精心做产品。对用户的好,用户会放在心上。每一次360遭遇到打压,都是用户再把360托起来。
当360挺过这一关,我要衷心地说:我没有辜负你们。
我当然怕,而且也一直在躲腾讯,我也曾发短信给马化腾,想用资本合作的方法化解他对360的猜忌。马化腾是腾讯帝国的皇帝,坐到那个位子上看任何客户端,怎么都会觉得他们要夺权,要篡位。
其实,早在2008年,我就开始考虑这样一个问题:腾讯来了怎么办?
那个时候,360安全卫士的装机量已经过亿,但是我高兴不起来。我早就说过,做互联网的人,一定会遇到三个无法回避的问题:生、死、腾讯。腾讯就像一个天花板,你怎么长都要碰上他。他发现你长个儿了,就会自动往下沉,压缩你的生存空间,再把你压回小个子。
任何做客户端的都怕腾讯,怕就怕两个:第一个它模仿,做得虽然不如你好,但跟你差不多。而且,模仿在法律上根本没有办法限制。第二个,它的推广平台厉害,一天好几次给用户推,时间一长安装量自然就上去了。要是这样推不成,那就强行安装,QQ一升级,莫名其妙就多了一款QQ软件。这种方法再不行,那就往主程序里面捆。
马化腾自己也跟我说过,腾讯的策略就是这样,你做一个,我也做一个,让对手长不大。实在遏制不住,那就强行安装。当强行安装的时候,这说明腾讯很重视你了,但这不是好事。
今年春节,腾讯强行安装QQ医生,一夜之间市场覆盖率超过了40%,而且刻意避开北京、上海、广州,怕激起大批意见领袖的反对。像这样的推广是很让用户反感的,所以强行安装的开关应该是在马化腾手里的。这说明,马化腾是点了头的。
360一心一意做安全,根本不想去惹腾讯,我们也明白自己的实力。所以,我赶紧把春节放假的骨干召回来,在产品上下功夫。最后,QQ医生的体验不好,用户纷纷卸载,市场覆盖就落回到10%去了。
随后,QQ医生升级为电脑管家,全面抄袭360安全卫士。甚至有网友发现,QQ电脑管家的使用说明里还有“360安全中心”的字样。今年五一和中秋节,采取后台静默安装的方法。所谓静默安装,其实就是神不知鬼不觉地装进用户电脑里面,比强行安装还要恶劣。
QQ电脑管家完全符合2006年互联网协会规定的流氓软件八项标准,马化腾还是互联网协会副理事长。
腾讯公司这种不负责任的乱干,不仅对360来说是不公平的,而且使得互联网安全得不到保证。
有人会说我在装,拿着互联网安全这个大帽子来说事。我告诉你,他们推出QQ电脑管家,我们就在专业的安全论坛“卡饭”下载几个流行木马,测试结果是QQ电脑管家的木马查杀率很低。但是,QQ电脑管家的界面跟360安全卫士非常相似,用户可能会被诱导卸载了360安全卫士,替换成一个不能杀木马、不能保证安全的QQ电脑管家。
这说明,腾讯推QQ 电脑管家,不仅以流氓方式强行推广,而且根本没有社会责任感。
中国互联网很乱,丛林法则,弱肉强食。原因何在?就是因为中国的第一大互联网公司不愿意承担社会责任,反而是以流氓的方式对待竞争对手。如果你是个创业公司,抄袭别人的产品,强制推广一下自己的产品,别人也可以理解,因为对创业公司来说,生存是第一位的。但是,你每年收入200多亿元,市值3000多亿元,像团购这样的苍蝇上的那点肉也都不放过,也要跟创业公司去抢。
当腾讯胁迫用户二选一,逼着用户卸载360 软件,这更让我认识到这样一个事实:当一家企业处于垄断地位的时候,用户利益肯定是要让位于商业利益的。为了自己的商业利益,腾讯可以不顾用户的电脑安全,诱导用户安装木马查杀能力极差的QQ电脑医生;可以逼迫用户放弃自己喜欢的产品;可以故意制造360安全浏览器和部分QQ产品的不兼容。
可以这样说,创业企业必须要依靠提高用户体验的方式去竞争,而垄断企业更喜欢用伤害用户利益、伤害用户体验的方式去竞争。
我以前犯过这样的错误,眼里只有竞争对手,忘记了用户的利益。但现在互联网上,有很多人都在重蹈我当年的错误。我敢说,这样下去,他们肯定要失败。
况且,这几年来,我们做了这么多安全产品,细心发觉用户需求,在用户体验上很下功夫,用户很喜欢。这些产品,凝聚我们好几百人的心血,都是加班加点干出来的。你一个抄袭,一个强行安装,就要把我们的努力全给废了。
不仅对360是这样,腾讯对任何有发展潜力的软件都是如此。最近,腾讯抄袭UCWeb浏览器、抄袭酷狗音乐,分别被两个公司的创始人曝光。UCWeb的首席执行官俞永福在新浪微博(http://t.sina.com.cn)上不无讽刺地说:“如果三五岁孩子间抢饭吃,我们可以忍受,但是十三五岁的大孩子与三五岁孩子一起抢饭吃,就要谈谈规矩的问题。人身体长大了,自己的心智也要长大,知道什么是对的,什么是错的,什么是令人尊重的,什么是被人鄙夷的。”
但是,在互联网上,对腾讯公司这个庞然大物动不动就抄袭别人的劳动成果,根本没有什么有效的办法。当腾讯把抄袭+强制安装做到极致的时候,被抄袭的创业公司就只能是死路一条了。
所以,360不能再躲着腾讯了,360必须要抗争,为自己,为安全。
但是,要不被腾讯压制死,360自己的竞争策略也必须要有改变。其实,我们的思路很简单。腾讯做QQ电脑管家的目标就是要把360赶出市场,那我们就做一个产品,跟QQ结合在一起,让用户喜欢它,那么腾讯就赶不走我们了。简单的说,第一它要让QQ更安全,更好用,用户才会喜欢;第二要完全合法,不能用非法的手段去竞争。我们的目标也很简单,就是腾讯必须要尊重用户的利益,对待互联网创新企业必须要公平竞争。
强制弹窗、强制升级、强制扫描、强制推广,腾讯的商业模式就是建立在“强制”这两个字上。扣扣保镖让用户的QQ更安全,用户还可以管理QQ的弹窗和插件。它让用户更自由,所以用户很喜欢扣扣保镖对腾讯的商业模式产生了威胁,于是被腾讯诬蔑为非法外挂、超级大病毒。
在中国,互联网的竞争环境很恶劣。垄断势力不仅仗势欺人,用自己的市场地位欺负创业公司,甚至不惜牺牲用户的权益,强行胁迫用户卸载其他软件。它的门户网站利用新闻从业资格,张贴攻击竞争对手的大字报,变成了制假、造假的基地。这种垄断者肆无忌惮的霸道做法一天不改,互联网创新者一天就没活路,中国网民享受更多新、酷的服务的合法权益就会受到伤害。
在带领360往前冲的这几年,我曾经遇到过很多困难时刻。与既得利益集团做斗争,我承认有时候我会沮丧,会失望。但我还是有些个人英雄主义情结的,我是想改变一些东西,会让人们活得更好。
况且,我不是一个人在战斗,我身后还有亿万360用户,他们信任360,希望我们把互联网做得更安全;我背后还有充满激情和梦想的360团队,他们和我一样希望改变这个世界。
一想到这里,我就再次充满战斗力。想一想,360做安全这么多年,把用户放在心上,精心做产品。对用户的好,用户会放在心上。每一次360遭遇到打压,都是用户再把360托起来。
当360挺过这一关,我要衷心地说:我没有辜负你们。