V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Wichna
V2EX  ›  分享创造

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

  •  
  •   Wichna ·
    folyd · 2018-10-21 01:15:27 +08:00 · 6020 次点击
    这是一个创建于 2255 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 在全世界的前景还是非常光明的(没有特指中国)。
    第 1 条附言  ·  2018-10-21 10:04:37 +08:00
    另外我在 reddit/rust 也发了一条介绍性的帖子,upvote 数还可以,感兴趣的可以看看。
    https://www.reddit.com/r/rust/comments/9ptvwq/show_reddit_a_rust_cli_tool_to_help_you_launch/
    36 条回复    2018-10-28 14:17:08 +08:00
    noli
        1
    noli  
       2018-10-21 05:03:00 +08:00   ❤️ 2
    坐等 rust nightly 合并 async await 之后再用来写实际项目。

    并非 anyshortcut 的用户,但想了解一下,如果我有 vimium 这样的插件,anyshortcut 可以带给我什么新的价值?
    huclengyue
        2
    huclengyue  
       2018-10-21 05:23:06 +08:00 via Android
    关注一下 rust
    devtiange
        3
    devtiange  
       2018-10-21 06:13:16 +08:00
    不是想拍砖, 单纯的觉得这样的 cli 用 nodejs 写会不会代码更少, 开发周期更短呢?
    trait
        4
    trait  
       2018-10-21 06:24:22 +08:00 via iPhone   ❤️ 2
    粗看了一下,挺好的。国外对 rust 引起的命令行小“重生”评价挺高的
    models 最后三个 impl 考虑一下 macro ?
    既然用到了 clap,能不能用 structopt 重写一下 cli 相关,structopt 包装了 clap,一个命令行就是一个 struct 或者 enum,代码更美观好维护一些; edition2018 的 nightly 已经发布了(1.31),stable 会在 12.6,可以考虑一下更新到 2018 版本,具体参见 edition guide
    trait
        5
    trait  
       2018-10-21 06:29:18 +08:00 via iPhone
    @devtiange node 用个 cli 都要拖家带口?
    qdwang
        6
    qdwang  
       2018-10-21 07:16:21 +08:00 via iPhone
    rust 写 wasm 确实舒服 还能结合打包工具一起使用 直接 import rs 项目 感觉很方便
    qdwang
        7
    qdwang  
       2018-10-21 07:17:04 +08:00 via iPhone
    缺点感觉是初次编译速度太慢
    zxq2233
        8
    zxq2233  
       2018-10-21 07:35:06 +08:00
    小哥哥
    Wichna
        9
    Wichna  
    OP
       2018-10-21 09:57:15 +08:00
    @noli 哈哈哈,我已期待 nightly 合并。

    我是一个效率控,vimium 我也很早就知道并且使用过,我没有必要重新造轮子。Anyshortcut 和 vimium 这样的插件完全不一样的,我这个帮你给常用网页绑定一级快捷键、二级快捷键或混合快捷键,甚至它们可以混合使用。它是一个比较极客的产品,一般人用不到甚至会嗤之以鼻,但是你只要理解了它习惯了绝对会觉得**Anyshortcut 真香**。
    Wichna
        10
    Wichna  
    OP
       2018-10-21 09:59:28 +08:00
    @devtiange 跟开发周期没有任何关系,用什么语言写这个 cli 工具都可以,只是我现在热衷于 Rust 所以其他语言不考虑了
    Wichna
        11
    Wichna  
    OP
       2018-10-21 10:01:34 +08:00
    @trait 感谢指点。

    models 最后三个 impl 考虑一下 macro ?
    哈哈哈这个还真的可以,我后面试一下。

    structopt 我还没有用过,我到时候看看。

    Rust 2018 发布之后我到时候一定会切换到这个版本的。
    Wichna
        12
    Wichna  
    OP
       2018-10-21 10:02:05 +08:00
    @qdwang 编译速度确实是硬伤,官方应该也在优化中吧
    Wichna
        13
    Wichna  
    OP
       2018-10-21 10:05:14 +08:00
    @huclengyue 哈哈推荐关注
    dodo2012
        14
    dodo2012  
       2018-10-21 11:16:14 +08:00
    去年在学,主要我一直学的是脚本类语言,然后,在生命周期和所有权这里卡了很久,后来工作用不到就慢慢丢下来了,现在对这两个概念还是有点乱,`a `b 的头大了
    Wichna
        15
    Wichna  
    OP
       2018-10-21 11:30:58 +08:00
    @dodo2012 是的,每个人都会有这样的感觉,这个只能静下心来认真了解一下,之后一定会有柳暗花明的感觉
    trait
        16
    trait  
       2018-10-21 12:08:09 +08:00   ❤️ 2
    @dodo2012 很多人说 rust 难学,被生命周期所有权吓到(严格来说 rust 里面并不存在“ lifetime ”,只不过是历史”误称“现在语言组想改改不了了,它在社区传播太广泛了,在 NLL 中这个名词更不准确,在 rustc 开发过程中我们更多地称呼为 region,只不过在给用户错误诊断里面还是称呼为 lifetime ),即将到来的 edition2018 引入 nll 后,“ lifetime ”更符合用户的直觉,与 edition2015 中类作用域的”线段“式粗暴检查不同,nll 是精确到点,绝大多数情况下你甚至不会觉察到它的存在。所有权和借用如果学过操作系统,了解进程同步的读-写者模型这个问题就很容易理解了。
    学 rust 千万不要看中文翻译,内容落后,本身中文资料少,你从书里面看到的名词中文搜索根本找不到有价值的信息
    h404bi
        17
    h404bi  
       2018-10-21 12:25:31 +08:00
    @dodo2012 ownership, borrowing, lifetime,一到这里就脑疼 。不过还是很想把它啃下来。
    @trait The Book 中英文对照着看感觉还行
    quinoa42
        18
    quinoa42  
       2018-10-21 12:26:32 +08:00
    看了一下居然支持 pattern matching,谢安利
    不过最近 kotlin 写着感觉也还可以,等到有空了再尝试吧
    Wichna
        19
    Wichna  
    OP
       2018-10-21 12:29:52 +08:00
    @trait 请问你是在 rust 官方组吗?看你提到“在 rustc 开发过程中我们更多地称呼为 region ”
    Wichna
        20
    Wichna  
    OP
       2018-10-21 12:30:31 +08:00
    @h404bi 我也是先看的官方的英文 book,很推荐
    Wichna
        21
    Wichna  
    OP
       2018-10-21 12:31:35 +08:00
    @quinoa42 Rust 的 pattern matching 非常强大好用的,Rust 的有点 pattern matching 都反而不是最重要的优点了
    Wichna
        22
    Wichna  
    OP
       2018-10-21 12:32:25 +08:00
    @quinoa42 Rust 的 pattern matching 非常强大好用的,Rust 的优点很多,pattern matching 不是算是最重要的优点了
    quinoa42
        23
    quinoa42  
       2018-10-21 12:56:39 +08:00
    @trait 刚看了楼主和层主的安利之后去 github 上搜了一下 rust 相关话题,没想到发现了新世界
    现已安装 fd,exa 和 bat😂
    Wichna
        24
    Wichna  
    OP
       2018-10-22 00:36:51 +08:00   ❤️ 1
    @quinoa42 哈哈哈,rust 非常适合写 cli 应用,官方还专门成立了 cli 工作组在这方面不遗余力的推进。就像#4 说的:国外对 rust 引起的命令行小“重生”评价挺高的
    sampeng
        25
    sampeng  
       2018-10-22 09:10:02 +08:00 via iPhone
    同样有 rust 真实项目在跑。编译过了就绝对没问题,这点真的是程序员福音
    Wichna
        26
    Wichna  
    OP
       2018-10-22 10:28:50 +08:00
    @sampeng 哈哈哈是的
    sampeng
        27
    sampeng  
       2018-10-22 11:23:54 +08:00 via iPhone   ❤️ 1
    @Wichna 我还算大规模用…一小程序几万个终端设备跑着。啥毛病没有。就是一开始 tokio 有点毛病。姿势不对,http 一超时就全部死那了…后来发现没默认 timeout 回调,所以是开源库的锅。

    rust 写起来太舒服了。搞的现在没有宏写 golang 简直是噩梦一样

    错误类型让代码更严谨

    nightly 的编译插件减少大量的开发量

    模式匹配也是好用到爆炸。虽然无法避免深层次嵌套,但用宏可以很优雅的解决

    不觉得 lifetime 很难理解啊。理解整个内存使用原则随借随还,其实 ownership, borrowing, lifetime 感觉都是在解决内存管理问题、这些机制去保证不用 gc 和手动管理内存的情况下也不会有内存问题。就是有些深层次嵌套的时候逻辑上有点问题。写起来很蠢。

    feature 标记解决多环境问题很优雅。

    等等等等

    总的来说,很看好 rust。就是少了大的开源项目。
    xiangchen2011
        28
    xiangchen2011  
       2018-10-22 16:04:22 +08:00
    blog 有 rss 么,可以订阅下
    Wichna
        29
    Wichna  
    OP
       2018-10-22 19:19:05 +08:00
    @xiangchen2011 谢谢,你说的是我的这个 https://folyd.com/blog/ ?我本人没有宣传这个网站,暂时没有提供 rss,以后可以考虑
    songtianyi
        30
    songtianyi  
       2018-10-23 10:53:13 +08:00   ❤️ 2
    Wichna
        31
    Wichna  
    OP
       2018-10-27 21:58:50 +08:00
    @trait 感谢指点,我今天基于 Rust 1.30 用 proc_macro_derive 实现了自动 impl Storage 😄

    https://github.com/anyshortcut/anyshortcut-cli/blob/a33beb4983853ff66446749c219e4686913ee085/storage-derive/src/lib.rs
    trait
        32
    trait  
       2018-10-27 22:10:24 +08:00   ❤️ 1
    @Wichna awesome :) 一个小小的建议,rust 里面建议的模块名和 crate 名都用下划线 storage_derive
    trait
        33
    trait  
       2018-10-27 22:19:04 +08:00   ❤️ 1
    @Wichna https://github.com/anyshortcut/anyshortcut-cli/blob/a33beb4983853ff66446749c219e4686913ee085/src/utils/ui.rs#L13
    这里用 match 改下?这里用了 Result 但是 y|n 返回 Ok,_ 又只是 print
    match input {
    y|n => Ok(..)
    _ => Err(..)
    }
    oyyd
        34
    oyyd  
       2018-10-28 13:15:39 +08:00
    GJ. Chrome Extensions 免费应用偏多,楼主分享些“订阅制收费”的经验如何?
    Wichna
        35
    Wichna  
    OP
       2018-10-28 14:14:38 +08:00
    @trait 哈哈哈谢谢,取名的时候没有注意用下划线,我以后注意
    Wichna
        36
    Wichna  
    OP
       2018-10-28 14:17:08 +08:00
    @oyyd 订阅制收费其实挺难的,要么产品能解决大多数人刚需,要么产品能做到极致。然后多花时间做 Marketing
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:16 · PVG 06:16 · LAX 14:16 · JFK 17:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.