學習 ECMAScript/JavaScript 6 - Async Function 問答指南

注意,本文說的 async function 專指 JavaScript 的定義。

關於 async function (非同步函式)的使用入門,我想只需要回答三個問題就足夠了。

  1. 如何設計與使用 async function (非同步函式)?
  2. 我已經有使用 Promise 設計的函式了,如何改為非同步函式?
  3. 隱性的非同步函式改成顯性宣告(加上 async)有什麼好處?

最後補充關於 async 帶來的 color of function 的影響。

Debian Linux 設定 APT 套件庫僅使用 CD/DVD

絕大多數使用者在安裝 Debian/Ubuntu 之後,會修改 apt 的 sources.list ,完全使用網路上的套件庫,取消 CD 來源。但本文的操作相反,僅使用 Debian/Ubuntu 的 CD/DVD 內容作為套件庫來源。本文適用情境:

  1. 舊版本系統,官方已經移除網路上的套件庫。
  2. 主機網路不連外。

以上情境需要管理者事先從網路下載完整的光碟影像,並將光碟中的套件資訊匯入 apt 資料庫。日後需要安裝套件時,apt 就會提示管理者需要插入第幾片光碟。一般還需要手動修改 sources.list 加一些選項, apt 才不會丟出套件來源不能認證(can’t be authenticated)的錯誤。

增加隱私權政策 (Privacy Policy) 聲明頁

本站參加 Google AdSense 計畫。日前收到通知「自 2024 年 1 月 16 日起,AdSense 發布商除了遵守《歐盟地區使用者同意授權政策》規定以外,還必須採用 Google 認證且已整合 IAB 資訊公開和同意聲明架構 (TCF) 的 CMP」。為了符合 Google AdSense 規定的隱私權透明揭示原則,增加 「隱私權政策」聲明頁。頁面連結固定可見本站最下方頁腳處。

抱怨一點,Google 怎麼不直接提供隱私權政策的定型化範本。一般人哪知道該寫什麼內容。

在 Ubuntu 22.04 上更新 GitHubPages

安裝 Ubuntu 22.04 後,按照 Jekyll on Ubuntu 的說明,安裝 Jekyll 所需套件與環境。

sudo apt-get install ruby-full build-essential zlib1g-dev

echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc
echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

gem install jekyll bundler

安裝完成後,先建立一個測試 Jekyll 用的目錄。例如 jekyll-test 。

mkdir jekyll-test
cd jekyll-test
jekyll new --skip-bundle

這會建立一個全新網站的 Jekyll 專案目錄,但還要修改它的 Gemfile ,改用 github-pages 套件管理內容。

Linux NetworkManager 用命令列工具或組態檔設定網路連線

NetworkManager 是目前各種 Linux 散佈套件最常用的網路連線管理工具。預設配置就會安裝這套工具。它提供了多種 GUI 管理工具,一套命令列工具,也允許使用組態檔設定。本文說明如何以命令列工具或組態檔做基本的網路連線設定工作。

  • GUI 工具: 有很多種。但通常 GNOME 的 nm-applet (套件名 network-manager-gnome) 就足夠了。它在 KDE 或 LXDE/LXQt 桌面環境也能用。
  • 命令列工具: nm-cli
  • 組態檔: nm-settings-keyfile

Twitter (X) 撤除活動Timeline

因為 Twitter (改名 X) 撤除了活動 Timeline 功能,故本部落將首頁側欄內容改成 Profile Timeline 。

We retired the Likes, Collections, and Moments timelines on January 13, 2023.

You can learn more about this change in our announcement

K島歪串日常:民初的簡體字推動者是搞偽科學

No.29500864
然後日本人說繁體字對他們而言比中國簡體字更好懂 雖然我不是很明白這個邏輯

No.29500985
那是因為日本的簡化漢字是因為民族性或方便等原因長時間演變而成的,偶爾還是會看到古字(繁體)
中國簡體就不一樣了,那是為了提高認字率直接砍一刀說我們之後這樣寫,為了簡而簡。有些被日本簡化過了的字就直接拿來用才剛好看起來像
硬要說的話就是演化和簡化的差別
對日本人來說,繁體是使用古字,簡體則是另一種被發明出來東西

No.29501962
說白了就是清末民初那時的文人一直有”中國落後的原因有一部分因為方塊字太難寫”,這裡面的標竿就是錢玄同,錢他自己編的簡體字譜收了2400餘字,這數量遠多於國民政府公布的324個一簡字甚至還多於1964年共產黨政府推出的簡化字總表2236字
而事實上共產黨建政後挾著新中國建立聲威推一簡成功後變本加厲的還要推二簡甚至中文全羅馬拼音化,也是撞到牆才停

因為那些讀書人沒有語言學這項專長啊www

