As a computer science educator if you can teach only one thing to your students what would it be?
中文翻译
作为一名计算机科学教育者,如果你只能教授一件事给你的学生,那会是什么?
Algorithmic thinking. There's a lot that underlies that, but you fundamentally need to be able to learn how to break problems down in to smaller solvable tasks, and apply tightly constrained instructions to solve those tasks. The rest is just syntactic sugar and math. Really, really important math.
中文翻译
Algorithmic thinking(算法思维)是一种重要的思维方式,它需要学会将问题分解为可解决的小任务,并应用严格限定的指令来解决这些任务。除此之外,算法思维还涉及到一些基础的数学知识。算法思维是计算机科学中的核心概念,它帮助我们设计和实现高效的解决方案。除了语法和数学知识外,算法思维是非常重要的。
I want to teach my students how to fail. Part of learning to fail is simple programming practice. It's fundiversión to write code, and the temptation is to write dozens of lines of code at a time. It's much less fun to debug code, and when your dozens of lines fails in strange ways you've made your life far more difficult than it needs to be. So take baby steps: write the smallest number of lines that can be tested, then stop and test it. That code will fail, too, but debugging it will be a relatively pain-free process and you get the psychological boost of solving lots of small failures relatively quickly.
中文翻译
"我想教我的学生如何失败。学习失败的一部分是简单的编程实践。编写代码很有趣,很容易一次写下几十行代码。但调试代码就没那么有趣了,当你的几十行代码以奇怪的方式失败时,你让自己的生活变得比必要的困难得多。所以要采取小步骤:写下最少的可以测试的代码行,然后停下来进行测试。那段代码也会失败,但调试起来相对轻松,而且你会获得在相对短的时间内成功解决许多小失败的心理推动。"
Source control also has a role to play here. If you commit often, you can occasionally take larger risks secure in knowing that if it doesn't work out, one command will bring you back to a known state.
中文翻译
"版本控制在这方面也起着重要作用。如果经常提交代码,你可以偶尔冒一些较大的风险,因为你知道如果不成功,只需一个命令就能将代码还原到已知状态。"
The deeper lesson is divorcing code that fails from the feeling of failure. If your code X produced state Y and you wanted state Z, and you take this personally, you're in for a long semester. If, on the other hand, I can convince you that you've now learned something you didn't know before about code X, then you're much less likely to feel helpless. If you're not feeling helpless, it's a lot easier to try something different and eventually (after visiting states P, D, Q, and aleph-1) getting to Z.
中文翻译
"更深层次的教训是将失败的代码与失败的感觉分离开来。如果你的代码 X 产生了状态 Y,而你想要的是状态 Z,如果你将此视为个人失败,那么你将度过漫长的学期。另一方面,如果我能够说服你,让你相信你现在学到了关于代码 X 的一些以前不知道的东西,那么你就不太可能感到无助。如果你不感到无助,尝试不同的方法就会容易得多,最终(在经历了状态 P、D、Q 和 aleph-1 之后)达到状态 Z。"
Once you've learned how to do controlled failures and divorce programming failure from the emotion of failure, programming starts to become pretty enjoyable and your learning rate goes up by an order of magnitude.
中文翻译
"一旦你学会了如何进行可控的失败,并将编程失败与情绪分离开来,编程就会变得非常有乐趣,你的学习速度将提高一个数量级。"
以下是可能导致POST请求发送两次的一些原因:
重复提交:用户可能在提交表单或发送POST请求时多次点击提交按钮或发送请求的操作,导致请求被发送多次。
页面刷新:当用户在提交POST请求后刷新页面时,某些浏览器会尝试重新发送之前的POST请求,以便用户可以重新加载页面并继续之前的操作。
跨域请求:在某些情况下,如果你的网页中存在跨域请求,浏览器可能会发送OPTIONS请求进行预检(preflight),然后再发送实际的POST请求。这样就会导致看起来像是发送了两次POST请求,但实际上第一个请求是OPTIONS请求。
重定向:如果服务器返回一个重定向响应(例如状态码为302),浏览器可能会自动跟随重定向并发送第二个POST请求。
缓存问题:一些缓存机制可能会导致POST请求被重复发送。例如,浏览器或代理服务器可能会缓存POST请求的响应,然后在后续请求时重用缓存的响应,从而导致看起来像是发送了两次POST请求。
以下是一些常见的解决方法:
根据具体的情况,你可能需要进一步调查并采取适当的解决措施来处理重复发送的POST请求。
同源策略(Same-Origin Policy)是一种浏览器安全机制,用于限制在浏览器中加载的网页脚本与来自不同源(即不同的域、协议或端口)的资源之间的交互操作。它是为了保护用户的隐私和安全而设计的。
同源策略的基本原则是,当一个网页脚本尝试访问另一个源的资源时,浏览器会阻止这种跨源的操作,以防止恶意网站利用跨域请求获取用户的敏感信息或对其他网站进行攻击。
同源策略的限制主要包括以下几个方面:
域名:同源策略要求两个网页具有相同的域名(协议、主机和端口),即使两个域名只是在协议、主机或端口上稍有不同,也会被视为不同源。例如,http://example.com 和 https://example.com 被视为不同源。
Cookie、LocalStorage 和 IndexDB:同源策略限制了对跨源的 Cookie、LocalStorage 和 IndexDB 的访问。这意味着网页脚本只能访问属于同一源的 Cookie 和存储数据,而无法读取或修改其他源的数据。
DOM 访问:同源策略限制了对跨源文档对象模型(DOM)的访问。网页脚本只能修改属于同一源的 DOM 元素,无法直接访问或修改其他源的 DOM。
XMLHttpRequest 和 Fetch 请求:同源策略对跨源的 XMLHttpRequest 和 Fetch 请求进行限制。通常情况下,这些请求只能向同源发起,无法直接访问其他源的数据。
为了允许跨域请求,浏览器引入了一些机制,如跨域资源共享(CORS)和服务器代理。这些机制允许服务器通过设置适当的响应头来授权特定的跨域请求。
同源策略在保护用户隐私和安全方面起着重要的作用,防止恶意网站滥用用户的信息。然而,有时候需要进行跨域操作,因此开发人员需要了解和遵守跨域规则,并使用适当的跨域解决方案。
预请求(Preflight Request)是在进行跨域资源共享(CORS)时,某些特定情况下由浏览器自动发送的一种HTTP请求。它是一个OPTIONS请求,用于在实际的跨域请求之前进行预检,以确定是否允许实际请求的发送。
在以下情况下,浏览器会发送预请求:
跨域请求:当浏览器发起跨域请求时,即请求的目标与当前页面的域名、协议或端口不一致时,浏览器会发送预请求。
自定义请求头:如果在跨域请求中使用了特定的自定义请求头(例如Content-Type、Authorization等),并且这些请求头属于 "CORS安全列表" 之外的请求头,浏览器也会发送预请求。
预请求的目的是为了确保服务器支持跨域请求并允许浏览器发送实际的跨域请求。预请求的发送和处理过程如下:
发送预请求:浏览器在发送实际的跨域请求之前,先发送一个OPTIONS请求,其中包含了一些额外的头部信息,如Origin(指示请求的源)和Access-Control-Request-Method(指示实际请求的方法)等。
服务器处理预请求:服务器接收到预请求后,进行预检查。它会检查请求的源是否在允许的跨域列表中,以及是否允许实际请求的方法、请求头等。
响应预请求:服务器根据预检查的结果,返回包含了对应的响应头信息的响应。响应头中重要的字段是Access-Control-Allow-Origin(指示允许的源)和Access-Control-Allow-Methods(指示允许的方法)等。
浏览器处理预请求响应:浏览器接收到预请求的响应后,会检查响应头中的相关字段,以确定是否允许发送实际的跨域请求。
发送实际请求:如果预请求的响应表明服务器允许实际请求,浏览器会发送实际的跨域请求,其中包含了实际的请求方法、请求头等。
需要注意的是,预请求是由浏览器自动发送的,并且在实际请求之前进行。它的目的是为了提供一种机制,确保服务器允许跨域请求,以增加安全性。服务器需要正确地处理预请求并返回适当的响应头,以允许或拒绝实际的跨域请求。
预请求就是浏览器在进行跨域请求访问时向目标浏览器发送的一个预检测请求,检测目标服务器是否支持跨域请求,预请求是一个OPTIONS请求,其中包含了一些额外的头部信息,如Origin(请求源)、Access-Control-Request-Method(实际请求的方法)和Access-Control-Request-Headers(实际请求的头部信息)。服务器收到预请求后,可以检查这些头部信息,并决定是否允许实际的跨域请求。
服务器在收到预请求后,可以通过设置响应头部中的Access-Control-Allow-Origin、Access-Control-Allow-Methods和Access-Control-Allow-Headers等字段来指定允许的跨域请求来源、方法和头部信息。如果服务器确认允许跨域请求,浏览器会继续发送实际的跨域请求,否则将阻止实际请求的发送,并返回相应的错误。
预请求机制的目的是确保服务器允许跨域请求,并在发送实际请求之前进行验证,从而保护用户的隐私和安全。开发人员需要在服务器上正确地配置CORS头部信息,以便处理预请求,并允许必要的跨域请求。
1.通过自定义中间件
package main import ( "github.com/gin-gonic/gin" ) func main() { // 创建 Gin 引擎 router := gin.Default() // 添加跨域请求的中间件 router.Use(corsMiddleware()) // 添加你的路由处理逻辑 // 启动服务器 router.Run(":8080") } // 跨域请求中间件 func corsMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 设置允许的请求来源 c.Writer.Header().Set("Access-Control-Allow-Origin", "http://example.com") // 设置允许的请求方法 c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE") // 设置允许的请求头部信息 c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") // 设置是否允许发送凭据 c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") // 如果是预请求(OPTIONS请求),则直接返回 if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } // 继续处理实际的请求 c.Next() } }
2.官方推荐跨域请求中间件,具体可以看官方示例代码
Podman: A tool for managing OCI containers and pods
中文翻译
Podman 是一个工具,用于管理符合 OCI 标准的容器以及容器组(pods)。
Podman (the POD MANager) is a tool for managing containers and images, volumes mounted into those containers, and pods made from groups of containers. Podman runs containers on Linux, but can also be used on Mac and Windows systems using a Podman-managed virtual machine. Podman is based on libpod, a library for container lifecycle management that is also contained in this repository. The libpod library provides APIs for managing containers, pods, container images, and volumes.
中文翻译
Podman(POD 管理器)是一个用于管理容器和镜像、挂载到这些容器中的卷,以及由一组容器组成的 pods 的工具。Podman 在 Linux 上运行容器,但也可以在 Mac 和 Windows 系统上使用 Podman 管理的虚拟机。Podman 基于 libpod,这是一个用于容器生命周期管理的库,也包含在这个代码库中。libpod 库提供了用于管理容器、pods、容器镜像和卷的 API。
All releases are GPG signed. Public keys of members of the team approved to make releases are located here.
中文翻译
所有的发布都经过了 GPG 签名。已获批准进行发布的团队成员的公钥位于此处。