米米的博客

做了一点微小的工作

《电子诗人》是刘慈欣在 1989 年编的一个小软件,需要 Visual Foxpro 环境运行。原版程序已经难以获得,网上广为流传的是诸葛恒修改版

Visual Foxpro 的最新版本是 9.0,发布于 2007 年。此后微软逐渐终止了 Visual Foxpro 的开发,也没有适配更新的操作系统,例如 Windows 10。因此,要运行《电子诗人》,还得先有一台运行着 Windows XP 或 Windows 7 的电脑。当然,虚拟机也是可以的。

Visual Foxpro 的安装包可以从 MSDN, I Tell You 上找到,在「开发人员工具」中选择「Visual FoxPro 9.0」,就可以获得 Visual FoxPro Professional 9.0 (English) 的下载链接

1
ed2k://|file|en_visual_foxpro_9.0.iso|310644736|4C521F4B9DB5F2721038E2E25A8C8B14|/

下载的文件是 en_visual_foxpro_9.0.iso。物理机可以用虚拟光驱的软件挂载,或者刻录成光盘;虚拟机一般都支持虚拟光驱,例如 QEMU 可以通过 -cdrom 参数指定。完成后,双击打开光盘驱动器,将弹出 Visual Foxpro 的安装程序。按照步骤安装即可,激活码可以用下面这个:

1
W7YCJ 2RRMD MMHGG 3MB7C VBMYB

之后就可以解压《电子诗人》的源码运行了。这里有两种类型的文件,后缀名为 PRG 的是程序源码,DBF 则是数据库表、自由表,包含语料库。程序入口是 cp.PRG,用 Visual FoxPro 打开后,需要修改一行代码

1
set defa to e:\cp

本机可能没有 E 盘,因此将这一行注释或删除。

之后点击「Run」按钮就可以运行了。

在QEMU中运行电子诗人


参考文章:
电子诗人
关于《电子诗人》的小提示

此外还有一个 JavaScript 版本:https://viegg.com/poet/

诸葛恒修改版下载:cp2.rar

在文章 Nginx 配置 SSL 中,笔者介绍了通过 Certbot 申请 SSL 证书并使 Nginx 支持 SSL 的方法。彼时申请泛域名证书(Wildcard certificate)比较麻烦,需要验证 TXT 记录,再加上 Certbot 用包管理器安装会有一些小问题,故没有继续尝试。

三年之后再回顾这个问题,发现 Certbot 已经可以完美地通过 pip 安装,申请证书的流程也得到了简化。

申请泛域名证书仍然要求验证你对域名的所有权,因此除了 Certbot,还需要安装对应的插件。本站的 DNS 托管服务商是 Cloudflare,本文也以 Cloudflare 为例。

首先,需要创建一个 Cloudflare 的 API 令牌,权限设置如下图所示

创建Cloudflare的API令牌

创建成功后,获得的 API 令牌需要妥善保存。随后,登录到申请 SSL 证书的服务器上,用 pip 安装 Certbot 和 certbot-dns-cloudflare 插件。

1
pip3 install certbot certbot-dns-cloudflare

然后执行以下命令,将 TOKEN 替换为此前获得的 API 令牌。

1
2
echo "dns_cloudflare_api_token=TOKEN" > /etc/cloudflare.ini
chmod 0600 /etc/cloudflare.ini

完成后,直接用 Certbot 申请证书即可。将 example.com 替换为你的邮箱和域名。

1
certbot certonly --email [email protected] --dns-cloudflare --dns-cloudflare-credentials /etc/cloudflare.ini -d example.com,*.example.com

参考文章:Let's Encrypt 现已正式支持泛域名证书

签到

题目内容是一个 pdf 文件,用 Adobe Acrobat 打开,看到其中包含一些特殊符号。

在编辑模式下,查看得到其字体为 Wingdings,这是一个装饰字体,文本内容其实是 ASCII 码。文本范围是超出页面的,resize 之后复制出其内容,给出了两行文字:

1
2
fa{aeAGetTm@ekaev!
lgHv__ra_ieGeGm_1}

