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

Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题

Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题

背景

在使用 Dify 框架进行开发时,遇到了两个主要的技术挑战:

  1. 代码节点连接到 PGSQL(PostgreSQL)数据库
  2. 解决沙盒环境中由于系统调用限制导致的“operation not permitted”错误

本文档将详细描述如何解决这两个问题,并介绍 psycopg2-binary Python 依赖的作用及其配置方法。同时,我们将强调配置文件修改后正确重启服务的重要性。

技术解决方案

PGSQL 数据库连接

为了使基于 Python 的 Dify 应用能够与 PostgreSQL 数据库通信,我们在 volumessandboxdependenciespython-requirements.txt 文件中添加了 psycopg2-binary==2.9.10 依赖。该库提供了一个 PostgreSQL 数据库适配器,它包含了预编译的二进制文件,简化了安装过程,避免了需要单独编译 C 扩展的问题。

# volumes/sandbox/dependencies/python-requirements.txt
psycopg2-binary==2.9.10

当 Docker Compose 构建服务时,它会读取此文件并安装列出的所有 Python 包,包括 psycopg2-binary,从而为应用程序提供与 PGSQL 数据库交互的能力。安装完成后,通过代码节点配置应用中的数据库连接参数(如主机、端口、用户名、密码等),实现了代码节点与 PGSQL 数据库的成功连接。

Sandbox 中的 Linux 系统调用权限问题

在尝试运行代码节点时,遇到了如下错误信息:

error: operation not permitted

此错误表明应用程序尝试执行的操作被操作系统或沙盒环境所禁止。经分析,确定这是由于沙盒环境中对特定 Linux 系统调用的访问权限不足造成的。

为了解决这个问题,采取了以下步骤:

  • 调整沙盒策略:在 volumessandboxconfconfig.yaml 文件中扩展了 allowed_syscalls 列表,以允许必要的系统调用。这确保了沙盒内的应用程序可以执行所需的底层操作系统功能,而不会遇到权限错误。

下面是一个简化的 config.yaml 配置示例,其中列出了部分关键系统调用编号,表示这些操作是被允许的:

