Fix MacPro 2013 incompatibility of Chromium Browser

On a 2013 Mac Pro (6,1) running macOS Sequoia via OpenCore Legacy Patcher (OCLP), Google Chrome often displays a red, unusable screen or graphic artifacts. This is due to incompatibility between Chromium’s renderer and the 2013 AMD graphics drivers. Fix this by disabling “Hardware Acceleration” in Chrome settings or forcing OpenGL rendering via terminal.

This video shows how to fix the Chrome issues on your Mac Pro

Primary Fix: Disable Hardware Acceleration 

  1. If you can open Chrome, immediately do this:
  2. Go to Chrome Settings.
  3. Navigate to System (under Advanced).
  4. Toggle off “Use graphics acceleration when available”.
  5. Relaunch Chrome. 

Alternative: Force OpenGL via Terminal 

  1. If Chrome is too broken to open settings, use Terminal to force a specific renderer: 
  2. Quit Chrome.
  3. Open Terminal (Applications > Utilities).
  4. Enter this command:
    open /Applications/Google\ Chrome.app --args --use-angle=gl.
  5. Once open, immediately turn off hardware acceleration in settings to make this permanent.
  6. Other Known Issues on 2013 Mac Pro + Sequoia 
  7. Visual Glitches: Transparency issues in Maps, Weather, and Photos apps (black boxes around text).
  8. Electron Apps: Other chromium-based apps (like Discord or Spotify) might show red screen artifacts.
  9. DRM: Some streaming sites might not play high-definition content in Safari.

Windows 11 25H2 Installation bypass Microsoft Account

press shift + F10 at the point it ask you to login,

type “start ms-cxh:localonly”, no quotes

Install Windows 10/11 without Microsoft Account

1. Follow the Windows 10/ 11 install process until you get to the “choose a country” screen.
Now’s the time to cut off the Internet. However, before you do, you need to issue a command that prevents Windows 11 from forcing you to have an Internet connection.

2. Hit Shift + F10. A command prompt appears.
3. Type OOBE\BYPASSNRO to disable the Internet connection requirement.
The computer will reboot and return you to this screen.

4. Hit Shift + F10 again and this time Type ipconfig /release. Then hit Enter to disable the Internet.
5. Close the command prompt.

6. Continue with the installation, choosing the region. keyboard and second keyboard option.
A screen saying “Let’s connect you to a network” appears, warning you that you need Internet.

7. Click “I don’t have Internet” to continue.
A new login screen appears asking “Who’s going to use this device?”

8. Enter a username you want to use for your local account and click Next.
9. Enter a password you would like to use and click Next. You can also leave this field blank and have no password, but that’s not recommended.

10. Complete the rest of the install process as you normally would.

可搭16臺E3.S SSD與4張GPU卡,Dell推2U2路Xeon 6伺服器

今年六月,英特爾發表了Xeon 6伺服器處理器平臺,首先推出配備E-core的型號(代號Sierra Forest),各大廠商紛紛推出相應的伺服器產品。而今次我們介紹的 Dell 則率先推出全新採用 2U2 路 Xeon 6 處理器的伺服器。

伺服器製造商戴爾而言,他們在五月舉行的全球用戶大會上已提前預告將推出兩款搭載Xeon 6處理器的伺服器,分別為PowerEdge R670 CSP Edition和PowerEdge R770 CSP Edition,並強調新機型效能可提升至前代產品的2.3倍。此外,這些伺服器還將採用基於OpenBMC架構的Dell伺服器管理平臺Open Server Manager,適用於大型、異質資料中心環境,提供簡化管理和開放生態系的特點。

Dell PowerEdge R770 CSP採用2U、雙路配置。在處理器和記憶體規格上與R670 CSP相同,皆配備兩個Xeon 6處理器,每個處理器最多擁有144核心,並可配置32條32GB或64GB的DDR5-6400 RDIMM記憶體,總容量可達2 TB。R770 CSP的2U機箱較大,可擴充四張PCIe 5.0 x16介面卡、兩張OCP 3.0形狀的網路卡(機箱前後均可抽換),以及16臺E3.S形狀的NVMe固態硬碟。

而 Dell PowerEdge R670 CSP機箱尺寸則為 1U 設計,空間相對緊湊,雖然可以實現超高運算密度(1U提供288核心的處理能力),但擴充性有限,只能添加兩張PCIe 5.0 x16介面卡、兩張OCP 3.0形狀的網路卡,以及八臺E3.S形狀的NVMe固態硬碟。

關於 Dell 先前預告的2.3倍效能提升,他們在七月下旬公布了運算效能測試結果。參加測試的R770 CSP配備了兩顆144核心、熱設計功耗為330瓦的Xeon 6780E,以及DDR5-6400記憶體,代表了Xeon 6 E-Core世代的處理器平臺。其對手是 Dell 為雲端服務市場推出的HS5620伺服器,由於該款伺服器最高可搭載32核心的第四代Scalable(代號Sapphire Rapids)或第五代Xeon Scalable(代號Emerald Rapids),因此 Dell 選用了兩臺HS5620進行對比:一臺搭載32核心、64執行緒、熱設計功耗225瓦的Xeon Gold 6448Y和DDR5-4800記憶體(代表第四代),另一臺搭載32核心、64執行緒、熱設計功耗250瓦的Xeon Gold 6548N和DDR5-5600記憶體(代表第五代)。

Dell揭露R770 CSP與同樣搭配Xeon 6 E-Core處理器的Supermicro SYS-222H-TN,這次比較的效能測試項目是SPEC Power,第三季SPECpower_ssj 2008測試結果也在這個月出爐,R770 CSP拿下20,516分,略勝SYS-222H-TN,

在SPEC CPU 2017測試中,配備Xeon 6 E-Core處理器的R770 CSP效能達到前代平臺的2.3倍與2.2倍。

