Compare commits
2 Commits
5d682e6b30
...
b3275c206e
Author | SHA1 | Date | |
---|---|---|---|
b3275c206e | |||
00980ab894 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
output/
|
output/
|
||||||
|
test/
|
||||||
后端学习/本地记录.md
|
后端学习/本地记录.md
|
||||||
|
44
后端学习/本地记录.md
44
后端学习/本地记录.md
@ -1,44 +0,0 @@
|
|||||||
# 技巧
|
|
||||||
|
|
||||||
## 修改git提交日期:
|
|
||||||
|
|
||||||
用git bash here打开,不要cmd终端。
|
|
||||||
|
|
||||||
1.先提交本地修改
|
|
||||||
|
|
||||||
2.git rebase -i --root =》然后将需要修改的pick改为edit
|
|
||||||
|
|
||||||
3.GIT_AUTHOR_DATE="2025-04-08T18:11:42" \
|
|
||||||
GIT_COMMITTER_DATE="2025-04-08T18:11:42" \
|
|
||||||
git commit --amend --no-edit --date "2025-04-08T18:11:42"
|
|
||||||
|
|
||||||
注意这两个时间都要设置,删掉--no-edit可以编辑commit信息。
|
|
||||||
|
|
||||||
4.git rebase --continue 继续编辑下一个提交记录
|
|
||||||
|
|
||||||
5.git push --force origin master 提交修改到远程。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
git rebase --abort 如果中途不想修改了,可以退出操作
|
|
||||||
|
|
||||||
git log --pretty=fuller -1 ,查看AuthorDate和CommitDate是否一致。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
编辑远程Gitea中的活动记录
|
|
||||||
|
|
||||||
docker exec -it gitea bash
|
|
||||||
sqlite3 /data/gitea/gitea.db
|
|
||||||
|
|
||||||
SELECT id, name, created_unix FROM repository WHERE name = '你的仓库名'; =>获得仓库的id
|
|
||||||
SELECT id, repo_id, created_unix FROM action where repo_id=19; =>获得该仓库的所有action
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
3
后端学习/测试.md
Normal file
3
后端学习/测试.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
测试
|
||||||
|
|
||||||
|
小明今天15岁了,它是天水小学上学。
|
@ -725,6 +725,12 @@ net start winnat
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- **windows下部署,端口安全问题**
|
||||||
|
|
||||||
|
Windows 对低端口(<1024)的特殊保护,非管理员或没有对应防火墙放行的进程,可能被系统直接拦截或拒绝绑定。因此这种需要手动在防火墙开个入站规则(类似linux云服务器的设置开放端口),或者干脆用一个高端口(>1024)来映射。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- **构建镜像失败**
|
- **构建镜像失败**
|
||||||
|
|
||||||
```text
|
```text
|
||||||
|
@ -1292,3 +1292,30 @@ server {
|
|||||||
```
|
```
|
||||||
|
|
||||||
root 要指定静态文件根目录,如果是docker部署,一定要写**容器内**的位置;`index.html` 这个文件是`/usr/share/nginx/html`目录下的。
|
root 要指定静态文件根目录,如果是docker部署,一定要写**容器内**的位置;`index.html` 这个文件是`/usr/share/nginx/html`目录下的。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
**坑点:**
|
||||||
|
|
||||||
|
如果要上传文件,可能会报413错误:单次请求的 整体 body 大小超限(默认1MB)
|
||||||
|
|
||||||
|
若后端需要解析比较耗时,还可能报503错误:超时间限制(默认60秒)
|
||||||
|
|
||||||
|
业务涉及 **大文件上传** 或 **长时间任务**,务必调整这些配置!如:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://ai-rag-knowledge-app:8095;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
|
||||||
|
client_max_body_size 50M; # 允许上传 50MB
|
||||||
|
# 添加代理超时设置(单位:秒)
|
||||||
|
proxy_connect_timeout 3600s;
|
||||||
|
proxy_send_timeout 3600s;
|
||||||
|
proxy_read_timeout 3600s;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -69,8 +69,6 @@ DNS解析:可能需等待几分钟生效
|
|||||||
head -n 100 文件名
|
head -n 100 文件名
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- **touch** 新建文本文件,如touch /home/hello.py 将在home 文件夹下新建hello.py
|
- **touch** 新建文本文件,如touch /home/hello.py 将在home 文件夹下新建hello.py
|
||||||
|
|
||||||
- **ls** 列出所有文件,但默认只是显示出最基础的文件和文件夹,如果需要更详细的信息,则使用ls -la,这将列出包括隐藏文件在内的所有文件和文件夹,并且给出对应的权限、大小和日期等信息。
|
- **ls** 列出所有文件,但默认只是显示出最基础的文件和文件夹,如果需要更详细的信息,则使用ls -la,这将列出包括隐藏文件在内的所有文件和文件夹,并且给出对应的权限、大小和日期等信息。
|
||||||
@ -199,6 +197,8 @@ DNS解析:可能需等待几分钟生效
|
|||||||
lsof -i :80 #查看 80 端口上的进程,或者判断80端口是否被占用!
|
lsof -i :80 #查看 80 端口上的进程,或者判断80端口是否被占用!
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`netstat -ano | findstr :8080`这是windows cmd下检查端口占用的命令
|
||||||
|
|
||||||
- **usermode** 修改用户账户信息的命令
|
- **usermode** 修改用户账户信息的命令
|
||||||
|
|
||||||
```text
|
```text
|
||||||
@ -1215,7 +1215,7 @@ nano docker-compose.yml #创建并编辑文件
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```text
|
```yml
|
||||||
services:
|
services:
|
||||||
qbittorrent:
|
qbittorrent:
|
||||||
image: linuxserver/qbittorrent
|
image: linuxserver/qbittorrent
|
||||||
@ -1239,6 +1239,19 @@ services:
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
有个bug!qBittorrent 登录遇到 **unauthorized**的解决方法:
|
||||||
|
|
||||||
|
1、先停止容器docker compose down
|
||||||
|
|
||||||
|
2、进入配置文件夹config,编辑qBittorrent.conf在文末加上:
|
||||||
|
|
||||||
|
```text
|
||||||
|
WebUI\HostHeaderValidation=false
|
||||||
|
WebUI\CSRFProtection=false
|
||||||
|
```
|
||||||
|
|
||||||
|
3.如果还是进不去,在地址后端添加'/'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 内网穿透
|
## 内网穿透
|
||||||
|
@ -391,9 +391,7 @@ AI对结构预测不准, 特征
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
为什么要等随机网络稳定?这里其实是一个假设,稳定下来:RWP 在足够长时间后满足 Birkhoff 点态遍历定理,节点的取样分布趋于稳态,并且对每个时刻都是同分布!!!然后可以应用那个结论。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
106
科研/草稿.md
106
科研/草稿.md
@ -1,54 +1,98 @@
|
|||||||
**平滑(Smoothing)**
|
### 收缩矩阵的逐次特征值提取方法
|
||||||
在时间序列分析中,“平滑”指的是用一种加权平均的方法,将原始序列中的随机波动(噪声)滤掉,突出其潜在的趋势和周期成分。指数平滑尤为典型:它对所有历史观测值 XtX_t 施加指数衰减的权重,使得离当前越近的数据权重越大、越远的数据权重越小,从而得到一条更为“平滑”的序列 StS_t。
|
|
||||||
|
|
||||||
- **单指数平滑(SES)**
|
#### 1. 初始矩阵性质
|
||||||
|
对于实对称矩阵 $A \in \mathbb{R}^{N \times N}$,当满足:
|
||||||
|
- 非对角元素 $a_{ij}$ 独立同分布
|
||||||
|
- 均值 $\mathbb{E}[a_{ij}] = \mu$
|
||||||
|
- 方差 $\text{Var}(a_{ij}) = \sigma^2$
|
||||||
|
- 对角元素 $a_{ii} = 0$
|
||||||
|
|
||||||
St=α Xt+(1−α) St−1,0<α<1 S_t = \alpha\,X_t + (1-\alpha)\,S_{t-1},\quad 0<\alpha<1
|
其最大特征值 $\lambda_1$ 服从高斯分布:
|
||||||
|
$$
|
||||||
|
\mathbb{E}[\lambda_1] (N-1)\mu + \frac{\sigma^2}{\mu}, \quad \text{Var}(\lambda_1) = 2\sigma^2
|
||||||
|
$$
|
||||||
|
|
||||||
其中,StS_t 是时刻 tt 的平滑值,α\alpha(平滑系数)控制新旧信息的权重比例。
|
#### 2. 收缩操作定义
|
||||||
|
通过秩一修正实现矩阵收缩:
|
||||||
|
$$
|
||||||
|
A^{(k+1)} = A^{(k)} - \lambda_k u_k u_k^T
|
||||||
|
$$
|
||||||
|
其中:
|
||||||
|
- $\lambda_k$ 为当前矩阵 $A^{(k)}$ 的最大特征值
|
||||||
|
- $u_k$ 为对应特征向量(单位范数)
|
||||||
|
- 初始条件 $A^{(1)} = A$
|
||||||
|
|
||||||
- **双指数平滑(Holt)**
|
#### 3. 特征值递推关系
|
||||||
在 SES 的基础上,再引入一个“趋势分量” TtT_t:
|
第 $k$ 大特征值可通过收缩矩阵提取:
|
||||||
|
$$
|
||||||
|
\lambda_k(A) = \lambda_1(A^{(k)})
|
||||||
|
$$
|
||||||
|
|
||||||
{Lt=α Xt+(1−α)(Lt−1+Tt−1)Tt=β (Lt−Lt−1)+(1−β) Tt−1\begin{cases} L_t = \alpha\,X_t + (1-\alpha)(L_{t-1}+T_{t-1}) \\[6pt] T_t = \beta\,(L_t - L_{t-1}) + (1-\beta)\,T_{t-1} \end{cases}
|
若收缩后矩阵 $A^{(k)}$ 保持:
|
||||||
|
- 非对角元素均值 $\mu_k$
|
||||||
|
- 方差 $\sigma_k^2$
|
||||||
|
|
||||||
这里 LtL_t 是“平滑后的水平(level)”,TtT_t 是“平滑后的趋势(trend)”,β\beta 是趋势平滑系数。
|
则特征值统计量满足:
|
||||||
|
$$
|
||||||
|
\begin{cases}
|
||||||
|
\mathbb{E}[\lambda_k] = (N-k)\mu_k + \frac{\sigma_k^2}{\mu_k} \\
|
||||||
|
\text{Var}(\lambda_k) = 2\sigma_k^2
|
||||||
|
\end{cases}
|
||||||
|
$$
|
||||||
|
|
||||||
- **三指数平滑(Holt–Winters)**
|
#### 4. 实现步骤
|
||||||
进一步加入季节性分量 StS_t:
|
1. **初始化**:设 $A^{(1)} = A$,$k=1$
|
||||||
|
2. **迭代过程**:
|
||||||
|
```python
|
||||||
|
while k <= K:
|
||||||
|
# 计算当前最大特征对
|
||||||
|
λ, u = eigsh(A^{(k)}, k=1)
|
||||||
|
|
||||||
|
# 记录统计量
|
||||||
|
λ_sequence[k] = λ
|
||||||
|
|
||||||
|
# 执行收缩
|
||||||
|
A^{(k+1)} = A^{(k)} - λ * u @ u.T
|
||||||
|
|
||||||
|
# 验证新矩阵性质
|
||||||
|
μ_k = np.mean(A^{(k+1)}[off_diag])
|
||||||
|
σ²_k = np.var(A^{(k+1)}[off_diag])
|
||||||
|
|
||||||
|
k += 1
|
||||||
|
|
||||||
{Lt=α (Xt/St−m)+(1−α)(Lt−1+Tt−1)Tt=β (Lt−Lt−1)+(1−β) Tt−1St=γ (Xt/Lt)+(1−γ) St−m\begin{cases} L_t = \alpha\,(X_t/S_{t-m}) + (1-\alpha)(L_{t-1}+T_{t-1}) \\[4pt] T_t = \beta\,(L_t - L_{t-1}) + (1-\beta)\,T_{t-1} \\[4pt] S_t = \gamma\,(X_t/L_t) + (1-\gamma)\,S_{t-m} \end{cases}
|
$\sigma_1$.
|
||||||
|
|
||||||
其中 mm 是季节周期长度,γ\gamma 是季节平滑系数。
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
**预测逻辑**
|
|
||||||
指数平滑系列方法的核心假设是“未来的值可以用当前估计的水平、趋势、季节性分量线性组合”来近似。
|
|
||||||
|
|
||||||
1. **单指数平滑** 预测:
|
|
||||||
|
|
||||||
X^t+1=St \hat X_{t+1} = S_t
|
您说得对,在奇异值分解(SVD)中,通常用 **u** 和 **v** 来表示左右奇异向量。以下是修正后的Markdown格式表示:
|
||||||
|
|
||||||
即,预测值等于最后一个时刻的平滑值。
|
对于随机网络矩阵 `A`,设奇异值从大到小依次为 `{\sigma _1},{\sigma _2}, \ldots ,{\sigma _n}`,对应的左、右奇异向量分别为 ${u}_1, {u}_2, \ldots, {u}_n$ 和 ${v}_1, {v}_2, \ldots,{v}_n$。
|
||||||
|
|
||||||
2. **双指数平滑** 预测:
|
或者更紧凑地表示为:
|
||||||
|
`A = \sum_{i=1}^n \sigma_i \mathbf{u}_i \mathbf{v}_i^\top`
|
||||||
|
|
||||||
X^t+h=Lt+h Tt \hat X_{t+h} = L_t + h \, T_t
|
需要其他数学符号表示或格式调整可以随时告诉我!
|
||||||
|
|
||||||
意味着:水平分量加上 hh 倍的趋势分量。
|
|
||||||
|
|
||||||
3. **三指数平滑** 预测:
|
|
||||||
|
|
||||||
X^t+h=(Lt+h Tt)×St+h−m⌊(h−1)/m⌋ \hat X_{t+h} = \bigl(L_t + h\,T_t\bigr)\times S_{t+h-m\lfloor (h-1)/m\rfloor}
|
|
||||||
|
|
||||||
即在双平滑的结果上,再乘以对应的季节系数。
|
|
||||||
|
|
||||||
整体来看,指数平滑的预测逻辑就是:
|
|
||||||
|
|
||||||
- **水平分量(Level)** 反映序列的基准水平;
|
|
||||||
- **趋势分量(Trend)** 反映序列的线性增长或下降趋势;
|
|
||||||
- **季节分量(Seasonality)** 反映序列的周期波动;
|
|
||||||
- 将它们按照简单的线性公式“拼装”起来,就得到对未来点的估计。
|
|
||||||
|
|
||||||
这种结构使得指数平滑既简单易算,又能灵活捕捉不同的时序特征。
|
不必大动干戈,只要把“等号”换成“近似”等价写法,或显式加上误差项,就足够严谨。下面给出两种常见做法,你任选其一即可——
|
||||||
|
|
||||||
|
| 写法 | 建议格式 | 说明 |
|
||||||
|
| -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||||
|
| **近似号写法** | E[σ1]≈(N−1)μ+v+σ2μ,Var[σ1]≈2σ2E[\sigma_1]\approx (N-1)\mu+v+\dfrac{\sigma^2}{\mu},\qquad \operatorname{Var}[\sigma_1]\approx 2\sigma^2 | 直接用 “≈” 表明这是 N→∞N\to\infty 的主导项;与前面“可在 O(1/N)O(1/\sqrt N) 范围内逼近高斯”完全呼应。 |
|
||||||
|
| **误差项写法** | E[σ1]=(N−1)μ+v+σ2μ+O (1N),Var[σ1]=2σ2+O (1N)E[\sigma_1]=(N-1)\mu+v+\dfrac{\sigma^2}{\mu}+O\!\left(\tfrac{1}{N}\right),\qquad \operatorname{Var}[\sigma_1]=2\sigma^2+O\!\left(\tfrac{1}{N}\right) | 把小量显式写成 O(1/N)O(1/N)。这样保留等号,同时说明误差级别,更“硬核”一些。 |
|
||||||
|
|
||||||
|
> **为什么推荐修改?**
|
||||||
|
>
|
||||||
|
> - 你的正文已经说“在 O(1/N)O(1/\sqrt N) 的范围内可被高斯分布逼近”,说明后续公式仅是渐近主项。直接用 “=” 容易让读者误以为 **完全等于** 主项。
|
||||||
|
> - 只要在公式里加 “≈” 或 “+O(\cdot)” 就能避免歧义,而且和引用的 F & K 定理保持一致。
|
||||||
|
|
||||||
|
其余内容(条件、符号、文字描述)都没问题,不必再改。
|
||||||
|
|
||||||
|
$\approx$
|
||||||
|
43
项目/拼团交易系统.md
43
项目/拼团交易系统.md
@ -1,6 +1,6 @@
|
|||||||
# 拼团交易系统
|
# 拼团交易系统
|
||||||
|
|
||||||
## 系统启动说明
|
## 系统备忘录
|
||||||
|
|
||||||
本系统涉及微信和支付宝的回调。
|
本系统涉及微信和支付宝的回调。
|
||||||
|
|
||||||
@ -1467,7 +1467,7 @@ if (openid != null) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 独占锁和无锁化场景
|
### 独占锁和无锁化场景(防超卖)
|
||||||
|
|
||||||
#### 独占锁
|
#### 独占锁
|
||||||
|
|
||||||
@ -1789,3 +1789,42 @@ output {
|
|||||||
|
|
||||||
打开 Kibana:浏览器访问 `http://localhost:5601`,新建 索引模式(如 `app-log-*`),即可在 Discover/Visualize 中查看与分析日志。
|
打开 Kibana:浏览器访问 `http://localhost:5601`,新建 索引模式(如 `app-log-*`),即可在 Discover/Visualize 中查看与分析日志。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 防止重复下单
|
||||||
|
|
||||||
|
**外部交易单号设计**
|
||||||
|
|
||||||
|
- **统一跟踪**:对接小商城时,将外部交易单号(`out_trade_no`)与小商城下单时生成的 `order_id` 保持一致,方便全链路追踪。
|
||||||
|
- **内部独立**:拼团系统内部仍保留自己的 `order_id`,互不冲突。
|
||||||
|
|
||||||
|
在高并发支付场景中,确保同一用户对同一商品/活动只生成一条待支付订单,常用以下两种思路:
|
||||||
|
|
||||||
|
#### 业务维度复合唯一索引 + 冲突捕获重试
|
||||||
|
|
||||||
|
1. **查询未支付订单**
|
||||||
|
- 在创建订单时,先根据业务维度(如 `userId + goodId + activityId`)查询“已下单但未支付”的订单;
|
||||||
|
- 若存在,则直接返回该订单,避免二次创建。
|
||||||
|
2. **复合唯一索引约束**
|
||||||
|
- 在订单表中对业务维度字段(`userId`、`goodId`、`activityId` 等)添加**复合唯一索引**;
|
||||||
|
- 高并发下若出现并行插入,后续请求因违反唯一约束抛出异常;
|
||||||
|
- 捕获异常后,再次查询并返回已创建的订单,实现幂等。
|
||||||
|
3. **分布式锁保障(可选)**
|
||||||
|
- 针对同一用户加分布式锁(例如 `lock:userId:{userId}`),确保只有**首个请求能获取锁**并创建订单;
|
||||||
|
- 后续请求等待锁释放或直接返回“订单处理中”,随后再次查询订单状态。
|
||||||
|
|
||||||
|
#### 幂等 Key 模式
|
||||||
|
|
||||||
|
1. **生成幂等 Key**
|
||||||
|
- 前端进入支付流程时调用接口(`GET /api/idempotency-key`),后端生成全局唯一 ID(UUID 或雪花 ID)返回给前端;
|
||||||
|
- 或者外部系统(如小商城)传来唯一的外部交易单号(`out_trade_no`),**天生作为幂等Key。**
|
||||||
|
- 前端将该 Key 存入内存、LocalStorage 或隐藏表单字段,直至支付完成或过期。
|
||||||
|
2. **请求携带幂等 Key**
|
||||||
|
- 用户点击“下单”时,调用 `/create_pay_order` 接口,需在请求体中附带 `idempotencyKey`;
|
||||||
|
- 服务端根据该 Key 判断:若数据库中已有相同 `idempotency_key`,直接返回该订单,否则创建新订单。
|
||||||
|
3. **数据库持久化 & 唯一约束**
|
||||||
|
- 在订单表中新增 `idempotency_key` 列,并对其增加唯一索引;
|
||||||
|
- 双重保障:前端重复发送同一 Key,也仅能插入一条记录,彻底避免重复下单。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user