VMWare Fusion 12 登陆 M1 芯片

在我拿到我的 M1 Macbook Air 的时候, 我就知道接下来的五年内我会一直与 3A 游戏无缘. 事实确实是这样的, 先不说虽有雷电三接口却不支持外置显卡的弊病, Bootcamp 也被苹果禁用, 原因居然是 “微软不授权 Arm Windows 跑在苹果机器上”. ( 厨子: “你说什么? Li 什么? 什么 nux? …” )

对于我这种不折腾就会死星人来说, 虽然身体入了苹果教, 心还是留在 Linux 阵营的嘛! 所以不得已, 只能每次 vscode 远程到我的树莓派上过瘾. 期间也一直在关注虚拟机的发展. 我曾经在淘宝上买过盗版的 Parallel Desktop, 居然跑起来了! 居然还能带 Arm Windows 10 !! 居然还能跑 3A 大作 Control 跑到 30 帧!!! 我整个人都是懵逼的啊. (不过代价就是 CPU 温度直线上升到九十度, 这也就是我当时积极尝试 DIY Macbook 底座的原因. 详见博文 为 Mac DIY 一个半导体制冷底座 )

然而好景不长, 在升级到 MacOS 11 之后淘宝上所有盗版 PD 集体扑街了… (背景音: M1 虚拟化产业到了生死存亡的时刻!!!) 浑浑噩噩几个月过去后, 我突然看到新闻, VMware Fusion 这个后进生居然也捣鼓出东西来了! 不过当时才开学半个月, 我就把这条新闻抛诸脑后了.

九月底 VMware Fusion 公测的消息

今天我突然心血来潮去搜了一下相关消息, 好家伙, 发布都整整两个月了. 于是就有了这篇博文, 记录一下我的新玩具.

閱讀全文 VMWare Fusion 12 登陆 M1 芯片

为 Macbook Air DIY 一个半導體制冷底座

眾所周知 2020 年後半年發布的 Macbook Air ( M1 晶片 ) 是沒有內建風扇散熱的. 好處肯定很多, 沒灰塵煩惱沒有噪音, 但是壞處也很明顯: 一旦碰到繁重的計算任務發熱就非常非常明顯. 我發現這個情況是在玩了半個小時 Untitled Goose Game 後碰了一下功能鍵上方的鐵板, 指尖瞬間傳來燒灼感. 我連忙打開溫控軟件, 發現 CPU 溫度已經達到人神共憤的 90 多度. 這怎麼了得?

半導體制冷片就是這個玩意

偶然想到一年前賤價在京東上收到的幾片半導體制冷片, 我瞬間就有了靈感.

材料準備

預算可以控制在 ¥100 以内。

原理其实就是半导体制冷片将冷面的热量传导到了热面再由风扇散掉, 以此来从电脑背面带走热量.

需要注意的是, 半导体制冷片散热不良发热会非常严重, 可能直接烧掉. 如果选用功率大的制冷片, USB 线推荐选用 Type-C 快充, (风扇也要够给力), 不然整体的发热根本 Hold 不住.

  • 兩顆半導體制冷片
  • 廉價筆記本散熱座
  • 一管硅脂導熱膏
  • 一張散熱硅膠墊
  • 一根廢棄 USB 線
  • 一卷絕緣膠布
  • 一個小時的耐性
閱讀全文 为 Macbook Air DIY 一个半導體制冷底座

Chrome is bad! 切換到 Firefox

在我的 Macbook 上使用了幾個月 Chrome 下來, 發現使用期間電池損耗非常之快. 在 Google 上搜索之後, 結果幾乎清一色指向了 Keystone, 一個 Chrome 的更新程式. 根據 Chrome is bad, Keystone 將自己植入系統服務, 瘋狂吃資源, 一度讓 WindowServer CPU 佔用達到 80%. Google 聲稱 Keystone 是用來更新 Chrome 的, 我對此存疑. 更新一個程式需要吃 CPU 吃到 80%? 真當我腦癱啊?

然而要改變習慣也不是那麼容易, 我就很不習慣 Safari 和 Edge 的操作介面. 況且我習慣只有一套密碼, 要切換瀏覽器, 就得先把舊瀏覽器上的密碼通通刪除.

提醒: 如果你也想要轉移到 Firefox, 請不要著急著刪除 Chrome, 在轉移插件和密碼時它還用得到.

Chromium 使用報告

為了解決這個問題, 我先嘗試 Chrome 係的 Chromium ( 通過 Brew 安裝 ), 寄希望於它是一個開源軟件, 不會附帶垃圾代碼.

