程序随笔 – C/C++ & PHP

2010年06月6日

php输入流php://input

类归于: 未分类 — admin @ 7:31 下午

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input

对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。

php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.
翻译过来,是这样:
“php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”

我们应该怎么去理解这段概述呢?!我把它划分为三部分,逐步去理解。

  1. 读取POST数据
  2. 不能用于multipart/form-data类型
  3. php://input VS $HTTP_RAW_POST_DATA

读取POST数据

PHPer们一定很熟悉$_POST这个内置变量。$_POST与php://input存在哪些关联与区别呢?另外,客户端向服务端交互数据,最常用的方法除了POST之外,还有GET。既然php://input作为PHP输入流,它能读取GET数据吗?这二个问题正是我们这节需要探讨的主要内容。
经验告诉我们,从测试与观察中总结,会是一个很凑效的方法。这里,我写了几个脚本来帮助我们测试。

@file 192.168.0.6:/phpinput_server.php 打印出接收到的数据
@file 192.168.0.8:/phpinput_post.php 模拟以POST方法提交表单数据
@file 192.168.0.8:/phpinput_xmlrpc.php 模拟以POST方法发出xmlrpc请求.
@file 192.168.0.8:/phpinput_get.php 模拟以GET方法提交表单表数

phpinput_server.php与phpinput_post.php

<?php
//@file phpinput_server.php
$raw_post_data = file_get_contents('php://input', 'r');
echo "-------\$_POST------------------\n";
echo var_dump($_POST) . "\n";
echo "-------php://input-------------\n";
echo $raw_post_data . "\n";
?>

<?php
//@file phpinput_post.php
$http_entity_body = 'n=' . urldecode('perfgeeks') . '&amp;p=' . urldecode('7788');
$http_entity_type = 'application/x-www-form-urlencoded';
$http_entity_length = strlen($http_entity_body);
$host = '192.168.0.6';
$port = 80;
$path = '/phpinput_server.php';
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
  fputs($fp, "POST {$path} HTTP/1.1\r\n");
  fputs($fp, "Host: {$host}\r\n");
  fputs($fp, "Content-Type: {$http_entity_type}\r\n");
  fputs($fp, "Content-Length: {$http_entity_length}\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $http_entity_body . "\r\n\r\n");

  while (!feof($fp)) {
    $d .= fgets($fp, 4096);
  }
  fclose($fp);
  echo $d;
}
?>

