lin_20240321_calculating_rG4score.R

1.使用上一步的结果来计算RG4
用法和脚本如下:

################################################################################
################# Function used for the G4Hunter paper #########################
################################################################################
#### L. Lacroix, laurent.lacroix@inserm.fr , 20150928################################################################################
###### G4translate change the DNA code into G4Hunter code.
###### Only G or C are taken into account. non G/C bases are translated in 0
###### It is OK if N or U are in the sequence
###### but might be a problem if other letters or numbers are present
###### lowercase ARE not welcome 
G4translate <- function(x)		# x is a Rle of a sequence
{xres=xrunValue(xres)[runValue(x)=='C' & runLength(x)>3] <- -4runValue(xres)[runValue(x)=='C' & runLength(x)==3] <- -3runValue(xres)[runValue(x)=='C' & runLength(x)==2] <- -2runValue(xres)[runValue(x)=='C' & runLength(x)==1] <- -1runValue(xres)[runValue(x)=='G' & runLength(x)>3] <- 4runValue(xres)[runValue(x)=='G' & runLength(x)==3] <- 3runValue(xres)[runValue(x)=='G' & runLength(x)==2] <- 2runValue(xres)[runValue(x)=='G' & runLength(x)==1] <- 1runValue(xres)[runValue(x)!='C' & runValue(x)!='G'] <- 0Rle(as.numeric(xres))
}
################################################################################################################################################################
###### G4Hscore return the G4Hscore of a sequence
###### The output is a number
G4Hscore <- function(y)		# y can be DNAString or a DNAStringSet or a simple char string.
{require(S4Vectors)y2 <- Rle(strsplit(as.character(y),NULL)[[1]])y3 <- G4translate(y2)mean(y3)
}
################################################################################################################################################################
###### G4runmean return the G4Hscore in a window of 25 using runmean.
###### The output is a Rle of the runmeans
G4runmean <- function(y,k=25)		#y is a DNAString or a DNAStringSet, k is the window for the runmean
{require(S4Vectors)y2 <- Rle(strsplit(as.character(y),NULL)[[1]])y3 <- G4translate(y2)runmean(y3,k)
}
################################################################################################################################################################
#### function to extract sequences with abs(G4Hscore)>=hl (threshold)
#### from a chromosome (i) of a genome (gen) 
#### return a GRanges
#### use masked=5 for unmasked genome
#### need a genome to be in the memory in the genome variable
#### k is the window size for the runmean
#### i is the chromosome number
#### hl is the thresholdG4hunt <- function(i,k=25,hl=1.5,gen=genome,masked=5)
{require(GenomicRanges)chr <- gen[[i]]if (masked==2) {chr=injectHardMask(chr)}if (masked==3) {active(masks(chr))['RM']=T;chr=injectHardMask(chr)}if (masked==0) {active(masks(chr))=F;chr=injectHardMask(chr)}if (masked==4) {active(masks(chr))=T;chr=injectHardMask(chr)}chr_G4hk <- G4runmean(chr,k)tgenome <- G4translate(Rle(strsplit(as.character(chr),NULL)[[1]]))if (class(gen)=="DNAStringSet"){seqname <- names(gen)[i]}else{seqname <- seqnames(gen)[i]}	j <- hlchrCh <- Views(chr_G4hk, chr_G4hk<=(-j))chrGh <- Views(chr_G4hk, chr_G4hk>=j)IRC <- IRanges(start=start(chrCh),end=(end(chrCh)+k-1))IRG <- IRanges(start=start(chrGh),end=(end(chrGh)+k-1))nIRC <- reduce(IRC)nIRG <- reduce(IRG)# overlapping results on the same strand are fusednchrCh <- Views(chr_G4hk,start=start(nIRC),end=(end(nIRC)-k+1))nchrGh <- Views(chr_G4hk,start=start(nIRG),end=(end(nIRG)-k+1))nscoreC <- signif(mean(Views(tgenome,nIRC)),3)nscoreG <- signif(mean(Views(tgenome,nIRG)),3)nstraC <- Rle(rep('-',length(nIRC)))nstraG <- Rle(rep('+',length(nIRG)))nhlC <- Rle(rep(j,length(nIRC)))nhlG <- Rle(rep(j,length(nIRG)))nkC <- Rle(rep(k,length(nIRC)))nkG <- Rle(rep(k,length(nIRG)))maskC <- Rle(rep(masked,length(nIRC)))maskG <- Rle(rep(masked,length(nIRG)))if (length(nIRC)==0){nxC <- GRanges()                                }else{      nxC <- GRanges(seqnames=Rle(seqname),ranges=nIRC,strand=nstraC,score=nscoreC,hl=nhlC,k=nkC,mask=maskC)}if (length(nIRG)==0){        nxG <- GRanges()}else{          nxG <- GRanges(seqnames=Rle(seqname),ranges=nIRG,strand=nstraG,score=nscoreG,hl=nhlG,k=nkG,mask=maskG)}nx <- c(nxC,nxG)return(nx)
}
################################################################################################################################################################
##### like G4hunt but for several thresholds
##### warning, if the list of threshold is created with the seq function
##### rounding error can occur
##### return a GRangesList
G4huntlist <- function(i,k=25,hl=c(1,1.2,1.5,1.75,2),gen=genome,masked=5)
{require(GenomicRanges)nx <- list()chr <- gen[[i]]if (masked==2) {chr=injectHardMask(chr)}if (masked==3) {active(masks(chr))['RM']=T;chr=injectHardMask(chr)}if (masked==0) {active(masks(chr))=F;chr=injectHardMask(chr)}if (masked==4) {active(masks(chr))=T;chr=injectHardMask(chr)}chr_G4hk <- G4runmean(chr,k)tgenome <- G4translate(Rle(strsplit(as.character(chr),NULL)[[1]]))if (class(gen)=="DNAStringSet"){seqname <- names(gen)[i]}else{seqname <- seqnames(gen)[i]}hl <- round(hl,2)		for (j in hl){chrCh <- Views(chr_G4hk, chr_G4hk<=(-j))chrGh <- Views(chr_G4hk, chr_G4hk>=j)IRC <- IRanges(start=start(chrCh),end=(end(chrCh)+k-1))IRG <- IRanges(start=start(chrGh),end=(end(chrGh)+k-1))nIRC <- reduce(IRC)nIRG <- reduce(IRG)# overlapping results on the same strand are fusednchrCh <- Views(chr_G4hk,start=start(nIRC),end=(end(nIRC)-k+1))nchrGh <- Views(chr_G4hk,start=start(nIRG),end=(end(nIRG)-k+1))nscoreC <- signif(mean(Views(tgenome,nIRC)),3)nscoreG <- signif(mean(Views(tgenome,nIRG)),3)nstraC <- Rle(rep('-',length(nIRC)))nstraG <- Rle(rep('+',length(nIRG)))nhlC <- Rle(rep(j,length(nIRC)))nhlG <- Rle(rep(j,length(nIRG)))nkC <- Rle(rep(k,length(nIRC)))nkG <- Rle(rep(k,length(nIRG)))maskC <- Rle(rep(masked,length(nIRC)))maskG <- Rle(rep(masked,length(nIRG)))if (length(nIRC)==0){nxC <- GRanges()                                }else{      nxC <- GRanges(seqnames=Rle(seqname),ranges=nIRC,strand=nstraC,score=nscoreC,hl=nhlC,k=nkC,mask=maskC)}if (length(nIRG)==0){        nxG <- GRanges()}else{          nxG <- GRanges(seqnames=Rle(seqname),ranges=nIRG,strand=nstraG,score=nscoreG,hl=nhlG,k=nkG,mask=maskG)}nx[[which(hl==j)]]=c(nxC,nxG)}names(nx) <- as.character(hl)nx <- GRangesList(nx)return(nx)
}
##################################################################################################################################################################### function to refine G4hunt resultsG4startrun <- function(y,chrom=chr,letter='C')	#y is a START
{if (y!=1){if (letter(chrom,y)==letter){while (letter(chrom,y-1)==letter) {y <- y-1}}else{y <- y+1while (letter(chrom,y)!=letter) {y <- y+1}}}	return(y)
}G4endrun <- function(y,chrom=chr,letter='C')	#y is a END
{if (y!=length(chrom)){if (letter(chrom,y)==letter){while (letter(chrom,y+1)==letter) {y <- y+1}}else{y <- y-1while (letter(chrom,y)!=letter) {y <- y-1}}}return(y)
}	
################################################################################################################################################################G4huntrefined <- function(Res_hl,gen=genome,i=25)		# take in input the result from the function G4hunt, a GRanges# it also require a genome and chromosome number (i) to extract the seq # and  to build the GRanges
{chr <- gen[[i]]if (class(gen)=="DNAStringSet"){seqname <- names(gen)[i]}else{seqname <- seqnames(gen)[i]}Reschr <- Res_hl[seqnames(Res_hl)==seqname]		tgenome <- G4translate(Rle(strsplit(as.character(chr),NULL)[[1]]))### C treatment ReschrC <- Reschr[which(score(Reschr)<0)]IRC <- IRanges(start=start(ReschrC),end=end(ReschrC))if (length(IRC)==0){totC <- NULL                                }else{chr_transC <- Views(tgenome,IRC)nnIRC <- IRCstart(nnIRC) <- sapply(start(IRC),G4startrun,letter='C',chrom=chr)end(nnIRC) <- sapply(end(IRC),G4endrun,letter='C',chrom=chr)nG4scoreC <- signif(mean(Views(tgenome,nnIRC)),3)nnseqC <- as.character(Views(chr,nnIRC))totC <- cbind.data.frame(start(nnIRC),end(nnIRC),nnseqC,nG4scoreC)names(totC) <- c('newstart','newend','newseq','newG4h')}### G treatmentReschrG <- Reschr[which(score(Reschr)>0)]IRG=IRanges(start=start(ReschrG),end=end(ReschrG))if (length(IRG)==0){totG <- NULL                            }else{chr_transG <- Views(tgenome,IRG)nnIRG <- IRGstart(nnIRG) <- sapply(start(IRG),G4startrun,letter='G',chrom=chr)end(nnIRG) <- sapply(end(IRG),G4endrun,letter='G',chrom=chr)nG4scoreG <- signif(mean(Views(tgenome,nnIRG)),3)nnseqG <- as.character(Views(chr,nnIRG))totG <- cbind.data.frame(start(nnIRG),end(nnIRG),nnseqG,nG4scoreG)names(totG) <- c('newstart','newend','newseq','newG4h')}if (is.null(totC) & is.null(totG)){tot2 <- NULLtot2GR <- NULL}else{tot <- rbind.data.frame(totC,totG)tot2 <- tot[order(tot[,'newstart']),]stra <- sign(tot2$newG4h)stra[stra==1] <- '+'stra[stra=='-1'] <- '-'tot2GR <- GRanges(seqnames=Rle(seqname,length(tot2$newstart)), ranges=IRanges(start=tot2$newstart,end=tot2$newend),strand=Rle(stra),score=tot2$newG4h,sequence=tot2$newseq,seqinfo=seqinfo(gen))}return(tot2GR)
}
################################################################################################################################################################
#### Home made function to test if a sequence matchs with a Quadparser type G4
#### this function return 1 if there is a seqence matching the pattern 
#### "G{gmin,gmax}.{lmin,lmax}G{gmin,gmax}.{lmin,lmax}Ggmin,gmax}.{lmin,lmax}G{gmin,gmax}"
#### by default, the pattern is "G{3,}.{1,7}G{3,}.{1,7}G{3,}.{1,7}G{3,}"
#### the function return -1 for a match on the complementary strand
QPtest <- function(sequence,gmin=3,gmax='',lmin=1,lmax=7){ Gpat <- paste('G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}',sep='')Cpat <- paste('C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}',sep='')Gres <- gregexpr(Gpat, sequence, perl=T)Cres <- gregexpr(Cpat, sequence, perl=T)output <- 0if (Gres[[1]][1]>0){output <- 1}if (Cres[[1]][1]>0){output <- -1}return(output)	
}
################################################################################################################################################################
#### Homemade function for Quadparser
quadparser <- function(i,gen=genome,gmin=3,gmax='',lmin=1,lmax=7)# this function extract form a chromosome 'i' in a genome from a BSGenome all the sequence matching the Gpattern# "G{gmin,gmax}.{lmin,lmax}G{gmin,gmax}.{lmin,lmax}Ggmin,gmax}.{lmin,lmax}G{gmin,gmax}"# or its complement pattern# by default, the pattern is "G{3,}.{1,7}G{3,}.{1,7}G{3,}.{1,7}G{3,}"# the Gpat2/Cpat2 pattern are here to compensate the issue with overlapping sequences excluded from gregexpr
{require(GenomicRanges)	Gpat <- paste('G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}',sep='')Cpat <- paste('C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}',sep='')Gpat2 <- paste('G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}.{',lmin,',',lmax,'}G{',gmin,',',gmax,'}','(.{',lmin,',',lmax,'}G{',gmin,',',gmax,'})?',sep='')Cpat2 <- paste('C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}.{',lmin,',',lmax,'}C{',gmin,',',gmax,'}','(.{',lmin,',',lmax,'}C{',gmin,',',gmax,'})?',sep='')if (class(gen)=="DNAStringSet"){seqname <- names(gen)[i]}else{seqname <- seqnames(gen)[i]}	seqinf=seqinfo(gen)	Gres <- gregexpr(Gpat, gen[[i]], perl=T)Cres <- gregexpr(Cpat, gen[[i]], perl=T)Gres2 <- gregexpr(Gpat2, gen[[i]], perl=T)Cres2 <- gregexpr(Cpat2, gen[[i]], perl=T)if (Gres[[1]][1]>0) {Gwidth <- attr(Gres[[1]],"match.length")Gstart <- unlist(Gres)G4Ranges <- GRanges(seqnames=seqname,IRanges(start=Gstart,width=Gwidth),strand='+',seqinfo=seqinf)}else{G4Ranges <- GRanges()}if (Cres[[1]][1]>0)		{Cwidth <- attr(Cres[[1]],"match.length")Cstart <- unlist(Cres)C4Ranges <- GRanges(seqnames=seqname,IRanges(start=Cstart,width=Cwidth),strand='-',seqinfo=seqinf)}else{C4Ranges <- GRanges()}	if (Gres2[[1]][1]>0) {Gwidth2 <- attr(Gres2[[1]],"match.length")Gstart2 <- unlist(Gres2)G4Ranges2 <- GRanges(seqnames=seqname,IRanges(start=Gstart2,width=Gwidth2),strand='+',seqinfo=seqinf)}else{G4Ranges2 <- GRanges()}if (Cres2[[1]][1]>0)		{Cwidth2 <- attr(Cres2[[1]],"match.length")Cstart2 <- unlist(Cres2)C4Ranges2 <- GRanges(seqnames=seqname,IRanges(start=Cstart2,width=Cwidth2),strand='-',seqinfo=seqinf)}else{C4Ranges2 <- GRanges()}	res <- sort(reduce(c(G4Ranges,C4Ranges,G4Ranges2,C4Ranges2)),ignore.strand=T)res$seq <- as.character(Views(gen[[i]],ranges(res)))return(res)
}	
################################################################################################################################################################
#### a function to transform a GRanges of G4FS to G4FS per kb, used to generate bigwig
G4GR2bigwig <- function(gr,gen=genome,mcore=mcore)
{chrlist <- 1:length(seqlevels(gr))tt=mclapply(chrlist,function(y) {a=GRanges(seqnames=seqnames(gen)[y],ranges=breakInChunks(totalsize=seqlengths(gen)[y],chunksize=1000),strand='*',seqinfo=seqinfo(gr))a$score=countOverlaps(a,resize(gr[seqnames(gr)==seqnames(gen)[y]],fix='center',width=1),ignore.strand=T)return(a)},mc.cores=mcore)zc=do.call(c,tt)return(zc)
}	
##################################
#usage:Rscript lin_calculating_rg4score.R -i lijinonextended_3utr_allrg4output.fasta -o lijinonextended_3utr_allrg4output1.fasta
library(tidyverse)
library(getopt)command=matrix(c( 'help','h',0,'loical','显示此帮助信息','input','i',1,'character','输入文件','output','o',2,'character','输出文件'),byrow=T, ncol=5
)
args=getopt(command)# 当未提供参数显示帮助信息
if (!is.null(args$help) || is.null(args$input)) {cat(paste(getopt(command, usage = T), "\n"))q(status=1)
}# 设置默认值
if ( is.null(args$output)) {args$output = "output.txt"
}df<-read.table(args$input,sep="\t",header=FALSE,fill=TRUE)RefSet3utr <- read.table(args$input,header=T)
RefSet3utr[,3] <- sapply(RefSet3utr[,2],function(x) signif(G4Hscore(x),3))
names(RefSet3utr)[3] <- 'G4Hscore'
RefSet3utr<-separate(RefSet3utr,col=Id,sep ='_',remove = TRUE,into=as.character(c(1:5)))
colnames(RefSet3utr)<-c("Id","Type","Start","End","total_length","Sequence","G4Hscore")
RefSet3utr<-RefSet3utr%>% filter(G4Hscore!="NA") %>% arrange(Id,Start)
# RefSet3utr1 <- RefSet3utr %>% distinct(Id,Start,.keep_all = TRUE)%>% arrange(Id,Start)
write.table(as.data.frame(RefSet3utr),args$output,quote=FALSE,sep='\t',row.names=FALSE)
# write.table(as.data.frame(RefSet3utr1),'zzzout123.txt',sep='\t',row.names=FALSE,quote=FALSE)

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

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

相关文章

【C语言】指针基础

指针是C语言中的一个重要概念&#xff0c;也是其强大功能的核心之一。理解指针的基础知识对于编写高效、灵活的C语言程序至关重要。本文将介绍指针的基本概念、用法以及一些常见的技巧和注意事项&#xff0c;旨在帮助读者建立起对C语言指针的全面理解&#xff0c;并能够熟练地运…

Python程序设计 类与继承

一. 继承的概念 生活中的继承&#xff0c;一般指的是子女继承父辈的财产。 拓展1&#xff1a;经典类或旧式类 不由任意内置类型派生出的类&#xff0c;称之为经典类。 class 类名:代码...... 拓展2&#xff1a;新式类 # 父类A class A(object):def __init__(self):self.n…

error: ‘mutex’ in namespace ‘boost’ does not name a type 解决办法

在ubuntu下使用make编译的时候出现错误&#xff1a; error: ‘boost::mutex’ has not been declared 以及&#xff1a; error: ‘mutex’ in namespace ‘boost’ does not name a type 等错误&#xff0c;原因是有可能是没有安装boost或者是没有添加boost头文件&#xff…

使用Python的scipy.integrate计算微积分

先上一个二重积分计算&#xff0c;来自2022年考研数学第二题 进行计算前先在终端下载 scipy包 pip install scipy 在脚本中先导入所需要的模块 import scipy.integrate as spi 定义函数f(x, y) &#xff0c;所得值返回 def f(x, y): return y / (1 x**3)**0.5 定义…

基于springboot+vue的影院订票系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

LeetCode Python - 71. 简化路径

目录 题目描述解法运行结果 题目描述 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&…

一图理解递归-算法通关村

一图理解递归-算法通关村 递归是我们算法进阶的基础&#xff0c;是必须要掌握的内容&#xff0c;只有掌握了递归才算真的会算法。与递归有关的问题有&#xff1a; 与树和二叉树相关的大部问题二分查找相关的问题快速排序、归并排序相关的问题所有回溯的问题所有动态规划的问题 …

大数据分析-基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

概要 随着科学技术的发展&#xff0c;人类进入了互联网时代&#xff0c;不仅数据量庞大&#xff0c;而且数据种类繁多&#xff0c;Python简单易学, 语法清晰&#xff0c;在数据操作方面有着一定优势&#xff0c;成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来…

golang 使用AES加密

在使用AES加密数据后&#xff0c;将加密结果使用base64.StdEncoding.EncodeToString处理的原因是多方面的&#xff1a; 可读性&#xff1a;AES加密后的数据通常是二进制格式&#xff0c;直接查看或处理这些二进制数据不方便也不直观。Base64编码将这些二进制数据转换为ASCII字符…

Kruskal最小生成树【详细解释+动图图解】【sort中的cmp函数】 【例题:洛谷P3366 【模板】最小生成树】

文章目录 Kruskal算法简介Kruskal算法前置知识sort 中的cmp函数 算法思考样例详细示范与解释kruskal模版code↓ 例题&#xff1a;洛谷P3366 【模板】最小生成树code↓完结撒花QWQ Kruskal算法简介 K r u s k a l Kruskal Kruskal 是基于贪心算法的 M S T MST MST 算法&#xff…

导师坚鹏:厦门火炬高新区数字化转型战略蓝图从规划到落地培训

厦门火炬高新区战略制胜&#xff1a;数字化转型战略蓝图从规划到落地培训 厦门国家火炬高技术产业开发区&#xff08;简称“厦门国家火炬高新区”&#xff09;1991年被国务院批准为全国首批国家级高新区&#xff0c;是全国三个以“火炬”冠名的国家高新区之一。目前&#xff0c…

CPU密集的高效访问和数据安全

import asyncio import concurrent.futures import random # 全局变量&#xff0c;用于存储计算结果的列表 list1 [] list2 [] lock asyncio.Lock() # 异步锁 # CPU计算密集型任务 async def cpu_intensive_task(): global list1, list2 # 获取异步锁 async with…

Excel通过下拉菜单,显示不同图片

背景&#xff1a;有的时候需要通过更改下拉菜单来改变对应的 值/ 图片。 如果是数值的话就是我们常常用的Vlookup&#xff0c;这个可以很简单的实现这个功能。&#xff08;这个如果不知道请自行百度&#xff09; 但是如果是图片呢&#xff1f;这个就不常见了&#xff0c;那么…

Unity中关于SendMessage方法

在Unity中&#xff0c;SendMessage 方法用于在游戏对象及其所有子对象上调用指定名称的方法。这种方法可以用于在不需要知道接收方的确切类型的情况下&#xff0c;向游戏对象发送消息。 基本语法如下&#xff1a; void SendMessage(string methodName, object value null, S…

机器学习:随机森林算法

随机森林算法 决策树与随机森林随机森林 决策树与随机森林 随机森林可以看作一个决策树的集合&#xff0c;由n个子训练集得到的决策树组成。 决策树&#xff08;Decision tree&#xff09;是一种特殊的树结构&#xff0c;由一个决策图和可能的结果&#xff08;例如成本和风险…

java使用socket实现一个简单的聊天室

1. 服务端 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class ChatServer {private static final int PORT 8070;private static List<ClientHandler> clients ne…

芯片工程系列(5)2.5D 3D封装

0 英语缩写 硅通孔&#xff08;Through Silicon Via&#xff0c;TSV&#xff09;硅中介层&#xff08;Silicon Interposer&#xff09;物理气象沉淀法&#xff08;Physical Vapor Deposition&#xff0c;PVD&#xff09;DRIE、CVD、PVD、CMP等设备CoWoS&#xff08;Chip on Wa…

【开发环境搭建篇】Nacos的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

利用K8S Statefulset搭建Etcd集群 - 本地存储

目录 概述测试环境yaml配置service.yamlcluster.yaml Q&A参考链接 概述 公司因项目需要使用K8S部署ETCD集群供其他业务调用&#xff0c;网上搜索了解了下&#xff0c;一般K8S搭建ETCD集群大部分都是使用Etcd Operator来搭建。但是公司的项目运行在离线ARM架构平台&#xf…

安卓手机系统跳过app启动广告软件

跳过广告关于此应用声明&#xff1a; 应用利用了安卓系统的辅助功能API&#xff0c;可以读取您手机屏幕上显示的所有内容&#xff0c;并且可以以您的名义进行屏幕点击等操作。* 轻量无广告&#xff0c;不联网&#xff0c;也不需要任何权限&#xff1b;* 请务必在系统设置中开启…