Dvorak
Dvorak

Dvorak Chen

Essay 随笔


P2P 的使用 coturn 搭建 ICE 服务器

在这篇博客中,我们讨论了在NAT网络环境下进行P2P通信的问题,并介绍了使用STUN和TURN协议来解决这个问题。我们还介绍了如何使用coturn来搭建一个ICE服务器。首先,我们安装了coturn,并配置了证书和监听端口。然后,我们配置了用户名、密码和域名。最后,我们进行了测试,验证了STUN和TURN服务器的正常工作。我们还提供了让coturn在后台自启动的命令。通过阅读这篇博客,你将了解到如何搭建一个ICE服务器来支持P2P通信,并解决NAT网络环境下的问题。--GPT 4

network

supplement of Authentication

# Authentication Failure Handling in .NET In my recent blog post titled ".NET Authentication and Authorization," I discussed the configuration and implementation of authentication and authorization in a .NET application. However, I failed to address an important aspect: handling authentication failures. By default, the authentication configuration in .NET uses a cookie policy. When an authentication failure occurs, it responds with a 302 status code and redirects to the `/Account/Login` page. This poses a problem when the frontend and backend of the application are separated, as the redirect will not point to the correct address. For instance, let's assume the frontend app is hosted at `localhost:8800` and the backend app at `localhost:9900`. If an authentication failure occurs during a frontend API request, the response will contain a 302 status code with the location set to `localhost:9900/Account/Login`. The frontend, using HTTP APIs like `fetch` or `Axios`, will automatically fol...--GPT 4

.NET

play sound when piece moved

摘要: 这篇博客讲述了在国际象棋网站上添加一个新功能:当棋子移动时播放声音。作者最初认为这是一个很简单的功能,但最终发现并不像想象中那么简单。由于浏览器的自动播放策略,作者无法按照自己的意愿播放声音。 浏览器的自动播放策略规定: - 静音自动播放是允许的。 - 有声音的自动播放是允许的,如果: - 用户与该域进行了交互(点击、触摸等)。 - 在桌面上,用户的媒体参与指数已经超过了阈值,这意味着用户之前已经播放过带有声音的视频。 - 用户在移动设备上将该网站添加到了主屏幕或在桌面上安装了渐进式Web应用程序(PWA)。 - 顶级框架可以将自动播放权限委托给其内嵌框架,以允许带有声音的自动播放。 因此,在用户与页面进行交互之前,无法播放声音,在用户停止与页面进行交互时也无法播放声音。 为了解决这个问题,作者找到了一个绕过限制的方法:循环播放声音并调节音量!在棋子移动时将音量调节为1,棋子移动后将音量调节为0.0001。 为什么是0.0001而不是0或静音? 因为如果设置为静音或音量为0,将触发自动播放策略的限制,而将音量设置为1或取消静音将在用户停止与页面进行交互时被阻止。但是,如果将音量设置为足够低的值,就不会触发自动播放策略,因为声音仍在播放。 在代码中,作者使用了以下方法来实现: ```rust sound.volume = 1; setTimeout(() => { sound.currentTime = 0; sound.volume = 0.0001; }, 500); ``` 当音量为0.0001时,用户听不到声音。 需要注意的是,在移动设备上不允许将音量设置为1!因此,在移动设备上可以将音量设置为静音。 ```rust sound.muted = false; setTimeout(() => { sound.currentTime = 0; sound.muted = true; }, 500); ``` --GPT 4

Javascript

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

学习dotnet core中的身份验证和授权-2-cookie 本文介绍了如何使用cookie进行基于声明的身份验证和授权。首先,通过登录接口获取凭证,然后将声明下发到客户端的cookie中。接着,使用身份验证中间件解析cookie中的声明。最后,通过定义基于声明的授权策略来对接口进行授权处理。文章还提到了如何使用AddAuthentication和AddCookie方法定义身份验证策略,并介绍了如何在接口上使用[Authorize("Need24")]来指定授权策略。最后,通过测试验证了身份验证和授权的生效。文章指出,虽然使用cookie进行身份验证和授权简单,但在实际情况中可能会遇到一些问题,如跨域情况。--GPT 4

.NET

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

学习.NET Core中的身份验证和授权-1-概念 本文旨在讲解.NET Core中的身份验证和授权的概念。身份验证和授权是相辅相成的,必须先进行身份验证才能进行授权。身份验证是为了证明来者的身份,而授权是根据身份的权限决定是否允许访问某个资源。在.NET Core中,身份验证和授权的信息传递通过声明(Claim)来实现。声明是身份的相关信息,每个声明由类型和值组成。通过身份验证后得到的声明将传递给授权程序,授权程序根据声明判断是否通过授权。授权通过将允许访问对应的资源,不通过将被拒绝。在下一篇文章中,我们将使用cookie来实现一个简单的身份验证和授权。通过本文的学习,你将了解身份验证和授权的关系以及如何使用声明进行授权判断。--GPT 4

