使用 docker 作为 online judge(OJ) 的 sandbox (1)

This article is deprecated, please see here for more details. 最近业务要实现在线代码判定(OJ)的功能,简单调研了一下,准备使用docker实现。业务流程大概如下: 大概的思路是: nginx 判定请求是否应该转发给 OJ 集群,比如:只要请求匹配 ^~ /oj 都转发给 docker 集群处理; docker 集群接收到请求后,先将代码保存在 web server 本地; 如果待判定的语言不需要编译即可执行 (比如PHP、Python),则直接保存在 web server 的某个目录下(例如 /tmp/oj);如果需要编译(比如 c、java),则先编译,将编译后的可执行文件保存在同一个目录下; 将 web server 上保存代码的目录(上文中的 /tmp/oj)挂载到 docker 镜像的某个目录下(例如 /mnt) 调用 docker 知行代码,并返回结果。 下面是相对详细的一些步骤: 安装 docker 升级 docker 镜像中的 OS 将镜像提交到 docker hub 业务上处理提交过来的代码 当然,上面的限制并不是特别完全。对于业务来讲,还有以下几个问题需要考虑: … Continue reading "使用 docker 作为 online judge(OJ) 的 sandbox (1)"

Read More

使用 Sentry 监控业务日志

Sentry 是一个错误日志收集和聚合的平台,我们可以在程序中捕获异常,并发送到 Sentry 服务端进行聚合统计、展示和报警。 相关文档参考:http://sentry.readthedocs.org/en/latest/ 准备工作 安装 Docker: 启动 Docker: 安装 redis Docker 镜像: 安装 PostgreSQL Docker 镜像: 生成 secret token(sentry会返回类似于 “9qa)zi)wrz5e9vrln=%fv3wlkyen5#nf-f10q#4h%1ygn!q8ha”的字符串,下文用 <token>代替): 初始化 PostgreSQL,过程中会提示创建用户: 启动 Sentry: 现在从浏览器访问 http://127.0.0.1:12000/,就可以看到 Sentry 的主界面了: 当然,只有界面是不够的,下面会说明如何完成一个上报异常的 demo 选择 “管理” => “项目” 左侧的某一个项目,点击进入设置选项卡,选择 “Client Keys”,右侧会展示 SDK 需要的 API Key: 记下 Sentry 提供的 Key,我们的 demo 中会用到: 运行1次,dashboard 中就会出现对应的记录了:  

Read More

cloudflare 面试题答案

cloudflare 面试题 答案如下: 1) What is the lowest TCP port number? 0 2) The TCP frame has an URG pointer field, when is it used? 使用URG标识的数据包可以在同一个TCP连接上使用不同的channel传输数据;同时,在数据的接收方,这部分数据会保存在另外一个buffer中。接受到URG数据包后,应用会收到信号:带有UGR标识的数据包来了。目前使用UGR的应用层协议中,最常见的就是FTP。URG数据包用于FTP服务在忙于传输数据时接收其他的FTP命令使用。 3) Can the RST packet have a payload? 可以,但没有实现(?) 4) When is the “flow” field in IPv6 used? 参考:https://tools.ietf.org/html/rfc6294#section-1.2 flow label 为实时流提供有别于尽力而为流的服务。 5) What does the IP_FREEBIND socket option … Continue reading "cloudflare 面试题答案"

Read More

javascript 解析 lisp 表达式

问题 项目中需要前端解析出 lisp 表达式中的内容后,渲染到页面上: 解决 同事离职前实现了一版,思路是使用正则表达式捕获住对应的内容,缺点也是显而易见的:不够灵活。我参考了 (How to Write a (Lisp) Interpreter (in Python)) 中的实现,完成了一版 javascript 的实现。 函数 tokenize 用于将字符串预处理成统一的形式: 函数 read_from_tokens 负责将字符串解析成对应的数据: 工具函数 atom 负责处理变量类型相关的工作: 看下效果,还不错:

Read More