当前位置: 首页 > news >正文

内网如何做网站访问/论坛推广的特点

内网如何做网站访问,论坛推广的特点,做一个网站需要多少钱,网站里弹窗怎么做前言 上期讲了如何在windows平台搭建Java后端的开发环境,并给出了一个简单的hello world级别的多模块代码示例。但上期仅仅是在IDEA中运行,和正式的生产环境完全不同。 本期将讲解,如何配置SpringBoot多模块项目的maven打包,并分…

前言

上期讲了如何在windows平台搭建Java后端的开发环境,并给出了一个简单的hello world级别的多模块代码示例。但上期仅仅是在IDEA中运行,和正式的生产环境完全不同。
本期将讲解,如何配置SpringBoot多模块项目的maven打包,并分离出lib和resource。

真实的项目,不可能是运行在IDEA里的。实际的生产,一般有两种模式。一则把写好的项目打包成Jar包,通过命令启动jar包;另一种则是把项目打包成一个docker镜像,使用镜像启动。我们这里先讨论Jar包启动的情况。

一、打包配置

1.1 默认情况

我们直接在根目录点击package,会在各自模块生成一个target的文件夹,里面就有我们打包好的包。
在这里插入图片描述
我们随便找一个包,打开看看,会发现我们打的包异常的小,只有几十k。
拿我们的主业务模块general-test来说,包只包含3个模块,我们的代码,maven相关配置以及静态资源。application.yml放在最外层。
在这里插入图片描述
毫无疑问,这样的包是无法直接通过java -jar命令运行的。

1.2 springboot 打包插件

在根pom中,添加打包插件的版本引用

<build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version></plugin></plugins></pluginManagement></build>

而后,在general-test的pom下,添加如下内容

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

再次clean,package后,观察现象。我们首先可以看到,包的大小已经正常了
在这里插入图片描述
使用winRar打开,可以发现如下目录
在这里插入图片描述
org中,放了SpringFramework的相关内容,
META-INF放了maven的pom引用以及jar包服务信息
BOOT-INF下结构如下
在这里插入图片描述
lib放置了项目引用需要的包,包括自己写的core-common,core-enum-memo
而classes下,则放着本包的代码。
我们在打好包的位置,单击右键,打开命令行。
java -jar general-test-1.0.0.jar
即可启动服务器。
如果出现找不到favicon.ico的错误,可以在resources/static下放一个你喜欢的美少女头像,记得转成ico格式哦。

1.3 资源和配置文件的分离

2.2这样做,我们就会发现一个问题,配置文件被打到jar包里,运维人员无法轻易的修改配置文件。那样,配置文件的意义在哪里呢?还不如直接写到Java文件里。
在生产上,一般有2种做法。一种是使用配置中心,不过这要整上一套SpringCloud的东西(当然用K8S也可以实现)。我们这里讲一个简单的方法,通过修改打包方式来解决。

首先,在Resource中,把想要分离的文件拷出去:

<build><resources><!--打包时,把这些文件拷贝到外面--><resource><directory>src/main/java/indi/zhifa/study2024/class002/busy/generalTest/business/report</directory><includes><include>**/*.xml</include></includes><targetPath>${project.build.directory}/resources/mybatis</targetPath></resource><resource><directory>src/main/resources/static</directory><includes><include>**/*.*</include></includes><targetPath>${project.build.directory}/resources/static</targetPath></resource><resource><directory>src/main/resources</directory><includes><include>*.yml</include><include>*.properties</include></includes><targetPath>${project.build.directory}/config</targetPath></resource><!--打包时,为了idea能启动,还要向classes里拷贝一份--><resource><directory>src/main/java/indi/zhifa/study2024/class002/busy/generalTest/business/report</directory><includes><include>**/*.xml</include></includes><targetPath>${project.build.directory}/classes/mybatis</targetPath></resource><resource><directory>src/main/resources/static</directory><includes><include>**/*.*</include></includes><targetPath>${project.build.directory}/classes/static</targetPath></resource><resource><directory>src/main/resources</directory><includes><include>*.yml</include><include>*.properties</include></includes><targetPath>${project.build.directory}/classes</targetPath></resource></resources>......</build>

