开发案例-Vue Cli项目动态引入图片资源、Fastapi+PG库搭建web服务、自定义video元素控件

地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 空间智能实验室 Vol.19:地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 「把这块区域导成一张带地理坐标的高清图」是个很朴素的需求,但朴素不等于简单。你要在浏览器里框一个框、画几个箭头标个文字、叠一层 阅读详情

Vue Cli+Vue3项目使用v-bind动态控制img的src属性值踩坑记录

之前自己写项目都是用Vite+Vue3,突然接了个需要维护的项目使用Vue Cli+Vue3构建的,因为本人之前很少接触webpack流,所以对其特性不是很了解,导致踩了一些坑。

  • 踩坑记录-webpack项目img标签:src=“urlPath“拿不到图片
  • 吐槽:都2025年了怎么还有项目没用Vite呢,简直比webpack流好用几十倍啊,不论是启动还是热更新都遥遥领先。

回到正题

  • 踩坑点:使用<img :src="imgs.img">居然无法正常获取到图片。不使用v-bing绑定正常写入imgs.img的值时又可以正常显示图片。

  • 分析:因为个人实在不想去了解过时的框架特性,在C站上简单搜了下相关案例,发现是脚手架的机制问题,因为在Vite中就不会出现这种问题,于是只能通过require动态导入资源。

案例代码

<template>
  <!-- 一个3行2列的虚拟表格 -->
  <div class="table_box">
    <div v-for="item in data" :key="item.key" class="col">
      <img :src="item.img" alt="" class="col_left_icon">
      <div class="col_name">{{ item.label }}</div>
      <div class="col_num">{{ item.num + item.unit }}</div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const data = ref([
  { img: require('../../assets/img/ck-icon1.png'), key: 'key1', label: '标签1', num: 0, unit: '个' },
  { img: require('../../assets/img/ck-icon2.png'), key: 'key2', label: '标签2', num: 0, unit: '个' },
  { img: require('../../assets/img/ck-icon3.png'), key: 'key3', label: '标签3', num: 0, unit: '条' },
  // ... 共6条,再次吐槽,如果是Vite构建的项目,此处无需使用require动态导入资源,直接写相对路径即可。
])
</script>

<style lang="scss" scoped>
.table_box {
  height: 100%;
  width: 100%;
  display: flex;
  flex-wrap: wrap; //这个属性可以让弹性盒在适当的时候(一般是宽度达到100%)自动换行
  justify-content: space-between; //结合上一条属性,可以实现类似表格的效果
  margin-top: 0.5vh;

  .col {
    height: 29%;
    width: 47%;
    margin: 0.4vh 0.5vh;
    display: flex;
    align-items: center;
    text-align: left;

    .col_left_icon {
      height: 60%;
    }

    .col_name {
      width: 38%;
      margin-left: 0.5vh;
      color: #fff;
      font-size: 0.7vw;
      white-space: nowrap; //强制不换行
    }

    .col_num {
      width: 38%;
      margin-right: 0.5vh;
      color: aqua;
      font-size: 1vw;
      font-weight: 500;
      text-align: right;
    }
  }
}

使用FastApi+PostgreSQL开发一个web服务端

主要使用技术
  • fastapi 创建web服务器
  • psycopg2 连接数据库工具
第三方库安装

pip install fastapi 搭建服务器
pip install fastapi_cdn_host 接口文档本地化部署
pip install psycopg2 连接pg数据库用
pip install uvicorn 启动服务器

源码
import os
import time
import json
import fastapi_cdn_host # 自动文档cdn
import configparser # 读取配置
import psycopg2  # pg库工具
from datetime import datetime # 系统时间
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, ConfigDict
from contextlib import asynccontextmanager


# 创建一个读取配置文件的对象
config = configparser.ConfigParser()
config.read('config.ini')
# 获取配置信息
db_host = config.get('pgdb', 'host')
db_name = config.get('pgdb', 'database')
db_user = config.get('pgdb', 'user')
db_pass = config.get('pgdb', 'password')
db_port = config.get('pgdb', 'port')