allowed_syscalls:# 基础文件操作- 0   # read - 从文件描述符读取数据- 1   # write - 向文件描述符写入数据- 2   # open - 打开文件- 3   # close - 关闭文件描述符- 4   # stat - 获取文件状态- 5   # fstat - 获取文件描述符状态- 6   # lstat - 获取符号链接状态- 7   # poll - 等待文件描述符上的事件- 8   # lseek - 重新定位读/写文件偏移量- 9   # mmap - 将文件或设备映射到内存- 10  # mprotect - 设置内存区域的保护- 11  # munmap - 取消内存映射- 12  # brk - 改变数据段大小# 系统操作- 13  # rt_sigaction - 检查或修改信号处理- 14  # rt_sigprocmask - 检查或修改阻塞信号- 15  # rt_sigreturn - 从信号处理程序返回- 16  # ioctl - 控制设备- 17  # pread64 - 从指定偏移量读取- 18  # pwrite64 - 向指定偏移量写入- 19  # readv - 从文件描述符读取数据到多个缓冲区- 20  # writev - 从多个缓冲区写入数据到文件描述符- 21  # access - 检查文件访问权限- 22  # pipe - 创建管道- 23  # select - 同步 I/O 多路复用- 24  # sched_yield - 让出处理器- 25  # mremap - 重新映射虚拟内存地址# 高级内存管理- 26  # msync - 同步内存与物理存储- 27  # mincore - 确定内存页是否驻留在内存中- 28  # madvise - 给出内存使用建议- 29  # shmget - 获取共享内存段- 30  # shmat - 附加共享内存段- 31  # shmctl - 共享内存控制- 32  # dup - 复制文件描述符- 33  # dup2 - 复制文件描述符到指定编号- 34  # pause - 挂起进程直到收到信号# 进程管理- 35  # nanosleep - 高精度睡眠- 36  # getitimer - 获取定时器值- 37  # alarm - 设置定时器- 38  # setitimer - 设置定时器- 39  # getpid - 获取进程ID- 40  # sendfile - 在文件描述符之间传输数据# 网络操作- 41  # socket - 创建套接字- 42  # connect - 初始化套接字连接- 43  # accept - 接受套接字连接- 44  # sendto - 通过套接字发送消息- 45  # recvfrom - 从套接字接收消息- 46  # sendmsg - 通过套接字发送消息- 47  # recvmsg - 通过套接字接收消息- 48  # shutdown - 关闭套接字连接- 49  # bind - 绑定套接字到地址- 50  # listen - 监听套接字连接# 进程间通信- 51  # getsockname - 获取套接字本地地址- 52  # getpeername - 获取套接字对端地址- 53  # socketpair - 创建一对已连接的套接字- 54  # setsockopt - 设置套接字选项- 55  # getsockopt - 获取套接字选项# 进程控制- 56  # clone - 创建子进程- 57  # fork - 创建进程- 58  # vfork - 创建进程并阻塞父进程- 59  # execve - 执行程序- 60  # exit - 终止进程- 61  # wait4 - 等待进程改变状态- 62  # kill - 发送信号# 信号处理- 63  # uname - 获取系统信息- 64  # semget - 获取信号量集- 65  # semop - 信号量操作- 66  # semctl - 信号量控制- 67  # shmdt - 分离共享内存段- 68  # msgget - 获取消息队列- 69  # msgsnd - 发送消息到队列- 70  # msgrcv - 从队列接收消息- 71  # msgctl - 消息队列控制# 文件系统操作- 72  # fcntl - 文件描述符控制- 73  # flock - 应用或删除文件锁- 74  # fsync - 同步文件到存储设备- 75  # fdatasync - 同步文件数据- 76  # truncate - 截断文件- 77  # ftruncate - 截断文件描述符指向的文件- 78  # getdents - 获取目录项- 79  # getcwd - 获取当前工作目录- 80  # chdir - 改变当前工作目录# 文件系统管理- 81  # fchdir - 通过文件描述符改变当前工作目录- 82  # rename - 重命名文件- 83  # mkdir - 创建目录- 84  # rmdir - 删除目录- 85  # creat - 创建新文件- 86  # link - 创建硬链接- 87  # unlink - 删除文件名- 88  # symlink - 创建符号链接- 89  # readlink - 读取符号链接的值- 90  # chmod - 改变文件权限# 权限和所有权- 91  # fchmod - 改变文件描述符的权限- 92  # chown - 改变文件所有者和组- 93  # fchown - 改变文件描述符指向文件的所有者和组- 94  # lchown - 改变符号链接的所有者和组- 95  # umask - 设置文件模式创建掩码# 系统信息和统计- 96  # gettimeofday - 获取时间和日期- 97  # getrlimit - 获取资源限制- 98  # getrusage - 获取资源使用情况- 99  # sysinfo - 获取系统统计信息- 100 # times - 获取进程时间# 系统控制- 101 # ptrace - 进程跟踪- 102 # getuid - 获取用户ID- 103 # syslog - 读取或清除内核消息- 104 # getgid - 获取组ID- 105 # setuid - 设置用户ID- 106 # setgid - 设置组ID# 用户和组管理- 107 # geteuid - 获取有效用户ID- 108 # getegid - 获取有效组ID- 109 # setpgid - 设置进程组- 110 # getppid - 获取父进程ID- 111 # getpgrp - 获取进程组ID# 会话管理- 112 # setsid - 创建会话并设置进程组ID- 113 # setreuid - 设置实际和有效用户ID- 114 # setregid - 设置实际和有效组ID- 115 # getgroups - 获取附加组ID- 116 # setgroups - 设置附加组ID# 系统资源管理- 117 # setresuid - 设置实际、有效和保存的用户ID- 118 # getresuid - 获取实际、有效和保存的用户ID- 119 # setresgid - 设置实际、有效和保存的组ID- 120 # getresgid - 获取实际、有效和保存的组ID# 系统时间管理- 121 # getpgid - 获取进程组ID- 122 # setfsuid - 设置文件系统用户ID- 123 # setfsgid - 设置文件系统组ID- 124 # getsid - 获取会话ID- 125 # capget - 获取进程权能- 126 # capset - 设置进程权能# 实时调度- 127 # rt_sigpending - 检查待处理信号- 128 # rt_sigtimedwait - 同步等待信号- 129 # rt_sigqueueinfo - 排队一个信号和数据- 130 # rt_sigsuspend - 等待信号# 高级进程管理- 131 # sigaltstack - 设置和获取信号栈上下文- 132 # utime - 改变文件的访问和修改时间- 133 # mknod - 创建特殊文件- 134 # uselib - 加载共享库- 135 # personality - 设置进程执行域# 系统调用- 136 # ustat - 获取文件系统统计信息- 137 # statfs - 获取文件系统信息- 138 # fstatfs - 获取文件系统信息- 139 # sysfs - 获取文件系统类型信息- 140 # getpriority - 获取程序调度优先级# 进程优先级- 141 # setpriority - 设置程序调度优先级- 142 # sched_setparam - 设置调度参数- 143 # sched_getparam - 获取调度参数- 144 # sched_setscheduler - 设置调度策略和参数- 145 # sched_getscheduler - 获取调度策略# 调度策略- 146 # sched_get_priority_max - 获取静态优先级上限- 147 # sched_get_priority_min - 获取静态优先级下限- 148 # sched_rr_get_interval - 获取时间片- 149 # mlock - 锁定内存页- 150 # munlock - 解锁内存页# 内存锁定- 151 # mlockall - 锁定进程的地址空间- 152 # munlockall - 解锁进程的地址空间- 153 # vhangup - 虚拟挂起终端- 154 # modify_ldt - 读取或写入本地描述符表- 155 # pivot_root - 改变根文件系统# 系统引导- 156 # _sysctl - 读取/写入系统参数- 157 # prctl - 操作进程或线程- 158 # arch_prctl - 设置架构特定的线程状态- 159 # adjtimex - 调整系统时钟# 文件系统控制- 161 # chroot - 改变根目录- 162 # sync - 同步文件系统缓冲区- 163 # acct - 切换进程记账- 164 # settimeofday - 设置时间和日期- 165 # mount - 挂载文件系统# 系统维护- 166 # umount2 - 卸载文件系统- 167 # swapon - 开启交换设备和文件- 168 # swapoff - 关闭交换设备和文件- 169 # reboot - 重新启动系统- 170 # sethostname - 设置系统主机名# 网络配置- 171 # setdomainname - 设置系统域名- 172 # iopl - 改变I/O权限级别- 173 # ioperm - 设置端口I/O权限- 174 # create_module - 创建可加载的模块项- 175 # init_module - 初始化内核模块# 内核模块- 176 # delete_module - 删除内核模块- 177 # get_kernel_syms - 检索导出的内核符号- 178 # query_module - 查询内核模块信息- 179 # quotactl - 操作文件系统配额- 180 # nfsservctl - NFS服务器控制# 系统信息查询- 181 # getpmsg - 接收控制消息- 182 # putpmsg - 发送控制消息- 183 # afs_syscall - 未实现的系统调用- 184 # tuxcall - 未实现的系统调用- 185 # security - 未实现的系统调用# 新增系统调用- 186 # gettid - 获取线程标识符- 187 # readahead - 预读文件到页面缓存- 188 # setxattr - 设置扩展属性- 189 # lsetxattr - 设置符号链接的扩展属性- 190 # fsetxattr - 设置文件描述符的扩展属性# 扩展属性操作- 191 # getxattr - 获取扩展属性- 192 # lgetxattr - 获取符号链接的扩展属性- 193 # fgetxattr - 获取文件描述符的扩展属性- 194 # listxattr - 列出扩展属性- 195 # llistxattr - 列出符号链接的扩展属性# 高级文件系统特性- 196 # flistxattr - 列出文件描述符的扩展属性- 197 # removexattr - 删除扩展属性- 198 # lremovexattr - 删除符号链接的扩展属性- 199 # fremovexattr - 删除文件描述符的扩展属性- 200 # tkill - 发送信号到线程# 时间管理- 201 # time - 获取时间- 202 # futex - 快速用户空间锁定- 203 # sched_setaffinity - 设置进程的CPU亲和性掩码- 204 # sched_getaffinity - 获取进程的CPU亲和性掩码- 205 # set_thread_area - 设置线程本地存储# 进程/线程控制- 206 # io_setup - 创建异步I/O上下文- 207 # io_destroy - 销毁异步I/O上下文- 208 # io_getevents - 从完成队列读取异步I/O事件- 209 # io_submit - 提交异步I/O块- 210 # io_cancel - 取消异步I/O操作# 异步I/O- 211 # get_thread_area - 获取线程本地存储- 212 # lookup_dcookie - 获取目录cookie的路径- 213 # epoll_create - 创建epoll实例- 214 # epoll_ctl_old - 旧的epoll控制接口- 215 # epoll_wait_old - 旧的epoll等待接口# 事件通知- 216 # remap_file_pages - 创建非线性文件映射- 217 # getdents64 - 获取目录项(64位版本)- 218 # set_tid_address - 设置清除子线程ID的地址- 219 # restart_syscall - 重启被中断的系统调用- 220 # semtimedop - 带超时的信号量操作# 定时器和时钟- 221 # fadvise64 - 预声明访问模式- 222 # timer_create - 创建POSIX定时器- 223 # timer_settime - 设置定时器的时间- 224 # timer_gettime - 获取定时器的时间- 225 # timer_getoverrun - 获取定时器超限次数# POSIX定时器- 226 # timer_delete - 删除POSIX定时器- 227 # clock_settime - 设置指定时钟的时间- 228 # clock_gettime - 获取指定时钟的时间- 229 # clock_getres - 获取时钟精度- 230 # clock_nanosleep - 高精度睡眠# 进程终止- 231 # exit_group - 终止所有线程- 232 # epoll_wait - 等待epoll事件- 233 # epoll_ctl - 控制epoll实例- 234 # tgkill - 发送信号到线程- 235 # utimes - 更改文件访问和修改时间# 虚拟内存操作- 236 # vserver - Linux-VServer操作- 237 # mbind - 设置内存策略- 238 # set_mempolicy - 设置NUMA内存策略- 239 # get_mempolicy - 检索NUMA内存策略- 240 # mq_open - 打开消息队列# POSIX消息队列- 241 # mq_unlink - 删除消息队列- 242 # mq_timedsend - 发送消息到队列- 243 # mq_timedreceive - 从队列接收消息- 244 # mq_notify - 注册消息队列通知- 245 # mq_getsetattr - 获取/设置消息队列属性# 密钥管理- 246 # kexec_load - 加载新内核- 247 # waitid - 等待进程状态改变- 248 # add_key - 添加密钥到内核密钥管理系统- 249 # request_key - 请求操作密钥- 250 # keyctl - 密钥管理控制# 输入输出多路复用- 251 # ioprio_set - 设置I/O调度优先级- 252 # ioprio_get - 获取I/O调度优先级- 253 # inotify_init - 初始化inotify实例- 254 # inotify_add_watch - 添加inotify监视- 255 # inotify_rm_watch - 删除inotify监视# 文件系统监控- 256 # migrate_pages - 在NUMA系统中迁移进程页- 257 # openat - 相对路径打开文件- 258 # mkdirat - 相对路径创建目录- 259 # mknodat - 相对路径创建特殊文件- 260 # fchownat - 相对路径改变所有权# 相对路径操作- 261 # futimesat - 相对路径更改时间戳- 262 # newfstatat - 相对路径获取文件状态- 263 # unlinkat - 相对路径删除文件- 264 # renameat - 相对路径重命名- 265 # linkat - 相对路径创建硬链接# 符号链接操作- 266 # symlinkat - 相对路径创建符号链接- 267 # readlinkat - 相对路径读取符号链接- 268 # fchmodat - 相对路径改变权限- 269 # faccessat - 相对路径检查访问权限- 270 # pselect6 - 改进的select系统调用# 高级I/O操作- 271 # ppoll - 改进的poll系统调用- 272 # unshare - 解除共享命名空间- 273 # set_robust_list - 设置健壮的futex列表- 274 # get_robust_list - 获取健壮的futex列表- 275 # splice - 在文件描述符之间移动数据# 零拷贝操作- 276 # tee - 复制管道数据- 277 # sync_file_range - 同步文件段- 278 # vmsplice - 在进程和内核之间传输数据- 279 # move_pages - 在NUMA系统中移动页面- 280 # utimensat - 相对路径更改文件时间戳# 事件通知- 281 # epoll_pwait - 等待epoll事件,可中断- 282 # signalfd - 创建信号接收文件描述符- 283 # timerfd_create - 创建定时器文件描述符- 284 # eventfd - 创建事件通知文件描述符- 285 # fallocate - 预分配文件空间# 定时器操作- 286 # timerfd_settime - 设置定时器文件描述符- 287 # timerfd_gettime - 读取定时器文件描述符- 288 # accept4 - 接受带标志的连接- 289 # signalfd4 - 改进的signalfd- 290 # eventfd2 - 改进的eventfd# 文件系统操作- 291 # epoll_create1 - 改进的epoll_create- 292 # dup3 - 改进的dup2- 293 # pipe2 - 改进的pipe- 294 # inotify_init1 - 改进的inotify_init- 295 # preadv - 向量化的pread# 向量I/O操作- 296 # pwritev - 向量化的pwrite- 297 # rt_tgsigqueueinfo - 排队实时信号到线程组- 298 # perf_event_open - 性能监控- 299 # recvmmsg - 接收多个消息- 300 # fanotify_init - 初始化fanotify# 文件系统通知- 301 # fanotify_mark - 管理fanotify标记- 302 # prlimit64 - 获取/设置资源限制- 303 # name_to_handle_at - 文件句柄操作- 304 # open_by_handle_at - 通过文件句柄打开- 305 # clock_adjtime - 调整系统时钟# 同步操作- 306 # syncfs - 同步文件系统- 307 # sendmmsg - 发送多个消息- 308 # setns - 设置命名空间- 309 # getcpu - 获取CPU和NUMA节点- 310 # process_vm_readv - 进程间读取数据# 进程间通信- 311 # process_vm_writev - 进程间写入数据- 312 # kcmp - 内核比较两个进程- 313 # finit_module - 从文件描述符加载内核模块- 314 # sched_setattr - 设置调度属性- 315 # sched_getattr - 获取调度属性# 安全计算- 316 # renameat2 - 扩展的重命名操作- 317 # seccomp - 设置安全计算模式- 318 # getrandom - 获取随机数- 319 # memfd_create - 创建匿名文件- 320 # kexec_file_load - 从文件加载新内核# 命名空间操作- 321 # bpf - 扩展的BPF系统调用- 322 # execveat - 相对路径执行程序- 323 # userfaultfd - 用户页错误处理- 324 # membarrier - 发出内存屏障- 325 # mlock2 - 改进的内存锁定# 套接字操作- 326 # copy_file_range - 复制文件范围- 327 # preadv2 - 带标志的向量化pread- 328 # pwritev2 - 带标志的向量化pwrite- 329 # pkey_mprotect - 设置内存保护键- 330 # pkey_alloc - 分配内存保护键# 内存保护- 331 # pkey_free - 释放内存保护键- 332 # statx - 扩展的文件状态- 333 # io_pgetevents - 获取异步I/O事件- 334 # rseq - 重启序列- 335 # pidfd_send_signal - 通过文件描述符发送信号
  • 验证更改:在实施上述更改后,重新测试应用程序,确认错误已解决且应用程序可以正常工作,同时确保没有引入额外的安全风险。
