一个流行的观点是,30岁之前最好进一趟国际级大公司,对眼光的高度、视野的宽度、思维的深度、职业化的专业程度都有助益,然后毫不犹豫地投身或创建小公司,永远也不要回去。
开放平台模式成功的要点在于,通过自身服务和第三方应用的互利互惠,提高用户对平台网站的粘性和使用程度,进而提高获利,同时,通过利益分摊,达到平台自身和第三方应用循环刺激而产生的滚雪球式的增长。
所谓开放平台,就是首先提供一个基本的服务,然后通过开放自身的接口,使得第三方开发者得以通过运用和组装其接口以及其他第三方服务接口产生新的应用,并且使得该应用能够统一运行在这个平台之上,我们把这样的一种网络服务模式叫做开放平台。
张朝阳说,准确描述现实的书基本上出不来,所以读书误人。俺觉得还是有一些的,比如冯仑的《野蛮生长》、吴思的《潜规则》《血酬定律》、王学泰《游民文化与中国社会》等。大家能补充一下吗?还有哪些书比较清楚剖析中国社会的利益关系、力量平衡等现实?
一创业CEO,名片上头衔却是“客户总监”,问:你不是CEO吗?答:是的,整天跑客户称自己CEO,人家会想这家公司只有一个光杆司令,叫客户总监,遇到难事还可借口“我得问问CEO”...创业就是如此卑微。仔细想想:CEO如果不是客户总监,那他还干嘛呢?建议所有创业CEO将自己的头衔改成“客户总监”!
哈佛有一个著名的理论:人的差别在于业余时间,而一个人的命运决定于晚上8点到10点之间。每晚抽出2个小时的时间用来阅读、进修、思考或参加有意的演讲、讨论,你会发现,你的人生正在发生改变,坚持数年之后,成功会向你招手。
绝大多数人习惯做语言的巨人,行动的矮子。越是智商高的人越容易陷入这个悖 论中,难以自拔。
他接着分析:“我认为一个人失业的成功取决于三商,即我们平时所讲的智商,情 商和胆商,但是一个真正的人才,他的三商重要性应该这样排列:胆商第一,情商第 二,智商第三,目前中国教育培养出来的所谓人才是很片面的,仅仅在智商上优人一 等,可是情商与胆商根本没有包含在内。
为别人打零工才得以糊口的打工朋友们不是不想改变现实生活,也有紧迫感,也 很想改变自身的“贫穷”面貌,但是总有恐惧感,因为从来没有独立把握自己命运的 经历和经验,就像一个从来没有用过电脑的人,生怕按错开关和按钮把电脑烧坏了、一 用力就把键盘敲坏了,或者一上网就会遭遇病毒一样。
来源:http://t.sina.com.cn/1771892741
开放平台模式成功的要点在于,通过自身服务和第三方应用的互利互惠,提高用户对平台网站的粘性和使用程度,进而提高获利,同时,通过利益分摊,达到平台自身和第三方应用循环刺激而产生的滚雪球式的增长。
所谓开放平台,就是首先提供一个基本的服务,然后通过开放自身的接口,使得第三方开发者得以通过运用和组装其接口以及其他第三方服务接口产生新的应用,并且使得该应用能够统一运行在这个平台之上,我们把这样的一种网络服务模式叫做开放平台。
张朝阳说,准确描述现实的书基本上出不来,所以读书误人。俺觉得还是有一些的,比如冯仑的《野蛮生长》、吴思的《潜规则》《血酬定律》、王学泰《游民文化与中国社会》等。大家能补充一下吗?还有哪些书比较清楚剖析中国社会的利益关系、力量平衡等现实?
一创业CEO,名片上头衔却是“客户总监”,问:你不是CEO吗?答:是的,整天跑客户称自己CEO,人家会想这家公司只有一个光杆司令,叫客户总监,遇到难事还可借口“我得问问CEO”...创业就是如此卑微。仔细想想:CEO如果不是客户总监,那他还干嘛呢?建议所有创业CEO将自己的头衔改成“客户总监”!
哈佛有一个著名的理论:人的差别在于业余时间,而一个人的命运决定于晚上8点到10点之间。每晚抽出2个小时的时间用来阅读、进修、思考或参加有意的演讲、讨论,你会发现,你的人生正在发生改变,坚持数年之后,成功会向你招手。
绝大多数人习惯做语言的巨人,行动的矮子。越是智商高的人越容易陷入这个悖 论中,难以自拔。
他接着分析:“我认为一个人失业的成功取决于三商,即我们平时所讲的智商,情 商和胆商,但是一个真正的人才,他的三商重要性应该这样排列:胆商第一,情商第 二,智商第三,目前中国教育培养出来的所谓人才是很片面的,仅仅在智商上优人一 等,可是情商与胆商根本没有包含在内。
为别人打零工才得以糊口的打工朋友们不是不想改变现实生活,也有紧迫感,也 很想改变自身的“贫穷”面貌,但是总有恐惧感,因为从来没有独立把握自己命运的 经历和经验,就像一个从来没有用过电脑的人,生怕按错开关和按钮把电脑烧坏了、一 用力就把键盘敲坏了,或者一上网就会遭遇病毒一样。
来源:http://t.sina.com.cn/1771892741
背景:给弟弟在百度文库上面的卷子想打印,要积分,只好截图把广告删除掉再打印,发现长点的套题试卷截图是空图片,用Firefox下的好多截图扩展都不行,FireShot满足了我的需求,不错。
Pearl Crescent Page Saver,Page Saver可以让你将网页转化为图片,包括网页上的Flash也能同时被转化。网页可以按照你的要求保存为PNG或者JPEG格式。通过使用Page Saver你可以将整个网页或者你在屏幕上看到的部分转化为图片。为了方便你截取网页,插件提供了大量的设置选项,包括默认的文件名、文件后缀名、图片的 质量(如:50%的大小或者原始大小)。
可以通过工具栏按钮截取图片,也可以通过浏览器的菜单选项截取图片,还可以通过命令行截取图片。
Page Saver的全功能版包含更多的功能:例如文件上传、扩展的命令行选项、或者将网页上指定的一部分截取为图片。如果想要获取更多信息,请访问:
http://pearlcrescent.com/products/pagesaver/pro/
扩展页面:https://addons.mozilla.org/zh-CN/firefox/addon/10367
安装:https://addons.mozilla.org/zh-CN/firefox/addons/policy/0/10367/65855?src=addondetail
Pearl Crescent Page Saver,Page Saver可以让你将网页转化为图片,包括网页上的Flash也能同时被转化。网页可以按照你的要求保存为PNG或者JPEG格式。通过使用Page Saver你可以将整个网页或者你在屏幕上看到的部分转化为图片。为了方便你截取网页,插件提供了大量的设置选项,包括默认的文件名、文件后缀名、图片的 质量(如:50%的大小或者原始大小)。
可以通过工具栏按钮截取图片,也可以通过浏览器的菜单选项截取图片,还可以通过命令行截取图片。
Page Saver的全功能版包含更多的功能:例如文件上传、扩展的命令行选项、或者将网页上指定的一部分截取为图片。如果想要获取更多信息,请访问:
http://pearlcrescent.com/products/pagesaver/pro/
扩展页面:https://addons.mozilla.org/zh-CN/firefox/addon/10367
安装:https://addons.mozilla.org/zh-CN/firefox/addons/policy/0/10367/65855?src=addondetail
在用PHP进行文件上传的操作中,需要知道怎么控制上传文件大小的设置,而文件可传大小是受到多种因素制约的,现总结如下:阅读全文
我需要在shell中设置等待时间为1-1000中的
任意毫秒数,sleep最小只到1秒,有什么好方法么?
多谢!
解决了!
居然这样也行!
sleep 0.001
或者:
usleep 100000:
具体单位大家看
man usleep
任意毫秒数,sleep最小只到1秒,有什么好方法么?
多谢!
解决了!
居然这样也行!
sleep 0.001
或者:
usleep 100000:
具体单位大家看
man usleep
腾讯的接口是 ,返回数组 http://fw.qq.com/ipaddress
返回值 var IPData = new Array("61.135.152.194","","北京市","");
新浪的接口 : http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42
返回值 var remote_ip_info = {"ret":1,"start":"218.192.0.0","end":"218.192.7.255","country":"\u4e2d\u56fd","province":"\u5e7f\u4e1c","city":"\u5e7f\u5dde","district":"","isp":"\u6559\u80b2\u7f51","type":"\u5b66\u6821","desc":"\u5e7f\u5dde\u5927\u5b66\u7eba\u7ec7\u670d\u88c5\u5b66\u9662"};
Example:
C:\Documents and Settings\jackxiang>curl "http://fw.qq.com/ipaddress"
var IPData = new Array("219.133.62.73","","广东省","深圳市");
Sina的通过Curl好像不行,需要通过浏览器访问才行。
返回值 var IPData = new Array("61.135.152.194","","北京市","");
新浪的接口 : http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42
返回值 var remote_ip_info = {"ret":1,"start":"218.192.0.0","end":"218.192.7.255","country":"\u4e2d\u56fd","province":"\u5e7f\u4e1c","city":"\u5e7f\u5dde","district":"","isp":"\u6559\u80b2\u7f51","type":"\u5b66\u6821","desc":"\u5e7f\u5dde\u5927\u5b66\u7eba\u7ec7\u670d\u88c5\u5b66\u9662"};
Example:
C:\Documents and Settings\jackxiang>curl "http://fw.qq.com/ipaddress"
var IPData = new Array("219.133.62.73","","广东省","深圳市");
Sina的通过Curl好像不行,需要通过浏览器访问才行。
当我们使用CURL来post数据的时候,需要设置post的数据
curl_setopt($c, CURLOPT_POSTFIELDS, $post_data);
假如这里的$data是
$data = array(
'name'=>'scofield',
'time'=>'2012-2-3'
)
接下来,需要先将$data变成字符串
$post_data = http_build_query($data);
而采用 http_build_query 转换后再
curl_setopt($c, CURLOPT_POSTFIELDS, $post_data);
看起来没有什么问题。但在实际操作中,$post_data 并没有完全被post过去,user_id丢失了。
解决方法:http_build_query($data,"","&");
附:curl post示例:
来自:http://www.dewen.org/q/1406/http_build_query+%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98
http_build_query — 生成 URL-encode 之后的请求字符串
string http_build_query ( array $formdata [, string $numeric_prefix ] )
使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。参数 formdata 可以是数组或包含属性的对象。一个 formdata 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。如果在基础数组中使用了数字下标同时给出了 numeric_prefix 参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor
?>
<?php
$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');
echo http_build_query($data);
/* 输出:
0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor
*/
echo http_build_query($data, 'myvar_');
/* 输出:
myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor
*/
?>
<?php
$data = array('user'=>array('name'=>'Bob Smith',
'age'=>47,
'sex'=>'M',
'dob'=>'5/12/1956'),
'pastimes'=>array('golf', 'opera', 'poker', 'rap'),
'children'=>array('bobby'=>array('age'=>12,
'sex'=>'M'),
'sally'=>array('age'=>8,
'sex'=>'F')),
'CEO');
echo http_build_query($data, 'flags_');
?>
本例将输出(为可读性进行了折行):
user[name]=Bob+Smith&user[age]=47&user[sex]=M&user[dob]=5%1F12%1F1956&
pastimes[0]=golf&pastimes[1]=opera&pastimes[2]=poker&pastimes[3]=rap&
children[bobby][age]=12&children[bobby][sex]=M&children[sally][age]=8&
children[sally][sex]=F&flags_0=CEO
<?php
class myClass {
var $foo;
var $baz;
function myClass()
{
$this->foo = 'bar';
$this->baz = 'boom';
}
}
$data = new myClass();
echo http_build_query($data); // foo=bar&baz=boom
?>
http_build_str:
这个函数有个要求:(PECL pecl_http >= 0.23.0)
string http_build_str ( array $query [, string $prefix [, string $arg_separator = ini_get("arg_separator.output") ]] )
Opponent to parse_str().
特别是对这个字符串 URL-encode 之后的请求字符串的测试如下:
%3C=%3C&%3E=%3E&%22=%22&%27=%27
一)上述程序修改修改,真正提一个经过urlencode后的get请求:
通过tcpdump导出后再通过wireshark查看到其get请求是:
GET /get.php?%3C=%3C&%3E
=%3E&%22=%22&%27=%27 HTTP/1.1..Host: tools.jackxiang.com..Accept: */*....
而返回则是(因为服务端对urlencode编码作了解码后输出,所以又还原原来的字段串了,更加详细内容参看:https://jackxiang.com/post/6954/):
[root@test tmp]# php http_build_query.php
Array
(
[<] => <
[>] => >
["] => "
['] => '
)
PHP接受端:
get.php
Array
(
[<] => <
[>] => >
["] => "
['] => '
)
二)如果不用http_build_query呢?
tcpdump接合wireshark抓包其请求如下:
GET /get.php?<=<&>=>&'=' HTTP/1.1\r\n
Host: tools.jackxiang.com\r\n
Accept: */*\r\n
Full request URI: http://tools.jackxiang.com/get.php?<=<&>=>&'='
返回如下(说明不加urlrewrite的返回也是一样的,这个输入如果不http_build_query的话和服务端处理密切相关,有些接口可能必须要http_build_query下否则会出现逻辑上的接口错误,如:评论,出现不http_build_query也就是不urlencode下,出现插入错误,这都是文档没写名白容易造成的错误。):
返回如下:
Line-based text data: text/html
Array\n
(\n
[<] => <\n
[>] => >\n
['] => '\n
)\n
curl_setopt($c, CURLOPT_POSTFIELDS, $post_data);
假如这里的$data是
$data = array(
'name'=>'scofield',
'time'=>'2012-2-3'
)
接下来,需要先将$data变成字符串
$post_data = http_build_query($data);
而采用 http_build_query 转换后再
curl_setopt($c, CURLOPT_POSTFIELDS, $post_data);
看起来没有什么问题。但在实际操作中,$post_data 并没有完全被post过去,user_id丢失了。
解决方法:http_build_query($data,"","&");
附:curl post示例:
来自:http://www.dewen.org/q/1406/http_build_query+%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98
http_build_query — 生成 URL-encode 之后的请求字符串
string http_build_query ( array $formdata [, string $numeric_prefix ] )
使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。参数 formdata 可以是数组或包含属性的对象。一个 formdata 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。如果在基础数组中使用了数字下标同时给出了 numeric_prefix 参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor
?>
<?php
$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');
echo http_build_query($data);
/* 输出:
0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor
*/
echo http_build_query($data, 'myvar_');
/* 输出:
myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor
*/
?>
<?php
$data = array('user'=>array('name'=>'Bob Smith',
'age'=>47,
'sex'=>'M',
'dob'=>'5/12/1956'),
'pastimes'=>array('golf', 'opera', 'poker', 'rap'),
'children'=>array('bobby'=>array('age'=>12,
'sex'=>'M'),
'sally'=>array('age'=>8,
'sex'=>'F')),
'CEO');
echo http_build_query($data, 'flags_');
?>
本例将输出(为可读性进行了折行):
user[name]=Bob+Smith&user[age]=47&user[sex]=M&user[dob]=5%1F12%1F1956&
pastimes[0]=golf&pastimes[1]=opera&pastimes[2]=poker&pastimes[3]=rap&
children[bobby][age]=12&children[bobby][sex]=M&children[sally][age]=8&
children[sally][sex]=F&flags_0=CEO
<?php
class myClass {
var $foo;
var $baz;
function myClass()
{
$this->foo = 'bar';
$this->baz = 'boom';
}
}
$data = new myClass();
echo http_build_query($data); // foo=bar&baz=boom
?>
http_build_str:
这个函数有个要求:(PECL pecl_http >= 0.23.0)
string http_build_str ( array $query [, string $prefix [, string $arg_separator = ini_get("arg_separator.output") ]] )
Opponent to parse_str().
特别是对这个字符串 URL-encode 之后的请求字符串的测试如下:
%3C=%3C&%3E=%3E&%22=%22&%27=%27
一)上述程序修改修改,真正提一个经过urlencode后的get请求:
通过tcpdump导出后再通过wireshark查看到其get请求是:
GET /get.php?%3C=%3C&%3E
=%3E&%22=%22&%27=%27 HTTP/1.1..Host: tools.jackxiang.com..Accept: */*....
而返回则是(因为服务端对urlencode编码作了解码后输出,所以又还原原来的字段串了,更加详细内容参看:https://jackxiang.com/post/6954/):
[root@test tmp]# php http_build_query.php
Array
(
[<] => <
[>] => >
["] => "
['] => '
)
PHP接受端:
get.php
Array
(
[<] => <
[>] => >
["] => "
['] => '
)
二)如果不用http_build_query呢?
tcpdump接合wireshark抓包其请求如下:
GET /get.php?<=<&>=>&'=' HTTP/1.1\r\n
Host: tools.jackxiang.com\r\n
Accept: */*\r\n
Full request URI: http://tools.jackxiang.com/get.php?<=<&>=>&'='
返回如下(说明不加urlrewrite的返回也是一样的,这个输入如果不http_build_query的话和服务端处理密切相关,有些接口可能必须要http_build_query下否则会出现逻辑上的接口错误,如:评论,出现不http_build_query也就是不urlencode下,出现插入错误,这都是文档没写名白容易造成的错误。):
返回如下:
Line-based text data: text/html
Array\n
(\n
[<] => <\n
[>] => >\n
['] => '\n
)\n
一个男人在外工作20年,终于要回家了,
老板问他:你是要20年的工资还是要3句忠告?男人说我明天上路,明早给您答案好吗?老板说可以。当晚男人未眠…
早晨,他对老板说:我要3个忠告。于是老板给他3句话。
一、不要试图寻找不可能的捷径,世上没有便宜的事,只有脚踏实地才是最好的方法…无论做何事。
二、不要对明知不是好事的事过分好奇,有可能你会因此而丧命。
三、不要在冲动时做任何决定,否则这个决定就有可能成为你一辈子的遗憾。说完老板给男人一些钱和三个面包,并叮嘱:最大的面包在到家后才能吃。
男人上路了…他走了好几天…把第一个面包吃了一半了,没过多久遇到一个路口,他打听:请问到**走哪条路近?路人甲:走小路吧,近。路人乙:走大路吧,安全。他迫不急待要与妻子见面,于是走了小路。走了没多久就听到有路人说附近闹山贼,于是他想起了老板的第一个忠告:不要试图寻找捷径。于是他回头去
走那条大路。
又走了几天,第二个面包也吃了一部分了…他找到一家极便宜的客栈投宿。半夜听见有女子哭声,他睡不下。于是决定出门看看。这时他想到了第二个忠告:不要对明知不是好事的事过分好奇。于是他又睡下了。第二日起程时,店家惊道:你还活着?他不解,遂问原由。店家说他有个疯女儿,发病时用哭声引人出来再将其杀害,昨晚投宿的客人只有你一个活着。男人长叹:啊…
又走了几天,当第二个面包吃完时他已离家不远了。他更加激动了。天刚黑下来没多久,他就走到了自己的村子。到家时他刚准备敲门,却听到屋里有男人的声音。他气极了,拿起一把砍柴刀就准备冲进屋子将那男的杀掉。但这时他想到了第三个忠告:不要在冲动时做任何决定,可能这个决定会让你后悔一辈子。于是他冷静下来,在屋外坐了一夜。第二天早上他很早就敲开了门,妻子见他回来十分高兴。但他却很冷漠:那个男人是谁?他妻子笑曰:那是我们的儿啊…你走后没多久我就…这时他发现这个年轻小伙竟和自己长得相似极了。父子初次见面,相拥而泣…一阵关切过后男人拿出第三个面包准备和妻、子一齐分享…切开之后却发现20年的
走那条大路。
又走了几天,第二个面包也吃了一部分了…他找到一家极便宜的客栈投宿。半夜听见有女子哭声,他睡不下。于是决定出门看看。这时他想到了第二个忠告:不要对明知不是好事的事过分好奇。于是他又睡下了。第二日起程时,店家惊道:你还活着?他不解,遂问原由。店家说他有个疯女儿,发病时用哭声引人出来再将其杀害,昨晚投宿的客人只有你一个活着。男人长叹:啊…
又走了几天,当第二个面包吃完时他已离家不远了。他更加激动了。天刚黑下来没多久,他就走到了自己的村子。到家时他刚准备敲门,却听到屋里有男人的声音。他气极了,拿起一把砍柴刀就准备冲进屋子将那男的杀掉。但这时他想到了第三个忠告:不要在冲动时做任何决定,可能这个决定会让你后悔一辈子。于是他冷静下来,在屋外坐了一夜。第二天早上他很早就敲开了门,妻子见他回来十分高兴。但他却很冷漠:那个男人是谁?他妻子笑曰:那是我们的儿啊…你走后没多久我就…这时他发现这个年轻小伙竟和自己长得相似极了。父子初次见面,相拥而泣…一阵关切过后男人拿出第三个面包准备和妻、子一齐分享…切开之后却发现20年的工資全在裡面。所以我們做任何事都要考慮清楚否則到最後後悔的是自己!
------
阅读全文
老板问他:你是要20年的工资还是要3句忠告?男人说我明天上路,明早给您答案好吗?老板说可以。当晚男人未眠…
早晨,他对老板说:我要3个忠告。于是老板给他3句话。
一、不要试图寻找不可能的捷径,世上没有便宜的事,只有脚踏实地才是最好的方法…无论做何事。
二、不要对明知不是好事的事过分好奇,有可能你会因此而丧命。
三、不要在冲动时做任何决定,否则这个决定就有可能成为你一辈子的遗憾。说完老板给男人一些钱和三个面包,并叮嘱:最大的面包在到家后才能吃。
男人上路了…他走了好几天…把第一个面包吃了一半了,没过多久遇到一个路口,他打听:请问到**走哪条路近?路人甲:走小路吧,近。路人乙:走大路吧,安全。他迫不急待要与妻子见面,于是走了小路。走了没多久就听到有路人说附近闹山贼,于是他想起了老板的第一个忠告:不要试图寻找捷径。于是他回头去
走那条大路。
又走了几天,第二个面包也吃了一部分了…他找到一家极便宜的客栈投宿。半夜听见有女子哭声,他睡不下。于是决定出门看看。这时他想到了第二个忠告:不要对明知不是好事的事过分好奇。于是他又睡下了。第二日起程时,店家惊道:你还活着?他不解,遂问原由。店家说他有个疯女儿,发病时用哭声引人出来再将其杀害,昨晚投宿的客人只有你一个活着。男人长叹:啊…
又走了几天,当第二个面包吃完时他已离家不远了。他更加激动了。天刚黑下来没多久,他就走到了自己的村子。到家时他刚准备敲门,却听到屋里有男人的声音。他气极了,拿起一把砍柴刀就准备冲进屋子将那男的杀掉。但这时他想到了第三个忠告:不要在冲动时做任何决定,可能这个决定会让你后悔一辈子。于是他冷静下来,在屋外坐了一夜。第二天早上他很早就敲开了门,妻子见他回来十分高兴。但他却很冷漠:那个男人是谁?他妻子笑曰:那是我们的儿啊…你走后没多久我就…这时他发现这个年轻小伙竟和自己长得相似极了。父子初次见面,相拥而泣…一阵关切过后男人拿出第三个面包准备和妻、子一齐分享…切开之后却发现20年的
走那条大路。
又走了几天,第二个面包也吃了一部分了…他找到一家极便宜的客栈投宿。半夜听见有女子哭声,他睡不下。于是决定出门看看。这时他想到了第二个忠告:不要对明知不是好事的事过分好奇。于是他又睡下了。第二日起程时,店家惊道:你还活着?他不解,遂问原由。店家说他有个疯女儿,发病时用哭声引人出来再将其杀害,昨晚投宿的客人只有你一个活着。男人长叹:啊…
又走了几天,当第二个面包吃完时他已离家不远了。他更加激动了。天刚黑下来没多久,他就走到了自己的村子。到家时他刚准备敲门,却听到屋里有男人的声音。他气极了,拿起一把砍柴刀就准备冲进屋子将那男的杀掉。但这时他想到了第三个忠告:不要在冲动时做任何决定,可能这个决定会让你后悔一辈子。于是他冷静下来,在屋外坐了一夜。第二天早上他很早就敲开了门,妻子见他回来十分高兴。但他却很冷漠:那个男人是谁?他妻子笑曰:那是我们的儿啊…你走后没多久我就…这时他发现这个年轻小伙竟和自己长得相似极了。父子初次见面,相拥而泣…一阵关切过后男人拿出第三个面包准备和妻、子一齐分享…切开之后却发现20年的工資全在裡面。所以我們做任何事都要考慮清楚否則到最後後悔的是自己!
------
阅读全文
文件打开
命令行打开文件:
luochunhui.com$ vim file
在vim中打开另一个文件:
:e foo.c
然后回到打开的上一个文件:
:e #
打开下一个文件使用n.n的用法和q相似。n是关闭当前并打开下一个,q是退出vim。他们也都可以加q或!修饰。:
:n
:wn
:n!
查看在这本次vim中,已经打开了哪些文件了。
:ls
1 %a "test.c" line 1
2 "array.c" line 0
根据这个结果,可以回到任何一个文件
:e #2
彻底的关闭文件,参数可以是ls看到的ID,或者是文件名:
:bd 2
:bd array.c
光标移动
移到文件尾部,使用两个”[",
]]移到文件头部,使用两个"]",
[[移到某一行:
:28
从某一行往下移N行
:28 3 #将定位到31行
移到{,[,(, #ifdef等配对符号的的另一端
%
显示控制
显示换行,tab等不可见字符。 VIM将会把换行显示为$, tag显示为^I.
:se list
显示行号
:se nu
隐藏行号:
:se nonu
输入控制
将tab设置为4个空格的宽度(默认为8)。
:se ts=4
在输入时将tab自动替换为N个空格
:se expandtab
将文件中原有的tab也替换为空格。
:retab
让vim帮你自动格式化缩进,在命令模式下输入(不输入":")
gg=G
查找及替换
查找所有的tab。
/\t
将\t替换为四个空格
:%s/\t/ /g
再狠一点,在全部打开的文件中继续替换:
:bufdo %s/\t/ /g
找单词, 这个语句将会找到int word, 但不会找alongword
/\
再方便一点,定位到下一个单词,他和当前光标所在处的单词相同:
*
变为反向找:
?
n
变为正向找:
/
n
make
调用make:
:make
默认调用的:make操作是make,不带任何参数
修改make, 空格需要使用\ \进行转义。
:set makeprg=make\ \-b
在make失败后,敲任意键后将自动定位到出错的行。
查看make错误,不加参数将显示出错的后5行。 可加上!输出所有错误行:
:clist
:clist!
另外两个, 显示第一行,或最后一行错误。如果加参数,则显示第N行
:cfirst [N]
:clast [N]
定位到下一个编译错误行:
:cn
ctags
生成ctags文件,在命令行执行命令后,将在当前目录生成一个tags文件
luochunhui.com$ ctags -l -i -s -t -v -d -p .
vi中使用本tags文件
:tag ./tags
定位到指定函数,再tn定位到下一个:
:ta /myfunc
:tn
跟踪到光标所在处的函数,类似eclipse中的F3功能
按键: ctrl + ]
返回刚才:
按键: ctrl + t
],t两个操作为堆栈式,不管你进入了多少ctrl+],你都可以通过ctrl+t原路返回。
csope
cscope是比ctags更为强大的源码导航工具,比如,他可以导向到库代码文件
luochunhui.com$ cscope -Rbq
将生成: cscope.out 及几个不用理会的中将文件
在vi中加载:
:cs add ./cscope.out
查找函数定义
:cs f g myfunc
查找函数在何处被调用。找下一条匹配规则与ctags相同:
:cs f c myfunc
:nt
查找函数也可以使用tag语法:
:cstag /myfunc
跟踪头文件:
:cs f f stdio.h
你可以简单的输入:cs查看其所有支持的规则
:cs
貌似cs没有ctrl+]这样的快捷键,是个遗憾。不过可完全可以同时加载ctags和cscope两种导航工具。达到这个需求。
自动完成
在vim的输入状态下,输入前几个字符后,可以按Ctrl + P,或者ctrl + N,打开自动完成的下拉菜单。
比如,
输入print,按ctrl+p,将提示可选择printing, printf, prints函数。
语法高亮
打开/关闭语法高亮
:sy on/off
保存你的设置
一般的显示设置等等,都是只在当前打开的vim中生效的,如果你需要使以后打开的vim都使用一些配置,你可以把他们写入~/.vimrc文件. 比如我的~/.vimrc文件,很多行。。将默认显示行数,默认加载本路径下的cs文件等等都做了自动设置。并将其保存在dropbox中。这样在其他机器上,我随时可以复制这个文件,将vim设置为自己习惯的模式。
:se nu
:cs add ./cscope.out
:se ts=4
:set expandtab
来源:http://www.luochunhui.com/id/573
命令行打开文件:
luochunhui.com$ vim file
在vim中打开另一个文件:
:e foo.c
然后回到打开的上一个文件:
:e #
打开下一个文件使用n.n的用法和q相似。n是关闭当前并打开下一个,q是退出vim。他们也都可以加q或!修饰。:
:n
:wn
:n!
查看在这本次vim中,已经打开了哪些文件了。
:ls
1 %a "test.c" line 1
2 "array.c" line 0
根据这个结果,可以回到任何一个文件
:e #2
彻底的关闭文件,参数可以是ls看到的ID,或者是文件名:
:bd 2
:bd array.c
光标移动
移到文件尾部,使用两个”[",
]]移到文件头部,使用两个"]",
[[移到某一行:
:28
从某一行往下移N行
:28 3 #将定位到31行
移到{,[,(, #ifdef等配对符号的的另一端
%
显示控制
显示换行,tab等不可见字符。 VIM将会把换行显示为$, tag显示为^I.
:se list
显示行号
:se nu
隐藏行号:
:se nonu
输入控制
将tab设置为4个空格的宽度(默认为8)。
:se ts=4
在输入时将tab自动替换为N个空格
:se expandtab
将文件中原有的tab也替换为空格。
:retab
让vim帮你自动格式化缩进,在命令模式下输入(不输入":")
gg=G
查找及替换
查找所有的tab。
/\t
将\t替换为四个空格
:%s/\t/ /g
再狠一点,在全部打开的文件中继续替换:
:bufdo %s/\t/ /g
找单词, 这个语句将会找到int word, 但不会找alongword
/\
再方便一点,定位到下一个单词,他和当前光标所在处的单词相同:
*
变为反向找:
?
n
变为正向找:
/
n
make
调用make:
:make
默认调用的:make操作是make,不带任何参数
修改make, 空格需要使用\ \进行转义。
:set makeprg=make\ \-b
在make失败后,敲任意键后将自动定位到出错的行。
查看make错误,不加参数将显示出错的后5行。 可加上!输出所有错误行:
:clist
:clist!
另外两个, 显示第一行,或最后一行错误。如果加参数,则显示第N行
:cfirst [N]
:clast [N]
定位到下一个编译错误行:
:cn
ctags
生成ctags文件,在命令行执行命令后,将在当前目录生成一个tags文件
luochunhui.com$ ctags -l -i -s -t -v -d -p .
vi中使用本tags文件
:tag ./tags
定位到指定函数,再tn定位到下一个:
:ta /myfunc
:tn
跟踪到光标所在处的函数,类似eclipse中的F3功能
按键: ctrl + ]
返回刚才:
按键: ctrl + t
],t两个操作为堆栈式,不管你进入了多少ctrl+],你都可以通过ctrl+t原路返回。
csope
cscope是比ctags更为强大的源码导航工具,比如,他可以导向到库代码文件
luochunhui.com$ cscope -Rbq
将生成: cscope.out 及几个不用理会的中将文件
在vi中加载:
:cs add ./cscope.out
查找函数定义
:cs f g myfunc
查找函数在何处被调用。找下一条匹配规则与ctags相同:
:cs f c myfunc
:nt
查找函数也可以使用tag语法:
:cstag /myfunc
跟踪头文件:
:cs f f stdio.h
你可以简单的输入:cs查看其所有支持的规则
:cs
貌似cs没有ctrl+]这样的快捷键,是个遗憾。不过可完全可以同时加载ctags和cscope两种导航工具。达到这个需求。
自动完成
在vim的输入状态下,输入前几个字符后,可以按Ctrl + P,或者ctrl + N,打开自动完成的下拉菜单。
比如,
输入print,按ctrl+p,将提示可选择printing, printf, prints函数。
语法高亮
打开/关闭语法高亮
:sy on/off
保存你的设置
一般的显示设置等等,都是只在当前打开的vim中生效的,如果你需要使以后打开的vim都使用一些配置,你可以把他们写入~/.vimrc文件. 比如我的~/.vimrc文件,很多行。。将默认显示行数,默认加载本路径下的cs文件等等都做了自动设置。并将其保存在dropbox中。这样在其他机器上,我随时可以复制这个文件,将vim设置为自己习惯的模式。
:se nu
:cs add ./cscope.out
:se ts=4
:set expandtab
来源:http://www.luochunhui.com/id/573
查看/修改Linux时区和时间
一、时区
1. 查看当前时区
date -R
2. 修改设置时区
方法(1)
tzselect
方法(2) 仅限于RedHat Linux 和 CentOS
timeconfig
方法(3) 适用于Debian
dpkg-reconfigure tzdata
3. 复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
在中国可以使用:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
二、时间
1、查看时间和日期
date
2、设置时间和日期
将系统日期设定成1996年6月10日的命令
date -s 06/22/96
将系统时间设定成下午1点52分0秒的命令
date -s 13:52:00
3. 将当前时间和日期写入BIOS,避免重启后失效
hwclock -w
三、定时同步时间
* * * * * /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
一、时区
1. 查看当前时区
date -R
2. 修改设置时区
方法(1)
tzselect
方法(2) 仅限于RedHat Linux 和 CentOS
timeconfig
方法(3) 适用于Debian
dpkg-reconfigure tzdata
3. 复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
在中国可以使用:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
二、时间
1、查看时间和日期
date
2、设置时间和日期
将系统日期设定成1996年6月10日的命令
date -s 06/22/96
将系统时间设定成下午1点52分0秒的命令
date -s 13:52:00
3. 将当前时间和日期写入BIOS,避免重启后失效
hwclock -w
三、定时同步时间
* * * * * /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
该问题原因是'/home/data/test/dev_test_com/include' 目录中包含中文的文件名造成的,
将中文件文件名删除,再执行
/usr/local/svn/bin/svn import (要导入版本库的数据)/home/data/test/dev_test_com file:///usr/local/svn/repos/test -m "Initial import"
即可 :)
我遇到的是:
查看,果然有这个中文的玩意:
将中文件文件名删除,再执行
/usr/local/svn/bin/svn import (要导入版本库的数据)/home/data/test/dev_test_com file:///usr/local/svn/repos/test -m "Initial import"
即可 :)
我遇到的是:
查看,果然有这个中文的玩意:
svn: Failed to add file 'Makefile': an unversioned file of the same name already exists
执行更新(svn up)时报错。因为其他人新增一个文件到服务器,而本地却存在一个同名文件(未版本控制)
先将本地重名文件改名,再执行"svn up",之后再比较、合并文件。或者执行 "svn up --force"
这时可能会出现系统提示,因为subversion发现了local work copy和repository上的不一致。需要svn用户自己裁决,可以直接输入tf,即使用repository上版本即可,因为你没有更改project文件。即:
Conflict discovered in ‘EuM1.xcodeproj/project.pbxproj’.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: s
(e) edit – change merged file in an editor
(df) diff-full – show all changes made to merged file
(r) resolved – accept merged version of file
(dc) display-conflict – show all conflicts (ignoring merged version)
(mc) mine-conflict – accept my version for all conflicts (same)
(tc) theirs-conflict – accept their version for all conflicts (same)
(mf) mine-full – accept my version of entire file (even non-conflicts)
(tf) theirs-full – accept their version of entire file (same)
(p) postpone – mark the conflict to be resolved later
(l) launch – launch external tool to resolve conflict
(s) show all – show this list
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: tf
在这里,如果记不清楚各个选项的含义,可以输入s了解。另外,如果不确定自己是否更改了本地的project文件,可以输入dc了解本地代码和repository上的差异。
但是,如果你也为项目增加了新文件,这样你的本地project文件和repository上的project文件都有新的内容。我现在的做法是 tc,即让svn自动合并,当然合并的是有问题的,会标出哪部分是我本地的,哪部分是repository上的,我是手工解决冲突,然后再次提交,通知项 目成员更新。
阅读全文
执行更新(svn up)时报错。因为其他人新增一个文件到服务器,而本地却存在一个同名文件(未版本控制)
先将本地重名文件改名,再执行"svn up",之后再比较、合并文件。或者执行 "svn up --force"
这时可能会出现系统提示,因为subversion发现了local work copy和repository上的不一致。需要svn用户自己裁决,可以直接输入tf,即使用repository上版本即可,因为你没有更改project文件。即:
Conflict discovered in ‘EuM1.xcodeproj/project.pbxproj’.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: s
(e) edit – change merged file in an editor
(df) diff-full – show all changes made to merged file
(r) resolved – accept merged version of file
(dc) display-conflict – show all conflicts (ignoring merged version)
(mc) mine-conflict – accept my version for all conflicts (same)
(tc) theirs-conflict – accept their version for all conflicts (same)
(mf) mine-full – accept my version of entire file (even non-conflicts)
(tf) theirs-full – accept their version of entire file (same)
(p) postpone – mark the conflict to be resolved later
(l) launch – launch external tool to resolve conflict
(s) show all – show this list
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: tf
在这里,如果记不清楚各个选项的含义,可以输入s了解。另外,如果不确定自己是否更改了本地的project文件,可以输入dc了解本地代码和repository上的差异。
但是,如果你也为项目增加了新文件,这样你的本地project文件和repository上的project文件都有新的内容。我现在的做法是 tc,即让svn自动合并,当然合并的是有问题的,会标出哪部分是我本地的,哪部分是repository上的,我是手工解决冲突,然后再次提交,通知项 目成员更新。
阅读全文
用yast2图形操作,或用zypper
习惯于在字符下面解决问题,在用习惯了yum的情况下改投SuSE的yast总觉得有些慢,处理起来让我很是着急。yast的界面做的很好,也很详细,但是一定程度上加大了使用的繁复性,对于我等习惯了CLI的情况下,还是有些难于接受。开始的时候用了yast -i安装一些已经知道的包名。发现还可以。但是当我只知道一点关键字,不知道完整包名的时候,让我感觉yast的包的查询不是很便捷。还好看了一下 SuSE的官方文档reference,知道了这个命令zypper.
阅读全文
习惯于在字符下面解决问题,在用习惯了yum的情况下改投SuSE的yast总觉得有些慢,处理起来让我很是着急。yast的界面做的很好,也很详细,但是一定程度上加大了使用的繁复性,对于我等习惯了CLI的情况下,还是有些难于接受。开始的时候用了yast -i安装一些已经知道的包名。发现还可以。但是当我只知道一点关键字,不知道完整包名的时候,让我感觉yast的包的查询不是很便捷。还好看了一下 SuSE的官方文档reference,知道了这个命令zypper.
阅读全文
我都不解Linux安装Apache老是出这样那样的问题,不像Windows能兼容。。。
阅读全文
阅读全文
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
阅读全文
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
阅读全文