結果我徹徹底底的錯了. Chromium 一不支持 MacArm, ( 而 Chrome 則是支持的 ), 而來佔用比 Chrome 還要高三到五倍, 最離譜的是, 我用 Brew 卸載掉了它居然還在佔我 CPU. 這怎麼忍?

通過 Brew 卸載之後, Chromium 居然還佔用 將近 100% 的 CPU

除了高佔用以外, Chromium 還移除了大部分 Google API. 也就是說, 谷歌翻譯、密碼同步、谷歌帳號等功能全部無法使用. 從這點就可以看出來, 作為一個商業巨頭的 Google, 本質上就是一個財閥, 其第一要務就是盈利.

失望之餘, 我徹底刪除了 Chromium.

轉移並清除 Chrome 保存的資料

匯出密碼

要跳出 Chrome 的舒適圈, 將密碼轉移到 Firefox 上是一個好主意. 然而我現在正在使用 Keepass ( 一個開源密碼管理器 ), 絕大部分密碼並不儲存在瀏覽器裡. 因此我只要登錄到 Google 帳號, 刪除掉儲存在裡面的密碼就可以了.

要先匯出你的密碼, 或是關閉自動保存, 點擊這個鏈接, 登入 Google 帳戶, 點擊 “Export”.

Export 出來的東西可以導入 Keepass, 也可以導入 Firefox. 我個人偏向於前者.

匯出書籤

在 Chrome 中打開這個鏈接, 點擊右上角的三個點然後點擊 “匯出”.

我個人並沒有選擇從 Chrome 匯出書籤, 我覺得切換瀏覽器也是一個小小的新開始, 那些老的書籤大部分我一生都不會再看一次, 不如直接刪掉好了.

我沒有保留除了 Chrome 書籤欄裡的其他任何東西, 而且我其實也基本不使用書籤功能.

匯出插件

遺憾的是, Chrome 並沒有為插件提供一鍵匯出功能. 在 Chrome 種打開這個鏈接, 手動轉移插件吧. 一些插件提供了到匯出配置功能, 會讓整個操作簡單很多.

刪除 Chrome 相關的所有資料

之前的操作只是匯出了這些資料而已, 接下來要做的是完全刪除這些資料.
Chrome 官方提供了一個一鍵 GoodBye 的功能, 我個人感覺還是非常有良心的.

點擊這個鏈接, 確定你已經匯出了所有這些資料之後, 點擊刪除.

這會刪除你帳戶中關於 Chrome 的所有資料.

刪除帳戶活動

以上操作已經完全抹除了你和 Chrome 的關係了, 但是能不能再進一步呢?

瀏覽紀錄除了被儲存在 Chrome 裡面, 還儲存在 Google 活動裡面, 作為 Google 帳戶資料的一部分. 要完全清除, 我們還要執行下面的操作.

光刪除這些並沒有完全刪除你在 Google 留下的痕跡. 接下來需要轉到 Google – 我的活動 來刪除雲端的瀏覽紀錄.

請點擊這個鏈接, 點擊 刪除 – 不限時間 – 全部勾選 – 刪除.

如果以後都不想要 Google 紀錄你的活動, 可以如圖關閉這三個選項.

要刪除其他服務, 請點擊這個鏈接, 自行選擇並刪除.

我個人感覺, 在一一刪除這些資料時, 我處在一種擔憂與爽感並存的狀態. 然而, 在完全刪除之後, 又釋然了. 隱私與自由有的時後和大麻一樣, 都是一種一旦沾上就再也不想失去的東西, 只不過前者是完全無害的.

安裝 Firefox

Firefox 作為一個開源軟件, 而且有大名鼎鼎的 Mozilla 基金會為它背書. Firefox 的主題、插件市場都不下 Chrome AppStore, 也支持同步設置和密碼. 除了手機上的 Firefox 比較不堪以外 (近年來已經大大改善!) , 好像它一直都是 Chrome 的一個絕佳替代方案.

要安裝 Firefox, 可以使用內建的 Brew 包管理器. 順便一提, Firefox 已經支持 M1 晶片.

brew install --cask firefox

成功!

安裝完畢之後, 整個過程基本就完成了! 享受這個新的瀏覽器吧!

Android5 – Termux

我有一支舊手機, 華為 TAG-AL00; 目前閒置無事可幹, 於是我便動起歪腦筋想要將其改造成一台服務器.
如果你的手機已 root, 你大可以安裝 Linux Deploy, 通過 chroot 技術來部署 Linux, 安裝更快也運行更高效.

下載 Termux

首先不得不提的是, 作為有中國社會主義特色的流氓企業, 華為早就 Ban 掉了大部分手機刷機的渠道. 而華為自己的系統又太坑爹, 而且根本沒有系統更新, 導致我想給他刷一個 LineageOS 的嘗試直接打水漂. 所以接下來的一切都是在蛋疼的 Android5 上完成的.

