自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

高厉害 0w0

你来到了知识的荒原...

  • 博客(83)
  • 资源 (1)
  • 收藏
  • 关注

原创 【手写协程】带你从底层实现一个最小协程调度器

带你从底层慢慢实现:事件循环、事件队列、IO 多路复用、Timer、生成器执行器、Promise、Thunk

2022-07-04 13:48:42 494

原创 【Python】基于生成器的协程实现

协程这篇文章将阐述 协程(coroutine) 以及相关概念的含义,并给出和分析一个基于生成器的、使用 Python 实现的协程调度器示例,以及一个测试用的异步 HTTP 请求实现。概念进程、线程、协程一个进程下可以有多个线程,一个线程又有多个协程,似乎就是一个从上到下的层次的结构。但这并不严谨,如果能深入协程的运行方式,就会发现协程与另外两者完全不同,因为比起由 OS 调度的进程和线程来说,协程的调度行为只是一个普通的程序。这种普通来源于,协程的调度行为完全是在用户空间中进行的,如果将 OS 看

2021-09-17 22:21:56 397

原创 详解区块链

目录bitcoinbitcoin 和 blockchain交易p2p 网络账户货币和交易货币数字签名交易UTXO交易的匿名性交易实例问题信任两个信任问题双重支付篡改记录拜占庭将军问题区块和哈希链工作量证明难度调整激励创世区块实例工作量证明存在的问题bitcoinbitcoin 和 blockchainbitcoin(比特币),p2p 电子货币系统。bitcoin 的背后是一种名为 blockchain(区块链) 的技术,区块链构建了一个由算法保证的 可信的去中心化 p2p 网络,并在该网络上维护一个

2021-06-05 23:18:27 515 3

原创 【Java Web】Web 服务器简单原理,如何理解 Tomcat、Servlet,并实现一个玩具 Web 框架

Web 服务器原理Tomcat我们经常将 tomcat 称为 服务器,然而这种说法让我迷惑了很久。我认为 tomcat 所作的工作比较接近 Web 框架 这个概念。只不过,在 Java ee 的生态中,Servlet 才应该被称为 框架,而 tomcat,我们可以认为它是 框架的实现。要理解这些东西的含义和 Java Web 服务器(如 tomcat)原理,我们应该首先来谈一下 Servlet。ServletServlet 本质是一个接口,Java 并没有对它做任何实现,仅提供了 Servlet

2021-03-16 20:21:10 1155 6

原创 所有笔记搬运到这里,并持续更新。。。

→ https://gaolihai.top/note/该页面基于 Docute 实现。

2020-08-11 12:50:50 197

原创 【TS】TypeScript 实践中的 Equals 是如何工作的?

在 ts 中如何判断两种类型完全一致?三年前,在社区有一场关于支持 type level equal operator 的讨论 TypeScript#27024。大佬 @mattmccutchen 给出了一个非常精彩的解决方案:它本人并没有给出任何关于这个类型工作原理的解释,但它确实非常 work,在实践中被大量使用。不过,在后面其他人的交流中,发现了一些可能对理解有帮助的 comment。@fatcerberus这个类型在做的事情实际上就是,对 和 做 assignability 检查。而这个针对 c

2023-01-07 20:48:36 1179 1

原创 【TS】ts 中一些零碎特性记录

使用 spread opt in tuple 时,会出现类似 union 的分配避免 distributioninterface any value 会跳过可分配性检查

2023-01-03 18:31:44 774 2

原创 【Web】在浏览器中进行文件下载的实践记录

同源、非同源、可跨域场景下的解决方案和浏览器行为

2022-12-30 21:02:54 1068

原创 【TS】如何在 typescript 中迭代 union 类型?

如果我们的 union is assignable to但若 union 中存在额外情况,那就需要使用其他办法了。将 union 拆解开来并单独访问,我们知道 conditional type 有这个能力,因为 union 在其中会被拆解并分别 distribute 到单独的表达式中,但可惜的是,在运算结束后,这些值最终仍然会被 union 到一起,这个行为我们无法控制。对重载的函数,推断其函数签名时总以最后一个为准。last。

2022-12-20 21:36:13 532

原创 【TS】如何在 typescript 中将数组字面量推断到 tuple