这样打包已经实现了需求,但把包解压开后发现,资源仍然存在于包中(相当于浪费了空间)
那,我们再加个打包的配置,排除这些文件

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><finalName>${jar-name}</finalName><!--主义properties里定义该变量,打包后jar包的名字--><!--排除掉配置,资源等,毕竟放到外面了--><excludes><exclude>*.yml</exclude><exclude>*.properties</exclude><exclude>mybatis/**/*.xml</exclude><exclude>static/**/*</exclude><exclude>templates/**/*</exclude></excludes></configuration></plugin><!--把${jar-name}包再打进包含springframework的包中--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><finalName>${jar-name}</finalName></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>

如此,我们再点击package,打包出的内容就会如图所示:
在这里插入图片描述

1.4 启动jar包

把jar包,config文件夹,resources文件夹站到linux系统的相应位置,我这里是/WORK/APP/study2024-class003
在这里插入图片描述

打开8080~8089的防火墙

ufw allow 8080/tcp
...

输入启动命令

java -jar nbr.jar --spring.config.additional-location=config/ study2024-class003-001

可以看出,程序启动成功了。
访问192.168.0.64/doc.html,即可看到swagger页面,查询一个报表接口,发现没有问题。

1.5 把lib包分离

其实有一说一,把lib包分离在实际的生产中,意义其实没有那么大。唯一的作用就是在公司的测试部署机放在外网,减少打包部署的带宽消耗。但这也会造个坑,就是当我们升级包时,可能会忘记把更新的包拷过去,导致莫名其妙的报错,这非常搞心态。
pom做如下修改:

	<plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><finalName>${jar-name}</finalName><addResources>true</addResources><includes><include><groupId>nothing</groupId><artifactId>nothing</artifactId></include></includes><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><finalName>${jar-name}</finalName><archive><!-- 指定资源文件目录,与打包的jar文件同级目录 --><manifestEntries><Class-Path>resources/</Class-Path></manifestEntries><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest></archive><!--排除掉配置,资源等,毕竟放到外面了--><excludes><exclude>*.yml</exclude><exclude>*.properties</exclude><exclude>mybatis/**/*.xml</exclude><exclude>static/**/*</exclude><exclude>templates/**/*</exclude></excludes></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib/</outputDirectory></configuration></execution></executions></plugin></plugins>

再进行打包,观察现象
在这里插入图片描述
我们看到,我们的包重新变小了。
把新打的包重新拷到相应的地方。而后再输入如下命令:

java -jar nbr.jar -D loader.path=./lib --spring.config.additional-location=config/ --logging.config=config/logback.xml study2024-class003-001

发现毫无问题。

二、部署环境

2.1 通常的4种环境

不考虑那种有中台的千人大厂情况,一般开发团队,通常会有4套部署环境。

  • local
    本地开发环境,即IDEA的环境,用户个人调试
  • dev
    开发环境,部署在公司内部的开发服务器中,用于前后端联调。该分支服务通常不稳定,经常发生代码变更。
    更严谨点的做法,dev也可以认为是一个测试环境,公司内部服务器部署dev,dev-feature1,dev-feature2…feature表示某个新增功能,通常有1个或几个程序员共同开发。测试先测试通过feature分支,而后把feature合并到dev上。当测试发现dev上有bug,则即刻要求开发进行修复,拉取部署bugfix分支,交由测试测试通过后,合并到dev分支上。
    但测试的最终验收,以test分支为主。
    dev环境下所用的数据库等中间件地址,很多时候是与我们本地开发不同的。但有时候为了方便,也采用相同的数据。
  • test
    测试环境,部署在公司内部的测试服务器中,也可以直接部署在外网的云服务器上。该服务用于交付测试,代码不经常变动。测试通过后打tag,可发到线上环境。
    该环境的数据库等中间件,与dev环境也不同。
    个人观点,这个环境下的数据,不要让开发人员污染。放有意义的测试数据。最好由专业的测试人员提供录入。
  • prod
    线上部署环境。通常,线上环境所用的数据库等中间件,与测试环境也是不同的。

2.2 profile配置

正因为不同的环境,可能有不同的配置。打包时要自动区分这点,所以通常会在pom文件中声明这4种环境。
由于我们这里是学习配置,只保留local和test,local表示在IDEA里跑,test表示放linux机器上(没linux的可以用WSL,我前面的文章介绍过)

