DNS,域名系統

DNS是什麼以及它是如何運作的概述 通常我們不會用IP地址來訪問網站。雖然可以,但很少見。 我們通常使用域名,比如google.com或flaviocopes.com。 這非常方便,因為例如我可以更改用於託管網站的伺服器和公司,同時保持相同的域名。 將域名映射到IP地址的系統稱為DNS(Domain Name System,域名系統)。 DNS是一個由伺服器組成的網絡。您的供應商將擁有自己的DNS,您的路由器已經預先配置為使用它。 您也可以選擇使用Google的DNS伺服器,其IP地址為8.8.8.8。 這些DNS伺服器將接收來自您的計算機的請求,然後再向它們自己的參考DNS伺服器發出請求。 該系統組織成一棵樹。頂部有一個名為根DNS伺服器的DNS伺服器。 簡而言之,它知道管理每個域名擴展名(如.com、.net、.org)和國家特定的域名擴展名以及新的域名擴展名(如.blog、.dev或.tech)的DNS伺服器的IP地址。 這些DNS伺服器知道其擴展名下所有域名的IP地址映射。 當然,該系統設置了緩存、冗余和能夠承受高並發請求的能力,但這是一般概念。

Docker 映像檔介紹

一個 Docker 映像檔就是一個 容器的模板。 一切始於一個 Docker 映像檔。 當你告訴 Docker 使用 docker run 從映像檔建立一個容器時,它會執行相應的操作(建立檔案系統、初始化相依性等),然後容器就會被建立。 映像檔是透過使用 docker build 命令從 Dockerfile 構建,並可以儲存在本地或發佈到像 Docker Hub 這樣的 Docker 註冊表中,你可以在其中儲存公開和私有映像檔。 如果你訪問 https://hub.docker.com/,你會看到許多映像檔,你可以自由使用而不必建立自己的映像檔。 通常這些映像檔都是由特定技術背後的開發團隊官方製作的。 舉個例子,這是官方的 Node.js Docker 映像檔:https://registry.hub.docker.com/_/node。 我們很快就會談到如何使用映像檔和容器的更多細節。

Dockerfiles

什麼是 Dockerfile 以及如何使用它 Dockerfile 是建構 Docker 映像檔的配方。 這是工作流程:首先建立一個 Dockerfile,然後使用 docker build 從中建立一個 Docker 映像檔,最後從映像檔執行容器。 Dockerfile 是一個包含建構映像檔指令的文字檔案。 這些指令是部分組態語言,其中包含 FROM、LABEL、RUN、COPY、ENTRYPOINT、CMD、EXPOSE、ENV 等關鍵字。 讓我們建立我們的第一個 Dockerfile: 假設你有一個包含簡單 Node.js 應用程式的資料夾,由一個 app.js 檔案組成,該檔案列出了在運行應用程式之前需要安裝的幾個相依性,以及 package-lock.json。 在其中,創建一個名為 Dockerfile 的純文字檔案,不要加上副檔名,並包含以下內容: FROM node:14 WORKDIR /usr/src/app COPY package\*.json app.js ./ RUN npm install EXPOSE 3000 CMD ["node", "app.js"] 注:CMD 行中使用雙引號。單引號會導致錯誤。 在第一行中,我們指定要從哪個映像檔開始。這將是我們的基底映像檔。在這個案例中,它將使用基於 Alpine Linux 的官方 Node.js 映像檔,使用 Node 14。當從 Dockerfile 建立容器時,Docker 將從 Docker Hub 獲取該映像檔。 接下來,我們將工作目錄設定為 /usr/src/app,這意味著我們的所有命令都將在該資料夾中執行,直到我們再次更改它。這是我們已知在 Node 映像檔中存在的資料夾。 我們複製位於當前資料夾中的 package.json、package-lock.json(使用星號萬用字元)和 app.js 檔案到工作目錄中。...

Docker介紹

