群晖折腾记二 - 搭建Git Server
业余时间自己在做一些小项目,由于此类项目大多要求一定的保密性,此时使用类似Github这种必须开源的gitServer就不太适合了,而且家里有多台电脑,所以最好有一个代码管理工具协助管理,正好家里有一台群辉NAS,用群辉配置一个Git Server来满足这个要求。 1. 创建GitRepo目录首先,我们需要创建一个Git Server的数据存储的主共享目录,进入 控制面板 > 共享文件夹 > 新增(GitRepo)。 2. 创建gitcode用户接着,我们可以创建一个单独的git用户账户,用于代码提交,进入 控制面板 > 用户与群组 > 新增 。 其中,用户群组可以使用默认的 users ,也可以像我这样单独创建一个群组git: 分配共享文件夹权限时,将前面创建的GitRepo目录赋予读写权限: 应用程序权限可以全部允许,或者像我这样只勾选必要的权限: 3. 安装GitServer前往 套件中心 > 搜索与安装Git Server: 完成安装后,打开Git Server,勾选相应的用户权限: 4. 开启SSH进入 控制面板 &g...
群晖折腾记 - 搭建OpenWrt
最近有点怀旧,于是偷偷拿出吃灰很久的Switch,鬼使神差的打开了商城,买了这款《暗黑破坏神2》。 心情激动的启动游戏,打算去里面大杀四方。WTF!无法连接服务器?😂啥玩意还要连战网?众所周知,国区已经关停了。好在我有一台群晖NAS,正好可以安装一个OpenWrt来解决这个困扰。 1. 什么是OpenWrt?OpenWrt是三大主流路由器固件之一,本质上是是一个高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件和扩展性,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。OpenWrt不同于其他许多用于路由器的发行版,它是一个从零开始编写的、功能齐全的、容易修改的路由器操作系统,OpenWrt支持常见路由协议,包括RIP、OSPF、OLSR、BATMAN等,适用于从小型网络、大型密集网络到无线Ad-hoc网络等各种场景。其架构如下所示: 2. OpenWrt安装NAS上安装OpenWrt有两种方法: 通过docker方式安装 通过VWM方式安装 2.1. docker方式安装在群晖的套件中心搜索docker或者containe...
如何搞定图床问题 PicGo + 腾讯云COS
本文介绍如何使用PicGo与腾讯云COS搭建图床,帮助公众号作者高效管理图片,避免手动上传和链接错误。并提供截图,解决权限和链接格式问题,适合发布图文的作者,并解决常见问题。
像玩游戏一样规划你的人生 - Notion积分打卡v1.0
本文介绍如何用 Notion 搭建“像玩游戏一样规划人生”的积分打卡系统。通过七个页面(月度跟踪、角色属性、奖励商城、任务清单、打卡记录、人生清单、习惯清单)实现任务、习惯与积分挂钩,激发持续打卡动力。
GMock学习笔记
1. Mock与Fake1.1. fakes(伪对象)和mock(模拟器)在测试驱动开发(TDD)社区中实际上往往意味着非常不同的东西: Fake有工作实现,但通常采取一些捷径(可能使操作更简单),这使得它们不适合生产。内存中的文件系统是一个fake的例子。 Mock是预期编程的对象,它们形成它们期望接收的调用的规范。 1.2. 使用Google Mock涉及三个基本步骤: 使用一些简单的宏描述你想要模拟的接口,他们将扩展到你的mock类的实现; 创建一些模拟对象,并使用直观的语法指定其期望和行为; 练习使用模拟对象的代码。 Google Mock会在出现任何违反期望的情况时立即处理。 在代码中有依赖,比如代码依赖ABC.cpp文件里的方法。这些方法还没有实现,这是应该是拿到了这些包含了这些方法的定义的头文件,ABC.h。 创建一个Fake程序,Fake_ABC.cpp和Fake_ABC.h. 在Fake_ABC.h里include ABC.h. 并定义新的行为Fake_action_1(), Fack_action_2(). 这些行为多数是用来帮助获取Fak...
C++ string转enum
1. 问题前阵子遇到个问题,需要传递接口的admin状态,是这么定义的: 12345enum IfaceAdminStatus{ up, down}; 然后从API上获取的接口又是string类型: 1234567891011121314151617181920struct EtherIfaces{ std::string ifaceName; std::string adminState; EtherIfaces(const std::string &ifaceName_, const std::string &adminState_): ifaceName(ifaceName_), adminState(adminState_) { } EtherIfaces() { } ~EtherIfaces() { }}; 所以需要将string转enum处理。因为是C++小白,只能去...
搭建Typora+hexo环境
本文记录了作者如何搭建 Typora 与 Hexo 的博客环境。先说明为何放弃 Typora 的 Upload Image 功能,改用 PicGo 与 GitHub 作为图床;随后讨论将 Typora 文章迁移至 Hexo 时图片无法加载的问题,并给出通过自定义 asset_img 标签或脚本自动转换图片路径的解决方案。最后提到计划使用 Jenkins 自动化部署。
学习C++ - 不常见概念解释
模板相关1. Dependent Namehttps://en.cppreference.com/w/cpp/language/dependent_name 在涉及到模板时,如果引用模板参数中的符号,那么这个符号就是dependent name,即依赖于模板实例化才能确定符号类型。 1.1. Binding Rules不依赖模板参数的符号是在模板定义时绑定的。如果绑定时和模板实例化时,同一个符号的含义发生了变化,那程序可能会出问题。 1.2. Lookup Rules依赖模板参数的符号是在模板实例化时才去绑定的。 1.2.1. 非ADL非ADL的情况下,只会在模板定义的上下文寻找符号定义; 下面的例子中,writeObject方法的模板参数类型并不是用户命名空间中定义的,因此对应非ADL场景,只会在模板定义上下文寻找 operator << (std::ostream& os, std::vector&) 符号的定义,不会去用户命名空间中查找: 12345678910111213141516171819202122232425262728293...
学习C++ - 艰难的熟悉过程
1. using声明https://en.cppreference.com/w/cpp/language/using_declaration 自C++11开始,除了可以使用using引入命名空间所有符号外,还可以使用using来定义类型别名,以及使用using为子类引入父类定义的函数,包括构造函数; 昨天晚上读React-Native源码时,发现调用了一个类的构造函数,但是并没有找到这个构造函数的定义在哪里,找了很久才发现看漏了一行using,原来子类是通过using将父类的构造函数全部引入了进来。 如果子类使用using引入父类构造函数会有一些需要注意的点,第一个是引入时,会将父类的所有构造函数一次性的全部引入到子类,如果子类中新定义的所有成员都能进行隐式的初始化,那就可以直接使用using引入的父类构造函数方法来实例化子类实例了。 如果子类自己定义了函数,并且签名和using引入的函数的签名一样,那么using引入的函数会被隐藏。 例如: 123456789101112131415161718192021222324struct B1 { B1(int, ...) { }...
C++ 并发编程
自C++11标准以来,C++语言开始支持多线程模型。借助多线程模型,我们可以开发出更好的并发系统。本文以C++语言为例,讲解如何进行并发编程。并尽可能涉及C++11,C++14以及C++17中的主要内容。 1. 为什么要并发编程大型的软件项目常常包含非常多的任务需要处理。例如:对于大量数据的数据流处理,或者是包含复杂GUI界面的应用程序。如果将所有的任务都以串行的方式执行,则整个系统的效率将会非常低下,应用程序的用户体验会非常的差。 另一方面,自上个世纪六七十年代英特尔创始人之一 Gordon Moore 提出 摩尔定义 以来,CPU频率以每18个月翻一番的指数速度增长。但这一增长在最近的十年已经基本停滞,大家会发现曾经有过一段时间CPU的频率从3G到达4G,但在这之后就停滞不前了。因此最近的新款CPU也基本上都是3G左右的频率。相应的,CPU以更多核的形式在增长。目前的Intel i7有8核的版本,Xeon处理器达到了28核。并且,最近几年手机上使用的CPU也基本上是4核或者8核的了。 由此,掌握并发编程技术,利用多处理器来提升软件项目的性能将是软件工程师的一项基本技能。 本...





