单细胞水平看生存分析相关基因

技能树学徒作业

针对每个癌症的全部基因批量了做了单基因的cox分析,挑选统计学显著的去对应的癌症去打分,看看是否有单细胞亚群特异性。

这题比较常规,但是可以过一遍基础分析的流程。

选择了GSE38832芯片数据用于分析得到cox/logrank显著的基因。GSE200997单细胞数据用于将显著基因映射上去。

芯片数据分析流程-数据下载及提取

1.设置下载时长

rm(list = ls())
#打破下载时间的限制,改前60秒,改后1000w秒
options(timeout = 10000000) 
options(scipen = 20)#不要以科学计数法表示
library(tinyarray)
  1. 传统芯片下载方式

dir.create("./dat")
setwd("./dat")
proj <- "GSE38832"# 下载
geo = geo_download(proj,colon_remove = T)
boxplot(geo$exp[,1:10])
exp = geo$exp
pd = geo$pd
gpl_number = geo$gpl

3.把基因注释好

# 探针注释的获取-----------------
gpl_number <- eSet@annotation;gpl_number
library(tinyarray)
find_anno(gpl_number) 
ids <- AnnoProbe::idmap('GPL570')# 加probe_id列,把行名变成一列
library(dplyr)
exp = as.data.frame(exp)
exp = mutate(exp,probe_id = rownames(exp))#加上探针注释
ids = distinct(ids,symbol,.keep_all = T)
exp = inner_join(exp,ids,by ="probe_id")
exp = dplyr::select(exp,-"probe_id")
rownames(exp) <- exp$symbol
exp = dplyr::select(exp,-"symbol")

4.check表达矩阵的数据情况

dim(exp)
range(exp)
boxplot(exp,las = 2) #看是否有异常样本
#数据不齐归一化
exp = limma::normalizeBetweenArrays(exp)
boxplot(exp,las = 2)
  1. 临床信息和表达矩阵数据对齐

p = identical(rownames(pd),colnames(exp));p
if(!p) {s = intersect(rownames(pd),colnames(exp))exp = exp[,s]pd = pd[s,]
}

6.保存数据

save(pd,exp,gpl_number,proj,file = "step1output.Rdata")
setwd("..")

芯片数据生存分析前的数据整理

1.加载数据和R包

rm(list=ls())
setwd("./dat")
proj <- "GSE38832"
load("step1output.Rdata")library(stringr)
  1. 临床信息整理

meta <- pd
meta$ID <- rownames(meta)
tmp = data.frame(colnames(meta))
meta = meta[,c('ID','dss_time (disease specific survival time, months)','dss_event (disease specific survival)'
)]
colnames(meta)=c('ID','DSS.time','DSS')
meta$DSS <- gsub("\\(death from cancer\\)|\\(no death\\)","",meta$DSS)
str(meta)
meta$DSS.time <- as.numeric(meta$DSS.time)
meta$DSS <- as.integer(meta$DSS)

3.保存数据

exprSet <- exp
head(rownames(meta))
head(colnames(exprSet))
s = intersect(rownames(meta),colnames(exprSet));length(s)
exprSet = exprSet[,s]
meta = meta[s,]
dim(exprSet)
dim(meta)
identical(rownames(meta),colnames(exprSet))
save(meta,exprSet,proj,file = paste0(proj,"_sur_model.Rdata"))setwd("..")

Cox/Km分析

1.加载数据和R包

rm(list=ls())
setwd("./dat")
proj <- "GSE38832"
load("GSE38832_sur_model.Rdata")
  1. 批量单因素cox

