gpchn 栖息地

“此后如竟没有炬火,我便是唯一的光。”——《热风》鲁迅

PyWebview 文档中简单介绍了如何将 PyWebview 程序打包为安卓应用,但缺乏详细过程,网上相关文档也不多,因此记录一下整个打包流程,分享给有需要的人。

1. 准备 Linux 环境

跟随文档,转到 Buildozer 文档,照做就好。

官网对 Windows 系统构建安卓应用的描述为:

To use buildozer in Windows you need first to enable Windows Subsystem for Linux (WSL) and install a Linux distribution: https://docs.microsoft.com/en-us/windows/wsl/install.

These instructions were tested with WSL 1 and Ubuntu 18.04 LTS, and WSL2 with Ubuntu 20.04 and 22.04.

After installing WSL and Ubuntu on your Windows machine, open Ubuntu, run the commands listed in the previous section, and restart your WSL terminal to enable the path change.

Copy your Kivy project directory from the Windows partition to the WSL partition, and follow the Quickstart Instructions. Do not change to the project directory on the Windows partition and build there, this may give unexpected and obscure fails.

For debugging, WSL does not have direct access to USB. Copy the .apk file to the Windows partition and run ADB (Android Debug Bridge) from a Windows prompt. ADB is part of Android Studio, if you do not have this installed you can install just the platform tools which also contain ADB.

Go to https://developer.android.com/studio/releases/platform-tools and click on “Download SDK Platform-Tools for Windows”.
Unzip the downloaded file to a new folder. For example, “C:\platform-tools”.

翻译:

若要在 Windows 中使用 buildozer,首先需要启用适用于 Linux 的 Windows 子系统 (WSL) 并安装 Linux 发行版:https://docs.microsoft.com/en-us/windows/wsl/install。

这些说明在 WSL 1 和 Ubuntu 18.04 LTS 上进行了测试,并在 WSL2 上使用 Ubuntu 20.04 和 22.04 进行了测试。

在 Windows 计算机上安装 WSL 和 Ubuntu 后,打开 Ubuntu,运行上一节中列出的命令,然后重新启动 WSL 终端以启用路径更改。

将 Kivy 项目目录从 Windows 分区复制到 WSL 分区,然后按照快速入门说明进行作。不要更改到 Windows 分区上的项目目录并在那里构建,这可能会导致意外和模糊的失败。

对于调试,WSL 无法直接访问 USB。将.apk 文件复制到 Windows 分区,然后从 Windows 提示符运行 ADB(Android 调试桥)。ADB 是 Android Studio 的一部分,如果您没有安装它,您可以只安装也包含 ADB 的平台工具。

转到 https://developer.android.com/studio/releases/platform-tools 并单击“下载适用于 Windows 的 SDK 平台工具”。
将下载的文件解压缩到新文件夹中。例如,“C:\platform-tools”。

因此,我们应当先安装 wsl 版本的 Ubuntu,且只能安装 20.04 或 22.04(在 wsl2 中)。

1.1 安装 wsl Ubuntu

如果不熟悉 wsl 安装,可以参考以下简介,或另行搜索相关信息。为确保环境干净,不出现疑难杂症,建议安装一个新的 wsl 虚拟环境。

  1. Ctrl + Shift + Esc 打开任务管理器,点击性能选项卡,查看 CPU 详细信息,其中有一条名为虚拟化的条目,如显示已启用,说明虚拟化已开启,可以继续安装。如果显示已禁用,则需要开启虚拟化,具体操作请自行搜索。

虚拟化

  1. Windows + R 打开运行,输入 control 打开控制面板 -> 程序 -> 启用或关闭 Windows 功能,打开 适用于 Linux 的 Windows 子系统虚拟机平台 两项功能。

控制面板
Windows 功能

  1. 打开 Microsoft Store,搜索 ubuntu,安装 Ubuntu 20.04.6 LTSUbuntu 22.04.5 LTS。等待安装完成,自动弹出一个命令行,按照提示输出初始用户名和密码(输密码时不会显示字符)。

Ubuntu

1.2 安装依赖环境

官网原文:

(expected to work as well in later version, but only regularly tested in the latest LTS)

1
2
3
4
5
6
sudo apt update
sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf > libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
pip3 install --user --upgrade Cython==0.29.33 virtualenv # the --user should be removed if you do this in a venv

#add the following line at the end of your ~/.bashrc file*
export PATH=$PATH:~/.local/bin/

If openjdk-17 is not compatible with other installed programs, for Buildozer the minimum compatible openjdk version is 11.

翻译:

(预计在以后的版本中也能正常工作,但仅在最新的 LTS 中定期测试)

1
2
3
4
5
6
sudo apt update
sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
pip3 install --user --upgrade Cython==0.29.33 virtualenv # the --user should be removed if you do this in a venv

# add the following line at the end of your ~/.bashrc file
export PATH=$PATH:~/.local/bin/

如果 openjdk-17 与其他已安装的程序不兼容,则对于 Buildozer,最低兼容的 openjdk 版本为 11。

另外,我们还需要安装 buildozer:

1
pip3 install --user --upgrade buildozer

这一步很简单,只要打开刚刚安装的 Ubuntu,按照如上指示操作即可。我自己安装时没有加 pip –user 参数,也能正常用。

2. 设置打包信息

