日常问题笔记5


TestNG/juit

TestNG是一个功能强大的Java测试框架,以下是关于其环境部署和使用步骤,以及常用的注解和示例:
环境部署
安装JDK:确保已经安装了JDK,并配置好了JAVA_HOME环境变量。
下载并添加TestNG依赖:如果使用Maven构建项目,可以在pom.xml文件中添加TestNG的依赖。例如,对于Maven中央仓库中的TestNG,可以添加如下依赖:

<dependency>
    <groupid>org.testng</groupid>
    <artifactid>testng</artifactid>
    <version>7.4.0</version>
    <scope>test</scope>
</dependency>

如果不使用Maven,也可以手动下载TestNG的jar文件,并添加到项目的类路径中。
配置IDE(可选):许多IDE(如IntelliJ IDEA、Eclipse等)都提供了对TestNG的支持。可以在IDE中安装相应的插件,以便更方便地运行和管理TestNG测试。例如,在IntelliJ IDEA中,可以通过File -> Settings -> Plugins搜索并安装TestNG插件。
使用步骤
1 编写测试代码:使用Java编写测试类,并在其中编写测试方法。可以使用TestNG提供的各种注解来标记这些测试方法。
2 配置testng.xml(可选):如果需要更灵活地配置测试套件,可以创建一个testng.xml文件。该文件可以用来指定测试类、测试方法、测试分组等信息。
3 运行测试:可以通过多种方式运行TestNG测试,包括但不限于以下几种:
• 在IDE中右键点击测试类或测试方法,选择“Run As”-> “TestNG Test”。
• 使用命令行运行TestNG。例如,通过java -cp命令指定TestNG的jar文件和测试类所在的目录,然后运行TestNG。
• 如果配置了Maven项目,可以通过执行mvn test命令来运行TestNG测试。
常用注解
1 @BeforeSuite:在整个测试套件开始之前运行的方法。
2 @AfterSuite:在整个测试套件结束之后运行的方法。
3 @BeforeTest:在当前测试开始之前运行的方法。
4 @AfterTest:在当前测试结束之后运行的方法。
5 @BeforeClass:在当前测试类的第一个测试方法开始之前运行的方法。
6 @AfterClass:在当前测试类的所有测试方法结束之后运行的方法。
7 @BeforeMethod:在每个测试方法开始之前运行的方法。
8 @AfterMethod:在每个测试方法结束之后运行的方法。
9 @Test:标记一个方法为测试方法。还可以接受多个参数来配置测试方法的行为,如dependsOnMethods、alwaysRun、enabled、priority、timeOut等。
示例代码
下面是一个简单的TestNG测试类的示例,演示了如何使用上述注解:

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;

