思维导图-Mindjet MindManager 14.0.334 让你的思维 变得更清晰

下载地址: http://download.mindjet.com/Mindjet_14.0.334_EN.exe 

简介:

思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却  又极其有效,是一种革命性的思维工具。思维导图运用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来,把主题关键词与图像、颜色等建立记忆链接,思维导图充分运用左右脑的机能,利用记忆、阅读、思维的规律,协助人们在科学艺术逻辑与想象之间平衡发展,从而开启人类大脑的无限潜能。思维导图因此具有人类思维的强大功能。
思维导图是一种将放射性思考具体化的方法。我们知道放射性思考是人类大脑的自然思考方式,每一种进入大脑的资料,不论是感觉、记忆或是想法——包括文字数字、符码、香气、食物、线条、颜色、意象、节奏、音符等,都可以成为一个思考中心,并由此中心向外发散出成千上万的关节点,每一个关节点代表与中心主题的一个连结,而每一个连结又可以成为另一个中心主题,再向外发散出成千上万的关节点,呈现出放射性立体结构,而这些关节的连结可以视为您的记忆,也就是您的个人数据库
 
1.阅读书籍
如果是理论性书籍,很多情况下前后章节连续性不是很强,可以读完一章之后进行一次整理,如果是整体性较强的书籍,并且在短时间内可以阅读完成,可以读完全书一并制作思维导图,这个大家根据实践情况和书籍难度自行判断。
2.构建书籍框架
可以直接将书籍的目录录入到思维导图中,也可以选择比较重要的部分录入。主要的目标是将书籍中最重视的部分框架清晰的反映在思维导图中。
3.录入摘抄和重点内容
将书中的重点论证部分录入思维导图,同时将自己摘录、勾画的部分录入,这个时候不必变更书中原句,简单的录入即可。这时有两种内容,第一种是和书籍框架及论证有关的,放入导图的对应分支下;第二种是与框架无关,可以在导图中建立一个“杂项”的分支,将所有内容统统扔进这个分支下。
4.调整分类方式或框架分析方式
如果读书的目的不是为了了解作者的思路或者纯粹和作者有关的东西,那么绝对不关心作者或者本书的思维框架如何,但是在书中可能关心其中某些部分。比如《如何阅读一本书》中,关心如何做分析阅读,如何做检视阅读,如何做主题阅读,那么可能要做三个主要的分支。
5.将内容和论证放入相应分枝中,完成了整体框架的构建,这时候就是该细化的时候了。
6.细化每个分支的逻辑性和语言
框架已经有了,每个分支下也有了一定内容,但是每个独立分支下的逻辑性并不清楚,需要将书中原话转变成自己理解的话语,尽力简化。同时,将这些句子的逻辑关系理清,用分支的形式体现出来,这时就有了一个层次、逻辑清楚的思维导图了。
7.处理“杂项”中的内容
大家没有忘记杂项中还有很多内容吧,处理一下这些句子,有些内容可以放入前面整理出的框架中,有些东西则和全书整体框架并不相关。
8.将“杂项”内容归档
比如管理一个专门的导图,日常杂项一个导图,谈读书系列一个导图。将杂项中的内容分门别类的归入这些导图中去,不必太过在意构架和体系,可以同样在它们中建立杂项,扔进去就OK了,等到想用的时候再说,到时候不过是一个搜集资料的过程而已。同时,最好注明该条出自哪本书和页码。

 

网络协议学习方法