我们可以通过使用工具ngrep抓取http请求包(因为我们需要探知的是php://input,所以我们这里只抓取http Request数据包)。我们来执行测试脚本phpinput_post.php

@php /phpinput_post.php
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 03:23:36 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Content-Length: 160
Connection: close
Content-Type: text/html; charset=UTF-8
-------$_POST------------------
array(2) {
  ["n"]=> string(9) "perfgeeks"
  ["p"]=> string(4) "7788"
}
-------php://input-------------
n=perfgeeks&p=7788

通过ngrep抓到的http请求包如下:

T 192.168.0.8:57846 -> 192.168.0.6:80 [AP]
  POST /phpinput_server.php HTTP/1.1..
  Host: 192.168.0.6..Content-Type: application/x-www-form-urlencoded..Co
  ntent-Length: 18..Connection: close....n=perfgeeks&p=7788....

仔细观察,我们不难发现
1,$_POST数据,php://input 数据与httpd entity body数据是“一致”的
2,http请求中的Content-Type是application/x-www-form-urlencoded ,它表示http请求body中的数据是使用http的post方法提交的表单数据,并且进行了urlencode()处理。
(注:注意加粗部分内容,下文不再提示).

我们再来看看脚本phpinput_xmlrpc.php的原文件内容,它模拟了一个POST方法提交的xml-rpc请求。

<?php
//@file phpinput_xmlrpc.php
$http_entity_body = "\n\n   jt_userinfo\n";
$http_entity_type = 'text/html';
$http_entity_length = strlen($http_entity_body);
$host = '192.168.0.6';
$port = 80;
$path = '/phpinput_server.php';
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
  fputs($fp, "POST {$path} HTTP/1.1\r\n");
  fputs($fp, "Host: {$host}\r\n");
  fputs($fp, "Content-Type: {$http_entity_type}\r\n");
  fputs($fp, "Content-Length: {$http_entity_length}\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $http_entity_body . "\r\n\r\n");
  while (!feof($fp)) {
    $d .= fgets($fp, 4096);
  }

  fclose($fp);
  echo $d;
}
?>

同样地,让我们来执行这个测试脚本

@php /phpinput_xmlrcp.php
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 03:47:18 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Content-Length: 154
Connection: close
Content-Type: text/html; charset=UTF-8

-------$_POST------------------
array(0) {
}

-------php://input-------------
<?xml version="1.0">
<methodcall>
   <name>jt_userinfo</name>
</methodcall>

执行这个脚本的时候,我们通过ngrep抓取的http请求数据包如下

T 192.168.0.8:45570 -> 192.168.0.6:80 [AP]
  POST /phpinput_server.php HTTP/1.1..
  Host: 192.168.0.6..Content-Type: text/html..Content-Length: 75..Connec
  tion: close....<?xml version="1.0">.<methodcall>.   <name>jt_userinfo<
  /name>.</methodcall>....

同样,我样也可以很容易地发现:
1,http请求中的Content-Type是text/xml。它表示http请求中的body数据是xml数据格式。
2,服务端$_POST打印出来的是一个空数组,即与http entity body不一致了。这跟上个例子不一样了,这里的Content-Type是text/xml,而不是application/x-www-form-urlencoded
3,而php://input数据还是跟http entity body数据一致。也就是php://input数据和$_POST数据不一致了。

我们再来看看通过GET方法提交表单数据的情况,php://input能不能读取到GET方法的表单数据?在这里,我们稍加改动一下phpinput_server.php文件,将$_POST改成$_GET。

<?php
//@file phpinput_server.php
$raw_post_data = file_get_contents('php://input', 'r');
echo "-------\$_GET------------------\n";
echo var_dump($_GET) . "\n";
echo "-------php://input-------------\n";
echo $raw_post_data . "\n";
?>

<?php
//@file phpinput_get.php
$query_path = 'n=' . urldecode('perfgeeks') . '&amp;p=' . urldecode('7788');
$host = '192.168.0.6';
$port = 80;
$path = '/phpinput_server.php';
$d = '';
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
  fputs($fp, "GET {$path}?{$query_path} HTTP/1.1\r\n");
  fputs($fp, "Host: {$host}\r\n");
  fputs($fp, "Connection: close\r\n\r\n");

  while (!feof($fp)) {
    $d .= fgets($fp, 4096);
  }
  fclose($fp);
  echo $d;
 }
?>

同样,我们执行下一phpinput_get.php测试脚本,它模拟了一个通常情况下的GET方法提交表单数据。

@php /phpinput_get.php
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 07:38:15 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Content-Length: 141
Connection: close
Content-Type: text/html; charset=UTF-8

-------$_GET------------------
array(2) {
  ["n"]=>
  string(9) "perfgeeks"
  ["p"]=>
  string(4) "7788"
}

-------php://input-------------

在这个时候,使用ngrep工具,捕获的相应的http请求数据包如下

T 192.168.0.8:36775 -> 192.168.0.6:80 [AP]
  GET /phpinput_server.php?n=perfgeeks&p=7788 HTTP/1.1..
  Host: 192.168.0.6..Connection: close....

比较POST方法提交的http请求,通常GET方法提交的请求中,entity body为空。同时,不会指定Content-Type和Content-Length。但是,如果强硬数据http entity body,并指明正确地Content-Type和Content-Length,那么php://input还可是读取得到http entity body数据,但不是$_GET数据。

所根据,上面几个探测,我们可以作出以下总结:
1,Content-Type取值为application/x-www-form-urlencoded时,php会将http请求body相应数据会填入到数组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。(其实,除了该Content-Type,还有multipart/form-data表示数据是表单数据,稍后我们介绍)
2,php://input数据,只要Content-Type不为multipart/form-data(该条件限制稍后会介绍)。那么php://input数据与http entity body部分数据是一致的。该部分相一致的数据的长度由Content-Length指定。
3,仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是”一致”(打上引号,表示它们格式不一致,内容一致)的。其它情况,它们都不一致。
4,php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分。