Tuple 保留了数组内容的更多信息,包括数组长度,以及每个元素的类型(尤其是字面量类型)和元素之间的相对位置。尝试一下 实现 Promise.all 的类型。一个比较优秀的实现是:其中 用于显式将参数类型推断为 tuple,而不是更宽的数组类型 。不过,typescript 标准库里是这样实现的:注意到它没有使用 ,而是将泛型 的约束变成了一个 union type ,追加了一个空 tuple 类型。而当类型中包含 tuple 时,编译器会先一步**推断(inference)该类型为 tuple,

2022-12-19 20:18:50 387

原创 【TS】如何在 typescript 中合并一个 interface union?

这玩意利用了 union type 在 conditional type 中的 distributive 的特性,将 union 在第一个 condition 中 map 到多个具有单独类型参数 function,然后再 infer 到函数的参数上,就从 union 变成了 intersection。对上面这个合并的函数来说,我们要求他的参数类型一定是同时满足 union 中所有函数的参数类型的,所以一定是取交。函数中的参数,在上面的例子中,这个函数实际上是将 union 中的两个函数合在了一起。

2022-12-17 17:06:59 2185 1

原创 【踩坑】POST 方法的基于摘要的协商缓存实现

POST 协商缓存

2022-11-29 02:01:12 423

原创 【踩坑】复活 Pico-Go

在本地构建 Pico-Go 插件。

2022-07-15 13:09:22 502

原创 macOS 锐捷校园网解决方案

macOS 锐捷校园网解决方案bilibili【西农】破解校园网限制——锐捷网络共享我做的不是破解校园网限制,而是在 macOS 上正常使用校园网。河北农业大学没有提供锐捷 for mac 客户端,使用其他学校的客户端,如西北农林科技大学,可以认证成功,但会在五分钟左右掉线,西农的客户端可以在这里下载。然后也尝试过使用 mentohust,无法直接认证。我找到了一个解决方案,即首先使用锐捷客户端进行认证,然后在掉线前使用 mentohust 认证,即可认证成功,最后杀掉锐捷客户端进程。sudo

2022-05-18 14:47:21 1747 2

原创 【JavaScript】MDN 阅读笔记

MDN 阅读笔记从大一到现在,一直在重度使用 JavaScript 相关的技术栈,却一直也没写过系统的笔记。主要是太熟悉,也因为 JavaScript 确实是一门不需要学习就能直接上手开发的语言。最近要准备面试,想系统地看看 JS 的语法、特性,觉得是时候记录一些东西了。这些笔记会忽略一些基础内容,仅记录遇到的问题,以及我认为值得记录的东西。迭代器协议https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Iterators_an

2022-05-01 04:23:09 1270

原创 【踩坑】在不同平台下编译使用 MySQL C API 的应用程序

在不同平台下编译使用 MySQL C API 的应用程序最近需要调 MySQL C API 写一些程序,最开始是在 UNIX(macOS) 下开发的,跟着官网的文档做,基本上没出现什么问题,编译非常顺利。这是 C API 的说明页 -> https://dev.mysql.com/downloads/c-api/MySQL 对 macOS 平台提供了压缩包,在这里 -> https://dev.mysql.com/downloads/mysql/我们只需要将里面的 include 和 l

2022-03-19 03:40:11 387

原创 【CS143 Compiler】1. 环境配置、踩坑

CS143 环境配置斯坦福 CS143 Compiler 课程。课程主页在 https://learning.edx.org/course/course-v1:StanfordOnline+SOE.YCSCS1+2T2020/home。它提供了一个预配置的虚拟机,是基于 Ubuntu 古老版本的 Bodhi,这个虚拟机必须跑在 x86 platform 下,我的 M1 Pro mbp 尝试了两个下午后放弃了。CS143 的远古 VM今天装 CS143 提供的虚拟机,由于这是 x86 下创建的,我

2022-03-02 15:19:55 1406 2

原创 【Python】4. Python 并行

