分享 分享一下我用 Rust 写的 CLI 版 Anyshortcut 以及使用 Rust 半年的感想

Folyd · 2018年10月21日 · 最后由 Folyd 回复于 2018年10月27日 · 1371 次阅读

Anyshortcut是我发布于2017年12月的Chrome/Firefox效率插件,一直坚持订阅制收费, 到目前为止注册用户将近1000位,使用信用卡订阅用户接近3%吧。

大半年前接触到Rust,被这门语言深深折服,于是从官方文档开始学习Rust,入门之后写了一个Anyshortcut CLI版。

项目地址

https://github.com/anyshortcut/anyshortcut-cli

自认为这个项目很适合Rust初学者学习。

命令行的Anyshortcut可以干什么?

因为Anyshortcut的快捷键是可以同步的,对于CLI程序是通过Access token来访问后端API来同步快捷键的。Access token可以在官网用户中心找到。

用Access token登录之后即可把所有快捷键同步下来,然后可以使用命令行快速打开网页。

比如,我给https://www.google.com 绑定了快捷键G,那就可以输入as g快速用默认浏览器打开Google。

$ as g
Url: https://www.google.com/

其他的混合快捷键、二级快捷键也是类似,就不再介绍了。

当然这里的命令asanyshortcut的别名,要不然名字太长了,根本就算不上效率工具了。

alias as=$(which anyshortcut)

怎么安装

  • 如果你是Rust 开发者,很简单,用cargo install就行。
cargo install anyshortcut
  • 当然我也提交了Homebrew,但是因为GitHub repository not notable enough (<30 forks, <30 watchers and <75 stars) 的原因暂时没有被merge,希望以后能达到这个要求。Merge之后就可以通过brew安装了。
brew install anyshortcut

使用Rust半年之后的感想

申明:除了Rust 之外我个人熟悉的编程语言只有C++ 2003, Java, Python, Javascript, Groovy,我并没有研究过各种编程语言, 甚至Ruby、Go、Swift、Kotlin、Scala,Haskell等我都一律没有去学过,所以这些只能算比较浅显的感想。

  • 相识恨晚。 其实我大概16年的时候才知道的Rust,当时认识几个不错的程序员在写一些Rust的项目,不过我还不以为然,以为又是一门什么赚噱头的新语言,就没有太多的关注它。直到今年初机缘巧合才真正的激发我学Rust的强烈兴趣。目前我也看到了好几位和我一样学了Rust之后发表Rust真香的赞叹!

  • 概念很多,门槛很高。 Rust是一门对标C/C++的系统级编程语言,它在既能处理好内存安全、线程安全的这些问题的同时也支持各种现代编程语言的特性,比如函数式、错误处理、并发处理、依赖管理等。写起来还是比较优雅的。当然Rust没有自动GC,所以它引入了很多Rust独有的新概念,比如生命周期、所有权、借用等让初学者非常不适应。

  • 优秀的依赖管理和文档生成工具。 Rust的Cargo绝对是我用过的所有语言里面最好的依赖管理工具,非常省心人性化。Cargo提供的文档生成体验也很棒,这才是现代化的编程语言应该具有的。

  • 越写越爱不释手。 写Rust最难过的一关就是编译器,你会被它折磨的心累,太严格太死板了,稍微不对就会编译不过。当然Rust官方也在优化这一点,比如NLL。但是只要你过了编译器这一关,编译没问题,线上运行绝对没有问题(Unsafe的代码、内存泄漏或溢出除外),不像Java编译过了,线上还有可能出现NPE啊啥的。编译成功之后非常放心,几乎不需要花时间去线上复现解决那些诡异的bug。

  • 国内很冷门,但前景很看好。 Rust在国内确实太冷门了,目前社区也很少,Rust相关的会议更是寥寥无几,招聘Rust的职位非常少,除了蚂蚁金服、今日头条、Pingcap和区块链公司,其他公司的职位几乎没有。另外Rust也还缺少明星级的项目,这些都需要时间去沉淀吧。目前国内学Rust的基本上都是出于情怀和对这门语言的喜爱。Rust不管是在系统级编程、网络编程、并发编程、嵌入式、WebAssembly等方面都在发力,德国越来越多的公司在使用Rust应用于他们的工业4.0,甩我们多少条街?Github发布的2018年终总结提到Rust是增长速度最快的编程语言第五位。我学Rust也是出于情怀,但是我还是相信Rust在全世界的前景还是非常光明的(没有特指中国)。


另外我在 reddit/rust 也发了一条介绍性的帖子,upvote 数还可以,感兴趣的可以看看。 https://www.reddit.com/r/rust/comments/9ptvwq/show_reddit_a_rust_cli_tool_to_help_you_launch/

共收到 12 条回复

Cargo 的核心团队里有 Yehuda Katz(前 Ruby on Rails 核心团队成员),吸收了 Ruby 社区依赖管理的成功经验,所以依赖管理是同类语言里最好的。反面例子就是 Go 了,最近才由官方推出 Dep 终结混乱。

能高效的解决问题的工具就是好工具,不用太在意用的人多不多,有时用的人少反而是自己的秘密武器。

