ARTS第七周
ARTS是什么?
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。
Algorithm
本周的算法题是一道关于链表的题目19. Remove Nth Node From End of List,给定一个列表,要求移除倒数第n个节点,并返回头结点。
解题思路
由于我们并不知道列表有多长,所以得遍历列表探测当前节点是否是列表尾节点,又因为我们需要移除倒数第n个节点,因此我们使用两个间距为n的指针来指向前后两个节点,当前面的节点指向尾节点的时候,后面的指针指向的节点的下一个节点正好是我们需要移除的倒数第n个节点。
代码
public ListNode removeNthFromEnd(ListNode head, int n) {
//哨兵节点
ListNode guard = new ListNode(0);
guard.next = head;
ListNode first = guard;
ListNode second = guard;
for (int i = 0; i < n + 1; i++) {
first = first.next;
}
while (first != null) {
first = first.next;
second = second.next;
}
//当first走到尾节点的时候,second.next就是我们要移除的节点
second.next = second.next.next;
return guard.next;
}
Review
本次review的文章是Logging Activity With The Web Beacon API。Beancon API是一种基于js的web api,可以用于将少量数据从浏览器发送到给web服务端,而不用等待响应。在这篇文章里,我们将看到它能用来做什么,它和ajax技术的不同点,以及如何使用它。
Beancon能做什么
Beancon使用场景,例如Google Analytics只需要记录页面行为发送到服务器而无需获取服务器的响应。
另一种使用场景是从js代码中记录信息,它可以在游戏创建保存点,收集有关功能使用的信息,或记录多变量测试的结果,这些事情都可以考虑使用Beacon。
为什么我们要用Beancon
通常,你可以使用unload或beforeunload事件来执行日志记录。 当用户执行类似跟踪页面上的链接以导航时,会触发这些操作。 这里的问题是在其中一个卸载事件上运行的代码可以阻止执行并延迟卸载页面。 如果页面的卸载被延迟,那么加载下一页也会延迟,因此体验感觉非常缓慢。Beacon通过排队请求而不阻塞来解决这个问题,将控制权立即返回到您的脚本。 然后浏览器负责在后台发送该请求而不会阻塞。 这使得一切都变得更快,这让用户更快乐,让我们都能保住工作。
使用Beancon
使用Beancon很简单,代码如下:
let result = navigator.sendBeacon(url, data);
返回一个boolean类型的结果,如果浏览器接受请求并将其排队,则为true;如果执行此操作,则为false。
使用navigator.sendBeacon()
navigator.sendBeacon
方法有两个参数,第一个参数是要请求的URL,请求类型是POST,发送第二个参数中所带的数据。
// URL to send the data to
let url = '/api/my-endpoint';
// Create a new FormData and add a key/value pair let data = new FormData(); data.append('hello', 'world');
let result = navigator.sendBeacon(url, data);
if (result) {
console.log('Successfully queued!');
} else {
console.log('Failure.');
}
浏览器支持
Beancon支持绝大多数浏览器,除了IE(支持Edge)和Opera mini,可以使用navigator.sendBeacon
测试当前浏览器是否支持。
if (navigator.sendBeacon) {
// Beacon code
} else {
// No Beacon. Maybe fall back to XHR?
}
总结
除了上文,文中还展示了一个在页面上记录时间的实例。
Beancon API是一种非常有用的方法可以把数据从页面发回服务器,尤其是在记录上下文环境中。它支持的浏览器也非常广泛,它使您能够无缝地记录数据,而不会对用户的浏览体验和站点性能产生负面影响。请求的非阻塞性质意味着比XHR、Fetch等其他替代方案有更快的性能。
更多信息请查阅下列文章:
- “W3C Beacon specification,” W3C Candidate Recommendation
- “MDN Beacon documentation,” MDN web docs, Mozilla
- “Browser support information,” caniuse.com
Tip/Techni
这周学习用pyqt5写了个带GUI的python小软件,但也仅仅是使用了pyqt的一点皮毛而已,在此只是推荐一下pyqt,作为使用python编写GUI的一个选择。
Share
今天分享一篇比较有意思的文章,来自于React团队成员、Redux作者Dan Abramov的年终总结Things I Don’t Know as of 2018,文章主要叙述了作者不是很擅长的一些知识,比如Unix命令、bash、低级语言、容器、python、node后端、java等等,作者在文章的结尾道出了他写作此文的意图:
- 即使是你最喜欢的开发者也可能不知道很多你知道的东西。
- 无论你的只是水平如何,不同时期的信心都会有很大差异。
- 尽管存在只是缺口,但经验丰富的开发者术业有专攻。
最后,作者说道:如果我对某个技术感到好奇,或者项目需要用到,我之后可以学习它。这不会使我的知识和经验贬值。我可以做很多事情。例如,在需要的时候再去学它。
通过这篇文章,我感触比较深的有几点: - 从文中可以感受到作者的强烈的自信,敢于一一列出自己不精通的知识,觉得只要需要的时候再去学习它就可以了,没有因为有如此多知识缺口而焦虑。
- 基础和学习能力很重要,知识是关联的,可以触类旁通,只要基础打得扎实,学习能力强,再学习其他的新知识就比较容易。
- 每个人的时间精力都是有限的,把时间花在自己的专业领域,精通某一个领域、“专攻某个术业”才能有所成就。