【多页文件上传优化】首页快速返回,其余后台多线程异步处理 。涉及技术:springboot+多线程[自定义注解线程池]+MPJBaseMapper+PDFBox

Keysight ADS新手必看:3分钟搞定TDR模拟的保姆级教程(附差分信号设置技巧) 本文为Keysight ADS新手提供TDR模拟的保姆级教程,详细介绍了从基础环境准备到差分信号设置的全流程。通过内置模板调用、待测器件连接和仿真结果解读,帮助用户快速掌握TDR模拟技术,特别包含差分信号配置技巧,提升信号完整性分析效率。 阅读详情

一、项目目标

我们想实现的功能是:

  1. 将 PDF 文件的每一页转换成 PNG 图片。

  2. 返回 第一页图片 给前端(同步处理)。

  3. 其余页面在后台异步生成,不阻塞前端。

  4. 对异步失败的页面进行 最多 3 次重试。

  5. 生成的图片上传到服务器,并在数据库记录。

提升用户体验的核心点:同步处理第一页 → 异步处理剩余页 → 异常重试 → 数据库存储。


二、整体流程图

用户上传 PDF 文件
        │
        ▼
同步生成第一页图片 → 返回前端
        │
        ▼
异步处理剩余页(2~N) 
        │
        ├─ 渲染 PDF → 编码 PNG → 上传服务器 → 保存数据库
        │
        └─ 出现异常 → retryProcessPage() 重试最多3次
        │
        ▼
用户查看合同详情,循环拉取图片展示在前端
        │
        ├─ 图片少(<=20) → JOIN 查询
        └─ 图片多 (>20) → 批量 IN 查询
        │
        ▼
返回封装好的对象

 

三、关键类和方法

1. createPdfToImgAsyncOnlyFirst 方法

作用:负责处理 PDF 文件,将第一页同步生成,剩余页异步处理。

public String createPdfToImgAsyncOnlyFirst(String filePath, Integer contractId, ContractFile contractFile) throws Exception {
        int pageCount;
        try (PDDocument document = PDDocument.load(new File(filePath))) {
            pageCount = document.getNumberOfPages();
        }

        // 👉 异步处理剩余页(从第 2 页开始)
        for (int i = 1; i < pageCount; i++) {
            int page = i;
            CompletableFuture.runAsync(() -> {
                try {
                    String url = pdfPageProcessor.processPageForHttps(filePath, page).get();
                    copyFileClient.present(url);

                    String[] split = url.split("/");
                    String objectName = split.length == 3 ? split[2] : null;

                    ContractFileImg img = new ContractFileImg();
                    img.setContractId(contractId);
                    img.setFileId(contractFile.getId());
                    img.setIdx(page + 1); // 页码从 1 开始
                    img.setUrl(url);
                    img.setObjectName(objectName);

                    contractFileImgMapper.insert(img);
                } catch (Exception e) {
                    log.error("异步生成第 {} 页图片失败: {}", page + 1, e.getMessage(), e);
                    // 可调用重试方法或者加入消息队列
                    retryProcessPage(filePath, page, contractId, contractFile);
                }
            });
        }

        // 👉 同步处理第 1 页
        String firstImageUrl = pdfPageProcessor.processPageForHttps(filePath, 0).get();
        copyFileClient.present(firstImageUrl);

        String[] split = firstImageUrl.split("/");
        String objectName = split.length == 3 ? split[2] : null;

        // ✅ 更新文件页数
        contractFile.setPage(pageCount);
        contractFileMapper.insert(contractFile);

        ContractFileImg img = new ContractFileImg();
        img.setContractId(contractId);
        img.setFileId(contractFile.getId());
        img.setIdx(1);
        img.setUrl(firstImageUrl);
        img.setObjectName(objectName);
        img.setCreateTime(new Date());
        contractFileImgMapper.insert(img);


        return firstImageUrl;
    }

2. processPageForHttps 方法

作用:将 PDF 的某一页渲染成图片、上传服务器并返回访问 URL。