官网原文:

  1. Buildozer will try to guess the version of your application, by searching a line like version = “1.0.3” in your main.py. Ensure you have one at the start of your application. It is not mandatory but heavily advised.

  2. Create a buildozer.spec file, with:

1
buildozer init
  1. Edit the buildozer.spec according to the Specifications. You should at least change the title, package.name and package.domain in the [app] section.

  2. Start a Android/debug build with:

1
buildozer -v android debug
  1. Now it’s time for a coffee / tea, or a dinner if you have a slow computer. The first build will be slow, as it will download the Android SDK, NDK, and others tools needed for the compilation. Don’t worry, thoses files will be saved in a global directory and will be shared across the different project you’ll manage with Buildozer.

  2. At the end, you should have an APK or AAB file in the bin/ directory.

翻译:

  1. Buildozer 将尝试通过搜索 像 version = “1.0.3” 这样的行在您的 main.py 中。确保您在 申请的开始。这不是强制性的,但强烈建议。

  2. 创建一个 buildozer.spec 文件,其中包含:

1
buildozer init
  1. 根据规范编辑 buildozer.spec。你应该 至少更改 [app] 部分中的标题、package.name 和 package.domain。

  2. 使用以下命令启动 Android/调试版本:

1
buildozer -v android debug
  1. 现在是时候喝杯咖啡/茶了,或者如果你的电脑速度很慢,可以吃一顿晚餐。 第一个版本会很慢,因为它将下载 Android SDK、NDK 和 编译所需的其他工具。 别担心,这些文件将保存在全局目录中,并且会 在您将使用 Buildozer 管理的不同项目中共享。

  2. 最后,您应该在 bin/ 目录中有一个 APK 或 AAB 文件。

2.1 编辑 buildozer.spec

PyWebview 官网文档中描述了这一步。我个人推荐下载示例文件再做修改。

官网文档:

pywebview is designed to be built with buildozer. You need to include following lines in your to bundle pywebview correctlybuildozer.spec

1
2
requirements = python3,kivy,pywebview
android.add_jars = <path_to_pywebview-android.jar>

pywebview-android.jar is shipped with and can be found under . To get > its full path typepywebviewsite-packages/pywebview/lib

1
2
from webview import util
print(util.android_jar_path())

You can see a sample here bulldozer.spec

Edge 网页翻译:

pywebview 旨在使用 buildozer 构建。您需要在正确捆绑 pywebview 中包含以下行 buildozer.spec

1
2
requirements = python3,kivy,pywebview
android.add_jars = <path_to_pywebview-android.jar>

pywebview-android.jar 随附,可以在 下找到。获取其完整路径类型 pywebviewsite-packages/pywebview/lib

1
2
from webview import util
print(util.android_jar_path())

您可以在此处查看示例 bulldozer.spec

示例文件在 GitHub 上,点击跳转

下载下来后,编辑其中内容。首先运行上述代码,获得一个路径,将其填入android.add_jars中。你还需要填写titlepackage.namepackage.domain等项目。

如果你有多余的依赖库,应在requirements项目中列出;如果应用需要特定权限,应在android.permissions中列出(权限名请自行搜索)

3. 开始打包

打开 Ubuntu。第一次运行任何打包命令,将会下载安卓编译相关文件,可能需要等待一段时间,耐心等待。之后再编译就会快很多了。

3.1 debug 模式编译

debug 模式会快一些,直接生成 apk,方便调试。进入项目文件夹,运行如下命令:

1
buildozer android debug

3.2 release 模式编译

release 模式会在编译后压缩,生成 aab。在正式发布时,建议使用这种模式。直接运行下面命令即可:

1
buildozer android release

3.3 编译结束后

编译完成后会在bin/文件夹中生成 aab 或 apk 文件。建议将文件转移到 Windows 中操作。

4. 处理 aab/apk 文件

4.1 提取 apk

如果产生的是 aab 文件,你需要先提取 apk 文件。

此过程依赖 java 和 bundletool.jar 文件。(依赖安装方法太长了,不再赘述,网上有比我写得更详细的)

1
java -jar bundletool.jar build-apks --bundle=[你的 aab 文件] --output=output.apks --mode=universal

这样会得到一个output.apks文件,将它解压到output文件夹中。(我是这么做的)里面应该有一个universal.apk

4.2 修改配置

如果项目中访问了任何明文 HTTP 资源(如本地服务器),就需要修改 apk 配置,因为安卓 9.0 开始,默认不接受明文 HTTP 请求,导致应用会直接闪退。想要修改此配置,需要先将 apk 解包。

此过程依赖 java 和 apktool.jar 文件。

1
java -jar apktool.jar d output/universal.apk -o [输出目录]

你的输出目录中有一个AndroidManifest.xml文件,修改其中<application>标签,添加一个属性android:usesCleartextTraffic="true"。修改后,用下面的命令重新打包。

1
java -jar apktool.jar b [刚刚的输出目录] -o [输出文件名].apk

这样就修改好了。

4.3 生成 KeyStore

生成的 apk 没有签名是不能使用的,而签名需要一个 jks 密钥。如果你没有 jks 文件(Java KeyStore),需要创建一个新的。

此过程依赖 keytool。

1
keytool -genkey -keystore [输出文件名].jks -keyalg RSA -keysize 2048 -validity 10000 -alias [密钥别名]

