AI 大模型与智能应用
实践与技术

专注分享 AI 大模型、Agent 开发、深度学习等技术实战与架构设计;兼具 C#/.NET 后端开发经验

113
技术文章
8
文章分类
512
技术标签
29029
累计字数
个人建站免费 HTTPS 证书全攻略:三种方案轻松搞定
运维与DevOps
2023-06-30 0k

个人建站免费 HTTPS 证书全攻略:三种方案轻松搞定

不花一分钱,也能给自己的网站加上“小绿锁” 建站初期,很多个人站长都会纠结一个问题:要不要上 HTTPS? 买证书要花钱,免费的又怕不靠谱。其实,今天已经有很多成熟的免费方案,完全可以满足个人博客、小型项目的需求。本文就来聊聊我个人用过的几种方案,并给出最实在的建议。 为什么要折腾 HTTPS? 简单说两点: 浏览器不“警告”:没有 HTTPS,Chrome 会在地址栏标记“不安全”,非常劝退访客。 SEO 友好:搜索引擎更青睐 HTTPS 站点。 既然好处明显,付费证书动辄几百上千,个人站长完全可以从免费方案入手。 方案一:云厂商“白送”的证书——最适合新手 如果你用的是阿里云、腾讯云、华为云等国内云服务器,它们都提供了免费 DV 证书。以阿里云为例: 登录控制台 → 找到“数字证书管理服务”(SSL 证书)。 点击“购买证书”,筛选“免费版”(DigiCert 品牌,单域名,有效期 1 年,实际 3 个月,但可续期)。 填写域名,选择 DNS 验证(在域名解析加一条 TXT 记录)或文件验证。 审核通过后下载证书,按你的 Web 服务器(Nginx/Apache)配置即可。 ✅ 优点:操作全程中文,跟自己的云产品无缝对接,有客服。 ❌ 缺点:每个实名主体每自然年只有 20 张(其实够用),有效期只有 90 天,且仅支持主域名或 www 的一个单域名。 小技巧:虽然只有 90 天,但云厂商一般会提前提醒续期,手动重签一次也很简单。 方案二:Let‘s Encrypt + acme.sh —— 技术玩家的最爱 如果你不满足于单域名,或者希望完全自动化(比如申请泛域名证书 *.example.com),那 Let’s Encrypt 就是不二之选。它是 Linux 基金会旗下的公益 CA,全球信任。

HTTPS SSL证书 Let's Encrypt
阅读更多
Win11 文件资源管理器默认打开「此电脑」:告别快速访问,一步直达
工具与效率
2023-05-12 0k

Win11 文件资源管理器默认打开「此电脑」:告别快速访问,一步直达

每次打开文件资源管理器,Windows 11 都默认跳转到“快速访问”页面,里面堆满了最近使用的文件和文件夹。但对于很多用户来说,他们更希望直接看到完整的硬盘分区和系统文件夹——“此电脑”。其实只需一个简单设置,就能改变这个默认行为。 一、通过文件夹选项设置(官方原生方式,推荐) 这是最简单、最安全的方法,完全不需要接触注册表,设置后立即生效。 操作步骤: 随意打开一个文件夹窗口(或按 Win + E 快捷键)。 点击窗口顶部工具栏右侧的 “···”(三个点)按钮,在下拉菜单中选择 “选项”。 (也可以直接在地址栏旁边找到“查看”菜单下的“选项”,或者点击“···”后选择“选项”) 在弹出的“文件夹选项”窗口中,确保当前是 “常规” 选项卡。 在顶部“打开文件资源管理器时打开”的下拉菜单中,将默认选项从“快速访问”改为 “此电脑”。 点击 “确定” 保存设置。 从此以后,你再按下 Win + E 打开文件资源管理器时,就会直接显示“此电脑”界面,可以看到 C盘、D盘、下载文件夹等所有系统位置。 恢复方法: 如果想换回快速访问,只需按照上述步骤,在下拉菜单中选择“快速访问”即可。 二、通过组策略编辑器修改(仅限专业版/企业版) 如果你使用的是 Windows 11 专业版、企业版或教育版,还可以通过组策略来统一设置,尤其适合企业环境下的批量管理。 按下 Win + R,输入 gpedit.msc 并回车,打开“本地组策略编辑器”。 依次展开:用户配置 → 管理模板 → Windows 组件 → 文件资源管理器。 在右侧列表中找到 “打开文件资源管理器时打开‘此电脑’” 策略。 双击该策略,选择 “已启用”,然后点击“确定”。 重启文件资源管理器或注销重新登录即可生效。 三、注册表修改法(适用于所有版本,进阶用户) 如果你的系统是 Windows 11 家庭版(没有组策略编辑器),或者你更喜欢直接用注册表,可以这样做。 操作步骤: 按下 Win + R,输入 regedit,回车打开注册表编辑器。 导航到以下路径: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 在右侧窗口中找到名为 LaunchTo 的 DWORD 值。 如果不存在,请在空白处右键 → 新建 → DWORD (32 位)值,命名为 LaunchTo。 修改其数值数据: 1 表示打开“此电脑” 0 表示打开“快速访问” 点击“确定”,然后重启文件资源管理器(可在任务管理器中找到“Windows 资源管理器”右键重启)或注销再登录。 💡 小贴士:两种模式随时切换 即便你设置了默认打开“此电脑”,也仍然可以在文件资源管理器的左侧导航栏中,随时点击“快速访问”来查看最近使用的文件。两者互不矛盾,只是改变默认落地页而已。

