2024年11月

前言

深度学习技术的不断发展,神经网络在各个领域得到了广泛应用。为了满足 .NET 开发的需求,推荐一款使用 C# 编写的神经网络计算图框架。

框架的使用方法接近 PyTorch,提供了丰富的示例和详细的文档,帮助大家快速上手。

框架介绍

项目完全使用 C# 编写,提供了一个透明的神经网络计算图框架。用户可以查看和理解框架内部的任何实现细节。

框架支持多种网络结构,包括卷积神经网络(CNN)、反向传播网络(BP)、全连接网络(FCN)、长短期记忆网络(LSTM)、卷积长短期记忆网络(ConvLSTM)和门控循环单元网络(GRU)。

每个示例都附带了所需的数据内容,确保用户能够快速上手并进行实验。

使用说明

  • 损失函数支持
    :MESLOSS、交叉熵损失 (Cross-Entropy)
  • 激活函数支持
    :ReLU、Tanh、Sigmoid、Softmax
  • 数据类型支持
    :二维数据 float[][] 和四维数据 float[][][,]
  • 池化支持
    :平均池化、最大池化
  • 其他支持
    :卷积层 (ConvLayer)、二维卷积层 (Conv2DLayer)、乘法层 (MulLayer)、转置卷积层 (ConvTranspose2DLayer)

部分代码示例

//声明两个ConvLayer 和一个激活函数SigmodLayer
ConvLayer cl1 = new ConvLayer(13, 5, true);

SigmodLayer sl
= newSigmodLayer();float lr = 0.5f;
ConvLayer cl2
= new ConvLayer(5, 1, true);int i = 0,a=0;while (a < 5000)
{
dynamic ff =cl1.Forward(x);
ff
=sl.Forward(ff);
ff
=cl2.Forward(ff);//计算误差 MSELoss mloss = newMSELoss();var loss =mloss.Forward(ff, y);

Console.WriteLine(
"误差:" +loss);dynamic grid =mloss.Backward();//反传播w2 dynamic w22 =cl2.backweight(grid);//反传播W1 dynamic grid1 =cl2.backward(grid);
grid1
=sl.Backward(grid1);dynamic w11 =cl1.backweight(grid1);//更新参数 cl2.weights =Matrix.MatrixSub(cl2.weights, Matrix.multiply(w22.grid, lr));
cl2.basicData
=Matrix.MatrixSub(cl2.basicData, Matrix.multiply(w22.basic, lr));

cl1.weights
=Matrix.MatrixSub(cl1.weights, Matrix.multiply(w11.grid, lr));
cl1.basicData
=Matrix.MatrixSub(cl1.basicData, Matrix.multiply(w11.basic, lr));
i
++;

a
++;
}

BP网络运行图

CNN网络95%识别成功率

lstm网络预测PM2.5空气质量

项目地址

