Linux 与漫画
几年前,我和一些朋友开了一家小店,主要销售角色扮演游戏。我们还储备了许多其他游戏,一些合伙人还想兼营漫画。
稍晚一点,在 Linux 0.11 版本发布后,我买了我的第一台家用 PC。那是一台 386/33dx,配备 120 MB 硬盘和 20 MB 内存,在一段时间内它只是我的玩具。
回到店里,漫画销量开始上升,当你卖漫画时,你也会接受订阅。所以合伙人之一托尼开始用纸记录漫画订阅清单。当漫画订单到货时,他会将所有新漫画摊在桌子上,并扫描每张清单,查找桌子上的漫画标题,当他看到一个标题时,他会将其放入订阅文件夹。
当大约有 50 人订阅时,托尼开始感到压力很大。扫描 50 张纸质清单和摊在桌子上的 100 个漫画标题变得不堪重负。托尼会试图加快速度,但随后他开始遗漏漫画并犯错,然后人们会问我们为什么没有为他们保存漫画。
这时,我们一位不太懂电脑的合伙人格雷格试图将订阅信息放在电子表格上。他试图将每个客户列为一行,将每个漫画标题列为一列。但这行不通,因为电子表格太宽而无法打印。这时,我从家里带来了我的电脑,格雷格帮我输入了漫画数据。我将每个订阅信息存储在一个单独的文件中。现在,所需的重大转变仅仅是使用 cat 和 sort 命令。这会将订阅列表(按标题)转换为标题列表(按订阅)。“伙计们”喜欢纸质副本,所以他们打印按标题排序的列表,依次取出每个标题,在打印稿上找到该标题的订阅列表,并将一份副本放入每个漫画槽中。
我的第一个版本主要是在 DOS 下用 DOS-perl 编写的。但作为一个 Unix 黑客,我怀念所有的 Unix 系统调用和其他东西。在更多地玩 Linux 之后,以及在我自己的 PC 上安装了第一个 MCC-interim Linux 发行版之后,我将漫画系统切换到了 Linux。
现在漫画可以送到正确的客户手中了。但是,我们仍然使用纸质页面供用户更改他们的订阅。我们中的一个人仍然必须每周取出每页,并将更改输入到文件中,然后打印出新的订阅信息。
在编辑订阅页面几个月后,进行所有客户更改变得既繁琐又容易出错。客户会进来询问他们注册的 X 战警漫画在哪里,我们会检查他们在电脑上的当前列表,但上面没有,但他们请求的纸质页面却在书里。
我用 perl(还能用什么呢)编写了一组菜单,允许用户在线删除和更改他们的订阅。到目前为止,一切都很好,但我们不能允许客户简单地将任何东西添加到他们的订阅中。我们可能会遇到客户尝试订阅我们无法为他们获得的新东西的情况,所以我们在客户添加东西方面遇到了问题。
我的解决方案是,客户可以添加任何其他客户已经在订阅的标题。至少在大多数情况下,如果一个客户正在订阅某件商品,再获得一份副本不是问题。为此,我获取了当前请求的商品标题列表,并制作了一个文件,用户可以搜索该文件以找到所需的单个商品。然后可以将此商品添加到他们的订阅中。
所以现在客户能够将旧事物添加到他们的订阅中。现在说说新事物。我们使用的漫画书分销商有一个计算机化的订购系统,因此他们在每个月初向我们提供一份计算机化的新标题列表。此数据以 DOS 磁盘的形式提供,其中包含一个文件,每个标题一行条目。另一个 perl 脚本会提取新标题,并将它们保存在另一个文件中,就像我刚才谈到的当前商品列表一样。现在用户可以搜索此文件并将新标题添加到他们的订阅中。分销商还提供一本 300 到 400 页的目录,我们免费发放给我们的订阅用户。
每个月,从我们获得数据和目录到我们的客户可以从目录中添加任何东西到他们的订阅之间,有两周的窗口期。两周后,我们向分销商下订单,所以我删除了新标题文件,菜单检测到这一点,不再允许客户添加新内容,因此在 15 号之后只有当前的旧标题可用。
我在店面设置了一个哑终端,并编写了一些菜单,允许客户编辑他们的订阅文件。客户可以从分销商的列表或热门标题列表中添加标题。这样,客户无法添加我们无法获得的标题,但他可以更改每个标题的数量或起始和结束期号,以及删除标题。我们使用这个系统已经将近两年了,我们现在有超过 200 名订阅者在线管理着超过 1800 个订阅,使用的是 Linux。
去年春天,我参加了一个面向漫画书店主的重大漫画书贸易展。一位演讲者推销了一种可用于维护漫画书订阅的软件。我问他是否可以支持客户自行更改订阅。他说,“不可能”——他不能让一些孩子走到 DOS 终端前,因为孩子可能会输入 CTRL-ALT-DEL 或其他东西并破坏数据库。
这不可能发生在我的 Linux 终端上的哑终端上。
我在店里想做的另一件事是在游戏库存上运行库存系统。与漫画库存不同,游戏库存可以根据需要从分销商处重新订购。我的合伙人不明白实施库存系统有多么容易,但我已经为他们准备好了所有工具,如果他们将来想要一个的话。
我已经学会了如何从头开始打印条形码。我计划用我自己的程序在标签上打印产品编号,以便在收银台可以使用条形码阅读器。考虑到
昨晚的当前库存,
模型库存(我们认为我们应该储备的),以及
POS(销售点)终端,
我可以维护当前的库存清单,以及当前库存与模型库存的“差异”(差异列表)作为重新订购清单。可以使用游戏分销商的产品列表对其进行过滤,以自动生成每个游戏分销商的实际重新订购列表。
我想知道 Linux 和 perl 是否能够跟上最重要的商店应用程序,即销售点终端,所以我使用 perl 的 ndbm 数组设置了一个测试数据库。
有一天,我计划使用“code 3 of 9”条形码格式(一种流行的条形码格式)进行条形码编码,其中将包含产品编号。然后,可以使用光笔或激光扫描仪读取条形码,就像您在杂货店看到的那样。有了商品代码,就可以查找商品的价格并生成详细的收据。更重要的是,它还让我记录了售出的商品,以便我们可以重新订购。
我有一个游戏分销商提供的 DOS 磁盘,其中包含他们的完整产品列表 - 大约 1 兆字节的数据:每个记录大约 50 个字符,大约 20,000 个记录。我设置了一个 ndbm 文件,将产品编号映射到商品描述和定价信息。
我将每个键(产品编号)存储在一个数组中,并选择一个随机索引并查找该键。然后我将其放入一个循环中并运行了几次计时试验。
使用我的 386/33dx 系统,我可以在我的测试数据库中每秒访问超过 300 个库存商品。如果你真的很快,你每秒可以扫描大约 1-2 件商品,而大多数人比这慢得多。换句话说,有足够的时间为每个商品进行少量数据库引用。由此,我可以看到有足够的 CPU 功率来运行几个收银机,以及足够的时间来编辑漫画订阅,甚至同时进行一些重新订购。记住,这是在一台旧的 386/33dx 上。
我时不时听到重新订购有多么麻烦,但我的合伙人还没有准备好迈出自动化这一大步。总有一天,商店会非常需要库存系统,而 Linux 将在那里等待他们。这家店今年春天突破了 150 万美元的总销售额,这已经是营业 3 年后了,所以我们可能很快就需要采取这一步。
如果您对此感兴趣,这是我们的地址和电话号码