按照提示输入对应信息,就能生成一个 jks 密钥文件了。

注:此证书并不是永久有效的,它将会在 10000 天后过期。

4.4 签名

debug 模式的应从这一步开始。这是打包安卓的最后一步。

此过程依赖 apksigner。

1
apksigner sign --ks [你的密钥].jks --ks-key-alias [密钥别名] --ks-pass pass:[密钥密码] -out [输出文件名].apk [未签名文件名].apk

这样就完成了签名。至此,一个可安装的 APK 就打包好了。

5. 更多

我写了一个简单的脚本处理 aab 文件:

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
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python3
# coding=utf-8

from sys import argv
from os import system
from pathlib import Path

VER = "0.1.0"
JAVA = r"path\to\java"
SEVEN_ZIP = r"path\to\7z"
APK_SIGNER = r"path\to\apksigner"
AAB = r"QriaMath-0.1.0-arm64-v8a_armeabi-v7a-release.aab"

print("(0/5) Cleaning...")
for p in (
"./output",
"./output.apks",
"./qriamath",
"qriamath.apk",
"QriaMath-0.1.0.apk",
"QriaMath-0.1.0.apk.idsig",
):
p = Path(p)
if not p.exists():
continue
if p.is_dir():
system(f"rmdir /s/q {p}")
else:
p.unlink()

if len(argv) > 1 and argv[1] == "clean":
exit(0)

print("(1/5) Building APK...")
system(
f"{JAVA} -jar bundletool.jar build-apks --bundle={AAB} --output=output.apks --mode=universal"
)

print("(2/5) Extracting APKs...")
system(f"{SEVEN_ZIP} x output.apks -ooutput") # * Not a mistake

print("(3/5) Modifying XML...")
system(f"{JAVA} -jar apktool.jar d output/universal.apk -o qriamath")
xml = Path("qriamath/AndroidManifest.xml")
xml_text = xml.read_text()
xml_text = xml_text.replace(
"<application", '<application android:usesCleartextTraffic="true"'
)

print("(4/5) Saving Changes...")
xml.write_text(xml_text)
system(f"{JAVA} -jar apktool.jar b qriamath -o qriamath.apk")


print("(5/5) Signing APKs...")
system(
f"{APK_SIGNER} sign --ks qriamath.jks --ks-key-alias qriamath --ks-pass pass:qriamath -out QriaMath-{VER}.apk qriamath.apk"
)

QriaMath 是我心血来潮写的一个练手的 PyWebview 项目,想试试打包安卓。属于是为了这瓶醋包了一盘饺子……

养成良好的码风是非常重要的,它可以帮助你编写出更加清晰、可读性更高的代码。我习惯的写法是这样的:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# coding=utf-8


def main():
...


if __name__ == "__main__":
main()

首行是 shebang,即指定执行方式,仅在 Linux 和 MacOS 有效。第二行是编码声明,指定源代码文件的编码格式。接下来定义了一个 main() 函数,脚本的主要内容应放在这个函数中。最后,通过 if __name__ == "__main__": 判断当前模块是否是主程序,如果是,则调用 main() 函数。

shebang

shebang 是指在 Unix 和类 Unix 操作系统中的脚本文件的第一行,用于指定执行该脚本的解释器。例如,在 Python 脚本中,shebang 通常为 #!/usr/bin/env python3,表示使用系统环境变量中的 Python 3 解释器来执行该脚本。

在 Windows 系统中,shebang 无效,因为 Windows 不支持这种机制。因此,在 Windows 系统中,通常不需要在 Python 脚本中添加 shebang。

添加 shebang 的好处是,可以在命令行中直接运行 Python 脚本,而不需要先进入 Python 环境。尤其是对于不熟悉 Python 的用户来说,添加 shebang 可以让他们更方便地运行你的脚本。

编码声明

在 Python2 中,源代码文件的编码格式默认为 ASCII,这会导致在源代码中无法使用非 ASCII 字符。因此,在 Python2 中,通常需要在源代码文件的开头添加编码声明,以指定源代码文件的编码格式。其实 # -*- coding: utf-8 -*- 这样的格式更常用一些,但其中的 -*- 是装饰作用,我更喜欢用 # coding=utf-8 这样的格式。

在 Python3 中,源代码文件的编码格式默认为 UTF-8,因此不需要再添加编码声明。但是,为了更好的兼容性,建议在 Python3 中也添加编码声明。尤其是对于 Windows7 系统,默认的编码格式为 GBK,如果源代码文件中包含非 GBK 字符,可能会导致运行错误。

程序入口

在 Python 中,建议将程序的入口函数命名为 main(),并在程序的最后调用它。这样做的好处是,可以方便地测试和调试程序,也可以让程序更加清晰和可读。而且在函数中的变量是局部的,相对于全局变量更为安全。而且在很多其他编程语言中,main 函数是程序的入口,保持同样的风格可以增加代码的可读性。

在 Python 中,if __name__ == '__main__': 是一个常见的惯用法,用于判断当前模块是否是主程序。如果当前模块是主程序,则执行 if 语句块中的代码;如果当前模块是被其他模块导入的,则不执行 if 语句块中的代码。这种做法的好处是,可以让模块既可以被其他模块导入使用,又可以独立运行。

引号

