在终端执行 : export PATH=/bin:/sbin:/usr/bin:/usr/sbin 此时此刻在当前终端窗口,就可以开心的用linux命令了,千万不要关了当前窗口(救急方案) 终身解决方案呢
Range 范围算不准 但是实际运行后,这段代码是会报错的,我排查了一下,发现计算出来的 Range 的 start 和 end 的位置是错误的,于是我跟 GPT 说一下,看看它如何纠正 我:算不准 start...在计算位置时,我们使用 setStart 和 setEnd 方法来设置范围的起始和结束位置,以确保高亮显示的文本范围正确。...页面卡死 但我把上面代码运行,发现页面卡死了,原因是,在 TreeWalker 遍历过程中,新增了高亮节点,然后又进入高亮节点进行遍历,然后又创建高亮节点。。。...因此应该在 TreeWalker 遍历节点之后再进行高亮节点替换,于是我让 GPT 继续改 我:在 TreeWalker 遍历过程中修改节点,会遍历到新节点,需要延迟修改节点 GPT: 是的,你说的很对...在 TreeWalker 遍历过程中修改节点,会导致遍历到新节点,从而可能会出现意外的结果。为了避免这种情况,我们可以将需要修改的节点保存到一个数组中,在遍历完成后再对这些节点进行修改。
Range 范围算不准但是实际运行后,这段代码是会报错的,我排查了一下,发现计算出来的 Range 的 start 和 end 的位置是错误的,于是我跟 GPT 说一下,看看它如何纠正我:算不准 start...在计算位置时,我们使用 setStart 和 setEnd 方法来设置范围的起始和结束位置,以确保高亮显示的文本范围正确。...页面卡死但我把上面代码运行,发现页面卡死了,原因是,在 TreeWalker 遍历过程中,新增了高亮节点,然后又进入高亮节点进行遍历,然后又创建高亮节点。。。...因此应该在 TreeWalker 遍历节点之后再进行高亮节点替换,于是我让 GPT 继续改我:在 TreeWalker 遍历过程中修改节点,会遍历到新节点,需要延迟修改节点GPT:是的,你说的很对。...在 TreeWalker 遍历过程中修改节点,会导致遍历到新节点,从而可能会出现意外的结果。为了避免这种情况,我们可以将需要修改的节点保存到一个数组中,在遍历完成后再对这些节点进行修改。
这个属性是可写的,如果对其写入一个新的节点,会导致原有的所有子节点被移除。 head head 属性返回当前文档的 head 节点。如果当前文档有多个 head,则返回第一个。...比如,当前域名是 sub.example.com,则 domain 属性可以设置为 example.com。除此之外的写入,都是不可以的。...implementation 属性的 hasFeature 方法,可以判断当前环境是否部署了特定版本的特定接口。...一旦关闭,write 方法就无法写入内容了。如果再调用 write 方法,就等同于又调用 open 方法,新建一个文档,再写入内容。 write() 用于向当前文档写入内容。...()) nodeList.push(treeWalker.currentNode); adoptNode() 将某个节点,从其原来所在的文档移除,插入当前文档,并返回插入后的新节点。
起因 issuse:分类跳转错误 [bug]Category图表,如果点击的对象并不是最高级Category,而是次级Category,跳转链接的路径拼接就有问题。...忘记分类具有嵌套结构了。...这就会导致默认每个分类都是顶级分类,但实际上却不存在对应链接,这会导致404.于是我着手准备fix bugs 过程 验证分类嵌套结构 我好奇究竟具体是什么样的嵌套,于是用console.log()试了一下...虽然链接表现出来的是嵌套结构,但是实际上的对象是数组,欸我去,关键点在于_id和parent两个属性,显然parent对应的值是父级分类_id属性,脑海里想到哈希,但是,我想到一个问题 a与a...但实际上的一篇文章的分类是数组结构(我认为是平铺展开),看来得动手改一下了 建个对象 const categoryTree = { name: hexo.config.title || 'Categories
规则可以触发通知(notification),警告(warning)和错误(error)。...参考GitHub issue,LineLength本来在TreeWalker module下面,提升到与TreeWalker同级的module,解决问题。...打开托管在GitHub的官方配置文件google_checks,借助于diffchecker这类在线文本对比工具,好家伙。本地配置文件和GitHub里的配置文件相差也太大了吧。是该更新一下了!!...那token是什么呢?...分析报错,大意是在RightCurly这个module里有个tokens属性字段里不能出现LITERAL_SWITCH?
,所以本脚本就解决了这个问题,在实际需求中如post xss,还有post之后才显示敏感信息,都需要这个功能。...遇到的截图导致运行太慢的问题,设置页面size,和截图质量搞定,所以默认的截图比较模糊,有需求的可以自己改改。 功能太多了,细节说三天三夜也说不完,自己看代码调代码吧。...() && num111<1500) { console.log("[*] processing node " + treeWalker.currentNode.tagName...+ ' ' + treeWalker.currentNode.id); if (treeWalker.currentNode.click) {...treeWalker.currentNode.target=''; treeWalker.currentNode.click();
JDK在1.6 引入了适应性自旋锁,适应性自旋锁意味着自旋时间不是固定的了,而是由前一次在同一个锁上的自旋时间以及锁拥有的状态来决定,基本认为一个线程上下文切换的时间是最佳的一个时间。...但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用 cpu 做无用功,占着 XX 不 XX,同时有大量线程在竞争一个锁,会导致获取锁的时间很长...缺点 TicketLock 虽然解决了公平性的问题,但是多处理器系统上,每个进程/线程占用的处理器都在读写同一个变量queueNum ,每次读写操作都必须在多个处理器缓存之间进行缓存同步,这会导致繁重的系统总线和内存的流量...= new MCSNode(); NODE.set(currentNode); // 将queue设置为当前节点,并且返回之前的节点 MCSNode...,没有真正的后续节点属性,MCSLock是显示链表,有一个指向后续节点的属性。
上一周我又拿起《剑指offer》把关于数组的算法题刷了一遍,又总结了很多的做题技巧和有关数组的解题思路,后期会分享。...我们通常会用到函数,我们如果将一个函数抽象成一个结点,那么我们给函数添加两个属性,一个属性是存放数据的属性data,另一个属性是存放指向下一个结点的指针属性next。...3 边界条件 边界条件是这五个步骤最容易犯错的一部分,因为通常考虑的不全面,导致了最后的面试未通过。如果想做好这一部分,也不难,跟着小鹿的方法走。...其实特殊边界最主要考虑到一些逻辑上的特殊情况,考察应聘者的考虑的是否全面。小鹿给他起个名字叫做特殊边界。 4 手写代码 4.1 定义结点 ?...程序最容易出错的还是边界情况考虑不全面导致的,所以,我们为了能够测试程序的全面性,所以我们要按照以下步骤进行全面性的测试。
在我的上一篇文章:《面试必备之乐观锁与悲观锁》 已经为大家对比了乐观锁与悲观锁。我们知道CAS算法是乐观锁的一种实现方式,CAS算法中又涉及到自旋锁,所以这里给大家讲一下什么是自旋锁。...TicketLock存在的问题: 多处理器系统上,每个进程/线程占用的处理器都在读写同一个变量serviceNum ,每次读写操作都必须在多个处理器缓存之间进行缓存同步,这会导致繁重的系统总线和内存的流量...(this, currentNode, null)) { // 如果成功了,表示queue==currentNode,即当前节点后面没有节点了...自旋锁如果持有锁的时间太长,则会导致其它等待获取锁的线程耗尽CPU。 自旋锁本身无法保证公平性,同时也无法保证可重入性。 基于自旋锁,可以实现具备公平性和可重入性质的锁。...在没有cache的NUMA系统架构中,由于CLHLock是在当前节点的前一个节点上自旋,NUMA架构中处理器访问本地内存的速度高于通过网络访问其他节点的内存,所以CLHLock在NUMA架构上不是最优的自旋锁
我们不建议使用它,因为 string 类型的 refs 存在一些效率上的问题。它已过时并可能会在未来的版本被移除(16.8版本还没有移除)。...因此ref就出现了。给input标签中添加ref属性(就类似于id) 此时输出的this是类的实例 。 我们发现了refs中有 input1,是键值对类型。...showData2 =()=>{ const {input2} = this.refs alert(input2.value) } 总结 refs 是实例上的属性...回调形似的ref ref 中写回调函数,传入的参数是什么呢?我们打印看一下。...这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。
如果你考虑了这种可能性,那么你刚才就是描述了一个双向链表。 双向链表 双向链表具有单链表的所有功能,并将其扩展为在链表中可以进行双向遍历。...n 上的节点 remove(position) 删除链表中指定位置上的节点 双向链表的实现 现在开始写代码!...这些属性被命名为previous和next。 接下来,我们需要实现DoublyList并添加三个属性:_length,head和tail。 与单链表不同,双向链表包含对链表开头和结尾节点的引用。...在if的代码中,还必须将tail设置为null —— 换句话说,我们返回到一个空的双向链表的初始状态。...在这种情况下,我们必须正确地将head的previous属性设置为null —— 在链表的头前面是没有节点的。
上已经收录,文章的已分类,也整理了很多我的文档,和教程资料。 最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。...在本文中,我们将讨论如何将链表存储在数据库中,实现链表的添加和删除,查找以及反转链表等操作。 在实现链表之前,需要知道相比数组和对象,链表的优点是什么。...,造成这种原因是由数组的编号索引特性导致的。...的值为head: image.png 第二步: 接下来,我们将nextNode分配给currentNode.next: image.png 第三步: 接下来,我们将currentNode.next属性指向...在使用对象时,我们面临的问题是元素在内存中的随机位置,而在链表中,节点是通过指针相互连接的,指针提供了一定的顺序。 我是小智,我们下期见!
ES6约定,任何数据结构只要具备Symbol.iterator属性(这个属性就是Iterator的具体实现,它本质上是当前数据结构默认的迭代器生成函数),就可以被遍历——准确地说,是被for...of....和 __proto__指代的属性 // 补拷贝 对象的__proto__上的属性 if(value.hasOwnProperty(key)){ // 如果值还有可能是对象 就继续拷贝...但是实际上,对于某些严格的场景来说,这个方法是有巨大的坑的。问题如下:无法解决循环引用的问题。...我给你解释一下与之相对的弱引用的概念你就明白了在计算机程序设计中,弱引用与强引用相对,被弱引用的对象可以在任何时候被回收,而对于强引用来说,只要这个强引用还在,那么对象无法被回收。...去掉原型属性,将其writable特性设置为false if(obj instanceof Object){ Object.seal(obj); // 封闭对象 for(let key
resolve(this.response); } else { reject(new Error(this.statusText)); } }; // 设置错误监听函数...已失败class Promise { constructor(exector) { // 初始化状态 this.status = PENDING; // 将成功、失败结果放在this上,...所以可能会出现这样的情况,就是当前执行栈执行的时间很长,导致事件队列里边积累多个定时器加入的事件,当执行栈结束的时候,这些事件会依次执行,因此就不能到间隔一段时间执行的效果。...针对 setInterval 的这个缺点,我们可以使用 setTimeout 递归调用来模拟 setInterval,这样我们就确保了只有一个事件结束了,我们才会触发下一个定时器事件,这样解决了 setInterval...{ if (k in O) { callback.call(thisArg, O[k], k, O); } k++; }}实现防抖函数(debounce)防抖函数原理:在事件被触发
在视觉上,它看起来像这样: ? 链表的可视化表示 在一个对象中,上面的 LinkedList 看起来像下面的样子 ?...将添加到链接列表的末尾 2insert(value) { 3 /* 创建一个节点 */ 4 const node = {value, next: null} 5 /* 把 tail 的 next 属性设置为新节点的引用...第一次插入 node 时,头部的 next 指针将指向新节点,就像在构造函数中那样,在其中设置了 this.tail = this.head。...在视觉上,可以这样表示: ? 哈希表的可视化表示 在讨论如何实现哈希表之前,需要讨论讨论哈希函数的重要性。哈希函数的核心概念是它接受任意大小的输入并返回固定长度的哈希值。...GitHub 上的每个文件都经过了哈希处理,这使得每个文件的查找都非常快。哈希函数背后的核心思想是,给定相同的输入将返回相同的输出。 在介绍了哈希功能之后,该讨论一下如何实现哈希表了。
}); } }, 0); } // 将两个方法传入函数执行 try { fn(resolve, reject); } catch (e) { // 遇到错误时...,捕获错误,执行 reject 函数 reject(e); }}MyPromise.prototype.then = function(onResolved, onRejected) { //...Date.now(); return fn.apply(context, args); } };}手写 call 函数call 函数的实现步骤:判断调用对象是否为函数,即使我们是定义在函数的原型上的...判断传入上下文对象是否存在,如果不存在,则设置为 window 。处理传入的参数,截取第一个参数后的所有参数。将函数作为上下文对象的一个属性。使用上下文对象来调用这个方法,并保存返回结果。...删除刚才新增的属性。返回结果。
_sanitizeElements 函数,顾名思义,即净化标签 _sanitizeAttributes 即净化标签的属性 _sanitizeElements函数 /* Check if tagname...,感觉有点多余,因为不在白名单里,已经在上面就被remove了。..._sanitizeAttributes函数 首先不管是什么属性,都直接从当前currentNode remove。...hookEvent.keepAttr) { continue; } 然后根据标签名,还有属性名,属性的值进行一个_isValidAttribute 的判断。...presume unsafe, do not add it back */ } else { return false; } 0x04 历史Bypass 可以在pull