private void retryProcessPage(String filePath, int page, Integer contractId, ContractFile contractFile) {
    int retries = 3;
    while (retries > 0) {
        try {
            String url = pdfPageProcessor.processPageForHttps(filePath, page).get();
            copyFileClient.present(url);
            // 可以插入数据库逻辑
            break;
        } catch (Exception e) {
            retries--;
            log.warn("重试第 {} 页失败,还剩 {} 次", page + 1, retries);
            if (retries == 0) {
                log.error("第 {} 页多次重试失败,任务终止", page + 1);
            }
        }
    }
}

小结:

  • 失败会重试最多 3 次。

  • 避免偶尔网络/IO 问题导致整个任务失败。

  • 日志详细记录,方便排查问题。

四、合同文件查询核心方法

根据合同 ID 自动选择 JOIN 或 批量 IN 查询:

public ContractVo findContractFile(@PathVariable Integer contractId) {
    long imgCount = contractFileImgMapper.selectCount(
        Wrappers.<ContractFileImg>lambdaQuery().eq(ContractFileImg::getContractId, contractId)
    );
    if (imgCount <= 20) {
        return findContractFileJoin(contractId);
    } else {
        return findContractFileBatchIn(contractId);
    }
}

// JOIN 查询模式
private ContractVo findContractFileJoin(Integer contractId) {
    List<ContractFile> contractFiles = contractFileMapper.selectJoinList(
        ContractFile.class,
        MPJWrappers.<ContractFile>lambdaJoin()
            .selectAll(ContractFile.class)
            .selectAssociation(ContractFileImg.class, ContractFile::getContractFileImgs)
            .leftJoin(ContractFileImg.class, ContractFileImg::getFileId, ContractFile::getId)
            .eq(ContractFile::getContractId, contractId)
    );
    if (contractFiles.isEmpty()) return new ContractVo();
    contractFiles.forEach(f -> f.setCertificatePdf(null));
    ContractVo vo = new ContractVo();
    vo.setContractFiles(contractFiles);
    return vo;
}

// 批量 IN 查询模式
private ContractVo findContractFileBatchIn(Integer contractId) {
    List<ContractFile> contractFiles = contractFileMapper.selectList(
        Wrappers.<ContractFile>lambdaQuery()
            .select(ContractFile::getId, ContractFile::getContractId, ContractFile::getFileUrl,
                    ContractFile::getFileName, ContractFile::getPage, ContractFile::getIdx,
                    ContractFile::getCreateTime, ContractFile::getFileSize, ContractFile::getOriginalName)
            .eq(ContractFile::getContractId, contractId)
    );
    if (contractFiles.isEmpty()) return new ContractVo();

    List<Integer> fileIds = contractFiles.stream().map(ContractFile::getId).collect(Collectors.toList());
    List<ContractFileImg> contractFileImgs = contractFileImgMapper.selectList(
        Wrappers.<ContractFileImg>lambdaQuery().in(ContractFileImg::getFileId, fileIds)
    );

    Map<Integer, List<ContractFileImg>> imgMap = contractFileImgs.stream()
        .collect(Collectors.groupingBy(ContractFileImg::getFileId));

    for (ContractFile contractFile : contractFiles) {
        contractFile.setCertificatePdf(null);
        contractFile.setContractFileImgs(imgMap.getOrDefault(contractFile.getId(), Collections.emptyList()));
    }

    ContractVo vo = new ContractVo();
    vo.setContractFiles(contractFiles);
    return vo;
}


 

五、重点知识点

  1. 异步处理

    • 使用 CompletableFuture.runAsync() 或 @Async 注解。

    • 避免阻塞主线程,提高性能。

  2. PDF 渲染

    • 使用 PDFBox 的 PDFRenderer 渲染每一页。

    • 可以控制 DPI(每英寸点数),影响图片清晰度。

  3. 图片上传

    • 将 BufferedImage 编码成 PNG。

    • 上传到服务器并返回 URL。

  4. 重试机制

    • 异步失败后调用 retryProcessPage。

    • 最多尝试 3 次,失败记录日志。

  5. 数据库存储

    • 每页图片单独记录表 ContractFileImg。

    • 文件总页数记录在 ContractFile 表。

六、总结

  • 第一页同步返回 → 用户立刻可见。

  • 剩余页异步生成 → 后台处理,提高效率。

  • 异常重试 → 确保 PDF 每页都能成功生成。

  • 日志记录 → 可追踪每页处理情况。

  • 数据库记录 → 前端和后台可查询每页图片。

