ARTS第七周

ARTS是什么?

Algorithm:每周至少作一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。java

Algorithm

本周的算法题是一道关于链表的题目19. Remove Nth Node From End of List,给定一个列表,要求移除倒数第n个节点,并返回头结点。
 node

解题思路

因为咱们并不知道列表有多长,因此得遍历列表探测当前节点是不是列表尾节点,又由于咱们须要移除倒数第n个节点,所以咱们使用两个间距为n的指针来指向先后两个节点,当前面的节点指向尾节点的时候,后面的指针指向的节点的下一个节点正好是咱们须要移除的倒数第n个节点。
 python

代码

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技术的不一样点,以及如何使用它。
 react

Beancon能作什么

Beancon使用场景,例如Google Analytics只须要记录页面行为发送到服务器而无需获取服务器的响应。web

另外一种使用场景是从js代码中记录信息,它能够在游戏建立保存点,收集有关功能使用的信息,或记录多变量测试的结果,这些事情均可以考虑使用Beacon。
 ajax

为何咱们要用Beancon

一般,你可使用unload或beforeunload事件来执行日志记录。 当用户执行相似跟踪页面上的连接以导航时,会触发这些操做。 这里的问题是在其中一个卸载事件上运行的代码能够阻止执行并延迟卸载页面。 若是页面的卸载被延迟,那么加载下一页也会延迟,所以体验感受很是缓慢。Beacon经过排队请求而不阻塞来解决这个问题,将控制权当即返回到您的脚本。 而后浏览器负责在后台发送该请求而不会阻塞。 这使得一切都变得更快,这让用户更快乐,让咱们都能保住工做。
 算法

使用Beancon

使用Beancon很简单,代码以下:后端

let result = navigator.sendBeacon(url, data);

返回一个boolean类型的结果,若是浏览器接受请求并将其排队,则为true;若是执行此操做,则为false。
 api

使用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等等,做者在文章的结尾道出了他写做此文的意图:

  • 即便是你最喜欢的开发者也可能不知道不少你知道的东西。
  • 不管你的只是水平如何,不一样时期的信心都会有很大差别。
  • 尽管存在只是缺口,但经验丰富的开发者术业有专攻。
    最后,做者说道:若是我对某个技术感到好奇,或者项目须要用到,我以后能够学习它。这不会使个人知识和经验贬值。我能够作不少事情。例如,在须要的时候再去学它。
     
    经过这篇文章,我感触比较深的有几点:
  • 从文中能够感觉到做者的强烈的自信,勇于一一列出本身不精通的知识,以为只要须要的时候再去学习它就能够了,没有由于有如此多知识缺口而焦虑。
  • 基础和学习能力很重要,知识是关联的,能够举一反三,只要基础打得扎实,学习能力强,再学习其余的新知识就比较容易。
  • 每一个人的时间精力都是有限的,把时间花在本身的专业领域,精通某一个领域、“专攻某个术业”才能有所成就。
相关文章
相关标签/搜索