普通Java工程如何在代码中引用docker-compose.yml中的environment值

文章目录

  • 一、概述
  • 二、常规做法
    • 1. 数据库配置分离
    • 2. 代码引用配置
    • 3. 编写启动类
    • 4. 支持打包成可执行包
    • 5. 支持可执行包打包成docker镜像
    • 6. docker运行
  • 三、存在问题分析
  • 四、改进措施
    • 1. 包含environment 变量的编排文件
    • 2. 修改读取配置文件方式
    • 3. 为什么可以这样做
  • 五、运行效果
    • 1. 本地windows运行
    • 2. centos 服务器jar运行
    • 3. centos 服务器docker运行
  • 六、完整代码

一、概述

普通Java工程这里指非spring工程,主要指一些系统资源监控程序、数据日志清理程序等,需要保持依赖简单,执行文件体积微小方便部署,这些程序需要需要跟数据库交互,例如需要将监控数据持久化到db、连接数据库清理过期数据等。

二、常规做法

1. 数据库配置分离

普通Java工程配置文件一般采用properties,典型的配置文件如下:
jdbc.properties

jdbc.driver   = com.mysql.cj.jdbc.Driver
jdbc.url      = jdbc:mysql://127.0.0.1:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&createDatabaseIfNotExist=true
jdbc.username = root
jdbc.password = root123

2. 代码引用配置

        ResourceBundle config = ResourceBundle.getBundle("jdbc");PoolProperties p = new PoolProperties();p.setUrl(config.getString("jdbc.url"));p.setDriverClassName(config.getString("jdbc.driver"));p.setUsername(config.getString("jdbc.username"));p.setPassword(config.getString("jdbc.password"));

3. 编写启动类

