sbw Blog - 程序设计
  • 来源: sbw Blog | 浏览: 6 | 评论: 0 | 时间: 2024-03-10
    Diesel是Rust中很流行的数据库ORM框架。而由于在MySQL中,时间的默认值以一种与Rust不兼容的方式存储,可能会导致在使用Diesel获取时间类型时,可能由于序列化转换失败而导致数据获取失败。经过查找多个资料,终于找到了一种可以自己定义时间类型处理的方式。
  • 来源: sbw Blog | 浏览: 2 | 评论: 0 | 时间: 2024-02-18
    这个标题需要进一步解释一下,变长存储的编码方式通常用于存储无符号类型,而在Lua中一些表示如字符串长度或列表长度的字段是使用int类型存储的。也就是说,在Lua中这些类型虽然声明的是有符号类型,但实际是以无符号类型使用的,这可能会造成一点理解上的歧义。 简单来说,在Lua中存储size_t类型的数据时,使用了一种变长的编码格式进行存储以节省目标文件的大小。
  • 来源: sbw Blog | 浏览: 68 | 评论: 0 | 时间: 2023-02-12
    编译器后端中指令的编码是一项非常繁杂、易错的工作。需要查找大量的手册资料才能拼接出二进制序列,并且测试成本也比较高。于是研究了下,使用LLVM的模块完成指令的编码,自己的编译器这端只需要输出到符号化的汇编指令即可,大大减少了查文档拼二进制这项令人头秃的工作。
  • 来源: sbw Blog | 浏览: 169 | 评论: 0 | 时间: 2022-10-08
    我的博客使用了Rust中最常用的serde处理数据序列化。由于需要在数据库中读取一些时间字段,并且处理后再传递给js使用,而serde默认是没有对DataTime等时间类型做处理的,此时就需要使用serde提供的扩展宏来使用自定义类型的序列化。这里以NaiveDateTime作为示例记录如何进行自定义类型的序列化。
  • 来源: sbw Blog | 浏览: 46 | 评论: 0 | 时间: 2022-08-30
    我的博客是用Rust的actix-web框架写成的,为了方便部署,整个应用是放在Docker上运行的。最近更新了博客的代码,从actix-web 3.x升级到了4.x,其它的依赖包也尽可能的更新到了最新版本。在部署的时候发现,上一次更新博客程序已经是2年前了,都已经有点儿忘记之前是怎么部署的了,所以这次捣鼓完赶快写个文档记录一下。
  • 来源: sbw Blog | 浏览: 2447 | 评论: 0 | 时间: 2020-02-23
    做了道蓝桥杯算法题:赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。 假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。 由于方案数可能过多,请输出模 10^9 + 7 的结果。
  • 来源: sbw Blog | 浏览: 1572 | 评论: 2 | 时间: 2019-08-09
    “Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.”——这是 LeetCode 上的一道 Hard 级别的题,是说将多个已经排序的有序序列合并成一个大的有序序列。使用优先队列的方式完成了这个题目,时间应该是 O(nm)。
  • 来源: sbw Blog | 浏览: 3811 | 评论: 0 | 时间: 2019-04-14
    了解过 C 语言的应该都知道,在 C 标准库中的 rand 函数实际上是一种伪随机数生成算法。它使用“线性同余”算法进行一个迭代计算,这样计算的结果虽然分布上是满足随机分布的,但在得知具体算法及观察了当前数据之后,后续的随机数是可“预测”出来的。为了尽可能得到更“随机”的随机数,有很多种办法,而使用 CPU 内置的硬件随机数生成指令就是其中一种。
  • 来源: 石博文博客 | 浏览: 2583 | 评论: 8 | 时间: 2019-03-31
    最近把自己的博客网站使用 Rust 语言重写了,利用的是 actix-web 这个框架。然后就一直想实现文章评论的回复邮件提醒这个功能,由于是自己写的网站,而且 actix-web 也没有提供像 wordpress 那样丰富强大的插件系统,所以这个需求就只能自己实现了。查了一圈之后,发现 lettre 这个库的 API、doc 什么的都比较完善,甚至直接提供了一个发邮件的 example,于是就准备利用这个库来实现一个发邮件的功能。
  • 来源: 石博文博客 | 浏览: 2608 | 评论: 0 | 时间: 2019-03-29
    上一篇已经成功深入到指令层面了,这一篇就开始使用 IRBuilder 对函数流程进行修改,使得“不安全”版本的除法函数也增加对除数的零检查。因为除法指令分为整数除法、浮点数除法等等,而例如整数除法又可以细分为有符号数除法、无符号数除法,同时每种除法又根据类型不同分为32位除法、64位除法....。这里为了演示效果,我们只实现了32位的有符号除法。仅仅满足了测试代码的要求,如果要真的在生产中实现这个功能,细节上的很多问题还是要仔细分类处理的。
  • 来源: 石博文博客 | 浏览: 1911 | 评论: 0 | 时间: 2019-03-29
    上一篇中实现了一个简单的编译器插件,它的作用仅仅是在编译过程中输出所有函数的名称。那么这一篇就更深入一步来观察LLVM的中间代码及指令生成部分,从而确定应该如何修改并添加程序逻辑,以实现我们最初的“除法保护”的功能。本篇主要介绍了LLVM编译系统的一些特点及典型用法,包括LLVM的模块划分,IR中的SSA(静态单赋值)概念与 PHI 节点的概念,以及如何使用 LLVM 的 IR Builder 在编译过程修改或插入一些逻辑代码。
  • 来源: 石博文博客 | 浏览: 2171 | 评论: 0 | 时间: 2019-03-28
    在上一篇中介绍了LLVM/Clang的编译器插件可以用来进行一些简单的编译器功能扩展,从这篇开始就一步步来实现这个编译器插件。本篇主要介绍了如何建立LLVM/Clang编译器插件的开发环境及开发目录配置,如何使用CMake编译系统组织起整个工程项目来,以及使用最基本的LLVM趟管理器遍历输出函数信息等。
  • 来源: 石博文博客 | 浏览: 2278 | 评论: 2 | 时间: 2019-03-28
    LLVM/Clang 提供了编译器插件机制可供扩展编译器的功能,实际上 LLVM/Clang 本身的很多功能也是以插件方式注册到编译器系统中进行实现的。在一些对安全要求极端苛刻的环境下,或是一些特殊的硬件平台中,总有一些奇怪的需求,而这些定制化的功能如果不是很复杂,就没有必要大动干戈去修改编译器,可以使用编译器插件来完成。这个系列文章设想一种需要进行除法保护的应用场景,需要在编译层面对除法进行强制检查,以杜绝除零异常的发生。