为什么要使用条件变量?

为什么要使用条件变量? 前言 最近看了很多与线程有关的 C++ 新特性,条件变量是见的比较多的一个特性。 看的时候我发现,想要理解一个新的特性,关键的要看它的引入到底解决了哪些问题,没有什么特性我们要实现相同的功能要怎么做? 以我的理解来看,条件变量是一个线程间互相同步与通知的手段,他通过主动唤醒的方式减小了各个线程的开销,取代了简单但是消耗较大的一直被动循环检验与等待。 没有条件变量我们如何实现相同的需求? 这里采用现代C++教程1 中关于条件变量的一个例子作为基础: 不使用条件变量版本 #include <queue> #include <chrono> #include <mutex> #include <thread> #include <iostream> #include <condition_variable> int main() { std::queue<int> produced_nums; std::mutex mtx; // 生产者 auto producer = [&]() { for (int i = 0; ; i++) { std::this_thread::sleep_for(std::chrono::milliseconds(900)); std::unique_lock<std::mutex> lock(mtx); std::cout << "producing " << i << std::endl; produced_nums.push(i); } }; // 消费者 auto consumer = [&]() { while (true) { { std::unique_lock<std::mutex> lock(mtx); if(produced_nums....

August 24, 2022 · 2 min · zzsqwq

一个基于 Hugo 的个人主页主题

背景 之前看到过学长学姐做过个人主页,多是用来申请一些学校的夏令营使用的,觉得非常的 Nice,自己也想搞一个。 大家之前好像大多用的是基于 Hexo 的一个主题 — hexo-theme-academia,但是由于之前我用过 Hexo,觉得他有一些比较明显的弊端,例如环境配置比较麻烦、需要安装 Nodejs、npm 等环境,然后再安装 Hexo。其次它的构建速度比较慢,用起来感觉比较僵硬。 后来随着了解增多,尝试了 Typecho、WordPress,Hugo 等主题后,目前还是决定使用 Hugo。它构建速度快,而且安装简单,在 Ubuntu 上只需要一行 sudo apt install hugo 即可,不可谓不简单。因此萌生了移植一个 Hugo 版本主题的想法,刚好可以锻炼一下自己。 欢迎点击 这里 查看我的个人主页。 一些难点 之前从来没有了解过 Hugo 主题的写法以及 Hexo 主题的写法,不过看了一下仓库的组织形式还算好理解。 这类静态博客生成器都是需要写一些模板文件,然后根据配置文件进行个性化构建。 Hugo 的文档 十分的完善,学习就像是学习一门编程语言,里面有很多函数和变量,还有各种条件结构、循环结构等。原主题是采用的 pug + stylus 的方式,而不是传统的 html + css 。不过这两者之间的转换并不麻烦,而且有一些工具可以参考着转换,例如 pug2html 以及 stylus2css 。 后续就参考着一点点的移植就可以,同时我也改写了一下配置文件(使用的 yaml 格式),大概是更易于配置了。 同时,得益于 Hugo 的强大,我很方便的完成了对多语言的支持。 最终效果 目前已经更新到了 v1.1.0 版本,欢迎大家体验,有问题可以及时反馈! 主题链接:https://github.com/zzsqwq/hugo-academia-theme 演示站:https://zzsqwq.github.io/academic-pages-demo/ 英文文档:https://github.com/zzsqwq/hugo-academia-theme/blob/master/README.md 中文文档:https://github.com/zzsqwq/hugo-academia-theme/blob/master/README.zh_cn.md 英文效果图: 中文效果图:

May 3, 2022 · 1 min · zzsqwq

Docker-Gitlab 与主机共用 ssh 的 22 端口

背景 在使用 Docker 搭建 Gitlab/Gitee 会导致无法与主机端共用 22 端口,这导致 ssh 连接的时候会使用形如 ssh://git@git.xxxx.cn:4022/zs/zsblog.git 的 ssh 链接,而不是像官方 Gitlab 那种非常干净的 git@git.xxxx.cn/zs/zsblog.git 链接。这对于我这种强迫症而言非常的难受啊,但因为主机的 22 端口已经被占用了,无法共用,所以需要考虑两者共享端口的问题。 虽说是两者共用,但其实还是使用类似于端口转发的特点,简单说就是在主机设置 git 用户,然后通过一个脚本将 git 用户的所有 ssh 流量转发到 Gitlab 容器中,从而完成对应的事情。 关于 Gitee 的设置,Gitee 官方的 Docker 部署教程1已经说的很清楚了,按照该步骤执行完全没问题。 而关于 Gitlab 貌似没有比较详尽的教程,搜索后发现了一个 Issue2 以及一篇博文3,后者讲的比较清楚,但是经过实践后发现存在一定问题,因此决定将可行的方案记录下来。 具体步骤 一、初始设置 在开始之前,docker-compose.yml 中设置比较关键的几个配置如下: gitlab-web: image: 'gitlab/gitlab-ce:latest' container_name: 'gitlab' restart: always environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['gitlab_shell_ssh_port'] = 4022 ports: - '3090:80' - '4022:22' - '6060:6060' volumes: - '/srv/gitlab/config:/etc/gitlab' - '/srv/gitlab/logs:/var/log/gitlab' - '/srv/gitlab/data:/var/opt/gitlab' - ....

April 24, 2022 · 3 min · zzsqwq

关于春节期间的一些碎碎念

