Server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import socket
import sys
from thread import *

HOST = '' # Symbolic name meaning all available interfaces
PORT = 5555 # Arbitrary non-privileged port
lock = 0
client = 0
data = None
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
#Bind socket to local host and port
try:
s.bind((HOST, PORT))
except socket.error , msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()

print 'Socket bind complete'

#Start listening on socket
s.listen(10)
print 'Socket now listening'

#Function for handling connections. This will be used to create threads
def clientthread(conn, client):
global data, lock
#Sending message to connected client
# conn.send('Welcome to the server. Type something and hit enter\n') #send only takes string

#infinite loop so that function do not terminate and thread do not end.
while True:

#Receiving from client
if client % 2 == 0:
data = conn.recv(1024)
reply = 'OK...' + data
lock = 1
if not data:
break

conn.sendall(reply)
else:
if lock == 1:
conn.sendall(data)
lock = 0


#came out of loop
conn.close()

#now keep talking with the client
while 1:

#wait to accept a connection - blocking call
conn, addr = s.accept()
print 'Connected with ' + addr[0] + ':' + str(addr[1])

#start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function.
start_new_thread(clientthread ,(conn,client,))
client += 1

s.close()

要点:开启多线程的时候多个线程用的代码段是相同的。要想不相同的可以加上lock、client标志进行判断!

Client one:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
import socket

HOST='127.0.0.1'
PORT=5555

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定义socket类型,网络通信,TCP
s.connect((HOST,PORT)) #要连接的IP与端口
while 1:
cmd=raw_input("Please input cmd:") #与人交互,输入命令
s.sendall(cmd) #把命令发送给对端
data=s.recv(1024) #把接收的数据定义为变量
print(data) #输出变量
s.close() #关闭连接
阅读全文 »

datetime是Python处理日期和时间的标准库。

获取当前日期和时间

我们先看如何获取当前日期和时间:

1
2
3
4
5
6
>>> from datetime import datetime
>>> now = datetime.now() # 获取当前datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>

注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。

阅读全文 »

背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

阅读全文 »

算法作用:将一个无序的数组a 按照非降序排序!

算法思想:将a[1] 和 a[0]比较大小,如果比a[0]小,把a[0] 后移一位,插入a[1],然后将a[2]依次和a[1] a[0]比较大小,当比a[2] 小的时候一直后移,然后插入a[2]。 依次循环知道所有元素排序完成!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<malloc.h>
void insertionsort(int *a, int N){
int i = 1;
int j,x;
while (i<N){
int j = i;
x = a[i];
while ((j>0)&&(a[j-1]>x)){
a[j] = a[j-1];
j = j -1;
}
a[j] = x;
i = i+1;
}
}
int main()
{
int N,i;
int *a;
printf("Please input the number of the array:");
scanf("%d", &N);
a = (int* )malloc(N*sizeof(int));
for(i=0; i<N; i++)
scanf("%d",&a[i]);
insertionsort(a, N);
for(i=0; i<N; i++)
printf("%3d",a[i]);
}

算法作用:将一个无序的数组a 按照非降序排序!

算法思想:首先把数组a[] 的第一个元素放在数组 b[]中,然后从a[1]开始和a[0] 进行比较,如果小于a[0],那么跟a[0] 交换,直到将a 中的元素遍历完成。下次循环从a[2]开始依次比较和a[1] 的大小,如果小于a[1],那么跟a[1] 交换,直到将a 中的元素遍历完成。依次执行步骤,直到所有的数据排序完成!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
#include<malloc.h>
void selectionsort(int a[], int N)
{
int i,j,k;
for (i=1; i<N; i++)
{
for (j=i; j<N; j++)
{
if(a[j]<a[i-1])
{
k = a[i-1];
a[i-1] = a[j];
a[j] = k;
}
}
}
}
int main()
{
int N,i;
int *a;
printf("Please input the numbers:");
scanf("%d", &N);
a = (int* )malloc(N*sizeof(int));
for(i=0; i<N; i++)
scanf("%d",&a[i]);

selectionsort(a, N);
for(i=0; i<N; i++)
printf("%d",a[i]);
}

对于数组的形参: int *aint a[]效果相同

函数的声明中,只需要声明函数参数的类型以及参数的个数即可,不必加上参数的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<stdio.h>
#include<malloc.h>
void myprint(int *,int);
void merge(int* a, int p, int q, int r)
{
int s,t,k;
int *b;
int i;
b = (int*)malloc((r-p+1)*sizeof(int));
s = p;
t = q+1;
k = 0;
while ((s<=q)&&(t<=r))
if(a[s]<=a[t])
b[k++] = a[s++];
else
b[k++] = a[t++];
if(s == q + 1)
while (t<=r)
b[k++] = a[t++];
else
while (s<=q)
b[k++] = a[s++];
k = 0;
while (p<=r)
{
a[p++] = b[k++];
}
}
int main()
{
int N,j;
int *a = NULL;
printf("Please input the numbers:");
scanf("%d", &N);
a = (int* )malloc(N*sizeof(int));
for(j=0; j<N; j++)
{
scanf("%d",&a[j]);
}
int s,i;
int t = 1;
while(t<=N)
{
s = t; //s代表是被合并的数组大小,t代表的是合并之后的每一组的数组大小!
t = 2*s;
i = 0; //i代表要合并的下一组的首项的下标
while(i+t<=N)
{
merge(a,i,i+s-1,i+t-1);
i = i+t;
}
if ((i+s)<=(N-1)) // n-1 是最后元素的下标
{
merge(a,i,i+s-1,N-1);
}
}
myprint(a,N);
}
void myprint(int *a , int n){
int i;
for(i = 0; i < n; i++)
printf("%3d",a[i]);
printf("\n");
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
#include<malloc.h>
int Binsearch(int a[],int N,int whichnumber)
{
int low, high, mid,j;
j = -1;
low = 0;
high = N-1;
while ((low <= high)&&(j == -1))
{
mid = (low + high)/2;
if (a[mid] == whichnumber) j = mid+1;
else if (a[mid] > whichnumber) high = mid - 1;
else low = mid + 1;
}
return j;
}
int main()
{
int N,M;
int *a;
char *b;
int i;
printf("Please input the number of the array : ");
scanf("%d ",&N);
a = (int*)malloc(N*sizeof(int));
for (i = 0; i < N; i++)
scanf("%d", &a[i]);

int where,whichnumber;
printf("Please input which number would you want to find :");
scanf("%d", &whichnumber);
where = Binsearch(a, N, whichnumber);
if (where==-1)
{
printf("error!");
}
else
printf("%d",where);
}

算法作用:一个数组a[0,…,p…,q…,r,…],其中子数组a[p,..,q]和a[q+1,…,r]两个数组是升序的数组,通过merge算法将这两个数组合并变成一个升序的数组。

算法思想:将b[]矩阵作为缓冲矩阵,用s,t指向这两个子数组的首元素,然后一次循环比较两个数组的元素大小,将较小的元素赋值给数组b[],直到两个子数组中的其中一个遍历完全。然后把未遍历完的子数组元素赋值给b[]。最后将b[]赋值给a[]。

注意事项:

  • “ = =” 与“ = ” 号的区别!!!“ && ” 和“ & ”的区别!!!
  • 定义一个int型大小为N的数组的时候,例如下面的第7行和第9行,必须声明b为int型的指针,然后指向的位置是一个(r-p+1)*sizeof(int)大小的存储空间,注意这个大小的表达方式,写成b = (int*)malloc(sizeof((r-p+1)*int));这样是不对的!
  • 数组元素一定是从a[0]开始的,例如下面的例子中如果将12行改为k=p。由于b是一个(r-p+1)大小的数组,所以下面的b标号也就从p开始了,但是前面的0到p-1还是占着b的位置的。所以会造成溢出!
  • 注意 ++ 和 = +1的区别!25行到38行的两种表达方式的区别!
  • 对于以后要用到的数据,如果用途不同,要采用赋值的方法解决,比如下面的s,t,k的定义。
  • 数组作为参数的传递,第4行和第57行的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<stdio.h>
#include<malloc.h>

void merge(int a[], int p, int q, int r)
{
int s,t,k;
int *b;
int i;
b = (int*)malloc((r-p+1)*sizeof(int));
s = p;
t = q+1;
k = 0;
while ((s<=q)&&(t<=r))
if(a[s]<=a[t])
b[k++] = a[s++];
else
b[k++] = a[t++];
if(s == q + 1)
while (t<=r)
b[k++] = a[t++];
else
while (s<=q)
b[k++] = a[s++];
k = 0;
while (p<=r)
{
printf("%3d", b[k]);
a[p++] = b[k++];
}
/*
while (p<=r)
{
a[p] = b[k];
printf("%3d", b[k]);
p = p + 1;
k = k + 1;
}
*/
printf("\n");
}
int main()
{
int N,i,p,q,r;
int *a;
printf("Please input the numbers of array:");
scanf("%d", &N);
a = (int* )malloc(N*sizeof(int));
printf("Please input the array:"); //输入的时候注意要输入两个递增的子数列!
for(i=0; i<N; i++)
scanf("%d",&a[i]);
printf("Please input the first begin number:");
scanf("%d", &p);
printf("Please input the first end number:");
scanf("%d", &q);
printf("Please input the second end number:");
scanf("%d", &r);
merge(a,p,q,r);
for (i = 0; i < N; i++)
printf("%3d",a[i]);
return 0;
}

环境变量生效

以修改环境变量“PATH”为例,
修改完成后,进入DOS命令提示符,
输入:set PATH=C:,关闭DOS窗口。
再次打开DOS窗口,输入:echo %PATH%
可以发现“我的电脑”->“属性”->“高级”->“环境变量”中设置的 PATH 值已经生效。

Anaconda环境变量

此电脑->右键选择属性->高级系统设置->环境变量->系统变量->path添加anaconda的安装路径。即可在任意终端中打开python

出现“conda 不是内部命令”的情况,则需要将anaconda安装目录下的Scripts也加入到系统变量中,步骤同上,就可以解决

阅读全文 »

安装VSFTPD

1
yum install vsftpd

启动vsftpd:

1
systemctl start vsftpd.service

设置vsftpd开机自启动:

阅读全文 »