找了段韩国人写的PHP,哈哈
<?php
## 시스템 정보 출력 ########################################
##
## 작성자 : 김칠봉[닉:산이] <san2(at)linuxchannel.net>
## 스크립트 명 : PHP를 이용한 시스템 정보를 출력하는 스크립트
##
#############################################################
##
## 주)
## 사용상 부주의로 인한 피해는
## 본 작성성자에게 어떠한 보증이나 책임이 없습니다.
##
##############################################################
##############################################################
##
## speed up `for()'
## 1) not good : for($i=0; $i<count($tmp=@file('file')); $i++)
## 2) good : $tmp=@file('file'); for($i=0; $i<count($tmp); $i++)
##
##############################################################
class sysinfo_common
{
## 파일 크기 출력 함수
## $bfsize 변수는 bytes 단위의 크기임
##
function file_hsize($bfsize, $sub=0)
{
$BYTES = number_format($bfsize).' Bytes';
if($bfsize < 1024) return $BYTES;
else if($bfsize < 1048576) $bfsize = number_format(round($bfsize/1024)).' KB';
else if($bfsize < 1073741827) $bfsize = number_format(round($bfsize/1048576)).' MB';
else $bfsize = number_format($bfsize/1073741827,1).' GB';
if($sub) $bfsize .= "($BYTES)";
return $bfsize;
}
function get_title()
{
global $_SERVER, $_ENV; // for PHP/4.0.x
if(!$hostname[0] = $_ENV["HOSTNAME"])
{ $hostname = @file('/proc/sys/kernel/hostname'); }
return $_SERVER['HTTP_HOST'].' ('.$hostname[0].')';
}
function get_mem()
{
if(!$mem = @file('/proc/meminfo')) return;
$get = array();
if(preg_match('/^Mem:/',$mem[1])) // Linux/2.2.x/2.4.x
{
list($null,$get['total'],$get['used'],$get['free'],$get['shared'],$get['buffered'],$get['cached'])
= preg_split('/\s+/',$mem[1]);
list($null,$get['swaptotal'],$get['swapused'],$get['swapfree']) = preg_split('/\s+/',$mem[2]);
} else // Linux/2.6.0-test
{
$map = array('MemTotal:'=>'total','MemFree:'=>'free','Buffers:'=>'buffered',
'Cached:'=>'cached','SwapTotal:'=>'swaptotal','SwapFree:'=>'swapfree',
'kB'=>1024,'B'=>1,'mB'=>1048576,'MB'=>1048576);
$mem = preg_grep('/^(?:MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree):/',$mem);
foreach($mem AS $v)
{
$n = preg_split('/\s+/',$v);
$mkey = $map[$n[0]];
$multipli = $map[$n[2]];
$get[$mkey] = $n[1] * $multipli;
}
$get['used'] = $get['total'] - $get['free'];
}
$get['freepercent'] = @round(($get['free']/$get['total'])*100); // 여유 메모리 퍼센트
$get['usedpercent'] = 100 - $get['freepercent']; // 사용한 메모리 퍼센트
// 2001.03.18일 추가(실제 사용량 계산)
$get['totalfree'] = $get['free'] + $get['buffered'] + $get['cached']; // 실제 남은 메모리
$get['totalused'] = $get['total'] - $get['totalfree']; // 실제로 사용한 메모리
$get['totalfreepercent'] = @round(($get['totalfree']/$get['total'])*100); // 실제 남은 메모리 퍼센트
$get['totalusedpercent'] = 100 - $get['totalfreepercent']; // 실제 사용한 메모리 퍼센트
//2001.02.26일 추가
$get['bufferedpercent'] = @round(($get['buffered']/$get['total'])*100); // 버퍼메모리 퍼센트
$get['cachedpercent'] = @round(($get['cached']/$get['total'])*100); // 캐쉬메모리 퍼센트
$get['swapfreepercent'] = @round(($get['swapfree']/$get['swaptotal'])*100); // 스왑 여유 공간 퍼센트
$get['swapusedpercent'] = 100 - $get['swapfreepercent']; // 사용한 스왑 퍼센트
// 보정
foreach(array('total','free','used','buffered','cached','totalfree','totalused',
'swaptotal','swapfree','swapused') AS $k)
{
$get[$k] = $this->file_hsize($get[$k]);
}
return $get;
}
function get_part()
{
## 각 파티션(FS)와 마운트 포인트 계산
##
$mounts = @file('/proc/mounts');
for($i=0; $i<count($mounts); $i++)
{
if(preg_match('/ext[23]|vfat|ntfs|reiserfs|xfs|jfs/',$mounts[$i]))
{
list($p['dev'][],$p['mount'][],$p['efs'][])
= preg_split('/\s+/', $mounts[$i]);
}
}
$num = count($p['dev']);
## 각 파티션 사용량 계산
##
@exec('/bin/df -k 2>/dev/null',$df); // KB 단위로 출력, $df는 배열
if($df)
{
unset($p['dev']); // change partition name
for($i=1; $i<count($df); $i++)
{
if(preg_match(';^/dev/;',$df[$i]))
{
list($p['dev'][],$size,$used,$avail,$percent)
= preg_split('/\s+/',$df[$i]);
## 각 파티션 used %
##
$percent = (int)$percent;
$p['percent'][] = $percent;
$p['percent_avail'][] = 100 - $percent;
## 각 파티션 크기
##
$size = $size * 1024; // for PHP/4.3.2 bug ?
$p['size']['sum'] += $size; // Byte 단위로 환산
$p['size'][] = $this->file_hsize($size);
## 각 파티션 사용한 용량
##
$used = $used * 1024; // for PHP/4.3.2 bug ?
$p['used']['sum'] += $used;
$p['used'][] = $this->file_hsize($used);
## 각 파티션 여유 용량
##
$avail = $avail * 1024; // for PHP/4.3.2 bug ?
$p['avail']['sum'] += $avail;
$p['avail'][] = $this->file_hsize($avail);
}
}
$p['fix'] = '* 합계가 정확하게 맞지 않은 이유는 약 '.
$this->file_hsize($p['size']['sum'] - $p['used']['sum'] - $p['avail']['sum']).
'(각 파티션 합) 정도를 시스템이 미리 확보했기 때문입니다.';
$p['percent']['total'] = @round($p['used']['sum']*100/$p['size']['sum']);
$p['percent_avail']['total'] = 100 - $p['percent']['total'];
$p['size']['sum'] = $this->file_hsize($p['size']['sum']);
$p['used']['sum'] = $this->file_hsize($p['used']['sum']);
$p['avail']['sum'] = $this->file_hsize($p['avail']['sum']);
## last check partitions number
##
$cnt = count($p['dev']);
/*** good idea, but unnecessary
## check chroot enviroments
##
if($num > $cnt)
{ for($i=$cnt; $i<$num; $i++) $p['size'][$i] = 'NA'; }
***/
}
## change partitions number
##
$p['dev']['num'] = $cnt ? $cnt : $num;
return $p;
}
## support S/390, 2002.10.23
##
function get_proc_part()
{
if(!$part = @file('/proc/partitions')) return;
## disk block table
## /usr/src/linux/Documentations/devices.txt
## major => 'type','name','minor'
##
$ddtable = array(
3 => array('eide','E-IDE',64), // First MFM, RLL and IDE hard disk/CD-ROM interface
8 => array('scsi','SCSI',16), // SCSI disk devices
9 => array('raid','RAID',1), // Metadisk (RAID) devices
13=> array('ide','XT-IDE',64), // 8-bit MFM/RLL/IDE controller
14=> array('bios','BIOS',64), // BIOS harddrive
21=> array('acorn','Acorn-MFM',64), // Acorn MFM hard drive interface
22=> array('eide','E-IDE',64), // Second IDE hard disk/CD-ROM interface
28=> array('acsi','ACSI',16), // ACSI disk (68k/Atari)
33=> array('eide','E-IDE',64), // Third IDE hard disk/CD-ROM interface
34=> array('eide','E-IDE',64), // Fourth IDE hard disk/CD-ROM interface
36=> array('mca','MCA-ESDI',64), // MCA ESDI hard disk
45=> array('ide','PP-IDE',16), // Parallel port IDE disk devices
47=> array('atapi','PP-ATAPI',1), // Parallel port ATAPI disk devices
48=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
49=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
50=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
51=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
52=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
53=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
54=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
55=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
56=> array('eide','E-IDE',64), // Fifth IDE hard disk/CD-ROM interface
57=> array('eide','E-IDE',64), // Sixth IDE hard disk/CD-ROM interface
65=> array('scsi','SCSI',16), // SCSI disk devices
66=> array('scsi','SCSI',16), // SCSI disk devices
67=> array('scsi','SCSI',16), // SCSI disk devices
68=> array('scsi','SCSI',16), // SCSI disk devices
69=> array('scsi','SCSI',16), // SCSI disk devices
70=> array('scsi','SCSI',16), // SCSI disk devices
71=> array('scsi','SCSI',16), // SCSI disk devices
72=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
73=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
74=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
75=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
76=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
77=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
78=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
79=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
80=> array('i2o','I2O',16), // I2O hard disk
81=> array('i2o','I2O',16), // I2O hard disk
82=> array('i2o','I2O',16), // I2O hard disk
83=> array('i2o','I2O',16), // I2O hard disk
85=> array('i2o','I2O',16), // I2O hard disk
86=> array('i2o','I2O',16), // I2O hard disk
87=> array('i2o','I2O',16), // I2O hard disk
88=> array('eide','E-IDE',64), // Seventh IDE hard disk/CD-ROM interface
89=> array('eide','E-IDE',64), // Eighth IDE hard disk/CD-ROM interface
90=> array('eide','E-IDE',64), // Ninth IDE hard disk/CD-ROM interface
91=> array('eide','E-IDE',64), // Tenth IDE hard disk/CD-ROM interface
92=> array('ppdd','PPDD',1), // PPDD encrypted disk driver
94=> array('ibm','IBM-S/390-DASD',4), // IBM S/390 DASD block storage
95=> array('ibm','IBM-S/390-VM/ESA',1), // IBM S/390 VM/ESA minidisk
101=>array('raid','AMI-HD-RAID',16), // AMI HyperDisk RAID controller
104=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
105=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
106=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
107=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
108=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
109=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
110=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
111=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
112=>array('ibm','IBM-iSeries',8), // IBM iSeries virtual disk
199=>array('vm','VxVM',1) // Veritas volume manager (VxVM) volumes
);
for($i=2; $i<count($part); $i++) // start check $ppart[2];
{
list($major,$minor,$blocks,$name) = preg_split('/\s+/',trim($part[$i]));
if($d = $ddtable[$major])
{
$type = $d[0];
if($minor % $d[2])
{
$ppart[$type][$key] .= $name . ' ';
if($blocks == 1)
{
$ppart[$type][$key] .= '< ';
$check[$type][] = $key;
}
} else
{
$key = (int) ${$type}++; // it's mean that counts of the HDD number
//$key = $major.$minor; // HDD uniq ID
$this->dd[$type][$key] = array('name'=>$d[1],'major'=>$major,'minor'=>$minor);
}
}
}
if(is_array($ppart))
{
foreach(array_keys($ppart) AS $type)
{
if($check[$type])
{
foreach($check[$type] AS $key)
{ $ppart[$type][$key] .= '>'; }
}
sort($ppart[$type]); // for value sort
sort($this->dd[$type]);
}
}
return $ppart;
}
function get_swpart()
{
if(!$swaps = @file('/proc/swaps')) return;
for($i=1; $i<count($swaps); $i++)
{ $sw .= preg_replace(';^/dev/([^ ]+).+\n*$;','\\1',$swaps[$i]) . ','; }
return preg_replace('/,$/','',$sw);
}
## same as $utils->get_file($file)
##
function get_release($file)
{
if(!file_exists($file)) return;
if(function_exists(dio_open))
{
if($fp = @dio_open($file,O_RDONLY))
{
$contents = dio_read($fp,filesize($file));
dio_close($fp);
}
return $contents;
}
if($fp = @fopen($file,'r'))
{
$contents = fread($fp,filesize($file));
fclose($fp);
}
return $contents;
}
function get_os()
{
global $ARCH;
$ostype = PHP_OS;
if(!$ARCH['r'] && (!$ARCH['r'] = $this->dmesg['kernel']))
{
unset($ostype);
if(!$kernel = @file('/proc/sys/kernel/osrelease'))
{
if($kernel = @file('/proc/version'))
{ $ARCH['r'] = preg_replace('/^([^(]+) \(.+$/','\\1',$kernel[0]); }
}
else $ARCH['r'] = $kernel[0];
}
$tmp = array('/etc/hancom-release','/etc/redhat-release','/etc/debian_release',
'/etc/version','/etc/Version','/etc/wow-release','/etc/wowlinux-release');
foreach($tmp AS $v) if($dist = $this->get_release($v)) break;
if(!$dist)
{
if($hdle = @opendir('/etc'))
{
while($file = @readdir($hdle))
{
if(preg_match('/release|version/i',$file))
{ $dist = $this->get_release('/etc/'.$file); break; }
}
closedir($hdle);
}
}
return "$ostype $ARCH[r] $ARCH[m]" . ($dist ? ' / '.$dist : '');
}
function get_netstat()
{
if(!$netstat = @file('/proc/net/dev')) return;
for($i=2; $i<count($netstat); $i++)
{
## ':'과 공백문자를 나누어 배열형태로 만듬
## R : 받는 패킷
## T : 보낸 패킷
$j = $i - 2;
$tmp = explode(':',$netstat[$i]);
$stat['iface'][$j] = trim($tmp[0]);
if(preg_match('/^bond/',$stat['iface'][$j])) $bonding++;
else if(preg_match('/^eth/',$stat['iface'][$j])) $ethernet++;
list($bytes['R'],$stat['R_packets'][$j],$stat['R_errs'][$j],$stat['R_drop'][$j],
$null,$null,$null,$null,$bytes['T'],$stat['T_packets'][$j],
$stat['T_errs'][$j],$stat['T_drop'][$j],$stat['T_colls'][$j]
) = preg_split('/\s+/',trim($tmp[1]));
$stat['R_size'][$j] = $this->file_hsize($bytes['R']);
$stat['T_size'][$j] = $this->file_hsize($bytes['T']);
// 충돌률 계산
if($stat['T_packets'][$j] > 0)
{
if((int)$stat['T_colls'][$j]*100/$stat['T_packets'][$j] >= 5)
{
$stat['T_colls'][$j] = '<FONT COLOR="FF0000">'.$stat['T_colls'][$j].'</FONT>';
$chk .= $stat['iface'][$j] . ' ';
}
}
}
if($bonding && $ethernet >= 2)
{
//$ethernet = $j - $bonding;
$stat['fix'] = "현재 이 시스템은 ${ethernet}개의 ".
TAG_A("<font color='#0000FF'>Ethernet Channel에 대해서 ${bonding}개의 ".
'가상 bonding 장치</font>',
'http://www.linuxchannel.net/docs/ethernet-channel-bonding.txt',
'_blank','About the ethernet channel bonding').
'가 설정되어 있음.<BR> ';
}
$stat['fix'] = "* $stat[fix] TX의 Colls 항목은 collisions을 의미.";
if($chk)
{ $stat['fix'] .= "<BR> <FONT COLOR='#FF0000'>$chk</FONT>검점 필요(충돌률 5%이상) !!!"; }
return $stat;
}
} // end of class
?>
## 시스템 정보 출력 ########################################
##
## 작성자 : 김칠봉[닉:산이] <san2(at)linuxchannel.net>
## 스크립트 명 : PHP를 이용한 시스템 정보를 출력하는 스크립트
##
#############################################################
##
## 주)
## 사용상 부주의로 인한 피해는
## 본 작성성자에게 어떠한 보증이나 책임이 없습니다.
##
##############################################################
##############################################################
##
## speed up `for()'
## 1) not good : for($i=0; $i<count($tmp=@file('file')); $i++)
## 2) good : $tmp=@file('file'); for($i=0; $i<count($tmp); $i++)
##
##############################################################
class sysinfo_common
{
## 파일 크기 출력 함수
## $bfsize 변수는 bytes 단위의 크기임
##
function file_hsize($bfsize, $sub=0)
{
$BYTES = number_format($bfsize).' Bytes';
if($bfsize < 1024) return $BYTES;
else if($bfsize < 1048576) $bfsize = number_format(round($bfsize/1024)).' KB';
else if($bfsize < 1073741827) $bfsize = number_format(round($bfsize/1048576)).' MB';
else $bfsize = number_format($bfsize/1073741827,1).' GB';
if($sub) $bfsize .= "($BYTES)";
return $bfsize;
}
function get_title()
{
global $_SERVER, $_ENV; // for PHP/4.0.x
if(!$hostname[0] = $_ENV["HOSTNAME"])
{ $hostname = @file('/proc/sys/kernel/hostname'); }
return $_SERVER['HTTP_HOST'].' ('.$hostname[0].')';
}
function get_mem()
{
if(!$mem = @file('/proc/meminfo')) return;
$get = array();
if(preg_match('/^Mem:/',$mem[1])) // Linux/2.2.x/2.4.x
{
list($null,$get['total'],$get['used'],$get['free'],$get['shared'],$get['buffered'],$get['cached'])
= preg_split('/\s+/',$mem[1]);
list($null,$get['swaptotal'],$get['swapused'],$get['swapfree']) = preg_split('/\s+/',$mem[2]);
} else // Linux/2.6.0-test
{
$map = array('MemTotal:'=>'total','MemFree:'=>'free','Buffers:'=>'buffered',
'Cached:'=>'cached','SwapTotal:'=>'swaptotal','SwapFree:'=>'swapfree',
'kB'=>1024,'B'=>1,'mB'=>1048576,'MB'=>1048576);
$mem = preg_grep('/^(?:MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree):/',$mem);
foreach($mem AS $v)
{
$n = preg_split('/\s+/',$v);
$mkey = $map[$n[0]];
$multipli = $map[$n[2]];
$get[$mkey] = $n[1] * $multipli;
}
$get['used'] = $get['total'] - $get['free'];
}
$get['freepercent'] = @round(($get['free']/$get['total'])*100); // 여유 메모리 퍼센트
$get['usedpercent'] = 100 - $get['freepercent']; // 사용한 메모리 퍼센트
// 2001.03.18일 추가(실제 사용량 계산)
$get['totalfree'] = $get['free'] + $get['buffered'] + $get['cached']; // 실제 남은 메모리
$get['totalused'] = $get['total'] - $get['totalfree']; // 실제로 사용한 메모리
$get['totalfreepercent'] = @round(($get['totalfree']/$get['total'])*100); // 실제 남은 메모리 퍼센트
$get['totalusedpercent'] = 100 - $get['totalfreepercent']; // 실제 사용한 메모리 퍼센트
//2001.02.26일 추가
$get['bufferedpercent'] = @round(($get['buffered']/$get['total'])*100); // 버퍼메모리 퍼센트
$get['cachedpercent'] = @round(($get['cached']/$get['total'])*100); // 캐쉬메모리 퍼센트
$get['swapfreepercent'] = @round(($get['swapfree']/$get['swaptotal'])*100); // 스왑 여유 공간 퍼센트
$get['swapusedpercent'] = 100 - $get['swapfreepercent']; // 사용한 스왑 퍼센트
// 보정
foreach(array('total','free','used','buffered','cached','totalfree','totalused',
'swaptotal','swapfree','swapused') AS $k)
{
$get[$k] = $this->file_hsize($get[$k]);
}
return $get;
}
function get_part()
{
## 각 파티션(FS)와 마운트 포인트 계산
##
$mounts = @file('/proc/mounts');
for($i=0; $i<count($mounts); $i++)
{
if(preg_match('/ext[23]|vfat|ntfs|reiserfs|xfs|jfs/',$mounts[$i]))
{
list($p['dev'][],$p['mount'][],$p['efs'][])
= preg_split('/\s+/', $mounts[$i]);
}
}
$num = count($p['dev']);
## 각 파티션 사용량 계산
##
@exec('/bin/df -k 2>/dev/null',$df); // KB 단위로 출력, $df는 배열
if($df)
{
unset($p['dev']); // change partition name
for($i=1; $i<count($df); $i++)
{
if(preg_match(';^/dev/;',$df[$i]))
{
list($p['dev'][],$size,$used,$avail,$percent)
= preg_split('/\s+/',$df[$i]);
## 각 파티션 used %
##
$percent = (int)$percent;
$p['percent'][] = $percent;
$p['percent_avail'][] = 100 - $percent;
## 각 파티션 크기
##
$size = $size * 1024; // for PHP/4.3.2 bug ?
$p['size']['sum'] += $size; // Byte 단위로 환산
$p['size'][] = $this->file_hsize($size);
## 각 파티션 사용한 용량
##
$used = $used * 1024; // for PHP/4.3.2 bug ?
$p['used']['sum'] += $used;
$p['used'][] = $this->file_hsize($used);
## 각 파티션 여유 용량
##
$avail = $avail * 1024; // for PHP/4.3.2 bug ?
$p['avail']['sum'] += $avail;
$p['avail'][] = $this->file_hsize($avail);
}
}
$p['fix'] = '* 합계가 정확하게 맞지 않은 이유는 약 '.
$this->file_hsize($p['size']['sum'] - $p['used']['sum'] - $p['avail']['sum']).
'(각 파티션 합) 정도를 시스템이 미리 확보했기 때문입니다.';
$p['percent']['total'] = @round($p['used']['sum']*100/$p['size']['sum']);
$p['percent_avail']['total'] = 100 - $p['percent']['total'];
$p['size']['sum'] = $this->file_hsize($p['size']['sum']);
$p['used']['sum'] = $this->file_hsize($p['used']['sum']);
$p['avail']['sum'] = $this->file_hsize($p['avail']['sum']);
## last check partitions number
##
$cnt = count($p['dev']);
/*** good idea, but unnecessary
## check chroot enviroments
##
if($num > $cnt)
{ for($i=$cnt; $i<$num; $i++) $p['size'][$i] = 'NA'; }
***/
}
## change partitions number
##
$p['dev']['num'] = $cnt ? $cnt : $num;
return $p;
}
## support S/390, 2002.10.23
##
function get_proc_part()
{
if(!$part = @file('/proc/partitions')) return;
## disk block table
## /usr/src/linux/Documentations/devices.txt
## major => 'type','name','minor'
##
$ddtable = array(
3 => array('eide','E-IDE',64), // First MFM, RLL and IDE hard disk/CD-ROM interface
8 => array('scsi','SCSI',16), // SCSI disk devices
9 => array('raid','RAID',1), // Metadisk (RAID) devices
13=> array('ide','XT-IDE',64), // 8-bit MFM/RLL/IDE controller
14=> array('bios','BIOS',64), // BIOS harddrive
21=> array('acorn','Acorn-MFM',64), // Acorn MFM hard drive interface
22=> array('eide','E-IDE',64), // Second IDE hard disk/CD-ROM interface
28=> array('acsi','ACSI',16), // ACSI disk (68k/Atari)
33=> array('eide','E-IDE',64), // Third IDE hard disk/CD-ROM interface
34=> array('eide','E-IDE',64), // Fourth IDE hard disk/CD-ROM interface
36=> array('mca','MCA-ESDI',64), // MCA ESDI hard disk
45=> array('ide','PP-IDE',16), // Parallel port IDE disk devices
47=> array('atapi','PP-ATAPI',1), // Parallel port ATAPI disk devices
48=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
49=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
50=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
51=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
52=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
53=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
54=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
55=> array('raid','DAC960-RAID',8), // Mylex DAC960 PCI RAID controller
56=> array('eide','E-IDE',64), // Fifth IDE hard disk/CD-ROM interface
57=> array('eide','E-IDE',64), // Sixth IDE hard disk/CD-ROM interface
65=> array('scsi','SCSI',16), // SCSI disk devices
66=> array('scsi','SCSI',16), // SCSI disk devices
67=> array('scsi','SCSI',16), // SCSI disk devices
68=> array('scsi','SCSI',16), // SCSI disk devices
69=> array('scsi','SCSI',16), // SCSI disk devices
70=> array('scsi','SCSI',16), // SCSI disk devices
71=> array('scsi','SCSI',16), // SCSI disk devices
72=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
73=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
74=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
75=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
76=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
77=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
78=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
79=> array('compaq','Compaq',16), // Compaq Intelligent Drive Array
80=> array('i2o','I2O',16), // I2O hard disk
81=> array('i2o','I2O',16), // I2O hard disk
82=> array('i2o','I2O',16), // I2O hard disk
83=> array('i2o','I2O',16), // I2O hard disk
85=> array('i2o','I2O',16), // I2O hard disk
86=> array('i2o','I2O',16), // I2O hard disk
87=> array('i2o','I2O',16), // I2O hard disk
88=> array('eide','E-IDE',64), // Seventh IDE hard disk/CD-ROM interface
89=> array('eide','E-IDE',64), // Eighth IDE hard disk/CD-ROM interface
90=> array('eide','E-IDE',64), // Ninth IDE hard disk/CD-ROM interface
91=> array('eide','E-IDE',64), // Tenth IDE hard disk/CD-ROM interface
92=> array('ppdd','PPDD',1), // PPDD encrypted disk driver
94=> array('ibm','IBM-S/390-DASD',4), // IBM S/390 DASD block storage
95=> array('ibm','IBM-S/390-VM/ESA',1), // IBM S/390 VM/ESA minidisk
101=>array('raid','AMI-HD-RAID',16), // AMI HyperDisk RAID controller
104=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
105=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
106=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
107=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
108=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
109=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
110=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
111=>array('compaq','Compaq',16), // Compaq Intelligent Drive Array
112=>array('ibm','IBM-iSeries',8), // IBM iSeries virtual disk
199=>array('vm','VxVM',1) // Veritas volume manager (VxVM) volumes
);
for($i=2; $i<count($part); $i++) // start check $ppart[2];
{
list($major,$minor,$blocks,$name) = preg_split('/\s+/',trim($part[$i]));
if($d = $ddtable[$major])
{
$type = $d[0];
if($minor % $d[2])
{
$ppart[$type][$key] .= $name . ' ';
if($blocks == 1)
{
$ppart[$type][$key] .= '< ';
$check[$type][] = $key;
}
} else
{
$key = (int) ${$type}++; // it's mean that counts of the HDD number
//$key = $major.$minor; // HDD uniq ID
$this->dd[$type][$key] = array('name'=>$d[1],'major'=>$major,'minor'=>$minor);
}
}
}
if(is_array($ppart))
{
foreach(array_keys($ppart) AS $type)
{
if($check[$type])
{
foreach($check[$type] AS $key)
{ $ppart[$type][$key] .= '>'; }
}
sort($ppart[$type]); // for value sort
sort($this->dd[$type]);
}
}
return $ppart;
}
function get_swpart()
{
if(!$swaps = @file('/proc/swaps')) return;
for($i=1; $i<count($swaps); $i++)
{ $sw .= preg_replace(';^/dev/([^ ]+).+\n*$;','\\1',$swaps[$i]) . ','; }
return preg_replace('/,$/','',$sw);
}
## same as $utils->get_file($file)
##
function get_release($file)
{
if(!file_exists($file)) return;
if(function_exists(dio_open))
{
if($fp = @dio_open($file,O_RDONLY))
{
$contents = dio_read($fp,filesize($file));
dio_close($fp);
}
return $contents;
}
if($fp = @fopen($file,'r'))
{
$contents = fread($fp,filesize($file));
fclose($fp);
}
return $contents;
}
function get_os()
{
global $ARCH;
$ostype = PHP_OS;
if(!$ARCH['r'] && (!$ARCH['r'] = $this->dmesg['kernel']))
{
unset($ostype);
if(!$kernel = @file('/proc/sys/kernel/osrelease'))
{
if($kernel = @file('/proc/version'))
{ $ARCH['r'] = preg_replace('/^([^(]+) \(.+$/','\\1',$kernel[0]); }
}
else $ARCH['r'] = $kernel[0];
}
$tmp = array('/etc/hancom-release','/etc/redhat-release','/etc/debian_release',
'/etc/version','/etc/Version','/etc/wow-release','/etc/wowlinux-release');
foreach($tmp AS $v) if($dist = $this->get_release($v)) break;
if(!$dist)
{
if($hdle = @opendir('/etc'))
{
while($file = @readdir($hdle))
{
if(preg_match('/release|version/i',$file))
{ $dist = $this->get_release('/etc/'.$file); break; }
}
closedir($hdle);
}
}
return "$ostype $ARCH[r] $ARCH[m]" . ($dist ? ' / '.$dist : '');
}
function get_netstat()
{
if(!$netstat = @file('/proc/net/dev')) return;
for($i=2; $i<count($netstat); $i++)
{
## ':'과 공백문자를 나누어 배열형태로 만듬
## R : 받는 패킷
## T : 보낸 패킷
$j = $i - 2;
$tmp = explode(':',$netstat[$i]);
$stat['iface'][$j] = trim($tmp[0]);
if(preg_match('/^bond/',$stat['iface'][$j])) $bonding++;
else if(preg_match('/^eth/',$stat['iface'][$j])) $ethernet++;
list($bytes['R'],$stat['R_packets'][$j],$stat['R_errs'][$j],$stat['R_drop'][$j],
$null,$null,$null,$null,$bytes['T'],$stat['T_packets'][$j],
$stat['T_errs'][$j],$stat['T_drop'][$j],$stat['T_colls'][$j]
) = preg_split('/\s+/',trim($tmp[1]));
$stat['R_size'][$j] = $this->file_hsize($bytes['R']);
$stat['T_size'][$j] = $this->file_hsize($bytes['T']);
// 충돌률 계산
if($stat['T_packets'][$j] > 0)
{
if((int)$stat['T_colls'][$j]*100/$stat['T_packets'][$j] >= 5)
{
$stat['T_colls'][$j] = '<FONT COLOR="FF0000">'.$stat['T_colls'][$j].'</FONT>';
$chk .= $stat['iface'][$j] . ' ';
}
}
}
if($bonding && $ethernet >= 2)
{
//$ethernet = $j - $bonding;
$stat['fix'] = "현재 이 시스템은 ${ethernet}개의 ".
TAG_A("<font color='#0000FF'>Ethernet Channel에 대해서 ${bonding}개의 ".
'가상 bonding 장치</font>',
'http://www.linuxchannel.net/docs/ethernet-channel-bonding.txt',
'_blank','About the ethernet channel bonding').
'가 설정되어 있음.<BR> ';
}
$stat['fix'] = "* $stat[fix] TX의 Colls 항목은 collisions을 의미.";
if($chk)
{ $stat['fix'] .= "<BR> <FONT COLOR='#FF0000'>$chk</FONT>검점 필요(충돌률 5%이상) !!!"; }
return $stat;
}
} // end of class
?>
前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。经过若干曲折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总结的部分贴出来。阅读全文
假设要发送一组数据 Send[10]
一般采用查询发送(循环发送)方式:
unsigned char Send[10]; //发送量
unsigned char i; //循环量
for(i=0;i<10;i++)
{
SBUF= Send[i]; //发送
while(TI==0); //等待发送完成
TI=0; //清标志
}
采用中断发送方式:
unsigned char Send[10]; //发送量
unsigned char num; //发送数据量
unsigned char *p; //发送用指针
//发送时:
num=10; //定义发送数据量
p=&Send ; //取首地址
SBUF=*p; //发送第一个数据,启动发送中断
//中断代码:
void ComInt() interrupt 4
{
if(RI) RI=0; //接收中断略;
if(TI) //发送中断处理
{
TI=0; //清标志
num--; //计数减1
p++; //指针加1
if(num >0) SBUF=*p; //数据继续发送至全部发完
}
}
中断发送优点:省去循环等待时间,以上面例子为例,9600bps时查询发送约占用单片机10ms多,而中断发送只占单片机几十微秒(单片机速度越快,占用时间越少)。
中断发送缺点:代码稍复杂,发送过程不易控制。
来源:http://mazhijing.blog.51cto.com/215535/197250
一般采用查询发送(循环发送)方式:
unsigned char Send[10]; //发送量
unsigned char i; //循环量
for(i=0;i<10;i++)
{
SBUF= Send[i]; //发送
while(TI==0); //等待发送完成
TI=0; //清标志
}
采用中断发送方式:
unsigned char Send[10]; //发送量
unsigned char num; //发送数据量
unsigned char *p; //发送用指针
//发送时:
num=10; //定义发送数据量
p=&Send ; //取首地址
SBUF=*p; //发送第一个数据,启动发送中断
//中断代码:
void ComInt() interrupt 4
{
if(RI) RI=0; //接收中断略;
if(TI) //发送中断处理
{
TI=0; //清标志
num--; //计数减1
p++; //指针加1
if(num >0) SBUF=*p; //数据继续发送至全部发完
}
}
中断发送优点:省去循环等待时间,以上面例子为例,9600bps时查询发送约占用单片机10ms多,而中断发送只占单片机几十微秒(单片机速度越快,占用时间越少)。
中断发送缺点:代码稍复杂,发送过程不易控制。
来源:http://mazhijing.blog.51cto.com/215535/197250
在使用php原生api连接mysql数据库的时候往往需要建立与本地mysql的多个连接,这个时候,mysql会为你多次连接返回同样的文件描述符。这本来是php对mysql连接的一种优化,对于同一台机器的不同数据库操作,提供统一的连接,避免大量的新连接,影响通讯效率。但如果不注意控制会出现问题。
问题:
如果在程序开始部分,对同一台机器的数据库建立了多个连接,例如使用mysql_connect 函数连接了本地数据库a与b,返回的都是资源描述符9(mysql_connect 的返回值)此后并没有任何查询操作,mysql会对这种sleep连接进行断开(可以设置wait_timeout来控制断开的等待时间),这个时候,对资源描述符9的连接已经断开,当你再要查询的时候,mysql会返回gone away的错误,errno代码为2600,此时你需要重新连接mysql,为了让php真正重新连接,而不是返回已经存在的断开的9号描述符,需要先调用mysql_close函数,结束已经断开的9号连接,然后再次调用mysql_connect进行连接。
此时问题出现了,调用mysql_close,打印mysql_close信息,返回的是true,说明关成功。再次mysql_connect后系统返回的仍旧是刚才断开的9号描述符,查询还会显示mysql gone away。正常情况下当调用mysql_close后,再次连接,系统会分配一个新的资源符。说明由于开始的时候多次连接返回相同的描述符对mysql_close调用产生了影响,没有真正断开资源描述符为9的连接。
原理猜想:
程序开始部分多次连接,php返回相同的资源描述符,同时维护一个描述符的引用计数,由于连接两次,引用计数为2,当调用mysql_close的时候,第一次调用会对引用计数-1,这个时候系统知道还有一个连接使用该资源描述符,所以不会真正断开连接,虽然这个连接由于超时了,已经不能使用。只有再次调用mysql_close的时候,引用计数再次-1,这次引用计数为0,mysql_close函数才会真正断开连接,再次使用mysql_connect函数的时候才会建立新的连接。
解决方法:
在调用mysql_connect时候给定最后一个参数 $new_link 为true,这样对相同参数调用返回不同的描述符,再次查询时候,如果发现gone away,调用mysql_close即可关闭这个连接,然后新建连接即可。
猜想:
在使用mysqli的时候好像没有出现过这种问题,因为在连接时候直接选择了不同的数据库,无需再单独选择数据库,这个时候系统返回的描述符可能因为连接的库不同直接就返回不同描述符,不会出现上面这种现象。这个待证实。
来源:http://hi.baidu.com/johntech/blog/item/d7d9390a8e232add63d986ed.html
问题:
如果在程序开始部分,对同一台机器的数据库建立了多个连接,例如使用mysql_connect 函数连接了本地数据库a与b,返回的都是资源描述符9(mysql_connect 的返回值)此后并没有任何查询操作,mysql会对这种sleep连接进行断开(可以设置wait_timeout来控制断开的等待时间),这个时候,对资源描述符9的连接已经断开,当你再要查询的时候,mysql会返回gone away的错误,errno代码为2600,此时你需要重新连接mysql,为了让php真正重新连接,而不是返回已经存在的断开的9号描述符,需要先调用mysql_close函数,结束已经断开的9号连接,然后再次调用mysql_connect进行连接。
此时问题出现了,调用mysql_close,打印mysql_close信息,返回的是true,说明关成功。再次mysql_connect后系统返回的仍旧是刚才断开的9号描述符,查询还会显示mysql gone away。正常情况下当调用mysql_close后,再次连接,系统会分配一个新的资源符。说明由于开始的时候多次连接返回相同的描述符对mysql_close调用产生了影响,没有真正断开资源描述符为9的连接。
原理猜想:
程序开始部分多次连接,php返回相同的资源描述符,同时维护一个描述符的引用计数,由于连接两次,引用计数为2,当调用mysql_close的时候,第一次调用会对引用计数-1,这个时候系统知道还有一个连接使用该资源描述符,所以不会真正断开连接,虽然这个连接由于超时了,已经不能使用。只有再次调用mysql_close的时候,引用计数再次-1,这次引用计数为0,mysql_close函数才会真正断开连接,再次使用mysql_connect函数的时候才会建立新的连接。
解决方法:
在调用mysql_connect时候给定最后一个参数 $new_link 为true,这样对相同参数调用返回不同的描述符,再次查询时候,如果发现gone away,调用mysql_close即可关闭这个连接,然后新建连接即可。
猜想:
在使用mysqli的时候好像没有出现过这种问题,因为在连接时候直接选择了不同的数据库,无需再单独选择数据库,这个时候系统返回的描述符可能因为连接的库不同直接就返回不同描述符,不会出现上面这种现象。这个待证实。
来源:http://hi.baidu.com/johntech/blog/item/d7d9390a8e232add63d986ed.html
一)一定要有True,及FILE_APPEND:
二)生成Curl Post格式的接口调试:
三)生成db的update加where的日志(Key作为数据库的字段,值为值,where也一样):
一行完成Curl的POST输出:
view plainprint?
echo "curl -d\"".http_build_query($data)."\" ".$url;
最近写一个infobright导入脚本的时候,需要判断文件超过一定大小2G时候,再建立一个文件,但在获取文件大小信息的时候,本来已经调用file_put_contents写入文件,但通过filesize获取文件大小的时候,大小还是没写入前的大小,后来发现原来php为了提高函数效率,会缓存之前文件信息,需调用 clearstatcache();来清除缓存,清除缓存后,再使用filesize函数获取的文件大小就正确了~~,正确调用过程如下:
file_put_contents($this->current_file, $data,FILE_APPEND);
clearstatcache();
if(filesize($this->current_file) > self::$file_max_size)
{
......
}
来源:http://hi.baidu.com/johntech/blog/item/50b23aebe3afb533b90e2d04.html
二)生成Curl Post格式的接口调试:
三)生成db的update加where的日志(Key作为数据库的字段,值为值,where也一样):
一行完成Curl的POST输出:
view plainprint?
echo "curl -d\"".http_build_query($data)."\" ".$url;
最近写一个infobright导入脚本的时候,需要判断文件超过一定大小2G时候,再建立一个文件,但在获取文件大小信息的时候,本来已经调用file_put_contents写入文件,但通过filesize获取文件大小的时候,大小还是没写入前的大小,后来发现原来php为了提高函数效率,会缓存之前文件信息,需调用 clearstatcache();来清除缓存,清除缓存后,再使用filesize函数获取的文件大小就正确了~~,正确调用过程如下:
file_put_contents($this->current_file, $data,FILE_APPEND);
clearstatcache();
if(filesize($this->current_file) > self::$file_max_size)
{
......
}
来源:http://hi.baidu.com/johntech/blog/item/50b23aebe3afb533b90e2d04.html
unbuntu虽然很好,但用来开发并不是很好,很多东西库都比较新,在上面开发的东西兼容性和可移植性差,所以最终还是选择了centos5.4.
阅读全文
阅读全文
大家都知道,PHP中有个函数叫json_encode,可以对变量进行 JSON 编码。
使用这个函数就可以把AJAX请求的返回值给转换成JSON格式,方便处理啊。
可是这个返回值并不是真正意义上的Javascript的JSON对象。
从面向对象的角度来讲,一切皆是对象,呵呵。
所以,忘了从哪里扒下来的这个函数,分享出来方便大家使用。
最主要的是给自己加个念想。呵。毕竟曾经学习过。
function evalJson( jsonText )
{/*{{{*/
var jsonObject;
switch(typeof jsonText ){
case 'string':
try{
jsonObject = eval('('+jsonText+')');
}
catch(e){
jsonObject = null;
}
break;
case 'object':
case 'number':
case 'boolean':
case 'function':
jsonObject = jsonText;
}
return jsonObject;
}/*}}}*/
传递过去的参数jsonTest就是通过PHP,json_encode函数处理后的返回结果。
这样,我们就可以用心爱的JSON来处理AJAX返回值了。呵呵。
来源:http://www.xiaoxiaozi.com/2009/04/02/39/
外带4pin转sata电源线
<?php
//IP转换成整数的函数
function IptoInt($ip)
{
$ipa=explode(".",$ip);
$ipn=$ipa[0]*16777216+$ipa[1]*65536+$ipa[2]*256+$ipa[3];
return $ipn;
}
// 整数还原成IP的函数
function InttoIp($value)
{
$bin = decbin($value);
$zeros = 32 - strlen($value);
for($i=0;$i<$zeros;$i++)
$bin = '0'.$bin;
$arr = str_split($bin,8);
$ip='';
for($i=0;$i<count($arr);$i++){
$ip .= bindec($arr[$i]).".";
}
$ip=substr($ip,0,strlen($ip)-1);
return $ip;
}
?>
<?php
echo IptoInt("192.168.0.1");
echo "\n";
echo IptoInt("255.255.255.255");
?>
//IP转换成整数的函数
function IptoInt($ip)
{
$ipa=explode(".",$ip);
$ipn=$ipa[0]*16777216+$ipa[1]*65536+$ipa[2]*256+$ipa[3];
return $ipn;
}
// 整数还原成IP的函数
function InttoIp($value)
{
$bin = decbin($value);
$zeros = 32 - strlen($value);
for($i=0;$i<$zeros;$i++)
$bin = '0'.$bin;
$arr = str_split($bin,8);
$ip='';
for($i=0;$i<count($arr);$i++){
$ip .= bindec($arr[$i]).".";
}
$ip=substr($ip,0,strlen($ip)-1);
return $ip;
}
?>
<?php
echo IptoInt("192.168.0.1");
echo "\n";
echo IptoInt("255.255.255.255");
?>
比如这个:255.255.255.255这个,掏出windows计数器,运行:输入calc
对应二进制是32个1:11111111111111111111111111111111 选择二进制输入32个1:
然后转为十进制:也就是点十进制。
结果为:4294967295
对应二进制是32个1:11111111111111111111111111111111 选择二进制输入32个1:
然后转为十进制:也就是点十进制。
结果为:4294967295
php计算的结果:
[~]# php ip.php
3232235521
4294967295
3232235521
4294967295
说明这个长整形就是这样转的,呵呵。
美国甲骨文总裁艾里克森被母校哈佛大学邀请回校为学弟、学妹们讲述自己的成功之道,结果他的讲演没有结束就被主持人请下了台,终止了他的演讲,为什么呢?我告诉大家一下他演讲的基本内容你就明白为什么了?
“我是甲骨文软件公司创始人艾里克森,现在个人的财富有260亿美圆,我的公司是世界第二大软件公司,我们的业务遍布全球,我在哈佛上大学但是没有毕业,没有得到哈佛的文凭,因为我知道在这里学习不到什么创业立身的东西,什么我自动退学了,你们要想取得像我一样的成绩,你们就不要在这里学习了,赶紧创业吧。其实不只我是这样,全球首富比尔.盖茨在哈佛也没有毕业,苹果公司的史迪夫.乔布斯也没有大学毕业,年轻的迈克尔.戴尔也没有大学毕业就创造了戴尔电脑公司,谷歌公司的两个创办人也没有大学毕业,你们要发财还呆在这里干什么呢?......”
你如果是会议的主持人你也会把这个狂人请下台的,尽管他讲演的内容都是真实的,原因就是在学校你不能鼓动学生退学,否则大学如何办下去?
艾里克森讲的东西是准确的,他没有从理论上总结他们这些人成功的真实原因,我知道他们成功的真实原因:财富与文凭的悖论。
我们如果知道经济的基本原理:市场运行的不确定性,就知道“财富与文凭的悖论”是正确的,
香港的李嘉诚、霍英东、李肇基、郑裕彤等人没有什么大学文凭,可是他们创造财富的能力大家都认可,他们可以左右香港的经济,也为全球的华人挣足了脸面。台湾的王永庆等等一大批创业者有什么文凭?大陆在改革开放后出现的富豪们有几个是大学文凭?如华为公司的任正非,中国大陆有很多高校创办的企业,都是不死不活,没有一个成功的也是一个证明。
市场运行的不确定性决定了创业者必须有天赋和决断能力,这些都不是大学可以叫给你的,这需要历练和思考,经验只能来自于社会。
说的远一点,世界有名望的作家有哪一个是大学文学系毕业的?没有吧。这是我的发现,可能有遗漏,有谁能告诉我哪个著名作家是毕业于大学文学系的?
“富不过三代”有一定的根据,就是后来的企业继承人都受到了良好的教育,在因该决断的时候想的东西与大学学到的东西不一致,要产生犹豫不决的情况,而当他们决断是时机一丧失,决断后产生的后果是一场灾难。说的再简单一点,荣氏家族的两个创办人都没有什么大学问,却创造了世界级的企业,而他们的孙辈都受到了良好的大学教育,现在又如何呢?王安电脑公司在20世纪80年代是世界第二名,仅次于IBM公司,他的继承人受到的教育远远超越他的创办人王安先生,不幸的是公司早已经破产,知道这个公司的人只能是经济史的研究者了。
我说以上话的目的不是说大学教育没有作用,大学教育培养的是管理人员,是按照程序操作的人才,不是创业者,按照程序操作的人好培养,真正能够创业的人很难遇到,而这正是现在中国发展最缺乏的人才,中国的创造能力不足也就可以理解了。
“我是甲骨文软件公司创始人艾里克森,现在个人的财富有260亿美圆,我的公司是世界第二大软件公司,我们的业务遍布全球,我在哈佛上大学但是没有毕业,没有得到哈佛的文凭,因为我知道在这里学习不到什么创业立身的东西,什么我自动退学了,你们要想取得像我一样的成绩,你们就不要在这里学习了,赶紧创业吧。其实不只我是这样,全球首富比尔.盖茨在哈佛也没有毕业,苹果公司的史迪夫.乔布斯也没有大学毕业,年轻的迈克尔.戴尔也没有大学毕业就创造了戴尔电脑公司,谷歌公司的两个创办人也没有大学毕业,你们要发财还呆在这里干什么呢?......”
你如果是会议的主持人你也会把这个狂人请下台的,尽管他讲演的内容都是真实的,原因就是在学校你不能鼓动学生退学,否则大学如何办下去?
艾里克森讲的东西是准确的,他没有从理论上总结他们这些人成功的真实原因,我知道他们成功的真实原因:财富与文凭的悖论。
我们如果知道经济的基本原理:市场运行的不确定性,就知道“财富与文凭的悖论”是正确的,
香港的李嘉诚、霍英东、李肇基、郑裕彤等人没有什么大学文凭,可是他们创造财富的能力大家都认可,他们可以左右香港的经济,也为全球的华人挣足了脸面。台湾的王永庆等等一大批创业者有什么文凭?大陆在改革开放后出现的富豪们有几个是大学文凭?如华为公司的任正非,中国大陆有很多高校创办的企业,都是不死不活,没有一个成功的也是一个证明。
市场运行的不确定性决定了创业者必须有天赋和决断能力,这些都不是大学可以叫给你的,这需要历练和思考,经验只能来自于社会。
说的远一点,世界有名望的作家有哪一个是大学文学系毕业的?没有吧。这是我的发现,可能有遗漏,有谁能告诉我哪个著名作家是毕业于大学文学系的?
“富不过三代”有一定的根据,就是后来的企业继承人都受到了良好的教育,在因该决断的时候想的东西与大学学到的东西不一致,要产生犹豫不决的情况,而当他们决断是时机一丧失,决断后产生的后果是一场灾难。说的再简单一点,荣氏家族的两个创办人都没有什么大学问,却创造了世界级的企业,而他们的孙辈都受到了良好的大学教育,现在又如何呢?王安电脑公司在20世纪80年代是世界第二名,仅次于IBM公司,他的继承人受到的教育远远超越他的创办人王安先生,不幸的是公司早已经破产,知道这个公司的人只能是经济史的研究者了。
我说以上话的目的不是说大学教育没有作用,大学教育培养的是管理人员,是按照程序操作的人才,不是创业者,按照程序操作的人好培养,真正能够创业的人很难遇到,而这正是现在中国发展最缺乏的人才,中国的创造能力不足也就可以理解了。
互联网很大,圈子很小---腾讯凶猛之我见
最近老是有人说我们腾讯,哈哈,我也来写两笔,以凑个热闹, 我个人认为是Tencent有把五个指头握成一个拳头,这五个指头分别是:
1.用户体验,快速迭代
2.数据挖掘是重武器?数据为王
3.重事实,看观点,商业与我如浮云烟
4.低调的华丽,意境方能高远
5.人才储备加公司文化的厚积薄发
-----------------------------------------------------------------------------------------
很多人说腾讯不是一个创新的公司,我觉得我有一点看法,顺便写一下大概:
什么叫创新呢?你创新一个看看,似乎很困难吧?不要为了创新而创新,我们要做有用创新,模仿其本质也是创新,不是吗?超越了前面的对手和产品,那更是创新,是吧!商业本是一个胜者为王的和战争相仿的一个严肃的游戏,创新仅仅是游戏规则中的一个较为重要的环节,而它绝对不是全部,所以,不创新可能失败,但是创新未必成功。
好的产品未必需要标新立异,腾讯赢在用户体验上,它把每个产品都做得稳定好用,这还不够,它要做的是一个平台,一个平台下的精细化服务,原因很简单:用户不会在乎你创新了什么,也不会在乎更不知道谁是原创,谁是模仿,在乎的是好不好用,方便不方便,能不能发掘其内在的需求和人性的一些东西,这就完全足够了。也是其最本质的东西,那就是用户习惯,谁前期修改了用户的习惯,进而演化为良好的用户体验,我想如果一个用户没有什么习惯,就来体验你的产品,那就会对你的产品大打折扣,额外的用户习惯是在潜移默化中培养出来的,需要精细耕作,而超越其他同类产品的能力,那就是腾讯最大的创新,存在即是合理,失败便是零蛋,赢是最终的目的,但它也不是商业的全部归宿,谢谢。 jackxiang
最近老是有人说我们腾讯,哈哈,我也来写两笔,以凑个热闹, 我个人认为是Tencent有把五个指头握成一个拳头,这五个指头分别是:
1.用户体验,快速迭代
2.数据挖掘是重武器?数据为王
3.重事实,看观点,商业与我如浮云烟
4.低调的华丽,意境方能高远
5.人才储备加公司文化的厚积薄发
-----------------------------------------------------------------------------------------
很多人说腾讯不是一个创新的公司,我觉得我有一点看法,顺便写一下大概:
什么叫创新呢?你创新一个看看,似乎很困难吧?不要为了创新而创新,我们要做有用创新,模仿其本质也是创新,不是吗?超越了前面的对手和产品,那更是创新,是吧!商业本是一个胜者为王的和战争相仿的一个严肃的游戏,创新仅仅是游戏规则中的一个较为重要的环节,而它绝对不是全部,所以,不创新可能失败,但是创新未必成功。
好的产品未必需要标新立异,腾讯赢在用户体验上,它把每个产品都做得稳定好用,这还不够,它要做的是一个平台,一个平台下的精细化服务,原因很简单:用户不会在乎你创新了什么,也不会在乎更不知道谁是原创,谁是模仿,在乎的是好不好用,方便不方便,能不能发掘其内在的需求和人性的一些东西,这就完全足够了。也是其最本质的东西,那就是用户习惯,谁前期修改了用户的习惯,进而演化为良好的用户体验,我想如果一个用户没有什么习惯,就来体验你的产品,那就会对你的产品大打折扣,额外的用户习惯是在潜移默化中培养出来的,需要精细耕作,而超越其他同类产品的能力,那就是腾讯最大的创新,存在即是合理,失败便是零蛋,赢是最终的目的,但它也不是商业的全部归宿,谢谢。 jackxiang
mysql> select left(now(),7);
+---------------+
| left(now(),7) |
+---------------+
| 2010-09 |
+---------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-09-21 13:40:37 |
+---------------------+
1 row in set (0.00 sec
+---------------+
| left(now(),7) |
+---------------+
| 2010-09 |
+---------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-09-21 13:40:37 |
+---------------------+
1 row in set (0.00 sec
select left(FTime,10),count(*) from Tbl_User group by left(FTime,10) ;
+----------------+----------+
| left(FTime,10) | count(*) |
+----------------+----------+
| | 1044 |
| 2010-07-21 | 6 |
| 2010-07-22 | 2746 |
| 2010-07-23 | 10273 |
| 2010-07-24 | 7691 |
| 2010-07-25 | 6955 |
| 2010-07-26 | 7622 |
| 2010-07-27 | 2130 |
+----------------+----------+
注意下面查询语句的区别:
mysql> select left(FTime,10),count(*) from Tbl_User group by left(FTime,10) ;
+----------------+----------+
| left(FTime,10) | count(*) |
+----------------+----------+
| | 1 |
| 2010-07-13 | 7 |
| 2010-07-14 | 1 |
| 2010-07-15 | 1 |
| 2010-07-16 | 3 |
| 2010-07-20 | 2 |
| 2010-07-25 | 1 |
+----------------+----------+
7 rows in set (0.00 sec)
mysql> select FTime,count(*) from Tbl_User group by left(FTime,10) ;
+---------------------+----------+
| FTime | count(*) |
+---------------------+----------+
| | 1 |
| 2010-07-13 11:39:45 | 7 |
| 2010-07-14 11:50:20 | 1 |
| 2010-07-15 15:16:20 | 1 |
| 2010-07-16 16:11:39 | 3 |
| 2010-07-20 12:00:31 | 2 |
| 2010-07-25 19:16:08 | 1 |
+---------------------+----------+
FTime类型如下:
`FTime` varchar(32) collate utf8_bin NOT NULL,
所谓德,就是人顺应自然的安排而各有所得,它支配万物,使万物各得其所尽其所能。
所谓仁,就是人与人的亲情关系,它包含慈爱,红会和同情之心,人之亲情顺其产生和形成。
所谓义,就是人所遵循的与实务相适应的原则,根据这种原则,奖赏善者惩罚恶着,从而建立功德,成就事业。
所谓礼,就是人日日身体力行,起早晚睡勤奋实践,形成人于人之间序长幼,别尊卑的一种伦理纲常。
所谓仁,就是人与人的亲情关系,它包含慈爱,红会和同情之心,人之亲情顺其产生和形成。
所谓义,就是人所遵循的与实务相适应的原则,根据这种原则,奖赏善者惩罚恶着,从而建立功德,成就事业。
所谓礼,就是人日日身体力行,起早晚睡勤奋实践,形成人于人之间序长幼,别尊卑的一种伦理纲常。
《素书·原始第一》白话译文
原文:
夫道、德、仁、义、礼,五者一体也。
道者:人之所蹈,使万物不知其所由。
德者:人之所得,使万物各德其所欲。
仁者:人之所亲,有慈慧恻隐之心,以遂其生成。
义者:人之所宜,赏善罚恶,以立功立事。
礼者:人之所履,夙兴夜寐,以成人伦之序。
夫欲为人之本,不可无一焉。 阅读全文
原文:
夫道、德、仁、义、礼,五者一体也。
道者:人之所蹈,使万物不知其所由。
德者:人之所得,使万物各德其所欲。
仁者:人之所亲,有慈慧恻隐之心,以遂其生成。
义者:人之所宜,赏善罚恶,以立功立事。
礼者:人之所履,夙兴夜寐,以成人伦之序。
夫欲为人之本,不可无一焉。 阅读全文
xx对于电脑使用的玩家的常用软件,然后我就学习及深入的研究xx,在这里和大家一起探讨xx的使用方法,希望对大家有用。用MRTG监测Linux系统CPU温度
阅读全文
阅读全文