分類
其它

使網站更節能的17種方法

原文由 Tom 在2019年10月23日發布與 Wholegrain Digital 原文鏈接:17 ways to make your website more energy efficient




關於網站的碳足跡,在過去的幾年中我們已經討論了很多。 互聯網的碳影響主要是由用電引起的。 現在的問題是:

作為網絡專家,我們可以讓互聯網更節能一些嗎?

本文旨在回答這個問題,提供一些方便的清單,通過這些方法您可以最大程度地減少能源浪費,並幫您確保您所創建的互聯網產品盡量節能。

而且,這裡列出的幾乎所有內容不僅可以幫助提高網站的能效,還可以改善網站的性能和用戶體驗!

網站能耗的一些背景

如果您不熟悉此主題,那麼簡短的說就是——互聯網,包括數據中心、電信網絡和終端用戶設備(如電話和筆記本電腦)會消耗大量電能。 實際上,如果將它們消耗的電量全部加在一起,互聯網所消耗的電量與英國(世界上最大的經濟體之一)消耗的電量大致相同。

數據中心 <---> 電信網絡 <---> 終端用戶設備

隨著我們在日常生活中不斷消耗越來越多的互聯網數據,互聯網消耗的電量也迅速增長。 它可能不容易被我們看到或想到,但互聯網的這種巨大功耗卻實實在在地產生了巨大的碳足跡,而這是我們需要解決的問題。

對於我們從事網頁設計和開發的人們來說,下面這些是我們可以做到的:

設計與內容

當我們談論網站的能源效率時,很容易就認為這只是一個純技術性話題。不是的,我們甚至可以在建立網站之前就提高能源效率。設計和內容對能效有很大的影響,以下是需要考慮的關鍵領域。

1. SEO(搜索引擎優化)

SEO似乎與網站效率沒有任何關係,但實際上,SEO的目標與降低能耗的目標在本質上是一致的。在針對搜索引擎排名優化網站時,我們正在幫助人們快速,輕鬆地找到他們想要的信息。如果搜索引擎優化的好,人們可以減少在網絡上查找信息和瀏覽不滿足其需求的頁面的時間。這意味著消耗的能量更少,用戶消耗的能量用到了實處。

2. 文案撰寫

與搜索引擎優化類似,文案撰寫會影響網站效率,因為它會影響人們花在瀏覽網站上的時間。 有時,我們希望人們在網站上花費大量時間,使自己沉浸在我們的內容中。我們不希望人們把時間浪費在只有很少價值或根本沒有價值的內容上。因此,清晰有效的文案寫作可以幫助減少用戶在互聯網上的浪費時間,進而減少浪費的能源。

3. 用戶體驗(UX)

良好的用戶體驗的核心要素之一是減少用戶使用過程中的摩擦。我們希望人們能夠找到想要的東西,並以儘可能簡化的方式來操作。良好的用戶體驗使每個人都可以更輕鬆而愉快地使用網絡,這再次減少了浪費精力導航到不正確的頁面上,或是盯著網頁推測下一步該點哪裡。

4. 減少或縮小圖像

在大多數網站上,圖像是頁面文件大小的最大貢獻者。您使用的圖像越多,這些圖像文件越大,則需要傳輸的數據就越多,所消耗的能量也就越多。無論技術上如何優化,設計人員和內容創建者都應仔細考慮其圖像使用方式。

  • 圖像是否真的為用戶增加了價值?
  • 它傳達有用的信息嗎?
  • 如果圖像較小,是否可以達到相同的效果?
  • 我們能否減少用戶看不見的圖像,例如輪播中的圖像?
  • 我們可以使用矢量圖形(甚至 CSS 樣式)代替照片來達到相同的效果嗎?

在不影響用戶體驗的情況下思考這些問題並將圖像保持在最低限度將有助於降低能耗。

5. 減少視頻

儘管視頻的使用頻率低於圖像,但視頻作為網上的一種內容格式正變得越來越流行,並且它是迄今為止數據強度和處理強度最高的內容形式。與圖像一樣,問下自己是否真的需要視頻。如果是這樣,請查看是否可以通過禁用視頻自動播放並保持視頻內容簡短來減少視頻產生的網絡流量量。就頁面大小而言,具有視頻播放功能的網站可能比沒有視頻的網站大一個甚至兩個數量級,並給用戶的CPU帶來更高的負載,從而導致能源消耗大大增加。

6. 仔細選擇字體

網絡字體可以增強網站的視覺吸引力,但也大大增加了使用它們的網站文件大小。單個字體文件可能多達250kb,這還只是標準粗細。如果要加粗,需要再多250kb!

為了幫助減少自定義網絡字體的影響,設計人員應考慮以下選項:

        
  • 盡可能使用系統字體。它們並不總是那麼漂亮,但是可以使用諸如 Arial 和 Times New Roman 這樣的字體,而根本不加載任何字體文件,因為它們已經在用戶設備上了。
  •     
  • 使用較少的字體變化。您可能會覺得確實有必要使用自定義網絡字體,但是在選擇的字體數量和每種字體使用的不同粗細數量方面要節儉。

開發