如果有的話就不會提出這點子了

K島歪串日常:經濟思想史軼事,資本論其實沒寫完

其實資本論根本沒寫完w

我記得熊彼得吐槽馬克思出版資本論第一卷後,讀了邊際理論,然後資本論剩下的內容就寫不下去了。 ps.馬克思學的是李嘉圖的古典理論

No.29651168
這我倒是第一次聽說,所以馬列信徒的聖經根本是個沒寫完的破書嗎www
「關於我寫到一半寫不下去的理論半成品被野心革命家當作革命聖經放送這件事」

.NET 筆記 - System.Threading.Timer 和 System.Timers.Timer 兩種計時器的差異

本文內容以 .NET 6 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。

在 .NET 平台上,有兩種主要的計時器類別(Timer),分別是:

在一些 .NET Framework 文件中,還會提到其他種類的計時器類別,例如 System.Windows.Forms.Timer 。但看名字就知道,那些計時器類別綁定在 UI 庫或 Windows 系統上。而本文提到的這兩種計時器則具有普遍性,不會妨礙 .NET 程式的跨平台運行能力。

.NET 筆記 - 處理程式終止事件 (kill SIGTERM/SIGINT)

本文內容以 .NET 6 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。

我們有很多種方法可以結束一個執行中的程式。例如一個在指令列執行的程式,可以按下 Ctrl + C 打斷它。又或者是「工作管理員」這類的工具,也會提供「結束工作」按鈕讓使用者終止指定的程式。 Linux 用戶熟悉的 kill 指令也是一個用外部工具終止程式的方法。

在 Unix/Linux/BSD/macOS 系統,上述操作都統一在 signal 訊號機制。例如 Ctrl + C 實際上觸發 SIGINT 訊號; kill 默認發出 SIGTERM 訊號;強制終止程式觸發 SIGKILL 訊號。具體列表請見 GNU libc manual - Termination Signals。在 Windows 系統上其實也有類似的方法,不過本文重點是 .NET 平台。

.NET 筆記 - NamedPipe 與 Unix Domain Socket (.NET 6)

本文內容以 .NET 6 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。

Named pipe (具名管道) 在 .NET 上不是新玩意,早在 .NET Framework 3.5 時就已提供 NamedPipeServerStream / NamedPipeClientStream。 但是自 .NET 6 起,它的底層實作技術改變了。 如果你想讓其他程式語言開發的程式 (非 .NET 平台) 和 NamedPipeServerStream / NamedPipeClientStream 程式溝通,必須知道這件事。

我有一個用 .NET Core 3 寫的具名管道服務程式,前陣子想用 .NET 6 發佈到 Linux 跑。結果原先用 FIFO 寫的客戶端程式接不上。一番研究後,才知道 .NET 6 改了具名管道的底層實作技術。

Linux 開機後,利用 systemd 自動啟動 VirtualBox 虛擬機的作法

在 Linux 桌面環境,想要開機後自動啟動某程式,簡易作法就是在 autostart 設定中加入要啟動的程式。 但這個作法用在 VirtualBox 的虛擬機上,就不太靈光。 偶爾可以啟動,但有時會跳出 vboxdrv 尚未載入的錯誤狀況。 然而手動啟動虛擬機總是正常的。

因為現代的 Linux 散佈版本於啟動桌面環境時,會將進入桌面和載入驅動程式 (包含 vboxdrv) 等多個工作,交給 systemd 平行處理 (systemd 約 2013 年之後普及)。 既然是平行處理,那麼進入桌面和載入 vboxdrv 這兩件工作,誰先誰後就不是固定順序的了。

所以想透過桌面環境的 autostart 自動啟動虛擬機的話,有時就會碰到先進入桌面但 vboxdrv 還沒載入的情形。 然後就跳出上述的錯誤了。

Linux 如何用舊的 eth0 網路介面名稱,不要 eno0, enp0s1 這種

為什麼現在 Linux 的網路介面名稱不是 eth0 ? 這說來話長,我先長話短說。

若要用 eth0 ,編輯 /etc/default/grubGRUB_CMDLINE_LINUX 這行改成:

 
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

然後執行下列指令更新 grub 設定:


$ sudo update-grub
或者
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

想要了解來龍去脈,請接著看。

使用 CloneZilla 指令列工具批次生產相同配置的業務用磁碟

標題說的業務用磁碟是指多顆具有相同分割區配置,安裝 Linux 作業系統和客戶業務軟體,用在大量裝機場合的磁碟。 此外,本文情境還將面臨分批採購、後續替換等狀況,故使用的磁碟會是不同型號、不同品牌、甚至標示容量也不相同。

