编程开发与计算机科学

为何 Windows 下无法用 Ctrl+C 终止 Python 进程

在 Windows 命令行中按下 Ctrl+C 或者 Ctrl+Break 可以结束当前正在执行的命令。通常情况下,这个方法同样适用于 Python 的控制台进程。特别地,Python 内置了一个 KeyboardInterrupt 异常专门用于捕获按下 Ctrl+C 而触发的程序退出:

……

一道初中奥数题的蒙特卡洛解法
四只鸭子在一个圆形水池中随机游动。某一时刻,四只鸭子在同一半圆内的概率是多少?

四只鸭子在一个圆形水池中随机游动。某一时刻,四只鸭子在同一半圆内的概率是多少?

这个问题必须隐含一个前提:当水池被分为两半后,任意一只鸭子,要么属于这一边,要么属于另一边,不存在同时属于两边或不属于任何一边的情况。可以把鸭子视作质点,如果鸭子正好落在分割线上,则认为此鸭子属于顺时针方向的一侧。

……

JavaScript 的原型继承
一张经常被使用的关系图

一张经常被使用的关系图

JavaScript 中的每个对象都有一个 [[Prototype]] 的内部属性,该属性指向的对象就是当前对象的原型。每个原型对象也有自己的原型,依次向上遍历形成原型链。当我们访问一个对象的属性或者方法时,如果在当前对象中没有找到该属性或者方法,会通过原型链依次从原型对象中查找,从而实现对象继承的功能。我们可以通过 __proto__ 属性或者 Object.getPrototypeOf() / Object.setPrototypeOf()方法来访问对象的原型:

……

单元测试中的 Dummy、Stub、Spy、Fake 和 Mock

单元测试用来验证一个单元(模块、函数或类)的工作是否正常,测试过程通常需要其他单元进行配合。这种情况下,我们引入测试替身(Test doubles)来替代测试单元的外部依赖,使得测试单元能够顺利运行。这些测试替身分为五种,分别是:

……

    Python 的 MRO 和 C3 线性化

    MRO,即 Method Resolution Order、方法解析顺序,是 Python 对象调用父类方法时的遍历顺序。由于 Python 支持多重继承,类的继承关系可视作一个有向无环图,方法解析顺序就相当于拓扑排序——将图中节点线性排列。自 Python 2.3 起,新式类通过 C3 线性化算法来计算 MRO。

    之所以被称作 C3,是因为算法符合如下三个特性(Consistent with 3 properties):

    ……

    Unikernel 和 Library OS

    Unikernel,中文一般翻译为单一内核。是专门为了运行在虚拟机上而打造的系统。维基百科上的解释是:

    A unikernel is a specialised, single address space machine image constructed by using library operating systems. A developer selects, from a modular stack, the minimal set of libraries which correspond to the OS constructs required for the application to run. These libraries are then compiled with the application and configuration code to build sealed, fixed-purpose images (unikernels) which run directly on a hypervisor or hardware without an intervening OS such as Linux or Windows.

    在解释什么是 Unikernel 前,先来了解一下虚拟机运行通用操作系统有哪些痛点。

    ……

    为网页添加侧边栏目录导航

    一直很反感那些花里胡哨的博客模板,所以为这个网站选择了一套非常简约的主题,并在此基础上简单地修改。主要是将默认的衬线字体改成了非衬线字体,增加了顶部的导航栏等。

    主题默认的章节目录和正文是顺序堆叠(stacklayout)的。然而,在实际使用过程中发现,当文章内容很长时,如果没有章节目录导航的话,阅读体验相当不好,特别是在触屏移动设备上,体验更加不堪。因此,决定给文章页加上章节目录导航。

    ……

    特殊的服务器环境引发的 Laravel 框架异常

    一个使用 Laravel 框架的项目,在某次更新生产环境代码后报了奇怪的错误。而代码在开发环境和测试环境运行都是正常的。由于无法接触到生产环境,只能通过 PHP 引擎的源代码来猜测导致错误的原因

    JavaScript 异步可迭代定时器

    ES8(ES2017)引入了 async 函数和 await 关键字。await 关键字可用于 async 修饰的异步函数或者一个 Promise 对象,而异步函数本质上也就是一个返回 Promise 对象的语法糖。

    ES9(ES2018) 引入了新的 for await...of 语句,可用来遍历异步可迭代对象。异步可迭代对象通过 Symbol.asyncIterator 符号来指定默认的异步迭代器,如果一个对象设置了这个属性,它就是异步可迭代对象。和同步迭代器一样,异步迭代器同样包含一个 next() 方法,该方法返回一个对象,包含 donevalue 两个属性,前者表示循环是否结束,后者是当前循环的返回值。

    ……

    解决 PHP Trait 不能定义常量及成员变量冲突的问题

    PHP Trait 只能定义成员变量和方法,不能定义常量。如下代码会报错:

    php// test.php
    
    trait UsageTrait
    {
        const THE_CONST_NAME = 1;
    }

    错误消息为:

    Fatal error: Traits cannot have constants in test.php

    想要在不同的类中共用一组常量,可以通过接口来解决:

    ……