修改 docker-compose.yaml 以挂载本地配置文件

默认情况下,Dify 可能不会自动挂载本地配置文件到容器中。为了确保我们的自定义配置文件(如 config.yaml)能够在容器内生效,我们需要修改 docker/docker-compose.yaml 文件,添加卷挂载选项,以便将本地配置目录挂载到容器内的相应位置。

docker/docker-compose.yaml 文件中找到 sandbox 服务的部分,并添加以下行来挂载本地配置文件:

yaml深色版本

services:sandbox:# 其他配置...volumes:- ./volumes/sandbox/conf:/conf  # 添加这一行以挂载本地配置文件- ./volumes/sandbox/dependencies:/dependencies  # 如果有其他依赖项也需要挂载# 其他配置...

这样做的好处是可以直接在本地编辑配置文件,而不需要每次都进入容器内部进行修改,提高了开发和调试效率。

结果

通过上述措施,成功解决了应用程序连接 PGSQL 数据库的问题,并克服了沙盒环境下系统调用权限不足的障碍。最终,代码节点能够在保留安全性的同时正确地与外部资源交互。

注意事项

配置文件修改完成后,确保正确重启 Dify 服务以应用更改非常重要。为了保证新的配置生效,必须使用 docker compose stopdocker compose up -d 命令来重启 Dify。这是因为这些命令会确保 Docker Compose 重新读取并应用最新的配置文件更改。

