技术笔记


北美IT求职总结 – Google – New Grad 7

最终去向:Google Software Engineer, New Grad, Mountain View 学校项目:Yale CS MS (一年) 签了Google的offer,withdraw了Bloomberg和Oracle的面试,算是结束了自己的求职之路。激动是有的,因为二十多年来,终于实现了经济独立。 但也有些失落,因为其他的可能性都随之崩塌。近期都不会再碰算法题了,Leetcode的解题记录也停在了308。写下这篇文章,总结求职中的经验和教训,也希望帮到后来人。 图:Shu Tao 白岩松说,永远不要相信老人写的回忆录,因为他们会选择性地回忆过去,只留下筛选后的内容。于是他们的人生轨迹与抉择看起来是那么的顺理成章。我会尽量客观地写这一年来我做的事情,中间有些许经验,也有不少教训。 选择学校 申请学校时我就决定毕业后找工作。出于经济考虑,自己最终从CMU MIIS,Cornell Meng和Yale CS中选择了后者。每当自己在朋友圈或是Facebook上看到CMU的同学凌晨三点发的写代码的状态,就会感慨这可能是自己差一点选择的生活。感慨过后,自己就又去继续思考晚上到底是炖鸡还是炖牛肉的哲学问题去了。 耶鲁的课程对找工作的帮助微乎其微,我想大部分学校的课程都是这样。因为课程目的就不是为了帮助学生找工作,而是训练学生理解计算机原理,甚至是独立思考,和面对未来生活的能力。当然也有学校诸如MIT就开设了Hacking a Google Interview这样的神课,那就是另外一个故事了。不过,耶鲁计算机系的教授单拎出来都是各个领域的神牛。比如Avi Silberschatz,你可能没听过他的名字,但你一定用过他的教材。 此外,在耶鲁读书,还会给你机会认识一群优秀的同学。 练习白板 图:Bo Song 刷题的环境很重要,尤其是能和一群优秀的人一起准备面试。头脑风暴之后,我们往往能把算法复杂度降低一个量级。这种感觉有点像高三复习备战高考,整间教室的人都朝着同一个目标努力。曾和另一位拿了Yale和Cornell Offer,同样纠结去哪家的同学聊天,她觉得刷题的环境和校友资源是选择学校的考量。我表示认同。因为你的水平取决于你周围人水平的平均值,这种影响是潜移默化的。 我本科的一位同学(浙大),本科毕业前就收到了谷歌的offer,同时一位杭州IT公司的老板也极力挽留他。后者开出的价码很诱人,“谷歌给你什么,我就给你什么。并且直接让你领导一个团队。”这位同学讲,最后一个条件对他的诱惑力很大,但转念一想团队里那些人的水平,最终还是选择去谷歌。“很希望与一群优秀的人共事,会让自己也不断进步。”他说。 很有幸能在耶鲁认识这么多优秀的同学,感谢他们带给我的积极影响。我可能是找工作找得最快的一个,但绝对不会是找得最好的一个。祝愿大家都能拿到理想的offer。学校项目可以改变人的气质,我们也可以改造Yale CS MS的形象。 Yale CS MS 2015 Fall 部分同学 图:Aohan Lin 准备面试 我开始刷题(Leetcode)是在2015年1月份,也就是大四下学期,那时刚准备完申请。这里还保存着我Leetcode上AC的第一道题的题解:http://www.sunny-song.com/best-time-to-buy-and-sell-stock/ 如果按照时间顺序从旧到新地看的话,可以一览我的代码从稚嫩笨拙(too young too simple)到还算整洁规范(neat and clean)的成长过程。 […]


ucos温度计