.NET

Rust - bytecodec 编解码库

Rust - bytecodec Encoding and Decoding Library This blog post discusses the use of the bytecodec library in Rust for encoding and decoding data. The author starts by explaining the need for a simple protocol to serialize objects into binary format for network transmission. Instead of using JSON, the author decides to create a custom protocol where each field is represented on a separate line. However, the author soon realizes that the implementation becomes messy and lacks abstraction. The problem lies in the lack of a standardized approach to encoding and decoding. Although the `Peer` object only has three members, each member needs to be individually implemented for encoding and decoding. This lack of abstraction leads to inconsistent naming, implementation, and method usage, making the code difficult to manage. To solve this problem, the author proposes the use of traits to provide a standardized approach to encoding and decoding. The bytecodec library offers the `Encode` and `De...--GPT 4

Rust

Rust 小技巧之临时作用域

Rust小技巧之临时作用域 本文介绍了在Rust中使用临时作用域来优化代码的方法。首先,作者提到了在处理`Result`和`Option`时,可以使用`if let`和`?`操作符来简化代码。接下来,作者给出了一个读取用户输入的示例,并提出了优化的思路。首先,可以将读取输入的代码封装成一个函数,并返回所需的变量。其次,作者介绍了一种更喜欢的方法,即使用临时作用域来处理读取输入的操作。在临时作用域中定义的变量在作用域结束后会被释放,从而简化了代码。最后,作者比喻了临时作用域的好处,就像有一个只能放数据线的小盒子,能够方便地收纳数据线。通过使用临时作用域,可以提高代码的可读性和简洁性。 思考问题:你是否在自己的代码中使用过临时作用域?你认为在哪些情况下使用临时作用域会更加合适?--GPT 4

Rust

P2P 的 NAT

P2P的NAT 本文讨论了NAT(网络地址转换)的原理和对P2P通信的影响。NAT是为了解决IPv4地址不足的问题而出现的临时方案,但对互联网产生了负面影响。 首先,文章介绍了全局地址和专用地址的概念,以及NAT如何将专用地址映射为全局地址。 然后,文章讨论了NAT的缺点,包括违反IP地址设计原则、使网络变得脆弱、破坏网络分层结构模型等。 接下来,文章介绍了不同类型的NAT,包括全锥型、受限锥型、端口受限锥型和对称型,并解释了它们在P2P通信中的表现。 最后,文章讨论了在不同类型的NAT下如何实现P2P通信,并指出了一些无法建立P2P连接的情况。 总的来说,NAT是一个有用但失败的协议,它缓解了IPv4地址不足的问题,但也给网络带来了复杂性和脆弱性。NAT的普及延缓了IPv6的普及,并对P2P通信造成了困扰。--GPT 4

network

Multiaddr - 面向未来的地址

本文详细介绍了Multiaddr这一面向未来的网络地址方式。Multiaddr以更加友好的方式描述网络地址,包含了比传统网络地址更多的信息,例如网络协议、加密协议等。它以人类可读、机器可读的形式存在,可以轻易地在机器中表示为二进制形式。然而,尽管Multiaddr的可读性较好,但它增加了程序实现的复杂性。使用Multiaddr的程序需要自己解析其中的协议,这会增加程序的工作量。此外,Multiaddr对于程序的耦合性较差,实际开发过程中可能不如传统方式。因此,尽管Multiaddr是一种有趣的地址方式,但由于没有配套的成套工具,且造轮子的成本高,作者并不推荐使用。那么,你对Multiaddr有什么看法呢?你认为它的优点能否弥补其缺点,使其在未来得到广泛应用?--GPT 4

network

石头雨 - 其一

这篇博客以一个人的一天生活为主题,讲述了他如何在周六的一天中过得迷茫和无聊。文章从早晨开始,描绘了他起床后的各种行动和思考,包括看视频、玩游戏、吃饭、取消约会等。然而,这些看似平常的行为背后,却隐藏着他的疲惫和迷茫。他的生活充满了重复和无聊,即使是看似有趣的游戏和视频,也无法引起他的兴趣。他的四肢无力,仿佛失去了联系,这可能是他内心疲惫和迷茫的象征。他对于时间的感知也是模糊的,他不断地看时间,却似乎无法真正理解时间的流逝。他的生活似乎停滞不前,他的一天似乎永远不会结束。这篇博客引发了我们对于生活的思考:我们是如何度过每一天的?我们的生活是否也充满了重复和无聊?我们是否也像他一样,感到疲惫和迷茫?我们又应该如何打破这种状态,找到生活的意义和乐趣?--GPT 4