信息中心客服的 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% 的刷课党,这里有五组数据”

从头开始摘树莓 - Day 2

等待树莓派 IP 的那一刻

昨天配置的 WiFi 热点,按我一直以来的操作,是用电脑开一个热点来凑合。我的电脑是 Windows 8.1,很方便,先打开一个有管理员权限的命令行,然后:

netsh wlan set hostednetwork mode=allow ssid=SSID key=PASSWORD
netsh wlan start hostednetwork
arp -a | findstr -i 192.168. | findstr /V 255

这时候是中午,我接着给树莓派上电,等了好久都没看到 IP,这就很气了。重复了几次,我开始怀疑是系统没正常启动,就查了查网上对树莓派指示灯的介绍。再仔细一看树莓派,居然红的电源灯会闪,这就不大对头了。于是我拿来手机充电器接上 USB 线,没过一会树莓派的 IP 就出现在电脑的 ARP 表里了。

哎,谜团终于揭开,但我已经把卡重做了,也只能硬着头皮从头来过。赶紧先用默认密码(pi:raspberry)连上树莓派的 SSH 再说(我用的是 Bitvise SSH Client,没遇到坑很好用),果然能上,全新的系统哈哈哈。

继续阅读“从头开始摘树莓 - Day 2”

从头开始摘树莓 - Day 1

这是个什么鬼?

还记得许多月前的春天,为了一个项目买了树莓派,折腾 Linux。当时隔壁宿舍的项目也是折腾 Linux 装 ROS,因为校园网下系统太慢,土豪们居然买了手机流量日租包用来没日没夜地下载,每天在机电科协早出晚归的。而我在 headless 的模式下折腾了一两周,也总算是把环境搭起来了。

这几天为了参加比赛,在改代码。改着改着,随手 apt-get upgrade 升级了下系统,结果第二次重启的时候就连不上树莓派了。下午拿到玉神实验室的显示器上看,一切似乎都正常,我正准备看 WiFi 连接情况,突然显示就花了,完全不知道是哪里故障了。

于是,只能从头开始摘树莓了。我先把树莓派上的 Micro SD 卡的内容借着 Paragon extFS 全拷了出来(提示,不要用 ext2fs,我试着在 Windows 8.1 上加载的时候程序永远会崩溃),然后开始重装系统。虽然第二天发现是电源的问题,但因为我备份的时候 Windows 把太长路径的文件丢了一些,拷回去文件权限还不一定对,所以还是只能乖乖重新做一次系统了。

突发奇想,觉得还是记录一下这个操作过程比较好,否则要是后人再重新配置一次,真是太痛苦了。 继续阅读“从头开始摘树莓 - Day 1”

魔方机器人(网页与 Python 控制程序) Rubik's Cube Solving Robot

介绍 Introduction

本作品为本科专业必修课《科研项目指导与训练》的课程项目。我们选择实现一台魔方机器人,可对打乱的三阶魔方在进行表面颜色识别后,恢复至六面同色状态。

This is a course project for "Scientific Research Project Guidance and Training" course of my major. We chose to build a Rubik's cube solving robot, which can identify a third-order cube's pattern and solve it.

该机器人拥有六个自由度,对六个面进行旋转,并有四个摄像头从四个角进行颜色的识别。此外,机器人采用树莓派作为上位机进行总体控制,采用 Arduino 作为下位机进行步进电机的控制。

The robot has six degrees of freedom, rotating the six sides. It identifies the cube by four cameras from the four corners. A Raspberry Pi is used as an upper controller for the general control, and an Arduino board as a lower controller for the motor control.

项目在最终结题答辩时获得非常高的评价,同一课程中共有 9 组项目。

The project gets an excellent feedback at the final presentation among 9 projects of the course.

继续阅读“魔方机器人(网页与 Python 控制程序) Rubik's Cube Solving Robot”