# 创建连接对象
conn = psycopg2.connect(database=db_name, user=db_user, password=db_pass, host=db_host, port=db_port)
# print('Connected to PostgreSQL')
cur = conn.cursor()  # 获取游标


# 使用asynccontextmanager装饰器来定义一个异步上下文管理器,这将作为你的生命周期事件处理器
@asynccontextmanager
async def lifespan(app: FastAPI):
    # 应用启动时执行的代码
    print(f'FastAPI server started:{datetime.now()}')
    yield
    # 应用关闭时执行的代码,用于清理未关闭连接
    conn.close()
    print(f'FastAPI server stopped:{datetime.now()}')


# 创建API接口
app = FastAPI(lifespan=lifespan)
# 引入本地cdn资源
fastapi_cdn_host.patch_docs(app)


# 参数类
class Query(BaseModel):  # 借助 Pydantic 的BaseModel方法来使用标准的 Python 类型声明请求体
    sql: str  # sql语句传参,前端提供详细语句,后端负责连接数据库执行
    dataSource: str  # 数据源传参,根据原始表的所属租户填写

@app.post("/pyapi/test/openQuery")
def test_open_query(query: Query):
    try:
        if query.dataSource not None:
            print(query.dataSource, query.toJson)
        cur.execute(query.sql)
    	return {'status': 200, 'msg': 'Operations Success!', 'data': cur.fetchall()}
    except Exception as e:
        raise HTTPException(status_code=500, detail=e)


class AnyParam(BaseModel):
    model_config = ConfigDict(extra='allow')  # 允许接收额外的字段

@app.post("/pyapi/test/pushPageVisits")
def test_push_page_visits(param: AnyParam):
    try:
    	# 执行数据库插入数据操作
        cur.execute(
            'INSERT INTO "public"."t_a_test_visits" ("username", "employeeId", "pageName", "pageRoute", "startTime", "endTime", "loginId") VALUES (%s, %s, %s, %s, %s, %s, %s)',
            (param.username, param.employeeId, param.pageName, param.pageRoute, param.startTime, param.endTime, param.loginId)
        )
        conn.commit() # 提交事务
        return {'status': 200, 'msg': 'Operations Success!'}
    except Exception as e:
        conn.rollback() # 回滚事务
        raise HTTPException(status_code=500, detail=e)


@app.post("/pyapi/test/getPageVisits")
def test_get_page_visits(param: AnyParam):
	# 执行数据库查询操作
    try:
        cur.execute(
            'SELECT * FROM "public"."t_a_test_visits" WHERE username = coalesce(%s, username)',
            (param.username,)
        )
        return {'status': 200, 'msg': 'Operations Success!', 'data': cur.fetchall()}
    except Exception as e:
        raise HTTPException(status_code=500, detail=e)


# 启动服务器
if __name__ == "__main__":
    os.system('chcp & cls')
    import uvicorn

    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)  # reload在开发时可设置为True,在修改代码后会自动重启项目,但打包时必须设置为False,否则会导致应用被重复启动的问题

原生video元素自定义控件

背景:

项目需要对video元素做一些样式定义,原生的很难修改,于是借助video标签的事件进行自定义控件改造。

本文内容基于网上大神分享的vue2方案,改写为适配vue3的方案。原文链接:掘金_原生video元素自定义播放控件controls

开发环境:
  • Vue3 3.2+
  • Nodejs 18+
  • ElementPlus 2.3+
基础功能:
  • 播放、暂停按钮
  • 当前播放时长/视频总时长
  • 进度条(点击或拖动滑块可跳转进度并续播)
  • 音量控制
  • 控件显隐