网络这东西就是一个靠实践的东西,只靠看书是不行的。当年在学校还上过史美林教授/张公忠教授所讲的计算机网络体系结构课,用的是Tanabaum写的那本,考试还得了九十多分,可实际还是连TCP和UDP有什么区别都分不清,就是死记背,到毕业的时候基本上是忘光了,工作后等于重新来过。
      上班了要在Linux做一些底层的网络处理,不得不从头来学Linux和网络,编程部分主要看Richard Stevens的那几本书:APUE、UNP、TCP/IP Illustraion等,学Linux则看得很杂,市面上各种Linux入门书大都翻了一遍,俺是习惯在书店里看书,爱看书而不爱买书,汗,,然后就是去各大BBS、论坛把他们的精华区都下载下来狂看,边看边实践,基本上在一个月内熟悉了Linux的操作。
           学网络协议刚开始也是看书,但看了之后没多少印象,那些东西靠死记真是没法记的,后来找到一个好办法,就是自己写个sniffer,自己写个协议分析器,先学怎么抓包,就看tcpdump的源码,然后看libpcap的源码,知道了什么是网卡的混杂模式,很快就能抓到网卡上包的。接下来就是对包进行分析,就看作TCP/IP Illustraion,从以太头、ARP/IP、ICMP/IGMP/TCP/UDP、HTTP/FTP/TELNET/SMTP等这么一点一点、一个字段一个字段分析下来,很快就明白了所谓TCP/IP到底是怎么回事。另外为了学TCP状态转换表,根据所抓的包的TCP标志分析通信双方当前是什么状态,刚开始还只能从头一方发SYN包开始分析,到后来是可从连接中间包如手就能逐渐判断双方的TCP状态,基本上是彻底搞清楚了TCP的状态转移是怎么回事,后来再理解防火墙的状态检测原理就很容易了。另外在分析过程中,为彻底掌握IP碎片,还特地ping大包来抓,把抓上来的包自己重组,搞明白了IP头的碎片offset字段是怎么用的。
          能抓包后进而又开始学如何自己构造包来“干扰”正常通信了,开始是学怎么发TCP的RST包来切断一个正常的TCP连接,就的学会如何计算IP头校验和,TCP校验和,知道了算TCP校验和时必须加IP伪头数据,然后是正确计算序列号和确认号,知道了原来SYN和FIN标志也是算一位的,最重要的是理解了什么是网络序什么是主机序,现在基本把ntohs(l),htons(l)处理都成了一种编程的本能意识了。学会用RST切断TCP后,进一步实现了直接发一个页面信息告诉客户端访问了非法信息,也就是以后实现URL过滤时客户端显示的拒绝画面。后来也学发ARP信息胡乱通告MAC地址,也就是以前写的那篇ARP攻击的由来。
           后来俺写的这个协议分析器逐步完善,能解析的就解析,不能解析的就打印出16进制数,可打印字符也打印出来,对HTTP、FTP、POP3、SMTP这些文本协议几乎就一下看明白了,对于非文本协议,如DNS,也根据协议解析了出来,而且解析DNS时不得不用了我一向不爱用的递归方法来编程。随着网络应用的增加,在用到前都先作协议解析,除了各种TCP、UDP的协议,还增加了BPDU、PPPOE、OSPF、ESP、AH、IKE等的解析处理,现在俺的协议分析器也可以分析上百种协议,平时抓包就只用俺这个,TCPDUMP基本不再用了,毕竟自己写的自己更清楚,如果有不能解析的再现加进去。现在学新协议时,往往先抓包看看协议的基本数据格式,再看RFC了解细节。
              学协议刚开始是看书,到后来要更深入了解或追询最新发展情况就只能看RFC了,毕竟网络的东西变化太快,书的东西只能算入门,说不定很快就出新的了,到现在也看了数百篇的RFC了。
             通过编程分析来学协议,慢是慢了点,花了一个多月的时间,但感觉学得扎实,正所谓磨刀不误砍柴功,而且一通百通。到现在虽然已经好几年了,IP头,TCP头有哪些字段还是一下就可以说得出来,对理解各种网络攻击原理从而进行防范更是有帮助,我觉得对我来说这种方法是很有效,如果哪位觉得有更有效的学习方法,可以共同交流一下。

基于多线程并发 客户/服务器之间传输各种文件问题研发

由于代码很简单不过多分析。这里需要注意几点:

第一:线程的状态,要设置成分离状态(detached)或者pthread_join()亦可。如果不注意这点并发起来 肯定耗尽资源。

第二:读文件的各种细节问题,如打开模式,正确关闭打开的文件。因为并发启动以后,如果存在大量的打开的文件系统会报错,因为系
     统允许的最大打开文件数是固定的。