这也帮助我们理解了,为什么xml_rpc服务端读取数据都是通过file_get_contents(‘php://input’, ‘r’)。而不是从$_POST中读取,正是因为xml_rpc数据规格是xml,它的Content-Type是text/xml。

php://input碰到了multipart/form-data

上传文件的时候,表单的写法是这样的

<form enctype="multipart/form-data" action="phpinput_server.php" method="POST" >
    <input type="text" name="n"  />
    <input type="file" name="f" />
    <input type="submit" value="upload now" />
</form>

那么,enctype=multipart/form-data这里的意义,就是将该次http请求头部(head)中的Content-Type设置为multipart/form-data。请查阅RFC1867对它的描述。multipart/form-data也表示以POST方法提交表单数据,它还伴随了文件上传,所以会跟application/x-www-form-urlencoded数据格式不一样。它会以一更种更合理的,更高效的数据格式传递给服务端。我们提交该表单数据,并且打印出响应结果,如下:

-------$_POST------------------
array(1) { ["n"]=> string(9) "perfgeeks" }
-------php://input-------------

同时,我们通过ngrep抓取的相应的http请求数据包如下:

########
T 192.168.0.8:3981 -> 192.168.0.6:80 [AP]
  POST /phpinput_server.php HTTP/1.1..Host: 192.168.0.6..Connection: kee
  p-alive..User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) A
  ppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2..Re
  ferer: http://192.168.0.6/phpinput_server.php..Content-Length: 306..Ca
  che-Control: max-age=0..Origin: http://192.168.0.6..Content-Type: mult
  ipart/form-data; boundary=----WebKitFormBoundarybLQwkp4opIEZn1fA..Acce
  pt: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q
  =0.8,image/png,*/*;q=0.5..Accept-Encoding: gzip,deflate,sdch..Accept-L
  anguage: zh-CN,zh;q=0.8..Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3..Cook
  ie: SESS3b0e658f87cf58240de13ab43a399df6=lju6o5bg8u04lv1ojugm2ccic6...
  .
##
T 192.168.0.8:3981 -> 192.168.0.6:80 [AP]
  ------WebKitFormBoundarybLQwkp4opIEZn1fA..Content-Disposition: form-da
  ta; name="n"....perfgeeks..------WebKitFormBoundarybLQwkp4opIEZn1fA..C
  ontent-Disposition: form-data; name="f"; filename="test.txt"..Content-
  Type: text/plain....i am file..multipart/form-data..------WebKitFormBo
  undarybLQwkp4opIEZn1fA--..
##

从响应输出来比对,$_POST数据跟请求提交数据相符,即$_POST = array(‘n’ => ‘perfgeeks’)。这也跟http请求body中的数据相呼应,同时说明PHP把相应的数据填入$_POST全局变量。而php://input输出为空,没有输出任何东西,尽管http请求数据包中body不为空。这表示,当Content-Type为multipart/form-data的时候,即便http请求body中存在数据,php://input也为空,PHP此时,不会把数据填入php://input流。所以,可以确定: php://input不能用于读取enctype=multipart/form-data数据。

我们再比较这次通过ngrep抓取的http请求数据包,我们会发现,最大不同的一点是Content-Type后面跟了boundary定义了数据的分界符,bounday是随机生成的。另外一个大不一样的,就是http entity body中的数据组织结构不一样了。

上一节,我们概述了,当Content-Type为application/x-www-form-urlencoded时,php://input和$_POST数据是“一致”的,为其它Content-Type的时候,php://input和$_POST数据数据是不一致的。因为只有在Content-Type为application/x-www-form-urlencoded或者为multipart/form-data的时候,PHP才会将http请求数据包中的body相应部分数据填入$_POST全局变量中,其它情况PHP都忽略。而php://input除了在数据类型为multipart/form-data之外为空外,其它情况都可能不为空。通过这一节,我们更加明白了php://input与$_POST的区别与联系。所以,再次确认,php://input无法读取enctype=multipart/form-data数据,当php://input遇到它时,永远为空,即便http entity body有数据。

php://input VS $http_raw_post_data

相信大家对php://input已经有一定深度地了解了。那么$http_raw_post_data是什么呢?$http_raw_post_data是PHP内置的一个全局变量。它用于,PHP在无法识别的Content-Type的情况下,将POST过来的数据原样地填入变量$http_raw_post_data。它同样无法读取Content-Type为multipart/form-data的POST数据。需要设置php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填入变量$http_raw_post_data。

把脚本phpinput_server.php改变一下,可以验证上述内容

<?php
$raw_post_data = file_get_contents('php://input', 'r');
$rtn = ($raw_post_data == $HTTP_RAW_POST_DATA) ? 1 : 0;
echo $rtn;
?>

执行测试脚本

@php phpinput_post.php
@php phpinput_get.php
@php phpinput_xmlrpc.php

得出的结果输出都是一样的,即都为1,表示php://input和$HTTP_RAW_POST_DATA是相同的。至于对内存的压力,我们这里就不做细致地测试了。有兴趣的,可以通过xhprof进行测试和观察。

以此,我们这节可以总结如下:
1, php://input 可以读取http entity body中指定长度的值,由Content-Length指定长度,不管是POST方式或者GET方法提交过来的数据。但是,一般GET方法提交数据时,http request entity body部分都为空。
2,php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据。

学习笔记

1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST
2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA
3,  只有Coentent-Type不为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。
4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。
5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini
6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。

2010年05月25日

[优秀函数]JOOMLA _checkPath

类归于: PHP, joomla — admin @ 8:39 上午

 function _checkPath( $path, $checkAdmin=1 )
 {
  $file = JPATH_SITE . $path;
  if ($checkAdmin > -1 && file_exists( $file )) {
   return $file;
  } else if ($checkAdmin != 0) {
   $file = JPATH_ADMINISTRATOR . $path;
   if (file_exists( $file )) {
    return $file;
   }
  }

  return null;
 }

2010年05月13日

温家宝:做人的基本原则

类归于: 网络摘录 — admin @ 11:41 上午

一个人不管有多聪明,多能干,背景条件有多好,如果不懂得如何去做人、做事,那么他最终的结局肯定是失败。做人做事是一门艺术,更是一门学问。很多人之所以一辈子都碌碌无为,那是因为他活了一辈子都没有弄明白该怎样去做人做事。 ­

每一个人生活在现实社会中,都渴望着成功,而且很多有志之士为了心中的梦想,付出了很多,然而得到的却很少,这个问题不能不引起人们的深思:你不能说他们不够努力,不够勤劳,可为什么偏偏落得个一事无成的结局呢?这值得我们每一个人去认真思考。 ­

从表面上看,做人做事似乎很简单,有谁不会呢?其实不然,比如说你当一名教师,你的主观愿望是当好教师,但事实上却不受学生欢迎;你去做生意,你的主观愿望是赚大钱,可偏偏就赔了本。抛开这些表层现象,去发掘问题的症结,你就会发现做人做事的确是一门很难掌握的学问。 ­

可以这么说,做人做事是一门涉及现实生活中各个方面的学问,单从任何一个方面入手研究,都不可能窥其全貌。要掌握这门学问,抓住其本质,就必须对现实生活加以提炼总结,得出一些具有普遍意义的规律来,人们才能有章可循,而不至于迷然无绪。 ­

读懂一个字诀,受用你一生! ­

一、社会交往字诀 ­

——教你建功立业 ­

(一)”谦”字诀 ­

处世唯”谦”字了得,若一味狂妄自负、骄傲自大,只会失去处世的根本,落得个孤苦伶仃、千夫所指的骂名下场。 ­

1、不可目中无人 ­

2、得意不要忘形 ­

3、有本事不必自夸 ­

4、请教不择人 ­

(二)”淡”字诀 ­

为人处世,交朋待友,对势利纷华,似乎不必太过于苛求,当以”淡”字当头。看淡些,看开些,人生也就豁然开朗,有滋有味了。 ­

正如”平平淡淡才是真”。 ­

1、君子之交淡如水 ­

2、淡看人生,善待生命 ­

3、淡泊明志,莫为名利遮望眼 ­

4、减少心欲,满足心灵 ­

 
(三)”俭”字诀 ­

不懂得”俭”字的人,不知道如何成功,任何成功的事业都在于点滴的积累;不懂得”俭”字的人,只会丧失成功,过分的骄奢多败人品质。 ­

“俭以养德”,为人做事之良训。 ­

1、从节省生活费开始 ­

2、”穷大方”不可取 ­

3、谨防变态的节俭:吝啬 ­

4、欲路勿染,俭以养德 ­

(四)”自”字诀 ­

做一个有个性的人,给自己一点自信!成功的道路靠自己闯,美好的前途来自于自强自立,不屈服于任何权威,用自我的努力找到属于你的自尊。 ­

男儿立世,自己拍板! ­

1、自强自立,与成功有约 ­

2、独品人生百态 ­

3、用自我来挑战权威 ­

4、自信——任你东南西北风 ­

(五)”礼”字诀 ­

生在礼仪之邦,做一个彬彬有礼之人。有礼之人会做人,有人缘,多朋友。有礼之人会做事,注重形象,有教养,不树敌,成功路上事事顺。 ­

1、以礼待人 ­

2、彬彬有礼,礼多人不怪 ­

3、注重礼仪着装,给人良好印象 ­

(六)”正”字诀 ­

做一个正直的人,做一个人格健全完善的人,受人崇敬。做一个自私的人,做欺心的事,疾贤防能,与成功无缘。 ­

1、己所不欲,勿施于人 ­

2、嫉妒乃方正之人之大忌 ­

3、不做欺心事,本身是一种愉悦 ­

二、形象塑造字诀 ­

——教你品格高雅 ­

(七)”志”字诀 ­

给自己一根足够长的杠杆,希望转动地球。 ­

给自己的人生立个志愿,树个目标,树个偶像,脚踏实地,成功的意识需要培养,先立志,再与成功约会。 ­

1、度德量力,以志立身 ­

2、先立志,有志就有希望 ­

3、培养成功意识:立志为王 ­

4、树立偶像,改变自己 ­

(八)”时”字诀 ­

做人要惜时,做事要守时。塑造自己的形象,现代人离不开时间观念。合理安排自己的时间,有效利用自己的时间,守时、惜时、不拖延。 ­

切记:时间就是金钱。 ­

 
1、一秒值万金 ­

2、别漠视业余时间 ­

3、盗窃他人时间,等于谋财害命 ­

4、按重要性办事,更能有效利用时间 ­

(九)”勤”字诀 ­

多一些努力,便多一些成功的机会。无数事实证明:成功的最短途径是勤奋。不要光耍嘴皮子,不要好逸恶劳,勤字当头,苍天不负有心人,天道酬勤! ­

1、成功的最短途径:勤奋 ­

2、多一些努力,多一些机会 ­

3、勤于行动,胜于勤说 ­

(十)”实”字诀 ­

踏踏实实做人,实实在在办事。任何一个双手插在口袋里的人,都爬不上成功的梯子。给人留下一个实在的形象,给自己的成功增添一份夯实的基础,从实际出发,对自己负责。 ­

1、敬业,实干家的成功保障 ­

2、把每一份工作都做好 ­

3、双手插在口袋里的人,爬不上成功的梯子 ­

(十一)”专”字诀 ­

有专才有恒,有恒才有我。 ­

你生活在一个知识大爆炸的时代,如果你是一个天才,不专心就成了你的不幸;如果你资质平凡,请不要悲观,只要你下定决心一辈子做好一件事,你就能成功。年轻人,千万别给人留下一个朝三暮四的形象。 ­

1、把所有的鸡蛋放入一个篮子 ­

2、多才多艺,莫如练就”独门暗器” ­

3、专一,让劣势变成优势 ­

(十二)”慎”字诀 ­

人生漫长,又短暂,关键的就几步。人性丛林,职场事业,利益多多、诱惑多多。老成不怕多,凡事应多三思,不怕一万,就怕万一。一旦伸错手,入错行,做错事,于名誉,于事业,于形象皆有不救之危。 ­

“慎”之! ­

1、千万别入错行 ­

2、想好了你再”跳” ­

3、不要草率行事 ­

三、自我提升字诀 ­

——教你拯救命运 ­

(十三)”硬”字诀 ­

做人难,做事难,面对千难万阻,要提升自我,不来点”硬”的怎么行?如果事有勉强,应该敢于说”不”;如果是正当利益,则应当仁不让;甚至,有时还得来点霸王硬上弓,要有”脸皮厚”的时候,也要有”头皮硬”的时候。 ­

1、拒绝是一门艺术 ­

2、该我的,就不要客气 ­

3、怒发冲冠之功 ­

4、厚脸皮做人,硬头皮做事 ­

(十四)”小”字诀 ­

一家海鲜连锁餐厅的老板很可能当初是水产市场练滩儿的,而一家皮鞋连锁店的老板当初可能是擦鞋的。欲做大事,赚大钱,必先做小事,赚小钱,放下架子,舍得小利。从细微处入手,先扫一屋,再扫天下! ­

1、一屋不扫,何以扫天下 ­

2、先做小事,赚小钱 ­

3、一枚钉子改变一个人的一生 ­

(十五)”锐”字诀 ­

小小麻雀,飞飞跳跳、争分夺秒,不停地寻觅食物。人生亦如此,面对残酷竞争,惟有锐意进取,做一个好先锋,把下一个进球当目标,敢于冒险,敢于闯荡,守株待兔的事情毕竟很渺茫。 ­

1、不以现有成就为满足 ­

2、锐意追求,绝不退缩 ­

3、锐气不可抛,成功是迟早 ­

(十六)”创”字诀 ­

提升自我,就要有胆有识去超越自我。何谓超越?超越就是吃螃蟹,就是创新。同时创新就意味着冒险,所谓富贵险中求。想人家想不到的,做别人不敢做的,敢为天下先,在于思维的转换。 ­

1、敢为天下先 ­

2、打破规则的创意 ­

3、人弃我取也能创奇迹 ­

4、逆向思维的攻守之道 ­

(十七)”通”字诀 ­

穷则思变,变则通。识时务者为俊杰,通机变者为英豪。通往成功的道路不是一条,又何必在一棵树上吊死呢?抓住成功的关键,东方不亮西方亮,不管它是黑猫白猫,重要的是它能否逮”耗子”。 ­

1、巧妙地以变应变 ­

2、条条大道通罗马 ­

3、成功在于通,有通才有赢 ­

(十八)”言”字诀 ­

把赞扬送给别人,就像把食物施舍给饥饿的乞丐一样。古往今来,不知有多少人,凭着三寸不烂之舌,改变了自己平凡的命运。说话幽默,找共同语言……一个”言”字,一生受用。 ­

1、投其所好找话题 ­

2、恭维是最好的”润滑剂” ­

3、成功人生,幽默机智 ­

4、”流行语”为你添姿着色 ­

四、人际互动字诀 ­

——教你赢得朋友 ­

(十九)”宽”字诀 ­

人际互动,应着眼于未来,不念旧恶。原谅别人,是对待自己的最好方式——为你的仇敌而怒火中烧,烧伤的是你自己。做人做事,心胸不可太狭隘。海纳百川,靠一棵宽容的心! ­

1、宽恕你的敌人 ­

2、宽容做人,宽容成事 ­

3、乐于忘记,不念旧恶 ­

(二十)”和”字诀 ­

在人海中,如果我们不想孤立,那么就学会如何与人相处吧!林子大了,什么鸟都有,不要求你喜欢所有的人,但同时世上也没有什么最牛的人。 ­

和为贵嘛,就要互相留台阶,大家给面子。 ­

1、为他人着想,为自己铺路 ­

2、你给别人留面子,别人给你做好事 ­

3、夫妻之道,亦和亦智 ­

(二十一)”信”字诀 ­

有多少人信任你,你就拥有多少次成功的机会,”信”是什么东西?信是一种人格的力量,是超越金钱的友情,是了解、是欣赏、是覆水,具有不可逆转性。所以,言必行,行必果,能帮的忙则帮,但不可轻易许诺! ­

1、能帮则帮,不轻易许诺 ­

2、言而有信,做人讲原则 ­

3、做事先做人,做人先取信 ­

4、信誉基石,生死友情 ­

(二十二)”帮”字诀 ­

“好风凭借力,送我上青天”。人际交往,互利互惠。帮助别人,就是在为自己的人情信用卡储蓄,特别是在人患难之际施于援手,救落难英雄于困顿。真心助人,其回报不言而喻。 ­

1、助人发财,自己沾光 ­

2、好风凭借力,借梯能登天 ­

3、掌握时机,拉人一把 ­

(二十三)”敬”字诀 ­

人要面子树要皮。人存在于社会上,要扮演各种各样角色,特别是在互相的交往中,需要一定的尊严来支撑,这是人性的弱点。明白了这点,才能体会到”敬”字的必要性。 ­

1、为尊者讳,为上司讳 ­

2、在失意者面前不谈你的得意 ­

3、尊敬对方的”闪光点” ­

(二十四)”交”字诀 ­

人情冷暖、世态炎凉,平常朋友平常过。交朋接友,不可急功近利,友情投资,宜走长线,拜拜冷庙,烧烧冷灶,平时多烧香,哪怕是只言片语的问候,亦是交友之道。 ­

1、闲时多烧香,急时有人帮 ­

2、友情投资,宜走长线 ­

3、拜冷庙,烧冷灶,交落难英雄 ­

五、解困渡厄字诀 ­

——教你轻松快乐 ­

(二十五)”坚”字诀 ­

面对挫折与困难,铭记丘吉尔的名言:”永远,永远,永远不要放弃!”其实世界上并没有什么幸运的事,就是有,也是坚持的结果。为了最后的胜利,应以坚毅不拔之志,面对种种暂时之屈辱,执着追求,不到黄河心不死! ­

1、厚积薄发,耐得寂寞 ­

2、谁笑到最后,谁笑得最甜 ­

3、执着追求,永不放弃 ­

4、不到黄河心不死 ­

(二十六)”谋”字诀 ­

做人有困惑,做事有困境,面对”山重水复”之关卡,光有坚强的毅志不行,硬闯也不行。解决难题靠的是脑袋,脑袋产生思考,让思考发威,在出人意料之处轻松解决问题。 ­

1、巧妇能为无米之炊 ­

2、从”山重水复”到”柳暗花明” ­

3、思考的威力 ­

(二十七)”屈”字诀 ­

要摆脱人与事的困境,就难免要求人,求人就难免要低三下四,但着眼于未来的成功,即使像蟑螂一样的生活也应在所不惜,风水毕竟轮流转。放下架子,该屈就屈,能屈能伸,以屈为伸方为英雄! ­

1、像蟑螂一样生活 ­

2、放下身段,前方是大道 ­

3、你敬我一尺,我敬你一丈 ­

4、低人一级”屈”不死人 ­

(二十八)”静”字诀 ­

“不在沉默中爆发,就在沉默中灭亡!”凡遇大事需静气,平心静气是一种境界,一种气度,一种修养。冷静之中的决定往往是摆脱困境的最佳方案,同时冷静也是一种智慧,以静待变,乱中取胜! ­

1、把冷板凳坐成经理椅 ­

2、心宁智生,智生事成 ­

3、沉着冷静心自怡 ­

4、沉得住气方为人杰 ­

(二十九)”乐”字诀 ­

世上没有绝对幸福的人,只有不肯快乐的心。人生苦短,与其事事张弓拔弩,不如”幽它一默”。记住,成功是从微笑开始的,人生不如意事常八九,乐观点,自己营造快乐,学会轻松解决难题。 ­

1、成功从微笑开始 ­

2、学会营造快乐 ­

3、学会轻松愉快地解决难题 ­

4、世上没有绝对幸福的人,只有不肯快乐的心 ­

(三十)”靠”字诀 ­

人生不等不靠,没错,天上不会掉馅饼,守株待兔饿死人,但一点不靠也不行,亲戚朋友、同学、老乡,这是一种”人力资源”,谁人没个三灾六难,能靠则靠,靠不上创造条件也要靠! ­

1、让朋友成为你的靠山 ­

2、出门落难靠老乡 ­

3、亲戚亲戚,越走越亲 ­

4、恰同学少年,该靠靠一把 ­

六、不败人生字诀 ­

——教你人生辉煌 ­

(三十一)”愚”字诀 ­

学学猫头鹰,睁一只眼,闭一只眼。你说我糊涂,其实我不傻!只是世事多变幻,创业难,败家快,人说水至清则无鱼,人至察则无徒。其实是,明哲保身,大智者往往大愚,聪明者多,能过”愚”字关鲜矣! ­

1、糊涂人聪明一世 ­

2、不要以为自己比别人聪明 ­

3、处事不要太认真 ­

4、谁是英雄? ­

(三十二)”忍”字诀 ­

真的英雄,何必气短,善始善终,方为不败!忍能保身,忍能成事,忍是大智,大勇,更是大福!忍是厚,忍是黑,忍小人,忍豪强,忍天下难忍之事,不做性情中人,成常人难成之事。 ­

1、忍是大智大勇大福 ­

2、不做性情中人 ­

3、不败人生,忍者无敌 ­

(三十三)”退”字诀 ­

久历江湖,练达人情之人都守一个”退”字。退是一种谋略,退是一种交换,更是一种维系生存的手段。哲人说的好,”不要把痰吐在井里,哪天你口渴的时侯,也要来井边喝水的。” ­

1、用心计较般般错,退步思量事事顺 ­

2、拒绝妥协,就是拒绝成功 ­

3、惹不起,躲得起 ­

(三十四)”圆”字诀 ­

方圆做人,八面玲珑;圆满做事,事事顺心。人心叵测,凡事最好留一手,有闲时,可研究一下”模糊哲学”,人生这套马车,如若安上方方正正的轮子,你没听说过,我也没听说过,寸步难行嘛! ­

1、方圆做人,圆满做事 ­

2、做老二,不要做老大 ­

3、人情练达即文章,处世圆通慎言语 ­

(三十五)”危”字诀 ­

“豪华尽出成功后,逸乐安知与祸双?”历史教训如此,平头百姓亦如此。居家过日,工作职场等都逃不过一个”危”字,人无远虑,必有近忧。 ­ 

1、远虑在先,近处无危 ­ 

2、郭子仪屏退侍女免祸患 ­ 

3、上山下乡当农民——范蠡富贵终身 ­ 

(三十六)”装”字诀 ­ 

人生在世一台戏,你方唱罢我上场,不管你会不会演,就看你会不会装。充英雄容易,扮弱者难。俗话说得好,枪打出头鸟,不怕贼偷就怕贼惦记着,当你还不具备实力时,请把你过剩的才华藏起来! ­

1、故意示弱有好处 ­ 

2、用”拟态”和”保护色” ­ 

3、成功需要诈死与佯败­

2010年05月4日

[转]mplayer视频格式转换和指定时间截图

类归于: 程序 — admin @ 5:39 下午

视频格式转换命令:
mencoder “D:\music\APerfectMatch.wmv” -o “D:\output.flv” -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=320:240,expand=320:240:::1,crop=320:240:0:0 -ofps 30 -srate 22050

截图命令:
mplayer -ss START_TIME -noframedrop -nosound -vo jpeg -frames N NAME_OF_VIDEO_FILE

START_TIME截图的时间
N 截几张图片
NAME_OF_VIDEO_FILE 影片的名

在-lavcopts里多了dia=4:cmp=6:vb_strategy=1这3条

他们的含义如下:

dia越大品质越高,如果需要快速编码,设置为-1,设为4时已经很有利于品质了;

cmp越大品质越高,默认值0,是最快速的,一般设到3,设为6已经只会细微提高品质了,但速度会慢

vb_strategy,大概是1或者0,默认值可能为0,我这里设为1,会对编码有帮助,这个参数我自己没有过多推敲,可能并不影响品质……

2、加-sws选项,看下面的命令:

mencoder “D:\music\APerfectMatch.wmv” -o “D:\output.flv” -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -sws 3 -vf scale=320:240,expand=320:240:::1,crop=320:240:0:0 -ofps 30 -srate 22050

只是加一个 -sws 3进去,转换后的效果和前面一种方法大致相同,视频数据速率都是422.5kb/s左右,解释一下

-sws就是用来设置品质的,默认值为2,那么,为什么不用这种简单的方式呢?我个人认为,用前面一种方法有利于找到一个速度和品质的平衡点,毕竟变化的范围比较大。

2010年04月24日

mysql中修改auto_increment值

类归于: SQL — admin @ 5:54 下午

alter table table_name auto_increment=num

早前文章 »

WordPress 所驱动