Docker是一個改變我們部署應用程式和分發應用程式方式的工具之一。 它是一項非常受歡迎且廣受大多數使用者喜愛的技術,將其列入履歷中是一件很棒的事情。 使用Docker,我們可以創建一個封裝整個應用程式的容器。 不僅如此,它可以封裝整個應用程式並保存為映像以便輕鬆複製。 在這裡,複製是關鍵詞。使用Docker,我們可以創建運行在你的電腦、客戶的電腦、你的服務器等任何地方的獨立環境,並使用我們想要運行的軟體的特定版本。 這有助於解決從配置錯誤和不同環境之間版本不匹配導致的各種問題。 Docker很複雜,但我認為它用相對用戶友好的方式處理了許多複雜的問題。 這就是為什麼"理解它"可以從你作為開發者和作為軟體使用者的生活中減少很多複雜性的原因。 不再有"但在我的電腦上運行正常"這樣的問題了。你不再需要這樣說,別人也不需要再這樣對你說了。 我們都知道調試是困難的,當某些東西在你測試過的所有環境中運行正常,但在某些奇怪的配置上卻不正常時,這就更難了。有太多的變動部分。 Docker也非常適合分發你創建的軟體,但你不想應對來自於試圖在所有可能的Web伺服器和配置上安裝它的人們所提出的無數支援請求。 我知道受歡迎的論壇應用程式Discourse在很大程度上依賴於Docker。我現在找不到參考資料,但我敢肯定我讀過他們只會支援運行官方Docker映像的安裝問題。我在這裡可能錯了,但這個想法聽起來並不是無稽之談: 如果你作為一個程式設計師可以創建一個在任何你可以部署Docker容器的地方運行的映像,那麼作為一個使用者,你絕對應該利用這一點。 Docker的另一個重大好處是能夠運行不同版本同一套軟體堆疊的多個應用程式,如果沒有類似的解決方案,這將變得困難或至少令人困惑。 在接下來的教程中,我們將介紹幾個Docker的概念,並探索如何使用以下內容: Docker映像 Docker容器 Dockerfile 基於Docker映像更新已部署容器 如何提交更改到Docker映像 如何在Docker容器外部訪問檔案 在Docker Hub上共享Docker映像 從命令行操作Docker映像 從命令行操作Docker容器 如果Docker容器立即退出該怎麼辦 從頭開始創建一個簡單的Node.js Hello World Docker容器 使用Docker Desktop管理容器 安裝Docker後的第一步 在macOS上安裝Docker 等等!

Docker容器介紹

Docker容器是一個包含應用程式 (單一或多個) 及其所有所需的函式庫、其他應用程式和工具的環境。 應用程式與其相依項目被封裝在容器中。 你可以使用在新購機器上安裝Docker的方式,以Docker映像建立容器,你的應用程式將能夠無需額外工作或相依項目而運行。 容器與運行它的電腦(稱為「主機」)完全隔離,您可以使用某些方式讓它們與主機互通並共享資源。 我們的目標不是完全隔離環境(如虛擬機器所做的那樣),而是使應用程式具有最高的可攜性。 在Docker映像中運行的應用程式非常快速,您可以同時運行多個容器。 在談論Docker映像時,我提到Docker映像是建構的,Docker容器是被運行的,使用 docker run。

ECMAScript 2015-2019 完全指南

