counterxing

Results 60 issues of counterxing

本文灵感源于《深入浅入Node.js》第三章 ## 先看microtasks 这是一道常见的无聊的面试题: ```javascript setTimeout(() => { console.log(1); }, 0); new Promise((resolve, reject) => { console.log(2); for (let i = 0; i < 10000; i++) { i === 9999...

JavaScript
Node.js

最近在看新出的`Nicholas`的大作《深入理解ES6》时,发现有一些语法还是平时基本没用到,但是也是写在了最新的`ECMAScript`标准中的语法,所以想用这篇文章记录一下这些可能被我们忽略的ES6语法。 ## 反射(Reflect)和代理(Proxy) `ECMAScript6`添加了一些内建对象,赋予开发者更多访问`JavaScript`引擎的能力。代理(`Proxy`)是一种可以拦截并改变底层`JavaScript`引擎操作的包装器,在新语言中通过它暴露内部运作的对象,从而让开发者可以创建内建的对象。 代理可以拦截`JavaScript`引擎内部目标的底层对象操作,这些底层操作被拦截后会触发相应特定操作的**陷阱函数**。 反射API以`Reflect`对象的形式出现,对象中方法的默认特性与相同的底层操作一致,而代理可以覆写这些操作,每个代理陷阱对应一个命名和参数都相同的`Reflect`方法。 | 代理陷阱 | 覆写的特性 | 默认特性 | | ------| ------ | ------ | | get | 读取一个属性值 | Reflect.get() | | set | 写入一个属性...

JavaScript

