这个代码要解决的具体需求如下:
(1)将每一个细胞的突变矩阵读入R中(主要有46个数据矩阵)
(2)筛选突变位点(要求:至少在4个细胞中出现)
(3)整合生成最终的突变位点集
(4)计算每一个突变位点在每一个细胞中对应的VAF值
(5)整合各个细胞的VAF值,形成突变矩阵
(6)根据突变矩阵,绘制heatmap图,完成任务

我们需要我们的程序能够完成这些事儿,现在开始(16:06)。


参考链接:https://cloud.tencent.com/developer/article/1763129
发现了一个叫tidyverse的包,使用这个包,我们可以很方便的读取这些数据信息。

setwd("F://Rworkplace//mutation") #数据集所在的位置
files<-dir(path = "F://Rworkplace//mutation",full.names = T,pattern = ".txt") #读取目录下的所有数据
library(tidyverse) #加载包
df<-map(files,read.table,sep="\t") #批量的读取数据文件
class(df) #这个包的功能就是把数据读取到数据集中

“list”

离支线太远了(17:58)。我总是很容易,钻牛角尖。现在同一个问题,弄了两个小时了还没有推进一点点,心态真的很糟糕。
越着急越不行,毕竟这个问题的确超出了我的能力,唯有静下心来,心平气和的,才有突破的可能。

目前试过两种方法:
(1)reduce(intersect,list)

报错为:Error in x[[1]] : object of type ‘closure’ is not subsettable
而换一个list则完全可以使用这个函数,我想不明白为什么?

(2)upsetR

报错为:1:ncol() zero
我想不明白这个函数的使用方法,明明提交的也是一个list,为什么运行不了?

所以,综合使用这两种方法,都不能够解决我现在的问题,我现在该怎么办?
是再去百度上检索,还是自己静下心来想一想,如果按照自己目前掌握的方法,我要怎么处理这件事?

我可以这个样子处理:
(1)首先把这些位点全部的取出来,不去重的那种,

#取出有start坐标的那一行
sublist<-function(x){as.numeric(unlist(x$V2[-1]))
}
listInput<-sapply(df, sublist)
length(listInput)
#我感觉对于我这种小菜鸟,用循环来批量处理是最现实的
b<-c()
for(i in (1:length(listInput))){a<c()a<-as.numeric(unlist(listInput[[i]]))b<-append(b,a)
}
site_freq<-as.data.frame(table(b))
#这个list就是我们要的,我们可以根据这个list来筛选位点
dim(site_freq)
[1] 67999     2

得到的site_freq的数据矩阵:

(2)然后我们可以根据这个频次矩阵,从中筛选出我们想要的位点。
筛选标准:

  • frequency ≥ 3
  • frequency=46的位点删去(也就是说在所有的文件中都突变,没有比较的意义)
filter_site<-subset(site_freq,site_freq$Freq>=3&site_freq$Freq!=46)
dim(filter_site)
[1] 7488    2

(3)然后将这些位点,存入到一个vector中。
我们来看一下这个数据矩阵。

# interest_site<-as.numeric(filter_site[,1]) #这样写是错误的
interest_site<-filter_site[,1]
#我终于明白哪里错了,我想要取b列的值,但是呢!它取成了行号
#所以为什么?
#应该是原先的as.numeric()出了问题
#length(intersect(interest_site,df[[1]]$V2))
#mutation_cell_1<-subset(df[[1]],subset=(df[[1]]$V2%in%interest_site))
#我的想法很简单,就是生成多个变量就行,一步一步来

(4)从原始的各个数据集中,取出start位点属于这个数据集的位点的行。
这里需要用到一个属于的判断符号%in%。我们来进行处理。

