置顶
简单描述一下我的博客:
首先这是一个萌新成长过程的记录,不是一个大佬的经验分享。其次懂得越多,越觉得自己写的烂,所以更新越来越慢,是因为有太多东西没有消化,不想写一些烂的东西。
补充,除部分自己分享的,还有很多整理搬运的,有一些忘记贴参考链接,后面更的能找到都会贴上。
时间线:
2024年01月21日15:32:20
看了下一不小心就快两年没更新博客了,可能是因为中间做的东西太杂了,也可能是进入了一段时间的舒适区懈怠了吧。不过博客我会一直留着的,哪怕是很久以后,不写代码了,也会作为记录生活的地方吧。
2022年11月13日21:57:44
然后每回过头看一遍我的博客,就会删除一些旧的文章,会的越多不会的越多,现在还不知道写些什么,目前在学习c++,后续可能会写一些c++相关的东西?
2021年12月11日22:33:23
不小心把一个备案域名解析到香港服务器了,备案失效了,导致七牛云的资源全部下不下来了。。
然后找了下用 qshell 这个工具,自己写了个shell脚本,把资源全部转移到自己的服务器上了,慢就慢吧。。
2021年11月10日21:03:38
删除了一些之前流水账博文,并 ...
nodejs调用c++
使用nodejs调用c++的方法很简单,网上也有很多教程,但是为什么公司一般不会大规模去使用c++扩展呢。
nodejs使用c++扩展的优缺点优点:
c++作为编译型语言,是执行速度最快的编程语言之一,使用c++扩展可以提高代码的运行效率
c++拥有丰富的开源库,如果有些功能在nodejs中找不到合适的库,可以使用c++的库
缺点:
开发难度高、调试麻烦、维护成本高,并且跨平台时要编译多个版本
Napi将nodejs数据结构和c++数据结构相互转换是比较消耗性能的,所以使用c++扩展通常会比直接使用nodejs还要慢
当然,还是有一些程序适合使用c++扩展来写的,比如一些输入输出极其简单,但是计算过程却很复杂的程序。
比如nodjes的核心库 crypto,通过查看源码可以发现如下代码片段:
1234567891011121314// node/lib/crypto.jsconst { getFipsCrypto, setFipsCrypto, timingSafeEqual,} = internalBinding('crypto' ...
go的接口和类型
二刷 the go programming language,接口这块第一遍没太懂,第二遍大概懂了。
接口go语言的接口的独特之处在于,它是隐式实现的。
对于一个具体的类型,你不需要声明它实现了哪些接口,只需要提供接口所必须的方法即可。
12345678910111213// io.gotype Writer interface { Write(p []byte) (n int, err error)}type File struct { *file // os specific}// file.gofunc (f *File) Write(b []byte) (n int, err error) { //... 此处省略}
就像标准库的 file 类型,提供了 Write 方法后,就会隐式的实现 Writer 接口。
类型对于传统的面向对象语言,实现接口的目的是可以使用不同的类型调用接口值的方法,即多态。
go 语言中的类型可以分为 具体类型 和 接口类型:
具体类型,比如 string、slice 等。
接口类 ...
深入理解nodejs内存分配
因为最近遇到很多关于内存的问题,所以决定再次探究回顾一下 node.js 相关的内存知识。
再次删除了一些之前的关于node.js内存的博文,因为在现在看来那些写的太垃圾了。
内存的生命周期
内存分配:由 JavaScript 内部为我们分配内存。
内存使用:由代码来读取内存的数据,或向内存写入数据(比如赋值语句)。
内存释放:由 JavaScript 引擎来进行,内存释放后,可以被 JavaScript 重新分配。
栈(Stack)和堆(Heap)堆栈和堆的概念在数据结构中:
栈的结构比较好理解,一种线性结构,限制:只允许一端出入。所以栈的特点是LIFO(Last In First Out)后进先出。
堆在数据结构中是一种特殊的完全二叉树,所以是一种树状结构。
在计算机内存分配中:
堆(heap)和栈(stack)是两种内在的管理形式。
它们的主要区别是stack按次序排放,大小明确;heap结构则不固定,是一种可动态分配和释放的内存。单从这一点看,stack的寻址速度要比heap快,heap的灵活性则比较高。一般来说,每个线程分配一个stack,每个进程分配一个heap。 ...
囚徒健身
最近天气冷了,里三件外三件,去健身房换衣服太麻烦还容易感冒,不太想去了。
之前别人安利过《囚徒健身》这本书,看了下感觉理念还不错,还可以在家练,记录一下关键动作,方便查阅。(目前每个动作先记录了前两式,后面的根本做不到,等前面能做到了再记录后面更难的动作)
俯卧撑第一式 墙壁俯卧撑面对墙壁站立,双脚并拢,双臂伸直,与肩 同宽,双手平放在墙上,手掌与胸等高。这是该 动作的起始姿势(图 1)。
弯曲肘部,直到前额 轻触墙面。这是该动作的结束姿势(图 2)。
然后将自己推回到起始姿势,如此重复。
初级标准:1 组, 10次
中级标准:2 组, 各25次
高级标准:3组,各50次
第二式 上斜俯卧撑做这个动作需要借助一个稳固的物体,高度 大约是你身高的一半(大概到臀部位置)。
双脚并拢,身体成一条直线,然后 前倾上身,双臂伸直,双手抓住所选物体,与肩 同宽。这是该动作的起始姿势(图 3)。
弯曲肘部,放低身体,直到胸部轻触物体顶 部。如果你选择的物体高度合适,那么此时你的 身体与地面的夹角约为 45°(图 4)。
暂停一 会,然后将自己推回到起始姿势,如此重复。
初级标准 ...
博客迁移到私有服务器上
今天把博客,从码云的 gitpages 服务,迁移到了自己的服务器上,记录分享一下。
原因至于为什么不用 github 的 gitpages,主要是打开太慢了。。
码云的 gitpages 部署之后,需要手动去更新一下才能生效。
码云的 gitpages 有时会抽风,遇到过两次一直在部署中,无法操作的情况。
原来用第三方的原因是,自己的服务器搭梯子经常被封,中间有段时间没买服务器;但是呢,七牛云的免费额度只有 http 请求,所以前端时候在服务器搞了个反向代理。就是 https 站点 -> https图片资源 -> http图片资源 这么一个过程。。所以服务器就不能停了,不然博客的图片就全部要挂了。
准备工作
一台服务器
安装 nginx,go,docker。容器化部署nginx教程
代码仓库设置一个 webhook
自动部署自动部署大概流程是这样
自动部署脚本大概长这样:
12345678910111213cd /root/codespace/blog && git checkout hexo && git pull ...
初识redo log和binlog
整理下 mysql 的 redo log 和 binlog 相关知识。
这个是照着画的一个 mysql 逻辑架构图,方便后面对照着理解。
需要注意的是:mysql8.0 干掉了查询缓存这个模块。(因为查询缓存失效的很频繁,本来就很鸡肋,默认都是关闭的)
什么是物理日志 和 逻辑日志?我的理解是这样的,物理日志记录的是值得变更结果,逻辑日志记录的是值得变更过程。
比如把 a 值初始为1,我们给 a 加二再减一
物理日志为:a:1->a:3 和 a:3->a:2
逻辑日志为: a=a+2 和 a=a-1。ps: 在mysql中可以理解为一条条sql语句
什么是 redo log?redo log 是物理日志,并且是 InnoDB 特有的。
mysql 的 WAL (Write-Ahead Logging)技术就是通过它实现的,WAL 的意思就是先写日志,再写磁盘。
这里需要注意一下,所谓的 “先写日志”,其实也是写磁盘,只不过是顺序写,非常快。
”再写磁盘“ 的意思是,向 mysql 真正存储业务数据的地方写数据(也在磁盘上,但是在写之前还要查找、索引B+树节 ...
go错误处理最佳实践
用 go 写过业务代码之后,就会发现,go的错误处理很让人头痛。。(事实上被吐槽的确实很多~)
然后刚好在极客时间薅了一节体验课。整理一下。以供参考。
注:对于初学者而言,最起码你要自己写一个curd的demo,不然看完之后不会有什么感觉。
Sentinel Error预定义的特定错误,我们叫为 sentinel error。
这个名字来源于计算机编程中使用一个特定值来表示不可能进行进一步处理的做法。所以对于 Go,我们使用特定的值来表示错误。
常用的比如 io 标准库的 EOF 错误表示读文件读到了结尾,但是它并不属于错误,
所以我们可能会这么写:
1234if err != nil && err != io.EOF { return nil, err}// dosomething
包括在使用 gorm 的时候:
1234if err != nil && err != gorm.ErrRecordNotFound { return nil, err}// dosomething
这种写法有什么 ...
工厂模式
因为一直在搞 node.js,对设计模式了解一直比较少,看了书不实践也记不住。最近在补充设计模式的知识。
工厂方法模式是一个比较常见的设计模式。
大部分资料将工厂方法模式分为三种:简单/静态工厂模式、工厂方法模式、抽象工厂模式。
简单工厂是对工厂方法的简化,而抽象工厂是对工厂方法的增强。
本文主要用 golang 来实现以下这三种工厂,然后分析一下优劣。
本文代码仓库地址
简单工厂假设我们现在需要实现文件存储的功能:
我们开发的时候使用 native 的服务器本地存储
线上环境使用腾讯云oss 存储
先定义一个公共接口:
12345678package ossimport "fmt"type OssImpl interface { GetObject() error PutObject() error}
目前我们有 本地 和 腾讯云oss两个途径,分别实现这个接口:
123456789101112131415161718192021222324252627type tencentOss struct { name string ...
go的math/rand标准库
go语言中 math/rand 包来提供随机数相关功能。
基本用法为了方便测试,我们新建一个 time_test.go 文件
执行以下代码:
123456789func TestTime(t *testing.T) { for i := 0; i < 5; i++ { fmt.Println(rand.Int()) }}// output:557700679194777941086746652230821535516129484611666145821
我们发现,我们无论执行多少次,输出的结果总是一样的。。
查找标准库文档,我们发现我们可以修改 seed 来获取不一样的结果
1234567891011// func Seed(seed int64) { globalRand.Seed(seed) }func TestTime(t *testing.T) { rand.Seed(2) for i := 0; i < 3; i++ { fmt.Println(rand.Int()) ...