分类: 开发
Docker安装的Mysql数据库定时备份脚本
功能说明: 使用 docker exec 调用 mysqldump,生成 .sql 备份文件; 文件名中包含当前时间,保存在 mysql_backup/ 目录; 自动清理: 删除 超过 7 天的备份文件; 保留每月 1 号的备份文件,不管时间多久。 脚本 mysql_backup.sh #!/bin/bash # ========== 配置 ========== CONTAINER_NAME="mysql" MYSQL_USER="dbuser" MYSQL_PASSWORD="dbpassword" BACKUP_DIR="/home/ubuntu/mysql_backup" # ========== 创建备份目录 ========== mkdir -p "$BACKUP_DIR" # ========== 生成备份文件名 ========== DATE=$(date '+%Y-%m-%d_%H-%M-%S') BACKUP_FILE="${BACKUP_DIR}/backup_${DATE}.sql" # ========== 执行备份 ========== echo "开始备份:$BACKUP_FILE" docker exec "$CONTAINER_NAME" mysqldump -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" --all-databases > "$BACKUP_FILE" # ========== 清理逻辑 ========== echo "清理旧备份..." # 找出所有 .sql 文件 find "$BACKUP_DIR" -type f -name "*.sql" | while read file; do # 提取文件名中的日期 filename=$(basename "$file") date_str=$(echo "$filename" | grep -oP '\d{4}-\d{2}-\d{2}') # 如果提取不到日期,跳过 if [[ -z "$date_str" ]]; then continue fi # 获取今天日期和文件日期的时间戳 file_ts=$(date -d "$date_str" +%s) today_ts=$(date +%s) # 计算文件和今天的天数差 age_days=$(( (today_ts - file_ts) / 86400 )) # 如果超过 7 天且不是每月 1 号 if [[ $age_days -gt 7 ]]; then day_of_month=$(date -d "$date_str" +%d) if [[ "$day_of_month" != "01" ]]; then echo "删除过期备份:$file" rm -f "$file" fi fi done echo "备份完成。" 设置定时任务 设置每天 12:00 和 20:00 备份一次,并将日志写入文件。 ...
iOS swift 开发学习笔记:关于Share Extension遇到的问题记录
Share Extension 分享扩展 在项目中添加新的 Share Extension target NSExtensionActivationRule 扩展的 Info.plist <key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <dict> <key>NSExtensionActivationSupportsText</key> <true/> <key>NSExtensionActivationSupportsImageWithMaxCount</key> <integer>9</integer> <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> <integer>1</integer> </dict> </dict> Share Extension 分享扩展,分享发布后直接跳转主应用APP class ShareViewController: SLComposeServiceViewController didSelectPost 方法实现,点击默认的发布按钮后的处理 原本打算尝试点击发布后,打开主应用app,这里一直失败。 主应用URL设置,涉及 URL Types in Info.plist,这里不展开。 排除了主应用的URL错误,尝试在safari中输入url,例如”testProject://“,可以打开主应用。 通过URL打开应用代码,直接使用extension的open方法: if let url = URL(string: "testProject://") { print("URL: \(url)") self.extensionContext?.open(url) { success in print("URL \(success ? "opened" : "failed to open")") self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil) } } else { print("URL 格式错误") return } 问题原因: https://stackoverflow.com/questions/24297273/openurl-not-work-in-action-extension ...
通过expect登录linux, vim行错乱问题解决方案
背景 当使用 expect 登入你的虚拟主机的时候,你会发现使用 vim,会经常出现行错乱的问题。 原因 expect 脚本自动 ssh 登陆,当终端窗口发生变化时,默认 expect 不会将终端窗口大小改变的信号传送到远程的服务器上,因此在使用上会出现很不方便的地方,比如 vim 打开文件时出现串行,要是含有中文的文件可能根本无法编辑。 解决 #!/usr/bin/env expect #trap sigwinch spawned trap { set rows [stty rows] set cols [stty columns] stty rows $rows columns $cols < $spawn_out(slave,name) } WINCH #... 结果你发现完全OK ,不再乱行了
关于WebRTC的一些技术总结和记录
什么是 WebRTC? WebRTC(Web Real-Time Communication)是一种允许网页和应用程序进行实时通信(RTC)的技术。它支持点对点的视频、音频和数据传输,无需安装额外的插件或应用程序。WebRTC 的主要特点如下: 实时通信:WebRTC 允许用户通过浏览器直接进行语音和视频通话,以及数据共享。 点对点连接:WebRTC 可以直接在两个用户间建立连接,实现数据的直接传输,而非通过中心服务器。这样做可以减少延迟和提高通信效率。 兼容性:它是一个开放标准,被大多数现代浏览器支持,包括 Chrome、Firefox、Safari 和 Edge。 安全性:所有 WebRTC 组件都要求使用安全的起点(HTTPS),并对所有数据进行加密传输。 多功能性:除了音视频通话,WebRTC 还支持各种数据传输,包括文件共享和实时文本聊天。 NAT 穿透:WebRTC 使用 STUN/TURN 服务器来处理 NAT(网络地址转换)和防火墙穿透,确保不同网络环境下的设备可以相互连接。 媒体捕获和处理:WebRTC 提供了捕获本地媒体(如摄像头和麦克风输入)、处理和播放远程媒体的能力。 标准化 API:提供了一套标准的 API,方便开发者在网络应用中集成实时通信功能。 总之,WebRTC 是一种强大的实时通信技术,使得在不同平台和设备之间的音视频通话和数据共享变得简单和高效。 WebRTC 的 NAT 穿透 WebRTC 中的 NAT(网络地址转换)穿透是一个关键技术,用于在两个位于不同网络(例如家庭或企业网络)的设备之间建立直接的通信连接。NAT 穿透对于保证 WebRTC 能够在各种网络环境下正常工作至关重要。以下是 WebRTC NAT 穿透的详细介绍: 1. NAT 问题的背景 NAT 的作用:NAT 使多个设备能够共享一个公共 IP 地址,同时保持它们的内部(私有)IP 地址。这是家庭和企业网络常用的一种方法。 NAT 对 P2P 的影响:NAT 使得点对点(P2P)通信变得复杂,因为外部网络无法直接访问内部网络中的设备。 2. WebRTC 的 NAT 穿透技术 WebRTC 使用几种技术来解决 NAT 问题: a. ICE(Interactive Connectivity Establishment) 功能:ICE 是一种框架,用于收集设备的多种网络地址(候选者),并尝试通过这些地址建立连接。 候选者类型:包括本地地址、反射地址(通过 STUN 获得)和中继地址(通过 TURN 获得)。 b. STUN(Session Traversal Utilities for NAT) 用途:STUN 服务器帮助设备发现其公共 IP 地址和端口,这对于穿越 NAT 是必需的。 工作原理:设备向 STUN 服务器发送请求,服务器回应设备的公共 IP 地址和端口。 c. TURN(Traversal Using Relays around NAT) 场景:在某些复杂的 NAT 情况下,STUN 无法实现穿透,此时需要 TURN。 功能:TURN 服务器充当中继,转发两个尝试连接的设备之间的流量。 影响:虽然有效,但使用 TURN 会增加延迟和带宽消耗。 3. NAT 穿透过程 收集候选者:设备使用 ICE 框架来收集其所有可能的网络地址(本地、反射和中继)。 候选者交换:通信双方通过信令通道交换他们的 ICE 候选者信息。 连接尝试:双方尝试使用收集到的候选者信息来建立直接的 P2P 连接。 选择最佳路径:在成功建立连接后,将选择最有效的路径进行数据传输。 4. 重要性 保证连通性:NAT 穿透使得位于不同 NAT 后面的设备可以建立直接的通信连接。 提高效率:虽然使用 TURN 会增加资源消耗,但大多数情况下,ICE 和 STUN 足以成功穿越 NAT,确保通信的高效性。 5. 实践中的挑战 复杂的 NAT 类型:对于对称型 NAT,仅靠 STUN 可能无法成功穿越,需要依赖 TURN。 资源和成本:维护 TURN 服务器可能涉及额外的资源和成本。 WebRTC 通过这些 NAT 穿透技术,确保了在不同网络环境下都能够实现可靠和高效的实时通信。 ...
Cloudflare + MailChannels 使用 DKIM 发送电子邮件
独立开发者必看,cloudflare worker 其实也能发邮件,而且是比较优雅地发邮件 https://web.okjike.com/originalPost/65203d2205145f31e56e0707 什么是 DKIM ? https://www.cloudflare.com/zh-cn/learning/dns/dns-records/dns-dkim-record/ 参考1 Cloudflare Email Routing 免费邮件发送服务 https://eleduck.com/posts/4lfxE0 参考2 Cloudflare Email Routing 免费邮件发送(作为 Service 服务)用于 Workers/Pages 项目中。**** https://github.com/willin/cloudflare-send-email-service 参考3 Cloudflare + MailChannels 使用 DKIM 发送电子邮件 https://github.com/r0n9/mail 终于搞定!!!记录一下步骤,如下: 1. CloudFlare 添加域名 yourdomain.com 2. 启用Email路由: [Enable Email Routing · Cloudflare Email Routing docs](https://developers.cloudflare.com/email-routing/get-started/enable-email-routing/) 3. 本地安装 wrangler 以部署 cf worker。注意 node 版本。 sudo npm install wrangler@latest -g 在开始之前,请确保按照此处的说明设置 Wrangler。 here 4. 生成私钥 Generate the Private Key openssl genrsa 2048 | tee priv_key.pem | openssl rsa -outform der | openssl base64 -A | wrangler secret put DKIM_PRIVATE_KEY 此命令的各个部分: - openssl genrsa 2048 生成 2048 位 RSA 密钥 - tee priv_key.pem 将密钥写入 priv_key.pem 文件 - openssl rsa -outform der | openssl base 64 -A 将密钥从 PEM 格式转换为 DER 格式,然后对其进行 base64 编码(这实质上是从 PEM 格式的密钥中删除标头) - wrangler secret put DKIM_PRIVATE_KEY 将它作为秘密添加到我们的 Cloudflare Worker 中 ...