cd /usr/ports/editors/vim6
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 安装系统和软件;

通过安装,我们能了解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
对象属性
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/
#include

using namespace std;

int main()
{
       cout << "hello world" << endl;

       return 0;
}


样式1-- http://www.livebaby.cn





样式1









样式二


样式2-- http://www.livebaby.cn





样式2









样式三


样式3 -- http://www.livebaby.cn






样式3








样式四


简写CSS圆角






简写CSS圆角






样式五 哈哈3D的


3D圆角 -- http://www.livebaby.cn






3D圆角









样式六  纯HTML的


html圆角 -- http://www.livebaby.cn
























































html圆角


请教各位高手:如何让Linux在默认情况下登录到命令行,而不是桌面?
改/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]
如何给按钮加上链接功能
解决思路:
按钮属于控件级的对象,优先级比较高,所以不能象图片或文本一样直接加链接,只能通过按钮的单击事件调用脚本的方式来实现。
具体步骤:
   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*" 查找目录
分页: 257/272 第一页 上页 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 下页 最后页 [ 显示模式: 摘要 | 列表 ]