Skip to main content

BSD 和 Darwin

· 4 min read
Wayne
Wayne

Darwin

Darwin是macOS和iOS操作环境的操作系统部分。苹果公司于2000年把Darwin发布给开放源代码社群。

OpenDarwin

  • 在2002年4月,Apple在互联网软件论坛(Internet Software Consortium, ISC)上成立OpenDarwin.org,一个协助合作Darwin发展的社群。
  • OpenDarwin建立它自己发布的Darwin操作系统。值得注意的是OpenDarwin子项目中包含了DarwinPorts,其目标是组合下一世代的port集合给Darwin使用(长远来说,其也能供给其他BSD所派生的操作系统所用)。
  • OpenDarwin项目于2006年中止,并且于2007年由另一个PureDarwin项目成立去接手OpenDarwin之前的目标。
  • 它最后的稳定版本是2004年7月16日发行的7.2.1版。

PureDarwin

PureDarwin 项目旨在让 Apple 的开源 Darwin OS 更加易用,截至 2024 年仍在积极维护中。虽然开发速度相对较慢,但该项目仍在通过社区贡献取得进展。
PureDarwin 专注于创建一个独立于 macOS 组件的可用可启动系统,完全依赖于 Darwin 和其他开源工具。

  • PureDarwin是一个从Apple发行的Darwin源代码中创建可引导的操作系统映像的项目。
  • 自从OpenDarwin停止运行以及Darwin8.x以来发布可启动映像以来,由于许多组件都成为封闭源,因此创建完整的操作系统变得越来越困难。
  • 该项目已成功创建了基于Darwin 9和X11 GUI的Xmas版本和仅基于Darwin 17的命令行17.4 Beta。
  • Apple Darwin 17.0.0 (macOS High Sierra, iOS 11) 的 Release Date 是:2017年9月19日
  • PureDarwin 现在仍在维护,PD-17.4 Test Build: Based on Darwin 17, which corresponds to macOS High Sierra (10.13.x).

BSD

Berkeley Software Distribution

BSDs strive to be coherent systems
BSD 努力成为一致的系统

八个月前,Reddit上发起了这个讨论:https://www.reddit.com/r/BSD/comments/1bn4zjx/why_bsd/

常见的 BSD 发行版:

  • FreeBSD
    • DragonFly BSD
    • TrueNAS (新版基于 Debian)
    • pfSense
  • NetBSD
    • OpenBSD

Conclusion

从现在的发展来看,BSD 的生态正在越来越紧缩,Apple 自己建立的 darwin-xnu 也于 2023年5月 进入归档状态。

PureDarwin 的维护进度实在太慢,想从 PureDarwin 启动做一个 "Apple Server", 看起来没那么容易,且未必有那个价值。

更多的 BSD 系统更在意功能,例如 TrueNAS 的 ZFS,和 pfSense 的 路由和防火墙,或者 macOS,iOS 这样的商业闭源系统。

整体看下来 BSD 的应用方向可能更在于封闭和统一,和 Linux 已经是完全截然不同的两条路了。

Rust(actix) 和 Java(webflux) 性能对比

· 4 min read
Wayne
Wayne

Rust(actix) 和 Java(webflux) 性能对比

Rust

Rust 看起来 非常小而美,在我看来 几个优点非常看好。

  • Cargo 包管理:设计简洁,上手难度低
  • Rust 基于 C++,这就带来了很强的性能,且 rust 语法中出现不安全的内存操作,则会直接编译不通过,这点就很让人安心。
  • 跨平台编译二进制文件(这个我非常在意,也是我之前为什么选择 Golang)

Web Benchmark

Rust: https://actix.rs/
Java: https://docs.spring.io/spring-framework/reference/web/webflux/new-framework.html
K6: https://k6.io/

VUs = 500

Rust:

     data_received..................: 5.2 MB 29 kB/s
