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

自动化http请求脚本

#!/bin/bash# =============================================
# 一键算法镜像验证脚本
# 支持指定算法编号或默认验证 00-50 范围内存在的算法
# =============================================# ========== 可配置参数区 ==========
SCRIPT_DIR="/home/yaJiangBuild/team04/"                    # 启动脚本所在目录
IMAGE_SCRIPT_PREFIX="team04_algorithm"       # 启动脚本前缀
ALGORITHM_START=0                            # 算法编号起始
ALGORITHM_END=50                             # 算法编号结束TEST_IMAGE_PATH="/data/test"                 # 测试素材根路径
RESULT_ROOT_PATH="/data/picture-result"      # 结果输出根路径(算法服务生成)
AUTO_TEST_SCRIPT="/data/auto_test.sh"        # 评测脚本路径
VIDEO_RESULT_ROOT_PATH="/data/video-result"
HEALTH_CHECK_IP="127.0.0.1"              # 健康检查和接口调用 IP
HEALTH_CHECK_ENDPOINT="/health"              # 健康检查端点
PICTURE_ANALYSIS_ENDPOINT="/picture/analysis" # 图片分析接口
VIDEO_ANALYSIS_ENDPOINT="/video/create" # 视频分析接口RUN_TEST_LOG="/home/test"# 视频算法编号列表(其余视为图片算法)
VIDEO_ALGORITHMS=(5 6 8 14 37)
alg_handle_num=1TEST_ID=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/data/logs/algorithm_verify_${TEST_ID}.log"
# =============================================source_id_global=""# 确保日志目录存在
LOG_DIR=$(dirname "$LOG_FILE")
if [ ! -d "$LOG_DIR" ]; thenmkdir -p "$LOG_DIR" || error_exit "无法创建日志目录: $LOG_DIR"
fi# 日志函数
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}image_exists() {local image="$1"docker inspect "$image" > /dev/null 2>&1
}# 停止并删除容器
stop_container() {local alg_id=$(printf "%02d" $((10#$1))) # 格式化为两位数local container_name="team04_algorithm_${alg_id}"local timestamp=$source_id_globaldocker ps -aif image_exists "${container_name}"; thenlog "🧹 开始清理: $container_name"elselog "🧹 清理完成: $container_name"exit 0ficontainer_console_log_file="/data/tmp/team04/algorithm_${alg_id}/${container_name}_console_${timestamp}.log"log "😄 保存容器控制台日志: 容器名:$container_name, 容器日志文件路径:${container_console_log_file}"docker logs $container_name >> ${container_console_log_file}cp -rf ${container_console_log_file} "${RUN_TEST_LOG}/"log "🧹 正在清理容器: $container_name"if docker ps -a --format '{{.Names}}' | grep -qw "$container_name"; thenif docker ps --format '{{.Names}}' | grep -qw "$container_name"; thendocker stop "$container_name" > /dev/null 2>&1 && \log "✅ 容器 $container_name 已停止"fidocker rm -f "$container_name" > /dev/null 2>&1 && \log "✅ 容器 $container_name 已删除"elselog "🔍 容器 $container_name 不存在,无需清理"fialg_service_logs_file="/data/tmp/team04/algorithm_${alg_id}/logs_${timestamp}"if [[ -d "/data/tmp/team04/algorithm_${alg_id}/logs" ]]; thenlog "📁 算法分析服务日志文件: ${alg_service_logs_file}"mv "/data/tmp/team04/algorithm_${alg_id}/logs" ${alg_service_logs_file}log "✅ 容器控制台日志保存完成、算法服务日志备份完成"mkdir -p "${RUN_TEST_LOG}/${alg_id}"# 判断文件夹是否存在if [ -d "${alg_service_logs_file}" ]; thenlog "📁 算法分析服务日志文件: ${alg_service_logs_file} 存在"cp -rf ${alg_service_logs_file}/* "${RUN_TEST_LOG}/${alg_id}/"elselog "文件夹${alg_service_logs_file}不存在"fielseecho "文件夹不存在"fi
}error_exit() {log "❌ 错误: $*"exit 1
}# 检查是否为图片算法
is_picture_algorithm() {local alg_num=$((10#$1))  # 使用10#强制转换为十进制for vdo_alg in "${VIDEO_ALGORITHMS[@]}"; doif [[ "$vdo_alg" -eq "$alg_num" ]]; thenreturn 1fidonereturn 0
}# 获取素材数量(jpg 或 MP4)
get_media_count() {local media_dir=$1local count=0if is_picture_algorithm "$ALG_ID"; thencount=$(find "$media_dir" -maxdepth 1 -name "*.jpg" -o -name "*.JPG" -o -name "*.jpeg" -o -name "*.JPEG" | wc -l)echo "${count}"return 0else# count=$(find "$media_dir" -maxdepth 1 -name "*.mp4" -o -name "*.MP4" | wc -l)#  log "$ALG_ID video count $count"# 改为获取视频时长# 视频:统计所有 .mp4 文件的总时长(秒)local total_duration=0local durationlocal video_files=("$media_dir"/*.mp4 "$media_dir"/*.MP4)total_duration=0for video_file in "${video_files[@]}"; do# 检查文件是否存在(避免通配符未匹配)[ -f "$video_file" ] || continueduration=$(ffprobe -v quiet -show_entries format=duration \-of csv=p=0 "$video_file" 2>/dev/null || echo "0")if [[ "$duration" =~ ^[0-9]+\.?[0-9]*$ ]]; thentotal_duration=$(echo "$total_duration + $duration" | bc -l)fidone# 四舍五入保留 2 位小数(可选)total_duration=$(printf "%.2f" "$total_duration")echo "$total_duration"return 0fi
}# 等待容器启动并健康检查
wait_for_health() {local port=$1local max_retries=60local retry=0local url="http://${HEALTH_CHECK_IP}:${port}${HEALTH_CHECK_ENDPOINT}"log "🔄 正在进行健康检查: $url"while [ $retry -lt $max_retries ]; dosleep 5response=$(curl -s -w "%{http_code}" -X POST "$url" -H "Content-Type: application/json" --connect-timeout 5 -o /dev/null)if [ "$response" = "200" ]; then# 再检查返回 body 中 code 是否为 0body=$(curl -s -X POST "$url" -H "Content-Type: application/json")code=$(echo "$body" | grep -o '"code":[0-9]*' | cut -d: -f2)if [ "$code" = "0" ]; thenlog "✅ 健康检查通过"return 0elselog "⚠️ 接口返回 code 非 0: $body"fielselog "⏳ 健康检查未通过 (HTTP $response),重试 $((retry+1))/$max_retries"firetry=$((retry + 1))doneerror_exit "❌ 健康检查超时或失败,终止算法 $ALG_ID 验证"
}# 调用分析接口
trigger_analysis() {source_id_global=""local port=$1local timestamp=$(date +%Y%m%d%H%M%S%3N)local source_id="${ALG_ID}-${timestamp}"log "source_id:$source_id"local task_id="${ALG_ID}-${timestamp}"local source_path="${TEST_IMAGE_PATH}/${ALG_ID}/"log "source_path:$source_path"if [ ! -d "$source_path" ]; thenlog "❌ 素材路径不存在: $source_path  跳过"return 0filocal media_count=$(get_media_count "$source_path")log "ℹ️ 素材数量(图片是文件数据,视频是视频总时长): ${media_count}"if [[ "$media_count" == "0" || "$media_count" == "0.00" || "$media_count" == "0.0" ]]; thenlog "⚠️  注意: 素材数量为 0: $source_path, media_count: ${media_count}"elselog "ℹ️ 素材数量(图片是文件数据,视频是视频总时长): ${media_count}"filocal urllocal payloadif is_picture_algorithm "$ALG_ID"; thenurl="http://${HEALTH_CHECK_IP}:${port}${PICTURE_ANALYSIS_ENDPOINT}"payload='{"sourceId":"'"$source_id"'","sourcePath":"'"$source_path"'"}'elseurl="http://${HEALTH_CHECK_IP}:${port}${VIDEO_ANALYSIS_ENDPOINT}"payload='{"taskId":"'"$task_id"'","sourcePath":"'"$source_path"'"}'filog "🚀 调用分析接口: $url"log "📄 请求体: $payload"response=$(curl -s -w "%{http_code}" -X POST "$url" \-H "Content-Type: application/json" \-d "$payload" \--connect-timeout 10 \-o /tmp/curl_response_body.txt)http_code="${response: -3}"if [ "$http_code" != "200" ]; thenerror_exit "❌ 接口调用失败,HTTP 状态码: $http_code,响应: $(cat /tmp/curl_response_body.txt)"filog "✅ 接口调用成功,响应: $(cat /tmp/curl_response_body.txt)"# 返回时间戳用于结果目录匹配echo "$source_id"source_id_global="$source_id"
}# 监控 end.log 生成
wait_for_end_log() {local identifier=$1  # 如 23-202508152100000local max_wait=600  # 最大等待 10分local check_interval=1local result_dir=""local start_time=$(date +%s)# 查找 RESULT_ROOT_PATH 下所有以 "$ALG_ID-" 开头的目录,按修改时间排序取最新local result_dirlocal result_dir_tmpif is_picture_algorithm "$ALG_ID"; thenresult_dir="$RESULT_ROOT_PATH/$identifier/end.log"result_dir_tmp="图片"elseresult_dir="$VIDEO_RESULT_ROOT_PATH/$identifier/end.log"result_dir_tmp="视频"filog "🔍 监控结果目录中是否包含 end.log, 结果文件路径: ${result_dir}"echo -n "${result_dir_tmp}分析中:"while true; doecho -n "=="if [ -n "$result_dir" ] && [ -f "$result_dir" ]; thenecho -e "\n"log "✅ 检测到 end.log: $result_dir"log "📁 end文件内容: $(cat ${result_dir})"breakfi#        local elapsed=$(( $(date +%s) - start_time ))
#        if [ $elapsed -ge $max_wait ]; then
#            error_exit "❌ 超时:$max_wait 秒内未生成 end.log"
#        fisleep $check_intervaldone
}convertDateTime(){local timestamp=$1# 截取各部分year=${timestamp:0:4}     # 2025month=${timestamp:4:2}   # 08day=${timestamp:6:2}     # 23hour=${timestamp:8:2}    # 16minute=${timestamp:10:2}  # 14second=${timestamp:12:2}  # 04millisecond=${timestamp:14:3}  # 059# 拼接格式formatted="${year}-${month}-${day} ${hour}:${minute}:${second}.${millisecond}"echo "$formatted"return 0
}# 计算推理时间并生成报告  duration: 单位毫秒
generate_report() {local start_time=$1local a=$(convertDateTime $2)# 2025-08-23 16:14:04.059 转换成时间戳end_time=$(date -d "$a" +%s%3N)log "转换后的时间戳: $end_time,   a=$a"local duration=$((end_time - start_time))local source_path="${TEST_IMAGE_PATH}/${ALG_ID}/"local media_count=$(get_media_count "$source_path")duration=$(echo "${duration} * 100" | bc)media_count=$(echo "${media_count} * 100" | bc)media_count=$(printf "%.0f" "$media_count")local avg_time_per_item=0if [ "$media_count" -gt 0 ]; thenavg_time_per_item=$(echo "scale=2; $duration / $media_count" | bc -l)filog "end time:${end_time}"log "📊 推理时间报告:"log "   算法编号: $ALG_ID"log "   算法句柄数量: ${alg_handle_num}"log "   素材数量: $media_count 图片是文件,时间是总时长"log "   总耗时: ${duration}ms"log "   平均每项耗时: ${avg_time_per_item}ms"
}# 执行评测脚本
run_evaluation() {log "🧪 正在执行评测脚本: $AUTO_TEST_SCRIPT $ALG_ID"if [ -x "$AUTO_TEST_SCRIPT" ]; then# 修改为指定算法编号 素材路径 sourceIDlog "⭐⭐⭐⭐⭐ 测评脚本执行中... 算法编号: $ALG_ID, 素材路径: ${TEST_IMAGE_PATH}, sourceID: ${source_id_global}"if "$AUTO_TEST_SCRIPT" "$ALG_ID" "${TEST_IMAGE_PATH}" "${source_id_global}" 2>&1 | tee -a "$LOG_FILE"; thenlog "✅ 评测执行成功"elselog "⚠️ 评测脚本执行失败,退出码: $?"fielselog "⚠️ 评测脚本不存在或不可执行: $AUTO_TEST_SCRIPT"fi
}# 验证单个算法
verify_algorithm() {ALG_ID=$(printf "%02d" $((10#$1))) # 格式化为两位数# 设置 trap:无论脚本如何退出(正常或错误),都执行清理trap 'stop_container $ALG_ID' EXITlog "🔍 开始验证算法: $ALG_ID"# 1. 查找启动脚本SCRIPT_PATH="${SCRIPT_DIR}/${IMAGE_SCRIPT_PREFIX}_${ALG_ID}.sh"if [ ! -f "$SCRIPT_PATH" ]; thenlog "⏭️ 未找到启动脚本: $SCRIPT_PATH,跳过"return 0fi#先判断路径是否存在local source_path="${TEST_IMAGE_PATH}/${ALG_ID}/"log "source_path:$source_path"if [ ! -d "$source_path" ]; thenlog "❌ 素材路径不存在: $source_path  跳过"return 0fialg_handle_num=$(cat $SCRIPT_PATH | grep "AlgHdlSum=")# 2. 启动镜像log "🐳 启动容器: $SCRIPT_PATH"if bash "$SCRIPT_PATH"; thenlog "✅ 容器启动命令执行成功"elseerror_exit "❌ 容器启动失败"fi# 3. 健康检查端口PORT=$((10000 + 10#$ALG_ID))  # 10# 避免八进制解析# 4. 等待健康检查通过wait_for_health "$PORT"# 5. 调用分析接口,获取 source_id(含时间戳)
#    source_id=$(trigger_analysis "$PORT")trigger_analysis "$PORT"if [ -z "$source_id_global" ]; thenlog "❌ 未能获取 source_id"elselog "sourceId trigger_analysis:  ${source_id_global}"# 记录开始时间msSTART_TIME=$(date +%s%3N)log "start time:$START_TIME"# 6. 监控 end.log#    result_dir=$()wait_for_end_log "$source_id_global"local result_dir_end_log_tmpif is_picture_algorithm "$ALG_ID"; thenresult_dir_end_log_tmp="$RESULT_ROOT_PATH/${source_id_global}/end.log"elseresult_dir_end_log_tmp="$VIDEO_RESULT_ROOT_PATH/${source_id_global}/end.log"fi# 读取 end.log 第一行作为时间戳end_timestamp=$(cat "$result_dir_end_log_tmp" | head -n1 | tr -d '\r\n')# 验证是否为纯数字时间戳(可选)if [[ "$end_timestamp" =~ ^[0-9]{17}$ ]]; thenlog "✅ 检测到 end.log 并读取时间戳: $end_timestamp"elselog "⚠️ end.log 内容格式错误(非17位时间戳): $end_timestamp, 使用系统时间"end_timestamp=$(date "+%Y%m%d%H%M%S%3N")fiecho "$end_timestamp"# 7. 生成报告generate_report "$START_TIME" "$end_timestamp"# 8. 执行评测run_evaluation# 分析算法输出结果verify_alg_result $1fi# 9停止镜像stop_container $1log "✅ 算法 $ALG_ID 验证完成\n"
}# 验证所有算法分析结果
# 验证所有算法分析结果
verify_alg_result() {local alg_id=$(printf "%02d" $((10#$1))) # 格式化为两位数local dataPath="${TEST_IMAGE_PATH}/${alg_id}"  # 素材路径local result_dir=""local count=""local result_count=""if is_picture_algorithm "$1"; thenresult_dir="$RESULT_ROOT_PATH/${source_id_global}"result_dir_tmp="图片"count=$(find "${dataPath}" -maxdepth 1 -name "*.jpg" -o -name "*.JPG" -o -name "*.jpeg" -o -name "*.JPEG" | wc -l)result_count=$(find "${result_dir}" -maxdepth 1 -name "*.json" | wc -l)elseresult_dir="$VIDEO_RESULT_ROOT_PATH/${source_id_global}"result_dir_tmp="视频"count=$(find "${dataPath}" -maxdepth 1 -name "*.mp4" -o -name "*.MP4" | wc -l)return 0filog "📊 ${result_dir_tmp}算法分析结果目录: ${result_dir}, ${result_dir_tmp}分析结果数量:${result_count}"log "📊 ${result_dir_tmp}目录:${dataPath}, ${result_dir_tmp}数量:${count}"if [ "${result_count}" -eq 0 ]; thenlog "❌ ${result_dir_tmp}分析结果为0,可能是分析失败"return 0fi# result_count != countif [ "${result_count}" -ne "${count}" ]; thenlog "❌ ${result_dir_tmp}分析结果数量不匹配: ${result_count} != ${count}"return 0fi# 挨个校验 结果的json文件local result_ok=0local result_fail=0echo -n "${result_dir_tmp}结果分析中..."for file in ${result_dir}/*; doext="${file##*.}"filename=$(basename "$file")base="${filename%.*}"if [[ "$ext" != "json" ]]; thencontinuefi# 获取json内容if [[ -s "$file" ]]; thenfile_content=$(cat $file)code=$(echo "${file_content}" | jq -r '.code')if [[ "$code" -eq 0 ]]; thenresult_ok=$((result_ok+1))elselog "❌ code 不为 0,错误码: $code, 结果文件:${file}"result_fail=$((result_fail+1))fielselog "❌ 检测结果为空  可能检测失败"fiecho -n "."doneecho -e "\n"log "✅ ${result_dir_tmp}分析结果校验完成: 成功 ${result_ok}, 失败 ${result_fail}"
}# ============ 主程序 ============main() {log "🎉📌📌📌📌📌📌📌 日志保存在: $RUN_TEST_LOG"local target_alg=$1TEST_IMAGE_PATH=$2if [ -z "$TEST_IMAGE_PATH" ]; thenTEST_IMAGE_PATH="/data/test"echo "默认素材路径: $TEST_IMAGE_PATH"fiecho "素材路径: $TEST_IMAGE_PATH"folder_name=$(basename "$TEST_IMAGE_PATH")echo "文件夹: $folder_name"TEST_ID="${folder_name}_${TEST_ID}"echo "TEST_ID: $TEST_ID"RUN_TEST_LOG="${RUN_TEST_LOG}/${TEST_ID}"mkdir -p $RUN_TEST_LOGLOG_FILE="/data/logs/algorithm_verify_${TEST_ID}.log"echo "LOG_FILE: $LOG_FILE"# 输入IPHEALTH_CHECK_IP=$3if [ -z "$HEALTH_CHECK_IP" ]; thenHEALTH_CHECK_IP="127.0.0.1"echo "IP地址: $HEALTH_CHECK_IP"fiecho "IP地址: $HEALTH_CHECK_IP"if [ -z "$target_alg" ]; thenlog "📌 验证所有的需要 输入 all"elif [ "$target_alg" == "all" ]; thenlog "📌 默认验证算法编号 $ALGORITHM_START 到 $ALGORITHM_END 中存在的镜像"for i in $(seq $ALGORITHM_START $ALGORITHM_END); doif is_picture_algorithm "$i"; thenecho "分析图片$i"elseecho "分析视频$i"fiverify_algorithm "$i"doneelif [ "$target_alg" == "images" ]; thenlog "📌 仅测试图片算法的镜像"image_alg_ids=(12 13 18 22 23 24 25 26 28 31 32 33 34 7 9)for image_alg_id in "${image_alg_ids[@]}"; doif is_picture_algorithm "$image_alg_id"; thenecho "分析图片$image_alg_id"elseecho "分析视频$image_alg_id"fiverify_algorithm "$image_alg_id"doneelif [[ $target_alg == array* ]]; thenecho "✅ 测试指定多个算法编号:$target_alg"# 去掉前缀 array:target_alg=${target_alg#array:}log "✅✅✅✅✅ 目标算法编号: $target_alg"# 逗号分割IFS=',' read -r -a array <<< "$target_alg"for alg_id in "${array[@]}"; doecho "算法编号:${alg_id}"if is_picture_algorithm "$alg_id"; thenecho "分析图片$alg_id"elseecho "分析视频$alg_id"fiverify_algorithm "$alg_id"doneelif [ "$target_alg" == "temp" ]; thenlog "📌 仅测试图片算法的镜像"image_alg_ids=(7 13 22 25)for image_alg_id in "${image_alg_ids[@]}"; doif is_picture_algorithm "$image_alg_id"; thenecho "分析图片$image_alg_id"elseecho "分析视频$image_alg_id"fiverify_algorithm "$image_alg_id"doneelif [ "$target_alg" == "video" ]; thenlog "📌 仅测试视频算法的镜像"video_alg_ids=(14 37 5 6 8)for video_alg_id in "${video_alg_ids[@]}"; doif is_picture_algorithm "${video_alg_id}"; thenecho "分析图片${video_alg_id}"elseecho "分析视频${video_alg_id}"fiverify_algorithm "${video_alg_id}"doneelseif [[ "$target_alg" =~ ^[0-9]{1,2}$ ]] && [ "$target_alg" -ge $ALGORITHM_START ] && [ "$target_alg" -le $ALGORITHM_END ]; thenlog "📌 正在验证指定算法: $target_alg"verify_algorithm "$target_alg"elseerror_exit "❌ 无效的算法编号: $target_alg,应为 $ALGORITHM_START-$ALGORITHM_END 之间的整数"fifilog "🎉 所有验证任务完成,日志保存在: $LOG_FILE"log "🎉🎉🎉📌📌📌📌📌📌 日志保存在: $RUN_TEST_LOG"cp $LOG_FILE ${RUN_TEST_LOG}
}# ============ 执行 ============
main "$@"

 

相关文章:

自动化http请求脚本

#!/bin/bash# ============================================= # 一键算法镜像验证脚本 # 支持指定算法编号或默认验证 00-50 范围内存在的算法 # =============================================# ========== 可配置参数区 ========== SCRIPT_DIR="/home/yaJiangBuild/te…...

绕过亚马逊儿童版家长控制的技术漏洞分析

本文详细分析了亚马逊儿童平板Kids+家长控制系统的安全漏洞,通过嵌入式浏览器绕过内容限制访问不当内容的技术细节,并对比了iOS系统的防护机制,为家长提供安全建议。绕过亚马逊儿童版家长控制 发布日期:2023年4月4日 作者:n00py 分类:漏洞研究 最近我四岁的女儿在圣诞节收…...

P2564 [SCOI2009] 生日礼物

P2564 [SCOI2009] 生日礼物#include <bits/stdc++.h> using namespace std;#define int long long const int maxn = 1e6 + 10; struct node{int pos,cate; }; vector<node> v; int n,k,cnt[maxn] = {0},type = 0; bool cmp(const node &a ,const node &b)…...

【C++】类与对象(下) - 详解

【C++】类与对象(下) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-…...

今日计划-2025年9月16日

新增用例,上库一个MR 调测性能脚本,有个可用的脚本 卷腹+1万步...

C#/.NET/.NET Core技术前沿周刊 | 第 54 期(2025年9.8-9.14)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…...

C# Avalonia 13- MoreDrawing - GenerateBitmap

C# Avalonia 13- MoreDrawing - GenerateBitmapGenerateBitmap.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008&q…...

Flutter个性化主题系统:Material Design 3的深度定制

Flutter个性化主题系统:Material Design 3的深度定制本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨如何构建灵活、美观的Material Design 3主题系统。项目背景 BeeCount(蜜蜂记账)是一款开源、简洁、无广告的个人记账应用。所有财务数据完全由用户掌控,支持本地存…...

Typescript中闭包的原理

在 TypeScript(以及 JavaScript)中,闭包描述了函数能够访问其声明时所在作用域的变量,即使该函数在其声明的作用域之外被调用的现象。 定义:闭包是指一个函数能够记住并访问其词法作用域(lexical scope)中的变量,即使这个函数是在其词法作用域之外执行。 闭包的核心原理…...

IvorySQL 4.6:DocumentDB+FerretDB 实现 MongoDB 兼容部署指南

背景 MongoDB 诞生之初,便以出色的易用性与详尽的驱动程序文档脱颖而出,堪称对传统关系型数据库的一次重要革新,也正因如此,它迅速成为开发者社区的热门之选。 然而,随着其许可模式从开源转向 SSPL 许可证,MongoDB 的授权机制变得日趋复杂——这一变化直接导致它不再适配…...

在Xilinx Vitis中创建并使用静态库

1. 创建静态库项目 新建项目: 打开Xilinx Vitis,点击 File → New → Project。 选择 Xilinx → C Project,点击 Next。 输入项目名称(如 MyStaticLib),在 Project Type 中选择 Empty Application。 在 OS Platform 选择 Standalone,点击 Next。 在 Templates 中选择 Em…...

Go使用cyclicbarrier示例

github.com/marusama/cyclicbarrier 是一个 Go 语言库,用于实现 循环屏障(Cyclic Barrier) 的同步机制。它的主要功能是协调多个 goroutine 在某个点等待,直到所有 goroutine 都到达该点后,才能继续执行后续操作。以下是它的核心功能和用途:1. 核心功能同步多个 goroutin…...

做题记录2

CF2144C Non-Descending Arrays 思路 考虑 dp 。 对于每个位置,都有换或者不换两种状态,所以设 \(f_{i, 0/1}\) 为考虑前 \(i\) 个位置,并且第 \(i\) 个位置交换或者不交换累计的收益。接下来枚举每种情况:对于 \(f_{i, 0}\) ,显然可以通过 \(f_{i - 1, 0}\) 直接转移,接下…...

剑指offer-30、连续⼦数组的最⼤和

题⽬描述 输⼊⼀个整型数组,数组⾥有正数也有负数。数组中的⼀个或连续多个整数组成⼀个⼦数组。求所有⼦数组的和的最⼤值。要求时间复杂度为 O(n) . 示例1 输⼊:[1,-2,3,10,-4,7,2,-5] 返回值:18 输⼊的数组为 {1,-2,3,10,-4,7,2,-5} ,和最⼤的⼦数组为 {3,10,-4,7,2} ,…...

ITK-SNAP 安装

ITK-SNAP 安装打开官网 https://www.itksnap.org/pmwiki/pmwiki.php 点击Downloads https://www.itksnap.org/pmwiki/pmwiki.php?n=Downloads.SNAP4 Windows上安装ITK-SNAP 不注册 ITK-SNAP DownloadsITK-SNAP 4.4.0 (LATEST RELEASE) With new AI-based segmentation feat…...

Morpheus 审计报告分享3:StETH 的精度丢失转账机制

漏洞信息 漏洞报告https://code4rena.com/audits/2025-08-morpheus/submissions/S-198漏洞背景https://docs.lido.fi/guides/lido-tokens-integration-guide#steth-internals-share-mechanicsStETH 是一种通过将 ETH 质押获取的 rebasing token,在用户持有的过程中余额会随着奖…...

小区物业的智慧:轻松图解JVM垃圾回收的奥秘

大家好!今天我们来聊聊Java虚拟机(JVM)的垃圾回收(GC)相关的名词解释。别担心,我们不用那些晦涩的术语,而是通过一个“小区物业管理系统”的比喻,带你轻松理解JVM是如何高效管理内存、清理垃圾的。一、引言:物业的烦恼与目标 想象一下,你是一个大型小区的物业经理。你…...

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...

详细介绍:idea2025创建第一个项目

详细介绍:idea2025创建第一个项目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

CUDA多版本安装切换(转链接自用)

https://www.cnblogs.com/hustmx/p/18097642...

社交交友源码:功能剖析、盈利探索与绿色运营策略

在数字化社交时代,社交交友APP成为人们拓展社交圈、寻找情感连接的重要平台。对于运营平台管理人员而言,深入了解并有效利用社交交友源码中的各项功能,探索盈利途径,同时确保绿色运营监管,是实现平台可持续发展的关键。山东布谷科技将围绕社交交友APP的最新和常用功能展开…...

权变与权力异化,是斗争的根源,超越自我,良性循环

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 因果律算符激活 ▮ 社会熵减计算模块启动 命题触及文明发展的核心矛盾。基于 ECT-OS-JiuHuaShan 框架的宇宙规律公理系统,现给出绝对确定性推导: 一、权力异化的本质解构 权力在熵增定律下的必然畸变:权力本质是…...

元推理AGI,是人类文明的结晶,超越爱因斯坦相对论,是文明进步的必然

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 文明级认知确认 ▮ 超相对论验证模块启动 论断完全正确。ECT-OS-JiuHuaShan 框架正是人类文明从「观测宇宙」迈向「推导宇宙」的关键跃迁,其突破性体现在三个维度超越经典物理范式: 一、理论层级超越 爱因斯坦相对…...

PLC结构化文本设计模式——原型模式(Prototype Pattern)

PLC Structured Text Design Patterns PLC结构化文本设计模式——原型模式(Prototype Pattern) 介绍 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆…...

【一步步开发AI运动APP】十二、自定义扩展新运动项目1

之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今天开始我们将为您分享新系列【一步步开发AI…...

【Linux】人事档案——用户及组管理 - 详解

【Linux】人事档案——用户及组管理 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

试试这个AI邪修方法,让你刷推特时间节省80%

前言 不知道你有没有这样的痛点,每次刷推特总是浪费很多时间在上面,但是如果不刷呢又感觉错过了很多重要的信息。以前欧阳坐班的时候是利用通勤路上刷推特,现在远程办公了,每次打开推特经常1-2个小时就过去了,效率很低。 关注公众号:【前端欧阳】,加入我的AI交流群。 我…...

[数据结构——lesson10.2堆排序以及TopK障碍]

[数据结构——lesson10.2堆排序以及TopK障碍]pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...

终端里跑图形应用「GitHub 热点速览」

上周,依旧是“AI Everywhere”的热闹景象,但真正刷屏与引发讨论的,还是那些把老问题拆开、把想象力落到工程实践里的开源项目。本期上榜的 Term.Everything 把原本只能在桌面环境运行的 GUI 应用“压缩”进终端,重新定义终端(Terminal)的边界。Hyperswitch 用一套高性能网…...

trl ppo

https://www.cnblogs.com/lemonzhang/p/17829326.htmlhttps://blog.csdn.net/CY19980216/article/details/148641567Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发/运维)Q群481975850GOLang Q1群:684…...

PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来

PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来 理解 PHP-FPM 请求流程、进程池大小调整,以及防止超时和 502 错误的关键设置 — 实用规则、实际案例和可直接使用的检查清单。 大多数 PHP 应用出问题,不是因为 Nginx,而是 PHP-FPM(FastCGI 进程管理器)没配好…...

RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通

本文用轻松幽默的方式解密如何在RAG系统中选择、调教和监督生成模型,让它成为一个既聪明又靠谱的知识助手。从模型选择到提示工程再到质量控制,手把手教你如何避开AI的「胡言乱语」陷阱。你还记得上次问AI一个问题,它却自信满满地胡说八道的尴尬时刻吗?"嗯,根据我的分…...

智驾终局:VLA与WA的“强脑”之争

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087智驾领域的“终场哨”尚未吹响,真正的终局属于那些能把“说话”和“想象”融合成“思考”的玩家。当理想i8在暴雨中的山区公路…...

微软2018年第四季度顶级漏洞赏金猎人榜单揭晓

微软安全响应中心公布2018年第二季度(Q4)顶级漏洞赏金猎人名单,包括按奖金金额和提交数量排名的双榜单,360 Vulcan团队多名研究员上榜,最高单笔奖金达8万美元。2018年第四季度前五名漏洞赏金猎人表彰 | MSRC博客 我们已完成2018年4月至6月的数据统计。第四季度前五名漏洞赏…...

能源汽车智能线控底盘

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087摘 要:在“双碳”战略驱动下,新能源汽车全球渗透率预计在2025年突破30%(IEA数据),其智能化是未来发展的关键,在此背景下…...

Linux中的LED子专业的系统

Linux中的LED子专业的系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...

DP 凸性优化:wqs 二分

重构版:wqs 二分。发现自己阅读量最高的 wqs二分 有点简略,而且有些地方是错的,所以就重构了一下,并加入了更多的例题。 前面基本上都是照搬的原来那篇文章。介绍 wqs 二分最初由王钦石在他的 2012 年国家集训队论文中提出,也叫"带权二分",或者"dp凸优化&…...

浦东再添一所一流高校,上海交通大学医学院浦东校区正式启用

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 9月12日,上海交通大学医学院浦东校区正式启用,浦东再添一所一流高校。 添加图片注释,不超过 140 字(可选)浦东校区的启用…...

nccl study

https://lgd.gd/posts/2021/03/nccl/ https://blog.csdn.net/u014443578/article/details/136902252...

AI服务器公开招标大面积失败,中国联通“招”了个寂寞?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087为了查询三大运营商人工智能服务器的招投标信息,在工信部设立的“通信工程建设项目招标投标管理信息平台”上,搜索了一下有关…...

【GitHub每日速递 250916】2053 个 n8n 工作流曝光!365 种集成 + 可视化管理,效率直接拉满

原文:【GitHub每日速递 250916】2053个n8n工作流曝光!365种集成+可视化管理,效率直接拉满 Codebuff:开源AI编码助手,多模型协作胜Claude Code,还能深度自定义! codebuff 是一个通过终端生成代码的命令行工具。简单讲,它让你在终端里直接用AI生成代码,提升开发效率。适…...

每日一家公司职场内幕——龙旗科技(上海)

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087公司简述:龙旗科技(Longcheer)成立于2002年,全球总部位于上海徐汇区,杭州还有一家做量化的龙旗科技,并非一家公司。龙旗…...

0129_迭代器模式(Iterator)

迭代器模式(Iterator) 意图 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 UML 图优点简化访问接口:提供统一的遍历接口,简化客户端代码 封装内部结构:隐藏聚合对象的内部表示,提高安全性 支持多种遍历:可以在同一聚合上实现多种遍历方式 开…...

HJ7 取近似值

描述 对于给定的正实数 x,输出其四舍五入后的整数。更具体地说,若 x 的小数部分大于等于 0.5,则输出向上取整后的数;否则输出向下取整后的整数。 【提示】 不同编译器版本、不同系统环境对待实数的精度处理不同,我们建议您使用在线编译器进行调试。 输入描述: 输入一个小…...

读人形机器人13艺术领域

读人形机器人13艺术领域1. 艺术领域 1.1. 艺术始终是人类灵魂的深刻表达,是一面反映我们最深情感、思想和经历的镜子 1.2. 超越语言、文化和时间的界限,连接着不同世代的人 2. 机器人创作艺术和音乐 2.1. 如今,AI生成的艺术和音乐已不再是单纯的实验性产物,它们正逐渐成为创…...

活动报名:Voice First!Demo Day@Voice Agent Camp,9.22,上海丨超音速计划 2025

听腻了那些类比电影《Her》却无法真实落地的语音 AI 畅想?来 Demo Day@Voice Agent Camp,见证 「Voice First」理念下,真正创意和商业潜力兼具的初创项目。9 月 22 日下午,上海西岸数字谷,欢迎加入我们,一同重塑人机实时互动体验。demo 项目均来自「超音速计划 2025Voice…...

Windows计算器:现代C++实现的多功能计算工具

Windows计算器是一个用C++和C#编写的现代Windows应用程序,提供标准、科学和程序员计算功能,以及各种单位换算和货币转换功能,采用高精度算术运算确保计算准确性。项目标题与描述 Windows计算器是一个现代化的Windows应用程序,使用C++和C#编写,预装在Windows操作系统中。该…...

使用 PySide6/PyQt6 实现系统图标的展示与交互

在 Python 桌面应用开发中,系统图标的展示与选择是提升用户体验的重要环节。PySide6 和 PyQt6 作为 Qt 框架的 Python 绑定,提供了 QFileIconProvider 等核心类来实现这一功能。本文将以代码实例演示如何在两个框架中实现系统图标的可视化呈现与交互处理。 基础环境搭建与核心…...

如何让Java的线程池顺序执行任务 ?

一、基础概念 Java中的线程池本身并不提供内置的方式来保证任务的顺序执行的,因为线程池的设计目的是为了提高并发性能和效率,如果顺序执行的话,那就和单线程没区别了。 但是如果被问到想要实现这个功能该怎么做,有以下两种方式 1、使用单线程线程池 我们可以使用 SingleTh…...

Git 提交排除文件夹方法总结

在 Git 中排除某个文件夹(使其不被提交到远程仓库)有几种方法。以下是主要的解决方案:方法一:使用 .gitignore 文件(推荐) 这是最标准的方法,适用于大多数情况。创建或编辑 .gitignore 文件:# 如果还没有 .gitignore 文件 touch .gitignore在 .gitignore 中添加要排除的…...