编辑
2023-09-23
英语学习
00

This is a question from Quora.

As a computer science educator if you can teach only one thing to your students what would it be?

中文翻译

作为一名计算机科学教育者,如果你只能教授一件事给你的学生,那会是什么?

  • Computer Science: 计算机科学
  • Educator: 教育者
  • Teach: 教授
  • One: 一
  • Thing: 事物
  • Student: 学生
  • 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(算法思维)是一种重要的思维方式,它需要学会将问题分解为可解决的小任务,并应用严格限定的指令来解决这些任务。除此之外,算法思维还涉及到一些基础的数学知识。算法思维是计算机科学中的核心概念,它帮助我们设计和实现高效的解决方案。除了语法和数学知识外,算法思维是非常重要的。

  • Algorithmic: 算法的
  • Thinking: 思维
  • Underlies: 构成...的基础
  • Fundamentally: 基本上
  • Need: 需要
  • Learn: 学习
  • Break down: 分解
  • Problems: 问题
  • Smaller: 更小的
  • Solvable: 可解决的
  • Tasks: 任务
  • Apply: 应用
  • Tightly constrained: 严格限定的
  • Instructions: 指令
  • Rest: 其余部分
  • Syntactic sugar: 语法糖
  • Math: 数学

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.

中文翻译

"我想教我的学生如何失败。学习失败的一部分是简单的编程实践。编写代码很有趣,很容易一次写下几十行代码。但调试代码就没那么有趣了,当你的几十行代码以奇怪的方式失败时,你让自己的生活变得比必要的困难得多。所以要采取小步骤:写下最少的可以测试的代码行,然后停下来进行测试。那段代码也会失败,但调试起来相对轻松,而且你会获得在相对短的时间内成功解决许多小失败的心理推动。"

  • teach (教)
  • students (学生)
  • fail (失败)
  • relatively (相对的)
  • learning (学习)
  • much less (更不用说)
  • programming practice (编程实践)
  • write code (编写代码)
  • dozens of lines (几十行代码)
  • debug code (调试代码)
  • strange ways (奇怪的方式)
  • difficult (困难)
  • baby steps (小步骤)
  • smallest number of lines (最少的代码行数)
  • test (测试)
  • pain-free (相对轻松的)
  • process (过程)
  • psychological boost (心理推动)
  • solve (解决)
  • small failures (小失败)
  • 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.

中文翻译

