为本站设计的点击计数器,就是页面底部的那个。 虽然我估计如今99%的人和MNIST打交道时都是使用Python的, 但本站承诺不使用Python,选择用C++实现了这个小功能。 整个做下来体验并不比Python复杂太多,料想能节约不少碳排放😁。
实现
下载MNIST测试集,用gzip解压。
因为LeCun说测试集的前5000个比较容易识别,所以程序里只使用了这5000个。
访问次数记录在名为fcounter.db的文件里,
每一位数字从测试集中随机抽选,组成PNG图片
(这里使用了Magick++来比较方便地生成PNG),
然后通过FastCGI接口返回给webserver。
代码
以上代码就贡献给Public Domain了。
编译
- APT安装
libmagick++-dev libfcgi-dev; - 为了使用FastCGI++,需要添加编译选项
-lfcgi++ -lfcgi; - 一个简单的CMake就可以自动找到Magick++;不使用CMake的话,添加
magick++-config提供的编译选项。
部署
我用spawn-fcgi来启动编译出来的二进制(在systemd里通过设置服务,自动启动)。
主流的webserver都支持FastCGI接口,设置一个FastCGI反向代理,指向spawn-fcgi启动的端口,部署配置就完成了。
我用的是Caddy:
1 | reverse_proxy /counter.png localhost:21930 { |
把/counter.png加在页面底部HTML里,每次刷新页面都能观察到数字增加;
如果浏览器缓存了图片,在链接之间跳转不触发对服务器的访问,数字就不会增加。