Excel帶條件過濾的不重複項計算

透過Countif()可以計算該數在一個範圍出現次數,假設一個數字a出現n次,倒數為1/n,該數的倒數總和為1/n*n=1,因此所有數字的倒數和加總就是不重複的數字共有幾項。

Excel範例

網路上的範例多到此為止,倘若今天想針對一個個體(如姓名)去做不重複項統計,就得針對範圍作過濾。

最難的部分是範圍是浮動的,而且範圍中數值也不能為空,反則會出現計數為零,倒數變成除零的錯誤。如果把值設定預設值填滿,就要在計算不重複數時扣除。

透過filter()去過濾,再Countif()的部分跳出錯誤,原因是先Filter可能會造成範圍不連續導致Countif()的Criteria無法對比,範例中是連續範圍。

換個思路,若以連續範圍為主,就要先以match()找到範圍上限下限,Indirect()框出目標範圍,然後再以Countif()如範例統計,面對缺值空項以Filter()去掉空項出現次數0,最後倒數,再總和,就能得到帶條件的不重複項。

完成版本

範例Excel下載連結

這種方法有個限制,需要有個連續排序,最後一個match()需要手動指定數值否則會跳error,不過都帶條件了,要做排序是很容易的。

Aruba Controller Httpd造成CPU負載過重

今年碰到兩個案例,皆是使用「網頁認證」(Captive Portal)作為無線認證的主力。

一個使用Aruba 3000系列控制器,Client數目大概到了一百多。
另一個使用Aruba 7220,總Client可到三千,使用網頁認證的大約占三成。

一旦碰上尖峰,CPU負載會達到100%並持續一段時間。

在6版OS,使用「show cpuload current」可以看見甚麼類型的程序占用CPU的百分比。

httpd佔據使用的前兩名

httpd是提供網頁服務,像是管理網頁與網頁認證,因此如果無線使用者使用網頁認證,就會有個USER為nobody的程序在。

Aruba控制器在架構主要是個L3 Switch,一般來說流量都會回到控制器上,而Switch的CPU負載過重會造成整個無線網路的不穩定。雖然知道httpd是造成CPU負載過重的主因,可會遇到這問題的案例,通常網頁認證已經佔有很重的部分,所以沒辦法說停就停,以求讓網路表現變得更穩定。

要解決httpd造成CPU負載過重,以下有兩個主思路:
1. 提升CPU運算能力,更新更強大運力的控制器。
2. 降低CPU的負擔,減少網頁認證使用,減少提供網頁造成的CPU負載。

在案例一,替換成7000系列的控制器就把CPU負載穩穩壓在20%以下。
在案例二,每當特定時段會出現大量使用者連線,進行網頁認證的使用者數目可超越三百,即便是7220也會造成CPU使用率飆升至紅線80%,這時候就需要走第二個思路去減少CPU負載。

相比802.1x、MAC、PSK認證,網頁認證需要進行更長的時間、傳送更長的封包,因此如果能將採取前項的無線認證方式,會能夠減少更多的CPU負載,需要鼓勵使用者使用其他方式認證的無線,或是讓網頁認證的無線更難用一點(?)。

要如何讓網頁認證更難用一些? 控制器Captive Portal設定中:
1. 提升Redirect Pause Seconds,讓等待時間久一些。通常是塞車時(CPU負載高於門檻,預設60%)才會用到,過短會造成更快reload網頁的惡性循環。
2. 降低CPU utilization threshold,塞車時會讓CPU負載比這值高一些,建議為預設值60%,如此塞車時CPU使用率會在更高一些,不建議超越90%造成網路不穩。
3. 關閉bypass-cp-landing-page,官方文件寫說關閉能降低cpu負載,開啟與關閉在於網頁轉導的方式不同,預設值為關閉。

塞車的原因是來不及消化,前兩項只是控制塞車造成的影響,並無助於提升消化網頁認證速度而避免塞車。第三點能有效幫助網頁認證造成的CPU負載。

既然網頁在控制器上會有很重的CPU負擔,那可以把控制器的角色單純一點,將網頁外置,如此可避免尖峰時段無線控制器CPU負載過重造成不穩。

