对Perl代码进行编译与加密

我写了一些Perl程序。为了防止程序在传播扩散过程中遭人随意篡改或出售而引起版权纠纷,于是需要对一些程序进行编译和加密处理。

1. 使用perlcc命令对perl代码进行编译

我安装的时CentOS 6系统,该系统中默认能的Perl版本时5.10版本。该版本中取消了perlcc命令以及相应的B::C, B::CC, B::Bytecode等模块。只有不搞于5.9.4版本的perl才会有perlcc命令。详情请见:http://perldoc.perl.org/perl5100delta.html。
perlcc的使用方法(http://search.cpan.org/~nwclark/perl-5.8.9/utils/perlcc.PL):

$ perlcc -o hello hello.pl

2. 使用pp命令对perl代码进行编译

perlcc命令可能对perl代码编译不成功,或成功后不能正常运行。推荐使用pp命令来进行该项工作。

2.1 安装 pp 和 PAR::Filter::Crypto 模块

pp 模块用于perl程序的编译和打包:http://search.cpan.org/~rschupp/PAR-Packer-1.035/lib/pp.pm
PAR::Filter::Crypto 模块用于加密: http://search.cpan.org/~shay/Filter-Crypto-2.07/lib/PAR/Filter/Crypto.pm

$ sudo cpan -i pp
$ sudo cpan -i PAR::Filter::Crypto

2.2 对perl程序进行编译和加密

$ pp -f Crypto -F Crypto -M Filter::Crypto::Decrypt -o hello hello.pl

邮件服务器的简单搭建

1. 邮件服务器域名解析

首先,我在万网上解析域名如下:

记录类型    主机记录    记录值
A           mail        115.29.105.12
MX          @           mail.chenlianfu.com
TXT         @           v=spf1 a mx -all

2. CentOS postfix 设置

然后修改 CetnOS 系统下的 PostFix 的配置文件 /etc/postfix/main.cf , 修改的内容如下:

myhostname = mail.chenlianfu.com
mydomain = chenlianfu.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8, 168.100.189.0/28, hash:/etc/postfix/access
relay_domains = $mydestination
home_mailbox = Maildir/
mail_spool_directory = /var/spool/mail
message_size_limit = 52428800

然后运行如下命令启动 Postfix 服务:

# postmap hash:/etc/postfix/access 
# postalias hash:/etc/aliases
# /etc/init.d/postfix check
# /etc/init.d/postfix restart
# 

3. 使用 mail 命令发送邮件

mail命令参数:

-s subject
    邮件的标题。若标题有空格,则需要使用引号。
-a attachment
    将目标文件作为附件发送。若有多个附件需要发送,则使用多个该参数。
-c address
    抄送副本到邮件地址列表。这些邮件地址使用逗号分隔。抄送的邮件地址和收件人地址能
被所收件地址看到。
-b address
    暗送的邮件地址列表。这些邮件地址使用逗号隔开。暗送的邮件地址不能被其收件地址看
到。故mail命令不能将邮件分别发送到邮件地址列表。

使用例子:

$ mail -s "a e-mail subject" -a ./test.tar.gz chenllianfu@foxmail.com < mail_content
$ cat mail_content | mail -s "a e-mail subject" -a ./test.tar.gz chenllianfu@foxmail.com
$ echo "mail_content" | mail -s "a e-mail subject" -a ./test.tar.gz chenllianfu@foxmail.com
$ mail -s "a e-mail subject" -a ./test.tar.gz chenllianfu@foxmail.com
input
EOT

FileZilla在CentOS系统上的安装

由于编译或使用新版本需要高版本的 GCC 和 wxWidgets,因此,不推荐使用新版本的 FileZilla。Fileilla 官网仅提供了最新版本的下载链接。可以到sourceforge上下载旧版本。

$ wget http://sourceforge.net/projects/filezilla/files/FileZilla_Client/3.5.3/FileZilla_3.5.3_x86_64-linux-gnu.tar.bz2
$ tar jxf FileZilla_3.5.3_x86_64-linux-gnu.tar.bz2 -C /opt/
$ echo 'PATH=$PATH:/opt/FileZilla3/bin/' >> ~/.bashrc
$ source ~/.bashrc 
$ filezilla

Perl多线程的简单例子

perl多线程使用的一个简单例子:同时对多个ip进行ping的命令,检测各个ip地址的响应速度。

#!/usr/bin/perl
use strict;
# 声明调用的模块
use Thread;

my @ips = ("221.141.1.222", "89.46.101.122", "199.200.120.37");

my @threads;
# 创建线程并push到数组中。第一个参数是一个子程序的名字,后面的参数是输入到该子程序的数组内容。
foreach (@ips) {
    push @threads, threads->create(\&ping,$_);
}

# 子程序join到主线程,取得返回值。
foreach (@threads) {
    $_->join();
}

# 子程序,对ip地址ping5次,得到其平均值。
sub ping {
    $_ = shift;
    my $ping_log = `ping -c 5 $_`;
    my @ping_log = split /\n/, $ping_log;
    my $time = 0;
    foreach (@ping_log) {
        $time += $1 if /time=(.*) ms/;
    }
    my $avg_time = $time / 5;
    $time = "na" if $time == 0;
    print "$_\t$avg_time\n";
}

磁盘IO检测工具 iostat 的简单使用说明

1. iostat 的常用例子和常用参数

iostat 的常用例子:

$ iostat -c -d 1 10
$ iostat -c -x -m 1 10
$ iostat -c -x /dev/sda /dev/sdb 1 10
上个命令表示对 /dev/sda 和 /dev/sdb 两个磁盘进行 I/O 统计,每秒统计一次,共统计10次。

iostat 的常用参数:

-c
    显示 CPU 的使用情况
-d
    显示设备的使用情况
-x
    显示扩展统计数据。若设置了 -x 参数,则 -d 参数失效
-k
    使用 Kb 作为单位
-m
    使用 Mb 作为单位

2. iostat 使用注意事项

1. 需要进行多次统计,多次统计的结果是实时的结果。

2. 使用 -c 参数能得到 CPU 的使用统计。 %iowait 表示系统有 I/O request 的 CPU 空闲时间。

3. 使用 -d 参数,其统计结果中 tps(the number of transfers per second) 表示设备每秒的传输次数。

4. 使用 -x 参数, %util 表示磁盘使用率,即处理 I/O request 的时间的比率。该值接近 100%,表明 I/O 成了瓶颈。若此时 CPU 的使用率比预期低,则表示磁盘性能不够,导致 CPU 不能充分利用。

使用 lftp 进行 FTP 数据下载和上传

1. lftp 简介

适合于 FTP 操作的命令和软件比较多。 linux 下操作命令有 ftp, lftp 和 sftp; 图形化界面非常好用的有 FileZilla。 为了便于在服务器上使用命令行来进行便捷的 FTP 操作,我个人喜欢使用 lftp 。

2. lftp 的使用

lftp 的简单例子:
比如,下载测序公司释放的数据:

从诺和致源公司 FTP 站点 ftpdata.novogene.cn 以用户名 Novo_s4VcJc 密码 dpdATZ77 端口 2300 下载测序释放的数据:
$ lftp -e "get -c data/species.reads1.fq.gz; exit" \
  -u Novo_s4VcJc,dpdATZ77 -p 2300 ftpdata.novogene.cn

比如,上传测序原始数据到 NCBI 的 SRA FTP 站点:

$ lftp -e "put raw_data.reads1.fastq; exit" \
  -u sra,VfOiVJn1 -p 21 ftp-private.ncbi.nih.gov

lftp 的参数:

-f file
    执行该文件中的 FTP 命令,执行完毕后退出。
-c cmd
    将 FTP 命令直接写入到该参数后,执行其中的命令后退出。

-u user[,passwd]
    通过该参数输入用户名,同时可以选择输入密码。
-p port
    设置端口。默认为 21。
-e cmd
    在 lftp 命令后给出 FTP 位点, -u 和 -p 参数登录 FTP 后,再执行该参数后的 FTP 命令。 

3. 常用的 FTP 命令

直接在终端中输入 lftp 命令后,进入了 lftp 的操作界面,从而可以使用 FTP 命令进行操作了。

1. open

用于连接 FTP 站点,用法为:

open [-e cmd] [-u user[,pass]] [-p port] host|url

2. pwd 和 lpwd

进入 FPT 站点后, pwd 命令用于显示服务器端的当前工作目录; lpwd 用于显示本地机器上的当前工作目录。

3. ls 和 !ls

进入 FPT 站点后, ls 命令用于列出服务器端的目录内容; !ls 用于列出本地机器上的目录内容。

4. cd 和 lcd

进入 FPT 站点后,cd 命令用于在服务器端切换路径; lcd 用于在本地机器上切换路径。

5. pget

用于从 FTP 上下载数据。该命令能使用多个连接下载数据,从而加大下载速度,但是会增大服务端和网络的负载。用法和参数为:

pget [OPTS] rfile [-o lfile]
-c
    支持续传
-n int
    设置最大的连接数

6. get 和 mget

用于从 FTP 上下载数据。 get 用于下载一个文件, mget 用于下载多个文件。 用法和参数如下:

get [-E] [-a] [-c] [-O base] rfile [-o lfile] ...
mget [-c] [-d] [-a] [-E] [-O base] files

-c
    支持断点续传。
-E
    成功下载后,删除服务器端的数据
-a
    使用 ascii 模式下载,默认为二进制模式下载
-d
    创建和下载文件名一致的文件夹,并将文件保存到文件夹中
-O string
    指定下载文件存放的路径
-o string
    将 get 命令下载数据的数据保存到此文件中

7. put 和 mput

用于将数据上传到服务器端。put用于上传一个文件,mput用于上传多个文件。用法和参数为:

put [-E] [-a] [-c] [-O base] lfile [-o rfile]
mput [-c] [-d] [-a] [-E] [-O base] files

参数和 get/mget 参数一致。

8. mirror
用于将目标文件夹全部下载到指定目录中。其用法和参数如下:

mirror [OPTS] [source [target]]

mirror 的常用参数:
-c
    支持断点续传
-R
    反向 mirror,即将本地文件上传到服务器端
--parallel=N
    同时并行下载 N 个文件
--use-pget=N
    对每个文件使用 pget 下载,并设置 pget 的连接数。

使用Aspera从NCBI或EBI高速下载数据

1. Aspera简介

Aspera提供了大文件高速传输方案,适合于大数据的传输。客服端的使用是免费的。

2. Aspera下载和安装

Aspera下载网页: http://downloads.asperasoft.com/connect2/

$ wget http://d3gcli72yxqn2z.cloudfront.net/connect/bin/aspera-connect-3.5.1.92523-linux-64.tar.gz
$ tar zxf aspera-connect-3.5.1.92523-linux-64.tar.gz
$ sh aspera-connect-3.5.1.92523-linux-64.sh
$ echo 'PATH=$PATH:~/.aspera/connect/bin/' >> ~/.bashrc
$ source ~/.bashrc
$ ascp --help

软件安装在 ~/.aspera/connect/ 目录下。

3. Aspera 的使用

例子,使用 Aspera 高速下载 NCBI或 EBI 上的数据:

$ ascp -T -l 200M -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \
  --host=ftp-private.ncbi.nlm.nih.gov --user=anonftp --mode=recv \
  /sra/sra-instant/reads/ByRun/sra/ERR/ERR105/ERR105009/ERR105009.sra ./
$ ascp -T -l 200M -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \
  anonftp@ftp-private.ncbi.nlm.nih.gov:/sra/sra-instant/reads/ByRun/sra/ERR/ERR105/ERR105009/ERR105009.sra ./

$ ascp -T -l 200M -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \
  --host=fasp.sra.ebi.ac.uk --user=era-fasp --mode=recv \
  /vol1/fastq/ERR105/ERR105009/ERR105009_1.fastq.gz ./
$ ascp -T -l 200M -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \
  era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/ERR105/ERR105009/ERR105009_1.fastq.gz ./

Aspera 的用法和简单参数:

Aspera的用法:
$ ascp [参数] 目标文件 目的地址

Aspera的常用参数:
-T
    不进行加密。若不添加此参数,可能会下载不了。
-i string
    输入私钥,安装 aspera 后有在目录 ~/.aspera/connect/etc/ 下有几个私钥,使用 linux 服务器的时候一般使用 asperaweb_id_dsa.openssh 文件作为私钥。
--host=string
    ftp的host名,NCBI的为ftp-private.ncbi.nlm.nih.gov;EBI的为fasp.sra.ebi.ac.uk。
--user=string
    用户名,NCBI的为anonftp,EBI的为era-fasp。
--mode=string
    选择模式,上传为 send,下载为 recv。
-l string
    设置最大传输速度,比如设置为 200M 则表示最大传输速度为 200m/s。若不设置该参数,则一般可达到10m/s的速度,而设置了,传输速度可以更高。

PostGreSQL 数据库的简单使用

1. PostGreSQL 简介

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。
有人将 PostgreSQL 和 MySQL 作了比较, PostgreSQL 貌似完胜。

2. PostGreSQL 的安装

# yum install postgres*
# /etc/init.d/postgresql start       启动数据库,第一次启动则会初始化数据库。

3. PostGreSQL 的简单使用

参考自: PostgreSQL 8.1 中文文档

3.1 登录 PostGreSQL 的命令

使用 psql 命令登录 PostGreSQL 数据库。
初始化 PostGreSQL 数据库后,则会有名为 postgres 和 tempalte1 的数据库,有一个名为 postgres 的用户,无密码登录。
例如,使用 postgres 用户登录 postgres 数据库

$ psql postgres postgres
psql (8.4.18)
Type "help" for help.

postgres=#

psql的用法与常用参数:

psql [options] [DBNAME [USERNAME]]

DBNAME
    设置要登录的数据库,默认为当前系统用户名
USERNAME
    设置登录数据库的用户,默认为当前系统用户名
-h | --host=HOSTNAME
    设置连接的服务器名,default: localhost
-p | --port=PORT
    设置端口, default: 5432
-U | --username=USERNAME
    设置登录的用户名,默认为当前系统用户名

3.2 简单常用的 postgresql 命令行

登录 postgresql 数据库后,提示符以登录的数据名加等于号表示。此时,可以输入 postgresql 命令行用于辅助数据库操作。这些命令行以 \ 开头。几个简单常用的命令如下:

\c[onnect] DBNAME
    切换数据库
\l[+]
    列举数据库
\dt
    列举表
\d TABLENAME
    查看表的结构
\q
    退出 postgresql
\cd [DIR]
    切换 linux 系统的工作目录
\! [COMMAD]
    执行 linux 系统命令。比如 \! ls --color 用于打印出当前目录的文件名; 但是 \! cd 命令无效。
\?
    展示所 postgresql 的命令行帮助文档
\h CREATE ROLE
    \h 为查看 SQL 命令的帮助信息,以上命令为查看 CREATE ROLE 命令的详细帮助。

3.3 简单常用的 SQL 命令

使用 SQL 语言对 postgresql 的数据库和表进行操作,初学者需要的 SQL 命令:

CREATE DATABASE chado
    创建名为 chado 的数据库
DROP DATABASE chado
    删除名为 chado 的数据库
CREATE ROLE chenlianfu [PASSWORD '123456']
    创建名为 chenlianfu 的用户
DROP ROLE chenlianfu
    删除名为 chenlianfu 的用户

3.4 PostGres 的 linux 命令

在 linux 终端下,可以使用一些命令来操作 PostGres 数据库。

createdb
    创建数据库
createlang
    给数据库安装语言
createuser
    用户创建用户
dropdb
    删除数据库
droplang
    从数据库删除语言
dropuser
    删除用户
initdb
    初始化数据库
pg_dump
    将数据库转换为文本文件,用于备份