超详细 | 生物医学研究和临床应用中scRNA-seq的数据分析指南

随着高通量scRNA-seq(包括临床样本)能力的扩大,对这些海量数据的分析能力已成为进入该领域研究人员的必备技能。近日,Military Medical Research发表了一篇综述文章,回顾了典型scRNA-seq数据分析的工作流程,总结每个分析步骤的当前方法,并针对某些特定的分析任务和方法指出了建议和注意事项。

scRNA-seq的典型数据分析步骤通常可分为三个阶段:  

1)原始数据处理和质量控制;

2)适用于几乎所有scRNA-seg数据集的基本数据分析:数据标准化和整合、特征选择、降维、细胞聚类、细胞类型标注和标记基因识别;

3)应针对特定研究场景定制的高级数据分析:轨迹推断、细胞间通讯分析、调节子推断和TF活性预测以及代谢分析。

实验设计

scRNA-seq 实验需要精心设计,以优化解决科学问题的能力。在开始数据分析之前,需要收集以下与实验设计相关的信息。 (1) 物种。 对于生物医学研究和临床应用,通常收集来自患者的人体样本进行测序。在某些情况下,为了研究潜在的分子机制,还使用小鼠和其他模式生物。由于人类和其他物种的基因名称和相关数据资源不同,因此明确数据分析的物种非常重要。 (2)样本来源。 根据科学问题和样本可及性,不同研究的样本类型可以不同。例如,为了研究肝细胞癌等实体瘤,从患者身上收集肿瘤活检和肿瘤周围样本用于病例对照设计。尽管上述设计在某种程度上是可行的,但外周血单核细胞 (PBMC) 更容易获得并广泛用于 scRNA-seq。此外,来自患者的类器官细胞通常用于研究个人遗传变异对特定器官发育的影响,这也可能是特定疾病的起源。了解样本来源有助于特定分析,例如细胞聚类和细胞类型注释。 (3)实验设计。 为了研究疾病的发病机制和特定治疗的有效性,通常采用病例对照设计,如肿瘤与肿瘤周围设计。对于COVID-19等疾病,无法从同一患者身上获得正常样本,因此将年龄和性别匹配的健康人作为对照组。为了控制患者和对照组之间可能的协变量,需要仔细考虑每组中的个体数量。在(前瞻性)队列研究中,样本量通常相当大,因此 scRNA-seq 不能应用于来自个体捐赠者的每个样本;在这种情况下,通常会应用嵌套病例对照研究和样本多重分析。 一般来说,数据分析策略需要根据实验设计的类型进行调整。

原始数据处理和质量控制

原始数据处理

原始数据处理步骤包括:测序read QC、read mapping、细胞解复用和细胞唯一分子标识符(UMI)计数表生成。目前随着 scRNA-seq 平台的发布提供了标准化的数据处理管道,例如 10 × Genomics Chromium 的 Cell Ranger 和用于 Singleron 系统的 CeleScope,替代工具包括UMI-tools、scPipe、zUMIs、celseq2、kallisto bustoolsscruff 也可用于此过程。无论如何,我们不建议在个人电脑上处理原始数据,因为这些管道需要大量的计算资源,并且针对高性能计算架构进行了优化。 第三方公司通常提供经过处理的数据,包括 UMI 计数矩阵和 QC 指标,这使研究人员能够专注于下游数据分析以解决科学问题

QC和双胞去除

细胞质量控制的目的是确保所有被分析的“细胞”都是单个完整的细胞。受损细胞、死亡细胞、应激细胞和双重细胞需要丢弃。细胞质量控制最常用的三个指标是:总UMI计数(即计数深度)、检测到的基因数量和每个细胞条形码的线粒体衍生计数分数。Cell Ranger和CeleScope通常执行第一轮细胞质控,通过检查scRNA-seq库中计数深度的分布,将潜在的真实细胞与背景细胞条形码区分开来。

需要注意的是,当损坏的细胞或细胞碎片在文库中占据相当大的比例时,有效细胞的最小计数深度阈值就很难确定。可能的解决方案包括同时考虑多个 QC 指标,以及应用更复杂的方法来排除背景和低质量细胞。 通常,检测到的基因数量少和计数深度低表明细胞受损,而线粒体衍生计数的比例高则表明细胞正在死亡。相比之下,检测到的基因太多和计数深度太高可能表明存在双联体。虽然像 SeuratScater 这样的 R 包实现了促进细胞QC的功能,但QC指标的阈值在很大程度上取决于所研究的组织、细胞解离方案、文库制备方案等。参考具有类似实验设计的文献将有助于确定阈值,研究人员也可检查QC指标的联合分布。值得注意的是,编码核糖体蛋白的基因的累积表达不是典型的QC指标,因为核糖体蛋白表达的变化可能具有生物学意义。

此外,在质量控制步骤中需要考虑和控制各种污染源。最近开发了用于估计和消除此类污染的方法和工具,包括SoupX、DecontX、FastCARCellBender

在高通量 scRNA-seq 实验中,观察到双细胞的比率并不少见,最高可达细胞条形码的 40%。在最近的一项研究中,使用一组综合的合成和真实数据对可用的计算doublet检测方法进行基准测试,推荐使用工具 Doubletfinder,因为它在下游分析中实现了最高的检测精度和最佳性能。