源码:
<template>
  <div class="customer_video_wrap" @mouseleave="hideControls" @mouseover="showControls">
    <video ref="videoPlayer" src="http://vjs.zencdn.net/v/oceans.mp4" width="100%"
      :class="['answerVideo', 'isMirror']" preload="auto" @timeupdate="updateProgressBar"
      @loadedmetadata="getDuration" @ended="onVideoEnded" @click="togglePlay"></video>
    <!-- 自定义视频控件 -->
    <transition name="el-fade-in-linear">
      <div class="video_control" v-show="isShowingControls" style="transition: opacity .5s;">
        <div class="video_control_top">
          <div>
            <el-icon v-if="isPlaying" @click="togglePlay">
              <VideoPause />
            </el-icon>
            <el-icon v-else @click="togglePlay">
              <VideoPlay />
            </el-icon>
            <span class="video_time">
              {{ formatTime(currentTime) }}<span>/ {{ formatTime(duration) }}</span>
            </span>
          </div>
          <span class="video_volume_wrap">
            <el-slider class="video_volume" v-model="volume" @change="changeVolume"></el-slider>
            音量
          </span>
        </div>
        <el-slider ref="progressSlider" class="video_control_progress" v-model="currentTime" :show-tooltip="false"
          :max="duration" @mousedown="handleDragStart" @touchstart="handleDragStart"
          @change="changeProgress"></el-slider>
      </div>
    </transition>
  </div>
</template>

<script setup>
import { VideoPause, VideoPlay } from '@element-plus/icons-vue'
import { ref } from 'vue'
    
// 自定义视频控件功能逻辑
const isPlaying = ref(false)
const currentTime = ref(0)
const duration = ref(1)
const volume = ref(30)
const isShowingControls = ref(true)
const isDraging = ref(false)
const videoPlayer = ref(null)
let video
/** 视频播放/暂停 */
const togglePlay = () => {
  video = videoPlayer.value
  if (video.paused) {
    video.play()
    isPlaying.value = true
  } else {
    video.pause()
    isPlaying.value = false
  }
}
/** 视频播放结束 */
const onVideoEnded = () => {
  isPlaying.value = false
}
/** 获取视频时长 */
const getDuration = () => {
  video = videoPlayer.value
  if (video) {
    duration.value = Number.isFinite(video.duration) ? video.duration : 5
  }
}
/** 更新进度条 */
const updateProgressBar = () => {
  getDuration()
  if (isDraging.value) {
    return
  }
  if (video) {
    currentTime.value = video.currentTime
  }
}
/** 拖拽进度条结束时 */
const changeProgress = (value) => {
  isDraging.value = false
  video.currentTime = value
  video.play()
  isPlaying.value = true
}
/** 拖拽进度条开始与进行中时 */
const handleDragStart = () => {
  isDraging.value = true
  video.pause()
}
/** 音量变化 */
const changeVolume = (value) => {
  video.volume = value / 100
}
/** 格式化时间 */
const formatTime = (seconds) => {
  const format = val => `0${Math.floor(val)}`.slice(-2)
  const hours = seconds / 3600
  const minutes = (seconds % 3600) / 60
  seconds = seconds % 60
  if (hours < 1) {
    return [minutes, seconds].map(format).join(":")
  }
  return [hours, minutes, seconds].map(format).join(":")
}
/** 显示控制组件 */
const showControls = () => {
  isShowingControls.value = true
}
/** 隐藏控制组件 */
const hideControls = () => {
  isShowingControls.value = false
}
</script>

<style scoped lang="less">
.customer_video_wrap {
  position: relative;
  width: 100%;
}

.answerVideo {
  z-index: 1;
}

video.isMirror {
  transform: scale(-1, 1);
}