Gitee:
https://gitee.com/UDCS/WeaveAI

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号
[DotNet技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!

1、TLS 1.0 已启用

描述:

此 Web 服务器支持通过 TLS 1.0 加密。TLS 1.0 不被认为是“强密码术”。根据 PCI 数据安全标准 3.2(.1) 的定义和要求,在保护从网站往返的敏感信息时,TLS 1.0 并不被认为是 "强加密"。根据 PCI,"2018 年 6 月 30 日是禁用 SSL/早前 TLS 并实施更安全的加密协议 TLS 1.1 或更高版本(强烈建议 TLS v1.2) 的最后期限,以便满足 PCI 数据安全标准 (PCI DSS),保障支付数据的安全。

影响:

攻击者可能能够利用此问题实施中间人攻击,以及解密受影响的服务与客户端之间的通信。

推荐 :

建议禁用 TLS 1.0 并替换为 TLS 1.2 或更高版本。

解决方法:

Nginx 配置 TLSv1.2 或 TLSv1.3

首先查看openssl版本:

 openssl version

 # 输出
 OpenSSL 1.0.2k-fips  26 Jan 2017
 
 #Linux Centos7.9默认为以上版本, OpenSSL 1.1.1 及以上版本才支持TLS v1.3。

检测是否支持TLS1.2

openssl s_client -connect xxxx.xxx.com.cn:443 -tls1_2

Nginx配置:

ssl_protocols TLSv1.2; 
# 这里只使用1.2即可

# ssl_protocols TLSv1.2 TLSv1.3;

2、Nginx访问静态页面显示目录列表

描述:

目录列表是一个 Web 服务器功能,在特定网站目录中无索引文件时显示目录内容。Web 服务器上保 持此功能开启会导致信息泄露,因此相当危险。

影响:

用户可以从受影响的目录查看所有文件的列表,这可能会暴露敏感信息。

例如:

解决:

Nginx中默认不会开启目录浏览功能,若发现当前已开启该功能,可以编辑
nginx.conf
文件,删除如下两行:

autoindex on;
autoindex_exact_size on;

重启Nginx。

3、未实施 HTTP 严格传输安全 (HSTS)

描述:

HTTP 严格传输安全 (HSTS) 规定,浏览器只能使用 HTTPS 访问网站。检测到您的 Web 应用程序未实 施 HTTP 严格传输安全 (HSTS),因为响应中缺少严格传输安全报头。

影响:

HSTS 可以用于预防和/或缓解某些类型的中间人 (MitM) 攻击

解决:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
add_header Strict-Transport-Security  'max-age=63072000; includeSubDomains; preload';
#或者
add_header X-Frame-Options SAMEORIGIN always;
add_header Strict-Transport-Security  'max-age=63072000; includeSubDomains; preload' always;


# max-age=31536000 指定了 HSTS 策略的有效期,这里是一年。您可以根据需求调整有效期。
# includeSubDomains 表示 HSTS 策略将适用于所有的子域名。

4、未实施内容安全策略 (CSP)

描述:

内容安全策略 (CSP) 增加了额外的安全层,有助于检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击。 内容安全策略 (CSP) 可通过添加 Content-Security-Policy 报头实施。此报头的值是一个字符串,其中 13 包含描述内容安全策略的策略指令。要实施 CSP,您应该为站点使用的所有资源类型定义允许的来源列表。例如,如果您有一个简单的站点,需要从 CDN 加载本地托管和 jQuery 库中的脚本、样式表和 图像,则 CSP 报头可能如下所示: Content-Security-Policy: default-src 'self'; script-src 'self'
https://code.jquery.com
; 检测到您的 Web 应用程序未实施内容安全策略 (CSP),因为响应中缺少 CSP 报头。建议在您的 Web 应 用程序中实施内容安全策略 (CSP)。

影响:

CSP 可用于预防和/或缓解涉及内容/代码注入的攻击,例如跨站脚本/XSS 攻击、需要嵌入恶意资源的 攻击、涉及恶意使用 iframe 的攻击(例如点击劫持攻击)等。

推荐 :

建议在您的 Web 应用程序中实施内容安全策略 (CSP)。配置内容安全策略涉及添加 Content-SecurityPolicy HTTP 报头到 Web 页面并为其赋值,以控制允许用户代理为该页面加载的资源。

解决:

在nginx配置文件中添加请求头
Content-Security-Policy

# 添加 CSP 头部
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";

default-src 'self': 指定默认允许加载资源的来源为当前域名('self'),这是一个基本的设置,确保只有当前网站的资源可以加载。
script-src 'self' 'unsafe-inline' 'unsafe-eval': 指定允许加载 JavaScript 的来源为当前域名,并允许内联脚本和使用 eval() 等不安全的 JavaScript 执行方式。注意,'unsafe-inline' 和 'unsafe-eval' 存在安全风险,建议尽量避免使用,而是优先考虑使用严格的 CSP 策略,如使用外部脚本加载方式。
style-src 'self' 'unsafe-inline': 指定允许加载样式表的来源为当前域名,并允许内联样式。同样地,'unsafe-inline' 也应该尽量避免使用,可以通过外部 CSS 文件加载来提高安全性。

# 根据以上信息,添加以下代码
# 添加 CSP 头部
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://xxx.xxxx.com.cn; style-src 'self' https://xxx.xxx.com.cn cdn.jsdelivr.net ; img-src 'self' https://xxx.xxx.com.cn data:; font-src 'self' data: https://xxx.com cdn.jsdelivr.net;";

#多个地址以空格后面拼接即可


title: Nuxt.js 应用中的 vite:extend 事件钩子详解
date: 2024/11/11
updated: 2024/11/11
author:
cmdragon

excerpt:
vite:extend 钩子允许开发者在 Vite 项目中扩展默认开发和构建配置。这使得开发者能够根据特定需求自定义 Vite 的行为,增强开发体验。

categories:

  • 前端开发

tags:

  • Nuxt
  • Vite
  • 钩子
  • 插件
  • 构建
  • 开发
  • 自定义


image
image

扫描
二维码
关注或者微信搜一搜:
编程智域 前端至全栈交流与成长

目录

  1. 概述
  2. vite:extend
    钩子的详细说明
      1. 钩子的定义与作用
      1. 调用时机
      1. 参数说明
  3. 具体使用示例
      1. 示例:基本用法
      1. 示例:添加插件
  4. 应用场景
      1. 自定义 Vite 插件
      1. 调整构建配置
      1. 动态修改开发服务器设置
  5. 注意事项
      1. 效能影响
      1. 版本兼容性
  6. 总结

1. 概述

vite:extend
钩子允许开发者在 Vite 项目中扩展默认开发和构建配置。这使得开发者能够根据特定需求自定义 Vite 的行为,增强开发体验。

2.
vite:extend
钩子的详细说明

2.1 钩子的定义与作用

vite:extend
钩子用于扩展 Vite 的上下文配置。通过这个钩子,开发者可以增加额外的配置、插件或其他需要的功能来满足项目需求。

2.2 调用时机

vite:extend
钩子通常是在 Vite 特定的配置阶段调用,这通常在 Vite 的插件阶段和构建阶段之间。这确保了所有附加的配置在构建或启动开发服务器之前生效。

2.3 参数说明

这个钩子通常接收一个
viteBuildContext
对象,该对象包含 Vite 的默认上下文和配置,允许开发者在其基础上进行修改。

3. 具体使用示例

3.1 示例:基本用法

// plugins/viteExtend.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    // 示例:改变 root 目录
    viteBuildContext.config.root = 'src';
  });
});

