随着大流行,每个人都有自己的挑战。对我来说,转向在线杂货店购物变得特别困难。

在我的典型订单中,我会购买 7-10 天的杂货,并且购物车中将包含 60-80 件商品。当我线下购物时,我通常不会做太多计划,而是走遍所有部门,边走边捡东西。我很少会因为吸引我的目光而忘记买东西,但更多时候我会买一些我不需要的东西(嗯,超市就是这样设计的)。

在线是一个不同的故事。我无法重现相同的行为并浏览整个目录。所以我需要计划我的饭菜。我在便利贴上写下我的食谱的成分,然后将它们组合起来下订单。

这真的很乏味。几个订单后,我注意到它有点重复。虽然我的妻子会告诉你我只是懒惰并且不想做无聊的事情,但我的开发人员说是时候自动化了,再也不会解决同样的问题了。

Cooklang就是这样诞生的。

关于库克朗

我想如果我将我的食谱存储在类似 Markdown 的文本文件中并用@符号标记成分怎么办?像那样:

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--eZOYv157--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/3bk1w72fuhmd8su6r666.png)

这将使配方文件人类和机器可读。

鉴于这些食谱文件,计算机可以创建一个购物清单,并且实际上可以做更多的事情:计算营养价值、成本或任何给定所提供成分的信息。

由于它仍然是人类可读的,这意味着我可以灵活地将我的食谱存储在 git 中,并随着时间的推移对其进行完善(如代码重构)。

也因为它只是一种简单的文本格式,我避免了“供应商锁定”问题,并且在我退休时仍然可以以同样的方式使用我的食谱。我的食谱是我的,永远。

关于工具

只有语言规范并没有真正的帮助。是的,我可以将我的食谱存储在 GitHub 上并拥有它们,但仅此而已。

我想如果有很多小的应用程序可以理解语言并很好地完成自己的小事情:计算卡路里,购物,成本,智能膳食计划等,我真的很兴奋。

我读了 Robert Nystrom 的一本精彩的书Crafting Interpreters并做了一些实验,我创建了一个简单的解析器和CLI 应用程序。因为我想在这里专注于我如何自动化购物,如果有人感兴趣,我可能会再写一篇关于解析器和 CLI 的文章,所以我跳过所有细节。

所以 CLI 可以理解 Cooklang 文件,提取成分,并将它们分组:

$ cook shopping-list \
> Neapolitan\ Pizza.cook \
> Root\ Vegetable\ Tray\ Bake.cook
BREADS AND BAKED GOODS
    breadcrumbs                   150 g

DRIED HERBS AND SPICES
    dried oregano                 3 tbsp
    dried sage                    1 tsp
    pepper                        1 pinch
    salt                          25 g, 2 pinches

FRUIT AND VEG
    beetroots                     300 g
    carrots                       300 g
    celeriac                      300 g
    fresh basil                   18 leaves
    garlic                        3 gloves
    lemon                         1 item
    onion                         1 large
    red onion                     2 items
    thyme                         2 springs

MEAT AND SEAFOOD
    parma ham                     3 packs

MILK AND DAIRY
    butter                        15 g
    egg                           1 item
    mozzarella                    3 packs

OILS AND DRESSINGS
    Dijon mustard                 1 tsp
    Marmite                       1 tsp
    cider                         150 ml
    olive oil                     3 tbsp

OTHER (add new items into aisle.conf)
    tipo zero flour               820 g

PACKAGED GOODS, PASTA AND SAUCES
    vegetable stock               150 ml
    water                         530 ml

TINNED GOODS AND BAKING
    cannellini beans              400 g
    chopped tomato                3 cans
    fresh yeast                   1.6 g
    redcurrant jelly              1 tsp

进入全屏模式 退出全屏模式

我还可以将输出格式设置为jsonyaml并将其提供给其他程序。或者只是在 shell 中使用良好的旧纯文本输出操作和管道。它还有更多功能,例如网络服务器,可以通过烹饪模式探索食谱并在浏览器中制作购物清单。

我将一堆来自分散来源的食谱迁移到 Cooklang 格式中,并将它们存储在 GitHub 存储库https://github.com/dubadub/cookbook上。

我的杂货店购物方法

不幸的是,在那之后我还没有走多远,还没有完全自动化购物。我仍然需要做一些手动步骤,因为我的商店不提供任何 API 访问(惊喜!)。

这就是我的流程现在的样子:

1/ 我生成所有成分的列表。我将带有符号链接的目录添加到代表膳食计划的食谱中。所以很容易为整个目录生成一个成分列表,如下所示:

$ cook shopping-list --only-ingredients ./Plan\ I

进入全屏模式 退出全屏模式

2/ 我从列表中删除我家里所有的东西。

3/ 我将所有成分粘贴到商店网站上的多搜索输入中:

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--N_PcgRuQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/pr3r1gxfw1218il7hhcv.png)

4/ 我手动浏览每件商品并添加到购物车😓。

5/ 完成!

它有一个手动步骤,但仍然:

  • 比以前快得多;

  • 对我的大脑的认知负荷较小;

  • 更精确。

我对这个精密部件感到非常满意。我注意到我现在满足了我所有的需求,但没有过度消费。某种意义上的生态自给。

接下来是什么

我只解决了 80% 的问题,我还想做更多。我正在考虑在我的食谱中的成分和我商店网站上的链接之间创建一个映射。这将允许我使用curl或 Selenium 来完成问题。

链接

Cooklang 网站

解析器

CLI

我的食谱

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