实验任务: 这个实验的目的是理解uC/OS II的任务调度方式,编写uC/OS II的应用程序,通过寄存 器直接操纵GPIO来驱动外 部设备。 实验步骤: 设计输出方案,画连线示意图; 在面包板上连线,完成外部电路; 编写C/C++程序,测试程序和电路; 测试、实现uC/OS II对GPIO的访问; 实现DHT-11数据的读; 实现以时分复用方式在四位7段数码管上依次显示0000-9999的数字; 用两个uc/OS II任务,一个定时读DHT-11数据,一个轮流驱动数码管,一秒一次显示当 前温度和湿度。注意处理 好两个任务之间的数据共享。 板卡:wrtnode   首先从github上下载ucos-ii-for-pcduino的代码,我们在此基础上做wrtnode的移植: git clone https://github.com/Pillar1989/ucos-ii-for-pcDuino 下文中的”./”均指ucos-ii-for-pcDuino文件夹 其中 ./app存放我们的用户代码,我们稍候写的代码就放在./app/sample.c中。 ./build存放编译的目标文件.o ./arduino 存放arduino库 ./ucos存放ucos的源码   ./config.mk存储编译的配置文件 ./scp.sh 是我后来编写的脚本,主要是用scp命令拷贝二进制代码和必须的库到板卡上。 ./Scp.sh文件的内容如下 ssh-keygen 命令用来删除之前预留的wrtnode指纹。因为我的板卡经常会被莫名其妙地reset重启并恢复出厂设置。(后来发现只要#GPIO2 引脚输出1就会reset)每次reset后指纹都会变更。linux默认会检验指纹,避免man-in-the-middle-attack(中间人攻击)。 Scp source destination 拷贝文件到板卡上。 ucos_sample是编译后的我们的二进制文件,剩余三个是程序运行时所需要的动态链接库,也需要一并拷贝到板卡上。 linux中,动态链接库以.so结尾,静态链接库以.a结尾(archive) 首先更改./arduino/makefile文件和./makefile文件,用mipsel-openwrt-linux-xxx工具链作交叉编译。 上图这样写的前提是我们已经把工具链编译程序放在了系统的path中,如果没有,请更改~/.bashrc文件并重启terminal。更改方法是,在~/.bashrc文件的末尾加上export PATH=”$PATH:[your crosstool-chain-directory]” 首先用交叉编译工具编译arduino库,它允许我们通过arduino函数的接口来调用gpio口。 […]


[毕设笔记]利用Android手机的传感器进行APP开发

自己的毕业设计是用安卓手机控制无人机。今天尝试了下读取安卓手机传感器的信息,通过手机的重力感应器,通过手机的倾斜来控制无人机的飞行方向。 基础知识 安卓手机配置的传感器有加速度传感器(Accelerometers),陀螺仪(Gyroscope),电子罗盘(Magnetic),光传感器(Illumination),距离接近传感器,环境温度传感器(Ambient Temperature)等。 一般的安卓手机都会配置前三个传感器,这也是我们本文所要讨论的重点。 获得手机的姿态 有趣的是,手机内置的陀螺仪(Gyroscope)的直接输出并不是角度而是角速度。这和我们的常识有些违背。原因是包括手机在内的很多电子设备中内置的陀螺仪,是利用震动物体在旋转时产生的科里奥利力来检测角速度,通过计算而间接地得到角度。而不是利用我们平常见到的那种巨大的依靠角动量守恒而保持旋转轴指向不变的陀螺仪来直接得到角度数据。 上图:微电机陀螺仪获得角速度的原理 必须指出,如果单独用陀螺仪获得角度的话,需要对角速度在时间上积分。这带来了累积误差。并且,陀螺仪本身会发生漂移,导致误差会随时间急剧地增大。为了减小误差,我们必须利用其它的传感器,比如加速度传感器来进行互补融合计算,减小误差。 多传感器融合算法 为了抵消陀螺仪的累积误差和漂移误差,我们往往用加速度传感器进行修正。


【实习日记】在Tomcat上部署Spring boot

用Spring Boot开发的Web工程,在本机的Eclipse中Run as Spring Boot可以跑通,但打包成war在Tomcat上却跑不通。 首先这篇文章介绍了部署Spring Boot到Tomcat上的一般方法。但是我的程序抛出了一些奇怪异常。 java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;Ljava/lang/ClassLoader;)Z 一番搜索之后,发现了这篇文章。于是怀疑是版本冲突,Spring过低的原因。 但自己并不知道如何确定工程中Spring的版本,pom.xml中并没有给出版本号。 <?xml version=”1.0″ encoding=”UTF-8″?> 4.0.0 <groupId>org.test</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.3.RELEASE</version> <relativePath/> <!– lookup parent from repository –> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <start-class>demo.DemoApplication</start-class> <java.version>1.7</java.version> <hibernate.version>4.3.5.Final</hibernate.version> <tomcat.version>7.0.59</tomcat.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!– […]


【实习日记】Spring中JSON与类的绑定

1. 设计与前端交互的JSON接口(登陆与注册部分) 参考了这个JSONAPI设计规范 http://jsonapi.org/ 2. 用Wireshark抓包,分析本机发出的HTTP请求是否带上了要求的HEADERS 3. spring request得到的response不能直接绑定成对象,需要先用string接收,然后用jackson转换 import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); try { ress = mapper.readValue(reStr, Response.class); System.out.println(ress.getCode()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 在jackson转换时,需要把映射类的setter和getter函数写好。否则会转换错误 如果json中没有对应的变量值,jackson会把相应的成员变量置为null。