開發人員對他們創建和維護的網站的能源效率有很大的影響。儘管設計師和內容編輯做出的某些決定不在開發人員手中,但是在某些領域中,開發人員可以完全控制,在這些領域中,他們可以優化所提供的內容和設計。

7. 編寫整潔的代碼

整潔,精簡的代碼本來說是一件好事。保持代碼簡潔明了,避免重複代碼並編寫高效的查詢語句。幕後的代碼看上去應該像是一台保養良好的精緻機器。

請記住,這不僅適用於您編寫的代碼,而且還適用於您借來的代碼。如果您使用的是現有的框架和庫,請確保它們也得到了完善和調試,以有效地提供所需的功能,並且您沒有在用高射炮打蚊子。如果您使用的是 WordPress 之類的內容管理系統,請避免使用不必要的插件。這些插件會增加負擔,請盡量選擇服務器負載較小並且不會在前端增加不必要的文件大小的插件。我們的格蘭諾拉入門主題旨在幫助您做到這一點。

8. 減少使用 JavaScript

JavaScript 通過兩種方式影響網站效率:通過增加文件大小到網頁上以及增加用戶設備所需的處理量。其中的第二點比其他類型的文件更明顯。

由 JavaScript 驅動的功能在用戶的電腦或手機上處理,並增加了CPU使用率,從而增加了設備的能耗。聽到筆記本電腦上的那些呼呼響的散熱風扇聲了嗎?那正是能源被浪費掉的聲音。

尋找使用更有效的技術(例如 CSS )來實現前端交互、功能和動畫,或者至少有效地使用 JavaScript 。此處應特別提及跟踪和廣告腳本,這些腳本很少為用戶提供價值,但卻會增加文件的大小,導致大量的CPU運算,降低網站速度並可能侵犯用戶隱私。 Webtest.app 是一個衡量廣告腳本的性能、數據和能源消耗影響的出色工具。

Safari 中新的網絡檢查器提供了一個有用的工具,可幫助評估網頁對最終用戶設備的能源消耗影響,蘋果 Webkit 開發者的這篇文章 提供了一些詳細的使用建議。

9. 優化圖像

如上所述,圖像是大多數網頁上傳輸數據量最大的貢獻者之一。除了設計者和內容作者能對圖像使用做出決定外,還有一些技術決定會嚴重影響頁面上顯示的圖像文件大小。這些包括:

  • 以正確的比例加載圖像,而不是依靠CSS來調整它們的大小,從而避免加載比其顯示比例大的圖像。
  • 使用 TinyPNGShortPixel 之類的工具壓縮圖像文件而不會造成質量損失。我們在這裡記錄了我們最喜歡的圖像壓縮工具
  • 對每個圖像使用最有效的文件格式,例如 WebP 而不是 JPEG 。

遵循這些步驟後,可以顯著減小圖像文件的大小,從而減少能耗並縮短加載時間,而不會給網站訪問者帶來不利影響。

10. 優化字體

有一些技術方法可用於減少網站上的字體大小,即使使用自定義字體,它也可以使文件大小減少97%之多。嘗試以下方法以減小字體文件的大小:

  • 堅持使用 WOFF 和 WOFF2 之類的現代網絡字體文件格式,與 TTF、OFT 和 SVG 文件格式相比,它們使用更高的壓縮方法。
  • 子集字體僅包含網站上所需的字符。

有關優化網絡字體的性能和大小的更多信息,請參閱 Josh 的這篇文章

11. 使用加速移動頁面(AMP)

加速移動頁面旨在通過去除不必要的代碼和文件大小來簡化移動設備上的內容加載,並提供原始網頁的簡潔版本。從理論上講,如果網站效率高,諸如加速移動頁面之類的技術實際上並不會有多大幫助。但是在原始網頁不夠理想的情況下,加速移動頁面可以成為一種有用的工具。它可以快速地生成出提供面向移動用戶的更輕便,更節能的版本。

還應注意,谷歌尤其優先考慮移動搜索結果中與新聞相關主題的加速移動頁面內容,因此它可以幫助提高網站內容的曝光量。缺點是您的內容可能會在谷歌產品上提供,而加速移動頁面刪除的某些內容可能是您認為重要的內容。這是一個功能強大的工具,但要謹慎使用。

12. 建立靜態網頁

內容管理系統支持的網站對網站數據庫進行查詢並動態生成頁面。簡單來說,這意味著網絡服務器必須進行處理,考慮每次有人嘗試加載頁面時要向用戶發送哪些信息,這將導致服務器消耗更多的能量。一種解決方案(下面列出來)是使用服務器緩存技術,但是在某些情況下,可能完全不用數據庫就可以簡單地對靜態網頁進行服務器處理。

這可以通過將網頁直接編寫為 HTML、CSS 和 JS 等靜態文件,或者使用靜態網站生成器或專業的靜態網站託管服務商將由內容管理系統生成的網站轉換為靜態文件來實現。

13.使用漸進式網絡應用技術(PWA)

