Jenkins教程(自动化部署)
Jenkins教程(自动化部署)
1. Jenkins是什么?
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。
2. 什么是持续集成(CICD)
因为开发部门同时维护多个版本,多个版本的发布,测试需要大量人力,所以要有一个专业的持续集成工具来管理持续重复的工作。
个人理解,说白了就是把代码测试、打包、发布等工作交给一些工具来自动完成。这样可以提高效率,减少失误,开发人员只需要关心开发和提交代码到Git就可以了。
3. Jenkins的安装
(1)准备条件
安装JDK
下载JDK压缩包,并上传至Linux某个目录下解压。
①. 配置jdk的环境变量
#进入/etc/profile配置文件
vim /etc/profile
②. 将以下代码填入到profile文件内底
export JAVA_HOME=/usr/wubin/jdk11
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
③. 使配置生效
source /etc/profile
④. 检测java环境信息
javac
输入javac后出现以下信息则安装jdk成功!
(2)安装Jenkins
1. 下载jenkins
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
2. 启动jenkins
# 使用nohup命令启动 nohup 当虚拟机黑屏时 也会运行 日志—>输出到jenkins.log & 后台运行
nohup java -jar /usr/wubin/jenkins.war --httpPort=8777 --httpsPort=8778 > /usr/wubin/jenkins.log 2>&1 &
3. 使用tail命令查看启动日志,日志中会输出jenkins密码
4. 通过浏览器访问jenkins(端口号必须为8777)
http://你的ip:8777
点击安装推荐的插件
(3)Jenkins中配置JDK路径
jenkins-》全局工具配置-》JDK-》新增JDK
(4)Jenkins忘记密码的解决方案
4. 集成Git
为了Jenkins能够拉取代码,需要安装Git环境和jenkins对应的Git插件
(1) CentOS 7 上安装Git环境
# 安装
$ yum install git -y
# 查看版本
$ git --version
复制
(2) Jenkins安装Git插件
(3) Jenkins配置Git环境
此处无需在jenkins
中配置Git环境,采用默认生成的即可
(4) Gitee上任意建一个仓库
(5) 测试凭据是否能够使用
jenkins-》新建任务-》自由风格项目
进入jenkins
的工作空间查看文件是否拉取下来,所有拉取的文件都会存放在jenkins
工作空间中
到这一步用户名和密码方式的凭证已经打通Git
5. 凭证配置
凭据就是用来存储需要密文保护的数据库密码、Gitee密码信息、Docker私有仓库密码等,以便 Jenkins可以和这些第三方的应用进行交互。
1. 凭证插件安装Credentials Binding
该插件默认在一开始就会被安装,安装后在jenkins-》系统管理-》安全
栏目会出现Manage Credentials选项,若没有需要安装插件并重启。
6. Maven集成
在jenkins
上发布Java项目时需要使用Maven
来进行构建打包(Gradle项目则需要安装配置Gradle)
(1) 下载安装
# 找一个目录存放maven
cd /usr/wubin/# 从阿里云上下载maven安装包
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz# 解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz# 当前maven的安装目录为:
/usr/wubin/
apache-maven-3.6.3
(2) 环境配置
vi /etc/profile在最后面JDK配置上作出一些更改
export MAVEN_HOME=
/usr/wubin/
apache-maven-3.6.3
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
复制
(3) 使配置生效并查看安装情况
source /etc/profile
mvn -version
(4) Jenkins配置
Maven
(5) 安装Maven插件
(6) 在/data/software
目录下新建一个repository
文件夹,用来作为maven
的仓库
$ cd /usr/wubin
$ mkdir repository
复制
(7) 使用root
账户修改Maven的settings.xml
文件(指定仓库目录和阿里云镜像)
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><!--本地仓库--> <localRepository>/data/software/repository</localRepository><mirrors><!--阿里云镜像--><mirror><id>aliyun-maven</id><mirrorOf>central</mirrorOf><name>aliyun maven mirror</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></mirror></mirrors>......
</settings>
(8) Maven测试项目构建
接下来的步骤是将java项目传到Gitee上供jenkins拉取打包,如果运维同学不懂Java代码,可以直接将我的Git项目fork或采用gitlab 等其他方式进行拉取。
新建Maven项目
在码云上建一个同名的git项目
使用Git上传到码云
使用git bash
命令将项目初始化,无论是传到Gitee、GitHub、GitLab、Codeup步骤一样,如果对Git的安装部署不熟悉
# 进入到本地的项目文件夹
$ cd existing_folder
# 初始化仓库
$ git init# 添加文件至工作区并提交
$ git add .
$ git commit -m "first commit"# 关联Gitee远程仓库
$ git remote add origin https://gitee.com/nobug8/it235-jenkins-jar.git# 将本地仓库推送到远程仓库的master分支,此处会弹出用户名密码交互
$ git push -u origin master## 如果push报错可以先拉取一下,会有新的gitee生成的文件拉下来,然后重新添加提交并push
$ git pull origin master --allow-unrelated-histories
$ git add .
$ git commit -m "拉取下来合并后再次提交"
$ git push -u origin master
复制
(9) Jenkins添加Maven项目任务
①. 新建任务
②. 编写Maven编译命令
③. 构建并查看控制台日志
保存后,点击立即构建,然后进入日志控制台查看日志
从日志可以看到代码已经在拉取了,而且走的事阿里云仓库,第一次拉取过程会比较长。
通过查看/data/software/repository
可以看到有存放拉取的jar包,通过这2个证据可以证明settings.xml
文件配置成功且有效
ps:如果使用git账号密码拉取代码即使权限都已经给够了还是出现403等等一些问题,可以考虑使用ApiToken方式拉去代码,在git/gitlab创建apiToken,在凭证管理地方加上凭证
构建成功后查看jenkins
的workspace
目录下的jar包
到此Maven集成完毕
配置Post Steps,选中执行shell
7. 配置SSH免密登录
由于jenkins
构建消耗内存极大,一般jenkins是一台单独的工具机器,Java项目一般在其他的机器上,这里我重新安装一台虚拟机
应用服务器信息
- IP:192.168.223.129
- JDK:1.8
- user:root
- 部署路径:/data/app/my-boot
- 端口:9010
免密登录主要是方便jenkins服务器192.168.223.128的root用户—》应用服务器192.168.223.129的root用户上的jar包拷贝,部署本就是jar包拷贝的过程
在192.168.223.128机器上使用root用户生成秘钥注意此处是root用户
$ ssh-keygen -t rsa
# 3次回车
复制
运行后会在当前用户的根目录生成一个.ssh文件夹
ssh文件夹中的文件描述
id_rsa
: 生成的私钥文件id_rsa.pub
: 生成的公钥文件
接下来需要将公钥导入到认证文件中
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
复制
如果希望ssh公钥生效需满足至少下面两个条件:
.ssh
目录的权限必须是700.ssh/authorized_keys
文件权限必须是600
给对应文件授权
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
复制
将authorized_keys
文件拷贝到另一台应用服务器的root用户.ssh目录下
# 在应用服务器(192.168.223.129)上用root用户创建/root/.ssh文件夹 mkdir -p /root/.ssh# 在jenkins服务器(192.168.223.128)上将pub公钥文件拷贝到应用服务器的.ssh目录下scp -p ~/.ssh/id_rsa.pub root@192.168.223.129:/root/.ssh/authorized_keys
复制
在jenkins192.168.223.128服务器上进行免密连接测试
# 在jenkins服务器的/root/目录下创建filetest文件,并拷贝到应用服务器
$ cd ~/
$ touch filetest
$ scp -p filetest root@192.168.223.129:/root/filetest
# 进入到应用服务器(192.168.223.129),检查/root目录下是否出现filetest# 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示
$ ssh root@192.168.223.129
Last login: Sun Sep 20 21:53:03 2020
$ exit
复制
到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助
8. 编写Jenkins发布脚本
注意下面代码第6行代码server_ips=”需要部署到的机器ip”
#!/bin/bashecho "部署的目录和项目名称"
DIR="/data/app"
projectName="my-boot"echo "待部署的应用服务器,可多台"
server_ips="192.168.223.139"
for server_ip in ${server_ips[@]}
doecho "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
mkdir -p $DIR/${projectName}
if [ -f "$DIR/${projectName}/${projectName}.jar" ];thenmv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar
fi
EOFecho "拷贝jar包到目标服务器的tmp目录"
scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jarecho "ssh远程连接进行发布操作"
ssh -q -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jarEOFdoneecho "success"
最新脚本,以端口kill进程
#!/bin/bash# 配置变量
LOG_FILE="/home/XXX/.jenkins/workspace/whale-mgnt-service/startup.log"
JAR_PATH="/home/XXX/.jenkins/workspace/whale-mgnt-service/whale-mgnt-service/target/whale-mgnt-service.jar"//修改成自己实际路径
APP_PORT=8081
MAX_ATTEMPTS=60
INTERVAL=5# 清空之前的日志
echo "" > $LOG_FILE# 通过端口号找到并杀死进程
kill_process_by_port() {local port=$1local pid=$(netstat -tlnp 2>/dev/null | grep ":${port}" | awk '{print $7}' | cut -d'/' -f1)if [ ! -z "$pid" ]; thenecho "Found process $pid using port $port, killing it..."kill -15 $pidsleep 2# 如果进程还在,强制杀死if ps -p $pid > /dev/null 2>&1; thenecho "Process still alive, force killing..."kill -9 $pidfisleep 3elseecho "No process found using port $port"fi
}# 在启动前检查并杀死占用指定端口的进程
kill_process_by_port $APP_PORT# 启动服务
sudo nohup java -jar \-Xms256m \-Xmx512m \-XX:MaxMetaspaceSize=256m \-XX:+HeapDumpOnOutOfMemoryError \-XX:HeapDumpPath=/tmp/ \-XX:+UseG1GC \-XX:MaxGCPauseMillis=200 \$JAR_PATH \--spring.profiles.active=test \--server.port=$APP_PORT \--spring.jpa.open-in-view=false \--server.tomcat.max-threads=50 \--server.tomcat.min-spare-threads=20 \--spring.task.execution.pool.core-size=5 \--spring.task.execution.pool.max-size=10 \--spring.task.execution.pool.queue-capacity=100 \> $LOG_FILE 2>&1 &PID=$!echo "Starting service with PID: $PID"
echo "Waiting for service to start..."# 给予初始化时间
sleep 15attempt=1
while [ $attempt -le $MAX_ATTEMPTS ]; do# 检查进程是否存在if ! ps -p $PID > /dev/null; thenecho "Process died unexpectedly. Check logs:"tail -n 50 $LOG_FILEexit 1fi# 检查端口是否在监听if netstat -tulpn | grep ":$APP_PORT" > /dev/null; thenif grep -q "Started WhaleManagementApplication" $LOG_FILE; thenecho "Application started successfully"sleep 5if ps -p $PID > /dev/null; thenecho "Service is running stably"echo "Final memory usage:"free -mecho "Process memory usage:"ps -o pid,ppid,%mem,rss,command -p $PIDexit 0elseecho "Process died after startup"tail -n 50 $LOG_FILEexit 1fififiecho "Attempt $attempt of $MAX_ATTEMPTS - Service still starting..."echo "Current service status:"echo "- Process check: $(ps -p $PID > /dev/null && echo "Running" || echo "Not running")"echo "- Port check: $(netstat -tulpn | grep ":$APP_PORT" > /dev/null && echo "Listening" || echo "Not listening")"# 输出最近的日志和内存使用情况echo "Recent log entries:"tail -n 10 $LOG_FILEecho "Current memory usage:"free -msleep $INTERVALattempt=$((attempt+1))
doneecho "Service failed to start within timeout. Last 50 lines of log:"
tail -n 50 $LOG_FILE
echo "Killing process $PID"
kill -9 $PID 2>/dev/null
exit 1
9. 编写应用启动脚本
在/data/app/my-boot
目录下创建启动脚本start.sh
$ touch start.sh
$ vi start.sh
# 将下面代码粘贴到start.sh中
#!/bin/bash
set -e #任何命令出错就退出
set -o pipefailAPP_ID=my-boot
APP_DIR="/data/app"nohup java -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log &
start_ok=false
if [[ $? = 0 ]];thensleep 3tail -n 10 release_out.logsleep 5tail -n 50 release_out.log
fi
aaa=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];thenecho "Application started ok"exit 0
elseecho "Application started error"exit 1
fi
在/data/app/my-boot
目录下创建停止脚本stop.sh
$ touch stop.sh
$ vi stop.sh
# 将下面代码粘贴到stop.sh中
#!/bin/bashAPP_ID=my-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
并进行启动和停止测试,查看日志输出是否正常
将下述启动代码配置jenkins
中
sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.sh
访问并测试代码是否生效
如果是虚拟机则需要给防火墙添加9010端口
$ su root
# 开启防火墙9010端口
$ firewall-cmd --zone=public --add-port=9010/tcp --permanent
# 使配置生效
$ firewall-cmd --reload
复制
修改代码返回值,提交至Gitee,并再次进行构建发布,访问http://192.168.223.129:9010
查看结果是否更新
相关文章:
Jenkins教程(自动化部署)
Jenkins教程(自动化部署) 1. Jenkins是什么? Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行&…...
C#里使用libxl的对齐/边框/颜色
一份好的EXCEL文件,通道会有不同的颜色和边框来表示。 以便表示一些重要的信息,这样才能让人们一眼就看到需要关注的信息。 如下面所示: 要显示上面的内容,需要使用下面的例子: private void button12_Click(object sender, EventArgs e){var book = new ExcelBook();if…...
虚拟pinctrl驱动
之前呢,我们讲解了在内核中pinctrl子系统是怎么实现的,今天我们来尝试一下自己去写一个pinctrl子系统: 首先呢,我们来看看一个pinctrl子系统需要做的事情: 上面的话,我们看了一个pinctrl子系统需要的三大功能以及在驱…...
pycharm虚拟环境项目转移后配置解释器
添加解析器提示:无效的 Python SDK 解决方法 在到电脑安装python解析器,复制:python.exe和pythonw.exe 项目虚拟环境venv/Scripts Python解释器添加 项目现有虚拟环境,就可以正常使用...
蓝桥杯嵌入式学习笔记
用博客来记录一下参加蓝桥杯嵌入式第十六届省赛的学习经历 工具环境准备cubemx配置外部高速时钟使能设置串口时钟配置项目配置 keil配置烧录方式注意代码规范头文件配置 模块ledcubemx配置keil代码实现点亮一只灯实现具体操作的灯,以及点亮还是熄灭 按键cubemx配置k…...
0201-jsx语法基础-jsx-仿低代码平台项目
文章目录 1.jsx标签2.jsx属性3.jsx 事件3.1 声明事件3.2 使用事件(对象) 4. typescript类型基础4.1 类型声明4.2 事件函数传递自定义参数 5.插入js变量6. 条件判断7. 循环结语 1.jsx标签 jsx标签与html标签区别: 首字母大小写 大写是自定义组…...
在MCU工程中优化CPU工作效率的几种方法
在嵌入式系统开发中,优化 CPU 工作效率对于提升系统性能、降低功耗、提高实时性至关重要。Keil 作为主流的嵌入式开发工具,提供了多种优化策略,包括 关键字使用、内存管理、字节对齐、算法优化 等。本文将从多个方面介绍如何在 Keil 工程中优…...
Elasticsearch 的搜索功能
Elasticsearch 的搜索功能 建议阅读顺序: Elasticsearch 入门Elasticsearch 搜索(本文)Elasticsearch 搜索高级Elasticsearch 高级 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能,现在先将文档添加到索引中,…...
【鸿蒙5.0】向用户申请麦克风授权
#效果图 步骤 在 config.json 里声明权限:在项目的 config.json 文件中添加麦克风权限的声明,告知系统应用需要使用该权限。检查权限状态:在代码里检查应用是否已经获得了麦克风权限。请求权限:若应用未获得麦克风权限࿰…...
数据结构与算法分析:树与哈希表(一)
遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。 一、概述 背景:链表处理大量数据时,线性访问耗时多。二叉查找树多数操作平均运行时间为 O (log N),相对于链表树更加高效。 1.预备知识 1.1. 树的定义与…...
VBA第三十四期 VBA中怎么用OnKey事件
我们在VBA设计中经常需要使用到OnKey方法,特别是在窗口设计中比如我们想用到翻页按键,则就可以来建立一个OnKey事件。Setup_OnKey过程运行以后,就会达到最终效果,按PgDn键会将指针下移一行,按PgUp键会将指针上移一行。…...
HarmonyOS NEXT开发进阶(十五):日志打印 hilog 与 console.log 的区别
文章目录 一、前言二、两者区别对比三、HiLog 详解四、拓展阅读 一、前言 在日常开发阶段,日志打印是调试程序非常常用的操作,在鸿蒙的官方文档中介绍了hilog这种方式,前端转过来的开发者发现console.log也可以进行日志打印,而且…...
Skynet 框架中 gateserver、gate、watchdog 的关系
一、概述 在 Skynet 框架的网络通信架构中,gateserver、gate、watchdog 是三个核心组件,共同实现客户端连接的监听、管理和业务逻辑的分发。其设计目标是通过分层解耦,提升网络层的稳定性与业务逻辑的灵活性。 二、组件职责 1. gateserve…...
第11章:优化I/O_《C++性能优化指南》_notes
第十一章核心知识点详解 11.1 读取文件的优化技巧 重点:减少内存分配、使用大缓冲区、优化函数调用链。 难点:理解系统调用开销与缓冲区大小的权衡。 代码示例与详解 示例1:使用高效函数签名和减少内存分配 #include <fstream> #inc…...
【C++初阶】--- 内存管理
1.C/C内存分布 我们一般说的32位机器和64位机器指的是虚拟空间的大小,也就是进程地址空间的大小,32位机器下,进程地址空间的大小是232个字节,也就是4G,64位机器下,进程地址空间的大小是264个字节,大概160亿…...
使用 Ansys Discovery 可视化液体池中的水流
了解 ANSYS Discovery:设计领域的变革者 ANSYS Discovery 是一款功能强大的软件工具,能够彻底改变设计流程。借助其先进的仿真功能,工程师现在可以在设计投入生产之前更深入地了解其设计。通过使用 ANSYS Discovery,设计师可以快…...
网络安全-网络安全基础
一、网络安全概述 TCP/IP协议定义了一个对等的开放性网络,使得连接到这个网络中的所有用户都可能面临来自网络中的恶意的破坏和攻击。这些攻击通过网络通信协议、网络应用协议甚至物理传输链路来实现。主要针对于软件和硬件进行攻击。那在互联网上如何保证自己的安…...
YOLOv8+ Deepsort+Pyqt5车速检测系统
该系统通过YOLOv8进行高效的目标检测与分割,结合DeepSORT算法完成目标的实时跟踪,并利用GPU加速技术提升处理速度。系统支持模块化设计,可导入其他权重文件以适应不同场景需求,同时提供自定义配置选项,如显示标签和保存…...
QML中的附加属性和附加信号处理程序
QML中的附加属性和附加信号处理程序 在QML中,附加属性(Attached Properties)和附加信号处理程序(Attached Signal Handlers)是特殊类型的属性和信号,它们由附加类型(Attached Types)提供,而不是由对象本身直接提供。 什么是附加的(Attached…...
爱普生FC-135晶振5G手机的极端温度性能守护者
在5G时代,智能手机不仅需要高速率与低延迟,更需在严寒、酷暑、振动等复杂环境中保持稳定运行。作为 5G 手机的核心时钟源,爱普生32.768kHz晶振FC-135凭借其宽温适应性、高精度稳定性与微型化设计,成为5G手机核心时钟源的理想选择&…...
GPT Workspace体验
GPT Workspace是一款将强大的自然语言处理模型(如 ChatGPT 和 Gemini)集成到 Google Workspace 应用(如 Google Docs, Sheets, Slides, Gmail 和 Drive)中的工具或插件。它的目标是提升用户在日常办公中的效率和创造力。 以下是对…...
Teleport 和 Set Actor location的区别
Teleport 和 Set Actor Location 都可以用于移动一个 Actor 的位置,但它们在底层逻辑和适用场景上有显著区别. 1. Set Actor Location 功能: 直接设置 Actor 的位置,不重置物理状态(如速度、动量)。 行为特点…...
“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理
“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理 作者:Echo_Wish “老板:为什么 GPU 服务器卡得跟 PPT 一样?” “运维:我们任务队列爆炸了,得优化资源管理!” 在 AI 训练、深度学习、科学计算的场景下,GPU 计算资源已经成为香饽饽。但 GPU 服务器贵得离谱,一台 A…...
解决前端项目中无法识别 .node 文件的依赖安装问题
解决前端项目中无法识别 .node 文件的依赖安装问题 问题描述 在 macOS 系统(M1 Pro 芯片),使用 Node.js 版本 20.9.0 和 Vue 3 的环境下,项目启动过程中遇到了以下错误: [ERROR] No loader is configured for "…...
Gateway实战入门(四)、断言-请求头以及请求权重分流等
spring cloud-Gateway:断言-请求头以及请求权重分流等 一、断言Header信息要求项目前置环境要求案例一、断言-请求头信息-匹配X-Request-Id1、配置文件及代码2、测试 案例二、断言-请求头信息-匹配API版本场景主要配置信息 案例三、断言-请求头信息:匹配…...
YOLOv11模型的常见处理
一.数据准备: 1.数据集格式: 目录结构示例: datasets/├── images/│ ├── train/ # 训练图片│ └── val/ # 验证图片└── labels/├── train/ # 训练标签└── val/ # 验证标签 每张图片对应一个 .txt 标注文件…...
conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …...
无线局域网
1.5G支持中低频和高频频段, 2.网络切片是指从应该网络中选取特定的特性和功能 3.WLAN广义指无线电波,激光,红外线等无线信号代替有线局域网中的部分或者全部传输介质所构成的网络。 4.802.11运行在2.4GHz ISM 频段,采用扩频通信…...
百人会上的蔚小理与「来的刚刚好」的雷军
这就是2025百人会上的蔚小理,努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么呢?站在蔚小理的肩上。 这就是2025百人会上的蔚小理,努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么…...
现代优雅杂志海报徽标设计手写英文字体安装包 Attomes – Brush Handwritten Font
Attomes 简介 – Brush 手写字体 此字体是一种精致、优雅、流畅的手写字体。它有一个美丽而独特的连字混合字母,因此作者用一个小漩涡嵌入来撰写它,从而形成现代字体,并准备好通过为您的下一个设计项目添加优雅和独特的风格来发表声明。将其…...
Java进阶——静态代理与动态代理
代理模式是一种常用的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人,客户端通过代理来间接访问目标对象,可以在不修改目标对象的基础上,对目标对象的功能进行增强或扩展。代理模式主要分为静…...
【多线程】进阶
目录 一、CAS 什么是 CAS CAS 伪代码 CAS 有哪些应用 实现原子类 CAS 是怎么实现的 如何通过 CAS 实现的原子类 CAS 的 ABA 问题 什么是 ABA 问题 ABA 问题引来的 BUG 正常的过程 异常的过程 解决方案 📝相关面试题 二、JUC(java.util.concurrent)的…...
MFC中字符串string类型和CString类型互转方法
文章目录 一、CString 转 std::string1. Unicode项目(_UNICODE 已定义)2. 多字节项目(_MBCS 已定义) 二、std::string 转 CString1. Unicode项目(_UNICODE 已定义)2. 多字节项目(_MBCS 已定义&a…...
工作记录 2017-03-13
工作记录 2017-03-13 序号 工作 相关人员 1 修改邮件上的问题。 开始处理操作日志部分。 测试了C#和MySql的连接。 更新RD服务器。 郝 更新的问题 1、 修改了CMS1500的打印,NDC的内容用了小的字体。 2、在Cliams List中可以查看Job的Notes。 3、Payment Po…...
Linux 配置NFS服务器
1. 开放/nfs/shared目录,供所有用户查阅资料 服务端 (1)安装nfs服务,nfs-utils包中包含rpcbind(rpc守护进程) [rootnode1-server ~]# yum install -y nfs-utils # nfs-utils包中包含rpcbind [rootnode…...
Linux《进程概念(上)》
在之前的Linux学习当中我们已经了解了基本的Linux指令以及基础的开发工具的使用,那么接下来我们就要开始Linux当中一个非常重要的部分的学习——进程,在此进程是我们之后Linux学习的基础,并且通过进程的学习会让我们了解更多的操作系统的相关…...
游戏开发中的贝塞尔曲线:感受丝滑的数学之美
这是一篇vip文章,如果你还不是vip,可以移步https://www.ilikexff.cn/articles/165免费阅读。 介绍 贝塞尔曲线是计算机图形学中最重要的概念之一,以其在表示曲线时的灵活性和精确性而闻名。广泛应用于计算机图形学、动画、路径规划等领域的数学曲线。 贝塞尔曲线的数学原理基…...
Java【多线程】(6)定时器
目录 1.前言 2.正文 2.1库中定时器 2.2手搓定时器 3.小结 1.前言 哈喽大家好呀,今天继续给大家分享Java中定时器的学习,正文包括定时器的三种实现方式,正文如下。 2.正文 在 Java 中,定时器(Timer)…...
Epub转PDF软件Calibre电子书管理软件
Epub转PDF软件:Calibre电子书管理软件 一款好用的电子书管理软件,可快速导入电脑里的电子书并进行管理,支持多种格式,阅读起来非常方便。同时也有电子书格式转换功能。 第一步:添加电子书 将需要转换的电子书添加到…...
使用FastExcel时的单个和批量插入的问题
在我们用excel表进行插入导出的时候,通常使用easyexcel或者FastExcel,而fastexcel是easy的升级版本,今天我们就对使用FastExcel时往数据库插入数据的业务场景做出一个详细的剖析 场景1 现在我们数据库有一张组织表,组织表的字段…...
nginx https配置
一.https配置 HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。 1.生成证书 openssl genrsa -des3 -out server.key 20…...
git --- cherry pick
git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一个操作,它允许你选择某个分支的某次(或多次)提交,并将其应用到当前分支,而不会合并整个分支的所有更改。 cherry pick 的作用 只提取某个特定的…...
虚拟机安装linux系统无法上网的解决方法
在虚拟环境中运行Linux系统时,有时会遇到网络连接问题,特别是在使用虚拟机软件如VMware或VirtualBox时。本文将详细介绍一种针对“虚拟机安装Linux系统无法上网”问题的解决方案,以CentOS 6.5为例,适用于其他基于NAT模式的虚拟机环…...
北大人工智能研究院朱松纯:“中国的AI叙事” 存在认知偏差
3月29日,在2025中关村论坛通用人工智能论坛上,北京通用人工智能学院院长,北京大学人工智能研究院、智能学院院长朱松纯表示,目前,行业对AI的讨论几乎被大模型能力所占据,而基础学科、原始创新与智能本质的研…...
Java高频面试之集合-20
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:讲讲 HashSet 的底层实现? HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构,其底层实…...
使用Qemu模拟32位ARM系统
一、环境 实验环境如下: 主机:x86_64 操作系统:Ubuntu 20.04.6 LTS Qemu版本:QEMU emulator version 4.2.1 Linux内核版本:linux-4.4.240 Busybox版本:busybox-1.35.0二、前置准备 下载 linux-4.4.240 源…...
【初阶数据结构】栈
文章目录 一、概念与结构 二、栈的实现 栈的定义 1.初始化 2.入栈 3.判断栈是否为空 4.出栈 5.取栈顶元素 6.获取栈中有效元素个数 2.销毁 三、完整码源 总结 一、概念与结构 栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据…...
docker-compose部署prometheus+grafana+node_exporter
目录 docker-compose文件 配置文件 文件层级关系,docker-compose和配置文件位于同级目录 node_exporter页面json文件 涉及离线包 一.docker-compose文件 [rootsulibao prometheus]# cat docker-compose.yml version: 3services:prometheus:image: registry.c…...
maya调整全局关节显示大小
请按以下步骤操作: 在 Maya 主菜单栏中,找到 Display (显示) 菜单。 在 Display 菜单下,找到 Animation (动画) 子菜单。 在 Animation 子菜单中,点击 Joint Size... (关节大小...)。 这时会弹出一个小窗口或者直接在界面上出现…...
“屏幕“的实现_程序中如何将数据映射到硬件_C++实战
前言 程序里的数据,最后都需要将数据对象写入硬件.C/C最大的优势体现也是在这里,他既是高级语言方便被程序员使用,又能和硬件沟通. 引入 以"屏幕"的实现,总结数据映射到硬件的代码写法 分析 软件部分 1.屏幕是数据对象---一切都是数据,一切都是对象;数据有类型,屏…...