<profiles><!--本地--><profile><id>local</id><properties><!-- 环境标识,需要与配置文件的名称相对应 --><spring.profiles.active>local</spring.profiles.active></properties><activation><!-- 默认环境 --><activeByDefault>true</activeByDefault></activation></profile><!--测试--><profile><id>test</id><properties><spring.profiles.active>test</spring.profiles.active></properties></profile></profiles>

2.3 把先前的yml配置文件和日志xml分环境

我们现在把这种配置文件这样
在这里插入图片描述
为了能够正常运行,以及把对应文件拷到外面的config文件夹中,xml可以做如下配置

			<resource><directory>src/main/config/${spring.profiles.active}</directory><includes><include>*.yml</include><include>*.properties</include><include>logback.xml</include></includes><targetPath>${project.build.directory}/config</targetPath></resource><resource><directory>src/main/config/${spring.profiles.active}</directory><includes><include>*.yml</include><include>*.properties</include><include>logback.xml</include></includes><targetPath>${project.build.directory}/classes</targetPath></resource>

点击compile,观察现象
在这里插入图片描述
我想,这样就实现了

三、maven打包命令

实际开发时,可不会在IDEA里打包,而是在jenkins中,在linux下使用命令打包。
我们先在windows中尝试一下:

mvn clean package -pl busy/general-test -am -Ptest

嗯,这就成功了。

四、创建一个启动和关闭脚本

实际开发中,我们不可能用java -jar来启动服务。另外,同一个jar包,可能会部署多个实例。这时,我们可以写一个shell脚本来做启动和关闭。
在如图位置创建这俩脚本
在这里插入图片描述
在resource的配置中,添加拷贝脚本的配置

            <resource><directory>src/main/bin/${spring.profiles.active}</directory><includes><include>*.sh</include><include>*.bat</include></includes><targetPath>${project.build.directory}/bin</targetPath></resource>

4.1 启动脚本startup.sh

#!/bin/bashcygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac
error_exit ()
{echo "ERROR: $1 !!"exit 1
}#参数解析
VERSION=''
appName=''
PORT='8081'
ARGS=`getopt -o v:a:p: --long version:,appName:,port: -n "$0" -- "$@"`
if [ $? != 0 ]; thenecho "Terminating..."exit 1
fi
echo ARGS=[$ARGS]
eval set -- "${ARGS}"while true
docase "$1" in-v|--version)case "$2" in"")VERSION=''shift 1;;;*)VERSION=$2shift 2;;;esac;;-a|--appName)case "$2" in"")appName='main'shift 1;;;*)appName=$2shift 2;;;esac;;-p|--port)case "$2" in"")PORT='8081'shift 1;;;*)PORT=$2shift 2;;;esac;;--) shift ; break ;;*) echo "Internal error!" ; exit 1 ;;esac
doneSERVER="nbr"
if [[ -z "$VERSION" ]]; thenSERVER_JAR="$SERVER.jar"
elseSERVER_JAR="$SERVER-$VERSION.jar"
fiSPACE="study2024"
SERV_NAME="general-test"
PROFILE="test"which java
JAVA="$JAVA_HOME/bin/java"
echo $JAVABASE_DIR=`cd $(dirname $0)/..; pwd`
CUSTOM_SEARCH_LOCATIONS=file:${BASE_DIR}/config/#===========================================================================================
# JVM Configuration
#===========================================================================================
#JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xss128k -XX:MaxGCPauseMillis=300 -Xlog:gc:../logs/gc.log"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/${SERVER_JAR}"
JAVA_OPT="${JAVA_OPT} -D loader.path=./lib"
JAVA_OPT="${JAVA_OPT} --spring.profiles.active=${PROFILE}"
JAVA_OPT="${JAVA_OPT} --server.port=${PORT}"
JAVA_OPT="${JAVA_OPT} --spring.config.additional-location=${CUSTOM_SEARCH_LOCATIONS}"
JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/config/logback.xml"JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')if [ ! -d "${BASE_DIR}/logs" ]; thenmkdir ${BASE_DIR}/logs
fiecho "$JAVA ${JAVA_OPT}"# start
echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
nohup $JAVA ${JAVA_OPT} ${SPACE}.${SERV_NAME}-${appName} >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "${SPACE}.${SERV_NAME}-${appName} is starting,you can check the ${BASE_DIR}/logs/start.out"
echo $! > pid.txt

4.2 关闭脚本shutdown.sh

