scRAN-seq|加权最近邻分析(2)

news/2024/5/18 15:29:44/文章来源:https://blog.csdn.net/swindler_ice/article/details/137597421

概述

本文[1]介绍了Seurat 5.0.0中的加权最近邻(WNN)分析方法,这是一种用于整合和分析多模态单细胞数据的无监督框架。

简介

多模态分析作为单细胞基因组学的一个新兴领域,它通过同时测量多种数据类型来精确描绘细胞状态,这要求开发新的计算技术。由于每种测量方式所含信息量的差异,即便是在同一组数据中的不同细胞间,也给多模态数据的分析与整合带来了挑战。在2021年发表于《Cell》杂志的一篇论文中,提出了一种名为‘加权最近邻’(WNN)的分析方法,这是一种无需监督的学习框架,它能够评估每种数据类型对每个细胞的具体贡献,从而实现对多种数据类型的综合分析。

本文介绍了WNN分析流程,它分为三个主要步骤:

  • 首先,对每种数据类型进行独立的预处理和降维;
  • 其次,学习每种数据类型对于不同细胞的重要性,并构建一个综合这些数据类型的WNN图;
  • 最后,对WNN图进行深入分析,如可视化展示、细胞聚类等。

通过CITE-seq和10x multiome两种单细胞多模态技术,展示了WNN分析的应用。不再仅仅依据单一数据类型来定义细胞状态,而是综合两种数据类型的信息来进行定义。

10x Multiome、RNA + ATAC 的 WNN 分析

在本例中,将展示如何将加权最近邻(WNN)分析应用于 10x multiome RNA+ATAC 试剂盒这一多模态技术。利用的数据集可以在 10x 官方网站上公开获取,该数据集包含了 10,412 个外周血单个核细胞(PBMCs)的转录组和 ATAC-seq 数据。

采用与之前相同的 WNN 方法,将其应用于 CITE-seq 数据集的综合多模态分析。在这个示例中,将展示

  • 如何创建一个包含转录组和 ATAC-seq 数据的多模态 Seurat 对象
  • 以及如何在单细胞水平上对 RNA 和 ATAC 数据进行加权邻居聚类
  • 并利用这两种数据模态来识别不同细胞类型和状态的潜在调控因子

你可以在 10x Genomics 网站上下载相应的数据集。请确保下载以下文件:过滤后的特征条形码矩阵(HDF5 格式)、ATAC 每个片段的信息文件(TSV.GZ 格式)以及 ATAC 每个片段信息的索引文件(TSV.GZ 格式索引)。为了运行这个分析,还需要确保安装了以下软件包:Seurat、Signac(用于分析单细胞染色质数据集)、EnsDb.Hsapiens.v86(用于 hg38 的注释集)以及 dplyr(用于数据处理)。

library(Seurat)
library(Signac)
library(EnsDb.Hsapiens.v86)
library(dplyr)
library(ggplot2)

将基于基因表达数据构建一个 Seurat 对象,并将 ATAC-seq 数据作为第二个分析层加入其中。你可以查阅 Signac 入门指南,了解更多关于创建和处理 ChromatinAssay 对象的信息。

# the 10x hdf5 file contains both data types. 
inputdata.10x <- Read10X_h5("../data/pbmc_granulocyte_sorted_10k_filtered_feature_bc_matrix.h5")

# extract RNA and ATAC data
rna_counts <- inputdata.10x$`Gene Expression`
atac_counts <- inputdata.10x$Peaks

# Create Seurat object
pbmc <- CreateSeuratObject(counts = rna_counts)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")

# Now add in the ATAC-seq data
# we'll only use peaks in standard chromosomes
grange.counts <- StringToGRanges(rownames(atac_counts), sep = c(":""-"))
grange.use <- seqnames(grange.counts) %in% standardChromosomes(grange.counts)
atac_counts <- atac_counts[as.vector(grange.use), ]
annotations <- GetGRangesFromEnsDb(ensdb = EnsDb.Hsapiens.v86)
seqlevelsStyle(annotations) <- 'UCSC'
genome(annotations) <- "hg38"

frag.file <- "../data/pbmc_granulocyte_sorted_10k_atac_fragments.tsv.gz"
chrom_assay <- CreateChromatinAssay(
   counts = atac_counts,
   sep = c(":""-"),
   genome = 'hg38',
   fragments = frag.file,
   min.cells = 10,
   annotation = annotations
 )