漸進式網絡應用技術使網站能夠利用通常只有本地應用程序中才能看到的功能。就像克里斯最近寫道,漸進式網絡應用技術的核心功能之一是能夠在用戶設備上緩存文件,這意味著在重複訪問時無需重新加載內容和資料。這可以顯著減少重複訪問者加載的數據量,尤其是在移動設備上,其數據傳輸比有線連接的能耗更高。想其他那些方法一樣,它也可以幫助縮短加載時間和用戶體驗,而沒有任何實際缺點。

網絡主機託管

數據中心中的網站以及與數據中心之間的數據傳輸都消耗大量能量。因此,精心選擇網絡託管服務可能會對能源效率和網頁速度產生重大影響。以下是要考慮的要點。

14. 使用服務器緩存

對於使用內容管理系統的網站(例如 WordPress 或 Drupal ),每次有人訪問網頁時都會動態生成頁面。這是非常低效的,因為它需要針對每個單個頁面進行服務器處理,從而增加了網絡服務器的能耗。

諸如 Varnish 之類的緩存技術可以預先生成每個頁面的靜態版本,從而為大多數訪問者顯著地減少服務器開銷,不僅降低了服務器的能耗還對大大優化了頁面加載時間。

雖然設置起來可能很複雜,但是許多主機(例如 KinstaWP Engine )現在都提供此選項作為現成的功能,這意味著您只需付出很少的精力就可以提高網站的能效和網絡性能。

15. 選擇具有較高電源使用效率(PUE)等級的主機

PUE 也就是「電源使用效率」是通常被用來對數據中心進行能源效率評估的指標。通過將進入數據中心的能量除以用於運行其中的計算機的能量來確定電源使用效率。然後,這突出顯示了在非計算活動(例如冷卻)上浪費的能量數量。數據中心的典型電源使用效率約為1.67,這意味著進入數據中心的每1.67瓦電中,只有1瓦電用於為計算系統供電。由谷歌運營的高效數據中心的電源使用效率可以高達1.11

16. 使用靠近用戶的數據中心

互聯網使用的大量能量用於通過電信網絡傳輸數據。毋庸置疑,信息傳播的越遠,其旅行所消耗的能量就越多。因此,選擇靠近目標受眾的數據中心將有助於減少能耗。例如,您可能會從美國的託管公司那裡找到便宜的網絡託管套餐,但是如果目標訪問者在英國或德國,則將浪費能源在整個大西洋上傳輸數據。而且,這種額外的距離也可能導致頁面加載時間的延遲,因此將您的網站放置在靠近主要受眾的數據中心內將對用戶體驗和地球都有好處。

17.使用 CDN(內容分發網絡)

將數據中心放置在與主要受眾群體接近的地方非常好,但是如果您的受眾分佈在世界各地,那就沒那麼容易了。內容分發網絡( CDN )為此提供了一個很好的解決方案,可以為來自全球數據中心網絡的資料(例如圖像文件)提供服務。這意味著在大多數情況下,將從用戶自己區域中的 CDN 位置加載最大的文件,從而減少了每次加載頁面時數據傳輸的距離。於是,能源效率得以提高,頁面加載時間得以縮短。

總結

至關重要的是,我們減少了網絡行業內的能源浪費。我們很難甚至不可能準確地測算網站的能源消耗(儘管有諸如 Website Carbon 和 Safari 網絡檢查器之類的工具提供幫助),但是我們可以做很多事情來消除浪費並提高效率。這些操作大多數都不是不可能完成的任務,它們只需要在設計,內容創建,開發和託管的各個方面都注重細節並仔細思考。

而且,我們這些有助於提高網站能效的方法,同時也帶來了多方面的好處,無論是更好的 SEO ,更好的網絡性能還是更好的用戶體驗。一個高效的網站從根本上說是一個更好的網站。

如果您有減少網站能耗的技巧,請聯繫並告知我們

另外,如果您有興趣創建更綠色的網絡空間,請閱讀並簽署《可持續網絡宣言》

彩蛋小撇步!

自從發布此文以來,我們還就如何減少網站的能耗提出了一些其他建議。

18. 阻止爬蟲

BlogVault 的 Akshat Choudhary 建議,阻止網絡爬蟲可以降低能耗。他說:「網絡爬蟲通常會佔用處理和帶寬等資源的50%。」

19. 深色模式

Hazel Ho 建議減少空白空間並採用深色模式。深色的網站是許多年前在網站上普及的節能技術之一,並且隨著液晶屏幕的出現而逐漸消失,液晶屏幕不同於 CRT 屏幕具有永久背光,無論屏幕上實際可見的顏色如何,都使用相同的能量。但是,隨著 OLED 屏幕分別點亮每個像素的出現,使用較暗的顏色再次成為減少終端用戶設備能耗的可行技術。

20. 使用最新的 PHP 版本

這是來自 Kinsta 的 Katalin Juhasz 提出的建議,我們還應該考慮服務器上運行的技術,以確保我們使用最有效的版本。她特別提到,較新版本的 PHP 不僅速度更快,而且使用的服務器資源更少,因此能耗也更少。 Kinsta 撰寫了有關更新 PHP 版本的好處以及對性能的影響的文章。毫無疑問,這也將適用於其他非 PHP 的方案。