#!/bin/bashSPACE="study2024"
SERV_NAME="general-test"
PROFILE="test"#参数解析
appName='app001'
ARGS=`getopt -o a: --long appName: -n "$0" -- "$@"`
if [ $? != 0 ]; thenecho "Terminating..."exit 1
fi
#echo ARGS=[$ARGS]
eval set -- "${ARGS}"
#echo formatted parameters=[$@]while true
docase "$1" in-a|--appName)case "$2" in"")appName='main'shift 1;;;*)appName=$2shift 2;;;esac;;--) shift ; break ;;*) echo "Internal error!" ; exit 1 ;;esac
done#cd `dirname $0`/..
target_dir=`pwd`pid=$(cat "$target_dir/pid.txt")if [[ -z "$pid" ]]; thenpid=`ps ax | grep -i "$SPACE.$SERV_NAME-${appName}" | grep ${target_dir} | grep java | grep -v grep | awk '{print $1}'`
fiif [ -z "$pid" ] ; thenecho "No $SPACE.$SERV_NAME-${appName} running."exit 0;
firm pid.txtecho "The ${SPACE}.${SERV_NAME}-${appName}(${pid}) is running..."
kill ${pid}
echo "Send shutdown request to ${SPACE}.${SERV_NAME}-${appName}(${pid}) OK"

4.3 启动关闭实验

把该脚本拖到linux,如图所示
在这里插入图片描述
cd进bin中,把这俩脚本赋予可执行权限

cd bin
chmod +x startup.sh
chmod +x shutdown.sh

启动命令

./startup -p 8083

查看是否启动成功

lsof -i:8083

在这里插入图片描述
可见,程序启动成功了。
关闭程序

./shutdown.sh

再次查看是否进程还在

lsof -i:8083

观察到已经没有。

五、代码展示

不多讲,还是移步我的码云吧

相关文章:

芝法酱学习笔记(0.4)——SpringBoot多模块项目打包,resource分离,lib分离,启动脚本

前言 上期讲了如何在windows平台搭建Java后端的开发环境&#xff0c;并给出了一个简单的hello world级别的多模块代码示例。但上期仅仅是在IDEA中运行&#xff0c;和正式的生产环境完全不同。 本期将讲解&#xff0c;如何配置SpringBoot多模块项目的maven打包&#xff0c;并分…...

进程(一万字学习笔记)

------------------------本文为学习进程记录的学习笔记&#xff0c;如有问题欢迎指正 -------------------------- 目录 1.定义 2.进程的种类 2.进程的内存布局 3.进程控制块&#xff08;PCB&#xff09; 4.进程源语 fork() 写时复制 exec() execl函数 wait() #进…...

Docker实践与应用:深度探索与丰富案例

一、引言 在当今的软件开发和运维领域&#xff0c;Docker已经成为了一种不可或缺的技术。它以容器化的方式改变了软件的开发、部署和运行模式&#xff0c;为企业和开发者带来了前所未有的便利和效率提升。本文将深入探讨Docker的实践操作以及丰富的应用举例&#xff0c;带您全面…...

信息安全工程师(21)安全协议

前言 安全协议是建立在密码体制基础上的一种交互通信协议&#xff0c;它运用密码算法和协议逻辑来实现认证、密钥分配、数据机密性、完整性和抗否认性等安全目标。 一、定义与目的 安全协议旨在确保网络环境中信息交换的安全性&#xff0c;通过密码技术和协议逻辑来保护数据的机…...

Starrocks with 嵌套

在某些场景下需要进行 with 嵌套 需要以下进行处理&#xff0c;报如图错误 with abc as (select * from .. ) insert into xxx select * from abc尝试创建物化视图 CREATE MATERIALIZED VIEW IF NOT EXISTS ads_test.xxx_mv REFRESH DEFERRED MANUAL AS with abc as (select…...

ubuntu 安装neo4j

在Ubuntu上安装Neo4j的步骤如下&#xff1a; 1.更新包管理器的索引列表&#xff1a; sudo apt update 2.导入Neo4j的GPG密钥&#xff1a; wget -O - https://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add - 3.添加Neo4j的仓库到APT源列表&#xff1a; ech…...

云计算课程作业1

