0%

最近遇到一个类定时器逻辑需求

可以抽象为write和rangeRead两个接口

  • write
    • 超高频,多线程调用
    • 基本按从小到大写入(不严格自增)
    • 基本不重复
  • rangeRead
    • 低频,固定一个线程调用
    • 传入一个key,从最小值到key的所有值批量读取出来并删除

初步筛选方案

多线程方面

阅读全文 »

最初从jekyll迁到hexo的最大动力,就是hexo的live-2d插件的看板娘功能

相关攻略很多,例如Hexo-Live2d安装教程(自定义Live2d),不在赘述

我这里要写的是比较小众的spine模型在web上的展示

spine模型转图片

我兴冲冲的配好了hexo的配置和live-2d插件

阅读全文 »

Blog已经是第三次换框架了

最早是裸写html,然后迁到github pages的jekyll,目前打算换hexo了

由于github pages的jekyll不支持各种插件,因此非常难用

jekyll的缺点

TOC问题

阅读全文 »

在翻看C++标准库源码的时候,突然发现std::sort的实现和我想的很不一样,并不是简单的快排

在查询了一些资料以后,大致搞明白了这个introsort的原理

这篇写的很好:知无涯之std::sort源码剖析

另外就是STL源码分析那一本写的很好,不是本文的重点,简单过一下,我的gcc版本是5.4.0

introsort原理

阅读全文 »

tars的日志库的类图关系很绕,很容易忘,记录一下备用

源码分析基于tag v3.0.0

首先介绍一下会用到的主要代码路径和功能

1
2
3
TarsCpp/util/include/util/tc_logger.h        日志库头文件
TarsCpp/util/include/util/tc_logger.cpp 日志库cpp
TarsCpp/servant/servant/RemoteLogger.h 远程日志实现,本地日志的宏定义

taf的日志库从流程上,分初始化,滚动日志,按天日志三部分,暂时只分析了滚动日志相关逻辑

阅读全文 »

在C++11中,除了原本的左值(lvalue),纯右值(rvalue),还加入了一个新的将亡值(xvalue)

本文试图分析以下问题:

  • 为什么要引入移动构造函数
  • 怎么理解左值和纯右值
  • 怎么理解将亡值

为什么要引入移动构造函数

C++在C++98/03是不推荐用stl的,因为很多类的效率都很低下

阅读全文 »

本篇博客会深入分析条件变量实现来理解两个问题:

  • 为什么条件变量要配合锁来使用 — 信号丢失问题
  • 为什么条件变量需要用while循环来判断条件,而不是if — 虚假唤醒(spurious wakeup)问题

这两个问题不仅是C会遇到,所有语言的封装几乎都不可避免


先区分一下条件和条件变量,条件是指常用情况下,signal线程修改的值,使得cond_wait判断该值后不再阻塞

阅读全文 »

一直以来用的友言第三方评论系统倒闭了,现在连官方网站都打不开了。

所有的评论数据全部丢失,很伤。那我宁愿用开源的评论系统了,例如isso。

下面记录一下isso的使用方法(isso-0.11.1版本)。

安装(阿里云ECS的centos7.3环境)

1
2
3
4
5
6
7
8
9
10
安装pip,sqlite
yum install python-devel sqlite
升级pip
pip install --upgrade pip
根据报错提示安装依赖库
yum install libffi-devel
安装isso
pip install isso
新建立一个数据库目录
mkdir -p /var/lib/isso
阅读全文 »

做分布式事务的时候用到了存储过程加事务,由于忘记在存储过程中捕获异常rollback,导致了死锁

不过我select ... for update锁的是A表,实际线上却是B表被锁死

sql一块之前理解不深入,debug的过程重新复习一下

bug重现

简化逻辑重现核心bug

阅读全文 »

23个设计模式中,大部分多写代码都是可以直接领悟到的。

但是访问者模式不是。一个原因是这个模式的实际应用场景在后端开发流程中特别难遇到(一般用于解决固定问题,游戏开发的复杂逻辑应该能经常遇到),

另外一个原因是这个模式的实现有点绕。

这一篇并不包含实践环节,因为我并没有实际遇到这样的需求,因此本篇只能记录下学习过程了。

双重多态模式

阅读全文 »