data_sent......................: 2.8 MB 16 kB/s
http_req_blocked...............: avg=266.24ms min=0s med=0s max=32.02s p(90)=0s p(95)=0s
http_req_connecting............: avg=266.24ms min=0s med=0s max=32.02s p(90)=0s p(95)=0s
http_req_duration..............: avg=309.86µs min=0s med=0s max=4.52s p(90)=692.3µs p(95)=796.5µs
{ expected_response:true }...: avg=174.08µs min=0s med=0s max=1.71ms p(90)=692.3µs p(95)=796.36µs
http_req_failed................: 0.01% 4 out of 33318
http_req_receiving.............: avg=38.61µs min=0s med=0s max=1.48ms p(90)=40.22µs p(95)=508.7µs
http_req_sending...............: avg=4.33µs min=0s med=0s max=1.02ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=266.91µs min=0s med=0s max=4.52s p(90)=586.6µs p(95)=719.6µs
http_reqs......................: 33318 184.522672/s
iteration_duration.............: avg=1.26s min=1s med=1s max=33.02s p(90)=1s p(95)=1s
iterations.....................: 33318 184.522672/s
vus............................: 3 min=3 max=499
vus_max........................: 500 min=500 max=500


running (3m00.6s), 000/500 VUs, 33318 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s

Java:

     data_received..................: 5.0 MB 28 kB/s
data_sent......................: 3.6 MB 20 kB/s
http_req_blocked...............: avg=12.31µs min=0s med=0s max=10.9ms p(90)=0s p(95)=0s
http_req_connecting............: avg=9.79µs min=0s med=0s max=2.13ms p(90)=0s p(95)=0s
http_req_duration..............: avg=528.32µs min=0s med=550.6µs max=158.21ms p(90)=1.1ms p(95)=1.33ms
{ expected_response:true }...: avg=528.32µs min=0s med=550.6µs max=158.21ms p(90)=1.1ms p(95)=1.33ms
http_req_failed................: 0.00% 0 out of 42266
http_req_receiving.............: avg=63.55µs min=0s med=0s max=1.49ms p(90)=208.9µs p(95)=526µs
http_req_sending...............: avg=5.71µs min=0s med=0s max=4.74ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=459.05µs min=0s med=523.7µs max=158.21ms p(90)=1.01ms p(95)=1.22ms
http_reqs......................: 42266 234.328464/s
iteration_duration.............: avg=1s min=1s med=1s max=1.16s p(90)=1s p(95)=1s
iterations.....................: 42266 234.328464/s
vus............................: 2 min=2 max=499
vus_max........................: 500 min=500 max=500


running (3m00.4s), 000/500 VUs, 42266 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s

VUs = 1500

Rust

     data_received..................: 7.1 MB 117 kB/s
data_sent......................: 3.9 MB 64 kB/s
http_req_blocked...............: avg=36.9µs min=0s med=0s max=4ms p(90)=0s p(95)=0s
http_req_connecting............: avg=34.73µs min=0s med=0s max=4ms p(90)=0s p(95)=0s
http_req_duration..............: avg=374.98µs min=0s med=522.9µs max=14.25ms p(90)=624.6µs p(95)=733.4µs
{ expected_response:true }...: avg=374.98µs min=0s med=522.9µs max=14.25ms p(90)=624.6µs p(95)=733.4µs
http_req_failed................: 0.00% 0 out of 45690
http_req_receiving.............: avg=35.15µs min=0s med=0s max=1.99ms p(90)=16.4µs p(95)=508µs
http_req_sending...............: avg=4.35µs min=0s med=0s max=1.76ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=335.46µs min=0s med=516.35µs max=14.25ms p(90)=602.7µs p(95)=688.81µs
http_reqs......................: 45690 749.430697/s
iteration_duration.............: avg=1s min=1s med=1s max=1.01s p(90)=1s p(95)=1s
iterations.....................: 45690 749.430697/s
vus............................: 60 min=24 max=1498
vus_max........................: 1500 min=1500 max=1500


running (1m01.0s), 0000/1500 VUs, 45690 complete and 0 interrupted iterations
default ✓ [======================================] 0000/1500 VUs 1m0s

Java:

     data_received..................: 5.4 MB 89 kB/s