for (i in 1:length(df)) {assign(paste("mutation_cell",i,sep = "_"),subset(df[[i]],subset=(df[[i]]$V2%in%interest_site)))
} #这里的assign,我研究了好久,可以作为经验写出来 #包括上次拆分那个数据是同样的道理#这个循环的嵌套关系比较复杂,但是从本质上来讲,就是说将df中的每一个list的值都取出来,然后逐个的进行判断。最后得到结果data.frame尝试赋值给循环定义的object。


可以大致的看到这些细胞中最多含有的符合要求的variant的数目不过是十几个。我觉得这个筛选的过程是出错的。
因为我们前面满足要求的filter_site有7000左右,并且呢!我看了一下这个variant中好像只有chrM的结果,肯定是有问题的。
我们再次检查一下我们的代码。

经过检查代码,发现,是我们在取感兴趣的位点的时候,程序错误理解为取行号,所以导致最后能够匹配的数量很少。所以,回到上面,进行了调整。

调整后继续匹配,查看最后的结果。

这样明显多多了!是契合我们的预期的。我们打开一个数据矩阵看一下!找到了常染色体上的突变位点信息。

所以,到这一步骤,我们check的结果都是正确的。

(5)随后,我们计算每一个位点的VAF值,对于每一个细胞,最后产生两列的data.frame,第一列是由原始的前面五列就是位点的信息缩合的,最后一列是我们计算得到的这个细胞在这个位点的VAF值。

今天或许可以把这个层次的突变矩阵画出来。关于observable的位点,我们稍后再进行筛选。
突然有些感慨,问题的解决方案的发现,有时候是需要一些运气的因素的。有时候,纠缠于某个问题挑不出来,一个偶然的注意,撬开了一点点的思路,继续往前挖。也许就是通天大道。
我还是非常欣赏胡适先生的那句话的,大胆假设,小心求证。不要急急忙忙的寻找问题的结果,而是一点点的去证实它的可靠性,这一步确保了,才能说下一步是有意义的。
我相信白老师答应我了,就一定会践行承诺的。我想,所以,我不必着急,仅仅是实事求是的汇报就好了。完成比完美更重要,先把事情完成,再去追求完美。
我觉得认清自己很重要,我就是一个啥基础都没有的实习生,是努力的在做我应该做的事情了,做不好是很正常的事情,承认自己比较菜,会有一种坦然。
但是在菜的前提下,不要忘记认真努力才是啊!

在做之前,首先明确VAF值应该如何去求?
这里其实也遇到了一个问题(就是我昨天一直试图想要去解决的):

我们使用的是tumor_only的方式(也就是说是没有对照的normal样本的),这样calling出来的结果在覆盖度方面比较奇怪。
我前前后后有查看mtDNA和我现在用CML样本跑的样本,我发现用tumor-only跑的样本的coverage的参数和我们在vcf文件中使用ref+alt的值不太一样,有时候甚至会发现在coverage中位点为零的位点会出现在vaf的样本中,就让我产生了比较大的疑惑。
我感觉做我们这一行,一定要非常精确才是,我们要对我们自己的结果负责,只有我们能力强了,我们的结果才有可能更加的精确。我感觉科学就是一个不断的怀疑与自我怀疑的过程。

我现在先计算VAF值,将其缩写成一个两列的data.frame。

  • 计算VAF值,并产生VAF列。
for (i in 1:dim(mutation_cell_1)[1]){mutation_cell_1$VAF[i]<-as.numeric(mutation_cell_1$V10[i])/(as.numeric(mutation_cell_1$V9[i])+as.numeric(mutation_cell_1$V10[i]))}

注意将其as.numeric转换,转换之后的可以进行计算,否则会出错。

Error in mutation_cell_1V9[1]+mutationcell1V9[1] + mutation_cell_1V9[1]+mutationc​ell1​V10[1] :
non-numeric argument to binary operator

现在计算完成。

  • 然后将variant的label转换为“–>”
mutation_cell_1<-within(mutation_cell_1, mutation<- paste(V4,V5,sep="->"))
  • 对数据进行提取,合并
