开始引入
还有,
按照知乎老哥的建议,确实优化了
接下来研究下怎么在代码里打上日志,让代码也能够进入
换
今天看到
装了这么多天的配置,最大的感悟就是,不要去网上直接搜别人的配置怎么配的,因为他们的配置可能早就过时了,就比如这次的
感觉最靠谱的方法是,去官方文档吧,$kafak$,
又在服务器跑了很多次
现在也算是搞定了,新版本的
因为以后
docker cp Another-Nikki-data.sql mysql:/
docker exec -it mysql /bin/bash
mysql -uroot -p1234 Another_Nikki<Another-Nikki-data.sql
刚刚又想了下,其实不用迁移,$docker-compose.yaml$ 可以写在
昨晚的结论是正确的,尽管 canal/example/meta.dat
里面。
于是我昨晚运行容器的时候,时好时坏。。
经过了无数次的
其实本地安装不难的,先下载好官方的包,然后跟着文档一步一步来就好了:解压、修改配置(地址,用户名,密码)、启动、查看日志看看有没有启动成功。
我想我现在稍微懂了一点了,之前一直不成功的原因尚不清楚,但极大可能是因为账号没有获取
本地安装以后,本人过于手贱,为了熟悉这个过程,在成功一次以后,还要
但是 canal 容器连接 kafka 还是连不上,还需要继续排查问题。
现在小领导和大领导在讨论自动化测试调该不该在线上写接口,感觉小领导其实早就知道讨论的结果,但是为了体现自己的思考,总要辩论一番,最后说,好,那我
这个地方记录一些配置在哪学习的,怎么安装配置也比较合适。
奇怪的是我已经注释了 docker-compose.yaml
中的 volume
,但是最后生成的容器里面,还是有这个东西,不过本地没有。可能是我已经忘记了 volume
的相关知识了吧。
主要加了上传图片的功能,一开始图片上传是没有
十二月底主要是趁着上班摸鱼时间,把编译和运行这两个功能装成一个
今天在往
这意味着什么呢,$windows$ 下,换行符是在
还有一个事情,如果加了新数据,$docker$ 是要重新
这些
今天加上了最想要的功能,$oj$。
前几天加上了留言,关于留言的留言,其实现方式是,设置每条留言的
今天域名终于备案好了,可以启用
最近加上了真的博客,后端没什么,前端的主要修改:
- 使用
$markdown-it$ 插件,在$package.json$ 中添加的依赖,有$@types$ 前缀的是适配了$TypeScript$ 的:dependencies: { highlight.js markdown-it markdown-it-katex // 数学公式 markdown-it-attrs // markdown 标签 } devDependencies { @types/markdown-it @types/markdown-it-attrs }
- 如果是没有适配
$TypeScript$ ,可以在$src$ 目录下的vite-env.d.ts
新增,(其实$VsCode$ 本身也会这样提示):declare module 'markdown-it-katex';
- 如果有,要在
$tsconfig.json$ 的compilerOptions
加:"allowSyntheticDefaultImports": true
-
$markdown-it-katex$ 的使用踩坑了,没有仔细看官方文档,以为md.use()
之后就可以了,其实还缺少$css$ 的引入,否则显示的效果会让人很头痛,以为是代码哪里写错了。 -
.env.production
修改为VITE_API_URL=https://jiyeon.club
,这样流量才能经过$caddy$ 转发,而且是$https$ 的。
修好前端的响应了,同时后端的接口返回消息格式都规范了一下。以后都这样写,开发就方便了。
部分页面需要特定用户才能查看。
后端
前端的代码风格大大的改进了:
-
封装了
$axios$ ,可以很方便的定义一个请求,并且要求后端返回的内容具有特定的格式。这样开发更方便了吧。其中,新增的目录有:
api : 定义请求,返回值的格式 hooks : 目前是关于 cookkie 的存储与读取 http : 封装 axios types : 返回值的具体格式,View 中也会用到
-
如果本地的
$cookie$ 中包含$token$ ,那么会自动带进请求头。
但是前端的消息响应还没做好。
前端加了路由,但是还没鉴权。
添加了日志功能,写了个
新支持了
但是
修复了昨晚的两个
python3 -u py.py > a.out 2>&1
后端的输出带上回车了,join
的时候加上 \n
即可,前端的
支持运行
修了修前端,稍微简化了下代码,主要是调样式,然后配置了@
指向根目录,主要操作是:
在 tsconfig.json 中的编译选项中添加:
"baseUrl": ".",
"paths": {
"@/*": [ "./src/*" ]
}
在 vite.config.ts 中添加:
import { resolve } from "path"
resolve: {
alias:{
'@': resolve(__dirname, 'src'),
}
}
然后耐心等一会儿,就会好了。
搞定输入了,这个做起来居然是最简单的(其实是因为所有的坑前面都踩过了)。就是前端有点丑,不过没事。
下午偶然发现,如果有个人几乎在同时按下运行代码的按钮,由于docker container
的名字是不变的,所以后按下去的那个会立马返回编译失败,于是给容器名字加上了纳秒时间,这样应该就不重复了吧。
新的 a.out
,又会有并发的问题,于是创建新的文件夹,是tmp-time
的格式,这样子,算是解决问题了吧。然后退出前会删除文件夹。
休息了一会,好像又有动力写下去了,现在可以利用主目录下那个
关于内存的限制,修改了 -m 256m
即可。docker
无法限制容器的运行时间,所以这个要靠自己写代码才能做到。
后端的代码稍微改了改,很多重复的地方,都用了函数的封装,这样代码漂亮些吧。比如
在我的 docker build
,最终还是放弃了,期间尝试过各种国内镜像源,也尝试过 form ubuntu:20.04, lastest, 18.04
,但是都寄了,其中lastest
可以装完镜像,但是无法编译一些特定的头文件。。。
天哪,为什么会有这种 os.Getenv("PWD")
的输出,和普通的go run .
的os.Getenv("PWD")
输出不一样。。。然后我就一直 compile failed
。。。
关键是,我不删除容器,进去看日志,也是毛消息都没得。
最后的解决办法是:
os.Getwd()
服务器上的这些搞来搞的也太恶心了。。。
首先是解决了 sudo
的问题,这个
sudo usermod -aG docker $USER
执行完退出再登录就完事了。
服务器在build
curl google.com
也能通,为什么下载的这么慢呢,然后
过了很久才意识到,我加载出了一层 RUN apt-install
都是在
现在开始着手打包后端的 go run .
为一个系统服务:
又踩坑了反正,没写User=ubuntu Group=ubuntu
,服务就以root
身份启动。。。然后root
没配置
[Unit]
Description=Another Nikki Server
After=network.target
[Service]
ExecStart=/usr/local/go/bin/go run main.go
WorkingDirectory=/home/ubuntu/dox/Another-Nikki/Another-Nikki-Server
Restart=always
User=ubuntu
Group=ubuntu
[Install]
WantedBy=multi-user.target
接口实现起来很
关键代码:
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
_, err = io.WriteString(f, code.Code)
其中OpenFile
填的第二个参数很有趣,用了或运算,代表着这三种需求同时满足,估计是为了代码的可读性考虑的吧。O_TRUNC
表示如果文件已存在,则将其截断为空。如果没有它,那么只会从开头写数据,后面的内容不会被删除。真有趣。
接下来该把服务器上的后端打包成系统服务了,否则他是无法进行docker
的系列命令的。
在网上看到,可以用
我在本地预先编译了一个 .c
文件,文件名是 calc
,暂时用它来获得运行时间。
到这里,可以开始写后端的接口,和前端的界面了。虽然暂时只支持编译
docker run --rm --name cpp_run -v $(pwd)/code:/dox cpp_env:1 sh -c "./calc ./cpp > a.out"
看着窗外下着雨,一辆辆车从马路上开过,想起了上周这时候打完蓝桥杯,从上大赶去上海站,这会儿应该还没开始检票。
嗯,经过进一步的学习,发现 docker-compose
并不是那么适合我的需求。因为之前写的那些配置,都会创建一个新的镜像,然后再创建容器,这样并不好。
现在的实现是: 先创建镜像:
docker build -t cpp_env:1 .
再启动容器:
docker run --rm --name cpp_compile -v $(pwd)/code:/dox cpp_env:1 sh -c "g++ 'c++.cpp' -o 'cpp' -O2 -std=c++11 2> compile.log"
稍微解释一下:
-
--rm
是容器运行完就删除 -
--name cpp_compile
指定使用的镜像 -
-v $(pwd)/code:/dox
相当于原来的$docker-compose.yaml$ 中的$volume$ 。 -
cpp_env:1
容器名称与版本号 - 编译指令,很显然,$O2$ 优化,程序
$64$ 位,编译错误的信息重定向到$compile.log$
编译完成后,另起一个容器,运行程序:
docker run --name cpp_run -v $(pwd)/code:/dox cpp_env:1 sh -c "./cpp > a.out"
昨晚拆分出了编译和运行,用了两个不同的容器,然后关于运行时间和内存使用 docker inspect
就可以做到。
现在的问题是,每次都用docker-compose up -d
来启动服务,这样子不好,一是因为以后肯定要加其他的语言的容器,每次都全部启动一遍肯定不行;二来是 docker-compose
并没有保证启动的顺序。。。很有可能编译没完,运行的容器就启动了,这样肯定不行。
关于第二点,查了下要结合 depends_on
和自己写命令行,等待编译完成。可这样既麻烦,又让我测量出的容器运行时间远大于程序运行时间。
今天公司的活少,下午领导也走了,于是开始放心摸鱼。请教了旁边一起和我实习的交大的实习生,他告诉我正确使用
docker-compose build
然后再
docker-compose up -d
后者只是运行一个构建好的容器(基于一个构建好的镜像)。要加上前者,先
不过在生产环境上,肯定是先 docker-compose up -d
吧。
其实昨晚弄了一半的
然后昨晚也 git add .
过的文件,再写进去就来不及了。今天问了旁边的香港大学的实习生为什么 gitignore absolute path
,有点厉害,然后看了一下,告诉了我为什么。
目前虽然可以编译一个文件了,但是还不会计时和计算程序运行的时候占用的内存。
给前端加了路由,注意事项:
- 在
$web$ 文件夹里面执行
yarn add vue-router
- 在
$App.vue$ 一定要有
<router-view></router-view>
- 在
$main.ts$ 中是
import Router from './router'
app.use(router)
晚
嗯,就这些
买了域名 jiyeon.club。给服务器配了
还有,$webhook$ 正式启用了,脚本用了
前几天前端加了操作消息播报,虽然能跑起来,但是
今天看了下
"moduleResolution": "Node"
在铜陵的酒店里对项目的一些微调,后端加了随机留言,前端的随机留言按钮会禁用
目前还不是
在
"dev": "vite --host 0.0.0.0"
这样跨域也能访问了。
随着留言越来越多,展示所有留言并不美观,于是只展示了最后七条留言,主要用到的技术是
项目从最初的只能在