从用户的角度来看,这套 PDF 转图片的流程设计有几个明显优势:

  1. 快速看到第一页

    • 用户上传 PDF 后,页面几乎立即显示第一页图片。

    • 用户无需等待整个 PDF 完全生成,体验流畅。

  2. 后台静默处理剩余页

    • 剩余页在后台异步生成,用户可以继续操作其他功能。

    • 用户不会感到卡顿或页面长时间“加载中”。

  3. 异常自动重试

    • 如果后台生成某页失败,系统会自动重试最多 3 次。

    • 用户几乎感受不到异常,保证大部分情况下每页都能成功生成。

  4. 图片 URL 持久可用

    • 所有生成的图片上传到服务器并存储数据库。

    • 用户刷新页面或再次访问时可以快速查看,不必重复生成。

  5. 日志和异常可追踪

    • 开发者后台有详细日志,即便出现问题,也能快速排查。

    • 用户体验稳定,不会因为偶尔的网络或 IO 错误而失败。

总结一句话:

用户上传 PDF 后,第一页即刻可见,剩余页面在后台悄悄生成,体验流畅且稳定,即使遇到小问题也不影响使用。 前端根据接口返回的图片数量和文件总页数比对,未完全加载则增加一个占位提示框,然后循环拉取接口知道数据全部加载完毕渲染到前端页面。(未采用单个文件占位拉取数据主要原因是太多文件会造成多次调用接口增加服务器压力)

深入解析Lora模块的工作原理与应用场景 本文深入解析了Lora模块的工作原理与应用场景。Lora模块作为物联网领域的核心无线通信组件,凭借其独特的扩频调制与半双工通信技术,实现了远距离、低功耗的数据传输。文章详细拆解了其技术内核,包括空中唤醒等低功耗奥秘,并提供了地址、信道、空中速率等关键参数的实战配置指南。最后,探讨了Lora模块在智能家居、智慧农业、城市监测等广域物联网场景中的具体应用,为开发者提供了从理论到实践的完整参考。 阅读详情

相关推荐

【ENVI初学】查看影像空间分辨率及重采样