正确的重启步骤
  1. 停止当前运行的服务:使用 docker compose stop 命令来停止所有由 Docker Compose 启动的服务。这一步确保所有容器都停止运行,以便可以重新创建和启动它们。

    docker compose stop
    
  2. 重新启动服务:使用 docker compose up -d 命令来后台启动服务。这个命令会根据最新的 docker-compose.yml 文件以及其他关联的配置文件(如 python-requirements.txtconfig.yaml)重新创建和启动容器。

    docker compose up -d
    
不推荐的重启方法
  • 通过可视化工具(如 Podman 的界面)来重启:这种方式可能不会触发 Docker Compose 重新加载配置文件,因此可能导致新配置不被应用。此外,不同工具的实现细节可能会有所不同,不能保证它们会按照预期处理配置更新。
确认配置更新

在完成上述重启步骤后,建议检查日志输出或直接测试应用程序的功能,以确认新的配置已经成功应用。可以通过以下命令查看服务的日志:

docker compose logs -f

这样可以实时监控服务启动过程中的输出,并验证是否遇到任何问题。

相关文章:

Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题

Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题 背景 在使用 Dify 框架进行开发时,遇到了两个主要的技术挑战: 代码节点连接到 PGSQL(PostgreSQL)数据库。解决沙盒环境中由于系统调用限制导致的“oper…...

