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等等,做者在文章的結尾道出了他寫做此文的意圖:

  • 即便是你最喜歡的開發者也可能不知道不少你知道的東西。
  • 不管你的只是水平如何,不一樣時期的信心都會有很大差別。
  • 儘管存在只是缺口,但經驗豐富的開發者術業有專攻。
    最後,做者說道:若是我對某個技術感到好奇,或者項目須要用到,我以後能夠學習它。這不會使個人知識和經驗貶值。我能夠作不少事情。例如,在須要的時候再去學它。
     
    經過這篇文章,我感觸比較深的有幾點:
  • 從文中能夠感覺到做者的強烈的自信,勇於一一列出本身不精通的知識,以爲只要須要的時候再去學習它就能夠了,沒有由於有如此多知識缺口而焦慮。
  • 基礎和學習能力很重要,知識是關聯的,能夠舉一反三,只要基礎打得紮實,學習能力強,再學習其餘的新知識就比較容易。
  • 每一個人的時間精力都是有限的,把時間花在本身的專業領域,精通某一個領域、「專攻某個術業」纔能有所成就。
相關文章
相關標籤/搜索