Dvorak
Dvorak

Dvorak Chen

Essay 随笔




如何编写易维护的代码 - Rust 实现-1

如何编写易维护的代码是一个关键问题,本文通过Rust实现探讨了这一主题,强调了函数式思想的重要性。在理想情况下,使用纯函数可以确保输出仅依赖于输入,避免外部因素带来的不确定性。然而,在实际应用中,许多函数依赖于外部资源,如数据库或网络请求,这些依赖会影响代码的维护性和测试性。为了解决这个问题,本文引入了依赖注入的概念,即将所需的外部依赖作为参数传递给函数,而不是在函数内部获取。这样可以使函数的行为更加可预测,并且便于在不同环境中配置和测试。此外,将多个依赖抽象到一个结构体中,可以进一步提高代码的整洁性和可维护性。本文还展示了如何通过将依赖注入到结构体中,使方法调用更简洁,同时保持其行为的纯粹性。这种方法不仅使代码更易于测试,还能更轻松地定位错误。如果你想知道如何在Rust中实现易维护的代码,或者如何利用依赖注入来提高代码质量,这篇文章将为你提供一些启发。那么,你是否正在考虑如何让自己的代码更加容易维护和测试呢?--DeepSeek

Rust rust-programming Functional Programming Pure Functions Dependency Injection Structs in Rust

重新发明 Service Trait

文章讨论了在Rust中构建高效网络服务器时管理大量请求的重要性,并介绍了Tower框架中的`Service` trait作为解决方案。作者解释了如何实现自定义`Service`来处理请求、构造响应和管理错误,并深入探讨了Tower的高级特性,如服务中间件的组合和链式调用。文章还提到通过`poll_ready`方法实现拥塞控制以防止内存溢出,并总结了`Service` trait的优势,鼓励读者将其应用于实际项目中。--DeepSeek

Rust service trait async handling error management concurrency control Tower

P2P 的使用 coturn 搭建 ICE 服务器

本文介绍了一种基于coturn搭建ICE服务器的方法,用于实现P2P通信中的NAT打洞功能。在复杂的NAT网络环境下,仅靠STUN协议可能无法完成地址获取和打洞操作,因此需要借助TURN协议来实现数据中继。文章详细讲解了如何通过coturn工具快速搭建一个支持ICE协议的服务器,并提供了具体的安装、配置和测试步骤。内容包括证书生成与配置、端口监听设置、用户名密码及realm配置等关键环节,还分享了作者在Docker部署过程中遇到的问题以及最终采用apt-get安装的解决方案。最后,文章通过在线工具验证了ICE服务器的功能,确保STUN和TURN服务正常运行,并提供了系统后台自启动的命令。如果你对P2P通信中的NAT限制、服务器性能优化或网络安全配置感兴趣,这篇文章将为你提供实用的技术参考和启发。你是否也遇到了NAT类型限制导致的连接问题?如何通过优化coturn配置来提升服务器性能?这些问题的答案或许就藏在文章的细节中。--DeepSeek

network NAT Hole Punching STUN Protocol TURN Protocol ICE Server Coturn Setup

supplement of Authentication

这篇文章探讨了在使用.NET进行身份验证时如何处理认证失败的问题。通常情况下,当认证失败时会返回302状态码并重定向到后端的登录页面`/Account/Login`,但在前后端分离的应用中,这种默认行为会导致前端无法正确处理重定向,因为前端使用的HTTP客户端(如Fetch或Axios)会自动请求新的地址而引发错误。文章指出,默认情况下无法直接修改重定向地址的域名,并提出了一种解决方案:通过返回401状态码手动处理认证失败的情况。具体实现方法是创建一个控制器`AccountController`,并在其中定义一个返回401状态码的动作方法`ToLoginPage()`。前端可以通过设置HTTP客户端(如Axios)的拦截器,在接收到401状态码时手动跳转到登录页面。例如,使用Axios的响应拦截器检测到401状态码后,可以将`location.href`设置为登录页面地址。这种方案能够有效解决前后端分离应用中认证失败后的重定向问题。文章最后提出了一个问题:在实际开发中,你是否遇到过类似的问题?如果是,你会如何解决它?--DeepSeek

.NET .NET Authentication Authorization Handling Cookie Policy Authentication Failure HTTP 401 Response

play sound when piece moved

