Linux 基本使用和程序部署
1. Linux 环境搭建
1.1 环境搭建方式
主要有 4 种:
- 直接安装在物理机上。但是Linux桌面使用起来非常不友好,所以不建议。[不推荐]。
- 使用虚拟机软件,将Linux搭建在虚拟机上。但是由于当前的虚拟机软件(如VMWare之类的)存在一些bug,会导致环境上出现各种莫名其妙的问题,比较折腾。[非常不推荐]。
- 使用WSL (Windows Subsystem for Linux)。这个是Windows近几年开发的新功能,在Windows系统内集成了一个Linux。但是目前这个技术还不够成熟。[暂时不推荐]。
- 使用云服务器,可以直接在 腾讯云、阿里云或华为云 等服务器厂商处直接购买一个云服务器。[推荐]
使用云服务器不仅环境搭建简单,避免折腾,同时还有一个最大的好处,部署在云服务器上的项目可以直接被外网访问到,这个时候就和一个公司发布一个正式的网站没有任何区别。也就能让我们自己写的程序真的去给别人去使用。
1.2 使用终端软件连接到 Linux
终端软件是一类工具软件,可以和远程的主机建立网络链接,从而对主机进行一些操作
常见的终端软件:
XShell、Putty、MobaXTerm、Iterm2、SecureCRT...
下面使用的是 XShell
官网:家庭/学校免费 - NetSarang Website
选择 家庭/教育 版即可,上面链接就是
1.3 使用 XShell 登录主机
在 XShell 终端下输入
ssh 服务器外网ip地址
此处的 ip 即为云服务器后台看到的外网 ip
如果网络畅通,将会提示输入用户名密码,输入即可登录
关于 XShell 下的复制粘贴
复制:Ctrl + Insert(有些电脑的 Insert 需要配合 Fn 来使用)
粘贴:Shift + Insert
直接使用 Ctrl+C 和 Ctrl+V 是不可以的,但是可以重新设置快捷键(工具 -> 选项 -> 键盘和鼠标 -> 编辑)
2. Linux 常用命令
ls
语法:ls [选项][目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件,对于文件,将列出文件名以及其他信息
常用选项:
- -a 列出目录下的所有文件,包括以 . 开头的隐含文件
- -d 将目录像文件一样显示,而不是显示其下的文件,如:ls -d 指定目录
- -k 以 k 字节的形式表示文件的大小,如:ls -alk 指定文件
- -l 列出文件的详细信息
- -r 对目录反向排序
- -t 以时间排序
- -R 列出所有子目录下的文件(递归)
可以使用 命令 --help 来查看帮助文档,如下:
这些命令也可以相互组合,如下:
pwd
语法:pwd
功能:显示用户当前所在的目录
cd
Linux 系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件
语法:cd 目录名
功能:改变工作目录,将当前工作目录改变到指定的目录下
示例:
# 返回上级目录
cd ..# 进入用户家目录
cd ~# 返回最近访问目录
cd -
Linux 目录结构
Linux 是一个树形目录结构
几个特殊的目录:
- / 称为 根目录
- . 称为 当前目录
- .. 称为 当前目录的上级目录
绝对路径 & 相对路径
形如:/user/share/tomcat/logs/ 以根目录开头的,称为绝对路径
形如:./logs 以 . 或者 .. 开头的,称为相对路径
使用 Tab 键补全
我们敲的所有 Linux 命令,都可以使用 Tab 键来尝试补全,加快效率
例如:
但是当有两个都是 a 开头的文件时,按 Tab 键只能补充相同的部分,不同的部分仍需自己打,如:
当双击 Tab 后,它会将所有以 abc 为开头的文件显示出来
使用 Ctrl + C 重新输入
如果命令或目录敲错了,可以 Ctrl + C 取消当前的命令
touch
语法:touch [选项]...文件...
功能:touch 命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件
示例:
touch test.txt
rz & sz
rz 上传 sz 下载
有可能第一次使用,会出现未安装这两个指令的情况,提示如下:
只需要将它提示的安装命令运行一下即可使用:apt install lrzsz
cat
语法:cat [选项] [文件]
功能:查看目标文件的内容
常用选项:
-n 对输出的所有行编号
cat test.txt
cat 命令会将该文件全部显示出来,非常多:
若想要进行分页查看,可使用 more 命令:
可以只显示当前页,按空格,往后翻页;按 B 向上翻
想要结束查看,按 Ctrl + C
常用结束快捷键总结:
- Ctrl + C
- 两次 Ctrl + C
- exit
- :q!
- :q
当使用 less 来查看文件时,Ctrl + C 和 exit 就结束不了了:
要使用 :q 来结束
使用 less 查看文件时,PgUp 和 PgDn 来翻页
使用 less 看完文件后,就消失了,而 cat 和 more 看完文件后,文件内容会留在屏幕上
使用 less 查看文件时,可以使用 / [要查询的关键字] 来查询(more 也是这样查找)
head 命令
默认查看前 10 行:
可以通过 head -数字 来设置查多少行:
tail 命令,从文件结尾查看(默认 10 行)
也可 tail -数字 来进行设置
mkdir
语法:mkdir [选项] dirname...
功能:在当前目录下创建一个名为“dirname”的目录
常用选项:
-p, --parents 可以是一个路径名称,此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多级目录
示例:
# 递归建立多个目录
mkdir -p test/test1
rm
语法:rm [-f-i-r-v] [dirName/dir]
功能:删除文件或目录
常用选项:
- -f 即使文件属性为只读(即写保护),也能直接删除
- -i 删除前逐一询问确认
- -r 删除目录及其下所有文件
示例:
rm test.txt
重要注意事项:
千万不要运行 rm -rf /
尤其是在公司的生产服务器上
删除文件可以直接删除:
删文件夹不能直接删除:(需要加 -r)
cp
语法:cp [选项] 源文件或目录 目标文件或目录
功能:复制文件或目录
说明:cp 指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中;若同时指定多个文件或目录,而最后的目的地并非一个已经存在的目录,则会出现错误信息
常用选项:
- -f 或 --force 强行复制文件或目录,不论目的文件或目录是否已经存在
- -i 或 --interactive 覆盖文件之前先询问用户
- -r 递归处理,将指定目录下的文件与子目录一并处理,若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
- -R 或 --recursive 递归处理,将指定目录下的文件及其子目录一并处理
示例:
cp test1.txt test2.txt
mv
语法:mv [选项] 源文件或目录 目标文件或目录
功能:
- 视 mv 命令中的第二个参数类型的不同(是目标文件还是目标目录),mv 命令将文件重命名或将其移至一个新的目录中
- 当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名
- 当第二个参数是已经存在的目录名称时,源文件或目录参数可以有多个,mv 命令将各参数指定的源文件均移至目标目录中
常用选项:
- -f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- -i:若目标文件(destination)已经存在时,就会询问是否覆盖
示例:
mv test1.txt test2.txt
tail
语法:tail [必要参数] [选择参数] [文件]
功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理,常用于查看日志文件
选项:
- -f 循环读取
- -n<行数> 显示行数
示例:
tail -10 test1.txt
vim / vi
vim 是一个知名的文本编辑器,使用 vim 可以进行文本编辑
其相当于 Windows 的记事本,但功能比记事本要强大
1. 创建文件/打开文件
vim [文件名]
2. 进入插入模式
vim打开文件后默认是普通模式。普通模式下键盘的按键表示一些特殊功能的快捷键。(例如按下j并不 是输入字母"j",而是表示光标往下移动一行)。需要进入插入模式才能进行文本编辑。
使用 i 键可以进入到插入模式。(左下角提示--INSERT--)然后就可以像记事本一样正常编辑了。
3. 保存
在插入模式下不能保存文件,需要先回到 普通模式。按下 Esc 回到普通模式。
在普通模式下输入 :w,再按下回车,即可保存文件。
4. 退出 在插入模式下不能退出,需要先回到 普通模式。
退出时,分以下情况:
① 文件未修改:输入 :q,再按下回车,即可退出
② 文件修改并保存:使用 :wq 同时执行保存和退出。
③ 文件修改,但不希望保存:使用 :q! 进行强制退出
grep
语法:grep [参数]...[文件]...
功能:用于查找文件中是否包含指定字符串,并显示对应的行
选项:
- -n<行数> 显示的行数
- -w 全字匹配,要求整个单词都完全相同的结果才能匹配出来,而不仅仅是一个单词的一部分
- -r 递归查找,可以搜索多级目录下的所有文件
- --color 高亮查找到的结果
- --include 指定查找某些文件
- --exclude 指定排除某些文件
示例:
grep "hello" Hello.java
ps
语法:ps [参数]...
功能:用于查看当前系统上运行的进程
选项:
- a 显示一个终端的所有进程
- u 以用户为主的格式来显示程序状况
- x 显示所有程序,不止是会话中的进程
- e 显示所有进程,包括系统守护进程
- f 显示完成格式输出
示例:
ps aux # 显示系统上所有的进程
ps aux | grep "进程名"
ps aux | grep "进程id"ps -ef # 显示系统上所有的进程,但没有上面查的全(格式不一样)
netstat
语法:netstat [参数]...
功能:查看系统上的网络状态
选项:
- -a 显示所有正在或不再侦听的套接字
- -n 显示数字形式地址而不是去解析主机、端口或用户名
- -p 显示套接字所属进程的 PID 和名称
示例:
netstat -anp
netstat -anp | grep "进程名"
netstat -anp | grep "端口号"
管道
管道是一种古老的“进程间通信”方式,在 Linux 指令中可以使用 | 作为管道标记
意思是将前一个指令标准输出的内容,作为第二个指令的标准输入内容
示例:
ps -ef|grep "java"
ps -ef|head -10
tail -f log.txt|grep "Exception"
3. 搭建 Java 部署环境
3.1 apt
apt(Advanced Packaging Tool),Linux 软件包管理工具。用于在 Ubuntu、Debian 和相关 Linux 发行版上安装、更新、删除和管理 deb 软件包。
大多数 apt 命令必须以具有 sudo 权限的用户身份运行。
tip:如果使用 CentOS 则使用 yum 软件包管理工具
apt 常用命令
列出所有软件包
sudo apt list
这个命令输出所有包的列表,内容比较多,可以使用 grep 命令过滤输出
sudo apt list|grep "java"
更新软件包数据库
sudo apt-get update
apt 实际上在可用软件包的数据库上工作,如果数据库没有更新,系统将不知道是否有更新的软件包可用,这就是为什么在安装任何 Linux 系统之后,第一件事应该是更新 apt 数据库
运行此命令将会看到从各种服务器检索到的软件包信息
安装软件包
sudo apt install package_name
移除软件包
sudo apt remove package_name
remove 命令将卸载给定的软件包,但可能会留下一些配置文件,如果要删除包含所有配置文件的软件包,需使用 purge
apt remove 和 apt purge 的区别
- apt remove 删除包的二进制文件,它留下了残留的配置文件
- apt purge 删除与包相关的所有内容,包括配置文件
3.2 JDK
1. 更新软件包
sudo apt-get update
2. 安装 openjdk
# 查找 jdk 包
apt list |grep "openjdk-17"# 安装 jdk
sudo apt install openjdk-17-jdk
安装完成后输入:
出现 jdk 版本即安装成功
tip:此处安装的是 OpenJDK,是一个开源版 JDK
卸载 OpenJDK
# 检查安装的是哪个 OpenJDK
dpkg --list | grep -i jdk# 移除 openjdk 包:
apt-get purge openjdk*# 卸载 OpenJDK 相关包:
apt-get purge icedtea-* openjdk-*# 检查所有 OpenJDK 包是否都已卸载完毕:
dpkg --list | grep -i jdk
3.3 MySQL
1. 使用 apt 安装 MySQL
# 查找安装包
apt list |grep "mysql-server"# 安装 mysql
sudo apt install mysql-server
2. 安装完成后,查看 MySQL 状态
sudo systemctl status mysql
执行结果:
root@hcss-ecs-55b8:~# sudo systemctl status mysql
● mysql.service - MySQL Community ServerLoaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)Active: active (running) since Mon 2024-12-23 16:42:03 CST; 25s agoProcess: 40526 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, statu>Main PID: 40545 (mysqld)Status: "Server is operational"Tasks: 38 (limit: 4326)Memory: 364.3MCPU: 850msCGroup: /system.slice/mysql.service└─40545 /usr/sbin/mysqldDec 23 16:42:02 hcss-ecs-55b8 systemd[1]: Starting MySQL Community Server...
Dec 23 16:42:03 hcss-ecs-55b8 systemd[1]: Started MySQL Community Server.
lines 1-14/14 (END)
3. MySQL 安装安全设置
默认的 MySQL 设置是不安全的,MySQL 安装提供了一个安全脚本,用于解决不太安全的默认选项,运行以下命令:
sudo mysql_secure_installation
接下来按照提示输入:
4. 设置密码
连接 MySQL 服务器
sudo mysql
使用 alter user 命令修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '此处是密码';
当再次连接服务器时需要使用:
mysql -uroot -p
卸载 MySQL
# 停⽌ mysql sudo systemctl stop mysql# 卸载 mysql sudo apt-get remove --purge mysql-server mysql-client mysql-common# 删除 MySQL 配置⽂件和数据 sudo rm -rf /etc/mysql /var/lib/mysql# 清理残留⽂件和⽬录 sudo apt-get autoremove sudo apt-get autoclean# 检查是否有残留 dpkg --list | grep -i mysql-*# 移除相关包 apt-get purge mysql*# 验证卸载结果 mysql --version
4. 部署 Web 项目到 Linux
4.1 环境配置
要想程序正常运行,需要保证环境和程序都要正确,我们需要先设置环境
数据准备
按照以下数据库建表脚本,在服务器上运行,建立表结构
-- 建表SQL
create database if not exists java_blog_spring charset utf8mb4;use java_blog_spring;
-- 用户表
DROP TABLE IF EXISTS java_blog_spring.user_info;
CREATE TABLE java_blog_spring.user_info(`id` INT NOT NULL AUTO_INCREMENT,`user_name` VARCHAR ( 128 ) NOT NULL,`password` VARCHAR ( 128 ) NOT NULL,`github_url` VARCHAR ( 128 ) NULL,`delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now() ON UPDATE now(),PRIMARY KEY ( id ),
UNIQUE INDEX user_name_UNIQUE ( user_name ASC )) ENGINE = INNODB DEFAULT CHARACTER
SET = utf8mb4 COMMENT = '用户表';-- 博客表
drop table if exists java_blog_spring.blog_info;
CREATE TABLE java_blog_spring.blog_info (`id` INT NOT NULL AUTO_INCREMENT,`title` VARCHAR(200) NULL,`content` TEXT NULL,`user_id` INT(11) NULL,`delete_flag` TINYINT(4) NULL DEFAULT 0,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now() ON UPDATE now(),PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';-- 新增用户信息
insert into java_blog_spring.user_info (user_name, password,github_url)values("zhangsan","123456","https://gitee.com/bubble-fish666/class-java45");
insert into java_blog_spring.user_info (user_name, password,github_url)values("lisi","123456","https://gitee.com/bubble-fish666/class-java45");insert into java_blog_spring.blog_info (title,content,user_id) values("第一篇博客","111我是博客正文我是博客正文我是博客正文",1);
insert into java_blog_spring.blog_info (title,content,user_id) values("第二篇博客","222我是博客正文我是博客正文我是博客正文",2);
程序配置文件修改
实际工作中,开发环境,测试环境以及生产环境的配置都是不一样的
比如 mysql 的用户名和密码
我们可以针对不同的环境,设置不同的配置
多平台文件配置
针对不同平台创建不同的配置文件,要求名字为 application-XXX.yml 或 application-XXX.properties
以下以 application-XXX.yml 为例:
固定格式,只有后面的字母可以改
在配置文件里写不同内容
application-dev.yml
spring:application:name: spring-boot-blogdatasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: 本地数据库密码driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:file:name: spring-blog.log
application-prod.yml
spring:application:name: spring-boot-blogdatasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: 云服务器数据库密码driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:configuration:map-underscore-to-camel-case: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:file:name: spring-blog.log
在主配置文件 application.yml 中指定配置文件,并删除数据库相关配置
spring:profiles:active: prod
tip:三种 application 生效情况
当把主配置文件注释掉后:
只会生效主配置文件,因此需要生效 dev 或 prod 时,需要在主配置文件中设置
这样很麻烦,每次需求变更都需要改代码,因此可以使用 Maven 将其变成一个变量,通过传递的方式来更改需求
从 Maven 中读取环境变量
<profiles><profile><id>dev</id><!--自定义的属性--><properties><profile.name>dev</profile.name><mysql.password>开发环境数据库密码</mysql.password></properties><activation><!--默认使用 dev--><activeByDefault>true</activeByDefault></activation></profile><profile><id>prod</id><!--自定义的属性--><properties><profile.name>prod</profile.name><mysql.password>生产环境数据库密码</mysql.password></properties></profile></profiles>
4.2 构建项目并打包
在本地使用 maven 进行打包
tip:如果 Test 代码中有与环境配置相关的操作(比如数据库相关的操作),打包可能会失败,此时可点击下图红框处跳过测试
点击上图中的 package 运行如下:
4.3 上传 jar 包到服务器并运行
1. 上传 jar 包
直接拖动打好的 jar 包到 XShell 窗口即可完成文件的上传(上传速度取决于网络速度)
2. 运行程序
java -jar blog.jar
上面命令可以启动程序,但是当 XShell 窗口关掉后,博客系统也被关闭了,无法再登录
因此想要在后台运行程序,需要用到下面命令:
nohup java -jar blog.jar &
此时就算将电脑关掉,只要云服务器不关就可以一直访问
nohup:后台运行程序,用于在系统后台不挂断的运行命令,退出终端不会影响程序的运行
语法格式:
nohup Command [Arg...] [&]
参数说明:
Command:要执行的命令
Arg:一些参数,可以指定输出文件
&:让命令在后台执行,终端退出后命令仍旧执行
例子:
nuhup java -jar blog.jar >/logs &
Linux 可以通过 > 把需要输出的内容写到指定文件中,这样的操作称为“重定向”
3. 开放端口号
如果外网需要访问该服务,需要先从服务器防火墙开放对应的端口号
本着服务器安全的原则,云服务器上的端口非必要不开启
比如常见端口号:数据库3306,Redis 6379,尽可能不要开放,而是采用其他方式来连接,比如配置隧道的方式
以华为云服务器举例:
1) 进入 安全组 / 防火墙 管理页面
2) 添加规则
端口号写需要开放的端口号,多个端口号以逗号分隔
4.4 验证程序
使用 tail -f 来查看滚动日志
当尝试登录时,会发现密码错误,这是因为数据库的密码还没有加密,下面生成一些密文,放到数据库中
4.5 常见问题
服务不能正常访问的原因:
1. 确认程序是否启动
使用下面两个命令查看程序是否在运行
ps -ef|grep java
netstat -nltp|grep 8080
2. 确认端口号是否开放
3. 使用 curl http://127.0.0.1:8080/blog_login.html 看一下是否有返回 html 页面,如果有返回,说明程序启动成功了,应该考虑端口是否已开放
4. 确认防火墙是否打开(默认是关闭)
如果防火墙打开了,还需要再打开防火墙的端口号(如上面的 8080)
4.6 杀掉进程
如果需要重启服务,或者重新部署等,都需要先停止之前的服务
1. 查看当前服务的进程
ps -ef|grep java
上图中 46947 就是该服务的进程
2. 杀掉进程
kill -9 PID
相关文章:
Linux 基本使用和程序部署
1. Linux 环境搭建 1.1 环境搭建方式 主要有 4 种: 直接安装在物理机上。但是Linux桌面使用起来非常不友好,所以不建议。[不推荐]。使用虚拟机软件,将Linux搭建在虚拟机上。但是由于当前的虚拟机软件(如VMWare之类的)存在一些bugÿ…...
react中使用ResizeObserver来观察元素的size变化
在 React 中使用 ResizeObserver 来观察元素的大小变化,可以通过创建一个自定义 Hook 来封装 ResizeObserver 的逻辑,并在组件中使用这个 Hook。以下是一个完整的示例,展示了如何在 React 中使用 ResizeObserver 来观察元素的大小变化。 自定…...
常见数据结构
1.数组 vector 2.链表 list 双向链表,不能通过下标找元素 3.栈 stack 4.队列 queue 优先队列priority_queue. 默认队头为最大值,可以用来任务调度,图算法,霍夫曼树 5.双端队列 deque 6.集合 set multiset s.begin() //返回…...
【服务器】linux服务器管理员查看用户使用内存情况
【服务器】linux服务器管理员查看用户使用硬盘内存情况 1、查看所有硬盘内存使用情况 df -h2、查看硬盘挂载目录下所有用户内存使用情况 du -sh /public/*3、查看某个用户所有文件夹占用硬盘内存情况 du -sh /public/zhangsan/*...
Java-冒泡排序、选择排序、二分查找算法
1. 冒泡排序 (1) 冒泡排序:每次从数组中找出最大值放在数值的后面去 public static void main(String[] args) {//冒泡排序int[] arr {5, 6 ,4, 9, 3, 1};for (int i 0; i < arr.length - 1; i) {for (int j 0; j < arr.length - i - 1; j) {if (arr[j] &…...
leetcode之hot100---240搜索二维矩阵II(C++)
思路一:通过遍历主对角线上元素判断查找方向 主对角线遍历: 遍历主对角线上的每个元素(matrix[i][i]),其中 i 的范围是 [0, min(m, n) - 1]。如果目标值小于当前主对角线元素,说明目标值可能在当前元素的左…...
牛客--求小球落地5次后所经历的路程和第5次反弹的高度,称砝码
求小球落地5次后所经历的路程和第5次反弹的高度 描述 假设有一个小球从 hh 米高度自由落下,我们不考虑真实的物理模型,而是简洁的假定,该小球每次落地后会反弹回原高度的一半;再落下,再反弹;……。 求小球…...
EasyPoi 使用$fe:模板语法生成Word动态行
1 Maven 依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version> </dependency> 2 application.yml spring:main:allow-bean-definition-over…...
在 PowerShell 中优雅地显示 Python 虚拟环境
在使用 Python 进行开发时,虚拟环境管理是一个非常重要的部分。无论是使用 venv 还是 conda,我们都希望能够清晰地看到当前所处的虚拟环境。本文将介绍如何在 PowerShell 中配置提示符,使其能够优雅地显示不同类型的 Python 虚拟环境。 问题…...
GUI07-学工具栏,懂MVC
MVC模式,是天底下编写GUI程序最为经典、实效的一种软件架构模式。当一个人学完菜单栏、开始学习工具栏时,就是他的一生中,最适合开始认识 MVC 模式的好时机之一。这节将安排您学习: Model-View-Controller 模式如何创建工具栏以及…...
免费线上签字小程序,开启便捷电子签名
虽如今数字化飞速发展的时代,但线上签名小程序的开发制作却并非易事。需要攻克诸多技术难题,例如确保签名的真实性与唯一性,防止签名被伪造或篡改。 要精准地捕捉用户手写签名的笔迹特征,无论是笔画的粗细、轻重,还是…...
计算机的错误计算(一百八十九)
摘要 用大模型计算 tan(12.345) . 自变量取弧度。结果保留10位有效数字。不同于前面两节的大模型,本节调用了新的两个大模型。然而,很遗憾,它们给出的答案似乎仍然是“匹配”出来的,不是计算出来的。当然,均是错误的。…...
HDR视频技术之十一:HEVCH.265 的 HDR 编码方案
前文我们对 HEVC 的 HDR 编码优化技术做了介绍,侧重编码性能的提升。 本章主要阐述 HEVC 中 HDR/WCG 相关的整体编码方案, 包括不同应用场景下的 HEVC 扩展编码技术。 1 背景 HDR 信号一般意味着使用更多比特,一般的 HDR 信号倾向于使用 10…...
使用 AI 辅助开发一个开源 IP 信息查询工具:一
本文将分享如何借助当下流行的 AI 工具,一步步完成一个开源项目的开发。 写在前面 在写代码时,总是会遇到一些有趣的机缘巧合。前几天,我在翻看自己之前的开源项目时,又看到了 DDNS 相关的讨论。虽然在 2021 年我写过两篇相对详细的教程&am…...
『 Linux 』高级IO (一)
文章目录 内容回顾及铺垫五种IO模型不同类型IO的区别非阻塞IOfcntl( ) 多路转接 - select( )select( ) 的基本使用 - SelectServer服务器 内容回顾及铺垫 在博客『 Linux 』基础IO/文件IO (万字)中介绍了对IO的认识; IO实际上为Input/Output,输入输出; 以网络协议栈的视角来看,…...
Cisco WebEx 数据平台:统一 Trino、Pinot、Iceberg 及 Kyuubi,探索 Apache Doris 在 Cisco 的改造实践
导读:Cisco WebEx 早期数据平台采用了多系统架构(包括 Trino、Pinot、Iceberg 、 Kyuubi 等),面临架构复杂、数据冗余存储、运维困难、资源利用率低、数据时效性差等问题。因此,引入 Apache Doris 替换了 Trino、Pinot…...
Java - 日志体系_Apache Commons Logging(JCL)日志接口库
文章目录 官网1. 什么是JCL?2. JCL的主要特点3. JCL的核心组件4. JCL的实现机制5. SimpleLog 简介6. CodeExample 1 : 默认日志实现 (JCL 1.3.2版本)Example 2 : JCL (1.2版本) Log4J 【安全风险高,请勿使用】 7. 使用…...
Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
在嵌入式开发中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于与外设(如 EEPROM、传感器、显示屏等)进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器,它提供 2Kbit…...
盒子模型(外边距的设置)
用于页面中元素的合理布局所有的元素都可以有宽高所有元素都是一个矩形所有元素都可以看成一个盒子盒子包括 外边距边框内边距元素内容 外边距设置 外边距的要素:top、bottom、left、right外边距的尺寸:合法的尺寸单位外边距语法:marign-方…...
买卖股票的最佳时机 IV - 困难
************* C topic:188. 买卖股票的最佳时机 IV - 力扣(LeetCode) ************* Stock angin: Still stocks. Intuitively, it feels hard. For once: class Solution { public:int maxProfit(vector<int>& prices) {in…...
ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制
文章目录 Pre概述什么是 composite aggregation?基本结构after 参数的作用问题背景:传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…...
HTML5 Web IndexedDB 数据库
IndexedDB 是一种基于浏览器的 NoSQL 数据库,用于在客户端持久化存储大量结构化数据。 IndexedDB 允许通过键值对存储复杂的数据对象(如对象、数组、文件等),并支持事务、索引、版本控制和复杂查询操作。 IndexedDB 是异步的&am…...
苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
读书笔记~管理修炼-缄默效应
缄默效应:学会正确批评下属 员工明明犯了错误,却不及时告知你,总是拖到最后一刻无法弥补时才不得不承认出了问题——你遇到过这样的问题吗? 这其实是缄默效应在发挥作用。 在职场中,即使再扁平化的环境&…...
LabVIEW声音信号处理系统
开发了一种基于LabVIEW的声音信号处理系统,通过集成的信号采集与分析一体化解决方案,提升电子信息领域教学与研究的质量。系统利用LabVIEW图形化编程环境和硬件如USB数据采集卡及声音传感器,实现了从声音信号的采集到频谱分析的全过程。 项目…...
2024.12.10——攻防世界Web_php_include
知识点:代码审计 文件包含 伪协议 伪协议知识点补充: 在PHP中,伪协议(Pseudo Protocols)也被称为流包装器,这些伪协议以 php://开头,后面跟着一些参数,用于指定要执行的操作或需要…...
Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件
Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件,”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件” 在Linux系统中,使用ImageMagick可以图片格式转换,…...
有没有检测吸烟的软件 ai视频检测分析厂区抽烟报警#Python
在现代厂区管理中,安全与规范是重中之重,而吸烟行为的管控则是其中关键一环。传统的禁烟管理方式往往依赖人工巡逻,效率低且存在监管死角,难以满足当下复杂多变的厂区环境需求。此时,AI视频检测技术应运而生࿰…...
LeetCode 每日一题 2024/12/16-2024/12/22
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 12/16 1847. 最近的房间12/17 3291. 形成目标字符串需要的最少字符串数 I12/18 3292. 形成目标字符串需要的最少字符串数 II12/19 3285. 找到稳定山的下标12/20 3138. 同位…...
gitlab代码推送
点击这个√ 修改的文件全部选上 填好提交的名称 点击commit 选取提交的 gitlab 库 点击Push...
小红书飞书素材库 | AI改写 | 无水印下载 | 多维表格 | 采集同步 | 影刀RPA
小红书飞书素材库 | AI改写 | 无水印下载 | 多维表格 | 采集同步 | 影刀RPA 模板准备 进入【小红书】素材采集库_荷逸模板,点击使用模板 创建文档应用 在开发者后台 - 飞书开放平台创建 企业自建应用 (需要账号有相应的权限, 如果没有权限向管理员申请) 获取 Ap…...
【计算机视觉基础CV-图像分类】02-入门详解图像分类、经典数据集、比赛与冠军图像模型演进史
前言 图像分类(Image Classification)是计算机视觉(Computer Vision)中一项基础且核心的任务。简单来说,就是让计算机从给定的类别集合中,为一张输入图片分配一个正确的类别标签。这个过程听起来直观&…...
【机器学习】探索机器学习与人工智能:驱动未来创新的关键技术
探索机器学习与人工智能:驱动未来创新的关键技术 前言:人工智能的核心技术深度学习:自然语言处理(NLP):计算机视觉: 机器学习与人工智能的驱动创新医疗健康领域金融行业智能制造与工业互联网智慧…...
DS二叉树--基于数组存储的构建
题目描述 任意二叉树可以根据完全二叉树性质保存在一个数组中。已知二叉树的数组存储,用程序构建该二叉树。 提示:用递归方法或非递归都可以 输入 第一行输入一个整数t,表示有t个测试数据 第二行起输入二叉树的数组存储结果,空…...
入侵他人电脑,实现远程控制(待补充)
待补充 在获取他人无线网网络密码后,进一步的操作是实现入侵他人电脑,这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址(通过伪造的网页、伪造的Windows窗口、hook,信…...
STM32基于标准库如何查看时钟主频,100%简单
基于原有的工程写入两行代码,见下图 RCC_ClocksTypeDef get_rcc_clock; RCC_GetClocksFreq(&get_rcc_clock); 进入我们的仿真加入断点,然后在watch1观察变量值数据,然后在计算器计算就能得出,如上图。 但是这样看的PAB1上…...
HarmonyOS NEXT 技术实践-基于意图框架服务实现智能分发
在智能设备的交互中,如何准确理解并及时响应用户需求,成为提升用户体验的关键。HarmonyOS Next 的意图框架服务(Intents Kit)为这一目标提供了强大的技术支持。本文将通过一个项目实现的示例,展示如何使用意图框架服务…...
[原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…...
【jenkins插件】
1) 2) 3) 4) 5) 6) 参考: 知识库/运维/Jenkins/01-安装/13-插件.md zfoo/java-developer-document - 码云 - 开源中国...
springboot472基于web网上村委会业务办理系统(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本网上村委会业务办理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数…...
七层网络笔记
首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解 每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件 物理层由来:上面提到&a…...
PostgreSQL编译安装教程
下载安装 1.在家目录创建一个文件夹放下载安装包 mkdir softwarecd software 2.下载文件压缩包 wget https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz 3.解压 tar -xzvf postgresql-16.0.tar.gz 4.编译 在software/postgresql-16.0下 cd software…...
音视频学习(二十四):hls协议
基本原理 HLS协议通过将视频文件切分成多个小的媒体段(通常是10秒左右的.ts文件),并通过HTTP传输给客户端。视频播放过程中,客户端按顺序请求这些小段文件来逐步播放整个视频流。HLS还支持多种码率,以便适应不同网络条…...
pytorch MoE(专家混合网络)的简单实现。
专家混合(Mixture of Experts, MoE)是一种深度学习模型架构,通常用于处理大规模数据和复杂任务。它通过将输入分配给多个专家网络(即子模型),然后根据门控网络(gating network)的输出…...
代码随想录day24 | leetcode 93.复原IP地址 90.子集 90.子集II
93.复原IP地址 Java class Solution {List<String> result new ArrayList<String>();StringBuilder stringBuilder new StringBuilder();public List<String> restoreIpAddresses(String s) {backtracking(s, 0, 0);return result;}// number表示stringb…...
Scala项目(图书管理系统)
3、service BookService package org.app package serviceimport org.app.dao.{BookDAO, BorrowRecordDAO} import org.app.models.{BookModel, BorrowRecordModel}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookS…...
Deepin/Linux clash TUN模式不起作用,因网关导致的问题的解决方案。
网关导致的问题的解决方案 查看路由 ip route寻找默认路由 默认路由应当为Mihomo default dev Mihomo scope link 如果不是,则 sudo ip route add default dev Mihomo在clash TUN开关状态发生变化时,Mihomo网卡会消失,所以提示找不到网卡…...
【macos java反编译工具Java Decompiler】
mac上能用的反编译工具 https://java-decompiler.github.io/...
VLAN数据格式
概念:VLAN叫做虚拟局域网,指在物理网络中根据用于、工作组、应用等进行逻辑划分的局域网,是一个广播域,与用户的物理位置没有关系。 作用:VLAN可以灵活的进行分段和组织,能够实现更好的安全性,…...
Error response from daemon: Get “https://registry-1.docker.io/v2/“ 问题解决
文章目录 一、参考资料二、修改nameserver三、修改daemon.json文件 一、参考资料 问题的根源在于系统每次都会自动修改DNS,所以需要永久修改 linux永久修改dns 二、修改nameserver sudo nano /etc/resolvconf/resolv.conf.d/head 没有该文件的话需要安装 sudo a…...