// 自定义视频控件
.video_control {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 8px 20px;
  background: linear-gradient(0deg, #000000 5%, #00000073, transparent);

  .video_control_top {
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #fff;

    i {
      font-size: 20px;
      color: #fff;
    }

    .video_time {
      transform: translateY(-2px);
      display: inline-block;
      margin-left: 8px;
    }

    .video_volume_wrap {
      display: flex;
      align-items: center;
      font-size: 13px;
    }

    .video_volume {
      width: 70px;
      margin-right: 8px;
    }
  }

  :deep(.el-slider) {
    .el-slider__runway {
      background-color: #cbcbcb;
      height: 4px;
      margin: 4px 0;
    }

    .el-slider__bar {
      height: 4px;
      background-color: #fff;
    }

    .el-slider__button-wrapper {
      top: -16px;
    }

    .el-slider__button {
      width: 10px;
      height: 10px;
      border: none;
    }
  }
}
</style>

最终效果:

告别复杂编码!用GNURadio + VLC + USRP三步搞定无线视频“直播”(附ffmpeg转码命令) 本文介绍了一种基于GNURadio、VLC和USRP的无线视频传输方案,无需复杂编码即可实现实时视频传输。通过三步流程(工具准备、音频验证、视频传输)和ffmpeg转码命令,帮助用户快速搭建系统,适用于教学演示和原型开发。方案特别强调实时显示效果和带宽优化技巧。 阅读详情

相关推荐

速腾聚创多激光雷达点云采集,并用RVIZ进行显示

在ubuntu20.04系统下,使用速腾聚创官方提供的软件RSView,对激光雷达的默认IP地址、MSOP 包端口号、 DIFOP包端口号和时间模式等配置进行查看和修改。使用交换机对两个激光雷达进行组网,实现多激光雷达数据采集,并用RVIZ同时显示两个雷达点云。使用wireshark对比两个雷达数据包。

abanchao的博客 5888

Jackson 序列化 / 反序列化注解 完整版笔记

Jackson 序列化 / 反序列化注解 完整版笔记

handsome_sai的博客 278

riscv32-gcc工具链实战:从下载到编译的完整指南

本文提供了一份详尽的riscv32-gcc工具链实战指南,涵盖从官方渠道下载预编译版本、正确选择riscv32-glibc版本、配置环境变量到实战编译的全过程。通过清晰的步骤和避坑指南,帮助开发者快速搭建稳定的RISC-V交叉编译环境,并成功编译从Hello World到Linux内核的程序。

s3t4u的博客 675

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 953

OData V2 消息在 SAP UI5 中的生成、传播与治理全解

SAP UI5 的 OData V2 消息机制通过自动解析服务端响应头(sap-message)或错误体,将消息推送到全局 MessageModel,实现数据质量保障。关键点包括:1)消息通过目标路径与控件绑定联动,触发高亮等反馈;2)生命周期管理需注意避免自动刷新导致消息丢失;3)常见陷阱如批处理错误重复、内外层消息冲突等可通过精准目标路径或自定义处理器解决。代码示例展示了如何配置模型、消息模型及 MessagePopover 实现端到端消息展示,同时支持控件通过 refreshDataState 自定义

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 231

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 140

【ARM CoreLink 系列 3 -- CCI-550 控制器介绍 】

Arm CoreLink CCI-550 Cache Coherent Interconnect 扩展了 CoreLink CCI-500。它在 big.LITTLE 处理器集群之间提供完整的缓存一致性,并为其他代理(如 Mali GPU、网络接口或加速器)提供 I/O 一致性。CoreLink CCI-550 提供可扩展和可配置的互连,使 SoC 设计人员能够以尽可能小的面积和功耗满足性能目标,并且还增加了可降低整体系统延迟的监听滤波器。

CodingCos的博客 2210

MCP 协议会成为前端 AI 工程的标准接口吗?

MCP(Model Context Protocol)正在成为连接 AI 模型与外部工具、数据源的一层通用协议。本文从 MCP 的核心机制出发,分析它在浏览器与前端工程中的落地边界,讨论它能否成为前端 AI 工程的标准接口,并给出当下更务实的架构选择建议。

m0_62937412的博客 346

逆向分析-SeparationPreview.aip-分色预览-结构分析(一)-x64dbg条件日志打印-命令表达式-PS脚本

从功能上分析,仅显示使用的专色这个功能,并没有触发插件接口。使用X64dbg加载illustrator进程,切换到句柄窗口,在窗口过程中,右键刷新获取界面。在x64dbg中,在UI中可以输入一些条件表达式,能够计算出对应的值,并打印在日志中。常用的,如果非暂停,输出第一个参数。参数二是utf16的指针,utf16@字符串地址,这里的字符串地址为[[ebp-108]]参数一是utf8的,utf8@字符串地址,这里的字符串地址为[ebp-28]从界面上分析,一个颜色列表,及仅显示专色的多选框组成。