此外,Dell 也公開了R770 CSP與搭載同款Xeon 6 E-Core處理器的Supermicro SYS-222H-TN效能比較。在第三季的SPECpower_ssj 2008測試中,R770 CSP獲得20,516分,略勝SYS-222H-TN。且在100%運作及閒置狀態下,R770 CSP的平均耗電量降低了一成。根據SPEC Power信息推測,此差異可能源於硬碟配置不同:R770 CSP配備一顆480 GB M.2形狀NVMe固態硬碟——專為戴爾伺服器提供的BOSS-N1,而SYS-222H-TN則裝配一顆6.4TB美光7450 NVMe固態硬碟,其外形為2.5吋U.3。

Dell PowerEdge R770 CSP
●原廠:Dell
●建議售價:廠商未提供
●機箱尺寸:2U(482 x 86.8 x 814.52公釐)
●處理器:2顆,Intel Xeon 6系列(單顆最多144核心)
●記憶體:32個DDR5插槽,RDIMM可支援32支6400 MT/s(最大總共2 TB)
●儲存配置:8臺或16臺E3.S外形NVMe固態硬碟(最大總共122.4 TB、244.8 TB)、2臺M.2外形NVMe固態硬碟(BOSS-N1 DC-MHS)
●I/O介面:PCIe 5.0 x16(4個)
●電源供應器:2臺800瓦/1100瓦/1500瓦(1+1備援)

【AI直連儲存加速時代來臨】GPUDirect Storage產品生態總覽

憑藉AI應用持續興盛,以及輝達在GPU與加速運算的龐大影響力,用於改善GPU應用環境I/O傳輸效率的GPUDirect Storage(GDS),短短幾年內,就成為GPU領域標準的傳輸架構之一,也是有意在AI應用扮演重要角色的儲存廠商,必須支援的I/O技術架構。

從儲存裝置的存取層級來說,GDS支援2種類型的儲存裝置:

(1)GPU伺服器本機掛載的區塊型(Block)儲存裝置,又分為兩種類型,一為透過NVMe介面直連的NVMe SSD,另一為外部儲存設備經由NVMe-oF架構連接的儲存區(Volume),這類裝置將格式化為EXT4或XFS檔案系統,再提供給GDS建立連結。

(2)GPU伺服器遠端掛載的外部檔案系統,也就是支援RDMA傳輸架構,且相容於GDS技術的第3方檔案層級儲存設備。

所以從儲存裝置的型態來說,GDS一共支援3種儲存裝置:(1)GPU伺服器內接的NVMe SSD,(2)經由NVMe-oF掛載的外部區塊型儲存裝置,(3)經由RDMA網路連結的外部檔案型儲存裝置。

在這3類儲存裝置中,GPU伺服器內接NVMe SSD的規格限制條件最少,幾乎適用所有相容於GPU伺服器的NVMe SSD產品(包括ScaleFlux的運算型儲存裝置產品),存取延遲最低,但在容量與傳輸頻寬擴展能力方面,會受到相當大的限制,取決於GPU伺服器能支援的NVMe SSD數量,一般而言,最多搭配十多臺NVMe SSD。

考慮到AI相關應用的規模擴展需求,更實用的GDS儲存應用架構,將是搭配外部儲存設備的型式,也就是藉由NVMe-oF掛載的外部區塊型儲存設備,以及經由RDMA網路連結的外部檔案型儲存設備。

這是後端NVMe-oF搭配前端InfiniBand/RDMA的GDS應用架構。由NetApp的EF600儲存陣列,以NVMe over InfiniBand協定經由200Gb IfiniBand網路介面,將儲存區直接掛載到運行BeeGFS檔案系統的SR655伺服器上,後者再經由InfiniBand交換器,將檔案系統空間以InfiniBand/RDMA方式連到GPU伺服器,構成GDS連接。圖片來源/NetApp

目前支援GDS的外部儲存設備,以檔案型儲存設備占大多數,總共有十多家廠商的產品,幾乎涵蓋當前市場上多數常見的檔案儲存平臺,包括:在高效能運算領域常見的知名老牌檔案儲存平臺,例如DDN的EXAScaler,HPE Cray ClusterStor,IBM Spectrum Scale(現在已改稱Storage Scale),ThinkParQ的BeeGFS,還有兩大分散式高效能檔案平臺新秀——VAST Data的Universal Storage,Weka的WekaFS,以及知名的通用檔案儲存平臺,如Dell的PowerScale、NetApp的ONTAP,Pure Storage的FlashBlade,以及華為的GFS(Global File System)等。

前述這些平臺,又可依照支援GDS的傳輸架構型式,分為直接透過RDMA網路連接(InfiniBand或RoCE乙太網路),以及透過NFS over RDMA協定(NFSoRDMA)等2大類。前者有EXAScaler、Spectrum Scale、BeeGFS、WekaFS等平行檔案系統,後者則有PowerScale、ONTAP等通用型平臺。

至於區塊型儲存設備,原則上任何支援NVMe-oF架構的產品都適用GDS,但實際確實標示支援GDS的產品,我們目前已知的,有Excelero的NVMesh,以及WD的OpenFlex Data24這2款外接NVMe儲存櫃,其中Excelero已於2022年併入Nvidia。

接下來,我們檢視其中較具代表性的平臺。

Dell算是最早支援GDS的廠商之一,9.2版以後的PowerScale OneFS檔案系統,能透過基於NFS v3的NFS over RDMA協定,搭配Mellanox的CX系列RDMA乙太網路卡支援GDS傳輸架構。稍後推出的OneFS 9.5版,又進一步改善了GDS傳輸效率,Dell實測顯示提升幅度可達36%。