例如,如果线段长度为900米,对应的像素数量为30个,那么影像的空间分辨率为30米。通过计算长度与像素数量的比值,即可得到影像的空间分辨率。,在弹出的对话框中,输入重采样后输出文件的xy分辨率大小。在测量结果窗口中,可以看到该线段的长度以及角度。在影像上点击并拖动鼠标,绘制一条直线段。工具,选择要重采样的影像后点击ok。,避免了插值过程中光谱信息的改变。:最近邻插值法通过选择原始影像中。在ENVI中打开影像后右键选择。指示了每个像素的地理跨度(聚合为一个新像素,通常通过。方法一:查看影像的元数据。

weixin_41619112的博客 5571

Java pdfbox pdf转成base64数组

maven <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId>

时越的博客 976

局部,全局(外部),static等变量详解

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。 变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block sc...

归根结底不优秀的博客 1322

springboot生成PDF文件返回给前台

1制作好自己的pdf模版,我这里是通过wps把word转换成pdf文件 2下载Adobe Acrobat DC工具来制作pdf的模板

weixin_37999518的博客 5113

别再为淘宝滑块发愁了!一个Python脚本自动获取x5sec cookie的保姆级教程

本文提供了一套完整的Python自动化解决方案,帮助开发者轻松应对淘宝滑块验证码问题。通过模拟浏览器行为、精准识别滑块缺口位置和生成拟人化移动轨迹,脚本能够自动获取关键的x5sec cookie,显著提升爬虫效率。教程涵盖环境配置、验证机制分析、代码实现及反检测策略,是解决淘宝滑块验证的实用指南。

weixin_30300225的博客 574

100 道大数据开发技术原理与实战面试宝典(必过答案详细解析)I

在数字化浪潮席卷全球的今天,大数据开发工程师已成为企业数字化转型的核心力量。无论是互联网巨头的用户行为分析,还是金融机构的风险控制,亦或是智慧城市的数据中枢,都离不开大数据技术的支撑。然而,面对BAT等头部企业严格的面试要求,候选人不仅需要掌握扎实的理论基础,更需具备将技术落地的实战能力。本文基于历年高频面试题与企业真实场景需求,梳理100道必考题目,涵盖基础概念、框架原理、算法设计、性能优化等核心领域,助你构建完整的知识体系,从容应对面试挑战。

AI天才研究院 1386

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 299

python点云可视化

Python三种点云可视化方案:mayavi、matplotlib、CloudCompare。

叶子的博客 1万+

C#使用opencv和Yolo模型识别车牌号

本文基于OpenCVSharp与OnnxRuntime,结合YoloV8n-pose_plate模型(检测车牌位置)和OCR模型(识别车牌文字),实现高效车牌识别。通过预处理、目标检测、NMS筛选及文字识别流程,最终输出车牌框位置与识别文本。代码封装良好,支持自定义路径与置信度阈值,具备实际应用价值。

lweiyue的专栏 172

《YOLOv8:从入门到实战》专栏介绍 & 专栏目录

本专栏涵盖了丰富的YOLOv8算法从入门到实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!🌈🌈🌈

小哥谈 6489

在 SAP S/4HANA 里把 OData Client Proxy 用顺手,借助 Service Consumption Model 2.0 提前打通远程 OData 调用

摘要:本文探讨了在SAP S/4HANA集成开发中调用外部OData服务的解决方案。传统ABAP代码直接调用方式存在诸多不便,而OData Client Proxy提供了更稳定的途径。文章详细介绍了如何通过Service Consumption Model 2.0在SAP BTP生成模型类,并将其移植到SAP S/4HANA进行适配改造,最终注册为可用的OData Proxy Client。该方法适用于较新版本的SAP S/4HANA系统,通过源码替换实现模型转换,为系统集成提供了高效的类型安全调用方案。

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

C# NAFNet 图片去模糊

基于NAFNet与ONNX Runtime的C# WinForms图片去模糊工具,支持DirectML GPU加速与CPU回退,实现一键去模糊、大图分块处理、并排对比及拖拽打开。具备高DPI适配、自绘圆角界面、命令行批量处理等功能,适用于Windows 10/11系统,可灵活配置模型路径与分块大小,解决显存不足与边缘接缝问题。

hixiong123的博客 259

Node-RED系列(二九):使用slider与chart节点来实现双折线时间序列图

今天教使用dashboard的chart组件和slider组件来是实现一个双线的折线图。效果如下 拖动顶部的电量和水量,低下的图表会实时显示时间和值之所以做这个模拟案例,是将教 大家使用chart节点和slider节点先说一下slider节点,该节点是一个滑块节点,可以接受上一节点的 msg.payload,作为滑块的值, slider必须设置最大值和最小值。且不能动态设置。 此外当用户拖动slider滑块,改变值时,该节点会向下传递当前值 以属性payload装载。在说一下chart节点,该节点可以用于

知无涯 4968

使用C#代码提取、修改或删除 Excel 中的超链接

通过 C# 和 VB.NET,可以方便地管理 Excel 文件中的超链接,包括提取、修改和删除等操作。提取超链接: 获取工作表中的超链接集合,读取每个超链接的地址和类型,并将相关信息保存到文本文件中。修改超链接: 更新超链接的显示文本和目标地址,确保链接信息准确。删除超链接: 移除指定的超链接,同时可以选择保留单元格中的原有显示文本,或清除单元格的全部内容。这些操作可以帮助开发人员更高效地管理 Excel 文档中的链接信息,减少重复的手动操作,也便于在数据迁移、文档维护和自动化报表处理等场景中使用。

2501_93070778的博客 233

efm32 入门.pdf

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

深度学习工具包 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")

C#: 控件不支持透明的背景色

把透明度固定为255。

海天鹰 43

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

week11-词云图

核心逻辑:词频越高,文字字号越大;适合快速看文本高频关键词(影评、评论、摘要文本非常适配 CommentInfo.csv)

m0_66244637的博客 139

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

基于 OPC UA 的半导体工厂化学气体传输 SCADA 监控系统:架构设计与 C# MVVM 实现

本文提出一套面向半导体化学气体传输的可演进SCADA系统,基于OPCUA统一信息模型与C#+WPF+MVVM技术栈,实现从气源到机台的全链路实时监控、安全联锁与追溯。通过资产树建模、分层解耦架构与标准对齐(SEMI E30/E95/S2),确保系统可扩展、可维护、可审计,满足高安全、高可靠要求,支持快速落地与持续演进。

ponygame的博客 335

使用C#代码在 Word 中设置行距和段落间距

通过 C# 代码,可以灵活调整 Word 文档中的行间距和段落间距,从而改善文档的整体排版效果。设置段前间距: 使用属性调整段落前方的空白距离。设置段后间距: 使用属性调整段落后方的空白距离。设置行间距: 使用属性控制同一段落中各行文本之间的距离。合理设置这些间距,不仅可以提高 Word 文档的可读性,还能优化页面空间利用率。这种方式适用于批量格式调整、自动化文档生成以及统一文档排版等场景。

2501_93070778的博客 181

04 · Diagram —— 示意图与接线图

CCDiagramDiagramDiagrams把一组"节点 + 连线"画出来:机车各柜体之间的连线关系、系统拓扑、信号流向。节点是矩形框(可带标题),连线可以带箭头。

hdjsjb的博客 450

MIGraphX CSharp API 发布:让 C# 接入 AMD GPU 原生推理

MIGraphX CSharp API 0.0.2 已发布,为 .NET 开发者提供 AMD GPU 上的 ONNX 模型推理能力。支持 YOLOv26、PaddleOCR、PP-Structure 与 CLIP 四类场景,实现模型解析、动态输入、GPU 编译与张量管理。通过类型化接口与 IDisposable 资源管控,兼容 .NET 5–10 及旧版框架,可集成 HIP 实现端到端 GPU 推理。配套案例覆盖视觉检测、文档处理与图文检索,助力 C# 项目高效接入 AMD ROCm 生态。

grape_yan的博客 357

C# 14 实战三连:field 关键字、extension 成员与 null 条件赋值

NET 10 带来的 C# 14 不是一场 syntax earthquake,但里面藏着三件日常写码频率极高的改进。这篇不讲新闻稿,只讲用起来什么感觉、编译器在背后做了什么、以及哪里会静默踩坑。

dotnethello的博客 186

C#: (float) RegistryKey.GetValue() 报错 System.InvalidCastException: 指定的转换无效

RegistryKey.GetValue() 类型是 object,首先要转为 string,再 float.Parse(string)。

海天鹰 35

OnlyOffice+poi-tl:把 Word 模板变成可填写、可生成的合同系统

合同表单已经填过主体、金额和日期,为什么还要在Word里再改一遍?以RuoYi Office的真实教学案例,拆解七个字段从模板配置到正文生成、在线编辑和回存的过程,说明poi-tl与OnlyOffice如何分工,以及字段取值、文件缓存和模板版本中的关键设计。

RuoYi Office是基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue3 + Vben Admin + Uniapp 构建的中小企业全业务办公一体化平台,涵盖OA 协同 493

C# 委托与事件

在.NET Core中,委托是实现灵活、低耦合架构的核心机制。它作为类型安全的函数指针,支持方法的传递与调用,广泛应用于事件驱动、回调、策略模式等场景。通过委托可实现模块解耦,提升代码可维护性;多播委托支持多个方法链式执行,便于构建观察者模式。事件是对委托的封装,通过event关键字限制外部直接操作,保障通知机制的安全性。合理使用委托与事件,能有效降低系统耦合度,增强扩展性,是构建高效、可维护应用的关键基础。

cccloveforever的博客 593

企业经营异常查询API:是否还在经营异常名录里,看两个条件

企业经营异常查询API(enterprise.abnormal)通过统一社会信用代码或企业全称,实时获取经营异常记录。判断企业是否仍在异常名录的条件为:disabled = 0 且 outDate 为空。接口按次计费,0.2元/次,无记录不收费。适用于供应商准入前低成本筛选,尤其可识别未公示年报等高风险主体,提升尽调效率。

小for学习栏 181

C# 编译器前端深入(二):词法、语法、红绿树与错误恢复

章节编号沿用原单篇文档(如 §3.6 在第二篇、§7.3 在第三篇);roslyn-src本篇承接第一篇:如果还没读过第 0–2 章(概念最小集、csc→语法树的数据流),建议先读。

大坡3D软件开发 154
上一篇: 【注解跳过机制】Spring Boot 登录权限校验拦截器教程
下一篇: 【MPJBaseMapper】更优雅写SQL的开源工具
alan0721
博客等级 码龄10年 29粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值