在这个示例中,我们修改了
viteBuildContext
中的根目录配置,以使其指向
src
目录。

3.2 示例:添加插件

// plugins/viteAddPlugin.js
import { defineConfig } from 'vite';
import somePlugin from 'some-vite-plugin';

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    viteBuildContext.config.plugins.push(somePlugin());
  });
});

在这个示例中,我们向 Vite 的配置中添加了一个新的插件
somePlugin

4. 应用场景

4.1 自定义 Vite 插件

使用
vite:extend
钩子,可以向 Vite 添加自定义插件,例如针对特定功能进行处理。

// plugins/customPlugin.js
import { defineConfig } from 'vite';

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    viteBuildContext.config.plugins.push({
      name: 'my-custom-plugin',
      transform(code, id) {
        // 插件逻辑
        return code.replace(/console.log/g, 'console.warn');
      },
    });
  });
});

4.2 调整构建配置

根据不同的环境,调整 Vite 的构建配置,例如设置不同的输出目录。

// plugins/viteAdjustBuild.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    if (process.env.NODE_ENV === 'production') {
      viteBuildContext.config.build.outDir = 'dist/prod';
    } else {
      viteBuildContext.config.build.outDir = 'dist/dev';
    }
  });
});

4.3 动态修改开发服务器设置

你可以动态调整开发服务器的设置,如端口或代理。

// plugins/viteModifyServer.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    viteBuildContext.config.server.port = 3001;

    viteBuildContext.config.server.proxy = {
      '/api': {
        target: 'http://localhost:4000',
        changeOrigin: true,
      },
    };
  });
});

5. 注意事项

5.1 效能影响

扩展 Vite 的上下文可能会影响构建和启动性能,因此应尽量避免不必要的配置和插件。

5.2 版本兼容性

确保使用的 Vite 插件与当前 Vite 版本兼容,以避免出现不可预测的错误。

6. 总结

通过使用
vite:extend
钩子,开发者可以灵活地扩展 Vite 的默认上下文,以满足特定的项目需求。这种自定义能力不仅提升了开发效率,还可以为项目的特殊需求提供更强的支持。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:
编程智域 前端至全栈交流与成长
,阅读完整的文章:
Nuxt.js 应用中的 vite:extend 事件钩子详解 | cmdragon's Blog

往期文章归档:

〇、js 的数值计算存在结果不精确的情况

最近接触财务相关系统,页面上会有一些简单的计算,就发现其实是非常简单的计算,但 js 计算出来的结果却不是预期值,可能带上一大串 0 或 9,导致计算结果错误,本文来简单汇总下,以及如何处理来避免这个问题。

先看看都会有哪些不精确的情况。