在 Python 中,字符串可以使用单引号 ' 或双引号 " 来表示。我习惯于使用双引号 " 来表示字符串,其实是个人风格的缘故,在 Black 代码格式化工具中,也默认使用双引号。为了代码的美观性,即使字符串内部包含双引号,我也会使用转义字符。

也有人喜欢用双引号来表示供人类阅读的字符串,用单引号来表示供机器阅读的字符串,这种格式也挺巧妙的,可以让字符串在无形中携带更多信息。

缩进

Python 使用缩进来表示代码块,而不是常用的大括号 {}。这在某种意义上可以增强代码的可读性,但有时候太多缩进会让代码显得冗长,网上有一张梗图,说的是 Python 程序员需要随身携带尺子,用来量缩进长度……但良好的码风不会让这种情况出现,通常 3 层缩进是最大长度,如果需要进一步缩进,就应该将代码拆分成多个函数,或使用一些高级技巧。

换行

在 Python 中,一行代码的长度通常不超过 79 个字符,超过 79 个字符的代码应该使用换行符 \ 来拆分成多行。这主要是为了提高代码的可读性,避免代码过长导致阅读困难。

如果是列表、元组、字典等数据结构,可以使用逗号 , 来拆分成多行,这样可以让代码更加清晰。

空白

在代码中合适的地方留白,可以让代码结构清晰很多,例如以逻辑块为间隔添加空行,在逗号之后添加空格,在运算符前后添加空格等。

需要强调的一点是,在代码注释中,请尽量使用英语,虽然 Python 支持中文注释,但 Python 的官方文档、社区和第三方库都是使用英语的,使用英语注释可以让你的代码更容易被他人理解和维护。如果要使用中文,请在英语单词和数字两边添加空格。不仅在代码注释中,在任何地方都应该养成这种习惯,这可以让你的文字看起来更具“呼吸感”,更美观和易于阅读。

总结

以上是我在 Python 编程中的一些良好码风,希望对大家有所帮助。当然,每个人的编程风格都有所不同,最重要的是保持代码的一致性和可读性。

我个人的使用习惯,在 Linux 上使用 zsh,在 Windows 上 CMD 和 PowerShell 混用。Linux 终端的美化非常好办,安装 oh-my-zsh 插件,搭配 powerlevel10k 主题,可以说是一键美化。

Linux 美化效果

但 Windows 终端,愿意折腾的人不多,顶多从 Microsoft Store 下载一个 Windows Terminal。如何真正强化 CMD 和 PowerShell,使其拥有比拟 zsh 的体验呢?oh-my-posh 就是答案。

接下来我将介绍如何使用 oh-my-posh 美化 CMD 和 PowerShell。

0. 安装 Nerd Font

请务必下载安装至少一种 Nerd Font 字体,以保证终端美化体验。

Nerd Font 是一类特殊的字体,比普通字体包含了更多特殊符号和图标,在终端上显示各种图标都靠它了。

Nerd Font 字体下载地址:https://www.nerdfonts.com/

拿我使用的 FiraCode Nerd Font 举例,从官网进入 GitHub Release 页面,下载压缩包后解压,里面有 ttf 等各种格式的文件夹,全选 ttf 文件夹里所有字体文件,右键安装即可。

1. 安装 oh-my-posh

官网提供了三种安装方式,但现在已经可以用 Microsoft Store 安装了,但考虑到路径问题,我选择手动安装。

官网文档中详细介绍了安装方法:https://ohmyposh.dev/docs/installation/windows

截至 2025 年 2 月 9 日,oh-my-posh 最新版本为 24.19.0。我在这里贴一段翻译后的官网原文,以便读者一站解决。

使用 winget 安装

1
winget install JanDeDobbeleer.OhMyPosh -s winget

手动安装

1
Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))

使用 chocolatey 安装

官网注:这个包管理器由社区维护,可能不提供最新版本。

1
choco install oh-my-posh

我原先就安装了 winget,因此使用 winget 安装。安装完成后,新开一个 PowerShell 终端,输入 oh-my-posh --version,如果显示版本号,则表示安装成功。

2. PowerShell 配置 oh-my-posh

我选择的是 powerlevel10k_rainbow 主题,和 oh-my-zsh 的 powerlevel10k 很像,只是不能自定义,只有四种 powerlevel10k 主题供选择,详见官网。安装方法如下:

找到配置文件

首先查看 PowerShell 配置文件的路径,在 PowerShell 中输入以下命令:

1
$PROFILE

此时会显示配置文件的路径,例如:

C:\Users\gpchn\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

但这个配置文件不一定存在,如果不存在,需要手动创建。

写入配置

打开配置文件,写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
# 以下四条命令:导入 PowerShell 的插件,有些需要下载,可自行上网搜索
#Import-Module posh-git
#Import-Module Terminal-Icons
#Import-Module PSReadLine
#Import-Module ZLocation

# 这条必须要有,可以只有这一条
# 其中 -c C:\Users\...\powerlevel10k_rainbow.omp.json 是指定终端主题,可自行修改或删除
oh-my-posh init pwsh -c C:\Users\gpchn\AppData\Local\Programs\oh-my-posh\themes\powerlevel10k_rainbow.omp.json | Invoke-Expression

# 设置 Tab 自动补全,这个命令是可选的
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete

保存并关闭文件,重新打开 PowerShell 终端,即可看到美化效果。

