用rust寫arduino操作lcd

在零件包找到 20x4 的 lcd 顯示器,想要測試還能不能用

手上還有一片 arduino uno,就用它好了

用arduino IDE嗎,感覺沒什麼意思(沒有,我沒有看不起用arduino IDE的人的意思

聽說 rust 可以寫很多開發版的程式了,來玩玩看好了

接線表:

uno 板 LCD
12 RS
11 RW
10 EN
4 D7
5 D6
6 D5
7 D4
GND VSS, Vo, K
5v VCC, A

資料腳反順序接,這什麼反人類接法…

正來來說Vo用來控制對比度, 實際上要接一個可變電阻

但手邊沒有,直接接地

安裝avr工具

除了rust官方的編譯器外,你還需要 avr 相關的工具

下面是從 avr-hal 的 readme 節錄:

安裝scoop(windows 的包管理器):

開啟 powershell ,輸入以下指令:

1
2
3
4
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # 線上腳本執行權限
irm get.scoop.sh | iex # 安裝 scoop
scoop install avr-gcc # 安裝 avr-gcc
scoop install avrdude # avr 燒錄工具

接下來要用cargo安裝整合工具:

用可以跑 cargo 的終端就行:

1
2
cargo +stable install ravedude
cargo install cargo-generate

寫一個簡單程式

要先產生一個專案:

1
cargo generate --git https://github.com/Rahix/avr-hal-template.git

過程讓你輸入專案名稱和目標開發版

完成後用你習慣的編輯器打開資料夾就行

接下來安裝lcd的library

1
2
# 先確定你是在專案資料夾下
cargo add hd44780-driver

然後就可以愉快寫程式拉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// src/main.rs
#![no_std]
#![no_main]

use hd44780_driver::{HD44780, Cursor, CursorBlink};
use panic_halt as _;

#[arduino_hal::entry]
fn main() -> ! {
let dp = arduino_hal::Peripherals::take().unwrap();
let pins = arduino_hal::pins!(dp);
let mut delay = arduino_hal::Delay::new();

let mut led = pins.d13.into_output();
let rs = pins.d12.into_output();
// 沒用到, 但你不宣告他不會動
let rw = pins.d11.into_output();
let en = pins.d10.into_output();

let d4 = pins.d5.into_output();
let d5 = pins.d4.into_output();
let d6 = pins.d3.into_output();
let d7 = pins.d2.into_output();
// 定義輸出腳位
let mut lcd = HD44780::new_4bit(rs, en, d4, d5, d6, d7, &mut delay).unwrap();

// 初始化
lcd.reset(&mut delay);
lcd.clear(&mut delay);


// 不要游標
lcd.set_cursor_visibility(Cursor::Invisible, &mut delay);
// 不要閃爍
lcd.set_cursor_blink(CursorBlink::Off, &mut delay);

// 輸出
lcd.write_str("Hello World!", &mut delay);
// 定位到第二行
lcd.set_cursor_pos(40, &mut delay);
lcd.write_str("greeting from rust", &mut delay);

loop {
led.toggle();
arduino_hal::delay_ms(1000);
}
}

執行程式也很簡單:

1
2
# arduino on COM3
RAVEDUDE_PORT=COM3 cargo run

embedded-hal 十分強大,基於該抽象層的功能都能輕易移植到有實作的平台

下次來玩玩看一起被翻出來的8266好了…

參考:

用 docker 架設 smokeping 支援ipv6 監視網路延遲

總感覺家裡網路怪怪的,用 docker 架設一個 smokeping 監視網路延遲

步驟如下:

  1. 安裝docker
  2. 設定ipv6
  3. 寫docker-compose.yaml
  4. smokeping, 啟動!

安裝 docker

這邊不使用發行版的 docker.io package,用官方的 repo, 之後可以用apt更新

https://docs.docker.com/engine/install/debian/

設定ipv6

docker 預設不啟用 ipv6, 所以如果要讓 smokeping 能用 ping6, 這個步驟是必須的

還好, 設定並不難

新增並修改/etc/docker/daemon.json

內容如下:

1
2
3
4
5
6
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64",
"ip6tables": true,
"experimental": true
}

預設 network bridge 使用 fixed-cidr-v6 配發位址, ip6tables 轉發流量
ip6tables 屬於實驗功能, 需要啟用experimental