// 【加减乘除 四种基础运算】
// 精度问题其实也不是全都会有,比如以下测试:
let num1 = 0.1;
let num2 = 0.1;
let result = num1 + num2;
console.log("0.1+0.1 = " + result);
// 0.1+0.1 = 0.2
// 0.1+0.2 = 0.30000000000000004
// 1.1*1.2 = 1.32
// 1.1*1.1 = 1.2100000000000002
// 其实四种基础运算都会出现类似情况,这里就简单列两类

// 【数值比较】
console.log("'0.1+0.2 = 0.3' 比较结果:", 0.1 + 0.2==0.3);
// '0.1+0.2 = 0.3' 比较结果: false

一、原因简介

因为计算机内部的信息都是由二进制方式表示的,即 0 和 1 组成的各种编码,但由于
某些浮点数
没办法用二进制准确的表示出来,也就带来了一系列精度问题。当然这也不是 js 独有的问题。

推荐一个文章吧,有兴趣可以深究下:
https://zhuanlan.zhihu.com/p/33333351
,讲的应该是很详细,但有些复杂博主看了一遍也不是太了解。

下面把大概的流程梳理下。

  • 将小数转成二进制数

小数部分乘 2 取整数部分,若小数不为 0 则继续乘 2,直至小数部分为 0。然后将取出的整数位正序排列。整数部分就除以 2。

0.1 * 2 = 0.2   // 取0
0.2 * 2 = 0.4   // 取0
0.4 * 2 = 0.8   // 取0
0.8 * 2 = 1.6   // 取1
0.6 * 2 = 1.2   // 取1
0.2 * 2 = 0.4   // 取0
......

0.1 的二进制表示是:0.000110011......0011.....(0011无限循环)
0.2 的二进制表示是:0.00110011......0011......(0011无限循环)

虽然是无限长度,但是还是得有一个标准的显示方式,那就是 IEEE 754 标准。

  • IEEE 754 标准方法表示数值

IEEE 754 标准是 IEEE 二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号。IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换、算术格式以及方法。

详细的标识法,就跳过了,直接来看结果。

js 只有一种数字类型 number,而 number 使用的是
IEEE 754 双精度浮点格式
。最高位是一位符号位(0正 1负),后面的 11 位是指数,剩下的 52 位为尾数(有效数字)。

// js 中 0.1 的二进制存储格式为:
// 符号位用逗号分隔,指数位用分号分隔
0.1:0,01111111011;1001100110011001100110011001100110011001100110011010
0.2:0,01111111100;1001100110011001100110011001100110011001100110011010
  • 计算两个二进制数的和
// 二进制形式的结果
sum = 0.010011001100110011001100110011001100110011001100110100
// 最后再转成十进制
sum = 2^2 + 2^5 + 2^6 + ... + 2^52 = 0.30000000000000004440892098500626
// 近似后的结果:0.30000000000000004

详情可参考: https://zhuanlan.zhihu.com/p/33333351

二、解决方式

2.1 Math.Round() 函数,先乘后除 10 的 n 次方

根据需求的精度,
先乘以
10 的 n 次方,通过 Math.Round() 函数
取整
后,
再除以
10 的 n 次方。

function numToString(num){
    let factor = Math.pow(10, 4); // 最多保留 4 位小数
    // 通过乘以一个因子(例如 10 的 4 次方),然后四舍五入
    // 最后,再除以相同的因子,可以实现对特定小数位数的精确控制
    let roundedNum = Math.round(num * factor) / factor;
    return roundedNum.toString();
}

关于 Math.Round() 四舍五入的规则,可以参考以下测试结果:

console.log("Math.round(4.2)     ", Math.round(4.2)  );
console.log("Math.round(4.5)     ", Math.round(4.5)  );
console.log("Math.round(4.7)     ", Math.round(4.7)  );
console.log("Math.round(-4.2)    ", Math.round(-4.2) );
console.log("Math.round(-4.5)    ", Math.round(-4.5) );
console.log("Math.round(-4.7)    ", Math.round(-4.7) );
console.log("Math.round(1.5)     ", Math.round(1.5)  );
console.log("Math.round(2.5)     ", Math.round(2.5)  );
console.log("Math.round(3.5)     ", Math.round(3.5)  );
console.log("Math.round(-1.5)    ", Math.round(-1.5) );
console.log("Math.round(-2.5)    ", Math.round(-2.5) );
console.log("Math.round(-3.5)    ", Math.round(-3.5) );

可以看出,
正数的小数位为 5 时,进 1;负数小数位为 5 时,舍弃