如果我們不能保護地球,我們就也不能保護我們自己。環保不是送給瀕危野生動物的禮物,而是在實實在在地保護我們自己。少點一次外賣,不要浪費食物,循環利用塑料袋,使用公交卡而非二維碼搭乘公共交通,減少網上衝浪的時間用來思考,這些都是有用的。

分類
方法

win7 設置 WiFi 熱點

公司 WiFi 故障,有線網正常,於是需要臨時將有線網絡分享給手機用。參考:windows7系统笔记本设置成虚拟WiFi热点(即“无线路由器”)

「開始」-「所有程序」-「附件」,在「命令提示符」上右鍵,選擇「以管理員身份運行」。

#測試是否支持設置熱點
netsh wlan show drivers
#創建 WiFi 熱點
netsh wlan set hostednetwork mode=allow ssid=NAME key=PASSWORD

「開始」-「控制面板」-「網絡和共享中心」-「更改適配器設置」,應該可以看到一個「Microsoft Virtual WiFi Miniport Adapter」的設備,為了便於識別,我們可以把它重命名為「Hotspot」。然後在我們的有線網絡網卡(一般名字是「本地網絡」)上右鍵-「屬性」-「共享」。勾選「允許其他網絡」並選擇家庭網絡連接「Hotspot」按確定。

#在命令提示符啟動熱點
netsh wlan start hostednetwork
#關閉熱點
netsh wlan stop hostednetwork
#電腦關機後不會自動啟動熱點,再次運行啟動命令即可
分類
方法 软件

ffmpeg下載流媒體

Fefora 安裝 ffmpeg

#如果沒有安裝過rpmfusion,需要先安裝之
sudo dnf -y install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
#然後就可以安裝 ffmpeg 了
sudo dnf -y install ffmpeg

保存m3u8類型的流媒體

#首先把m3u8列表保存為ts視頻
ffmpeg -y \
  -v warning \
  -loglevel debug \
  -i "https://domain.com/path/to/manifest.m3u8" \
  -vcodec copy \
  -c copy -f mpegts out.ts
#然後把ts轉換為mp4
ffmpeg -i out.ts -acodec copy -vcodec copy out.mp4
#或者
ffmpeg -i "https://domain.com/path/to/manifest.m3u8" -codec copy file.mp4
#如果mp4容器遇到問題可以嘗試mkv

保存udp、rtmp、rtsp、http類型的流媒體

ffmpeg -i "rtmp://domain.com/path/to/video.mp4" -vcodec copy -acodec copy out.mp4

合併視頻和音頻文件

ffmpeg -i video.mp4 -i audio.m4a -c copy output.mkv

選擇m3u8的清晰度

#m3u8文件可以用文本編輯器打開,內容如:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=276000,RESOLUTION=256x144,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://vod1-vh.akamaihd.net/i/mp4_hk/tv/2020/GLOBCT2020L03100007.smil/index_250000_av.m3u8?null=0
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=465000,RESOLUTION=432x240,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://vod1-vh.akamaihd.net/i/mp4_hk/tv/2020/GLOBCT2020L03100007.smil/index_400000_av.m3u8?null=0
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=797000,RESOLUTION=640x360,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://vod1-vh.akamaihd.net/i/mp4_hk/tv/2020/GLOBCT2020L03100007.smil/index_700000_av.m3u8?null=0
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1232000,RESOLUTION=848x480,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://vod1-vh.akamaihd.net/i/mp4_hk/tv/2020/GLOBCT2020L03100007.smil/index_1000000_av.m3u8?null=0
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2478000,RESOLUTION=1280x720,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://vod1-vh.akamaihd.net/i/mp4_hk/tv/2020/GLOBCT2020L03100007.smil/index_2000000_av.m3u8?null=0

#表示這個文件提供了 5 個清晰度的視頻,通常不制定的話回選擇最好的清晰度
#如果我們要指定 480P 的清晰度,也就是第4個
#(從第 0 個開始數)
#那麼完整的命令就是

ffmpeg -i "https://vod1-vh.akamaihd.net/i/mp4_hk/tv/2020/GLOBCT2020L03100007.smil/master.m3u8" -map p:3 -codec copy 31.mp4

使用 curl-impersonate 繞過瀏覽器驗證

低端影視這樣的網站會檢查客戶端是否是瀏覽器,此時只要使用 curl-impersonate 就可以下載了。

使用時在瀏覽器開發者工具裏找到資源的鏈接,右鍵 > Copy Value > Copy as cURL。然後在命令行裏把 curl 替換成 curl_ff109,並加上 -o MOVIE.mp4 就可以下載了。如:

./curl_ff109 'https://v.ddys.pro/v/movie/Return.to.Dust.mp4' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' -H 'Accept: video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5' -H 'Accept-Language: en-US,en;q=0.5' -H 'Referer: https://ddys.pro/' -H 'Range: bytes=0-' -H 'Origin: https://ddys.pro' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Sec-Fetch-Dest: video' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-site' -H 'Accept-Encoding: identity' -o 隱入煙塵.mp4

如果中斷了可以加上 -C 斷點續傳。

使用 ffmpeg 將 mp4 轉化為較舊的編碼格式