基本数据分析

数据归一化

每个细胞的总 UMI 计数的可变性取决于一系列技术和生物学参数。为 scRNA-seq 量身定制的标准化方法,包括SCDEMAST,可以在 scRNA-seq 数据的差异表达分析中专门模拟dropout events。另一种方法Scran通过汇集具有相似基因表达谱的细胞来克服比例因子估计的问题(受太多零计数的影响)。此外,Census 在没有加入对照的情况下估计每个细胞的RNA分子总数,并将这些估计值用作比例因子。虽然Vallejos等人进行的模拟研究表明Scran的池化策略在缩放因子估计方面优于比较工具,但TPM-/count 深度缩放方法在实践中得到了广泛应用。为了更好地稳定方差,Seurat团队最近开发了SCTransform,它将正则化负二项回归应用于scRNA-seq数据归一化和方差稳定。

一些已知的生物效应,例如细胞周期和细胞应激(以线粒体基因的过度表达为特征),可能会阻碍对特定感兴趣的生物信号的表征。因此,针对已知生物学规范化或校正表达谱可能有助于解释数据。 如纠正细胞周期的影响可以改善发育轨迹的重建。可以通过对相关生物学特征(例如细胞周期分数)进行评分,然后根据Seurat中实施的计算分数进行简单线性回归,来实现生物效应的程序。此外,专用工具,如scLVM/f-scLVM和cgCorrect也可用于此目的。值得注意的是,校正一种特定分析(如细胞分化)的生物效应可能会无意中阻碍另一种分析(如细胞增殖)的信号;在为特定分析任务选择数据标准化策略时,应谨慎。

数据整合

如“实验设计”部分所述,生物医学研究通常进行病例与对照比较,通常下游分析之前需要进行整合,这个时候要考虑去除批次效应。批次效应校正方法可分为以下几类:1)为批量表达分析开发的工具,包括ComBat和limma;2) 基于高维基因表达空间或其子空间中的相互最近邻(MNN)的方法,如mnnCorrect、fastMNN、Scanorama和BBKNN;3) 尝试在降维空间中使细胞与相关/共享特征对齐的方法,包括CCA、Harmony和LIGER;以及4)基于深度生成模型(如scGen)的方法。此外,根据整合锚点的选择,算法也可以分为不同的类型,例如基因组特征作为锚点和细胞作为锚点。

最近的一项研究在5种不同的整合场景下,在10个数据集上比较了当前可用的14种批次效应校正方法:Seurat 3中实现的Harmony、LIGER、CCA根据综合性能推荐。 Harmony 运行速度比其他工具快,适合初步探索;Seurat3/4-CCA 在混合不同批次的细胞方面表现适中,而 LIGER 在批次混合方面做得最好,有时会以牺牲细胞类型纯度为代价。 值得注意的是,如果想要评估批次效应校正的有效性或评估数据中批次效应的程度,可以通过比较基于批次效应校正分析的聚类或可视化结果,以及直接合并来自多个样本的细胞的结果如Seurat 中的合并函数),并通过计算测试指标,例如kBET。

功能选择

“特征选择”一词是从统计学和机器学习领域借来的,用来描述为下游分析选择生物信息基因的过程。这个过程通常是无监督的,这意味着不需要与细胞类型或其他感兴趣的生物过程相关的信息。考虑到scRNAseq数据中相对较高的噪声水平,特征选择通常识别具有比技术噪声更强的生物变异性的基因。一些不利的协变量(如批次效应)可能会扭曲高度可变基因(HVG)识别。因此,HVG选择应在协变量校正后进行。在存在批量效应的情况下,也可以在数据集成之前在单个样本中进行特征选择。

降维和可视化

选择1000–5000个HVG后,表达数据的维度仍然很高,为此,可以通过降维技术进一步降低表达矩阵的维数。广泛使用的降维方法包括PCA、NMF、MDS、t-SNE和UMAP。PCA是一种用于降维和去噪的通用技术,然而,PCA无法在分析中考dropout events,这导致开发了几种新方法。ZIFA是一种基于因子分析的方法,它明确地模拟了dropout特征,并优于比较方法。与PCA相似,NMF是一种用于降维的线性投影方法,并在基于scRNA-seq的细胞聚类中表现出稳健的性能。

对于可视化,非线性降维方法更适合,它允许在二维/三维空间中进行全局非线性嵌入。MDS是一种非线性降维方法,它保持了原始空间中细胞之间的距离。然而,MDS不能扩展到大规模scRNA-seq数据。新的证据表明,t-SNE和UMAP更适用于scRNA-seq数据,这些数据已广泛用于单细胞分析,用于数据可视化和细胞群体识别。然而,t-SNE通常受到限制,例如大规模scRNA-seq数据集的计算时间慢,并且全局数据结构没有得到保存。UMAP具有上述两个方面的优势,目前成为最流行的降维选择。

细胞亚群的鉴定

scRNA-seq的关键应用之一是基于细胞聚类或分类来确定细胞亚群。NMF被用于在单细胞转录组数据中分离亚群,并已被证明以更高的准确性和鲁棒性优于PCA。同样的,开发 SinNLRR 是为了通过非负和低秩表示提供强大的基因表达子空间聚类