寫 docker-compose.yaml

你完全可以用 docker run, 但我喜歡用compose管理container

1
2
3
mkdir smokeping
cd smokeping
touch docker-compose.yaml

編輯 docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.9'
services:
smokeping:
image: lscr.io/linuxserver/smokeping:latest
container_name: smokeping
network_mode: bridge
security_opt:
- no-new-privileges:true
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Taipei
volumes:
- $PWD/config:/config
- $PWD/data:/data
ports:
- 8003:80
restart: unless-stopped

/config: smokeping 設定
/data: smokeping 的資料庫

修改 ports 的 8003 對應到你想要開放的通訊阜

設定 smokeping

1
docker compose up

等它初始化完成後 ctrl + c關閉

修改 config/Targets

找到類似這個區域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+ InternetSites

menu = Internet Sites
title = Internet Sites
probe = FPing

++ Facebook
menu = Facebook
title = Facebook
host = facebook.com

++ Youtube
menu = YouTube
title = YouTube
host = youtube.com

++ GoogleSearch
menu = Google
title = google.com
host = google.com

+用來標示目錄層級, 不允許名稱有空白, 這裡的名稱也會作為資料庫的索引

probe: 重要 探針, 測試主機的方法, 定義在 config/Probes 中, 如果想測試ipv6, 使用 FPing6 取代 FPing

menu: 顯示在左邊目錄的名稱

title: 頁面標題

host: 測試主機

更詳細的說明可以在 官方文件 中找到

smokeping, 啟動!

1
docker compose up -d

後記

網路是真的有問題… ipv6 掉包掉的很嚴重

google ipv6

參考:

docker ipv6 support: https://docs.docker.com/config/daemon/ipv6/

遷移到 hexo + github pages

如果你看的到這篇文章,表示我已經將網站徹底遷移到 github pages

為什麼?

從過去文章記錄看,我更新的頻率其實非常低,數個月一更到現在是年更

關心伺服器還有沒有活著比寫文章還累

再來是wordpress,他是一個優秀的多人寫作系統

但很明顯至今整個網站的使用者只有我一人

從後台看,我有裝的擴充不外乎就兩個,disqus留言板和GA

這兩個在hexo中都有替代方案

既然如此,用php動態語言去管理文章這類管靜態內容就是一件沒太大意義的事

加上用 markdown 寫文章原來是如此舒服的事,可以用自己喜歡的編輯器

雖然內容和排版就沒那麼豐富就是了

接下來…

過去大學四年活得太頹廢,都在打遊戲華盛頓撿垃圾真香