Dell宣稱最小規模的3節點組態PowerScale F600儲存叢集,透過GDS可提供24 GB/s的傳輸率,若擴展到最大252節點規模時,將能擁有高達2 TB/s的龐大傳輸能力。

長年致力於高效能運算儲存服務的DDN,當然也沒有在GDS支援上缺席,是首批支援廠商之一。DDN基於Lustre平行檔案系統發展的EXAScaler檔案系統,包括基於Lustre 2.12的EXAScaler 5.2以後版本,以及基於Lustre 2.4的EXAScaler 6以後版本,都能透過InfiniBand支援GDS,適用的DDN硬體產品,包括DDN AI200X、AI400X與AI7990X。

DDN以4節點AI400X的實測為例宣稱,啟用GDS可獲得多達57%的傳輸率提升,提供高達162 GB/s讀取與143 GB/s的寫入速率。

IBM以兩臺ESS 3200儲存陣列(運行Spectrum Scale 5.1.2版)搭配兩臺Nvidia DGX A100,進行實測的結果顯示,藉由GDS可獲得196 GB/s的總傳輸頻寬,相當於兩臺ESS 3200網路介面線速的95%以上。

源自GPFS平行檔案系統、在高效能運算儲存領域耕耘已久的IBM Spectrum Scale平臺,也就是今日的IBM Storage Scale平臺,同樣是第一批支援GDS的儲存平臺,自5.1.2以後的版本,都支援經由InfiniBand或RMDA乙太網路介面,建立GDS傳輸架構(5.1.2版只支援InfiniBand,5.1.3版以後額外支援RoCE乙太網路)。

NetApp目前有兩個平臺支援GDS,一是由NetApp EF600儲存陣列搭配ThinkParQ BeeGFS檔案系統的組合,一是NetApp自身的ONTAP儲存平臺。

在NetApp EF600與BeeGFS的組合中,NetApp其實是配角,EF600僅扮演單純提供儲存空間的角色,將自身的儲存區經由InfiniBand HCA網路卡,以NVMe over InfiniBand協定,掛載到負責執行BeeGFS檔案系統的Lenovo SR655伺服器,再由後者以InfiniBand HCA網路卡經由InfiniBand交換器,以RDMA/InfiniBand協定掛載給GPU伺服器使用,並由SR655伺服器運行的BeeGFS檔案系統,負責建立GDS連接。

而在NetApp所提出的參考架構中,是使用在RHEL 7.8作業系統上運行的7.2或7.3版BeeGFS檔案系統。而在實測中,這個組合架構搭配Nvidia DGX A100後,可獲得74 GB/s的傳輸率(基於8U的組態)。

NetApp的ONTAP儲存平臺,9.10.1版以後也提供透過NFS over RDMA協定,支援GDS傳輸架構的能力,適用於AFF A400、A700與A800等儲存陣列產品,可搭配Nvidia / Mellanox CX-5或CX-6等支援RDMA架構的乙太網路卡,使用經修改的NFS v4.0協定來運作。

後來在9.14.1以後版本的ONTAP平臺上,NetApp將搭配的NFS版本擴展到NFS v3與NFS v4.1,支援的儲存陣列機型也增加AFF C系列與AFF A900。

在GDS實測上,NetApp以4臺AFF A800儲存陣列搭配2臺DGX A100與2臺DGX-1,在使用2組、4組、8組A800控制器的情況下,分別可得到45.6 GB/s、86.5 GB/s與171 GB/s的傳輸率,總傳輸頻寬高於EF600與BeeGFS的組合,不過,若換成每節點或每U空間的平均頻寬,則略遜於後者。

HPE算是一線大廠最積極支援GDS架構的一家,旗下共有3個儲存平臺可支援GDS,包括Ezmeral Data Fabric(5.5版以後)、Cray ClusterStor(4.2版以後)、GreenLake File Storage(3.0版以後)。

它們其實都不是HPE原生開發的產品。例如:Ezmeral Data Fabric來自2019年HPE併購MapR取得的MapR Data Platform,一開始改稱HPE Data Fabric,2021年後名稱才換成現在的Ezmeral Data Fabric,應該是透過修改的NFS協定來支援GDS。

ClusterStor是HPE於2019年併購Cray取得的產品線,核心其實就是Cray修改版的Lustre平行檔案系統,應該是以InfiniBand支援GDS;GreenLake File Storage是由Alletra MP硬體執行的VAST Data分散式檔案系統,透過NFS over RDMA支援GDS。

身為老牌大廠之一的Hitachi Vantara,目前是透過源自Weka的分散式檔案系統產品——Hitachi Content Software for File(HCSF),提供對於GDS的支援。

回顧過去,Hitachi Vantara是在2021年中,以OEM形式引進Weka的WekaFS平行檔案系統,搭配自身的伺服器硬體,組成新的HCSF產品線,因而也跟Weka本家一樣,具備支援GDS的能力。

除了以獨立產品線銷售,Hitachi Vantara在7月正式推出的BasePOD整合套件Hitachi iQ 中,也搭配HCSF作為套件中的儲存單元。

Pure Storage是從2023年10月開始支援GDS,適用於FlashBlade家族中的效能取向款式FlashBlade//S,需搭配4.3.4版以後的Purity//FB作業系統(目前最新版本是4.5.x版),採用的連接架構是基於乙太網路的NFS over RDMA。

至於FlashBlade家族中成本取向的FlashBlade//E系列,目前則不提供GDS的支援。

就時間點來看,Weka的WekaFS是最早支援GDS架構的第3方儲存平臺,2020年便與Nvidia進行驗證測試,自3.13版以後的WekaFS(現在稱作WEKA Data Platform),便能透過InfiniBand來建立GDS連接。

VAST Data也是第一波支援GDS的儲存廠商,其Universal Storage平臺在4.1版以後,支援以NFS over RDMA建立GDS連接。

