米米的博客

做了一点微小的工作

在文章鱼眼镜头与小行星特效中,笔者介绍了摄影师 Stephane Vetter 创作的一幅非常震撼的星轨照片。通过后期堆栈叠加的方式,将许多张连续拍摄的星空照片进行合成,即可得到星轨。这样的拍摄方式相比于 B 门曝光具有一些优势,例如可以避免拍摄过程中出现问题而前功尽弃,并且也有更多的数据用于后期处理。后期处理的软件也有很多选择,例如 Photoshop 的堆栈功能,或者著名的 Startrails.exe。笔者也用 Python 和 OpenCV 写了一段星轨的后期处理代码,但此前一直没有机会实测一下效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3

import os
import cv2
import numpy as np

# 放置原始图片的路径
base = '/path/to/pictures'
names = sorted(os.listdir(base))

out_img = 'star-trails.jpg' # 保存的图片文件名
out_video = 'star-trails.mp4' # 保存的视频文件名
fps = 24 # 保存视频的 FPS,可以适当调整
frameSize = (3840, 2160) # 视频的尺寸

# 需要先装 ffmepg: sudo apt install ffmepg
fourcc = cv2.VideoWriter_fourcc(*'avc1')
videoWriter = cv2.VideoWriter(
out_video, fourcc, fps, frameSize)
frame = None

for name in names:
if os.path.splitext(name)[1].lower() == '.jpg':
print(name)
path = os.path.join(base, name)
curr = cv2.imread(path)
if frame is None:
frame = curr
else:
frame = np.maximum(frame, curr)
# 图片需要缩放到与视频尺寸一致
videoWriter.write(cv2.resize(frame, frameSize,
interpolation=cv2.INTER_AREA))
# 保存中间结果
cv2.imwrite(out_img, frame)

videoWriter.release()

最近几天天气都很不错,笔者终于可以填坑了。下图使用的拍摄参数是:焦距 17mm,光圈 f/4,ISO 1250,单张曝光时间 30s,连续拍摄了 240 张进行合成。

摄于北京大学


参考文章:star-stacker

拓展阅读:叠加法星轨的拍摄及后期方法

《电子诗人》是刘慈欣在 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 按钮,直到开始烧录再松开。

0%