pbmc[["ATAC"]] <- chrom_assay

对每种数据模态进行了基本的质量控制,包括检测每个模态中分子的数量和线粒体的百分比。

VlnPlot(pbmc, features = c("nCount_ATAC""nCount_RNA""percent.mt"), ncol = 3,
  log = TRUE, pt.size = 0) + NoLegend()
alt
pbmc <- subset(
  x = pbmc,
  subset = nCount_ATAC < 7e4 &
    nCount_ATAC > 5e3 &
    nCount_RNA < 25000 &
    nCount_RNA > 1000 &
    percent.mt < 20
)

接下来,对两种数据模态分别进行了预处理和降维,采用了适用于 RNA 和 ATAC-seq 数据的标准方法。

# RNA analysis
DefaultAssay(pbmc) <- "RNA"
pbmc <- SCTransform(pbmc, verbose = FALSE) %>% RunPCA() %>% RunUMAP(dims = 1:50, reduction.name = 'umap.rna', reduction.key = 'rnaUMAP_')

# ATAC analysis
# We exclude the first dimension as this is typically correlated with sequencing depth
DefaultAssay(pbmc) <- "ATAC"
pbmc <- RunTFIDF(pbmc)
pbmc <- FindTopFeatures(pbmc, min.cutoff = 'q0')
pbmc <- RunSVD(pbmc)
pbmc <- RunUMAP(pbmc, reduction = 'lsi', dims = 2:50, reduction.name = "umap.atac", reduction.key = "atacUMAP_")

计算了一个 WNN 图,它代表了 RNA 和 ATAC-seq 数据的加权组合。将使用这个图来进行 UMAP 可视化和聚类分析。

pbmc <- FindMultiModalNeighbors(pbmc, reduction.list = list("pca""lsi"), dims.list = list(1:502:50))
pbmc <- RunUMAP(pbmc, nn.name = "weighted.nn", reduction.name = "wnn.umap", reduction.key = "wnnUMAP_")
pbmc <- FindClusters(pbmc, graph.name = "wsnn", algorithm = 3, verbose = FALSE)

在下方对聚类结果进行了注释。你也可以使用的监督映射流程,通过的指南或自动化网络工具 Azimuth 来注释数据集。

# perform sub-clustering on cluster 6 to find additional structure
pbmc <- FindSubCluster(pbmc, cluster = 6, graph.name = "wsnn", algorithm = 3)
Idents(pbmc) <- "sub.cluster"

# add annotations
pbmc <- RenameIdents(pbmc, '19' = 'pDC','20' = 'HSPC','15' = 'cDC')
pbmc <- RenameIdents(pbmc, '0' = 'CD14 Mono''9' ='CD14 Mono''5' = 'CD16 Mono')
pbmc <- RenameIdents(pbmc, '10' = 'Naive B''11' = 'Intermediate B''17' = 'Memory B''21' = 'Plasma')
pbmc <- RenameIdents(pbmc, '7' = 'NK')
pbmc <- RenameIdents(pbmc, '4' = 'CD4 TCM''13'"CD4 TEM"'3' = "CD4 TCM"'16' ="Treg"'1' ="CD4 Naive"'14' = "CD4 Naive")
pbmc <- RenameIdents(pbmc, '2' = 'CD8 Naive''8'"CD8 Naive"'12' = 'CD8 TEM_1''6_0' = 'CD8 TEM_2''6_1' ='CD8 TEM_2''6_4' ='CD8 TEM_2')
pbmc <- RenameIdents(pbmc, '18' = 'MAIT')
pbmc <- RenameIdents(pbmc, '6_2' ='gdT''6_3' = 'gdT')
pbmc$celltype <- Idents(pbmc)

可以根据基因表达、ATAC-seq 数据或 WNN 分析进行聚类可视化。与之前的分析相比,虽然差异更为微妙(你可以探索权重,它们比 CITE-seq 例子中的分布更均匀),但发现 WNN 提供了最清晰的细胞状态分离。

p1 <- DimPlot(pbmc, reduction = "umap.rna", group.by = "celltype", label = TRUE, label.size = 2.5, repel = TRUE) + ggtitle("RNA")
p2 <- DimPlot(pbmc, reduction = "umap.atac", group.by = "celltype", label = TRUE, label.size = 2.5, repel = TRUE) + ggtitle("ATAC")
p3 <- DimPlot(pbmc, reduction = "wnn.umap", group.by = "celltype", label = TRUE, label.size = 2.5, repel = TRUE) + ggtitle("WNN")
p1 + p2 + p3 & NoLegend() & theme(plot.title = element_text(hjust = 0.5))
alt