我在使用手機自帶的相冊軟件投屏到電視上時,有時會遇到只能投遞一幀的情況,這可能是手機端或電視端不支持較新的視頻或音頻格式,可以使用 ffmpeg 將其轉碼為較舊格式。

ffmpeg -i input.mp4 -c:v libx264 -c:a libmp3lame -b:a 192k output.mp4
#-i input.mp4: Specifies the input file.
#-c:v libx264: Sets the video codec to H.264 (libx264).
#-c:a libmp3lame: Sets the audio codec to MP3 (libmp3lame).
#-b:a 192k: Sets the audio bitrate to 192 kbps (you can adjust this value as needed).
#output.mp4: Specifies the name of the output file.

本文更新於 2024/10/26。

分類
软件

Tiny Tiny RSS

Firefox 今天更新到了 68.2.0,一個比較大的改動是移除了自帶的 RSS 閱讀器。剛好前不久拿到一台免費的 Oracle Cloud,於是搭建 Tiny Tiny RSS 來做閱讀聚合。

MariaDB、php7.2、nginx 和 letsEncrypt 證書生成器的安裝網上資料很多,這裡就不貼了。

然后根据 Tiny Tiny RSS Installation Guide 一步一步来做。我是直接在nginx默認的html文件夾下 git clone 出項目,然後訪問 http://yoursite/tt-rss/install/ 來安裝,下面是遇到的問題。

未安裝 php-intl

sudo yum install php7.2-intl

文件權限不足

#首先修改文件夾權限
cd /usr/share/nginx/html/tt-rss
sudo chown -R nginx:nginx cache lock feed-icons
sudo chmod -R g+w cache lock feed-icons
#如果你的 CentOS 7 系統和我的一樣開啟了 SELinux,還需要
sudo chcon -R unconfined_u:object_r:httpd_sys_rw_content_t:s0 cache feed-icons lock

更新機制

#首先嘗試了 systemctl,沒有成功
#於是用原始的crontab
*/30 * * * * /usr/bin/php72 /usr/share/nginx/html/tt-rss/update.php --feeds --quiet

使用小撇步

  • 在偏好設定》摘要》類別里,可以新建類別。
  • 在 RSS 訂閱上右鍵,編輯摘要里可以單獨設置更新頻率。據說選項里勾上媒體快取可以緩存媒體到服務器(未驗證)。
  • 打開「全部文章」,點擊閱讀頁左上角的RSS標誌,就可以用 RSS 的方式分享自己所有的閱讀聚合。
  • 安卓版客戶端可以從 F-droid 下載,我沒有使用客戶端我使用的是 Readrops。

If it helps, please kindly consider to contribute or donate.






191218更新:Oracle Cloud 的服務器被無預警註銷,沒有通知沒有郵件什麼都沒有。但是啟動盤還在,所以可以再創建一個實例。雖然如此,仍然給人極不靠譜的感覺。新實例會產生新 IP,修改 DNS 後原來的服務就又可以用了。

藉此機會順便升級了下 Tiny Tiny RSS,由於我是通過 Git安裝的,所以需要在安裝文件夾執行下面命令就可以了。

git pull origin master
#如果你不小心改動過項目文件,可以用下面命令忽略之
git reset --hard HEAD 

更新後進入網頁可能會提示需要更新數據庫,點擊更新按鈕後就完成了升級。

本文更新於 2020/10/16。

分類
程序

使用python同步本地時間

服務器超售到不行,cpu時間隔一段時間就滿好多。嘗試配置了標準了自動的時間同步,效果不理想。於是用python調用worldtimeapi.org的api配合crontab來修正系統時間。

import subprocess,requests,time

def main():
    try:
        response = requests.request("GET", "http://worldtimeapi.org/api/timezone/Asia/Hong_Kong")
        timeJson=response.json()
        timeAbs = abs(timeJson['unixtime']-time.time())
        if timeAbs > 15 :
            subprocess.call(['date','+%T','-s',timeJson['datetime'][11:19]])
            print("time synced")
        else:
            print(timeAbs)
            
    except:
        print("net error")
    
if __name__ == '__main__':
    main()
#添加crontab任務
crontab -e
#每兩小時檢查一次
0 */2 * * * /usr/local/bin/python3 /home/42/time.py >> /home/42/t.log 2>&1
分類
程序

python使用pyftpdlib實現ftp服務

需要使用ftp分享文件,記得很久之前折騰過ftp服務的搭建,賬號權限設置都挺複雜,這次使用python和pyftpdlib實現,幾分鐘就搞定啦。

#安裝pyftpdlib,當然還是推薦在虛擬環境裡裝
pip install pyftpdlib

然後新建一個python文件myFtp.py,內容如下:

import os

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

