何讓小空間大作為:家庭微型健身房的高效訓(xùn)練秘籍
你是否曾經(jīng)在家中面對(duì)那微不足道的一角,苦惱于無(wú)處可用的健身設(shè)備和狹窄的空間?有沒(méi)有想過(guò),即便是最小的空間,也能夠變成一個(gè)高效的家庭健身房?今天,我們將揭開(kāi)如何在有限的空間內(nèi)進(jìn)行高效訓(xùn)練的秘密,讓你的小家變成運(yùn)動(dòng)的天堂!
1. 打破空間限制的第一步:明智規(guī)劃
成功的微型健身房首先需要一個(gè)明智的空間規(guī)劃。空間雖然小,但經(jīng)過(guò)新布局,可以大大提升利用效率。首先,選擇一個(gè)合適的位置,這個(gè)地方最好是家中較為空曠且方便使用的區(qū)域,如臥室的一角、客廳邊緣或者陽(yáng)臺(tái)。接下來(lái),明確你希望進(jìn)行哪些類(lèi)型的鍛煉,比如力量訓(xùn)練、心肺功能訓(xùn)練或柔韌性練習(xí)。根據(jù)這些需求,合理配置器材。例如,如果你偏好力量訓(xùn)練,可以考慮購(gòu)買(mǎi)一對(duì)可調(diào)節(jié)啞鈴和一張折疊式健身凳。如果主要進(jìn)行有氧運(yùn)動(dòng),跳繩和瑜伽墊則是不錯(cuò)的選擇。
2. 必備設(shè)備:簡(jiǎn)約而不簡(jiǎn)單
雖然空間狹小,但并不意味著你必須放棄高效的訓(xùn)練。選擇多功能的器材是關(guān)鍵。以下幾種器材是家庭微型健身房的理想選擇:
-可調(diào)節(jié)啞鈴:?jiǎn)♀徥橇α坑?xùn)練的基礎(chǔ)設(shè)備,而可調(diào)節(jié)啞鈴可以通過(guò)調(diào)整重量來(lái)滿足不同訓(xùn)練的需求,不僅節(jié)省空間,還能應(yīng)對(duì)多樣化的訓(xùn)練。
-瑜伽墊:瑜伽墊不僅適用于瑜伽訓(xùn)練,也適合進(jìn)行普拉提、核心訓(xùn)練和地面拉伸等多種運(yùn)動(dòng)。
-折疊式健身凳:這種健身凳可以根據(jù)需要調(diào)整角度支持多種力量訓(xùn)練動(dòng)作,而且使用完畢后可以折疊收納,節(jié)省空間。
-彈力帶:彈力帶體積小但功能強(qiáng)大,適用于各種拉伸和力量訓(xùn)練,適合小空間使用。
3. 高效訓(xùn)練計(jì)劃:小空間內(nèi)的全面鍛煉
即使是在有限的空間中,你也可以設(shè)計(jì)出全面而高效的訓(xùn)練計(jì)劃。關(guān)鍵在于選擇高效的練習(xí)方式,并結(jié)合適當(dāng)?shù)挠?xùn)練時(shí)間。以下是幾種適合家庭微型健身房的訓(xùn)練方式:
-高強(qiáng)度間歇訓(xùn)練(HIIT):這種訓(xùn)練方式短時(shí)間的高強(qiáng)度運(yùn)動(dòng)與短暫的休息交替進(jìn)行,可以在短時(shí)間內(nèi)達(dá)到最佳的鍛煉效果。適合空間不大的環(huán)境,不需要大型設(shè)備,只需你的體重和一些基本的小器材。
-全身力量訓(xùn)練:利用啞鈴和健身凳,你可以進(jìn)行各種全身力量訓(xùn)練,包括臥推、深蹲、彎舉等。全身力量訓(xùn)練不僅能塑造體型,還能提高基礎(chǔ)代謝率。
-瑜伽和拉伸:瑜伽和拉伸有助于提升柔韌性和改善身體姿勢(shì)。選擇一些適合家庭進(jìn)行的瑜伽動(dòng)作和拉伸習(xí),可以幫助你在空間有限的情況下保持身體健康。
4. 創(chuàng)造舒適的運(yùn)動(dòng)環(huán)境
小空間的健身房不僅要高效,還需要舒適。保持空間的整潔和通風(fēng),選擇舒適的運(yùn)動(dòng)服裝和適當(dāng) 的音樂(lè),都能提升你的鍛煉體驗(yàn)。
通風(fēng)和照明:確保運(yùn)動(dòng)區(qū)域有良好的通風(fēng),避免因空氣不流通而影響鍛煉效果。同時(shí),充足的自然光或柔和的人工照明可以提高訓(xùn)練的舒適度。
-舒適的地面:在地面鋪上瑜伽墊或運(yùn)動(dòng)地墊,可以減少對(duì)關(guān)節(jié)的沖擊,同時(shí)提高鍛煉的舒適性。
-激勵(lì)和娛樂(lè):播放一些你喜歡的音樂(lè),或者使用運(yùn)動(dòng)應(yīng)用程序跟蹤訓(xùn)練進(jìn)度,這些都能讓你的鍛煉更加愉快。
5. 持續(xù)優(yōu)化與調(diào)整
最后,小空間的微型健身房需要不斷優(yōu)化和調(diào)整。根據(jù)你的進(jìn)展和需求,定期調(diào)整訓(xùn)練計(jì)劃和器材配置。還可以通過(guò)觀看健身視頻或參加在線課程,獲取更多的訓(xùn)練靈感和技巧。
以上說(shuō)呢,家庭微型健身房的關(guān)鍵在于充分利用有限的空間,通過(guò)精心規(guī)劃和選擇高效訓(xùn)練方式,實(shí)現(xiàn)最佳的鍛煉效果。只要你愿意動(dòng)腦筋,合理安排,你的小家也能成為你健康和健身的最佳場(chǎng)所。快來(lái)動(dòng)手,開(kāi)啟你的小空間大作為之旅吧!
近日,開(kāi)發(fā)者 Samuel Tulach 在個(gè)人博客上感嘆道,“在 Windows 上編寫(xiě) GUI 應(yīng)用程序真是太難了!”在文中, Samuel Tulach 討論了使用 C++ 編寫(xiě) GUI 應(yīng)用的各種困難。他詳細(xì)列舉了幾種流行的庫(kù),但這些庫(kù)通常會(huì)面臨諸如依賴(lài)項(xiàng)管理、應(yīng)用程序大小以及樣式定制等問(wèn)題,并沒(méi)有完全契合的解決方案。
萬(wàn)萬(wàn)沒(méi)想到,這個(gè)小吐槽引起了不少開(kāi)發(fā)者的共鳴,甚至登上了 HN 熱榜。接下來(lái),我們將通過(guò)本文看看難點(diǎn)究竟在哪里?
過(guò)去幾天里,來(lái)自捷克的程序員 Samuel Tulach,一直在尋找一個(gè)能夠讓他用 C++ 編寫(xiě)帶有 GUI 程序的庫(kù)。他給出的要求非常簡(jiǎn)單:
所以,Samuel Tulach 開(kāi)始挑選一些稱(chēng)手的工具、框架,結(jié)果發(fā)現(xiàn)并沒(méi)有想象中那么簡(jiǎn)單。
首先,Samuel Tulach 從專(zhuān)為 Windows 應(yīng)用程序開(kāi)發(fā)而設(shè)計(jì)的現(xiàn)代化的用戶界面(UI)框架——WinUI 3 入手。
乍一看,它是個(gè)不錯(cuò)的選擇。它允許你使用現(xiàn)代的 Windows 組件,還可以自定義樣式顏色。設(shè)計(jì)方面,你可以使用非常容易掌握的 XAML,或者直接使用 Visual Studio 設(shè)計(jì)器。
WinUI 3 控件庫(kù)
問(wèn)題:使用 WinUI 3 框架開(kāi)發(fā)的應(yīng)用程序在發(fā)布時(shí)不能以無(wú)包裝(unpacked)的形式進(jìn)行分發(fā)。這意味著無(wú)法將應(yīng)用程序打包為一個(gè)單獨(dú)的可執(zhí)行文件(.exe)及其所需的所有依賴(lài)項(xiàng),而是需要依賴(lài)于特定的分發(fā)方式,如打包為 AppX 包或者通過(guò) Microsoft Store 進(jìn)行分發(fā)。
對(duì)于 Samuel Tulach 而言,大多數(shù)情況下,當(dāng)他嘗試將應(yīng)用程序遷移到虛擬機(jī)或不同計(jì)算機(jī)時(shí),由于缺少一些不明依賴(lài)項(xiàng)而無(wú)法正常啟動(dòng)。更糟糕的是,你需要提供一堆處理 WinUI 功能的 .dll 文件,沒(méi)有辦法提供一個(gè)可移植的 .exe 文件。使用打包形式通常沒(méi)有問(wèn)題,但它們是以 AppX 包的形式安裝的,這本身就會(huì)帶來(lái)很多問(wèn)題(尤其是在需要訪問(wèn)所有 Win32 API 的情況下)。
緊接著,Samuel Tulach 將目光轉(zhuǎn)移到了 Win32 身上。Win32 是一種應(yīng)用程序編程接口(API),它是微軟 Windows 操作系統(tǒng)的核心組成部分。它提供了開(kāi)發(fā)者與操作系統(tǒng)交互的一組標(biāo)準(zhǔn)接口和功能,用于創(chuàng)建和管理 Windows 應(yīng)用程序的各個(gè)方面,包括窗口、消息處理、文件操作、網(wǎng)絡(luò)通信等。
Samuel Tulach 表示,其需要高度的可移植性,因此使用操作系統(tǒng)的原生渲染是有道理的。這樣的程序可以是一個(gè)單一的 .exe 文件(因?yàn)槲覀儗?duì) MFC 進(jìn)行了靜態(tài)鏈接),而且體積超小(只有幾千字節(jié))。
同時(shí),Samuel Tulach 稱(chēng),還可以使用別人已經(jīng)編寫(xiě)好的更簡(jiǎn)約的庫(kù),這意味著從概念到可運(yùn)行應(yīng)用程序的快速實(shí)現(xiàn)將變得非常容易。
基本 Win32 形式
問(wèn)題:對(duì)原生的 Win32 控件進(jìn)行樣式化處理是一項(xiàng)非常困難的任務(wù)。為了改變這些空間的外觀和風(fēng)格,Samuel Tulach 需要為每一個(gè)控件編寫(xiě)一個(gè)專(zhuān)門(mén)的自定義繪制函數(shù),這個(gè)過(guò)程不僅需要詳細(xì)了解 Win32 API 的繪制機(jī)制,還需要大量的時(shí)間和精力投入。
對(duì)此,Samuel Tulach 吐槽稱(chēng),“有這個(gè)時(shí)間,我都可以直接去養(yǎng)家糊口了。”
此外,Windows 文件資源管理器(File Explorer)使用的一些原生 Win32 控件具有一個(gè)被稱(chēng)為 “隱藏” 的暗色模式。用戶可以激活這個(gè)模式,但它只會(huì)對(duì)部分控件生效,并且在視覺(jué)效果上并不十分理想或完善。
Qt 在 C++ 圖形用戶界面開(kāi)發(fā)中被認(rèn)為是一個(gè)非常優(yōu)秀的選擇。盡管它相對(duì)復(fù)雜,但它提供了 Qt 樣式表(Qt Style Sheets),這使得開(kāi)發(fā)者可以輕松地設(shè)計(jì)和定制界面的外觀和樣式。Qt 樣式表使用一種類(lèi)似于 CSS 的語(yǔ)言,讓開(kāi)發(fā)者可以用熟悉的方式來(lái)定義控件的外觀、布局和交互效果。
OBS studio 使用 Qt 和自定義樣式表
然而,問(wèn)題在于,當(dāng)使用動(dòng)態(tài)鏈接方式時(shí),運(yùn)行 Qt 應(yīng)用程序需要大量不同的 .dll 文件,這些文件總共的大小超過(guò)了 40MB。為了減少文件大小,可以選擇將 Qt 靜態(tài)鏈接到應(yīng)用程序中,這樣未使用的部分會(huì)被移除,從而減小應(yīng)用程序的體積。
不過(guò),Qt 使用的是 LGPL 許可證。根據(jù) LGPL 的條款,如果選擇靜態(tài)鏈接 Qt,那么必須遵守 LGPL 的要求之一:要么開(kāi)源應(yīng)用程序的源代碼,要么提供用于重新編譯的目標(biāo)文件。另外,Qt 也提供了商業(yè)許可證選項(xiàng),可以以幾千美元的價(jià)格購(gòu)買(mǎi),從而免除遵守 LGPL 條款的義務(wù),只是這樣成本又太高了。
wxWidgets(https://www.wxwidgets.org/)是一個(gè)相對(duì)容易學(xué)習(xí)的庫(kù),還可以使用 wxFormBuilder。它所遵循的許可證要比 Qt 更寬松,可以靜態(tài)鏈接成一個(gè) 3MB 的可執(zhí)行文件。
wxWidgets 啟用了實(shí)驗(yàn)性的 Windows 暗模式選項(xiàng)
問(wèn)題:wxWidgets 是一個(gè)在 Windows 上使用原生的 Win32 組件的庫(kù)。然而,與直接使用 Win32 或 MFC 相比,wxWidgets 并沒(méi)有提供輕松覆蓋繪制函數(shù)的選項(xiàng),因此在樣式定制方面甚至比直接使用 Win32 或 MFC 更為困難。
盡管 wxWidgets 支持應(yīng)用 Windows 文件資源管理器的暗模式控件,但實(shí)際效果并不理想。
hikogui
hikogui(https://github.com/hikogui/hikogui)是一個(gè)相對(duì)較新的保留模式 GUI 庫(kù),它使用 Vulkan 作為后端技術(shù)。這意味著它利用 Vulkan 的強(qiáng)大功能來(lái)進(jìn)行圖形渲染和顯示。hikogui 內(nèi)置了暗模式的支持,開(kāi)發(fā)者可以很容易地自行定制和樣式化界面,以適應(yīng)應(yīng)用程序的需求和設(shè)計(jì)風(fēng)格。
問(wèn)題:要成功編譯 hikogui,可能需要具備計(jì)算機(jī)科學(xué)博士學(xué)位,特別是在編譯器開(kāi)發(fā)方面的專(zhuān)業(yè)知識(shí)。在體驗(yàn)過(guò)程中,Samuel Tulach 嘗試了超過(guò) 30 分鐘去編譯示例,包括嘗試不同的代碼分支和發(fā)布標(biāo)簽,但最終只得到了一個(gè)立即在某個(gè) Vulkan 庫(kù)內(nèi)發(fā)生訪問(wèn)沖突的可執(zhí)行文件,因此他決定放棄嘗試。
不過(guò),盡管 Samuel Tulach 不太喜歡大量使用 STL(標(biāo)準(zhǔn)模板庫(kù)),甚至認(rèn)為有時(shí)候并不是必需的,但他認(rèn)為 hikogui 看起來(lái)確實(shí)有前景。
Sciter 實(shí)際上是一個(gè)不錯(cuò)的 Electron 替代品,允許開(kāi)發(fā)者使用 HTML/CSS 編寫(xiě)桌面應(yīng)用程序的 GUI。
SVG 圖標(biāo)上抗鋸齒效果不佳的示例
問(wèn)題:你可能認(rèn)為應(yīng)用程序大小或稱(chēng)為一個(gè)問(wèn)題,但實(shí)際上,包含所有必需的 .dll 文件的最終應(yīng)用程序大小大約只有 25MB,這對(duì) Samuel Tulach 來(lái)說(shuō)完全可以接受。
Samuel Tulach 表示,如果 Sciter 能夠完全開(kāi)源,那將是更好的選擇,因?yàn)檫@樣開(kāi)發(fā)者可以將靜態(tài)鏈接版本用于商業(yè)用途(與 Qt 的問(wèn)題相同)。同時(shí),Sciter 的獨(dú)立許可證價(jià)格相比 Qt 要低不少(目前為 310 美元),Samuel Tulach 也愿意為此支付費(fèi)用。
然而,現(xiàn)在不選用這個(gè)框架的主要原因在于,如上圖所示(看看標(biāo)題欄圖標(biāo)),渲染效果不太好。在體驗(yàn)過(guò)程中,Samuel Tulach 透露其遇到了各種字體和圖像的抗鋸齒問(wèn)題(啟用了高分辨率選項(xiàng),即使在預(yù)編譯的 scapp.exe 中也存在這個(gè)問(wèn)題)。而且,無(wú)論你做什么,窗口都會(huì)有一個(gè)相當(dāng)厚(2-3 像素)的灰色邊框,完全無(wú)法自定義或修改。
如果你在一些論壇上詢問(wèn)關(guān)于在 Windows 上使用 C++ 編寫(xiě) GUI 庫(kù)的問(wèn)題,大概率會(huì)收到一些“這不是一個(gè)好主意”等類(lèi)似的反饋,甚至論壇上的專(zhuān)家們會(huì)直接建議你采用其他技術(shù)堆棧來(lái)編寫(xiě)應(yīng)用程序的前端部分,然后將用 C++ 編寫(xiě)的功能作為組件或模塊加載進(jìn)來(lái)。
這種做法可以讓你更輕松地定制和風(fēng)格化界面,并顯著加快開(kāi)發(fā)速度。從技術(shù)角度來(lái)看,確實(shí)可以使用像 WinForms 或 WPF 這樣的工具生成一個(gè)體積較小的單獨(dú)可執(zhí)行文件(.exe)。
詳細(xì)來(lái)看,有兩種方式可以實(shí)現(xiàn):
問(wèn)題:.NET Framework 在 Windows 10 及更新版本中是預(yù)裝的,因此從技術(shù)上來(lái)說(shuō),我們?nèi)匀豢梢詽M足無(wú)依賴(lài)項(xiàng)的標(biāo)準(zhǔn)。然而,如果我們選擇將 C++ 編寫(xiě)的功能模塊打包為 .dll 文件,我們?nèi)匀恍枰谶\(yùn)行時(shí)將這些 .dll 文件從打包的資源中提取到一個(gè)臨時(shí)位置,并編寫(xiě)額外的 P/Invoke 代碼來(lái)調(diào)用這些模塊。
此外,如果使用 C++/CLI 編譯,生成的代碼將轉(zhuǎn)換為 .NET IL 代碼。換句話說(shuō),生成的應(yīng)用程序可以在調(diào)試工具(如 dnSpy)中打開(kāi),你可以看到 C++ 代碼被翻譯為等效的 C# 代碼。這種情況下,生成的應(yīng)用程序并不是純粹的原生代碼應(yīng)用程序,而是包含了.NET Framework 的中間代碼。
而正如文章伊始所提及的,Samuel Tulach 想要原生的代碼,所以基于 WinForms 或 WPF 得到的代碼并不他真正想要的。
以上是 Samuel Tulach 考慮過(guò)的幾個(gè)方案。經(jīng)過(guò)長(zhǎng)時(shí)間嘗試各種不同的庫(kù),甚至一度編寫(xiě)自己的 MFC 樣式之后,Samuel Tulach 發(fā)現(xiàn)對(duì)于簡(jiǎn)單的應(yīng)用程序來(lái)說(shuō),沒(méi)有什么比 Dear ImGui 更合適的了。
Dear ImGui 是一個(gè)用于 C++ 的輕量級(jí)界面開(kāi)發(fā)框架,它的主要目標(biāo)是提供高效、靈活和易于使用的界面開(kāi)發(fā)工具。Dear ImGui 是一個(gè)基于文本的界面開(kāi)發(fā)框架,它使用簡(jiǎn)單的文本命令來(lái)創(chuàng)建和更新用戶界面。
不過(guò),Dear ImGui 在設(shè)計(jì)復(fù)雜的用戶界面時(shí)也有一些缺點(diǎn),而且它不是保留模式的用戶界面,而是即時(shí)模式的用戶界面,因此想要使用,必須運(yùn)行像 DirectX 這樣的 GPU 渲染器來(lái)渲染每秒 60 幀或更多幀的用戶界面。
正如上圖所示,Samuel Tulach 已經(jīng)寫(xiě)了一個(gè)示例,如何使用內(nèi)置的多視口功能來(lái)制作簡(jiǎn)單的圖形用戶界面應(yīng)用程序。
編譯后的程序大小只有500KB,非常小巧。這個(gè)程序不需要安裝任何額外的依賴(lài)項(xiàng),即使是將 MFC(Microsoft Foundation Classes)靜態(tài)鏈接到程序中,也不需要安裝 VC++(Visual C++)的運(yùn)行時(shí)庫(kù)。這使得部署和使用這個(gè)程序變得非常簡(jiǎn)便,用戶可以直接執(zhí)行這個(gè)程序而無(wú)需擔(dān)心缺少運(yùn)行時(shí)組件或依賴(lài)項(xiàng)。
對(duì)于 Samuel Tulach 這段經(jīng)歷,不少開(kāi)發(fā)者感同身受。來(lái)自 HN 的網(wǎng)友 pshirshov 表示:
我也有過(guò)類(lèi)似痛苦的經(jīng)歷。我需要一個(gè)真正跨平臺(tái)(Windows、Linux/Wayland、Mac、iOS、Android)的 GUI 工具包,它要有豐富的控件庫(kù)和合理的主題。事實(shí)上,唯一不錯(cuò)的選擇是 QT,而使用 C++ 很難提高效率,因?yàn)樗匀蝗狈竟δ埽珙?lèi)型解構(gòu)和帶窮舉檢查的 ADT/GADT。QT 與其他語(yǔ)言的綁定還不夠成熟。
除了 QT 之外,還有漏洞百出的 Avalonia。對(duì) Linux 的支持非常糟糕。
此外還有 Kotlin/Compose Multiplatform。它缺乏良好的文檔和先進(jìn)的控件,而且仍然充滿 Bug。
我無(wú)法找到任何適用于 JS/TS 的優(yōu)秀控件庫(kù),即使是付費(fèi)的控件庫(kù)(如 Telerik 和其他控件庫(kù))也非常混亂。因此,Electron、Capacitor、React Native——它們都認(rèn)為即使是一個(gè)非常基本的應(yīng)用程序也需要投入大量精力。
Flutter 給人的感覺(jué)極不成熟,尤其是全局單例模式的普及使得在使用 Flutter 時(shí),即使是管理小型代碼庫(kù)也變得非常困難。
另一用戶稱(chēng):
在 Mac 上我遇到同樣的困擾,我在 Mac 上 SwiftUI 的體驗(yàn)是,它仍需要大量工作。文檔很差。如果你以直截了當(dāng)?shù)姆绞阶鍪拢阅芸赡軙?huì)很差。支持舊版本的操作系統(tǒng)相當(dāng)痛苦等等。
至此,你是否體驗(yàn)過(guò) GUI 開(kāi)發(fā)?有哪些工具推薦?
來(lái)源:
https://news.ycombinator.com/item?id=40839208
https://tulach.cc/writing-gui-apps-for-windows-is-painful/