作业1 Xmanager连接 rhel连接 作业2 首先确认你的虚拟机设置的是NAT 1-3 然后打开这篇blog&#xff0c;并完成第一步和第二步 因为我们是NAT&#xff0c;所以不需要连接网桥&#xff0c;即跳过第三步&#xff0c;但是这里ping一下测试网络连接 2- 如果到这里你发现提示yum…...

建筑智能,推动智慧社区发展

建筑智能已经成为现代城市建设的热门词汇。它不仅是提高城市建筑现代化水平的必由之路&#xff0c;也是未来城市智能化的重要标志。其中&#xff0c;智能社区是建筑智能化的重要环节之一。 智能社区是指以信息技术为基础&#xff0c;通过信息技术实现社区设施设备网络化、监管…...

conda 虚拟环境安装GDAL

一. 背景 换了新电脑&#xff0c;要重新安装GDAL。从前是下了GDAL的.wheel文件用pip安装&#xff0c;但平时下轮子的网站现在都打不开&#xff0c;比如https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal&#xff0c;不晓得为什么。 后面看了这篇教程解决了问题&#xff08;h…...

STM32转AT32代码转换

1. 引言 在嵌入式开发中&#xff0c;我们经常会遇到更换单片机芯片的事情&#xff0c;若芯片是同一厂家的还好说&#xff0c;若是不同厂家的则需要重新写&#xff0c;重新调&#xff0c;重新去学习其底层驱动程序&#xff0c;比较费时费力。如&#xff1a;ST32转AT32、ST32转G…...

vue中怎么覆盖 sytle中的样式

好的&#xff0c;下面是一个具体的例子&#xff0c;展示如何在 Vue 组件中覆盖样式。 示例&#xff1a;覆盖组件样式 假设我们有一个组件 MyComponent.vue&#xff0c;其中包含一些样式&#xff1a; <template><div class"my-component"><h1>标…...

php中打印函数

在PHP中&#xff0c;打印函数主要用于输出或显示数据。常用的打印函数包括&#xff1a; 1.echo- 可以输出一个或多个字符串。 echo "Hello, World!"; echo "Hello", " ", "World!"; 2.print - 功能与echo相似&#xff0c;但print只能…...

[单master节点k8s部署]23.构建EFK日志收集平台(二)

部署elasticsearch集群 已经完成的工作&#xff1a;创建存储。首先配置了nfs存储提供商&#xff08;nfs-deployment.yaml&#xff09;&#xff0c;然后通过创建存储类&#xff08;storageclass.yaml&#xff09;来将nfs服务器与存储类绑定&#xff1a; [rootmaster 31efk]# c…...

C#的属性(Property)应用说明(二)

Property的应用说明补充&#xff1a; 一.自定义逻辑&#xff1a; 可以在 get 和 set 访问器中包含自定义的逻辑。 public class Person {private string name;public string Name{get { return name; }set{if (string.IsNullOrWhiteSpace(value))throw new ArgumentException…...

VUE.js笔记

1.介绍vue Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 Vue 应用程序的基本…...

SpringBoot--yml配置文件的时间/大小的单位转换

原文网址&#xff1a;SpringBoot--yml配置文件的时间/大小的单位转换_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍SpringBoot的yml&#xff08;properties&#xff09;配置文件的时间/大小的单位转换。 概述 SpringBoot可以将yml中的配置绑定到一个Java类的字段&#x…...

【算法业务】互联网风控业务中的拒绝推断场景算法应用分享(涉及半监督算法、异常检测、变分自编码、样本权重自适应调整、迁移学习等)

1. 业务目标和任务描述 该项目是很早期的一个工作&#xff0c;属于互联网信贷风控场景&#xff0c;研究并应用信贷中的拒绝推断任务&#xff0c;处理方式也许对于目前的一些业务还有参考意义&#xff0c;因此这里做下分享。拒绝推断是指在信贷业务中&#xff0c;利用已知的接受…...

Windows PowerShell相关笔记

之前我写的一篇&#xff0c;把我的PS&#xff08;power shell&#xff09;该了配置文件 pyqt5vscode 配置坑笔记_vscode使用pyqt command failed-CSDN博客 文件里写的自动加载conda #region conda initialize # !! Contents within this block are managed by conda init !!…...

力扣9.24

2207. 字符串中最多数目的子序列 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern &#xff0c;两者都只包含小写英文字母。 你可以在 text 中任意位置插入 一个 字符&#xff0c;这个插入的字符必须是 pattern[0] 或者 pattern[1] 。…...

NRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块

nRF21540是一款射频前端模块(FEM)&#xff0c;可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备&#xff0c;nRF21540是一种“即插即用型”的无线传输范围扩展器&#xff0c;可与nRF52和nRF53系列的高级多协议无线SoC搭配使用&#xff0c;所需的外部器件数…...

2024最新Linux Socket编程

我们深谙信息交流的价值&#xff0c;那网络中进程之间如何通信&#xff0c;如我们每天打开浏览器浏览网页时&#xff0c;浏览器的进程怎么与web服务器通信的&#xff1f;当你用QQ聊天时&#xff0c;QQ进程怎么与服务器或你好友所在的QQ进程通信&#xff1f;这些都得靠socket&am…...

Linux下的驱动开发二

一、IO模型 I/O 模型在操作系统中用于处理应用程序与设备驱动之间的数据传输。I/O 通信模型的核心是解决程序与设备之间如何高效、合理地进行数据通信。不同的模型通过阻塞、非阻塞、同步、异步的方式来控制数据流和处理 I/O 请求。 注&#xff1a;在驱动开发中可以定义一个全…...

【JAVA报错已解决】 Java.lang.ArrayIndexOutOfBoundsException

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

2024 CSP 游记

J 组 初赛 早上也是五点钟就起来 打游戏 了。 考点在八达小学&#xff0c;除了感觉小、破、旧就没有其他感觉&#xff08; 我妈也是成功的给我提前一小时到达考场。 拿到试卷后&#xff0c;瞄一眼&#xff0c;咋这么简单&#xff0c;和一本通的模拟卷难度一样&#xff1f;…...

双十一有什么推荐好物?,这些你不能错过的宝藏好物推荐

随着双十一的临近&#xff0c;这场盛大的购物狂欢蓄势待发&#xff01;为了让大家不在琳琅满目的商品中徘徊&#xff0c;琪琪用心归纳了一份购物清单&#xff0c;分享那些我亲自使用过&#xff0c;觉得必须拥有的商品。 这些商品不仅价格公道&#xff0c;而且质量上乘&#xf…...

NSSCTF [HUBUCTF 2022 新生赛]simple_RE(变种base64编码)

文件无壳 拖入IDA中 shiftF12查看可疑字符串 发现两串字符串 一看这两个等于号就猜测是base64编码 进入主函数看看 这段代码是一个简单的 C 语言程序&#xff0c;主要功能是接受用户输入的字符串作为“flag”&#xff0c;然后通过对输入的字符串进行一些处理和比较来验证是否输…...

clickhouse使用extract提取分号之前,之后,中间的内容

Area&#xff1a;‘安徽;宣城;宣州’&#xff0c;要提取分号之前&#xff0c;两个分号之前&#xff0c;最后一个分号之后的内容作为省市区 这是最后得到的正确的结果&#xff0c;感谢chatgpt 刚开始本来想使用splitByString -- 宣城 select splitByString(;,安徽;宣城;宣州)[2…...

Unity3D Compute Shader同步详解

前言 在Unity3D中&#xff0c;Compute Shader是一种强大的工具&#xff0c;它利用GPU的并行处理能力来执行复杂的计算任务&#xff0c;从而减轻CPU的负担&#xff0c;提高游戏的性能和效率。然而&#xff0c;由于GPU的工作方式&#xff0c;对共享资源的访问需要特别注意同步问…...

3D模型在UI设计中应用越来越多,给UI带来了什么?

当前3D模型在UI设计中应用很多&#xff0c;极大地拓展了UI设计的发挥空间&#xff0c;也拓宽了UI的应用领域&#xff0c;本文分享下UI中引入3D模型到底能带来什么价值. 3D模型在UI设计中的应用可以给用户界面带来以下几个方面的好处&#xff1a; 更真实的视觉体验&#xff1a;…...

前端框架的选择与考量:一场技术的盛宴

在当今快速迭代的Web开发领域&#xff0c;前端框架的选择成为了项目启动初期不可忽视的重要环节。随着React、Vue、Angular等主流框架的崛起&#xff0c;以及Svelte、Quasar等新兴力量的加入&#xff0c;开发者们面临着前所未有的选择难题。本文旨在探讨前端框架的选择依据、主…...