[实践OK]用php实现上传文件时显示进度条(保证可以运行),用PHP Session和Javascript实现文件上传进度条。
Php/Js/Shell/Go jackxiang 2010-3-15 17:40
本来这篇文章早应该写了,由于其他原因一直没有时间完成。这两天抽空写了一个简单的版本,发出来大家一块学习吧。阅读全文
今天发现了一个php函数readfile()执行速度要比include和require要快。
Function Time (s) Memory (b)
32Kb File 1Mb File 32Kb File 1Mb File
file_get_contents 0.00152 0.00564 52480 1067856
fpassthru 0.00117 0.00184 20016 20032
fgets 0.00195 0.07190 30760 30768
file 0.00157 0.06464 87344 2185624
require_once 0.00225 0.08065 67992 2067696
include 0.00222 0.08202 67928 2067624
readfile 0.00117 0.00191 19192 19208
具体用法如下:
假设你有一个文本文件wade.txt,内容如下:
hello wade,you are so cool!!!
下面是具体的php代码:
readfile.php
<?php
readfile("wade.txt");
?>
如果你感到速度不错的话,可以用它来代替include和require了。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100evd2.html
Function Time (s) Memory (b)
32Kb File 1Mb File 32Kb File 1Mb File
file_get_contents 0.00152 0.00564 52480 1067856
fpassthru 0.00117 0.00184 20016 20032
fgets 0.00195 0.07190 30760 30768
file 0.00157 0.06464 87344 2185624
require_once 0.00225 0.08065 67992 2067696
include 0.00222 0.08202 67928 2067624
readfile 0.00117 0.00191 19192 19208
具体用法如下:
假设你有一个文本文件wade.txt,内容如下:
hello wade,you are so cool!!!
下面是具体的php代码:
readfile.php
<?php
readfile("wade.txt");
?>
如果你感到速度不错的话,可以用它来代替include和require了。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100evd2.html
syslog-ng是用带代替syslog的log server。功能对syslog有很大的提高。支持tcp,支持buffer(商业版中支持,如果remote log server 死掉的话,可以先把log存放到本地的buffer中,等到remote log server 恢复的时候,然后再将本地的log server中buffer中的内容重新发送给 remote log server).
本实例的目的是配置两台syslog-ng,一台clinet一台server。server端主要是对client日志的收集,然后我们就可以在服务器端统一分析了。
本人公司的应用是把log4j的日志通过syslog-ng client 发送到server端,然后通过python脚本分析写入数据库。然后再通过open flash chart画出图表出来,不多说了直接贴安装方法和具体的配置。
pre-acquire
eventlog-0.2.5.tar.gz
libnet
glib-java.x86_64
glib-java-devel.x86_64
glib2-devel
step 1:install syslog-ng
tar xzvf syslog-ng-2.0.7.tar.gz
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure --prefix=/usr/local/syslogng --enable-tcp-wrapper --sysconfdir=/etc
make && make install
step 2:initiate
1:create syslog-ng.conf in /etc/ directory
2:create service lsb script in /etc/init.d directory
cp init.d.RedHat-7.3 /etc/init.d/syslogng and modify PATH environment
3:create logs group and logs user
step 3:configuration
client side:
# $Id: client-syslog-ng.conf,v 1.4 2005/10/23 18:36:10 jmates Exp $
#
# syslog-ng client configuration: some local logs, in addition to TCP
# logging to central loghost. Listens only on localhost interface;
# requires "logs" user and group on system.
#
# Local logs are stored under /var/log/archive in a syslog-ng specific
# format that includes facility, priority, and a timestamp that includes
# the year.
options {
log_fifo_size(4096);
group(logs);
dir_group(logs);
create_dirs(yes);
dir_perm(0750);
perm(0640);
use_time_recvd(no);
use_fqdn(yes);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
};
source local {
unix-stream("/dev/log" max_connections(150));
udp(ip(127.0.0.1) port(514));
internal();
};
# all logs to loghost via TCP
filter notdebug { level(info...emerg); };
destination loghost { tcp("192.168.1.7" port(5149)); };
log { source(local); filter(notdebug); destination(loghost); };
# emergency to more locations by default
filter emergency { level(emerg); };
destination allusers { usertty("*"); };
log { source(local); filter(emergency); destination(allusers); };
destination d_cons { file("/dev/console"); };
log { source(local); filter(emergency); destination(d_cons); };
# alternate locations for other logs to avoid need to logrotate and HUP
destination d_mesg {
file( "/logs/archive/messages/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_mail {
file( "/logs/archive/mail/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
#filter f_e {
#not(facility(cron) and priority(info));
#};
filter f_filter1 { level(info...emerg) and not facility(mail) and not facility(user); };
filter f_filter3 { facility(user); };
filter f_filter2 { facility(mail); };
log { source(local); filter(f_filter1); destination(d_mesg); };
log { source(local); filter(f_filter2); destination(d_mail); };
server side:
[root@monitserver etc]# more syslog-ng.conf
# $Id: server-syslog-ng.conf,v 1.4 2005/10/23 18:31:57 jmates Exp $
#
# Central loghost syslog-ng configuration.
options {
log_fifo_size(8192);
# garden gnomes shouldn't log (Gnome has a buggy log implementation)
# needs to be set on client systems, too...
bad_hostname("gconfd");
use_time_recvd(no);
group(logs);
create_dirs(yes);
dir_group(logs);
dir_perm(0750);
perm(0640);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
use_fqdn(yes);
};
# TODO look into enabling 'keep-alive' or 'tcp-keep-alive' on both
# client and server systems to avoid prior connections lingering?
source local {
unix-stream("/dev/log");
udp(ip(0.0.0.0) port(514));
tcp(ip(0.0.0.0) port(5149) max-connections(333));
internal();
};
filter emergency { level(emerg); };
destination users { usertty("*"); };
log { source(local); filter(emergency); destination(users); };
filter f_1 {
level(debug...emerg);
};
destination d_1 {
file("/var/log/everything"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_1); destination(d_1); };
# Windows logs to custom location (via Snare Agent, see [GS #1518])
filter windows {
program(MSWinEventLog);
};
destination windows {
file("/var/log/archive/windows/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log {
source(local); filter(windows); destination(windows);
flags(final);
};
filter f_2 {
level(info...emerg);
};
filter f_3 {
not facility(mail);
};
filter f_10 {
not facility(user);
};
destination d_2 {
file("/var/log/archive/messages/$R_YEAR/$R_MONTH/message.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_2); filter(f_3);filter(f_10); destination(d_2); };
filter f_5 {
facility(mail) and level(debug...emerg);
};
filter f_6 {
facility(user) and level(debug...emerg);
};
filter f_7 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_8 {
facility(user) and level(debug...emerg) and match("wadetest.secretcrush");
};
filter f_9 {
facility(user) and level(err);
};
filter f_10 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_11 {
facility(user) and level(debug...emerg) and match("wadetest.advertise");
};
destination d_3 {
file("/var/log/archive/mail/$R_YEAR/$R_MONTH/total.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE $HOST_FROM <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_11{
pipe("/data/trackpipe");
};
log { source(local); filter(f_5); destination(d_3); };
log { source(local); filter(f_9); destination(d_9); };
log { source(local); filter(f_11); destination(d_11); };
step 4:start syslog-ng
service syslogng start
来源:
http://blog.sina.com.cn/s/blog_4d8a2c970100f2qz.html
本实例的目的是配置两台syslog-ng,一台clinet一台server。server端主要是对client日志的收集,然后我们就可以在服务器端统一分析了。
本人公司的应用是把log4j的日志通过syslog-ng client 发送到server端,然后通过python脚本分析写入数据库。然后再通过open flash chart画出图表出来,不多说了直接贴安装方法和具体的配置。
pre-acquire
eventlog-0.2.5.tar.gz
libnet
glib-java.x86_64
glib-java-devel.x86_64
glib2-devel
step 1:install syslog-ng
tar xzvf syslog-ng-2.0.7.tar.gz
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure --prefix=/usr/local/syslogng --enable-tcp-wrapper --sysconfdir=/etc
make && make install
step 2:initiate
1:create syslog-ng.conf in /etc/ directory
2:create service lsb script in /etc/init.d directory
cp init.d.RedHat-7.3 /etc/init.d/syslogng and modify PATH environment
3:create logs group and logs user
step 3:configuration
client side:
# $Id: client-syslog-ng.conf,v 1.4 2005/10/23 18:36:10 jmates Exp $
#
# syslog-ng client configuration: some local logs, in addition to TCP
# logging to central loghost. Listens only on localhost interface;
# requires "logs" user and group on system.
#
# Local logs are stored under /var/log/archive in a syslog-ng specific
# format that includes facility, priority, and a timestamp that includes
# the year.
options {
log_fifo_size(4096);
group(logs);
dir_group(logs);
create_dirs(yes);
dir_perm(0750);
perm(0640);
use_time_recvd(no);
use_fqdn(yes);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
};
source local {
unix-stream("/dev/log" max_connections(150));
udp(ip(127.0.0.1) port(514));
internal();
};
# all logs to loghost via TCP
filter notdebug { level(info...emerg); };
destination loghost { tcp("192.168.1.7" port(5149)); };
log { source(local); filter(notdebug); destination(loghost); };
# emergency to more locations by default
filter emergency { level(emerg); };
destination allusers { usertty("*"); };
log { source(local); filter(emergency); destination(allusers); };
destination d_cons { file("/dev/console"); };
log { source(local); filter(emergency); destination(d_cons); };
# alternate locations for other logs to avoid need to logrotate and HUP
destination d_mesg {
file( "/logs/archive/messages/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_mail {
file( "/logs/archive/mail/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
#filter f_e {
#not(facility(cron) and priority(info));
#};
filter f_filter1 { level(info...emerg) and not facility(mail) and not facility(user); };
filter f_filter3 { facility(user); };
filter f_filter2 { facility(mail); };
log { source(local); filter(f_filter1); destination(d_mesg); };
log { source(local); filter(f_filter2); destination(d_mail); };
server side:
[root@monitserver etc]# more syslog-ng.conf
# $Id: server-syslog-ng.conf,v 1.4 2005/10/23 18:31:57 jmates Exp $
#
# Central loghost syslog-ng configuration.
options {
log_fifo_size(8192);
# garden gnomes shouldn't log (Gnome has a buggy log implementation)
# needs to be set on client systems, too...
bad_hostname("gconfd");
use_time_recvd(no);
group(logs);
create_dirs(yes);
dir_group(logs);
dir_perm(0750);
perm(0640);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
use_fqdn(yes);
};
# TODO look into enabling 'keep-alive' or 'tcp-keep-alive' on both
# client and server systems to avoid prior connections lingering?
source local {
unix-stream("/dev/log");
udp(ip(0.0.0.0) port(514));
tcp(ip(0.0.0.0) port(5149) max-connections(333));
internal();
};
filter emergency { level(emerg); };
destination users { usertty("*"); };
log { source(local); filter(emergency); destination(users); };
filter f_1 {
level(debug...emerg);
};
destination d_1 {
file("/var/log/everything"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_1); destination(d_1); };
# Windows logs to custom location (via Snare Agent, see [GS #1518])
filter windows {
program(MSWinEventLog);
};
destination windows {
file("/var/log/archive/windows/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log {
source(local); filter(windows); destination(windows);
flags(final);
};
filter f_2 {
level(info...emerg);
};
filter f_3 {
not facility(mail);
};
filter f_10 {
not facility(user);
};
destination d_2 {
file("/var/log/archive/messages/$R_YEAR/$R_MONTH/message.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_2); filter(f_3);filter(f_10); destination(d_2); };
filter f_5 {
facility(mail) and level(debug...emerg);
};
filter f_6 {
facility(user) and level(debug...emerg);
};
filter f_7 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_8 {
facility(user) and level(debug...emerg) and match("wadetest.secretcrush");
};
filter f_9 {
facility(user) and level(err);
};
filter f_10 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_11 {
facility(user) and level(debug...emerg) and match("wadetest.advertise");
};
destination d_3 {
file("/var/log/archive/mail/$R_YEAR/$R_MONTH/total.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE $HOST_FROM <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_11{
pipe("/data/trackpipe");
};
log { source(local); filter(f_5); destination(d_3); };
log { source(local); filter(f_9); destination(d_9); };
log { source(local); filter(f_11); destination(d_11); };
step 4:start syslog-ng
service syslogng start
来源:
http://blog.sina.com.cn/s/blog_4d8a2c970100f2qz.html
PHP手册 :
There are 5 monkeys in the tree
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
$bookSQL=sprintf("UPDATE book SET pass=%s WHERE id=%d",
GetSQLValueString($_POST['list'], "text"),
GetSQLValueString($_GET['id'],"int"));
GetSQLValueString 这个函数,可以换成别的函数
但在sql语句这里用上sprintf()这个函数的话!就相对安全多了,比如id那里我们可以用上%d
或是有很多sql操作的时候,用上这个
$Result = $db->query($bookSQL) or die(mysql_error());
下面加上sprintf这个函数的说明:
引用
sprintf
将字符串格式化。
语法: string sprintf(string format, mixed [args]...);
返回值: 字符串
函数种类: 资料处理
内容说明
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
填空字符。0 的话表示空格填 0;空格是默认值,表示空格就放着。
对齐方式。默认值为向右对齐,负号表向左对齐。
字段宽度。为最小宽度。
精确度。指在小数点后的浮点数位数。
类型,见下表 % 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字符。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字符串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。
printf直接输出,注意区别:
sprintf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
输出完成 (耗时 0 秒) - 正常终止
printf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>86
输出完成 (耗时 0 秒) - 正常终止
86,是输出了$outStr的长度。
echo $outStr; //86
printf($upStrOut, $status,$id,$description); //<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
There are 5 monkeys in the tree
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
$bookSQL=sprintf("UPDATE book SET pass=%s WHERE id=%d",
GetSQLValueString($_POST['list'], "text"),
GetSQLValueString($_GET['id'],"int"));
GetSQLValueString 这个函数,可以换成别的函数
但在sql语句这里用上sprintf()这个函数的话!就相对安全多了,比如id那里我们可以用上%d
或是有很多sql操作的时候,用上这个
$Result = $db->query($bookSQL) or die(mysql_error());
下面加上sprintf这个函数的说明:
引用
sprintf
将字符串格式化。
语法: string sprintf(string format, mixed [args]...);
返回值: 字符串
函数种类: 资料处理
内容说明
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
填空字符。0 的话表示空格填 0;空格是默认值,表示空格就放着。
对齐方式。默认值为向右对齐,负号表向左对齐。
字段宽度。为最小宽度。
精确度。指在小数点后的浮点数位数。
类型,见下表 % 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字符。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字符串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。
printf直接输出,注意区别:
sprintf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
输出完成 (耗时 0 秒) - 正常终止
printf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>86
输出完成 (耗时 0 秒) - 正常终止
86,是输出了$outStr的长度。
echo $outStr; //86
printf($upStrOut, $status,$id,$description); //<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
[root@localhost ~]# setserial -g /dev/ttyS*
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
setserial /dev/ttyS1 baud_base 57600
[root@localhost ~]# setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test
[root@localhost ~]# setserial -a /dev/ttyS1
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
Baud_base: 57600, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
Baud_base: 57600, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test
以下是参考:
阅读全文
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/
有个男人叫M,他要过河去和未婚妻F相会结婚,但两人一河相隔,M必须要借船过河才能见到F,于是他开始四处找船。
这时见一个女子L刚好有船,M跟L借,L遇到M后爱上了他,就问:我爱上你了,你爱我吗?M比较诚实,说:对不起,我有未婚妻,我不能爱你。这么一来,L死活是不把船借给M,她的理由是:我爱你,你不爱我,这不公平,我不会借你的!
M很沮丧,继续找船,刚好见一位叫S的女子,就向她借船,S说:我借给你没问题,但有个条件,我很喜欢你,你是不是喜欢我无所谓,但你必须留下陪我一晚,不然我不借你。M很为难,L不借他船,S如果再不借他的话就过不去河与F相见了,据说这个地方只有这两条船。为了彼岸的未婚妻,他不得不同意了S的要求,与S有了一夜情。次日,S遵守承诺把船借给了M。
见到未婚妻F后,M一直心里有事,考虑了很久,终于决定把向L和S借船的故事跟F说了。可惜,F听了非常伤心,一气之下与M分了手,她觉得M不忠,不能原谅。F失恋了,很受打击.
这时他的生活里出现了位女子E,两人也开始恋爱了,但之前的故事一直让他耿耿于坏,E问M是不是有什么话要跟她说,于是,M一五一十地把他和L、S、F之间的故事讲了一遍。E听了后,说,我不会介意的,这些跟我没关系。
故事讲完了,问题来了,请你把这几个人排列个次序,标准是你认为谁最好,谁第二,谁第三,第四,第五?这个M男也算在内的。建议不要想太复杂,也不需要考虑大众看法,你认为谁做得好就是好。
答案其实很简单,就是用你的潜意识告诉你最想要的是什么。不知道自己要什么,这是很普遍的问题,因为什么都挺重要的,舍弃什么都不成体统,只是每个人的人生追求确实差异很大,看别人追求事业,你也羡慕也很想这样,但不知道为什么总做不到;看别人婚姻幸福,你也很想,可实现起来确实不容易,这和运气也不是太有关系,而是你需要的决定了很多。
这时见一个女子L刚好有船,M跟L借,L遇到M后爱上了他,就问:我爱上你了,你爱我吗?M比较诚实,说:对不起,我有未婚妻,我不能爱你。这么一来,L死活是不把船借给M,她的理由是:我爱你,你不爱我,这不公平,我不会借你的!
M很沮丧,继续找船,刚好见一位叫S的女子,就向她借船,S说:我借给你没问题,但有个条件,我很喜欢你,你是不是喜欢我无所谓,但你必须留下陪我一晚,不然我不借你。M很为难,L不借他船,S如果再不借他的话就过不去河与F相见了,据说这个地方只有这两条船。为了彼岸的未婚妻,他不得不同意了S的要求,与S有了一夜情。次日,S遵守承诺把船借给了M。
见到未婚妻F后,M一直心里有事,考虑了很久,终于决定把向L和S借船的故事跟F说了。可惜,F听了非常伤心,一气之下与M分了手,她觉得M不忠,不能原谅。F失恋了,很受打击.
这时他的生活里出现了位女子E,两人也开始恋爱了,但之前的故事一直让他耿耿于坏,E问M是不是有什么话要跟她说,于是,M一五一十地把他和L、S、F之间的故事讲了一遍。E听了后,说,我不会介意的,这些跟我没关系。
故事讲完了,问题来了,请你把这几个人排列个次序,标准是你认为谁最好,谁第二,谁第三,第四,第五?这个M男也算在内的。建议不要想太复杂,也不需要考虑大众看法,你认为谁做得好就是好。
答案其实很简单,就是用你的潜意识告诉你最想要的是什么。不知道自己要什么,这是很普遍的问题,因为什么都挺重要的,舍弃什么都不成体统,只是每个人的人生追求确实差异很大,看别人追求事业,你也羡慕也很想这样,但不知道为什么总做不到;看别人婚姻幸福,你也很想,可实现起来确实不容易,这和运气也不是太有关系,而是你需要的决定了很多。
M代表——金钱(Money)
L代表——爱情(Love)
S代表——性(Sex)
F代表——家庭(Family)
E代表——事业(Enterprise)
L代表——爱情(Love)
S代表——性(Sex)
F代表——家庭(Family)
E代表——事业(Enterprise)
上图先:
一同事贴的图,让我想起人月神话里面的管理--外科手术团队:
外科手术团队
這個篇章看完突然想到研究所的專案管理課程,三個學分,卻是我們一個學期的研究重心,四個實際運作的專案,大家分組進行,教授不斷的製造專案危機,像是公司被併購、人員流失、專案形式改變、客戶不斷施以壓力等等,但最後大家還是順利的結案。这个篇章看完突然想到研究所的专案管理课程,三个学分,却是我们一个学期的研究重心,四个实际运作的专案,大家分组进行,教授不断的制造专案危机,像是公司被并购、人员流失、专案形式改变、客户不断施以压力等等,但最后大家还是顺利的结案。
這是個難以忘懷的經驗,組員們的默契在起初的確造成危機,但是,由於大家的素質還算整齊,很快就可以建立溝通的語言。这是个难以忘怀的经验,组员们的默契在起初的确造成危机,但是,由于大家的素质还算整齐,很快就可以建立沟通的语言。 加上大家熟悉協同科技概念與網路溝通,可以做到分時分地作業,也使得專案進行有效率。加上大家熟悉协同科技概念与网路沟通,可以做到分时分地作业,也使得专案进行有效率。
但當我看完這篇外科手術團隊後,我發現其實還有個成功的關鍵在其中,就是同學們各有專長,所以,分工很容易,又因為有選出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
本人对他的标准非常赞同,转载过来看看,一下为正文内容, 括号内内容为本人对该标准所注非原文。阅读全文