一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
想快速搭建一个 WordPress 环境?这篇文章将带你一步步实现:使用 Docker Compose 一键部署 WordPress、MySQL 和 phpMyAdmin,同时支持指定 PHP 版本和自定义 php.ini 配置。 截至 2026 年,WordPress 官方推荐生产环境使用 PHP 8.3 或更高版本,数据库使用 MariaDB 10.11+ 或 MySQL 8.0+。下面的示例面向本地开发和测试环境,生产环境请替换默认密码并使用 HTTPS。 ✅ 功能亮点 🚀 一键启动 WordPress + MySQL + phpMyAdmin 🧩 可选 PHP 版本(通过自定义 Dockerfile) ⚙️ 自定义 php.ini 配置 💾 数据持久化保存到本地目录 🔐 所有配置开箱即用 🧱 项目结构首先,我们建议使用如下目录结构: 12345678project-root/├── docker-compose.yml # 核心 Docker 配置├── php.ini # PHP 自定义设置├──...
AI 网站导航
本文更新时间:2026-07-18。AI 产品迭代很快,下面只保留常用入口,不代表排名;访问权限、价格和模型能力以各官网实时信息为准。 通用对话与搜索 ChatGPT Claude Gemini DeepSeek(深度求索) Qwen(通义千问) Doubao(豆包) Kimi(月之暗面) 腾讯元宝(混元大模型) 知乎直答 DeepSeek 第三方部署与搜索 天翼云息壤 DeepSeek 硅基流动模型广场 秘塔 AI 搜索 纳米 AI 搜索 创作工具 豆包写作 通义 PPT 创作 通义听悟 通义万相文字作画 通义万相视频生成 豆包 AI 编程 开发与本地部署 Ollama(本地部署大模型) 阿里云百炼 硅基流动 API 平台
基于 ROS Timer 延迟处理的消息逻辑优化
在 ROS 开发中,某个话题可能会高频发布消息,而业务逻辑希望“消息持续到来时不触发某个操作,消息停止一段时间后再触发”。这类需求本质上是 debounce(防抖)逻辑。 本文以电笛控制系统为例:话题 /electric_horn 发布 std_msgs::Bool,当电笛消息连续到来时只执行电笛控制;当最后一条消息超过 1 秒没有更新时,再触发 HeartBeat(true)。 不建议每条消息重建线程用 std::thread 在每次回调里启动一个延迟线程,看起来可以实现延迟触发,但容易引入几个问题: 回调里 join() 旧线程可能阻塞 ROS callback,影响消息处理。 lastMessageTime_ 如果由回调线程和延迟线程同时读写,需要互斥保护,否则存在数据竞争。 一个共享的 stopDelayThread_ 标志很容易影响新旧线程的生命周期判断。 ROS 自身已经提供 Timer,更适合这种“延迟一段时间后执行一次”的场景。每次收到新消息时重启一个 one-shot timer;如果 1 秒内又收到消息,timer 会被重新计时;如果 1...
使用 Docker 运行 Node.js:无需依赖系统版本,快速切换、环境隔离
在开发 Node.js 应用时,很多开发者会遇到一个问题:系统中的 Node.js 版本不支持最新功能,或者需要在多个版本之间频繁切换。传统方式需要手动安装和配置,这不仅费时,还容易污染系统环境。借助 Docker,你可以轻松解决这些问题。 截至 2026 年 7 月,Node.js 24 和 Node.js 22 仍处于 LTS 支持周期内,Node.js 20 已结束维护。本文以 Node.js 24 LTS 为主示例,展示如何通过 Docker 实现系统版本无关性、动态版本切换和环境隔离。 为什么使用 Docker 运行 Node.js? 系统版本无关性无需关心操作系统是否支持特定版本的 Node.js,一切都由 Docker 容器管理。 动态版本切换Docker 镜像支持不同版本的 Node.js,切换版本只需更改镜像标签(如 node:22、node:24)。 环境隔离容器中的 Node.js...
Python多进程编程与进程间通信
Python 的多进程编程主要通过 multiprocessing 模块实现。合理使用多进程可以提升 CPU 密集型任务的执行效率,但进程间通信也会带来额外复杂度。本文介绍 Python 多进程编程的基础知识,并重点讨论队列、管道、Manager 共享对象和共享内存等通信方式。 Python 多进程编程基础multiprocessing 模块提供了 Process 类,用于创建新的进程。下面是一个简单的多进程编程例子: 12345678910111213141516171819import multiprocessingimport timedef worker(num): print(f"Worker {num} is working...") time.sleep(2) # 模拟一些工作 print(f"Worker {num} finished")if __name__ == "__main__": # 创建多个进程 processes =...
在 FastAPI 的 @app.on_event("startup") 中启动后台线程
在 FastAPI 项目中,某些任务可能需要在应用启动时运行,并在后台持续执行,如定时清理数据库、监控资源或定时获取数据等。为此,我们可以在 FastAPI 的 @app.on_event("startup") 中启动后台线程,确保应用在启动后立刻开始这些任务。 说明:@app.on_event 已被 FastAPI 标记为弃用。存量项目仍可能见到这种写法,理解它仍有价值;新项目建议优先使用 lifespan,文末给出对应写法。 背景知识FastAPI 是一个支持异步编程的 Python Web 框架,运行在异步事件循环上,能够高效处理 I/O 密集型任务。不过,在应用启动的过程中,有些同步阻塞任务不适合直接运行在主事件循环里。这时,可以使用 Python 标准库的 threading 模块,结合 @app.on_event("startup") 启动线程,以便在后台执行这些任务。 在 startup 中启动后台线程的方式有几种方式可以在 startup 中启动后台线程,以下是几种常见的方法。 1. 使用...
使用 asyncio.run_coroutine_threadsafe 在 Python 中处理异步操作
使用 asyncio.run_coroutine_threadsafe 在 Python 中处理异步操作在现代 Python 开发中,异步编程已经成为一种常见的模式。尤其是在处理 I/O 密集型操作(如网络请求或文件读写)时,异步编程能够显著提高程序的性能。本文将介绍如何使用 asyncio.run_coroutine_threadsafe 方法来在多线程环境中安全地调度异步操作。 什么是 asyncio.run_coroutine_threadsafe?asyncio.run_coroutine_threadsafe 是 asyncio 库中的一个实用函数,它允许在与事件循环不在同一线程的情况下安全地调度异步协程。这对于在多线程程序中使用异步操作非常重要,因为直接从非事件循环线程调用协程会导致错误。 使用场景想象一个场景:主线程运行同步框架或 ROS 节点,另一个后台线程维护 asyncio 事件循环。同步线程收到请求后,希望把一个协程提交到该事件循环中执行。这里就是 asyncio.run_coroutine_threadsafe...
使用GeographicLib在C++中进行地理坐标转换
使用GeographicLib在C++中进行地理坐标转换在现代软件开发中,经常需要处理地理坐标转换问题,例如将经纬度转换为局部直角坐标系。GeographicLib是一个强大的开源库,提供了便捷的工具来进行这些转换。本文将介绍如何在C++项目中使用GeographicLib进行地理坐标转换的步骤和示例代码。 步骤一:安装GeographicLib首先,确保你的系统中已安装GeographicLib库。可以通过以下命令在Ubuntu中安装: 12sudo apt-get install geographiclib-* # 安装GeographicLib的库sudo apt-get install libgeographic-* # 安装GeographicLib的依赖库 步骤二:配置C++项目在你的C++项目中,需要配置CMake以及链接GeographicLib库。CMakeLists.txt 123456789101112131415cmake_minimum_required(VERSION 3.5)set(CMAKE_CXX_STANDARD 11)#...
理解矩阵内积与矩阵乘法的区别及其应用
在数据科学、机器学习、计算机图形学和图像处理等领域,矩阵运算是非常基础且重要的操作。然而,矩阵内积和矩阵乘法这两种看似相似的操作却有着不同的计算方式和应用场景。本文将详细解释它们的区别及各自的用途。 矩阵内积(逐元素乘积)矩阵内积,或逐元素乘积,是指两个相同尺寸的矩阵对应位置元素的逐一相乘。这种运算在 numpy 中可以使用 * 运算符或者 np.multiply 函数来实现。 例如,给定两个矩阵 A 和 B:$$A = \begin{bmatrix} 1 & 2 \ 3 & 4 \end{bmatrix}B = \begin{bmatrix} 5 & 6 \ 7 & 8 \end{bmatrix}$$ 它们的逐元素乘积为:$$A * B = \begin{bmatrix} 1 \cdot 5 & 2 \cdot 6 \ 3 \cdot 7 & 4 \cdot 8 \end{bmatrix} = \begin{bmatrix} 5 & 12 \ 21 & 32...
跨机器 ROS 服务调用:使用共享 srv 包实现分布式服务端和客户端
跨机器调用 ROS 服务时,服务端和客户端可以放在不同 package,甚至不同机器上运行;但 .srv 类型定义应来自同一个共享接口包。不要在服务端包和客户端包里各自复制一份同名 .srv,否则后续字段变更、生成代码和类型一致性都很难维护。 下面示例拆成三个包: robot_interfaces:只定义 AddTwoInts.srv robot_server_package:服务端节点 robot_client_package:客户端节点 一、创建共享 srv 包123cd ~/catkin_ws/srccatkin_create_pkg robot_interfaces message_generationmkdir -p robot_interfaces/srv 创建 robot_interfaces/srv/AddTwoInts.srv: 1234int64 aint64 b---int64 sum robot_interfaces/CMakeLists.txt 关键配置: 1234567891011121314find_package(catkin...