Windows Windows 11 资源管理器
阅读更多
从开发视角彻底读懂机器学习核心数学概念
人工智能
2023-05-08 0k

从开发视角彻底读懂机器学习核心数学概念

很多工程师一看到 导数、偏导、反向传播、自动微分、梯度下降、权重、偏置 这些词,就容易觉得机器学习门槛很高。 其实这些概念放到代码里并不神秘。本文会用一个 广告系统智能出价引擎 的例子,尽量不用复杂公式,把这组核心概念讲清楚。 一、 业务场景引入:智能广告出价引擎 为电商网站开发广告投放系统:根据用户历史活跃度(过去30天点击次数 $x$),自动算出合理的广告竞价(预测出价 $y_{pred}$)。出价太高成本爆炸,太低抢不到曝光,因此要让系统自动“学会”配置最优的出价核心参数。 二、 流程里的核心角色 可以先记住这几个最核心的角色。 权重 w:决定某个特征有多重要。 偏置 b:决定基础输出是多少。 它们一起组成最简单的模型: $ y = w \cdot x + b $ w 和 b 一开始通常是随便给的,训练的过程,就是不断把这两个值调得更合适。 把输入数据送进模型,算出预测值,这一步就叫前向传播。 比如 x = 3,w = 2,b = 1,那么: $ y_{pred} = 2 \times 3 + 1 = 7 $ 但预测值 7 和真实值 10 还有差距,所以还要用损失函数来衡量“错了多少”。 比如用平方误差: $ Loss = (y_{pred} - y_{true})^2 = (7 - 10)^2 = 9

机器学习 数学基础 梯度下降
阅读更多
Win11 任务栏图标靠左设置:告别居中,找回经典布局
工具与效率
2023-03-21 0k

Win11 任务栏图标靠左设置:告别居中,找回经典布局