这是栅栏密码,得到 flag 为 flag{Have_A_Great_Time@GeekGame_v1!}

小北问答 Remake

  1. 北京大学燕园校区有理科 1 号楼到理科 X 号楼,但没有理科 (X+1) 号及之后的楼。X 是?

    在 Google Earth 中搜索,存在理科 5 号楼,但没有理科 6 号楼。故答案为 5。

  2. 上一届(第零届)比赛的总注册人数有多少?

    在北京大学新闻网中找到报道北京大学举办首届信息安全综合能力竞赛,得到「本次大赛共有 407 人注册参赛」,故答案为 407。

  3. geekgame.pku.edu.cn 的 HTTPS 证书曾有一次忘记续期了,发生过期的时间是?

    搜索「ssl cert database」,找到网站 crt.sh。在该网站上搜索 geekgame.pku.edu.cn,并根据题目给出的正则表达式寻找过期时间秒数以 3 结尾的证书,得到证书 4362003382。其过期时间为 Jul 11 00:49:53 2021 GMT,将时区换为 UTC+8,得到 2021-07-11T08:49:53+08:00。

  4. 2020 年 DEFCON CTF 资格赛签到题的 flag 是?

    找到 2020 年 DEFCON CTF 资格赛的网站是 OOO DEF CON CTF Quals,打开第一题 welcome-to-dc2020-quals,下载 welcome.txt,获得 flag 为

    OOO{this_is_the_welcome_flag}

  5. 在大小为 672328094 * 386900246 的方形棋盘上放 3 枚(相同的)皇后且它们互不攻击,有几种方法?

    The On-Line Encyclopedia of Integer Sequences 中搜索「3 queens」,没有直接找到的通解,但有一篇相关的文章 Number of ways to place 3 nonattacking queens on an n X n board.。里面给出了通解的表达式:

    任意$m\times n$棋盘上的3皇后问题

    代入数据计算得 2933523260166137923998409309647057493882806525577536。这里直接用 Mathematica 计算了。

  6. 上一届(第零届)比赛的 “小北问答 1202” 题目会把所有选手提交的答案存到 SQLite 数据库的一个表中,这个表名叫?

    在第零届比赛的 GitHub 仓库 geekgame-0th 中查找,在 src/choice/game/db.py 中得到表名叫 submits。

  7. 国际互联网由许多个自治系统(AS)组成。北京大学有一个自己的自治系统,它的编号是?

    中国 AS 自治系统号码中查找 Peking University,找到编号 AS59201。另一个搜索结果 CNGI-BJ-IX3-AS-AP CERNET2 IX at Peking University, CN 不是正确答案。

  8. 截止到 2021 年 6 月 1 日,完全由北京大学信息科学技术学院下属的中文名称最长的实验室叫?

    信息科学技术学院 2021 年招生指南中找名字最长的实验室,为「区域光纤通信网与新型光通信系统国家重点实验室」。

阅读全文 »

MicroPython 是一个能够运行在单片机上的 Python 解释器,目前支持许多 RISC-V 或 ARM 架构的微控制器。著名的 BBC micro:bit 就是使用了 MicroPython。

ESP32-C3 是乐鑫今年新推出的 SoC,MicroPython 在源码中为其提供了基础支持,但还没有正式发布预编译版本的固件。因此需要手动编译 MicroPython 才能将其烧录到 ESP32-C3 上运行。

首先需要获取 MicroPython 和 ESP-IDF 的源码。笔者使用了 ESP-IDF 的 4.3.1 版本,因为 ESP-IDF 对 ESP32-C3 的支持是在 4.3 版本才加入的,而更新的 4.4 版本和 MicroPython 暂时还存在兼容性问题。

这里克隆仓库的时候同时还会安装子模块,内容比较多,需要保证网络连接稳定。

1
2
git clone --recursive https://github.com/micropython/micropython.git
git clone -b v4.3.1 --recursive https://github.com/espressif/esp-idf.git

ESP-IDF 安装好后还需要手动删除一个过期的证书,不然之后编译的时候会报错。

接下来通过 ESP-IDF 配置好编译环境

1
2
3
cd esp-idf
./install.sh
source export.sh