谢谢,长知识了。果然优秀的人到哪都会一直优秀,原来那些我听过甚至用过的工具都由这个哥们开发或参与开发,确实让人敬佩。

哈哈哈,Anyshortcut确实是一款比较小众极客的产品,一般人用不到,采用订阅制收费仅仅是一种对SaaS的尝试,并没有刻意在乎多少人会用。

Folyd 回复

工具那里我指的是语言。

Rei 回复

哈哈抱歉,搞错了😂

I split my time between Ruby, JavaScript (mostly with TypeScript) and Rust, with occasional Java and devops work. Of those, JavaScript (with TypeScript) is my predominant language at the moment, but the mix changes pretty often. Skylight's stack is Rust and Ruby for the agent, Rails for the backend, Java for our data processing pipeline (essentially a custom data store) and Ember for virtually the entire front end. The graphs in Skylight are Ember components written in d3.

I still think that Rails is a great choice for most web apps, since (to this day) it provides an extremely productive baseline for building account management and working with third-party integrations, which turn out to be a surprising percentage of the total code (and an even higher percentage of backend code changes) in even an ambitious project like Skylight.

I also think it's reasonable to use something like Java or Rust for any heavy data-crunching your app might do, but I think people overestimate which aspects of their application are truly performance and efficiency critical.

-- Yehuda Katz, talking about his language chosen in routine work


另外,Cargo 其实已经超出了依赖管理的范畴了,它应该是一种工作流程管理器(WorkFlow Tool)。它之所以好,是因为设计伊始就从更高的角度来审视 Rust 程序员的日常工作流程,而依赖管理仅仅是其中的一个环节而已。最近出现的语言中,比如 Elixir 的 mix 也是类似的理念和设计,不过 Elixir 更年轻,还有一些地方需要向 Rust 学习的。

关于 Cargo 的设计理念,Yehuda 有专门撰文介绍:https://blog.rust-lang.org/2016/05/05/cargo-pillars.html

Rei 回复

dep也不好用,这些年我一直想为啥go社区不直接抄个现成的

JGpirateKing 回复

vgo就是目前的方案

JGpirateKing 回复

😂我看了这篇博客去官网仓库找,还以为就是 dep,原来还有别的吗?我已经凌乱了。

lidashuang 回复

1.0吗?这么快?今年5月才交的proposal啊

Rei 回复

twitter上长久以来对golang的依赖管理也是怨声载道

使用Rust将解析日志的速度提高了230倍

该文章是《The Ruby Way》的作者André Arko写的,同时他也是Ruby包管理器Bunlder的No.1贡献者,以及Rubygems.org的维护者。

所以,他在维护Rubygems.org的过程中,遇到最让他头疼的事情就是对日志的处理。Rubygems每天有4000到25000个请求,磁盘每天可以产生500GiB的日志。他们尝试了一些日志的托管产品,但是这些产品也只能为他们保留1个小时以内的日志数据。

大概一年前,他把完整的日志进行了压缩,放到了s3上面,存储成本大概是每个月3.5美刀。但是有很多他感兴趣的统计数据被「埋葬」在了S3上面。因为S3的gzipped JSON流很难查询数据。这些统计数据有利于提供Ruby生态系统状态的重要信息。

后来利用aws的Glue功能,可以运行基于spark脚本的hadoop集群,他写了一个统计脚本,但是费用上升到了每月1000刀。

后来,也不知道是什么原因,让他想到了Rust。

事实证明,Rust满足了他的需求。 Serde Json库,让他可以在2秒内将1GB的JSON反序列化为Rust数据类型。并且使用nom来解析日志,可以在3分钟内解析1GB的日志文件,作者说,用Python和Glue在30分钟内解析完日志,他就觉得了不起了。

但是作者又仔细阅读了nom的文档,发现了一句「有时候,nom几乎和regex一样快」,这句话给了他灵感,他又用regex重写了解析代码,性能又提高了3倍。至少比spark中使用python解析快30倍。但是他把这个Rust程序的性能又多牛逼的事情告诉 @ReinH (他的朋友,Rust的贡献者之一,比他更了解Rust)的时候,ReinH说,怎么这么慢?你这个程序必须得优化。

他不清楚他的朋友是不是跟他开玩笑,但是他继续对Rust进行研究,然后他发现了—release模式,在使用release模式编译代码之后,突然发现:他可以在8秒内把1GB的文件解析完。以下是处理速度的一个对比记录:

~525 records/second/cpu in Python on AWS Glue 50,534 records/second/cpu in Rust with nom 121,153 records/second/cpu in Rust with regex + release

但他没满足,继续使用rayon对程序并行化处理日志,最终的程序,在8核机器上快了100倍,在单核上跑,快230倍。现在的1GB的日志文件处理需要6.4s。

151,441 records/second/cpu in Rust with regex + release+ rayon

最后如何部署是个问题。

他尝试了一些方案之后,最后发现了aws Lambda,它有一个免费策略:每个月400,000s。而作者处理500GB日志,只需要3000多s。于是他就快乐地使用了aws Lambda功能。

源码 : https://github.com/rubytogether/kirby

原文:https://andre.arko.net/2018/10/25/parsing-logs-230x-faster-with-rust/


转载自:Rust每日新闻

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册