Windows 11默认将任务栏图标居中显示,这一设计虽然现代,但很多从Win10升级过来的用户更习惯传统的左对齐布局。其实系统自带了左对齐选项,只需几步就能轻松调整,完全是微软官方的原生功能,安全可靠。 一、通过系统设置调整(官方原生方式,强烈推荐) 这是最简单、最安全的方法,完全不需要接触注册表,所有更改立即生效。 操作步骤: 在任务栏的空白处右键点击,在弹出的菜单中选择“任务栏设置”。 在打开的设置页面中,向下滚动,找到并点击“任务栏行为”以展开详细选项。 在“任务栏对齐方式”下拉菜单中,将选项从默认的“居中”改为“左”。 设置完成后,任务栏图标会立即移动到左侧,无需重启电脑。 原理说明: 这一步操作实际上是在修改 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 路径下的 TaskbarAl 注册表值,DWORD值为 0(左)或 1(居中)。系统设置界面只是为这个底层配置提供了一个友好的图形入口。 恢复方法: 如需恢复居中对齐,只需按照上述步骤,在“任务栏对齐方式”下拉菜单中选择“居中”即可。 适用版本: Windows 11 22H2及后续版本(包含23H2、24H2)。 二、其他进阶方法 如果你的系统版本较旧,或者设置选项被禁用,也可以使用以下方法。 🖥️ 方法二:通过命令行(.bat脚本) 一行命令搞定,适合需要批量部署的场景。 打开记事本,输入以下内容: reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v TaskbarAl /t REG_DWORD /d 0 /f 保存文件时,将后缀名改为 .bat(例如 Left.bat),右键选择“以管理员身份运行”即可生效。 🛠️ 方法三:使用第三方优化脚本 如果你希望对任务栏进行更多自定义改造(如隐藏搜索框),可以考虑使用 Win11Debloat 这类开源脚本工具。它提供了一键运行的任务栏左对齐注册表脚本(Align_Taskbar_Left.reg),方便进行批量设置。 ❓ 常见问题与注意事项 为什么找不到“任务栏行为”选项? 如果在任务栏设置中找不到“任务栏行为”或“任务栏对齐方式”选项,可能是因为你的Windows 11版本过旧,最初的预览版没有这个功能,可以更新系统到最新版本再尝试。 设置后没有生效怎么办? 可以尝试以下步骤排查: 按 Ctrl + Shift + Esc 打开任务管理器。 在“进程”列表中找到“Windows 资源管理器”。 右键点击它,选择“重新启动”,等待屏幕刷新后再次检查。 系统更新后设置会丢失吗?

Windows Windows 11 任务栏
阅读更多
过滤器、拦截器与 AOP:Java 开发中的三角关系解析
后端开发
2023-01-28 0k

过滤器、拦截器与 AOP:Java 开发中的三角关系解析

在Java开发中,过滤器和拦截器常被提及,它们与AOP(面向切面编程)的关系容易让开发者困惑。本文将深入解析三者之间的关系、核心区别与适用场景,并回答关键问题: “AOP能否替代过滤器和拦截器?” 通过技术拆解与实战案例,带你理清三者协作的正确姿势。 一、核心结论:三角协作,各司其职 过滤器和拦截器是AOP思想的实践工具,用于解决Web层的横切关注点,但仅覆盖请求处理流程的特定阶段。 AOP是更通用的编程范式,可作用于任意Java方法(如Service层逻辑),与HTTP请求无关。 三者执行顺序(从外到内):Filter → Interceptor → AOP,层级递进,协同工作。 二、关键区别:技术层级、能力与边界 维度 过滤器(Filter) 拦截器(Interceptor) AOP 技术层级 Servlet容器(如Tomcat) Spring MVC框架 Spring框架或AspectJ 作用范围 所有HTTP请求(含静态资源) 仅Spring MVC的Controller请求 任意Spring管理的Bean方法 核心能力 操作原始HTTP流(请求/响应) 访问Web上下文(如HttpServletRequest) 方法级增强(如事务、日志) 典型场景 字符编码、跨域处理、安全头注入 登录认证、权限校验、接口日志 事务管理、缓存控制、性能监控 能否访问Spring Bean ❌(需特殊配置) ✅ ✅ 能否拦截静态资源 ✅ ❌ ❌ 三、误区澄清:AOP无法替代过滤器和拦截器 为什么AOP不能完全替代? 技术层级不兼容: 过滤器:处理容器级协议问题(如修改原始请求体、设置字符编码),AOP无法触及HTTP原始流。 拦截器:处理Web层业务规则(如重定向、Session校验),AOP若在Service层实现,会导致逻辑与Web层耦合(例如定时任务触发不必要的权限校验)。 关键功能缺失: 静态资源处理、协议级配置(如CORS)必须由过滤器完成,AOP无法覆盖。 性能与可靠性风险: 用AOP替代过滤器处理高频静态资源,会造成不必要的动态代理开销,降低性能。 在AOP中通过RequestContextHolder获取请求对象,易在异步场景引发线程安全问题。 四、最佳实践:分层协作,各取所长