并行基于协程的并行基本原理概述协程是一种在线程中被调度的函数,也称作微线程。它的调度与进程、线程不同,完全在用户空间中进行,即协程的调度器行为与操作系统无关。协程可以在等待异步 I/O 时立刻保存当前执行栈帧的上下文,并从调度器处返回,调度器会转而调度和执行其他协程。当 OS 通知调度器异步 I/O 结束后,调度器会带着异步 I/O 的结果调度该协程,并从内存中恢复上下文,从刚才退出协程的位置进入协程继续执行。由于协程只会在开发者指定的位置被调度,所以几乎可以不考虑对资源的原子性访问的问题。

2021-09-20 17:47:30 380

原创 【Python】2. Python数据类型

Python 数据类型运算符算数运算+ - * / // % **// 整数除法,与 C 中的对整数的除法相同,结果向下取整** 幂运算位运算<< >> & | ^ ~比较运算< > <= >= == != && ||默认的相等性比较 == != 依据的是对象的内存引用。

2021-09-14 17:52:01 575

原创 【Python】1. Python 解释器

Python 解释器参考资料:python std lib -> https://docs.python.org/3/library/index.htmlpython tutorial -> https://docs.python.org/3/tutorial/index.html命令行参数-c command-c 参数允许我们向解释器传递一个字符串作为 python 脚本, 例如:python -c 'import sysprint(sys.argv) # ['-c']pr

2021-09-14 17:51:01 132

原创 Node.js 标准库 api 类型声明有误

Node.js 标准库 api 类型声明有误在 Node.js v15.9.0 加入的 api fsPromises.watch(filename[, options]),在 @types/node/fs/promises 中的返回值类型有误。参考文档 -> https://nodejs.org/docs/v15.9.0/api/fs.html#fs_fspromises_watch_filename_options在该 api 最初被加入时,返回值类型就已经在文档中明确给出为一个异步可迭代对象

2021-08-10 13:33:06 181

原创 【现代图形学基础 Games101】3. Viewing Transformation

Viewing Transformation视图变换包含三部分 —— MVP(Model-View-Projection),模型、视图和投影。模型变换就是前两节阐述的直接总用于点集的变换,但如果想看到图像,我们还需要定义一个摄像机,这一部分也包含变换,被称为视图变换,我们下面就来叙述它。View/Camera定义一个摄像机Position e⃗\vec{e}eLook-at/gaze direction g^\hat{g}g^​Up direction t^\hat{t}t^前两个参数

2021-07-24 21:42:46 279

原创 【现代图形学基础 Games101】2. 3D Transformation

