Putty For S60, 可以从E71上通过WLAN访问所有开了ssh的Linux机器了
Unix/LinuxC技术 jackxiang 2010-3-13 23:03
我个人觉得如果是单片机来说中断和查询的写法可能会让单片机在效率上有些不同,毕竟单片机的资源有限,但是对于上位机的PC监控来说呢,查询的消耗并没有消耗多少(这儿是相对于中断来说的),但是如果严谨些,是应该用中断来代替查询的,这儿分别列出中断和查询在linux上的不同写法,以区分出来,以下是示例代码:
阅读全文
阅读全文
通信协议:第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
//程序编写: 龚建伟 webmaster@gjwtech.com
//技术主页:http://www.gjwtech.com
//您有这方面的问题可以和我讨论
#include <reg51.h>
#include <string.h>
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum count3;
bit read_flag=0;
void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1 8 UART enable ucvr
TMOD |= 0x20; //TMOD: timer 1 mode 2 8 reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
// TI=1;
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char *str unsigned int strlen)
{
unsigned int k=0;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-1)) && (!checksum) )
{
read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}
main()
{
init_serialcomm(); //初始化串口
while(1)
{
if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0; //取数标志清0
send_string_com(inbuf1 INBUF_LEN);
}
}
}
转帖:http://www.chinaeda.cn/show.aspx?id=8117&cid=7
测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
//程序编写: 龚建伟 webmaster@gjwtech.com
//技术主页:http://www.gjwtech.com
//您有这方面的问题可以和我讨论
#include <reg51.h>
#include <string.h>
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum count3;
bit read_flag=0;
void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1 8 UART enable ucvr
TMOD |= 0x20; //TMOD: timer 1 mode 2 8 reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
// TI=1;
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char *str unsigned int strlen)
{
unsigned int k=0;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-1)) && (!checksum) )
{
read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}
main()
{
init_serialcomm(); //初始化串口
while(1)
{
if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0; //取数标志清0
send_string_com(inbuf1 INBUF_LEN);
}
}
}
转帖:http://www.chinaeda.cn/show.aspx?id=8117&cid=7
ginx/lighttpd等web server 采用epoll+单进程模式能支持并发几w的并发。但有个问题一直没搞明白,如果单进程的话,来个请求肯定得read/write操作吧,如果get数据很大的话(如sleep 1000),单进程服务串行处理请求还不得严重阻塞啊?? ,请大牛们解惑 ;对于apache进程+线程池的并发处理就比较好理解
而且epoll模式是非阻塞的,应该不会存在sleep 1000什么的.问题可能存在于处理数据的效率上吧...可以考虑分离吧使用非阻塞模式做I/O操作需检查errno是不是EAGAIN、EWOULDBLOCK、EINTR,如果是就需要循环重读,也就非阻塞处理IO时间与阻塞是一样,只是非阻塞能立即返回而且,你得人工去重复处理数据,还是需要等很长时间
单线程epoll ET,处理几万个并发连接是小case,LT模式都能处理上万并发连接,只是LT时CPU占用是居高不下。
单线程但并不是单线程啊! nginx 多线程的, 底下真正做事时还是一个线程伺候一个client的, 但accept()是在主线程统一处理的 ...
nginx/lighttpd之类只是取巧于各种常用web应用的多数情况, 如果您用nginx,lighttpd的web服务器处理论坛等高度发, 高复杂的业务时, 它们也没什么优势的, 甚至不如apache
如果这样的话,nginx还是会用到类似线程池技术罗?? 之前粗略看了看lighttpd源码结构,没有用到线程池,一般情况是单进程,考虑多CPU情况也可以fork几个worker进程,但不像apache好几百的进程摆在那
ighttpd和nginx采用异步服务器模式,epoll模式,为何apache不采用这个模式,可以提高并发性能?
个人理解:
1. apache的模块大都是采用select模式开发,换到epoll模式不容易?
2. 跨平台问题,epoll模式只在linux2.6内核上有,其他平台无法实现,那么可以搞个支持epoll模式的apache新版本,叫apache3.0也可以啊
3.对于apache模块话其实没有必要去学习epool,相对php处理一些复杂的逻辑运算可能稳定性会比nginx更好更稳定(我自己加的一条)
但是apache有很多模块是阻塞方式运行的,所以需要每个请求开启一个线程/进程,这跟worker没什么区别。线程/进程之间切换时要一定代价的,另外也并不能发挥event非阻塞的优势。
我觉得,apache本身的线程模式与event非阻塞方式是有冲突的。再加上现有很多apache模块是用阻塞方式来写的,所以我觉得要完全移植很难。
如果楼主一定要用的话,建议还是用lighttpd或nginx吧,apache现在主要还是定位于功能强大的后端服务器。
前几天用apache-2.2.11的event模式和nginx-0.7.30的epoll模式做了下简单对比 同样7万个连接 apache只撑了大概15分钟后就已经不能提供服务了 在前15分钟能访问到后端的连接数也很少 相比使用nginx顶7万个连接 在系统负载和cpu消耗上nginx都占有优势 至少我用nginx来跑7万并发的静态图片到现在还没挂过 不错 呵呵
apache在兼容性上考虑的比较好,nginx性能不错!各取所需!!!
而且epoll模式是非阻塞的,应该不会存在sleep 1000什么的.问题可能存在于处理数据的效率上吧...可以考虑分离吧使用非阻塞模式做I/O操作需检查errno是不是EAGAIN、EWOULDBLOCK、EINTR,如果是就需要循环重读,也就非阻塞处理IO时间与阻塞是一样,只是非阻塞能立即返回而且,你得人工去重复处理数据,还是需要等很长时间
单线程epoll ET,处理几万个并发连接是小case,LT模式都能处理上万并发连接,只是LT时CPU占用是居高不下。
单线程但并不是单线程啊! nginx 多线程的, 底下真正做事时还是一个线程伺候一个client的, 但accept()是在主线程统一处理的 ...
nginx/lighttpd之类只是取巧于各种常用web应用的多数情况, 如果您用nginx,lighttpd的web服务器处理论坛等高度发, 高复杂的业务时, 它们也没什么优势的, 甚至不如apache
如果这样的话,nginx还是会用到类似线程池技术罗?? 之前粗略看了看lighttpd源码结构,没有用到线程池,一般情况是单进程,考虑多CPU情况也可以fork几个worker进程,但不像apache好几百的进程摆在那
ighttpd和nginx采用异步服务器模式,epoll模式,为何apache不采用这个模式,可以提高并发性能?
个人理解:
1. apache的模块大都是采用select模式开发,换到epoll模式不容易?
2. 跨平台问题,epoll模式只在linux2.6内核上有,其他平台无法实现,那么可以搞个支持epoll模式的apache新版本,叫apache3.0也可以啊
3.对于apache模块话其实没有必要去学习epool,相对php处理一些复杂的逻辑运算可能稳定性会比nginx更好更稳定(我自己加的一条)
但是apache有很多模块是阻塞方式运行的,所以需要每个请求开启一个线程/进程,这跟worker没什么区别。线程/进程之间切换时要一定代价的,另外也并不能发挥event非阻塞的优势。
我觉得,apache本身的线程模式与event非阻塞方式是有冲突的。再加上现有很多apache模块是用阻塞方式来写的,所以我觉得要完全移植很难。
如果楼主一定要用的话,建议还是用lighttpd或nginx吧,apache现在主要还是定位于功能强大的后端服务器。
前几天用apache-2.2.11的event模式和nginx-0.7.30的epoll模式做了下简单对比 同样7万个连接 apache只撑了大概15分钟后就已经不能提供服务了 在前15分钟能访问到后端的连接数也很少 相比使用nginx顶7万个连接 在系统负载和cpu消耗上nginx都占有优势 至少我用nginx来跑7万并发的静态图片到现在还没挂过 不错 呵呵
apache在兼容性上考虑的比较好,nginx性能不错!各取所需!!!
原文来自:
http://www.neatstudio.com/show-1141-1.shtml#comment
hinkSNS是基于ThinkPHP框架开发的一款SNS程序,原本以为还是相对不错的程序,一些小的BUG也还能够接受,但听到这个消息(不再继续开发)后,心里哇凉哇凉的。
本来我也不知道的,但是在偶尔看discuz的uchome时,发现了这个投票,投票地址为:http://u.discuz.net/home/space-1293758-do-poll-pid-2017.html,内容大致如下:
XML/HTML代码
1. RT,大家都知道,SNS即将过去.曾经我们离开过,去年我们团队又回来了,但是我们发现现在的网络形式已经不同了。因此我们不得不再次将 THINKSNS项目再次停止开发,将精力转向微博,细心的朋友会发现我们已经在开发微博了,大家可以看77661.CN。目前进行到V0.2版本,并且此版将在下周一前提供下载。新版演示可以参考Couxing.com
看到这个投票,心里能不哇凉哇凉吗?看来以后更加不敢用这些个人作品了。除非是以公司运作的、或者开源但功能完整,BUG不多的。
因为相对于thinksns来说,我投入的精力和修改BUG也花了不少精力,当初thinksns说改用thinkphp2.0开发的时候,本来还想着激动一下,结果,干脆说不开发了。唉。。现在的百思家网站的用户中心就是采用了这个thinkSNS,改动了很多功能,不再一一列出,主要还是由于是商业网站不太适合改动,我仅说一点小小的吧,那就是博客的分类与相册的分类整合(而且还是用的另外的表,并非他原先的表结构)。
想来想去,最多到6月份左右,我想我还是会回到UCH上面吧?基于几个原因:
1. 官方不再开发,而小BUG太多
2. 冗余代码太多,无法细细清除
3. theme更换的时候,必须要cleancache,否则无效(因此,在任何情况下,也只能拥有一套皮肤)
4. 原始模版写的有点糟糕,可能是赶时间写的。。。改一个小地方,都要同时改4、5个模版
感言待续!
写一部分:
开源不等于不要钱,开源更不是等于节约了重新开发轮子的时间,开源是一种精神,唯有开源,共享,互联网才能继续注入新鲜血液,他是超越商业的一种特殊的模式,对于thinksns的不再开发来说,只能说是在商业上的失败导致项目的后续版本开发得以停滞不前,如果没有一个商业机构来推动开源,那开源就更是无本之源,开源和商业的完美结合才能更好的推动开源事业的发展。
软件是免费还是收费就其本质,还是应该收费,现今社会,开源好似一种免费的午餐,任何人都可以免费获得源代码,但是通过它能迅速的达到盈利,还是有相当大的一段距离,而不得不通过二次开发,以及整合才能实现商业的价值,由此,而这个基础功能的实现由开源来实现了,对于高级的定制化的服务,是完全可以通过商业来实现其开源的增值,这也就是开源的商业价值所在,所以,开源和商业价值的实现是统一的,对于认为开源就是免费的说法是有偏差和值得怀疑的,没有好的商业模式来推动开源,开源就是空号,如何让人觉得其开源的项目有价值?如何让更多开发工程师认为我们的开发付出和免费是值得的,这就要通过商业社会的用户和产品来检验,由此,开源势在必行,但必须和商业目标结合的开源方能发展壮大,才能更加具有价值和潜力可挖!
http://www.neatstudio.com/show-1141-1.shtml#comment
hinkSNS是基于ThinkPHP框架开发的一款SNS程序,原本以为还是相对不错的程序,一些小的BUG也还能够接受,但听到这个消息(不再继续开发)后,心里哇凉哇凉的。
本来我也不知道的,但是在偶尔看discuz的uchome时,发现了这个投票,投票地址为:http://u.discuz.net/home/space-1293758-do-poll-pid-2017.html,内容大致如下:
XML/HTML代码
1. RT,大家都知道,SNS即将过去.曾经我们离开过,去年我们团队又回来了,但是我们发现现在的网络形式已经不同了。因此我们不得不再次将 THINKSNS项目再次停止开发,将精力转向微博,细心的朋友会发现我们已经在开发微博了,大家可以看77661.CN。目前进行到V0.2版本,并且此版将在下周一前提供下载。新版演示可以参考Couxing.com
看到这个投票,心里能不哇凉哇凉吗?看来以后更加不敢用这些个人作品了。除非是以公司运作的、或者开源但功能完整,BUG不多的。
因为相对于thinksns来说,我投入的精力和修改BUG也花了不少精力,当初thinksns说改用thinkphp2.0开发的时候,本来还想着激动一下,结果,干脆说不开发了。唉。。现在的百思家网站的用户中心就是采用了这个thinkSNS,改动了很多功能,不再一一列出,主要还是由于是商业网站不太适合改动,我仅说一点小小的吧,那就是博客的分类与相册的分类整合(而且还是用的另外的表,并非他原先的表结构)。
想来想去,最多到6月份左右,我想我还是会回到UCH上面吧?基于几个原因:
1. 官方不再开发,而小BUG太多
2. 冗余代码太多,无法细细清除
3. theme更换的时候,必须要cleancache,否则无效(因此,在任何情况下,也只能拥有一套皮肤)
4. 原始模版写的有点糟糕,可能是赶时间写的。。。改一个小地方,都要同时改4、5个模版
感言待续!
写一部分:
开源不等于不要钱,开源更不是等于节约了重新开发轮子的时间,开源是一种精神,唯有开源,共享,互联网才能继续注入新鲜血液,他是超越商业的一种特殊的模式,对于thinksns的不再开发来说,只能说是在商业上的失败导致项目的后续版本开发得以停滞不前,如果没有一个商业机构来推动开源,那开源就更是无本之源,开源和商业的完美结合才能更好的推动开源事业的发展。
软件是免费还是收费就其本质,还是应该收费,现今社会,开源好似一种免费的午餐,任何人都可以免费获得源代码,但是通过它能迅速的达到盈利,还是有相当大的一段距离,而不得不通过二次开发,以及整合才能实现商业的价值,由此,而这个基础功能的实现由开源来实现了,对于高级的定制化的服务,是完全可以通过商业来实现其开源的增值,这也就是开源的商业价值所在,所以,开源和商业价值的实现是统一的,对于认为开源就是免费的说法是有偏差和值得怀疑的,没有好的商业模式来推动开源,开源就是空号,如何让人觉得其开源的项目有价值?如何让更多开发工程师认为我们的开发付出和免费是值得的,这就要通过商业社会的用户和产品来检验,由此,开源势在必行,但必须和商业目标结合的开源方能发展壮大,才能更加具有价值和潜力可挖!
今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的:
call_user_func_array
(PHP 4 >= 4.0.4, PHP 5)
call_user_func_array -- Call a user function given with an array of parameters
Description
mixed call_user_func_array ( callback function, array param_arr )
Call a user defined function given by function, with the parameters in param_arr.
然后还有一个例子:
PHP代码
1. <?php
2. function debug($var, $val)
3. {
4. echo "***DEBUGGING\nVARIABLE: $var\nVALUE:";
5. if (is_array($val) || is_object($val) || is_resource($val)) {
6. print_r($val);
7. } else {
8. echo "\n$val\n";
9. }
10. echo "***\n";
11. }
12.
13. $c = mysql_connect();
14. $host = $_SERVER["SERVER_NAME"];
15.
16. call_user_func_array('debug', array("host", $host));
17. call_user_func_array('debug', array("c", $c));
18. call_user_func_array('debug', array("_POST", $_POST));
19. ?>
相信看了例子之后应该有点明白了吧?
我自己是这么理解这个函数的,如果说的不对,还望各位高手不要耻笑:
该函数真正的用法有点类似于函数重载,因为他的第一个参数是字符型的,也就是函数的名称,第二个参数是数组,我们可以当成该函数的各个参数,而事实上也就是这么用的,如果你看过我的前一篇文章:PHP的伪重载 ,或许你能够理解,正是因为这个函数的存在,我发现函数重载也可以这样运用:
PHP代码
看到不?而我最初的写法,在PHP的伪重载一文中有所提及,仅作参考。。。。
这些只是call_user_func_array的简易用法,在PHP4下测试过,而手册中还有一些将第一个参数当成数组来传入的例子,我在PHP4下是没有办法运行的,也许PHP5可以吧,但我不用PHP5的,也没有办法解释什么。谢谢各位 以前一直用PHP4的,现在用PHP5了,关于这个函数,大家可以看看thinkphp的functions.php中的getInstance方法,也是一个很好的诠释哦
膘哥的blog:
http://www.neatstudio.com/show-300-1.shtml
http://www.joomlagate.com/component/option,com_smf/Itemid,31/topic,7594.0/
call_user_func_array
(PHP 4 >= 4.0.4, PHP 5)
call_user_func_array -- Call a user function given with an array of parameters
Description
mixed call_user_func_array ( callback function, array param_arr )
Call a user defined function given by function, with the parameters in param_arr.
然后还有一个例子:
PHP代码
1. <?php
2. function debug($var, $val)
3. {
4. echo "***DEBUGGING\nVARIABLE: $var\nVALUE:";
5. if (is_array($val) || is_object($val) || is_resource($val)) {
6. print_r($val);
7. } else {
8. echo "\n$val\n";
9. }
10. echo "***\n";
11. }
12.
13. $c = mysql_connect();
14. $host = $_SERVER["SERVER_NAME"];
15.
16. call_user_func_array('debug', array("host", $host));
17. call_user_func_array('debug', array("c", $c));
18. call_user_func_array('debug', array("_POST", $_POST));
19. ?>
相信看了例子之后应该有点明白了吧?
我自己是这么理解这个函数的,如果说的不对,还望各位高手不要耻笑:
该函数真正的用法有点类似于函数重载,因为他的第一个参数是字符型的,也就是函数的名称,第二个参数是数组,我们可以当成该函数的各个参数,而事实上也就是这么用的,如果你看过我的前一篇文章:PHP的伪重载 ,或许你能够理解,正是因为这个函数的存在,我发现函数重载也可以这样运用:
PHP代码
1. <?php
2. /**
3. * 例子写完后,本来认为完事了,结果遇到有人问call_user_func_array(),看了一下手册
4. * 原来,我上面的那个test函数还可以精简成如下的例子,
5. */
6. function otest1 ($a)
7. {
8. echo( '一个参数' );
9. }
10.
11. function otest2 ( $a, $b)
12. {
13. echo( '二个参数' );
14. }
15.
16. function otest3 ( $a ,$b,$c)
17. {
18. echo( '三个啦' );
19. }
20.
21. function otest ()
22. {
23. $args = func_get_args();
24. $num = func_num_args();
25. call_user_func_array( 'otest'.$num, $args );
26. }
27.
28. otest(1,2);
2. /**
3. * 例子写完后,本来认为完事了,结果遇到有人问call_user_func_array(),看了一下手册
4. * 原来,我上面的那个test函数还可以精简成如下的例子,
5. */
6. function otest1 ($a)
7. {
8. echo( '一个参数' );
9. }
10.
11. function otest2 ( $a, $b)
12. {
13. echo( '二个参数' );
14. }
15.
16. function otest3 ( $a ,$b,$c)
17. {
18. echo( '三个啦' );
19. }
20.
21. function otest ()
22. {
23. $args = func_get_args();
24. $num = func_num_args();
25. call_user_func_array( 'otest'.$num, $args );
26. }
27.
28. otest(1,2);
看到不?而我最初的写法,在PHP的伪重载一文中有所提及,仅作参考。。。。
这些只是call_user_func_array的简易用法,在PHP4下测试过,而手册中还有一些将第一个参数当成数组来传入的例子,我在PHP4下是没有办法运行的,也许PHP5可以吧,但我不用PHP5的,也没有办法解释什么。谢谢各位 以前一直用PHP4的,现在用PHP5了,关于这个函数,大家可以看看thinkphp的functions.php中的getInstance方法,也是一个很好的诠释哦
膘哥的blog:
http://www.neatstudio.com/show-300-1.shtml
http://www.joomlagate.com/component/option,com_smf/Itemid,31/topic,7594.0/
上图先:
一同事贴的图,让我想起人月神话里面的管理--外科手术团队:
外科手术团队
這個篇章看完突然想到研究所的專案管理課程,三個學分,卻是我們一個學期的研究重心,四個實際運作的專案,大家分組進行,教授不斷的製造專案危機,像是公司被併購、人員流失、專案形式改變、客戶不斷施以壓力等等,但最後大家還是順利的結案。这个篇章看完突然想到研究所的专案管理课程,三个学分,却是我们一个学期的研究重心,四个实际运作的专案,大家分组进行,教授不断的制造专案危机,像是公司被并购、人员流失、专案形式改变、客户不断施以压力等等,但最后大家还是顺利的结案。
這是個難以忘懷的經驗,組員們的默契在起初的確造成危機,但是,由於大家的素質還算整齊,很快就可以建立溝通的語言。这是个难以忘怀的经验,组员们的默契在起初的确造成危机,但是,由于大家的素质还算整齐,很快就可以建立沟通的语言。 加上大家熟悉協同科技概念與網路溝通,可以做到分時分地作業,也使得專案進行有效率。加上大家熟悉协同科技概念与网路沟通,可以做到分时分地作业,也使得专案进行有效率。
但當我看完這篇外科手術團隊後,我發現其實還有個成功的關鍵在其中,就是同學們各有專長,所以,分工很容易,又因為有選出leader作為掌控者,所以,不會亂。但当我看完这篇外科手术团队后,我发现其实还有个成功的关键在其中,就是同学们各有专长,所以,分工很容易,又因为有选出leader作为掌控者,所以,不会乱。 大家不會做重複的事情。大家不会做重复的事情。 每個人按照時程交差,就可以順利完成。每个人按照时程交差,就可以顺利完成。
作者認為一個外科手術中,有操刀的大夫,有護士、有麻醉師等等,各司其職。作者认为一个外科手术中,有操刀的大夫,有护士、有麻醉师等等,各司其职。 而不是像屠夫團隊,每個人都得拿刀。而不是像屠夫团队,每个人都得拿刀。 一個團隊中只有一個人操刀,其他人扮演支援的角色。一个团队中只有一个人操刀,其他人扮演支援的角色。 這樣整件事情就會出自一個腦袋不會亂,也不需要不斷的溝通協調。这样整件事情就会出自一个脑袋不会乱,也不需要不断的沟通协调。
這兩個篇章是我比較有感覺的,寫出來跟大家分享。这两个篇章是我比较有感觉的,写出来跟大家分享。
最後,作者還有一個人月的概念我覺得很重要,這會影響到組織的公平性:一個好手,花一天可以做完,但同樣一件事,庸才卻需要三四天以上,甚至加班趕工,也許還領加班費。最后,作者还有一个人月的概念我觉得很重要,这会影响到组织的公平性:一个好手,花一天可以做完,但同样一件事,庸才却需要三四天以上,甚至加班赶工,也许还领加班费。 如果照這樣去計算人月,一定會差之千里。如果照这样去计算人月,一定会差之千里。
阅读全文
一同事贴的图,让我想起人月神话里面的管理--外科手术团队:
外科手术团队
這個篇章看完突然想到研究所的專案管理課程,三個學分,卻是我們一個學期的研究重心,四個實際運作的專案,大家分組進行,教授不斷的製造專案危機,像是公司被併購、人員流失、專案形式改變、客戶不斷施以壓力等等,但最後大家還是順利的結案。这个篇章看完突然想到研究所的专案管理课程,三个学分,却是我们一个学期的研究重心,四个实际运作的专案,大家分组进行,教授不断的制造专案危机,像是公司被并购、人员流失、专案形式改变、客户不断施以压力等等,但最后大家还是顺利的结案。
這是個難以忘懷的經驗,組員們的默契在起初的確造成危機,但是,由於大家的素質還算整齊,很快就可以建立溝通的語言。这是个难以忘怀的经验,组员们的默契在起初的确造成危机,但是,由于大家的素质还算整齐,很快就可以建立沟通的语言。 加上大家熟悉協同科技概念與網路溝通,可以做到分時分地作業,也使得專案進行有效率。加上大家熟悉协同科技概念与网路沟通,可以做到分时分地作业,也使得专案进行有效率。
但當我看完這篇外科手術團隊後,我發現其實還有個成功的關鍵在其中,就是同學們各有專長,所以,分工很容易,又因為有選出leader作為掌控者,所以,不會亂。但当我看完这篇外科手术团队后,我发现其实还有个成功的关键在其中,就是同学们各有专长,所以,分工很容易,又因为有选出leader作为掌控者,所以,不会乱。 大家不會做重複的事情。大家不会做重复的事情。 每個人按照時程交差,就可以順利完成。每个人按照时程交差,就可以顺利完成。
作者認為一個外科手術中,有操刀的大夫,有護士、有麻醉師等等,各司其職。作者认为一个外科手术中,有操刀的大夫,有护士、有麻醉师等等,各司其职。 而不是像屠夫團隊,每個人都得拿刀。而不是像屠夫团队,每个人都得拿刀。 一個團隊中只有一個人操刀,其他人扮演支援的角色。一个团队中只有一个人操刀,其他人扮演支援的角色。 這樣整件事情就會出自一個腦袋不會亂,也不需要不斷的溝通協調。这样整件事情就会出自一个脑袋不会乱,也不需要不断的沟通协调。
這兩個篇章是我比較有感覺的,寫出來跟大家分享。这两个篇章是我比较有感觉的,写出来跟大家分享。
最後,作者還有一個人月的概念我覺得很重要,這會影響到組織的公平性:一個好手,花一天可以做完,但同樣一件事,庸才卻需要三四天以上,甚至加班趕工,也許還領加班費。最后,作者还有一个人月的概念我觉得很重要,这会影响到组织的公平性:一个好手,花一天可以做完,但同样一件事,庸才却需要三四天以上,甚至加班赶工,也许还领加班费。 如果照這樣去計算人月,一定會差之千里。如果照这样去计算人月,一定会差之千里。
阅读全文
此笔记,基于 "程序员小辉"的安装笔记修改 --------------------------------------------------------------------------------------------------------------------
阅读全文
阅读全文
Nginx是个Web服务器新秀,CentOS5官方没有Nginx的RPM包,本文记录了在64位的CentOS5 VPS下怎样编译Nginx 0.7.61版本的RPM包。
要编译RPM包,首先要有SRPM包,也就是RPM包的源代码包。可以从Nginx官网下载Nginx的源代码然后自己制作Nginx的SRPM包,这比较麻烦。本文下载了fedora 10中自带的Nginx的SRPM包,稍做修改即可。
安装SRPM包:
rpm -ivh nginx-0.7.61-1.fc10.src.rpm
上面命令把源代码安装在了/usr/src/redhat目录下,要编译RPM,需要rpmbuild命令:
yum install -y rpm-build.x86_64
然后就可以开始build了:
cd /usr/src/redhat/SPECS
rpmbuild -bb nginx.spec
build报错了,少了几个必须的库文件,我们来安装:
yum install -y pcre-devel.x86_64 zlib-devel.x86_64 openssl-devel.x86_64 mod_perl-devel.x64_64
然后修改nginx.spec文件,将其中的perl-devel修改成mod_perl-devel。继续build:
rpmbuild -bb nginx.spec
大功告成!build出来的RPM包就是/usr/src/redhat/RPMS/x86_64/nginx-0.7.61-1.x86_64.rpm 。同样的方法,我们在32位的CentOS VPS下也编译了一份,然后把他们都放到 http://rashost.com/download 下供大家下载。
来源:http://rashost.com/blog/centos5-build-nginx-rpm
要编译RPM包,首先要有SRPM包,也就是RPM包的源代码包。可以从Nginx官网下载Nginx的源代码然后自己制作Nginx的SRPM包,这比较麻烦。本文下载了fedora 10中自带的Nginx的SRPM包,稍做修改即可。
安装SRPM包:
rpm -ivh nginx-0.7.61-1.fc10.src.rpm
上面命令把源代码安装在了/usr/src/redhat目录下,要编译RPM,需要rpmbuild命令:
yum install -y rpm-build.x86_64
然后就可以开始build了:
cd /usr/src/redhat/SPECS
rpmbuild -bb nginx.spec
build报错了,少了几个必须的库文件,我们来安装:
yum install -y pcre-devel.x86_64 zlib-devel.x86_64 openssl-devel.x86_64 mod_perl-devel.x64_64
然后修改nginx.spec文件,将其中的perl-devel修改成mod_perl-devel。继续build:
rpmbuild -bb nginx.spec
大功告成!build出来的RPM包就是/usr/src/redhat/RPMS/x86_64/nginx-0.7.61-1.x86_64.rpm 。同样的方法,我们在32位的CentOS VPS下也编译了一份,然后把他们都放到 http://rashost.com/download 下供大家下载。
来源:http://rashost.com/blog/centos5-build-nginx-rpm
看到两篇新闻,一篇是《腾讯滔滔宣布关闭,将与QQ空间心情整合》,另外一篇是《百度地图贴吧上线,布局实时搜索》,前者是腾讯认为滔滔无法单独盈利,因此整合入QQ空间,后者则是百度将贴吧用户发帖和地理位置结合。对此,有篇评论觉得不错,《微博商业化应以应用为导向》,新兴技术的出现(包括微博在内)和服务应用结合才能有生命力。因此,对于腾讯而言,微博和既有的QQ空间结合也是资源整合,而百度地图贴吧的上线,标志着百度在尝试基于地理位置的社交应用,拓展贴吧的服务应用。
关于最近百度高层的人事频繁变动,FT中文网的分析文章《百度转舵学腾讯》和《谷歌和百度的区别》有很深刻的洞察,腾讯和百度分别代表人与人、人与信息的关系。但显然在中国的国情下,互联网的娱乐化应用的市场大于信息化的市场,腾讯充分的利用了QQ的用户黏性拓展各种娱乐性的应用,Q币以类似网络虚拟货币的方式,积聚了庞大的财富,进而利用资本的优势,再挖掘各种应用,最后各种应用之间形成协同效应,带给用户更大的价值,形成更大的用户黏性。我们看到,最近马云的“大淘宝”战略动作频繁,各种收购和服务拓展,显示出马云亟待打造生态链,巩固电子商务领域的服务竞争优势。
我们看到,10年腾讯开始发力SOSO搜索引擎,据说挖来美国Bing的4个华人工程师团队,甚至在电影前插播广告,着力SOSO的SEM推广。借助QQ 的优势,我们甚至可以想想未来SOSO的结果中不仅出现信息,而且出现对应信息作者的QQ头像,实现即时的沟通,打通和整合“人-信息-人”的通道。随着即时互联网社会的出现,这无疑将对百度造成致命的冲击。我们看到美国Google在技术、资本和应用方面,都无对手可企及,但百度在中国则不同,因此李彦宏不得不考虑来自腾讯的巨大挑战。在腾讯、百度和阿里巴巴三足鼎立的格局中,百度和阿里巴巴已经公开对立,而腾讯则是未来潜在的巨大对手。
互联网不仅是技术,更是服务。随着电子商务和SNS社区的应用普及,互联网也越来越呈现出现实社会延伸的趋势。今天看到新闻《百度牵手乐天打造网上商城》,电子商务势必是大佬们的必争之地。网络社区(即时沟通)、网络游戏、新闻资讯和电子商务等互联网常见服务中,游戏、资讯和交易,在线下都有成熟的应用,互联网则是在社区性方面呈现“湿”的粘合状态,并出现诸如腾讯QQ空间的各种虚拟物品的增值服务模式(类似虚拟的装修业务)。
最近中国移动欲收购腾讯的传闻,亦突显了移动试图从通讯服务领域延伸到互联网社区服务和增值服务领域。围绕用户需求的各个领域,未来中国互联网大佬们的竞争将呈现胶着状态,各家网站都势必借助既有优势,拓展更多的服务应用领域,更多精彩的博弈将上演。 (艾瑞网专家-宋安)
关于最近百度高层的人事频繁变动,FT中文网的分析文章《百度转舵学腾讯》和《谷歌和百度的区别》有很深刻的洞察,腾讯和百度分别代表人与人、人与信息的关系。但显然在中国的国情下,互联网的娱乐化应用的市场大于信息化的市场,腾讯充分的利用了QQ的用户黏性拓展各种娱乐性的应用,Q币以类似网络虚拟货币的方式,积聚了庞大的财富,进而利用资本的优势,再挖掘各种应用,最后各种应用之间形成协同效应,带给用户更大的价值,形成更大的用户黏性。我们看到,最近马云的“大淘宝”战略动作频繁,各种收购和服务拓展,显示出马云亟待打造生态链,巩固电子商务领域的服务竞争优势。
我们看到,10年腾讯开始发力SOSO搜索引擎,据说挖来美国Bing的4个华人工程师团队,甚至在电影前插播广告,着力SOSO的SEM推广。借助QQ 的优势,我们甚至可以想想未来SOSO的结果中不仅出现信息,而且出现对应信息作者的QQ头像,实现即时的沟通,打通和整合“人-信息-人”的通道。随着即时互联网社会的出现,这无疑将对百度造成致命的冲击。我们看到美国Google在技术、资本和应用方面,都无对手可企及,但百度在中国则不同,因此李彦宏不得不考虑来自腾讯的巨大挑战。在腾讯、百度和阿里巴巴三足鼎立的格局中,百度和阿里巴巴已经公开对立,而腾讯则是未来潜在的巨大对手。
互联网不仅是技术,更是服务。随着电子商务和SNS社区的应用普及,互联网也越来越呈现出现实社会延伸的趋势。今天看到新闻《百度牵手乐天打造网上商城》,电子商务势必是大佬们的必争之地。网络社区(即时沟通)、网络游戏、新闻资讯和电子商务等互联网常见服务中,游戏、资讯和交易,在线下都有成熟的应用,互联网则是在社区性方面呈现“湿”的粘合状态,并出现诸如腾讯QQ空间的各种虚拟物品的增值服务模式(类似虚拟的装修业务)。
最近中国移动欲收购腾讯的传闻,亦突显了移动试图从通讯服务领域延伸到互联网社区服务和增值服务领域。围绕用户需求的各个领域,未来中国互联网大佬们的竞争将呈现胶着状态,各家网站都势必借助既有优势,拓展更多的服务应用领域,更多精彩的博弈将上演。 (艾瑞网专家-宋安)
有三道PHP的面试题,除了第三题需要一些经验和对HTTP协议理解外,前面两题其实很简单,但是很少遇到有人答正确的,大部分人我想都不是技术问题,而是思考是否严谨的问题。
1. 下面语句输出什么?为什么?
if ($a=$b) printf(“a==b”);
else printf(“a!=b”);
2. $array[‘anykey’]和$array[anykey]有什么区别?
3. 写出使用telnet命令通过GET的方式访问http://www.jackxiang.com/index.php 得到页面返回的方法(不是用PHP实现,用dos或者unix命令行实现)。
答案仅供参考:
1.
第一题
if ($a=$b) printf(“a==b”);
else printf(“a!=b”);
程序把$b赋值给$a,然后判断$a值~~~因为$=null 所以$a自然为false
$b赋值给$a,$b===NULL???
2. key2value ‘anykey’是key, anykey是value 第二题可以查看PHP查考里数组的\”数组做什么和不做什么\”
这样写的话在警告没有打开的条件 不会出现提示错误的 anykey 只要没有定义成常量 效果一样 (节约了两个单引号) :)
3.telnet www.jackxiang.com 80
get /index.php HTTP/1.1
curl可能更强大!
1. 下面语句输出什么?为什么?
if ($a=$b) printf(“a==b”);
else printf(“a!=b”);
2. $array[‘anykey’]和$array[anykey]有什么区别?
3. 写出使用telnet命令通过GET的方式访问http://www.jackxiang.com/index.php 得到页面返回的方法(不是用PHP实现,用dos或者unix命令行实现)。
答案仅供参考:
1.
第一题
if ($a=$b) printf(“a==b”);
else printf(“a!=b”);
程序把$b赋值给$a,然后判断$a值~~~因为$=null 所以$a自然为false
$b赋值给$a,$b===NULL???
2. key2value ‘anykey’是key, anykey是value 第二题可以查看PHP查考里数组的\”数组做什么和不做什么\”
这样写的话在警告没有打开的条件 不会出现提示错误的 anykey 只要没有定义成常量 效果一样 (节约了两个单引号) :)
3.telnet www.jackxiang.com 80
get /index.php HTTP/1.1
curl可能更强大!
之前遇到一个问题,svn里面如果提交了中文文件名的文件或者包含其他特殊字符的文件名的文件,会导致linux或者freebsd上svn update/checkout的时候出现错误“svn: Can’t convert string from ‘UTF-8′ to native encoding”
这个问题是由系统字符集设置导致的,可以使用如下方法解决:
在bash的shell下,输入如下命令:
#locale将得到如下的结果返回:
LANG=
LC_COLLATE="C"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=可以把以上内容直接加到svn的钩子里面,解决提交时自动输出处理遇到的问题。
转自老乡李俊麟的博客:
http://www.toplee.com/blog/566.html
实践中发现,只修改一个还不成,要修改多个vi /etc/profile root是这样,但是nobody的环境还是C的,处处修改呢??思考Ing:
export LANG="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_NUMERIC="zh_CN.UTF-8"
export LC_TIME="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_MONETARY="zh_CN.UTF-8"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_PAPER="zh_CN.UTF-8"
export LC_NAME="zh_CN.UTF-8"
export LC_ADDRESS="zh_CN.UTF-8"
export LC_TELEPHONE="zh_CN.UTF-8"
export LC_MEASUREMENT="zh_CN.UTF-8"
export LC_IDENTIFICATION="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
PHP时:这个函数有用,其实就一个就行了,上面其它的没有用的估计,如下:
setlocale(LC_ALL,'zh_CN.UTF-8');
这个问题是由系统字符集设置导致的,可以使用如下方法解决:
在bash的shell下,输入如下命令:
#export LC_CTYPE=en_US.UTF-8然
后运行如下命令确认发生的变化如下:#locale将得到如下的结果返回:
LANG=
LC_COLLATE="C"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=可以把以上内容直接加到svn的钩子里面,解决提交时自动输出处理遇到的问题。
转自老乡李俊麟的博客:
http://www.toplee.com/blog/566.html
实践中发现,只修改一个还不成,要修改多个vi /etc/profile root是这样,但是nobody的环境还是C的,处处修改呢??思考Ing:
export LANG="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_NUMERIC="zh_CN.UTF-8"
export LC_TIME="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_MONETARY="zh_CN.UTF-8"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_PAPER="zh_CN.UTF-8"
export LC_NAME="zh_CN.UTF-8"
export LC_ADDRESS="zh_CN.UTF-8"
export LC_TELEPHONE="zh_CN.UTF-8"
export LC_MEASUREMENT="zh_CN.UTF-8"
export LC_IDENTIFICATION="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
PHP时:这个函数有用,其实就一个就行了,上面其它的没有用的估计,如下:
setlocale(LC_ALL,'zh_CN.UTF-8');
很多人用到MySQL来开发一些项目,有时为了性能,我们会直接用C语言来开发相关的模块,尤其在我们的web应用中,虽然PHP、JSP等脚本均提供了MySQL的接口,但是显然直接使用C语言具有更好的安全性和性能,Michael以前用PHP开发的多个项目中就使用了C语言编写的这类接口,然后再编译到php里面,供php脚本直接使用,这方面的话题就不多说了,下面主要说一下在Linux下如何用C语言连接MySQL数据库,并且读取里面的数据返回,同时如何进行编译。
这里的大部分代码参考了MySQL发行包里面的.c源文件,大家也可以去里面找找相关的代码,下面这段代码实现了连接到本地MySQL服务器上9tmd_bbs_utf8数据库,从数据表tbb_user中根据输入的userid取得该用户的用户名并打印输出到终端。
#if defined(_WIN32) || defined(_WIN64) //为了支持windows平台上的编译
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include "mysql.h" //我的机器上该文件在/usr/local/include/mysql下
//定义数据库操作的宏,也可以不定义留着后面直接写进代码
#define SELECT_QUERY "select username from tbb_user where userid = %d"
int main(int argc, char **argv) //char **argv 相当于 char *argv[]
{
MYSQL mysql,*sock; //定义数据库连接的句柄,它被用于几乎所有的MySQL函数
MYSQL_RES *res; //查询结果集,结构类型
MYSQL_FIELD *fd ; //包含字段信息的结构
MYSQL_ROW row ; //存放一行查询结果的字符串数组
char qbuf[160]; //存放查询sql语句字符串
if (argc != 2) { //检查输入参数
fprintf(stderr,"usage : mysql_select <userid>\n\n");
exit(1);
}
mysql_init(&mysql);
if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) {
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql));
perror("");
exit(1);
}
sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));
if(mysql_query(sock,qbuf)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(sock));
exit(1);
}
if (!(res=mysql_store_result(sock))) {
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(sock));
exit(1);
}
printf("number of fields returned: %d\n",mysql_num_fields(res));
while (row = mysql_fetch_row(res)) {
printf("Ther userid #%d 's username is: %s\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0])) ;
puts( "query ok !\n" ) ;
}
mysql_free_result(res);
mysql_close(sock);
exit(0);
return 0; //. 为了兼容大部分的编译器加入此行
}
编译的时候,使用下面的命令
运行的时候,执行下面的命令
query ok !上面的代码我想大部分都能看明白,不明白的可以参考一下MySQL提供的有关C语言API部分文档,各个函数都有详细说明,有时间我整理一份常用的API说明出来。
来源:
http://www.toplee.com/blog/329.html
这里的大部分代码参考了MySQL发行包里面的.c源文件,大家也可以去里面找找相关的代码,下面这段代码实现了连接到本地MySQL服务器上9tmd_bbs_utf8数据库,从数据表tbb_user中根据输入的userid取得该用户的用户名并打印输出到终端。
#if defined(_WIN32) || defined(_WIN64) //为了支持windows平台上的编译
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include "mysql.h" //我的机器上该文件在/usr/local/include/mysql下
//定义数据库操作的宏,也可以不定义留着后面直接写进代码
#define SELECT_QUERY "select username from tbb_user where userid = %d"
int main(int argc, char **argv) //char **argv 相当于 char *argv[]
{
MYSQL mysql,*sock; //定义数据库连接的句柄,它被用于几乎所有的MySQL函数
MYSQL_RES *res; //查询结果集,结构类型
MYSQL_FIELD *fd ; //包含字段信息的结构
MYSQL_ROW row ; //存放一行查询结果的字符串数组
char qbuf[160]; //存放查询sql语句字符串
if (argc != 2) { //检查输入参数
fprintf(stderr,"usage : mysql_select <userid>\n\n");
exit(1);
}
mysql_init(&mysql);
if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) {
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql));
perror("");
exit(1);
}
sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));
if(mysql_query(sock,qbuf)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(sock));
exit(1);
}
if (!(res=mysql_store_result(sock))) {
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(sock));
exit(1);
}
printf("number of fields returned: %d\n",mysql_num_fields(res));
while (row = mysql_fetch_row(res)) {
printf("Ther userid #%d 's username is: %s\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0])) ;
puts( "query ok !\n" ) ;
}
mysql_free_result(res);
mysql_close(sock);
exit(0);
return 0; //. 为了兼容大部分的编译器加入此行
}
编译的时候,使用下面的命令
gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 后面两个选项可选,根据您的环境情况
运行的时候,执行下面的命令
./mysql_select 1
将返回如下结果:number of fields returned: 1
Ther userid #1 's username is: Michael
Ther userid #1 's username is: Michael
query ok !上面的代码我想大部分都能看明白,不明白的可以参考一下MySQL提供的有关C语言API部分文档,各个函数都有详细说明,有时间我整理一份常用的API说明出来。
来源:
http://www.toplee.com/blog/329.html
[简单技巧]阅读了下MVC框架渲染html的了部分代码,觉得用PHP extract() 函数可能更加好一些:PHP中extract()函数的妙用。
Php/Js/Shell/Go jackxiang 2010-3-11 11:47
拜读了一下:TMView**.class.php里面的:
foreach($vars as $key => $value)
{
$$key=$value; //借尸还魂的运用:把controller层的塞入的变量又给还原回来
}
其实可以改写为一行:
特别的地方,其实这个函数还考虑到了防止变量覆盖问题,可以有参数的喔:
$a就没有被覆盖,同时可以通过函数第3个参数:dup,配合_a: $dup_a=cat了,有规律可循,操作更加灵活!
输出:
compact() 它做的事和 extract() 正好相反。返回将所有变量添加进去后的数组。
结果,经过处理后,$result 为:
——————————————————————————————————————————————————————————
PHP中extract()函数的妙用
背景:在看一哥们写代码时,发现多了一个data变量,通过zend编辑器看这变量一直没找到,原来是
早些时候在看一框架关于POST的代码时,看到一个非常好用的函数:extract(),
它的主要作用是将数组展开,键名作为变量名,元素值为变量值,
可以说为数组的操作提供了另外一个方便的工具,
比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交上来的内容不能不用一一赋值,直接使用下面代码:
form.html
在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php
是不是很方便呢?呵呵,下面是PHP手册里的详细解释:
extract
(PHP 4, PHP 5)
extract — 从数组中将变量导入到当前的符号表
说明
int extract ( array $var_array [, int $extract_type [, string $prefix ]] )
本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。
Note: 自版本 4.0.5 起本函数返回被提取的变量数目。
Note: EXTR_IF_EXISTS 和 EXTR_PREFIX_IF_EXISTS 是版本 4.2.0 中引进的。
Note: EXTR_REFS 是版本 4.3.0 中引进的。
extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:
EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。
注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
extract() 返回成功导入到符号表中的变量数目。
Warning
不要对不能信任的数据使用 extract(),例如用户的输入($_GET,…)。如果这样做,举例说,要临时运行依赖于 register_globals 的老代码,要确保使用不会覆盖的 extract_type 值,例如 EXTR_SKIP,并且要留意应该按照 php.ini 中由 variables_order 定义的顺序来提取。
extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。
Example#1 extract() 例子
$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $wddx_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $wddx_color,$wddx_size 和 $wddx_shape。
必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。
来自:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0723/3090.html
foreach($vars as $key => $value)
{
$$key=$value; //借尸还魂的运用:把controller层的塞入的变量又给还原回来
}
其实可以改写为一行:
extract($vars);
特别的地方,其实这个函数还考虑到了防止变量覆盖问题,可以有参数的喔:
<?php
$a = 'Original';
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, 'dup');
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a;";
?>
$a = 'Original';
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, 'dup');
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a;";
?>
$a就没有被覆盖,同时可以通过函数第3个参数:dup,配合_a: $dup_a=cat了,有规律可循,操作更加灵活!
输出:
$a = Original; $b = Dog; $c = Horse; $dup_a = Cat;
compact() 它做的事和 extract() 正好相反。返回将所有变量添加进去后的数组。
结果,经过处理后,$result 为:
——————————————————————————————————————————————————————————
PHP中extract()函数的妙用
背景:在看一哥们写代码时,发现多了一个data变量,通过zend编辑器看这变量一直没找到,原来是
早些时候在看一框架关于POST的代码时,看到一个非常好用的函数:extract(),
它的主要作用是将数组展开,键名作为变量名,元素值为变量值,
可以说为数组的操作提供了另外一个方便的工具,
比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交上来的内容不能不用一一赋值,直接使用下面代码:
form.html
在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php
是不是很方便呢?呵呵,下面是PHP手册里的详细解释:
extract
(PHP 4, PHP 5)
extract — 从数组中将变量导入到当前的符号表
说明
int extract ( array $var_array [, int $extract_type [, string $prefix ]] )
本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。
Note: 自版本 4.0.5 起本函数返回被提取的变量数目。
Note: EXTR_IF_EXISTS 和 EXTR_PREFIX_IF_EXISTS 是版本 4.2.0 中引进的。
Note: EXTR_REFS 是版本 4.3.0 中引进的。
extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:
EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。
注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
extract() 返回成功导入到符号表中的变量数目。
Warning
不要对不能信任的数据使用 extract(),例如用户的输入($_GET,…)。如果这样做,举例说,要临时运行依赖于 register_globals 的老代码,要确保使用不会覆盖的 extract_type 值,例如 EXTR_SKIP,并且要留意应该按照 php.ini 中由 variables_order 定义的顺序来提取。
extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。
Example#1 extract() 例子
$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $wddx_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $wddx_color,$wddx_size 和 $wddx_shape。
必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。
来自:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0723/3090.html
http://blog.chinaunix.net/u1/38994/article.html
0>需要能打,但更需要能挨;
能打如卫青,能挨如李广.
1>UNIX is basically a simple
operating system, but you
have to be a genius to
understand the simplicity.
2>人以铜为镜,可以正衣冠;以
史为镜,可以知兴亡;以人为
镜,可以明得失
3>1只笼子养着两只公鸡,打鸣那
是一个比一个响
4>要是甘蔗两端一样甜,那谁还
会辛辛苦苦抢着吃后边那一节
5>审问、慎思、明辨、力行、
观其人
6>宦海浮沉,世事难测;
朝中熙熙,多为利来;
宫中攘攘,多为利往。
7>桃花坞里桃花庵,
桃花庵下桃花仙;
桃花仙人种桃树,
又摘桃花换酒钱。
......
别人笑我太疯癫,
我笑他人看不穿;
不见五陵豪杰墓,
无花无酒锄作田。哈哈哈哈哈
8>贵有恒,何必三更起五更勤;
最无益,只怕一日曝十日寒
9>君不密,则失臣;
臣不密,则失身;
几事不密,则成害!
10>汉武帝的人生4目标:
修身、齐家、治国、平天下
0>需要能打,但更需要能挨;
能打如卫青,能挨如李广.
1>UNIX is basically a simple
operating system, but you
have to be a genius to
understand the simplicity.
2>人以铜为镜,可以正衣冠;以
史为镜,可以知兴亡;以人为
镜,可以明得失
3>1只笼子养着两只公鸡,打鸣那
是一个比一个响
4>要是甘蔗两端一样甜,那谁还
会辛辛苦苦抢着吃后边那一节
5>审问、慎思、明辨、力行、
观其人
6>宦海浮沉,世事难测;
朝中熙熙,多为利来;
宫中攘攘,多为利往。
7>桃花坞里桃花庵,
桃花庵下桃花仙;
桃花仙人种桃树,
又摘桃花换酒钱。
......
别人笑我太疯癫,
我笑他人看不穿;
不见五陵豪杰墓,
无花无酒锄作田。哈哈哈哈哈
8>贵有恒,何必三更起五更勤;
最无益,只怕一日曝十日寒
9>君不密,则失臣;
臣不密,则失身;
几事不密,则成害!
10>汉武帝的人生4目标:
修身、齐家、治国、平天下
ubutu:
sudo apt-get install putty
取代minicom的简易串口工具putty
These features were new in beta 0.59 (released 2007-01-24):
PuTTY can now connect to local serial ports as well as making network connections.
我真是有点落伍了,到今天才知道,putty的最新版本已经到了0.60。支持串口之后就可以拿putty来替代windows的超级终端了
串口设置方法
connection type里选择Serial,串口号和连接速度可以直接输入,比如COM1,115200,更详细的设置在Connection->Serial里面。
报文监视
如果想用putty来监视串口输出,只需要在Session->Logging里选中All session output或者Printable output,然后指定文件名,其中可以包含时间日期等通配符,非常实用。
Linux上也有putty所以,可以监视linux串口的输出输入等。
sudo apt-get install putty
取代minicom的简易串口工具putty
These features were new in beta 0.59 (released 2007-01-24):
PuTTY can now connect to local serial ports as well as making network connections.
我真是有点落伍了,到今天才知道,putty的最新版本已经到了0.60。支持串口之后就可以拿putty来替代windows的超级终端了
串口设置方法
connection type里选择Serial,串口号和连接速度可以直接输入,比如COM1,115200,更详细的设置在Connection->Serial里面。
报文监视
如果想用putty来监视串口输出,只需要在Session->Logging里选中All session output或者Printable output,然后指定文件名,其中可以包含时间日期等通配符,非常实用。
Linux上也有putty所以,可以监视linux串口的输出输入等。
[root@localhost ~]# vi /etc/minirc.dfl
# Machine-generated file - use "minicom -s" to change parameters.
pr port /dev/ttyS0
pu baudrate 57600
pu rtscts No
# Machine-generated file - use "minicom -s" to change parameters.
pr port /dev/ttyS0
pu baudrate 57600
pu rtscts No
想要在php程序中执行scp拷贝,之前想用system函数
system("scp /from/path/file user@des_host:/to/path/file"),但是始终失败,
但在命令行下直接执行scp /from/path/file user@des_host:/to/path/file 是OK的,
至今找不到原因,如果哪位知道原因,麻烦告知一下。
既然这个方法不行,就换吧,不能一棵树吊死啊。google来,google去,发现原来php里有
现成的函数:
http://us2.php.net/manual/en/book.ssh2.php
只是要装几个包。
方法如下:
http://us2.php.net/manual/en/ssh2.installation.php
首先要装OpenSSL。
因为自己OpenSSL已经装过了,所以直接第二步,下个libssh2直接安装。
我下的是libssh2-0.18,这个都没什么问题。
第三步要用pear安装php的ssh扩展,如果没装pear可以直接下载源码,自己编译。
http://pecl.php.net/package/ssh2
我下的ssh2-0.10.tgz,解压,编译:
tar -zxvf ssh2-0.10.tgz
【注意源码有些问题,要修改。
把480行
#if LIBSSH2_APINO < 200412301450
…
#else
改为
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
…
#else
把1216行:
#if (LIBSSH2_APINO > 200503221619)
改为
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) ||
(defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0×001000)
】
phpize && ./configure --with-ssh2 && make
编译好,到build文件夹中把ssh2.so cp 到自己的php extension dir中
在php.ini中加入 extension=ssh2.so
重启apache
ok
1. 安装libssh2库
yum install libssh2 libssh2-devel
2. 下载PECL的SSH2支持代码包(beta版本有bug,需patch)
wget http://pecl.php.net/get/ssh2-0.10.tgz
tar xvzf ssh2-0.10.tgz
cd ssh2-0.10
vi ssh2.c
ssh2.c patch方法如下:
LINE 480:
search and change following line:
#if LIBSSH2_APINO < 200412301450
...
#else
to:
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
...
#else
LINE 1216:
search and change following line:
#if (LIBSSH2_APINO > 200503221619)
to:
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) || (defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0x001000)
3. 开始编译
phpize
./configure --with-ssh2
make
4. 加入ssh2扩展到php
cp modules/ssh2.so /usr/lib/php/modules
注意64位系统上是 /usr/lib64
vi php.ini
加入extension=ssh2.so
5. 确认是否已加载
php -i|grep ssh2
结果应该如下所示
# php -i|grep ssh2
Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
ssh2
libssh2 version => 0.17
banner => SSH-2.0-libssh2_0.17
PWD => /root/ssh2-0.10
_SERVER["PWD"] => /root/ssh2-0.10
_ENV["PWD"] => /root/ssh2-0.10
阅读全文
system("scp /from/path/file user@des_host:/to/path/file"),但是始终失败,
但在命令行下直接执行scp /from/path/file user@des_host:/to/path/file 是OK的,
至今找不到原因,如果哪位知道原因,麻烦告知一下。
既然这个方法不行,就换吧,不能一棵树吊死啊。google来,google去,发现原来php里有
现成的函数:
http://us2.php.net/manual/en/book.ssh2.php
只是要装几个包。
方法如下:
http://us2.php.net/manual/en/ssh2.installation.php
首先要装OpenSSL。
因为自己OpenSSL已经装过了,所以直接第二步,下个libssh2直接安装。
我下的是libssh2-0.18,这个都没什么问题。
第三步要用pear安装php的ssh扩展,如果没装pear可以直接下载源码,自己编译。
http://pecl.php.net/package/ssh2
我下的ssh2-0.10.tgz,解压,编译:
tar -zxvf ssh2-0.10.tgz
【注意源码有些问题,要修改。
把480行
#if LIBSSH2_APINO < 200412301450
…
#else
改为
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
…
#else
把1216行:
#if (LIBSSH2_APINO > 200503221619)
改为
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) ||
(defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0×001000)
】
phpize && ./configure --with-ssh2 && make
编译好,到build文件夹中把ssh2.so cp 到自己的php extension dir中
在php.ini中加入 extension=ssh2.so
重启apache
ok
1. 安装libssh2库
yum install libssh2 libssh2-devel
2. 下载PECL的SSH2支持代码包(beta版本有bug,需patch)
wget http://pecl.php.net/get/ssh2-0.10.tgz
tar xvzf ssh2-0.10.tgz
cd ssh2-0.10
vi ssh2.c
ssh2.c patch方法如下:
LINE 480:
search and change following line:
#if LIBSSH2_APINO < 200412301450
...
#else
to:
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
...
#else
LINE 1216:
search and change following line:
#if (LIBSSH2_APINO > 200503221619)
to:
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) || (defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0x001000)
3. 开始编译
phpize
./configure --with-ssh2
make
4. 加入ssh2扩展到php
cp modules/ssh2.so /usr/lib/php/modules
注意64位系统上是 /usr/lib64
vi php.ini
加入extension=ssh2.so
5. 确认是否已加载
php -i|grep ssh2
结果应该如下所示
# php -i|grep ssh2
Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
ssh2
libssh2 version => 0.17
banner => SSH-2.0-libssh2_0.17
PWD => /root/ssh2-0.10
_SERVER["PWD"] => /root/ssh2-0.10
_ENV["PWD"] => /root/ssh2-0.10
阅读全文