ModuleJS 与 CommonJS 混用的两种解决方案

目录 方案一 方案二 统一使用 ModuleJS 统一使用CommonJS 方案一 使用构建工具,webpack、vite等系列构建工具。这些构建工具底层则会将两种不同的系统模块语言转为同一种语言,然后代码也能正常执行。 方案二 如果你可以修改文件的文件后缀&#xf…...

代码随想录--977有序数组的平方

977 有序数组的平方 题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释&…...

Win11下搭建Kafka环境

目录 一、环境准备 二、安装JDK 1、下载JDK 2、配置环境变量 3、验证 三、安装zookeeper 1、下载Zookeeper安装包 2、配置环境变量 3、修改配置文件zoo.cfg 4、启动Zookeeper服务 4.1 启动Zookeeper客户端验证 4.2 启动客户端 四、安装Kafka 1、下载Kafka安装包…...

MacBook Pro M2安装deepseek

序 本文主要展示一下如何在MacBook Pro M2安装deepseek mac配置 芯片Apple M2,8核(物理),内存16G,os版本Ventura,磁盘500G 步骤 下载ollama 去https://ollama.com/下载mac版本 或者使用go来编译 git clone --depth 1 http…...

springboot的http请求不通原因

Spring Boot 应用中 HTTP 请求不通可能由多种原因引起,以下是一些常见问题及解决方法: 1. 端口冲突 问题:应用端口被占用。 解决:检查端口占用情况,修改 application.properties 或 application.yml 中的端口配置。 …...