def main():
    # Instantiate a dummy authorizer for managing 'virtual' users
    authorizer = DummyAuthorizer()

    # 第一行新建一個具有讀寫權限的用戶(用戶名,密碼,ftp文件夾)
    # 第二行新建匿名讀取賬戶
    authorizer.add_user('user', '12345', '.', perm='elradfmwMT')
    authorizer.add_anonymous(os.getcwd())

    # Instantiate FTP handler class
    handler = FTPHandler
    handler.authorizer = authorizer

    # 設置一個個性化歡迎語 (客戶端來連接的時候會返回給它)
    handler.banner = "基於pyftpdlib的ftp服務已準備好"

    # Specify a masquerade address and the range of ports to use for
    # passive connections.  Decomment in case you're behind a NAT.
    #handler.masquerade_address = '151.25.42.11'
    #handler.passive_ports = range(60000, 65535)

    # 監聽任意ip目標的2121端口,ftp標準端口是21
    address = ('', 2121)
    server = FTPServer(address, handler)

    # set a limit for connections
    server.max_cons = 256
    server.max_cons_per_ip = 5

    # start ftp server
    server.serve_forever()

if __name__ == '__main__':
    main()
#最後運行就可以了
python myFtp.py

其實這次也是走了彎路的,那就是先嘗試了Twisted,stackoverflow的網友說可以一行命令實現ftp服務。結果pip裝不上,需要下載了安裝包用

pip install 
裝。裝好後匿名用戶可以跑,設置了密碼就顯示密碼錯誤,搜索一番也沒找到辦法,於是使用了pyftpdlib。雖然實現ftp服務失敗了,但Twisted確實是一個很厲害的項目,有時間的話可以學習一下。 Twisted also supports many common network protocols, including SMTP, POP3, IMAP, SSHv2, and DNS.

分類
方法

帶樣式的英文字符𝓕𝕆𝗡𝛵

字符編碼里有一些帶了樣式的字符。Wired fonts online,下面的示例來自v2ex

