<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>sbw Blog</title><link>https://blog.sbw.so</link><description></description><copyright>© 2018 sbw</copyright><item><title>Diesel中处理MySQL中的无效时间戳</title><link>https://blog.sbw.so/u/diesel-deserialize-mysql-invalid-all-zero-timestamp.html</link><description><![CDATA[Diesel是Rust中很流行的数据库ORM框架。而由于在MySQL中，时间的默认值以一种与Rust不兼容的方式存储，可能会导致在使用Diesel获取时间类型时，可能由于序列化转换失败而导致数据获取失败。经过查找多个资料，终于找到了一种可以自己定义时间类型处理的方式。
]]></description><author>sbw Blog</author><category>程序设计</category><comments>Diesel中处理MySQL中的无效时间戳</comments><pubDate>2024-03-10 14:36:00</pubDate></item><item><title>Lua中对表示大小的整数类型的变长存储编码</title><link>https://blog.sbw.so/u/lua-variable-length-quantity-encoding.html</link><description><![CDATA[这个标题需要进一步解释一下，变长存储的编码方式通常用于存储无符号类型，而在Lua中一些表示如字符串长度或列表长度的字段是使用int类型存储的。也就是说，在Lua中这些类型虽然声明的是有符号类型，但实际是以无符号类型使用的，这可能会造成一点理解上的歧义。
简单来说，在Lua中存储size_t类型的数据时，使用了一种变长的编码格式进行存储以节省目标文件的大小。]]></description><author>sbw Blog</author><category>程序设计</category><comments>Lua中对表示大小的整数类型的变长存储编码</comments><pubDate>2024-02-18 21:23:23</pubDate></item><item><title>借助LLVM的MCCodeEmitter完成指令编码</title><link>https://blog.sbw.so/u/use-llvm-codeemitter-to-encode-instruction.html</link><description><![CDATA[编译器后端中指令的编码是一项非常繁杂、易错的工作。需要查找大量的手册资料才能拼接出二进制序列，并且测试成本也比较高。于是研究了下，使用LLVM的模块完成指令的编码，自己的编译器这端只需要输出到符号化的汇编指令即可，大大减少了查文档拼二进制这项令人头秃的工作。]]></description><author>sbw Blog</author><category>程序设计</category><comments>借助LLVM的MCCodeEmitter完成指令编码</comments><pubDate>2023-02-12 04:43:13</pubDate></item><item><title>在Rust的serde库中处理日期/时间类型的序列化</title><link>https://blog.sbw.so/u/rust-serde-datetime-custom-type-serialize-deserialize.html</link><description><![CDATA[我的博客使用了Rust中最常用的serde处理数据序列化。由于需要在数据库中读取一些时间字段，并且处理后再传递给js使用，而serde默认是没有对DataTime等时间类型做处理的，此时就需要使用serde提供的扩展宏来使用自定义类型的序列化。这里以NaiveDateTime作为示例记录如何进行自定义类型的序列化。]]></description><author>sbw Blog</author><category>程序设计</category><comments>在Rust的serde库中处理日期/时间类型的序列化</comments><pubDate>2022-10-08 02:15:46</pubDate></item><item><title>sbw-blog 的 Docker 部署方案</title><link>https://blog.sbw.so/u/the-docker-deployment-on-sbw-blog.html</link><description><![CDATA[我的博客是用Rust的actix-web框架写成的，为了方便部署，整个应用是放在Docker上运行的。最近更新了博客的代码，从actix-web 3.x升级到了4.x，其它的依赖包也尽可能的更新到了最新版本。在部署的时候发现，上一次更新博客程序已经是2年前了，都已经有点儿忘记之前是怎么部署的了，所以这次捣鼓完赶快写个文档记录一下。]]></description><author>sbw Blog</author><category>程序设计</category><comments>sbw-blog 的 Docker 部署方案</comments><pubDate>2022-08-30 02:58:20</pubDate></item><item><title>交叉编译一个Sparc平台的小工具</title><link>https://blog.sbw.so/u/sparc32-gcc-cross-compile-for-router.html</link><description><![CDATA[前几天，一个朋友问我能不能帮忙把一个自己写的小程序编译到一个Sparc平台的小型路由器上运行。当时我一听这个需求，感觉应该是没什么难度的，只需要对好目标平台环境，然后交叉编译即可。但在和他合作过程中发现，由于目标平台是经过魔改的，就导致各种编译不过。]]></description><author>sbw Blog</author><category>Linux</category><comments>交叉编译一个Sparc平台的小工具</comments><pubDate>2021-10-12 01:24:10</pubDate></item><item><title>Windows10和Archlinux共享蓝牙鼠标</title><link>https://blog.sbw.so/u/share-bluetooth-mouse-windows10-archlinux.html</link><description><![CDATA[以前在乔老师的博客里看到过通过获取Windows下的蓝牙配对信息，修改Linux下的配置文件，达到共享蓝牙设备的途径。现在真的有这个需求了，跟着他的教程却发现由于我的鼠标可能因为支持的蓝牙版本问题，没有走低功耗协议，导致配置上和之前不太一样。不过这种的配置项更容易修改，完美解决了每次换系统都要重新配对蓝牙设备的问题。]]></description><author>sbw Blog</author><category>IT资讯</category><comments>Windows10和Archlinux共享蓝牙鼠标</comments><pubDate>2021-02-18 01:24:21</pubDate></item><item><title>将actix-web网站封装在docker中</title><link>https://blog.sbw.so/u/run-actix-web-site-on-docker.html</link><description><![CDATA[最新给网站添加了一些新功能，所以又重新编译部署了一下。由于我本地使用的是Archlinux，而跑网站的服务器使用的是Debian，编译出来的二进制在运行时出现libc版本不匹配的问题。直接在服务器上编译需要太多编译依赖，服务器上的内存和磁盘资源也不太够用，于是就决定使用docker。]]></description><author>sbw Blog</author><category>Linux</category><comments>将actix-web网站封装在docker中</comments><pubDate>2020-08-31 01:09:14</pubDate></item><item><title>配置git-credentials完成git身份认证</title><link>https://blog.sbw.so/u/use-git-credentials-auth-system.html</link><description><![CDATA[在使用git协议拉取远程代码时，是需要进行用户身份认证的。虽然使用github的开源库+HTTPS协议可以避免认证，但有些不方便公开的私有库就没办法使用了。在使用一些自动化脚本或构建系统时，无法人工手动的输入密码，这就需要使用git所提供的credentials功能来完成用户认证了。]]></description><author>sbw Blog</author><category>Linux</category><comments>配置git-credentials完成git身份认证</comments><pubDate>2020-06-02 01:49:56</pubDate></item><item><title>使用QEMU配置一台ARMHF虚拟机</title><link>https://blog.sbw.so/u/use-qemu-create-virtual-machine-armhf.html</link><description><![CDATA[最近进军了ARM平台编译后端的工作，平时都是用公司的PLC硬件进行测试，无奈成品上除了必需的几个工具之外，像GDB这像的调试软件都没法部署。由于之前搞路由器的时候配过MIPS系统的虚拟机，于是就想着也配台ARM虚拟机来做测试用。]]></description><author>sbw Blog</author><category>Linux</category><comments>使用QEMU配置一台ARMHF虚拟机</comments><pubDate>2020-03-21 23:14:46</pubDate></item><item><title>使用QEMU配置一台虚拟MIPS系统</title><link>https://blog.sbw.so/u/create-mips-virtual-machine-in-qemu.html</link><description><![CDATA[最近在MIPS上搞点事情，为了方便测试，就想着配一台MIPS虚拟机来用。由于QEMU对各种架构的虚拟化都支持的很好，所以当然选择用QEMU来运行虚拟机。另外，还需要一个具有官方MIPS支持的Linux发行版，我选择的是Debian的最新版ISO。安装过程倒也顺利，只是由于没有BIOS固件，在安装完成后需要一些特殊操作来辅助启动。]]></description><author>sbw Blog</author><category>Linux</category><comments>使用QEMU配置一台虚拟MIPS系统</comments><pubDate>2020-02-27 23:58:36</pubDate></item><item><title>蓝桥杯算法题目-垒骰子-使用 C++ 解法</title><link>https://blog.sbw.so/u/lanqiao-cpp-dice-combination-code.html</link><description><![CDATA[做了道蓝桥杯算法题：赌圣atm晚年迷恋上了垒骰子，就是把骰子一个垒在另一个上边，不能歪歪扭扭，要垒成方柱体。经过长期观察，atm 发现了稳定骰子的奥秘：有些数字的面贴着会互相排斥！ 我们先来规范一下骰子：1 的对面是 4，2 的对面是 5，3 的对面是 6。 假设有 m 组互斥现象，每组中的那两个数字的面紧贴在一起，骰子就不能稳定的垒起来。atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相同，当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。 由于方案数可能过多，请输出模 10^9 + 7 的结果。]]></description><author>sbw Blog</author><category>程序设计</category><comments>蓝桥杯算法题目-垒骰子-使用 C++ 解法</comments><pubDate>2020-02-23 19:33:04</pubDate></item><item><title>使用HAProxy为Shadowsocks做负载平衡</title><link>https://blog.sbw.so/u/haproxy-shadowsocks-load-balance-useibility.html</link><description><![CDATA[为了高可用，以及平衡多个Shadowsocks服务器流量，可以借助HAProxy代理+多个Shadowsocks服务端来配置一个Shadowsocks服务群。利用HAProxy的4层代理作流量分发，使用外部检查工具实时监控Shadowsocks服务器的状态，以完成服务群的配置。]]></description><author>sbw Blog</author><category>IT资讯</category><comments>使用HAProxy为Shadowsocks做负载平衡</comments><pubDate>2020-02-02 21:04:29</pubDate></item><item><title>升级Php 7.4带来的两个大坑</title><link>https://blog.sbw.so/u/php-fpm-7.4-file-not-found-array-type-null-error.html</link><description><![CDATA[由于我机器用的滚动更新的Archlinux，不知不觉Php已经升级到7.4了，没想到这次更新带来了极大的麻烦。首先是Php-fpm的新选项ProtectHome会导致经典的File not found错误，再是Php解释器会对null类型的下标访问直接报错Trying to access array offset on value of type null。]]></description><author>sbw Blog</author><category>Web技术</category><comments>升级Php 7.4带来的两个大坑</comments><pubDate>2019-12-08 21:23:53</pubDate></item><item><title>在zsh和vim中使用fzf进行模糊查找</title><link>https://blog.sbw.so/u/use-fzf-in-vim-zsh-to-fuzzy-search.html</link><description><![CDATA[fzf是一个很强大的命令行下的模糊搜索工具，它可以很快速的根据关键词进行文件查找。在使用vim开发一些大型项目时，由于源代码树非常庞大，像NERDTree、netrw这样的文件浏览工具已经不能方便的在繁杂的目录树中快速定位到一个文件了。或者是在zsh中想要查找一个历史命令，靠zsh自己的ctrl+r或是按上箭头进行查找也很不方便，此时就可以借助fzf利器进行快速查找了。]]></description><author>sbw Blog</author><category>Linux</category><comments>在zsh和vim中使用fzf进行模糊查找</comments><pubDate>2019-10-07 04:10:25</pubDate></item><item><title>使用 ip6tables 配置一个用于拨号上网的 ipv6 防火墙</title><link>https://blog.sbw.so/u/use-ip6tables-config-fire-wall-for-ipv6.html</link><description><![CDATA[最近修改了家里网络的连接方式，电脑直接通过光猫拨号了。这样电脑等于是直接暴露在公网状态下，因此部署防火墙是十分必要的。本来是想用新的 nftables，但是之前的使用经历让我觉得它还不是很成熟（主要是看大家都不怎么愿意用，现在还是强制依赖 iptables），于是还是选择使用 iptables/ip6tables 来配置防火墙。其中拨号上网时，ipv6 的防火墙配置需要一点额外设置，否则无法正常拨号到 ipv6 地址。]]></description><author>sbw Blog</author><category>Linux</category><comments>使用 ip6tables 配置一个用于拨号上网的 ipv6 防火墙</comments><pubDate>2019-09-16 00:16:20</pubDate></item><item><title>LeetCode-Merge K Sorted Lists 解题思路</title><link>https://blog.sbw.so/u/leetcodee-merge-k-sorted-lists-solution.html</link><description><![CDATA[“Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.”——这是 LeetCode 上的一道 Hard 级别的题，是说将多个已经排序的有序序列合并成一个大的有序序列。使用优先队列的方式完成了这个题目，时间应该是 O(nm)。]]></description><author>sbw Blog</author><category>程序设计</category><comments>LeetCode-Merge K Sorted Lists 解题思路</comments><pubDate>2019-08-09 13:40:13</pubDate></item><item><title>字节跳动面试经历 [2]（完）</title><link>https://blog.sbw.so/u/byte-dance-rust-interview-procedure.html</link><description><![CDATA[在第二面之后的三周，终于收到拒信了2333。不过还是复盘并记录一下这次的面试经历，为以后跑路做准备。从面试的结果来说，至少是和我的准备情况想匹配的吧，匆忙上阵还是有点乱阵脚，所以最近准备先刷刷题再找机会了。整体来说，面试的感觉还是不错的。个人目前对字节跳动的整体印象也挺好（除了他们的工作时间）。算是挺技术向，而且感觉人都挺有激情的吧。]]></description><author>sbw Blog</author><category>杂谈</category><comments>字节跳动面试经历 [2]（完）</comments><pubDate>2019-06-15 03:56:58</pubDate></item><item><title>使用 V2Ray+CloudFlare 解救 shadowsocks 服务</title><link>https://blog.sbw.so/u/use-cloudflare-forward-shadowsocks-v2ray-traffic.html</link><description><![CDATA[最近又有一大波 vps 遭殃了，和以前的某个端口被干扰不同，这次被 gfw 盯上的主机算是完全的“失联”了，以至于像 ssh、ping 这样的数据包都完全被阻断。而一旦你的 ip 被像这样阻断后，这个 ip 在一个无法预估的时间内都无法正常使用，因此很多服务商也会拒绝换 ip、换数据中心这样的操作。那么只好利用 CloudFlare 这样的 CDN 服务做跳板，配合 simple-obfs 或 V2Ray 这样的流量混淆服务来拯救了。]]></description><author>sbw Blog</author><category>IT资讯</category><comments>使用 V2Ray+CloudFlare 解救 shadowsocks 服务</comments><pubDate>2019-06-07 23:12:28</pubDate></item><item><title>字节跳动面试经历 [1]</title><link>https://blog.sbw.so/u/byte-dance-rust-cpp-interview-experience.html</link><description><![CDATA[虽然我已经决定在老家混日子养老了，但最近还是被一个老同学“忽悠”着内推了字节跳动。被同学一教育，搞得我也确实想再去大城市拼搏一把了。到目前已经面试了两轮了，不得不说长时间不做题，有好些东西都忘了。在这里也算复盘一下，巩固一下基础吧。]]></description><author>sbw Blog</author><category>杂谈</category><comments>字节跳动面试经历 [1]</comments><pubDate>2019-05-26 20:36:22</pubDate></item><item><title>使用 .dot.files 管理配置文件</title><link>https://blog.sbw.so/u/use-dot-files-manage-config-files.html</link><description><![CDATA[之前在网上看一个教程视频，里面的小伙在使用一个独立的repo仓库管理自己所有的配置文件，这样所有的配置文件就可以在不同电脑上“同步”了。感觉这种方式挺好用的，再加上最近GitHub可以免费创建Private Repo了，于是也把自己的配置文件收集了一下，统一放在仓库进行管理。]]></description><author>sbw Blog</author><category>Linux</category><comments>使用 .dot.files 管理配置文件</comments><pubDate>2019-05-13 23:27:23</pubDate></item><item><title>使用x86硬件随机数指令RdRand生成随机数</title><link>https://blog.sbw.so/u/using-x86-hardware-random-number-generator.html</link><description><![CDATA[了解过 C 语言的应该都知道，在 C 标准库中的 rand 函数实际上是一种伪随机数生成算法。它使用“线性同余”算法进行一个迭代计算，这样计算的结果虽然分布上是满足随机分布的，但在得知具体算法及观察了当前数据之后，后续的随机数是可“预测”出来的。为了尽可能得到更“随机”的随机数，有很多种办法，而使用 CPU 内置的硬件随机数生成指令就是其中一种。]]></description><author>sbw Blog</author><category>程序设计</category><comments>使用x86硬件随机数指令RdRand生成随机数</comments><pubDate>2019-04-14 03:26:38</pubDate></item><item><title>配置使用SSL加密的vsftpd服务</title><link>https://blog.sbw.so/u/configure-vsftpd-with-ssl-encrypt.html</link><description><![CDATA[vsftpd 是 Unix 环境下一款功能强大的 ftp 服务器程序，它是Very Secure FTP Daemon的简写。虽然 ftp 协议已经很古老，不经常使用了，但是在同步大量文件的时候，ftp 还是要比 scp 等文件传输方式来的方便的多。由于默认的 ftp 是明文传输，为了安全，一般要配合 SSL 加密同时使用。]]></description><author>sbw Blog</author><category>Linux</category><comments>配置使用SSL加密的vsftpd服务</comments><pubDate>2019-04-03 03:09:11</pubDate></item><item><title>用 NM-dispatcher 实现 WiFi 开关的自动控制</title><link>https://blog.sbw.so/u/nm-dispatcher-auto-switch-between-wifi-ethernet.html</link><description><![CDATA[平时在家用的笔记本由于从来没移动过位置，为了网络稳定就直接插上有线使用了。由于无线网络开着会一直扫描 WiFi 热点，也会占用一些资源，于是我就把无线开关直接关掉了。但是偶尔笔记本也要带出去或者在其它地方用一下，这时候拔掉网线后又要去打开无线网络的开关，就很烦。于是索性直接利用 NetworkMangaer 的 dispatcher 功能：实现了在有线插入时，自动关掉无线；有线网络拔出时，自动打开无线这个功能。]]></description><author>石博文博客</author><category>Linux</category><comments>用 NM-dispatcher 实现 WiFi 开关的自动控制</comments><pubDate>2019-04-01 14:36:50</pubDate></item><item><title>使用 Rust 的 lettre 库发送邮件</title><link>https://blog.sbw.so/u/use-rust-lettre-send-mail-over-smtp.html</link><description><![CDATA[最近把自己的博客网站使用 Rust 语言重写了，利用的是 actix-web 这个框架。然后就一直想实现文章评论的回复邮件提醒这个功能，由于是自己写的网站，而且 actix-web 也没有提供像 wordpress 那样丰富强大的插件系统，所以这个需求就只能自己实现了。查了一圈之后，发现 lettre 这个库的 API、doc 什么的都比较完善，甚至直接提供了一个发邮件的 example，于是就准备利用这个库来实现一个发邮件的功能。]]></description><author>石博文博客</author><category>程序设计</category><comments>使用 Rust 的 lettre 库发送邮件</comments><pubDate>2019-03-31 23:13:13</pubDate></item><item><title>用LLVM/Clang编译器插件实现除法保护(4)[完]</title><link>https://blog.sbw.so/u/use-clang-plugin-modify-ir-instructions.html</link><description><![CDATA[上一篇已经成功深入到指令层面了，这一篇就开始使用 IRBuilder 对函数流程进行修改，使得“不安全”版本的除法函数也增加对除数的零检查。因为除法指令分为整数除法、浮点数除法等等，而例如整数除法又可以细分为有符号数除法、无符号数除法，同时每种除法又根据类型不同分为32位除法、64位除法....。这里为了演示效果，我们只实现了32位的有符号除法。仅仅满足了测试代码的要求，如果要真的在生产中实现这个功能，细节上的很多问题还是要仔细分类处理的。]]></description><author>石博文博客</author><category>程序设计</category><comments>用LLVM/Clang编译器插件实现除法保护(4)[完]</comments><pubDate>2019-03-29 16:40:33</pubDate></item><item><title>用LLVM/Clang编译器插件实现除法保护(3)</title><link>https://blog.sbw.so/u/use-compiler-plugin-change-ir-logic.html</link><description><![CDATA[上一篇中实现了一个简单的编译器插件，它的作用仅仅是在编译过程中输出所有函数的名称。那么这一篇就更深入一步来观察LLVM的中间代码及指令生成部分，从而确定应该如何修改并添加程序逻辑，以实现我们最初的“除法保护”的功能。本篇主要介绍了LLVM编译系统的一些特点及典型用法，包括LLVM的模块划分，IR中的SSA（静态单赋值）概念与 PHI 节点的概念，以及如何使用 LLVM 的 IR Builder 在编译过程修改或插入一些逻辑代码。]]></description><author>石博文博客</author><category>程序设计</category><comments>用LLVM/Clang编译器插件实现除法保护(3)</comments><pubDate>2019-03-29 15:08:26</pubDate></item><item><title>用LLVM/Clang编译器插件实现除法保护(2)</title><link>https://blog.sbw.so/u/clang-compiler-plugin-ir-instruction-modify.html</link><description><![CDATA[在上一篇中介绍了LLVM/Clang的编译器插件可以用来进行一些简单的编译器功能扩展，从这篇开始就一步步来实现这个编译器插件。本篇主要介绍了如何建立LLVM/Clang编译器插件的开发环境及开发目录配置，如何使用CMake编译系统组织起整个工程项目来，以及使用最基本的LLVM趟管理器遍历输出函数信息等。]]></description><author>石博文博客</author><category>程序设计</category><comments>用LLVM/Clang编译器插件实现除法保护(2)</comments><pubDate>2019-03-28 15:17:36</pubDate></item><item><title>用LLVM/Clang编译器插件实现除法保护(1)</title><link>https://blog.sbw.so/u/llvm-compiler-plugin-div-protect.html</link><description><![CDATA[LLVM/Clang 提供了编译器插件机制可供扩展编译器的功能，实际上 LLVM/Clang 本身的很多功能也是以插件方式注册到编译器系统中进行实现的。在一些对安全要求极端苛刻的环境下，或是一些特殊的硬件平台中，总有一些奇怪的需求，而这些定制化的功能如果不是很复杂，就没有必要大动干戈去修改编译器，可以使用编译器插件来完成。这个系列文章设想一种需要进行除法保护的应用场景，需要在编译层面对除法进行强制检查，以杜绝除零异常的发生。]]></description><author>石博文博客</author><category>程序设计</category><comments>用LLVM/Clang编译器插件实现除法保护(1)</comments><pubDate>2019-03-28 03:20:57</pubDate></item><item><title>使用 certbot 一键申请泛域名解析证书</title><link>https://blog.sbw.so/u/use-certbot-create-wildcard-certificate.html</link><description><![CDATA[Let's Encrypt 现在已经支持免费的泛域名证书了。之前为 u.sbw.so 及 blog.sbw.so 等申请了好几个证书，由于申请时间不同，所以续期的时间也不同步，这样管理起来比较费事，所以最近索性全部换成了同一个泛解析的证书。过程中发现 Let's Encrypt 的文档还是介绍的不够清楚，操作起来比较费事，尤其是 DNS 验证这里，只是在 Certbot 这个软件中有一些提示，具体的用法在官网上也没有例子，查了好多文档摸索了半天终于弄好了，在此分享一下。]]></description><author>石博文博客</author><category>Web技术</category><comments>使用 certbot 一键申请泛域名解析证书</comments><pubDate>2019-03-25 16:08:34</pubDate></item></channel></rss>