2.2 toFixed() 方法,直接取小数点后固定位数

此方法就是直接
指定要保留的几位小数,若小数位较少,就会以 0 补全

toFixed() 的四舍五入规则,并非严格的根据要保留小数位后边的小数来判断。

若作为判断的小数位为 5,且后边没有大于 0 的数,则舍入到最近的奇数;若 5 后边有非零的值,就直接进 1。

例如,4.55 保留 1 位小数,就是 4.5,但 4.5500001 的结果就是 4.6。

例如,-4.55 保留 1 位小数,就是 -4.5,但 -4.5500001 的结果就是 -4.6。

如下示例,供参考:

let num = 4.22;
console.log("num.toFixed(1):4.22)     ", num.toFixed(1));
num = 4.55;
console.log("num.toFixed(1):4.55)     ", num.toFixed(1));
num = 4.551;
console.log("num.toFixed(1):4.551)    ", num.toFixed(1));
num = 4.65;
console.log("num.toFixed(1):4.65)     ", num.toFixed(1));
num = 4.77;
console.log("num.toFixed(1):4.77)     ", num.toFixed(1));
num = -4.22;
console.log("num.toFixed(1):-4.22)    ", num.toFixed(1));
num = -4.55;
console.log("num.toFixed(1):-4.55)    ", num.toFixed(1));
num = -4.551;
console.log("num.toFixed(1):-4.551)   ", num.toFixed(1));
num = -4.65;
console.log("num.toFixed(1):-4.65)    ", num.toFixed(1));
num = -4.77;
console.log("num.toFixed(1):-4.77)    ", num.toFixed(1));
num = -4.77;
console.log("num.toFixed(1):-4.77)    ", num.toFixed(4));

注意:
toFixed() 的结果是字符串类型
,若最终还需要 number 类型,就需要通过 Number() 函数进行转换。

2.3 通过正则表达式,多余位小数直接舍去

必须先将数字类型转换成字符串,再使用 match() 方法。

let num = 3.14959;
let numStr = num.toString(); // 必须为字符串
let fixedNumStr = numStr.match(/^-?\d+(\.\d{0,2})?/)[0]; // 两位小数的正则表达式
let fixedNum = parseFloat(fixedNumStr);
console.log(fixedNum); // 输出:3.14

热点随笔:

·
【故障公告】k8s集群2台32核64G节点服务器被释放造成全站故障
(
博客园团队
)
·
强!34.1K star! 再见Postman,新一代API测试利器,功能强大、颜值爆表!
(
狂师
)
·
.NET开发者福音:JetBrains官方宣布 Rider 非商用免费开放!
(
追逐时光者
)
·
又给会员送福利,100台一年华为云2核2G3M云服务器
(
博客园团队
)
·
.NET 全能高效的 CMS 内容管理系统
(
小码编匠
)
·
.NET 8 高性能跨平台图像处理库 ImageSharp
(
小码编匠
)
·
解决DDD最大难题-如何划分领域
(
老肖想当外语大佬
)
·
.NET 高性能异步套接字库,支持多协议、跨平台、高并发
(
小码编匠
)
·
部署个SSH蜜罐玩玩,既能增强安全性,又能当电子蛐蛐
(
程序设计实验室
)
·
Avalonia开源控件库强力推荐-Semi.Avalonia
(
沙漠尽头的狼-Dotnet9
)
·
带团队后的日常思考(十六)
(
咖啡机(K.F.J)
)
·
我的博客网站为什么又回归Blazor了
(
沙漠尽头的狼-Dotnet9
)

热点新闻:

·
“边吃火锅边唱歌”,国产新能源车找到了人性的弱点
·
3个思想实验撕裂时空!实验证实:人类居住时空并非物理实体,而是近似
·
最高精度1公里*1公里*1小时!达摩院发布气象大模型,落地大山东
·
图集|知道吗?神舟系列航天员们出差太空累计1065天啦
·
“25万买车,12万换电池!”天价维修费揭秘
·
华为Mate 70系列来了!余承东宣布:史上最强大的Mate 11月见
·
成功着陆!返回地球后第一顿饭,3名航天员都点了这道餐食
·
小红书将业界最大数据湖迁至阿里云
·
扎克伯格逃过一劫
·
比亚迪被曝又一“大动作”
·
因贪腐,网易游戏一高管被带走调查
·
“垃圾外卖”背后推手:批量复制门店,加盟狂揽2000万