最先进的聚类方法,如k-means算法,也已应用于scRNA-seq数据集,并基于此应用,开发了SC3方法。scRNA-seq中另一类常用的细胞聚类方法是基于细胞最近邻网络的聚类检测方法,并在Seurat R包中采用和实施。此外已开发了多种细胞聚类方法,如BackSPIN等。然而,两项独立的基准测试研究表明,SC3和Seurat中的聚类方法表现相似,优于所有其他比较方法

相似性或距离度量对于scRNA-seq中的细胞聚类至关重要,这可能是实验平台或特定样本特有的。研究表明,与无监督聚类方法相比,有监督的细胞类型识别方法较少受到批量效应、细胞类型数量和细胞群体组成失衡的影响。 CellAssign、scmap、SingleR、CHETAH和SingleCellNet都是有监督的方法。尽管监督方法具有明显的优势,但无监督方法通常更擅长识别未知细胞类型并且具有更高的计算效率。因此,在 Seurat 中实现的聚类方法具有最佳的整体性能,并被建议作为细胞类型识别的首选。

单细胞聚类分析的另一个重要问题是稀有细胞类型的检测,这些细胞在复杂疾病中起着重要作用,但丰度较低。RaceID、GiniClust、SINCERA 和 DendroSplit 是专门设计用于在 scRNA-seq 数据分析中识别稀有细胞类型的聚类算法。

细胞类型注释

将细胞身份分配给细胞亚群,这一过程称为细胞类型注释,是 scRNA-seq 数据分析中的关键步骤。细胞类型的手动注释非常耗时且可能具有主观性。因此,已经开发了用于自动细胞类型注释的新兴计算工具。这些计算方法通常可以分为三大类。

第一类是基于标记基因的,这依赖于公共数据库或文献中细胞类型特异性标记的可用性。CellMarker和PanglaoDB是常用的在线资源,此外,开发了TF标记物数据库,用于为人类提供细胞或组织特异性TF和相关标记物。同时,已经开发了许多工具来将标记基因用于细胞类型注释,例如ScType、scSorter、SCINA、scCATCH和CellAssign

第二组方法是基于参考转录组的,通过搜索查询数据和参考数据之间的最佳相关性,使用细胞类型标记的scRNA-seq数据集作为细胞类型注释的输入。该组的流行工具包括CHETAH、scmap、scMatch和SingleR。值得注意的是,参考转录组学数据的全面性对于这组方法至关重要。常用的参考数据来自 Blueprint、Encode 和 Human Primary Cell Atlas。

第三组利用基于监督机器学习的方法,其中由标记参考训练的分类器然后被应用于预测未标记细胞的细胞类型。例如SingleCellNet、scPred和scClassify等。此外,基于OnClass还可以通过识别由细胞本体和未标注的细胞产生的低维嵌入中的最近细胞类型来准确标注训练数据集中缺失的细胞类型。

细胞类型标注的自动化方法已应用于广泛的生物医学研究,包括癌症研究。然而,最近的一项基准研究表明,在不同的场景下,每种计算方法都比其他方法具有特定的优势,因此临床用户很难选择合适的工具。集成来自多个工具的注释结果可能是上述问题的解决方案,并可能实现更精确的细胞类型注释。因此,ImmCluster最近被开发用于免疫细胞聚类和注释,它集成了七种基于参考和四种基于标记基因的计算方法,并由人工选择的标记基因集支持。比较研究表明,ImmCluster提供了比单个方法更准确和稳定的细胞类型注释。

标记基因鉴定

特定细胞簇或细胞类型的标记基因是表征其功能的重要资源。反过来,标记基因也可以用于细胞类型注释。常用方法包括Seurat、SINCERA、SC3、MAST、SCDE和DEsingle等。

还有一类方法,它在细胞聚类过程中同时识别细胞特异性基因,而不是此后的一个步骤。例如BackSPIN、ICGS、DendroSplit、scVDMC和BCseq等。

关于 scRNA-seq 中 DEG 工具的最佳选择,最近的一项研究比较了 36 种方法,发现所比较的方法之间存在根本差异。有人指出,低表达基因的预过滤可能有助于 DEG 分析,用于 bulk RNA-seq 分析的方法通常与专门为 scRNA-seq 开发的方法具有相当的性能。总体而言,非参数 Wilcoxon 秩和检验在大多数应用场景中排名靠前,但复杂的实验设计除外。

高级数据分析

功能富集分析

为了便于解释和组织每种细胞类型中识别的标记基因,通常进行功能富集分析。为批量转录组学开发的计算方法可以轻松应用于此分析,例如DAVID。这类分析需要在统计意义上进行严格的切割,以定义标记基因;相比之下,广泛使用的基因集富集分析(GSEA)是一种无边界的方法,为了促进 GSEA 分析,MSigDB数据库提供了一系列带注释的基因集,包括通路和标志基因特征

除了基于标记基因或两组细胞之间的差异表达执行功能注释的上述场景之外,该分析也可以在单细胞水平上进行。常用方法包括Vision、Pagoda2、AUCell、SCSE和JASMINE,其更适合于scRNA-seq中的特征评分。此外,这些特征评分方法也可用于通路活动推断。

