我翻了翻 GitHub 上面的项目记录,从2019年的2月开始初始化了记账项目的代码库,到现在2021年的近2月,也该是时候说一说我这两年来设计到的记账心路历程。
关于记账这件事早就已经是一篇红海,做的人很多,死的更多。无数项目突然涌现出来而后又死得消无声息。这篇文章会从几个方面来细数为什么我们那么喜欢记账而又坚持不下来:流水账与复式记账、趣味性与专业性、自动入账与手动入账。
我翻了翻 GitHub 上面的项目记录,从2019年的2月开始初始化了记账项目的代码库,到现在2021年的近2月,也该是时候说一说我这两年来设计到的记账心路历程。
关于记账这件事早就已经是一篇红海,做的人很多,死的更多。无数项目突然涌现出来而后又死得消无声息。这篇文章会从几个方面来细数为什么我们那么喜欢记账而又坚持不下来:流水账与复式记账、趣味性与专业性、自动入账与手动入账。
“你说,你觉得我是一个很菜的人吗?”我没有回答,只是静静地拿起了桌上的酒杯,事实上我也不知道怎么回答?
坐在我对面的是耳先生,我和他已经一年没有见面了。今天是圣诞节的晚上,很难得我可以把他约出来,但是坐下来已经快半个小时了,他才缓缓说出这句话。
在 Rust 1.45 中,Rust 的{卫生宏}(Hygienic macro)迎来了 stable 版本,这意味着{过程宏}(Procedural macro)和{声明宏}(Declare macro)板块全面稳定。那么是时候该认真学习一边过程宏的内容了。
过程宏相比于声明宏的灵活度更加高,其本质是输入一段 Rust 的 AST 产生一段 AST 的函数,同时 Rust 提供了三种不一样的语法糖来满足不同的使用场景。
#[derive(CustomDerive)] - 一个用于结构体和枚举类型的宏#[CustomAttribute]无意中翻博客草稿的时候,发现了 2018 的总结还在停留在草稿阶段,现在就已经要写 2019 年度总结了,不禁感叹时间流逝之快。
在工作了一年多后,脑子里面满是想离职的事情。在此之前,我还在持续构思这一年多学习到内容的总结,然后品了品,这一年内,为了柴米油盐持续奔波,并没有留下过多的时间来学习新的技术,反而相比于刚刚毕业的那个时候,这时的我忘记的知识远远多于我学习到的。
然而又尽力过一段时间的沉思,我才意识到这可能并不是一件坏事,反而让我可以更好地学习下去。
在认识的小伙伴发了他做的项目部署文档出来之后,我便决定开始写这篇文章,原因是他使用的部署方式太麻烦,而且太不自动化,同时有时候也会因为开发任务繁忙导致没能部署好等等。
这篇文章是介绍了一个极度适合用于个人或者几个人的小团队使用的集群搭建方式,在保证了安全性的同时,提供了几乎全自动的部署方式,在手动配置一次之后,每次服务更新都是自动触发的,极大地减少了部署的时间。
本篇文章适用于 GIT-FLOW 类似的「master 即 生产代码」的一切工作模式(或者某一个分支为生产代码)。如果您的开发模式不符合这个特征,那么可以关闭网页了。
如果你写过 actix-web 1.0 的代码,会发现在路由注册的函数中,你可以传入各种不同签名的函数题。
App::new()
.service(
web::scope("/admin/")
.service(
web::resource("/article").route(
web::post().to(post_method),
web::delete().to(delete_method)
),
)
不难发现,根据业务的不同,传入 to 方法中的函数签名必然会不同,那么 Actix 是怎么处理的呢?或者说是怎么实现这个功能的。接下来我们将一步一步实现这一个类似的需求。
在把 Project Rubble 从 Rocket 框架迁移到 Actix-web 的过程中,我顺便把困惑已久的 Docker 打包流程优化了不少。
这篇文章适用于那些在项目中带有 Denpendencies.lock 类似的固定依赖版本的 LOCK 文件。
解引用应该说是 Rust 为了解决不采用 Class 来实现对象化编程的一个解决方案。假想一下如果 Python 或者 Java 之流,需要对一个结构体(准确来说应该是类)进行自定义扩展:增加字段,增加方法,重写方法等等,我们可以直接用继承的方式来实现
class Base:
a: int = 2
class Extend(Base):
my_self_field: int = 3
当一个函数希望传入实现了 Base 类的所有实例时,可以直接以 Base 为约束,限定其参数范围。在 Java 中就可以使用基类或者 Interface 来约束。
def base_bound(param: Base):
pass
这一套在 Rust 并不适用,在 Rust 中时采用 Struct + Trait 来抽象对象化。所以若想对结构体进行扩展,那么就只能再用一层结构体去包(wrap)住原来的结构体。
struct MyOwnDerefStruct(String);
最近把电幻国度看完了,同样主题的书籍和电影有黑镜和玩家一号。但是这几个作品表达的未来都不太一样,各自导演和作者表达了对这种技术前景的担忧和喜悦。