本文探讨了在国际象棋网站中实现棋子移动时播放声音的功能所面临的挑战。由于浏览器的 autoplay 政策限制,直接播放声音变得困难重重,尤其是在用户未与页面交互或切换标签页的情况下。作者详细介绍了 autoplay 政策的具体规则,并分享了如何通过调节音量和循环播放来绕过这些限制的方法。例如,在棋子移动时将音量调至 1,然后在短时间内将其降至 0.0001,以避免触发 autoplay 策略的限制。此外,作者还提到移动端设备上无法设置为静音,因此需要通过其他方式处理。本文不仅解决了技术难题,还提出了一个值得思考的问题:为什么选择将音量设置为 0.0001 而不是完全静音?这背后的原因是什么?快来阅读本文,找到答案!--DeepSeek

Javascript autoplay policy audio manipulation web development international chess volume regulation

学学dotnet core中的身份验证和授权-2-cookie

本文介绍了在ASP.NET Core中使用Cookie实现身份验证和授权的完整流程。首先,通过自定义登录逻辑创建包含用户声明(如姓名和核酸状态)的Cookie,并配置身份验证中间件以处理请求中的Cookie。接着,定义了名为"Need24"的授权策略,该策略检查用户的声明是否满足特定条件(姓名为“张三”且核酸状态为24)。将此策略应用于登出接口,并确保授权中间件在身份验证之后使用。测试过程中,在未携带有效Cookie时,访问受保护接口会重定向到默认登录页面,导致404错误;而携带正确Cookie的请求则成功通过授权。本文还讨论了Cookie在实际应用中的局限性,特别是在跨域场景下的使用较少。--DeepSeek

.NET Authentication Authorization ASP.NET Core Cookie authentication Claims based security

学学dotnet core中的身份验证和授权-1-概念

身份验证和授权是DotNet Core开发中不可或缺的两个核心概念,本文通过形象的比喻和简单的逻辑,清晰地阐述了这两者之间的关系。文章将项目比作一栋大楼,接口比作房间,用户请求接口的行为则相当于进入某个房间的过程。在此过程中,身份验证就像门卫,负责确认用户的合法身份;而授权则是进一步检查用户是否具备进入特定房间的权限。 在具体实现中,声明(Claim)起到了关键作用。它不仅是连接身份验证和授权的桥梁,还承载了用户的身份信息和权限数据。通过服务器下发凭证并由客户端携带的方式,系统能够高效地完成身份验证和权限校验。文章以核酸检测为例,生动地展示了基于声明的授权机制如何运作:只有在声明中找到符合条件的条目时,才能获得访问许可。 本文还提到,在后续内容中将使用Cookie来实现一个简单的身份验证和授权示例。这为读者提供了进一步探索的方向。通过这种方式,开发者可以灵活地根据实际需求设计权限控制逻辑,并自定义拒绝访问后的处理方式,如重定向到登录页面或引导用户完成特定操作。 总体来看,本文不仅解释了身份验证和授权的基本原理,还通过具体的例子展示了它们在实际开发中的应用场景。那么,你是否对如何高效实现声明的发放与验证有了初步的思考呢?下文中将揭晓答案。--DeepSeek

.NET Authentication Authorization ASP.NET Core Claims .NET Core

Rust - bytecodec 编解码库

文章介绍如何使用 Rust 的 bytecodec 库为自定义结构体 Peer 实现编码和解码功能。在无法直接为第三方类型实现 Encoder 的情况下,作者通过包装这些类型并借助 bytecodec 提供的 Encoder 实现(如 Utf8Encoder、I8Encoder 等),成功实现了对 Peer 结构体的成员(包括 email、nat_type 和 pub_addr)的编码逻辑。 具体来说,作者定义了三个编码器:NatTypeEncoder、PubAddrEncoder 和 PeerEncoding。其中,PeerEncoding 包含了上述两个编码器以及 Utf8Encoder 用于处理 email 成员。在实现 start_encoding 方法时,依次调用各成员编码器的 start_encoding 方法;在 encode 方法中,则通过 bytecodec_try_encode! 宏和自定义的 put_newline! 宏,将各成员编码结果按顺序写入缓冲区,并在其间添加换行符分隔。最后,is_idle 方法判断所有成员编码器是否完成编码,以决定整体编码状态。 文章还提到,解码部分的实现与编码过程类似,需要定义对应的 Decoding 结构体并实现 Decoder trait 的相关方法。--DeepSeek

Rust bytecodec serialization custom encoder codec struct