今日天晴 宜休息。
开学了,又是换实验室。不过是另外一个社团。
去年经历的有点多,今年开年就显得平平无奇。
开始有点摆了。
其实工作还是挺多的,一方面是社团的日常工作,另外一方面就是以前欠下的工作。
比赛的话已经有点不想打了。到了大二下的这个时期,很多东西也差不多想明白了一点。
其实最主要的就还是对于很多需要“拼劲”作为前置条件的事情,我已经有了一点排斥。
节奏就慢慢的慢了下来。
友谊方面还是不行,虽然很多地方都能融进去,但是还是和以前一样,一但要深交就有某种恐惧,客观上来说这种应该是潜意识的影响,很多时候,我都不知道为什么就已经做出了把别人推出我舒适圈的行为。
可能还是打游击式的在各个不同程度的友谊圈子之间来回游走满足自己的情绪需要。
我还是挺自私的一个人。不是啥好人。
但是能够彻底的当一个自私的人也没什么不好的,对别人也会做一些筛选,自己会舒服一点,也不会影响看不惯我的人。
我就是这样小心翼翼的活着。
没有很强烈的想要获得什么的欲望,也没有什么很想实现的理想,更没有什么必须完成的使命。
我就是这样简简单单的活着,这样也没什么不好的。
我到现在已经想明白了,社团的工作能推就推掉,尽量降低在社团的话语权,比赛已经报名的打完,然后答应打的打完,之后就不打新比赛了。
剩下的时间就自己学点想学的,有空的时候出去转转,和别人一块到处玩,吃点好吃的。这样已经是来之不易的幸福。
希望我们都好好的。
在 VScode 中配置前端代码格式化
在 VScode 中配置前端代码格式化,可以通过以下几个步骤进行:
1. 安装 Prettier 插件
Prettier 是一个流行的代码格式化工具,支持很多编程语言,包括 JavaScript、TypeScript、HTML 和 CSS。
- 打开 VScode,点击左侧的 扩展(Extensions)图标,搜索并安装 Prettier - Code formatter。
2. 配置 Prettier
通过修改 .vscode/settings.json 文件来配置 Prettier 格式化选项:
在 React 项目的根目录下创建(如果没有的话)一个
.vscode/settings.json文件,添加以下内容:{ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, // 保存时自动格式化 "prettier.singleQuote": true, // 使用单引号 "prettier.trailingComma": "es5", // 在可能的情况下,添加尾随逗号 "prettier.semi": true, // 结尾加分号 "prettier.tabWidth": 2 // 缩进宽度 }
3. 配置项目中的 .prettierrc 文件(可选)
为了让团队中的每个人都使用相同的代码格式,可以在项目根目录下添加一个 .prettierrc 配置文件,内容如下:
{
"singleQuote": true,
"trailingComma": "es5",
"semi": true,
"tabWidth": 2
}这样,无论是使用 Prettier 插件,还是通过命令行运行 prettier,都会遵循这些配置。
单调队列和单调栈
单调队列
单调队列相比于一般的队列来说,多了一个队尾出队。
一般的队列是秉持先进先出的原则,所以是队尾入队,对头出队。
单调队列中的元素相比于一般队列来说,多了单调性。队列内的元素始终保持单调,即单调递减或者单调递增。
队尾出对的条件:队列不空(应对第一个加入的元素)且有新元素加入时,新元素更优。
这个新元素更优分两种情况。如果是单调递增的一组元素来说。队尾进入的元素是越小越优,也就是越小越可以排到前面。所以当元素入队之后可以使用while循环对从队尾开始的每一个元素进行判断,如果比它大就踢出队列,直到队列为空或者遇到第一个比新元素小于或者等于的元素。然后将新元素加入队列。对于单调递减的一组元素来说,这个更优的情况就是元素越大越优,越可以排到前面。
队头出队的条件是队头元素滑出窗口
例程:
#include <bits/stdc++.h>
using namespace std;
int q[1000];
int a[1000];
int k, n;
int main()
{
int h = 1, t = 0;
cin >> n >> k;
for (int i = 1; i <= n; i ++)
cin >> a[i];
for (int i = 1; i <= n; i ++)
{
while (t >= h && a[q[t]] >= a[i]) t --;
q[++t] = i;
if (q[h] < i - k + 1) h ++;
if (i >= k) printf("%d ", a[q[h]]);
}
return 0;
} 单调队列是用来维护一个滑动的定长窗口内的单调序列,从队头取最值,进行计算或者转移。
单调栈是维护一个固定的变长窗口[1, i]内的单调序列,从栈顶取最值,进行计算或转移。
每个元素从栈顶入栈,淘汰元素从栈顶出栈。
淘汰的机制是和单调队列相似的,也是如果要维护一个单调递减的序列,从栈顶取的是最大值,则越大越优,维护一个单调递增的序列,从栈顶取最小值,越小越优
例程:
#include <bits/stdc++.h>
using namespace std;
const int N = 3e6 + 10;
int a[N];
int q[N];
int ans[N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> a[i];
int top = 0;
for (int i = 1; i <= n; i ++)
{
while (top > 0 && a[q[top]] < a[i])
{
ans[q[top]] = i;
top --;
}
q[++top] = i;
}
for (int i = 1; i <= n; i ++)
cout << ans[i] << ' ' ;
return 0;
} 现在就很好
最近因为我的游戏本放在宿舍,在实验室只留了一个轻薄本用来远程。所以推视觉小说比较多。
有的时候在想现在的经历,觉得如果有回档就好了。我想要回到之前的某一个时间节点去做另外一个选择。
但是又转念一想,或许不同的线,命运都给我书写好了,现在做的无非就是最后到达某一个结局而已。除了有非常明确的目标,不然最后打出的都是”无好感线“,对应到现实可能就是什么都想做,却没有个明确的主线去串联起我的行为,最后就是平平庸庸泯然众人。
但是平庸也没什么不好,我现在这样并不是上天不公,或者社会不公平,可能仅仅是某一个晚上,我选择打伞去逛操场。但是在另外一条线或者另外的很多线里面,很多事情都是发生的。对于目前来说,专注于现在就好了。结局有很多,对于我个人在哲学意义上来说,单纯的为了拥有某个结局而去努力是没有意义的,因为最后的最后结局都有的。所以,不管是有明确的目标也好,还是没有,都是没关系的。
在去往某条线上的经历,那些体验过的美好,看过的风景才是重要的。
多个服务的docker-compose编排
先是指定版本
version: '3'现在已被废除,不需要写了
然后指定 service
每个service 都指定build字段或者image字段看是从dockerfile上构建镜像还是从拉取镜像
服务的名称直接缩进一格就好
container_name指定容器名称
ports指定开放的端口
depends_on指定该服务需要在哪些服务启动之后启动
environment指定环境变量
volumes指定数据卷
就是数据和容器内数据的映射
比如将容器内的某个文件夹保存在宿主机内的某个地方
也可以用docker的数据卷做持久化,在最外层需要多一个volumes字段,缩进一格放数据卷名称
在配置mysql的时候可以将sql文件映射到容器内/docker-entrypoint-initdb.d目录
映射好之后,容器启动会自动运行目录里面的sql文件。需要注意的是只有在首次创建数据库的时候会执行。所有如果对mysql做了持久化,就是将容器内/var/lib/mysql的东西映射到了本地或者数据卷,后面再次启动就不会执行,除非将持久化的内容删了,然后重新创建
mysql环境变量
- 环境变量优先级:
environment:
MYSQL_ROOT_PASSWORD: root123 # root密码(必需)
MYSQL_DATABASE: # 创建的数据库名
MYSQL_USER: # 创建的用户名
MYSQL_PASSWORD: # 用户密码
容器间通信需要使用networks来指定一个网络,和volume一样最后在配置url的时候将localhost或者127.0.0.1变成对应的服务名。
但是好像不用network指定网络也行。不过就是确实需要对应为服务名就是了。
更正:
可能是windows上的docker比较新,可以不指定network就默认为一个network,但是我部署到linux上的时候,ubuntu上装的一个docker compose就不支持,加上networks字段之后才正常工作
如果就是容器内自己用的话像是mysql,redis这种的端口应该就不用暴露出去,因为暴露出去是给宿主机用的。如果只是容器之间用的话就不暴露也行。
可以使用环境变量的方式配置application.propertiess里面的配置。将字段改为全大写,点变为短下划线即可。
最后使用
docker compose up -d来后台启动
如果想要重新构建镜像可以使用
docker compose build后面可以跟上对应的服务名表示单独构建某一个镜像
使用
docker compose down来停止和删除容器
等于 stop + rm
示例:
services:
qiannian:
build: ./qiannian
ports:
- "8080:8080"
depends_on:
- mysql
- redisL
networks:
- qiannian_network
ocr:
build: ./ocr
networks:
- qiannian_network
aiservice:
build: ./ai_service
networks:
- qiannian_network
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: qiannian
networks:
- qiannian_network
volumes:
- qiannian_mysql:/var/lib/mysql
- ./qiannian/script.sql:/docker-entrypoint-initdb.d/script.sql
redisL:
image: redis:6.2-alpine
container_name: redis
networks:
- qiannian_network
volumes:
qiannian_mysql:
networks:
qiannian_network:
driver: bridge