信息中心客服的 4 小时

中午 12 点,吃完午饭的我走进了学校信息中心的客服中心。正午的阳光透过落地窗从街头照进房间,显得有些慵懒。我找了个位置坐下,脱下外套,工服、工牌就位。

今天是我在客服中心上班的第三天,按计划还在培训的阶段。我跟第一次见的主管(老师)郭姐姐打了招呼,她就告诉我“今天有点难办,我去问问要怎么弄”。过了会她把她的主管带到了房间,说了下情况:下午这边只有我跟另外一位学生李斯,李斯老哥也没来几周,而我还在第一周培训。大主管问了问我培训的进度,接着问我:“你今天自己接电话感觉行吗?”我有点懵,就说“我试试吧”,两位主管接着就跟我说“有啥问题你让对方稍等,放下电话问我们谁都行,不用慌,大家都是提问题过来的”。

于是,我在我的工位坐下,登陆电话系统,打开工单界面,试了试耳机。两位主管还在谈笑风生的时候,我的第一个电话就毫无防备地打进来了。

继续阅读“信息中心客服的 4 小时”

对一列微信小程序比赛作品的想法

一堆事情没做,又厚着脸皮来写好久没有写过的博客了。今年真是神奇,参加了个小程序比赛,莫名其妙地进了地区选拔赛,虽然成绩并不理想(自费旅游),但也算是领略学习优秀大学生风采了。趁着比赛完想不到要干啥,北京的天也没黑,就斗胆来评论一下前十好了。

我来参加这个比赛的时候,想法是觉得,既然是小程序比赛,选题总该是适合小程序的,才能代表小程序的先进方向。一些 PWA 甚至网页就已经足够实现功能、又没结合微信小程序特点的作品,我总觉得蛮尴尬的。可能并不是每个人都会这么去执着平台依赖这个国内不大关注的问题的吧。答辩的时候并没想到要提小程序与 PWA 区别的思考,结果还剩了几分钟时间,后来发现一整天没人提 PWA 相关,想想还是挺遗憾。

先进一下前情提要。这轮选拔赛的前十都是有奖金的,其中前二可以晋级进入全国决赛。这个名次是现场公布的,不知道最后会不会公示。下面就按名次说好了,我也是这几天才第一次接触到这些小程序;如果没有特别说明,可以直接在微信里搜到这些小程序。 继续阅读“对一列微信小程序比赛作品的想法”

ROS catkin 和 catkin_make 在 overlay 上的区别

TL;DRW

catkin_make 先造的轮子,catkin 后造的轮子(看得到那个 shell 界面优化得也是出神入化了)。

overlay 是个啥?当你想把多个 workspace 同时使用的时候(通常是有一些底层的库被魔改的情况),就需要一层一层地 overlay,其中最底层是 /opt/ros/kinetic,然后就是一层一层的 workspace 了。

今天下午一不小心拿(MoveIt! 推荐的) catkin 做 underlay 的底层 workspace,后面一层的 catkin_make 就死活识别不到 overlay 了。最终两层 workspace 都用 catkin_make,成功。

查了下 catkin 的 issues,似乎是已经修复了 overlay 异常的问题(刚仔细看了下好像是读 underlay 有问题,还不大一样)?然而我用的 ROS Kinetic 下自带的依然有问题啊。

本科走进最后三个月,后知后觉的一点牢骚

人有一点和其他动物没差:是自私的。诸如我写下一篇东西,看起来是免费“分享经验”、“学习交流”,实际上可能只是我有些话想找人说,却不想打扰别人,最后就把这些想法变成了互联网上的十几个千字节数据,自私的是满足自己的一点表达欲、一点存在感、一种说出来的痛快。

突然发现了这一点,再加上发现大家都很忙,并不是多么关心鸡毛蒜皮的事情,自己也突然变忙了,我就好久没写博客了。然而心里总是有话想说的嘛,所以下面这些东西,我也不知道自己在写啥。 继续阅读“本科走进最后三个月,后知后觉的一点牢骚”

关于 0.5% 的刷课党,这里有五组数据

两年前博客(+ 微信订阅号)做过一篇特稿,分析了“公开渠道的教务系统 2016 年 1 月选课期间的一些日志”。写那篇文章让我直面了刷课这个事情,还意外地小小采(tiao)访(xi)了下某个同学。