例如,ATAC-seq 数据有助于区分 CD4 和 CD8 T 细胞的状态。这是由于存在多个位点,在不同的 T 细胞亚型之间表现出不同的可及性。例如,可以使用 Signac 可视化工具,将 CD8A 位点的“伪批量”轨迹与基因表达水平的小提琴图并列显示。

## to make the visualization easier, subset T cell clusters
celltype.names <- levels(pbmc)
tcell.names <- grep("CD4|CD8|Treg", celltype.names,value = TRUE)
tcells <- subset(pbmc, idents = tcell.names)
CoveragePlot(tcells, region = 'CD8A', features = 'CD8A', assay = 'ATAC', expression.assay = 'SCT', peaks = FALSE)
alt

接下来,将检查每个细胞的可及区域,以确定富集的基序。正如 Signac 基序指南中所描述的,有几种方法可以做到这一点,但将使用 Greenleaf 实验室开发的 chromVAR 包。该包计算了每个细胞对已知基序的可及性得分,并将这些得分作为第三个分析层(chromvar)添加到 Seurat 对象中。

为了继续分析,请确保你安装了以下软件包:chromVAR(用于分析 scATAC-seq 中的基序可及性)、presto(用于快速差异表达分析)、TFBSTools(用于 TFBS 分析)、JASPAR2020(用于 JASPAR 基序模型)和 motifmatchr(用于基序匹配),以及 chromVAR 所需的 BSgenome.Hsapiens.UCSC.hg38。

library(chromVAR)
library(JASPAR2020)
library(TFBSTools)
library(motifmatchr)
library(BSgenome.Hsapiens.UCSC.hg38)

# Scan the DNA sequence of each peak for the presence of each motif, and create a Motif object
DefaultAssay(pbmc) <- "ATAC"
pwm_set <- getMatrixSet(x = JASPAR2020, opts = list(species = 9606, all_versions = FALSE))
motif.matrix <- CreateMotifMatrix(features = granges(pbmc), pwm = pwm_set, genome = 'hg38', use.counts = FALSE)
motif.object <- CreateMotifObject(data = motif.matrix, pwm = pwm_set)
pbmc <- SetAssayData(pbmc, assay = 'ATAC', slot = 'motifs', new.data = motif.object)

# Note that this step can take 30-60 minutes 
pbmc <- RunChromVAR(
  object = pbmc,
  genome = BSgenome.Hsapiens.UCSC.hg38
)

将探索多模态数据集,以识别每个细胞状态的关键调控因子。配对数据提供了一个独特的机会,可以识别满足多个标准的转录因子(TFs),有助于将潜在调控因子的列表缩小到最有可能的候选者。的目标是识别那些在 RNA 测量中在多种细胞类型中富集表达的 TFs,同时在 ATAC 测量中它们的基序也具有富集的可及性。

作为一个例子和阳性对照,CCAAT 增强子结合蛋白(CEBP)家族的蛋白质,包括转录因子 CEBPB,已经反复显示在包括单核细胞和树突状细胞在内的髓系细胞的分化和功能中发挥重要作用。可以看到,CEBPB 的表达以及 MA0466.2.4 基序(编码 CEBPB 的结合位点)的可及性在单核细胞中都富集。

#returns MA0466.2
motif.name <- ConvertMotifID(pbmc, name = 'CEBPB')
gene_plot <- FeaturePlot(pbmc, features = "sct_CEBPB", reduction = 'wnn.umap')
motif_plot <- FeaturePlot(pbmc, features = motif.name, min.cutoff = 0, cols = c("lightgrey""darkred"), reduction = 'wnn.umap')
gene_plot | motif_plot
alt

希望量化这种关系,并在所有细胞类型中搜索类似的例子。为此,将使用 presto 包进行快速差异表达。运行两个测试:一个使用基因表达数据,另一个使用 chromVAR 基序可及性。presto 根据 Wilcox 秩和检验计算 p 值,这也是 Seurat 中的默认测试,限制的搜索到在两个测试中返回显著结果的 TFs。

presto 还计算了一个“AUC”统计量,反映了每个基因(或基序)作为细胞类型标记的能力。AUC 值的最大值为 1,表示完美的标记。由于 AUC 统计量对基因和基序是同一尺度的,取两个测试的 AUC 值的平均值,并使用这个值对每种细胞类型的 TFs 进行排名:

markers_rna <- presto:::wilcoxauc.Seurat(X = pbmc, group_by = 'celltype', assay = 'data', seurat_assay = 'SCT')
markers_motifs <- presto:::wilcoxauc.Seurat(X = pbmc, group_by = 'celltype', assay = 'data', seurat_assay = 'chromvar')
motif.names <- markers_motifs$feature
colnames(markers_rna) <- paste0("RNA.", colnames(markers_rna))
colnames(markers_motifs) <- paste0("motif.", colnames(markers_motifs))
markers_rna$gene <- markers_rna$RNA.feature
markers_motifs$gene <- ConvertMotifID(pbmc, id = motif.names)

# a simple function to implement the procedure above
topTFs <- function(celltype, padj.cutoff = 1e-2) {
  ctmarkers_rna <- dplyr::filter(
    markers_rna, RNA.group == celltype, RNA.padj < padj.cutoff, RNA.logFC > 0) %>% 
    arrange(-RNA.auc)
  ctmarkers_motif <- dplyr::filter(
    markers_motifs, motif.group == celltype, motif.padj < padj.cutoff, motif.logFC > 0) %>% 
    arrange(-motif.auc)
  top_tfs <- inner_join(
    x = ctmarkers_rna[, c(21167)], 
    y = ctmarkers_motif[, c(211167)], by = "gene"
  )
  top_tfs$avg_auc <- (top_tfs$RNA.auc + top_tfs$motif.auc) / 2
  top_tfs <- arrange(top_tfs, -avg_auc)
  return(top_tfs)
}

现在,可以计算和可视化任何细胞类型的潜在调控因子。找到了一些已经建立的调控因子,包括 NK 细胞的 TBX21,浆细胞的 IRF4,造血祖细胞的 SOX4,B 细胞的 EBF1 和 PAX5,pDC 的 IRF8 和 TCF4。相信,类似的策略可以用来帮助在不同系统中关注一组潜在的调控因子。

# identify top markers in NK and visualize
head(topTFs("NK"), 3)
##   RNA.group  gene   RNA.auc      RNA.pval motif.group motif.feature motif.auc
## 1        NK TBX21 0.7254543  0.000000e+00          NK      MA0690.1 0.9161365
## 2        NK EOMES 0.5889408  5.394245e-99          NK      MA0800.1 0.9239066
## 3        NK RUNX3 0.7705554 1.256004e-119          NK      MA0684.2 0.6813549
##      motif.pval   avg_auc
## 1 2.177841e-204 0.8207954
## 2 5.165634e-212 0.7564237
## 3  2.486287e-40 0.7259552

motif.name <- ConvertMotifID(pbmc, name = 'TBX21')
gene_plot <- FeaturePlot(pbmc, features = "sct_TBX21", reduction = 'wnn.umap')
motif_plot <- FeaturePlot(pbmc, features = motif.name, min.cutoff = 0, cols = c("lightgrey""darkred"), reduction = 'wnn.umap')
gene_plot | motif_plot
alt
# identify top markers in pDC and visualize
head(topTFs("pDC"), 3)
##   RNA.group gene   RNA.auc      RNA.pval motif.group motif.feature motif.auc
## 1       pDC TCF4 0.9998773 1.881543e-162         pDC      MA0830.2 0.9965481
## 2       pDC IRF8 0.9907541 1.197641e-123         pDC      MA0652.1 0.8833112
## 3       pDC SPIB 0.9113825  0.000000e+00         pDC      MA0081.2 0.9068540
##     motif.pval   avg_auc
## 1 1.785897e-69 0.9982127
## 2 3.982413e-42 0.9370327
## 3 3.083509e-47 0.9091182

motif.name <- ConvertMotifID(pbmc, name = 'TCF4')
gene_plot <- FeaturePlot(pbmc, features = "sct_TCF4", reduction = 'wnn.umap')
motif_plot <- FeaturePlot(pbmc, features = motif.name, min.cutoff = 0, cols = c("lightgrey""darkred"), reduction = 'wnn.umap')
gene_plot | motif_plot
alt
# identify top markers in HSPC and visualize
head(topTFs("CD16 Mono"),3)
##   RNA.group  gene   RNA.auc      RNA.pval motif.group motif.feature motif.auc
## 1 CD16 Mono  TCF7 0.6229004  5.572097e-27   CD16 Mono      MA0769.2 0.6956458
## 2 CD16 Mono  LEF1 0.6244160  1.959810e-27   CD16 Mono      MA0768.1 0.6427922
## 3 CD16 Mono GATA3 0.6853318 1.575081e-132   CD16 Mono      MA0037.3 0.5622475
##     motif.pval   avg_auc
## 1 8.605682e-54 0.6592731
## 2 1.845888e-29 0.6336041
## 3 8.972511e-07 0.6237897