【Windows】PowerShell 缓存区大小调节

PowerShell 缓存区大小调节 方式1 打开powershell 窗口属性调节方式2,修改 PowerShell 配置文件 方式1 打开powershell 窗口属性调节 打开 CMD(按 Win R,输入 cmd)。右键标题栏 → 选择 属性(Properties)…...

使用python脚本批量删除redis缓存

首先,安装 redis-py 库: pip install redis 其次,创建一个 Python 脚本来连接到 Redis 并删除匹配的键。假设 Redis 端口是 6379,密码是 mypassword(如果有密码的话)。 import redis# 连接到 Redis r r…...

Python截图轻量化工具

一、兼容局限性 这是用Python做的截图工具,不过由于使用了ctypes调用了Windows的API, 同时访问了Windows中"C:/Windows/Cursors/"中的.cur光标样式文件, 这个工具只适用于Windows环境; 如果要提升其跨平台性的话,需要考虑替换cty…...

Android图片加载框架Coil,Kotlin

Android图片加载框架Coil,Kotlin implementation("io.coil-kt:coil:1.4.0") import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import coil.Coil i…...

重生之我要当云原生大师(十四)分析和存储日志

目录 一、简述常用的日志文件所存储的消息类型。 二、syslog的优先级? 三、维护准确时间的意义? 一、简述常用的日志文件所存储的消息类型。 1. 系统日志文件 /var/log/messages 消息类型:通用的系统日志文件,记录系统启动、…...

