Centos 6.X 下编译安装deluge

1.安装更新源.

rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
wget -c -O /etc/yum.repos.d/linuxtech.repo http://pkgrepo.linuxtech.net/el6/release/linuxtech.repo

2.安装依赖库

yum install GeoIP PyXML SOAPpy boost-filesystem boost-python boost-system boost-thread pyOpenSSL python-chardet python-fpconst python-setuptools python-simplejson python-twisted-core python-twisted-web python-zope-filesystem python-zope-interface pyxdg rb_libtorrent rb_libtorrent-python python-beaker python-mako python-markupsafe python-twisted python-twisted-web

3.编译安装deluge

wget http://download.deluge-torrent.org/source/deluge-1.3.6.tar.gz
tar zxvf deluge-1.3.6.tar.gz
cd deluge-1.3.6/

#开始编译
python setup.py build
python setup.py install

#建立账户
/usr/sbin/groupadd deluge
useradd deluge -g deluge -s /bin/false

4.配置启动文件,把以下文件保存为/etc/init.d/deluge-daemon

#!/bin/bash
#
# Startup script for deluged
#
# chkconfig: - 86 14
# description: deluged is the Deluge bit torrent daemon. It manages torrents
# processname: deluged
# pidfile: /var/run/deluged.pid
# config:

# Source function library.
. /etc/init.d/functions

# Get network config
. /etc/sysconfig/network

[ "${NETWORKING}" = "no" ] && exit 0

prog=deluged
prog2=deluge
lockfile=/var/lock/subsys/deluged
lockfile2=/var/lock/subsys/deluge

LANG="zh_CN.UTF-8" 
LANGUAGE="zh_CN.UTF-8:zh_CN.UTF-8:zh_CN" 
SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en" 
SYSFONT="lat0-sun16"
ulimit -HSn 65535

start() {
  echo -n $"Starting deluged service: "
  daemon --user deluge "$prog $OPTIONS"
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile

  echo -n $"Starting deluge web ui: "
  daemon --user deluge "$prog2 --ui web >/dev/null 2>&1 &"
  RETVAL=$(($RETVAL|$?))
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile2

  return $RETVAL
}

stop() {
  echo -n $"Shutting down deluged service: "
  killproc $prog
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $lockfile

  echo -n $"Shutting down deluge web ui: "
  killproc $prog2
  RETVAL2=$?
  echo
  [ $RETVAL2 -eq 0 ] && rm -f $lockfile2

  return $(($RETVAL|$RETVAL2))
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status $prog
        status $prog2
        ;;
  restart)
        stop
        start
        ;;
  reload)
        exit 3
        ;;
  *)
        echo $"Usage: $prog {start|stop|status|restart|reload}"
        exit 1
esac

5.给启动脚本权限&启动deluge

chmod +x /etc/init.d/deluge-daemon
service deluge-daemon start

Centos下编译安装Vnstat.

Vnstat是一个Linux下强大的流量监控软件,使服务器管理员可以使用PHP程序来分析Vnsata的数据库文件来得到可视化的服务器流量图.

1.下载&安装Vnstat

wget http://humdi.net/vnstat/vnstat-1.11.tar.gz
tar zxvf vnstat-1.11.tar.gz
cd vnstat-1.11
make
make install

2.下载&设置init.d启动脚本

wget http://humdi.net/vnstat/init.d/redhat/vnstat -O /etc/init.d/vnstat
chmod +x /etc/init.d/vnstat
service vnstat start
chkconfig vnstat on

3.创建计划任务脚本.

cat << EOF > /usr/sbin/vnstat_dump.sh
#/bin/bash
/usr/bin/vnstat -u -i eth0
EOF

chmod +x /usr/sbin/vnstat_dump.sh

4.设置计划任务
(1).输入crontab -e
(2).加入: */1 * * * * /usr/sbin/vnstat_dump.sh

5.Done

[C++]使用循环输出图形(圆球)

话说这是某次assignment要求要的作业..
P.S: 代码不是我写的,是某个基友算出来的对应关系.

#include
using namespace std;