两年过去,变化还是挺大的。比如,我校教务处终于把新的教务系统完整上线了。还比如,自从上个月新教务系统第一次选课开始,更多的人听说了“刷课”这个词。已经不需要抢课的我,只听说了这次选课期间有人卖课啥的。虽然实际上可能并没这么“道德沦丧”,但大家对这个行为的不齿,是多了一些。

我好奇的是,为啥 2018 年的刷课行业发展成这样子了?新的教务系统并没有可以从公开渠道获取的日志,不过从旧教务系统里看过去几年的趋势,还是可以的。于是这次我使用 Elastic Stack 处理了更大跨度的数据(灌数据进去挺折腾的,不过非常高效),从 2014 到 2017 年选课期间的本科选课操作日志中,得到了下面的一些数据。(以下数据均来自旧教务系统,下简称“教务系统”)

如果太长不想看,这是五组数据的梗概:

一. 大二到大三、2016 至今,进入刷课频道:2017 年暑假 2015 级选课期间操作次数人均 496 次,创了记录。
二. “刷课”一直是少数,但这 0.5% 的玩家越来越多:四年来用户操作次数中位数保持在 50 - 65 之间,刷课的人数成倍增加,在 2017 年寒假达到顶峰。
三. 教务系统的压力从来不小,峰值 QPS 95,大多因为“人多”:选课第一天明明不用抢也是挤爆,卡起来就是死 10 秒钟又闪现 20 秒的体验。
四. 单用户刷课平均每秒 17 次,问你怕不怕:靠刷课党们一“己”之力,还是可以把教务系统搞慢的,最疯狂的人连续一分钟操作 1060 次。
五. 午夜档的热闹从第二阶段开始,刷课党也就个位数:如 2017 年暑假第二阶段的第一场午夜档 218 人参加,其中操作频率极高的也就 5 个人。

继续阅读“关于 0.5% 的刷课党,这里有五组数据”

Manual work after WordPress auto update failed

WordPress 版本都到 4.9 了,全球 CMS 占有量也早过三分之一了,自动更新居然还是全量下载,连个增量更新都不做(光做 no-content.zip 有啥用拜托?)。虚拟主机下载 WordPress 的包速度又很慢,结果总是超时(虚拟主机控制的那种超时断开),更新失败。

网上搜了一圈,居然官方建议是“绝对是你的主机有问题,请手动更新”。网差一点还被说是主机不行?那就只能自己来呗。

My WordPress auto update always failed because of slow download speed. Just don't know why WordPress doesn't implement a incremental upgrade mechanism (maybe I should search for a ticket?). Whatever, I have to solve it manually, in a smart way.

P.S. 写完这篇之后,看到更新的 API 了,的确是有增量更新的,但他们不用。They actually have incremental upgrade implemented, but they hardly use it.

继续阅读“Manual work after WordPress auto update failed”

php-fpm + Apache 的长时间 reading headers

最近为了降低下网络运行成本,在 AWS 上用教育折扣开了服务器,搬了些托管业务过去。兼容为本,自然是 LAMP,不过因为这些年 Apache 2.4 的 event MPM 也算能用了(SetHandler + If 块判断文件存在,完美),加上 http2 不支持 Prefork MPM,就开了 PHP-fpm。

都配完了,没事看 PHP-fpm 的状态页面,总是会看到有进程在 reading header 的状态,而且显示持续时间很长。我以为是什么异常情况,PHP 自动停进程失败了,于是就设置了超 1 分钟强退进程,结果 php-fpm 的日志很快就被这些强退错误占满了。 继续阅读“php-fpm + Apache 的长时间 reading headers”

jzGradeChecker - 优雅查成绩 Graceful Grade-Checking Experience

链接 Links

  • 网站 Website (包含导出数据查看网页 Includes a webpage for reading the exported file)
  • 演示 Demo (这是扩展的欢迎界面,显示效果与实际扩展工作情况无异 This is the introduction page of the extension, which reuses the same core scripts of the parsing code, working identically to the extension)
  • Chrome Web Store

重要提示 Notice

由于原网站在今年改版,成绩查询服务器已经下线,该扩展的读取成绩功能已经无法工作。但因为扩展自定义了一套 JSON 数据结构,即便服务器不可用,仍可通过离线数据实现信息显示,因此在线演示、导出成绩查看器等仍可查看。

Due to the original website upgrade, this Chrome extension cannot fetch grade data any more (the grade check server is down). However, the demo and the exported data reader still work, because I have implemented a customized JSON data structure, which make the code functional by reading the JSON data even if the remote server is unavailable. 继续阅读“jzGradeChecker - 优雅查成绩 Graceful Grade-Checking Experience”