mutation_cell_1_VAF<-cbind(mutation_cell_1$V1,mutation_cell_1$V2,mutation_cell_1$mutation,mutation_cell_1$VAF)

(6)现在尝试将上面这一步,扩展到这46个数据中,生成46个VAF矩阵。
生成函数。

cal_VAF<-function(data,m){for (i in 1:dim(data)[1]){data$VAF[i]<-as.numeric(data$V10[i])/(as.numeric(data$V9[i])+as.numeric(data$V10[i]))}data<-within(data, mutation<- paste(V4,V5,sep="->"))assign(m,cbind(data$V1,data$V2,data$mutation,data$VAF))}

46个数据文件生成(虽然使用了函数,可是输入变量的时候依旧是很麻烦)。

mutation_cell_2_VAF<-cal_VAF(mutation_cell_2,"mutation_cell_2_VAF")
mutation_cell_3_VAF<-cal_VAF(mutation_cell_3,"mutation_cell_3_VAF")
mutation_cell_4_VAF<-cal_VAF(mutation_cell_4,"mutation_cell_4_VAF")
mutation_cell_5_VAF<-cal_VAF(mutation_cell_5,"mutation_cell_5_VAF")
mutation_cell_6_VAF<-cal_VAF(mutation_cell_6,"mutation_cell_6_VAF")
mutation_cell_7_VAF<-cal_VAF(mutation_cell_7,"mutation_cell_7_VAF")
mutation_cell_8_VAF<-cal_VAF(mutation_cell_8,"mutation_cell_8_VAF")
mutation_cell_9_VAF<-cal_VAF(mutation_cell_9,"mutation_cell_9_VAF")
mutation_cell_10_VAF<-cal_VAF(mutation_cell_10,"mutation_cell_10_VAF")
mutation_cell_11_VAF<-cal_VAF(mutation_cell_11,"mutation_cell_11_VAF")
mutation_cell_12_VAF<-cal_VAF(mutation_cell_12,"mutation_cell_12_VAF")
mutation_cell_13_VAF<-cal_VAF(mutation_cell_13,"mutation_cell_13_VAF")
mutation_cell_14_VAF<-cal_VAF(mutation_cell_14,"mutation_cell_14_VAF")
mutation_cell_15_VAF<-cal_VAF(mutation_cell_15,"mutation_cell_15_VAF")
mutation_cell_16_VAF<-cal_VAF(mutation_cell_16,"mutation_cell_16_VAF")
mutation_cell_17_VAF<-cal_VAF(mutation_cell_17,"mutation_cell_17_VAF")
mutation_cell_18_VAF<-cal_VAF(mutation_cell_18,"mutation_cell_18_VAF")
mutation_cell_19_VAF<-cal_VAF(mutation_cell_19,"mutation_cell_19_VAF")
mutation_cell_20_VAF<-cal_VAF(mutation_cell_20,"mutation_cell_20_VAF")##########################################################################mutation_cell_21_VAF<-cal_VAF(mutation_cell_21,"mutation_cell_21_VAF")
mutation_cell_22_VAF<-cal_VAF(mutation_cell_22,"mutation_cell_22_VAF")
mutation_cell_23_VAF<-cal_VAF(mutation_cell_23,"mutation_cell_23_VAF")
mutation_cell_24_VAF<-cal_VAF(mutation_cell_24,"mutation_cell_24_VAF")
mutation_cell_25_VAF<-cal_VAF(mutation_cell_25,"mutation_cell_25_VAF")
mutation_cell_26_VAF<-cal_VAF(mutation_cell_26,"mutation_cell_26_VAF")
mutation_cell_27_VAF<-cal_VAF(mutation_cell_27,"mutation_cell_27_VAF")
mutation_cell_28_VAF<-cal_VAF(mutation_cell_28,"mutation_cell_28_VAF")
mutation_cell_29_VAF<-cal_VAF(mutation_cell_29,"mutation_cell_29_VAF")mutation_cell_30_VAF<-cal_VAF(mutation_cell_30,"mutation_cell_30_VAF")
mutation_cell_31_VAF<-cal_VAF(mutation_cell_31,"mutation_cell_31_VAF")
mutation_cell_32_VAF<-cal_VAF(mutation_cell_32,"mutation_cell_32_VAF")
mutation_cell_33_VAF<-cal_VAF(mutation_cell_33,"mutation_cell_33_VAF")
mutation_cell_34_VAF<-cal_VAF(mutation_cell_34,"mutation_cell_34_VAF")
mutation_cell_35_VAF<-cal_VAF(mutation_cell_35,"mutation_cell_35_VAF")
mutation_cell_36_VAF<-cal_VAF(mutation_cell_36,"mutation_cell_36_VAF")
mutation_cell_37_VAF<-cal_VAF(mutation_cell_37,"mutation_cell_37_VAF")
mutation_cell_38_VAF<-cal_VAF(mutation_cell_38,"mutation_cell_38_VAF")
mutation_cell_39_VAF<-cal_VAF(mutation_cell_39,"mutation_cell_39_VAF")
mutation_cell_40_VAF<-cal_VAF(mutation_cell_40,"mutation_cell_40_VAF")mutation_cell_41_VAF<-cal_VAF(mutation_cell_41,"mutation_cell_41_VAF")
mutation_cell_42_VAF<-cal_VAF(mutation_cell_42,"mutation_cell_42_VAF")
mutation_cell_43_VAF<-cal_VAF(mutation_cell_43,"mutation_cell_43_VAF")
mutation_cell_44_VAF<-cal_VAF(mutation_cell_44,"mutation_cell_44_VAF")
mutation_cell_45_VAF<-cal_VAF(mutation_cell_45,"mutation_cell_45_VAF")
mutation_cell_46_VAF<-cal_VAF(mutation_cell_46,"mutation_cell_46_VAF")

