呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

[顶] 一个基于 Golang + React 的定时任务可视化配置网站的设计与实现

这个项目的初衷是为了监控我正在看的网络小说的更新情况,我希望在小说更新时就给我发一封 email 邮件,这样就能在第一时间看到热乎乎刚出炉的小说咯!

最初的时候我写了个 Python 脚本快速实现我的思路,借助 Linux 自带的 crontab 定时运行脚本抓取更新情况,有更新时就发送邮件给我。这个早期项目的地址见:elliotxx/RenewRemind

通过 Python 脚本 + crontab 的方式实现起来确实快速,运行也算稳定(使用了一年),但是也有缺点:要添加新的监控目标时,需要直接改代码;要添加新的通知邮箱时,也要改代码;总的来说,就是配置&维护不方便,直面代码,对用户不友好。

正巧最近在学习 Golang 和 React,于是就计划将以上想法做成一个可视化配置的 Web 工具。同时也加入了 Dockerfile 和 webhooks 技术实现了持续集成&持续交付(CICD),方便部署和发布,也算实践了一些想法,下面分享这个简单项目的设计和实现思路。

项目命名为 watchman(更夫),开源地址见:elliotxx/watchman

在线 Demohttp://watch.yangyingming.com

默认登录账号:admin 密码:12345

By

Minikube 入门指南

简单来说,就是 minikube 借助 VirtualBox 创建了名叫 Minikube VM 的虚拟机,然后在这个虚拟机中运行了一个单节点的 Kubernetes 集群 Minikube 利用本地虚拟机环境部署 Kubernetes,其基本架构如下图所示:

用户使用 Minikube CLI 管理虚拟机上的 Kubernetes 环境,比如:启动,停止,删除,获取状态等。一旦 Minikube 虚拟机启动,用户就可以使用熟悉的 Kubectl CLI 在 Kubernetes 集群上执行操作。

from Minikube - Kubernetes本地实验环境

By

k8s.gcr.io 国内无法访问的替代解决方案

Kubernetes 很多组件的镜像全部托管在 gcr.io 这个域名下(现在换成了 k8s.gcr.io);由于众所周知的原因,这个网站在国内是不可达的;

By

200 行代码实现一个简单的命令行解析库

本文介绍一个简单的、只有 200 行代码的命令行解析库的实现原理,库暂命名为 ArgParse。

命令行解析库一般在写命令行 CLI 工具的时候会使用到,它的主要作用是方便的配置和解析命令行参数,Go 语言标准库中其实就提供了一个命令行解析库 flag, 但是在使用过程中发现 flag 不支持同时识别多个参数,比如 -nfp 10 这样的参数集合。于是我就撸了个简单的命令行解析库,其中也借鉴了 flag 的思路。

名字嘛,因为之前使用过 python 中的 ArgParse,所以这个简单的 Go 语言命令行解析库也叫做 ArgParse 好了。

开源地址:elliotxx/argparse

By

对于 12-Factor 开发规范的一些理解

12-Factor 是 Heroku 的工程师结合大量实践经验总结出的软件开发规范,它包含 12 条开发规范。在当前万物上“云”的时代,不管对于开发人员还是运维人员,12-Factor 都十分有借鉴作用。而遵循 12-Factor 规范开发的应用程序,被称为 12-Factor App。

官方文档(中文):https://12factor.net/zh_cn/

这篇英文博文总结的很精炼:"12-FACTOR APP" SUMMARY

由于官方文档翻译的不太流畅,所以笔者在这里结合原文聊聊个人的粗浅理解。

By

Golang 间接实现 interface的一种方式

在看 k8s HPA 的时候,发现一段有意思的代码

By

C++ 中类的函数重载(overload)、函数重写(override)、虚函数重写(virtual override)、虚函数重载(virtual overload)区别

重载和重写都是对同名函数的处理,区别是处理的同名函数参数类型、个数、返回值是否完全一样。

重载(overload):定义多个同名函数,这些同名函数的参数类型、个数、返回值可以不一样。

重写(override):存在于子父类之间,在子类中重新定义从父类继承的同名函数(参数类型、返回值要求完全一样)

By

在 VSCode 中配置 C++ 环境

参考了一些博客,最后加了些自己的配置,方便以后配置。

其中重点参考了:VSCode下配置C++

By

Vultr 修复记

过了个春节,回来发现梯子失效了,一下子打回原型,感觉和世界失去了联系。

查看了一下 vultr 服务器,ssh 能正常登录,ss 也能连上,但信号就是翻不出去。

查了下原因,可能是 ss 的端口号被封了。

于是我换了个 ss 的端口号,手动设置防火墙开放该端口,重载防火墙设置,修复成功。

By

搭个网站免费无限制看漫画

By

