Python判斷日期是否為臺灣工作日

分類:

我的Github

以往工作日判斷是週一到週五,不過在臺灣,就沒有那麼適用,連續假期前的補班,還是連續假期中的彈性放假,都讓工作日判斷失準。

找到一個長期運營的公開資料平臺,可以取得行事曆,然後從中判斷該日期是否為臺灣工作日。以往我都是手動key,每年一次,如今找到這個來源,可以變成全自動。

總算解決了臺灣工作日判斷的難題。😂

Home Assistant取得一個實體entity的歷史數值 (Get the historical values of a Home Assistant entity)

分類:

參考文章

在Home Assistant中,要取得實體的歷史數值,需要有recorder把實體數值保存。

如果確定有一實體有過往數值,那可以使用以下的SQL範例。

範例為 entity_id = ‘<your_entity_id>’ 取30天前的第一筆資料:

SELECT
  states.state
FROM
  states
WHERE
      metadata_id = (
        SELECT
          metadata_id
        FROM
          states_meta
        WHERE
          entity_id = '<your_entity_id>'
      )
  AND FROM_UNIXTIME(last_updated_ts) >= DATE_SUB(NOW(), INTERVAL 30 DAY)
  ORDER BY
	last_updated_ts ASC
  LIMIT
    1;

Home Assistant在保存數值是放入states資料表,而state透過metadata_id去對應entity_id,因此需要先從states_meta去找到entity_id對應的metadata_id,然後再從states找metadata_id符合的記錄。

將著states記錄中的時間欄位為last_updated_ts,使用timestamp格式,需要轉換成datetime類別才能做時間比較。

如果看不出timestamp的時間為某年某月某日,可以將值輸入到此網頁去轉換成時期格式。

DATE_SUB中的DAY,可以換成MONTH或是HOUR,依據使用需要。

步驟

從整合中,添加SQL。

官方文件中的說明

在欄位打上state,在選擇查詢將sql語句貼上。

Excel優雅地使數值小於0變為0

參考文章

最近在寫預算表,發現這是寫過最難的Excel,因為能想像中的概念跟表達出來的有落差,為了補足落差,只好把概念想得更清楚,這才有了一份結構複雜的Excel。