motif.name <- ConvertMotifID(pbmc, name = 'SPI1')
gene_plot <- FeaturePlot(pbmc, features = "sct_SPI1", reduction = 'wnn.umap')
motif_plot <- FeaturePlot(pbmc, features = motif.name, min.cutoff = 0, cols = c("lightgrey""darkred"), reduction = 'wnn.umap')
gene_plot | motif_plot
alt
# identify top markers in other cell types
head(topTFs("Naive B"), 3)##   RNA.group   gene   RNA.auc      RNA.pval motif.group motif.feature motif.auc
## 1   Naive B   TCF4 0.8350167 8.961289e-239     Naive B      MA0830.2 0.9066328
## 2   Naive B POU2F2 0.6969289  9.622025e-43     Naive B      MA0507.1 0.9740857
## 3   Naive B   EBF1 0.9114260  0.000000e+00     Naive B      MA0154.4 0.7565424
##      motif.pval   avg_auc
## 1 8.987390e-151 0.8708247
## 2 3.336610e-204 0.8355073
## 3  3.662535e-61 0.8339842

head(topTFs("HSPC"), 3)
##   RNA.group  gene   RNA.auc     RNA.pval motif.group motif.feature motif.auc
## 1      HSPC  SOX4 0.9864425 2.831723e-71        HSPC      MA0867.2 0.6830497
## 2      HSPC GATA2 0.7115385 0.000000e+00        HSPC      MA0036.3 0.8275008
## 3      HSPC MEIS1 0.8254177 0.000000e+00        HSPC      MA0498.2 0.6924225
##     motif.pval   avg_auc
## 1 1.241915e-03 0.8347461
## 2 7.591798e-09 0.7695196
## 3 6.877492e-04 0.7589201

head(topTFs("Plasma"), 3)
##   RNA.group  gene   RNA.auc     RNA.pval motif.group motif.feature motif.auc
## 1    Plasma  IRF4 0.8189420 5.329976e-35      Plasma      MA1419.1 0.9776046
## 2    Plasma MEF2C 0.9108487 3.135227e-12      Plasma      MA0497.1 0.7596637
## 3    Plasma  TCF4 0.8306796 1.041100e-13      Plasma      MA0830.2 0.7840848
##     motif.pval   avg_auc
## 1 2.334627e-12 0.8982733
## 2 1.374353e-04 0.8352562
## 3 3.028306e-05 0.8073822

未完待续,欢迎关注!

Reference
[1]

Source: https://satijalab.org/seurat/articles/weighted_nearest_neighbor_analysis

本文由 mdnice 多平台发布

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

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

相关文章

掼蛋的六讲原则

第一讲&#xff1a;与同事玩掼蛋&#xff0c;讲娱乐 同事可以说是现在的人们见得最多的一批人&#xff0c;所以与同事打好关系是十分有必要的&#xff0c;所以在和同事玩掼蛋的时候&#xff0c;我们主要讲究的是娱乐精神&#xff0c;大家一起开开心心玩&#xff0c;工作也能变得…

Docker快速上手及常用命令速查

Docker快速上手 安装 在ubuntu上安装docker: sudo apt-get install docker docker -v #查看版本在centos7上安装docker&#xff1a;(docker在YUM源的Extras仓库中) yum install docker systemctl start dockerdocker常用命令速查 #查看docker信息 docker info #查看本地镜…

SpringBoot及其特性

0.前言 Spring 框架提供了很多现成的功能。那么什么是 Spring Boot&#xff1f;使用 Spring 框架&#xff0c;我们可以避免编写基础框架并快速开发应用程序。为了让 Spring 框架提供基础框架&#xff0c;我们需要向 Spring 框架描述有关我们的应用程序及其组件的信息。 不只是…

面试记录(三)

面了57min&#xff0c;实在问麻了&#xff0c;下面的问题就没有按顺序记录了&#xff1a; 1.linux熟悉吗&#xff1a;熟悉基础的环境变量、目录等用法&#xff0c;问如何查找一个文件&#xff08;不会&#xff0c;又追问如何设计一个c的程序去查找&#xff1a;先找文件类型&am…