CloneZilla 的磁碟對拷功能雖然可以直接複製分割區配置,但一般情形僅限兩顆磁碟實際容量一致或目的磁碟容量較大的情形。 為了能複製到不同容量的磁碟,本文情境的分割區配置並不會用滿整顆磁碟的容量。 實務上可能只配置 30GB 左右,以便複製到 32GB 或更大容量的磁碟。 這種分割區配置方式適合使用於 eMMC, CF卡, USB隨身碟, SSD 這一類的儲存媒體。

這種做法,我以前也用在 Raspberry Pi 上。可以參考我這篇 產生指定容量的 Raspberry Pi SD 卡磁碟映像

2022-10-05: 大幅改寫,改以磁碟為複製單位,而不是分割區。

K島歪串日常:我看君主立憲制

大英國協王國女王伊莉莎白二世於 2022 年 9 月 8 日逝世。 The Queen is dead, Long live the King. 接著以伊莉莎白二世為元首的加拿大就有人提議廢除君主立憲制,但直接被總理拒絕。拒絕重啟憲政辯論 加拿大總理:不討論君主制問題。他說「在一個世界上最好、最穩定的體系中做出如此深刻的改變,對我來說,現在,這不是一個好主意」。 我也覺得在權力制衡運作良好的國家提議廢除君主立憲是居心叵測。我想到去年在 K 島上,我也聊過君主立憲制。

近兩三年來,日本動畫、漫畫、輕小說流行異世界或轉生題材,其中不乏轉生為歷史人物者。而去年(2021),有兩套幾乎同期刊載的轉生歷史人物漫畫,一套主角轉生為法國瑪麗皇后,另一套主角轉生為法國國王路易十六。喔,提醒一點,瑪麗皇后就是路易十六的妻子。我當時就覺得這兩個作者怎麼不摻在一起畫算了(大笑)。順便看看 PTT 鄉民的推文:轉生成路易十六,全力阻止革命讓瑪麗幸福

.NET MQTT 用戶端訂閱方法使用時的陷阱,關於 MaximumQualityOfService

我有個用 .NET Core 開發的案子,需要透過 MQTT 取得設備狀態後顯示在螢幕上。 最近在新增可用設備後,遭客戶回報主程式顯示設備未回應,但指定設備實際上還在運作的狀況。 我仔細分析了程式工作期間的 log 內容,發現是主程式訂閱的訊息中途失聯了。 主程式剛開始都有收到設備發佈的狀態,一段時間後就收不到了。而執行緒仍然活著好好的,顯然不是程式錯誤。

在解決過程中,我才發現被 System.Net.Mqtt 套件坑了。 它有一個不知該說是臭蟲、或是陷阱的特性。 若沒有正確設置 MqttConfigurationMaximumQualityOfService 屬性,則訂閱者收到 20 次訂閱訊息後,就不再通知訂閱者新的訊息。

.NET 筆記 - 用C#反射載入純文字Config組態檔

本文內容以 .NET Core 3 / .NET 5 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。

設計程式時,對於具有常數性質的內容,我們通常允許從外部檔案載入其值。 而使用者也可以藉由編輯外部檔案,在不修改程式碼的情況下改變程式工作方式。 這種外部檔案,我們通常稱為「設定檔」、「組態檔」、「ini 檔」或「config 檔」。

組態檔最普遍且傳統的內容格式是用純文字檔。在 Linux 系統中,可以在 /etc 目錄下找到一大堆這種組態檔。 而 Windows 系統中,也可以搜尋副檔名 .ini 或 .cfg 找到它們的踨跡。

本文示範用 C# 的反射機制,實作這種組態檔的載入工作。

.NET 筆記 - C# 自定義事件範例

本文內容以 .NET Core 3 / .NET 5 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。

現代程式語言很強調 callback 能力, JavaScript 是其中代表。 雖然 callback 本質上是把函數當一個參數傳遞給另一個函數,連 C 語言都能做這事。 但有些程式語言並不把函數與變數視為同等地位,因此不能直接把函數當參數傳遞,而需要特定的語法支持。 C# 就是這類程式語言。

對於 callback 能力,C# 基本上提供了兩種語法支持。 其一是委派(delegate),其二是事件(event)。事件也可說是較複雜的委派。 本文示範如何為自己的類別添加自行定義的事件。

SQL 更新欄位回傳更新之值

標準的 SQL UPDATE 敘述只回傳受到影響的資料筆數。 如果更新敘述是 UPDATE table SET n = n + 1 這種更新動作,你得要再下一個 SELECT 敘述撈出新的資料結果。

但是各家資料庫系統通常有自已獨特的擴充語法,可讓 UPDATE 敘述直接回傳更新後的資料結果。 本文只說明 PostgreSQL 和 MS SQL Server 兩家的更新欄位並回傳資料結果的擴充語法。