(亮点在于对爱情的产品分析) 本人乃一介布衣,以产品经理的外皮苟活于世,不敢说混的太好,可是好歹懂得一些产品类浅显的道理!那天在《非诚勿扰》的舞台上用产品的角度片面的分析了一下爱情,觉得很不过瘾,于是今天做个稍微全面点的分析吧。 首先,告诉大家,产品中有这么几个比较重要的对象: 。 1、产品:能满足用户需求的有形或者无形的集合。 2、需求:用户希望产品能够解决的问题。 3、用户:使用产品的人。 一个产品可能同时满足用户很多需求,比如一把雨伞可以遮阳,可以挡雨,有时候也能够当做自慰器,更有时可能被当成MP3,这都是一把雨伞所满足用户的需求。 但是这些需求不管大小,皆可以归纳分成三类: 1、必备需求:这类需求构成产品的主框架,若无这些,则无产品。比如一把雨伞,那么他的必备需求就是挡雨或者遮阳。
2、扩展需求:这类需求通常是可有可无的,当然有了更好。比如一把雨伞,不光可以挡雨或者遮阳,还能当做MP3 或者自慰器,那么这个就是扩展需求。
3、增值需求:这类需求一般是潜在的,但是却会影响产品在未来的价值。比如这把雨伞是迈克尔杰克逊用过的,那么折伞就很值钱了。
那么用户呢?其实也可以分为三种:
1、 基础用户或稳定用户。这类用户首先看重的是产品所能满足的基础需求,次要看重的是产品的扩展需求。这类用户理性,且稳定,也是占最大比例的用户。
2、 投机用户或聪明用户。这类用户首先看重的也是产品所能满足的基础需求,但是次要看重的是产品的增值需求。这类用户聪明,且极具投机能力,往往在最后会获得更大的价值。他们占据用户中的第二大的比例。
3、 不理智用户或傻子用户。这类用户往往首先看重的是产品的扩展需求,而忽略掉基础和增值需求,当产品的扩展功能出现问题时,往往他们将失去基础需求,最终导致产品崩溃,被淘汰。他们占据用户中最小的比例。
分析如下: 男人为产品,女人为用户。 当男人为一个产品,满足女人对她们的期望时。
基础需求:男人是否爱女人,是否能让女人吃饱穿暖。
扩展需求:男人很帅,并且有很多钱,能让女人吃好穿好。
增值需求:虽然男人现在没有能力让女人吃好穿好,但是在将来,会成长为让女人吃好穿好过上付裕生活的男人。
这时候女人(即用户)也分为如下三种:
1、 稳定的女人:她们看重的是男人是否爱她,能否让他们吃饱穿暖,过上平凡踏实的生活。当然,如果男人能够有点钱,或者长得帅一点,更好。
2、 聪明的女人:她们看重的也是男人是否爱她,能否让他们吃饱穿暖,过上平凡踏实的生活。不过跟第一种不同的是,他们更加能看到男人的潜力,也就是说,他们在乎的是这个男人是否是潜力股,能否在将来变得事业有成,挣很多钱,让他们过上富足的生活。
3、 傻女人:她们只看重男人是否有钱,是否长得帅气,却忽略掉这个男人本身所具有的能力。如果在将来这个男人一旦失去了扩展需求,比如突然某一天变穷了,没钱了,或者毁容了,那么这个女人可能连最基础的需求都不能被满足,说白了,就是这个男人都没有能力靠自己的本事让心爱的女人吃饱穿暖。那么这段爱情就结束了! 不过也有一种可能,就是她们的男人越来越有钱,也就是产品越来越优秀,那么这个产品将会变得更加抢手,会有更多优秀的用户来获取产品,也就是她们手中的男人。如果这些女人如果没本事了,那么婚外恋,小三等等,就发生了! 女人为产品,满足男人对他们的期望时。 基础需求:这个女人是否善良,勤俭持家,孝顺,是否深爱着男人。 扩展需求:这个女人身材好,长得漂亮。 增值需求:这个女人有旺夫之能,将来会辅佐丈夫,让丈夫作为产品的增值需求变大。
这时候男人(即用户)也分为如下三种:
1、 稳定的男人:他们最先看重的是女人是否善良,勤俭持家,孝顺,是否爱他们。其次如果这个女人身材好点,长得漂亮一些。 2、 聪明的男人:他们最先看重的也是女人是否善良,勤俭持家,孝顺,是否爱他们。不过其次他们看重的是这个女人将来能否帮助他们在事业或者别的方面取得成功。
3、 傻男人:他们看重的只有女人的脸蛋和身材,其他的一概不顾。这样,他们就会让自己变得很累。让自己从一个用户,活活的变成一个产品,让自己变成更强大的产品来吸引住女人。因为傻男人太多太多了,而身材好、脸蛋好的用户太少了。于是,男人一辈子活得很累,稍有不顺,手头的产品就被别人抢走了。 不过也有一种可能,就是这个女人又善良,又勤俭持家,又孝顺,又爱他们,然后长得又漂亮,身材又好,还能辅佐他们事业成功。这样的结果,就是男人开心顺心的去工作,衣食无忧,生活幸福。 这就是我从产品的角度来分析的爱情,说的不一定对,大家见谅
2、扩展需求:这类需求通常是可有可无的,当然有了更好。比如一把雨伞,不光可以挡雨或者遮阳,还能当做MP3 或者自慰器,那么这个就是扩展需求。
3、增值需求:这类需求一般是潜在的,但是却会影响产品在未来的价值。比如这把雨伞是迈克尔杰克逊用过的,那么折伞就很值钱了。
那么用户呢?其实也可以分为三种:
1、 基础用户或稳定用户。这类用户首先看重的是产品所能满足的基础需求,次要看重的是产品的扩展需求。这类用户理性,且稳定,也是占最大比例的用户。
2、 投机用户或聪明用户。这类用户首先看重的也是产品所能满足的基础需求,但是次要看重的是产品的增值需求。这类用户聪明,且极具投机能力,往往在最后会获得更大的价值。他们占据用户中的第二大的比例。
3、 不理智用户或傻子用户。这类用户往往首先看重的是产品的扩展需求,而忽略掉基础和增值需求,当产品的扩展功能出现问题时,往往他们将失去基础需求,最终导致产品崩溃,被淘汰。他们占据用户中最小的比例。
分析如下: 男人为产品,女人为用户。 当男人为一个产品,满足女人对她们的期望时。
基础需求:男人是否爱女人,是否能让女人吃饱穿暖。
扩展需求:男人很帅,并且有很多钱,能让女人吃好穿好。
增值需求:虽然男人现在没有能力让女人吃好穿好,但是在将来,会成长为让女人吃好穿好过上付裕生活的男人。
这时候女人(即用户)也分为如下三种:
1、 稳定的女人:她们看重的是男人是否爱她,能否让他们吃饱穿暖,过上平凡踏实的生活。当然,如果男人能够有点钱,或者长得帅一点,更好。
2、 聪明的女人:她们看重的也是男人是否爱她,能否让他们吃饱穿暖,过上平凡踏实的生活。不过跟第一种不同的是,他们更加能看到男人的潜力,也就是说,他们在乎的是这个男人是否是潜力股,能否在将来变得事业有成,挣很多钱,让他们过上富足的生活。
3、 傻女人:她们只看重男人是否有钱,是否长得帅气,却忽略掉这个男人本身所具有的能力。如果在将来这个男人一旦失去了扩展需求,比如突然某一天变穷了,没钱了,或者毁容了,那么这个女人可能连最基础的需求都不能被满足,说白了,就是这个男人都没有能力靠自己的本事让心爱的女人吃饱穿暖。那么这段爱情就结束了! 不过也有一种可能,就是她们的男人越来越有钱,也就是产品越来越优秀,那么这个产品将会变得更加抢手,会有更多优秀的用户来获取产品,也就是她们手中的男人。如果这些女人如果没本事了,那么婚外恋,小三等等,就发生了! 女人为产品,满足男人对他们的期望时。 基础需求:这个女人是否善良,勤俭持家,孝顺,是否深爱着男人。 扩展需求:这个女人身材好,长得漂亮。 增值需求:这个女人有旺夫之能,将来会辅佐丈夫,让丈夫作为产品的增值需求变大。
这时候男人(即用户)也分为如下三种:
1、 稳定的男人:他们最先看重的是女人是否善良,勤俭持家,孝顺,是否爱他们。其次如果这个女人身材好点,长得漂亮一些。 2、 聪明的男人:他们最先看重的也是女人是否善良,勤俭持家,孝顺,是否爱他们。不过其次他们看重的是这个女人将来能否帮助他们在事业或者别的方面取得成功。
3、 傻男人:他们看重的只有女人的脸蛋和身材,其他的一概不顾。这样,他们就会让自己变得很累。让自己从一个用户,活活的变成一个产品,让自己变成更强大的产品来吸引住女人。因为傻男人太多太多了,而身材好、脸蛋好的用户太少了。于是,男人一辈子活得很累,稍有不顺,手头的产品就被别人抢走了。 不过也有一种可能,就是这个女人又善良,又勤俭持家,又孝顺,又爱他们,然后长得又漂亮,身材又好,还能辅佐他们事业成功。这样的结果,就是男人开心顺心的去工作,衣食无忧,生活幸福。 这就是我从产品的角度来分析的爱情,说的不一定对,大家见谅
步骤:
1、数据库----反向工程
2、在反向工程向导中选择--设置--然后选择---Microsoft--ODBC-for--oracle
3、新建数据源---选择用户数据源----Microsoft--ODBC-for--oracle
4、输入用户名和数据库名
5、输入数据库密码---选择需要绘制的表
来源:http://www.newwhy.com/2010/0912/14288.html
在日常的工作中,你或许经常用到数据库。当然,首先,你要先对数据库的结构及关系进行设计,当然,如果你首先用visio来画出你要的图形这样对于理清思路是很有帮助的。不过,在许多时候,你可能需要维护现有的数据库,并要理清现有数据库的表与表之间的关系。你仍然可以采用visio.visio有一项非常有意思的功能,叫做反向工程功能。一般而言,visio对数据库的连接是通过ODBC进行的,新建一个图表,在模型中找到数据库下面的数据库模型,在菜单栏中会多出一项数据库,在里面找到反向工程,然后,按照提示走即可了。对于mysql或是postgresql这样的开源数据库,你或许需要先安装其connect,如mysql connect,然后按提示即可自动绘出你所要的图形,简单再通过自己的润色即可得出你所要的结果,如何,很有意思也可以很迅速的提高工作效率吧。
具体操作:
三步走。
<1>建立数据源
打开控制面板—>管理工具—>数据源 (ODBC),或直接运行odbccp32.cpl命令。打开ODBC数据源管理器。添加一个系统数据源。选择Sql Server作为数据源的驱动程序,键入数据源名称demo,选择合适的sql server服务器,然后一路默认下去。(在后面的步骤中可以选择需要进行反向工程的数据库,默认是master)数据源信息如图一示。
<2>在visio中新建数据库模型图
打开visio 2003,文件—>新建—>数据库—>数据库模型图。建立数据库模型图之后,菜单栏多出一个菜单项"数据库"。
<3>反向工程
菜单项数据库—>反向工程。启动反向工程向导,一步步完成反向工程设置。
1.建立与数据库的连接。选择visio驱动程序的类型决定了可以连接的数据库类型及可用选项。数据源指定数据库位置及连接信息。这里我们选择visio驱动程序为Microsoft Sql Server,数据源为刚建立的demo。如图二示。
2.连接数据源。输入用户名和密码用于连接数据源。
3.选择要进行反向工程的对象类型,如图三示。
4.选择要进行反向工程的表和视图。
5.选择要进行么向工程的存储过程。
6.是否想让选择了反向工程的项添加到当前工程中。选择是才能生成图。
结果大致向下面这样。
复制来源参考:http://www.cnblogs.com/sharpaxe/articles/555276.html
Mysql:
Mysql ODBC驱动包 5.1 For WIN32
下载参考:http://www.hzzhit.com/blog/tool/Mysql-ODBC-driver.html
官方下载:http://dev.mysql.com/downloads/connector/odbc/3.51.html
老外下载:http://www.freewarefiles.com/downloads_counter.php?programid=19970
1、数据库----反向工程
2、在反向工程向导中选择--设置--然后选择---Microsoft--ODBC-for--oracle
3、新建数据源---选择用户数据源----Microsoft--ODBC-for--oracle
4、输入用户名和数据库名
5、输入数据库密码---选择需要绘制的表
来源:http://www.newwhy.com/2010/0912/14288.html
在日常的工作中,你或许经常用到数据库。当然,首先,你要先对数据库的结构及关系进行设计,当然,如果你首先用visio来画出你要的图形这样对于理清思路是很有帮助的。不过,在许多时候,你可能需要维护现有的数据库,并要理清现有数据库的表与表之间的关系。你仍然可以采用visio.visio有一项非常有意思的功能,叫做反向工程功能。一般而言,visio对数据库的连接是通过ODBC进行的,新建一个图表,在模型中找到数据库下面的数据库模型,在菜单栏中会多出一项数据库,在里面找到反向工程,然后,按照提示走即可了。对于mysql或是postgresql这样的开源数据库,你或许需要先安装其connect,如mysql connect,然后按提示即可自动绘出你所要的图形,简单再通过自己的润色即可得出你所要的结果,如何,很有意思也可以很迅速的提高工作效率吧。
具体操作:
三步走。
<1>建立数据源
打开控制面板—>管理工具—>数据源 (ODBC),或直接运行odbccp32.cpl命令。打开ODBC数据源管理器。添加一个系统数据源。选择Sql Server作为数据源的驱动程序,键入数据源名称demo,选择合适的sql server服务器,然后一路默认下去。(在后面的步骤中可以选择需要进行反向工程的数据库,默认是master)数据源信息如图一示。
<2>在visio中新建数据库模型图
打开visio 2003,文件—>新建—>数据库—>数据库模型图。建立数据库模型图之后,菜单栏多出一个菜单项"数据库"。
<3>反向工程
菜单项数据库—>反向工程。启动反向工程向导,一步步完成反向工程设置。
1.建立与数据库的连接。选择visio驱动程序的类型决定了可以连接的数据库类型及可用选项。数据源指定数据库位置及连接信息。这里我们选择visio驱动程序为Microsoft Sql Server,数据源为刚建立的demo。如图二示。
2.连接数据源。输入用户名和密码用于连接数据源。
3.选择要进行反向工程的对象类型,如图三示。
4.选择要进行反向工程的表和视图。
5.选择要进行么向工程的存储过程。
6.是否想让选择了反向工程的项添加到当前工程中。选择是才能生成图。
结果大致向下面这样。
复制来源参考:http://www.cnblogs.com/sharpaxe/articles/555276.html
Mysql:
Mysql ODBC驱动包 5.1 For WIN32
下载参考:http://www.hzzhit.com/blog/tool/Mysql-ODBC-driver.html
官方下载:http://dev.mysql.com/downloads/connector/odbc/3.51.html
老外下载:http://www.freewarefiles.com/downloads_counter.php?programid=19970
为何模拟浏览器的cookie,或者登陆,必须要再别的url抓取cookie,然后再模拟cookie发出:
curl:
把curl_setopt($ch,CURLOPT_HEADER,false)就行了。
需要展现cookie:
//打开cookie显示!!!
curl:
把curl_setopt($ch,CURLOPT_HEADER,false)就行了。
需要展现cookie:
curl_setopt ( $ch_curl, CURLOPT_HEADER, true);
//打开cookie显示!!!
function curl_post($url, $content)
{
//echo $url;
//echo $content;
$str_url = $url;
$str_post_data = $content;
$ch_curl = curl_init ();
curl_setopt ( $ch_curl, CURLOPT_TIMEOUT, 3 );
curl_setopt ( $ch_curl, CURLOPT_HEADER, true);
curl_setopt ( $ch_curl, CURLOPT_POST, 1 );
curl_setopt ( $ch_curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch_curl, CURLOPT_URL, $str_url );
curl_setopt ( $ch_curl, CURLOPT_POSTFIELDS, $str_post_data );
$str_return = curl_exec ( $ch_curl );
if ($str_return === false)
return false;
curl_close ( $ch_curl );
return $str_return;
}
{
//echo $url;
//echo $content;
$str_url = $url;
$str_post_data = $content;
$ch_curl = curl_init ();
curl_setopt ( $ch_curl, CURLOPT_TIMEOUT, 3 );
curl_setopt ( $ch_curl, CURLOPT_HEADER, true);
curl_setopt ( $ch_curl, CURLOPT_POST, 1 );
curl_setopt ( $ch_curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch_curl, CURLOPT_URL, $str_url );
curl_setopt ( $ch_curl, CURLOPT_POSTFIELDS, $str_post_data );
$str_return = curl_exec ( $ch_curl );
if ($str_return === false)
return false;
curl_close ( $ch_curl );
return $str_return;
}
如何把find的文件按时间排序?从最早到现在
如果你的文件数量不大
可以用ls -rt $(find . -type f) 来实现
find /path|xargs ls -lt
Demo:
常用两天前修改过的文件:
======
1)3天内修改过的文件:
2)find命令使用超过6天,空文件独立查询命令。
3)查找超过6天且是空文件的find命令:
阅读全文
如果你的文件数量不大
可以用ls -rt $(find . -type f) 来实现
find /path|xargs ls -lt
Demo:
常用两天前修改过的文件:
======
1)3天内修改过的文件:
2)find命令使用超过6天,空文件独立查询命令。
3)查找超过6天且是空文件的find命令:
阅读全文
0)Python3安装Mysql扩展命令:
pip install pymysql
1)建数据库:
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
2)给库授权:
grant all privileges on test.* to root@127.0.0.1 identified by "test123";
flush privileges;
3)建表:
4)灌入数据:
5)查询:
mysql> select * from person;
+----+------------+------+--------+----------+------------+---------+
| id | name | age | sex | salary | hire_date | dept_id |
+----+------------+------+--------+----------+------------+---------+
| 1 | alex | 28 | 人妖 | 53000.00 | 2010-06-21 | 1 |
| 2 | wupeiqi | 23 | 男 | 8000.00 | 2011-02-21 | 1 |
| 3 | egon | 30 | 男 | 6500.00 | 2015-06-21 | 1 |
| 4 | jingnvshen | 18 | 女 | 6680.00 | 2014-06-21 | 1 |
+----+------------+------+--------+----------+------------+---------+
6)写Python连接代码,mysqlconn.py:
7)运行mysqlconn.py:
python mysqlconn.py
ID: 1 名字: alex 性别: 28
ID: 2 名字: wupeiqi 性别: 23
ID: 3 名字: egon 性别: 30
ID: 4 名字: jingnvshen 性别: 18
最后备注,mysql -h localhost -u root -p (/root/.my.cnf里默认是Localhost的密码)
cat /root/.my.cnf 里的密码,可以登录。
pip install pymysql
1)建数据库:
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
2)给库授权:
grant all privileges on test.* to root@127.0.0.1 identified by "test123";
flush privileges;
3)建表:
4)灌入数据:
5)查询:
mysql> select * from person;
+----+------------+------+--------+----------+------------+---------+
| id | name | age | sex | salary | hire_date | dept_id |
+----+------------+------+--------+----------+------------+---------+
| 1 | alex | 28 | 人妖 | 53000.00 | 2010-06-21 | 1 |
| 2 | wupeiqi | 23 | 男 | 8000.00 | 2011-02-21 | 1 |
| 3 | egon | 30 | 男 | 6500.00 | 2015-06-21 | 1 |
| 4 | jingnvshen | 18 | 女 | 6680.00 | 2014-06-21 | 1 |
+----+------------+------+--------+----------+------------+---------+
6)写Python连接代码,mysqlconn.py:
7)运行mysqlconn.py:
python mysqlconn.py
ID: 1 名字: alex 性别: 28
ID: 2 名字: wupeiqi 性别: 23
ID: 3 名字: egon 性别: 30
ID: 4 名字: jingnvshen 性别: 18
最后备注,mysql -h localhost -u root -p (/root/.my.cnf里默认是Localhost的密码)
cat /root/.my.cnf 里的密码,可以登录。
这是根据自己的笔记整理的,如有错误,欢迎指出来.
tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.
在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);
在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.
linux下可用sysctl -a | grep net.ipv4.tcp_wmem查看系统默认的发送缓存大小:
net.ipv4.tcp_wmem = 4096 16384 81920
这有三个值,第一个值是socket的发送缓存区分配的最少字节数,第二个值是默认值(该值会被net.core.wmem_default覆盖),缓存区在系统负载不重的情况下可以增长到这个值,第三个值是发送缓存区空间的最大字节数(该值会被net.core.wmem_max覆盖).
根据实际测试,如果手工更改了net.ipv4.tcp_wmem的值,则会按更改的值来运行,否则在默认情况下,协议栈通常是按net.core.wmem_default和net.core.wmem_max的值来分配内存的.
应用程序应该根据应用的特性在程序中更改发送缓存大小:
socklen_t sendbuflen = 0;
socklen_t len = sizeof(sendbuflen);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("default,sendbuf:%d\n", sendbuflen);
sendbuflen = 10240;
setsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, len);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("now,sendbuf:%d\n", sendbuflen);
需要注意的是,虽然将发送缓存设置成了10k,但实际上,协议栈会将其扩大1倍,设为20k.
-------------------实例分析----------------------
在实际应用中,如果发送端是非阻塞发送,由于网络的阻塞或者接收端处理过慢,通常出现的情况是,发送应用程序看起来发送了10k的数据,但是只发送了2k到对端缓存中,还有8k在本机缓存中(未发送或者未得到接收端的确认).那么此时,接收应用程序能够收到的数据为2k.假如接收应用程序调用recv函数获取了1k的数据在处理,在这个瞬间,发生了以下情况之一:
A. 发送应用程序认为send完了10k数据,关闭了socket:
发送主机作为tcp的主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack),并且,发送缓存中的8k数据并不清除,依然会发送给对端.如果接收应用程序依然在recv,那么它会收到余下的8k数据(这个前题是,接收端会在发送端FIN_WAIT1状态超时前收到余下的8k数据.),然后得到一个对端socket被关闭的消息(recv返回0).这时,应该进行关闭.
B. 发送应用程序再次调用send发送8k的数据:
假如发送缓存的空间为20k,那么发送缓存可用空间为20-8=12k,大于请求发送的8k,所以send函数将数据做拷贝后,并立即返回8192;
假如发送缓存的空间为12k,那么此时发送缓存可用空间还有12-8=4k,send()会返回4096,应用程序发现返回的值小于请求发送的大小值后,可以认为缓存区已满,这时必须阻塞(或通过select等待下一次socket可写的信号),如果应用程序不理会,立即再次调用send,那么会得到-1的值,在linux下表现为errno=EAGAIN.
C. 接收应用程序在处理完1k数据后,关闭了socket:
接收主机作为主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack).然后,发送应用程序会收到socket可读的信号(通常是select调用返回socket可读),但在读取时会发现recv函数返回0,这时应该调用close函数来关闭socket(发送给对方ack);
如果发送应用程序没有处理这个可读的信号,而是继续调用send,那么第一次会像往常一样继续填充缓存区,然后返回,但如果再次调用send,进程会收到SIGPIPE信号,该信号的默认响应动作是退出进程.
D. 交换机或路由器的网络断开:
接收应用程序在处理完已收到的1k数据后,会继续从缓存区读取余下的1k数据,然后就表现为无数据可读的现象,这种情况需要应用程序来处理超时.一般做法是设定一个select等待的最大时间,如果超出这个时间依然没有数据可读,则认为socket已不可用.
发送应用程序会不断的将余下的数据发送到网络上,但始终得不到确认,所以缓存区的可用空间持续为0,这种情况也需要应用程序来处理.
如果不由应用程序来处理这种情况超时的情况,也可以通过tcp协议本身来处理,具体可以查看sysctl项中的:
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time
所以,要想编写优秀的socket程序也是很不容易的.特别是在为应用做优化时,很多工作都非常的烦琐.
来源:http://blog.chinaunix.net/u2/76292/showart.php?id=2406631
tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.
在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);
在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.
linux下可用sysctl -a | grep net.ipv4.tcp_wmem查看系统默认的发送缓存大小:
net.ipv4.tcp_wmem = 4096 16384 81920
这有三个值,第一个值是socket的发送缓存区分配的最少字节数,第二个值是默认值(该值会被net.core.wmem_default覆盖),缓存区在系统负载不重的情况下可以增长到这个值,第三个值是发送缓存区空间的最大字节数(该值会被net.core.wmem_max覆盖).
根据实际测试,如果手工更改了net.ipv4.tcp_wmem的值,则会按更改的值来运行,否则在默认情况下,协议栈通常是按net.core.wmem_default和net.core.wmem_max的值来分配内存的.
应用程序应该根据应用的特性在程序中更改发送缓存大小:
socklen_t sendbuflen = 0;
socklen_t len = sizeof(sendbuflen);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("default,sendbuf:%d\n", sendbuflen);
sendbuflen = 10240;
setsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, len);
getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);
printf("now,sendbuf:%d\n", sendbuflen);
需要注意的是,虽然将发送缓存设置成了10k,但实际上,协议栈会将其扩大1倍,设为20k.
-------------------实例分析----------------------
在实际应用中,如果发送端是非阻塞发送,由于网络的阻塞或者接收端处理过慢,通常出现的情况是,发送应用程序看起来发送了10k的数据,但是只发送了2k到对端缓存中,还有8k在本机缓存中(未发送或者未得到接收端的确认).那么此时,接收应用程序能够收到的数据为2k.假如接收应用程序调用recv函数获取了1k的数据在处理,在这个瞬间,发生了以下情况之一:
A. 发送应用程序认为send完了10k数据,关闭了socket:
发送主机作为tcp的主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack),并且,发送缓存中的8k数据并不清除,依然会发送给对端.如果接收应用程序依然在recv,那么它会收到余下的8k数据(这个前题是,接收端会在发送端FIN_WAIT1状态超时前收到余下的8k数据.),然后得到一个对端socket被关闭的消息(recv返回0).这时,应该进行关闭.
B. 发送应用程序再次调用send发送8k的数据:
假如发送缓存的空间为20k,那么发送缓存可用空间为20-8=12k,大于请求发送的8k,所以send函数将数据做拷贝后,并立即返回8192;
假如发送缓存的空间为12k,那么此时发送缓存可用空间还有12-8=4k,send()会返回4096,应用程序发现返回的值小于请求发送的大小值后,可以认为缓存区已满,这时必须阻塞(或通过select等待下一次socket可写的信号),如果应用程序不理会,立即再次调用send,那么会得到-1的值,在linux下表现为errno=EAGAIN.
C. 接收应用程序在处理完1k数据后,关闭了socket:
接收主机作为主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack).然后,发送应用程序会收到socket可读的信号(通常是select调用返回socket可读),但在读取时会发现recv函数返回0,这时应该调用close函数来关闭socket(发送给对方ack);
如果发送应用程序没有处理这个可读的信号,而是继续调用send,那么第一次会像往常一样继续填充缓存区,然后返回,但如果再次调用send,进程会收到SIGPIPE信号,该信号的默认响应动作是退出进程.
D. 交换机或路由器的网络断开:
接收应用程序在处理完已收到的1k数据后,会继续从缓存区读取余下的1k数据,然后就表现为无数据可读的现象,这种情况需要应用程序来处理超时.一般做法是设定一个select等待的最大时间,如果超出这个时间依然没有数据可读,则认为socket已不可用.
发送应用程序会不断的将余下的数据发送到网络上,但始终得不到确认,所以缓存区的可用空间持续为0,这种情况也需要应用程序来处理.
如果不由应用程序来处理这种情况超时的情况,也可以通过tcp协议本身来处理,具体可以查看sysctl项中的:
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time
所以,要想编写优秀的socket程序也是很不容易的.特别是在为应用做优化时,很多工作都非常的烦琐.
来源:http://blog.chinaunix.net/u2/76292/showart.php?id=2406631
101007 22:30:31 [ERROR] Can't open the mysql.plugin table. Please run the mysql_upgrade script to create it.
101007 22:30:31 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
101007 22:30:31 mysqld ended
再源码下面执行,如下:
linux-Jack-nb4:~/webserver/mysql-5.1.12-beta # ./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/var
Installing all prepared tables
Fill help tables
To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/local/mysql/bin/mysqladmin -u root password 'new-password'
/usr/local/mysql/bin/mysqladmin -u root -h linux-Jack-nb4 password 'new-password'
See the manual for more instructions.
NOTE: If you are upgrading from a MySQL <= 3.22.10 you should run
the /usr/local/mysql/bin/mysql_fix_privilege_tables. Otherwise you will not be
able to use the new GRANT command!
You can start the MySQL daemon with:
cd /usr/local/mysql ; /usr/local/mysql/bin/mysqld_safe &
Please report any problems with the /usr/local/mysql/bin/mysqlbug script!
The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com
Mysql运行Ok了:
linux-Jack-nb4:~/webserver/mysql-5.1.12-beta # ps aux|grep mysql
root 5515 0.0 0.1 2804 1312 pts/0 S 22:40 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 5566 0.3 1.6 81984 13132 pts/0 Sl 22:40 0:01 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user=mysql --pid-file=/usr/local/mysql/var/linux-Jack-nb4.pid --log-error=/usr/local/mysql/var/linux-Jack-nb4.err --socket=/tmp/mysql.sock --port=3306
前面指定了DB位置,后面就会对于那个--datadir=位置所在:
/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql-/ --user=mysql --pid-file=/data/mysql-//linux-jack-xiang.pid --log-error=/data/mysql-//linux-jack-xiang.err --socket=/tmp/mysql.sock --port=3306
root 5606 0.0 0.0 1900 652 pts/0 S+ 22:47 0:00 grep mysql
root 5515 0.0 0.1 2804 1312 pts/0 S 22:40 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 5566 0.3 1.6 81984 13132 pts/0 Sl 22:40 0:01 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user=mysql --pid-file=/usr/local/mysql/var/linux-Jack-nb4.pid --log-error=/usr/local/mysql/var/linux-Jack-nb4.err --socket=/tmp/mysql.sock --port=3306
前面指定了DB位置,后面就会对于那个--datadir=位置所在:
/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql-/ --user=mysql --pid-file=/data/mysql-//linux-jack-xiang.pid --log-error=/data/mysql-//linux-jack-xiang.err --socket=/tmp/mysql.sock --port=3306
root 5606 0.0 0.0 1900 652 pts/0 S+ 22:47 0:00 grep mysql
在MYSQL启动老失败即:Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
查看错误日志显示:mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
/usr/local/mysql/bin/mysqld: Table 'mysql.plugin' doesn't exist
Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
InnoDB: The first specified data file ./ibdata1 did not exist:
编译命令
gcc -g connect_db.c -L/usr/lib/mysql -lmysqlclient -lz
注意:
如果 /tmp/ccTGmMS21.o: In function 'main':
/tmp/ccTGmMS21.o(.text+0x11): undefined reference to 'mysql_init'
那么参数增加-L参数
如果 /usr/lib/mysql/libmysqlclient.a(my_compress.o): In function 'my_uncompress':
my_compress.o(.text+0xaa): undefined reference to `uncompress'
那么增加-lz参数
如下问题,也是加上-lz:
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_uncompress':
my_compress.c:(.text+0x60): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress_alloc':
my_compress.c:(.text+0x102): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress':
my_compress.c:(.text+0x1ae): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `unpackfrm':
my_compress.c:(.text+0x2bc): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `packfrm':
my_compress.c:(.text+0x3bb): undefined reference to `compress'
collect2: ld returned 1 exit status
如下:
gcc -g connect_db.c -L/usr/lib/mysql -lmysqlclient -lz
注意:
如果 /tmp/ccTGmMS21.o: In function 'main':
/tmp/ccTGmMS21.o(.text+0x11): undefined reference to 'mysql_init'
那么参数增加-L参数
如果 /usr/lib/mysql/libmysqlclient.a(my_compress.o): In function 'my_uncompress':
my_compress.o(.text+0xaa): undefined reference to `uncompress'
那么增加-lz参数
如下问题,也是加上-lz:
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_uncompress':
my_compress.c:(.text+0x60): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress_alloc':
my_compress.c:(.text+0x102): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `my_compress':
my_compress.c:(.text+0x1ae): undefined reference to `compress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `unpackfrm':
my_compress.c:(.text+0x2bc): undefined reference to `uncompress'
/usr/local/mysql/lib/mysql//libmysqlclient.a(my_compress.o): In function `packfrm':
my_compress.c:(.text+0x3bb): undefined reference to `compress'
collect2: ld returned 1 exit status
如下:
g++ -o out mysql_fetch_rows.cpp str.cpp str.h -I/usr/local/mysql/include/mysql/ -L/usr/local/mysql/lib/mysql/ -lmysqlclient -lz
或许我写这些,有很多朋友会问我是在创业的吗?我现在没有创业。或许又会问,那你怎么可以说呢?其实,这些感想、总结是自己之前的一些经历加上朋友的情况,还有看的一些资料,才得到的。所以,看后还希望各位看官多多给意见,拍砖也行呀。
打从政府提出了“创业带动就业”这个政策口号,我的很多朋友就很多人怀揣创业的梦想,其中很多人最后还是在企业或单位里开始“打工”生涯,另一部分则开始自己创业,或者是工作一段之后开始创业。我嘛,属于第三种,不过现在又开始“打工”了。之前有那么一段不完美的“创业”经历。大致情况就从这些开始说吧。对于“创业带动就业”这个我或许有着不同的理解。一个人或者几个人开始创业了,那么在这过程中,大部分行业都需要招收更多的“员工”,以一个例子来说明,3个人创业,他要对外招收10个“员工”,那么他就带动了10个就业了。所以嘛,我就是这么理解的。所以,不得不佩服政府考虑之周全。那么我的总结就是在中间总结的。
一个小的公司或者小的工作室,他在创业之初什么是他最首要最根本的问题呢?活下来!对,在中国这15亿的人口大国中,一个小公司要存活下来,并且活得好,并不是一件容易的事!活下来就必须让自己有收入,这些收入主要的来源就来自于订单,其他的一些广告等等一些营销手段在创立之初很难建立起来。所以,在这个阶段要想更多的订单,就必须好的营销“高手”去推销公司,去让更多的人认可我们的公司,这样才能有立足之地。人脉,在这个阶段成了最重要的手段,创始人的个人魅力也成了维持公司生存手段之一。如此看来,创业之前就要大量奠定自己的人脉基础。
马云说过一个公司最重要的四个环节:营销、财务、技术、管理。那么创业之初,我们根本不可能去做那么完善的体制,那是很困难的,也是不适合的,当然也有不一样的情况。比如,有一个公司的部门独立成为一个公司时,或有大公司投资,成立起的公司,这个另当别论。在我看来,创业之初四个环节中,可以把技术和管理,甚至是会计统一起来做。为什么呢,3个人或者几个人的公司,管理起来不难,而且大家来创业是为了自己的梦想,管理体制不健全没什么大问题,问题是有了不拼命干活。而财务呢,我们在这阶段,能有多少资金流动呢,无非营业额、工资、水电等等,再就是一些广告收入的。技术就不用说了,如果是主要靠技术生存的公司,他自然有一个技术的牛人,而这很可能就是创始人或者发起者。所以,管理、财务、技术者三者分不清楚,对这个时候没有什么大的影响吧。但是关键,营销不能和这些搅在一起,必须独立,因为营销很可能成为使公司生存下去最主要的出入。
还有我觉得是最难的,就是和你一起创业的人,该是怎么样的呢?我的经验失败就是,找的合作伙伴,不坚定,在大家一起干的时候,都是一边“打工”,业余时间创业。但是很多人不坚定,中途放弃了,结果导致人力紧缺。。。。。。所以我觉得马云说的有道理,要找没成功过渴望成功,信任你的,愿意跟着你的人一起创业。太正确了,相互之间的信任,相互之间的了解,可能让你在工作中减少很多不愉快。渴望成功的人,也会和你一样拼命的奋斗,这样最好的了。愿意跟着你的人,多少都有些信仰你,这为你的稳定发展提供很重要的条件。有的朋友,自己创业的时候,完全不喜欢招人,总是招些临时的,这样不好,没有固定的人力,即使你节约了财务上,但做大做稳很难的。所以创业之初要懂得舍得,懂得信任等。还有,最重要的是,你要专注,不能因为做着做着,觉得累了,就放弃了;也不能够越做越亏,又放弃了。坚定的信念,独特的眼光,很重要。
讲了这么多总结来就下面几点:
1、要培养人脉关系;
2、要找合适的人;
3、要重视销售;
4、要专注;
5、要自信。
或许还有其他的,希望大家给予更多的支持。
详细出处参考:http://bbs.firnow.com/dview74t167334.html
打从政府提出了“创业带动就业”这个政策口号,我的很多朋友就很多人怀揣创业的梦想,其中很多人最后还是在企业或单位里开始“打工”生涯,另一部分则开始自己创业,或者是工作一段之后开始创业。我嘛,属于第三种,不过现在又开始“打工”了。之前有那么一段不完美的“创业”经历。大致情况就从这些开始说吧。对于“创业带动就业”这个我或许有着不同的理解。一个人或者几个人开始创业了,那么在这过程中,大部分行业都需要招收更多的“员工”,以一个例子来说明,3个人创业,他要对外招收10个“员工”,那么他就带动了10个就业了。所以嘛,我就是这么理解的。所以,不得不佩服政府考虑之周全。那么我的总结就是在中间总结的。
一个小的公司或者小的工作室,他在创业之初什么是他最首要最根本的问题呢?活下来!对,在中国这15亿的人口大国中,一个小公司要存活下来,并且活得好,并不是一件容易的事!活下来就必须让自己有收入,这些收入主要的来源就来自于订单,其他的一些广告等等一些营销手段在创立之初很难建立起来。所以,在这个阶段要想更多的订单,就必须好的营销“高手”去推销公司,去让更多的人认可我们的公司,这样才能有立足之地。人脉,在这个阶段成了最重要的手段,创始人的个人魅力也成了维持公司生存手段之一。如此看来,创业之前就要大量奠定自己的人脉基础。
马云说过一个公司最重要的四个环节:营销、财务、技术、管理。那么创业之初,我们根本不可能去做那么完善的体制,那是很困难的,也是不适合的,当然也有不一样的情况。比如,有一个公司的部门独立成为一个公司时,或有大公司投资,成立起的公司,这个另当别论。在我看来,创业之初四个环节中,可以把技术和管理,甚至是会计统一起来做。为什么呢,3个人或者几个人的公司,管理起来不难,而且大家来创业是为了自己的梦想,管理体制不健全没什么大问题,问题是有了不拼命干活。而财务呢,我们在这阶段,能有多少资金流动呢,无非营业额、工资、水电等等,再就是一些广告收入的。技术就不用说了,如果是主要靠技术生存的公司,他自然有一个技术的牛人,而这很可能就是创始人或者发起者。所以,管理、财务、技术者三者分不清楚,对这个时候没有什么大的影响吧。但是关键,营销不能和这些搅在一起,必须独立,因为营销很可能成为使公司生存下去最主要的出入。
还有我觉得是最难的,就是和你一起创业的人,该是怎么样的呢?我的经验失败就是,找的合作伙伴,不坚定,在大家一起干的时候,都是一边“打工”,业余时间创业。但是很多人不坚定,中途放弃了,结果导致人力紧缺。。。。。。所以我觉得马云说的有道理,要找没成功过渴望成功,信任你的,愿意跟着你的人一起创业。太正确了,相互之间的信任,相互之间的了解,可能让你在工作中减少很多不愉快。渴望成功的人,也会和你一样拼命的奋斗,这样最好的了。愿意跟着你的人,多少都有些信仰你,这为你的稳定发展提供很重要的条件。有的朋友,自己创业的时候,完全不喜欢招人,总是招些临时的,这样不好,没有固定的人力,即使你节约了财务上,但做大做稳很难的。所以创业之初要懂得舍得,懂得信任等。还有,最重要的是,你要专注,不能因为做着做着,觉得累了,就放弃了;也不能够越做越亏,又放弃了。坚定的信念,独特的眼光,很重要。
讲了这么多总结来就下面几点:
1、要培养人脉关系;
2、要找合适的人;
3、要重视销售;
4、要专注;
5、要自信。
或许还有其他的,希望大家给予更多的支持。
详细出处参考:http://bbs.firnow.com/dview74t167334.html
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
Nginx虽然目前使用比较多,但还没有提供整合SVN的功能。
还只能是Apache配置SVN,Nginx作为代理。
nginx.conf设置:
apache使用的82端口,整合了SVN。
http://blog.ntsky.com/nginx-svn.html
我的使用方法:
一句简单命令重启nginx:
最近我的多个VPS经常出现502错误,经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单。
但研究了一下nginx帮助后发现,有-s参数可对nginx服务进行管理:
# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
于是我执行
# /usr/local/nginx/sbin/nginx -s reload
nginx已经重启成功。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
首先,调试通过apache的8080,然后再调试通过nginx的代理即可!!!
还只能是Apache配置SVN,Nginx作为代理。
nginx.conf设置:
server {
listen 80;
server_name ppsea.gicp.net;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.10:82;
}
}
listen 80;
server_name ppsea.gicp.net;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.10:82;
}
}
apache使用的82端口,整合了SVN。
http://blog.ntsky.com/nginx-svn.html
我的使用方法:
server {
listen 80;
server_name svn.qq.com;
location / {
root /usr/local/tads/htdocs/svn;
index index.html index.htm;
proxy_pass http://172.25.39.11*:8080;
}
}
listen 80;
server_name svn.qq.com;
location / {
root /usr/local/tads/htdocs/svn;
index index.html index.htm;
proxy_pass http://172.25.39.11*:8080;
}
}
一句简单命令重启nginx:
最近我的多个VPS经常出现502错误,经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单。
但研究了一下nginx帮助后发现,有-s参数可对nginx服务进行管理:
# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
于是我执行
# /usr/local/nginx/sbin/nginx -s reload
nginx已经重启成功。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
首先,调试通过apache的8080,然后再调试通过nginx的代理即可!!!
When installing PHP and MySQL on OSX you may get the error Can’t connect to local MySQL server through socket ‘/var/mysql/mysql.sock’. Or you may also get “No such file or directory” when calling mysql_connect from a PHP page. This occurs because PHP is looking for the file mysql.sock in it’s typical installation location of /var/mysql/mysql.sock. However the MySQL OSX installer actually puts the file in /tmp/mysql.sock. There are two easy ways to solve the problem.
Solution 1: Create a symbolic link
Open terminal and do the following:
sudo su
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
You just created a symbolic link in the place where PHP expects the socket file to be located so it should be happy.
Solution 2: Edit php.ini
If you don’t like the idea of creating a symbolic link, you can also simply alter your php.ini file to point PHP to the real location of mysql.sock.
Locate /etc/php.ini. (If php.ini doesn’t exist on your system, copy /etc/php.ini.default to /etc/php.ini). You will likely have to do this from the terminal unless you have Finder configured to show hidden files. Open the file and update the setting mysql.default_socket so it looks like this:
mysql.default_socket = /tmp/mysql.sock
To commit the change you need to restart Apache. You can do that in System Settings -> Sharing, then uncheck, then recheck Web Sharing.
注解:这个问题,在php和Mysql一台及其的时候特别需要注意,否则mysql没法连接上,而php -m|grep mysql 是有的,无法排查,而在链接其他IP机器是没有该问题的,注意下。
来源:http://verysimple.com/2009/01/07/php-on-os-cant-connect-to-local-mysql-server-through-socket-varmysqlmysqlsock/
Solution 1: Create a symbolic link
Open terminal and do the following:
sudo su
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
You just created a symbolic link in the place where PHP expects the socket file to be located so it should be happy.
Solution 2: Edit php.ini
If you don’t like the idea of creating a symbolic link, you can also simply alter your php.ini file to point PHP to the real location of mysql.sock.
Locate /etc/php.ini. (If php.ini doesn’t exist on your system, copy /etc/php.ini.default to /etc/php.ini). You will likely have to do this from the terminal unless you have Finder configured to show hidden files. Open the file and update the setting mysql.default_socket so it looks like this:
mysql.default_socket = /tmp/mysql.sock
To commit the change you need to restart Apache. You can do that in System Settings -> Sharing, then uncheck, then recheck Web Sharing.
注解:这个问题,在php和Mysql一台及其的时候特别需要注意,否则mysql没法连接上,而php -m|grep mysql 是有的,无法排查,而在链接其他IP机器是没有该问题的,注意下。
来源:http://verysimple.com/2009/01/07/php-on-os-cant-connect-to-local-mysql-server-through-socket-varmysqlmysqlsock/
将nobody用户添加到nogroup 组:
cat /etc/passwd|grep nobody
nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash
第3个字段是65534:意思就是,UID(用户的ID)是500.
第4个字段是65534:意思就是.GID(用户的组ID)的500.
使用usermod -g nogroup nobody就可以把已有的用户nobody加入nogroup 组了.
如下:
添加一个不能ssh登录的用户和制定用户的Home目录位置:
useradd -s /sbin/nologin -d /home/ftpuser -g ftp ftpuser
接下来给用户设置密码,否则此账号不能使用,命令如下
passwd ftpuser
这样就为linux系统添加用户testuser,用户目录指定为//home/ftpuser,属于ftp用户组,且此用户不能登陆系统。
添加移出(不需要加-a即可)组:
[root@webta_9090 ~]# usermod -a -Gappops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops),601(appops)
[root@webta_9090 ~]# usermod -Girdcops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops)
usermod -g nogroup nobody
cat /etc/passwd|grep nobody
nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash
第3个字段是65534:意思就是,UID(用户的ID)是500.
第4个字段是65534:意思就是.GID(用户的组ID)的500.
使用usermod -g nogroup nobody就可以把已有的用户nobody加入nogroup 组了.
如下:
:nobody:/var/lib/nobody:/bin/bash
添加一个不能ssh登录的用户和制定用户的Home目录位置:
useradd -s /sbin/nologin -d /home/ftpuser -g ftp ftpuser
接下来给用户设置密码,否则此账号不能使用,命令如下
passwd ftpuser
这样就为linux系统添加用户testuser,用户目录指定为//home/ftpuser,属于ftp用户组,且此用户不能登陆系统。
添加移出(不需要加-a即可)组:
[root@webta_9090 ~]# usermod -a -Gappops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops),601(appops)
[root@webta_9090 ~]# usermod -Girdcops liuzeyi
[root@webta_9090 ~]# id liuzeyi
uid=554(liuzeyi) gid=603(irdcops) groups=603(irdcops)