一个谜之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网络架构,本文中我们将介绍上图中各组件的概念及用途。

2020 Summer 实习上岸总结

前文提到,我的秋季学期在无数简历石沉大海之后,以面挂了亚麻VO的惨淡结局收场。

我当时为了亚麻的VO改了回国的机票,所以回国的时间总共只有十几天。虽然我在回去之前发誓假期要好好刷题,不过大部分的时间都在外面浪,所以爆肝刷题计划失败(

虽然题没怎么刷,不过简历倒是投了不少。当时春招刚开启,每天都能看到有新的公司放出职位来。这次我在投简历的时候也不仅限于SDE了,DevOps,SRE相关的职位我也投了不少。

因为这期间投的大多是小公司,回复的速度比大厂快了很多。形式大多是先HR电面,再进行OA和技术电面。我在寒假期间收到了一个VO和1个HR电面,分别来自Ancestry和Shipt,再加上之前就已经约好的Naveego。相对来说都是比较冷门的公司,我把这些面试都排在了开学第一周。

我在一月初飞回美国之后在纽约玩了两天,在一天早上起来刷LinkedIn的时候看到了一个Quicken Loan的SDE职位,就顺手投了一个。令我没想到的是当天上午,在我坐在1线地铁上前往Battery Park的途中收到了HR发来的短信(是的,短信),和我约了HR电面,同样在开学第一周。

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上直播。他也不说话,就播那个牛。”

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