int main()
{
	for (int i=1; i <= 6; i++)
	{
		for (int k = 1; k <= 10 - (-i*i + 7*i -2) / 2; k++)
			cout << ' ';
		
		for (int j = 1; j <= (-i*i + 7*i -2); j++)
		{
			if((j == 1)||(j == (-i*i + 7*i -2)))
				cout << '*';
			else
				cout << ' ';
		}
		cout << endl;
	}
}

效果图:
20131106220340

[C++]10进制转换二进制(带计算过程)

某次的作业需要我们做10进制到2进制/8进制的转换为了偷懒就随手谢了下面的东西.

#include
using namespace std;

int main()
{
	const int BASE = 2;
	unsigned long num  = 0;
	
	int binaryNum[64] = {0};
	cout << "Enter a number: ";
	cin >> num;
	
	if(!cin.fail() && num > 0)
	{
		int numMod = 0, length = 0;
		while(num != 0)
		{
			numMod = num % BASE;
			binaryNum[length++] = numMod;
			cout << num << " / " <<  BASE << " = " <<
			num / BASE << " + " << numMod << endl;
			num /= BASE;
		}
		
		cout << endl  << "Length: " << length << endl;
		cout << "Result: ";
		for(int i = length-1; i >= 0; i--)
			cout << binaryNum[i];
		cout << endl;
	}
	else
		cerr << "Wrong Input.\n";
 
	return 0;
}

效果图:
20131106214952

Blog搬迁到国内VPS之后的一些吐槽

不知不觉BLOG搬迁到国内的VPS上已经3个多月了. 不得不说,国内电信的VPS对电信的速度真心很快.但是相对的联通和国外线路访问就很悲剧了…….并且在10月之后,中国电信对澳洲TPG几乎熄火,打开Blog的时间增加到5秒以上,而且还伴随着时不时的完全无法访问…ping值常年在390-500之间跳动..

唉,天朝的网络..真心伤不起.

[转]Linux下gcc编译生成动态链接库*.so文件并调用它

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
1、动态库的编译

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。

//so_test.h:
#include “stdio.h”
void test_a();
void test_b();
void test_c();

//test_a.c:
#include “so_test.h”
void test_a()
{
 printf(“this is in test_a…\n”);
}

//test_b.c:
#include “so_test.h”
void test_b()
{
 printf(“this is in test_b…\n”);
}