"版本控制在这方面也起着重要作用。如果经常提交代码,你可以偶尔冒一些较大的风险,因为你知道如果不成功,只需一个命令就能将代码还原到已知状态。"

  • source control (版本控制)
  • role (角色,作用)
  • commit often (经常提交)
  • larger risks (较大的风险)
  • secure (安心)
  • one command (一个命令)
  • bring back (还原)
  • 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。"

  • divorcing (分离)
  • code that fails (失败的代码)
  • feeling of failure (失败的感觉)
  • lesson (教训)
  • personally (个人地)
  • easier (小心的)
  • long semester (漫长的学期)
  • learned something (学到了一些东西)
  • feel helpless (感到无助)
  • try something different (尝试不同的方法)
  • eventually (最终)
  • visiting states (经历状态)
  • getting to Z (达到状态 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.

中文翻译

"一旦你学会了如何进行可控的失败,并将编程失败与情绪分离开来,编程就会变得非常有乐趣,你的学习速度将提高一个数量级。"

  • controlled failures (可控的失败)
  • divorce programming failure (将编程失败分离开来)
  • emotion of failure (失败的情绪)
  • programming (编程)
  • enjoyable (有乐趣的)
  • learning rate (学习速度)
  • an order of magnitude (一个数量级)
编辑
2023-09-23
cpp
00
c
#include <stdio.h> #include <stdlib.h> #include <string.h>
编辑
2023-09-23
后端
00

什么时候POST请求会发送两次?

以下是可能导致POST请求发送两次的一些原因:

  1. 重复提交:用户可能在提交表单或发送POST请求时多次点击提交按钮或发送请求的操作,导致请求被发送多次。

  2. 页面刷新:当用户在提交POST请求后刷新页面时,某些浏览器会尝试重新发送之前的POST请求,以便用户可以重新加载页面并继续之前的操作。

  3. 跨域请求:在某些情况下,如果你的网页中存在跨域请求,浏览器可能会发送OPTIONS请求进行预检(preflight),然后再发送实际的POST请求。这样就会导致看起来像是发送了两次POST请求,但实际上第一个请求是OPTIONS请求。

  4. 重定向:如果服务器返回一个重定向响应(例如状态码为302),浏览器可能会自动跟随重定向并发送第二个POST请求。

  5. 缓存问题:一些缓存机制可能会导致POST请求被重复发送。例如,浏览器或代理服务器可能会缓存POST请求的响应,然后在后续请求时重用缓存的响应,从而导致看起来像是发送了两次POST请求。

以下是一些常见的解决方法:

  • 在前端代码中,可以通过禁用提交按钮或在提交请求后禁用表单来防止用户多次点击提交按钮。
  • 在服务器端,可以使用幂等性来处理重复请求,确保多次相同的POST请求不会产生不一致的结果。
  • 如果是跨域请求导致的问题,可以在服务器端进行相应的配置,允许跨域请求或使用CORS(跨源资源共享)机制进行处理。
  • 如果是缓存问题,可以在服务器端设置适当的缓存控制头,以确保POST请求不会被缓存或缓存的时间较短。

根据具体的情况,你可能需要进一步调查并采取适当的解决措施来处理重复发送的POST请求。

什么是浏览器同源策略?

同源策略(Same-Origin Policy)是一种浏览器安全机制,用于限制在浏览器中加载的网页脚本与来自不同源(即不同的域、协议或端口)的资源之间的交互操作。它是为了保护用户的隐私和安全而设计的。

同源策略的基本原则是,当一个网页脚本尝试访问另一个源的资源时,浏览器会阻止这种跨源的操作,以防止恶意网站利用跨域请求获取用户的敏感信息或对其他网站进行攻击。

同源策略的限制主要包括以下几个方面:

  1. 域名:同源策略要求两个网页具有相同的域名(协议、主机和端口),即使两个域名只是在协议、主机或端口上稍有不同,也会被视为不同源。例如,http://example.comhttps://example.com 被视为不同源。

  2. Cookie、LocalStorage 和 IndexDB:同源策略限制了对跨源的 Cookie、LocalStorage 和 IndexDB 的访问。这意味着网页脚本只能访问属于同一源的 Cookie 和存储数据,而无法读取或修改其他源的数据。

  3. DOM 访问:同源策略限制了对跨源文档对象模型(DOM)的访问。网页脚本只能修改属于同一源的 DOM 元素,无法直接访问或修改其他源的 DOM。

  4. XMLHttpRequest 和 Fetch 请求:同源策略对跨源的 XMLHttpRequest 和 Fetch 请求进行限制。通常情况下,这些请求只能向同源发起,无法直接访问其他源的数据。

为了允许跨域请求,浏览器引入了一些机制,如跨域资源共享(CORS)和服务器代理。这些机制允许服务器通过设置适当的响应头来授权特定的跨域请求。

同源策略在保护用户隐私和安全方面起着重要的作用,防止恶意网站滥用用户的信息。然而,有时候需要进行跨域操作,因此开发人员需要了解和遵守跨域规则,并使用适当的跨域解决方案。

什么是预请求?

预请求(Preflight Request)是在进行跨域资源共享(CORS)时,某些特定情况下由浏览器自动发送的一种HTTP请求。它是一个OPTIONS请求,用于在实际的跨域请求之前进行预检,以确定是否允许实际请求的发送。

在以下情况下,浏览器会发送预请求:

  1. 跨域请求:当浏览器发起跨域请求时,即请求的目标与当前页面的域名、协议或端口不一致时,浏览器会发送预请求。

  2. 自定义请求头:如果在跨域请求中使用了特定的自定义请求头(例如Content-TypeAuthorization等),并且这些请求头属于 "CORS安全列表" 之外的请求头,浏览器也会发送预请求。

预请求的目的是为了确保服务器支持跨域请求并允许浏览器发送实际的跨域请求。预请求的发送和处理过程如下:

  1. 发送预请求:浏览器在发送实际的跨域请求之前,先发送一个OPTIONS请求,其中包含了一些额外的头部信息,如Origin(指示请求的源)和Access-Control-Request-Method(指示实际请求的方法)等。

  2. 服务器处理预请求:服务器接收到预请求后,进行预检查。它会检查请求的源是否在允许的跨域列表中,以及是否允许实际请求的方法、请求头等。

  3. 响应预请求:服务器根据预检查的结果,返回包含了对应的响应头信息的响应。响应头中重要的字段是Access-Control-Allow-Origin(指示允许的源)和Access-Control-Allow-Methods(指示允许的方法)等。

  4. 浏览器处理预请求响应:浏览器接收到预请求的响应后,会检查响应头中的相关字段,以确定是否允许发送实际的跨域请求。

  5. 发送实际请求:如果预请求的响应表明服务器允许实际请求,浏览器会发送实际的跨域请求,其中包含了实际的请求方法、请求头等。

需要注意的是,预请求是由浏览器自动发送的,并且在实际请求之前进行。它的目的是为了提供一种机制,确保服务器允许跨域请求,以增加安全性。服务器需要正确地处理预请求并返回适当的响应头,以允许或拒绝实际的跨域请求。

总结

预请求就是浏览器在进行跨域请求访问时向目标浏览器发送的一个预检测请求,检测目标服务器是否支持跨域请求,预请求是一个OPTIONS请求,其中包含了一些额外的头部信息,如Origin(请求源)、Access-Control-Request-Method(实际请求的方法)和Access-Control-Request-Headers(实际请求的头部信息)。服务器收到预请求后,可以检查这些头部信息,并决定是否允许实际的跨域请求。

服务器在收到预请求后,可以通过设置响应头部中的Access-Control-Allow-Origin、Access-Control-Allow-Methods和Access-Control-Allow-Headers等字段来指定允许的跨域请求来源、方法和头部信息。如果服务器确认允许跨域请求,浏览器会继续发送实际的跨域请求,否则将阻止实际请求的发送,并返回相应的错误。

预请求机制的目的是确保服务器允许跨域请求,并在发送实际请求之前进行验证,从而保护用户的隐私和安全。开发人员需要在服务器上正确地配置CORS头部信息,以便处理预请求,并允许必要的跨域请求。

实践,gin设置支持跨域请求

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.官方推荐跨域请求中间件,具体可以看官方示例代码

编辑
2023-09-23
英语学习
00

The following paragraph comes from an introduction to the Github Podman open-source project

Podman: A tool for managing OCI containers and pods

中文翻译

Podman 是一个工具,用于管理符合 OCI 标准的容器以及容器组(pods)。

  • A tool for managing:表示它用于管理、控制或操作容器。
  • OCI containers:这指的是 Open Container Initiative(OCI)定义的容器标准,这是一种容器化技术。
  • and:连接词,将两个概念(管理 OCI 容器和管理 pods)联系在一起。
  • 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。

  • Podman:POD 管理器,容器管理工具的名称。
  • tool:工具。
  • managing:管理。
  • containers:容器。
  • images:镜像。
  • volumes:卷。
  • mounted into:挂载到。
  • pods:容器组。
  • made from:由...制成。
  • groups of containers:一组容器。
  • runs containers:运行容器。
  • Linux:Linux 操作系统。
  • Mac:Mac 操作系统。
  • Windows:Windows 操作系统。
  • using:使用。
  • virtual machine:虚拟机。
  • based on:基于。
  • library:库。
  • container lifecycle management:容器生命周期管理。
  • APIs:应用程序接口。

All releases are GPG signed. Public keys of members of the team approved to make releases are located here.

中文翻译

所有的发布都经过了 GPG 签名。已获批准进行发布的团队成员的公钥位于此处。

  • All:所有(限定词,修饰 releases)。
  • releases:发布版本(名词,主语)。
  • are:是(谓语动词,与 releases 形成谓语)。
  • GPG:Gnu Privacy Guard(名词缩写,描述数字签名工具)。
  • signed:签名(动词的过去分词形式,用于描述 releases 经过签名)。
  • Public:公开的(形容词,修饰 keys)。
  • keys:密钥(名词,宾语)。
  • of:的(介词,用于连接 members 和 team)。
  • members:团队成员(名词,指代团队成员)。
  • the:指定的(限定词,修饰 team)。
  • team:团队(名词,指代团队)。
  • approved:获批准的(动词的过去分词形式,用于修饰 members)。
  • to:到(介词,用于引导不定式短语 "to make releases")。
  • make:制作(动词,与 to 连接形成不定式短语 "to make releases")。
  • located:位于(动词的过去分词形式,用于修饰 keys)。
  • here:这里(副词,表示位置,指的是公钥的位置)。
编辑
2023-09-22
动漫
00

The only place to cry is in the bathroom and Dad's arms.