之前在解析`Vue`源码的过程中专门提到了`Observe`模块的变异方法与相应式原理。但是对于相应式的通知视图更新这一块儿只是专门提了通过`Dep`与`Watcher`这样一个**发布-订阅模式**来进行通知。 恰好最近刚刚学习了发布-订阅模式的原理,正巧利用这样一段时间来进行Vue的专门的发布-订阅模块的源码学习。 先看一下`Vue`文档对于[深入相应式原理](https://cn.vuejs.org/v2/guide/reactivity.html)的剖析: ![](http://oczira72b.bkt.clouddn.com/960.png) 在初始化的时候,首先通过 `Object.defineProperty` 改写 `getter/setter` 为 `Data` 注入观察者能力,在数据被调用的时候,`getter` 函数触发,调用方(会为调用方创建一个 `Watcher`)将会被加入到数据的订阅者序列,当数据被改写的时候,`setter` 函数触发,变更将会通知到订阅者(`Watcher`)序列中,并由 `Watcher` 触发 `re-render`,后续的事情就是通过 `render function code` 生成虚拟 `DOM`,进行 `diff` 比对,将不同反应到真实的 `DOM` 中。 ### 发布-订阅模式 最近在阅读[《JavaScript设计模式与开发实践》](https://github.com/xingbofeng/JavaScript-design-patterns/blob/master/JavaScript%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B8%8E%E5%BC%80%E5%8F%91%E5%AE%9E%E8%B7%B5.pdf)是专门对`发布-订阅模式`这一块进行了精读,精读部分内容可见我写的精读部分的[文档:发布-订阅模式](https://github.com/xingbofeng/JavaScript-design-patterns/blob/master/ch8-%E5%8F%91%E5%B8%83%E8%AE%A2%E9%98%85%E6%A8%A1%E5%BC%8F/ch8-%E5%8F%91%E5%B8%83%E8%AE%A2%E9%98%85%E6%A8%A1%E5%BC%8F.md) 一个简单的`发布-订阅模式`的实现主要是以下三点内容:...

JavaScript
Vue

最近做了一道这样的算法题: > 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。 > 输入描述: ``` 输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304), n表示每个任务的长度为length[i]kb,每个数均为1024的倍数。 ``` > 输出描述: ``` 输出一个整数,表示最少需要处理的时间 ``` > 输入例子: ``` 5 3072 3072...

算法
编程/思考

近期在工作之余大部分时间投入到设计模式、算法、操作系统原理的学习中,这里算是一些小小的体会吧。 第一点小小的体会是自己在看`Linux`的过程中发现自己对底层原理还是有那么一些兴趣的(为啥以前就没发现呢,所以还是继续茫茫前端的搬砖路吧,哈哈~😆) ## 枚举法 与其说有五大经典算法思想其实还有一点更为原始的思想就是枚举法,或者说叫暴力(🤓)枚举法? 穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。 ## 贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 - 基本思想 - 不从总体最优考虑,仅考虑局部最优解,问题必须具备后无效性 - 过程 - 建立数学模型来描述问题; - 把求解的问题分成若干个子问题; - 对每一子问题求解,得到子问题的局部最优解; - 把子问题的解局部最优解合成原来解问题的一个解。 - 适用情况 - 局部最优策略能导致全局最优解 - 子问题后无效性...

算法
编程/思考

🐸 🐸同学好,最近使用UESTC_Helper,发现有以下地方。 * 成绩为“良好”时会出现BUG,绩点算作0和未通过。 * 某些科成绩挂科的时候会出现绩点算作了0.8 * 强烈建议添加“已修通识学分”、“已修专业必修学分”、“已修选修学分”模块!!方便查看 ~~最近实在忙,本想共同参与这一个项目,但阅读同学的代码还需要些时间,若不着急,可以一起商讨完成这些功能嘛~~

enhancement

## 批处理模式 批处理是一种离线的数据处理方式,它将一批数据(通常是一组数据记录)作为输入,并在特定的时间或条件下进行处理。批处理通常用于对日志等数据进行分析、转换和汇总,以生成报告、进行数据挖掘、进行机器学习等。 在批处理中,数据被分为离散的块,批处理作业会按照一定的顺序和步骤对这些数据进行处理。这批处理作业可以定期运行,也可以在特定的触发条件下执行。批处理通常要求数据存储在一个集中的位置,以便进行批量处理。 传统的数据融合通常基于批模式。在批的模式下,我们会通过一些周期性运行的JOB,将数据从关系型数据库、文件存储向下游的目标数据库进行同步,中间可能有各种类型的转换。批处理通常用于处理大规模离线任务。“大规模”体现在:每次处理输入的数据量大;每次处理运行的时间长(可能几分钟~几天)。 ### MapReduce模式 常见的批处理模式是MapReduce模式,其主要思想是自动将一个大的计算拆解成 Map 和 Reduce ,MapReduce模式并行的读写分区,然后执行作业,再聚合。提供了两个纯函数,Map、Reduce。因为纯函数,保证了无副作用,所有流程和架构清晰,并且容易重试。如图所示: ![](https://static.wecity.qq.com/h5/2024-3/%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240311144430-15daeefcecd7aac1ace029502260fb0d.png) MapReduce 可以在多台机器上并行执行计算,而无需编写代码来显示处理并行问题。Mapper 和 Reducer 一次只能处理一条记录;它们不需要知道它们的输入来自哪里,或者输出去往什么地方,所以框架可以处理在机器之间移动数据的复杂性: ![](https://static.wecity.qq.com/h5/2024-3/%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240311145042-a4184208ac1ceeb4cdd7321d231805d4.png) ### Spark框架 Map 和 Reduce 中间夹杂着一步数据移动,也就是 shuffle。 Shuffle是MapReduce中的一个重要步骤,它是指将 Map 阶段输出的数据按照某种规则重新分配到 Reduce...

编程/思考
后台开发

利用chatgpt帮我们读代码片段、写代码片段、生成代码注释、找包找库、代码语言转换等功能相信大家都使用过了,本文主要是讲一些我最近在用的,但大家可能忽略过的一些chatgpt提效方法,本文将通过几个例子来为大家例举程序员可能不知道的几个chatgpt高效办公使用案例。 主要分为以下几点: * 绕过官方OpenAI的地区限制 * 还原压缩混淆后的代码 * 写分享文档 * 利用 mindshow 将分享文档转为ppt * 利用 chatpdf 读pdf文档 * 利用 Voice Control for chatgpt的 Chrome插件 学习外语 * 为代码生成测试用例和测试数据 * 把chatgpt接入小爱同学 ## 绕过官方OpenAI的地区限制...

编程/思考

前后台联调过程中,前端同学拿到协议后,还需要对protobuf协议转化为ts代码,并还需要手动书写大量的http请求代码,然而代码大部分都是相同的,完全可以通过自动生成的方式来完成,[pb-to-ts-api](https://github.com/xingbofeng/protobuf-to-ts-api)就较好地解决了这个问题,[pb-to-ts-api](https://github.com/xingbofeng/protobuf-to-ts-api)基于protobufjs-cli,将cli处理后的代码做简单转换,并提供将标准protobuf文件转化为d.ts文件和生成自定义api请求方法文件的方法。后续还将提供mock方法来改善我们前后台的联调体验。 ## 开始 ```bash npm install -g pb-to-ts-api pb2TSApi ./*/**.proto ``` ## 使用方法 创建你自定义的protobuf文件,按照指定的规则定义协议的请求字段和返回字段 ```proto syntax = "proto3"; package test; enum Status { SUCCESS = 0; FAIL = 1; UNKNOWN...

TypeScript

## 简介 在 TypeScript 中引入了 TS Compiler API,使得开发人员可以通过编程的方式访问和操作 TypeScript 抽象语法树(AST)。TS Compiler API 提供了一系列的 API 接口,可以帮助我们分析、修改和生成 TypeScript 代码。不过 TS Compiler API 的使用门槛较高,需要比较深厚的 TypeScript 知识储备。 为了简化这个过程,社区出现了一些基于 TS Compiler API 的工具,如 ts-simple-ast、dprint、ttypescript 等,而...

TypeScript