在一個中大型場景,網路的穩定度越需要更精確的分工合作,一方面方便管理,另一方面也會有效率。畢竟無線控制器最重要的是管理好無線網路設備,畢竟控制器一倒的話,全部無線都會受影響,為避免電話接不完,還是讓控制器有餘韻能專一在它的專業功能上。

Python 清理製表內容的空白分割

在抓取資料時,表格資料會使用製表符號做資料項區隔,方便人眼辨識資訊。

"A       B    C is Great.                     D"

利用 “”.split() 可以使用快速以” “做分隔,產生值為 [“A”, “B”, “C”, “is”, “Great.”, “D”]的串列。不過這樣的結果,並不是期望的[“A”, “B”, “C is Great.”, “D”]串列。

因為是製表符產生的空白,所以項目間的空白長度是浮動的,就沒有辦法利用固定長度洗掉。

這裡面有個資料項是敘述類型,中間帶有” “,需要完整呈現,不能把中間的” “被當成split()的依據。這行資料只是一個樣本,每行資料敘述是不是帶有” “,不一定,” “數量多少也不一定。

但仔細觀察,項目與項目中間的空白會有至少兩個,敘述內的空白只會有一個。

說到「至少兩個空白」的規則,可以使用正則表達式,以「” +”」表示。

搭配””.split(),但因為敘述中會有” “,所以要換個分割符,原則上只要不會出現就好,這裡使用「!@#」。

結合兩者,可以得到以下的程式碼

import re
text = "A       B    C is Great.                     D"
print(re.sub("  +", "!@#", text).split("!@#"))

# => ['A', 'B', 'C is Great.', 'D']

不過,有時候會產生歪斜的字串,可能會出現以下情況

"  A       B    C is Great.                     D"

或是自己鐵了心不想使用re,不想多引用一個套件。

上述的字串經過””.split(” “)以雙空白分割後,串列內會有許多””的,這部分不需要,這時候可以使用filter()將其過濾掉。

filter()這個類別可以設定條件去過濾串列,符合條件的會被過濾掉,留下沒有被過濾掉的。我們可以把””濾掉,””相等None,於是可以寫成以下。

text = "  A       B    C is Great.                     D"
print(text.split("  "))
# => ['', 'A', '', '', ' B', '', 'C is Great.', '', '', '', '', '', '', '', '', '', ' D']

fliter_text = filter(None, text.split("  "))
print(list(fliter_text))
# => ['A', ' B', 'C is Great.', ' D']

雖然項目數目是正確的,但資料項可能會有空白,這是因為單數長度的空白分隔導致,不過也好處理多了。使用””.strip(),可清除頭尾空白。

text = "  A       B    C is Great.                     D"
fliter_text = filter(None, text.split("  "))
print([row.strip() for row in list(fliter_text)])
# => ['A', 'B', 'C is Great.', 'D']

WiFi 802.1x 認證介紹與設定流程

參考《802.1X 概述與 EAP 類型

關於WiFi 802.1x 認證

WiFi認證有三種模式:Open、PSK(WPA Personal)、802.1x(WPA Enterprise)。
各自連線時需要輸入:無密碼、一組密碼、一組帳號密碼。

出處

進行802.1x驗證時,Client會與Server透過可延伸的驗證通訊協定 (EAP)進行直接溝通傳遞驗證資訊,而EAP中最常使用PEAP:

PEAP

PEAP (防護型可延伸的驗證通訊協定) 提供了一種經由 802.11 Wi-Fi 網路來安全地傳輸驗證資料 (包括舊型的密碼式通訊協定) 的方法。PEAP 達到此一目標的方式,是在 PEAP 用戶端與驗證伺服器之間使用隧道功能。就像競爭的標準型「隧道式傳輸層安全性」(TTLS),PEAP 只使用伺服器端的憑證來驗證 Wi-Fi 區域網路用戶端,因此可以簡化安全 Wi-Fi 區域網路的實施與管理。PEAP 是由 Microsoft、Cisco 及 RSA Security 共同開發。

簡單來說,PEAP的功能是建立Client與Server之間的隧道,接下來會進行第二階段的驗證。而PEAP的隧道建立需要有Server Certificate,因此除了需要Server上要有憑證之外,如果該憑證是不受Client信任的,就會跳出告警問是否要繼續。

