UGC & PGC

内容与内容产业

内容这个词介于信息和知识之间。在没有互联网的时代,人们能接触到的内容产品主要是电视、电报、收音广播、报纸、书籍。古代的书籍和知识都垄断在朝廷和官绅手中,在印刷术被发明之前书籍都是皇帝官绅的私人收藏,民间的知识传播都靠口口相传。即使北宋的毕昇发明了活字印刷,底层人民也很难有接触书籍的机会,我们从明初宋濂的“每假借于藏书之家,手自笔录,计日以还”的描写中也能窥见一二。直到明清出版业开始繁荣,通俗小说成为一种商品生产并流通,小说作者作为最早的内容创作者与书坊合作满足人们的精神需求,这就是最原始的内容产业。

Read More

马尔萨斯陷阱与财政危机

直接原因土地兼并导致税基萎缩,进而引发国家财政危机,是王朝覆灭最直接的导火索。这套机制是这样的:

  1. 土地兼并:王朝初期,经历战乱后地广人稀,政府往往推行均田制等,自耕农众多。他们是国家稳定的基石,也是徭役和赋税(主要按田亩和人丁征收)的主要承担者
  2. 恶性循环开始:随着承平日久,贵族、官僚、地主利用特权和政治手段不断兼并土地。自耕农在遇到天灾人祸时,也不得不抵押或出售土地,沦为地主的佃农或流民。
  3. 税基萎缩:地主豪强通常享有免税或避税的特权(如“荫户”)。土地集中到他们手中,意味着国家能征税的田亩和人口急剧减少。自耕农负担沉重,纷纷逃亡,进一步加剧税基流失。
  4. 财政危机:国家收入锐减,但开支(如军费、官僚体系俸禄、皇室开销)却日益庞大。为了维持运转,王朝只能加大对剩余自耕农的盘剥,提高税率,加派各种苛捐杂税。
  5. 社会崩溃:沉重的赋税迫使更多自耕农破产,流民数量激增。此时一旦遇上大规模天灾(如干旱、洪水),政府却因财政枯竭无力赈济,便会引爆大规模农民起义。同时,财政危机也导致军队战斗力下降,无法有效镇压内乱或抵御外敌。王朝便走向终结。

Read More

vSphere & ESXi虚拟化

我之前的云服务器都是用cockpit去管理的,这是RedHat开发的一个极其轻量的服务器管理Web界面。

但是如果是自己买的硬件资源,现在的服务器硬件都非常便宜,几万块就能买一台配置相当高的刀片机,但是这么大的资源不可能直接装操作系统去管理,出了问题回滚、销毁的成本太高了,怎么做虚拟化,把硬件虚拟成多台服务器就非常重要了。

Read More

Rust运算符重载

运算符重载是一种允许程序员定义或改变运算符行为的特性,许多编程语言都支持运算符重载,特别是在面向对象编程和泛型编程中,比如C++、C#、Kotlin、Swift等语言,这些语言还支持同名的函数重载。

Rust支持运算符的重载,但是不支持函数重载,因为Rust提供了更强大的编译期范型的支持,函数重载这种容易出现歧义的语法特性就被rust抛弃了。

Read More

Rust智能指针类型

引用类型RustC++
普通引用&T
独享引用Box<T>std::unique_ptr
共享引用(引用计数)Rc<T>std::shared_ptr<const T>
共享可变引用Rc<RefCell<T>>std::shared_ptr<T>
多线程共享引用Arc<T>
弱引用Weak<T>std::weak_ptr<T>

所有权、借用与变量的生命周期

在 Rust 中,所有权(ownership)、借用(borrowing)和生命周期(lifetime)是其内存安全和并发模型的核心概念。它们一起确保了在编译时捕获大部分内存错误,如空指针或悬挂指针。

我们可以通过代码示例和内存模型图来说明这些概念。

Read More

Rust错误处理

Rust的错误处理机制和其他语言有很大的不同。

在C++、C#、Java、Javascript、Python等语言中,通常使用throw抛出异常或者返回成功的值。外部调用的地方使用try/catch进行捕获,除了C++没有finally关键字外,C#、Python、Java、Javascript等语言都有基本一致的异常处理逻辑。像Java有三类异常:不可恢复的Error(如OutOfMemoryError、StackOverflowError)、受检异常(如IOException)、运行时异常(如NullPointerException)。特别是运行时异常由于隐式传递,运行在线上服务器经常出现令人头疼的问题。

Read More

Rust入门

近十年来,golang、Swift、Kotlin、Typescript等新兴编程语言异军突起。在系统编程领域也出现了Rust和Zig等语言。

栈上分配的内存在函数出栈后就直接被回收了,堆上的内存需要手动回收,而且由于堆上分配和释放内存需要与操作系统交互。所以一般来说,栈上分配回收速度会比较快,堆上分配回收速度会稍慢一些。但是栈上分配内存要求结构体对象等类型的大小是编译期就知道的,所以无法分配动态大小的内存;堆上分配就没有这个约束。

Read More