Java Spring AOP
阅读更多
Spring 依赖注入:为什么构造器注入优于 @Autowired 字段注入?
后端开发
2022-12-06 0k

Spring 依赖注入:为什么构造器注入优于 @Autowired 字段注入?

在 Spring 开发中,依赖注入(DI)是我们每天都在使用的核心功能。很多开发者习惯直接在字段上加 @Autowired,因为这样写起来最快、最简洁。但你可能不知道,Spring 官方和社区早已将构造器注入(Constructor Injection)列为首选方式。 那么,@Autowired 字段注入和构造器注入到底有什么区别?为什么说后者更优秀?本文将从强制性、不变性、测试友好性、循环依赖、代码耦合等多个维度进行深度对比,并给出明确的最佳实践建议。 一、两种注入方式快速回顾 1. 字段注入(Field Injection) @Service public class UserService { @Autowired private UserRepository userRepository; // 直接写在字段上 public void doSomething() { userRepository.save(); } } 2. 构造器注入(Constructor Injection) @Service public class UserService { private final UserRepository userRepository; // Spring 4.3+ 如果只有一个构造器,可以省略 @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } // 业务方法... } 配合 Lombok 可以更简洁: @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; } 二、核心区别一览表 维度 字段注入 (@Autowired on field) 构造器注入 依赖是否可为 null 可以(除非设置 required=true) 不可以,对象创建时必须提供所有依赖 依赖是否可变 可变(字段可被后续修改) 不可变(可声明为 final,线程安全) 测试友好性 差,必须启动 Spring 容器或使用反射 极好,直接 new 对象并传入 Mock 依赖 循环依赖检测 支持(三级缓存解决,但可能掩盖设计问题) 不支持,Spring 启动即失败,强制重构 与 Spring 耦合度 高,类明确依赖 Spring 注解 低,类是纯净的 POJO 代码可读性 隐式依赖,看构造器不知道需要什么 显式依赖,所有必需项一目了然 三、深入剖析:为什么构造器注入更优秀? 1.

Java Spring 依赖注入
阅读更多
.NET 版 StringJoiner:比 string.Join 更会「打扮」的字符串拼接器
后端开发
2022-10-15 0k

.NET 版 StringJoiner:比 string.Join 更会「打扮」的字符串拼接器

告别 string.Join 的局限——用扩展方法轻松添加前缀和后缀 在日常开发中,字符串拼接恐怕是最常见的操作之一。.NET 自带的 string.Join 方法已经非常强大:性能好、支持泛型、能正确处理 null,用它来连接集合中的元素简直不要太方便。 但是,如果你写过 Java,可能会怀念 StringJoiner 类——它除了分隔符,还允许你指定前缀和后缀。例如 new StringJoiner(", ", "[", "]").add("A").add("B") 可以得到 "[A, B]"。这种写法在生成日志、SQL 片段、JSON 数组字符串等场景下非常实用。 那么,在 .NET 中能否也拥有这样的能力?当然可以。今天我们就来自己动手,为 IEnumerable<T> 写一个扩展方法,让它支持前缀和后缀,并且保持 string.Join 的高效和简洁。 一、原生 string.Join 的局限性 假设我们有一个水果列表: var fruits = new List<string> { "苹果", "香蕉", "橙子" }; 想要输出 "[苹果, 香蕉, 橙子]",用 string.Join 只能做到中间部分: string middle = string.Join(", ", fruits); // "苹果, 香蕉, 橙子" string result = "[" + middle + "]"; // "[苹果, 香蕉, 橙子]" 虽然也不麻烦,但当拼接逻辑多次出现时,重复写前缀后缀会显得啰嗦,也容易出错。更好的方式是一次性声明“分隔符、前缀、后缀”。

C# .NET 扩展方法
阅读更多
上传文件路径怎么写最稳?详解 ASP.NET 三种路径写法的区别
后端开发
2022-08-24 0k

上传文件路径怎么写最稳?详解 ASP.NET 三种路径写法的区别

在 ASP.NET 项目里,文件上传、导出、日志落盘都离不开“路径”。很多人常见三种写法: Server.MapPath("~/Uploads/...") Server.MapPath("/Uploads/...") Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Uploads", ...) 看起来都能用,但它们的“参照点”不同,部署后表现也可能完全不一样。 1. Server.MapPath("~/Uploads/..."):基于应用根目录 ~ 表示当前 Web 应用根目录(virtual app root)。 var path = Server.MapPath("~/Uploads/2026/04/16"); 特点: 最符合 Web 应用语义 项目部署到虚拟目录(如 /MyApp)时仍然稳定 在 Controller/Page 中最推荐 适用场景: 上传文件 站内资源落盘 需要明确“当前应用目录”的所有场景 2. Server.MapPath("/Uploads/..."):基于站点根目录 / 表示IIS 站点根,不一定是你的应用根。(.net core /.net 6+ 已废弃) var path = Server.MapPath("/Uploads/2026/04/16"); 特点: 参照的是站点,不是应用 当应用是虚拟目录时,容易映射到“应用外”路径 多应用共站点时风险更高 适用场景: 你明确要访问站点级共享目录 对 IIS 站点结构有完全掌控 3. AppDomain.CurrentDomain.BaseDirectory:基于进程物理基目录 这是纯 .NET 物理路径方式,不经过虚拟路径解析。

ASP.NET C# 路径
阅读更多
Win11 右键菜单一键切换:让「显示更多选项」彻底消失
工具与效率
2022-07-02 0k

Win11 右键菜单一键切换:让「显示更多选项」彻底消失

Windows 11 默认的右键菜单把很多常用功能折叠进了“显示更多选项”,每次都要多点一下,实在烦人。其实系统内置了一条命令,可以一键切换回经典的 Win10 完整菜单,而且随时能恢复。 操作步骤(全程 30 秒搞定) 以管理员身份打开“Windows 终端”(或命令提示符)。 粘贴对应命令,按回车执行: ➡️ 切换到 Win10 经典完整菜单 reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve ⬅️ 恢复 Win11 默认菜单 reg delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f 重启资源管理器让生效: taskkill /f /im explorer.exe & start explorer.exe 或者 taskkill /f /im explorer.exe; start explorer.exe 执行后屏幕会闪一下,菜单样式就变了。 临时查看完整菜单的小技巧 如果不想修改系统设置,只需在右键时按住 Shift 键,弹出的就是经典完整菜单,用完即走,不留痕迹。 注意:该方法仅影响右键菜单的折叠/展开样式,不会删除或禁用任何菜单项,安全可靠。

Windows Windows 11 注册表
阅读更多
Axios + async/await:你以为的「同时请求」,可能正在串行执行
前端开发
2022-05-12 0k

Axios + async/await:你以为的「同时请求」,可能正在串行执行

一个小小的 await 顺序,可能让你的接口总耗时翻倍 在现代前端开发中,axios 搭配 async/await 几乎是请求接口的标配写法。但很多人可能没意识到:同样是写 await,两个接口的完成时间可能相差一倍。 场景复现 假设你有两个接口:接口 A 和接口 B,每个都需要较长时间才能返回数据(比如各需 10 秒)。 现在你需要在同一个 async 函数里依次请求它们,最后拿到两个数据。 来看这段代码: async function fetchData() { const resA = await axios.get('/api/A'); // 耗时较长 const resB = await axios.get('/api/B'); // 耗时较长 return [resA, resB]; } 问题:这个函数的总执行时间是多长? 等于单个接口的时间? 还是两个接口时间之和? 答案是 两个接口时间之和(例如 10+10=20 秒)。 因为 await 会阻塞后续代码的执行:先等 A 完成,再开始请求 B,两个请求是串行的。 真正的“同时请求”:只需要最慢那个接口的时间 很多时候,接口 A 和接口 B 之间并没有依赖关系(B 不需要 A 的返回结果)。这种情况下,完全可以让它们并行发起,从而把总耗时压缩到 单个最慢接口的耗时。

JavaScript Axios async/await
阅读更多