Linux中部署Java jar 包 shell 脚本
Linux中部署Java jar 包 shell 脚本
#!/bin/bash
set -e# 基础
# export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181
# export PATH=PATH=$PATH:$JAVA_HOME/bin
# export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarDATE=$(date +%Y%m%d%H%M)
# 基础路径
BASE_PATH=/data/product/java/smart_factory
# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下
SOURCE_PATH=$BASE_PATH/jar
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAME=smart_factory
# 环境
PROFILES_ACTIVE=test
# 健康检查 URL
HEALTH_CHECK_URL=http://127.0.0.1:8989/actuator/health/# heapError 存放路径
HEAP_ERROR_PATH=$BASE_PATH/heapError
# JVM 参数
JAVA_OPS="-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"
# JavaAgent 参数。可用于配置 SkyWalking 等链路追踪
JAVA_AGENT=# 备份
function backup() {# 如果不存在,则无需备份if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"# 如果存在,则备份到 backup 目录下,使用时间作为后缀elseecho "[backup] 开始备份 $SERVER_NAME ..."cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jarecho "[backup] 备份 $SERVER_NAME 完成"fi
}# 最新构建代码 移动到项目环境
function transfer() {echo "[transfer] 开始转移 $SERVER_NAME.jar"# 删除原 jar 包if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"elseecho "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"rm $BASE_PATH/$SERVER_NAME.jarfi# 复制新 jar 包echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATHecho "[transfer] 转移 $SERVER_NAME.jar 完成"
}# 停止
function stop() {echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')# 如果 Java 服务启动中,则进行关闭if [ -n "$PID" ]; then# 正常关闭echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"kill -15 $PID# 等待最大 60 秒,直到关闭完成。for ((i = 0; i < 60; i++))dosleep 1PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')if [ -n "$PID" ]; thenecho -e ".\c"elseecho '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功'breakfidone# 如果正常关闭失败,那么进行强制 kill -9 进行关闭if [ -n "$PID" ]; thenecho "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID"kill -9 $PIDfi# 如果 Java 服务未启动,则无需关闭elseecho "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"fi
}# 启动
function start() {# 开启启动前,打印启动参数echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"echo "[start] JAVA_OPS: $JAVA_OPS"echo "[start] JAVA_AGENT: $JAVA_AGENT"echo "[start] PROFILES: $PROFILES_ACTIVE"# 开始启动BUILD_ID=dontKillMe nohup /data/soft/jdk-17.0.10/bin/java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE &echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"
}
# 健康检查
function healthCheck() {# 如果配置健康检查,则进行健康检查if [ -n "$HEALTH_CHECK_URL" ]; then# 健康检查最大 60 秒,直到健康检查通过echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";for ((i = 0; i < 60; i++))do# 请求健康检查地址,只获取状态码。result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`# 如果状态码为 200,则说明健康检查通过if [ "$result" == "200" ]; thenecho "[healthCheck] 健康检查通过";break# 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试elseecho -e ".\c"sleep 1fidone# 健康检查未通过,则异常退出 shell 脚本,不继续部署。if [ ! "$result" == "200" ]; thenecho "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功";tail -n 10 nohup.outexit 1;# 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。elsetail -n 10 nohup.outfi# 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。elseecho "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒";sleep 60echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功";tail -n 50 nohup.outfi
}# 部署
function deploy() {cd $BASE_PATH# 备份原 jarbackup# 停止 Java 服务stop# 部署新 jartransfer# 启动 Java 服务start# 健康检查healthCheck
}deploy
脚本语法
#注意事项
#Linux 命令大全 https://www.runoob.com/linux/linux-command-manual.html
#1.在linux中,&和&&,|和||介绍如下:
# & 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
# && 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'
# | 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
# || 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"
#
#2.shell一次性执行多条命令
# 2.1.每个命令之间用;隔开 说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
# 2.2.每个命令之间用&&隔开 说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
# 2.3.每个命令之间用||隔开 说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
#
#3.linux shell 中判断文件、目录是否存在的方法 https://www.jb51.net/article/186273.htm
# 判断运算 https://www.runoob.com/linux/linux-shell-basic-operators.html
# 多个条件判断 if [ $1 ] || [ $2 ] ;if [ $1 ] && [ $2 ]
# 多个条件判断 if [ -n "$1" -o -n "$2" ] -o表示or ; if [ -n "$1" -a -n "$2" ] -a表示and 参数必须加”“
# Shell 基础 -- 总结几种括号、引号的用法 https://www.cnblogs.com/tongye/p/10646211.html
#
#4.Shell中的$0、$1、$2、$(命令)的含义
# $$ Shell本身的PID(ProcessID)
# $! Shell最后运行的后台Process的PID
# $? 最后运行的命令的结束代码(返回值)比如shell运行一个命令,然后你在敲入$?, 就会打印上个命令的执行结果,就是上个命令的返回结果)
# $- 使用Set命令设定的Flag一览
# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
# $# 添加到Shell的参数个数
# $0 就是你写的shell脚本本身的名字,
# $1 是你给你写的shell脚本传的第一个参数,
# $2 是你给你写的shell脚本传的第二个参数
# $(命令) 是执行括号内的命令 例如$(pwd) 返回当前目录
# 示例:
# #!/bin/sh
# echo "shell脚本本身的名字: $0"
# echo "传给shell的第一个参数: $1"
# echo "传给shell的第二个参数: $2"
# 保存退出后,你在Test.sh所在的目录下输入 bash Test.sh 1 2
# 结果为:
# shell脚本本身的名字: Test.sh
# 传给shell的第一个参数: 1
# 传给shell的第二个参数: 2
#
#5.执行cp或mv时,总是会提示overwrite,如何不提示呢?
# 在命令行输入alias或者打开~/.bashrc文件看linux中的别名
# 默认cp执行的是cp -i,所以每次用cp的时候都会显示cp: overwrite `.., 解决 可以在使用\cp sourcefile destfile 即命令前加\
# 同理 mv rm 等
#
#6.shell脚本中cd命令无效的解决方法 source xxx.sh或者. ./xxx.sh 注意前面. ./xxx.sh .和.中间有个空格!
# fork 例 ./xxx.sh 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell。
# exec 例 exec xxx.sh 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了
# source 例 source xxx.sh 在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行。
# source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行
#
#7.shell脚本日志输出https://www.runoob.com/linux/linux-shell-io-redirections.html
# command < file 将输入重定向到 file。
# command > file 将输出重定向到 file。
# command >> file 将输出以追加的方式重定向到 file。
# /dev/null 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null 例 command > /dev/null
# 如果希望屏蔽 stdout 和 stderr,可以这样写: command > /dev/null 2>&1
# 关于2>&1的含义:将标准错误输出重定向到标准输出;符号>&是一个整体,不可分开,分开后就不是上述含义了;写成2&>1也是不可以的
# 为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?
# 不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:
# 本来1----->屏幕 (1指向屏幕)
# 执行>log后, 1----->log (1指向log)
# 执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)
#
#8.linux命令tee:将信息同时输出到屏幕和文件 例 | tee -a ./xxx.log 2>&1 或 例 | tee -a xxx.log 2>&1
# -a 是为了追加日志追加输出,避免日志被覆盖
#
#9.shell 也可以包含外部脚本 https://www.runoob.com/linux/linux-shell-include-file.html 注:被包含的文件 test1.sh 不需要可执行权限。
#
#10.给多个脚本赋权限 chmod a+x liqiang-2.sh liqiang-3.sh liqiang-4.sh 或者chmod a+x *.sh 或 chmod +x xxx.sh 或 chmod u+x xxx.sh
# u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
# + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
# r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
#11.-bash: ./xxx.sh: /bin/sh^M: bad interpreter: No such file or directory 编码方式是windows编辑的,必须转化格式为unix格式
# 操作 vim xxx.sh 按ESC键,再次执行下面命令(冒号是命令) :set ff=unix 再 :x
#
#12.外部执行shell脚本 第一步 source ./xxx.sh 例 source ./xxx.sh
# 第二步 方法名 参数1 参数2 例 pull username password
#13.外部执行shell脚本同时将日志信息输出到屏幕和文件
# 方法名 参数1 参数2 | tee -a ./xxx.log 2>&1
# 例 pull username password | tee -a ./pullcode.log 2>&1
#14.外部执行shell脚本的函数并同时将日志信息输出到屏幕和文件
# source xxx.sh && 方法 | tee -a ./xxx.log 2>&1
# 例 source xxx.sh && pull | tee -a ./pull.log 2>&1
#15.echo -e 参数
# -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
# \a 发出警告声;
# \b 删除前一个字符;
# \c 最后不加上换行符号;
# \f 换行但光标仍旧停留在原来的位置;
# \n 换行且光标移至行首;
# \r 光标移至行首,但不换行;
# \t 插入tab;
# \v 与\f相同;
# \\ 插入\字符;
# \nnn 插入nnn(八进制)所代表的ASCII字符;
# 在echo -e 后,对“\c” 的解释是:produce no further output 不产生进一步的输出 ----》自己理解是在\c 后,这一行后面的内容都不会输出
# 例 echo -e ".\c" 只输出"."
#
#16.shell获取当前工作目录绝对路径,最简单$(pwd)
# 不行尝试 $(cd "$(dirname "$0")";pwd)
#
#17.如何在vi和vim上查找字符串
# 17.1 命令模式下,/要搜索的字符串或者字符 例如 输入/echo
# 17.2 按下回车之后,可以看到vim已经把光标移动到该字符处和高亮了匹配的字符串(vi没高亮,因为它没有颜色)
# 17.3 查看下一个匹配呢?按下n(小写n),一直按n到最后,红色的字提示BOTTOM(已经到底了,尽头了),说明匹配的字符串已经到此处是最后一个。再按n会回到TOP(第一个匹配成功的字符串)
# 17.4 如何跳转到上一个匹配呢?按下N(大写N)。你可以按下Caps Lock键切换大小写,也可以在小写状态按下Shift + n
# 17.5 如果想从文件的结尾往开始处搜索呢 命令模式下,?要搜索的字符串或者字符 例如 输入?echo
#18 退出vi/vim
# :w - 保存文件,不退出 vim
# :w file -将修改另外保存到 file 中,不退出 vim
# :w! -强制保存,不退出 vim
# :wq -保存文件,退出 vim
# :wq! -强制保存文件,退出 vim
# :q -不保存文件,退出 vim
# :q! -不保存文件,强制退出 vim
# :e! -放弃所有修改,从上次保存文件开始再编辑
#
#
#19 linux 清空文件内容命令
# 1. > test.log
# 2. cat /dev/null test.log
# 3. echo "" >test.log
#
#20.查看java进程pid
# jps -l
#21.根据pid查询java进程的启动时间
# axo:选项
# pid:进程id
# comm:命令
# pmen: 进程占用的内存
# lstart: 进程启动时间
# grep: 文本搜索
# ps axo pid,ppid,comm,pmem,lstart | grep pid
# 例:39230 1 java 4.0 Sat Mar 12 13:28:50 2022
#22 cat 追加内容用 >>,覆盖内容用 >
# 1.cat创建文件
# 格式:cat > 文件名 <<结束标记
# 或者直接用:cat >文件名
# cat如果找不到文件,则直接创建文件,创建了文件,输入内容最后Ctrl + C退出。
# 例1 cat > 1.txt 回车 输入内容 最后Ctrl + C退出
# 例2 以D作为结束标记 输入内容 最后以D结束输入
# cat > 1.txt <<D
# 123
# D
# 2.cat文件追加
# 格式:cat >> 文件名 <<结束标记
# 例1 cat >> 1.txt 回车 输入内容 最后Ctrl + C退出
# 例2 以D作为结束标记 输入内容 最后以D结束输入
# cat >> 1.txt <<D
# 123
# D
# 3.cat文件清空
# 清空文件内容,可以直接输入结束标记,这样便向文件中写入0字符,文件即被清空了。
# 例1 直接输入结束标记,向文件中写入0字符
# cat > 1.txt <<D
# D
# 4.以EOF作为结束标记
# cat <<EOF和cat <<-EOF两个都是获取stdin,并在EOF处结束stdin,输出stdout。
# <<和<<-的区别
# <<:结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入
# <<-:最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束
# # 往文件1.txt写入追加内容 123
# cat >> 1.txt <<EOF
# 123
# EOF
# # 往文件1.txt写入覆盖内容 123
# cat >> 1.txt <<EOF
# 123
# EOF
#23.less
#less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。
# -b <缓冲区大小> 设置缓冲区的大小
# -e 当文件显示结束后,自动离开
# -f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
# -g 只标志最后搜索的关键词
# -i 忽略搜索时的大小写
# -m 显示类似more命令的百分比
# -N 显示每行的行号
# -o <文件名> 将less 输出的内容在指定文件中保存起来
# -Q 不使用警告音
# -s 显示连续空行为一行
# -S 行过长时间将超出部分舍弃
# -x <数字> 将"tab"键显示为规定的数字空格
# /字符串:向下搜索"字符串"的功能
# ?字符串:向上搜索"字符串"的功能
# n:重复前一个搜索(与 / 或 ? 有关)
# N:反向重复前一个搜索(与 / 或 ? 有关)
# b 向上翻一页
# d 向后翻半页
# h 显示帮助界面
# Q 退出less 命令
# u 向前滚动半页
# y 向前滚动一行
# 空格键 滚动一页
# 回车键 滚动一行
# [pagedown]: 向下翻动一页
# [pageup]: 向上翻动一页
#操作示例如下
# less log.log
# shift + g 命令到文件尾部
# 然后输入?加上(不要加空格)你要搜索的关键字,例如 ?1213
# 然后输入/加上(不要加空格)你要搜索的关键字,例如 /1213
# n:发现下一个搜索(与/或?有关)
# N:发现上一个搜索(与/或?有关)
相关文章:
Linux中部署Java jar 包 shell 脚本
Linux中部署Java jar 包 shell 脚本 #!/bin/bash set -e# 基础 # export JAVA_HOME/work/programs/jdk/jdk1.8.0_181 # export PATHPATH$PATH:$JAVA_HOME/bin # export CLASSPATH$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarDATE$(date %Y%m%d%…...
auto.js v1.4.4 实现自动打卡
一、使用场景 所在公司的打卡软件可以单独变成一个可以点击的APP,所以只需要实现以下步骤: 自动解锁屏幕返回主屏幕并打卡锁定屏幕需要的环境: 手机端下载并且安装 auto.js v4.1.1 PC端VS安装对应的插件学习资料 B站学习资料 对应 第三期&am…...
【Linux实验室】NFS、DHCP的搭建
NFS、DHCP的搭建 1、nfs服务搭建及测试什么是NFS?环境准备服务端机器安装nfs-utils和rpcbind包启动NFS服务创建/data/NFSdata目录,配置nfs文件启动服务挂载测试在服务端在共享目录下创建文件测试在客户端在共享目录下创建文件 2、dhcp服务搭建及测试什么…...
Samba 总是需要输入网络凭证
输入网络凭证: 用户名是 cat /etc/samba/smb.conf,查看 valid users mxw 为用户名。而不是其他账号名或者用户名,更不是登录计算机时的计算机名; 密码是 需要记住安装samba服务器时,自己设置的password࿱…...
图像处理_积分图
目录 1. 积分图算法介绍 2. 基本原理 2.1 构建积分图 2.2 使用积分图 3. 举个例子 1. 积分图算法介绍 积分图算法是图像处理中的经典算法之一,由Crow在1984年首次提出,它是为了在多尺度透视投影中提高渲染速度。 积分图算法是一种快速计算图像区域和…...
B/S架构SaaS模式 医院云HIS系统源码,自主研发,支持电子病历4级
B/S架构SaaS模式 医院云HIS系统源码,自主研发,支持电子病历4级 系统概述: 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查…...
(C)1005 继续(3n+1)猜想
1005 继续(3n1)猜想: 问题描述 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&a…...
编译好的C++应用程序拷贝到其它电脑,提示dll未找到依赖项的解决方法。
编译好的C应用程序拷贝到其它电脑上,运行时出现提示dll未找到依赖项。 由于dll依赖于其它dll,在开发用电脑上的环境不能完全与其它电脑相同。 解决办法是找到调用到的dll依赖的所有dll,拷贝到运行目录下。 在开发电脑上: 1、开…...
wps 开发插件
官方文档参考wps官方文档参考 1.环境安装 安装wps https://www.wps.cn/ 安装Node.js https://nodejs.org/en 安装代码编辑器 Visual Studio Code https://code.visualstudio.com/ 环境检查-进入cmd查看 node -v2.demo 2.1 demo下载 打开vscode,新建终端 安装…...
C语言----数据在内存中的存储
文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端?2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储,这个是一个了解c语言内部的知识点…...
【Linux学习】Linux 的虚拟化和容器化技术
˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…...
Delphi 是一种内存安全的语言吗?
上个月,美国政府发布了 "回到基石 "报告: 通往安全和可衡量软件之路 "的报告。该报告是美国网络安全战略的一部分,重点关注多个领域,包括内存安全漏洞和质量指标。 许多在线杂志都对这份报告进行了评论࿰…...
golang语言系列:Scrum、Kanban等敏捷管理策略
云原生学习路线导航页(持续更新中) 本文是 golang语言系列 文章,主要对编程通用技能 Scrum、Kanban等敏捷管理策略 进行学习 1.什么是敏捷开发 敏捷是一个描述软件开发方法的术语,它强调增量交付、团队协作、持续规划和持续学习。…...
QT背景介绍
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、QT背景 1.1什么是QT 1.2QT的发展历史 1.3什么是框架、库 1.4QT支持的平台 1.5QT的优点 1.6QT的…...
动态规划详解(Dynamic Programming)
目录 引入什么是动态规划?动态规划的特点解题办法解题套路框架举例说明斐波那契数列题目描述解题思路方式一:暴力求解思考 方式二:带备忘录的递归解法方式三:动态规划 推荐练手题目 引入 动态规划问题(Dynamic Progra…...
前端大额计算,真正解决js精度丢失问题
1.解决前端大额计算导致精度丢失问题 2.从底层上解决这个问题,计算时不使用js 运行时计算。 使用rust语言来解决这个问题,因为是底层语言,不涉及到精度问题。 3.实现步骤 步骤 1: 安装工具 确保你已经安装了Rust工具链和wasm-pack&#x…...
Android笔记--MediaCodec(一)
这一节主要来了解一下MediaCodec,Android MediaCodec 是 Android 平台提供的一个用于处理音频和视频数据的 API。它允许开发者对音频和视频数据进行编码和解码,支持多种格式和编解码器。MediaCodec API 通常用于实现实时音视频处理,如视频录制…...
Linux简单介绍
Linux简单介绍 编译器VMware虚拟机Ubuntu——LinuxOS为什么使用LinuxOS? 目录结构Windows目录结构Linux操作系统home是不是家目录? Linux常用命令终端命令行提示符与权限切换命令tab 作用:自动补全上下箭头pwd命令ls命令mkdir命令touch命令rm…...
Servlet 的基本理解
Servlet 是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servlet中的HttpServletRequest对象,调用init()&a…...
JavaScript之applye、bind和call方法详解
Question Q1 apply()、bind()和call()方法的区别在哪? Q2 apply()和call()的应用场景 Q3 apply()、bind()和call()方法手写实现逻辑 来源 继承自Function.prototype,属于实例方法 console.log(Function.prototype.hasOwnProperty(call)) //trueconsole.l…...
Docker,anaconda环境的部署与迁移
功能上线将提上日程,但是如何将我windows环境下的程序放到linux服务器的测试环境跑通呢?这是我这整个清明假期将要解决的一件事,最蠢的办法就是看自己的环境下有哪些依赖,如何到服务器上一个一个下,但是首先这个方法很…...
【大数据运维】Hbase shell 常见操作
文章目录 一. DDL1. 表的DDL1.1. 创建表1.2. 删除表 2. 列族的DDL2.1. 增加一个列簇2.2. 删除列族2.3. 修改列族版本(ing) 二. DML1. 插入与更新数据2. 删除数据3. 清空表 三. DQL1. scan:查一批数据1.1. 查询全部1.2. 过滤rowkey1.3. 过滤列…...
LeetCode-217存在重复的元素
217 存在重复的元素 给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 JavaScript的 Array 对象是用于构造数组的全局对象,数组是类似…...
基于两个单片机串行通信的电子密码锁设计
1.功能 电子号码锁在实际应用中应该有两部分,一部分在外部,有键盘部分和密码显示;另一部分内部,设置密码、显示密码。使用单片机自身带有的串口可以很方便的实现单片机之间的通信,使输入的密码值传送到主机检验是否是…...
产品经理功法修炼(3)之产品设计
点击下载《产品经理功法修炼(3)之产品设计》 1. 前言 产品经理的能力修炼并非局限于某一技能的速成,而是需要全面参与到产品的整个生命周期中,通过不断的实践来逐步提升自己的各项能力。尽管在企业的日常运作中,我们不可能身兼数职去扮演每一个角色,但作为产品的核心负…...
Qt 的发展历史、现状与启示
Qt 最早在1991年由挪威的两位程序员 Eirik Chambe-Eng 和 Haavard Nord 开发,他们在1994年创立 Trolltech 公司(奇趣科技)正式经营软件业务。Qt 的第一个公众预览版于1995年面世,之后在2008年被诺基亚收购;2011年到201…...
Quiet-STaR:让语言模型在“说话”前思考
大型语言模型(llm)已经变得越来越复杂,能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题,与人类不同LLM经常在推理中涉及的隐含步骤中挣扎,这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…...
【Kotlin】匿名类和伴生类
1 匿名类 1)无继承 fun main() {var obj object {var name: String "zhang"override fun toString(): String {return name}}println(obj) // zhang } 2)有继承 fun main() {var obj object: People {var name: String "zhang"…...
【机器学习算法介绍】(3)决策树
决策树是一种常见的机器学习算法,用于分类和回归任务。它模拟了人类决策过程,通过一系列的问题来引导决策。决策树的构建涉及三个主要步骤:特征选择、树的构建和树的剪枝。 1. 特征选择 特征选择是决策树构建过程中的第一步,目的…...
算法之查找
1、顺序查找: package com.arithmetic.search; //顺序查找 //sequentialSearch 方法接收一个整数数组和一个目标元素作为参数,并使用顺序查找的方式在数组中查找目标元素。 //它通过循环遍历数组元素,逐个与目标元素比较,如果找到…...
西安做网站找哪家公司好/网站设计模板
目录介绍原理undo log日志版本链read view(读视图)与可见性判断事务id和可见性介绍 MVCC(Multi-Version Concurrency Control),即多版本并发控制,数据库通过它能够做到遇到并发读写的时候,在不加锁的前提下实现安全的并…...
注册网站页面跳转错误/怎样申请网站
最近在补CSS的基础,看到盒子觉得理解起来比较混乱和困难,于是在网上查了好多资料,然后自己整理之后写了下来。 这次写一下块级元素、块级盒子以及BFC,如果有错误,欢迎大家指正 :) 在页面中&…...
东莞最好的网站建设/太原竞价托管公司推荐
如果用nodejs做服务器,很多情况下,是需要自动重启功能的。比如:场景1、当文件被修改时自动重启服务器。这里的文件,可能是服务器主程序,比如修改了程序,也可以是其它依赖文件等。例程:两个文件&…...
深圳燃气招聘网最新招聘/首页优化公司
Java代码实现的计算难免会显得不够高效。而利用MATLAB写好相应的计算函数,然后打包成jar包供Java调用,在某些情况下会更加方便。或者有些时候会涉及到使用Java调用MatLab展现一些二维三维图。因此用到Java调用MatLab。一:注意事项1࿱…...
旅行社网站 模板/网站代搭建维护
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释…...
益阳学校网站建设/seo承诺排名的公司
本篇文章主要介绍在windows下使用vmware虚拟机中的Linux(Centons7)下配置安装Hbase。 简要步骤: ①、下载Hbase解压包 ②、安装zookeeper ③、解压Hbase,配置环境环境 ④、修改Hbase脚本文件hbase-env.sh ⑤、修改配置文件hbase-site.xml ⑥、启动…...