目前在Win11、iOS都會跳出告警,但是Android11以後就會強制拒絕,導致Android用戶無法像以往直接連上線。

PEAP在建立隧道後進行第二階段驗證,最常見的驗證方式為「MSCHAPv2」以及其他的驗證方式。某些Radius Server可能不支援此種驗證方式,需要改用Password authentication protocol(PAP)進行驗證。

甚麼憑證受信任?

在大部分情況下,透過802.1x進行驗證會跳出憑證信任的告警,這是因為許多網路環境並沒有進行憑證相關的管理。因此遇到Android新版本問題或是想要使告警視窗消除,就需要學習憑證相關知識。※Android 13 可以選擇第一次信任。

簡單來說,憑證(Certificate)是包含一對以能進行非對稱加密的公鑰與私鑰,將傳輸的資料以公鑰加密,接下來只能透過私鑰解密才能看到原始資料,不僅避免明碼傳輸,也大幅增加安全性。

公鑰會公開傳遞給其他使用者,私鑰留在自己身上。其他使用者想要傳遞資料給自己時,就利用該公鑰加密後,只有擁有對應私鑰的自己才能解密看到原始資料,其他人就算獲取加密訊息也難以解開。

然而,IP被被偽冒也很容易,導致公鑰也可能出現被偽冒的情形,於是就需要一種機制避免公鑰被偽冒,這個機制就是數位簽章。

自己的公鑰再拿去被認證機構(certificate authority, CA)簽署,這些認證機構可以是企業內部或者是公共認證機構,公共認證機構多半預設情形下會被用戶給信任,因為公共認證機構的公鑰在常見的作業系統都預載在用戶端上,而企業CA還需要匯入憑證與設定。

當認證機構簽署之後,上面就會留有一段認證機構的加密訊息,為認證機構用私鑰加密過後的內容,之後用戶端透過預載的CA憑證(公鑰)去檢查這段訊息的真偽,若為真就能信任該伺服器公鑰。

簽署一張憑證,CA可以有好幾個,形成串鏈,最後才到自己。最根層稱為Root CA,基本上為是公共CA或企業CA。接下來是中繼CA,具有簽署憑證的功能。最重要的就是Root CA,若Root CA被破解,就能大量簽署能被信任的憑證,也就不用費心費力去偽冒。

在802.1x中,用戶端會檢查伺服器憑證的Root CA,用戶端上面要有該Root CA的公鑰,在CA清單中能找到該Root CA,能順利解密出簽章訊息,這張伺服器憑證才會被信任。

WiFi 802.1x 環境準備

在瞭解上述內容之後,要建立一個良好的架構,這裡要準備以下幾點:

  • 支援802.1x無線設備
  • 認證伺服器憑證
  • 用戶端信任認證伺服器憑證
支援802.1x無線設備

無線存取點或是行動裝置等雙邊都要能支援802.1x認證,目前WPA Enterprise的版本有1-3,級別越高越新也越安全,但是舊設備不一定能支持最新的版本。

認證伺服器憑證有且有效

當用戶端透過peap建立隧道溝通時,會需要使用認證伺服器憑證,若認證伺服器沒有憑證,就建立不起來,即便輸入帳密正確也無法使用。此外,憑證也要有效,這部分最多是憑證到期,其次是時間不正確。

用戶端信任認證伺服器憑證

在連線 WiFi 802.1x 時,跳出任何憑證告警都是用戶端不信任伺服器憑證,大部分是因為伺服器憑證的Root CA不在用戶端的CA清單上,還有一部份是用戶端沒有在CA清單上將Root CA勾選信任,即使該Root CA是公共CA。這部分會發生在Windows上直接連線802.1x時的WiFi,只要手動設定勾選就不會再跳出告警。

Android可以安裝WiFi憑證,該憑證專門用於特定一個802.1x WiFi連線,不一定要改動CA清單。安裝的WiFi憑證是認證伺服器的Root CA憑證,並不是認證伺服器的憑證。

WiFi 802.1x 設定流程

