rsync断点续传

网络传输速度很大程度上会影响我的工作。服务器与服务器之间的通连,有时scp不是最好的选择,例如:网络出现问题,两个服务器之间的连接断开后,使用scp再次连接时无法进行断点续传。

使用rsync做服务器之间的文件传输(备份),可以做到断点续传。

rsync -avzP -e 'ssh -p 8888' abc@xxx.xxx.xxx.xxxx:/home/abc/filename ./

wget并行下载

-P 8八线程,-t 0无限重试,-nv 下载时只显示更新和出错信息,不显示指令的详细执行过程

就是输入的地址urls.txt,每一行用一个wget命令进行下载,一次最多同时下载8个文件。

xargs -P 8 -n 1 wget -nv -c -t 0 <urls.txt

wget下载动态连接的文件

wget -c 'http://some.site.com/download?id=234&status=download' -O output_filename

随时上网检索一下,上面这个方法不一定每个动态连接的文件都能下载,例如google网盘的。

aria2分段下载大文件

-s 3 分成3份,-x 3 用3个连接从服务器下载文件

aria2c  -s 3 -x 3 "https://baidu.com/d/datadump.current.zip"

bypy将百度云盘数据下载到服务器

安装信息:(bypy)[https://github.com/houtianze/bypy]

测试发现,大文件上传比慢。文件只能上传到全部文件>apps>bypy这个文件夹。

下载一系列FTP上的文件

这是压箱底的老程序,filetype这里其实不需要使用一个循环,如果只有一个类型的话,直接在下载的循环中用grep筛出这个变量。

#!/bin/bash

for filetype in pdf; 
do 
  for net in `grep "$filetype" file.list2 | sed "s/\<td\>\<a href=\"//g" | sed "s/\"//g" | sed "s/<TD//g"`; 
  do 
    if [ ! -f $net ]
    then
    echo $net
    #wget  $path/$net
    fi
  done
done

接上篇内容,翻倒远古时期用MATLAB写的Fibonacci数列第N项的计算方法,直觉上写一个递归函数就可以搞定问题,但是其计算时间复杂度是O(2^n)

当然,如果需要降低时间复杂度,应该写成循环的形式。我一开始以为自己写的就是递归函数的版本,查着资料,写着博客,猛然发现自己写的就是循环。

%古老的脚本,从第三项开始计算数列的内容
function y=Fibonacci(k)
    a=[1 1];
        for i=3:k
        a(i)=a(i-1)+a(i-2);
        end
    y=a(k);
end

如果还想偷懒,可以写成矩阵计算的样子。

\[\begin{bmatrix}f_{n+1} \\ f_{n}\end{bmatrix}=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\cdot\begin{bmatrix}f_{n} \\ f_{n-1}\end{bmatrix}\]
function y=Fibonacci(n)
  a=[1 0];
  b=[1 1;1 0];
  y=a*b^(n)*[0;1];
end

到这里,其实还没进入我想说的内容。我为了查询Fibonacci数列的算法,搜索了一些资源,基本总结有4种方法(递归,循环,矩阵,通项),最后一种就是用通项公式进行计算。

看到第四种方法时,我懵了,Fibonacci数列还有通项公式?等我再看到通项公式的内容,才发现,这个公式在高中时期就已经学过了。对于公式的内容,自己一直没有记住过。温故知新,这次从头学了一遍通项公式的计算。

具体方法,即从上面的矩阵方法中,求\(\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\)的特征值和特征向量,然后带回到方程中,已知\(f_{0}=\begin{bmatrix}1 \\ 0\end{bmatrix}\) 然后可求通项1

网上还有一些初级数学的方法可以求解,但是我忘记高中时候是怎么推导的了(很可能是用差分方法),如果有机会,翻翻之前的笔记,尽量找出来。


最近在整理硬盘时发现了一个久远的代码文件夹,里面有我从大学开始写的数学计算程序和研究生时期的一些处理数据的脚本。回顾了一下,发现数学相关的程序很多都记不清算法了,研究生时期的脚本写得又特别的青涩(low)╮( ̄▽ ̄)╭

img

为了腾出几M的硬盘空间。我决定把一些常用的方法都挪到博客上,温故知新,重新学习一遍(学了也会忘记的,不经常用的方法是不会记在脑内的,就当个松鼠,收集整理好,存在网络上)。

有些完全没有技巧性的,我就挪到英文博客了。中文博客记录一些可以展开说明的内容。

如无特殊说明,所有程序均按照初期使用的语言编写,其中MATLAB替换成Octave,Python是3.6以上版本,R是最新版本,Perl语言用Perl5,c和c++用电脑里GCC最新版,操作系统是CentOS或者Fedora。

在这里,还要说一下写代码的习惯,最开始的时候,仗着自己用Linux系统,我连代码程序文件的后缀.pl.sh都不写,这样造成的重大问题是,光看文件名,我自己都不清楚这个程序是用什么语言写的。 在自己研究生时期的研究工作硬盘彻底报废的时候,抢救回来的数据,很多都是文本格式的乱码,如果当时写了文件名后缀,那么在数据恢复的时候,软件可以根据后缀来选择恢复的数据类型。

其次,写代码要有注释,下面是一个规范的有注释的MATLAB代码。我的其他MATLAB代码,都没写注释,由于MATLAB都是矩阵运算,读起来就很费力了。

function dijkstra(V,o)
%V为邻接矩阵,o为零点标号,输出向量d是零点到每个点的距离
A=V;%定义可变矩阵
[m,n]=size(A);
d=zeros(1,m);%零点到个点的距离
d(:)=inf;
Q=A(o,:);%零点所在行的矩阵
d(o)=0;%零点到零点的距离为0
p=10;%循环标志
while(min(Q)~=inf&p~=0)%判断条件矩阵为inf或距离没有inf项时停止
    [a id]=min(Q);%求最小值及其标号
    Q(id)=inf;%消去已经求出的值
    A(o,id)=inf;%消去已经求出的值
    o=id;%转换行列
    if d(id)>a%所求距离比已知小的时候代换
        d(id)=a;
    end
    for j=1:m%改写矩阵的距离
        if (Q(j)>d(id)+A(id,j))
            Q(j)=d(id)+A(id,j);
        end
    end
    p=0;%循环标志设0值
    for i=1:m%检查是否有inf项
        if d(i)==inf
            p=p+1;
        end
    end
end
d
end

最后,程序里要写metainfo,例如编写时间,修改时间,修改内容,作者,联系方式等等。尤其在开源软件中,写metainfo会方便记录代码是否有多人进行维护(有点类似于git commit)

2020年5月3日再次提醒自己,写代码一定要有注释,否则,你根本不记得自己三个月前写了什么。。


一开始学生物信息分析的时候,知道BED格式中染色体坐标系是从0开始的。用久了各种工具,突然有一天发现SAM和BAM格式的染色体坐标系起始位置是不一样的。猛然间发现生物信息学的分析工具中各种坐标不统一。 读了一些英文资料,觉得有必要在博客里记录一下各种坐标系的位置关系。

以0为起点

sequence A C G T A  
0-based 0 1 2 3 4 5

以1为起点

sequence A C G T A  
1-based 1 2 3 4 5 6

除了其实为点的坐标位置不同,终止位置的坐标是否包括最后一个位置,在不同的格式和工具里也是不一样的。

例如上面序列中的GTA的坐标位置:

以0为起始位点,包含最后一个位置: 2-4

以1为起始位点,包含最后一个位置: 3-5

以1为起始位点,不包含最后一个位置: 3-6

下面记录一些工具的染色体坐标系定义位置:

  1. 以0为起始位点:SAM, VCF, GFF 和 Wiggle 格式
  2. 以1为起始位点:BAM, BCFv2 和 PSL 格式
  3. Ensembl:以1为起始位点,包含最后一个位置。https://asia.ensembl.org/info/docs/api/core/core_tutorial.html
  4. UCSC Genome Browser:内部表示,以0为起始位点,并用以1为起始位点时的终止位点(程序员为了编程方便煞费苦心)。外部显示,以1为起始位点。http://genome.ucsc.edu/FAQ/FAQtracks.html#tracks1
  5. BED 格式:以0为起始位点,不包含最后一个位置。BED格式经常使用,在分析中别弄错起始位置和终点位置非常重要 http://genome.ucsc.edu/FAQ/FAQformat.html#format1
  6. MAF 格式:以1为起始位点,包含最后一个位置。

参考文献

  1. Chromosome coordinate systems: 0-based, 1-based

去年同朋友一起去他家乡的某地做调研,想了解基因检测以及基因相关技术在家乡的应用情况。去了之后简直是大开眼间。我生长在大城市里,对于地级市、县这些都没有什么概念,更别提对什么农作物和畜牧业的了解为零。在短短的一个周末,我们参观了一家全国知名的奶牛养殖基地,一家猪肉加工企业,当地种子站,妇幼保健院以及当地医院。参观完感觉自己就是个土鳖,什么都不懂。

奶牛养殖

奶牛养殖是通过让奶牛不间断怀孕产犊而实现的。一般产奶从产犊后15-20天开始,到2个月左右到达高峰,10个月后基本停止。每年有2个月的停奶期,母牛在产犊3个月后就会再次人工控制怀孕,怀孕周期大致为10个月,产犊前是停奶期(也就是休息的时间)。一头奶牛一天产奶量大约在5公斤到10公斤左右。一头奶牛一般会连续产奶5年,然后被淘汰掉。国内引进的奶牛大多是荷斯坦奶牛,也有一部分娟珊牛(体型稍小)。牧场的机械化管理系统也都是从欧洲进口的,流水线上可以自动称重,自动挤奶。母牛的配种也是进口精子,然后用电泳的方式过滤掉大部分Y染色体,只让母牛怀孕产小母牛,但是这种方法还是会有一定比例的公牛被产下来,这种公牛一般不会养殖很久,直接进入后续加工环节,变成商品。看完了整个生产过程,我突然理解了一些素食主义者连牛奶都不喝的原因,一头牛五年连续产犊、产奶,若把这个类比到人身上得多恐怖。

可爱的娟珊奶牛

猪肉加工

国家对于从俄罗斯过来得猪瘟控制非常严格,如果发现病猪,方圆20里的猪都要被扑杀,给养猪户带来的损失还是比较大的。现在都是现代化工厂养猪,建工厂的地方也有很多要求,不能挨着居民区,水源,以免造成污染。银行对于发放评审企业的贷款,是一件很tricky的事情,如果你的企业真的缺钱亏损,需要贷款自救,这种情况下是拿不到贷款的,银行怕企业还不上钱。企业盈利状态下想贷款,就要做账,把自己变成亏损的状态,但是地方上都清楚你这个企业是可以还清贷款的,所以银行才会借钱给你。另外猪肉加工企业老板让我们这些科研民工见识了什么是能说会道。

种子站

分子育种,转基因是绕不开的话题,如果我问你,我们国内的销售的粮食里有没有转基因水稻和小麦?答案是没有。国家不批准任何的转基因食用农作物进入生产消费渠道,除非是一些人为因素造成的泄漏。所以也不存在用什么国内产的转基因大豆炸油,转基因大豆都是国外进口的。因为人们的认识局限,国家很好的管控了转基因食品的生产和销售,用杂交水稻养活的14亿人口,真是件了不起的事情。

妇幼保健院和医院

基本上NIPT检测在地市级别的中小城市都可以开展,全部外包给不同的基因检测公司,新企业已无进入渠道。比较可笑的一件事情是,我们发现妇幼保健院和当地医院的NIPT检测竟然承包给了不同的公司。没想到在当地基因检测公司之间的竞争会这么激烈。医院副院长一直说医院要自负盈亏,如果不赚钱的检测,都会外包出去,感觉赚钱是他们首要考虑的事情。另外医院的设备也是一个方面的问题,我们在医院的实验室看到了最新购买的设备(进口的),还有专门的PCR室,虽然没有人去做PCR。整体情况就是设备都有,但是病人数量和需要做的检测不足以撑起其运行成本,所以一些复杂量少的医学检测能外包的,就都外包了。

总结

回来后几个科研民工的感想就是:自己知识浅薄,局限在自己的研究工作领域,对于周围的事物没有任何了解,表达能力欠缺太多。虽有一身技术,但不会将其市场化带来收益。在国内,做什么事情,关系最重要,谁的关系硬,谁容易打开渠道,获得收益。