No.1 Morning News
1. 🤩 myspaghetti/macos-virtualbox 一个可以一键安装 MacOS 虚拟机的 bash 脚本,支持 MacOS、Windows 和 Linux。
2. 🤙 Tutorial - Write a System Call 教你如何在 Linux 内核中实现一个简单的系统调用,可以学到系统调用的基本原理以及编译自己的 Linux 内核。作者此前还写过一个用 C 实现一个 shell 的教程,也非常值得一读。
3. 🥳 The 5.14 kernel has been released 在 30 周年庆祝的同时,Linux Kernel 5.14 发布了。
4. 📏 Rust Language Cheat Sheet 包含了 Rust 主要特性的快捷参考,图文并茂,追求效率的程序员应该收藏甚至制作自己的 cheat sheet。
Have a nice day!
1. 🤩 myspaghetti/macos-virtualbox 一个可以一键安装 MacOS 虚拟机的 bash 脚本,支持 MacOS、Windows 和 Linux。
2. 🤙 Tutorial - Write a System Call 教你如何在 Linux 内核中实现一个简单的系统调用,可以学到系统调用的基本原理以及编译自己的 Linux 内核。作者此前还写过一个用 C 实现一个 shell 的教程,也非常值得一读。
3. 🥳 The 5.14 kernel has been released 在 30 周年庆祝的同时,Linux Kernel 5.14 发布了。
4. 📏 Rust Language Cheat Sheet 包含了 Rust 主要特性的快捷参考,图文并茂,追求效率的程序员应该收藏甚至制作自己的 cheat sheet。
Have a nice day!
GitHub
GitHub - myspaghetti/macos-virtualbox: Push-button installer of macOS Catalina, Mojave, and High Sierra guests in Virtualbox on…
Push-button installer of macOS Catalina, Mojave, and High Sierra guests in Virtualbox on x86 CPUs for Windows, Linux, and macOS - myspaghetti/macos-virtualbox
🔀 Aadit Sheth 在近日的一串推文中表示,用的好的话,你的推特账号可能比你的学历更有用。你需要
1. 控制你关注的内容,99% 的人用推特来看新闻,这没什么不对,但它还可以是高质量信息的来源——前提是你自己控制好
2. 使用推特列表(Twitter Lists)来创建有的放矢的关注列表,这个列表不会被推特的推荐算法影响,而是忠实地以时间顺序列出你收集的账号的内容。
3. 使用高级搜索功能,譬如
> (from:aaditsh) min_faves:1000 marketing
可以搜索来自 aaditsh 这个账号点赞数超过 1000 的包含 “marketing” 关键字的推文,而
> (from:aaditsh) until:2021-09-01 since:2021-05-01
则可以列出特定时间范围内的内容
4. 屏蔽掉杠精和喷子(原词是 troll)
5. 打磨你的个人简介
6. 集成你的 Newsletter,用 newsletter 来写更有深度的文章
7. 使用推特串,把复杂的主题分解为简单可执行的小建议
8. 像本能一样般去建立关系,使用推特的 DM 去接触人
9. 使用名为 Minimal Twitter 的 Chrome 插件去除噪音
1. 控制你关注的内容,99% 的人用推特来看新闻,这没什么不对,但它还可以是高质量信息的来源——前提是你自己控制好
2. 使用推特列表(Twitter Lists)来创建有的放矢的关注列表,这个列表不会被推特的推荐算法影响,而是忠实地以时间顺序列出你收集的账号的内容。
3. 使用高级搜索功能,譬如
> (from:aaditsh) min_faves:1000 marketing
可以搜索来自 aaditsh 这个账号点赞数超过 1000 的包含 “marketing” 关键字的推文,而
> (from:aaditsh) until:2021-09-01 since:2021-05-01
则可以列出特定时间范围内的内容
4. 屏蔽掉杠精和喷子(原词是 troll)
5. 打磨你的个人简介
6. 集成你的 Newsletter,用 newsletter 来写更有深度的文章
7. 使用推特串,把复杂的主题分解为简单可执行的小建议
8. 像本能一样般去建立关系,使用推特的 DM 去接触人
9. 使用名为 Minimal Twitter 的 Chrome 插件去除噪音
Twitter
Aadit Sheth
If you use it right, your Twitter account is worth more than your degree. But 98.8% suck at it. Here are 9 unique ways to turn Twitter into a crazy valuable asset:
Go 语言之父 Russ Cox 写过三篇关于内存模型(memory model)的文章,对于并发编程已经是必须的今天,任何一个系统程序员都应该对此有正确的认知,强烈推荐阅读。
C++ 中关于函数定义有三个非常容易混淆的概念,即 overload、overwrite 和 override。
overload 是定义具有不同参数类型的同名函数,相当于同一个名字背负了多个不同的函数,所以叫做重载(load 对应的中文是负载);
overwrite 发生在编译时多态,即子类定义了一个和父类非 virtual 函数相同名字的函数,那么父类的这个函数将被隐藏,所以叫做重写或者隐藏(write 就是写嘛);
而 override 则是我们实现虚函数的时候写的关键词,即运行时多态,可以实现通过父类指针调用子类方法的效果,所以称之为覆盖。
正确理解这三个关键词的前提是弄清楚 C++ 的多态机制以及调用函数时发生的 name resolution 机制。
类似这种需要厘清的概念在 C++ 中非常多,花时间自己总结和归纳是最好的学习方法。
overload 是定义具有不同参数类型的同名函数,相当于同一个名字背负了多个不同的函数,所以叫做重载(load 对应的中文是负载);
overwrite 发生在编译时多态,即子类定义了一个和父类非 virtual 函数相同名字的函数,那么父类的这个函数将被隐藏,所以叫做重写或者隐藏(write 就是写嘛);
而 override 则是我们实现虚函数的时候写的关键词,即运行时多态,可以实现通过父类指针调用子类方法的效果,所以称之为覆盖。
正确理解这三个关键词的前提是弄清楚 C++ 的多态机制以及调用函数时发生的 name resolution 机制。
类似这种需要厘清的概念在 C++ 中非常多,花时间自己总结和归纳是最好的学习方法。
通常来说编译和运行在 Linux 上的 Rust 程序底层是依赖 libc 的,原生的系统调用需要通过 libc 抽象的接口才能被 Rust 调用。Rust programs written entirely in Rust 是一个有趣的尝试:移除 libc 这一层 C 的中间层,让 Rust 程序的执行自上而下都只经过 Rust。
为了达成这个目的,作者实现的 mustang 运行时通过短短几行嵌入汇编让程序启动后直接调用 rust 函数,使用 rsix 包提供的系统调用,并实现了 C ABI 兼容的 Rust 的标准库依赖的一些 libc、libpthread 等库的函数,最后使用自定义的 global_allocator 代替了默认的 malloc 作为 Rust 运行时的内存分配器,从而实现了一个可以打印 hello world 的 demo。
很难说这个 mustang 运行时是否有实际价值,但实现这样一个小项目一定是很有趣的 hack 经历。
回顾程序启动与运行,本质上都是 CPU 指令。
链接后的 ELF 可执行文件中会有一个特殊的地址作为操作系统返回到用户态开始执行程序的入口。
用户从 shell 中执行程序时,shell 会调用 execve 系统调用,同时压入 argc, argv 和 envp 的参数,把运行程序的任务交接给内核。
内核加载并解析 ELF 二进制后,返回用户态并跳转到程序入口。
这个入口是整个程序的执行开始的地方,由运行时提供(常见的运行时有 libc、musl、crt 等),通常需要初始化栈(即设置栈寄存器),以及调用一些初始化函数,当这些都完成后,就可以把执行交给 main 函数。
用户程序和内核交互需要通过系统调用,本质上是特殊的 CPU 指令配合内核相关的系统调用编号实现,直接操作会降低程序的可移植性,所以通常也会由运行时来提供一层抽象,一方面用户程序可以直接调用函数实现系统调用,另一方面可以通过换运行时重新编译在不同平台上移植程序。
这些是在操作系统课上学到的知识,可惜我只局限在知道,但从未真正实践过。Hack 的核心之一就是实践,这个项目还是很有启发意义的。
为了达成这个目的,作者实现的 mustang 运行时通过短短几行嵌入汇编让程序启动后直接调用 rust 函数,使用 rsix 包提供的系统调用,并实现了 C ABI 兼容的 Rust 的标准库依赖的一些 libc、libpthread 等库的函数,最后使用自定义的 global_allocator 代替了默认的 malloc 作为 Rust 运行时的内存分配器,从而实现了一个可以打印 hello world 的 demo。
很难说这个 mustang 运行时是否有实际价值,但实现这样一个小项目一定是很有趣的 hack 经历。
回顾程序启动与运行,本质上都是 CPU 指令。
链接后的 ELF 可执行文件中会有一个特殊的地址作为操作系统返回到用户态开始执行程序的入口。
用户从 shell 中执行程序时,shell 会调用 execve 系统调用,同时压入 argc, argv 和 envp 的参数,把运行程序的任务交接给内核。
内核加载并解析 ELF 二进制后,返回用户态并跳转到程序入口。
这个入口是整个程序的执行开始的地方,由运行时提供(常见的运行时有 libc、musl、crt 等),通常需要初始化栈(即设置栈寄存器),以及调用一些初始化函数,当这些都完成后,就可以把执行交给 main 函数。
用户程序和内核交互需要通过系统调用,本质上是特殊的 CPU 指令配合内核相关的系统调用编号实现,直接操作会降低程序的可移植性,所以通常也会由运行时来提供一层抽象,一方面用户程序可以直接调用函数实现系统调用,另一方面可以通过换运行时重新编译在不同平台上移植程序。
这些是在操作系统课上学到的知识,可惜我只局限在知道,但从未真正实践过。Hack 的核心之一就是实践,这个项目还是很有启发意义的。
sunfishcode's blog
Rust programs written entirely in Rust
A blog by sunfishcode
你的思维很有可能是被工具定义的。
譬如语言定义了你对概念的认知,学习一门新的语言会为你打开新世界的大门。同样成立的是信息时代的工具,你会使用什么样的创造力工具定义了你的想象力的疆界。
熟练使用视频剪辑工具,你可以把你的想法用视频表达;精通编程,你可以用程序创世;会使用 Figma,你可以想象更好的界面设计是什么样的;会使用 3D 设计工具,你可以利用 3D 打印设计很多精巧的小物件;会使用电路设计工具,你可以从电路布线到实体打样一个 PCB 制作自己的电子设施。这些可能性都是建立在你会使用某个工具的前提下的。
同时,以工具为前提的学习,往往更具有目的性和实操性,以点带面,可以迅速通晓一个领域的重点知识。
这就是我理解的工具主义。
譬如语言定义了你对概念的认知,学习一门新的语言会为你打开新世界的大门。同样成立的是信息时代的工具,你会使用什么样的创造力工具定义了你的想象力的疆界。
熟练使用视频剪辑工具,你可以把你的想法用视频表达;精通编程,你可以用程序创世;会使用 Figma,你可以想象更好的界面设计是什么样的;会使用 3D 设计工具,你可以利用 3D 打印设计很多精巧的小物件;会使用电路设计工具,你可以从电路布线到实体打样一个 PCB 制作自己的电子设施。这些可能性都是建立在你会使用某个工具的前提下的。
同时,以工具为前提的学习,往往更具有目的性和实操性,以点带面,可以迅速通晓一个领域的重点知识。
这就是我理解的工具主义。
https://nextjs-in-action-cn.taonan.lu/
cusdis 作者写的关于 nextjs 应用开发的小书。
几个想法
1. 中文 nextjs 的介绍比较少,这本小书是我了解到的第一本较为系统性地对 nextjs 做介绍的
2. 之前见过不少国外开发者就某一个小技术栈写的小书,也采用这种开放阅读、付费购买的模式,这次了解到国内也有开发者采用这种模式写书,或许未来可以看到更多
3. 给自己博客加上了 cusdis 的支持,cusdis 的作者就是这本书的作者,他在书中介绍了 cusdis 用 nextjs 总结的经验
4. 我用 cusdis 的时候发现一个小 bug,提了个 PR 修复顺便了解了下作者,发现了这本书
5. 或许参与个人的开源项目,是与人产生连接的巧妙方式
cusdis 作者写的关于 nextjs 应用开发的小书。
几个想法
1. 中文 nextjs 的介绍比较少,这本小书是我了解到的第一本较为系统性地对 nextjs 做介绍的
2. 之前见过不少国外开发者就某一个小技术栈写的小书,也采用这种开放阅读、付费购买的模式,这次了解到国内也有开发者采用这种模式写书,或许未来可以看到更多
3. 给自己博客加上了 cusdis 的支持,cusdis 的作者就是这本书的作者,他在书中介绍了 cusdis 用 nextjs 总结的经验
4. 我用 cusdis 的时候发现一个小 bug,提了个 PR 修复顺便了解了下作者,发现了这本书
5. 或许参与个人的开源项目,是与人产生连接的巧妙方式
GitHub
Nextjs SSR prints warning on useLayoutEffect · Issue #4 · Cusdis/sdk
If we use the react component in SSR, the following warning will be generated Warning: useLayoutEffect does nothing on the server, because its effect cannot be encoded into the server renderer&...
昨天晚上在朋友圈看到有朋友分享了一个 bilibili 的视频,内容是介绍一款名为 readpaper 的论文阅读工具的功能。视频不长,也没有任何制作,但是却迅速积累了 60 万播放量。我看完了这个视频心里久久不能平静。有很多想法
1. 我曾经也做过很长一段时间科研,文献资料的管理和阅读是痛点,用过 mendelely 这类工具,但其实更好的形态是 SaaS,readpaper 抓住了这个机会
2. 做科研的人越来越多(一个数据是,中国去年考研人数达 377 万,逐年攀升),各个领域越来越卷,readpaper 这个产品绝对是淘金热中卖铲子级的好主意
3. 这个时代,计算机世界不缺技术,缺的是好主意和执行力
4. 作者研究生毕业之后没有找工作,而是全职投入开发这个产品,以及学习,这个状态绝大部分人工作很多年都达不到
5. 自带流量的创业者的路好走。这个想法最开始是从李自然那里得知,我一直跃跃欲试,现在看来跃跃欲试也已经落后人一大截了
6. 我很早之前就意识到,逃离内卷这一零和游戏的路径是创造价值,去把蛋糕做大。做产品,解决实际需求,服务好用户,还有什么比这更强烈而直接的满足感吗
7. 我是那种追求强烈且直接的反馈的人,换句话说,我适合加入早期创业公司
8. 如果我所拥有的资本是我这个人本身,那我应该像风险投资一样把自己投给这种好项目,承担高风险、追求高回报——实际上也没有什么太大的风险,这个时代饿不死会写代码的
1. 我曾经也做过很长一段时间科研,文献资料的管理和阅读是痛点,用过 mendelely 这类工具,但其实更好的形态是 SaaS,readpaper 抓住了这个机会
2. 做科研的人越来越多(一个数据是,中国去年考研人数达 377 万,逐年攀升),各个领域越来越卷,readpaper 这个产品绝对是淘金热中卖铲子级的好主意
3. 这个时代,计算机世界不缺技术,缺的是好主意和执行力
4. 作者研究生毕业之后没有找工作,而是全职投入开发这个产品,以及学习,这个状态绝大部分人工作很多年都达不到
5. 自带流量的创业者的路好走。这个想法最开始是从李自然那里得知,我一直跃跃欲试,现在看来跃跃欲试也已经落后人一大截了
6. 我很早之前就意识到,逃离内卷这一零和游戏的路径是创造价值,去把蛋糕做大。做产品,解决实际需求,服务好用户,还有什么比这更强烈而直接的满足感吗
7. 我是那种追求强烈且直接的反馈的人,换句话说,我适合加入早期创业公司
8. 如果我所拥有的资本是我这个人本身,那我应该像风险投资一样把自己投给这种好项目,承担高风险、追求高回报——实际上也没有什么太大的风险,这个时代饿不死会写代码的
👍1
Raw Linux Threads via System Calls
https://nullprogram.com/blog/2015/05/15/
公司群里老板发的线程创建的介绍文章,用纯汇编调 syscall 创建线程。基本思路就是先用的mmap 创建线程栈,然后用 sys_clone 在这个自己申请的栈上创建线程就好。
看起来挺简单的,前面的 x86_64 的简介可以当作小复习。
之后有空打算研究下 goroutine 的创建。
https://nullprogram.com/blog/2015/05/15/
公司群里老板发的线程创建的介绍文章,用纯汇编调 syscall 创建线程。基本思路就是先用的mmap 创建线程栈,然后用 sys_clone 在这个自己申请的栈上创建线程就好。
看起来挺简单的,前面的 x86_64 的简介可以当作小复习。
之后有空打算研究下 goroutine 的创建。
✅ 2021 年的最后一天,感慨颇多。这一年我开始在推特上分享自己的见闻与认知,关注数量从 0 到突破 1k,真的很感谢大家的认可。
总结一下 2021 我学到的 10 点重要观念,希望为 2022 年奠定基础。
新的一年里,希望我能持续创造,持续学习,持续输出。
🧵~
1. 要创造,不要消耗。
内卷的本质是零和游戏,逃离内卷的唯一路径不是成为卷王,而是把目光放在创造之上。创造价值,而不是瓜分价值。
2. 培养解决问题的能力,而不是其他。
创造价值最直接的手段莫过于解决实际的问题。通过观察与思考找到自己有心气去解决的问题,以之为目标去培养自己的能力。
特别是对于还在学校的朋友,与其去钻营一些离开学校后迅速贬值的东西,不如好好想想自己想要解决什么样的问题。
3. 纵使离开学校,仍然追求教育。
教育并不一定只能在学校中发生。教育和学习的区别在于,教育是系统性的、体制化的,纵使离开学校,你也应当继续追求教育。
教育也不一定要来自外界,你自己就是一座大学。
4. 像狮子一样工作。
高强度地工作,人像工蚁一样;懒散地工作,人像树獭。
应当追求创造性的工作,人必须像狮子一样工作。
有好的想法时,正如猎物出现,快速反应,持续产出;而当捕猎结束,则修养生息,享受生活与时光,多陪陪家人。
5. 把自己作为产品打磨。
通过思考自己的 PMF,找到属于自己的市场。通过不断的对自我提升的投入,建立自己独特的护城河。通过社交网络去建立自己的品牌,把自己像产品一样推广。
从这个意义上说,每个人都是创业者。
6. 好的艺术家借鉴,伟大的艺术家偷窃。
不要怀疑或者担忧自己的创造是否不够原创,做自己真诚地认可的事、说自己真诚认可的话就好。
人类历史群星璀璨,本质上来说,我们大部分的观点和想法,都曾经被提出过。然而并不是所有的人都在听,所以值得再说一遍。
7. 不要追逐金钱,而应该关注解决问题。
追逐金钱容易让你迷失自我,成为金钱的奴隶。
关注解决问题,在这个过程中,世俗所艳羡的金钱、名望、权力都是自然而然的。
8. 悲观听起来聪明,但乐观才能成事。
悲观主义者在做事情之前就会先想像阻力,这似乎让他们有种考虑周到的优势地位,但只有理想主义者才能在重重困难前迈出脚步。
不要被困难说服。
9. 理解、相信并利用非线性系统。
我们更容易理解和接受线性系统,因为它简单且直观。然而线性系统很多时候并不生效,世间很多奇伟瑰怪也都得益于非线性系统。
杠杆、复利、网络效应,分形、混沌、神经网络。突破线性思维,从非线性的角度去思考问题,世界会呈现一个全新的面貌。
10. 迷茫的时候,做一些永远不会后悔的事情。
懂再多的道理,如果没有找到自己的路,反而更容易陷入迷茫。
这个时候不妨做一些让自己永远不会后悔的事。譬如和父母通电话、去健身房运动、做家务、自己下厨做一顿大餐并邀请朋友来分享、拥抱大自然。属于这个列表的事情有很多,去做。
总结一下 2021 我学到的 10 点重要观念,希望为 2022 年奠定基础。
新的一年里,希望我能持续创造,持续学习,持续输出。
🧵~
1. 要创造,不要消耗。
内卷的本质是零和游戏,逃离内卷的唯一路径不是成为卷王,而是把目光放在创造之上。创造价值,而不是瓜分价值。
2. 培养解决问题的能力,而不是其他。
创造价值最直接的手段莫过于解决实际的问题。通过观察与思考找到自己有心气去解决的问题,以之为目标去培养自己的能力。
特别是对于还在学校的朋友,与其去钻营一些离开学校后迅速贬值的东西,不如好好想想自己想要解决什么样的问题。
3. 纵使离开学校,仍然追求教育。
教育并不一定只能在学校中发生。教育和学习的区别在于,教育是系统性的、体制化的,纵使离开学校,你也应当继续追求教育。
教育也不一定要来自外界,你自己就是一座大学。
4. 像狮子一样工作。
高强度地工作,人像工蚁一样;懒散地工作,人像树獭。
应当追求创造性的工作,人必须像狮子一样工作。
有好的想法时,正如猎物出现,快速反应,持续产出;而当捕猎结束,则修养生息,享受生活与时光,多陪陪家人。
5. 把自己作为产品打磨。
通过思考自己的 PMF,找到属于自己的市场。通过不断的对自我提升的投入,建立自己独特的护城河。通过社交网络去建立自己的品牌,把自己像产品一样推广。
从这个意义上说,每个人都是创业者。
6. 好的艺术家借鉴,伟大的艺术家偷窃。
不要怀疑或者担忧自己的创造是否不够原创,做自己真诚地认可的事、说自己真诚认可的话就好。
人类历史群星璀璨,本质上来说,我们大部分的观点和想法,都曾经被提出过。然而并不是所有的人都在听,所以值得再说一遍。
7. 不要追逐金钱,而应该关注解决问题。
追逐金钱容易让你迷失自我,成为金钱的奴隶。
关注解决问题,在这个过程中,世俗所艳羡的金钱、名望、权力都是自然而然的。
8. 悲观听起来聪明,但乐观才能成事。
悲观主义者在做事情之前就会先想像阻力,这似乎让他们有种考虑周到的优势地位,但只有理想主义者才能在重重困难前迈出脚步。
不要被困难说服。
9. 理解、相信并利用非线性系统。
我们更容易理解和接受线性系统,因为它简单且直观。然而线性系统很多时候并不生效,世间很多奇伟瑰怪也都得益于非线性系统。
杠杆、复利、网络效应,分形、混沌、神经网络。突破线性思维,从非线性的角度去思考问题,世界会呈现一个全新的面貌。
10. 迷茫的时候,做一些永远不会后悔的事情。
懂再多的道理,如果没有找到自己的路,反而更容易陷入迷茫。
这个时候不妨做一些让自己永远不会后悔的事。譬如和父母通电话、去健身房运动、做家务、自己下厨做一顿大餐并邀请朋友来分享、拥抱大自然。属于这个列表的事情有很多,去做。
👍2
tokio 的 tutorial 写的真的好啊!业余小项目要用到一些异步事件处理,从 0 到能像模像样地写 async rust,看 tokio 的这个 tutorial 就够了。使用 async 时要考虑的方方面面基本上都照顾到了,某些地方其实还讲的十分深入。
https://tokio.rs/tokio/tutorial
https://tokio.rs/tokio/tutorial
tokio.rs
Tutorial | Tokio - An asynchronous Rust runtime
Tokio is a runtime for writing reliable asynchronous applications with Rust. It provides async I/O, networking, scheduling, timers, and more.
👍5
最近一直在做的一个业余项目是 rust-poker,一个用 rust 编写的终端 UI 风格的德州扑克游戏。
开始这个项目是刚刚读完 Programming Rust 时写了一个德州扑克的内核,可以比较手牌大小,使用了 enum、pattern matching 和 macro,感觉还挺不错的。搁置了一段时间后准备把它做成一个能玩的小游戏,解决想和公司同事打德州但是没有筹码的这个问题。于是使用 tui 作为 UI 框架、tokio 作为异步 runtime 来处理网络请求,发现真的能行!
目前已经实现了基本的游戏逻辑,但还需要一些优化和调整。
借助 rust-analyzer 提供的自动补全和自动修复,写 rust 的体验非常棒。而 rust 自身的语法也挺讨喜的,写习惯之后再写大道至简语言总觉得哪里不太舒服。为数不多的小困惑,譬如到处可见的连串 as_ref().unwrap().get_mut() 其实也都可以通过调整代码结构、添加函数抽象等方式改进。
目前这个项目写了快 6k 行 rust 了,颇有种对 rust 得心应手之感。不过我还是清楚地知道,写这个项目并没有用到太多较为晦涩的 rust 功能,更多的是业务逻辑上的代码堆砌,但这个开端是好的,其他的功能随用随学就好。
后续准备用 WASM 把它搬到网页上,踩坑过程应该会写一篇文章给大家瞅瞅。
开始这个项目是刚刚读完 Programming Rust 时写了一个德州扑克的内核,可以比较手牌大小,使用了 enum、pattern matching 和 macro,感觉还挺不错的。搁置了一段时间后准备把它做成一个能玩的小游戏,解决想和公司同事打德州但是没有筹码的这个问题。于是使用 tui 作为 UI 框架、tokio 作为异步 runtime 来处理网络请求,发现真的能行!
目前已经实现了基本的游戏逻辑,但还需要一些优化和调整。
借助 rust-analyzer 提供的自动补全和自动修复,写 rust 的体验非常棒。而 rust 自身的语法也挺讨喜的,写习惯之后再写大道至简语言总觉得哪里不太舒服。为数不多的小困惑,譬如到处可见的连串 as_ref().unwrap().get_mut() 其实也都可以通过调整代码结构、添加函数抽象等方式改进。
目前这个项目写了快 6k 行 rust 了,颇有种对 rust 得心应手之感。不过我还是清楚地知道,写这个项目并没有用到太多较为晦涩的 rust 功能,更多的是业务逻辑上的代码堆砌,但这个开端是好的,其他的功能随用随学就好。
后续准备用 WASM 把它搬到网页上,踩坑过程应该会写一篇文章给大家瞅瞅。
🤩10👍5🎉4