幸運的是畢業就有工作,但還是想回來寫blog(這兩個沒有關係吧

先從月更來恢復寫blog的習慣吧

主題的話,雖然我沒能接觸最新的技術像AI, blockchain之類的

就把自己遇到的問題和解法簡單寫出來好了,blog的名稱也換一下,舊的實在是…(捂臉

disqus 會晚點回歸,外部服務遷移時要比較謹慎

ASUS Tinker Board 2S 上 ubuntu server 22.04(for raspi)

前言/屁話

上一次寫blog已經是在一年多前了,這裡真的是放到快長草了
沒拉,我沒有忘記這裡,伺服器如果是託管或GH我可能真的真的就不管了,但這可是在我樹梅派2上運作的怎麼可能忘記

對!說到伺服器(強硬點題),原本買了一塊ASUS Tinker Board 2S,本來想做為一些軟體無線電應用之類的,但官方的Debian系統有點一言難盡,apt 預設source都在國外,下載速度實在是對不起家裡剛換的1G路由器

如果換source吧,會缺少特定軟體支援,而且官方系統的kernel版本最高就到4.9(沒記錯的話),那如果有這麼多問題為甚麼我不自己重新自己編譯一份系統呢?

所以這篇文是在描述我折磨我自己全過程

準備交叉編譯環境(cross-compile)

總而言之你只需要一個能夠編譯arm64的編譯器,我是直接在WSL 1上面設定的,可以參考其他人設定arm64交叉編譯環境

編譯U-Boot

萬事起頭難,開機也是從bootloader開始(硬扯),甚麼?你說其實是先從boot rom開始?,不重要啦,我又不是這個嵌入式系統專業的,而且我也不需要從boot rom編譯,等等我也不會編譯U-boot…

先看官方怎麼做的吧,從官方github找來u-boot原始碼,照著做總沒錯了,後來我用U-Boot官方v2022.04版本的source當最終版本,原本是用v2021.10,但不知道為甚麼沒辦法從EMMC開機,試到快瘋了才想到換版本

TK2S 的 CPU 是 RK3399 開機提供兩種模式,一種是使用官方的初始化程式(閉源),另一種是U-boot的TPL/SPL

既然都選擇開源了,那肯定是用第二種,編譯的時候需要config 和 device tree,config用官方的就可以了,記得打開lpddr4支援還有選對板子(預設是chromebook),如果有額外需要設定一些記憶體位址,參考rk3399-evb的config,device tree的部分,一樣用rk3399-evb的dts,但需要修改一下引用的記憶體類型,rk3399-evb用的是lpddr3,註解掉改引用lpddr4的版本

編譯完成後得到 idbloader.img 和 u-boot.img ,分別燒到0x40和0x4000

阿對了記得編譯ATF(bl31.elf),希望現在說還來的及(被揍

編譯 Linux Kernel

最最最最折磨人的時刻終於到了,先從device tree開始

device tree用於描述硬體訊息的方法,但RK3399的BSP kernel的device tree一部分並不相容 linux mainline,所以悲傷的事情來了,我需要從頭一個一個檢視這兩邊的差異從頭寫一份device tree

你是不是以為這就結束了?天真! fan53200是TK2S的voltage regulator,但是這個驅動並不存在 mainline 中,所以我也得自己修改相關驅動

你是不是又以為這就結束了?太天真了! TK2S上的乙太網路的MAC address是從I2C通道上的一片EPROM提供,然後mainline 中一樣沒有相關方法,所以也得自己改,不過我在這裡發了個懶,我直接在檢查MAC有效時直接寫死MAC,原諒我…

最後是config,按照ubuntu 基本需求去選就好了

編譯完成得到 dtb 和 kernel,放進boot分區,建立 extlinux/extlinux.conf 開機選單,最後從ubuntu那複製一份 meta-data, network-config, user-data 進來,分區label用system-boot,類別fat32

系統

理論上來說,我應該從ubuntu官方的base製作一份rootfs,但既然Rpi 4也是64位元的,所以我直接從for Rpi 4的image用dd貼過去

後記

到這裡,我有了一個能開機的,沒有其他功能(kernel module)的ubuntu

所以後來又用ubuntu的kernel source編譯了一遍,這邊坑也是蠻多,比方說編譯環境要求更高,initramfs沒辦法開機等,不過有zfs, wireguard等功能這些努力挺值得的

最後貼一下inxi證明:

最後把自己生的垃圾丟出來給大家圍觀,至於系統和其他二進制文件,就不丟出來丟人現眼了,畢竟問題還蠻多的

https://gist.github.com/Benny1923/a6e28f2406f305b7144c4d67908657aa

沒有問題的部分

  • 可以開機
  • 乙太網路介面
  • USB 3 type A 介面(type C 沒有條件測試)
  • 三顆LED(pwr, act, rsv,act 動作燈很暗,不清楚為甚麼)

有問題的部分

  • 藍芽
  • HDMI(沒有測試)
  • 其他沒提到的介面
  • sdio 電壓報錯(沒有影響)

目前是先用第一版的kernel進系統後用安裝自己編譯的ubuntu kernel替代,原本的當作備用開機替代

結論

我再也再也不要使用社群小的板子了…

proper functioning meteor sdrsharp plugin

somehow
I download meteor plugin from rtl-sdr.ru
and install it…

It’s not working as I expected, it didn’t shows on the plugin panel, then I close sdrsharp, .NET error message pop up, it happened at :
SDRSharp.Meteor.MeteorPlugin.Close()

I tried google, but nothing.

So I decided decompile the plugin and try to fix it.
and I did it.

meteor plugin v2.3 on SDR# 1738

There is download link:
modded version <– bug fixed, download this one
Original Post(rtl-sdr.ru) <– before bug fix

軟體無線電(SDR)入門,軟體篇

接續上篇硬體篇,東西都買好後就可以著手設定拉
這篇使用作業系統Windows 10,軟體用SDR#,初學用這個也方便

這裡放連結:
SDR#(SDRsharp)

下載完後解壓縮到桌面還是哪裡
打開資料夾找到install-rtlsdr.bat
然後點兩下安裝

接下來注意!
如果你用的是win7可以忽略下面操作(關閉驅動強制簽章部分)

關閉驅動強制簽章

win10有強制驅動簽章,要先關掉才能裝驅動
方法也很簡單,按著SHIFT不放,然後點重新開機
進入重啟選單然後照著下列選項點
「疑難排解」->「進階選項」->「啟動設定」->「重新啟動」(這邊會重開電腦)->鍵盤按數字7
下面有圖

安裝驅動

插上電視棒
在資料夾下找到並打開zadig.exe

選「options」,把「List All Devices」打勾

下面長條選單找到「Bulk-In, Interface (Interface 0)」
確定一下USB ID 是 0BDA 2838然後按「Replace Driver」
過程中可能有警告,按安裝就好

簡易操作教學

打開SDRsharp.exe,一個複雜的介面彈了出來

紅框:來源選擇
綠框:訊號格式
籃框:當前頻率

找到紅色框,找到並選擇「RTL-SDR (USB)」
齒輪按一下把「Tuner AGC」打勾後按Close,齒輪旁的播放鍵按下去,就可以開始收聽了

可以先試試看把頻率調到當地電台,訊號格式選WFM

What’s next?

SDR可以玩的東西很多的,最直接就是拿去收聽航空/業餘波段
再者,你也可玩數位解碼,DSD Plus, TETRA了解一下
(在這邊提醒一下,不要破解有加密的通訊,會犯法)

最後,暑假結束了,好不甘心
覆蓋一張自己接收到的衛星照結束這回合

軟體無線電(SDR)入門,硬體篇

WOW! 竟然,東摸摸西摸摸摸到了SDR
上網查過一輪資料,什麼AGC,Tuner,ppm等名詞都出現了
我是有看沒有懂

因此,這是一篇新手向的文章
如果你是老手,請…
沒有,我沒有請你離開,我反而還想請你留下來指正我的錯誤

這篇先說關於硬體部分,軟體篇之後會更新

接收器好多好難選,小孩子才做選擇,我全都要?

從設備開始好了,想要接收無線電,絕對不是把衣架塞進USB就可以接收的,你需要一個能接收和轉換訊號的設備,這些設備通常使用USB介面傳輸。

好的接收器可以到萬元以上,便宜的可以千元有找,該買哪一種好?就看你喜好囉
首先要先搞清楚差在哪,接收器通常由一個調諧器(Tuner)和一個類數轉換器(ADC)組成,調諧器的作用,就是把選定的頻率轉換成適合後方類數轉換器處理的訊號,類數轉換器則是將剛剛處理好的訊號轉換成數位資料並透過USB傳送到電腦

為甚麼要先說這兩個,因為價格大多都是在這兩個晶片上,拿後面的ADC來說好了,有8bit,12bit,14bit之分,越高的位元代表靈敏度越好,訊號識別能力更強,另外價錢也有可能加在一些奇怪的地方,像內建bias tee(T型偏壓器),可以幹嘛?可以直接由接收器供電給近天線端的LNA(低噪放大器)使用,還有改TCXO等

要怎麼在機海中找到適合自己的接收器呢?
鑒於大家都是初學者,我個人是使用RTL2832U+R820T2,對於新手來說是不二選擇(工商?),因為這是市面上最便宜的接收器了(我花了450NTD),雖然在訊號處理品質等其他問題上可能沒專業設備來的好,但夠新手用了,不管你是聽業餘還是航空頻道,而且網路上關於該接收器的文章夠多,基本上你能踩的雷別人都先踩過了

是天線還是牙籤?可以換天線嗎?

如果你是買了有包裝的RTL2832U,裡面送一根剔牙棒天線,纜線還不怎麼長,若你是使用筆電還好,整組搬出去接收信號還算OK,蹲在家的桌機呢?
下面來給一些奇怪的解法:

  1. 用單板機(Raspberry pi)使用rtl_tcp當遠端工作站
  2. 家裡有看無線電視嗎?可以用它的天線喔,電視那端用的是F connector,接收器用的是MCX  connector,找到轉接頭就可以直接用,接收效果還很好。
  3. 人家筆電都可以搬出去,桌機為什麼不能,氣勢不能輸!

我在天線這方面沒有研究很深,天線的學問太大了

硬體篇先到這裡,之後會更新軟體篇,主要講設定和操作SDR#

HD audio 接線

電腦前面板的音效輸出插座壞惹
這種跟機殼在一起成套的零件似乎是沒有在替換的

不然…自己試著修理看看?
先去買零件,麥克風的插座其實跟耳機是一樣的
然後回去拆了機殼上的插座,簡單記錄下腳位和對應的線路
然後悲劇了

買錯插座,少兩隻開關腳位
機殼上的音訊插座有個開關腳位
用來判斷耳機換是否插入

然後我買的插座沒有開關
怎麼辦呢?
那來研究一下腳位好了

這是HD audio前面板音效接腳
若7腳與6或10短路,晶片就會認為前面板有插入麥克風或是耳機
我的插座就是因為這裡壞了(接觸不良)才沒聲音

於是乎我索性直接把6,7,10直接銲接在一起
缺點就是電腦會一直認為前面板有麥克風耳機
只能手動切換輸出裝置
(沒差,反正我只用耳機)

圖片來源: https://www.sevenforums.com/sound-audio/44491-ac97-hd-audio-front-panel-layouts.html

Sony Xperia XA1 Ultra(G3226) 刷TWRP Recovery+Root

hi Android Root我又回來了,隨著手機功能越來越完善,Root這件事似乎變得沒那必要,但若想玩一些新奇的功能,那Root依然那裡等你,雖然近年來利用漏洞一鍵root的App的消失使root沒那麼容易,但對於熟悉刷機的你我都知道,製造商留了一扇窗給你…

老樣子

免責聲明: 刷機有風險,解鎖失保固,操作前請再三評估,作者一概不負責

好了不必多說,你需要的東西我列好了:

  1. 一隻Xperia XA1 Ultra(我手上這支型號是G3226,雙卡版,但理論上叫這名字都可以用)
  2. 一條傳輸線
  3. adb fastboot工具和相關驅動
  4. boot.img和recovery.img(詳見文末參考自第一條)
  5. 對解鎖、刷機等名詞相關基礎名詞之認識(對,如果你是第一次玩可能得去其它地方爬文)
  6. 記得備份,解鎖會清除資料

解鎖手機

打開手機的電話,輸入*#06#看第一組IMEI號碼,記下來然後關閉,輸入下一組號碼*#*#7378423#*#*進入工程模式,選Servie info > Configuration找到Rooting status下面那行,確定它寫著Bootloader unlock allowed: Yes就可以繼續進行下去,如果是No那就不用玩了。

打開設定,進入系統 > 關於手機,對著版本號碼連按7次回到系統找到開發者選項,打開USB偵錯OEM解鎖(可能需要輸入手機密碼,如果你有設定的話)

接上傳輸線,打開console(小黑窗)(注意!這邊假設你已經知道adb和fastboot的環境配置和小黑窗用法,不知道的可以去google”adb fastboot用法”,如果我寫了會分掉其他優秀作者的曝光度)
輸入:
adb devices
多留意一下手機,會有需要授權的提示,同意後,再輸入一次上面指令,確認裝置ID旁邊的狀態是device而不是unauthorized才能進行下一步

輸入:
adb reboot bootloader
你的手機回重開進fastboot模式,LED會是藍燈,先不要碰它

Sony解鎖網站最下面有Select your device:,選Xperia XA1 Ultra,再往下,在Enter IMEI, IDID or MEID中輸入剛剛記下的IMEI,下面第一個和第二個打勾,按Submit,會給你一組解鎖碼,複製下來

回到小黑窗,輸入:
fastboot oem unlock 0x解鎖碼
確定訊息沒出現FAILED就解鎖了

刷Recovery

接下來的部分是從文末參考那簡單翻譯過來的,任何我說明不清楚的部分可以去看看

參考那邊沒有G3226的boot和recovery,但你可以抓G3212的版本(個人正在用),基本上都是同一手機,只是在不同國家有其它型號。

在fastboot模式輸入:
fastboot flash boot boot.img
沒有FAILED就是成功了
然後重啟:
fastboot reboot
重開好後你應該需要重新設定手機,然後再去開發者模式設定USB除錯(adb)
都處理好了輸入:
adb reboot bootloader
(注意手機授權請求)
進fastboot後輸入:
fastboot flash recovery recovery.img
沒有FAILED就是成功了
最後拔掉傳輸線

進recovery

開機時同時按電源按鈕和音量向下鍵,向下鍵要按到手機震一下還有LED亮紫(?)燈才能放手

這邊要是遇到需要輸入密碼請直接無視,然後去Wipe那邊選Format Data輸入yes即可

刷Root

到這邊應該已經沒有老手在了吧,刷完Recovery基本就自由了
刷Root的簡短概述就是:

  1. 下載Magisk然後放進手機
  2. 進Recovery選Install
  3. 選剛剛放進去的卡刷包(在 /sdcard 下)
  4. 完成收工 , 重新開機

參考或翻譯自:
1.https://forum.xda-developers.com/xa1-ultra/development/g3221-built-sources-t3622886

網站維護日誌+CF的worker妙用

好久沒有寫blog了,上一次是多久前阿…

有看過關於本站頁的都知道(沒看過?右上角連結點一下)
我的網站是架在一台rpi 2上的
到今天依然是它在服務著我以及各位
自從網站架成後,四年過去了,之前對他不聞也不問,直到昨天心血來潮
「要不我把它重灌?」
的確,隨著新版本的php7出現,而我還在用php5,在安全及速度上都說不過去
雖然平常會apt update && apt upgrade -y
但升級php7這件事,我真的不想去動它,沒為甚麼,單純我懶
要改config有的沒的(藉口,到處都是藉口)

終於我在昨天下定決心把rpi 2的系統全部重裝,終於可以升級php7啦
先解決維護頁面問題,原本我是打算把文章全快取成靜態頁,這樣就不會影響維護時的流量
but 這實在是太麻煩了,還有我網站根本沒有流量(36篇文章真的沒什麼流量),所以用一段文字來顯示維護中就好
然後我需要一個靜態頁伺服器放顯示維護中的html
等等…我的pi等等要下線,那誰來負責這件事?
CF有一個叫 Workers 的功能(要開加速),你可以設定條件網址去觸發worker,worker 執行用javascript編寫的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

/\*\*
\* Fetch and log a request
\* @param {Request} request
\*/
async function handleRequest(request) {

let modifiedHeaders = new Headers()

modifiedHeaders.set('Content-Type', 'text/html; charset=utf-8')
modifiedHeaders.append('Pragma', 'no-cache')


//Return maint page if you're not calling from a trusted IP
if (request.headers.get("cf-connecting-ip") !== "123.123.123.123")
{
// Return modified response.
return new Response(maintPage, {
headers: modifiedHeaders
})
}
else //Allow users from trusted into site
{
//Fire all other requests directly to our WebServers
return fetch(request)
}
}

let maintPage = "網站維護中...";

上面這段程式會把所有請求攔截下來,傳回”網站維護中…”的文字,除非你的ip是123.123.123.123,那你可以正常瀏覽網站

再來是備份和重灌
先把wordpress的文章和圖片導出,以防萬一,sqldump也跑個
確定東西備份好,關機,拔SD卡
我看著rpi 2想:「這東西竟然能連續通電4年?」
然後就是重寫映像,放進去開機,然後ssh連上去
在這邊奉勸各位系統剛灌好,第一件事就是:

改密碼!!

全世界都知道raspbian的預設帳密是 pi / raspberry
以前有個朋友我剛幫他裝完系統,離開前有提醒要改密碼,隔天就被駭去挖礦了
我實在是不知道該對他說什麼好,只好再幫他重裝一次(工具人貼紙+1)

然後 nginx php7-fpm mariadb(mysql) 裝好
“簡單”設定一下, wordpress 下載回來
把setup流程跑完,文章導回來,大功告成囉!
另外我也換了個佈景主題,希望各位喜歡

最後
新版的編輯器好不習慣啊,天啊我不在這段時間wordpress都改了些什麼
更新完後使用舊編輯器的文章語法高亮有問題,我會盡快修正
但對那些不能修復的呢,咳咳,我也不知道怎麼辦

參考資料: https://medium.com/clouddevops/cloudflare-no-maintenance-mode-still-a-maintainace-mode-d0d088d414c1