明天,将这46个文件,整合到一起。


唐老师的数据先放一放,我先尝试着接着处理完接下来的数据,争取在今晚之前(18:00)绘制好热图,明天阶段性的向老师汇报。先做最紧急最重要的事情。我觉得当老师还挺麻烦的,需要多线程的处理那么多的事情。
现在开始。(14:10)


(7)多个样本,根据公共的行,整合在一起。

我们本次使用的还是reduce()这个函数,总的来说,虽然样子丑了点,但是可以解决我们的问题。

filter_site_update<-as.data.frame(filter_site[,-2])
colnames(filter_site_update)<-"V2"
#merge(filter_site_update,mutation_cell_1_VAF,by.x= "V2",by.y = "V2",all = TRUE)
#再次尝试使用reduce函数
test<-Reduce(function(x, y) merge(x, y, all=TRUE,by.x="V2",by.y="V2"),list(filter_site_update,mutation_cell_1_VAF,mutation_cell_2_VAF,mutation_cell_3_VAF,mutation_cell_4_VAF,mutation_cell_5_VAF,mutation_cell_6_VAF,mutation_cell_7_VAF,mutation_cell_8_VAF,mutation_cell_9_VAF,mutation_cell_10_VAF,mutation_cell_11_VAF,mutation_cell_12_VAF,mutation_cell_13_VAF,mutation_cell_14_VAF,mutation_cell_15_VAF,mutation_cell_16_VAF,mutation_cell_17_VAF,mutation_cell_18_VAF,mutation_cell_19_VAF,mutation_cell_20_VAF,mutation_cell_21_VAF,mutation_cell_22_VAF,mutation_cell_23_VAF,mutation_cell_24_VAF,mutation_cell_25_VAF,mutation_cell_26_VAF,mutation_cell_27_VAF,mutation_cell_28_VAF,mutation_cell_29_VAF,mutation_cell_30_VAF,mutation_cell_31_VAF,mutation_cell_32_VAF,mutation_cell_33_VAF,mutation_cell_34_VAF,mutation_cell_35_VAF,mutation_cell_36_VAF,mutation_cell_37_VAF,mutation_cell_38_VAF,mutation_cell_39_VAF,mutation_cell_40_VAF,mutation_cell_41_VAF,mutation_cell_42_VAF,mutation_cell_43_VAF,mutation_cell_44_VAF,mutation_cell_45_VAF,mutation_cell_46_VAF))