使用 argparse 编写自己的命令行工具

如果你还在用 sys.argv 的方式解析复杂的命令行参数,那儿你就 out 了!快来使用更加强大的 argparse 吧~

By

编写 setup.py 打包 python 程序且安装到命令行运行

这两天封装了一个异常点检测的工具,并且需要把它部署到一个新环境中。为了方便使用,我想到编写 setup.py 打包/安装我的 python 程序。

By

Pandas 学习拾遗

By

使用 Docker 部署基于 Nginx + uWSGI + Django 的大POST请求应用

这段时间用 Django 写了个接口,需要处理大POST请求,比如请求中带有10M甚至100M的数据。

由于我采用的应用框架是 Nginx + uWSGI + Django,所以需要修改 Nginx 和 uWSGI 的配置文件,将其中的 POST 限制调大。

查了相关资料,Nginx 中与请求大小限制相关的字段是 client_max_body_size,直接在配置文件中调大这个字段的值就好了;uWSGI 比较麻烦,配置字段比较多,最后确定了几个相关的大小限制字段,调大了它们就好了。uWSGI配置文档可参考:uWSGI配置文档翻译

刚开始当时测试的时候只调大了 Nginx 的大小限制,但是一直报 502 错误,看了下日志发现是上游服务器(也就是 uWSGI)的问题,这部分浪费了不少时间。

By

一个 Vue+Django 小型 web 应用的 Docker 化实践案例

由于经常在部署应用上花费时间,前段时间学习了一下 Docker,其中踩了不少坑。这里分享一个 Vue 作前端,Django 作后端的小型 web 项目 Docker 化的实践案例以及一些心得。

By

Docker 入门指北(踩坑心得)

自从上次在一台陌生服务器上部署一个比较简单的web服务花了我半个多小时之后,我就觉得是时候学一下这个闻名已久的大鲸鱼(Docker)了。

By

如何在无 root 权限且无网络的 linux 环境中安装软件?

上学期申请了学校集群,但是登陆后发现米有root权限也没有网络,这样就不能愉快地用 apt-get install 或者 yum install 安装软件了,一时之间十分尴尬。

于是在这种艰难条件下我学会了自力更生,查了各种资料,解决方案如下:

  1. 由于没有 root 用户,所以所有工具都需要编译安装

  2. 由于服务器只能连接内网,无法连接外网,所以所有工具的源码包需要通过 ftp 上传到服务器

  3. 由于编译安装到本地,所以尝试在用户目录中创建 /usr 目录,以存放编译好的工具

  4. 尝试配置用户级的 $PATH,每次登陆自动加载编译过的工具路径

以下是具体解决步骤和软件安装示例。

By

【深度学习】对模型复杂度的理解

今天在看李沐老师的《动手学深度学习》时,觉得有段话说得很好。

在这里记录一下关于模型复杂度对拟合以及调整网络节点数的思考:

欠拟合就是训练过程中误差难以下降,过拟合就是训练之后,测试误差要远比训练误差大。

如果模型复杂度太低(参数过少),即模型可训练空间太小,就难以训练出有效的模型,便会出现欠拟合。

如果模型复杂度太高(参数很多),即模型可训练空间很大,在大量样本输入后容易训练过头,便会出现过拟合。

所以控制好模型复杂度(参数数量),是调整欠拟合和过拟合的一种方法。

换句话说,可以通过训练效果的图表判断是过拟合还是欠拟合,以此为依据调整网络的结构。

比如如果欠拟合了,表示无法充分训练,可以将网络层的节点数量调大一些。

这样就找到一种调整网络节点数的依据,而不是仅靠经验。

By

ISSO 评论系统部署攻略

自从多说关闭服务,这一年多来一直没找到合适的评论系统,之前多说关闭前保存的历史评论数据都快凉透了,于是干脆自己搭建评论系统,好在找到一个还不错的开源评论系统——ISSO。

下面是部署 ISSO 的过程。

By

使用 DPlayer && 七牛云 在博文中优雅的嵌入视频(基于Django)

最近逛博客的时候看到他们在博文中嵌入了视频,播放器无边框、设计简洁、甚至还有弹幕功能,十分好看优雅。分享几个博主的页面:

其实在这之前我还使用过bilibili自带的播放脚本,在视频页面点击分享可以找到,复制到博文中就可以出现一个播放器,点击就可以播放视频,但是这个播放器带B站的广告,还有很多零零碎碎的东西,总之不够简洁。

查看这几个博主的页面才发现他们用的是一款web播放器————DPlayer,是前端大佬 DIYGod 的开源项目。

项目地址:MoePlayer/DPlayer

文档地址:中文文档

看到 DPlayer 简洁的界面和弹幕功能后我简直如获至宝,这就是我心中的理想web播放器呀!