data_sent......................: 3.9 MB 64 kB/s
http_req_blocked...............: avg=35.32µs min=0s med=0s max=6.03ms p(90)=0s p(95)=0s
http_req_connecting............: avg=33.13µs min=0s med=0s max=6.03ms p(90)=0s p(95)=0s
http_req_duration..............: avg=393.34µs min=0s med=518.59µs max=175.24ms p(90)=779.4µs p(95)=1.05ms
{ expected_response:true }...: avg=393.34µs min=0s med=518.59µs max=175.24ms p(90)=779.4µs p(95)=1.05ms
http_req_failed................: 0.00% 0 out of 45691
http_req_receiving.............: avg=40.46µs min=0s med=0s max=3.75ms p(90)=29.1µs p(95)=508.49µs
http_req_sending...............: avg=3.83µs min=0s med=0s max=1.7ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=349.04µs min=0s med=217.5µs max=174.24ms p(90)=676.1µs p(95)=1ms
http_reqs......................: 45691 749.01963/s
iteration_duration.............: avg=1s min=1s med=1s max=1.17s p(90)=1s p(95)=1s
iterations.....................: 45691 749.01963/s
vus............................: 68 min=24 max=1498
vus_max........................: 1500 min=1500 max=1500

Conclusion

整体来看, Java 这边在Spring这个大框架下 只慢了一丢丢,大多都输在延迟上,但是也是有两大神器提供的加持,Java 23 和 Reactive, 所以只能说是没输。

而 Rust 这边,则是以微小领先取得了胜利,但是并没有拉开太大的差距。且第一轮对决出现了 4 个 failed(可能是测试条件问题)。

所以选择哪个语言和框架,区别应该在于场景下,比如想要更小的体积和更快的启动速度,那么 Rust 是最优选。

但是如果想要生态支持和更多开发者的协作,可能还得是 Java。

Pip 正在集成到 Linux repository 中

· 2 min read
Wayne
Wayne

Pip 正在集成到 Linux repository 中

现在 再使用 pip install 可能会 提示以下消息

error: externally-managed-environment

× This environment is externally managed
╰─>
The system-wide python installation should be maintained using the system
package manager (apk) only.

If the package in question is not packaged already (and hence installable via
"apk add py3-somepackage"), please consider installing it inside a virtual
environment, e.g.:

python3 -m venv /path/to/venv
. /path/to/venv/bin/activate
pip install mypackage

To exit the virtual environment, run:

deactivate

The virtual environment is not deleted, and can be re-entered by re-sourcing
the activate file.

To automatically manage virtual environments, consider using pipx (from the
pipx package).

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

你可能需要 将 pip install somepackage 替换为 apk add py3-somepackage (Alpine Linux).

其实这是一个好消息

  1. python 的包本身就是安装到系统的某个目录中,而不是安装到项目目录中。系统软件包接管 这很合理。
  2. 对于国内这样的糟糕的网络,镜像站则是必须的,对于 pip 来说,可以少设置一层 镜像或代理,而且多亏了这些镜像站,速度非常的快。

拒绝 996,谈谈远程办公一年多的感受(搬运)

· 9 min read
v2ex
v2ex

拒绝 996,谈谈远程办公一年多的感受

@xixigo

本人今年 36 岁,本科毕业于一所很普通的院校(非 211 ),之前一直在一线城市从事软件开发方面的工作。刚开始用 MFC 写上位机,主要是跟硬件交互,后来用 qt 做了几款编辑器软件。在工作了 6 年之后,有感于桌面软件的技术面太窄,转行学 go 语言,成了一个 web 后端工程师。刚开始还有点热情,学了 docker 、k8s 、微服务,发现后端开发比做桌面软件更没技术含量,都是拿现有的框架,写写 api 。也接触了很多后端开发工程师,总的感觉就编码能力比桌面软件工程师差太多了。因为工作太无聊,于是在 github 上写了几个开源项目,目前 star 已超过 1k 。

在 2017 年由于区块链的爆发,刚开始只是买点币,玩一玩。慢慢的觉得这是一个很有意思的领域,也开始学习区块链方面的知识,包括各种共识算法,合约开发,不管他的未来怎样,至少它不像其他领域那版枯燥。在做足了准备之后,面试通过了一家公司的区块链开发岗位。进入公司以后,发现周围的同事全是中科院、华为、腾讯等过来的大牛,因为那时候区块链正是风口,这个行业不差钱。 当然没过多久熊市就来了,公司也很快撑不下去,欠薪倒闭,最后大家一起去了劳动仲裁。在劳动仲裁填表的时候,才发现很多技术水平很菜的同事,工资竟然比我高很多,当然也有一些技术很厉害的工资比我低,才发现面试时候谈薪是多么重要。