一切準備好之後,照著以下步驟:

  1. 在認證伺服器匯入憑證,並套用該憑證
  2. 無線控制器與認證伺服器能建立連線
  3. 無線控制器上建立802.1x的WiFi,並選擇剛加入的認證伺服器。
  4. 檢查用戶端是否擁有認證伺服器的Root CA憑證,並且信任。
  5. 用戶端上針對該WiFi進行設定,如帳密、網域與使用憑證等。

在Android上,伺服器憑證的Root CA為公共CA,在CA憑證中則選「使用系統憑證」。

若Root CA不是公共CA,則在CA憑證選擇安裝憑證,並且把認證伺服器憑證的Root CA的憑證給安裝上去,然後再選擇該憑證。

在設定流程中,大部分都是選擇的都是新增加選項,唯有「網域」是未曾提到過但卻要輸入。

網域要填認證伺服器的Common Name Domain,如有個伺服器憑證的主體為「wlan.abc123.com」,那麼網域就要填寫「abc123.com」。如果是使用萬用憑證「*.abc123.com」,網域依然不變,仍填「abc123.com」。

Aruba Mobility Master(MM)調整硬碟容量

這是千顆AP的MM

參考文章「How to Resize AOS 8.x MM or VMC

一般來說Aruba Moblility Master(MM)是透過.ova檔案安裝,因為此種方式會比較簡單,資源配置等都已經內建在.ova檔案,毋需做調整即可直接進入初始化設定。

Aruba MM .ova檔案的資源配置
官方指南的硬體資源配置表格

對照表格,可以知道MM的.ova檔配置是50台以下的規格。倘若日後AP數目增加,停機調高CPU跟Memory都能迅速在虛擬機上看到調整後的資源。

show cpuload per-cpu
show memory
CPU與Memory調整後會直接生效

但是硬碟無法直接將原有硬碟容量的調高就能生效,需要經過幾個步驟來轉換硬碟。

Aruba MM有兩個硬碟,硬碟1是存放OS跟開機image用途,硬碟2是flash。

show storage

我們可以看到各檔案區的大小與目前的使用量,即使把硬碟容量調高,在MM上還是原來的大小。

即使把硬碟容量調高,在MM上還是原來的大小。

硬碟2映照在/dev/sdb1,也就是/flash。

這邊照著參考文章的做法,我們新增一個硬碟,然後重新開機。這時候MM偵測到新的硬碟,先將硬碟格式化後,會把flash的檔案轉移到新硬碟上。

故意嘗試加入容量比較小的硬碟
新硬碟被偵測到容量比舊的小,跳出告警。
直接新增一個新的硬碟55GB
正在複製檔案
開好機後,下指令看硬碟

之後舊的比較小的硬碟能夠直接刪除掉,不會影響正常運作。

Aruba Airwave幫納管設備升級韌體

Aruba Airwave可以升級納管設備的韌體。透過Airwave升級,可以做到集中式、簡單化、排程去讓設備升級韌體。集中式可省去網管人員逐一連線到各設備下指令升級,簡單化透過網頁介面即可完成所有操作,排程可以預先設定執行時間如離峰時段自動執行。

若要透過Airwave升級納管設備韌體,要有以下的條件:

  • 納管設備需要切換到「Read/Write Mode」
  • 上傳Firmwave

納管設備需要切換到「Read/Write Mode」

到 Devices > List,右鍵進入需要升級韌體設備的管理介面,切換管理模式到 Manage Read/Write 。

上傳Firmwave

從 Device Setup > Upload Firmware & Files,點擊「Add」New Firmware File。

這裡以Aruba 2930F為例

Type選擇對應的類型,Description簡單描述,在Firmware Filename選擇韌體檔案,最後按Add上傳。

安排韌體升級任務

從Groups

左方 Groups > Firmware

選擇需要升級韌體的設備類型,並從下拉選單選擇韌體。

點選 Save and Upgrade Devices,就能馬上升級所有group設備到指令版本。

從設備管理頁面

Update Firmware

將 Reboot immediately after image download 選No,就會先將Firmware傳到設備,然後在指定的時間重新啟動以升級。

Win11 把遠端桌面當成一個虛擬桌面切換

最近Work From Home盛行,自己也入手了第二台筆電,於是想把舊筆電當成一台遠端主機,就能同時操兩台。

遠端桌面軟體像是Teamviewer、Chrome遠端桌面或是Anydesk都無法像Windows本身的遠端桌面那麼好用,一旦進入到遠端主機,按鍵要能順暢吃過去才會舒服。

進入遠端桌面全螢幕時,按鍵組合就會能被遠端主機吃到

可是,切換虛擬桌面的快捷鍵會是切換遠端主機的虛擬桌面,就無法切回本地主機身上。

win10如何让切换全屏远程桌面像切换虚拟桌面一样方便?

找到這一篇文章,首先按下「Ctrl + Alt + Home」就能把組合鍵控制權切到本地主機上,這時候再按「Ctrl + Win + 方向鍵」就能切換本地主機的虛擬桌面,達到兩個虛擬桌面,一個是本地主機,另一個是全螢幕的遠端主機。

鍵盤的輸入會被遠端桌面吃掉,如果不屬於能吃掉的輸入源,就能順利左右切換。像是筆電上的觸控版,三指左右滑,或是利用鍵盤的巨集功能,連按兩次組合鍵,都能達到秒切換。

筆電關獨顯讓續航增加

以續航力為取向的使用者,會希望能在外面的時候,沒有插座的情況下,還可以安心地使用。就像手機的電量,如果一定得一天一充,在電量快見底時就會有沒電焦慮。

筆電的正常使用情境下,要能超過四小時的續航力,最好要保六小時,因為電量剩20%會進入省電模式,不僅是影響效能,進入這模式還會觸發沒電焦慮,誰都不想沒電讓工作而受影響。

這裡只信仰最紮實的:功耗與電池容量。

官網宣稱續航力幾小時,那都是僅供參考。實際上使用是讓CPU做反覆間歇運動,點開或切換一個網頁就讓CPU使用率瞬間衝個幾%,那種靜態擺著才有續航力時間,通常要直接減半。

有些筆電也會打著「獨顯」的名義去讓筆電加值,但其實不一定需要獨顯,如果沒有獨顯需求的人,最好不要買搭配獨顯。獨立顯示卡能提供很好的圖形效能,但這效能也是需要用電驅動。筆電端那有限的電池容量,只要功耗多個幾瓦,續航力就會雪崩式減少。

如果買了帶獨顯的筆電,其實還是可以手動把獨顯關掉。筆電螢幕顯示通常都是吃內顯,並不會關掉獨顯就讓螢幕全黑。

在裝置管理員中,從顯示卡中找到該張顯示卡,停用裝置就能關掉獨顯

到底關掉獨顯之後的功耗有沒有差別?有差又差多少?這才是我們真正需要關心的。

透過ADIA 64這類的監控軟體,可以看到CPU與GPU的功耗,以及整體功耗數字。

測試的筆電是 微星 的 Prestige 15,在效能模式下,滿電能使用大概三小時左右。以下測試的數據會不斷給予滑鼠鍵盤操作,再選一個常態的功耗做完代表。

開啟獨立顯示卡

將CPU Package與GPU數字加起來,11.76w + 5.42w,總瓦數為 17.18W

關閉獨立顯示卡

將CPU Package,9.55w,總瓦數為 9.55W。※這數字不確定是否仍有供電給獨顯

就從CPU Package來看,關掉獨立顯示卡能讓功耗降至原本的81.2%,能讓續航力變為開啟獨立顯示卡時的123%。

關掉獨立顯示卡,確實能降低筆電整體功耗

如果滿電時能用三小時,關掉獨立顯示卡可預估再多出四十分鐘以上的使用時間。實際拔充電線看整體功耗,多出的續航力會比這個預估再多一些。

總之等那偶爾要用到獨顯的時候再打開,平時關掉,節能之餘還能增加續航力,就能讓攜帶外出使用時的沒電焦慮稍微緩和一點。

Win11 Microsoft Store 無法取得更新

連結文章

這幾天一直被這個問題困擾著,新電腦的Win11 Pro是有點問題的,經過更新到最新版本有好轉一些。

不過 Microsoft Store 卻一直沒有辦法更新,然後就多半的文章就是指令四連。

Dism /Online /Cleanup-Image /CheckHealth
Dism /Online /Cleanup-Image /ScanHealth
Dism /Online /Cleanup-Image /RestoreHealth

sfc /scannow

或是在應用程式的進階選項,重設重置。