注:首次启动会消耗较长时间,PowerShell 启动速度慢的缺点向来饱受诟病,我这即使缓存后也需要 3 秒多……

美化效果(powerlevel10k_rainbow 主题下):

PowerShell 美化效果

选择主题 & 安装插件

大体弄好了以后就可以细心雕琢配置了,如上所述,如果想要自定义主题,可以在官网查看所有主题:https://ohmyposh.dev/docs/themes,也可以在 PowerShell 中运行 Get-PoshThemes 命令,输出所有的主题。如果没有喜欢的,你甚至可以自己写一个主题配置文件。

可以安装一些 PowerShell 插件来增强功能,但代价是启动时间。

3. CMD 配置 oh-my-posh

大体上和 PowerShell 差不多,只是 CMD 没有什么配置文件,因此我们需要安装 clink 来增强 CMD 的功能,在 官网 右上方下载最新版本。(注:下载用 GitHub Release 托管,需科学上网)

安装完成后打开一个 CMD 终端,输一些命令试试有没有自动补全功能,有的话就说明安装成功。

在 clink 的安装目录下新建一个 oh-my-posh.lua,这是 clink 的配置文件,写入以下内容:

1
2
3
4
-- 其中 -c C:\Users\...\powerlevel10k_rainbow.omp.json 是可选命令,用于指定终端主题,可自行修改或删除
-- 要改命令就在这个模板上改
-- load(io.popen('oh-my-posh init cmd [这里面添参数]'):read("*a"))()
load(io.popen('oh-my-posh init cmd -c C:\\Users\\gpchn\\AppData\\Local\\Programs\\oh-my-posh\\themes\\powerlevel10k_rainbow.omp.json'):read("*a"))()

保存并关闭文件,重新打开 CMD 终端,即可看到美化效果。

美化效果:

CMD 美化效果

clink 是个很强大的工具,可使用右箭头补全命令,还有更多功能可自行探索。

巧用 doskey 命令

在 CMD 中,doskey 命令可以用来设置别名,类似于 Linux 中的 alias。例如 doskey ls=dir,这样在 CMD 中输入 ls 就相当于输入 dir

在你的用户的 AppData\Local\clink 路径下新建一个 clink_start.cmd,写入以下内容:

1
2
3
4
5
6
7
8
9
@echo off
doskey ls=dir
doskey rm=del
doskey cp=copy
doskey mv=move
doskey clear=cls
doskey pwd=chdir
doskey cat=type
doskey less=type

这是一些常用 Linux 命令对应的 CMD 命令,你可以根据需要自行修改。保存并关闭文件,重新打开 CMD 终端,即可使用这些别名。

展示别名

4. 拓展:GitBash 美化

在 GitBash 中,oh-my-posh 的美化效果和 PowerShell 差不多,只是主题选择较少,因为 GitBash 不能在 Windows Terminal 中打开(也可能是我没找到方法,懒得折腾),它用的是自己的终端模拟器。我在它模拟器的设置里找不到换 Nerd Font 的方法,因此不能使用带图标的主题(只能用名字带 .minimal 后缀的主题)。

转移主题文件

将你看中的主题文件(xxx.omp.json)复制到 GitBash 的目录下面,随便找个地方,例如我放在了 /etc/oh-my-posh/xxx.nmp.json

登录时初始化 oh-my-posh

~/.profile 中输入以下命令(如果文件不存在就新建一个):

1
2
# 将路径替换为你存放主题文件的路径
eval "$(oh-my-posh init bash -c /path/to/xxx.omp.json)"

5. 局限性

需要指出,oh-my-posh 的美化很依赖终端模拟器,例如在 VSCode 中美化有时会直接失效,目前我找不到方法解决这个问题,应该是 VSCode 自带终端不好使。

6. 总结

使用 oh-my-posh 美化 CMD 和 PowerShell 的效果还是很明显的,但代价是启动时间。CMD 不怎么明显,美化前后都是不用等的延迟。PowerShell 每次启动往往要等待 3 秒以上,清理 C 盘删缓存后,延迟一度达到 7 秒,这个缺点是不可避免的。

PowerShell 语法又丑,启动又慢,体积又庞大,但有时候就得用它……内置 C# 了不起啊!

常见的配置文件语言有 JSON、XML、INI、YAML 和 TOML 等。配置文件的格式并没有规范可言,不同规模和种类的配置文件使用不同的语言很合常理。但五花八门的语言极大地增加了普通人修改配置文件的学习成本,遇到不熟悉的语言,往往需要费很大工夫查阅资料,才能搞清楚配置文件的结构和语法。下面我们来简单地了解一下这 5 种配置文件语言。

1. JSON (JavaScript Object Notation)

JSON 是由 Douglas Crockford 根据 JavaScript 的规范发明推广的,被设计为 JavaScript 的子集。最早的 JSON 标准于 2000 年发布,2013 年,ECMA 国际发布了 ECMA-404 标准,正式定义了 JSON 的数据交换格式,详细描述了 JSON 的语法和结构。

以上内容参考了百度百科,JSON

语法格式

JSON 是一种简洁的数据交换格式,这种设计有利于机器读写,但有时可读性较差。其基本语法包括对象(键值对集合,相当于 Python 中的 dict)和数组。