3D Transformation类比 2D 变换:[x′y′z′1]=[abctxdeftyghitz0001][xyz1]\begin{bmatrix}x^{'} \\y^{'} \\z^{'} \\1\end{bmatrix} =\Large{\begin{bmatrix}\textcolor{orange}{a} & \textcolor{orange}{b} & \textcolor{orange}{c} & \textcolor{#0aa}{t_x}

2021-07-23 11:43:23 151 2

原创 【现代图形学基础 Games101】1. 2D Transformation

TransformationCannot read property 'type' of undefined1. Scale将一个平面点集进行平面缩放,记在 x, y 方向缩放倍数为 sx sys_x \ s_ysx​ sy​。Scale Matrix:[x′y′]=[sx00sy][xy]\begin{bmatrix}x^{'} \\y^{'}\end{bmatrix} ={\Large\begin{bmatrix}s_x & 0 \\0 &am

2021-07-22 14:27:31 189 2

原创 【koa】静态资源访问,以及条件请求(Conditional Requests)

实现静态资源访问实现可配置的静态资源中间件存在几个需要注意的问题:首先是 HEAD 和 GET,在 HTTP 请求中,它们具有相同的语义。是否等待下游中间件返回后访问静态资源,这作为一个可选项暴露在参数中。注意不要覆盖已有的处理结果,if (ctx.body != null || ctx.status !== 404) return;恶意行为,使用 resolve-path 包来避免恶意访问。path = resolvePath(config.root, ctx.path.r

2021-03-19 23:10:32 678

原创 【开发总结】Mirai-js 开发总结

Mirai-jsMirai-js 是运行在 Node.js 平台的 QQ 机器人开发框架,Mirai 的社区 SDK,Mirai-js 基于 mirai-console 的 mirai-api-http 插件。mirai-api-http 通过 http 提供 Mirai 的全平台接口。这是我第一次对开发框架做出的尝试,由于机器人功能均由 mirai-api-http 实现,所以重点都放在框架的设计上,确实学到不少东西,也很有成就感。项目仓库:https://github.com/Drincann/

2021-02-22 15:48:40 1532 1

原创 【Mirai-js】如何快速制作一个 QQ 机器人

快速开始完整文档见 -> https://drinkal.github.io/Mirai-js把项目 clone 到本地:$ git clone https://github.com/GAOSILIHAI/Mirai-js.git登录可以直接在 mirai-console 中输入/login qq password。若想要远程控制 mirai-console 登录,可通过 Bot 的类方法sendCommend发送命令:await Bot.sendCommand({ // mi

2021-02-05 18:59:07 2237 2

原创 使用 express 构建简单 GraphQL 接口

使用 express 构建简单 GraphQL 接口GQL**GQL(Graph Query Language)**是一种查询语言。用来设计出较 Restful api 更易于扩展和升级的接口,可以理解为 Restful api 的替代品。GQL 服务可以开放在 Restful api 下,不过其逻辑并不依赖任何平台。在后端,可以使用 GQL 直接描述数据模型,或使用 GraphQL.js 提供的其他接口来描述数据模型。在前端,使用 GQL 直接描述我们需要的数据结构,然后就可以拿到不多不少、结构

2021-01-25 19:12:49 1168 4

原创 【ostep】04 虚拟化 CPU - 进程调度策略

进程调度策略我们称系统中运行的进程为工作负载(workload),我们对工作负载的假设越具一般性,基于该假设设计的调度策略的表现就越优化。下面的讨论均假设,工作负载仅占用 CPU,而不发出任何 I/O 操作。调度指标调度指标用来衡量不同调度策略的优劣周转时间(turnaround time)就是一个任务从交给操作系统到运行结束所用时间。工作周转时间 = 工作完成时间 - 工作到达时间该指标主要看的是平均周转时间:一段时间内多个任务周转时间的均值。平均周转时间 = 周转时间之和 / 工作

2021-01-08 20:07:04 640

转载 【Web】前端主动触发事件

creatEvent —> initEvent —> dispatchEventif(el.dispatchEvent){ var evt = document.createEvent('Event'); evt.initEvent(type,true,true); el.dispatchEvent(evt);}else if(el.fireEvent){ el.fireEvent('on'+type);}createEvent(eventType)

2021-01-08 16:39:39 433

原创 【ostep】03 虚拟化 CPU - 受限直接执行机制

受限直接执行我们已经学习了进程这个抽象概念,下面要接触到具体的机制了,之前说过,机制是某个功能的实现细节,而策略则类似于对机制的调度。要学习的第一个机制被称为受限直接执行(Limited Direct Execution)。作为一个优秀的操作系统,应该小心地提供那些会导致危险的指令(例如对硬盘的 IO 操作,称特权指令),这些操作被操作系统封装为系统调用(system call)。但是这里还有一个问题,系统调用终究也是一长串指令序列,看起来它与用户的程序并无不同。毕竟 CPU 执行指令时也不会考虑这

2021-01-06 20:06:07 321

原创 【ostep】02 虚拟化 CPU - 进程

进程 (process)进程的抽象进程是一种最基本的抽象。进程的非正式定义非常简单:进程就 是运行中的程序。程序本身是没有生命周期的,它只是存在磁盘上面的一些指令(也可能 是一些静态数据)。是操作系统让这些字节运行起来,让程序发挥作用。操作系统决定何时令 CPU 运行何地的指令,通过不断地切换内存中不同程序的指令,类抽象出同时执行多个进程的错觉。可以很自然地联想到组原中的 IO 中断方式,他通过一种类似回调的方式,令 CPU 中断当前运行的程序,关中断,并将断点地址压栈,开中断,跳转至中断向量

2021-01-06 20:05:18 162

原创 【ostep】01 操作系统 intro

操作系统操作系统是什么操作系统就是运行在硬件之上的软件,夹在硬件和上层应用程序之间。为硬件统筹和管理资源,同时为应用程序提供抽象。要做到这一点,操作系统主要利用一种通用的技术,我们称之为虚拟化(virtualization)。 也就是说,操作系统将物理(physical)资源(如处理器、内存或磁盘)转换为更通用、更 强大且更易于使用的虚拟形式。因此,我们有时将操作系统称为虚拟机(virtual machine)。很久之前,操作系统有另一个名字 —— “主控程序”,如果没有这个"主控程序",软件(

2021-01-06 20:04:12 246

原创 【PHP 系列笔记】02 PHP 基础

PHP 基础PHP 代码结构PHP 标签嵌入在 HTML 中:// html<?php // ... ?>// html作为一个单文件时允许标签不闭合:<?php// ... 另外还允许简写(需要在php.ini中添加short_open_tag = On) :<?// ...?>此外还允许使用script标签:<script language="php"> // ...</script

2021-01-06 20:02:10 244

原创 【Core Java】06 Java 接口和内部类

接口和内部类接口接口我们常说,“接口是多个类的公有规范”,这句话本没错,但我们容易误解或忽略"规范"这两个字,这会令初学者远离接口的本质。如果不理解接口,也就很难理解"规范",从而再次很难理解接口,所以我们应该使用更加浅显的话来描述接口 —— “接口是对类的需求描述”。接口是需求描述,对类的需求描述。编写接口的目的是,为了完成一些通用的功能,需要向未知类索取一些方法,这些方法就是对类的需求描述,然后我们对这些行为进行抽象,定义这些抽象行为的规范。相反,实现接口是为了让我们的类更加通用,与他人的

2021-01-06 19:59:55 517

原创 【Core Java】04 Java 反射

继承和多态概念继承继承extends:Java 中的继承均为公有继承子类和超类:即子类和父类(也称基类)Java 的继承不用考虑诸如虚函数(虚表、虚指针)等底层细节,不需要额外的显式声明就可以实现动态多态。也就是说,Java 的方法均为虚函数(并不严谨),如果不希望让一个方法是虚拟的,可以使用final关键字修饰。或者,对于static、private方法,不涉及动态多态。虚表、虚指针是 C/C++ 对多态的实现方案,Java 有自己的实现方案 --> 方法表。不过从思路上讲,基

2021-01-06 19:57:54 87

原创 【Core Java】03 Java 继承和多态

继承和多态概念继承继承extends:Java 中的继承均为公有继承子类和超类:即子类和父类(也称基类)Java 的继承不用考虑诸如虚函数(虚表、虚指针)等底层细节,不需要额外的显式声明就可以实现动态多态。也就是说,Java 的方法均为虚函数(并不严谨),如果不希望让一个方法是虚拟的,可以使用final关键字修饰。或者,对于static、private方法,不涉及动态多态。虚表、虚指针是 C/C++ 对多态的实现方案,Java 有自己的实现方案 --> 方法表。不过从思路上讲,基

2021-01-06 19:53:41 130

原创 【Core Java】05 Java 类的设计及特性

类的设计及特性类的设计隐藏数据为了类的封装性,在设计类时,应该避免直接对外开发数据域。为了保证开发者不依赖于我们的底层细节,应该隐藏数据域(因为不能保证数据形式不会变化),并提供稳定的接口。必要时,会提供访问器和更改器,对数据进行访问保护。public long getAge() { return this.age;}public void setAge(int age) { // 校验 age 是否和发 if(/* condition */){ th

2021-01-06 19:52:49 101 2

原创 【Core Java】02 Java 面向对象基础

封装类的定义class Type{ public String _var; // 成员属性 public Type(...){ // 构造方法 // ... } public void method)(...){ // 成员方法 // ... }}成员变量初始化:class Type { private int field = 10;}或者可以使用某个方法的返回值:class Type { priva

2021-01-06 19:51:48 96

原创 【C++ 系列笔记】07 C++ STL - 算法

STL函数对象(仿函数)函数对象是重载函数调用操作符的类实例。函数对象根据参数数量可被称为 N 元仿函数,N 为函数对象调用所需参数个数。重载 () 符号:class Type { public: void operator()(/* args */);};调用:Type objFun();objFun();// 匿名对象Type()();函数对象可以实现闭包:class Counter { private: long count; pub

2021-01-06 19:47:08 130 1

一套基于 TCP 的 socket 接口

使用 TCP 协议,提供两个主要接口,方便地创建服务端及客户端。 提供数个回调函数来处理事件。 含有 1.静态库 2.源文件 3.头文件 4.客户端及服务端 demo

2019-12-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除