C++基础知识学习记录—补充

1、C新增的赋值语法 #include <iostream>using namespace std;int main() {//C新的赋值语法//1、传统的赋值语法int a,b;a100;b99;//C新的赋值语法int c(2);//相当于给c赋值2int d(c);//相当于把c的值赋值给dcout << "c" << c << endl;co…...

Linux常用命令——磁盘管理类

文章目录 du 查看文件和目录占用的磁盘空间df 查看磁盘空间使用情况free 显示内存占用情况lsblk 查看设备挂载情况mount/umount 挂载/卸载fdisk 分区Linux分区分区操作按键说明挂载硬盘操作 du 查看文件和目录占用的磁盘空间 ls-lh是查看文件大小du: disk usage 磁盘占用情况d…...

【AI学习】DeepSeek为什么强?

个人的一些思考&#xff0c;请大家批评指正。 这个问题&#xff0c;首先当然是在恰当的时间出现&#xff0c;模型性能跻身世界一流&#xff0c;又开源&#xff0c;戳破了OpenAI和英伟达潜心构造的叙事逻辑。 DeepSeek为什么强&#xff1f;四个方面&#xff1a;模型的智能水平…...

【快应用】原生广告下载状态监听案例

问题背景&#xff1a; 快应用中下载类原生广告监听下载状态变化接口调用没生效&#xff0c;在上报点击接口里触发下载监听后仅第一次返回状态&#xff0c;之后就不返回了&#xff0c;该如何处理&#xff1f; 问题分析&#xff1a; 快应用在1100版本新增了一个ad-button组件&a…...

C++语言的软件工程

C语言的软件工程 引言 在当今快速发展的技术领域&#xff0c;软件工程作为一门综合性的学科&#xff0c;越来越受到重视。而C语言&#xff0c;作为一种功能强大且具有广泛应用的编程语言&#xff0c;在软件工程中占据着重要的地位。本文将探讨C语言在软件工程中的应用与特点&…...

计算机网络结课设计:通过思科Cisco进行中小型校园网搭建

上学期计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网&#xff0c;当时花了几天时间查阅相关博客总算是做出来了&#xff0c;在验收后一直没管&#xff0c;在寒假想起来了简单分享一下&#xff0c;希望可以给有需求的小伙伴一些帮助 目录 一、设计要求 二、…...

无人机避障——基于ESDF地图的JPS算法前端路径规划

原来是用栅格地图的方式&#xff0c;0表示可通行区域&#xff0c;1表示不可通行区域&#xff0c;然后采用JPS算法做路径规划&#xff0c;从起点到终点规划出一条路径。但是目前我需要做的是将栅格地图更换为ESDF地图&#xff0c;那么JPS算法计算代价的部分是否需要进行变化。 …...

【MQ】RabbitMQ 高可用延时功能的探究

延迟消息如果使用延时交换机来实现&#xff0c;如果数据量过大&#xff0c;就会很占 CPU 资源&#xff0c;轻则时间误差大&#xff0c;重则 RabbitMQ 宕机 一、针对一个 RabbitMQ 节点 &#xff08;1&#xff09;利用队列 ttl&#xff0c;将延迟消息根据 delay 的时间进行分级…...

