hexo butterfly 主题插件
说明本博文为笔记性质的内容,全部内容来自于网络,有一些是官方描述,也有一些个人博客上的内容,另外我会把自己操作过程中遇到的问题记下来。如果涉及到版权信息,请联系我删除。 本文汇总了我的博客中用到的(或者曾经用到的)hexo butterfly 主题插件。 NPM 使用使用以下命令来管理插件: 1234567891011# 列出所有插件npm list# 安装插件到博客目录npm install xxxx# 更新插件npm update xxxx# 移除插件npm remove xxxx Hexo 相关的插件 hexo-server:Hexo 的服务器模块 hexo-generator-archive:实现博客 archive 功能 hexo-generator-category:实现博客 category 功能 hexo-generator-tag:实现博客 tags 功能 hexo-renderer-ejs:EJS 的渲染器 hexo-renderer-marked:Markdown 的渲染器(渲染引擎 marked) hexo-renderer-pug:PUG 的渲染器 h...
Chapter.413
雨幕下的城市印象
Chapter.445
追求自己所满足的生活状态,本身就成为了生活的意义
Chapter.337
在飞逝的时光中,他们让未来有所期待
扑克昆特牌玩法设计
开头叨叨这篇文章中,我将会介绍如何用扑克牌(一定程度上)复刻传统昆特牌游戏的玩法。其中会涉及到分析昆特牌游戏为什么如此受玩家欢迎的原因,《巫师 3:狂猎》又被称为 “昆特 3” 是有一定道理的 🐶 通过使用扑克牌复刻昆特牌游戏玩法,可以把昆特牌搬到线下和朋友一起玩,之所以不购买或自制现成的昆特牌桌游套件,是因为扑克牌更容易拿到,而且扑克牌玩昆特牌绕开了一些不重要而且浪费时间的话题讨论中(比如希瑞雅的战力应该给多少)。 在设计这套玩法之前,我玩了很久的昆特牌及其衍生作品,也研究了昆特牌模组的改进,吸取了其他网友的一些灵感。如果你对这个话题感兴趣,欢迎,我的朋友 👏 昆特牌介绍本文所提到的昆特牌为《巫师 3:狂猎》游戏中的小游戏,也被称为 ”传统昆特牌“,并不是 CDPR 后续出的《巫师之昆特牌》与另外两款单机昆特牌游戏。 本文不会啰啰嗦嗦的介绍所有关于该游戏的细节,没必要重复,想阅读本文但不了解昆特牌游戏的读者请先移步:昆特牌 - 猎魔人中文维基 | 獵魔士中文維基 | 巫师狩魔猎人攻略资料站 | The Witcher | Wiedźmin - 灰机wiki - 北京嘉闻杰诺...
处理器 barrier 行为的仿真实现
开头叨叨由于编译器指令重排以及 CPU 乱序执行的问题,处理器指令有可能在多线程执行时遇到一些问题,比如数据竞争,死锁,非预期的计算结果等。为了避免这类潜在的问题,引入了 barrier 的概念。编译器会主动插入 barrier 指令来降低直接调整指令调度环节的复杂性,而硬件的非预期行为也只能通过软件强行做同步来避免。 在处理器架构领域,barrier 是一种同步行为,它通常是指令或者指令 modifier,用来对程序流进行同步控制。在多处理器或多线程处理器中,当不同的程序流遇到 barrier 时,会等待其他程序流同时到达这个同步点,然后再执行后边的程序。 这种方式确保了所有的线程或处理器能够在程序的同一个位置重新对齐。 在一些硬件上,这种行为通过指令实现,比如 intel 的 FENCE 指令,ARM 的 DMB/DSB 指令。大多数 barrier 指令都带有对内存操作的同步,也就是在 barrier 之前的读写内存操作必须在 barrier 点完成,以达到内存访存有序的目的,这通常也被称为 memory fence。概念上讲,fence 是 barrier 的一...
LLVM 风格的 RTTI
开头叨叨众所周知,LLVM project 没有开启 C++ 的 RTTI 特性。一个主要的原因是 LLVM project 认为 C++ RTTI 特性的实现需要使用到虚函数表,对性能并不友好。LLVM 自己实现了一种类似 RTTI 的行为。我们在开发 LLVM 代码时,尤其是需要自己搭建自定义的数据结构时,可能会想用到 RTTI,此时,学习在 LLVM 风格下如何创建类似的 API,就显得尤为重要。 什么是 RTTI难度:⭐ RTTI 是运行时类型识别,全称 Runtime Type Identification,网上有很多介绍这个的资料,属于 C++ 程序员必须要熟悉的内容。 它的主要目的是为程序运行时提供一种对对象类型的获取、操作的方式。 对应到 C++ API 上,有三个 API 会用到 RTTI: dynamic_cast,用来将一个指向基类的指针转换为一个指向派生类的指针,如果转换失败,会返回 nullptr typeid,用来返回对象类型的值 type_info,也就是 typeid 的返回类型,用来存储描述类型的信息 如果不使用这三个 API,关闭 RTTI...
为什么终端开发离不开 Tmux
开头叨叨我在每天的软件开发工作中都离不开 tmux,它极大的提高了我的工作效率,我使用它优化我的工作流程,维护开发环境,并结合其他工具扩展软件开发的体验感。 如果你之前还没有听说过这个软件,我建议你花 20 分钟了解一下它。有非常多的程序员使用这个软件,尤其是需要连接到远程服务器进行开发的同学。但我发现目前中文网络上还很少有能系统的讲解 “为什么要使用 tmux” 的文章,大多数文章都是直接开门见山地罗列怎么配置 tmux,再拉个表格梳理难以记忆的快捷键清单。 在这篇文章中,我不会花大篇幅介绍怎么使用 tmux,而是告诉你为什么要用它,以及我自己实践很多年的使用技巧。 三个 tmux 组件在使用 tmux 之前,有三个重要的概念一定要了解,分别是 session,window 和 pane。简单介绍下。 session 是会话,也就是和操作系统建立的一次通信状态,不过 tmux 中的 session 不同于直接用 shell 建立的 session,可以理解成一种虚拟 session;session 包含 window,默认启动 session 后会带有 1 个 window。...
LLVM New Pass Manager
这是一篇译文,主要介绍了 LLVM 中的 New Pass Manager 原文链接:https://blog.llvm.org/posts/2021-03-26-the-new-pass-manager/by Arthur Eubanks(Mar 26, 2021) Pass Manager 的介绍Pass Manager 的主要用途是调度 Pass 在各 IR 层级按顺序运行。 Pass 分为 transformation pass 和 analyses pass,它们可以选择运行在 module、function 等各种 scope 下,甚至更加抽象地,比如 call graph 上的强连接组件(SCC: strongly connected component)或者 loop 上。 调度可以很简单,比如直接按顺序运行 pass list,或者按遇到的每一个 function 来调用。同时调度也可能很复杂,比如 SCC 在 call graph 中的顺序必须正确。 Pass Manager 还负责管理 analyses pass 的分析结果,比如说支配树(dominat...
CUDA 术语
学习 CUDA 最重要的首先是理解 GPU 和 CUDA 中的各种术语,在不同的平台上,相同或类似的概念却有着不同的称呼,典型的就是在 CUDA 和 OpenCL 的系统中叫法之差异,以及和通用体系结构教材中的称呼。GPU 学习曲线陡峭的一个原因就是术语使用上还未完全统一。 程序抽象类 书中使用的一般性名称 非 GPU 术语 NVIDIA 和 CUDA 术语 AMD 和 OpenCL 术语 详细描述(其他术语标粗体) 可向量化循环 可向量化循环 网格(Grid) 索引范围(NDRange) 在 GPU 上执行的可向量化循环,由一个或多个可以并行执行的线程块(向量化循环体)组成 向量化循环体 (条带挖掘后的)向量化循环体 线程块(Block) 工作组(WorkGroup) 可以在多线程 SIMD 处理器上执行的向量化循环,由一个或多个 SIMD 指令线程构成,可以通过局部存储器通信 SIMD 车道操作序列 标量循环的一次迭代 CUDA 线程(Thread) 工作项(WorkItem) SIMD 指令线程的垂直抽取,对应于一个 SIMD 车道所执行的一个元素。根据遮...














