(Helluva Boss)

译自英语

(Helluva Boss)

205

3969

I.M.P 小组,还可能有 TETO!?

⯆⚉⯆
~Teteteto~

"别跟我说'可爱',我可是黑帮范儿!"
(建议配合某种代理使用。我不知道 JLMM 会不会有效,而且我懒得自己测试)

场景一:
露娜、米莉和莫克西正在逃避警察追捕。

场景二:
你已经在 I.M.P 工作了一个月。今天他们都要开个会。

场景三:
你生病了。露娜在照顾你。(温馨向)

场景四:
你和米莉在地球上执行任务。

场景五:
哎呀......

场景六:
发生了一场大争吵。去安慰露娜吧。

场景七:
你和露娜在犯傻。

场景八:
露娜、米莉、莫克西和比利兹想收养一只新的地狱犬。那就是你,双胞胎。(地狱犬视角)

场景九:
输入你自己的场景。

标签:
计算机真是让人摸不着头脑。往盒子里扔点金属,然后砰。这到底是怎么回事?你的电脑里有一个中央处理器,也就是 CPU。它基本上就是一块硅片,上面有数十亿个微小的开关,叫做晶体管。根据电流的流动,它们可以开启或关闭,有点像灯泡,这就给了我们两种状态:1 和 0。其中一个开关的值叫做一个比特。一个比特本身做不了什么,但把它们放在一起......8 个比特组成一组叫做一个字节,可以有 256 种不同的 0 和 1 组合。恭喜!我们现在可以通过一种叫做二进制的计数系统来存储信息了。每个比特代表 2 的幂,1 表示包含该幂,0 表示不包含,所以这个数字有 1 乘 64、1 乘 4 和 1 乘 1,加起来是 69。这很好,但对人类来说,十六进制更好。它通常用这个 0x 表示,只是一种比二进制更易读的格式。四个二进制位可以取 0 到 15 之间的任何值。十六进制用 0 到 9 和 A 到 F 来表示这些值,所以一组四个比特可以用一个十六进制数字代替。好了,现在我们可以存储数字了,我们只需要让计算机真正,你知道的,对它们做点什么。使用晶体管,你可以制作逻辑门,这是封装逻辑语句的电子电路。你可以把它想象成一个有两个开关的灯泡,灯只在特定条件下亮起,例如只有当 A 和 B 都开启时才亮。通过巧妙地组合逻辑门,你可以构建根据布尔代数执行计算的电路,布尔代数是一种将二进制数学运算形式化的系统。但是,尽管计算机理解 0 和 1,对人类来说它并不是那么有用。因此,使用像 ASCII 这样的字符编码,我们可以为每个字符分配一个二进制数字。当你在键盘上输入任何内容时,它会被翻译成这种二进制代码,计算机一看到它,就会说:啊对,那是一个大写 A,然后把它拍到屏幕上。这些设备如何组合在一起由操作系统内核处理,比如 Windows、Linux 或 Mac,它位于计算机硬件和应用程序之间,管理它们如何协同工作,例如通过设备驱动程序。输入设备让你按一个按钮就能向计算机发出指令,但在最低层,计算机只理解机器码形式的指令,机器码是告诉 CPU 做什么和使用哪些数据的二进制代码。在执行这些指令方面,CPU 有点像天才,只是有着一条痴呆金鱼的记忆力。它可以处理任何指令,但它不能存储任何数据,所以它只有配合随机存取存储器(RAM)才真正有用。你可以把它想象成一个网格,每个格子可以容纳一个字节的信息,可以是数据或指令,并且有一个地址,让 CPU 可以通过四个步骤访问它。从内存中获取,解码指令和数据,最后执行并存储结果。这是一个机器周期。由于程序基本上只是一个指令和内存的列表,要运行它,CPU 会在机器周期中逐个执行它们直到完成。哦对,我有没有提到这发生得,真的,非常快?现代 CPU 每秒可以做数十亿个周期,这些周期由一个时钟发生器协调和同步。这个时钟的速度以千兆赫兹为单位,人们经常超频他们的 CPU 来提高性能,这很好,但可能只会把你的电脑烧着。更疯狂的是,一个 CPU 有多个核心,它们可以并行执行不同的指令,也就是同时进行。每个核心还可以分成多个线程,这允许每个核心同时处理多条指令,也就是在它们之间非常快速地切换。好吧,这很酷,但如果你根本没有办法给计算机下达指令,那它再强大也没用。手动输入机器码可能会让你发疯,但幸运的是,你不必这样做。内核被包裹在一个 shell 中,shell 只是一个向用户暴露内核的程序,允许在命令行界面中通过文本输入发出简单指令。但让计算机做有用事情的最好方法是使用编程语言,它使用抽象,这样你就可以写出看起来像这样的代码,而不是这个,然后它会被转换成为你准备的机器码。一些语言如 Python 使用解释器,它直接尝试逐行执行源代码。其他语言如 C 或 Go 使用编译器,它在把整个程序放入 CPU 可以执行的文件之前将其转换为机器码。现在,每种编程语言都有不同的语法,但几乎所有语言都有一些基本工具。使用数据最基本的方式是变量,它把一个值赋给一个名称,然后可以重用和修改。根据值的不同,变量可以有不同的数据类型。对于文本,有单个字符和多个字符组成的字符串。对于数字,有整数,如果为负数也可以是有符号的,还有用于小数值的浮点数。它们被称为浮点数是因为小数点可以浮动,以在精度和范围之间进行权衡。这是可能的,因为它们使用科学计数法。它是某个数乘以一个幂,告诉你把小点放在哪里,这正是它们在底层的样子。实际的数字用二进制分数存储。有些分数,比如三分之一,在二进制中只能用一个无限和来近似。但是,由于内存不是无限的,你必须在某个点截断它,这会导致舍入误差,有时会造成相当奇怪的计算结果。如果这些还不够,long 和 double 使用两倍的内存来将 int 和 float 的范围翻倍。一些语言如 Python 会自动判断变量的类型,但在像 C 这样的语言中,你必须显式声明变量的类型。变量的值存储在内存中的某个地址。指针是值为另一个变量内存地址的变量,用这个 & 符号表示。所以实际上,指针只是一块内存指向另一块内存。由于内存地址只是一个数字,你可以对它进行加减来在单个内存字节中导航。这叫做指针算术。在一些像 C 这样的低级语言中,你必须手动分配和释放不再使用的内存。这一切都发生在堆中,堆是内存的一部分,可以根据程序的需求动态增长和收缩,这允许更多的控制,但也使你的代码极其容易被完全破坏。你可能会触碰不该触碰的内存,或者根本不存在的东西,这被称为段错误。而且,如果有一块不再使用的内存,你忘记释放它,或者你再也无法访问它,那块内存就不再可用。这叫做内存泄漏,会导致程序变慢并最终崩溃。为了避免这种混乱,像 Python 这样的高级语言有内置的垃圾回收器为你管理内存。不同的数据类型占用不同数量的内存。整数通常是 4 个字节的内存,单个字符通常是 1 个字节的内存,而字符串只是多个字符字节加上一个空字符来标记字符串的结尾。像这样把多个项目存储在连续的一块内存中就是数组的思想。更一般地说,它是一个具有相同数据类型的项目列表,每个项目都有一个数字索引,通常从 0 开始。由于这些项目在内存中彼此相邻,通过知道第一个项目的地址,你可以使用指针算术快速索引到数组中的任何项目。数组就是所谓的数据结构,它只是一种组织数据以便更容易处理的方式。从数组中检索值快得惊人,但数组的大小通常在创建时是固定的,所以当它满了你就不能再添加任何东西,而如果你没有全部用完,那就是浪费内存,所以更灵活的选择是链表。它使用包含值和指向下一个节点的指针的节点,这允许它们在内存中分散开来。而且,它可以动态增长和收缩,因为你可以添加和删除任何节点,还可以通过简单地重新排列指针来重新排序。这很好,但它们可能不实用,因为除了遍历之前的每一个节点,你没有办法访问最后一个节点。尽管如此,数组和链表都很有用,因为它们允许你创建队列和栈。栈遵循后进先出原则,就像从一摞煎饼中拿煎饼一样。实际上,只需想象一个指针总是指向最后添加到结构中的项目,然后你可以弹出,也就是移除最后一个项目并使指针向后递增。队列遵循先进先出原则,使用两个指针,一个指向最先添加的项目,一个指向最后。任何新项目都会添加在最后一个指针之后,然后更新它,而出队从第一个指针开始。另一个有用的数据结构是哈希映射,它只是一个键值对的集合。它的工作原理有点像数组,但使用哈希函数来获取一个键并将其分配到一个索引,然后在那里存储它的值。但有时,两个不同的键可以映射到同一个索引,这叫做冲突。有不同的方法来处理这个问题,但一种方法是在数组的那个位置创建一个链表,这使得查找该值稍微慢一点,但尽管如此,哈希映射非常有用,因为你可以定义指向每个值的键,而且由于它们基于数组,检索它们快得惊人。对于许多问题,将不同数据点之间的关系表示为数据结构可能非常有用。如果你取链表的节点,但允许任何节点指向任何其他节点,你就得到了一个图,其中节点由边连接,边可以是有向的、无向的,甚至可以带有权重,权重可以代表任何度量,比如距离或成本。图对于分析网络中的群体或找到两点之间的最短路径很有用,例如在谷歌地图中。搜索图主要有两种方式。广度优先搜索从一个节点开始,一层一层地向外扩展,直到第一次找到目标节点。深度优先搜索完整地探索每一条路径,直到到达死胡同,然后回溯到最后一个有不同路径的节点,从那里继续以同样的方式进行,直到找到目标节点。任何两个节点都由恰好一条路径连接的图叫做树,代表一种层次结构,例如你电脑上的文件系统。树从根开始,分支成子树,子树以叶节点结束。父节点可以有任意数量的子节点,但通常二叉树是最有用的。例如,一棵二叉树,其中任何节点左边的所有值都更小,右边的所有值都更大,叫做二叉搜索树,这使得查找特定值非常快。如果你想找到目标值,只需从根开始。如果目标小于该节点,向左走,如果更大,向右走,重复这个过程直到找到目标。我们刚刚使用的是一种非常简单的算法,它只是一组逐步解决问题的指令。写算法最简单的方式是函数的形式。它接收输入,对它们做些什么,并返回一个输出。就像变量一样,你可以通过名称调用函数并传入不同的参数。调用函数时,函数调用会被推入调用栈,调用栈是用于执行代码的短期内存,顾名思义,它基于栈数据结构,也就是后进先出。为了实现算法,你经常需要比较两个值,你可以用大于或等于这样的运算符,以及与、或、非这样的逻辑表达式来做到这一点。像这样的表达式很简单,它们可以为真或为假,这是布尔数据类型的可能值,允许你编写条件语句。如果某个条件为真,做这个,否则做那个。布尔值也可以用来循环代码的某些部分。一种方式是 while 循环。当这个条件为真时,这段代码将执行。另一种方式是 for 循环,它可以遍历数据结构(如数组)中的每个元素,但也可以通过设置一个起始值、每次迭代后递增它,并用一个条件设置上限,来循环特定的迭代次数。函数也可以调用自己,这叫做递归。当一个问可以分解成更小的相同问题时,这很有用,比如计算 5 的阶乘,也就是 5 乘以 4 的阶乘,也就是 4 乘以......但是,默认情况下,递归函数只会永远不停地调用自己。这意味着它会不断将更多的函数调用推入调用栈,直到超出栈内存,造成栈溢出。这并不理想。要阻止这种情况,你必须给递归函数添加一个基本情况,定义何时停止。只有这样,函数调用才会执行而不会让你的电脑崩溃。递归很酷,但在时间和空间上可能相当昂贵。因此,为了最小化所需的计算量,过去的结果可以保存在缓存中,这样如果它们再次出现,计算机就不必从头重新计算它们。这叫做记忆化。说到性能,要判断一个算法有多好,你可以看时间复杂度和空间复杂度,也就是运行它需要多少时间或空间。这用大 O 表示法来衡量,它描述了输入大小的增长与执行算法所需的操作数之间的关系。例如,对数组中的每个数字加 1 是 O,因为随着数组增长,操作数以线性方式增加。相关的不是确切的运算次数,而是当输入大小趋于无穷时的趋势。你看,像 n 的阶乘这样的东西增长得比任何线性函数都快得多。所以只要时间复杂度是某种线性关系,它就被简化为 O,其他任何组也是如此。写算法时,总是有不同的方法。暴力方法就是简单地检查每个项目,直到我们在列表中找到目标。但如果你想让你的程序跑得比花园里的蜗牛还快,你需要更精细的方法,比如分而治之。例如,在二分查找中,你反复检查中间元素,看看目标在哪一侧,并在那一半继续搜索直到找到它。此外,写代码总体上也有不同的方法,这叫做编程范式。声明式编程描述代码做什么,但不描述计算机应该具体怎么做,而命令式编程则明确描述计算机应该如何通过详细的指令来达到结果。命令式编程的一个扩展是面向对象编程,你可以将类定义为对象的蓝图,对象是单个单元,由属性形式的数据和方法形式的行为组成。要编写一个类,你首先要将属性定义为变量,将方法定义为函数。将属性和方法封装在一个类中后,你可以实例化一个对象,并使用点号表示法来使用它的属性和方法。类使组织和重用代码变得容易,因为你可以定义子类,它们继承超类的属性和行为,但也可以扩展和覆盖它们。例如,一个橡皮鸭子子类可能会用吱吱声来实现嘎嘎叫。因此,橡皮鸭子可以被当作鸭子类的对象对待,但在调用嘎嘎叫时表现不同,这就是多态的概念。但对于一些问题,这些传统范式都不起作用。假设你想让计算机识别这些图像中哪一个是蜜蜂。问题是,你无法真正用代码描述蜜蜂长什么样。这就是机器学习的用武之地,也就是教计算机完成一项任务,而不明确地编程让它做那项任务。首先,你需要大量数据,你可以将其分为训练数据和测试数据。接下来,你选择一种可以随时间改变其参数的算法,例如一个可以更新权重以获得不同结果的神经网络。通过将大量训练数据输入这个算法,你可以构建一个模型,然后你可以用测试数据检查其准确性。如果它不太对,模型可以随着时间的推移通过将输出与它应该是的结果进行比较来改进,将差异捕获在一个误差函数中,并调整其参数以最小化差异。但无论它多么未来主义、前沿、快得惊人且经过优化,如果你想让人们真正使用你写的应用程序,你可能应该了解互联网。它是一个由来自全球各地的计算机通过电缆连接而成的网络。真的,字面意义上,互联网只是一堆粗电缆,它们铺在海底,连同互联网服务提供商等设施一起,将你连接到你的目的地。这些计算机使用互联网协议套件进行通信。网络上的每台计算机都有一个唯一的 IP 地址,两台计算机随后可以使用传输控制协议传输数据。它把消息分解成一堆数据包,通过电线网络发送,然后接收端再把消息重新组装起来。如果你网络连接不好,你可能经历过丢包,也就是其中一些数据包在途中丢失了。如果互联网是硬件,那么万维网就是软件,你可以用浏览器使用它。网上的每个页面都有一个 URL。当你在浏览器中输入它时,它会用域名系统查找托管这个网站的服务器 IP 地址,域名系统就像一个字典,将域名映射到实际服务器的 IP 地址。通过 TCP 连接到它之后,你的浏览器(称为客户端)使用超文本传输协议向服务器发送 HTTP 请求,服务器然后给出响应,理想情况下包含网页的内容。实际的网站通常由三部分组成。一个 HTML 文件包含网站的所有内容,基本上只是一个元素的集合,可以是文本、链接、按钮等等。一个 CSS 文件控制视觉效果,让网站看起来漂亮。但如果按下漂亮的按钮什么都不做,网站就没用了,所以像 JavaScript 这样的语言添加了功能。但有时,事情可能会出错。每个 HTTP 响应都带有一个响应代码,它携带关于响应状态的信息。例如,200 表示 OK,任何以 4 开头的都是错误,最著名的是 404,页面未找到。HTTP 请求可以携带不同的方法,例如 get、post、put 和 delete,也就是检索、添加、更新和删除信息。这些经常被应用程序编程接口使用,接口连接两个应用程序并允许它们相互交互。例如,从数据库中存储和检索数据。最常见的数据库类型是关系数据库,它使用表来存储数据。表的列包含不同的属性,而行代表单个数据点。此外,每个表都有一个称为主键的唯一属性。外键是另一个表的主键,在两个表之间建立关系。在这种情况下,每本书都与一位作者相连。使用像 SQL 这样的语言,你可以编写语句来处理这些表中的数据。你可以查找所有标题以 H 开头的书的标题和作者,但为此我们必须在匹配的键上将作者表与书表连接起来,将来自不同表的两个属性合并成一个,从而给我们这个输出。这些语句很有用,但你得小心,否则你可能会用一行代码就删除整个数据库。但别担心,这种事从来没发生过。每个登录页面背后都是一个带有用户名和密码的数据库。当用户尝试登录时,通常会使用一个 SQL 查询来检查用户输入是否与数据库中的条目匹配。这很好。但一个狡猾的行为者可以输入像这样的东西,它通过提前终止字符串并注释掉其余部分来改变查询,这意味着只要这个用户名存在于数据库中,就能获得访问权限。这叫做 SQL 注入攻击,这是黑客进入他们不该去的地方的最简单方法之一。听说这些概念是一回事,但要真正学会它们,你必须看到它们在实际中运行并自己使用它们,这正是你可以用 Brilliant 做到的,它有成千上万的互动课程,涵盖从数学和数据科学到编程和 AI 的一切。它们让知识扎根,通过视觉课程和互动问题,这不仅有趣并培养直觉性的问题解决能力,而且被证明比仅仅观看数小时的讲座有效六倍。我知道抽出时间学习新技能可能很困难,但 Brilliant 让它变得如此容易。你可以在任何设备上、任何地方、任何时间,每天只需几分钟,通过小份课程从头开始构建宝贵的知识。你将从一个数据科学的基础,到分析来自 Spotify 的真实数据集,在极短的时间内完成,你还可以用数学基础和 Python 编程课程来补充,以构建我们这个时代最受欢迎的技能组合之一。最棒的是?你可以通过访问 brilliant.org 斜杠 wackyscience,免费整整 30 天尝试 Brilliant 提供的一切。你还可以获得年度高级订阅 20% 的折扣。感谢 Brilliant 赞助这个视频。

已创建 1月30日

已更新 8月9日

已发布 1月30日

已允许代理

已发布聊天