插件开发 644

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 598

LangGraph 本地 build 频频翻车,最终在服务器跑通流式对话

先说结论:我本地那个,一次都没成功过。三次,三次,全挂在拉镜像上。而顺得像刚上过油。这就很像我高中那辆自行车:骑着能走,一上锁就坏。那天晚上我盯着终端里那行红字看了很久,想的不是技术方案,想的是——为什么同一个工具,可以一边让我觉得自己很行,一边让我觉得自己不太行。

人工智能AI技术 115

构建基于知识图谱的金融风险关联网络可视化系统

知识图谱是一种用于表示实体及其关系的图形结构,能够将分散的数据组织成易于理解和查询的形式。语义性:通过实体和关系的描述,赋予数据语义。结构化:以图的形式组织数据,便于计算机处理。动态性:支持实时更新,能够反映数据的最新状态。风险关联网络是指将金融风险事件、实体及其关系以图形形式表示的网络。关联性:能够展示风险事件之间的相互影响。动态性:能够实时反映风险变化。可视化:便于金融从业者直观理解风险分布。可视化系统是指通过图形界面展示数据或信息的系统。提供直观的数据显示。帮助用户快速理解复杂数据。

AI天才研究院 1059

海外平台频繁弹验证?从 DNS、WebRTC 到浏览器指纹的环境异常排查清单

在运营多地区海外平台账号时,即使代理节点通畅、TCP 握手成功,仍可能遇到频繁人机验证、地区限制、播放失败等异常。核心结论是:这类问题往往不在网络传输层,而在浏览器环境参数与网络出口之间的逻辑自洽性。本文从 DNS 泄漏、WebRTC 穿透、时区与语言匹配、Canvas/WebGL 指纹、TLS 特征五个维度,给出一份可复现的环境异常排查清单,并对比个人手动配置与工程化环境管理方案的适用边界。适用于跨境运营、多账号运维团队。

P1Browser【p1指纹浏览器】的博客 184

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

信号链电路怎么选运放?奥特四款信号链运放解析【选型参考】

在模拟电路设计中,运放作为信号链的“第一道门槛”,其微小误差往往决定了整个系统的成败。

naNa_1120的博客 191

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 774

流式输出 SSE:实现 AI 对话打字机效果后端开发

摘要解决传统 HTTP 请求在 LLM 长文本生成时导致的客户端长时间阻塞与 TTFT 极高的问题。适用于需为 AI 应用提供打字机效果、优化交互体验的后端开发工程师。读完可获得基于 FastAPI 与 SSE(Server-Sent Events)技术的流式响应实现代码、协议规范及生产环境避坑指南。关键词SSE、流式输出、FastAPI、打字机效果、TTFT、大模型推理背景与问题大模型(LLM)生成完整回复通常耗时数秒至数十秒,传统请求-响应模型导致用户界面长时间无响应,体验极差。

2402_85729970的博客 183

基于 YOLOv8 的森林火灾检测系统(Web 版)

本项目面向林区早期火情识别场景,使用YOLOv8完成火焰(Fire)与烟雾(Smoke)两类目标的检测模型训练,并以FastAPI构建 Web 检测平台,把模型能力封装为可直接登录使用的系统。平台除常规的图片、批量、视频、摄像头检测外,还提供同图多权重对比、数据集浏览与标注核对、模型热切换,以及把训练搬到网页上的能力:可在浏览器配置超参数发起真实训练,训练中在线调整学习率、查看进度与动态曲线,训练完成后下载产物或直接应用到检测。

Michael_Jay的博客 63

身份验证漏洞专题(三):持久登录、密码重置与密码修改中的凭据绑定缺陷

密码登录与双因素认证是身份验证的主干流程,但一个完整的认证体系还依赖三类辅助机制:持久登录("记住我")、密码重置、密码修改。这三类机制的共同特征是:它们同样携带或验证凭据,同样直接决定认证状态的归属,但实现时获得的防护强度往往远低于登录页面本身。攻击者绕不开登录接口时,常常可以从这些辅助入口进入。