Maven入门核心知识点总结

Maven 1. POM&#xff08;Project Object Model&#xff09;2. 坐标&#xff08;Coordinates&#xff09;3. 依赖管理&#xff08;Dependency Management&#xff09;4. 常用五个生命周期&#xff08;Life Circle&#xff09;5. Maven 仓库&#xff08;Maven Repository&#x…...

【力扣】138.随机链表的复制

AC截图 题目 代码 使用哈希存储<旧节点&#xff0c;新结点> /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { public:Node* copyRandomList(Node* hea…...

编程语言的深度剖析:从语法到性能优化

引言 随着软件开发的不断进化&#xff0c;编程语言的选择对项目的成功与否具有关键影响。今天的开发者面临着丰富多样的编程语言选择&#xff1a;每一种语言都有独特的优势、特性和适用场景。然而&#xff0c;语言的设计理念、运行机制和优化技巧背后的技术细节却常常被忽视。本…...

台湾精锐APEX减速机在半导体制造设备中的应用案例

半导体制造设备对传动系统的精度、可靠性和稳定性要求极高&#xff0c;台湾精锐APEX减速机凭借其低背隙、高精度和高刚性等优势&#xff0c;在半导体制造设备中得到了广泛应用。 案例一&#xff1a;晶圆切割设备 1.应用场景 在晶圆切割过程中&#xff0c;设备需要高精度的运…...

Rocketmq 和 Rabbitmq ,在多消费者的情况下,可以实现顺序消费吗

在多消费者的情况下&#xff0c;RocketMQ 和 RabbitMQ 都可以实现顺序消费&#xff0c;但它们的实现机制和适用场景有所不同。以下是对两者的详细分析和对比&#xff1a; 1. RocketMQ 的顺序消费 1.1 实现机制 顺序消息&#xff1a;RocketMQ 支持顺序消息&#xff08;Orderly …...

Springboot原理(面试高频)

目录 一、 配置优先级 ​编辑 二、Bean管理 ​​​​​​​2.1&#xff1a;获取Bean ​编辑 ​​​​​​​2.2&#xff1a;Bean作用域 ​​​​​​​​​​​​​​2.3&#xff1a;第三方Bean 三、Springboot底层原理 3.1&#xff1a;起步依赖 3.1.1&#xff1a;ma…...

2024 Rust现代实用教程:1.1Rust简介与安装更新

文章目录 一、Rust安装二、更新Rust三、Rust的Stable与Nightly版本四、卸载ubuntu安装的cargo和rustup五、rust源设置六、rust交叉编译工具链说明 rustup稳定版交叉编译步骤 步骤 1&#xff1a;安装目标组件步骤 2&#xff1a;安装交叉编译工具链步骤 3&#xff1a;配置环境变…...

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) &#xff1a;将xxx.pt模型转化成 xxx.onnx ONNX&#xff08;Ope…...

提示工程:少样本提示(Few-shot Prompting)

少样本提示&#xff08;Few-shot Prompting&#xff09;是一种利用大语言模型从少量示例样本中学习并处理任务的方法。它的核心思想是利用大语言模型的上下文学习能力&#xff0c;通过在提示中增加“示例样本”来启发大语言模型达到举一反三的效果。这种方法避免了重新训练或者…...

方舟字节码原理剖析:架构、特性与实践应用

方舟字节码原理剖析&#xff1a;架构、特性与实践应用 一、引言 在当今软件行业高速发展的大背景下&#xff0c;应用程序的性能、开发效率以及跨平台兼容性成为了开发者们关注的核心要素。编译器作为软件开发流程中的关键工具&#xff0c;其性能和特性直接影响着软件的质量和…...

深入Linux系列之环境变量

深入Linux系列之环境变量 那么在之前的内容中&#xff0c;我们已经介绍了我们Linux进程的一些关键属性&#xff0c;例如进程编号以及进程状态和进程优先级&#xff0c;那么本篇文章接介绍Linux的环境变量这一知识点&#xff0c;那么废话不多说&#xff0c;我们进入环境变量的讲…...