广告与隐私

本站怎么赚钱 —— 以及它拒绝做什么

写这一页,是因为"免费"背后通常藏着点什么。这里把全部内容摊开说清楚,并且贴出站点上真实运行的代码。没有小字。

一句话版本

声明一 —— 你的代码不会被上传

你敲的每个字符都由 JSCPP 编译 —— 一个用 JavaScript 写的 C++ 解释器,一次性加载进你的页面:

// js/site.js —— 全站唯一加载引擎的地方
var SELF = document.currentScript;
var VENDOR_BASE = (function () {
  var src = (SELF && SELF.src) || "";
  var i = src.indexOf("js/site.js");
  return i >= 0 ? src.slice(0, i) : "";   // 从 /、/zh/、/es/ 都能用
})();

// 随站点一起发布的本地文件,不是 CDN —— 页面不从任何第三方域名
// 加载东西。
var JSCPP_URL = VENDOR_BASE + "vendor/jscpp.min.js";

// ……而你的程序是这样执行的:本地,就在这个标签页里。
function runInPage(code, stdin) {
  return loadEngineScript().then(function (JSCPP) {
    var out = "";
    var exitCode = JSCPP.run(code, stdin || "", {
      stdio: { write: function (s) { out += s; } }
    });
    return { ok: true, output: out, exitCode: exitCode };
  });
}

判题代码里没有任何 fetch、XMLHttpRequest 或表单提交。你可以自己验证:打开开发者工具 → Network,做任意一道题,看有没有哪个请求带着你的源码。

声明二 —— 编辑器与测试结果旁边没有广告

全站有 370 个广告占位注释,但只有七种位置允许真正投放。其余位置 —— 包括全部"页面顶部" —— 永远休眠,因为它们会把内容往下推:

// js/ads.js —— 本站实际运行的广告位白名单
var CPPLAB_AD_PLACEMENT = {
  allow: [
    "below solution",      // 一处,在题解之后
    "mid-article",         // 仅长文章,章节之间
    "mid-lesson unit",
    "end of article",
    "end-of-lesson unit",
    "bottom of hub",       // 列表页页尾
    "bottom unit"
  ]
  // "top of article"、"top of hub"、"above lesson content"、
  // "top responsive unit" 刻意不在列表里 —— 它们永远不会被渲染。
};

再看遍历页面找占位的那段循环 —— 注意 allow.some(...) 这个过滤:不在白名单里的一律跳过,而不是渲染:

if (/^\s*AD:/.test(t) && allow.some(function (k) { return t.indexOf(k) !== -1; })) {
  marks.push(walker.currentNode);   // 只有白名单里的位置才会插入广告
}

对学习者的实际含义:你在写代码、看通过/失败结果的时候,没有任何东西可点、没有东西抢注意力。题目页上你能遇到的第一个广告在题解之后 —— 也就是你已经做完的时候。

声明三 —— 我们不设追踪 Cookie

本站只存五样东西,全部在本地,你能看、能删:

键名存的内容
cpplab.theme浅色/深色模式
cpplab.lang你的语言选择
cpplab.code练习场的草稿
cpplab.practice.…每道题的草稿
cpplab.game已通过的题、成就、连续天数

我们不设自己的 Cookie。在浏览器里清除站点数据,上面全部消失且我们这边毫无损失 —— 因为我们没有副本。

声明四 —— Google 会做什么(照实说)

为了让站点保持免费,我们计划展示 Google AdSense 广告。启用之后:

我们永远不会做的事

怎么自己核实这些说法

  1. 看代码:上面提到的文件(js/site.js、js/ads.js)都是未压缩的普通 JavaScript,没有构建步骤。
  2. 看网络请求:开发者工具 → Network → 做一道题。没有任何请求携带你的代码。
  3. 数广告:题目页第一个广告位在题解之后;文章页永远不会出现在第一个标题之上。
  4. 清理:开发者工具 → Application → Local Storage → 删掉那些键,刷新。你就是全新访客。

如果这一页写的和站点实际行为不符,那是个 bug —— 告诉我们,我们改代码或改页面。完整隐私政策。