1
2
3
4
5
6
7
8
9
// 这是 JSON 中的注释
{
"addr": "127.0.0.1",
"port": 8080,
"custom": {
"args": ["--debug", "--verbose"]
"timeout": 10
}
}

优点

  • 简洁明了,易于编写
  • 广泛支持,几乎所有编程语言都有 JSON 解析库

缺点

  • 早期版本不支持注释
  • 复杂的数据结构不易读

2. XML (eXtensible Markup Language)

1996 年 7 月 W3C 在 Jon Bosak(SUN公司的网络技术专家)的建议下成立了 XML 规范制订小组,其目的是为了将标准通用标记语言 SGML(Standard Generic Markup Language)方便地应用于网络,参加规范制订的是一大批著名公司、学术机构代表和 SGML 专家。在他们的共同努力下,XML 1.0 建议书于 1998 年 2 月 10 日正式公布于众。

以上内容参考了百度百科,可扩展标记语言

语法格式

XML 是 HTML 的子集,其语法包括标签(tag)、属性(attribute)和文本内容。

1
2
3
4
5
6
7
8
9
10
<!-- 这是 XML 中的注释 -->
<app>
<addr>127.0.0.1</addr>
<port>8080</port>
<custom>
<args>--debug</args>
<args>--verbose</args>
<timeout>10</timeout>
</custom>
</app>

优点

  • 支持复杂数据结构
  • 学习成本几乎没有,HTML 基础即可
  • 自描述性强,基本不用写注释

缺点

  • 语法冗杂,不易编写
  • 文件体积较大
  • 使用频率较低,逐渐被 JSON 取代

3. INI (Initialization File)

INI 在 Windows 系统中广泛使用,用于存储配置信息。有时候,INI文件也会以不同的扩展名,如 “.CFG”、“.CONF”、或是 “.TXT” 代替。

以上内容参考了维基百科,INI文件

语法格式

INI 文件由节(section)和键值对(key-value pair)组成。

1
2
3
4
5
6
7
; 这是 INI 文件中的注释
[app]
addr = 127.0.0.1
port = 8080
[custom]
args = --debug --verbose
timeout = 10

优点

  • 语法简单,结构清晰易于读写
  • 历史悠久,广泛使用
  • Windows 原生支持

缺点

  • 语法过于简单,不支持复杂数据结构,如嵌套、数组等
  • 缺乏标准化,不同解析器的实现可能有所不同

4. YAML (YAML Ain’t a Markup Language)

YAML 是 “YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

Clark Evans 在 2001 年首次发表了这种语言,另外 Ingy döt Net 与 Oren Ben-Kiki 也是这语言的共同设计者。YAML 参考了其他多种语言,包括: C 语言、Python、Perl,并从 XML、电子邮件的数据格式(RFC 2822)中获得灵感。

以上内容参考了百度百科,YAML

语法格式

YAML 的语法包括键值对、列表和嵌套结构。

1
2
3
4
5
6
7
8
9
# 这是 YAML 文件中的注释
app:
addr: 127.0.0.1
port: 8080
custom:
args:
- --debug
- --verbose
timeout: 10

优点

  • 语法和 Python 一样利用了缩进,易于阅读
  • 后起之秀,借鉴了百家之长,功能强大

缺点

  • 语法较为复杂,学习成本较高
  • 厌恶强制缩进的人可能会觉得很难看

5. TOML (Tom’s Obvious, Minimal Language)

TOML 是一种旨在成为一个小规模、易于使用的语义化的配置文件格式,它被设计为可以无二义性的转换为一个哈希表。由 Tom Preston-Werner、Pradyun Gedam 等创建

