今天是所有兵工厂球迷既期待又失落的日子,看着加布罚丢十二码那一瞬间,又让我联想起二十年前欧冠决赛的场景,反正很失落,又不知要再等多少年~
今天是所有兵工厂球迷既期待又失落的日子,看着加布罚丢十二码那一瞬间,又让我联想起二十年前欧冠决赛的场景,反正很失落,又不知要再等多少年~
凌晨守着直播静待终场哨响,随着曼城客场 1-1 战平伯恩茅斯,阿森纳提前一轮,时隔二十二年再度夺得英超联赛冠军!
从 1999 年追随阿森纳,走到今天 2026 年 5 月 20 日,球迷生涯已经走过二十七年。自从 2004 年不败夺冠登顶后,球队再度捧起英超奖杯,足足历经了二十二载漫长等候。这二十多年既是球队浮沉前行的岁月,也同时包含我从学生踏入社会,一步步迈入中年的成长历程。
我迷上这个俱乐部的原因是温格教授,我崇拜他的美丽足球和衷敬佩他沉稳务实的经营之道。可惜在金元足球、内部管理动荡、财务压力下,昔日荣光渐渐黯淡,球队一度深陷低谷,屡遭非议。甚至被描绘为「失败者」的典型。我也曾在一次次赛事失利、核心球员离队的遗憾里,满心失落,渐渐对球队失去信心。然而时间证明,坚守初心、沉淀底蕴,终会迎来逆风翻盘的时刻。
我们真的很像,因为我也曾经面对房贷把自己捆绑在工作生活上,无暇顾及梦想。今年我毅然提前还清房贷,在当下低迷的大环境里,能不背负债务已经是幸运的一员。身处中年事业的迷茫阶段,感谢俱乐部历经低谷依旧奋勇向前的模样,给予我重拾勇气、再度出发的动力。
夺冠的喜悦尚未落幕,十天之后欧冠决赛即将打响。我满怀信心,相信球队一定能夺冠,因为 —— 阿森纳是冠军!!!
这是所有节点的根基础。
| 节点 | 说明 |
|---|---|
Object |
所有类的根 |
Node |
所有场景节点基础 |
Window |
窗口节点 |
Viewport |
渲染视口 |
CanvasItem |
2D 可绘制节点基础 |
Node3D |
3D 节点基础 |
Control |
UI 节点基础 |
| 节点 | 作用 |
|---|---|
Node2D |
2D 节点基础 |
Sprite2D |
显示图片 |
AnimatedSprite2D |
2D 动画精灵 |
Polygon2D |
多边形绘制 |
Line2D |
绘制线条 |
Parallax2D |
视差背景 |
Marker2D |
位置标记 |
RemoteTransform2D |
同步 Transform |
| 节点 | 作用 |
|---|---|
CharacterBody2D |
角色控制 |
RigidBody2D |
刚体 |
StaticBody2D |
静态物体 |
Area2D |
区域检测 |
CollisionShape2D |
碰撞体 |
CollisionPolygon2D |
多边形碰撞 |
RayCast2D |
射线检测 |
ShapeCast2D |
形状检测 |
| 节点 | 作用 |
|---|---|
TileMap |
瓦片地图 |
NavigationRegion2D |
导航区域 |
NavigationAgent2D |
AI 寻路 |
NavigationObstacle2D |
导航障碍 |
| 节点 | 作用 |
|---|---|
GPUParticles2D |
GPU 粒子 |
CPUParticles2D |
CPU 粒子 |
Light2D |
2D 灯光 |
PointLight2D |
点光源 |
DirectionalLight2D |
平行光 |
FogVolume |
雾效 |
| 节点 | 作用 |
|---|---|
Node3D |
3D 基础节点 |
MeshInstance3D |
显示模型 |
Sprite3D |
3D 精灵 |
Label3D |
3D 文本 |
Camera3D |
摄像机 |
Marker3D |
标记点 |
| 节点 | 作用 |
|---|---|
CharacterBody3D |
3D 角色 |
RigidBody3D |
刚体 |
StaticBody3D |
静态碰撞 |
Area3D |
区域检测 |
CollisionShape3D |
碰撞体 |
RayCast3D |
射线 |
VehicleBody3D |
车辆 |
VehicleWheel3D |
车轮 |
| 节点 | 作用 |
|---|---|
DirectionalLight3D |
平行光 |
OmniLight3D |
点光 |
SpotLight3D |
聚光灯 |
WorldEnvironment |
全局环境 |
ReflectionProbe |
反射探针 |
Decal |
投影贴花 |
LightmapGI |
光照烘焙 |
VoxelGI |
实时 GI |
| 节点 | 作用 |
|---|---|
NavigationRegion3D |
导航区域 |
NavigationAgent3D |
寻路 AI |
NavigationLink3D |
导航连接 |
NavigationObstacle3D |
障碍 |
| 节点 | 作用 |
|---|---|
GPUParticles3D |
GPU 粒子 |
CPUParticles3D |
CPU 粒子 |
FogVolume |
体积雾 |
AudioStreamPlayer3D |
3D 音效 |
| 节点 | 作用 |
|---|---|
Control |
UI 基础 |
Label |
文本 |
Button |
按钮 |
TextureRect |
图片 |
Panel |
面板 |
ColorRect |
纯色块 |
RichTextLabel |
富文本 |
| 节点 | 作用 |
|---|---|
LineEdit |
单行输入 |
TextEdit |
多行输入 |
CheckBox |
复选框 |
OptionButton |
下拉菜单 |
Slider |
滑块 |
SpinBox |
数值输入 |
| 节点 | 作用 |
|---|---|
HBoxContainer |
横向布局 |
VBoxContainer |
纵向布局 |
GridContainer |
网格布局 |
MarginContainer |
边距 |
CenterContainer |
居中 |
ScrollContainer |
滚动 |
| 节点 | 作用 |
|---|---|
Popup |
弹窗基础 |
PopupMenu |
菜单 |
AcceptDialog |
对话框 |
FileDialog |
文件选择 |
| 节点 | 作用 |
|---|---|
AudioStreamPlayer |
2D 音频 |
AudioStreamPlayer2D |
2D 空间音频 |
AudioStreamPlayer3D |
3D 空间音频 |
AudioListener3D |
音频监听 |
AudioEffect |
音效处理 |
| 节点 | 作用 |
|---|---|
AnimationPlayer |
动画播放 |
AnimationTree |
动画状态机 |
Tween |
补间动画 |
AnimatedSprite2D |
帧动画 |
Skeleton2D |
2D 骨骼 |
Skeleton3D |
3D 骨骼 |
| 节点 | 作用 |
|---|---|
MultiplayerSpawner |
网络生成 |
MultiplayerSynchronizer |
数据同步 |
WebSocketPeer |
WebSocket |
ENetMultiplayerPeer |
ENet 网络 |
| 节点 | 作用 |
|---|---|
Resource |
资源基类 |
PackedScene |
场景资源 |
Shader |
Shader |
Animation |
动画资源 |
Theme |
UI 主题 |
| 节点 | 作用 |
|---|---|
Timer |
定时器 |
HTTPRequest |
HTTP 请求 |
VisibleOnScreenNotifier2D |
可见检测 |
VisibleOnScreenEnabler2D |
自动启停 |
Path2D |
路径 |
PathFollow2D |
路径跟随 |
2026-03-21
顺德欢乐海岸
雨
08:30 出发
天阴沉沉,刚起步就飘起小雨,防水风衣也挡不住凉意。但身边每个人都热情满满,瞬间被点燃,直接开冲!
10:31・行程:7KM・用时:2小时1分
状态超轻松~沿途顺峰山、云鹭湿地、桂畔海风景都很美。可惜雨断断续续,少拍了好多照片。但心情一点没受影响,简单补水补给,继续向前~
13:12・行程:15KM・用时:2小时41 分
走到这里直接心态崩了!伦教突降大暴雨,视线模糊,路面全是积水,鞋子早已湿透。
躲雨时又冷又累,甚至萌生放弃的念头,可看着周围没有便捷交通,只能咬牙坚持。不过这里可以免费进入长鹿乐园,随便踩点看以后值不值得来
14:34・行程:22KM・用时:1小时22 分
在大雨中煎熬一个多小时,终于抵达第三签。幸运的是,雨渐渐停了。河边微风拂过,尽管全身湿透,疲惫却消散大半,补充能量后,重新出发。
15:45・行程:29KM・用时:1小时11 分
雨停了,可鞋子里全是水,每一步都不舒服走完快 30 公里,腿开始发酸。
但行程已经过半,心里反而多了一份必到终点的底气,坚持住,往前冲!
18:23・行程:36KM・用时:2小时38 分
这几公里,全程最煎熬,腿酸到没力气,脚底泡水泡出了水泡,每一步都疼。
傍晚天慢慢暗下来,路上依旧人潮不断,说明我们没有掉队。
只剩最后 4 公里,无论如何都要撑到最后!
19:20・全程:40KM・总时长:约11小时
终于抵达终点!近 11 小时风雨兼程,40 公里圆满完成,累到双腿抬不起来。
心里却超级兴奋、超级骄傲,暴雨、淋雨、水泡、疲惫……全都扛下来了,没有什么能挡住坚持的脚步!
这次顺德线比上次禅城徒步更辛苦,不只是距离更远,还遇上全程阴雨。
沿江风景在雨天少了几分惊艳,却也遇见了很多从没踏过的地方。
同行伙伴超给力,一路互相打气,让这段路更有意义。
风雨无阻,挑战自我,期待下一次,再出发!
1993年,广州客车厂推出广州首款自产双层巴士,并率先投入62、63路线行驶;1998年,广客双层巴士转入28路(天平架—龙洞)继续使用;2001年1月,最后一辆广州牌双层巴士就在28路退役。
还记得初中月票的年代,周末总约上好友去天平架搭 28 路,特意选双层巴士慢悠悠 “游车河”。一晃快三十年,以为早已消失在岁月里的广州牌双层巴士,原来一直都在。
2002 年,一汽巴士将这辆老车翻新后捐赠给广州博物馆,却因馆内暂无合适展陈空间,暂时送回车陂修理厂安放。直到 2012 年再次精心修缮,它才正式入驻广州博物馆。
得知消息后,我特意登上越秀山寻访,终于在仲元楼馆区,与这辆满载回忆的老巴士重逢,一眼便是半生时光。
近期在使用影刀开发自动化流程,发现即便借助影刀的指令体系,深入掌握 Python 第三方库依然至关重要。这些库覆盖了数据处理、可视化、网络请求、自动化等几乎所有编程场景,因此我整理了这份新手入门级的 Python 常用库笔记,包含核心功能、安装方式和极简示例,助力快速上手。
pip install numpy
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4])
# 创建二维数组(矩阵)
arr2 = np.array([[1, 2], [3, 4]])
# 数组运算(向量化,无需循环)
print(arr1 * 2) # 输出:[2 4 6 8]
print(arr2 + arr2) # 输出:[[2 4], [6 8]]
# 矩阵乘法
print(arr2 @ arr2) # 输出:[[7 10], [15 22]]
pip install pandas
import pandas as pd
# 创建DataFrame(模拟表格数据)
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [20, 25, 30],
"城市": ["北京", "上海", "广州"]
})
# 数据查看
print(df.head()) # 查看前n行(默认5行)
# 数据筛选:筛选年龄>22的行
print(df[df["年龄"] > 22])
# 保存为CSV文件
df.to_csv("user_info.csv", index=False)
# 读取CSV文件
df_read = pd.read_csv("user_info.csv")
pip install matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100) # 0到10之间生成100个均匀分布的数
y = np.sin(x)
# 绘制折线图
plt.plot(x, y, color="red", label="sin(x)")
plt.xlabel("X轴") # X轴标签
plt.ylabel("Y轴") # Y轴标签
plt.title("正弦函数曲线") # 标题
plt.legend() # 显示图例
plt.show() # 展示图表
pip install seaborn
import seaborn as sns
import pandas as pd
# 使用内置数据集
tips = sns.load_dataset("tips") # 餐饮小费数据集
# 绘制柱状图(按性别分组,展示平均消费)
sns.barplot(x="sex", y="total_bill", data=tips)
# 绘制热力图(展示变量相关性)
sns.heatmap(tips.corr(numeric_only=True), annot=True, cmap="coolwarm")
pip install requests
import requests
# GET请求(获取网页内容)
response = requests.get("https://www.baidu.com")
response.encoding = "utf-8" # 设置编码
print(response.text[:100]) # 打印前100个字符
# POST请求(模拟表单提交)
data = {"username": "test", "password": "123456"}
response = requests.post("https://httpbin.org/post", data=data)
print(response.json()) # 以JSON格式返回响应
pip install beautifulsoup4
import requests
from bs4 import BeautifulSoup
# 获取网页内容
response = requests.get("https://www.baidu.com")
soup = BeautifulSoup(response.text, "html.parser") # 解析HTML
# 提取指定标签(比如所有a标签的href属性)
a_tags = soup.find_all("a") # 找到所有a标签
for tag in a_tags[:5]: # 打印前5个
print(tag.get("href"), tag.text)
os:操作文件/目录(创建、删除、遍历、路径拼接)、执行系统命令。sys:获取系统参数(如命令行参数、Python 版本)、控制程序退出等。import os
import sys
# os库示例:遍历指定目录下的文件
print(os.listdir(".")) # 列出当前目录所有文件/文件夹
os.makedirs("test_dir", exist_ok=True) # 创建目录(已存在则不报错)
# sys库示例:获取命令行参数
print("Python版本:", sys.version)
print("命令行参数:", sys.argv) # 运行时传入的参数,如python test.py 123,则sys.argv=[test.py, 123]
from datetime import datetime, timedelta
# 获取当前时间
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S")) # 格式化输出:2026-03-11 10:00:00
# 时间加减(比如3天后)
after_3_days = now + timedelta(days=3)
print(after_3_days.strftime("%Y-%m-%d"))
# 解析字符串为时间
time_str = "2026-01-01"
time_obj = datetime.strptime(time_str, "%Y-%m-%d")
print(time_obj)
pip install openpyxl
from openpyxl import Workbook, load_workbook
# 创建新Excel并写入数据
wb = Workbook()
ws = wb.active # 获取活跃工作表
ws["A1"] = "姓名"
ws["B1"] = "年龄"
ws["A2"] = "张三"
ws["B2"] = 20
wb.save("test.xlsx") # 保存文件
# 读取Excel数据
wb = load_workbook("test.xlsx")
ws = wb.active
print(ws["A2"].value) # 输出:张三
print(ws["B2"].value) # 输出:20
# 安装库
pip install playwright
# 安装浏览器驱动(首次使用必须执行,会下载Chrome/Firefox/Safari驱动)
playwright install
from playwright.sync_api import sync_playwright
# 启动浏览器(headless=False 显示浏览器窗口,True 为无头模式)
with sync_playwright() as p:
# 选择浏览器:chromium/firefox/webkit
browser = p.chromium.launch(headless=False)
# 新建页面
page = browser.new_page()
# 访问网页
page.goto("https://www.baidu.com")
# 1. 输入并搜索(定位输入框,输入内容)
page.locator("#kw").fill("Python Playwright")
# 点击搜索按钮
page.locator("#su").click()
# 2. 等待页面加载并提取数据(等待标题出现)
page.wait_for_selector("h3")
# 提取所有搜索结果标题
titles = page.locator("h3").all_text_contents()
print("前5个搜索结果:")
for title in titles[:5]:
print(title)
# 关闭浏览器
browser.close()
page.screenshot(path="baidu.png") 可保存页面截图,便于调试。| 库名 | 核心用途 | 安装命令 |
|---|---|---|
| Scikit-learn | 机器学习(分类、回归、聚类) | pip install scikit-learn |
| TensorFlow/PyTorch | 深度学习(神经网络) | pip install tensorflow / pip install torch |
| Flask/Django | Web 开发(轻量/全栈框架) | pip install flask / pip install django |
| Pillow | 图片处理(裁剪、滤镜、格式转换) | pip install pillow |
| PyAutoGUI | 键鼠自动化(模拟点击、输入) | pip install pyautogui |
2025.9.20
佛山潭洲国际会展中心
雨
国内品牌齐聚,微缩场景细节拉满,氛围超热烈。其中网上大名鼎鼎的“火车长鸣”的展区人气最高。
主馆超 2000 台改装车集结,JDM、欧系超跑、宽体改装全覆盖。外场漂移赛轮胎冒烟、引擎轰鸣,还有港车北上车队交流,文化氛围拉满,视觉和听觉双重震撼。
作为从 Vue 1.0 一路使用过来的开发者,Vue 3.0 并非简单的版本迭代,而是在核心架构、性能、开发体验上的全面升级,同时兼容了 2.x 的大部分核心思想,既保留了我们熟悉的开发范式,又解决了 2.x 长期存在的痛点。以下从核心架构、语法特性、性能优化、工程化等维度,结合 2.x 对比梳理关键变化。
Vue 2.x 采用「选项式 API」,将代码按 data、methods、computed、watch、生命周期钩子 等选项划分,优点是上手简单,但存在明显痛点:
data(状态)、methods(方法)、watch(监听)、mounted(初始化)等多个选项中,组件越大,逻辑越难追踪;Vue 3.0 推出「组合式 API」,核心是 setup 函数(组件的入口),允许按业务逻辑维度组织代码,而非按选项类型:
<template>
<div>{{ count }}</div>
<button @click="increment">+1</button>
</template>
<script setup>
// Vue 3.0 组合式 API(<script setup> 语法糖)
import { ref, computed, onMounted } from 'vue'
// 状态定义(替代 2.x 的 data)
const count = ref(0)
// 方法定义(替代 2.x 的 methods)
const increment = () => {
count.value++
}
// 计算属性(替代 2.x 的 computed)
const doubleCount = computed(() => count.value * 2)
// 生命周期(替代 2.x 的 mounted)
onMounted(() => {
console.log('组件挂载完成,count 初始值:', count.value)
})
</script>
核心优势:
useUser()、useRequest()),替代 mixins,解决命名冲突和依赖问题;兼容说明:
Vue 2.x 基于 Object.defineProperty 实现响应式,存在天然限制:
arr[0] = 1)和数组长度修改(如 arr.length = 0),需通过 Vue.set/this.$set 或数组变异方法(push/splice)触发更新;this.obj.newKey = 1),同样需要 Vue.set/this.$delete;Vue 3.0 改用 ES6 的 Proxy 实现响应式,彻底解决上述问题:
$set/$delete;Ref 和 Reactive 两种响应式方式:
ref:用于基础类型(字符串、数字等),通过 .value 访问(模板中自动解包,无需 .value);reactive:用于对象/数组,返回代理对象,直接访问属性即可。示例对比:
// Vue 2.x
export default {
data() {
return {
arr: [1, 2, 3],
obj: { name: 'Vue2' }
}
},
methods: {
updateData() {
// 无效:无法监听数组下标修改
this.arr[0] = 100
// 有效:需用 $set
this.$set(this.arr, 0, 100)
// 无效:无法监听对象新增属性
this.obj.age = 3
// 有效:需用 $set
this.$set(this.obj, 'age', 3)
}
}
}
// Vue 3.0(Composition API)
import { ref, reactive } from 'vue'
const arr = ref([1, 2, 3])
const obj = reactive({ name: 'Vue3' })
const updateData = () => {
// 有效:原生支持数组下标修改
arr.value[0] = 100
// 有效:原生支持对象新增属性
obj.age = 3
}
Vue 3.0 优化了组件实例的内存占用,同场景下内存使用减少约 50%。
Vue 3.0 保留了 2.x 的生命周期概念,但命名略有调整(Composition API 中),且新增 setup 替代 beforeCreate 和 created:
| Vue 2.x | Vue 3.0(Composition API) | 说明 |
|---|---|---|
| beforeCreate | setup(开始) | setup 执行时,组件实例未创建 |
| created | setup(结束) | setup 执行完,组件实例已创建 |
| beforeMount | onBeforeMount | 挂载前 |
| mounted | onMounted | 挂载后 |
| beforeUpdate | onBeforeUpdate | 更新前 |
| updated | onUpdated | 更新后 |
| beforeDestroy | onBeforeUnmount | 卸载前(命名更语义化) |
| destroyed | onUnmounted | 卸载后(命名更语义化) |
更灵活的 v-model:Vue 2.x 中 v-model 本质是 value + input 事件,3.0 支持自定义绑定属性和事件,且支持多个 v-model:
<!-- Vue 2.x:仅能绑定一个 v-model,且固定 value/input -->
<Child v-model="name" />
<!-- Vue 3.0:支持多个 v-model,自定义属性和事件 -->
<Child v-model:name="name" v-model:age="age" />
filter:Vue 3.0 废弃了 2.x 的 filter 过滤器,推荐用计算属性或方法替代(减少 API 复杂度)。Vue 2.x 的全局 API(如 Vue.component、Vue.directive)会污染全局环境,3.0 改为「实例化 API」:
// Vue 2.x
import Vue from 'vue'
Vue.component('MyComponent', { /* ... */ })
Vue.directive('my-dir', { /* ... */ })
new Vue({ el: '#app' })
// Vue 3.0
import { createApp } from 'vue'
const app = createApp({ /* 根组件 */ })
app.component('MyComponent', { /* ... */ })
app.directive('my-dir', { /* ... */ })
app.mount('#app')
优势:多个 Vue 实例可独立配置,避免全局配置冲突(如多应用嵌入场景)。
Vue.prototype:改用 app.config.globalProperties 挂载全局属性;$on/$off/$once:移除实例事件总线,推荐用第三方库(如 mitt)替代;filters:用计算属性/方法替代;mixins:用 Composition API 的组合函数替代。@vue/compat 兼容包,可临时兼容 2.x 代码;Vue.set/$set、Vue.delete/$delete(3.0 无需);beforeDestroy → onBeforeUnmount);filter 为计算属性/方法;<script setup lang="ts">,充分利用 3.0 的 TS 优势。Object.defineProperty 无法监听数组/对象新增属性的痛点,性能和易用性大幅提升;2025-03-22
文华公园
晴
08:24 出发
现场人山人海。之前我还想走50公里不是普通的运动量,参加的人应该不多,结果发现上到满头白发的老人、下到三岁小孩都来参加,看来我低估了大家对这个活动的积极性。
好,从此刻正式开始!
09:53・行程:5KM
开局像过年游花市,大家都是一个挨一个,沿途的路都围蔽了。就这样慢吞吞地走了1.5小时。心想,这样走岂不是晚上十点都走不完?!来到升平里人更多了(是我见过这个地方人最多的一次),赶紧找签到点盖章离开。
11:48・行程:12.8KM
这段感觉人少了不少,原因其实很多人只是为了打个卡发发朋友圈,(毕竟 5km 对现在的人还是极限)。太阳也出来营业了,还好沿途绿道大树也比较多。这一段是考验耐心的,因为要经过一片老旧的工业区,所以风景一般,路边的大货车经过会扬起一片灰尘……
13:24・行程:17.8KM
沿汾江河边都是新打造的绿道,风景很不错。沿途都是卖小吃、饮料的小贩。也经过了我一直想去的王借岗公园,又帮我在百度地图点亮了一个片区。
14:29・行程:20.5KM
距离不远,但人走了一个上午已经有点累,所以走到绿岛湖就在湖边休整了20分钟。在这里汇合身穿浅蓝色衣服的"三水线"驴友,这些都是大神人,因为他们的线路比我们多出14km,也就是说别人一大早7点就已经出发,并且走得很快。其实禅城线算是“作弊”线路,因为它全场是36km,是全部线路中最短的。
15:25・行程:24.5KM
这段就开始拼耐力了,阳光猛烈,大树比较少,脚步也渐渐慢下来。不过令我意外的是智慧公园原来很漂亮,又找多了一个休闲的地方。
16:46・行程:30.5KM
如果认真计算距离和时间,就发现我速度快了很多。不,我没作弊(已经看到很多人骑共享单车跑了),其实原因是身边的队友也受不了骑车去。我只是自己发挥真正的实力 ^_^。PS沿线的公交线路都挤满了人,其实这不是比赛,尽力而为就好。
18:12・全程:36KM
突然想起十年前那次30公里徒步,走完整个人都废了,所以这次出发前一直怀疑自己到底行不行。现在看来,身体确实比以前能扛了,但更关键的是——只要咬咬牙,好像也没什么走不完的路。