安卓 5 / 6 的 Termux 重新回來啦!
Termux 在 2022 年重新加入了對 Android 5, 6 的支持, 請查看下面這個連接
https://github.com/termux/termux-app/wiki/Termux-on-android-5-or-6

Termux 早在 2020.01.01 就宣布不再支持 Android5/6. 因為是安卓5的緣故, 我們只能下載古老一點的版本. 經過我實測, 不僅是 20 年年初的版本無法安裝, 19 年年末的幾個版本 (如 0.75) 也裝不起來. 所以我只好選擇了更加古老的 Termux 0.70, 可以在這個鏈接下載到.

基礎配置

首先得配置好軟件源, 倒不是翻牆的問題, 而是這個版本 Termux 自帶的軟件源已經失效. 沒有軟件源其他一切都是扯淡. 複製以下命令到手機中執行:

( 如果執行完出錯, 請清除數據或重裝, 然後僅執行 apt update, 便可挑過此步. )

sed -i '[email protected]^\(deb.*stable main\)[email protected]#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable [email protected]' $PREFIX/etc/apt/sources.list
sed -i '[email protected]^\(deb.*games stable\)[email protected]#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/game-packages-24 games [email protected]' $PREFIX/etc/apt/sources.list.d/game.list
sed -i '[email protected]^\(deb.*science stable\)[email protected]#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/science-packages-24 science [email protected]' $PREFIX/etc/apt/sources.list.d/science.list
pkg update -y

接下來的問題就是我不想要再在巴掌大的玻璃上戳來戳去了. 配置 SSH.

# 在手機上執行
apt install openssh -y
sshd # 開放 8022 端口
vi ~/.ssh/authorized_keys # 複製公鑰進去
ipconfig -a # 查看 ip 信息

# 在電腦上執行
ssh 192.168.10.116 -p 8022

安裝 Debian

使用 Debian 主要的原因, 除了它比較人性化且持續被維護, 是它的佔用非常之小, 完全可以運行在 “嵌入式設備上”. 在這一個老舊的手機上運行完全沒問題. 另外一個類似的嵌入式系統 Alpine 我不熟, 因此不想安裝.

# 資源來自 AnLinux
cd ~
apt install wget openssl-tool proot -y && hash -r && wget https://raw.githubusercontent.com/EXALAB/AnLinux-Resources/master/Scripts/Installer/Debian/debian.sh
bash debian.sh

執行這個命令花費的時間不多, 所以不要被嚇到.
安裝完成之後, 只要輸入 ./debian-start.sh 便可以啟動 Debian 了!

MacArm 用 Docker 安裝 WebAssembly 環境

需求

我正在配置 Qt wasm環境,
但是 emsdk 不支持 apple m1 issue 769 使用 Homebrew 安裝的 emsdk 一直報錯,
沒找到源碼編譯的 Guide 只好使用 Docker.

環境
MacOS Bigsur M1, nodejs

安裝 Docker Arm

官網指南: 點擊前往

根據官網的描述, Docker 是使用了 QEMU 來虛擬出 AMD/x86 的環境, 反正能正常工作.

首先需要安裝 Rosetta2, 應該都已經有了

 softwareupdate --install-rosetta

然後點擊下載 Docker Desktop RC3, 簡單的安裝後啟動, 會要求獲取 root 權限.

點擊 settings - Docker Engine, 在頁面中間的框框裡面加入這麼一行, 配置科大鏡像:

  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn/"
  ],
Docker 鏡像源的配置

至此, Docker 配置完畢了.

安裝 emsdk

emscripten/emsdk : Docker Hub

以上是兩個所需鏡像, 第二個是可選項. 如果你不是配合 qt 使用的話, 只選第一個就可以了.

但是如果你要配合 qt 使用, 兩個都得裝, 原因會在下文提及.

首先先 拉取 emsdk 的鏡像, 根據 Qt官網 的描述, 我需要的版本是 1.39.8 , 所以我的命令是:

docker pull emscripten/emsdk:1.39.8

沒有特殊要求的話, 後面的 :1.39.8 可以改成 :latest, 或者根本不加, 直接拉取最新版本.

測試一下鏡像:

cd /tmp

# create helloworld.cpp
cat << EOF > helloworld.cpp
#include <iostream>
int main() {
  std::cout << "Hello World!" << std::endl;
  return 0;
}
EOF

# compile with docker image
docker run \
  --rm \
  -v $(pwd):$(pwd) \
  -u $(id -u):$(id -g) \
  emscripten/emsdk \
  emcc helloworld.cpp -o helloworld.js

# execute on host machine
node helloworld.js