0 1 2 3 4 5 6 7 8 9 A B C D E F
U+1D40x 𝐀 𝐁 𝐂 𝐃 𝐄 𝐅 𝐆 𝐇 𝐈 𝐉 𝐊 𝐋 𝐌 𝐍 𝐎 𝐏
U+1D41x 𝐐 𝐑 𝐒 𝐓 𝐔 𝐕 𝐖 𝐗 𝐘 𝐙 𝐚 𝐛 𝐜 𝐝 𝐞 𝐟
U+1D42x 𝐠 𝐡 𝐢 𝐣 𝐤 𝐥 𝐦 𝐧 𝐨 𝐩 𝐪 𝐫 𝐬 𝐭 𝐮 𝐯
U+1D43x 𝐰 𝐱 𝐲 𝐳 𝐴 𝐵 𝐶 𝐷 𝐸 𝐹 𝐺 𝐻 𝐼 𝐽 𝐾 𝐿
U+1D44x 𝑀 𝑁 𝑂 𝑃 𝑄 𝑅 𝑆 𝑇 𝑈 𝑉 𝑊 𝑋 𝑌 𝑍 𝑎 𝑏
U+1D45x 𝑐 𝑑 𝑒 𝑓 𝑔 𝑖 𝑗 𝑘 𝑙 𝑚 𝑛 𝑜 𝑝 𝑞 𝑟
U+1D46x 𝑠 𝑡 𝑢 𝑣 𝑤 𝑥 𝑦 𝑧 𝑨 𝑩 𝑪 𝑫 𝑬 𝑭 𝑮 𝑯
U+1D47x 𝑰 𝑱 𝑲 𝑳 𝑴 𝑵 𝑶 𝑷 𝑸 𝑹 𝑺 𝑻 𝑼 𝑽 𝑾 𝑿
U+1D48x 𝒀 𝒁 𝒂 𝒃 𝒄 𝒅 𝒆 𝒇 𝒈 𝒉 𝒊 𝒋 𝒌 𝒍 𝒎 𝒏
U+1D49x 𝒐 𝒑 𝒒 𝒓 𝒔 𝒕 𝒖 𝒗 𝒘 𝒙 𝒚 𝒛 𝒜 𝒞 𝒟
U+1D4Ax 𝒢 𝒥 𝒦 𝒩 𝒪 𝒫 𝒬 𝒮 𝒯
U+1D4Bx 𝒰 𝒱 𝒲 𝒳 𝒴 𝒵 𝒶 𝒷 𝒸 𝒹 𝒻 𝒽 𝒾 𝒿
U+1D4Cx 𝓀 𝓁 𝓂 𝓃 𝓅 𝓆 𝓇 𝓈 𝓉 𝓊 𝓋 𝓌 𝓍 𝓎 𝓏
U+1D4Dx 𝓐 𝓑 𝓒 𝓓 𝓔 𝓕 𝓖 𝓗 𝓘 𝓙 𝓚 𝓛 𝓜 𝓝 𝓞 𝓟
U+1D4Ex 𝓠 𝓡 𝓢 𝓣 𝓤 𝓥 𝓦 𝓧 𝓨 𝓩 𝓪 𝓫 𝓬 𝓭 𝓮 𝓯
U+1D4Fx 𝓰 𝓱 𝓲 𝓳 𝓴 𝓵 𝓶 𝓷 𝓸 𝓹 𝓺 𝓻 𝓼 𝓽 𝓾 𝓿
U+1D50x 𝔀 𝔁 𝔂 𝔃 𝔄 𝔅 𝔇 𝔈 𝔉 𝔊 𝔍 𝔎 𝔏
U+1D51x 𝔐 𝔑 𝔒 𝔓 𝔔 𝔖 𝔗 𝔘 𝔙 𝔚 𝔛 𝔜 𝔞 𝔟
U+1D52x 𝔠 𝔡 𝔢 𝔣 𝔤 𝔥 𝔦 𝔧 𝔨 𝔩 𝔪 𝔫 𝔬 𝔭 𝔮 𝔯
U+1D53x 𝔰 𝔱 𝔲 𝔳 𝔴 𝔵 𝔶 𝔷 𝔸 𝔹 𝔻 𝔼 𝔽 𝔾
U+1D54x 𝕀 𝕁 𝕂 𝕃 𝕄 𝕆 𝕊 𝕋 𝕌 𝕍 𝕎 𝕏
U+1D55x 𝕐 𝕒 𝕓 𝕔 𝕕 𝕖 𝕗 𝕘 𝕙 𝕚 𝕛 𝕜 𝕝 𝕞 𝕟
U+1D56x 𝕠 𝕡 𝕢 𝕣 𝕤 𝕥 𝕦 𝕧 𝕨 𝕩 𝕪 𝕫 𝕬 𝕭 𝕮 𝕯
U+1D57x 𝕰 𝕱 𝕲 𝕳 𝕴 𝕵 𝕶 𝕷 𝕸 𝕹 𝕺 𝕻 𝕼 𝕽 𝕾 𝕿
U+1D58x 𝖀 𝖁 𝖂 𝖃 𝖄 𝖅 𝖆 𝖇 𝖈 𝖉 𝖊 𝖋 𝖌 𝖍 𝖎 𝖏
U+1D59x 𝖐 𝖑 𝖒 𝖓 𝖔 𝖕 𝖖 𝖗 𝖘 𝖙 𝖚 𝖛 𝖜 𝖝 𝖞 𝖟
U+1D5Ax 𝖠 𝖡 𝖢 𝖣 𝖤 𝖥 𝖦 𝖧 𝖨 𝖩 𝖪 𝖫 𝖬 𝖭 𝖮 𝖯
U+1D5Bx 𝖰 𝖱 𝖲 𝖳 𝖴 𝖵 𝖶 𝖷 𝖸 𝖹 𝖺 𝖻 𝖼 𝖽 𝖾 𝖿
U+1D5Cx 𝗀 𝗁 𝗂 𝗃 𝗄 𝗅 𝗆 𝗇 𝗈 𝗉 𝗊 𝗋 𝗌 𝗍 𝗎 𝗏
U+1D5Dx 𝗐 𝗑 𝗒 𝗓 𝗔 𝗕 𝗖 𝗗 𝗘 𝗙 𝗚 𝗛 𝗜 𝗝 𝗞 𝗟
U+1D5Ex 𝗠 𝗡 𝗢 𝗣 𝗤 𝗥 𝗦 𝗧 𝗨 𝗩 𝗪 𝗫 𝗬 𝗭 𝗮 𝗯
U+1D5Fx 𝗰 𝗱 𝗲 𝗳 𝗴 𝗵 𝗶 𝗷 𝗸 𝗹 𝗺 𝗻 𝗼 𝗽 𝗾 𝗿
U+1D60x 𝘀 𝘁 𝘂 𝘃 𝘄 𝘅 𝘆 𝘇 𝘈 𝘉 𝘊 𝘋 𝘌 𝘍 𝘎 𝘏
U+1D61x 𝘐 𝘑 𝘒 𝘓 𝘔 𝘕 𝘖 𝘗 𝘘 𝘙 𝘚 𝘛 𝘜 𝘝 𝘞 𝘟
U+1D62x 𝘠 𝘡 𝘢 𝘣 𝘤 𝘥 𝘦 𝘧 𝘨 𝘩 𝘪 𝘫 𝘬 𝘭 𝘮 𝘯
U+1D63x 𝘰 𝘱 𝘲 𝘳 𝘴 𝘵 𝘶 𝘷 𝘸 𝘹 𝘺 𝘻 𝘼 𝘽 𝘾 𝘿
U+1D64x 𝙀 𝙁 𝙂 𝙃 𝙄 𝙅 𝙆 𝙇 𝙈 𝙉 𝙊 𝙋 𝙌 𝙍 𝙎 𝙏
U+1D65x 𝙐 𝙑 𝙒 𝙓 𝙔 𝙕 𝙖 𝙗 𝙘 𝙙 𝙚 𝙛 𝙜 𝙝 𝙞 𝙟
U+1D66x 𝙠 𝙡 𝙢 𝙣 𝙤 𝙥 𝙦 𝙧 𝙨 𝙩 𝙪 𝙫 𝙬 𝙭 𝙮 𝙯
U+1D67x 𝙰 𝙱 𝙲 𝙳 𝙴 𝙵 𝙶 𝙷 𝙸 𝙹 𝙺 𝙻 𝙼 𝙽 𝙾 𝙿
U+1D68x 𝚀 𝚁 𝚂 𝚃 𝚄 𝚅 𝚆 𝚇 𝚈 𝚉 𝚊 𝚋 𝚌 𝚍 𝚎 𝚏
U+1D69x 𝚐 𝚑 𝚒 𝚓 𝚔 𝚕 𝚖 𝚗 𝚘 𝚙 𝚚 𝚛 𝚜 𝚝 𝚞 𝚟
U+1D6Ax 𝚠 𝚡 𝚢 𝚣 𝚤 𝚥 𝚨 𝚩 𝚪 𝚫 𝚬 𝚭 𝚮 𝚯
U+1D6Bx 𝚰 𝚱 𝚲 𝚳 𝚴 𝚵 𝚶 𝚷 𝚸 𝚹 𝚺 𝚻 𝚼 𝚽 𝚾 𝚿
U+1D6Cx 𝛀 𝛁 𝛂 𝛃 𝛄 𝛅 𝛆 𝛇 𝛈 𝛉 𝛊 𝛋 𝛌 𝛍 𝛎 𝛏
U+1D6Dx 𝛐 𝛑 𝛒 𝛓 𝛔 𝛕 𝛖 𝛗 𝛘 𝛙 𝛚 𝛛 𝛜 𝛝 𝛞 𝛟
U+1D6Ex 𝛠 𝛡 𝛢 𝛣 𝛤 𝛥 𝛦 𝛧 𝛨 𝛩 𝛪 𝛫 𝛬 𝛭 𝛮 𝛯
U+1D6Fx 𝛰 𝛱 𝛲 𝛳 𝛴 𝛵 𝛶 𝛷 𝛸 𝛹 𝛺 𝛻 𝛼 𝛽 𝛾 𝛿
U+1D70x 𝜀 𝜁 𝜂 𝜃 𝜄 𝜅 𝜆 𝜇 𝜈 𝜉 𝜊 𝜋 𝜌 𝜍 𝜎 𝜏
U+1D71x 𝜐 𝜑 𝜒 𝜓 𝜔 𝜕 𝜖 𝜗 𝜘 𝜙 𝜚 𝜛 𝜜 𝜝 𝜞 𝜟
U+1D72x 𝜠 𝜡 𝜢 𝜣 𝜤 𝜥 𝜦 𝜧 𝜨 𝜩 𝜪 𝜫 𝜬 𝜭 𝜮 𝜯
U+1D73x 𝜰 𝜱 𝜲 𝜳 𝜴 𝜵 𝜶 𝜷 𝜸 𝜹 𝜺 𝜻 𝜼 𝜽 𝜾 𝜿
U+1D74x 𝝀 𝝁 𝝂 𝝃 𝝄 𝝅 𝝆 𝝇 𝝈 𝝉 𝝊 𝝋 𝝌 𝝍 𝝎 𝝏
U+1D75x 𝝐 𝝑 𝝒 𝝓 𝝔 𝝕 𝝖 𝝗 𝝘 𝝙 𝝚 𝝛 𝝜 𝝝 𝝞 𝝟
U+1D76x 𝝠 𝝡 𝝢 𝝣 𝝤 𝝥 𝝦 𝝧 𝝨 𝝩 𝝪 𝝫 𝝬 𝝭 𝝮 𝝯
U+1D77x 𝝰 𝝱 𝝲 𝝳 𝝴 𝝵 𝝶 𝝷 𝝸 𝝹 𝝺 𝝻 𝝼 𝝽 𝝾 𝝿
U+1D78x 𝞀 𝞁 𝞂 𝞃 𝞄 𝞅 𝞆 𝞇 𝞈 𝞉 𝞊 𝞋 𝞌 𝞍 𝞎 𝞏
U+1D79x 𝞐 𝞑 𝞒 𝞓 𝞔 𝞕 𝞖 𝞗 𝞘 𝞙 𝞚 𝞛 𝞜 𝞝 𝞞 𝞟
U+1D7Ax 𝞠 𝞡 𝞢 𝞣 𝞤 𝞥 𝞦 𝞧 𝞨 𝞩 𝞪 𝞫 𝞬 𝞭 𝞮 𝞯
U+1D7Bx 𝞰 𝞱 𝞲 𝞳 𝞴 𝞵 𝞶 𝞷 𝞸 𝞹 𝞺 𝞻 𝞼 𝞽 𝞾 𝞿
U+1D7Cx 𝟀 𝟁 𝟂 𝟃 𝟄 𝟅 𝟆 𝟇 𝟈 𝟉 𝟊 𝟋 𝟎 𝟏
U+1D7Dx 𝟐 𝟑 𝟒 𝟓 𝟔 𝟕 𝟖 𝟗 𝟘 𝟙 𝟚 𝟛 𝟜 𝟝 𝟞 𝟟
U+1D7Ex 𝟠 𝟡 𝟢 𝟣 𝟤 𝟥 𝟦 𝟧 𝟨 𝟩 𝟪 𝟫 𝟬 𝟭 𝟮 𝟯
U+1D7Fx 𝟰 𝟱 𝟲 𝟳 𝟴 𝟵 𝟶 𝟷 𝟸 𝟹 𝟺 𝟻 𝟼 𝟽 𝟾 𝟿

也可以使用 Irregular Expressions 這個開源的安卓應用來方便的生成想要的文字。

本文更新於 2024/02/16。