然后就可以编译 MicroPython 了

1
2
cd ../micropython/ports/esp32
make BOARD=GENERIC_C3 BUILD=esp32c3

编译完成后,程序会提示通过 esptool.py 烧录固件的命令。把 ESP32-C3 开发板连接到电脑上,并且移除开发板上连接的其它线缆(否则可能会遇到奇怪的问题)。如果是第一次烧录,可以先进行 erase_flash

1
esptool.py -p /dev/cu.usbserial-14440 -b 460800 --chip esp32c3 erase_flash

然后再烧录

1
esptool.py -p /dev/cu.usbserial-14440 -b 460800 --before default_reset --after hard_reset --chip esp32c3 write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 esp32c3/bootloader/bootloader.bin 0x8000 esp32c3/partition_table/partition-table.bin 0x10000 esp32c3/micropython.bin

这里把 /dev/cu.usbserial-14440 替换成操作系统识别的串口设备。460800 是烧录程序的波特率,如果因 USB 线缆质量问题烧录失败,可以改低波特率试试。

如果 esptool.py 执行后没有烧录程序的进度,可以按住开发板上的 boot 按钮,直到开始烧录再松开。

在文章 ESP8266 发起 HTTP 请求中,笔者介绍了 ESP8266 的 AT 命令的使用方式。本文将以集成了 ESP8266 芯片的 ESP-01 开发板为例,具体介绍烧录 AT 固件的方法。

下载工具

烧录固件所用的工具是 esptool,需要先配置好 Python 环境,然后用 pip 安装

1
pip install esptool

乐鑫官网也提供了一个 Flash 下载工具,相当于给 esptool 套了个图形界面,目前只支持 Windows。笔者使用后感觉这个 Flash 下载工具体验不如 esptool 的命令行工具,因为烧录固件有时需要选择多个文件并指定起始位置,图形界面反而有些麻烦。

AT 固件有很多版本,需要根据 ESP-01 开发板的具体规格选择。乐鑫官方固件有 ESP8266 NonOS AT 和 ESP8266 IDF AT 两种,后者要求至少 2M 的闪存空间。笔者用的 ESP-01 空间不满足这一要求,因此只得选择 ESP8266 NonOS AT 固件,最新版本为 1.7.4。

此外还有安信可科技提供的 AT 固件。虽然 2017 年就停止更新了,但现在用起来并没有什么问题。

如果不清楚开发板与固件版本是否兼容,可以在刷好固件之后测试一下常用的 AT 命令看看有没有问题。

连接方式

ESP-01 与电脑的连接方式同样可以参考 ESP8266 发起 HTTP 请求这篇文章。唯一的区别是,烧录固件时需要一根额外的导线将 GPIO0 引脚接地,使芯片进入下载模式。

为了方便接线,可以用一块面包板倒一下:
ESP-01连接USB串口模块

市面上也可以买到专门为 ESP-01 设计的 USB 烧录下载器,如果需要经常烧录固件,入手一个可以免去接线的烦恼。

烧录固件

将 AT 固件的压缩包解压,在里面可以找到说明文档,用 esptool 烧录固件的具体参数根据文档设置即可。以 1.7.4 版本为例

1
esptool.py write_flash --flash_mode dout --flash_size 1MB 0x0 boot_v1.7.bin 0x01000 at/512+512/user1.1024.new.2.bin 0xfb000 blank.bin 0xfc000 esp_init_data_default_v08.bin 0xfe000 blank.bin 0x7e000 blank.bin

如果烧录过程没有开始(具体表现为控制台输出一堆.....-----),那么就确认一下导线连接是否正确(特别是 GPIO0 的接地),然后重启 ESP8266。重启可以通过将 RST 引脚短暂接地或插拔 CH-PD 引脚的导线实现,也可以在保持其它连线不动的情况下插拔 USB 接口。

如果一切正常,进度条就会跑起来。烧录完成后,将 GPIO0 上的导线移除,使这一引脚悬空。再次重启后,就可以用串口监视器软件测试 AT 命令了。


参考文章:ESP8266 ESP-01 - firmware - 1MB chip

0%