如果看到 輸出 Hello World! 的話, 配置成功了.

設置快捷方式

每次使用打這麼一大串肯定不現實, 一般的思路是寫一個別名:

# vim ~/.zshrc
alias emcc='docker run \
  --rm \
  -v $(pwd):$(pwd) \
  -u $(id -u):$(id -g) \
  emscripten/emsdk \
  emcc'
alias em++='docker run \
  --rm \
  -v $(pwd):$(pwd) \
  -u $(id -u):$(id -g) \
  emscripten/emsdk \
  em++'

# 應用配置
source ~/.zshrc

這樣手敲就沒問題了, 但是用諸如 vscode 之類的工具配置環境會比較煩, 更加穩妥的方式是將其寫進 bash 腳本裡面:

echo '#!/bin/bash
/usr/local/bin/docker run \
  --rm \
  -v $(pwd):$(pwd) \
  -u $(id -u):$(id -g) \
  emscripten/emsdk \
  emcc $*' > /usr/local/bin/emcc

echo '#!/bin/bash
/usr/local/bin/docker run \
  --rm \
  -v $(pwd):$(pwd) \
  -u $(id -u):$(id -g) \
  emscripten/emsdk \
  em++ $*' > /usr/local/bin/em++

sudo chmod +x /usr/local/bin/emcc
sudo chmod +x /usr/local/bin/em++

至此, emsdk 的安裝已經基本完成.

MacArm 為 Qt 配置 WebAssembly 環境

需求

我正在配置 Qt wasm環境, 但是 emsdk 不支持 apple m1 issue 769
上一篇博文 我配置好 wasm 後發現 還是無法配合 qt 使用.

環境:
MacOS Bigsur M1, Qt 5.15.2

單單配置好wasm, 當前的配置還是不能工作, 比如說, 我現在用 clang 編譯一個 Qt 的 Example:

clang 可以跑起來

可以看到, 項目本身沒問題, 能跑起來;

我接著用剛剛配置的 em++ 編譯一遍:

得到一堆報錯

分析上面的報錯, 有一大堆 permission denied 或者 file not found. 結合 Docker 容器的特性, 我們就知道錯誤的根源了. 上面的配置, emcc 的路徑只和當前的路徑對應, 而在 qt 編譯過程中會引用很多不在當前目錄下的文件, 容器找不到, 就只能報錯.

那麼怎麼解決呢? 我們當然可以手動給他映射上去, 但是每一次都這麼幹, 碰到複雜的項目煩也要煩死. 而且如果像第一種沒有 WebAssembly Kit 的情況, qt 自己也不支持, 那麼要做的東西要海了去了. 所以說, 總是要有其他方法的.

這個方法還是 Docker.

解決方案

Qt 官網文檔: using-docker-test-qt-webassembly
maukalinow/qtwasm_builder : Docker Hub

以上文檔的意思是叫我們自己 Build 一個 Docker 鏡像. 但是顯然已經有人做過了, 本著不要重複發明輪子的定律, 我們可以直接將網友做好的鏡像 Pull 過來: (自行根據 Qt 版本選擇)

docker pull maukalinow/qtwasm_builder:5.15_latest

接著, 我們編譯一下剛才的項目測試一下:

docker run --rm -v ~/Desktop/anaclock/bin:/project/build -v ~/Desktop/anaclock:/project/source maukalinow/qtwasm_builder:5.15_latest
cd /Users/justin/Desktop/anaclock/bin
python3 -m http.server

接下來打開 這個地址: http://localhost:8000/analogclock.html

可以看到, 我們的 qt 應用已經在瀏覽器上面原生運行了.

結果非常成功

為 Qt 安裝 emsdk 到現在為止已經成功.

優化

加快項目生成速度

編譯的 Log

觀察以上編譯記錄我們可以發現, 絕大部分的時間都浪費在 generating system library 上了, 而這些庫無疑都是可以復用的. 所以接下來的事情, 就比較簡單了. 在命令後面加一條, 把緩存文件夾映射到宿主機上, 不就成了嗎?

docker run --rm -v ~/Desktop/anaclock/bin:/project/build -v ~/Desktop/anaclock:/project/source -v ~/.emsdk_cache:/root/dev/emsdk/upstream/emscripten/cache maukalinow/qtwasm_builder:5.15_latest

連著運行這個命令兩遍, 可以看出, 第二遍明顯就比第一遍快了 N 多倍.

第二遍編譯的 Log

簡化輸入命令

正如之前提到, 這麼長的命令並不利於記憶, 我們可以寫一個腳本讓他變短很多.

所以我就寫了一個腳本, 你可以在下面的鏈接下載到.

之後只要在目錄下輸入 qtwasm , 構建就自動完成了