基於某些計算,項目的預算居然會小於0!(當然要讓概念又要再補充到更詳盡

當然知道

=if(a<0,0,a)

這種很簡單的寫法,但是我的公式長到一行,又不想多一欄,多欄位會破壞美觀。

以下是另外一種寫法,最大的差異是只用一次「a」,這裡是代數。

=NUMBERVALUE(TEXT(a,"0;!0;0;!0"))

以下是我的實際公式為例

如果使用「if」

=if([@粗估預算]-IF([@預算類型]="類別預算",SUM(FILTER(年度預算表[[#資料],[粗估預算]],(年度預算表[[#資料],[類別項目]]=[@類別項目])*(年度預算表[[#資料],[名稱]]<>"預算"),0)),0)<0,0,[@粗估預算]-IF([@預算類型]="類別預算",SUM(FILTER(年度預算表[[#資料],[粗估預算]],(年度預算表[[#資料],[類別項目]]=[@類別項目])*(年度預算表[[#資料],[名稱]]<>"預算"),0)),0))

如果使用「NUMBERVALUE(TEXT(a,”0;!0;0;!0″))」

=NUMBERVALUE(TEXT([@粗估預算]-IF([@預算類型]="類別預算",SUM(FILTER(年度預算表[[#資料],[粗估預算]],(年度預算表[[#資料],[類別項目]]=[@類別項目])*(年度預算表[[#資料],[名稱]]<>"預算"),0)),0),"0;!0;0;!0"))

Excel一旦突破一行一半,可讀性就會大幅下降。建議避免讓同樣的部分二次出現,因此使用「NUMBERVALUE(TEXT(a,”0;!0;0;!0″))」可以優雅地使小於0的值變成0。

Visual Studio文件選擇編碼儲存

參考文章

因為經常遇到編碼問題,只有統一編碼才不會有問題,最廣泛適用的編碼是「uft8」,以往還有耐心使用記事本開啟,再以utf8保存,現在想直接在Visual Studio上修改。

參考文章多半是使用簡體中文,所以譯名跟繁體中文會不太一樣。如果使用繁體中文的Vitual Studio,名稱是「進階儲存選項」。

步驟

開啟Visual Studio,上方「工具」>「自訂」。

「命令」>功能表列選擇「檔案」>「加入命令」> 分類選擇「檔案」 > 「進階儲存選項」,並且按確定。之後將其移置到喜歡的位置。

接著從上方「檔案」就能看到「進階儲存選項」。

按下後如下圖,就能調整編碼。

標籤化群組化管理電腦檔案 Tablacus Explorer

筆者最近有感而發,檔案好多好雜,為了尋找一個檔案,就要從很多地方去搜尋,反而花時間在樹狀目錄之下,Windows檔案總管是沒有標籤化功能,只有最愛功能,如果有關聯的檔案分在兩處,就得至少開兩個頁籤去處理。

對了,Windows檔案總管有頁籤,也是Windows 11才有的。

我們在找檔案時,最常是基於用途。Windows總管可沒有基於用途的分類,弄得像一點建資料夾再建捷徑,只能做到一層。而今天要介紹的軟體,可以做到兩層,於是就更實用了。

Tablacus Explorer官方網站與下載點

是個小巧且陽春的檔案管理器,支援Windows11跟10。如果只是單純下載就拿來用,會被其陽春的介面嚇到,怎麽跟介紹圖上的介面差這麼多,也沒有標籤化功能。

別著急,標籤功能要在附加元件中下載安裝,才會出現呢。

一開始下載的時候就是繁體中文,雖然能看懂,但是跟Windows原生的檔案總管比,此時可能檔案總管還好些。

原生介面

接下來照著步驟走,來把標籤功能實裝起來吧。

先從「工具 > 附加元件」。

「工具 > 附加元件」

「附加元件 > 取得附加元件」

在搜尋欄打上「Label」,然後按下搜尋鈕。

安裝「標籤(Label)」、「Label button」、「Overlay label」

安裝「標籤(Label)」、「Label button」、「Overlay label」

「Label」是核心功能,安裝完Label,可以幫檔案或資料夾編輯標籤。

「Label button」可以選擇一個label,顯示出屬於該label的檔案或資料夾。

「Overlay label」在檢視欄位中的名稱中,顯示出該檔案或資料夾的label。

一個檔案或資料夾可以有多個label,要區分多個label,使用「;」區隔。

標籤化步驟

以我的工具程式資料夾為例,雖然都是工具程式,但是用途有些不同。

我是網路工程師,使用網路相關的工具程式的機率會高些,於是想先把網路相關的工具程式標上標籤。

點擊「Label button」>「編輯」。

輸入「網路」按下確定。

這時候因為「Overlay label」,剛剛輸入的標籤名稱會出現在名稱欄位置右。

這時候,幫另外一個程式上標籤,就選3CDaemon,標籤為「網路;ftp;tftp;syslog」,一次輸入四組標籤「網路」、「ftp」、「tftp」與「syslog」。(為了做範例而分類)

點選「Label button」>「網路」,接著就會呈現具有「網路」label的檔案或資料夾。

點選「Label button」>「ftp」,接著就會呈現具有「ftp」label的檔案或資料夾。

如今已經完成了「標籤化」的功能,如果標籤很多,想將標籤做群組,可以安裝「label groups」。

Label好用,但是Label沒有辦法排序,這時候可以安裝「Color Labels(以背景色標示)」與「Color Label Sort」,就能利用將同一標籤套用相同背景色,然後做排序。

群組化步驟

Window 11的檔案總管已經有頁籤功能,在檔案名稱或是在捷徑上做巧思,是能實現標籤化的相似功能,但是很費工。

接下來群組化,就是檔案總管沒有的功能,也是讓 Tablacus Explorer 相比 檔案總管 更好用的關鍵!

在「附加元件」>「取得附加元件」,搜尋「groups」。

安裝完工作區之後,可以看到頁籤上方多了一層頁籤「Group1」,而該層即為工作區。

對工作區按右鍵可以重新命名。

拍照是個人興趣之一,每次拍完照都會處理照片,照片會有原始檔(raw, .cr3)與點陣圖(.hif)或是影片(.mp4)。

如果是好的照片,就會拿RAW檔去開Lightroom去精修。然後因為.hif是無法直接預覽的且多數不支援,需要轉換成.jpg格式,這時候就會開啟Digital Photo Professional 4去將.hif轉jpg。

於是我把這些流程會用到的檔案或資料夾都上標籤「修圖」。

個人電腦經常會用來修圖,於是把工作區跟頁籤都釘選住(滑鼠右鍵>鎖定)。

釘選住的工作區與頁籤不會被關掉跟移動路徑位置,如果點開其中的資料夾,就會長出新的頁籤。

假設我今天要修圖,在 Tablacus Explorer 選擇修圖,就能在一個頁籤把所有會用到的檔案跟資料夾集中,這樣操作起來,就能省去在不同檔案總管切換來去的時間。

雖然檔案總管有頁籤,頁籤沒辦法鎖定位置,或是跳出一個新的檔案總管,實在不好用。

快捷鍵

  • 滑鼠左鍵連擊兩下,位置移至桌面。
  • 滑鼠右鍵按住,可以進行手勢操作。在附加元件「滑鼠」選項內,可設定手勢快捷功能。預設: 「2U」回到上一層、「2D」新增頁籤、「2DR」關閉頁籤。
設定滑鼠手勢

2023/04/28 Switch教育訓練撰寫指南

教育訓練對象通常是給入門者,對象在日後執行日常維護或簡易修改等事項。

因此以「基礎網路概念」去設定篇章,範圍以「日常維護」為限,這部份會給與較為詳盡的講說與指令。

後面則呈現設備特有功能,如Aruba Switch VSF(Virtual Switching Framework),如果有使用到再放上較詳細的解說。如果沒有,則以功能介紹帶過。

最後放上參考來源,主要為官方文件中的設定指南與安裝指南,整片教育訓練文件基於此產生也比較嚴謹。

建議的章節安排

設備外觀燈號介紹

這部份從Install Guide之類的可以找到,如燈號表示的意義、Console Port所在位置等。

管理介面連線方式

以下表格為ArubaOS,實體無線控制器為範例。

連線方式 支援 備註
Console V Speed: 9600
Telnet V 預設關閉
SSH V
WebUI V
AOS

設備OS

該設備使用的OS名稱與撰寫時參考的OS版本。

篇幅不夠的話可以塞點用同套OS的設備型號。

網路概念或基本操作

  • 如何得到設備資訊: MAC Address、SerialNumber、OS Version
  • 如何得到常用資訊: show開頭(show 設定、LLDP、Log)
  • VLAN或介面設定: 具有IP Address的,L3 Interface。
  • Port設定: Access 或是 Trunk,以及如何指定相關VLAN。
  • LinkAggregation設定: 如何將多介面綁成邏輯上的單一介面,以及其Port設定,取得(Show)相關狀態。
  • Routing設定: IP default Gateway或是IP default route。啟用、添加routing,取得(Show)相關狀態。
  • NTP與時間設定
  • Logging與Logging Server設定
  • 管理帳號設定: 如何設定帳號,設定權限,並且啟用帳號認證。
  • 韌體升級方式
  • 設定檔備份方式

以下為可選

  • SNMP支援版本與設定
  • SPANNING TREE支援版本與設定: 如支援 MSTP、RVST
  • DHCP-SNOOPING功能介紹與設定
  • LOOP-PROTECT功能介紹與設定
特色功能介紹

如果有用到就寫詳盡,如果沒有就功能介紹簡單帶過。

  • 支援VSF (Virtual Switching Framework)
  • 支援VSX (Virtual Switching Extension)
  • 支援 VXLAN (Virtual Extension LAN)
  • 支援NetEdit (Aruba CX Switch)
  • 支援Aruba CX Mobile APP

設定注意提醒

設定指令邏輯不與通用概念相似。

如Aruba Switch的VLAN TAG與UNTAGGED。

如HPE 19xx系列為WebUI,TRUNK設定須知等。

參考資源

通常為官方文件,撰寫過程有看什麼文件參考,就放上來。

2023/04/26 測線沒問題但只發無收

一般來說,只要測線沒問題,線路八成沒問題。

而測線只測線對正確,端到端沒有異常。因為拿網路交換器測線,沒有FLUKE能測線損的功能。一開始推給線損,如果線路損耗(電阻)如果到達臨界值,可能也會時好時壞,線對測試是沒問題。線損可能隨著老化(氧化)而增加,把頭打掉重壓就能去掉老化部分。

測線測試數次都得到同結果,而線路早就完成,前面也正常運作中,突然就變成完全不能使用,實在無語。

觀察該介面,有Up,但是MAC Address Table卻沒有學到任何東西。根據之前的記錄,該Port就是接設備的,應該也不會隨便亂動吧?畢竟動那個很麻煩跟費工,沒事沒人想動。

觀察一下介面的計數,發現該線只發封包無接收封包。

線正常、設備正常,在這前提之下,讓我深思一下。今天如果是光纖就好辦了,一端收一端發,如果只發無收是不是就從對面的發端過來有斷路或是光纖模組損壞。

突然驚覺!那如果線對收對收發對發,是不是就會只發不收!?

線對沒有異常,所以異常的是「MDI&MDX」自動交換!?

基於這點,我先看目前是MDI還是MDX,是MDX,於是強制指定為MDI。

過一陣子,開始收到封包了,然後設備就上線了,非常神奇,又學到了一課。

MDI&MDX

以往終端為MDI,網路交換器端為MDX,接正線(平行線,兩端線對排序一致),就會使發端對上收端,讓資料能正常收發。

但是如果終端對終端(MDI-MDI)或是網路交換器對網路交換器(MDX-MDX),就如要有個交叉,使發端與收端對上,這種線稱為跳線。

但是網路線長得非常像,為了更通用與方便,於是有了Auto MDIX,具有Auto MDIX功能的介面,可以根據演算法,交換自己的發端與收端,去配合對方的收端與發端。

於是網路線慢慢只剩正線。

Aruba ClearPass 離線激活License過程

今天碰到License啟動失敗,以下為失敗訊息。

Source Admin UI
Level WARN
Category Activation Failed
Action None
Timestamp Apr 26, 2023 10:29:36 CST
Description
Action Status: This Activation Request Token is already in use by another instance
Product Name: Access
License Type: Permanent
User Count: 500

ClearPass的License除了匯入,還要再按「啟動」,否則會當九十天試用版,仍會過期,即便是Permanet Key。

啟動有兩種途徑: 一、連線啟動。 二、離線啟動。

連線啟動需要ClearPass能連上外網,向相對應網站連線啟動。

離線啟動則需要下載「激活请求令牌」,開立「CASE」,等待客服工程師處理完成後的回傳檔案,再選擇檔案「回傳檔案」上傳,就能完成離線啟動。

開立CASE

開立CASE可以從Aruba Support Portal的CASE management進行,標題寫CPPM KEY離線激活,產品選ClearPass。先簡單描述開立好CASE,接著再把激活請求令牌上傳到CASE附件。

啟動失敗的錯誤訊息,上網查也是只找到透過開立CASE解決。如果有碰到啟動失敗,在開立CASE時,一並把License Key附上,就能客服人員就能在後臺進行相對應處理。

Excel固定公式中表格欄位參照位置

固定儲存格(Cell)位置,我們會使用「$」符號,但$符號只適用於英文與數字組成的位置。

對於「表格1[[#資料],[名稱]]」這種表格(Table)位置標示,就沒有辦法標記出$字號。然而這卻是參照時,選擇表格內資料時優先使用的位置標示。

如果欄列大小固定,使用「A$1:A$100」這種方式是能暫時解決。但是往後增加列的話,公式並不會隨著表格列數自動改變,久久可能就忘記自己當初是這樣套了。

就像今天我需要用到,記得過去曾經解決過,卻想不起是怎麽辦到的。

表格1[[#資料],[名稱]]可以得到一個範圍(Range),範圍大小隨表格列數大小改變,因此這是比較好的參照位置,相比於「A$1:A$100」。

如果要固定「表格1[[#資料],[名稱]]」參照位置,可以使用下列公式。

INDIRECT("表格1[[#資料],[名稱]]")

INDIRECT函數是將輸入文字變成範圍。公式自動填入時,若文字末端沒有帶數字,則文字不會隨自動填入而改變,這也使得使用以上公式,向左右向上下填入公式也不會改變參照。

2023/04/24 網路設備更換切換思考

最近有個下訂到到貨快兩年的核心交換器到,適逢最近開始著手大量python網管的構築。如今重新審視,感覺到很多網路的概念被重新理解,發現對概念的理解更加到達根基點或者稱為原理,對網路的理解可能要遠超於公司前輩了。

說到設備更換或遷移,最重要的是什麼?就是將新設備上架與線路重接後,對所有設備而言,自己所屬的網路都是通的。

舊(手動)的思維是什麼?就是我們先取得設備設定檔,將設定同義轉換到新設備上,最後在依(舊設備)順序,重新接在新設備上。

有時候會發現,假設所有Port都同屬一個VLAN,所有Port也沒有Description,那其實線順序亂掉也無妨,也能保證能用。

不過為了美觀與整齊,假設能有功夫作出順序,那作出順序來,能讓後面管理更好理解些。真亂序接回在關鍵點上反而對人來說是一場噩夢,尤其是核心交換器部分更需要有秩序接法。

我們希望網路能通,於是盡可能還原設定與接線順序,盡可能還原之前的樣貌,最好百分之百還原,因為原本的樣貌是沒問題的,如果有問題基本上會在漫長的使用中被發現改正,時間便來到遷移之前。

為了能百分之百還原,可以看成兩個層面: 設定層、實體層。

設定層為自身設備上的設定。
實體層為自身與其他設備的連結關係。

如果設定層的設定能同義轉換,線路只要照原順序接回去,就能達到實體層去配合設定層,而還原網路環境。

假設都每一Port都同VLAN,於是實體層(線路)隨意接,就能達到設定層去配合實體層,而還原網路環境。

最花功夫(人力)的是什麼?就是調查實體線路接線順序與連通情況,接著就是拔線照計劃接回去,第三就是做設定上的同義轉換。這三大環節,都需要具備「細心」,一旦哪個環節錯誤,可能就未能還原網路環境,導致網路不通,倘若IT不熟自身 環境,這時候要排查是非常困難的,因為之前沒有記錄此環節資訊,就是痛苦。

但仔細思考,其實不論是「實體層去配合設定層」或是「設定層去配合實體層」,我們都是要做到一點,實體去對應到其該有的設定,也就是相互連結。

「設定層去配合實體層」則是最節省人力的方式,節省人力也意味著是復原時間最少的方式,即便目前AI生成多麼厲害,對任何需要人力的項目都沒有辦法。

有沒有什麼網路架構,是可以讓設定層去配合實體層?答案是role-based,這在Aurba Total Solution是做得到的。但Aruba Total Solution並不是任何環境都做得到的,因為資源不足,就算資源足,網管人員技術跟知識可能也不足以維持。

Role-based其實就是SDN(Software Defined Network),這是個宣傳常見名詞,但軟體要怎樣定義網路?這其實才是關鍵技術。為了要保證任意接都能通的前提下,勢必要想出任意接能通的方案,就需要對網路基礎有概念,更重要的是角色間的連結與關係,才能寫出泛用的方法。

會講SDN的人,多半對網路基礎沒有深刻瞭解。(?)

回到SDN的立場,要達到設定層去配合實體層,需要關鍵一點,必須從實體層得到資訊,不去限制實體層接、不接或亂接,然後再依實體層來的資訊去讓設定層再去配合實體層。

什麼是設備能從實體層得到的資訊?最通用的就是MAC Address。

在Role-based的網路架構中,可以針對MAC或是802.1x的帳密資訊去得到對應的VLAN跟相關權限。所以SDN的實作,依據MAC去判斷給與對應的相關設定,是個真實存在的做法。

依照SDN的做法,先將MAC Address綁定來源Port的設定,變成對應的,查MAC得到設定就像查字典查詞得到解釋。一旦MAC Address從來源Port來被學到,就把該Port設定給成MAC Address所對應的設定。

這樣人力就能大解放,不用調查本來的實體線路順序與連通情況,也不用按線路記錄順序接回,線路任意接,隨後靠SDN帶對應的設定,使實體與設定的關係跟更換前一致,就如同還原更替前的網路環境。

SDN也可以讓Switch與Switch間自動綁成Link-Aggregation,接兩條就綁兩條,接三條就綁三條。核心算法就是之前的提到MAC Table的空集合去判斷兩Switches各一Interface是否相鄰。

要完成SDN,就需要先有個程式,再蒐集資訊,在更替期間不間斷地跑,使Switch接收到的資訊能影響網路設定。如果設備都是上線那還好,但多半都是在離峰時間像是午休、下班或週末去切換,設備不在線,蒐集不到資訊,使得SDN未能切換完整。

線路有接但未通,人為設定;線路有接有通,SDN設定。

簡單來說「人只要記錄有接線的Port」,其餘交給SDN,就能得到完整轉換的建議。有接沒通,需要讓線路接到對應Port,設定可以由SDN或人為操作。若線路有接有通,就能交給SDN設定。

如何取得OUI資訊

維基百科

組織唯一標識符(Organizationally unique identifier,OUI)

組織唯一標識符(Organizationally unique identifier,OUI)是一個24位的數字,用於唯一標識一個供應商製造商或其他組織。組織唯一標識符由供應商、製造商或其他組織從電氣電子工程師學會(IEEE)的註冊機構那裡購買。組織唯一標識符一般應用於MAC地址等領域[1][2],用於唯一識別特定設備[3]
MAC地址中,組織唯一標識符與另一個由供應商分配的24位數字共同組成MAC地址MAC地址的前三個八位元組為組織唯一標識符。

根據維基百科,MAC Address中的前三個八位元組為OUI,如果是一般的16進位制表示的MAC Address,也就是前六個四位元組。

如果有一組MAC,我們可以上網站MACVendors輸入MAC Address,得到該MAC Address的生產商資訊。

知道生產商資訊,就能設備外觀的生產商LOGO去搜尋目標設備。

在Python中,使用manuf模組,可以辨識出生產商,其資料庫是來自Wireshark OUI Lookup Tool, 可惜不夠完整。

搜尋其他的搜尋套件,回到最初的維基百科上,會發現這個組織唯一標示符(OUI)是IEEE購買,因此,我們可以直接從IEEE得到相關訊息。

IEEE的註冊OUI,可以直接下載txt或csv格式的檔案。

使用從IEEE經過OUI對照到的設備的生產商資訊比起Wireshark的更多。

xampp搭配mod_wsgi安裝

先安裝XAMPP

下載頁面

而後安裝mod_wsgi,照著官方文件的Quick Install Guide安裝。

apache位置在XAMPP資料夾中。

使用以下指令安裝

set "MOD_WSGI_APACHE_ROOTDIR=C:/xampp/apache"
pip install --no-cache-dir mod_wsgi

測試是否有安裝成功,至python環境,筆者是使用Anaconda3,至環境資料夾/Scripts可以找到mod_wsgi-express.exe。在檔案總管上方輸入cmd後,輸入下方指令。

mod_wsgi-express.exe module-config

如果有報錯,可以從錯誤提示看出來在檔案路徑上使用「\」與「/」,這邊需要一律使用「/」,這時需要重新安裝mod_wsgi。

pip uninstall mod_wsgi
set "MOD_WSGI_APACHE_ROOTDIR=C:/xampp/apache"
pip install --no-cache-dir mod_wsgi