//test_c.c:
#include “so_test.h”
void test_c()
{
 printf(“this is in test_c…\n”);
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

2、动态库的链接
在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。

test.c:
#include “so_test.h”
int main()
{
test_a();
test_b();
test_c();
return 0;
}
将test.c与动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test
测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
$ ldd test
执行test,可以看到它是如何调用动态库中的函数的。
3、编译参数解析
最主要的是GCC命令行的一个选项:
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.:表示要连接的库在当前目录中

-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

4、注意

调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

在linux下可以用export命令来设置这个值,在linux终端下输入:
export LD_LIBRARY_PATH=/opt/au1200_rm/build_tools/bin: $LD_LIBRARY_PATH:
然后再输入:export
即会显示是否设置正确
export方式在重启后失效,所以也可以用 vim /etc/bashrc ,修改其中的LD_LIBRARY_PATH变量。
例如:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/au1200_rm/build_tools/bin。

 

转自:http://blog.sina.com.cn/s/blog_54f82cc20101153x.html

[转]Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题

linux的硬盘分区程序会自动为root或指定的用户保留一定的磁盘空间默认是5%,在较大的分区或是不重要的分区上这种设置会占据过多不必要的空间, 利用mke2fs的-m reserved-percentage选项可以调整这个设置来获得更多的磁盘空间且不影响性能。而在创建了文件系统之后,用户可以用tune2fs来修 改这个设置比如tune2fs -m 1 /dev/sda4 可以将保留的空间设置为1%

看 mkfs.ext3 的man page,就可以知道原因了,其中有这么一句:
-m reserved-blocks-percentage Specify the percentage of the filesystem blocks reserved for the super-user. This avoids fragmentation, and allows root-owned daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem. The default percentage is 5%.

也就是说,ext文件系统,包括ext2、ext3、ext4都会默认预留5%的磁盘空间,留给root用户维护系统或者记录系统关键日志的时候使用(比如磁盘使用空间已经100%的情况下的处理),这也就是导致普通用户无法使用部分磁盘空间的原因了。

如:

$ df -hl /dev/sda6
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 42G 34G 5.8G 86% /linux/sda6

$ tune2fs -m 0 /dev/sda6
tune2fs 1.41.3 (12-Oct-2008)
Setting reserved blocks percentage to 0% (0 blocks)

$ df -hl /dev/sda6
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 42G 34G 7.9G 81% /linux/sda6

另外一个具体操作过程如下,已经加了详细注释:

–之前的保留区有 732463 块

# tune2fs -l /dev/sda7 | grep "Reserved block count"
Reserved block count:     732463

–已用空间+可用空间 和 总空间 相比,还少了近3个G

# df
文件系统             1K-块      已用      可用 已用% 挂载点
/dev/sda7             57677500  47662588   7085060  88% /home

–调整:

# tune2fs -r 25600 /dev/sda7
tune2fs 1.41.9 (22-Aug-2009)
Setting reserved blocks count to 25600

–再来看看空间

# df
文件系统             1K-块      已用      可用 已用% 挂载点
/dev/sda7             57677500  47662584   9912516  83% /home

–确认调整成功

# sudo tune2fs -l /dev/sda7 | grep "Reserved block count"
Reserved block count:     25600

多了3G多的空间。而且还不是直接完全去掉保留区块,也留了百多兆以防不时之需。

转自: http://li2z.cn/2010/01/08/reserved_block/

Linux下使用Wget下载迅雷离线文件

为了避免会员共享离线下载的链接,迅雷离线下载时要通过cookie验证下载的合法性.wget里提供了载入cookies的方法。但是它所支持的cookies格式是类似于IE导出的cookies数据格式.如果你使用chrome浏览器,可以安装一个叫做edit this cookies的插件,来查找所需要的cookies值.

我们只需要找到gdriveid的值,再按照以下格式保存文件。

.vip.xunlei.com TRUE / FALSE 0 gdriveid B536D3D23A7EB11AC43348D41A132378
需要注意的是字段之间的分隔符是TAB

接下来,在迅雷的离线下载页面里,右键点击你要下载的文件有个,复制下载链接。连接很长,类似下面:

http://gdl.lixian.vip.xunlei.com/download?fid=0IJuQtRoa1UYXuy4PmsWuV8XrRoAoImCAAAAAKxLWWomgtV40ppw2jTWKkZ5BsNx&mid=666&threshold=150&tid=4AA706F5C4D097A6B95929DEFA23EA7B&srcid=4&verno=1&g=AC4B596A2682D578D29A70DA34D62A467906C371&scn=t5&i=E93B029C442F19024AA9EF8FB02AC90B&t=4&ui=517665&ti=240046314242&s=2190057472&m=0&n=01025FBB28696E646F1642BB2C65727665136E972B616E64611355BB3A6E74657211438D2C655F616E056E803E746163650F45812D5F776974096E972F325F7838576E8029645F7831541CD06E3034352E08428B5F00000000&ff=0&co=C6DD0FC61A4D9B3B673C9DF0CB0DA05B&cm=1

后只用wget加载cookie进行下载:

wget -c –load-cookies=”cookie文件” “下载地址” -O 文件重命名

执行命令,就开始正常下载文件。

其中,-c 代表支持断点续传,–load-cookies 加载cookie文件,-O 重命名文件.

例如:

wget -c –load-cookies=”1.c” “http://gdl.lixian.vip.xunlei.com/download?fid=0IJuQtRoa1UYXuy4PmsWuV8XrRoAoImCAAAAAKxLWWomgtV40ppw2jTWKkZ5BsNx&mid=666&threshold=150&tid=4AA706F5C4D097A6B95929DEFA23EA7B&srcid=4&verno=1&g=AC4B596A2682D578D29A70DA34D62A467906C371&scn=t5&i=E93B029C442F19024AA9EF8FB02AC90B&t=4&ui=517665&ti=240046314242&s=2190057472&m=0&n=01025FBB28696E646F1642BB2C65727665136E972B616E64611355BB3A6E74657211438D2C655F616E056E803E746163650F45812D5F776974096E972F325F7838576E8029645F7831541CD06E3034352E08428B5F00000000&ff=0&co=C6DD0FC61A4D9B3B673C9DF0CB0DA05B&cm=1” -O winxp.iso

因为下载链接非常长,会导致文件名过长不能下载的问题 所以需要自定义一个文件名。