Universal Storage平臺採用特別的「解構與共享一切」(Disaggregated Shared Everything,DASE)架構,由負責儲存服務的運算節點,與提供儲存空間的儲存節點組成叢集,搭配Nvidia GPU環境時,VAST Data所建議的參考架構,是採用新的高效能LightSpeed儲存機箱,透過100GbE乙太網路將空間掛載到VAST Data的檔案服務節點,再由VAST Data的檔案伺服器節點,以InfiniBand將儲存空間掛載給GPU伺服器。

除了前述名列Nvidia認證的GDS支援廠商與平臺,還有幾家廠商雖然尚未列入Nvidia的認證名單,但也已發表支援GDS的解決方案,包括Hammerspace、PEAK:AIO、華為。

以平行NFS儲存系統打出名號的Hammerspace,是在今年初加入支援GDS行列。Hammerspace的口號是讓用戶現有的儲存設備,透過他們Hyperscale NAS介接,從而支援GDS架構。基本概念是將用戶原有的NVMe-oF儲存陣列、或是沒有RDMA連網能力的NAS,掛載到Hammerspace的Data Services(DSX)節點上,然後由後者藉由NFS over RDMA與GPU伺服器建立GDS連接。

英國新創公司PEAK:AIO的AI Data Server軟體平臺,同時具備NFS檔案存取與NVMe/TCP區塊存取支援能力,也能透過NFS與NVMe/TCP這兩種方式支援GDS架構,在2023年底與HPE合作的測試中,驗證了這項能力。

至於華為,是在2023年8月發布OceanStor A310儲存陣列的GDS測試結果,當中顯示他們的GFS(Global File System)平行檔案系統具備支援GDS的能力,但華為並未說明GFS是以何種底層傳輸架構支援GDS。

迄今已有超過15種第3方檔案儲存平臺支援GDS,我們在10月檢視各廠商發布的GDS實測報告,以及儲存新聞網站「Block & Files」收集的GDS測試結果,發現各種平臺達到的GDS傳輸效率,有著很大的差距,而且其中還存在一些共同的傾向。

依照當前各種不同平臺支援GDS時,所採用的傳輸架構,我們可以大致分為3個群組——基於NVMe-oF,基於InfiniBand RDMA,以及基於NFS over RDMA架構。

參照Block & Files將各廠商測試結果標準化以後的平均單位節點輸出效能,我們發現IBM、DDN、Weka這些廠商,利用InfiniBand建立GDS傳輸架構的平行檔案系統,還有WD基於NVMe-oF連接架構的平臺,效能要比Dell、NetApp這些採用NFS over RDMA的平臺,高出一個層次。不過也有例外,例如Pure Storage與PEAK:AIO,都透過NFS over RDMA獲得不錯的讀取效能,但寫入效能仍不能與前述平臺相比。

這顯示NVMe-oF與InfiniBand RDMA具備一定的效能優勢,但從另一方面來看,NFS over RDMA雖然效能上受到較大限制,也有著運用簡便,與低成本的優點。

由於傳輸架構只是影響傳輸效能的眾多因素之一,加上各廠商的測試環境設定差異,前述比較並不精確,不過仍能作為我們衡量在GDS應用中使用不同傳輸架構時,一個粗略的參考依據。

Source : https://www.ithome.com.tw/tech/165670

Windows免費的Mail、Calendar將在12月31日終止支援

微軟宣布,Windows原生應用程式郵件(Mail)、行事曆(Calendar)和聯絡人(People)將於今年12月31日終止支援,並建議用戶改用需要付費的Outlook。

Mail、Calendar和People皆為Windows內建應用程式,僅具備基本功能,如Mail僅提供收發信件、草擬,以及整合多個帳號。這些原生程式介面簡單,適合一般用戶,其最大優勢是免費。Outlook for Windows則功能強大,擁有如篩選、設定規則、自動回覆、加簽名、共享日曆和會議邀請等功能。缺點在於Outlook屬於Office或Microsoft 365的一部分,需要付費購買。此外,功能繁多使界面顯得雜亂且效能低下,令部分用戶不滿。

儘管有大量用戶的要求,微軟還是決定終止這些歷史悠久的免費程式的支援。三個應用程式的支持將在2024年12月31日結束。微軟已經開始推動現有用戶轉向Outlook for Windows。自今年12月31日後,Windows Mail將無法再收發電子郵件。

微軟鼓勵用戶透過Mail和Calendar或舊版Outlook for Windows App右上角的「試用新Outlook」滑鈕來使用新Outlook for Windows預覽版App。除了整合行事曆、協作及設置功能,新Outlook的最大特色是加入AI功能,可協助撰寫郵件、進行拼寫或語法檢查,並提供釣魚信及詐騙防護。

微軟的網站提供了將儲存在這些應用程式中的本機郵件、日曆事件和聯絡人資料匯入Outlook的指引。微軟表示,轉移後,用戶仍可在Outlook App的「設定」>「一般」>「關於Outlook」中恢復到免費程式。

然而,一旦開始使用Outlook for Windows,用戶必須留意產品價格調整的問題。微軟近日宣布,包括台灣等六個國家的Microsoft 365,由於增加了Copilot和Designer功能,價格即日起已經調漲。

Source : https://www.ithome.com.tw/news/165938

Python 使用 Selenium 函式庫進行網絡爬蟲

selenium 函式庫 ( 模組 ) 是使用 Python 進行網路爬蟲時,必備的函式庫之一,透過 selenium 可以模擬出使用者在瀏覽器的所有操作行為 ( 點擊按鈕、輸入帳號密碼、捲動捲軸…等 ),因此除了爬蟲的應用,也常作為「自動化測試」使用的工具,在網站開發完成後,透過自動化的腳本測試所有功能是否正常,這篇教學將會介紹 selenium 函式庫的常見用法,更多用法可前往閱讀 selenium 官方文件。

