PACNet CellNet(代码开源)|bulk数据作细胞分类,评估细胞命运性能的一大利器
文章目录
- 1.前言
- 2.CellNet
- 2.1CellNet简介
- 2.2CellNet结果
- 3.PACNet
- 3.1安装R包与加载R包
- 3.2加载数据
- 3.3开始训练和分类
- 3.4可视化分类过程
- 3.5可视化分类结果
- 4.细胞命运分类和免疫浸润比较
1.前言
今天冲浪看到一个细胞分类性能评估的R包——PACNet,它与转录组分析方法、计算预处理方法和预处理方法产生的基因可用性无关,因此可以对细胞命运工程方案的性能进行交叉研究比较,这个是新包。
其次还有孪生子弟旧R包,已经停止更新了:CellNet
先讲一下CellNet,因为新包的参考数据集也是共用的,但使用的话我们还是用PACNet哈
2.CellNet
2.1CellNet简介
CellNet
是一个基于网络生物学的计算平台,用于评估细胞工程的保真度,并生成用于改进细胞衍生的假设。CellNet基于细胞类型特异性基因调控网络(GRN
)的重建,有16种小鼠
和16种人类
细胞和组织类型的公开RNA-Seq数据进行重建。
简单过一下CellNet
,目前,有两种方法可以运行CellNet获取RNA-Seq数据。作者提供了云平台
和本地运行
两种方式,因为亚马逊云要氪金,本着白嫖的意思就本地跑一跑了
- Cutadapt
- Salmon
- GNU Parallel
CellNet的核心是随机森林分类器
。这是对细胞命运实验结果进行分类的算法。要使用 CellNet 分析自己的表达数据,需要一个经过训练的 CellNet 分类器对象,我们将其称为 cnProc
(CellNet 处理器)。
第一步需要先构建cnProc
对象,可以自己去构建,相关代码:构建cnProc,优势就是可以增加自己需要研究细胞类型,或者研究人鼠外其他物种。
可以使用作者整理好了的rdata,在github中下载即可:
第二第三步就是RNA数据
(要SRA文件)和索引
了
作者也提供了:
2.2CellNet结果
- 分类热图:在训练数据(行)中显示每个样本(列)对每个细胞和组织类型的分类分数:
pdf(file='hmclass_example.pdf', width=7, height=5)
cn_HmClass(cnRes)
dev.off()
这里可以看到iPSC在胚胎干细胞中分数更高,其次是Day0的几个在成纤维细胞中分数更高。
- Gene Regulatory Network 状态栏图:一种更灵敏的测量,用于测量特定细胞类型的 GRN 在实验数据中建立的程度
fname<-'grnstats_esc_example.pdf'
bOrder<-c("fibroblast_train", unique(as.vector(stQuery$description1)), "esc_train")
cn_barplot_grnSing(cnRes,cnProc,"esc", c("fibroblast","esc"), bOrder, sidCol="sra_id")
ggplot2::ggsave(fname, width=5.5, height=5)
dev.off()
这里关于基因调控网络状态的,如果说热图是一个计算分数绝对值
的匹配,那这里就是对调控网络状态,一个动态
的匹配
- Network Influence Score Box and Whisker Plot:可以更好地调节的转录因子的建议,按其潜在影响进行排序
rownames(stQuery)<-as.vector(stQuery$sra_id)
tfScores<-cn_nis_all(cnRes, cnProc, "esc") fname<-'nis_esc_example_Day0.pdf'
plot_nis(tfScores, "esc", stQuery, "Day0", dLevel="description1", limitTo=0)
ggplot2::ggsave(fname, width=4, height=12)
dev.off()
这个就调控影响分数的排序
3.PACNet
流程和输入文件是与CellNet
一样的,直接跳过开始demo
3.1安装R包与加载R包
install.packages("devtools")
library(devtools)
install_github("pcahan1/CellNet", ref="master")
install_github("pcahan1/cancerCellNet@v0.1.1", ref="master")
source("pacnet_utils.R")library(CellNet)
library(cancerCellNet)
library(plyr)
library(ggplot2)
library(RColorBrewer)
library(pheatmap)
library(plotly)
library(igraph)
3.2加载数据
这里就需要表达矩阵
和元数据列表
。
表达矩阵应将基因符号作为行名,将样本名称作为列名。示例元数据表应将示例名称作为行名,将示例要素作为列名。表达式矩阵的列名必须与元数据表的行名匹配。为了使分类器训练可靠,每种训练类型至少应有 60 个独立rep。
元数据列表的title格式:
加载数据
expTrain <- utils_loadObject("Hs_expTrain_Jun-20-2017.rda")
stTrain <- utils_loadObject("Hs_stTrain_Jun-20-2017.rda")
加载工程参考数据和查询数据
liverRefExpDat <- utils_loadObject("liver_engineeredRef_normalized_expDat_all.rda")
liverRefSampTab <- utils_loadObject("liver_engineeredRef_sampTab_all.rda")
queryExpDat <- read.csv("example_data/example_counts_matrix.csv", row.names=1)
querySampTab <- read.csv("example_data/example_sample_metadata_table.csv")
rownames(querySampTab) <- querySampTab$sample_name
study_name <- "liver_example"
识别交叉基因:
iGenes <- intersect(rownames(expTrain), rownames(liverRefExpDat))
iGenes <- intersect(iGenes, rownames(queryExpDat))
# Subset training expression matrix based on iGenes
expTrain <- expTrain[iGenes,]
3.3开始训练和分类
将数据拆分为训练集和验证集:
set.seed(99) # Setting a seed for the random number generator allows us to reproduce the same split in the future
stList <- splitCommon_proportion(sampTab = stTrain, proportion = 0.66, dLevel = "description1") # Use 2/3 of training data for training and 1/3 for validation
stTrainSubset <- stList$trainingSet
expTrainSubset <- expTrain[,rownames(stTrainSubset)]#See number of samples of each unique type in description1 in training subset
table(stTrainSubset$description1)stValSubset <- stList$validationSet
expValSubset <- expTrain[,rownames(stValSubset)]
#See number of samples of each unique type in description1 in validation subset
table(stValSubset$description1)
训练随机森林分类器,需要 3-10 分钟,具体取决于内存可用性:
system.time(my_classifier <- broadClass_train(stTrain = stTrainSubset, expTrain = expTrainSubset, colName_cat = "description1", colName_samp = "sra_id", nRand = 70, nTopGenes = 100, nTopGenePairs = 100, nTrees = 2000, stratify=TRUE, sampsize=25, # Must be less than the smallest number in table(stTrainSubset$description1)quickPairs=TRUE)) # Increasing the number of top genes and top gene pairs increases the resolution of the classifier but increases the computing time
save(my_classifier, file="example_outputs/cellnet_classifier_100topGenes_100genePairs.rda")
3.4可视化分类过程
- 分类热图:
stValSubsetOrdered <- stValSubset[order(stValSubset$description1), ] #order samples by classification name
expValSubset <- expValSubset[,rownames(stValSubsetOrdered)]
cnProc <- my_classifier$cnProc #select the cnProc from the earlier class trainingclassMatrix <- broadClass_predict(cnProc, expValSubset, nrand = 60)
stValRand <- addRandToSampTab(classMatrix, stValSubsetOrdered, desc="description1", id="sra_id")grps <- as.vector(stValRand$description1)
names(grps)<-rownames(stValRand)# Create validation heatmap
png(file="classification_validation_hm.png", height=6, width=10, units="in", res=300)
ccn_hmClass(classMatrix, grps=grps, fontsize_row=10)
dev.off()
- 验证精度-召回率曲线:
assessmentDat <- ccn_classAssess(classMatrix, stValRand, classLevels="description1", dLevelSID="sra_id")
png(file="example_outputs/classifier_assessment_PR.png", height=8, width=10, units="in", res=300)
plot_class_PRs(assessmentDat)
dev.off()
- 基因对验证:
genePairs <- cnProc$xpairs
# Get gene to gene comparison of each gene pair in the expression table
expTransform <- query_transform(expTrainSubset, genePairs)
avgGenePair_train <- avgGeneCat(expDat = expTransform, sampTab = stTrainSubset, dLevel = "description1", sampID = "sra_id")genePairs_val <- query_transform(expValSubset, genePairs)
geneCompareMatrix <- makeGeneCompareTab(queryExpTab = genePairs_val,avgGeneTab = avgGenePair_train, geneSamples = genePairs)
val_grps <- stValSubset[,"description1"]
val_grps <- c(val_grps, colnames(avgGenePair_train))
names(val_grps) <- c(rownames(stValSubset), colnames(avgGenePair_train))png(file="example_outputs/validation_gene-pair_comparison.png", width=10, height=80, units="in", res=300)
plotGeneComparison(geneCompareMatrix, grps = val_grps, fontsize_row = 6)
dev.off()
该图较大,主要就是基因对的分数热图,这个就是xpairs
图
创建并保存xpairs_list对象,用于 grn 重建和训练规范化参数:
xpairs_list <- vector("list", 14)
for (pair in rownames(avgGenePair_train)) {for (j in 1:ncol(avgGenePair_train)) {if (avgGenePair_train[pair,j] >= 0.5) {if (is.null(xpairs_list[[j]])) {xpairs_list[[j]] <- c(pair)} else { xpairs_list[[j]] <- c(xpairs_list[[j]], pair)}} }
}
xpair_names <- colnames(avgGenePair_train)
xpair_names <- sub(pattern="_Avg", replacement="", x=xpair_names)
names(xpairs_list) <- xpair_namesfor (type in names(xpairs_list)) {names(xpairs_list[[type]]) <- xpairs_list[[type]]
}
save(xpairs_list, file="example_outputs/Hs_xpairs_list.rda")
3.5可视化分类结果
对训练集样本进行分类
classMatrixLiverRef <- broadClass_predict(cnProc = cnProc, expDat = liverRefExpDat, nrand = 10)
grp_names1 <- c(as.character(liverRefSampTab$description1), rep("random", 10))
names(grp_names1) <- c(as.character(rownames(liverRefSampTab)), paste0("rand_", c(1:10)))# Re-order classMatrixQuery to match order of rows in querySampTab
classMatrixLiverRef <- classMatrixLiverRef[,names(grp_names1)]png(file="example_outputs/heatmapLiverRef.png", height=12, width=9, units="in", res=300)
heatmapRef(classMatrixLiverRef, liverRefSampTab) # This function can be found in pacnet_utils.R
dev.off()# Alternatively, for an interactive plotly version:
heatmapPlotlyRef(classMatrixLiverRef, liverRefSampTab)
对测试集进行分类:
queryExpDat <- log(1+queryExpDat)
classMatrixQuery <- broadClass_predict(cnProc = cnProc, expDat = queryExpDat, nrand = 3)
grp_names <- c(as.character(querySampTab$description1), rep("random", 3))
names(grp_names) <- c(as.character(rownames(querySampTab)), paste0("rand_", c(1:3)))# Re-order classMatrixQuery to match order of rows in querySampTab
classMatrixQuery <- classMatrixQuery[,names(grp_names)]save(classMatrixQuery, file="example_outputs/example_classificationMatrix.rda")png(file="example_outputs/query_classification_heatmap.png", height=4, width=8, units="in", res=300)
# This function can be found in pacnet_utils.R
acn_queryClassHm(classMatrixQuery, main = paste0("Classification Heatmap, ", study_name), grps = grp_names, fontsize_row=10, fontsize_col = 10, isBig = FALSE)
dev.off()
计算调控因子得分
## 准备用于网络影响得分计算的 GRN 和表达式数据
## 基于交叉基因的子集和对象:grnAll,trainNormParam
grnAll <- utils_loadObject("liver_grnAll.rda")
trainNormParam <- utils_loadObject("liver_trainNormParam.rda")# These two functions can be found in pacnet_utils.R
grnAll <- subsetGRNall(grnAll, iGenes)
trainNormParam <- subsetTrainNormParam(trainNormParam, grnAll, iGenes)queryExpDat_ranked <- logRank(queryExpDat, base = 0)
queryExpDat_ranked <- as.data.frame(queryExpDat_ranked)## 计算转录调节因子的计算网络影响评分 (NIS)
network_cell_type <- "liver"
target_cell_type <- "liver"
system.time(TF_scores <- pacnet_nis(expDat = queryExpDat_ranked, stQuery=querySampTab, iGenes=iGenes,grnAll = grnAll, trainNorm = trainNormParam,subnet = network_cell_type, ctt=target_cell_type,colname_sid="sample_name", relaWeight=0))save(TF_scores, file="example_outputs/my_study_TF_scores.rda")## 选择得分最高的 25 个 TF 进行绘图:
TFsums <- rowSums(abs(TF_scores))
ordered_TFsums <- TFsums[order(TFsums, decreasing = TRUE)]
if(length(TFsums) > 25) {top_display_TFs <- names(ordered_TFsums)[1:25]
} else {top_display_TFs <- names(ordered_TFsums)
}
TF_scores <- TF_scores[top_display_TFs,]## 绘制 TF 分数:
sample_names <- rownames(querySampTab)pdf(file="example_outputs/my_study_TF_scores_my_cell_type.pdf", height=6, width=8)
for(sample in sample_names) {descript <- querySampTab$description1[which(rownames(querySampTab) == sample)]plot_df <- data.frame("TFs" = rownames(TF_scores),"Scores" = as.vector(TF_scores[,sample]))sample_TFplot <- ggplot(plot_df, aes(x = reorder(TFs,Scores,mean) , y = Scores)) + geom_bar(stat="identity") + #aes(fill = medVal)) +theme_bw() + ggtitle(paste0(sample, ", ", descript, ", ", target_cell_type, " transcription factor scores")) +ylab("Network influence score") + xlab("Transcriptional regulator") + theme(legend.position = "none", axis.text = element_text(size = 8)) +theme(text = element_text(size=10), legend.position="none",axis.text.x = element_text(angle = 45, vjust=0.5))print(sample_TFplot)
}
dev.off()
阴性 TF 评分
表明给定的 TF 应该上调
以获得与靶细胞类型更相似的身份。正 TF 评分
表明给定的 TF 应下调
以获得与靶细胞类型更相似的身份。
4.细胞命运分类和免疫浸润比较
- 免疫浸润评估主要是指在特定组织(如肿瘤组织)中,不同类型的免疫细胞的存在与活性的分析。这涉及到分析如何及在什么程度上各种免疫细胞(例如
T细胞
、B细胞
、巨噬细胞
等)参与到组织的免疫应答中。免疫浸润的水平可以作为疾病预后的一个重要指标,特别是在癌症研究中,高水平的免疫浸润通常与较好的预后相关。 - 拿常见的CIBERSORT来看,这是用于从复杂的组织表达数据中,通过特征矩阵例如LM22估计细胞组成的相对丰度的免疫浸润方法。
- PACNet是用于分析特别是在癌症研究中常见的多组分样本(如肿瘤微环境中的细胞)。它提供了一种网络方法,通过整合表达数据和先验分子网络信息,来预测样本中细胞类型的丰度。
- 各有侧重,CIBERSORT 更专注于从复杂组织样本中准确估计免疫细胞的丰度,而 PACNet 则提供了一种网络分析方法,不仅可以估计细胞丰度,还可以探究细胞之间的相互作用和网络结构。
对于做分化、做干细胞、做肿瘤分型等来说,这真是一大利器,埋下伏笔,下期更新单细胞的~
相关文章:

PACNet CellNet(代码开源)|bulk数据作细胞分类,评估细胞命运性能的一大利器
文章目录 1.前言2.CellNet2.1CellNet简介2.2CellNet结果 3.PACNet3.1安装R包与加载R包3.2加载数据3.3开始训练和分类3.4可视化分类过程3.5可视化分类结果 4.细胞命运分类和免疫浸润比较 1.前言 今天冲浪看到一个细胞分类性能评估的R包——PACNet,它与转录组分析方法…...
(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(定义属性)
第10章 属性和事件 在过去的三章中,我已经介绍了Object Pascal中面向对象编程(OOP)的基础知识,解释了这些概念并展示了大多数面向对象编程语言中通用特性是如何具体实现的。自Delphi的早期,Object Pascal语言就是一…...

【网络安全 | 密码学】JWT基础知识及攻击方式详析
前言 JWT(Json Web Token)是一种用于在网络应用之间安全地传输信息的开放标准。它通过将用户信息以JSON格式加密并封装在一个token中,然后将该token发送给服务端进行验证,从而实现身份验证和授权。 流程 JWT的加密和解密过程如…...

Chrome修改主题颜色
注意:自定义Chrome按钮只在搜索引擎为Google的时候出现。...
大数据:【学习笔记系列】Flink基础架构
Apache Flink 是一个开源的流处理框架,用于处理有界和无界的数据流。Flink 设计用于运行在所有常见的集群环境中,并且能够以高性能和可扩展的方式进行实时数据处理和分析。下面将详细介绍 Flink 的基础架构组件和其工作原理。 1. Flink 架构概览 Flink…...
Debezium系列之:部署Debezium采集Oracle数据库的详细步骤
Debezium系列之:部署Debezium采集Oracle数据库的详细步骤 一、部署Debezium Oracle连接器二、Debezium Oracle 连接器配置三、添加连接器配置四、可插拔数据库与不可插拔数据库一、部署Debezium Oracle连接器 部署的详细步骤可以参考博主这篇技术文章: Debezium系列之:安装…...

C语言通过键盘输入给结构体内嵌的结构体赋值——指针法
1 需求 以录入学生信息(姓名、学号、性别、出生日期)为例,首先通过键盘输入需要录入的学生的数量,再依次输入这些学生的信息,输入完成后输出所有信息。 2 代码 #include<stdio.h> #include<stdlib.h>//…...

AWS Key disabler:AWS IAM用户访问密钥安全保护工具
关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具,该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥,以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…...

【第1节】书生·浦语大模型全链路开源开放体系
目录 1 简介2 内容(1)书生浦语大模型发展历程(2)体系(3)亮点(4)全链路体系构建a.数据b 预训练c 微调d 评测e.模型部署f.agent 智能体 3 相关论文解读4 ref 1 简介 书生浦语 InternLM…...
代码随想录-链表 | 707设计链表
代码随想录-数组 | 707设计链表 LeetCode 707-设计链表解题思路代码复杂度难点总结 LeetCode 707-设计链表 题目链接 题目描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点…...

AIGC算法1:Layer normalization
1. Layer Normalization μ E ( X ) ← 1 H ∑ i 1 n x i σ ← Var ( x ) 1 H ∑ i 1 H ( x i − μ ) 2 ϵ y x − E ( x ) Var ( X ) ϵ ⋅ γ β \begin{gathered}\muE(X) \leftarrow \frac{1}{H} \sum_{i1}^n x_i \\ \sigma \leftarrow \operatorname{Var}(…...

【C语言】——字符串函数的使用与模拟实现(下)
【C语言】——字符串函数的使用与模拟实现(下) 前言五、长度受限类字符串函数5.1、 s t r n c p y strncpy strncpy 函数5.2、 s t r n c a t strncat strncat 函数5.3、 s t r n c m p strncmp strncmp 函数 六、 s t r s t r strstr strstr 函数6.1、函…...

mac安装nvm详细教程
0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…...

上线流程及操作
上节回顾 1 搜索功能-前端:搜索框,搜索结果页面-后端:一种类型课程-APIResponse(actual_courseres.data.get(results),free_course[],light_course[])-搜索,如果数据量很大,直接使用mysql,效率非常低--》E…...

MobX入门指南:快速上手状态管理库
一、什么是MobX MobX 是一个状态管理库,它可以让你轻松地管理应用程序的状态,并且可以扩展和维护。它使用观察者模式来自动传播你的状态的变化到你的 React 组件。 二、安装及配置 安装 MobX 和 MobX-React:你可以使用 npm 或 yarn 安装这…...
技术洞察:Selenium WebDriver中Chrome, Edge, 和IE配置的关键区别
综述 webdriver.EdgeOptions(), webdriver.ChromeOptions(), 和 webdriver.IeOptions() 都是 Selenium WebDriver 的配置类,用于定制化启动各自浏览器的设置。它们分别对应 Microsoft Edge,Google Chrome,和 Internet Explorer 浏览器。 每…...
使用自定义OCR提升UIE-X检测效果:结合PaddleOCR和UIE模型进行文档信息提取
在实际应用中,识别文档中的特定信息对于许多任务至关重要,例如发票识别、表格信息提取等。然而,由于文档的多样性和复杂性,传统的光学字符识别(OCR)技术可能无法准确识别文档中的信息。为了解决这个问题&am…...
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog con…...

.net反射(Reflection)
文章目录 一.概念:二.反射的作用:三.代码案例:四.运行结果: 一.概念: .NET 反射(Reflection)是指在运行时动态地检查、访问和修改程序集中的类型、成员和对象的能力。通过反射,你可…...

P1278 单词游戏 简单搜索+玄学优化
单词游戏 传送门 题目描述 Io 和 Ao 在玩一个单词游戏。 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。 游戏可以从任何一个单词开始。 任何单词禁止说两遍,游戏中只能使用给定词典中含有…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...