library(survminer) 
library(survival)mySurv <- with(meta, Surv(DSS.time, DSS)) #with函数是一个方便的语法结构,它允许在指定的数据框的上下文中临时评估表达式
cox_results <-apply(exprSet , 1 , function(gene){group=ifelse(gene>median(gene),'high','low') if( length(table(group))<2)return(NULL)survival_dat <- data.frame(group=group,# stage=phe$stage,stringsAsFactors = F)m=coxph(mySurv ~ group, data =  survival_dat)beta <- coef(m)se <- sqrt(diag(vcov(m)))HR <- exp(beta)HRse <- HR * se#summary(m)tmp <- round(cbind(coef = beta, se = se, z = beta/se, p = 1 - pchisq((beta/se)^2, 1),HR = HR, HRse = HRse,HRz = (HR - 1) / HRse, HRp = 1 - pchisq(((HR - 1)/HRse)^2, 1),HRCILL = exp(beta - qnorm(.975, 0, 1) * se),HRCIUL = exp(beta + qnorm(.975, 0, 1) * se)), 3)return(tmp['grouplow',])})cox_list <- as.data.frame(t(cox_results))

3.筛选基因并保存数据

# 选择p值小于0.05 和 HR绝对值大于1的基因
cox_deg <- cox_list[(cox_list$p < 0.05) & (abs(cox_list$HR) > 1),]
write.csv(cox_deg, file = "cox_deg.csv")

4.批量log_rank检验

library(survival)
mySurv <- with(meta, Surv(DSS.time, DSS))
logrank_res <- apply(exprSet, 1, function(x){group <- ifelse(x > median(x),"high","low") # 根据表达量的中位数分组fit <- survdiff(mySurv ~ group) #survdiff函数可以分析log_rank检验,核心函数pvalue <- 1-pchisq(fit$chisq, df=1)})res.logrank <- data.frame(symbol = rownames(exprSet), pvalue = logrank_res)
res.logrank <- res.logrank[order(res.logrank$pvalue),]
write.csv(res.logrank, file = "logrank.csv")

4.画一下生存曲线

# 挑选几个基因画
head(cox_list[cox_list[,4]<0.05,])
cg =  head(rownames(cox_list[cox_list[,4]<0.05,]))
cg identical(colnames(exprSet), rownames(meta)) 
mySurv <- with(meta, Surv(DSS.time, DSS))
library(ggstatsplot)
overlap_list <- lapply(cg, function(i){# i = cg[1]survival_dat = metagene = as.numeric(exprSet[i,])survival_dat$gene = ifelse(gene > median(gene),'high','low')table(survival_dat$gene)library(survival)fit <- survfit(Surv(DSS.time, DSS) ~ gene,data = survival_dat)survp = ggsurvplot(fit,data = survival_dat, #这里很关键,不然会报错legend.title = i, #定义图例的名称 # legend = "top",#图例位置# legend.labs = c('High', 'Low'),pval = T, #在图上添加log rank检验的p值# pval.method = TRUE,#添加p值的检验方法risk.table = TRUE, risk.table.y.text = F,xlab = "Time in months", #x轴标题# xlim = c(0, 10), #展示x轴的范围# break.time.by = 1, #x轴间隔size = 1.5, #线条大小ggtheme = theme_ggstatsplot(),palette="nejm", #配色)return(survp)               
}) n = length(overlap_list)
n
x=floor(n/2);y=2 
# x被定义为n除以2后向下取整的结果
# y被设置为2,图表的布局将有两行
all_plot <- arrange_ggsurvplots(overlap_list,print = F,ncol =x, nrow = y,risk.table.height = 0.3,surv.plot.height = 0.7)
# risk.table.height = 0.3:设置与每个生存曲线图相关联的风险表的高度比例为 0.3
# surv.plot.height = 0.7: 设置生存曲线图本身的高度比例为 0.7。all_plot  
ggsave("all_plot.png", plot = all_plot, width = 20, height = 12)setwd("..")

单细胞分析流程

1.数据读取和加载R包

rm(list=ls())
#setwd("./dat/")
library(Seurat)
library(ggplot2)
library(tidyverse)
proj <- "GSE200997"clin <- read.csv("GSE200997_GEO_processed_CRC_10X_cell_annotation.csv.gz",header = T,sep = ",")
sce.raw <- read.csv("GSE200997_GEO_processed_CRC_10X_raw_UMI_count_matrix.csv.gz",header = T,sep = ",")
rownames(sce.raw) <- sce.raw$X
library(dplyr)
sce.raw <- select(sce.raw,-X)
sce <- CreateSeuratObject(sce.raw,project = "GSE200997", min.cells = 3,min.features = 200,)
sce# 把临床信息辅助到seurat对象中
phe <- sce@meta.data
# 首先check一下官方提供的GEO文件中的行顺序和sce对象中的细胞顺序是否一致
identical(rownames(phe),clin$X)
#[1] TRUEphe <- cbind(phe,clin)
phe$samples <- sub("B","N",phe$samples)
phe <- select(phe, -X)
sce@meta.data <- phesave(sce,file = "sce.raw.Rdata")

2.质量控制

Idents(sce) <- sce$samples
# 质量控制-看线粒体基因,核糖体基因,红细胞
#计算线粒体,核糖体和血红蛋白基因比例并添加到数据中
sce[["percent.mt"]] <- PercentageFeatureSet(sce, pattern = "^MT-") 
sce[["percent.rp"]] <- PercentageFeatureSet(sce, pattern = "^RP[SL]") #核糖体
sce[["percent.hb"]] <- PercentageFeatureSet(sce, pattern = "^HB[^(P)]")VlnPlot(sce, features = c("nFeature_RNA","nCount_RNA", "percent.mt","percent.rp","percent.hb"), ncol = 3,pt.size = 0, group.by = "samples")#散点图-----Count_RNA和线粒体
plot1 <- FeatureScatter(sce, feature1 = "nCount_RNA", feature2 = "percent.mt")
#散点图-----Count_RNA和细胞数?
plot2 <- FeatureScatter(sce, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
#散点图-----Count_RNA和核糖体
plot3 <- FeatureScatter(sce, feature1 = "nCount_RNA", feature2 = "percent.rp")
#散点图-----核糖体和线粒体
plot4 <- FeatureScatter(sce, feature1 = "percent.rp", feature2 = "percent.mt")
plot1 + plot2 + plot3 + plot4# 设置质控的标准
sce <- subset(sce,percent.mt < 25 &  #也可以更加严格小于5nFeature_RNA > 200 & nFeature_RNA < 6000 #& #nfeature值可以严格到<2500#nCount_RNA < 18000 &#percent.rp <15 &#percent.hb <1
)

4.对数据标准化及显示高变基因

# 标准化数据
sce <- NormalizeData(sce, normalization.method = "LogNormalize", scale.factor = 10000)
# 鉴定2000个高变基因(数量可人为设置,一般是2K)
sce <- FindVariableFeatures(sce, selection.method = "vst", nfeatures = 2000)
# Identify the 10 most highly variable genes
top10 <- head(VariableFeatures(sce), 10)
# 对高变基因可视化
# 对高可变基因进行可视化
plot1 <- VariableFeaturePlot(sce)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
plot1 + plot2 #这个图片窗口需要拉大一点

5.缩放数据

# In addition we scale the data(缩放数据),保证每个基因在同一个尺度上
all.genes <- rownames(sce)
sce <- ScaleData(sce, features = all.genes)
# 这个ScaleData 函数的 Default is variable features. 
# 如果我们不添加  features = all.genes ,
# 它就是默认的前面的 FindVariableFeatures 函数的2000个基因
  1. PCA降维

# PCA降维
sce <- RunPCA(sce, features = VariableFeatures(object = sce) , #npcs = 20,verbose = FALSE)
sce@reductions$pca@cell.embeddings[1:4,1:4]
# 展示1和2主成分中的主要“荷载”
VizDimLoadings(sce, dims = 1:2, reduction = "pca")
# Dimplot可视化
DimPlot(sce, reduction = "pca")
#heatmap可视化(可自行修改dims)
DimHeatmap(sce, dims = 1, cells = 500, balanced = TRUE)#接下来我们既然已经对庞大的数据进行了降维(也就是聚堆)的形式,那么我们究竟要选择几个PC来代表这么庞大的数据呢,肯定不能都选,否则我的数据量还是这些,就没有我们前面一直渗透的缩小缩小再缩小的含义了
sce <- JackStraw(sce, num.replicate = 100)
sce <- ScoreJackStraw(sce, dims = 1:20) #dims最大是20
#上面两个代码是通过不同的方式来帮助我们选择PC的数目,并且分别都对应不同的可视化
JackStrawPlot(sce, dims = 1:20) #最大值是20
ElbowPlot(sce,ndims=50)
#不同的判断方法选择的PC数是不一样的,而且理论上来说保存更多的PC可以保存更多的生物学差异,所以这里我们灵活选择即可,因为都不算错

7.cluster-分群-PCA可视化

# 基于降维后的数据构建细胞邻近图
# dims的数量是根据上一步所确定的ElbowPlot
dims_N <- "30" 
sce <- FindNeighbors(sce, dims = 1:dims_N, verbose = FALSE) # 进行聚类分析,基于邻近图(之前由FindNeighbors 函数构建)划分细胞群体
# 可以通过Idents(sce) 对比前后的levels数量变化
# 请注意,我这边resolution设置了一个梯度
sce <- FindClusters(sce, resolution = seq(0.1, 1.2, by = 0.1), verbose = FALSE)
head(Idents(sce), 5)
#resolution大小决定cluster的数量(0.4-1.2范围)#可视化cluster
DimPlot(sce, reduction = "pca") 

8.clustree图

library(clustree)
library(patchwork)
p1 <- clustree(sce, prefix = 'RNA_snn_res.') + coord_flip()
#这里的RNA_snn_res后面的数值是可以修改的
p2 <- DimPlot(sce, group.by = 'RNA_snn_res.0.5', label = T) 
p1 + p2 + plot_layout(widths = c(3, 1))
  1. UMAP/tSNE可视化

#UMAP/tSNE可视化前先确定一个想要的reslution值
#这里重新跑一遍之后后面就会按照新跑的reslution值进行分析
sce <- FindClusters(sce, resolution = 0.5, verbose = FALSE)
head(Idents(sce), 5)#假设电脑的显卡非常高级的话,可以不用PCA降维,直接UMAP
#Umap方式
sce <- RunUMAP(sce, dims = 1:dims_N, umap.method = "uwot", metric = "cosine")
DimPlot(sce,label = T)
#Tsne方式
#pbmc <- RunTSNE(pbmc )
#DimPlot(pbmc,label = T,reduction = 'tsne',pt.size =1)#数据保存
phe=sce@meta.data
save(phe,file = 'phe-by-basic-seurat.Rdata')#把seurat得到的meta.data信息保存下来

10.细胞亚群注释前marker提取

#首先要确认一下每一cluster中的marker基因
#其中pct.1:在目标细胞簇中表达的细胞比例;pct.2:在其他细胞簇中表达的细胞比例。
sce.markers <- FindAllMarkers(sce, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25, verbose = FALSE)
head(sce.markers,n = 5)
#显示每个簇中log2FC表达最高5个值
a <- sce.markers %>%group_by(cluster) %>% # dplyr包中的函数可以进行分组操作top_n(n = 5, wt = avg_log2FC)%>% # dplyr包中的函数,可以提取前多少行data.frame()#可视化
DimPlot(sce, reduction = "umap", group.by = 'seurat_clusters',label = TRUE, pt.size = 0.5) #请注意下边的feature参数中的基因是要存在于pbmc.markers中
#feature参数不能重复
DotPlot(sce, features = c("CD45", "PTPRC", #immune"EPCAM",#epithelial"CD10","MME","CD31","PECAM1" #stromal),group.by = 'seurat_clusters') + theme(axis.text.x=element_text(angle=45,hjust = 1))

11.cluster合并

#####细胞生物学命名
#先创建一个表格
celltype=data.frame(ClusterID=0:23,celltype= 0:23) 
celltype[celltype$ClusterID %in% c(0:4,6,8,12,16,18,20,23 ),2]='immune'
celltype[celltype$ClusterID %in% c(5,7,9,11,13:15,17,21),2]='epithelial'
celltype[celltype$ClusterID %in% c(10,19),2]='stromal'
celltype[celltype$ClusterID %in% c(22),2]='Unknow'sce@meta.data$celltype = "NA" #先在scRNA中添加celltype的一行
for(i in 1:nrow(celltype)){sce@meta.data[which(sce@meta.data$RNA_snn_res.0.5 == celltype$ClusterID[i]),'celltype'] <- celltype$celltype[i]}
table(sce@meta.data$celltype)# 修改Idents中分群编号为细胞类型
Idents(sce) <- sce$celltype
DimPlot(sce, reduction = "umap", label = TRUE,  repel = T,pt.size = 0.5) 
scCustomize::DimPlot_scCustom(sce,figure_plot = TRUE)step1.final = sce
save(step1.final,proj,file = 'step1.final.Rdata')

对细胞亚群的命名比较粗糙,其中不能确定的群我设置为了unknow群

获得研究者提供的Epi基因然后对自己数据进行基因划分

1.导入数据加载R包

rm(list = ls())
library(Seurat)
library(openxlsx)
load("step1.final.Rdata")
sce <- step1.final
cox_deg <- read.csv("cox_deg.csv",header = T, sep = ",")
logRank <- read.csv("logrank.csv",header = T,sep = ",")
Author_define <- read.xlsx("41586_2022_5402_MOESM4_ESM (1).xlsx")
EpiGenes <- Author_define$gene[1:99]

2.cox_deg 交集

Epi_cox <- intersect(cox_deg$X,EpiGenes) 
# 排除在 Epi_cox 中的基因
remaining_genes <- setdiff(cox_deg$X, Epi_cox)
Immue_cox <- cox_deg$X[cox_deg$X %in% remaining_genes]#表达量的另一种绘图方式
library(Nebulosa)
plot_density(sce,features = Epi_cox) +plot_layout(ncol = 2)

这里只交集到了两个基因,所以绘制了表达量图看一下

Addmodulescore评分-All

sce =  AddModuleScore(object = sce,features = list(cox_deg$X))
colnames(sce@meta.data)
p = FeaturePlot(sce,'Cluster1') #默认名称cluster1
p # 常规绘图
dat<- data.frame(sce@meta.data, sce@reductions$umap@cell.embeddings,seurat_annotation = sce@active.ident)
class_avg <- dat %>%group_by(celltype) %>% #按照seurat_annotation列(即细胞的分类)对数据进行分组。summarise(umap_1 = median(umap_1),umap_2 = median(umap_2) #对每个分组计算UMAP坐标的中位数 画label)library(ggpubr)
ggplot(dat, aes(umap_1, umap_2))  +geom_point(aes(colour  = Cluster1)) + #修改这里的colourviridis::scale_color_viridis(option="A") +ggrepel::geom_label_repel(aes(label = celltype),data = class_avg,label.size = 0,segment.color = NA)+theme_bw()
ggsave(filename="addmodulescore_all.png",width = 9,height = 7)

cox显著的基因在几个亚群中均有表达,其中在immune细胞群中似乎表达最高

Addmodulescore评分-EPI

sce =  AddModuleScore(object = sce,features = list(Epi_cox))
colnames(sce@meta.data)
p = FeaturePlot(sce,'Cluster1') #默认名称cluster1
p # 常规绘图
dat<- data.frame(sce@meta.data, sce@reductions$umap@cell.embeddings,seurat_annotation = sce@active.ident)
class_avg <- dat %>%group_by(celltype) %>% #按照seurat_annotation列(即细胞的分类)对数据进行分组。summarise(umap_1 = median(umap_1),umap_2 = median(umap_2) #对每个分组计算UMAP坐标的中位数 画label)library(ggpubr)
ggplot(dat, aes(umap_1, umap_2))  +geom_point(aes(colour  = Cluster1)) + #修改这里的colourviridis::scale_color_viridis(option="A") +ggrepel::geom_label_repel(aes(label = celltype),data = class_avg,label.size = 0,segment.color = NA)+theme_bw()
ggsave(filename="addmodulescore.png",width = 9,height = 7)

Epi相关的基因就集中在epthelial

logrank显著的基因就不做了

致谢:感谢曾老师,小洁老师以及生信技能树团队全体成员(部分代码来源:生信技能树马拉松和数据挖掘课程)。

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(希望多多交流)。更多内容可关注公众号:生信方舟

- END -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生物墨水与生物打印:一场生物科技的革新?

挤出生物打印 挤出生物打印原理 挤出生物打印利用机械力将生物墨水或生物材料溶液挤出&#xff0c;形成连续的丝状结构&#xff0c;并逐层堆叠构建出三维结构。根据所使用的机械力&#xff0c;挤出生物打印可分为三种类型&#xff1a; 气动式: 利用压缩空气驱动生物墨水或生…

Amazon Bedrock 实践 | 动手玩转 Claude 3

生成式 AI 和大模型在 2024 年已经进入落地实践阶段。因此&#xff0c;围绕开发者在生成式应用程序开发中的主要痛点和需求&#xff0c;我们组织了这个 “Amazon Bedrock 实践” 的系列&#xff0c;希望可以帮助开发者高效地上手生成式 AI 和大模型的应用开发&#xff0c;本篇为…

SMS群发信息API接口安全性有哪些保障方法?

SMS群发信息API接口支持哪些格式&#xff1f;如何使用API接口&#xff1f; SMS群发信息API接口被广泛应用于企业营销、客户服务、身份验证等多个领域。确保SMS群发信息API接口的安全性&#xff0c;已成为企业和开发者们必须重视的问题。AoKSend将探讨几种保障SMS群发信息API接…

GeoServer改造Springboot源码十(样式管理设计)

GeoServer改造Springboot源码一&#xff08;公共部分&#xff09; GeoServer改造Springboot源码二&#xff08;数据源管理设计&#xff09; GeoServer改造Springboot源码三&#xff08;数据源管理代码&#xff09; GeoServer改造Springboot源码四&#xff08;图层管理设计&a…

CNN的小体验

用的pytorch。 训练代码cnn.py&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import torch.nn.functional as F# 定义超参数 num_epochs 10 batch_size 100 learning_rat…

使用Python绘制彩虹效果:动态彩虹动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制彩虹函数定义颜色列表主循环 完整代码 引言 彩虹是自然界中最美丽的现象之一。通过编程&#xff0c;我们可以将这一奇妙的景象带到屏幕上。在这篇博客中&#xff0c;我们将使用Python来创建一个…

聊聊 golang 的 map

1、哈希表 哈希表是一个很常见的数据结构&#xff0c;用来存储无序的 key/value 对&#xff0c;给定的 key 可以在 O(1) 时间复杂度内查找、更新或删除对应的 value。 设计一个好的哈希表&#xff0c;需要着重关注两个关键点&#xff1a;哈希函数、冲突处理。 1.1 哈希函数 …

Redis 高级数据结构业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 hyperloglog 、GEO、bitmap、布隆过滤器的介绍和业务实践 1、HyperLogLog 1.1、功能 基数统计&#xff08;去重&#xff09; 1.2、redis api 命令作用案例PFADD key element [element ...]添加元素到keyPF…

力扣 用队列实现栈(Java)

核心思想&#xff1a;因为队列都是一端进入另一端出&#xff08;先进先出&#xff0c;后进后出&#xff09;&#xff0c;因此一个队列肯定是不能实现栈的功能的&#xff0c;这里就创建两个队列来模拟栈的先进后出&#xff0c;后进先出。 比如说如果是push操作我们肯定是要弹出栈…

STM32自己从零开始实操08:电机电路原理图

一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感&#xff1a;通低频阻高频的。仿真中高频信号通过电感&#xff0c;因为电感会阻止电流发生变化&#xff0c;故说阻止高频信号 电容&#xff1a;隔直通交。…

65、基于卷积神经网络的调制分类(matlab)

1、基于卷积神经网络的调制分类的原理及流程 基于卷积神经网络&#xff08;CNN&#xff09;的调制分类是一种常见的信号处理任务&#xff0c;用于识别或分类不同调制方式的信号。下面是基于CNN的调制分类的原理和流程&#xff1a; 原理&#xff1a; CNN是一种深度学习模型&a…

SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]

SpringBoot自定义starter SpringBoot与AOP SpringBoot与AOP 使用AOP实现用户接口访问日志功能 添加AOP场景启动器 <!--添加AOP场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</…

都2024了,现在搞本HCIE真的还来得及?

信息技术的迅猛发展&#xff0c;网络的飞速进步&#xff0c;网络工程师这一职业的需求也在不断增加。 作为华为认证体系中的顶级认证&#xff0c;HCIE一直以来都是网络工程师追求的目标之一。 都2024了&#xff0c;厂商认证都火了十几年来&#xff0c;很多人犹犹豫豫&#xff0…

Mybatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)

目录 一、JDBC编程和ORM模型 1. JDBC回顾 2. JDBC的弊端 3. ORM模型 Mybatis和hibernate 区别: 4. mybatis 解决了jdbc 的问题 二、MyBatis简介 1. MyBatis快速开始 1.1 导入jar包 1.2 引入 mybatis-config.xml 配置文件 1.3 引入 Mapper 映射文件 1.3 测试 …

Ubuntu Server 和 Ubuntu Desktop 组合使用

1.常见的组合使用方式 Ubuntu Server 和 Ubuntu Desktop 确实可以组合使用&#xff0c;但具体要看你的需求和使用场景。以下是一些常见的组合使用方式&#xff1a; 单一设备上安装&#xff1a;你可以在一台设备上同时安装 Ubuntu Server 和 Ubuntu Desktop。这样&#xff0c;你…

【ARM系列】1of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

OOCL东方海外不定位置旋转验证码识别代码

样例图如下 这款验证码的识别最大难度在于&#xff0c;旋转的位置不固定&#xff0c;需要识别旋转图片的位置。 第二大难点就是旋转角度的识别。所以我们采集了大量样例图片进行训练&#xff0c;如下图所示 最终训练得到的模型需要两张图片输入&#xff0c;才能完成旋转角度识…

阿里 Mobile-Agent-v2:基于大模型的安卓鸿蒙自动化工具

与之前介绍的 DigiRL类似, Mobile-Agent-v2是一个支持安卓和鸿蒙系统的自动化工具&#xff0c;它使用视觉模型理解手机屏幕&#xff0c;并利用 ADB 来实现操作手机&#xff0c;你可以在本地运行&#xff0c;或者通过手机截图在线体验 Mobile-Agent-v2 从演示来看&#xff0c;可…

短信接口平台的核心功能有哪些?如何使用?

短信接口平台怎么有效集成&#xff1f;选择短信接口平台的技巧&#xff1f; 短信接口平台作为一种重要的通信工具&#xff0c;广泛应用于各种企业和组织。通过短信接口平台&#xff0c;企业能够高效、便捷地与客户进行互动和沟通。AoKSend将详细介绍短信接口平台的核心功能。 …

Android --- 新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了

新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死&#xff0c;鼠标和键盘都操作不了 大概原因就是,初始化默认Google的安卓模拟器占用的RAM内存是2048&#xff0c;如果电脑的性能和内存一般的话就可能卡死&#xff0c;解决方案是手动修改安卓模拟器的config文件&…