启动类main方法,一般使用定时任务线程池,以保证程序一直运行
核心代码:

 ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1);service.scheduleAtFixedRate(() -> { doSomething(); // 业务方法}, 0, 60, TimeUnit.SECONDS);

4. 支持打包成可执行包

具体参考 普通Java工程可执行JAR两种打包方式探讨

5. 支持可执行包打包成docker镜像

具体参考: 容器镜像生成记

6. docker运行

在编排文件目录执行 docker-compose up -d

docker-compose.yml

version: '3.7'
services:java-with-docker:image: registry.cn-shanghai.aliyuncs.com/00fly/java-with-docker:0.0.1container_name: java-with-dockerdeploy:resources:limits:cpus: '1.0'memory: 64Mreservations:cpus: '0.05'memory: 64Mrestart: on-failurelogging:driver: json-fileoptions:max-size: '5m'max-file: '1'

三、存在问题分析

上面的做法存在最大的问题是:

  1. 数据库配置固定在内部配置文件jdbc.properties中
  2. 维护麻烦,如果是通用的需要,每换一套环境,需要重新跑流程,包括打包可执行包和镜像打包。

四、改进措施

springboot 工程中,我们支持数据源配置在docker-compose.yml中的environment配置
典型例子如下:

version: '3.8'
services:springboot-dbutils:image: 00fly/springboot-dbutils:0.0.1container_name: springboot-dbutilsdeploy:resources:limits:cpus: '0.80'memory: 400Mreservations:cpus: '0.05'memory: 200Mports:- 80:8080environment:- SPRING_DATASOURCE_URL=jdbc:mysql://127.0.0.1:3306/dbutils?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true- SPRING_DATASOURCE_USERNAME=user- SPRING_DATASOURCE_PASSWORD=password123restart: on-failurelogging:driver: json-fileoptions:max-size: 5mmax-file: '1'

同理,我们也希望普通java也支持如下编排文件中的environment 变量

1. 包含environment 变量的编排文件

docker-compose.yml

version: '3.7'
services:java-with-docker:image: registry.cn-shanghai.aliyuncs.com/00fly/java-with-docker:0.0.1container_name: java-with-dockerdeploy:resources:limits:cpus: '1.0'memory: 64Mreservations:cpus: '0.05'memory: 64Mrestart: on-failureenvironment:- JDBC_URL=jdbc:mysql://192.168.15.202:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true- JDBC_USERNAME=test- JDBC_PASSWORD=test123- JDBC_DRIVER=com.mysql.cj.jdbc.Driverlogging:driver: json-fileoptions:max-size: '5m'max-file: '1'

2. 修改读取配置文件方式

将原来读取jdbc.properties的配置文件的方式修改为如下:

        //docker环境下优先使用docker-compose中environment值Map<String, String> env = System.getenv();ResourceBundle config = ResourceBundle.getBundle("jdbc");String url = StringUtils.defaultIfBlank(env.get("JDBC_URL"), config.getString("jdbc.url"));String userName = StringUtils.defaultIfBlank(env.get("JDBC_USERNAME"), config.getString("jdbc.username"));String passWord = StringUtils.defaultIfBlank(env.get("JDBC_PASSWORD"), config.getString("jdbc.password"));dataSource.setUrl(url);dataSource.setUser(userName);dataSource.setPassword(passWord);

3. 为什么可以这样做

其实,这说明了:在docker-compose.yml配置的environment 值,均会被读取到System.getenv() 中

五、运行效果

1. 本地windows运行

2024-07-06 15:34:16.345 [main] INFO  com.fly.simple.MainRun - ------------------------------
2024-07-06 15:34:16.421 [main] INFO  com.fly.simple.MainRun - =:: -> ::\
2024-07-06 15:34:16.421 [main] INFO  com.fly.simple.MainRun - =D: -> D:\
2024-07-06 15:34:16.421 [main] INFO  com.fly.simple.MainRun - ALLUSERSPROFILE -> C:\ProgramData
2024-07-06 15:34:16.422 [main] INFO  com.fly.simple.MainRun - APPDATA -> C:\Users\00fly\AppData\Roaming
2024-07-06 15:34:16.422 [main] INFO  com.fly.simple.MainRun - COMPUTERNAME -> 7t9lppye5cj7lud
2024-07-06 15:34:16.423 [main] INFO  com.fly.simple.MainRun - ChocolateyInstall -> C:\ProgramData\chocolatey
2024-07-06 15:34:16.424 [main] INFO  com.fly.simple.MainRun - ChocolateyLastPathUpdate -> 133608643383155797
2024-07-06 15:34:16.424 [main] INFO  com.fly.simple.MainRun - ComSpec -> C:\Windows\system32\cmd.exe
2024-07-06 15:34:16.424 [main] INFO  com.fly.simple.MainRun - CommonProgramFiles -> C:\Program Files\Common Files
2024-07-06 15:34:16.425 [main] INFO  com.fly.simple.MainRun - CommonProgramFiles(x86) -> C:\Program Files (x86)\Common Files
2024-07-06 15:34:16.425 [main] INFO  com.fly.simple.MainRun - CommonProgramW6432 -> C:\Program Files\Common Files
2024-07-06 15:34:16.425 [main] INFO  com.fly.simple.MainRun - DokanLibrary1 -> C:\Program Files\Dokan\Dokan Library-1.4.1\
2024-07-06 15:34:16.426 [main] INFO  com.fly.simple.MainRun - DokanLibrary1_LibraryPath_x64 -> C:\Program Files\Dokan\Dokan Library-1.4.1\lib\
2024-07-06 15:34:16.426 [main] INFO  com.fly.simple.MainRun - DokanLibrary1_LibraryPath_x86 -> C:\Program Files\Dokan\Dokan Library-1.4.1\x86\lib\
2024-07-06 15:34:16.426 [main] INFO  com.fly.simple.MainRun - DriverData -> C:\Windows\System32\Drivers\DriverData
2024-07-06 15:34:16.427 [main] INFO  com.fly.simple.MainRun - FPS_BROWSER_APP_PROFILE_STRING -> Internet Explorer
2024-07-06 15:34:16.427 [main] INFO  com.fly.simple.MainRun - FPS_BROWSER_USER_PROFILE_STRING -> Default
2024-07-06 15:34:16.427 [main] INFO  com.fly.simple.MainRun - HOMEDRIVE -> C:
2024-07-06 15:34:16.428 [main] INFO  com.fly.simple.MainRun - HOMEPATH -> \Users\00fly
2024-07-06 15:34:16.428 [main] INFO  com.fly.simple.MainRun - LOCALAPPDATA -> C:\Users\00fly\AppData\Local
2024-07-06 15:34:16.428 [main] INFO  com.fly.simple.MainRun - LOGONSERVER -> \\7t9lppye5cj7lud
2024-07-06 15:34:16.429 [main] INFO  com.fly.simple.MainRun - NODE_PATH -> D:\nodejs
2024-07-06 15:34:16.429 [main] INFO  com.fly.simple.MainRun - NUMBER_OF_PROCESSORS -> 4
2024-07-06 15:34:16.429 [main] INFO  com.fly.simple.MainRun - OS -> Windows_NT
2024-07-06 15:34:16.429 [main] INFO  com.fly.simple.MainRun - PATHEXT -> .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
2024-07-06 15:34:16.429 [main] INFO  com.fly.simple.MainRun - PROCESSOR_ARCHITECTURE -> AMD64
2024-07-06 15:34:16.429 [main] INFO  com.fly.simple.MainRun - PROCESSOR_IDENTIFIER -> Intel64 Family 6 Model 85 Stepping 7, GenuineIntel
2024-07-06 15:34:16.430 [main] INFO  com.fly.simple.MainRun - PROCESSOR_LEVEL -> 6
2024-07-06 15:34:16.430 [main] INFO  com.fly.simple.MainRun - PROCESSOR_REVISION -> 5507
2024-07-06 15:34:16.430 [main] INFO  com.fly.simple.MainRun - PSModulePath -> C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
2024-07-06 15:34:16.430 [main] INFO  com.fly.simple.MainRun - PUBLIC -> C:\Users\Public
2024-07-06 15:34:16.431 [main] INFO  com.fly.simple.MainRun - Path -> C:/Java/eclipse//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.9.v20231028-0858/jre/bin/server;C:/Java/eclipse//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x8
6_64_17.0.9.v20231028-0858/jre/bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\Git\cmd;C:\Program Files\TortoiseGit\bin;C:\Java\apache-maven-3.9.6\bin;C:\Ja
va\jdk1.8.0\bin;C:\Program Files (x86)\NetSarang\Xshell 7\;C:\Program Files (x86)\NetSarang\Xftp 7\;C:\ProgramData\chocolatey\bin;D:\nodejs\;D:\nodejs;D:\nodejs\node_modules;D:\nodejs\node_global;C:\Users\00fly\AppData\Local\Microsoft\WindowsApps;D:\nodejs\node_gl
obal;D:\Programs\Microsoft VS Code\bin;C:\Java\eclipse;
2024-07-06 15:34:16.431 [main] INFO  com.fly.simple.MainRun - ProgramData -> C:\ProgramData
2024-07-06 15:34:16.431 [main] INFO  com.fly.simple.MainRun - ProgramFiles -> C:\Program Files
2024-07-06 15:34:16.432 [main] INFO  com.fly.simple.MainRun - ProgramFiles(x86) -> C:\Program Files (x86)
2024-07-06 15:34:16.433 [main] INFO  com.fly.simple.MainRun - ProgramW6432 -> C:\Program Files
2024-07-06 15:34:16.433 [main] INFO  com.fly.simple.MainRun - SESSIONNAME -> Console
2024-07-06 15:34:16.433 [main] INFO  com.fly.simple.MainRun - SystemDrive -> C:
2024-07-06 15:34:16.433 [main] INFO  com.fly.simple.MainRun - SystemRoot -> C:\Windows
2024-07-06 15:34:16.434 [main] INFO  com.fly.simple.MainRun - TEMP -> C:\Users\00fly\AppData\Local\Temp\1
2024-07-06 15:34:16.434 [main] INFO  com.fly.simple.MainRun - TMP -> C:\Users\00fly\AppData\Local\Temp\1
2024-07-06 15:34:16.434 [main] INFO  com.fly.simple.MainRun - USERDOMAIN -> 7T9LPPYE5CJ7LUD
2024-07-06 15:34:16.435 [main] INFO  com.fly.simple.MainRun - USERDOMAIN_ROAMINGPROFILE -> 7T9LPPYE5CJ7LUD
2024-07-06 15:34:16.435 [main] INFO  com.fly.simple.MainRun - USERNAME -> 00fly
2024-07-06 15:34:16.435 [main] INFO  com.fly.simple.MainRun - USERPROFILE -> C:\Users\00fly
2024-07-06 15:34:16.435 [main] INFO  com.fly.simple.MainRun - classPath -> .;C:\Java\jdk1.8.0\lib
2024-07-06 15:34:16.436 [main] INFO  com.fly.simple.MainRun - java_home -> C:\Java\jdk1.8.0
2024-07-06 15:34:16.436 [main] INFO  com.fly.simple.MainRun - maven_home -> C:\Java\apache-maven-3.9.6
2024-07-06 15:34:16.437 [main] INFO  com.fly.simple.MainRun - windir -> C:\Windows
2024-07-06 15:34:16.440 [main] INFO  com.fly.simple.MainRun - ------------------------------
2024-07-06 15:34:16.526 [pool-2-thread-1] INFO  com.fly.simple.MainRun - jdbc:mysql://127.0.0.1:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&createDatabaseIfNotExist=true
2024-07-06 15:34:16.527 [pool-2-thread-1] INFO  com.fly.simple.MainRun - root
2024-07-06 15:34:16.528 [pool-2-thread-1] INFO  com.fly.simple.MainRun - root123

2. centos 服务器jar运行

2024-07-06 15:37:31.264 [main] INFO  com.fly.simple.MainRun - ------------------------------
2024-07-06 15:37:31.270 [main] INFO  com.fly.simple.MainRun - BASH_FUNC_which%% -> () {  ( alias;eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@"
}
2024-07-06 15:37:31.271 [main] INFO  com.fly.simple.MainRun - DBUS_SESSION_BUS_ADDRESS -> unix:path=/run/user/0/bus
2024-07-06 15:37:31.271 [main] INFO  com.fly.simple.MainRun - HISTCONTROL -> ignoredups
2024-07-06 15:37:31.271 [main] INFO  com.fly.simple.MainRun - HISTSIZE -> 10000
2024-07-06 15:37:31.271 [main] INFO  com.fly.simple.MainRun - HISTTIMEFORMAT -> %F %T root 
2024-07-06 15:37:31.271 [main] INFO  com.fly.simple.MainRun - HOME -> /root
2024-07-06 15:37:31.271 [main] INFO  com.fly.simple.MainRun - HOSTNAME -> 00fly
2024-07-06 15:37:31.272 [main] INFO  com.fly.simple.MainRun - LANG -> en_US.UTF-8
2024-07-06 15:37:31.272 [main] INFO  com.fly.simple.MainRun - LESSOPEN -> ||/usr/bin/lesspipe.sh %s
2024-07-06 15:37:31.272 [main] INFO  com.fly.simple.MainRun - LOGNAME -> root
2024-07-06 15:37:31.272 [main] INFO  com.fly.simple.MainRun - LS_COLORS -> rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36:
2024-07-06 15:37:31.272 [main] INFO  com.fly.simple.MainRun - MAIL -> /var/spool/mail/root
2024-07-06 15:37:31.273 [main] INFO  com.fly.simple.MainRun - OLDPWD -> /work
2024-07-06 15:37:31.273 [main] INFO  com.fly.simple.MainRun - PATH -> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2024-07-06 15:37:31.273 [main] INFO  com.fly.simple.MainRun - PWD -> /000/java-with-docker/target
2024-07-06 15:37:31.273 [main] INFO  com.fly.simple.MainRun - SHELL -> /bin/bash
2024-07-06 15:37:31.273 [main] INFO  com.fly.simple.MainRun - SHLVL -> 1
2024-07-06 15:37:31.273 [main] INFO  com.fly.simple.MainRun - SSH_CLIENT -> 47.123.82.115 51181 22
2024-07-06 15:37:31.273 [main] INFO  com.fly.simple.MainRun - SSH_CONNECTION -> 47.123.82.115 51181 192.168.15.202 22
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - SSH_TTY -> /dev/pts/0
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - TC_LIB_DIR -> /usr/lib64/tc
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - TERM -> xterm
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - USER -> root
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - XDG_RUNTIME_DIR -> /run/user/0
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - XDG_SESSION_ID -> 401
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - _ -> /usr/bin/java
2024-07-06 15:37:31.274 [main] INFO  com.fly.simple.MainRun - which_declare -> declare -f
2024-07-06 15:37:31.275 [main] INFO  com.fly.simple.MainRun - ------------------------------
2024-07-06 15:37:31.312 [pool-2-thread-1] INFO  com.fly.simple.MainRun - jdbc:mysql://127.0.0.1:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&createDatabaseIfNotExist=true
2024-07-06 15:37:31.313 [pool-2-thread-1] INFO  com.fly.simple.MainRun - root
2024-07-06 15:37:31.313 [pool-2-thread-1] INFO  com.fly.simple.MainRun - root123

3. centos 服务器docker运行


[+] Running 1/2⠼ Network docker-jwd_default  Created                                                                                                                                                                                                                                   0.4s ✔ Container java-with-docker  Started                                                                                                                                                                                                                                   0.4s 
2024-07-06 15:38:45.009 [main] INFO  com.fly.simple.MainRun - ------------------------------
2024-07-06 15:38:45.024 [main] INFO  com.fly.simple.MainRun - HOME -> /root
2024-07-06 15:38:45.025 [main] INFO  com.fly.simple.MainRun - HOSTNAME -> 2563205e02bd
2024-07-06 15:38:45.025 [main] INFO  com.fly.simple.MainRun - JAVA_HOME -> /opt/java/openjdk
2024-07-06 15:38:45.025 [main] INFO  com.fly.simple.MainRun - JAVA_TOOL_OPTIONS -> -XX:+IgnoreUnrecognizedVMOptions -XX:+IdleTuningGcOnIdle -Xshareclasses:name=openj9_system_scc,cacheDir=/opt/java/.scc,readonly,nonFatal
2024-07-06 15:38:45.025 [main] INFO  com.fly.simple.MainRun - JAVA_VERSION -> jdk8u312-b07_openj9-0.29.0
2024-07-06 15:38:45.025 [main] INFO  com.fly.simple.MainRun - JDBC_DRIVER -> com.mysql.cj.jdbc.Driver
2024-07-06 15:38:45.025 [main] INFO  com.fly.simple.MainRun - JDBC_PASSWORD -> test123
2024-07-06 15:38:45.026 [main] INFO  com.fly.simple.MainRun - JDBC_URL -> jdbc:mysql://192.168.15.202:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
2024-07-06 15:38:45.026 [main] INFO  com.fly.simple.MainRun - JDBC_USERNAME -> test
2024-07-06 15:38:45.026 [main] INFO  com.fly.simple.MainRun - LANG -> en_US.UTF-8
2024-07-06 15:38:45.026 [main] INFO  com.fly.simple.MainRun - LANGUAGE -> en_US:en
2024-07-06 15:38:45.026 [main] INFO  com.fly.simple.MainRun - LC_ALL -> en_US.UTF-8
2024-07-06 15:38:45.026 [main] INFO  com.fly.simple.MainRun - PATH -> /opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
2024-07-06 15:38:45.027 [main] INFO  com.fly.simple.MainRun - ------------------------------
2024-07-06 15:38:45.116 [pool-2-thread-1] INFO  com.fly.simple.MainRun - jdbc:mysql://192.168.15.202:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
2024-07-06 15:38:45.117 [pool-2-thread-1] INFO  com.fly.simple.MainRun - test
2024-07-06 15:38:45.117 [pool-2-thread-1] INFO  com.fly.simple.MainRun - test123

六、完整代码

https://gitcode.com/00fly/java-with-docker/overview

在这里插入图片描述


有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从文本到安全图像:自动提示优化防止不当内容生成

T2I生成技术已经得到了广泛关注&#xff0c;并见证了如GLIDE、Imagen、DALL-E 2、Stable Diffusion等大型生成模型的发展。尽管这些模型能够根据文本描述生成高质量的图像&#xff0c;促进了书籍插图、品牌标识设计、游戏场景创作等多种实际应用&#xff0c;但它们也被恶意用户…

ROS 2官方文档(基于humble版本)学习笔记(四)

ROS 2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;四&#xff09; 2.客户端库使用colcon构建包&#xff08;package&#xff09;创建工作空间&#xff08;workspace&#xff09;构建工作空间执行测试&#xff08;tests&#xff09;导入环境&#xff08…

如何搜索查找ICLR论文

记录有几个查找顶级会议文章的网址&#xff0c;不止ICLR ICLR 2024 还会有visualization模式&#xff1a; ICLR 2024 virtual 这个网站也很棒 Paper Copilot ICLR 2024 当然还有一个用图表示各论文相关关系的网站&#xff1a; connected papers

入职字节外包2个月后,我离职了...

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

Python应用开发——30天学习Streamlit Python包进行APP的构建(13)

st.chat_input 显示聊天输入窗口小部件。 Function signature[source]st.chat_input(placeholder="Your message", *, key=None, max_chars=None, disabled=False, on_submit=None, args=None, kwargs=None) Returns(str or None) The current (non-empty) value of…

排序——数据结构与算法 总结8

目录 8.1 排序相关概念 8.2 插入排序 8.2.1 直接插入排序&#xff1a; 8.2.2 折半插入排序&#xff1a; 8.2.3 希尔排序&#xff1a; 8.3 交换排序 8.3.1 冒泡排序&#xff1a; 8.3.2 快速排序&#xff1a; 8.4 选择排序 8.4.1 简单选择排序 8.4.2 堆排序 8.5 归并…

Docker:一、安装与卸载、配置阿里云加速器(Ubuntu)

目录 &#x1f341;安装docker&#x1f332;1、环境准备&#x1f332;2、安装docker Engine&#x1f9ca;1、卸载旧版、任何冲突的包&#x1f9ca;2、使用存储库安装&#x1f9ca;3、安装 Docker 包。&#x1f9ca;4、查询是否安装成功&#x1f9ca;5、运行hello-world镜像&…

24西安电子科技大学马克思主义学院—考研录取情况

01、马克思主义学院各个方向 02、24马克思主义学院近三年复试分数线对比 PS&#xff1a;马院24年院线相对于23年院线增加15分&#xff0c;反映了大家对于马克思主义理论学习与研究的热情高涨&#xff0c;也彰显了学院在人才培养、学科建设及学术研究等方面的不断进步与成就。 6…

算法day02 回文 罗马数字转整数

回文 搞错了String类型的indexOf方法&#xff0c;理解成获取对应下标的值&#xff0c;实际上是在找对应值的下标。 4ms 耗时最少的方法尽量不会去调用jdk提供的方法&#xff0c;而是直接使用对应的数学逻辑关系来处理&#xff0c; 甚至用 代替equals方法。 罗马数字转整数 考…

设计模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定义 策略模式&#xff08;Strategy Pattern&#xff09;的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而…

vue3+electron项目搭建,遇到的坑

我主要是写后端,所以对前端的vue啊vue-cli只是知其然,不知其所以然 这样也导致了我在开发前端时候遇到了很多的坑 第一个坑, vue2升级vue3始终升级不成功 第二个坑, vue add electron-builder一直卡进度,进度条走完就是不出提示succes 第一个坑的解决办法: 按照网上说的升级v…

Linux操作系统中逻辑卷的缩减

流程&#xff1a;第一步先是要缩减逻辑卷的文件系统。 第二步就是要去缩减逻辑卷的物理边界。 注意事项&#xff1a; 1.逻辑卷要处于卸载状态&#xff0c; 2.建议先备份数据 3.在缩减逻辑卷的时候&#xff0c;要注意xfs文件系统的逻辑卷是不支持直接进行缩减的。 4.在缩减…

利用级数公式计算圆周率(π)

π是是指圆的周长与直径的比值&#xff0c;是无限不循环小数&#xff0c;有很多种方法可以求得它的近似值。这里用比较容易实现的关于π的无穷级数来求它的前10000位的取值。 π / 2 π 具体的&#xff0c;用两个字符数组x,z分别存放当前计算得到的pi值&#xff0c;数组…

51单片机基础10——串口实验

串口实验 51单片机串口实验1. 软硬件条件2. 串口实验2.1 单片机与PC 发送字符2.1.1 效果2.1.2 代码2.1.3 优化 2.3 串口接收数据(指令控制单片机)2.3.1 非中断方式实现2.3.2 中断方式实现 51单片机串口实验 1. 软硬件条件 单片机型号&#xff1a;STC89C52RC开发环境&#xff…

文件、文本阅读与重定向、路径与理解指令——linux指令学习(一)

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…

带有网站和 PHP 后端的占星咨询应用程序 | 包括聊天、音频视频通话源码

我们的应用程序基于 Astrotalk、Guruji 等热门业务&#xff0c;这些业务已经在市场上取得成功。 我们的应用程序配备了用 Laravel 开发的功能齐全的后端&#xff0c;Laravel 是一种广泛使用的基于 PHP 的 Web 应用程序框架。 总的来说&#xff0c;我们的新占星术应用程序对于…

Midway Serverless 发布 2

可以看看优化后的开发情况&#xff0c;不仅和应用一样&#xff0c;速度还比较快&#xff0c;也不会生成临时目录&#xff0c;修改实时生效。 这是 v2.0 和 v1.0 的根本性变化&#xff0c;也是整体架构升级带来的巨大优势。 当然&#xff0c;这一块并不是功能的新增&#xff0c…

AcWing 1550:完全二叉搜索树

【题目来源】https://www.acwing.com/problem/content/1552/【题目描述】二叉搜索树 (BST) 递归定义为具有以下属性的二叉树&#xff1a; &#xff08;1&#xff09;若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值 &#xff08;2&#xff09;若它的右…

有趣的算法

目录&#xff1a; 1、百钱买百鸡 2、韩信点兵 1&#xff09;概述 2&#xff09;正常取余算法 3&#xff09;循环算法 1、百钱买百鸡 我国古代《算经》中的“百钱买百鸡”问题&#xff1a; 鸡翁一&#xff0c;值钱五&#xff1b;鸡母一&#xff0c;值钱三&#xff1b;鸡…

《梦醒蝶飞:释放Excel函数与公式的力量》9.2 FV函数

9.2 FV函数 FV函数是Excel中用于计算投资或贷款在若干期后的未来值的函数。它是一个非常实用的财务函数&#xff0c;能够帮助我们快速计算投资的最终价值或贷款的期末余额。 9.2.1 函数简介 FV函数用于计算基于定期固定支付和固定利率的投资或贷款的未来值。未来值是指在一定…