cleong/sixbeermk

随机俳句生成器

dev-main 2023-04-04 20:32 UTC

This package is auto-updated.

Last update: 2024-09-21 21:06:46 UTC


README

Monkey

6bmk 是一种互联网论坛访问控制机制。它由两部分组成:一个随机俳句生成器和幻灯片传单生成器。俳句作为一种一次性密码。只有拥有从传单上撕下的一张纸的人才能加入该小组。

Flyer

Strip

本项目受到过去论坛系统(BBS)的启发。这些系统的用户通常都住在同一个区号。这种地理邻近性意味着人们很容易在现实世界中见面。他们经常这样做,无论是参加团体活动还是互访。当人们谈论他们的BBS经历时,“像一个家庭”并不是一个不常见的描述。希望通过对会员资格实施地理限制,我们可以在互联网上重现旧的社会动态。

安装

Node.js

npm install 6bmk

PHP

composer require cleong/sixbeermk

使用 - Node.js

生成俳句

import { generateHaiku, normalizeHaiku } from '6bmk';
import { createHash } from 'crypto';

async function *getAccessHaiku(db, flyerId, locale) {
  // load existing haiku first
  const rows = await db.query(`SELECT text FROM haiku WHERE flyer_id = ?`, [ flyerId ]);
  for (const { text } of rows) {
    yield text;
  }
  // generate new ones if there aren't enough
  for await (const text of generateHaiku({ locale })) {
    // generate hash
    const sha1 = createHash('sha1');
    sha1.update(normalizeHaiku(text));
    const hash = sha1.digest('hex');
    // save to database
    db.query(`INSERT INTO haiku (flyer_id, text, hash) VALUES(?, ?, ?)`, [ flyerId, text, hash ]);
    yield text;
  }
}

generateHaiku 返回一个异步生成器。通常您会将它的输出保存到数据库中,以便以后可以验证用户是否输入了正确的俳句。 normalizeHaiku 删除标点符号,规范空格,并将字符转换为小写。这些步骤确保我们会在细微差异中获取相同的散列值。

生成传单

import { createFlyer } from '6bmk';

async function createDownload(db, flyerId) {
  const [ row ] = await db.query(`SELECT address, instructions, options FROM flyer WHERE id = ?`, [ flyerId ]);
  const { address, instructions, options } = row;
  const { paper, orientation, mode, locale } = JSON.parse(options);
  const haiku = getAccessHaiku(db, flyerId, locale);
  return createFlyer({ paper, orientation, mode, address, instructions, haiku });
}

createFlyer 返回一个 Node Readable Stream。如果您正在使用 Fastify,您可以在处理程序中简单地返回流。如果您正在使用 Express,则需要将流引入 res。在这两种情况下,您应设置适当的HTTP头,以便浏览器将响应作为下载处理。

有关示例,请参阅 examples/fastifyexamples/express 中的代码。

CommonJS

const { createFlyer, generateHaiku } = require('6bmk/cjs');

使用 - PHP

生成俳句

<?php

use cleong\sixbeermk\HaikuGenerator;

function get_access_haiku($db, $flyer_id, $locale) {
  // load existing haiku first
  $result = $db->query("SELECT text FROM haiku WHERE flyer_id = $flyer_id");
  $rows = $result->fetch_column();
  foreach ($rows as $text) {
    yield $text;
  }
  // generate new ones if there aren't enough
  $options = [ 'locale' => $locale ];
  foreach(HaikuGenerator::generate($options) as $text) {
    // generate hash
    $hash = sha1(HaikuGenerator::normalize($text));
    // save to database
    $stmt = $db->prepare("INSERT INTO haiku (flyer_id, text, hash) VALUES(?, ?, ?)");
    $stmt->bind_param("iss", $flyer_id, $text, $hash);
    $stmt->execute();
    yield $text;
  }
}

HaikuGenerator::generate 返回一个生成器。通常您会将它的输出保存到数据库中,以便以后可以验证用户是否输入了正确的俳句。 HaikuGenerator::normalize 删除标点符号,规范空格,并将字符转换为小写。这些步骤确保我们会在细微差异中获取相同的散列值。

有关示例,请参阅 examples/php 中的代码。

生成传单

<?php

use cleong\sixbeermk\FlyerGenerator;

function create_download($db, $flyer_id) {
  $result = $db->query("SELECT address, instructions, options FROM flyer WHERE id = $flyer_id");
  list(
    'address' => $address,
    'instructions' => $instructions,
    'options' => $options,
  ) = $result->fetch_assoc();
  $options = json_decode($options, true);
  $haiku = get_access_haiku($db, $flyer_id, $options['locale']);
  return FlyerGenerator::generate($options + [
    'address' => $address,
    'instructions' => $instructions,
    'haiku' => $haiku,
  ]);
}

FlyerGenerator::generate 返回一个流。使用 fpassthru 将文件内容发送到浏览器。您应预先设置适当的HTTP头,以便将响应作为下载处理。

可能的俳句数量

默认情况下,在生成俳句时使用的是小型的en-US词典。其内容如下

1-syllable words: 5956
2-syllable words: 12443
3-syllable words: 8549
4-syllable words: 3892
5-syllable words: 1260
6-syllable words: 191
7-syllable words: 15

因此,可能的俳句数量为1.5009341463235493e+64。在tools文件夹中运行calc-combo.js,以查看较大词典的结果。

致谢

本库使用的单词列表来自Spell Checker Oriented Word Lists数据库(http://wordlist.aspell.net/)。

使用CMU发音词典来确定每个单词的音节数量(https://github.com/aparrish/pronouncingjs)。