java基础语法(12)| 异常

1. 异常 1.1 什么是异常 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象或抛出了一个异常对象。Java处理异…

万界星空科技生产工时管理系统

生产工时管理系统是一个管理系统&#xff0c;生产管理人员可以详细地、逐项活动地查看生产和即时劳动力数据&#xff0c;特别是活动级劳动力信息&#xff0c;辅助生产管理人员利用从车间获得的效率数据&#xff0c;实时监控生产流程&#xff0c;并在提高生产率&#xff0c;控制…

C++的并发世界(十一)——线程池

0.线程池的概念 1.线程池使用步骤 ①初始化线程池&#xff1a;确定线程数量&#xff0c;并做好互斥访问&#xff1b; ②启动所有线程 ③准备好任务处理基类&#xff1b; ④获取任务接口&#xff1a;通过条件变量阻塞等待任务 2.atomic原子操作 std:atomic是C11标准库中的一个…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发actions…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…

MySQL学习笔记(数据类型, DDL, DML, DQL, DCL)

Learning note 1、前言2、数据类型2.1、数值类型2.2、字符串类型2.3、日期类型 3、DDL总览数据库/表切换数据库查看表内容创建数据库/表删除数据库/表添加字段删除字段表的重命名修改字段名&#xff08;以及对应的数据类型&#xff09; 4、DML往字段里写入具体内容修改字段内容…

【Java网络编程】OSI七层网络模型与TCP/IP协议簇

1.1、OSI七层网络模型 OSI七层网络模型中&#xff0c;每层的功能如下&#xff1a; 应用层&#xff1a;人与计算机网络交互的窗口。表示层&#xff1a;负责数据格式的封装&#xff0c;如加密、压缩、编解码等。会话层&#xff1a;建立、终止、管理不同端间的会话连接。传输层&a…

【linux】基础IO(四)

在上一篇基础IO中我们主要讲述了文件再磁盘中的存储&#xff0c;当然我们说的也都只是预备知识&#xff0c;为这一篇的文件系统进行铺垫。 目录 搭文件系统的架子&#xff1a;填补细节&#xff1a;inode&#xff1a;datablock[]: 更上层的理解&#xff1a; 搭文件系统的架子&a…

PTA 探索地道战

地道战是在抗日战争时期&#xff0c;在华北平原上抗日军民利用地道打击日本侵略者的作战方式。地道网是房连房、街连街、村连村的地下工事&#xff0c;如下图所示。 我们在回顾前辈们艰苦卓绝的战争生活的同时&#xff0c;真心钦佩他们的聪明才智。在现在和平发展的年代&#x…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

Vue学习笔记-S1

1 什么是Vue Vue是一款用于构建用户界面的渐进式JavaScripte框架&#xff0c;可基于数据渲染用户页面. 1.1 Vue的知识架构 Vue核心包&#xff1a;声明式渲染、组件系统Vue构建&#xff1a;客户端路由、状态管理、构建工具局部使用Vue&#xff1a;快速入门、常用指令、生命周…

计算机组成结构—外部存储器

目录 一、磁盘存储器 1. 磁表面存储器和磁记录原理 2. 硬磁盘的分类和基本结构 &#xff08;1&#xff09;硬磁盘存储器的分类 &#xff08;2&#xff09;硬磁盘存储器的组成 3. 磁盘的工作原理 &#xff08;1&#xff09;磁盘存储区域 &#xff08;2&#xff09;磁盘地…

学习记录15-运算放大器例题1

一、例题1 图中自己加的一些声明&#xff0c;方便待会讲解&#xff08;请忽略丑。。。&#xff09; 根据虚短原则&#xff1a;U U- U 3V*(R4/(R3R4)) 3V*&#xff08;20 / (1020)) 2V U- U- -1V*(R2/(R1R2))Uo*(R1/(R1R2)) -1V*(20/30)Uo*(10/30) -2/3VUo*1/3 …

java算法day50 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 思路&#xff1a; 这道题的关键就是如何设置dp数组的状态。用五种状态表示对股票持有或售出的不同阶段。代码随想录讲解视频 class Solution {public int maxProfit(int[] prices) {int[][] dpnew int[prices.length][5];dp[0][0]0;dp[0][1]-prices…

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点&#xff1a; 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…