執行 selenium 會啟動 chromedriver,所以所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda ) 。

快速導覽:

安裝 selenium 模組 

在本機環境輸入下列指令,就能安裝 selenium 函式庫 ( 依據每個人的作業環境不同,可使用 pip 或 pip3 或 pipenv,Anaconda Jupyter 的安裝指令為 !pip )。

pip install selenium

什麼是 Selenium WebDriver 

WebDriver 是用來執行並操作瀏覽器的 API 介面,每一個瀏覽器都會有各自對應的驅動程式 ( driver ),Selenium 會透過 WebDriver 來直接對瀏覽器進行操作,將所支援的瀏覽器進行自動化作業,就如同真的使用者在操作

下載 WebDriver 

不同的瀏覽器會對應不同的 driver,以下提供幾種常見的 driver ( 本篇範例使用的是 Chrome ):

下載 Chrome driver 時請,必須下載對應的 Chrome 的版本,點擊右上角選單「說明 > 關於 Google Chrome」,可以查看版本。

Python 教學 - Selenium 函式庫

下載後將 driver 與執行的 Python 檔案放在同一個目錄下,就比較不需要煩惱執行時路徑的問題。

Python 教學 - Selenium 函式庫

import selenium 

要使用 requests 必須先 import selenium 模組,啟用 webdriver 的功能。

from selenium import webdriver

使用 WebDriver 開啟第一個網頁 

selenium 與 driver 都安裝與準備好之後,下方的程式碼執行後,會打開一個新的 Chrome 視窗,裡面出現指定的 Google 網頁,此時這個新的 Chrome 視窗會標明「受到自動測試軟體控制」,表示程式正在控制相關的操作。

webdriver.Chrome(路徑) 使用相對路徑 chromedriver 和執行的程式位在同一層。

from selenium import webdriver
driver = webdriver.Chrome('./chromedriver')    # 指向 chromedriver 的位置
driver.get('https://www.google.com')           # 打開瀏覽器,開啟網頁
Python 教學 - Selenium 函式庫

取得網頁元素 

要模擬真人操作網頁的第一步,就是要知道觸碰了哪些網頁元素,首先載入 selenium 的 By 模組,接著就能使用 find_element() 搭配參數設定,取得指定的網頁元素,下方列出 find_element() 常用參數設定 ( 如果將方法的 element 改為 elements,會以串列方式回傳找到的元素 ):

新版本 selenium 取得元素的方法有所變更,本文也一併更新,詳細的方法參考:selenium.webdriver.remote.webelement

參數說明
By.ID, id透過 id,尋找第一個相符的網頁元素。
By.CLASS_NAME, class透過 class,尋找第一個相符的網頁元素。
By.CSS_SELECTOR, css selector透過 css 選擇器,尋找第一個相符的網頁元素。
By.NAME, name透過 name 屬性,尋找第一個相符的網頁元素。
By.TAG_NAME, tag透過 HTML tag,尋找第一個相符的網頁元素。
By.LINK_TEXT, text透過超連結的文字,尋找第一個相符的網頁元素
By.PARTIAL_LINK_TEXT, text透過超連結的部分文字,尋找第一個相符的網頁元素。
By.XPATH, xpath透過 xpath 的方式,尋找第一個相符的網頁元素。

下方的程式會用 selenium 開啟範例網址 ( 網址連結 ),開啟後會用上述的方法,選取特定的網頁元素,接著套用點擊的方法,依序點擊各個按鈕,最後會連續打開兩次 Google 網站。

範例網址已經有做過點擊的處理,點擊按鈕或下拉選單切換時,上方空格會顯示對應的文字。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select   # 使用 Select 對應下拉選單
import time

driver = webdriver.Chrome('./chromedriver')
driver.get('https://example.oxxostudio.tw/python/selenium/demo.html')  # 開啟範例網址
a = driver.find_element(By.ID, 'a')                # 取得 id 為 a 的網頁元素 ( 按鈕 A )
b = driver.find_element(By.CLASS_NAME, 'btn')      # 取得 class 為 btn 的網頁元素 ( 按鈕 B )
c = driver.find_element(By.CSS_SELECTOR, '.test')  # 取得 class 為 test 的網頁元素 ( 按鈕 C )
d = driver.find_element(By.NAME, 'dog')            # 取得屬性 name 為 dog 的網頁元素 ( 按鈕 D )
h1 = driver.find_element(By.TAG_NAME, 'h1')        # 取得 tag h1 的網頁元素
link1 = driver.find_element(By.LINK_TEXT, '我是超連結,點擊會開啟 Google 網站')  # 取得指定超連結文字的網頁元素
link2 = driver.find_element(By.PARTIAL_LINK_TEXT, 'Google') # 取得超連結文字包含 Google 的網頁元素
select = Select(driver.find_element(By.XPATH, '/html/body/select'))   # 取得 html > body > select 這個網頁元素

a.click()        # 點擊 a
print(a.text)    # 印出 a 元素的內容
time.sleep(0.5)
b.click()        # 點擊 b
print(b.text)    # 印出 b 元素的內容
time.sleep(0.5)
c.click()        # 點擊 c
print(c.text)    # 印出 c 元素的內容
time.sleep(0.5)
d.click()        # 點擊 d
print(d.text)    # 印出 d 元素的內容
time.sleep(0.5)
select.select_by_index(2)  # 下拉選單選擇第三項 ( 第一項為 0 )
time.sleep(0.5)
h1.click()       # 點擊 h1
time.sleep(0.5)
link1.click()    # 點擊 link1
time.sleep(0.5)
link2.click()    # 點擊 link2
print(link2.get_attribute('href'))   # 印出 link2 元素的 href 屬性
Python 教學 - Selenium 函式庫
Python 教學 - Selenium 函式庫