在区块行业寒冬之后,我又回到了传统互联网行业。

去年的时候刚好又到了这个尴尬的年纪,在一线城市又买不起房,于是回到了二线城市生活。 其实在此之前,我已经有这方面的打算,两年前就在某二线城市买了房,就想着有机会在二线城市找份工作,然后回来生活。经常时不时登上招聘网站,看看有没有合适个工作,虽然也有一些,但是薪资都比较低。后来看到一份 rust 区块链开发的岗位,支持远程办公,于是花了一个月时间学习了 rust 语言,抱着试试的心态投了简历,最后竟然面试通过了。后来就顺理成章地离开了一线城市,回到某二线城市生活。这个二线城市并非老家,而是一个我很喜欢的沿海城市,人口很少,常年在中国宜居城市榜首位置,因为我毕业后的第一份工作在这里,后来就喜欢上了这个城市。

回到二线城市每天早上 9 点开始办公,因为很多同事在北美,所以一般都是上午远程会议,下午就自由安排时间,周末双休。只要开会的时候人在就可以了,其他的时间,你在干嘛没人知道。不过我还是很自律的,每天 9 点按时坐在电脑前,6 点钟关闭电脑。吃完晚饭,休息一两个小时,然后在小区里面跑步,我们小区超级大,跑一圈大概有 3 公里。有时候,家里有啥事,出去半天,晚上回来再加班写代码。有时候线上环境有问题的时候,也会半夜爬起来修 bug 。远程办公没有 996 ,靠的全是自觉。像这种紧急情况要改 bug 的时候,一般都要填加班单,然后可以调休。

最近也看到很多大厂裁员, 我也担心的是这份工作能持续多久。我经常关注网上是否有远程开发的岗位,看看他们的需求,远程岗位大部分在海外,对英语口语有一定要求。我现在的同事虽然有些在海外,但都是润出去的华人,都是说中文。为了未来打算,我现在要把口语学好,( ps 我英语 4 级都没过),最近发现抖音上有一些英语角,是个非常好的练习口语的地方。现在每天晚上都上去听他们瞎聊,偶尔上麦聊几句。

对于远程办公,父母都不知道我在干嘛,以为在搞什么非法的活动,也没法跟他们说解释!

对于薪资,跟我在一线城市的时候差距不大,月薪差不多,不过去年年终 4 个月,还是挺满意的

original: https://cn.v2ex.com/t/947355

评论

@coolrice1

我是从上海封城开始开始远程办公的,和 op 不一样的是我不是找了远程办公的工作,是我们老板在上海解封之后把办公室退了,让员工都远程在家办公,我以前在昆山买的房子,现在就住自己的房子,偶尔老板需要我们线下见一下也方便过去,说说我自己这一年远程办公的感觉吧。 好处:

  1. 没有通勤需求,每天可以起的比较晚,大城市的早高峰地铁真的是折磨
  2. 上班时间灵活,比如我可以中间出门办点事情再回来,或者我办公累了我可以在床上躺一会也没人知道
  3. 工资和之前在公司办公的时候差不多,还涨了一点
  4. 只要不影响工作效率和质量,老板不关系你人在哪里,你可以回老家,或者出去旅居 缺点:
  5. 远程有时候需要更多沟通,尤其是你团队里的人技术水平参差不齐的时候
  6. 缺乏社交
  7. 需要自觉(对于本身自律的人来说不是缺点)
  8. 会感到焦虑,一旦习惯了这种工作,就挺难回去坐班了,万一以后公司经营不下去,我应该会接着找一份远程,不然在家附近找一份工作干
  9. 家里有学前小孩会不方便,家里会比较吵,明年我可能会生小孩,以后可能会出去找个共享办公室上班

Welcome

· One min read
Sébastien Lorber
Docusaurus maintainer
Yangshun Tay
Front End Engineer @ Facebook

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

First Blog Post

· One min read
Gao Wei
Docusaurus Core Team

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet