protobuf的使用

Protobuf的安装

正确安装方法:
[http://blog.csdn.net/guoyilongedu/article/details/17093811]
linux下安装protobuf教程+示例
[http://www.cppblog.com/colorful/archive/2012/05/05/173761.html]
Linux 下使用protobuf 几点细节
[http://blog.csdn.net/sky_cn1986/article/details/6092479]

Protobuf的使用

开源中国 Protobuf的使用
[http://my.oschina.net/macwe/blog/157862]

与网络编程的结合

网络编程思考
[http://blog.csdn.net/ciml/article/details/5753367]

libevent和基于libevent的网络编程

1 libevent介绍和安装

介绍

libevent是一个轻量级的基于事件驱动的高性能的开源网络库,并且支持多个平台,对多个平台的I/O复用技术进行了封装,当我们编译库的代码时,编译的脚本将会根据OS支持的处理事件机制,来编译相应的代码,从而在libevent接口上保持一致。

在当前的服务器上,面对的主要问题就是要能处理大量的连接。而通过libevent这个网络库,我们就可以调用它的API来很好的解决上面的问题。首先,可以来回顾一下,对这个问题的传统解决方法。

问题: 如何处理多个客户端连接

解决方案1:I/O复用技术

这几种方式都是同步I/O,即当读写事件就绪,他们自己需要负责进行读写,这个读写过程是阻塞的,而异步I/O则不需要自己负责读写,只需要通知负责读写的程序就可以了。

Linux下mysql的安装和使用(C语言)

1 mysql的安装

我使用的ubuntu在线安装,非常简单,命令为:

sudo apt-get install mysql-client mysql-server

2 mysql命令集合

网络太多了,我就copy一段吧。

1.linux下启动mysql的命令:

mysqladmin start
/ect/init.d/mysql start (前面为mysql的安装路径)

2.linux下重启mysql的命令:

mysqladmin restart
/ect/init.d/mysql restart (前面为mysql的安装路径)

3.linux下关闭mysql的命令:

mysqladmin shutdown
/ect/init.d/mysql shutdown (前面为mysql的安装路径)

4.连接本机上的mysql:
进入目录mysql\bin,再键入命令mysql -uroot -p, 回车后提示输入密码。
退出mysql命令:exit(回车)

5.修改mysql密码:
mysqladmin -u用户名 -p旧密码 password 新密码
或进入mysql命令行SET PASSWORD FOR root=PASSWORD(“root”);

数组和指针问题

int (*a)[n]int *a[n]的区别

int* a[n],说明a是一个指针数组。

这是因为对于a来说,[]的优先级大于*的优先级,所以a是一个数组,同时再看左边,说明a这个数组中的内容都是指针值(地址值)。所以说,a是一个指针数组,即数组内容为指针的这样一个n维的数组。

如果计算a的字节数,则是(n4)字节,每个指针分配4个字节,n个指针构成的数组字节数即为 n\4。

int a[][n]或者int (*a)[n]则根据括号的优先级大于[]的优先级,所以说明a是一个指针,再看右边[],说明这个指针所指向的内容是一个n维的数组。

同理,计算这种情况下a的字节数,则是4个字节,因为这种定义,系统给分配的空间就是一个指针,因为就是4个字节。

接下来,说一说,在什么情况下,会使用上述的两种定义,首先,数组指针的使用。数组指针中可以存放n个指针,因为在定义后,可以将若干个地址放入数组中,然后将数组可以作为参数传递等。

而对于指向数组的指针,则是一种比较典型的数据类型,比如,a[m][n]是一个2维数组,那么a的数据类型就是(*a)[n],而a[0]的数据类型则是一个指针*a,这样在二维或者是多维数组作为实参向函数中进行传递时,则可以定义函数的参数类型为(*a)[n],实参为数组名a。

如何将代码暂时存储到远端

本地使用git push到远端,从远端下载后,再将远端的代码使用git删除。

grep恢复误删除文件内容(转)

在 Linux 上如果事先没有用别名(alias)修改默认的 rm 功能,rm 后文件就会丢失,幸运的是,在一般的删除文件操作中,Linux 并不会立即清空存储该文件的 block 内容,而只会释放该文件所占用的 inode 和 data block,Linux 上 rm 的过程其实就是将 inode bitmap 和 data block bitmap 中的相应标识设为空闲状态的过程,并不涉及到真正的数据,这也是为什么在 Linux 下删除大文件这么快速的原因,因为大文件所占的磁盘根本就没有清空。所以,如果我们能找到文件对应的 inode,由此查到相应的 data block,就可能从磁盘上把已删除的文件恢复出来,很多文件/磁盘恢复工具都是这么做的。

一般来说二进制文件、库文件等删除后都可以从其他 Linux 拷贝恢复,不是很要紧,如果自己辛苦写的脚本或者配置文件误删了就杯具了。误删这种蠢事经常在 VPSee 身上发生,最近一次是在今年年初的时候,开了 screen 多次 ssh 到不同服务器上,在前后切换的过程中删除了一个很肯定的配置文件,后来发现删的文件是对的,可惜在一台错误的服务器上,本来应该在 A 服务器上删除 file.txt 结果在 B 服务器上删除了 file.txt,多个 screen 和 ssh 把自己搞晕了,而且主机名没有安排好,多台机器都是用的 localhost,不利于识别当时的环境。如果使用 Linux 的时候不幸误删了一个文本文件怎么办呢?

先临时建一个文本文件 vpsee.log 做测试,然后删除这个文件:

$ echo "important log file for vpsee.com" > vpsee.log 

$ cat vpsee.log 
important log file for vpsee.com 

$ rm vpsee.log如果能记住刚才删除文件中的某个关键字的话可以用 grep 搜索整个 /dev/sda1,-a 标志位的意思是把 /dev/sda1 这个分区看成是文本形式的(分区本身是二进制形式的),-B 10 -A 100 的意思是如果找到关键字就打印出其前10行和后100行的内容:

grep -a -B 10 -A 100 'vpsee.com' /dev/sda1 > tmp.txt

在一堆 @ 之间可以找到我们刚才删除的内容:

$ vi tmp.txt 


@$^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@Ç^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@È^K^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^Q^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@È^K^@^@×^@
^@^@important log file for vpsee.com
@
@

当然,如果误删了二进制、doc、png/jpg/gif 之类的文件,可以用一些第三方 ext2/ext3 文件恢复工具帮助恢复文件,比如 TestDisk, PhotoRec 等。