cleong / sixbeermk
Requires (Dev)
- phpunit/phpunit: ^8.5.23
This package is auto-updated.
Last update: 2024-09-21 21:06:46 UTC
README
6bmk 是一种互联网论坛访问控制机制。它由两部分组成:一个随机俳句生成器和幻灯片传单生成器。俳句作为一种一次性密码。只有拥有从传单上撕下的一张纸的人才能加入该小组。
本项目受到过去论坛系统(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/fastify 或 examples/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)。