轨迹推断和RNA速度分析

轨迹推断、伪时间估计和RNA速度建模都有助于揭示细胞分化或激活过程中的分子特征和调控机制。轨迹推断是过去几年的热门研究领域,开发了大约一百种计算工具。根据轨迹的类型,轨迹推断方法也可分为不同的类别,包括线性方法[例如SCORPIUS、TSCAN、Wanderlust]、分叉方法[例如DPT、Wishbone]、多分叉方法[例如FateID、STEMNET、MFA]、树方法(例如Slingshot、scTite、Monocle)和图方法[例如PAGA、RaceID、SLICER]。基于最近的一项基准研究,给出了实际应用指南,以便生物医学研究人员可以根据数据中预期拓扑的先验知识选择适当的方法;否则,建议使用PAGA、Monocle、RaceID和Slingshot进行初步调查。

捕获转录组动力学的另一种方法是使用RNA 速度,相关方法包括Velocyto和scVelo等。最近开发的方法将RNA速度与轨迹推断相结合,例如CellRank和CellPath等。

细胞间通讯(CCC)

CCC 事件在生物体发育和体内平衡以及疾病的发生和发展中起着重要作用。为此,已经开发了各种计算工具来使用 scRNA-seq 数据推断 CCC。细胞之间的通讯通常取决于配体-受体 (LR) 相互作用,通常通过 LR 共表达来量化。

为了促进上述研究,已知的配体-受体相互作用 (LRIs) 已被手动整理并存储在数据库中。迄今为止,LRIs数据库已经相当多了,包括 CellPhoneDB、ICELLNET、CellTalkDB、SingleCellSignalR 和 Omnipath

最近,基于scRNA-seq数据预测CCC的计算方法不断发展。CCC推理工具可根据其特殊性分为三大类:即基于网络的(NicheNet、CCCExplorer、scConnect和NATMI)、基于机器学习的(SingleCellSignalR、SoptSC和PyMINEr)和基于空间的(CellTalker、CellChat)方法。此外,参考成分分析 (RCA)-CCA、线性回归和决策树分类器也用于 CCC 预测。

识别CCC的新兴计算方法提高了我们对疾病发展微环境的理解。然而,所有的方法都依赖于LRIs的先验知识和统计或机器学习模型来预测潜在的CCC事件。另外,选择LRIs资源和预测方法可能会产生不同的结果,但选择对结果的影响在很大程度上是未知的。为了解决这个问题,最近的一项研究系统地比较了CCC推断的16种资源和7种方法,以及比较方法的共识。比较表明,不同的LRIs资源涵盖了不同比例的集体先验知识,预测的CCC在很大程度上彼此不一致,这表明需要继续努力改进CCC推理资源和工具。

调节子推断和TF活动预测

识别调节子的一个重要资源是TF目标数据库。AnimalTFDB、JASPAR、TRRUST、KnockTF和Cistrome DB揭示的转录调控关系是广泛应用的TF注释数据库,涵盖了大多数人类和小鼠TF。

结合单细胞基因表达和综合的TF靶信息,已经开发了许多推断调节子和TF活性的方法,包括共表达分析(如WGCNA)、SCENIC、SCODE、SINCERITIES和机器学习的方法(如DeepDRIM)等。

代谢分析

基于scRNA-seq的代谢分析的计算工具可分为两大类:基于途径的分析和基于通量平衡分析(FBA)的方法。对于第一类,通常使用标准功能富集分析方法。特别是,R 包 scMetabolism 提供了一个集成框架,用于定量分析 scRNA-seq 中的代谢途径活动,能够解释丢失,并与为单细胞功能富集分析设计的多种工具兼容,包括 ssGSEA、Vision、 和 AUCellscFBA是第一个结合scRNA-seq数据和FBA来估计单细胞通量的计算工具后来提出了Compass和scFEA

本文中所涉及的软件及代码均可在如下链接获取:https://github.com/WXlab-NJMU/scrna-recom

参考文献

Su M, Pan T, Chen Q Z, et al. Data analysis guidelines for single-cell RNA-seq in biomedical studies and clinical applications[J]. Military Medical Research, 2022, 9(1): 1-24.

本文转载于网络 如有侵权请联系删除