以上内容参考了维基百科,TOML 和 (toml.io)[https://toml.io/cn/v1.0.0]

语法格式

TOML 的语法包括键值对、列表和嵌套结构。

1
2
3
4
5
6
7
# 这是 TOML 文件中的注释
[app]
addr = "127.0.0.1"
port = 8080
[custom]
args = ["--debug", "--verbose"]
timeout = 10

优点

  • 语法类似 INI,但更强大
  • 发明时间较晚,但使用十分广泛
  • 支持丰富的数据类型
  • TOML 在 Python 和 Rust 中使用广泛(pyproject.toml、Cargo.toml)(这一点是出于偏爱)

缺点

  • 语法较为复杂,学习成本较高
  • 发明时间较晚,社区支持较弱(查资料时明显能感受到)

结论

综合考虑,我的选择是:

  • 非常简单的情况下,使用 JSON 或 INI
  • 需要复杂数据结构时,使用 JSON 或 TOML

总之无脑用 JSON 就对了(doge),牺牲一点可读性而已。

耐着性子看完了,今年秋季发布会实际上没有什么新意

新品

这次一共发布了 ​6 款新品,它们分别是:

  • Apple Watch Series 9
  • Apple Watch Ultra 2
  • iPhone 15
  • iPhone 15 Plus
  • iPhone 15 Pro
  • iPhone 15 Pro Max
    一些值得关注的地方:
  • Lightning 已经入土,所有新产品都是 Type-C 接口
  • iPhone 15 全系都有灵动岛
  • iPhone 15 带来了类似 5c 一样的五种配色
  • 介绍 iPhone 15 游戏性能的时候原神乱入,应该也是整场发布会唯一说过中文的地方
  • 刺客信条即将登陆 iOS 平台
  • 静音键造型改变,成为一个普通按钮
  • 两个新品手表新增了一个双击动作(食指拇指捏两次,可参考 Vision Pro)

亮点

环保作为主题贯穿了整场发布会。苹果已经提前 7 年达成了 2030 年碳中和目标,在介绍每个新品的时候也会特意提到使用了哪些可循环材料,包括机身用的可循环铝、表带使用的可降解纤维、全系电池使用 100% 可循环钴等等。
发布会开头放了一个“天气之母”短片,从材料、运输、水电等不同角度表明了苹果对生态环境的注重。

关于价格

所有新品的价格我都没有提到 (因为反正我也买不起),我只能说这很苹果
另外,普通用户得等到 9 月下旬才能买到新品了

​总结

一句话总结:普通人没什么必要看,也就比春晚好看点。苹果发布会质量真的很高,可能达不到预期,但看了总是有收获的。

终于选好了配置、买好了零件、装好了电脑,然后暑假就要结束力(悲)

话不多说先上配置

配置单

系统显示

不得不说 e3 神教嘎嘎香,160 块钱能有这性能,传送门2、CS:GO、半条命、泰拉瑞亚、求生之路2 这种低配游戏毫无压力(虽然我也没试过,但根据配置要求来看是这样的)

再加 300 块预算,x79 + e3 / e5,再装个显卡,妥妥的游戏机,3A 随便打(心有余而预算不足)

再苦也不能苦孩子,再省也不能省电源,本来就是纸壳机箱再爆炸就真成火灾力(悲)新电源价格不能低于 1元/瓦,二手一定要买大牌子,起码质量有一定保证。买杂牌的搞不好会爆炸(物理)

实际上还从家里的废弃电脑上拆了一块 500G 机械硬盘,没有这块硬盘应该也够用。deepin 吃硬盘吃的有点多,我买的 120G 固态装好以后就只剩 46G 了,当然你可以在安装系统分区的时候把备份分区删掉,这样大约能有 90G 左右(但是 swap 分区一定要留!)

装好系统后

系统信息

桌面截图

根据朋友 皮厚鹅 的建议装了 deepin 系统,这次装机没翻车很大程度上要感谢他。

安兔兔跑分

从应用商店找到了安兔兔,顺手跑一下

跑分截图

散热还是买贵了,从开机到跑完分 CPU 温度一直稳定在 27℃,换成萝卜会不会好一些(doge)

总体来说这个电脑我感觉还不错,性价比高的一批,可能唯一不足的点就在于噪音有点大(以及 Linux 系统有亿点麻烦),把纸箱合上噪音问题能得到很大程度上的解决,但是闷久了机箱内部空气会有点热(用手摸稍有点温的程度,我干脆就又打开了)

避坑指南

0. 默认分辨率无法调整

刚装好系统时的分辨率是 1024x768,看起来很难受,设置里也只有这一个选项(网上也有其他情况,总之没法调到合适的分辨率)

针对这一情况我写了一个 shell 脚本来解决:

1
2
3
4
5
#!/bin/sh
cvt 1366 768 60 # 可以换成自己想要的分辨率(如果显示器支持的话),三个数字分别代表 横向分辨率,纵向分辨率 和 帧数
xrandr --newmode "1280x720_60.00" 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync # 'newmode' 后面不用自己填,在第一行命令的返回中有,直接复制粘贴
xrandr --addmode VGA-1 1280x720_60.00 # 不一定是 VGA-1,运行 'xrandr -q' 来确定你应该填什么
xrandr -s 1280x720_60.00

可以把这个脚本写到开机自启动里,我试了几次不管用,每次开机得手动运行

另外,如果刚进桌面就运行脚本,屏幕上方可能出现一条椭圆形……区域,挡住后面的图像。之后再运行一次脚本就会弹出来一个注销通知(就是那个椭圆形区域的罪魁祸首),点 ‘稍后注销’ 就会自己隐出屏幕,椭圆形区域也会随之消失。

1. 网卡驱动安装

Linux 系统大部分是不支持外置网卡的,也就是说,如果你买的主板不带网卡,就没法连接网络

我家里刚好有一个闲置的外置网卡(实际上之前是给那个废弃电脑买的),插上去以后无法识别,网卡的灯也没有亮,所以需要安装网卡驱动

使用 lspci 命令确认外置网卡型号,一般都能在网上搜到驱动,请仔细查看 README 文件(如果有的话),如果安装驱动需要额外安装依赖,可以用手机的 ‘USB 共享网络’ 功能临时供网,不用装驱动,插上就能用(如果共享网络按钮是灰的那就是没插上,检查数据线和 USB 接口)

如果无法用手机供网,可以用u盘传输 deb 包(或者 rpm 包,看你系统支不支持)

另外,有时候实在装不上依赖就先安装驱动试试,万一装上了或者作者写的依赖不完全正确呢(我的网卡驱动要求 build-essential 和 git 依赖,我在另一台电脑上 git clone 了用u盘传过去文件夹,没安 build-essential,也能装好,作者可能是想要 gcc 依赖?deepin 自带了 git 和 gcc)

2. 混乱的 Python 环境

deepin 自带 Python2 和 Python3,可我又想装新版本,所以安装了 MiniConda(我终于知道 conda 有多香了)

国外下载速度太慢,可以从 清华镜像 下载 Anaconda 和 MiniConda

结尾

如果这篇文章帮到你的话,可以请我杯咖啡吗(doge)↓

观前提示:Vercel 和 GitHub 在国内被墙了,没有梯子就歇菜吧

注册域名

首先来到白嫖域名的网站:https://www.dynadot.com/register-your-free-link-domain

检查域名可用性

在搜索框里填上你想要注册的域名,如果可以注册就会是图中的样式,点 Next

会提示你注册账号,按着提示填就行。实测一个账号只能注册一个免费域名,所以这一步是必须的。

注册账号

这里有一个要注意的地方就是在页面最下方 Create Account 上面有三个勾选框,第一个取消掉,第二第三个勾上。

填完以后点 Create Account 就行了。

下一步是验证账号,打开邮箱,它会一次性给你发很多个邮件,找到验证那一封,大概长这样:

验证邮件

点击验证链接,会跳转到浏览器,然后显示网站的登录页面,我们用刚刚创建的账号登录。

登录完成后跳转到账号的 dashboard,在页面的右侧会有个设置安全问题,照着提示填就行。

打开域名管理界面:

域名管理

刚刚注册的链接会显示在这,点进去:

点进域名

往下划,找到 DNS Settings:

DNS-Settings

点进去,在展开的选项中选第一个 Name Servers:

Name-Servers

我们先把这个网页搁置,去搞 CloudFlare。

CloudFlare 设置

打开 CloudFlare 仪表板(如果你还没有账号,点进去页面上的注册链接,两分钟就注册好了)

主页

(接下来开始实机演示就进行不下去了,所以没有配图了)

点击右边的蓝色按钮“添加站点”,跳转到添加站点页面,输入刚刚注册的域名,点击按钮。

跳转到选择方案界面,往下划选择 Free 方案,点击继续。

等待扫描一会,划到下方一堆 DNS 记录(一条一条末尾有个蓝色删除链接的)

把它们全删除(是的,全部删除,最下面的两个点击编辑就会展开,里面也有删除链接,也都删除)

点击继续,准备下一阶段。

回到域名注册的网站

点击继续后会跳转到下一个页面,往下划找到 Name Servers,它们前面有一个 CloudFlare 的图标(橙色的云)

还记得之前离开域名注册的最后一个步骤吗?选中了 Name Servers 然后搁置,现在将 CloudFlare 提供的两个 Name Servers 填上去,填完后点击保存按钮。

接下来是一个等待的步骤,一般几分钟就好了。在注册 CloudFlare 的邮箱收到提示后(或者在主页显示这个域名已经可用后),回到 CloudFlare 仪表板的主页(即之前第一次打开仪表板的链接)。回顾一下之前的图片:

主页

像这样的就是可用了。点进去你的域名,进到 DNS 记录页面:

DNS记录

这是我已经设置好的样子,你的应该是空的,点击图中右上方的添加记录按钮,你需要添加两个,一个需要在左侧的选项中选则“A”,一个是“CNAME”:

A
CNAME

这个页面就可以搁置了,接下来进行 GitHub 部分。

GitHub 设置

(首先你要有一个 GitHub 账号,如果没有就去注册一个)

你需要在 GitHub 上新建一个仓库,然后在本地用 git 连接,这将作为你的网站根目录(不用 git 只用 GitHub 网页版理论上也是可行的,如果你实在用不来 git 的话)

最好再新建一个名为“index.html”的文件,内容是“Hello World”或者其他什么的,这能更好的表示你的网站成功运行。

如果你打算使用框架(包括我的博客框架 Hexo)之类的,最好在下一步 vercel 设置之前就在 GitHub 弄好仓库,这样在 vercel 新建项目的时候可以自动识别,或者在新建项目的时候手动选择框架。

所有 GitHub 设置到此为止(不考虑后续网站开发),接下来是 vercel 部分。

Vercel 设置

进入 vercel 的 dashboard 页面(如果你没有 Vercel 账号,用 GitHub 账号注册一个,然后再回来继续)

点击 Add New,选择 Project:

vercel

然后选中刚刚创建的 GitHub 仓库,点击 import:

GitHub-repo

按照提示完成项目的创建,进入到项目页面,点击上方横向菜单最后一个 Settings,然后点击左侧竖向菜单的 Domains:

Settings-Domains

在输入框中输入新注册的域名,点击 Add:

Add

三个选项自己选择,如果不懂就选第一个。选好以后会跳出来两个配置未确认页面:

config-A
config-CNAME

(因为域名是瞎填的,所以会报错)

接下来进行最后一步,回到 CloudFlare 页面。

回到 CloudFlare

回顾一下 CloudFlare 最后的步骤:

A
CNAME

对照 vercel 的两个未确认配置,填上去,保存,就行了。

打开你的 .link 域名,如果你在这个地方:

Add

没有选第三个的话,www.你的域名.link 和 你的域名.link 都是可以打开的,如果选了第三个就只有后者能打开。

如果不出意外,这时候访问你的网站,就能展示出你 GitHub 仓库(即网站根目录)的内容了。

注:这个博客网站也是这么创建的,用了 Hexo 作为后端,以及 next 主题。如果你也想这样配置你的网站,自己上网查或者联系我获得帮助都可以,这方面网上资料很多的。

0%