Gitlab Runner

不建议使用docker in docker,会有安全风险。

.gitlab-ci.yml中,在job里面定义tags就可以用设置了某个tag的runner来执行。对于同时有多个runner而且executor类型不同的情况下是很有必要的。

获取token

note

每个runner都需要自己的token。

  1. 首先以管理员账户登录gitlab,然后点击“Configure GitLab”,点左侧CI/CD,子菜单点击Runners

image-20231030173652194

  1. 点击右上角New instance runner,根据自己的需求填内容(比如钩上Run untagged jobs)

image-20231030173715973

  1. 拉到页面最下面,点击Create,记下token。

Virtualbox

Read More

看完了《东京罪恶》

今天终于看完了东京罪恶这本书,主要的内容就是一个犹太裔美国籍记者记述他在日本十四年间的记者生活。他曾经是读卖新闻的记者,主要从事犯罪新闻的报道,而最终退出这一行是因为在东京负责色情行业相关的调查报道时对于日本的阴暗面了解太深,受不了了决定退出。而这本书其实开篇写的是他跟黑帮传话人的拉扯,贯穿全书的是他怎么跟日本的黑白两道打交道,最终可以说是必然的,由于调查太深而被其中一个黑帮头目盯上,但是在被干掉之前把对方的料爆了出来从而活了下来的故事。

虽然他跟这个黑帮老大的斗智斗勇对于他的人生来说可能是非常浓墨重彩的一笔,但是如果这是他写这本书的目的,那可以说是失败的。我作为一个读者,其实是觉得这本书前半部分——关于他怎么成为记者、怎么坑蒙拐骗获取情报、怎么建立人脉——更加的有趣和吸引人,到了后面他书写关于黑帮老大的部分的时候反而开始没有什么好玩的事情了。我认为这主要是因为这部分内容依然非常敏感,没有办法细写,导致吊在半空没有实感。

读这一类书的时候,可以想象这样一个画面:作者用这个作品,给读者画出了一扇窗,读者从这扇窗探出头来,观察他所描述的异国景象。通过这本书,我确实是对于日本的文化又有了多一点的了解。

Read More

东北行程规划完成

今天被partner要求把行程细化一下,于是在文心一言和谷歌、百度地图的协助下把整个行程规划了出来,非常的详细——坐什么车去哪里,什么时候到,住哪里,玩什么,诸如此类的。无论是她还是爸妈都觉得这个行程非常的详细和实际,不过爸妈叮嘱说行程计划可以参考,但是不要强求,如果觉得累就要休息,出来玩最关键就是不要吵架,要开开心心。

大概周末就会开始订机酒了。

Read More

双喜临门

昨天早上赖床的时候,突然收到中介的信息,offer终于正式下来了。好耶,有书读了!虽然晚上给留位费的时候出现了一丁点问题,银联的portal提示timeout了,但是过了10分钟学校还是确认收到钱了,有惊无险了属于。

另一个值得开心的是经过了两个钟的漫长战斗,终于打通了匹诺曹的谎言的最终boss。牛逼啊,第一次玩就直接打出真结局。果然还是莽夫有前途!打通那一刻的感觉真的让我突然理解了怪猎玩家们说的,人类的赞歌是勇气的赞歌。在不断被打烂的挫折里不低头,一次又一次地挑战,最终终于成功的快乐真的是无与伦比的。

Alt text

不得不说韩国人还是懂奖励玩家的,打过了boss本来就爽到,防火女复活、发糖,更是深得人心。至少我是赞不绝口了!

Read More

Archlinux部署gitlab

Docker

使用docker来部署gitlab-ce,基本上就是两步走:首先创建文件目录,然后编写docker-compose.yml,就完了。

目录结构是这样的:

1
2
3
4
5
/opt/gitlab/
|-- config/
|-- data/
|-- logs/
`-- docker-compose.yml

docker-compose.yml的内容修改自官方的文件,主要去除了gitlab-runner的内容[1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
version: '3.6'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
restart: always
# 这里也是设置你的域名
hostname: 'git.mutebot.net'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
# 这里设置你的域名
external_url 'https://git.mutebot.net'
# 更改容器内nginx的http端口
nginx['listen_port'] = 8380
# 关闭容器内nginx的监听https,https由host的nginx负责
nginx['listen_https'] = false
# 同时也要关闭letsencrypt,不然会自动尝试申请ssl证书然后fatal error
letsencrypt['enabled'] = false
# 关掉容器内nginx的client_max_body_size,这个限制gitlab有设置项管理
nginx['client_max_body_size'] = '0'
ports:
# 映射容器内nginx的监听端口到host
- '8380:8380'
# 这里其实把gitlab的ssh映射到host,才能实现ssh认证。
# host的端口可以自己设置
- '22:22'
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
shm_size: '256m'
configs:
# 挂载gitlab.rb配置文件进容器
- source: gitlab
target: /omnibus_config.rb
extra_hosts:
- "host.docker.internal:host-gateway"
configs:
gitlab:
file: ./gitlab.rb

然后配置一下gitlab.rb,主要是为了确保容器内的nginx不要监听https以及不自动尝试申请ssl证书:

1
2
3
nginx['client_max_body_size'] = '0'
nginx['listen_https'] = false
letsencrypt['enabled'] = false

然后就可以拉起容器了:sudo docker compose up -d

Tips

Read More

Webhook生成静态博客

当静态博客生成器和Git都是实机部署的时候,直接用post-recieve这个hook来调用生成器是非常方便的事情。但是当Git是用docker部署,或者是Gitlab这样不支持repository hook的解决方案的场景下,就需要用webhook来调用生成器了。本文会介绍以下内容:

  1. 如何写uwsgi作为响应webhook的backend
  2. 如何生成token以无密码clone private仓库

本文假设已经按照 archlinux部署gitlab 完成部署。

UWSGI安装

由于处理响应的是python写的程序,所以除了安装uwsgi之外还需要安装python插件:sudo pacman -S uwsgi uwsgi-plugin-python

安装完成之后不需要做其他操作,因为我们后续会用systemd service的方式托管,不需要用到uwsgi自己的什么“emperor”模式。

webhook设置

GitLab

解决webhook无法请求本机的问题

默认安装下gitlab是不允许webhook请求localhost的地址的,也就是不能在URL里填127.0.0.1+端口。解决这个问题有两个办法,一是简单粗暴允许所有webhook访问localhost,但是会有安全隐患,所以放在后面说;二是用让nginx监听一个server_name,把server_name填进allowlist里面。

Read More

网站页面归档的简易方法

起因:mosdns的v5版本的更新让我感觉非常不安。不仅在迭代了这么久之后连v4的一些功能[1]都没有实现好,而且兼容性[2]以及未来的更新计划[3]都给人很不安的感觉……当然,如果只是作为dns client,它还是非常好的东西,但是我需要的是它做server。于是我fork了它,并且新建了一个v4-maintenance分支,主要是做一些依赖项更新的工作(毕竟我不会golang)。

源代码的问题好解决,但是还有一个更加重大的问题:如何备份文档网站。该作者没有使用github wiki的习惯,文档是部署在gitbook上的。而文档首页就有非常恐怖的一句话:

v3 及以前版本的 wiki 因地球会绕太阳公转等不可抗因素已丢失。

万一v6出来之后v4的文档丢失了,那岂不是拿着二进制文件无处下手?所以做网页备份那是迫在眉睫需要实现的。

在尝试了archivebox这种大型解决方案发现不理想之后,无意间搜索到wget也能做简单的archive工作。从archlinux bbs薅下来一行代码:

1
wget --limit-rate=2000k --no-clobber --convert-links --random-wait -r -p -E -e robots=off -U mozilla google.com

只要把最后那个google.com换成想要备份的链接就行了。而且牛逼就牛逼在,它能够自动把链接也替换掉,就,能够实现完美的离线备份效果(不会点击跳转原网站)。

再用nginx起一个autoindex on的网站,就一切完美了。

1
2
3
4
5
6
7
8
server {
listen 80;
server_name archive.lan;
location / {
root /var/www/archive;
autoindex on;
}
}

Read More

2023 10 01 Cpp相关笔记

这篇文章主要是记录一些c++的笔记。起因是对于operator =的不确定,于是搜索,看到了Herb的CppCon视频。C++由于它的自由性,其实对于新手来说什么应该写、什么不应该写,是非常难以搞明白的。它的这个演讲主要就是一些基本的指导。

A Tour of C++

Argument passing跟copy initialization是相似的:检查参数类型,如果有需要就执行implicit转型。(page 15)

函数declaration的参数名字是无所谓的,编译器会自动忽视。(page 15)

让代码readable的方法之一就是把任务拆分成步(拆成function和class)并恰当命名。(page 15)

function overload需要注意保持行为一致性。(page 16)

char就是该平台上储存1个字符所占用的空间,其他类型都是char的倍数。(page 16)换句话说,1 char就是1 byte,就是8 bits。sizeof返回的是这个类型是char的几倍。

{} 和 =

{}初始化赋值可以避免意外的implicit conversion,而=就没有这个功能。(page 18)实际上它的效果是这样:

1
2
3
double d {1.1};
int i1 {1.1}; // error: narrowing conversion of ‘1.1000000000000001e+0’ from ‘double’ to ‘int’
int i2 {d}; // warning: narrowing conversion of ‘d’ from ‘double’ to ‘int’

Read More

CUHK面试

今天早上是激动人心的港中文面试。10点钟进入会议室,但是还没开始,主持人说大概要等一个钟哦,我说没问题,于是就进入了等待间。等待间里面有一个哥已经在线了。

等到10点50的时候,等待间里有7个人了,主持人把大家都转进了面试间。除了7个面试人之外,还有1位program director教授,1位助理(主持人),两个NPC(没有摄像头画面的,可能是工作人员)。

虽然是群面,但是跟国内的群面是不太一样的,这种更像是大家share一下idea的茶话会,没有互相PK的气氛。没有自我介绍环节,助理介绍了一下流程之后,教授就给了一个topic:巴黎协定设定的2度温度上限可以做得到吗?给了各位2分钟时间思考,然后是1分钟的发言。

开始的时候我还以为是按照顺序来说的,毕竟1、2、3号按顺序被助理点名开说。结果3号之后,助理叫了5号还是6号,后面才返回来叫我。不过没关系,大家说的其实都各有侧重,没有重合的地方。每个人说完自己的想法之后,教授都有给出简单的几句评价。不过1分钟的限时还是比较紧的,很多人都超时了,我就相对比较简洁,没有超时。

这个环节结束之后,教授根据大家说的东西总结了一下:大家说的基本上是几个方面,一是technology,这是大家觉得的终极解决方案;二是development,大家都需要survive,需要keep developing,所以对于发展中国家会主动选择cheaper energy比如烧煤,不同国家会有不同的environment和development的trade-off;三是collaboration,大家都活在地球上,share the air and earth,所以会需要合作。科技是long-term的,而后面两个都是short-term的。所以问题来了,假设各位是国家领导人,请大家思考一下自己会提出一个什么policy作为solution for the short-term problems. 教授还特别提到,有金融背景的同学可以提出from financial market的solution。

这个就是15分钟的讨论环节了,不过实际上还是比较one by one的,因为虽然发言顺序是自己决定的,但是一个人说完自己的solution之后,教授会对回答进行一个拓展,给出他自己的想法,甚至会追加提问。

印象比较深的一个是本科就是港中文的、现在在证券公司上班的boy,他说的解决方案是从ESG的角度来看的,然后教授问他“ESG有penalty和public preference两个方面去影响公司的决策,你觉得哪个更有效呢?你可以想想这个问题,我们在听完其他人的回答之后再回到这个问题上”。大家说完之后,教授确实也问了他的回答是什么,他觉得在国内还是penalty的方式比较有用,因为他在证券公司工作就知道每年都有检查,合规是很重要的一部份,所以这样会比较有用。教授也很认可他的答案。

还有一个加拿大留学生(本科)的回答本身我没有听太清楚,大概意思就是加拿大有哪些哪些制度比较好用。然后教授的回应是,对于加拿大这样的人比较少但是资源很丰富(developed)的国家,它可以有很多option,有很多资源去做这件事。但是想想没有那么发达的地方,比如印度,甚至是比较发达但是人口密集的地方比如香港,我们有没有那么多option呢?

我的solution是比较聚焦于“碳排放权”的交易上面的:国内正在建设这个碳排放权系统,交易系统还没有完成;拓展的部分是结合了加拿大的girl的相关说法,可以建立相关的协议去进行跨国碳排放权交易。教授认为这个是一个很好的思路,但是追问了,那么作为一个产品,流动性是谁来提供呢?我的第一反应是,在国内,官方会提供一个中央交易市场来进行碳排放交易。教授又问,那么在跨国贸易的时候,你觉得谁来提供流动性呢?我回答说,通常来说在这种产品成熟之后,市场上会自然而然地产生相应的机构提供流动性。教授就说,所以你的期望是市场上“自动”地出现这种提供流动性的机构,但是很多时候会面临着很多挑战。我也顺着说,确实会有很多麻烦,特别是协议如何制定、各国管理条例不同等等。

后面就到了我们问他们的环节了。一个人问了如何最大化地利用这个学习的时间呢?然后过了一会儿,助理突然提出了问题,就是“你们之中有的人是有工作经历的,我想知道你们参加这个program是想要得到什么呢?为什么会选择重新回到校园呢?”虽然只有我和证券公司的大哥是有工作经验的,但是加拿大的girl也强答了一波。但是明显助理更希望听到我们两个的想法,所以又指明了我们两个的编号地又提问了一次。我就回答说我想给自己一个重新选择工作的机会,因为本科生很多时候很难进入高层次的金融行业,而且之前我在银行工作就知道我不喜欢那种需要短时间面对很多客户的工作,他们有各种各样的问题然后把他们的脾气甩到你的脸上(比如赌博锁了卡然后问你你有什么权利锁我的卡),我更喜欢的是更技术的工作。然后助理就问,那为什么你不选择part time呢?我就说我想focus on study,我更加擅长于focus在一件事情上,这样通常来说会表现得更好。他们也认同了这个想法。证券公司的boy也是差不多想法,觉得现在的工作更加倾向于考验sales能力,对于提升分析能力没有用处。后面还有一个会计专业的提问math会不会太难,会不会导致学不会。教授就说我们9月开学,但是很多学生会7月就来,学校会提供一个学前班给大家回忆一下math、statistics之类的,让大家准备好学习。

Read More