public class CalculatorTest {
    private Calculator calculator;
    @BeforeClass
    public void setUp() {
        calculator = new Calculator();
        System.out.println("这是BeforeClass");
    }
    @BeforeMethod
    public void beforeMethod() {
        System.out.println("这是BeforeMethod");
    }
    @Test
    public void testAdd() {
        Assert.assertEquals(calculator.add(1, 2), 3);
        System.out.println("这是testAdd");
    }
    @AfterMethod
    public void afterMethod() {
        System.out.println("这是AfterMethod");
    }
    @AfterClass
    public void tearDown() {
        System.out.println("这是AfterClass");

JUit


1 下载JUnit:
• 访问JUnit的官方网站(https://junit.org/junit5/)或其他可靠的下载源,下载所需的JUnit版本。通常建议使用最新版本。
2 配置环境变量:
• 将下载的JUnit jar包添加到系统的classpath中。这可以通过在系统环境变量中设置CLASSPATH来实现,或者将jar包放置在项目的类路径下。
• 对于Maven或Gradle项目,可以在pom.xml或build.gradle文件中添加JUnit依赖,以自动管理JUnit库。
3 安装IDE插件(可选):
• 大多数现代的IDE(如IntelliJ IDEA、Eclipse等)都提供了对JUnit的良好支持。可以安装相应的==插件来简化测试过程==
1 创建测试类:
• 创建一个继承自junit.framework.TestCase(JUnit 3)或使用@Test注解(JUnit 4/5)的Java类。
• 测试类通常与被测试类位于相同的包中,但在不同的目录下。
2 编写测试方法:
• 在测试类中编写测试方法,使用@Test注解标记这些方法。
• 测试方法通常没有返回值(void),并且不接受任何参数。
3 使用断言:
• 在测试方法中使用JUnit提供的断言方法来验证测试结果是否符合预期。
• 常用的断言方法包括assertEquals、assertTrue、assertFalse、assertNull、assertNotNull等。
4 运行测试:
• 在IDE中右键点击测试类或测试方法,选择“Run As -> JUnit Test”来运行测试。
• 如果使用命令行,可以通过构建工具(如Maven或Gradle)来运行测试。
常用例子
以下是一个简单的JUnit测试示例,用于测试一个计算两个数和的方法:
1:被测试类(Calculator.java):

public class Calculator {
        public int add(int a, int b) {
            return a + b;
        }
} 

2:测试类(CalculatorTest.java):import org.junit.Test;

import static org.junit.Assert.*;
public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}

js

内置对象的原型:

JavaScript 中的许多内置对象(如 Array, String, Object 等)也有自己的 prototype 属性,你可以扩展这些对象的原型来添加新的方法。

在JavaScript中,prototype 是一个非常重要的概念,它用于实现继承和共享方法。每个函数(包括构造函数)都有一个 prototype 属性,这个属性是一个对象,包含该函数的实例可以共享的属性和方法。

以下是一些关键点:

构造函数与原型:

当你定义一个构造函数时,其实例会继承该构造函数的 prototype 对象上的属性和方法。

function Person(name) {
    this.name = name;
}

Person.prototype.greet = function() {
    console.log('Hello, ' + this.name);
};

const alice = new Person('Alice');
alice.greet(); // 输出: Hello, Alice

原型链:

JavaScript 使用原型链来实现继承。每个对象都有一个内部链接指向它的原型对象,通过这个链接可以访问到原型对象上的属性和方法。

console.log(alice.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true

共享属性和方法:

所有通过同一个构造函数创建的实例共享同一个 prototype 对象上的属性和方法。这意味着如果你修改了 prototype 对象上的属性或方法,所有实例都会受到影响。

Person.prototype.species = 'Homo sapiens';
console.log(alice.species); // 输出: Homo sapiens
Array.prototype.first = function() {
    return this[0];
};
const numbers = [1, 2, 3];
console.log(numbers.first()); // 输出: 1

避免污染全局对象:

通过扩展内置对象的原型,可以方便地为所有实例添加新功能,但要注意不要污染全局对象,以免引起意外的问题

python/go

错误ValueError: Unable to find resource t64.exe表明:

  1. pip在升级过程中缺失关键文件
  2. Windows文件权限限制导致写入失败
  3. Python环境存在残留的旧版本组件

第一步:强制清理并重装pip

# 卸载当前pip
python -m pip uninstall pip setuptools -y

# 手动下载最新get-pip.py
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

# 以管理员权限运行(关键!)
python get-pip.py --force-reinstall

第二步:修复文件权限

  1. 右键点击命令提示符选择以管理员身份运行
  2. 执行磁盘修复:chkdsk /f
  3. 重置Python目录权限:icacls “E:\Python*“ /reset /T /C

第三步:使用备用安装方法

# 通过ensurepip模块修复
python -m ensurepip --upgrade --default-pip

# 指定旧版本pip安装(兼容性模式)
python -m pip install pip==23.3.1 setuptools==58.0.4 --user

ImportError: cannot import name ‘deprecated’ from ‘typing_extensions’ (/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/typing_extensions.py)
pip install –upgrade typing_extensions

报错2:ValueError: Value must be either numerical or a string containing a wildcard
读取表格文件时,报错

ValueError: Value must be either numerical or a string containing a wildcard

解决方法:检查相应文件是否开了筛选,将筛选清除

Go语言中,单目运算符(也称为一元运算符)是指只需要一个操作数的运算符
1:取地址运算符
符号:“&”。
功能:用于获取变量的内存地址。
2:取值运算符
符号:“*”。
功能:用于获取指针所指向的内存地址中保存的数据
3:接收操作符
符号:“<-”。
功能:用于从通道接收数据
4:正负号运算符
符号:“+”和“-”。
功能:可以作为正负号来改变数值的正负

Go语言中的闭包函数
定义:闭包是指函数值与引用它们的词法环境的组合。在Go语言中,闭包通常表现为匿名函数或命名函数,这些函数在其定义的外部作用域中引用了变量

package main
import "fmt"
func main() {
    a := 42
    increment := func() func() int {
        return func() int {
            a++
            return a
        }
    }()
    fmt.Println(increment()) // 输出: 43
    fmt.Println(increment()) // 输出: 44
}

Python中的闭包函数
定义:闭包是在一个函数内部定义的函数,这个内部函数可以引用外部函数的变量,即使外部函数的执行已经结束

def outer_function(outer_var):
    def inner_function(inner_var):
        return outer_var + inner_var
    return inner_function
add_5 = outer_function(5)
print(add_5(10))  # 输出: 15

web/os

Windows
在Windows系统中,可以使用以下命令来刷新DNS缓存:

ipconfig /flushdns

打开命令提示符(以管理员身份运行),然后输入上述命令并按回车键即可。

macOS
在macOS系统中,可以使用以下命令来刷新DNS缓存:

sudo killall -HUP mDNSResponder
打开终端,然后输入上述命令并按回车键。你可能需要输入管理员密码。

Linux
在Linux系统中,不同的发行版可能有不同的方法来刷新DNS缓存。以下是一些常见的方法:

使用 systemd-resolve
对于使用 systemd-resolved 的系统:

sudo systemd-resolve –flush-caches

使用 nscd
对于使用 nscd 的系统:

sudo service nscd restart

sudo /etc/init.d/nscd restart

使用 dnsmasq
对于使用 dnsmasq 的系统:

sudo systemctl restart dnsmasq

或者
sudo /etc/init.d/dnsmasq restart

mac打开跨域浏览器:

open -n /Applications/Google\ Chrome.app/ –args –disable-web-security –user-data-dir=/Users/用户名/MyChromeDevUserData/

ERROR: Could not find a version that satisfies the requirement ultralytics (from versions: none)
解决方法:把外网关了(也就是代理服务器)

快捷键设置:
option和command功能互换
系统截图:shift+option+control+4
系统录屏:shift+option+5

真机元素查找

pip3 install weditor
启动-自动打开端口python3 -m weditor
pip3 install -U uiautodev -i https://pypi.doubanio.com/simple
uiauto.dev

or: python3 -m uiautodev

Mac Aandroid uiautomatorviewer 安装:https://blog.csdn.net/qq_37080417/article/details/140271026

系统还屏蔽了不同的芯片平台的差异(包括x86/ARM,32位/64位等)uname -a
• Mac 的 cpu 类型为 x86,下载 x86 安装包(本机x64:root:xnu-10063.121.3~5/RELEASE_X86_64)
• Mac 的 cpu 类型为 arm,下载arm 安装包
打开终端工具输入:echo $SHELL
如输出结果为/bin/bash,则执行以下命令,打开.bash_profile文件
如输出结果为/bin/zsh,则执行以下命令,打开.zshrc文件

VScode:

点击 + 相当于 将该文件 git add xxx
在文本框内输入提交的注释信息 等价于 git commit -m “xxx”

主机版本的git push需要借助命令行来实现
git push origin HEAD:refs/for/要提交的分支名称

或者直接输入 git gpush (iCoding对上述命令进行了封装)

SOAP是一种基于XML的协议,用于在网络上传输结构化数据。它定义了一组规范,用于描述如何通过HTTP、SMTP等传输协议发送XML消息。
用途:
•通常用于企业级Web服务,如银行、支付、ERP系统等,这些场景需要高度的安全性和事务支持

• REST是一种软件架构风格,而不是一个具体的协议。它基于HTTP协议,通过不同的HTTP方法(如GET、POST、PUT、DELETE)来实现对资源的操作。
用途:
• 适用于移动应用、Web应用和微服务架构等场景,这些场景需要轻量级、高性能的API通信

HIT(Highly Innovative Technology)代表高度创新的技术

VPC(Virtual Private Cloud)虚拟私有云
入网需求:
LB(Load Balancer)负载均衡
出网需求:
NAT网关(Network Address Translation Geteway)

CPU(Central Processing Unit)中央处理单元
GPU(Graphies Processing Unit)图形处理单元
NPU(Neural Processing Unit)神经处理单元

Caddy是一个现代化的Web服务器,它最大特点就是配置简单,易上手,并且自带HTTPS加密。不论是网站托管、反向代理、负载均衡等需求。
Caddy对比Nginx的最大优点是,大幅简化了配置流程 ,可以自动配置Https加密。 Caddy使用go语言编写,Nginx则是C语言。在高吞吐量高负载的极端情况下,nginx的性能略好于Caddy。低负载的日常使用中两者没有明显差距。 因此Caddy十分适合个人博客,小型企业,家庭NAS服务等场景

手机

鸿蒙手机路径:
根目录:
/data
/storage
/system
公共目录:支持文件上传和下载
图库存放路径:
/storage/media/100/local/files/Photo
文档存放路径:
/storage/media/100/local/files/Docs

默认浏览器下载路径:
/storage/media/100/local/files/Docs/Download/com.huawei.hmos.browser

将手机设备录屏文件发送到电脑
hdc file recv /storage/cloud/100/files/Photo/6/VID_1719903085_006.mp4 d:\test.mp4
将手机设备截图发送到电脑
hdc file recv /data/local/tmp/wukong/report/20231010_141610/

红米
拉去相册录屏:adb pull /sdcard/DCIM/ScreenRecorder/ ./Desktop拉去相册截图:adb pull /sdcard/DCIM/Screenshots/ ./Desktop
-javaagent=/Applications/PyCharm CE.app/Contents/bin/JetbrainsCrack-release-enc.jar

华为
视频
adb pull /sdcard/Pictures/Screenshots/SVID_20240322_113846_1.mp4 /Users/v_xulindu/Desktop
截图
adb pull /sdcard/Pictures/Screenshots/Screenshot_20240325_164728.jpg /Users/v_xulindu/Desktop

Mac安装app路径
/Applications/

查看IP地址和mac地址
ifconfig
en0:
ether对应的为Mac地址
inet对应的为IP地址

ascii
(空格) / :@ [` {~

Cuid,即设备串号,或者叫udid

uid,用户id

清除文件的扩展属性
1 将损坏的文件拖到桌面:为了方便操作,将提示已损坏的“Uninstaller”文件拖到桌面上。
2 打开终端:在“应用程序”文件夹中找到并打开“终端”。
3 输入命令:在终端中复制粘贴以下命令:sudo xattr -r -d com.apple.quarantine
4 添加文件路径:在命令后输入一个空格,然后将桌面上的“Uninstaller”文件拖到终端窗口中,这样会自动添加文件的路径。
4 执行命令:按回车键执行命令,然后输入开机密码(密码不会显示),再按回车键。
5 尝试打开文件:完成上述步骤后,尝试双击桌面上的“Uninstaller”文件,看是否能正常打开

常见adb命令:

Adb shell pm list package -3 | grep
adb shell dumpsys activity activities | grep mResumedActivity

下载debug包,配代理,提示网站不安全,一直点同意
Charles:输入网址chls.pro/ssl,会提示下载证书,此时下载的是个.pem 格式的。需要手动更改为.crt 格式
BurpSuite:需要下载或导出Burp Suite的证书。这可以通过在Burp Suite中开启8080端口监听,然后访问127.0.0.1:8080(http://burp)来下载证书。另外,也可以在Proxy的Options中导出证书。使用openssl工具将证书从.der格式转换为.pem格式
手机上在设置搜索安装证书,点击【从存储设备安装】下安装【CA证书】,就可以联网了
下载好chromedriver后,解压放在/usr/local/bin下,即可

iphone8的app提示:未受信任的企业级开发者
打开手机的“设置”->“通用”->找到并点击“描述文件与设备管理”->“描述文件与设备管理”->找到信任的企业级应用->点击“信任”

  1. Android Emulator (Android SDK)
    简介:Google 官方提供的 Android 模拟器,支持命令行操作和 Headless 模式(无图形界面),适合 CI/CD 环境。

特点:

支持多种 Android 版本和设备配置。

可与 adb 工具结合,用于自动化测试。

需要硬件加速(需启用 KVM)。

适用场景:Android 应用测试、持续集成。

链接:Android Developers - 命令行工具

  1. QEMU
    简介:开源的通用硬件模拟器,支持多种架构(如 ARM、x86),可模拟移动设备环境。

特点:

灵活性高,可配置为运行 Android、Linux 或其他系统。

支持 Headless 模式,适合服务器环境。

需手动配置镜像和启动参数。

适用场景:跨架构应用测试、自定义设备模拟。

链接:QEMU 官网

  1. Genymotion Cloud
    简介:基于云的 Android 模拟服务,提供 SaaS 和本地部署方案(需付费)。

特点:

提供预配置的 Android 设备镜像。

支持 REST API 和命令行工具(需订阅企业版)。

可通过 Docker 镜像在本地运行。

适用场景:企业级自动化测试、云原生开发。

链接:Genymotion 官网

  1. Android-x86 with KVM/VirtualBox
    简介:将 Android 移植到 x86 平台的项目,可在虚拟机中运行。

特点:

使用 KVM 或 VirtualBox 运行 Android-x86 镜像。

支持 Headless 模式(需脚本配置)。

性能较好(依赖硬件虚拟化)。

适用场景:需要 x86 架构的 Android 测试。

链接:Android-x86 官网

  1. Docker-Android
    简介:基于 Docker 的 Android 模拟器容器化方案。

特点:

预置 Android 镜像,支持无图形界面模式。

可集成到 CI/CD 流程(如 Jenkins、GitLab CI)。

依赖宿主机的 KVM 加速。

适用场景:容器化环境中的自动化测试。

链接:Docker-Android GitHub

  1. Anbox (Android in a Box)
    简介:在 Linux 系统中以容器方式运行 Android 应用。

特点:

无需完整模拟器,直接集成到宿主系统。

需要安装内核模块(ashmem 和 binder)。

适合运行单个应用而非完整设备模拟。

适用场景:轻量级 Android 应用测试。

链接:Anbox 官网

  1. iOS 模拟器的替代方案
    限制:官方 iOS 模拟器仅支持 macOS,但可通过以下方式间接实现:

远程 macOS 服务器:在 Linux 服务器上通过 SSH/VNC 连接远程 macOS 实例运行 Xcode 模拟器。

云测试服务:如 AWS Device Farm 或 BrowserStack,提供真机测试(非本地部署)。

选择建议:
Android 优先:推荐 Android Emulator 或 Docker-Android,适合开源和自动化。

企业级需求:Genymotion Cloud 提供更稳定的云服务。

跨架构测试:QEMU 是唯一支持非 x86 设备的开源工具。

iOS 测试:需依赖云服务或远程 macOS 环境。

根据实际需求选择工具,并确保服务器支持硬件虚拟化(检查 /proc/cpuinfo 中的 vmx 或 svm 标志

使用xcode开启了webdriveragent的test,ios真机上也显示着automation running,开启了appium后台,使用python脚本运行appium,但是xcode打开的是xcode模拟器

  1. Appium Desired Capabilities 配置错误
    原因:未正确指定真机的UDID或设备类型参数。

解决:

在Python脚本的Desired Capabilities中明确指定:

{
    "platformName": "iOS",
    "platformVersion": "设备iOS版本",
    "deviceName": "设备名称(如iPhone 12)",
    "udid": "设备UDID",  # 关键参数!
    "automationName": "XCUITest",
    "bundleId": "应用Bundle ID(可选)",
    "xcodeOrgId": "开发者团队ID",  # 用于签名
    "xcodeSigningId": "iPhone Developer"
}

获取设备UDID:

# 终端执行
xcrun xctrace list devices
  1. WebDriverAgent 签名问题
    原因:WebDriverAgent未用开发者证书签名,导致无法安装到真机。

解决:

用Xcode打开WebDriverAgent.xcodeproj(路径:/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent)。

在Signing & Capabilities选项卡中:

选择正确的开发者账号(Team)。

修改Bundle Identifier为唯一值(如com.yourname.WebDriverAgent)。

按Cmd+Shift+K清理项目,再按Cmd+B重新构建

  1. Xcode 默认使用模拟器
    原因:Xcode可能因历史设置或缓存默认启动模拟器。

解决:

关闭Xcode。

重启Appium服务并确保指定真机UDID。

强制指定设备类型:

“deviceName”: “iPhone”, # 使用通用名称,Appium将根据UDID自动匹配
4. Appium 或依赖版本过旧
原因:旧版本可能存在真机连接兼容性问题。

解决:

# 更新Appium
npm uninstall -g appium
npm install -g appium@latest

更新WebDriverAgent依赖

cd /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent
./Scripts/bootstrap.sh -d
5. 设备未授权或未解锁
原因:设备锁屏或未信任计算机。

解决:

解锁设备屏幕并保持亮屏。

首次连接时,在设备上点击信任此电脑。

在Xcode中,前往 Window > Devices and Simulators,确认设备已连接。

  1. 端口冲突或Appium服务配置错误
    原因:Appium默认端口(4723)被占用或未正确启动。

解决:

# 终止占用端口的进程
lsof -i :4723
kill -9 <PID>

指定端口启动Appium

appium -p 4723 –allow-insecure=get_server_logs
7. 真机驱动未正确安装
原因:缺少依赖库或工具。

解决:

安装Carthage(若未安装)

brew install carthage

在WebDriverAgent目录安装依赖

cd /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent
carthage bootstrap –platform iOS

  1. 日志分析
    关键步骤:查看Appium日志定位具体错误。
# 启动Appium时开启详细日志
appium --log-level debug

常见日志关键词:

No devices found → UDID错误或设备未连接。

Signing for “WebDriverAgent” requires a development team → 签名问题。

Unable to launch WebDriverAgent → 依赖未安装或端口冲突。

github

在 GitHub 代码库中发布自己的 release

创建新的 Release:

打开你的 GitHub 仓库页面,点击 “Releases” 选项卡,然后点击 “Draft a new release” 按钮。
在 “Tag version” 字段输入你想要发布的版本号,通常遵循语义化版本规范,如 “v1.0.0” 等。
在 “Release title” 字段中输入一个简短的标题,描述该版本的主要特性或修复的问题。
在正文编辑框中,添加更详细的描述信息,如该版本的新增功能、改进和修复的 bug 等,还可以使用 Markdown 语法来格式化描述。
如果你想在 release 中包含二进制文件、文档或其他相关文件,可以通过点击 “Choose your files” 按钮来选择文件,或者直接将文件拖放到指定区域。
确认信息无误后,点击 “Publish release” 按钮发布 release

命令行工具发布
切换到目标分支并确保代码提交:

在你的本地 Git 仓库中,切换到要创建 release 的分支上,例如开发分支或主分支,使用命令 git checkout branch-name,其中 branch-name 是分支名称。
确保你的代码已经提交并且分支是最新的。如果有未提交的更改,可以使用 git add . 将更改的文件加入到暂存区,然后使用 git commit -m “Commit message” 提交这些更改。
创建标签:

使用 git tag -a vX.X.X -m “Release version X.X.X” 命令创建一个标签来标记你的 release,其中 vX.X.X 是版本号,”Release version X.X.X” 是标签的附注信息,可以包括版本号、发布日期、重要更新内容等相关信息。
推送标签到远程仓库:

运行 git push origin vX.X.X 命令将标签推送到远程 Git 仓库,以便其他开发人员可以访问和使用它。
使用持续集成工具发布
选择并配置持续集成工具:

使用持续集成工具,如 Jenkins、Travis CI 或 CircleCI 等,将代码提交到 GitHub 存储库。
在持续集成工具的配置文件中,定义必要的步骤来自动创建版本和发布。
配置上传构建产物:

配置持续集成工具将构建好的软件包或源代码档案上传到 GitHub 的 “Release” 页面。
使用 GitHub Actions 发布
创建工作流程文件:

在存储库中创建一个包含 GitHub Actions 工作流程的 YAML 文件,通常命名为 .github/workflows/release.yml。
定义工作流程步骤:
在工作流程文件中定义相关步骤,如构建、测试和发布版本。
当代码提交到存储库时,GitHub Actions 将自动运行工作流程,并根据定义的步骤进行版本发布

mysql bug
clothes表中的 spec字段 类型:ENUM(’S’,’M’,’L’,’XL’)
order by 中,根据定义顺序,asc 对应是最小的S;desc 对应是最大的XL
min/max 中,根据字符串处理,a-z字母顺序,min 对应是最小的L;max对应是最大的XL

github开启双端验证解决

设置身份验证器应用程序
身份验证器应用程序和浏览器扩展程序(如1Password、Authy、Microsoft Authenticator等)会生成一次性密码,这些密码在登录时被提示时用作验证您身份的第二个因素。
扫描二维码
使用身份验证器应用程序或浏览器扩展程序进行扫描。了解有关启用2FA的更多信息。

下载您的恢复代码
您可以使用恢复代码作为第二个因素进行身份验证,以防您无法访问设备。我们建议使用1Password、Authy或Keeper等安全密码管理器保存它们。
将您的恢复代码保存在安全的地方
如果您丢失了设备并且没有恢复代码,您将无法访问您的帐户。
不要被锁定,配置其他身份验证方法
配置其他身份验证方法将帮助您在丢失设备且没有恢复代码的情况下访问您的帐户。

密钥昵称
不要被锁定,配置其他身份验证方法
配置其他身份验证方法将帮助您在丢失设备且没有恢复代码的情况下访问您的帐户。

密码
密钥是使用触摸、面部识别、设备密码或PIN验证您身份的webauthn凭据。它们可以用作密码替换或2FA方法。

安全密钥
使用带有Touch ID、Windows Hello等或物理安全密钥(如YubiKey)的设备

GitHub移动端
您手机上的GitHub Mobile应用程序可以用作2FA方法。通过安装适用于iOS或Android的GitHub Mobile应用程序并登录您的帐户来启用它。

下载身份验证器应用程序

下载手机版google

安卓机安装Play商店

ios安装app store

搜索:authy或1password

https://www.authy.com/download/

https://1password.com/zh-cn/downloads/android/


文章作者: 读序
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 读序 !
  目录