得到的数据矩阵比较丑。如下图。


(8)上面得到的这个数据矩阵,距离我们的“理想”矩阵还是有些区别的。所以,接下来就是对于这个数据矩阵进行“再整理”。

  • 将行名转化为类如chr1 100292207 T->C这种形式。
  • 每一列的列名,变为cell1、cell2、cell3、cell4等等。
  • 整理成,行是每一个突变位点的突变类型,列为每一个细胞,中间的每一个值是一个关于每一个细胞在每一个突变位点的VAF值的这样的突变矩阵。

dplyr包有时间可以多学一下。这个包根据这几天的了解看,是用来整理数据框的,可以说是data.frame的进阶版,我自己倒挺有兴趣的。

在这个过程中遇到了一个问题,对这个数据的dm进行检测的时候,发现我们生成的这样的一个数据矩阵的行数大于我们的位点数据。追踪其原因是由于,对于某些特定的细胞,其突变位点对应于两种类型的突变。

dup<-variant_data[duplicated(variant_data[,1]),1]
#FALSE  TRUE
#7488   531

这个问题先暂时放一下,我现在的想法是先解决这个行名的问题,把关于突变的label的列聚在一起。
尝试对染色体号进行去重的过程中,又出现了新的问题。

和我原来预期的不太一样的是,我以为在染色体上,某一个位点是确定且唯一的。但是,这个结果就让人很惊讶。而且,相应位点的对应的碱基也不同。
chrM 2805 A 48
chrUn_KI270582v1 2805 T 1
chrUn_GL000218v1 2805 A 1
chrUn_KN707706v1_decoy 2805 a 1
chrUn_KN707896v1_decoy 2805 c 13

那遇到这种情况该怎么办?该怎么理解这种现象呢?
同样是忽略这种情况。

