cd /usr/ports/editors/vim6
make
make install
make
make install
内容:
系统标识
时间与日期
多进程编程
1. 系统标识符
a.获得有关的系统信息
#include
int uname( struct utsname * name);// 用 man uname 查看 struct utsname
b.获得系统的名称
#include
int gethostname( char* name, int namelen ); // 成功返回 0, 否则返回 1
例子:
#include<iostream>
#include<unistd.h>
#include<sys/utsname.h>
using namespace std;
int main(){
cout<<"-------------- hostname ------------"<<endl;
char name[ 100 ];
memset( name, 0x00, sizeof( name ) );
gethostname( name, sizeof( name ) );
cout<< name <<endl;
cout<<"-------------- uname ----------------"<<endl;
struct utsname nm;
memset( &nm, 0x00, sizeof( nm ) );
uname( &nm );
cout<<"sysname ="<< nm.sysname <<endl;
cout<<"nodename ="<< nm.nodename <<endl;
cout<<"release ="<< nm.release <<endl;
cout<<"version ="<< nm.version <<endl;
cout<<"machine ="<< nm.machine <<endl;
return 0;
}
2. 时间与日期
4种表示形式:(1)time_t 1970年至今的秒数 (2) struct tm 以结构表示
(3) char * 字符串 (4) formated char* 自定义格式
(1)-->(2) 转换有函数: localtime() // 本地时间 gmtime() // 格林威治时间
(2)-->(1) 转换有函数: mktime()
(1)-->(3) 转换有函数: ctime()
(2)-->(3) 转换有函数: asctime()
(2)-->(4) 转换有函数: strftime()
例子:
#include<iostream>
#include<time.h>
using namespace std;
int main(){
// time() get kernel time
cout<<"-----------time_t-----------"<<endl;
time_t t=0;
time( &t );
cout<< t <<endl;
// time_t --> struct tm, localtime(),gmtime()
// man localtime to see the struct tm
cout<<"-----------struct tm-----------"<<endl;
struct tm *p=NULL;
p=localtime( &t );
cout<<"year:"<< p->tm_year+1900 <<endl; // the number of years since 1900
cout<<"month:"<< p->tm_mon+1 <<endl; // tm_mon ranges 0 to 11
cout<<"day:"<< p->tm_mday <<endl;
// struct tm --> time_t
cout<<"-----------mktime-----------"<<endl;
time_t t1;
t1=mktime( p );
cout<< t1 <<endl;
// time_t --> char *
cout<<"-----------ctime-----------"<<endl;
cout<< ctime( &t ) <<endl;
char ct[ 100 ]; //如果想保持返回值应开辟新空间,不能直接定义指针保存
memset( ct, 0x00, sizeof( ct ) ); //因为ctime的返回值总是在同一空间,下次调用ctime时就会被更改
strcpy( ct, ctime( &t ) );
cout<< ct <<endl;
// struct tm --> char *
cout<<"-----------asctime-----------"<<endl;
cout<< asctime( p ) <<endl;
// struct tm --> formated char*
cout<<"-----------strftime-----------"<<endl;
char ft[ 100 ];
memset( ft, 0x00, sizeof( ft ) );
strftime( ft, sizeof( ft ), "%Y-%m-%d %H:%M:%S", p );
cout<< ft <<endl;
return 0;
}
3.system 函数
#include
int system( const char * string );
执行string 所表示的命令,将产生一个新的进程,system为阻塞函数, 新的进程结束后才继续
例子:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
cout<<"----------begin---------"<<endl;
system("ls -l");
cout<<"----------end-----------"<<endl;
return 0;
}
// 一个简单的shell
#include<iostream>
#include<unistd.h>
using namespace std;
int main(){
char cmd[ 100 ];
memset( cmd, 0x00, sizeof( cmd ) );
while( 1 ){
cout<<"[irini@localhost]#";
cin.getline( cmd,sizeof( cmd ) );
if( strcmp( cmd,"bye" )==0 ) break;
system( cmd );
}
return 0;
}
4. atexit() 函数
#include
int atexit( void (*func) (void) );
登记exit handler,最多可登记32个,在进程退出时最后登记的先调用,最先登记的最后调用
5. exit 与 _exit
* 进程的退出过程:
进程做的事: exit handler( atexit注册的), 关闭IO流,如果申请了堆空间就释放
------------------------------------------------------------------
kernel做的事: 销毁进程空间, 删除进程表中的相应项
* exit 是正常退出,想做进程的,然后进入kernel处理
_exit 是异常退出,直接进入kernel
例子:
#include<iostream>
#include<unistd.h>
using namespace std;
void fn1(){
cout<<"in fn1()..."<<endl;
}
void fn2(){
cout<<"in fn2()..."<<endl;
}
int main(){
atexit( fn1 );
atexit( fn2 );
cout<<"return from main..."<<endl;
//exit( 0 );
_exit( 0 );
}
6. 进程标识符
#include
#include
pid_t getpid(); // 当前进程号
pid_t getppid(); // 得到父进程号
例子:
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
int main(){
cout<<"pid="<<getpid()<<endl;
cout<<"ppid="<<getppid()<<endl;
return 0;
}
7. fork 函数
* 创建一个新进程,这个进程是父进程的完全拷贝,完全拷贝父进程的进程空间,唯一的区别是fork()的返回值不同
返回给父进程的是子进程的pid, 返回给子进程的是0
例子:
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
int main(){
pid_t cid=fork();
if( cid==0 ){
for( int i=0; i<5; i++ ){
cout<<"[child] pid="<<getpid()<<" ppid="<<getppid()<<endl;
sleep( 1 );
}
exit( 0 );
}else if( cid > 0 ){
for( int i=0; i<5; i++ ){
cout<<"[father] pid="<<getpid()<<" cid="<<cid<<endl;
sleep( 1 );
}
exit( 0 );
}else{
cout<<"error"<<endl;
exit( -1 );
}
return 0;
}
* fork后,父子进程相互独立,如果之前父进程申请了一个堆空间,那之后父子进程中的指针值相同吗?
通过程序可验证他们是相同的,但指向的空间是不同,因为进程中分配给指针的不是绝对地址,
是逻辑偏移地址,进程空间中正文段的起始地址是逻辑0
* 如果父进程在子进程之前退出,子进程会被初始化进程(pid=1) 托管
如果子进程在父进程之前退出,子进程不会被销毁,变为僵死进程 Z状态,等待父进程处理
例子:
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
void fn(){
cout<<"in fn()... "<<endl;
}
int main(){
atexit( fn );
pid_t cid=fork();
if( cid==0 ){
for( int i=0; i<5; i++ ){
cout<<"[child] pid="<<getpid()<<endl;
sleep( 1 );
}
exit( 0 );
}else if( cid > 0 ){
cout<<"father exit..."<<endl;
exit( 0 );
}else{
cout<<"error"<<endl;
exit( -1 );
}
return 0;
}
8. wait 和 waitpid 函数
处理结束的子进程,是阻塞函数
#include
#include
pid_t wait( int * statloc );
pid_t waitpid( pid_t pid, int *static, int option );
返回值为子进程的pid
statloc 用于接受终止的子进程的返回状态
option 通常设为0
例子:
#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
using namespace std;
int main(){
pid_t cid=fork();
if( cid==0 ){
sleep( 3 );
cout<<"[child] pid="<<getpid()<<" ppid="<<getppid()<<endl;
exit( 0 );
}else if( cid > 0 ){
cout<<"[father] pid="<<getpid()<<" cid="<<cid<<endl;
int statloc=0;
pid_t id=waitpid( cid, &statloc, 0 );
cout<<"[child] "<< id <<" exited"<<endl;
cout<<"exit value is "<< statloc <<endl;
if( WIFEXITED( statloc ) )
cout<<"value "<<WEXITSTATUS( statloc )<<endl;
else cout<<"signal "<<WTERMSIG( statloc )<<endl;
}else{
cout<<"error"<<endl;
exit( -1 );
}
return 0;
}
9. exec 函数
类似system,建立新的进程,但不新建进程空间,而是把原进程空间清0变成自己的开始执行
则原进程exec之后的代码不在存在,失效
例子:
[code]
#include
#include
using namespace std;
int main(){
cout<<"-------------begin-----------"< //execlp( "ls","ls","-l","-a",NULL ); // 第一个参数为要执行的命令文件名,后面的为命令行参数(从0开始都要写,以NULL结束)
char* argv[]={ "ls","-l","-a",NULL };
execvp( "ls", argv );
cout<<"-------------end-------------"< return 0;
}
系统标识
时间与日期
多进程编程
1. 系统标识符
a.获得有关的系统信息
#include
int uname( struct utsname * name);// 用 man uname 查看 struct utsname
b.获得系统的名称
#include
int gethostname( char* name, int namelen ); // 成功返回 0, 否则返回 1
例子:
#include<iostream>
#include<unistd.h>
#include<sys/utsname.h>
using namespace std;
int main(){
cout<<"-------------- hostname ------------"<<endl;
char name[ 100 ];
memset( name, 0x00, sizeof( name ) );
gethostname( name, sizeof( name ) );
cout<< name <<endl;
cout<<"-------------- uname ----------------"<<endl;
struct utsname nm;
memset( &nm, 0x00, sizeof( nm ) );
uname( &nm );
cout<<"sysname ="<< nm.sysname <<endl;
cout<<"nodename ="<< nm.nodename <<endl;
cout<<"release ="<< nm.release <<endl;
cout<<"version ="<< nm.version <<endl;
cout<<"machine ="<< nm.machine <<endl;
return 0;
}
2. 时间与日期
4种表示形式:(1)time_t 1970年至今的秒数 (2) struct tm 以结构表示
(3) char * 字符串 (4) formated char* 自定义格式
(1)-->(2) 转换有函数: localtime() // 本地时间 gmtime() // 格林威治时间
(2)-->(1) 转换有函数: mktime()
(1)-->(3) 转换有函数: ctime()
(2)-->(3) 转换有函数: asctime()
(2)-->(4) 转换有函数: strftime()
例子:
#include<iostream>
#include<time.h>
using namespace std;
int main(){
// time() get kernel time
cout<<"-----------time_t-----------"<<endl;
time_t t=0;
time( &t );
cout<< t <<endl;
// time_t --> struct tm, localtime(),gmtime()
// man localtime to see the struct tm
cout<<"-----------struct tm-----------"<<endl;
struct tm *p=NULL;
p=localtime( &t );
cout<<"year:"<< p->tm_year+1900 <<endl; // the number of years since 1900
cout<<"month:"<< p->tm_mon+1 <<endl; // tm_mon ranges 0 to 11
cout<<"day:"<< p->tm_mday <<endl;
// struct tm --> time_t
cout<<"-----------mktime-----------"<<endl;
time_t t1;
t1=mktime( p );
cout<< t1 <<endl;
// time_t --> char *
cout<<"-----------ctime-----------"<<endl;
cout<< ctime( &t ) <<endl;
char ct[ 100 ]; //如果想保持返回值应开辟新空间,不能直接定义指针保存
memset( ct, 0x00, sizeof( ct ) ); //因为ctime的返回值总是在同一空间,下次调用ctime时就会被更改
strcpy( ct, ctime( &t ) );
cout<< ct <<endl;
// struct tm --> char *
cout<<"-----------asctime-----------"<<endl;
cout<< asctime( p ) <<endl;
// struct tm --> formated char*
cout<<"-----------strftime-----------"<<endl;
char ft[ 100 ];
memset( ft, 0x00, sizeof( ft ) );
strftime( ft, sizeof( ft ), "%Y-%m-%d %H:%M:%S", p );
cout<< ft <<endl;
return 0;
}
3.system 函数
#include
int system( const char * string );
执行string 所表示的命令,将产生一个新的进程,system为阻塞函数, 新的进程结束后才继续
例子:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
cout<<"----------begin---------"<<endl;
system("ls -l");
cout<<"----------end-----------"<<endl;
return 0;
}
// 一个简单的shell
#include<iostream>
#include<unistd.h>
using namespace std;
int main(){
char cmd[ 100 ];
memset( cmd, 0x00, sizeof( cmd ) );
while( 1 ){
cout<<"[irini@localhost]#";
cin.getline( cmd,sizeof( cmd ) );
if( strcmp( cmd,"bye" )==0 ) break;
system( cmd );
}
return 0;
}
4. atexit() 函数
#include
int atexit( void (*func) (void) );
登记exit handler,最多可登记32个,在进程退出时最后登记的先调用,最先登记的最后调用
5. exit 与 _exit
* 进程的退出过程:
进程做的事: exit handler( atexit注册的), 关闭IO流,如果申请了堆空间就释放
------------------------------------------------------------------
kernel做的事: 销毁进程空间, 删除进程表中的相应项
* exit 是正常退出,想做进程的,然后进入kernel处理
_exit 是异常退出,直接进入kernel
例子:
#include<iostream>
#include<unistd.h>
using namespace std;
void fn1(){
cout<<"in fn1()..."<<endl;
}
void fn2(){
cout<<"in fn2()..."<<endl;
}
int main(){
atexit( fn1 );
atexit( fn2 );
cout<<"return from main..."<<endl;
//exit( 0 );
_exit( 0 );
}
6. 进程标识符
#include
#include
pid_t getpid(); // 当前进程号
pid_t getppid(); // 得到父进程号
例子:
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
int main(){
cout<<"pid="<<getpid()<<endl;
cout<<"ppid="<<getppid()<<endl;
return 0;
}
7. fork 函数
* 创建一个新进程,这个进程是父进程的完全拷贝,完全拷贝父进程的进程空间,唯一的区别是fork()的返回值不同
返回给父进程的是子进程的pid, 返回给子进程的是0
例子:
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
int main(){
pid_t cid=fork();
if( cid==0 ){
for( int i=0; i<5; i++ ){
cout<<"[child] pid="<<getpid()<<" ppid="<<getppid()<<endl;
sleep( 1 );
}
exit( 0 );
}else if( cid > 0 ){
for( int i=0; i<5; i++ ){
cout<<"[father] pid="<<getpid()<<" cid="<<cid<<endl;
sleep( 1 );
}
exit( 0 );
}else{
cout<<"error"<<endl;
exit( -1 );
}
return 0;
}
* fork后,父子进程相互独立,如果之前父进程申请了一个堆空间,那之后父子进程中的指针值相同吗?
通过程序可验证他们是相同的,但指向的空间是不同,因为进程中分配给指针的不是绝对地址,
是逻辑偏移地址,进程空间中正文段的起始地址是逻辑0
* 如果父进程在子进程之前退出,子进程会被初始化进程(pid=1) 托管
如果子进程在父进程之前退出,子进程不会被销毁,变为僵死进程 Z状态,等待父进程处理
例子:
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
void fn(){
cout<<"in fn()... "<<endl;
}
int main(){
atexit( fn );
pid_t cid=fork();
if( cid==0 ){
for( int i=0; i<5; i++ ){
cout<<"[child] pid="<<getpid()<<endl;
sleep( 1 );
}
exit( 0 );
}else if( cid > 0 ){
cout<<"father exit..."<<endl;
exit( 0 );
}else{
cout<<"error"<<endl;
exit( -1 );
}
return 0;
}
8. wait 和 waitpid 函数
处理结束的子进程,是阻塞函数
#include
#include
pid_t wait( int * statloc );
pid_t waitpid( pid_t pid, int *static, int option );
返回值为子进程的pid
statloc 用于接受终止的子进程的返回状态
option 通常设为0
例子:
#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
using namespace std;
int main(){
pid_t cid=fork();
if( cid==0 ){
sleep( 3 );
cout<<"[child] pid="<<getpid()<<" ppid="<<getppid()<<endl;
exit( 0 );
}else if( cid > 0 ){
cout<<"[father] pid="<<getpid()<<" cid="<<cid<<endl;
int statloc=0;
pid_t id=waitpid( cid, &statloc, 0 );
cout<<"[child] "<< id <<" exited"<<endl;
cout<<"exit value is "<< statloc <<endl;
if( WIFEXITED( statloc ) )
cout<<"value "<<WEXITSTATUS( statloc )<<endl;
else cout<<"signal "<<WTERMSIG( statloc )<<endl;
}else{
cout<<"error"<<endl;
exit( -1 );
}
return 0;
}
9. exec 函数
类似system,建立新的进程,但不新建进程空间,而是把原进程空间清0变成自己的开始执行
则原进程exec之后的代码不在存在,失效
例子:
[code]
#include
#include
using namespace std;
int main(){
cout<<"-------------begin-----------"<
char* argv[]={ "ls","-l","-a",NULL };
execvp( "ls", argv );
cout<<"-------------end-------------"<
}
1 安装系统和软件;
通过安装,我们能了解Linux的目录结构;系统和软件的安装方法,以及基本目录、文件和用的操作,没有比这些更基础的吧。
2 对硬件的安装和维护;
Linux是个系统,我们得把她用起来才能达到我们的目的。在生产、生活和或者娱乐中的应用,最能体现她的价值。比如我们要让Linux支持 scsi ;raid ;usb; firewire; mouse; video card;TV card 等,无非就是应用。比如我有鼠标,在我的Linux中却用不起来,是不是有点浪费??
3 用户管理;
Linux是一个多用户,多任务的系统,要让很多人能同时用这台机器的Linux,我们不得不经常对用户进行增加或者删除。有的弟兄可能会说,我的机器上只有一个显示器一套键盘和鼠标,怎么让更多的用户应用呢??可能初学Linux的弟兄可能早就明白了,比如 web服务器,是不是多用户的呢??ftp服务器也应该是多用户的吧。咱们不是有远程登录ssh 和telnet吗?这个多用户可不是一台机器,几个人同时挤在同一个键盘和显示器上用不同用户名登录系统。
4 磁盘管理;
磁盘是有限的,就是再大的磁盘需要管理。因为我们都是玩家,再大的磁盘也感觉小。我现在有160的磁盘,我感觉还是不够用,所以要把有限的空间都利用上,还得对磁盘有个计划。。比如限制用户家目录空间;限制用户上传文件大小;定时查看磁盘分区的利用率 。管理员经常用 fdisk -l 或者 df -h du -h 查来看分区,目录的大小等
5 检测系统状态;
有时学习Linux的弟兄总是问“为什么我的机器开机这么慢?”;“Linux真的是浪费内存,对不对?”等。其实这些问题都涉及到系统监测。比如 CPU、内存、网络利用率等。因为生产型系统是必须有效率的。如果一台服务器反应迟钝,可能最急的是管理员。管理员首先要做的可能是查看系统运行状态。比如用top ; sar ; netstat等 ;
6 安全和备份;
对于生产型的系统,没有比安全更重要了。如果发现安问题,可能管理员首要做的就是停止相应的服务,查看日志,执行备份,以及打补丁。
世上没有绝对安全的东西,硬件的可靠性没有百分之分的,Linux系统也不是百分之百的安全。每天进行日常备份还是极为必要的。比如我们把重要的数据用备份到一个较为安全的地方,比如磁带机,本地机,或者网络上的计算机上。
7 灾难恢复;
有了备份,才能有恢复之说,如果没有备份,那就只能是一切从头开始了。我想大家在玩自己的机器时也有所体会吧。灾难只能说是天灾了,真的遇到了灾难,咱们不能怨天忧人了。骂什么或者怪自己太大意都没有用,我们做的只能是自己承受,能恢复多少算多少吧。只要每天都用心尽力了,恢复还不是太大的问题。
8 网络管理;
Internet 是最流行的,自从我们在学校的BBS和恐龙MM聊天开始,可能我们就懂得了Internet的强大,虽然在学校可能是校园网,但我们还是感觉到了网的神秘。在电视中,我们经常看到七八十岁的老爷爷和老奶奶运指如飞,对着显示器聊的不亦乐乎。这就是net的魅力。我们可以在LinuxSir上聊天灌水,也是net的魅力。在LinuxSir的后面呢???这就是我们所要谈到的,管理和版所要做的,比如web服务器架设,FTP 、 IRC 、防火墙的架设;网络基本操作。比如简的设置IP,IP追踪; whois 这个ip是从如来的,各种网络服务器进程查看等 。
9 系统管理与日志分析;
这个概念有些大,有的人也把系统管理看上最高点,把用户管理;磁盘管理;网络管理;安全都纳入这个关健词之中。这也是有道理的。因为这么多的管理都是密不可分的,离了哪个都不行。当然还有好多的零活让我们来做,比如系统优化,内核编译等。系统管理概念比较大,麻烦事也比较多。以后在各部份一步一步的让初学Linux的弟兄体验体验,可能有的弟兄早就体验过了,只是不知道他就是在体验系统管理 。
日志分析对于我们了解系统运行还是极有帮助的,否则有人攻击我们的机器都不知道,那不麻烦了?通过分析日志,我们能得到硬件及各种软件的运行状态,以及他们配合的是否正常等。系统中的每个服务都有日志,这对于我们找出系统运行中出现故障有极大的帮助。有时发现问题比解决问题更难,我相信初学 Linux的弟兄慢慢就明白这个道理了。
10 开发:
玩Linux的最高境界,可能就是开发了。现在我还是处于对系统的学习阶段,所以不能写出什么开发的经验之谈。一想到自己能造出一个发行版自己用用,也是件高兴的事。
加油吧。。。。。。弟兄们!
通过安装,我们能了解Linux的目录结构;系统和软件的安装方法,以及基本目录、文件和用的操作,没有比这些更基础的吧。
2 对硬件的安装和维护;
Linux是个系统,我们得把她用起来才能达到我们的目的。在生产、生活和或者娱乐中的应用,最能体现她的价值。比如我们要让Linux支持 scsi ;raid ;usb; firewire; mouse; video card;TV card 等,无非就是应用。比如我有鼠标,在我的Linux中却用不起来,是不是有点浪费??
3 用户管理;
Linux是一个多用户,多任务的系统,要让很多人能同时用这台机器的Linux,我们不得不经常对用户进行增加或者删除。有的弟兄可能会说,我的机器上只有一个显示器一套键盘和鼠标,怎么让更多的用户应用呢??可能初学Linux的弟兄可能早就明白了,比如 web服务器,是不是多用户的呢??ftp服务器也应该是多用户的吧。咱们不是有远程登录ssh 和telnet吗?这个多用户可不是一台机器,几个人同时挤在同一个键盘和显示器上用不同用户名登录系统。
4 磁盘管理;
磁盘是有限的,就是再大的磁盘需要管理。因为我们都是玩家,再大的磁盘也感觉小。我现在有160的磁盘,我感觉还是不够用,所以要把有限的空间都利用上,还得对磁盘有个计划。。比如限制用户家目录空间;限制用户上传文件大小;定时查看磁盘分区的利用率 。管理员经常用 fdisk -l 或者 df -h du -h 查来看分区,目录的大小等
5 检测系统状态;
有时学习Linux的弟兄总是问“为什么我的机器开机这么慢?”;“Linux真的是浪费内存,对不对?”等。其实这些问题都涉及到系统监测。比如 CPU、内存、网络利用率等。因为生产型系统是必须有效率的。如果一台服务器反应迟钝,可能最急的是管理员。管理员首先要做的可能是查看系统运行状态。比如用top ; sar ; netstat等 ;
6 安全和备份;
对于生产型的系统,没有比安全更重要了。如果发现安问题,可能管理员首要做的就是停止相应的服务,查看日志,执行备份,以及打补丁。
世上没有绝对安全的东西,硬件的可靠性没有百分之分的,Linux系统也不是百分之百的安全。每天进行日常备份还是极为必要的。比如我们把重要的数据用备份到一个较为安全的地方,比如磁带机,本地机,或者网络上的计算机上。
7 灾难恢复;
有了备份,才能有恢复之说,如果没有备份,那就只能是一切从头开始了。我想大家在玩自己的机器时也有所体会吧。灾难只能说是天灾了,真的遇到了灾难,咱们不能怨天忧人了。骂什么或者怪自己太大意都没有用,我们做的只能是自己承受,能恢复多少算多少吧。只要每天都用心尽力了,恢复还不是太大的问题。
8 网络管理;
Internet 是最流行的,自从我们在学校的BBS和恐龙MM聊天开始,可能我们就懂得了Internet的强大,虽然在学校可能是校园网,但我们还是感觉到了网的神秘。在电视中,我们经常看到七八十岁的老爷爷和老奶奶运指如飞,对着显示器聊的不亦乐乎。这就是net的魅力。我们可以在LinuxSir上聊天灌水,也是net的魅力。在LinuxSir的后面呢???这就是我们所要谈到的,管理和版所要做的,比如web服务器架设,FTP 、 IRC 、防火墙的架设;网络基本操作。比如简的设置IP,IP追踪; whois 这个ip是从如来的,各种网络服务器进程查看等 。
9 系统管理与日志分析;
这个概念有些大,有的人也把系统管理看上最高点,把用户管理;磁盘管理;网络管理;安全都纳入这个关健词之中。这也是有道理的。因为这么多的管理都是密不可分的,离了哪个都不行。当然还有好多的零活让我们来做,比如系统优化,内核编译等。系统管理概念比较大,麻烦事也比较多。以后在各部份一步一步的让初学Linux的弟兄体验体验,可能有的弟兄早就体验过了,只是不知道他就是在体验系统管理 。
日志分析对于我们了解系统运行还是极有帮助的,否则有人攻击我们的机器都不知道,那不麻烦了?通过分析日志,我们能得到硬件及各种软件的运行状态,以及他们配合的是否正常等。系统中的每个服务都有日志,这对于我们找出系统运行中出现故障有极大的帮助。有时发现问题比解决问题更难,我相信初学 Linux的弟兄慢慢就明白这个道理了。
10 开发:
玩Linux的最高境界,可能就是开发了。现在我还是处于对系统的学习阶段,所以不能写出什么开发的经验之谈。一想到自己能造出一个发行版自己用用,也是件高兴的事。
加油吧。。。。。。弟兄们!
一直用着vi,有朋友劝我用vim,那么它们有什么区别呢?
简单点来说,它们都是多模式编辑器,
不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,
而且还有一些新的特性在里面。
vim的这些优势主要体现在以下几个方面:
1、多级撤消
我们知道在vi里,按 u只能撤消上次命令,而在vim里可以无限制的撤消。
2、易用性
vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。
3、语法加亮
vim可以用不同的颜色来加亮你的代码。
4、可视化操作
就是说vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。
5、对vi的完全兼容
某些情况下,你可以把vim当成vi来使用。
[Last Modified By songzi, at 2006-08-07 14
简单点来说,它们都是多模式编辑器,
不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,
而且还有一些新的特性在里面。
vim的这些优势主要体现在以下几个方面:
1、多级撤消
我们知道在vi里,按 u只能撤消上次命令,而在vim里可以无限制的撤消。
2、易用性
vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。
3、语法加亮
vim可以用不同的颜色来加亮你的代码。
4、可视化操作
就是说vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。
5、对vi的完全兼容
某些情况下,你可以把vim当成vi来使用。
[Last Modified By songzi, at 2006-08-07 14
对象属性
document.title //设置文档标题等价于HTML的<title>标签
document.bgColor //设置页面背景色
document.fgColor //设置前景色(文本颜色)
document.linkColor //未点击过的链接颜色
document.alinkColor //激活链接(焦点在此链接上)的颜色
document.vlinkColor //已点击过的链接颜色
document.URL //设置URL属性从而在同一窗口打开另一网页
document.fileCreatedDate //文件建立日期,只读属性
document.fileModifiedDate //文件修改日期,只读属性
document.fileSize //文件大小,只读属性
document.cookie //设置和读出cookie
document.charset //设置字符集 简体中文:gb2312
---------------------------------------------------------------------
对象方法
document.write() //动态向页面写入内容
document.createElement(Tag) //创建一个html标签对象
document.getElementById(ID) //获得指定ID值的对象
document.getElementsByName(Name) //获得指定Name值的对象
---------------------------------------------------------------------
images集合(页面中的图象)
a)通过集合引用
document.images //对应页面上的<img>标签
document.images.length //对应页面上<img>标签的个数
document.images[0] //第1个<img>标签
document.images[i] //第i-1个<img>标签
b)通过nane属性直接引用
<img name="oImage">
document.images.oImage //document.images.name属性
c)引用图片的src属性
document.images.oImage.src //document.images.name属性.src
d)创建一个图象
var oImage
oImage = new Image()
document.images.oImage.src="/1.jpg"
同时在页面上建立一个<img>标签与之对应就可以显示
<html>
<img name=oImage>
<script language="javascript">
var oImage
oImage = new Image()
document.images.oImage.src="/1.jpg"
</script>
</html>
----------------------------------------------------------------------
forms集合(页面中的表单)
a)通过集合引用
document.forms //对应页面上的<form>标签
document.forms.length //对应页面上<form>标签的个数
document.forms[0] //第1个<form>标签
document.forms[i] //第i-1个<form>标签
document.forms[i].length //第i-1个<form>中的控件数
document.forms[i].elements[j] //第i-1个<form>中第j-1个控件
b)通过标签name属性直接引用
<form name="Myform"><input name="myctrl"></form>
document.Myform.myctrl //document.表单名.控件名
-----------------------------------------------------------------------
<html>
<!--Text控件相关Script-->
<form name="Myform">
<input type="text" name="oText">
<input type="password" name="oPswd">
<form>
<script language="javascript">
//获取文本密码框的值
document.write(document.Myform.oText.value)
document.write(document.Myform.oPswd.value)
</script>
</html>
-----------------------------------------------------------------------
<html>
<!--Select控件相关Script-->
<form name="Myform">
<select name="oSelect">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</form>
<script language="javascript">
//遍历select控件的option项
var length
length=document.Myform.oSelect.length
for(i=0;i<length;i++)
document.write(document.Myform.oSelect[i].value)
</script>
<script language="javascript">
//遍历option项并且判断某个option是否被选中
for(i=0;i<document.Myform.oSelect.length;i++){
if(document.Myform.oSelect[i].selected!=true)
document.write(document.Myform.oSelect[i].value)
else
document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")
}
</script>
<script language="javascript">
//根据SelectedIndex打印出选中的option
//(0到document.Myform.oSelect.length-1)
i=document.Myform.oSelect.selectedIndex
document.write(document.Myform.oSelect[i].value)
</script>
<script language="javascript">
//动态增加select控件的option项
var oOption = document.createElement("OPTION");
oOption.text="4";
oOption.value="4";
document.Myform.oSelect.add(oOption);
</script>
<html>
-----------------------------------------------------------------------
<Div id="oDiv">Text</Div>
document.all.oDiv //引用图层oDiv
document.all.oDiv.style
document.all.oDiv.style.display="" //图层设置为可视
document.all.oDiv.style.display="none" //图层设置为隐藏
/*document.all表示document中所有对象的集合
只有ie支持此属性,因此也用来判断浏览器的种类*/
document.title //设置文档标题等价于HTML的<title>标签
document.bgColor //设置页面背景色
document.fgColor //设置前景色(文本颜色)
document.linkColor //未点击过的链接颜色
document.alinkColor //激活链接(焦点在此链接上)的颜色
document.vlinkColor //已点击过的链接颜色
document.URL //设置URL属性从而在同一窗口打开另一网页
document.fileCreatedDate //文件建立日期,只读属性
document.fileModifiedDate //文件修改日期,只读属性
document.fileSize //文件大小,只读属性
document.cookie //设置和读出cookie
document.charset //设置字符集 简体中文:gb2312
---------------------------------------------------------------------
对象方法
document.write() //动态向页面写入内容
document.createElement(Tag) //创建一个html标签对象
document.getElementById(ID) //获得指定ID值的对象
document.getElementsByName(Name) //获得指定Name值的对象
---------------------------------------------------------------------
images集合(页面中的图象)
a)通过集合引用
document.images //对应页面上的<img>标签
document.images.length //对应页面上<img>标签的个数
document.images[0] //第1个<img>标签
document.images[i] //第i-1个<img>标签
b)通过nane属性直接引用
<img name="oImage">
document.images.oImage //document.images.name属性
c)引用图片的src属性
document.images.oImage.src //document.images.name属性.src
d)创建一个图象
var oImage
oImage = new Image()
document.images.oImage.src="/1.jpg"
同时在页面上建立一个<img>标签与之对应就可以显示
<html>
<img name=oImage>
<script language="javascript">
var oImage
oImage = new Image()
document.images.oImage.src="/1.jpg"
</script>
</html>
----------------------------------------------------------------------
forms集合(页面中的表单)
a)通过集合引用
document.forms //对应页面上的<form>标签
document.forms.length //对应页面上<form>标签的个数
document.forms[0] //第1个<form>标签
document.forms[i] //第i-1个<form>标签
document.forms[i].length //第i-1个<form>中的控件数
document.forms[i].elements[j] //第i-1个<form>中第j-1个控件
b)通过标签name属性直接引用
<form name="Myform"><input name="myctrl"></form>
document.Myform.myctrl //document.表单名.控件名
-----------------------------------------------------------------------
<html>
<!--Text控件相关Script-->
<form name="Myform">
<input type="text" name="oText">
<input type="password" name="oPswd">
<form>
<script language="javascript">
//获取文本密码框的值
document.write(document.Myform.oText.value)
document.write(document.Myform.oPswd.value)
</script>
</html>
-----------------------------------------------------------------------
<html>
<!--Select控件相关Script-->
<form name="Myform">
<select name="oSelect">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</form>
<script language="javascript">
//遍历select控件的option项
var length
length=document.Myform.oSelect.length
for(i=0;i<length;i++)
document.write(document.Myform.oSelect[i].value)
</script>
<script language="javascript">
//遍历option项并且判断某个option是否被选中
for(i=0;i<document.Myform.oSelect.length;i++){
if(document.Myform.oSelect[i].selected!=true)
document.write(document.Myform.oSelect[i].value)
else
document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")
}
</script>
<script language="javascript">
//根据SelectedIndex打印出选中的option
//(0到document.Myform.oSelect.length-1)
i=document.Myform.oSelect.selectedIndex
document.write(document.Myform.oSelect[i].value)
</script>
<script language="javascript">
//动态增加select控件的option项
var oOption = document.createElement("OPTION");
oOption.text="4";
oOption.value="4";
document.Myform.oSelect.add(oOption);
</script>
<html>
-----------------------------------------------------------------------
<Div id="oDiv">Text</Div>
document.all.oDiv //引用图层oDiv
document.all.oDiv.style
document.all.oDiv.style.display="" //图层设置为可视
document.all.oDiv.style.display="none" //图层设置为隐藏
/*document.all表示document中所有对象的集合
只有ie支持此属性,因此也用来判断浏览器的种类*/
下载:firebug1.0-beta.zip
怎么说呢,强就一个字啦~NND,上面这个图是我开到了 Ispect 状态,鼠标移动时截下来的。这比看源文件然后再搜索可是方便的太多了,这个世界是怎么了,还有这样的雷峰存在,真是太BT了~
大家用一用就知道了~
https://addons.mozilla.org/en-US/firefox/addon/1843
他的官网是:http://getfirebug.com/
作为开发人员,这个查看cookie的玩意也不能少啊,Firecookie - 给Firebug尝尝甜饼的味道,下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/6683
如果你要开发ajax程序,建议你安装一个FirePHP的Firefox插件,调试想当的方便,在friendfeed上找到的了这个名为FirePHP的Firefox插件,是基于Firebug的一个扩展,可以用来在Firebug的console中方便的输出php的调试信息又不影响php程序的正常运行
下载地址:http://www.firephp.org/
你如果想在ie下玩firebug,请查看我的这篇文章:http://www.xiangdong.org/blog/post/1120/
如果想在IE下玩firecookie,请先安装httpwatcher,然后firefox访问:https://addons.mozilla.org/en-US/firefox/addon/6683
如果想在firefox调用ie浏览器的内核看网页,请安装插件:IE TAB:https://addons.mozilla.org/zh-CN/firefox/addon/1419 ,但是请注意,用IE TAB转换到IE浏览后,再打开firebug,好像就不可以使用它了。。。,还是用firefox内核,要不就跑到ie下用ie的插件。。。(网网由于设置IE TAB一些网站由IE打开,在通过firebug 调试的时候忘记了,还以为firebug挂了呢!!!汗)
fiddler2(能查看flash socket通讯)
DNS Flusher
Firefinder for Firebug
Firefinder for Firebug 是用来在 Firebug 环境中搜素匹配的 CSS 或者 根据XPath 表达式来搜索对应元素。
Fxspy-一款类似于Firebug调试Flex2.0/3.0应用的Firefox插件
Fxspy-一款类似于Firebug调试Flex2.0/3.0应用的Firefox插件
Firebug只可以调试Html/Ajax ,Fxspy可以调试Flex2.0/3.0,不了解是否可以调试4.0,估计有Fxspy时候,还没有4.0,有待测试,不过感觉问题不大
大家可以从这里获得
http://code.google.com/p/fxspy/
怎么说呢,强就一个字啦~NND,上面这个图是我开到了 Ispect 状态,鼠标移动时截下来的。这比看源文件然后再搜索可是方便的太多了,这个世界是怎么了,还有这样的雷峰存在,真是太BT了~
大家用一用就知道了~
https://addons.mozilla.org/en-US/firefox/addon/1843
他的官网是:http://getfirebug.com/
作为开发人员,这个查看cookie的玩意也不能少啊,Firecookie - 给Firebug尝尝甜饼的味道,下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/6683
如果你要开发ajax程序,建议你安装一个FirePHP的Firefox插件,调试想当的方便,在friendfeed上找到的了这个名为FirePHP的Firefox插件,是基于Firebug的一个扩展,可以用来在Firebug的console中方便的输出php的调试信息又不影响php程序的正常运行
下载地址:http://www.firephp.org/
你如果想在ie下玩firebug,请查看我的这篇文章:http://www.xiangdong.org/blog/post/1120/
如果想在IE下玩firecookie,请先安装httpwatcher,然后firefox访问:https://addons.mozilla.org/en-US/firefox/addon/6683
如果想在firefox调用ie浏览器的内核看网页,请安装插件:IE TAB:https://addons.mozilla.org/zh-CN/firefox/addon/1419 ,但是请注意,用IE TAB转换到IE浏览后,再打开firebug,好像就不可以使用它了。。。,还是用firefox内核,要不就跑到ie下用ie的插件。。。(网网由于设置IE TAB一些网站由IE打开,在通过firebug 调试的时候忘记了,还以为firebug挂了呢!!!汗)
fiddler2(能查看flash socket通讯)
DNS Flusher
Firefinder for Firebug
Firefinder for Firebug 是用来在 Firebug 环境中搜素匹配的 CSS 或者 根据XPath 表达式来搜索对应元素。
Fxspy-一款类似于Firebug调试Flex2.0/3.0应用的Firefox插件
Fxspy-一款类似于Firebug调试Flex2.0/3.0应用的Firefox插件
Firebug只可以调试Html/Ajax ,Fxspy可以调试Flex2.0/3.0,不了解是否可以调试4.0,估计有Fxspy时候,还没有4.0,有待测试,不过感觉问题不大
大家可以从这里获得
http://code.google.com/p/fxspy/
#include
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
样式1
样式二
样式2
样式三
样式3
样式四
简写CSS圆角
样式五 哈哈3D的
3D圆角
样式六 纯HTML的
html圆角 | ||||||
请教各位高手:如何让Linux在默认情况下登录到命令行,而不是桌面?
改/etc/inittab
id:5:initdefault为
id:3:initedfault
这个好像有人问过的
改/etc/inittab
id:5:initdefault为
id:3:initedfault
这个好像有人问过的
问题的提出是源于 这位兄弟的BLOG,在他的这个实现中,Python具有相当不错的性能,不但优于帖子中的C实现性能,也优于随后的跟贴中众多的C++实现的性能。
在经过了多次尝试,我还是很难找出一个优于Python性能的实现。这不是一件正常的事情,Python的性能注定不会优于C/C++,这是因为Python是解释执行的,解释的过程必然会消耗CPU时间,所以我查阅了Python的源码试图找出为何Python对于这个任务有如此好的性能的原因。
任务描述如下
对于一个78W行的文本文件,每一行是一个Email地址,文件中存在有重复的行,任务的要求是尽可能快的从这个文本文件生成一个无重复的Email的文本文件
一些相关的实现,可以参看这个地址
有如下的三个问题需要注意
对于这种大量的字符串比较,直接使用字符串比较函数是严重妨碍性能的
IO性能是要注意的
尽可能的少使用占用内存
在我的尝试中,发现重复调用 ofstream::operator<< 是比较影响性能的,而使用 fprintf或使用copy 等 STL 算法输出到则性能好的多。使用一种好的Hash算法是影响程序性能的关键。任务中的EMail字符串总是具有[a-z]*[0-9]*@([a-z]*\.)+[a-z]* 的形式,例如 joson123@sina.com.cn joson72345@sina.com.cn 的格式。
在$PySrc/Objects/dictobject.c 中,对Python的Hash机制作了一些描述,总的来说,Python的Hash机制对于这种连续型的字符串有相当好的离散度,对于这个 78W 例子,python_hash() % 780000能够很均匀的分散到各个值,最大的冲突数为 8。 以下是按照类似 Python的 Hash算法实现的 C++ 版本的结果
E:\Workspace\Temp\Email>my 经过了1687.5000毫秒 E:\Workspace\Temp\Email>my 经过了1718.7500毫秒 E:\Workspace\Temp\Email>my 经过了1671.8750毫秒 E:\Workspace\Temp\Email>my 经过了1656.2500毫秒 E:\Workspace\Temp\Email>py_email.py 2.82014641526 E:\Workspace\Temp\Email>py_email.py 2.74879181572 E:\Workspace\Temp\Email>py_email.py 2.76348586203 E:\Workspace\Temp\Email>dir *.txt 2006-03-28 13:09 19,388,869 email.txt 2006-03-29 22:51 17,779,266 email_new.txt (py_email.py 写出) 2006-03-29 22:50 17,779,266 email_new_my.txt (my.exe 写出)
py_email.py 的实现参看这里 my.cpp 实现如下 使用 cl /O2 /EHsc /D_CRT_SECURE_NO_DEPRECATE my.cpp 编译
#include <cstdio> #include <windows.h> using namespace std; #define c_mul(a, b) (a * b & 0xFFFFFFFF) size_t python_hash(const char * str) { size_t value = str[0] << 7; size_t len = 0; while(*str != 0) { value = c_mul(1000003, value) ^ *str++; len++; } value = value ^ len; if (value == (size_t)-1) value = (size_t)-2; return value; } size_t hash(const char * str, size_t seed = 1) { size_t h = 0, g; size_t len = 0; while (*str) { h = (h << 4) + *str++; if ((g = (h & 0xF0000000))) { h = h ^ (g >> 24); h = h ^ g; h = h ^ seed; } len++; } return h; } #define MAX_TABLE_SIZE (780000) #define MAX_CONFI 9 struct hash_item { size_t items[MAX_CONFI]; size_t item_count; hash_item() { item_count = 0; } bool check_has(const char * str) { size_t key = hash(str); for(size_t i = 0; i < item_count; i++) { if (items[i] == key) return true; } items[item_count++] = key; return false; } }; int main( void ) { __int64 t1, t2; GetSystemTimeAsFileTime( (LPFILETIME)&t1 ); FILE * fin = fopen("email.txt", "r"); FILE * fout = fopen("email_new_my.txt", "w+"); size_t hash_key_a = 0; size_t hash_key_b = 0; size_t pos_x = 0; size_t pos_y = 0; const char * buffer = NULL; char line[255]; fgets(line, 255, fin); hash_item * table = new hash_item[MAX_TABLE_SIZE]; while(!feof(fin)) { buffer = line; hash_key_a = python_hash(buffer); pos_x = hash_key_a % MAX_TABLE_SIZE; if (!table[pos_x].check_has(buffer)) fprintf(fout, "%s", buffer); fgets(line, 255, fin); } GetSystemTimeAsFileTime( (LPFILETIME)&t2 ); printf( "经过了%I64d.%04I64d毫秒\n", (t2-t1)/10000, (t2-t1)%10000 ); fclose(fin); fclose(fout); delete [] table; }
[url=http://wiki.woodpecker.org.cn/moin/BPUG]啄木鸟Python开源社区 [/url]
在经过了多次尝试,我还是很难找出一个优于Python性能的实现。这不是一件正常的事情,Python的性能注定不会优于C/C++,这是因为Python是解释执行的,解释的过程必然会消耗CPU时间,所以我查阅了Python的源码试图找出为何Python对于这个任务有如此好的性能的原因。
任务描述如下
对于一个78W行的文本文件,每一行是一个Email地址,文件中存在有重复的行,任务的要求是尽可能快的从这个文本文件生成一个无重复的Email的文本文件
一些相关的实现,可以参看这个地址
有如下的三个问题需要注意
对于这种大量的字符串比较,直接使用字符串比较函数是严重妨碍性能的
IO性能是要注意的
尽可能的少使用占用内存
在我的尝试中,发现重复调用 ofstream::operator<< 是比较影响性能的,而使用 fprintf或使用copy 等 STL 算法输出到则性能好的多。使用一种好的Hash算法是影响程序性能的关键。任务中的EMail字符串总是具有[a-z]*[0-9]*@([a-z]*\.)+[a-z]* 的形式,例如 joson123@sina.com.cn joson72345@sina.com.cn 的格式。
在$PySrc/Objects/dictobject.c 中,对Python的Hash机制作了一些描述,总的来说,Python的Hash机制对于这种连续型的字符串有相当好的离散度,对于这个 78W 例子,python_hash() % 780000能够很均匀的分散到各个值,最大的冲突数为 8。 以下是按照类似 Python的 Hash算法实现的 C++ 版本的结果
E:\Workspace\Temp\Email>my 经过了1687.5000毫秒 E:\Workspace\Temp\Email>my 经过了1718.7500毫秒 E:\Workspace\Temp\Email>my 经过了1671.8750毫秒 E:\Workspace\Temp\Email>my 经过了1656.2500毫秒 E:\Workspace\Temp\Email>py_email.py 2.82014641526 E:\Workspace\Temp\Email>py_email.py 2.74879181572 E:\Workspace\Temp\Email>py_email.py 2.76348586203 E:\Workspace\Temp\Email>dir *.txt 2006-03-28 13:09 19,388,869 email.txt 2006-03-29 22:51 17,779,266 email_new.txt (py_email.py 写出) 2006-03-29 22:50 17,779,266 email_new_my.txt (my.exe 写出)
py_email.py 的实现参看这里 my.cpp 实现如下 使用 cl /O2 /EHsc /D_CRT_SECURE_NO_DEPRECATE my.cpp 编译
#include <cstdio> #include <windows.h> using namespace std; #define c_mul(a, b) (a * b & 0xFFFFFFFF) size_t python_hash(const char * str) { size_t value = str[0] << 7; size_t len = 0; while(*str != 0) { value = c_mul(1000003, value) ^ *str++; len++; } value = value ^ len; if (value == (size_t)-1) value = (size_t)-2; return value; } size_t hash(const char * str, size_t seed = 1) { size_t h = 0, g; size_t len = 0; while (*str) { h = (h << 4) + *str++; if ((g = (h & 0xF0000000))) { h = h ^ (g >> 24); h = h ^ g; h = h ^ seed; } len++; } return h; } #define MAX_TABLE_SIZE (780000) #define MAX_CONFI 9 struct hash_item { size_t items[MAX_CONFI]; size_t item_count; hash_item() { item_count = 0; } bool check_has(const char * str) { size_t key = hash(str); for(size_t i = 0; i < item_count; i++) { if (items[i] == key) return true; } items[item_count++] = key; return false; } }; int main( void ) { __int64 t1, t2; GetSystemTimeAsFileTime( (LPFILETIME)&t1 ); FILE * fin = fopen("email.txt", "r"); FILE * fout = fopen("email_new_my.txt", "w+"); size_t hash_key_a = 0; size_t hash_key_b = 0; size_t pos_x = 0; size_t pos_y = 0; const char * buffer = NULL; char line[255]; fgets(line, 255, fin); hash_item * table = new hash_item[MAX_TABLE_SIZE]; while(!feof(fin)) { buffer = line; hash_key_a = python_hash(buffer); pos_x = hash_key_a % MAX_TABLE_SIZE; if (!table[pos_x].check_has(buffer)) fprintf(fout, "%s", buffer); fgets(line, 255, fin); } GetSystemTimeAsFileTime( (LPFILETIME)&t2 ); printf( "经过了%I64d.%04I64d毫秒\n", (t2-t1)/10000, (t2-t1)%10000 ); fclose(fin); fclose(fout); delete [] table; }
[url=http://wiki.woodpecker.org.cn/moin/BPUG]啄木鸟Python开源社区 [/url]
如何给按钮加上链接功能
解决思路:
按钮属于控件级的对象,优先级比较高,所以不能象图片或文本一样直接加链接,只能通过按钮的单击事件调用脚本的方式来实现。
具体步骤:
1.在原窗口打开链接
<input type="button"
value="闪吧" onClick="location=’http://www.flash8.net’">
<button onClick="location.href=’http://www.flash8.net’">闪吧</button>
<form action="http://www.flash8.net"><input type="submit" value="打开链接"></form>
2.在新窗口中打开链接
<input type="button"
value="闪吧" onClick="window.open(’http://www.flash8.net’)">
<button onClick="window.open(’http://www.flash8.net’)">闪吧</button>
<form action="http://www.flash8.net"
target="_blank"><input type="submit" value="打开链接"></form>
注意:onClick调用的代码里的引号在只有一重时可以单双嵌套,超过两重就必须用"\"号转义且转义的引号必须跟里层的引号一致,如:
<button onClick="this.innerHTML=’<font color=\’red\’>http://www.flash8.net</font>’">闪吧</button>
或
<button onClick=’this.innerHTML="<font color=\"red\">http://www.flash8.net</font>"’>闪吧</button>
而下面都是错误的写法:
<button onClick="this.innerHTML=’<font color=’red’>http://www.flash8.net</font>’">闪吧</button>
<button onClick="this.innerHTML=’<font color="red">http://www.flash8.net</font>’">闪吧</button>
<button onClick="this.innerHTML=’<font color=\"red\">http://www.flash8.net</font>’">闪吧</button>
提示:大部分属于window或document对象的方法和属性都可以省略前缀window或document,比如说本例中的location.href(location.href又可以简写为location,因为location的默认对象为href)就是window.location.href或document.location.href的省略式写法。
技巧:本例中还可以用下面的方法来代替location.href
location.replace(url)
location.assign(url)
navigate(url)
特别提示
第一步中的代码运行后,单击按钮将跳转到链接目标。而第二步的在单击按钮后将在新窗口中打开链接。
特别说明
本例主要是通过用onClick捕获用户在按钮上的单击事件,然后调用location对象的href方法或window对象的open方法来打开链接。另外一个技巧是通过提交表单来实现链接功能,按钮必须是type=submit类型的按钮,表单的action值就是链接目标,target值就是链接打开的目标方式。
解决思路:
按钮属于控件级的对象,优先级比较高,所以不能象图片或文本一样直接加链接,只能通过按钮的单击事件调用脚本的方式来实现。
具体步骤:
1.在原窗口打开链接
<input type="button"
value="闪吧" onClick="location=’http://www.flash8.net’">
<button onClick="location.href=’http://www.flash8.net’">闪吧</button>
<form action="http://www.flash8.net"><input type="submit" value="打开链接"></form>
2.在新窗口中打开链接
<input type="button"
value="闪吧" onClick="window.open(’http://www.flash8.net’)">
<button onClick="window.open(’http://www.flash8.net’)">闪吧</button>
<form action="http://www.flash8.net"
target="_blank"><input type="submit" value="打开链接"></form>
注意:onClick调用的代码里的引号在只有一重时可以单双嵌套,超过两重就必须用"\"号转义且转义的引号必须跟里层的引号一致,如:
<button onClick="this.innerHTML=’<font color=\’red\’>http://www.flash8.net</font>’">闪吧</button>
或
<button onClick=’this.innerHTML="<font color=\"red\">http://www.flash8.net</font>"’>闪吧</button>
而下面都是错误的写法:
<button onClick="this.innerHTML=’<font color=’red’>http://www.flash8.net</font>’">闪吧</button>
<button onClick="this.innerHTML=’<font color="red">http://www.flash8.net</font>’">闪吧</button>
<button onClick="this.innerHTML=’<font color=\"red\">http://www.flash8.net</font>’">闪吧</button>
提示:大部分属于window或document对象的方法和属性都可以省略前缀window或document,比如说本例中的location.href(location.href又可以简写为location,因为location的默认对象为href)就是window.location.href或document.location.href的省略式写法。
技巧:本例中还可以用下面的方法来代替location.href
location.replace(url)
location.assign(url)
navigate(url)
特别提示
第一步中的代码运行后,单击按钮将跳转到链接目标。而第二步的在单击按钮后将在新窗口中打开链接。
特别说明
本例主要是通过用onClick捕获用户在按钮上的单击事件,然后调用location对象的href方法或window对象的open方法来打开链接。另外一个技巧是通过提交表单来实现链接功能,按钮必须是type=submit类型的按钮,表单的action值就是链接目标,target值就是链接打开的目标方式。
find . -name "changeusr*"
find . -type d -name "app*" 查找目录
find . -type d -name "app*" 查找目录