为本站设计的点击计数器,就是页面底部的那个。 虽然我估计如今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
2
3
reverse_proxy /counter.png localhost:21930 {
transport fastcgi
}

/counter.png加在页面底部HTML里,每次刷新页面都能观察到数字增加; 如果浏览器缓存了图片,在链接之间跳转不触发对服务器的访问,数字就不会增加。