操作網頁元素 

使用 Selenium 函式庫操作網頁元素下列幾種方法:

方法ActionChains 參數說明
click()element按下滑鼠左鍵。
click_and_hold()element滑鼠左鍵按著不放。
double_click()element連續按兩下滑鼠左鍵。
context_click()element按下滑鼠右鍵 ( 需搭配指定元素定位 )。
drag_and_drop()source, target點擊 source 元素後,移動到 target 元素放開。
drag_and_drop_by_offset()source, x, y點擊 source 元素後,移動到指定的座標位置放開。
move_by_offset()x, y移動滑鼠座標到指定位置。
move_to_element()element移動滑鼠到某個元素上。
move_to_element_with_offset()element, x, y移動滑鼠到某個元素的相對座標位置。
release()element放開滑鼠。
send_keys()values送出某個鍵盤按鍵值。
send_keys_to_element()element, values向某個元素發送鍵盤按鍵值。
key_down()value按著鍵盤某個鍵。
key_up()value放開鍵盤某個鍵。
reset_actions()清除儲存的動作 ( 實測沒有作用,查訊後是 Bug )。
pause()seconds暫停動作。
perform()執行儲存的動作。

要使用這些方法的方式有兩種,第一種就是「針對指定元素呼叫方法」,例如上方例子的 click() 方法,只要針對指定的元素,呼叫指定的方法,就會執行對應的動作,第二種是使用「ActionChains」,將所有需要執行的方法串成「鏈」,全部完成後執行 perform() 執行所有的過程

下方的程式使用「針對指定元素呼叫方法」。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Chrome('./chromedriver')
driver.get('https://example.oxxostudio.tw/python/selenium/demo.html')
a = driver.find_element(By.ID, 'a')
add = driver.find_element(By.ID, 'add')
a.click()     # 點擊按鈕 A,出現 a 文字
sleep(1)
add.click()   # 點擊 add 按鈕,出現 數字 1
add.click()   # 點擊 add 按鈕,出現 數字 2
sleep(1)
add.click()   # 點擊 add 按鈕,出現 數字 3
sleep(1)
add.click()   # 點擊 add 按鈕,出現 數字 4

下方的程式使用「ActionChains」的方式,結果與上述的執行結果相同。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome('./chromedriver')
driver.get('https://example.oxxostudio.tw/python/selenium/demo.html')
a = driver.find_element(By.ID, 'a')
add = driver.find_element(By.ID, 'add')
actions = ActionChains(driver)   # 使用 ActionChains 的方式
actions.click(a).pause(1)        # 點擊按鈕 A,出現 a 文字後,暫停一秒
actions.double_click(add).pause(1).click(add).pause(1).click(add)
# 連點 add 按鈕,等待一秒後再次點擊,等待一秒後再次點擊
actions.perform()  # 執行儲存的動作
Python 教學 - Selenium 函式庫

雖然「針對指定元素呼叫方法」看起來滿直覺,但相對來說能使用的方法有限 ( 只能使用 click、send_keys…等兩三種 ),使用「ActionChains」才能完整發揮所有的方法,下方的程式碼執行後,會自動在輸入框內輸入指定的文字。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome('./chromedriver')
driver.get('https://example.oxxostudio.tw/python/selenium/demo.html')
a = driver.find_element(By.ID, 'a')
show = driver.find_element(By.ID, 'show')
actions = ActionChains(driver)
actions.click(show).send_keys(['1','2','3','4','5'])    # 輸入 1~5 的鍵盤值 ( 必須是字串 )
actions.pause(1)    # 等待一秒
actions.click(a)    # 點擊按鈕 A
actions.pause(1)    # 等待一秒
actions.send_keys_to_element(show, ['A','B','C','D','E'])   # # 輸入 A~E 的鍵盤值
actions.perform()   # 送出動作
Python 教學 - Selenium 函式庫

取得網頁元素的內容 

Selenium 不僅能模擬真人去控制網頁元素,也可以取得網頁元素的相關內容,甚至進一步執行網頁截圖並儲存的功能,常用的內容如下:

內容說明
text元素的內容文字。
get_attribute元素的某個 HTML 屬性值。
id元素的 id。
tag_name元素的 tag 名稱。
size元素的長寬尺寸。
screenshot將某個元素截圖並儲存為 png。
is_displayed()元素是否顯示在網頁上。
is_enabled()元素是否可用。
is_selected()元素是否被選取。
parent元素的父元素。

下方的程式碼執行後,會取得元素的 id、內容文字、tag 名稱、尺寸和屬性值,最後會將整張網頁截圖為 test.png。

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome('./chromedriver')
driver.get('https://example.oxxostudio.tw/python/selenium/demo.html')
body = driver.find_element(By.TAG_NAME, 'body')
a = driver.find_element(By.ID, 'a')
b = driver.find_element(By.CLASS_NAME, 'btn')
c = driver.find_element(By.CSS_SELECTOR, '.test')
d = driver.find_element(By.NAME, 'dog')
link1 = driver.find_element(By.LINK_TEXT, '我是超連結,點擊會開啟 Google 網站')
link2 = driver.find_element(By.PARTIAL_LINK_TEXT, 'Google')

print(a.id)
print(b.text)
print(c.tag_name)
print(d.size)
print(link1.get_attribute('href'))
print(link2.get_attribute('target'))
body.screenshot('./test.png')
Python 教學 - Selenium 函式庫

搭配 JavaScript,發揮最大效益 

Selenium 除了內建的方法,也可以搭網頁的 JavaScript,發揮網頁控制的最大效益,下方的程式碼執行後,會先上下滾動網頁捲軸,接著彈出提示視窗,兩秒後再關閉提示視窗。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from time import sleep