以上方法都宣告無效,DNS也清理過、VPN也關掉等。

直到看到最前面的文章,終於在服務中找到「Storage Service」是已經被停用的,開啟之後就能讓 Microsoft Store 正常更新。

Anydesk 開機不自動啟動

對於一個效能控,Anydesk也只有要用到的時候才會用到,開機自動啟動實在是很討厭。

在Anydesk的設定裡面是沒有提供選項關閉,只好手動關閉它。

常見伴隨開機啟動的有三種方式:

  1. 服務
  2. 啟動
  3. 工作排程器

服務

從工作管理員>服務,可以找到Anydesk,一般來說調整成「手動」,就不會自動啟動。但是Anydesk仍會啟動,可見不是關閉服務。

啟動

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

把捷徑放到這個資料夾下,開機時就會啟動。進入這個資料夾,可以找到Anydesk的捷徑,刪除之後,開機就不會啟動了。

工作排程器

在搜尋打上「工作排程器」就可以找到。

進入裡面可以針對一些情境設定為觸發條件,像是登入後啟動,或是一個固定的時間。

Aruba Controller 多介面流量走向

有天在客戶那發現,它把管理VLAN設在速率1G的介面,其他資料VLAN設在10G的介面,所以無線速率上不去,為什麼呢?做了一個LAB去觀察。

以下是LAB的架構,Controller接兩條外線,一條VLAN1、一條VLAN5。由於Aruba是用Tunnel作為Client與Controller的連接,所以用單線表示。

今天使用者連上VLAN5的WiFi,對下方的電腦做iperf3,如果走左線就會被限速到,走右線可測得高許多的速率。

實測結果是走「左線」為什麼?

AP跟Controller之間,每一個BSSID都會有一個Tunnel,Client的資料會走這條Tunnel回去Controller,下指令可以看到,Tunnel在Controller端是Switch IP,因此資料會從左線回去。

show datapath tunnel table

今天要是想把管理與資料兩者分開,建議還是用VLAN區別,不要用實體介面拆開,就算這樣做,也要讓Mgmt VLAN(Switch IP)使用大頻寬的介面。

要更改Switch IP需要重新啟動Controller,在一開始規劃好是比較重要的,後面上線要重新啟動都會造成不便。

Aruba2930F經Radius認證登入

Aruba2930F可以針對各種協定去設定認證伺服器群組,像是Telnet走一種,SSH走另外一種。一般來說,預設是先看Local,第二順位是None。

往常都走CPPM,本篇以Windows Server NPS為例。在設定測試過程中,反覆去看認證紀錄,可以知道認證對應的服務原則是否有符合預期的項目,這部分就不贅述。

今天想要針對不同群組的使用者做權限分級,擁有管理權限的登入為Manager權限,次管理權限的登入為Operator權限,其餘無法登入。因為Aruba 2930F透過Radius或是Tacacs認證只支援Manager跟Operator兩種等級,並無法細分LeveL-1到Level-15。

參考文章

使用者資訊放在Radius Server上,如果使用者群組來自IT,對應權限是Manager,在Server-Type回傳數值6,如果像是NPS,就選擇Administrative。如果對應權限是Operator,在Server-Type回傳數值7,在NPS上選擇NAS Prompt。

回到2930F上,以下是針對telnet設定的範例,請自行修改。

radius-server host <Radius IP>
radius-server host <Radius IP> key <Secret Key>
aaa server-group radius "NPS" host <Radius IP>
aaa authentication login privilege-mode
aaa authentication telnet login peap-mschapv2 server-group "Radius1" none
aaa authentication telnet enable peap-mschapv2 server-group "Radius1" none
NPS的網路原則

這部分起了兩個原則,使用者來自特定群組會符合NetworkMgmt然後擁有Manager權限,其他使用者會符合NetworkOperator擁有Operator權限。

接下來拿兩個使用者為例:jn、jn-it。在規劃上,jn-it有Manager的權限、jn有Operator的權限。

以telnet連線,用jn-it登入,會直接進入「#」模式。

以telnet連線,用jn登入,會先進入「>」模式,輸入enable,重新輸入帳號,會發現無法進入「#」模式。

這時候如果輸入jn-it,就能夠進入「#」模式。