相关文章

  • M1 芯片 Mac 上更好的 Golang 使用方案

    本篇文章,将分享如何在苹果M1Mac设备上,来进行高效、可靠的Golang开发环境的安装和管理写在前面如果你是一个Golang的用户,那么你大概率会遇到管理和维护Golang版本的诉求,如果你恰好同时需要开发调试两个不同版本的项目,在不考虑强制跳版本的情况下,你或许就需要使用“Golang版本管理工具”来帮助你减轻负担了。去年年末,我曾在一篇文章中分享过三种关于《Golang多版本管理》[1]的方案。相比较官方方案golang/dl或者社区方案voidint/g这两个更适合安装或管理单一版本的方案之外,我更推荐使用的方案是gvm。它除了能够完成golang开发环境的快速安装之外,还能够保障多个版本的golang共存,不同版本的软件依赖包都保持正常工作。并且,它的实现和社区大名鼎鼎的nvm-sh/nvm、shyiko/jabba是一致的,都是由BASH编写,和所需要管理的Runtime语言无关,能够更稳定的完成“管理工作”。但可惜的是,它和M1设备存在兼容性问题,它并不能够很好的运行,甚至可以说,完全无法运行。暂且不说我是如何解决问题的,让我们先来看看,怎么能够在数秒、几分钟内完成Gol

  • 以太坊客户端Geth命令用法-参数详解

    geth是以太坊的官方节点版本,无论是mist钱包或其他的钱包内部都是集成了geth。今天就带大家熟悉一下geth的使用,命令行参数。主要根据官方文档进行翻译,注解。命令行选项名称geth-go-ethereum命令行接口复制Copyright2013-2017Thego-ethereumAuthors复制版本信息1.7.3-stable复制命令使用方法geth[选项]命令[命令选项][参数…]复制具体命令以下命令为系统级别的操作命令,比如管理账户,导入导出功能,本身并不会启动节点,只是在使用相应的功能。只有console命令和attach命令会进入js交互窗口。account管理账户(比如添加list参数可现实本节点地址列表) attach启动交互式JavaScript环境(连接到节点),此模式在生产环境以后台进程启动是常用 bug上报bugIssues(会打开github提交问题的页面) console启动交互式JavaScript环境(启动时添加此参数会直接进入console交互页面,但不建议这样使用) copydb从指定的chaindata目录创建本地链 dumpDump(分析

  • 【第3版emWin教程】第49章 emWin6.x的AppWizard创建控件回调消息

    第49章emWin6.x的AppWizard创建控件回调消息本期教程为大家讲解emWin6.x的GUI开发工具AppWizard创建控件回调消息。49.1初学者重要提示49.2AppWizard创建控件回调函数49.3AppWizard生成的VS工程使用VS2019运行方法49.4AppWizard创建的界面添加到工程49.5实验例程说明(RTOS)49.6实验例程说明(裸机)49.7总结49.1初学者重要提示使用的AppWizard版本一定要和emWin版本匹配,本章配套例子使用的emWin版本是V6.16。对应的AppWizard版本是V1.20,下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=105049。AppWizard工程路径不支持中文,使用时特别注意。AppWizard生成的emWin6.x工程可以方便的融合之前的低版本emWin工程代码,在回调函数里面可以方便的添加之前基于窗口或者对话框创建的界面。49.2AppWizard创建控件回调函数下面使用AppWizard创建控件回调函数,先让大家有个整体认

  • LSTM之父再称ResNet、GAN等五大网络都有他的功劳,网友却说:自负大于引用数

    丰色发自凹非寺 量子位报道|公众号QbitAI“现在引用最多的几个神经网络都是建立在我的实验室成果之上的!”能说出此话的不是别人,正是在深度学习领域作出了巨大贡献的LSTM之父——JürgenSchmidhube。但这也不是他第一次为“自己的开创性工作没得到足够的尊重”而公开发声。在这篇“直抒胸臆”的推文里,他还专门链出了个博客,里面历数了他和他的团队在LSTM、ResNet、AlexNet和VGG、GAN以及Transformer变体——这五个赫赫有名的神经网络上的早期贡献。来看看他是怎么说的。“五大神经网络都是建立在我的实验室成果之上”首先是LSTM(LongShort-TermMemory)。这是Jürgen和他的学生们在1997年提出的一种新的RNN,解决了神经网络长短期记忆的难题。根据谷歌学术,这是20世纪被引用次数最多的神经网络。现在已经“渗透”进医疗保健、学习机器人(learningrobot)、游戏、语音处理、机器翻译等领域,每天被无数人使用数十亿次。其厉害之处不用多说,大家对Jürgen的这项成就也没啥异议。主要看另外四个:ResNet作为21世纪被引用次数最多的神经

  • 密码学系列之:1Password的加密基础PBKDF2

    简介1password是一个非常优秀的密码管理软件,有了它你可以轻松对你的密码进行管理,从而不用再考虑密码泄露的问题,据1password官方介绍,它的底层使用的是PBKDF2算法对密码进行加密。那么PBKDF2是何方神圣呢?它有什么优点可以让1password得以青睐呢?一起来看看吧。PBKDF2和PBKDF1PBKDF的全称是Password-BasedKeyDerivationFunction,简单的说,PBKDF就是一个密码衍生的工具。既然有PBKDF2那么就肯定有PBKDF1,那么他们两个的区别是什么呢?PBKDF2是PKCS系列的标准之一,具体来说他是PKCS#5的2.0版本,同样被作为RFC2898发布。它是PBKDF1的替代品,为什么会替代PBKDF1呢?那是因为PBKDF1只能生成160bits长度的key,在计算机性能快速发展的今天,已经不能够满足我们的加密需要了。所以被PBKDF2替换了。在2017年发布的RFC8018(PKCS#5v2.1)中,是建议是用PBKDF2作为密码hashing的标准。PBKDF2和PBKDF1主要是用来防止密码暴力破解的,所以在设计

  • java之扩展运算符

    java中的扩展运算符为+=、-=、/=、%=、*=当使用扩展运算符时,变量在参与赋值运算时会把结果自动强制转换为当前变量的类型,比如:publicclassTest{ publicstaticvoidmain(String[]args){ shorta=1; //此时的a是short类型 a+=1; System.out.println(getType(a)); } publicstaticStringgetType(Objectobj){ returnobj.getClass().getName(); } }复制输出:java.lang.Short如果是正常的进行赋值的话,则需要进行强制转换:publicclassTest{ publicstaticvoidmain(String[]args){ shorta=1; //此时的a是short类型 a=(short)(a+1); System.out.println(getType(a)); } publicstaticStringgetType(Objectobj){ returnobj.getClass().getName();

  • 文言文编程?算了吧!不过是一个想家华裔的一厢情愿

    前言Github在trending页面,增设spokenlanguage筛选项,我想用意已经很明显了,地址来自中国的无聊项目扰乱视听。我们也不想看到一些什么北大清华浙大计算机课件冲顶,阿里腾讯大厂面试宝典冲顶。都是汉字!对老外有什么用?后来又出来一个文言文编程的。这个要说道说道。作者前言掉了多少书袋“然以文言編程者,似所未有。此誠非文脈之所以傳,文心之所以保。”文言编程,当然没有。有易语言,挂机玩游戏耳!“嗟予小子,遂有斯志。然則數寸之烏絲猶覆於頭,萬卷之素書未破於手;一身長羁于远邦,兩耳久旷于雅言。然夫文章者吾之所宿好,程式者偶承時人之謬譽。”作者说的很明白,自己早在国外,耳朵很久没有听到国语了! “胡马依北风,越鸟巢南枝”! 他在国外,偶尔想起故乡的月,很合景。越是缺什么,他越想什么。 这个年代,当然还是要读纸质读,否则没有品位,不深入! 这是央视说的,央视是offical!“故希孟不慚年少,莊生不望無涯。乃作斯言。”掉书袋模式正式开始,你不了解典故,就是不懂。不懂,你连话都插不上,插不上!“誠未能嘔瀝長吉之心血,亦庶幾免於義山之流沫。既成之後,復學干將鑄劍而自飼,越王嚐糞而當先。

  • 常见Interview question

    1、如何测试一部电梯对于编程来说,万物皆对象,对于测试来说,万物皆测试对象。   那么如何测试电梯呢?   电梯测试可以从几个方面来进行,功能测试,性能测试,压力测试,可用性测试(Usability),兼容性测试,本地化/国际化测试,可维护性测试;   1、功能测试:最基本的上下功能,开关功能,还有里面的各个按键;   2、性能测试:(很多人忽略的),比如电梯的调度算法,用户的等待时间,平均等待时间,上下的速度,耗电量等等;   3、压力测试:比如承重量(你实际承受力是20,那么当进入19个人的时候就应该报警,或者是实际上用户有可能一股脑的全部冲进电梯,所以在静止的时候电梯需要考虑到这种情况),突然断电,门打不开等等;   4、可用性测试:按钮是否方便,按键的感觉是否好,视觉效果,现在很多人诟病的事情是,开和关两个按钮的图示很不友好,在紧急的时候很容易搞错;   5、兼容性测试:比如每个国家的电压不一样,是否考虑到这个情况;   6、本地化/国际化测试:电梯的使用手册翻;   7、可维护性:电梯如果坏了怎么去维修;   8、可用性availabity测试,如果一部坏了,另外一部是否可以

  • 2 Python 基础: 列表及字典内置函数&方法内容梳理

    前言这是“Python基础”系列的第02篇文章,共20篇。 01Python基础:Python入门必看之语法基础 02Python基础:列表及字典内置函数&方法内容梳理 03Python基础:Python函数及递归函数知识点梳理 04Python基础:讲解迭代、过滤、匿名函数、排序算法四大知识点 05Python基础:高阶函数学习实践 06Python基础:难点装饰器的学习介绍及实现赌博收益小案例 07Python基础:重点知识点函数的参数难点解答 08Python基础:面试问你类与实例及其属性还不会吗 09Python基础:手把手带你梳理对象、继承与多态知识点 10Python基础:如何定制类,这里有答案 11Python基础:知识巩固,实现一个简易学生管理系统 12Python基础:如何优化代码质量,错误、调试和测试你必须要懂 13Python基础:模块的概念及使用方法并着重介绍两个常用模块 14Python基础:重点知识点--IO编程 15Python基础:程序猿必懂知识之正则表达式 16Python基础:重点知识点--Pygame的基础知识梳理 17Python基础

  • Hive系列:二级分区、动态分区和混合分区

    点击上方蓝字关注我,让我成为你的专属小太阳Hive系列概览(1)hive系列之简介,安装,beeline和hiveserver2(2)hive系列之基本操作(3)hive系列之udf,udtf,udaf(4)hive系列之二级分区、动态分区和混合分区(5)hive系列之分桶表(6)hive系列之常用函数(7)hive系列之系统讲解开窗函数(8)hive系列之存储格式及常用压缩格式(9)hive系列之数据仓库建模理论(10)hive系列之数据仓库建模-维度表和事实表(11)hive系列之数据仓库建模-退化维度和缓慢变化维(12)hive系列之常用企业性能优化1(13)hive系列之常用企业性能优化2(14)hive系列之常用企业性能优化3今天是第四讲,Hive的二级分区、动态分区和混合分区1二级分区所谓二级分区,就是一个表有两个分区,概念很简单。当然Hive支持一个表有多个分区这里有一份测试数据,是每个月的销量数据今天的例子以这份数据来演示下面建一个带两个分区的明细表,并往里面插入数据createtabletempon.t_access_partition(unamestring,uac

  • 修复android下webView控件的总结

    游戏中有一个收集玩家问题反馈的网页,很早之前就有同事反映说android在游戏无法上传附件,在浏览器中是可以正常使用的。最近能腾出手来的时候,就仔细看了一下这个问题,发现很里藏着不少问题,这里一一记录下来,希望能其它人有用,因为很多问题跟网上反映出来可能有点不太一样。既然是网页,而且只在游戏中才出现,那第一步你要先会使用Fiddler来拦截请求,定位出问题的代码在哪里。你可以参考这篇文章,抓包已经讲的已经非常详细了,StepByStep Fiddler(四)实现手机的抓包在Fiddler中找到请求的网页链接,点击查看后将响应的文本使用文本工具(我是使用的EditPlus)保存,然后修改它,再用Fiddler的AutoResponder进行请求拦截,就能进行动态调试了不过开了Fiddler中的HTTPS请求后,使用Chrome访问HTTPS链接时都会提示此网站身份未认证,手机安装证书之后,我的设备就必须设定手势密码了,设置之后还不能取消手势必须先删除证书才能恢复以前的无手势访问。而且开启了代理之后,360的SDK点击登录时提示“无法连接到网络,请检测您的手机网络设置”,其实是可以上网的,

  • 2761: [JLOI2011]不重复数字(平衡树)

    2761:[JLOI2011]不重复数字TimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 2133  Solved: 825[Submit][Status][Discuss]Description给出N个数,要求把其中重复的去掉,只保留第一次出现的数。例如,给出的数为1218331923654,其中2和3有重复,去除后的结果为1218319654。Input输入第一行为正整数T,表示有T组数据。接下来每组数据包括两行,第一行为正整数N,表示有N个数。第二行为要去重的N个正整数。Output对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开。SampleInput2 11 1218331923654 6 123456 SampleOutput1218319654 123456 HINT对于30%的数据,1<=N<=100,给出的数不大于100,均为非负整数;对于50%的数据,1<=N<=10000,给出的数不大于10000,均为非负整数;对于100%的数据,1<=N<=50000,给出的数在32位有

  • 爬虫+反爬虫+js代码混淆

    一、vue2和vue3双向数据绑定原理发生了改变vue2 的双向数据绑定是利用ES5的一个 APIObject.defineProperty()对数据进行劫持结合发布订阅模式的方式来实现的。vue3 中使用了 es6 的 ProxyAPI对数据代理。相比于vue2.x,使用proxy的优势如下defineProperty只能监听某个属性,不能对全对象监听可以省去forin、闭包等内容来提升效率(直接绑定整个对象即可)可以监听数组,不用再去单独的对数组做特异性操作vue3.x可以检测到数组内部数据的变化二、Vue3支持碎片(Fragments)就是说在组件可以拥有多个根节点。vue2.x<template> <divclass='form-element'> <h2>{{title}}</h2> </div> </template>复制vue3.x<template> <divclass='form-element'> </div> <

  • [BZOJ 2806][Ctsc2012]Cheat

    [BZOJ2806][Ctsc2012]Cheat 题意 给定一个\(m\)个串的字典,对于\(n\)组查询串,求一个最大的\(L_0\)使查询串能被拆分为若干子串使得其中是字典串的子串且长度不小于\(L_0\)的子串的长度之和不小于总长的\(90\%\). 所有串均为01串,输入文件大小不超过\(110000\texttt{B}\). 题解 我可能在做这题前对SAM的理解有点偏差 首先不难看出这个\(L_0\)是可以二分的. 若查询串的一个子串同时也是字典中某个串的子串,我们称之为有效子串. 然后我们尝试DP求出最优情况下的有效子串总长.设\(dp_i\)表示长度为\(i\)的前缀中的有效子串总长的最大值.我们可以枚举最后一个有效串的长度进行转移,同时这一步还可以不选择任何子串(即字符\(i\)不包含在任何有效子串中,不做任何贡献地从\(dp_{i-1}\)转移).于是我们需要快速知道以\(i\)为右端点的最长有效子串长度. 显然这一步我们可以对字典串建立广义SAM求出.具体做法是把查询串丢到广义SAM上运行,运行时如果能匹配就按匹配边走并产生\(+1\)贡献,否则跳\(prt\)并

  • 深入理解SpringBoot核心机制《spring-boot-starter》

    深入理解SpringBoot核心机制《spring-boot-starter》 前言: 对于这几年java火爆天的springBoot我相信大家都有所使用过,在springBoot的项目中,pom文件引入最多的无非就是各种各样的srping-starter了。 什么是Starter呢?为什么要使用Starter呢? 你可以理解为一个可拔插式的插件(组件)。 通过Starter,能够简化以前繁琐的配置,无需过多的配置和依赖,它会帮你合并依赖,并且将其统一集成到一个Starter中,我们只需在Maven或Gradle中引入Starter依赖即可。SpringBoot会自动扫描需要加载的信息并启动相应的默认配置。 如果你想使用redis插件,你只需引入spring-boot-starter-data-redis即可;如果你想使用mongodb,你只需引入spring-boot-starter-data-mongodb依赖即可。 springBoot-starter是一个集成接合器,完成两件事: 1、引入模块所需的相关jar包 2、自动配置各自模块所需的属性 SpringBoot官方提供了大量

  • nodejs package.json详细解读

     package.json详细内容 它是这样一个json文件(注意:json文件内是不能写注释的,复制下列内容请删除注释): JavaScript { "name":"test",//项目名称(必须) "version":"1.0.0",//项目版本(必须) "description":"Thisisforstudygulpproject!",//项目描述(必须) "homepage":"",//项目主页 "repository":{//项目资源库 "type":"git", "url":"https://git.oschina.net/xxxx" }, "author":{//项目作者信息 "name":"surging", "email":"surging2@qq.com" }, "license":"ISC",//项目许可协议 "devDependencies":{//项目依赖的插件 "gulp":"^3.8.11", "gulp-less":"^3.0.0" } }复制   使用package.json package.json位于模块的目录下,

  • 基本类型:实型(浮点型)

    一、概念 与数学中的实数的概念差不多,在一个值的后面加上一个小数点,该值就成为一个浮点值,C语言中浮点类型有float、double和longdouble; 二、书写形式 类似于科学记数法,称为指数记数法或E记数法,E后面的数字代表数10的指数 三、实型与整型的区别 整数没有小数部分,浮点数有小数部分,表示的具体数字的个数相同 浮点数可以表示的范围比整数大 在任意区间内,存在无穷多个实数,所以计算机的浮点数不能表示区间内的所有的值,表示不精确,可以试着打印输出123456789; 通常浮点数只是实际值的近似值,7.0可能存储为浮点值6.999999 四、浮点数在计算机内部的存储 float与double类型的数据在计算机内部的表示方式相同,都分为:符号位(最高位),指数部和尾数部,因所占存储空间不同,故所能够表示的数值范围和精度不同;   类型 符号位 指数部 尾数部 float 1(第31位) 8(第23~30位) 23(0~22) double 1(第63位) 11(第52~62位) 52(0~51) 十进制小数转换成二进制小数采用"乘2取整,顺序排列

  • Nim函数调用的几种形式

    Nim函数调用的几种形式 Nim 转载条件:如果你需要转载本文,你需要做到完整转载本文所有的内容,不得删改文内的作者名字与链接。否则拒绝转载。 关于nim的例行介绍: Nim是一门静态编译型的系统级编程语言,内置GC,采用像Python一样的缩进风格,Nim代码被翻译成C再编译成可执行文件。 所以nim的特点是兼具简洁,性能不错,可执行文件也比较小,跨平台,开发效率快等等特点。 如果你愿意,Nim也可以被编译成c++、Javascript、OC之类的。 nim的官方网站:https://nim-lang.org/ 关于nim的开发环境: 完整的nim环境由三个部分组成,nim程序、后端编译器、代码编辑器。 nim代码的编译过程大约是:→把nim代码编译成c→再由c编译器编译成可执行文件。 nim编辑器环境我目前推荐vscode+nim扩展,装好就能用,基本不折腾。 codegay2017年9月19日06:33:49 正文: 一开始的时候我注意到nim这可以写echo"haha",也可以写成echo("haha"),让我感觉很好奇。 好了,你现在也知道这两种写法形式是等价的了,更多的

  • macOS切换root账户

    sudo-i复制 之后输入密码即可; 换密码命令: sudopasswdroot复制 输入原密码->新密码即可;

  • 黑盒测试实践——每日例会记录(三)

    2017.11.27例会内容 1.编写软件需求规格说明书小组在今天完成了需求规格说明书的撰写,并上传到小组群中,方便其他小组开展工作。 2.编写测试脚本小组,今天主要是在网上搜索了测试脚本编写的方法,并在QTP上面进行编写一些测试脚本练习,为后面正式的测试脚本的编写做准备。   3.设置测试用例小组,重新复习了老师上课所讲的黑盒测试的边界值测试,等价类测试以及面向场景的测试,同时在网上搜索了有关web黑盒测试的相关资料,为正式的测试用例的编写做准备。   4.博客记录小组,分别跟进了解各组的工作进程,同时在各组内进行工作的协调。   5.今天确定,明天下午上课后进行第一次线下的小组讨论,将各组的工作内容汇总报告。同时为正式的测试工作做一些基本的准备。

  • BZOJ4237稻草人——单调栈+CDQ分治

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形; 左下角和右上角各有一个稻草人; 田地的内部(不包括边界)没有稻草人。 给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数 输入 第一行一个正整数N,代表稻草人的个数 接下来N行,第i行(1<=i<=N)包含2个由空格分隔的整数Xi和Yi,表示第i个稻草人的坐标 输出 输出一行一个正整数,代表遵从启示的田地的个数 样例输入 4 00 22 34 43 样例输出 3 提示  所有满足要求的田地由下图所示:   1<=N<=2*10^5 0<=Xi<=10^9(1<=i<=N) 0<=Yi<=10^9(1<=i<=N) Xi(1<=i<=N)互不相同。 Yi(1<=i<=N)互不相同。   二维平面问题,将一维

相关推荐

推荐阅读