开箱:微软 Sculpt 人体工程学桌面套装

抓住实习期的尾巴,利用微软内部的员工优惠,购入了一套 Sculpt 人体工程桌面套装。这一套东西的品牌建议零售价是 ¥ 1999,使用员工优惠为 ¥ 829,我承认这还是很贵(逃

使用体验放在前面:

小馒头鼠标真是舒服,马上我就爱不释手了,爽不可言。再回去用普通的鼠标,感觉简直是在谋杀自己的手腕。

键盘有些学习成本,比如 B 键我总是用右手食指按的,但用这个键盘就必须改到左手;Home/ End/ PgUp/ PgDn 的布置也和我日常用的 ThinkPad 六排很不同。一开始按键的错误率比较高,我大概花了两天才适应好,恢复了之前的代码编辑效率。

健康很重要啊,保护好自己的腕关节、肘关节,也想图个舒服,我感觉很值。

以下多图,无字。

快递箱。微软官方商城,从上海发货。
快递箱。微软官方商城,从上海发货。
气囊和泡泡纸。
气囊和泡泡纸。
内包装盒。
内包装盒。
好吧我承认这张图是后补的,塑料纸已经丢掉了……
好吧我承认这张图是后补的,塑料纸已经丢掉了……
工作站一瞥。
工作站一瞥。

最后,根据美国联邦贸易委员会的规定,再次声明利益相关:I work for Microsoft, BTW. (逃

Electronic Trading Challenge 酱油记

上个周末刚参加了 Jane Street 举办的 Electronic Trading Challenge Tsinghua Event。三只大三狗,大作业的汪洋大海之中。成绩是 19 支队伍的第 11。本文也很水,预警一下( ̄(工) ̄)

## 体验

简言之就是新奇、有趣。我都想开个户玩真的了。

还有便是认识到了差距,感觉自己好菜啊( ̄(工) ̄)

## 比赛概况

编写程序在虚拟市场里交易。市场上有 4 支个股、2 个基金,还有国库券。除了参赛队之外,市场里还有做市商。交易所提供每种证券的订单簿和订单成交信息。每个交易日持续 5 分钟,每天都是两手空空从头开始,每天结束后系统按照某种公允价值计算盈亏积分。比赛从上午九点持续到晚上九点,划分为一个一个 5 分钟,选手可以随时修改程序,加入或退出市场。

## 我们队的套利策略

我们首先花了点时间通读文档。叶曦在根据交易所的协议编写 API,我和江昊琛先开始研究怎么赚钱。因为暂无 API 可用,我们就用 nc 命令强行手动下单,结果一单亏了 2 块钱,这 2 块钱使我们队一连几个小时都以负的积分排名垫底……好气哦。

基金可以和对应篮子直接互相兑换,无论价格如何,只收固定的手续费。我们首先看到了这里面的套利机会。例如,X 能兑换 2 A + 3 B + 2 C。某一时刻 X 的买入价是 9,A 的卖出价是 2、B 的卖出价是 1、C 的卖出价是 3。那么我就可以花 9 元买入一个 X,兑换成 2 个 A、3 个 B、2 个 C,然后分别卖出去,得到 2 x 2 + 3 x 1 + 2 x 3 = 11 元。从左手搬到右手,9 元就变成了 11 元,只要兑换的手续费低于 2 元,我就赚了。

实际的价格并不是常数,而是数量的一个分段线性的函数。这个函数可以根据订单簿计算出来。对于买方报价,各段斜率是递减的;对于卖方报价,各段斜率是递增的。

Buys         Sells
Price Volume Price Volume
8     3      9     4 
7     2      11    3
6     2      12    4
4     4

随便编了个数字例子。对于给定的证券,买方报价总是低于卖方报价的,否则就直接成交了。X 的价格满足这个关系,ABC 的价格(A、B、C 的价格的加权和)也满足这个关系,但是 X 的价格和 ABC 的价格之间就不一定了。它们都会波动,很可能存在某些时刻,X 的价格和 ABC 的价格不匹配,这叫市场的瞬时无效性。

ABC 组合的曲线是用 A、B、C 的三条曲线按比例叠加得到的。

上图示意的情况下,我们可以买入 A、B、C,卖出 X,赚取差价。阴影部分就是机会啦。在横轴上找到一点,使买入 ABC 的总价与卖出 X 的总价之间的差额最大。如果这个差值大于手续费,我们就可以动手啦。同时还要关注反方向 X Sells 和 ABC Buys 两条曲线,以发现反方向的机会。

为完成这样的交易,需要同时盯着 4 组订单簿,随时更新 10 个总价格函数。每次操作要同时下 5 个订单。价格差转瞬即逝,这种事情显然只有程序能做。

说实在的,策略很简单,模型也很简单,但我们实在是太菜了。大概上午十一点开始写,晚上五点才把它调试好上线。

说实在的,策略很简单,模型也很简单,但我们实在是太菜了。大概上午十一点开始写,晚上五点才把它调试好上线。在此之前我们队只是简单地倒卖国库券,每个交易日的收益徘徊于两位数;后来叶曦做了几个我搞不懂的策略,提高到几百,但是波动似乎很大。等到这个套利策略上线,收益就稳定在 1000 元左右了。

## 差距

凭着这个套利策略,在比赛的最后几个小时,我们的排名上升了 3 位。后来我们了解到,前几名的队伍每个交易日的收益都在 10000 元以上。数量级上的差距,确实难以望其项背。

## 收获

打了一整天酱油,反正三顿饭都很不错。连续十个小时写代码,感觉很爽的。要说收获,也就是见了见世面吧,体验了一下 Hackathon 这种形式,对证券市场有了些感性认识。

(本文首发于知乎

学习构建之法(1):写个微信抢票

历时 5 周,历经 Alpha、Beta 两次迭代,终于把软件工程这门课的两人项目做完交付了(?)

粗略计算,与我同组的刘斌同学在这个项目上花费了百余个小时的时间。我本人则少一些,未作确切统计。从截止日期临近时另一专业课 13 / (~60) 的出勤率、去校外咖啡馆刷夜的人数、汇报展示现场主讲教师建群发红包“熬夜辛苦,中午吃好点”的情景,可见这项作业的工作量之大(?)

这个项目最主要完成的是测试环节,至于需求分析、软件设计、团队流程等则涉及较少。

根据课程要求,撰写一篇博客。择其重点,总结一下主要的收获。

  • 设计实现
    • 体会到 Web 应用开发时前后端分离的好处
    • 再次体验了给助教华榕大帝改 bug
  • 团队合作
  • 软件测试
    • 认识了 django 测试框架、浏览器自动化工具 selenium 和 PhantomJS
    • 知道了编写单元测试的基本方法
    • 了解了编写功能测试的基本方法
    • 了解了评价测试的主要指标——覆盖率
  • 性能调优,相关博文:django 性能调优手记
    • 性能测试
      • 认识了性能测试工具 JMeter
      • 了解了评价性能的主要指标——吞吐量、错误率、响应时间等
    • 部署和运维
      • 认识了众多 Linux 系统参数、uWSGI 参数、nginx 参数
      • 尝试了基于 docker 的自动化部署
    • 性能优化
      • 体会到若干因素对性能的影响

此系列还有另一篇博文:学习构建之法(2):课程总结

本博客改名称、换域名啦!

nullspace,数学名词,见于线性代数课程中,对应中文“化零空间”、“零空间”、“核空间”等。

null 和 space 两个词同时出现,是不是很有 geek 科技范?

我的博客的新的地址,是 nullspace.cn(白菜价的 .cn 域名←_←),请大家更新收藏夹~

原域名 200404.xyz 将保持使用直到2016年2月。当然新浪云提供的二级域名 200404.sinaapp.com 会一直可用。更新 2016-9-26:已从新浪云迁出,目前放在 Vultr 提供的 VPS 服务器上。

(完)

Visual Studio 配置 OGDF 图布局算法库

项目主页:http://www.ogdf.net/

开源 (GNU/GPL),有不错的示例、文档(都是英文的←_←)

主要步骤:下载源码, 编译安装, 配置工程, have fun!

Step1>>下载源码

  • http://www.ogdf.net/doku.php/tech:download
  • Current Release: v. 2015.05 (Baobab) [5.4 MB]

Step2>>编译安装

  • 执行 makeVCXProj.py 脚本:生成 VS 工程 ogdf.vcxproj, coin.vcxproj 和解决方案 ogdf.sln。不需要 cmake,但是……好像需要个 python 解释器
  • 用 VS 打开 ogdf.sln,“生成解决方案”。
  • 你会得到一些 lib、obj 文件。我的在 OGDF\Win32\Debug 目录下

Step3>>配置工程

  • 添加包含目录、库目录
    • 在解决方案管理器中右击你的工程,属性。配置属性>VC++目录:
    • 在“包含目录”中添加 OGDF\include
    • 在“库目录”中添加 ogdf.lib、coin.lib这两个文件所在的目录(上一小步中的 OGDF\Win32\Debug)
    • 也可以将以上路径添加到相应环境变量中
  • 为链接器附加库 ogdf.lib、coin.lib
    • 还在工程属性对话框中,配置属性 > 链接器 > 输入,在“附加依赖项”中添加“ogdf.lib;coin.lib;”。
    • 也可写在源代码文件里,
      #pragma comment(lib,"C:/blablabla/ogdf.lib")
      #pragma comment(lib,"C:/blablabla/coin.lib")

Step4>>hello world

#include 
using namespace ogdf;

int main(){
Graph G;
node a = G.newNode(); 
node b = G.newNode(); 
node c = G.newNode();
G.newEdge(a, b); 
G.newEdge(b, c); 

GraphAttributes GA(G);

FMMMLayout fmmm; 
fmmm.call(GA);

cout << GA.x(a) << ", " << GA.y(a) << "; \n";
cout << GA.x(b) << ", " << GA.y(b) << "; \n";
cout << GA.x(c) << ", " << GA.y(c) << "; \n";
return 0;
}
//代码很丑陋,这只是个hello world,莫吐槽

一次运行的结果:

25, 25;
59, 60;
93, 93;
请按任意键继续. . .

(完)

清华校园网用 PAC 文件

访问校内站点时直接连接。

function FindProxyForURL(url, host) {
   if (shExpMatch(host, "*.tsinghua.edu.cn")) {
     return "DIRECT";
   }
   if (isInNet(host, "59.66.0.0",  "255.255.0.0")){
     return "DIRECT";
   }
   if (isInNet(host, "166.111.0.0",  "255.255.0.0")){
     return "DIRECT";
   }
   if (isInNet(host, "101.5.0.0",  "255.255.0.0")){
     return "DIRECT";
   }
   if (isInNet(host, "101.6.0.0",  "255.255.0.0")){
     return "DIRECT";
   }
   if (isInNet(host, "183.173.0.0",  "255.255.0.0")){
     return "DIRECT";
   }
   return "__PROXY__";
}

SYSTEM_DRV 和 Lenovo_Recovery 分区是做什么的

上图为一台 ThinkPad 在出厂状态下的内置 SSD 分区状况,机型为 ThinkPad X1 Carbon (TYPE: 20A8-A0X2CD)。

SYSTEM_DRV

该分区上有主引导记录,有 bootmgr、有 BCD,是活动分区,默认状态下从该分区引导。该分区上还有一个 300MB+ 的 WindowsRE 的镜像。

如果删除,可能无法正常启动 Windows(需要修改活动分区为 Windows 分区),也将无法在不能启动 Windows 操作系统的时候进入 Rescue and Recovery 工作空间进行系统恢复。

官方用户指南对此的说明是:

Rescue and Recovery 工作空间位于固态驱动器上一个受保护的隐藏区域中,该区域独立于 Windows 操作系统运行。通过它,即使无法启动 Windows 操作系统,也可以执行恢复操作。

Lenovo_Recovery

此分区不能作为引导分区,相对平凡一些。此分区内含 SYSTEM_DRV 分区的完整映像(sdrivebackup.wim),还有一个 Windows 分区的完整映像(cdrivebackup.wim)(出厂状态的 Windows 系统,已预装了不少 Lenovo 的软件)。

如果删除,将无法制作恢复盘。

根目录下的 LenovoQDrive.exe 给出以下信息:

Lenovo 原厂备份分区信息:Lenovo 在此分区中提供了一份原厂预装软件的副本。为方便使用,只要在 DVD 上安装了此实用程序的副本,即可使用它恢复此空间。

还有一个休眠分区

在用户指南 BIOS 部分找到了以下信息:

Intel Rapid Start Technology

要使用此功能,固态驱动器上需要一个特殊的分区。启用后,计算机在睡眠状态下经过指定的时间后,进入低功耗状态。并且只需几秒钟即可恢复正常运行。

在电源管理器帮助中亦有相关说明:

启用 30 天待机

选中此复选框后,Power Manager 将根据系统及其配置自动更改计算机电源状态:

1.如果计算机支持深度睡眠状态,Power Manager 将会在指定的一段时间后使计算机进入深度睡眠状态。
2.如果计算机不支持深度睡眠状态,Power Manager 将会在指定的睡眠状态持续时间过后使计算机进入休眠状态。此功能要求 Power Manager 开始学习睡眠和恢复操作。大约需要经过几个月才能生效。

通过启用 30 天待机功能,可延长电池使用寿命。

(完)

Symantec 防火墙可能阻止 IPv6 流量

这是一篇故障排除手记。摘要如题。Windows 7 Ultimate, x64, Symantec Endpoint Protection 12.1.2015.2015(网络威胁防护定义2015-4-13 r11), TUNet, cernet

宿舍有原生的 IPv6,可以用来 BT 下载、观看流媒体等,不计流量不要钱,非常愉快。有一天我发现那些 IPv6 的站点都登录不上去了。IPv4 正常。

换其他网口,不行。换其他电脑,正常。由此认定是本机问题。

ping 得到 General Failure,浏览器报超时。而 DNS 解析正常,ipconfig 查 IP 配置未见异常,IPv6 地址是有效的。

使用“带网络连接的安全模式”进入系统,IPv6 站点访问正常。由此认定是第三方软件的问题。

经仔细检查,是 Symantec 的防火墙的缘故。关闭后恢复正常。

并不知道为何 Symantec 防火墙无故拦截 IPv6 流量。考虑到故障现象是突然出现的,这可能和更新的防护定义有关。

(完)

SAE屏蔽迅雷离线服务器

昨天本博客迎来了一个访问量高峰,我不得不两度上调配额。想来可能是因为被学术状态帝转了一篇文章;也因为做了点广告;检查日志还发现了谷歌爬虫光顾的踪迹,这无疑都是令人欣喜的。亲眼看了谷歌爬虫的 User-Agent:

Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

这货刚一来,首先就请求我的 /robots.txt 。果然高风亮节。话说我还得到了谷歌爬虫的一些 IP :66.249.79.* 。用 MyIP.cn 查询得:美国 加利福尼亚州圣克拉拉县山景市谷歌公司。

顺便说一下,MyIP.cn 拥有我所见过的最 NB 没有之一的 IP 归属地数据库。拿紫荆宿舍网口的 IP 查居然可以精确到门牌号,让我十分震惊。当然上学期宿舍网口换成 DHCP 动态 IP 后就不准了,但是还是很 NB 有木有。

但是很快我就在日志中发现了不对劲的事情。有一个 URL 似乎被同一个 IP 反复请求。SAE 的日志中心还是可以,过滤了一下,发现果然不对劲。

221.204.204.140。这货非常勤劳,也非常守时嘛!从 17/Feb/2015 00:23:47 +0800 开始,像被上了发条一样,每 55 秒请求一次,永不停歇。

赶快查一下这是什么鬼东西。MyIP.cn 告诉我,这个 IP 属于“山西省太原市 迅雷离线服务器”。站长工具给出的则是“山西省太原市 迅雷网络联通节点”。

我想,很有可能是有一位可爱的读者,用迅雷下载我的了 GradeSDK.zip;也许他选择了离线下载;反正,迅雷的系统有 Bug。。。就开始无休止地向我请求这个文件。

调试好了再上线不好嘛!!迅雷你酱紫很桑我们这些小站长的心你造吗??

怎么办呢,把它屏蔽掉吧。因为这个文件被我偷懒放在代码空间里了,所以我想只能求助于 SAE 平台了。既然 “SAE 提供的是云计算服务,不同于一般的空间提供商”,那么,我想屏蔽一个 IP 的功能应该是有的吧?

找到 管理应用界面 > 安全与运维 > 应用防火墙 ,简直是救命稻草。文档里写着“应用防火墙针对访问行为提供如下三种控制机制:黑白名单机制;频率/流量限制机制;访问速度限制机制”,看起来十分强大嘛!好极了。不料,点开后就得到提示“您还未通过实名认证,无法配置应用防火墙”。而实名认证需要 3 个工作日。呜呼,3 个工作日后我的云豆要被迅雷这样消耗多少去了!

好在天无绝人之路,我又找到了 管理应用界面 > 开发与调优 > AppConfig > 基于主机的访问控制,“您可以限制或允许某个IP访问您的应用,或您应用的某个目录”,这货看起来只提供 IP 黑白名单,但是对付你个调皮的迅雷服务器是够了!果断加黑名单,

 - hostaccess: deny "221.204.204.140"

至此世界重归平静。(完)

 

Update: 加黑名单之后,该 IP 的所有请求都得到了 403 ……但是这货不懂知难而退啊……在日志中心可以看到,这货仍然锲而不舍。截止此刻仍在每 65 分钟请求一次。恩,频率倒是下降了不少。(2015-2-17 20:55:41)