2401_85321170的博客 631

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268

Vue 前端开发 AI 对话页面:流式消息渲染、文件上传

关键点是不能手动设置 Content-Type 为 multipart/form-data,必须由浏览器自动生成带有 boundary 的请求头,否则后端无法解析。思路:将对象序列化为 JSON 字符串,作为 FormData 的一个普通字段(如 formData.append(‘payload’, JSON.stringify(data))),后端接收该字段后再反序列化。若上传大文件(>10MB),需实现独立的分片上传接口,在提交对话前先获取文件 id 或 url,再随文本发送引用。移除输入框的禁用态;

2402_85729970的博客 390

在Open-WebUI中提升向量化速度

让Open-WebUI AI聊天的向量化过程不超过10秒,而不是默认的20+分钟……

xyzzklk的博客 576

Writeup 4 0xGame 2021 · command (WEB)

前端限制不可信:永远不要相信前端的任何限制(如disabled按钮、JS 验证等)。攻击者可以直接构造 HTTP 数据包绕过前端校验,所有的安全限制必须在后端实现。命令执行/注入(RCE):Web 应用如果直接调用系统命令且未对输入进行严格过滤,攻击者可以利用;||等符号拼接恶意命令。绕过技巧:在 CTF 中,如果遇到命令执行被过滤,常见的绕过方式包括:${IFS}$IFS$9等。。cat /fla?或cat /fl*。Linux 基础。

hengdonghui的博客 131

使用HTML+CSS+JavaScript实现文件上传弹窗

使用HTML+CSS+JavaScript实现文件上传弹窗

bjzhang75的博客 229

ArkWeb 混合开发的内存清理与桥接陷阱

起初我以为是 H5 内部的定时器没有清理,结果接了 DevEco Studio 的 Profiler 一看,全是 ArkTS 侧的原生对象没有释放。改用 RESIZE 后,键盘弹出只会压缩窗口高度,底部的输入框会自适应滚动到可视区域,页面顶部的元素则岿然不动。综上所述,混合开发绝不是简单的拼接,管好桥接的生命周期,做好跨域兜底,才是稳定运行的前提。如果不去主动干预,它会把你的原生内存吃得连骨头都不剩。在 H5 的输入框打字时,软键盘一弹出来,整个 Web 页面就被顶得飞起,连顶部的原生导航栏都不见了。

2502_91284977的博客 235

热工测点布线改造难题?IDCB 远程 I/O 采集前端简化现场布线

IDCB智能数据采集前端基于Modbus-RTU协议,支持热电偶、热电阻、直流信号多类型混采,单设备多通道接入,减少模块选型压力。双总线冗余设计保障数据连续性,适配锅炉、窑炉等高可靠性工况。采用总线式布线替代点对点接线,大幅减少电缆用量,配合组态软件或LCD面板,实现远程监控与现场调试便捷化。适用于脱硫脱硝、就地监控及系统改造项目,具备抗干扰、隔离保护、掉电存参等特性,有效提升热工测点采集系统的稳定性与运维效率。

wxyzzdh200988的博客 192

Web用例管理:维护步骤、定位器与版本

和。漏掉引用校验的后果是:删掉一个还在被 3 条用例使用的定位器,平台不报错,等到某天跑用例才报「元素找不到」。漏掉版本关联的后果是:上周那条通过的运行记录,这周改了用例之后再打开,已经没法说明当时到底跑的是什么。这篇把整条链路走通并给出可运行代码:用例的三段结构、动作白名单、引用反查、用例版本号、运行快照、版本差异。环境:本机 Windows / Python 3.11.8 / Playwright 1.62.0 / Chromium 151.0.7922.34。测试页面/steps。

weixin_62798930的博客 212
上一篇: 开发案例-通过JS实现一个可拖拽的弹窗卡片
莫问ikun
博客等级 码龄4年 54粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值