ECMAScript 是 JavaScript 的基礎標準,通常簡稱為 ES。探索有關 ECMAScript 及其最新功能的所有內容。 TC39 是什麼? ES 版本 ES Next 無論你在哪裡讀到關於 JavaScript 的內容,你總會看到這些術語之一: ES3 ES5 ES6 ES7 ES8 ES2015 ES2016 ES2017 ECMAScript 2015 ECMAScript 2016 ECMAScript 2017 ECMAScript 2018 ECMAScript 2019 這些代表什麼意思呢? 它們都指的是 ECMAScript 這個標準。 ECMAScript 是JavaScript 的基礎標準,通常簡稱為 ES。 除了 JavaScript,其他的語言也實現了 ECMAScript,包括: ActionScript(Flash 腳本語言),由於 Flash 將於 2020 年正式停用,因此其受歡迎程度不斷下降。 JScript(微軟腳本方言),由於當時只有 Netscape 支援 JavaScript,網路瀏覽器戰爭正如火如荼進行中,微軟不得不為 Internet Explorer 建立自己的版本。 但當然最受歡迎和廣泛使用的 ECMAScript 實現是 JavaScript。 為什麼會有這個奇怪的名字?Ecma 国际是一家位於瑞士的標準協會,負責制定國際標準。 當 JavaScript 誕生時,由 Netscape 和 Sun Microsystems 提交給 Ecma,並被命名為 ECMA-262,別名為 ECMAScript。...

electronics-components-dht11-temperature-sensor

#電子元件:DHT11溫濕度傳感器 這個傳感器是你學習使用的第一個傳感器之一,因為每個人都有一個很好的應用:建立室內或室外溫度計。 在這裡,你可以看到它安裝在一個分輔板上: ! ! ! 請注意,該傳感器有4個輸出引腳,但我得到的分輔板只有3個(原因是DHT11的引腳3未連接到任何地方 - 別問我為什麼)。 從左邊開始,保持底部的引腳,我們有: Vdd,正輸入(+) Vss,負輸入(-) 輸出信號 輸出是一個持續4ms的40位序列化信號。 這意味著每4ms傳感器發送一次溫度信息,為了讀取它,我們必須獲取值並將其反序列化。 在Arduino程序中,我們使用由Adafruit維護的DHT Sensor Library(這是存儲庫的鏈接),它使我們可以非常簡單地讀取溫度: ! 你可以使用#include <DHT.h>將其包含,然後通過傳遞傳感器信號引腳和類型(在這種情況下使用常量DHT11)初始化DHT類的對象。 該庫還可以與其他傳感器一起使用,如更精確的DHT22和`DHT21。 然後,你可以調用readHumidity()和readTemperature()方法以``float`變量的方式獲取值。 readTemperature()以攝氏度表示該值,但該庫還提供convertCtoF()方法來獲取華氏值。 該庫還提供了其他方法,例如computeHeatIndex()。我建議你查看GitHub上的DHT.h頭文件源代碼(https://github.com/adafruit/DHT-sensor-library/blob/master/DHT.h)。 這個簡單的Arduino程序從DHT11上的信號引腳連接到數字引腳#2,並將其打印到串行監視器上: #include <DHT.h> DHT dht(2, DHT11); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("無法讀取數值"); return; } Serial.println((String)"濕度:" + h + "%,溫度:" + t + "C"); } ! ! 濕度:56.00%,溫度:20.20C 濕度:56....

Emacs簡易指南

