29 个版本
0.9.1 | 2024 年 1 月 17 日 |
---|---|
0.9.0 | 2023 年 7 月 17 日 |
0.8.13 | 2023 年 3 月 11 日 |
0.8.12 | 2022 年 11 月 19 日 |
0.2.0 | 2019 年 3 月 12 日 |
#134 in 命令行工具
198 每月下载
71KB
1K SLoC
rpick
是一个命令行工具,它可以帮助您使用可配置的算法从列表中选择项目。
此工具的一个示例用法是选择餐厅。您可能希望通常去您很久没去过的餐厅,但您也可能不想使用严格的最近最少使用模型,并使用一些随机元素来使事情变得更有趣,比如最近最少访问的餐厅会有更高的机会。
安装
您可以使用 Arch AUR 软件包安装 rpick
$ git clone https://aur.archlinux.org/rpick.git
$ cd rpick
$ makepkg -sirc
或者在 Fedora 中
$ sudo dnf install rpick
或者在 Gentoo 中
$ sudo emerge app-misc/rpick
或者在 MacOS 中,假设您已经安装了 brew
$ brew install rust
# Be sure to read the output of this command and adjust your PATH as instructed.
$ cargo install rpick
如果您不使用上述系统之一,rpick
也可以在 crates.io 上找到。您可以通过首先 安装 Rust,然后使用 Rust 的 cargo 工具安装 rpick 来安装 rpick。
# Be sure to read the output of this command and adjust your PATH as instructed.
$ cargo install rpick
快速开始
rpick
将其状态保存在您家目录的配置目录中名为 rpick.yml
的 YAML 文件中。目前,用户必须手动创建此文件,rpick
将从那里进行管理。要开始使用一些示例,请在 Linux 中创建 ~/.config/rpick.yml
,在 MacOS 中创建 ~/Library/Preferences/rpick.yml
,或在 Windows 中创建 C:\Users\Alice\AppData\Roaming\rpick.yml
,如下所示
---
prs:
model: even
choices:
- paper
- rock
- scissors
restaurant:
model: gaussian
choices:
- Spirits
- Lucky 32
- Centro
- Sitti
- Cookout
然后您可以让 rpick
为您选择一个剪刀石头布的游戏
$ rpick prs
Choice is scissors. Accept? (Y/n)
请注意,对于剪刀石头布使用高斯模型是不好的,因为您在猜测该模型结果方面有统计优势。让我们看看高斯模型
$ rpick restaurant
Choice is Lucky 32. Accept? (Y/n)
如果您说“是”,由于我们使用了高斯模型,它将像这样重写 yaml 文件
---
prs:
model: even
choices:
- paper
- rock
- scissors
restaurant:
model: gaussian
stddev_scaling_factor: 3.0
choices:
- Spirits
- Centro
- Sitti
- Cookout
- Lucky 32
请注意,在调用 rpick
时,我们传入了参数 prs
和 restaurant
- 这告诉 rpick
在 rpick.yml
中查找这些对象,以确定使用哪些模型以及有哪些选项可用。此参数是必需的,但其可能值由你在配置文件中定义。
配置文件中的 model
字段定义了从给定的选项中选择时使用哪个数学模型。有关可用的模型及其配置的更多信息,请参阅下面的“模型”部分。
它为您原来的餐厅对象添加了一个设置:stddev_scaling_factor
。您可以在下面的高斯模型文档中了解更多关于此设置的信息。
参数
CLI 接受一些参数
-c/--config
:这可以用来指定用于rpick
的配置文件的备用路径。您还可以设置RPICK_CONFIG
环境变量。-h/--help
:打印帮助文本。-v/--verbose
:打印有关选择的更多信息。-V/--version
:打印 rpick 版本。
模型
rpick
能够使用几种不同的选择算法:均等、高斯、库存、彩票、LRU 和加权。
均等
even
分布模型是最简单的选择模型。它会给列表中要选择的每个字符串项均等的机会。它需要两个键
model
:必须将此设置为字符串 "even",以选择此模型。choices
:这是一个字符串列表,是模型选择的选项。
示例
convertible_top:
model: even
choices:
- up
- down
在使用 rpick
进行此用例之前,您可能需要查看天气...
高斯
要了解高斯分布模型,我们首先需要研究 这个 XKCD 漫画
gaussian
分布模型更复杂。它使用 高斯分布 来优先选择最近较少被选择的选项。列表顶部附近的选项被选中的概率最高,而列表末尾的选项被选中的概率最低。一旦选中一项,并且用户接受了该选择,该列表就会被保存到磁盘上,选中的项目将被移动到列表末尾。此模型接受三个键
model
:必须将此设置为字符串 "gaussian",以选择此模型。stddev_scaling_factor
用于计算标准差;标准差是选择列表长度的除以这个缩放因子。因此,较大的缩放因子将导致列表顶部项目的偏好更强,而较小的缩放因子将导致选择在项目间更加均匀分布。请注意,缩放因子越小,平均而言,rpick做出决策所需的时间越长。默认值为3.0
,这是因为它将列表中的最后一个项目放在三个标准差的位置,使其有0.03%的机会被选中。此键是可选的,默认为3.0。choices
:这是一个字符串列表,是模型选择的选项。
示例
album:
model: gaussian
stddev_scaling_factor: 5.0
choices:
- Fountains of Wayne/Fountains Of Wayne
- Beck/Odelay
- "Townes Van Zandt/High, Low and In Between"
- Tori Amos/From The Choirgirl Hotel
- Zao/Parade Of Chaos
为了展示此模型的相对频率的直观表示,这里是一个图表,该图表是通过调用高斯模型10,000次生成的,选择设置为从0到99的数字,默认 stddev_scaling_factor
为 3.0
库存
inventory
分布模型是 weighted
模型的动态版本。每个选择都有一个影响它们在这个回合被选中可能性的彩票数量。一旦选中一个项目,它就会丢失一张彩票,即减少该特定项目的库存量。它接受两个键
model
:必须将该字符串设置为“inventory”,以选择此模型。choices
:必须是一个对象列表。每个对象接受两个键name
:这是必需的,是选择的名字。tickets
:此选择当前拥有的彩票数量。这是可选的,为整数,默认为1。
示例
tea:
model: inventory
choices:
- name: "Tea… Earl Grey… Hot"
tickets: 15
- name: Black
tickets: 2
彩票
lottery
分布模型也是 weighted
模型的动态版本。每个选择都有一个影响它们在这个回合被选中可能性的彩票数量。一旦选中一个项目,它就会将其彩票重置为 reset
张彩票,而每个未被选中的选择都会获得更多彩票。它接受两个键
model
:必须将该字符串设置为“lottery”,以选择此模型。choices
:必须是一个对象列表。每个对象接受四个键name
:这是必需的,是选择的名字。reset
:选择被选中时重置的彩票数量。默认为0。tickets
:此选择当前拥有的彩票数量。这是可选的,为整数,默认为1。weight
:这是一个整数,表示在选择未被选中时分配给此选择的彩票数量。您可以使用它来影响此项目相对于其他选择的偏好频率。这是可选的,默认为1。
示例
activity:
model: lottery
choices:
- name: exercise
- name: read documentation
- name: watch tv
weight: 1000
LRU
lru
(最近最少使用)模型是一个简单的有序FIFO(先进先出)列表。最少最近被选中的项目是列表中的第一个项目。每次选择时,rpick会简单地选择用户说“是”的列表中的第一个项目,然后将该项目移动到列表的末尾。它接受两个键
model
:必须将该字符串设置为“lru”,以选择此模型。choices
:必须是一个字符串列表。最少最近被选中的项目应位于列表开头。
示例
code:
model: lru
choices:
- Add a feature
- Fix a bug
- Write some docs
加权
weighted
分布模型是 even
模型的一个更通用版本,允许您为每个选择表达不同的权重。它接受两个键
model
:必须设置为字符串“weighted”,以便选择此模型。choices
:必须是一个对象列表。每个对象接受两个键name
:这是必需的,是选择的名字。weight
:这是一个表示选择的权重的整数。它是可选的,默认为1。
示例
cereal:
model: weighted
choices:
- name: generic bran flakes
- name: cracklin oat bran
weight: 1000
变更日志
请参阅变更日志。
贡献
如果您想为rpick做出贡献,请给我发送一个补丁!
如果您系统上有podman,有一个方便的Makefile用于开发。它的默认目标是帮助菜单,用于描述可用的目标。
# Note that root is not required.
$ make check
podman开发环境在config.yml
中查找rpick配置。
依赖项
~10–18MB
~233K SLoC