driver = webdriver.Chrome('./chromedriver')
driver.get('https://www.selenium.dev/selenium/docs/api/py/webdriver_remote/selenium.webdriver.remote.webelement.html')

sleep(1)
driver.execute_script('window.scrollTo(0, 500)')   # 捲動到 500px 位置
sleep(1)
driver.execute_script('window.scrollTo(0, 2500)')  # 捲動到 2500px 位置
sleep(1)
driver.execute_script('window.scrollTo(0, 0)')     # 捲動到 0px 位置

h1 = driver.find_element(By.TAG_NAME, 'h1')
h3 = driver.find_element(By.TAG_NAME, 'h3')
script = '''
  let h1 = arguments[0];
  let h3 = arguments[1];
  alert(h1, h3)
'''
driver.execute_script(script, h1, h3)   # 執行 JavaScript,印出元素
sleep(2)
Alert(driver).accept()    # 點擊提示視窗的確認按鈕,關閉提示視窗

參考資料 

Selenium 函式庫不僅能應用於自動化測試,對於爬蟲的應用而言也是必備的函式庫,下方列出 Selenium 的官方文件,如果要了解更詳細的資訊可以前往閱讀:

Source : https://steam.oxxostudio.tw/category/python/spider/selenium.html

SuiteCRM adding Subpanel Filtering

How to Configure Filtering on Subpanels? 

To allow filtering on a subpanel, the following statement needs to be added to the subpaneldefs.php file:

['widget_class' => 'SubPanelTopFilterButton'],

The following example shows where this has been added to the Accounts → Contacts Subpanel within the public/legacy/Accounts/metadata/subpaneldefs.php file:

        'contacts' => array(
            'order' => 30,
            'module' => 'Contacts',
            'sort_order' => 'asc',
            'sort_by' => 'last_name, first_name',
            'subpanel_name' => 'ForAccounts',
            'get_subpanel_data' => 'contacts',
            'add_subpanel_data' => 'contact_id',
            'title_key' => 'LBL_CONTACTS_SUBPANEL_TITLE',
            'top_buttons' => array(
                array('widget_class' => 'SubPanelTopCreateAccountNameButton'),
                ['widget_class' => 'SubPanelTopFilterButton'],
                array('widget_class' => 'SubPanelTopSelectButton', 'mode' => 'MultiSelect')
            ),
        ),

Once this has been added, run Repair and Rebuild within the Admin→`Repair` menu.

What does the filter look like? 

Once enabled, a new Filter button will be displayed on the subpanel.

Filter-Full-Panel.png

After selecting the Filter button, a list of filter options for the specific subpanel will be displayed:

Filter-Expanded.png

Once the required filter options have been completed, click the Search button where only the filtered records will be displayed:

Filter-Searched.png

To edit or update your current filter just select Filter and update. To close or remove the filter select Clear Filter.

Please be aware that filters are not “memorized” (saved to user preferences). Therefore, after refreshing the filter will reset.

Adding Search Vardefs to Subpanels 

There are some Subpanels across the CRM that don’t have a standard Listview / Listview Filter setup, and thus won’t have any searchable fields defined (Such as: Activities / Campaign Log / etc).

As a result you might run into issues when trying to filter or see no fields to filter.

If you would like to add a filter, you can do so in the following ways (be sure to Repair and Rebuild after changes):

Adding via subpaneldefs.php 

You can add searchdefs/ filter fields to a subpanel directly. We can see an example of this within the public/legacy/modules/Accounts/metadata/subpaneldefs.php

            'searchdefs' => array(
                'collection' =>
                    array(
                        'name' => 'collection',
                        'label' => 'LBL_COLLECTION_TYPE',
                        'type' => 'enum',
                        'options' => 'collection_temp_list',
                        'default' => true,
                        'width' => '10%',
                    ), ...

Add a searchdefs.php file 

Adding a searchdefs.php within the module directory. For example, we can see one used in the Accounts module public/legacy/modules/Accounts/metadata/searchdefs.php:

$searchdefs ['Accounts'] =
    array(
        'templateMeta' =>
            array(
                'maxColumns' => '3',
                'maxColumnsBasic' => '4',
                'widths' =>
                    array(
                        'label' => '10',
                        'field' => '30',
                    ),
            ),
        'layout' =>
            array(
                'basic_search' =>
                    array(
                        'name' =>
                            array(
                                'name' => 'name',
                                'default' => true,
                                'width' => '10%',
                            ),
                        'current_user_only' =>
                            array(
                                'name' => 'current_user_only',
                                'label' => 'LBL_CURRENT_USER_FILTER',
                                'type' => 'bool',
                                'default' => true,
                                'width' => '10%',
                            ),
                        'favorites_only' => array(
                            'name' => 'favorites_only',
                            'label' => 'LBL_FAVORITES_FILTER',
                            'type' => 'bool',
                        ),
                    ),
                'advanced_search' =>
                    array(
                        'name' => ...

Source : https://docs.suitecrm.com/8.x/features/subpanel-filtering/

WD推出32TB與26TB新款硬碟Ultrastar DC HC690與HC590

繼希捷之後,WD也透過採用11碟片配置,將旗下硬碟的最大容量突破30TB。10月WD新發佈了兩款資料中心級硬碟Ultrastar DC H690與H590,分別基於SMR疊瓦式磁記錄技術及CMR傳統磁記錄技術,搭配11碟片配置,令最大容量提升至32TB和26TB,再創WD的新紀錄。 業界首款30TB級容量的硬碟,是希捷於2024年1月推出的Exos Mozaic 3+。

該產品採用10碟片配置,當使用SMR疊瓦式磁記錄技術時可達32TB,而傳統CMR磁記錄技術也能達到30TB,每張碟片的容量密度超過3TB。相比之下,WD在同樣的10碟片配置下,最大容量產品為基於SMR技術的Ultrastar DC HC680及基於CMR技術的Ultrastar DC HC580,最大容量分別為28TB和24TB,不論是碟片容量密度還是總容量都略遜一籌。

儘管容量密度較低,但WD仍能透過增加碟片數量來彌補。自2022年起,WD開始探索在現有的氦氣填充10碟片硬碟基礎上,再增添一片碟片的可能性。他們透過縮小碟片間距和調整PCBA印刷電路板設計,成功推出了業界首批11碟片配置硬碟,將硬碟容量提高到30TB等級,追趕上希捷的產品。

目前WD的11碟片配置硬碟包含三個款式:

首推是Ultrastar DC HC690,結合11碟片及SMR技術,可提供30TB及32TB兩種容量版本。

另外則是Ultrastar DC HC590,利用CMR技術結合11碟片,可達到24TB及26TB兩種版本,

此外還有HC590衍生出的WD Gold SATA 26TB。

這三款新硬碟中,除WD Gold SATA僅提供SATA介面,其餘兩款同時提供SATA及SAS介面選擇。 從現時來看,隨著希捷與WD相繼推出30TB級硬碟,硬碟容量正式進入30TB等級時代,是繼2016年突破10TB及2019年突破20TB後的又一里程碑。然而,兩家公司採用的技術路線截然不同,希捷通過提升碟片容量密度,而WD則靠增加碟片數量。長期來看,這兩家公司的發展路線將趨於一致,希捷未來勢必會推出11碟片產品,而WD也會逐步將碟片儲存密度提升至接近希捷的3TB水準。

1U提供320核心,HPE既有伺服器支援AMD第五代EPYC處理器

今年10月10日,AMD發佈了第五代EPYC伺服器處理器平台(9005系列,代號為Turin)。該系列提供8至192核心的選擇,熱設計功耗範圍為125瓦至500瓦。多家廠商也宣布其現有伺服器將可搭配這一系列的CPU,或是推出新款伺服器。

以HPE為例,他們的產品策略屬於前者,目前的ProLiant Gen11世代的2U雙路機型DL385、1U雙路機型DL365和1U單路機型DL325,均於10月10日更新了技術規格,明確表示可以選用AMD EPYC 9004系列(最高搭載128核心、熱設計功耗360瓦的EPYC 9754)或者最新推出的AMD EPYC 9005系列(最高搭載160核心、熱設計功耗390瓦的EPYC 9845)。

若考慮高運算密度與高儲存密度的應用需求,DL365 Gen11利用1U尺寸機箱有限的空間,最多可支持320核心(2個插槽)、6 TB容量的DDR5記憶體(24個插槽)、20台EDSFF E3.S形態NVMe固態硬碟,以及2個PCIe 5.0 x16介面卡插槽(2個全高全長或2個全高半長加上1個短版)與2個x16的OCP 3.0插槽。 值得注意的是,HPE ProLiant DL365 Gen11提供多種記憶體、儲存和GPU配置選擇。

若採用2.5吋硬碟儲存槽,可預設容納8台SATA/SAS傳統硬碟或SATA/SAS/NVMe固態硬碟,可選擇加裝1台光碟燒錄機,或2台其他硬碟選擇,伺服器的所有24個記憶體插槽都能使用;而採用E3.S固態硬碟儲存槽時,記憶體插槽能使用16個;若加裝GPU,則能在機箱前沿安裝2張單寬或雙寬尺寸的GPU加速卡,並搭配4台2.5吋或8台E3.S形態的NVMe固態硬碟,記憶體插槽最多可用20個。

相比其他支持AMD EPYC 9005系列的伺服器廠商,以1U雙路配置為例,通常會提供類似配置,例如支援320核心(2個插槽)、6 TB的DDR5記憶體(24個插槽)等。 例如Supermicro H13世代的AS-1125HS-TNR也最多支援320核心(2個插槽),同時提供6 TB容量4800 MT/s或9 TB容量6000 MT/s的DDR5記憶體(24個插槽)、12台2.5吋SATA/SAS/NVMe硬碟或固態硬碟,以及3個PCIe 5.0 x16介面卡插槽(包括1個全高半長、2個全高全長)與1個x16的AIOM插槽(相容OCP 3.0)。

聯想的ThinkSystem V3系列中,支持AMD第四代及第五代EPYC處理器的1U雙路配置ThinkSystem SR645 V3同樣提供320核心、6 TB容量的DDR5記憶體(24個插槽)、16台EDSFF E1.S形態NVMe固態硬碟,以及3個PCIe x16介面卡插槽——後置三個介面卡中有兩個PCIe 5.0和一個PCIe 4.0(皆為短版),此外,機箱前沿也可安裝3張PCIe 5.0介面卡(各類型各一),不過此配置下需犧牲一些空間,只能搭配4台2.5吋硬碟。

HPE ProLiant DL365 Gen11
●原廠:HPE
●建議售價:廠商未提供
●機箱尺寸:1U
●處理器:2顆,AMD第四代EPYC(9004系列)、第五代EPYC(9005系列),最多搭配到160顆核心的款式
●記憶體:24個DDR5-6000,插滿256 GB,可達到6 TB
●儲存配置:10臺2.5吋傳統硬碟(SAS/SATA)或固態硬碟(SAS/SATA/NVMe,預設8臺),或是20臺E3.S NVMe固態硬碟;或是搭配2張單寬或雙寬GPU,以及8臺E3.S NVMe固態硬碟或4臺2.5吋U.3 NVMe固態硬碟
●I/O擴充介面:2個PCIe 5.0 x16(2個全高全長,或2個全高半長加上1個短版)
●電源供應器:2臺800瓦、1000瓦、1600瓦或1800瓦
●GPU選擇:Nvidia A16、L4

Source : https://www.ithome.com.tw/review/165707