前言 春节期间,走亲访友是必不可少的。交谈的多了,免不得一些问题的讨论。 读了很多书,经历了很多事,似乎想法也有一些”离经叛道“,记一下自己目前的一些想法,不知道多年后的自己看这篇文章会是什么想法,还会一如既往的坚持吗。 讨论的话题 打点关系 无论是父母,还是各方亲戚,大家好像都喜欢打点关系,以此来获得一些好处。 最常见的是求人办事,很多时候是我们常说的”走后门“,想让孩子上个好点的小学,避免不了又送礼又吃饭。 事件上升的恶劣一些,定然就是贪污受贿,这肯定是错的,大家都知道,但是度在哪里呢。 和我儿时的哥哥探讨中,他认为,这种送礼打点关系是必要的,送点小礼没啥问题。而我总觉得,这就是0、1、无穷的区别,有一就有二,有二就有无穷。 从出生到现在,试问自己从没遇到过必须送礼才能办成的事,或许以后会遇到,但我想、我应该宁愿放弃这个机会也不会去送礼打点。 大家都对我说:“你现在是这个想法,是没有经历过社会的毒打,你踏入社会就也会这样了。”,我无言。 或许吧,或许以后也会变成善于打点关系、整天辗转于酒局的人。 至少我现在,还是个滴酒不沾、不屑于打点的鸟人。 酒文化 我是个滴酒不沾的人 有两点比较重要的原因 一个是因为酒真的很难喝,好喝也就罢了,难喝为什么要喝呢? 二是因为我真的很讨厌饭桌上推杯换盏,你推我我推你,大家都喝得烂醉如泥。村里有很多喝酒出事去世的例子,小时候看见一个哥哥的朋友,喝醉后在大街上和别人干架,然后在欢喜的日子里一起进医院···何必呢? 推杯换盏还导致饭菜里会混入多多少少的酒,真的不好吃。 大家为什么都不能别这么执拗,这里用执拗可能不合适,不过没想到什么好的词语。人家明明都说了不喝、不吃,为什么还总要一遍遍的推脱?最后立场不坚定的,只能不情愿地吃了。立场坚定的,又闹得双方不愉快似的。 还有很多明明想喝、想吃,却又怕尴尬嘴上说着不喝不吃,一样可恶。 硬唠 平时在家总喜欢窝在自己的屋子里,倒腾自己的事情。 亲戚来了,似乎不出去跟他们聊天就是个错误。总是要数落你一下,在饭桌上调侃你一下,跟家长阴阳怪气一下你。 不想说的是,真的感觉没有什么共同话题,聊不到一起去,实在是没什么话说,只能在那里低头玩手机,哦对了,手机也不得玩,玩多了也会被说。只能在那里干坐着东看西看,听大家侃大山,却因为离家过久大多事都没听说过,时间白白的浪费。 人际关系真的蛮烦的。 关于入党 最近舅家的哥哥萌生了入党的想法,说:”就算无论花多少钱,也得入党。“ 我问,那你入党又是为了做什么呢? 他说,入党好啊,入党好啊,入党可以在村委里谋个一官半职,可以轻松一些,赚钱也多。 我说你不应该为了自己的私利来入党,他说,人不为己天诛地灭,没有人不顾自己的私利。 实话的讲,我哥哥是个不错的人,乐于与村里人交善,村民家里出什么事他也喜欢帮忙。但是这个入党的观念真的让我不理解,入党是应该认为认同,而不是因为利益驱使。 大家入党好似都是为了后续能谋个公务员的出路,如果能贯彻为人民服务的宗旨还好,如果一心为了钱,很容易会变成蛀虫、老虎,那这样的话,不如踏踏实实另谋出路。 后记 春节期间思考了很多,感觉与周围的很多亲戚们都格格不入。 文章算是想到什么写什么,可能看起来杂乱无章,见谅。文章也只是我自己的一些看法,不代表普遍性,也无言对错,大家看看就好。 还好的是,我的亲戚们大多不会问我,考的咋样,有对象了没…… 之前与一个舅家的哥哥很要好(与上文不是同一个),因为之前感觉我们两人观念很类似,亲戚们也都觉得我们两个像。 这个春节与他进一步交流了一些,似乎观念不尽相同了。 现在他步入社会,参加了工作,开始应付酒局,也会打点关系了。也开始教导我应该善于打点。 我以后也会这样吗?

February 10, 2022 · 1 min · zzsqwq

一个 Javascript 中异步的小技巧

前言 最近看了一些 js 有关的知识,其中令我这种初学者感到很头疼的一个问题就是异步问题。 今天就我碰到的一个小问题详解一个关于异步的小技巧。 背景 我在程序中需要鉴权,来判断一个用户是普通用户还是管理员,针对不同的用户渲染不同的页面。 每个用户具有唯一的 ID,因此我只需要将管理员的 ID 放到数据库,然后加载程序的时候一一比对即可。 但是我的主程序初始化与页面的初始化是异步的,管理员的判断逻辑我放在了主程序初始化中,这也就意味着很可能我页面在加载时,主程序还没有判断完用户的身份。 每个人默认不是管理员,因此这就会导致一个问题——管理员可能也会显示成普通用户的页面,因为渲染页面的时候程序还不知道这个用户是管理员。 方案 这个方案其实是我从官方的代码上学到的,其实就结合代码给大家讲一下。 官方这里是在获取用户的 userInfo 时用到的。 主程序初始化部分代码: 这里主程序的逻辑就是在 getSetting 调用成功后,判断是否已经获得过 userInfo ,如果已经获得过,则可以直接调用 getUserInfo 函数获取值,赋值成一个主程序的全局变量,所有页面都可以用。 接下来就是一个比较奇怪的点了 可以看到官方的注释为 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回 所以此处加入 callback 以防止这种情况 这里判断了主程序内是否含有 userInfoReadyCallback 这个函数,如果有的话就执行。 qq.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) { // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 qq.getUserInfo({ success: res => { // 可以将 res 发送给后台解码出 unionId this.globalData.userInfo = res.userInfo // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回 // 所以此处加入 callback 以防止这种情况 if (this....

January 19, 2022 · 1 min · zzsqwq