f<-c()
for (j in 1:dim(variant_data_1)[1]){d<-c()for (i in 2:47){if(!is.na(variant_data_1[j,i])){b<-c()b<-variant_data_1[j,i]d<-append(d,b)}else{next# print(d)# print(j)}#len<-length(unique(d))#f<-append(f,len)if(length(unique(d))==1){variant_data_1[j,2]<-unique(d) #问题出在这里}}
}

就是在这一步将这些位点剔除(肯定是在数据筛选的过程中会有一些损耗的)。
下一步就是将其他的第3~46列剔除,保留第2列。

variant_data_2<-variant_data_1[,-c(3:47)]

剔除之后,继续按照同样的方法,选取突变类型。

f<-c()
for (j in 1:dim(variant_data_2)[1]){d<-c()for (i in 3:48){if(!is.na(variant_data_2[j,i])){b<-c()b<-variant_data_2[j,i]d<-append(d,b)}else{next# print(d)# print(j)}#len<-length(unique(d))#f<-append(f,len)if(length(unique(d))==1){variant_data_2[j,3]<-unique(d) #问题出在这里}}
}
variant_data_3<-variant_data_2[,-c(4:48)]

这个事情,处理结束之后(肯定也会剔除一些东西,但是剔除多少我没有统计)。
紧接着,我们将几列合并,生成我们想要的突变类型的列。这个我们之前有处理过,我来看一下。

ariant_data_4<-within(variant_data_3, mutation_site<- paste(V1.x,V2,V3.x,sep="\t"))
dim(variant_data_4)
variant_data_5<-variant_data_4[,c(50,4:49)]

接着,对行和列进行重命名。
首先生成一个字符串的序列。

cell_label<-paste("cell",1:46,sep = "_")
colnames(variant_data_5)<-c("variant",cell_label)
#果然,如我猜测的那样,有重复的mutation
#出现这些冗余行的根本原因,要么是位点的重复,要么是同一个突变位点,有两个calling结果
rownames(variant_data_5)<-variant_data_5[,1]

这个时候出现了一些问题:

Error in .rowNamesDF<-(x, value = value) : 不允许有重复的’row.names’
In addition: Warning message:
non-unique values when setting ‘row.names’: ‘chr1 40072268 A->C’, ‘chr10 3776932 C->CT’, ‘chr11 27496002 C->CA’, ‘chr13 52699827 G->GT’, ‘chr14 59371109 C->A’, ‘chr16 66565991 GA->G’, ‘chr17 44223561 A->AC’, ‘chr17 78225123 G->A’, ‘chr20 49094159 G->A’, ‘chr3 177021370 CA->C’, ‘chr4 41960765 G->GA’, ‘chr5 134750980 C->CA’, ‘chr6 143830177 T->TA’, ‘chr7 26212582 T->G’, ‘chr8 25509718 TAA->T’, ‘chrX 25645675 T->A’

所以,如我之前的料想,出现了一些冗余的行。
主要原因,要么是位点的重复,要么是突变类型的重复。
现在的想法就是全部的剔除这些行(甚至一个都不保留,因为这些是在处理的过程中ambiguous的部分)

ambiguious_site<-duplicated(variant_data_5[,1])
ambiguious_variant<-variant_data_5[ambiguious_site,1]variant_data_6<-variant_data_5[!ambiguious_site,] #剔除了ambiguous的位点(但仍然保留唯一的位点,这种方式私以为不够准确)rownames(variant_data_6)<-variant_data_6[,1]
variant_data_7<-variant_data_6[,-1]
rownames(variant_data_7)<-variant_data_6[,1] #对数据进行重新的整理write.table(variant_data_7,"variant.txt",quote = F)#现在先做一个处理,NA用0来表示
variant_data_7[is.na(variant_data_7)] <- 0
variant_data_7<-apply(variant_data_7,2,as.numeric)
library(pheatmap)
pheatmap(variant_data_7,cluster_rows = T,cluster_cols = F,color = colorRampPalette(c("red","yellow","white"))(100),show_colnames = F) #绘制heatmapvariant_chr6_A<-variant_data_6["chr6  132814747   A->G",-1]
variant_chr6_A[is.na(variant_chr6_A)]<-0breaks<-seq(0,1,length.out =20) #之所以出错是因为break在R中是有意义的,不能用于变量名
hist(as.numeric(variant_chr6_A),breaks= c(0.00,0.125,0.25,0.375,0.50,0.625,0.75,0.875,1.00),ylim = c(0,50),xlim =c(0,1),xlab = "Variant Allele Frequence",ylab="Count",main = "chr6 \t 132814747 A->G")variant_chr6_G<-variant_data_6["chr6  35469489    G->GA",-1]
variant_chr6_G[is.na(variant_chr6_G)]<-0breaks<-seq(0,1,length.out =20) #之所以出错是因为break在R中是有意义的,不能用于变量名
hist(as.numeric(variant_chr6_G),breaks= c(0.00,0.125,0.25,0.375,0.50,0.625,0.75,0.875,1.00),ylim = c(0,50),xlim =c(0,1),xlab = "Variant Allele Frequence",ylab="Count",main = "chr6 \t 35469489  G->GA")

最后生成的结果图如下:



完成。

项目实战 |根据找到的variants的结果生成突变矩阵相关推荐

  1. Android项目实战(四十):在线生成按钮Shape的网站

    原文: Android项目实战(四十):在线生成按钮Shape的网站 Android Button Make  右侧设置按钮的属性,可以即时看到效果,并即时生成对应的.xml 代码,非常高效(当然熟练 ...

  2. 【项目实战】Protobuf入门介绍以及如何生成proto对象文件

    一. Protobuf 介绍 1.1 诞生背景 常用的数据格式是 JSON,XML,或者 YAML,这些都是文本格式,特点是容易被人识别,非常容易编程,缺点是数据量有点大.在某些特定场景下,比如帧同步 ...

  3. python3项目-终于找到python3项目实战教程

    列表的元素是可以变动的,比如增加.删除.修改,不过需要注意的是,列表的元素不是基本数据类型,都是一个个的标识符引用对象.以下是小编为你整理的python3项目实战教程 先定义一个列表 a = [123 ...

  4. 计算机视觉一些项目实战技术

    计算机视觉一些项目实战技术 SELECTIVE SEARCH FOR OBJECT LOCALISATION 需要多种策略来查找上述图像中的所有对象.勺子在桌子上的沙拉碗里.因此,图像本质上是层次性的 ...

  5. 实战教程 | 车道线检测项目实战,霍夫变换 新方法 Spatial CNN

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 此文按照这样的逻辑进行撰写.分享机器学习.计算机视觉的基础知识,接着我们以一个实际的项目,带领大家自己 ...

  6. 5G 时代的 Android App 开发入门与项目实战

    随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...

  7. xml信息管理系统_WPF信息管理系统项目实战教程二:使用XAML实现页面布局

    首页面布局设计 XAML(Extensible Application Markup Language),可扩展应用程序标记语言的使用使得C#桌面应用程序开发前后端实现真正分离.前端人员可使用该标记语 ...

  8. [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse

    C语言项目实战 - 虚拟鼠标 - VirtualMouse 目录 关于软件 软件介绍 使用帮助 项目介绍 源码及软件下载 知识点扫描 热键的使用 鼠标事件的模拟 字体的选用 开机自启动的设置 为软件添 ...

  9. 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作

    无监控,不运维.好了,废话不多说,下面都是干货. 警告:流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html ...

最新文章

  1. android layout background,Android LinearLayout Gradient Background
  2. matplotlib画图时间长_Python学习第86课-数据可视化之matplotlib介绍
  3. 微软概述 Windows Server 2008 的定价、包装及授权
  4. 移动web开发DRP问题
  5. 一段三次分拆的蚂蚁搬家式MySQL迁移经历
  6. boltdb 学习和实践
  7. 清华计算机系上热搜!近9成优秀毕业生放弃留学,前50名41人留校深造
  8. 贝叶斯信念网络Bayes Belief network
  9. ubuntu NGINX uwsgi https 部署Django 遇到的问题
  10. 动力学是如何做预测的
  11. js传中文到java乱码怎么解决方法_页面js中文乱码怎么处理?
  12. html打印文字不显示图片,word打印预览时候没问题但是打印出来时候有些文字却不显示...
  13. 实用工具系列 - Xshell安装下载与使用
  14. IDEA项目启动配置
  15. Python刷脸签到系统(附源码)
  16. Android高级UI开发(九)之侧滑菜单 --抽屉
  17. 书论20 袁昂《古今书评》
  18. 注册kaggle帐号及kaggle绑定手机收不到验证码的问题
  19. Scrapy是什么?Scrapy怎么用?Scrapy基础使用(基于scrapy2.0+编写) ๑乛◡乛๑ Scrapy框架使用方法
  20. secureFX上传中文文件名乱码

热门文章

  1. DDD(Domain-Driven Design 领域驱动设计) 与产品设计
  2. 射频百科 | 限幅器的使用指南
  3. HTML+JS 前端雪花飘落
  4. 小米历史版本在哪下载
  5. DNS(计算机域名)三种查询
  6. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 7
  7. 快速剪辑视频,每个视频按秒数快速分割,并保留原声
  8. @Autowired @Resources @Injected 三者的区别联系
  9. mysql员工信息表_MySQL版emp员工信息表
  10. 【趣文】我是一个线程