虎之书
165 subscribers
4 photos
13 links
微信公众号同名,攒批异步更新
Download Telegram
通常来说编译和运行在 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 的核心之一就是实践,这个项目还是很有启发意义的。
你的思维很有可能是被工具定义的。

譬如语言定义了你对概念的认知,学习一门新的语言会为你打开新世界的大门。同样成立的是信息时代的工具,你会使用什么样的创造力工具定义了你的想象力的疆界。

熟练使用视频剪辑工具,你可以把你的想法用视频表达;精通编程,你可以用程序创世;会使用 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. 或许参与个人的开源项目,是与人产生连接的巧妙方式
昨天晚上在朋友圈看到有朋友分享了一个 bilibili 的视频,内容是介绍一款名为 readpaper 的论文阅读工具的功能。视频不长,也没有任何制作,但是却迅速积累了 60 万播放量。我看完了这个视频心里久久不能平静。有很多想法

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 的创建。
2021 年的最后一天,感慨颇多。这一年我开始在推特上分享自己的见闻与认知,关注数量从 0 到突破 1k,真的很感谢大家的认可。

总结一下 2021 我学到的 10 点重要观念,希望为 2022 年奠定基础。

新的一年里,希望我能持续创造,持续学习,持续输出。

🧵

1. 要创造,不要消耗。

内卷的本质是零和游戏,逃离内卷的唯一路径不是成为卷王,而是把目光放在创造之上。创造价值,而不是瓜分价值。

2. 培养解决问题的能力,而不是其他。

创造价值最直接的手段莫过于解决实际的问题。通过观察与思考找到自己有心气去解决的问题,以之为目标去培养自己的能力。

特别是对于还在学校的朋友,与其去钻营一些离开学校后迅速贬值的东西,不如好好想想自己想要解决什么样的问题。

3. 纵使离开学校,仍然追求教育。

教育并不一定只能在学校中发生。教育和学习的区别在于,教育是系统性的、体制化的,纵使离开学校,你也应当继续追求教育。

教育也不一定要来自外界,你自己就是一座大学。

4. 像狮子一样工作。

高强度地工作,人像工蚁一样;懒散地工作,人像树獭。

应当追求创造性的工作,人必须像狮子一样工作。

有好的想法时,正如猎物出现,快速反应,持续产出;而当捕猎结束,则修养生息,享受生活与时光,多陪陪家人。

5. 把自己作为产品打磨。

通过思考自己的 PMF,找到属于自己的市场。通过不断的对自我提升的投入,建立自己独特的护城河。通过社交网络去建立自己的品牌,把自己像产品一样推广。

从这个意义上说,每个人都是创业者。

6. 好的艺术家借鉴,伟大的艺术家偷窃。

不要怀疑或者担忧自己的创造是否不够原创,做自己真诚地认可的事、说自己真诚认可的话就好。

人类历史群星璀璨,本质上来说,我们大部分的观点和想法,都曾经被提出过。然而并不是所有的人都在听,所以值得再说一遍。

7. 不要追逐金钱,而应该关注解决问题。

追逐金钱容易让你迷失自我,成为金钱的奴隶。

关注解决问题,在这个过程中,世俗所艳羡的金钱、名望、权力都是自然而然的。

8. 悲观听起来聪明,但乐观才能成事。

悲观主义者在做事情之前就会先想像阻力,这似乎让他们有种考虑周到的优势地位,但只有理想主义者才能在重重困难前迈出脚步。

不要被困难说服。

9. 理解、相信并利用非线性系统。

我们更容易理解和接受线性系统,因为它简单且直观。然而线性系统很多时候并不生效,世间很多奇伟瑰怪也都得益于非线性系统。

杠杆、复利、网络效应,分形、混沌、神经网络。突破线性思维,从非线性的角度去思考问题,世界会呈现一个全新的面貌。

10. 迷茫的时候,做一些永远不会后悔的事情。

懂再多的道理,如果没有找到自己的路,反而更容易陷入迷茫。

这个时候不妨做一些让自己永远不会后悔的事。譬如和父母通电话、去健身房运动、做家务、自己下厨做一顿大餐并邀请朋友来分享、拥抱大自然。属于这个列表的事情有很多,去做。
👍2
Just found that if you created list of TODOs in GitHub issue, each TODO can be converted into an issue by a simple click, and once that issue is closed, the TODO will be marked done automatically!
tokio 的 tutorial 写的真的好啊!业余小项目要用到一些异步事件处理,从 0 到能像模像样地写 async rust,看 tokio 的这个 tutorial 就够了。使用 async 时要考虑的方方面面基本上都照顾到了,某些地方其实还讲的十分深入。

https://tokio.rs/tokio/tutorial
👍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 把它搬到网页上,踩坑过程应该会写一篇文章给大家瞅瞅。
🤩10👍5🎉4
一个辅助养成看书习惯的行为设计:起床后打开读书应用,每天不读满 1 个小时,不使用其他 APP。这样每次解锁手机都在读书应用的阅读界面,继续读下去就好。
👍11🎉1
上周的周报。

TL;DR:

- 我在学开车,妹子在学编程
- Lena 图
- Go 各个版本编译器优化性能曲线
- Rust 1.58.1 与 TOCTOU 漏洞
提高打字速度有很多优势,这一期推荐了我一直在用的小鹤双拼,介绍了我的学习经历和学习方法。

文末额外附赠一个 Notion 小 tip,点开自己看吧。

https://ichn.xyz/blog/2022-07
#tips

telegram 用 command + k 可以呼出命令面板,可以快速搜索、选择聊天对象。
👍2
https://madebyevan.com/

通过一篇 CRDT 的文章造访了 Figma 创始人之一 Evan 的主页,印象最深刻的就是他列出来的工作列表,figma、esbuild,再到图形学、游戏以及各种应用,很难想象一个人可以有这么多产出。

这让我想起了 FFmpeg、QEMU、QuickJS、TCC 等等众多著名项目的作者,它们的作者都是同一个人——Fabrice Bellard

人会因为所做过的事情被记住,如尤雨溪所言,make epic shit。
最近说的比较多的一句话是 let’s await more evidence。软件开发中很多问题其实并不需要立刻回答,而是可以先提供一个最小可行的,可以在未来快速迭代、变更的临时解,直到收集到更多的信息,对问题的答案有了明确的认知,再给出一个更完备的解法。