第三:提醒各位注意一下 recv()函数在什么情况下才返回-1? 笔者在写代码的时候 忽然发现了个自己一个BUG。在recv()返回-1的时候我一直让那个线程循环调用recv() 但是,recv()返回-1的时候 不是没读到数据或者简单的读取失败,是对方已经关闭了连接才会返回-1.所以不能循环调用 只能直接退出线程。

 

/*************************************************************************
FileName: rcv_send_serv.c
Authour: weizhou
Descripthion: create multiple thread to serve for every client 
Version: 2013/6/1
Function List: SendData()

***************************************************************************/

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <signal.h>
#include <dirent.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <netinet/tcp.h>

#define PORT 28000
#define BACKLOG 5
#define MAXDATASIZE 10000
#define DEBUG 1
#define NAMELEN 40

pthread_mutex_t mutex;
pthread_mutex_t guard_gdata;

int iThreadCount=1010;    /*default htread count*/

char sFilePath[40] = "/home/weizhou/cash/";
int iFileIndex = 1;

void *rtx;

void* start_routine(void* pArg);

int listenfd;

int main(int agrc,char *argv[])
{
       		
     long  lConnectFd;
     pthread_t thread;         //id of thread
     struct sockaddr_in server; //server's address info
     struct sockaddr_in client; //client's
     int sin_size;

     //create tcp socket
     if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
                   perror("creating socket failed.");
                   exit(1);
     }
      
      bzero(&server,sizeof(server));
      server.sin_family = AF_INET;
      server.sin_port = htons(PORT);
      server.sin_addr.s_addr = htonl(INADDR_ANY);
   
      if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {
          
           exit(1);

      }
     

      if(listen(listenfd,BACKLOG) == -1) {

          exit(1);

      }

      sin_size = sizeof(struct sockaddr_in);
    
      while(1)
      {

          if((( lConnectFd = accept(listenfd, (struct sockaddr *)&client, (socklen_t*)&sin_size))) == -1) 
          {
              return -1; 
          }
                                                
         if (( pthread_create(&thread, NULL, start_routine, (void*)(lConnectFd))) !=0)
         {
	      return -1;
         }         

      }

    close(listenfd);
     
    return 0;

}

void* start_routine (void* pArg)
{
    FILE * RcvFile;
    char RcvFileName[40];
    int iRcvSize = 0;
    int iRcvNum;
    int iConnectFd;
    char cRcvBuffer[MAXDATASIZE];
  
    iConnectFd = (long)pArg; 
    if (pthread_detach (pthread_self()) != 0)
    {
    	printf ("pthread_detach run error.\n");
    	return ;
    }
    
	   
    sprintf (RcvFileName, "%sdemo%d.mp3",sFilePath ,iFileIndex++);		
    if ((RcvFile = fopen (RcvFileName, "wb")) == NULL)
    {
    	printf ("fail to open %s : %s.\n", RcvFileName, strerror(errno));
    	printf ("%s\n", strerror(errno));
    	return ;
    }
    
     
     while(1)
     {
          if ((iRcvNum =recv(iConnectFd, cRcvBuffer, MAXDATASIZE, 0)) == -1)
          {
          	printf ("recv error:%s.\n", strerror(errno));
          	fclose (RcvFile);
          	return ;
          }
          
          if (iRcvNum == 0)
          	break;
          	
          iRcvNum = fwrite (cRcvBuffer, sizeof (char), iRcvNum, RcvFile);
          iRcvSize += iRcvNum;
     }
     fclose(RcvFile); 
     printf ("have writed %d bytes in file.\n", iRcvSize);
     return;
}

 

/*************************************************************************
FileName: rcv_send_cli.c
Authour: weizhou
Descripthion: create multiple thread send data to server just like client
Version: 2013/6/1
Function List: SendData()

***************************************************************************/

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <signal.h>
#include <dirent.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <netinet/tcp.h>

#define MAXSIZE 1024
#define PORTNUMBER 28000
#define MAX_LINE 10000
#define SERNUM 1000

pthread_mutex_t mutex;
int iPthreadCount = 0;

char sFileName[40];

