一个谜之CORS Bug的调试过程

这学期的Object Oriented Design课程要求以组为单位做一个项目,我们的项目前端使用Vuejs,后端使用Spring Boot,通过REST API通信。

有一天前端的朋友告诉我她在调试的时候遇到了一个问题。她在本地运行Vue项目,连接位于AWS上的API。这是一个跨域请求,浏览器会首先发送一个Preflight请求来预检。奇怪的是虽然Preflight请求正常返回了200,但是后面的请求却并没有继续进行。

* Preflight request – 术语表 | MDN

我试图在我的电脑上复现这个问题,然而我的电脑上却一切正常,完全不能重现。

经过各种尝试之后找到了一个突破口——出现问题的这个接口是通过Cloudflare和nginx转发的,而换成直接从Docker暴露出来的8080端口则一切正常。

配置Docker Remote Host

这学期的Object Oriented Design课程的项目我使用Docker来做打包和部署,过去我都是手动ssh到服务器上执行Docker命令来部署新版本。但是这种方式对CI系统则不太友好,我们的确可以让CI系统使用ssh登录到目标主机并执行Docker命令,但是这样就涉及到密码,密钥及sudo的安全性问题,(主要是不够优雅。

这一次我使用了Docker Remote Host来解决这个问题。Remote Host可以使我们无需ssh登录服务器,仅通过网络即可控制目标主机上的docker daemon。

首先我们需要了解Docker的命令是如何执行的

Docker主要分为两部分,daemon和client。

Docker daemon (dockerd) 监听Docker API的请求,并管理镜像,容器,网络,卷等Docker对象。daemon 也可以和其他Docker daemon通信来管理Docker服务。

Docker client (docker) 是与Docker引擎交互的主要方式。当使用类似于docker run的命令时,client将命令通过Docker API发送到dockerd。

AWS网络基础设施

前段时间我拿到了一个Take Home Project,其中一个题目的内容和在AWS VPC中规划子网(Subnet)有关。借此机会我们可以了解一下AWS的网络架构。

上图是一个典型的AWS网络架构,本文中我们将介绍上图中各组件的概念及用途。

2019 Fall学习找工总结

这几天RSS feed上几乎被各种年终总结刷屏了,不过我没有写年终总结的习惯,就写写这半年在美国学习和找工的总结吧。

学习

我们专业的课程安排是每个人都是有相同的四门必修课(Data Structure & Algorithm, SoC Design, Object Oriented Design, Computer Architecture),在此基础上可以自由选择选修课,整个项目一共是30学分,也就是10门课。

国际学生在第一学期能且仅能选三门课,其中有两门(Data Structure & Algorithm, SoC Design)是被学校安排的。开学前我们曾经去问过SoC Design这门课能不能drop掉,等之后再选,被告知不行。最终我选的三门课是Data Structure & Algorithm, SoC Design, 和Database。

Roger Chen的Data Structure & Algorithm被往届学生评价为“值回票价的课程”。这门课确实很有用,尤其是对于我这样本科的数据结构基础打得并不扎实的学生来说,这门课覆盖了很多面试中高频但是之前没有深入了解过的内容,比如堆,树,等等。

一次乘坐灰狗巴士的经历

回国的飞机25号下午从JFK起飞,我买了当天凌晨1:20从雪城出发的灰狗,打算第二天早晨到纽约之后在中城闲逛一会再坐地铁去机场。

因为我之前去纽约就是坐的灰狗,当时感觉体验还是很不错的,而且我确认了当天没有雨或雪,也就没有太担心延误的问题。

我当天提前一个小时左右到了灰狗站,然而等到1点半车还没到,过了一会车站工作人员广播说1:20的车延误了,让这班车的乘客去柜台。柜台的黑叔叔跟我们说这班车从多伦多途经Buffalo开过来,但是不知道为什么他没有在这里停。所以如果要去纽约的话可以上2:15的那一班。

一次令人自闭的算法作业

最近一次Data Structure & Algorithm课程的作业是要求实现Dijkstra算法,并且其中的排序部分要使用最小堆来实现。

Dijkstra的基本思路如下

1. 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。

2.从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点。

3.更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

4.重复步骤(2)和(3),直到遍历完所有顶点。

我们的作业要求是在步骤2中的“选出距离最短的顶点”要用堆来实现。也就是说,我们需要维护一个最小堆,里面包含有起点到各个尚未访问到的顶点的(目前为止的)最短距离。每一次更新各个顶点到起点的距离时,都要更新堆中所有顶点的值。这样,每次寻找距离最短的顶点时,直接取出堆的根即可,省去了每次都要遍历一遍来寻找最小值。

我们要求的实现逻辑是这样的:维护一个如下的routing table,其中存储了每个节点的id,是否已经访问过,到出发点的最短距离,和该节点在堆中对应的位置。每次访问图中的一个节点时,都要在routing table中更新该节点及其所有后继节点的距离和其他信息。

node012
is_visitedtruetruefalse
cost013
heap_position012

我写完提交之后,被告知我的solution在小用例上部分正确,大用例上报vector越界的运行时错误。

纽约游记

自从8月中来到雪城之后,虽然同在纽约州,但是和纽约市还有近300mi的距离。安排好入学和生活上的事情之后,我终于在9月初如愿去了纽约。

我乘坐灰狗巴士从雪城出发,一共大约5小时的车程。灰狗的舒适程度比我预想的要好不少,车上有WiFi,电源插座和卫生间。在路上看到对面的高速公路上的一辆装着大型机械的卡车,挂着Oversize Load的旗子,和美卡里面的Heavy Cargo Mod一模一样,太帅了。

大约中午12点的时候巴士到达了Port Authority的巴士站。车站位于曼哈顿中城的正中心的地下,出门之后的斜前方就是纽约时报的总部。纽约时报的总部原本位于时报广场,后来才迁到这里。

在美国开车

在美国上学,交通是个挺大的问题。如果要去除了学校以外的地方,比如去超市或者出去玩,基本就只能靠uber和lyft了。

不过比较幸运的是,我们的公寓里就有一个Zipcar的点。Zipcar是一家分时租车的公司,可以按小时为单位租车。Zipcar在雪城的学生价格是一年16刀的会员费加上每小时9刀的租车费用(加上各种税之后)。即使是短途的行程也比uber或lyft要划算很多。

纽约州承认中国驾照,所以可以直接使用中国驾照申请Zipcar。不过我在提交了驾照扫描件之后被要求额外提交一份Driving Record。我去北京交管局的网站上查询了自己的驾照记分记录,并把显示“记分为0”界面的截图及其翻译发给了Zipcar,过了几天申请就通过了。

申请通过之后会收到一张Zipcard,这张卡就是用于解锁车辆的钥匙,在Zipcar网站上激活这张卡,然后就可以飙车了。

New York State Fair 纽约州土味大集

在诸多人的安利下,趁着Labor Day的长周末去了趟New York State Fair。纽约的State Fair是全美国第一个大规模的农畜产品展,最早一届是在1841年,就是在雪城举办的。每年只开两周,今年是从八月22号开到九月3号,错过了只能再等下一年。

因为当天是本年度State Fair的倒数第三天,再加上是个周末,在高速上就开始堵车,堵了超过3mi的路程。路边有几个房车营地,里面停满了房车。恐怕真的有不少人是拖家带口开着房车过来的。

从10号门进入Fairground之后,首先看到的是一个牛棚。

我们在路上堵着的时候,同行的学长跟我说:

“我去年来的时候,他们在牛棚里搭了个摄像头在YouTube上直播。他也不说话,就播那个牛。”

“美国人真的是…他们就过来看看牛,看看猪赛跑,就觉得特别快乐。我去年来的时候,牛棚里边有一个看台,我去的时候就看见一个人坐在那看牛,等我下午走的时候他还在那看牛。”

初到雪城的一周

今天是我到达美国的整一个月,我终于把这篇鸽了好几周的文章写完了。

前文提到,经过近两年的准备和申请,我取得了雪城大学MSCE项目的录取。

8月14号,我从首都机场登上了飞往纽约的航班。经过13个小时的飞行,飞机在JFK机场停稳的时候已经将近3点了,飞往雪城的航班在两小时后起飞,于是只能在机场里一路狂奔,连一张照片都没来得及拍。幸运的是所有持F1签证的学生都被分流到一个单独的房间里,检查护照和I20等,平均每个人只用了不到一分钟。

美国的安检看起来很严格,和国内一样需要把液体和电子产品拿出来单独过机器,还需要脱掉鞋和外套。然而,如果注册了TSA Precheck,则不需要这一系列繁琐操作。总之不充值是不会变强的。

总而言之,一番折腾之后终于顺利到达了JetBlue的登机口。机型是巴航工业的E190,比320和737稍小一圈。