emacs 是一個很棒的編輯器,也在 UNIX 系統上擁有歷史地位。著名的 vi vs emacs 之爭和激烈的討論曾讓全球許多開發人員浪費了很多不生產力的時間。 emacs 非常強大。有些人整天都使用它,把它當作一種操作系統 (參考:https://news.ycombinator.com/item?id=19127258)。我們將在這裡只討論基礎知識。 你可以通過執行 emacs 來開啟一個新的 emacs 會話: macOS 用戶,請稍等一下。如果你使用 Linux,則沒有問題,但是 macOS 不提供使用 GPLv3 的應用程序,並且每個已更新為 GPLv3 的內置 UNIX 命令都沒有更新。雖然我們列出的命令存在一些問題,但在這種情況下,使用2007年的 emacs 版本與使用改進和變化了12年的版本確實不同。在這個問題上Vim就沒有問題,它始終保持最新版本。要解決這個問題,執行 brew install emacs,然後運行 emacs 會使用來自 Homebrew 的新版本(請確保已安裝Homebrew) 你也可以通過執行 emacs <文件名> 來編輯一個已存在的文件: 你可以開始編輯並在完成後按下 ctrl-x,然後按下 ctrl-w。確認文件夾: Emacs會告訴你文件已經存在,並詢問是否應該覆蓋: 回答 y,您會得到一個成功的確認: 你可以按下 ctrl-x,然後按下 ctrl-c 來退出 Emacs。或按下 ctrl-x,然後按下 c(保持 ctrl 鍵按下)。 關於 Emacs 的知識非常廣泛。超出我在這個簡單介紹中所能寫的範圍。我鼓勵你打開 Emacs,按下 ctrl-h r 打開內置手冊,以及按下 ctrl-h t 打開官方教程。

ER資料模型介紹

對實體-關係資料模型(Entity-Relationship Data Model),也稱為ER模型,提供一個簡單而全面的概述。ER模型是您可以用來理解資料的各種[資料模型](/data-models/)之一。 特別是,它是一個概念性資料模型,因為它沒有與任何特定實施相關聯。這是邏輯資料模型留下的任務。 ER資料模型非常通用且高層次的,可以通過多種完全不同類型的資料庫來實現。 它很棒,因為您只需考慮資料及其組織方式,而不需考慮實現細節。在這樣做的過程中,您將被迫以不同於以往的方式分析問題。 我發現ER圖對於幫助您分析涉及資料的情境非常有幫助。 ER模型提供了一種表示所有需要建模的資料、不同類型資料之間的關係及其相關資訊的圖形表示法。 ER模型由兩個元素組成: 實體(entities) 關係(relations) 實體是一些具有共同特性的資料類型,例如項目或人。 關係是實體之間的關係。 讓我給您舉個例子,我們談談書籍及其作者。我們有兩個實體: 書籍(book) 作者(author) 一本特定的書籍是書籍實體的一個實例。 由於我們有兩個實體,所以我們之間有兩個關係。一個是單本書和作者實體之間的關係。另一個是一位作者和書籍實體之間的關係。如果我們考慮一下,我們有: 一本書有一位作者 一位作者可以撰寫多本不同的書籍 實體的視覺表示法 有了這個簡單的例子,我們可以開始介紹將幫助我們創建我們場景的ER資料模型的視覺表示法。 註:有許多不同的繪製ER圖的方式。我將使用我認為更具視覺效果且更有意義的一種方式。 將實體表示為矩形,其中包含一些文本以識別它們: 關係的視覺表示法 表示實體之間的關係,在其最基本形式上,使用連接兩個實體的線條以及在其中標識關係類型的菱形來表示: 請注意,我沒有創建“書籍有作者”和“作者寫書籍”兩個關係。我建立了一個將書籍和作者之間的關係建立為“撰寫”之間的單一關係。 基數 一旦我們建立了關係,我們現在必須指示涉及的數量。目前,我們有很多問題: 一本書可以由多少位作者撰寫? 一位作者可以撰寫多本書嗎? 一位作者需要至少撰寫一本書才能被稱為作者嗎? 一本書可以由多位作者撰寫嗎? 一本書是否可以沒有至少一位作者? 這些都是非常好的問題,對於這個案例,我認為答案是相當明顯的。當答案不明顯時,您可以考慮問題並添加自己的限制。 在圖表上視覺表示基數有很多種方式。有些人喜歡在連接到實體的線條上更改線條的形狀。 我更喜歡使用數字,這樣事情更清晰明確: 上面的數字意味著:一本書可以由1位或多位作者撰寫。n表示任意數量的元素。 而一位作者可以撰寫從0本書(或許他/她現在正在撰寫一本)到無限多本書。 第一種情況被稱為零對多關係。第二種是一對多關係。 我們還可以有: 一對一關係 多對多關係 零對一關係 屬性 每個實體都可以有一個或多個屬性。 假設我們將上述關係應用於一家書店。每位作者都有姓名、生物和網站URL。 每本書都有標題、出版商、出版年份和ISBN。如果我們希望,出版商也可以是一個實體,但我們也可以將其定義為書的屬性。 以下是我們如何表示上述信息的方式: 識別屬性 實體必須使用唯一鍵進行識別。書籍實體可以通過ISBN屬性進行唯一識別。每本書都有單一的ISBN(假設我們不區分圖書的副本,而是個別表示一本書)。 我們通過在下方緻片下標識主鍵屬性: 另一方面,作者暫時沒有唯一識別符。兩位作者可能具有相同的名字。 因此,我們必須添加一個唯一鍵屬性。例如,id屬性: 識別屬性可以跨越多個屬性。 例如,護照ID和作者國家可以唯一識別一個人,並取代我們添加的id屬性: 選擇哪個呢?這取決於您的應用程式中哪個更具意義。如果我們正在建模一家書店,則不能指望所有書籍作者的國家和護照ID。因此,我們將使用隨機選擇的id,並將其與每位作者關聯起來。 關係屬性 屬性不僅限於實體。關係也可以有屬性。 假設我們需要對圖書館進行建模。除了書籍和作者實體之外,現在我們引入了讀者實體,表示借書閱讀的人。我們在他們借書時記錄他們的姓名和身份證號碼: 但我們仍然缺少一些信息。我們需要知道借閱書籍的日期,以及他們歸還書籍的日期,以便在圖書館中存儲有關特定書籍的所有歷史記錄信息。此信息不屬於書籍或讀者實體,而屬於關係: 弱實體 我們上面已經談到了主鍵,以及它們如何幫助唯一識別一個實體。 某些實體依賴於其他實體的存在,並被稱為弱實體。 假設我們需要為一家線上商店建模訂單。 對於每個訂單,我們將存儲訂單ID(從1開始,隨時間增加),訂單下單的日期和時間,以及客戶的信息,以便知道要向誰帳單和送貨。 然後我們還需要知道他們訂購了什麼。我們創建一個弱實體“訂購項目”,表示結帳時購物車中的每個項目。 這個實體將存儲結帳時的商品價格(因此,當我們更改特價商品價格時,將不會影響已經下單的訂單),訂購的商品數量以及所選的選項。假設我們銷售T恤,因此我們需要存儲訂購的T恤的顏色和尺寸。 它是一個弱實體,因為沒有訂單實體,訂購項目實體無法存在。 循環關係 一個實體可以與自己具有循環關係。假設我們有一個人實體。我們可以通過以下方式對父子關係進行建模:...

ES2016指南

ECMAScript是JavaScript的標準,通常縮寫為ES。了解有關ECMAScript的一切,以及ES2016(又稱ES7)中新增的功能。 Array.prototype.includes() 指數運算子 ES2016,官方稱為ECMAScript 2016,於2016年6月定案。 相較於ES2015,ES2016只是JavaScript的一個小型更新,僅包含兩個功能: Array.prototype.includes 指數運算子 Array.prototype.includes() 此功能引入了一種更易讀的語法,用於檢查數組是否包含元素。 在ES6及更低版本中,要檢查數組是否包含元素,需要使用indexOf函數,它會檢查元素的索引,如果元素不存在,則返回-1。 因為-1被評估為真值,所以無法做以下操作: if (![1,2].indexOf(3)) { console.log('未找到') } 有了ES2016中引入的這個功能,我們可以這樣做: if (![1,2].includes(3)) { console.log('未找到') } 指數運算子 指數運算子**相當於Math.pow(),但將其作為語言的一部分引入,而不是作為庫函數。 Math.pow(4, 2) == 4 \*\* 2 對於需要進行數學運算的JS應用程序來說,這個功能是一個不錯的補充。 **運算子在許多語言中都被標準化,包括Python、Ruby、MATLAB、Lua、Perl等等。