int GetFileSize(char* StrFileNaem); /*obtain the size of a file         */
void *SendData(void *arg); /*the routine function in  pthread_creat()   */

int main (const int argc, const char **argv)
{
	struct sockaddr_in serv;
	
	pthread_mutex_init (&mutex, NULL);
	
	int i;
		
	if (argc != 3)
	{
		printf("Usage: <IpAddress> <filename>\n");
		return -1;
	}
		
	bzero (&serv, sizeof(serv));
	serv.sin_port = htons (PORTNUMBER);
	serv.sin_family = AF_INET;
	if (inet_pton (AF_INET, argv[1], &serv.sin_addr) <= 0)
	{
		printf ( "inet_pton error from %s: %s\n", argv[1], strerror(errno) );
		return -1;
	}
	
	strncpy (sFileName, argv[2], 30);	
	for (i=0; i<=SERNUM; i++)
	{
		pthread_t  tempthread_id;
		sleep(7);	
		while (pthread_create (&tempthread_id, NULL, (void *)SendData, (void*)&serv) != 0)
		{
			printf ("create thread error: %s.\n\n", strerror(errno));
		}
	}
	
	printf ("the number of thread is %d.\n", iPthreadCount);
	while(1)
	{
	 	sleep(2);
	}
	
	return 0;
}


void* SendData(void* arg)
{
	int sockfd;
	
	FILE *PSendFile;
	int iSizeOfFile;
	int iSizeCount = 0;
	char SendBuffer[MAX_LINE + 1];
	int iSendLen;
	
	pthread_detach (pthread_self());
	while ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) <= 0 )
	{
		printf ("obtain a socket error: %s.\n\n", strerror(errno));
	} 
	if (connect (sockfd, (struct sockaddr*)arg, sizeof(struct sockaddr_in)) !=0)
	{
		printf ("socket connect error: %s.\n\n", strerror(errno));
		return;
	}
	
	/*get the pointer of file, and determin the size of this file */
	if ((PSendFile = fopen (sFileName,"rb")) == NULL)
	{
		printf("fail to open!: %s\n", strerror(errno));
		return ;
	}
	while (!feof(PSendFile))
	{
		bzero (SendBuffer, MAX_LINE + 1);
		iSendLen = fread (SendBuffer, sizeof(char), MAX_LINE, PSendFile);
		/*printf ("send %d bytes.\n", iSendLen);*/
		if ((iSendLen = send (sockfd, SendBuffer, iSendLen, 0)) == -1)
		{
			printf ("send error!:%s\n", strerror(errno));
			continue;
		}
		iSizeCount += iSendLen;
	}
	if (fclose(PSendFile) != 0)
	{
		printf ("closed error!:%s\n", strerror(errno));
	}
	
	pthread_mutex_lock (&mutex);
	iPthreadCount += 1;
	pthread_mutex_unlock (&mutex);
	printf ("the data has sended is %d bytes.\n", iSizeCount);
	close (sockfd);
	return NULL;
	
}









读计算机专业名著有感

     这几年读的书应该也算不少了,最近花大量的时间去阅读计算机方面比较优秀的书籍,感慨很大。一本好书,一本在你刚刚学习这块知识时候阅读的计算机名著 ,对我们产生的影响是不可估量的。但是名著,他之所以优秀带给我们的绝不是肤浅,折射的面很广,知识量很大,对于我们来说挑战很大。我比较喜欢看一本书整天就扑在上面,但是发现疲倦感让我有时候失去了动力。我觉得作为一个读者,我们付出的不仅需要时间 更需要计划、毅力。一本好书 完完全全读完 不说你在这本书中收获的知识有多少,单是你的毅力就得到了提升。所以读书需要持之以恒,循序渐进,每天都有计划。作为一个IT工作者,我想我们大家需要的正是这种毅力,执着,对陌生东西的接收能力。

    总之跟大家分享的结果是:一本好书,进度稍微慢点不是致命的,致命的是你的计划和毅力。大家可以借着这次计划拿出自己珍藏的那些宝贵的资料实战吧!每天一个单元或者半个单元,坚持下去,几个月后你的收获不仅仅是知识那么简单,而是气质和毅力。