魔镜魔镜

2016/09/24 - 21:05Devices

下班后生活太无聊,为了讨好妹子,决定做一些有趣的事情,正好手头有个闲置的树莓派 3,决定把它利用起来,做这个魔镜。右上角有天气和新闻,以及一只比丢,这只比丢可以借由摄像头看着你。先展示下效果图:

成品

Read More

树莓派控制 USB 风扇

2016/08/13 - 11:26Devices

开始实习了,我也从学校里搬了出去,租了一间小房子,办好了野鸡宽带,买了路由器,配好了树莓派上的 AFP 和 SAMBA 以及各台电脑的自动备份,然后为了方便,就把所有的东西(光猫,路由器,树莓派和一个移动硬盘)都放在了一个专门的小柜子里。然而这个时候问题就来了,散热怎么办?

众所周知,路由器、树莓派都是发热大户,移动硬盘在备份的时候发热量也不可小觑。而且正好是在夏天,晚上我在家的时候开着空调开着柜子门反倒没啥,但是白天我上班去了,即使开着柜子门,树莓派的 CPU 温度也很容易升到 70 ~ 80 度,感觉怕怕的。于是我就买了一个 USB 风扇,对着他们吹。这么做散热是好了,但是风扇会和柜子产生共振,非常吵,只能出门开风扇,回家关风扇,这就很不优雅了。最终我还是决定得自动化一些,让树莓派自己来控制风扇。

Read More

大三总结——以及大学就没课啦

2016/06/23 - 14:10Life

今天是我大学里最后一天上课。虽然现在才大三,不过到这个学期末我已经修够了毕业所需要的学分,大四基本上只剩一个体测和一个毕业论文啦。

总结一下整个大学生活。大学生活跟高中时候自己的憧憬还是挺不一样的,当时想象中的大学就是平平淡淡的读读书、学学习、睡睡觉。当时本身的经历也有限,只能想想是扩展版的高中生活。但是到了真正的大学,特么才发现这么多屁事……

绩点

我大学的绩点非常低,大概是专业的后百分之二十几三十几的样子,尤其是数学课。自从大一开始,我其实就没有读研的打算。一方面根据学长学姐的说法,在国内读研其实感觉挺水的,意义不大;另一方面在大二的时候我去校内的 CAD 实验室打过工,也证实了我自己的想法。可能是特例,但是实验室压抑的氛围感觉真的不适合我。所以当时就抱着一种绩点无用论在上课。

但是现在想想,专业课不听其实无所谓,反正最终自己也会学会。但是诸如数学课如果不听,你就真的再也不会了。反正我是基本不会在课后再接触数学的东西——除了要用到之外。

说起来也确实是这样,当你真正要用数学的时候,你会发现它真的挺有用的。这个学期写的搜索引擎中,就运用了一些概率论的知识,比如贝叶斯公式等。而在写游戏时,一些基础的数学根底也提供了挺大的帮助。但是要我再选一次,我还是会选择自学。自学的效率远远高于上课。

兴趣

在大学不去上课,总不能在寝室打游戏吧。但是偏偏我自己又不大喜欢玩游戏。所以就把所有的兴趣都点在了编程上。大一大二,我加入了求是潮,这是一个学生组织,我所在得部门负责维护一个网站和几个 APP。在这里我和一群挺厉害得同学们一起学习了 Web 应用开发得各种知识。这些知识让我在大二的时候拿到了阿里的前端开发实习。同时我也在这里碰到了我心爱的小岚岚。我在阿里只实习了一个月,拿了好多钱,也做了一个小东西。这时候我发现,和别人沟通真的不是我的强项。尤其是根据用户需求开发产品,很难让人沉淀下成就感。说回来,在阿里的实习我学到最多的并不是前端的知识,而是代码的组织和架构。这让我受益良多。

阿里实习结束后,大三开始了。大三我写了很多代码,尝试了计算机的各个方面。这一年中我写成的项目有这么一些:

  • SystemOnChipCoS,一套完整的 Verilog 写成的硬件及其操作系统,Verilog 6k 行,C 3K 行。MIPS 流水线 CPU,双核 MIPS GPU,带 MMU 和两级 cache
  • c5,fork 了著名的 c4 项目,但是补全了一套工具链,可以将 C 的子集编译成 MIPS 汇编,并将其汇编成二进制,并链接起来,支持自举,C
  • cdb,SQL 数据库,但是不支持网络操作,C++ 11k 行
  • cript,一个类似 Lua 语言的虚拟机,带GC,快速排序测试比 NodeJS 快,5k 行,C
  • cyan,一个类似 Rust 语言的编译器、虚拟机,带JIT,16k 行,C++
  • keydb,Key Value 数据库,10k QoS,C++
  • reflect,C++ 反射库,可以反射 class 和 enum,总计不到 300 行
  • search,基于 LevelDB 的搜索引擎,命令行操作,C++ 3k 行

以及还有好多没写完的项目。

实习

刚也说了大二的时候本着试一试的态度去面了阿里,侥幸通过了,受益良多。而这个学期,我也通过了微软的笔试面试,从暑假开始就要去上海实习了,想着也能收获很多东西吧。

明年就要毕业了

我的毕设选题是想着做一个多线程的 JavaScript 引擎,引擎能够通过分析,将代码中的一部分并行执行,使得白白通过引擎获得可观的性能提升。相信自己可以做出来。

使用 Xbyak 进行 JIT

2016/06/13 - 10:59Compiler

起因是这样的,这学期我在写一个编译器,结果写到最后发现自己写的 X64 的寄存器分配策略好像有点问题,导致有一些情况没法正确的分配寄存器,而又没有时间把这部分重写过,所以索性就写了一个虚拟机,不生成 X64 指令,直接执行编译器 IR。本来想着虚拟机用了 Computed-Goto 之后不至于很慢,但是发现 C++ 写的虚拟机比上次 C 写的虚拟机,慢了大概 3 倍,原因我还没时间查明,但是这速度就不能忍。于是我就尝试将虚拟机的指令进行简单的 JIT,瞬间就快了回来,追平了 C 写的虚拟机。这里就用了这个 Xbyak C++ 汇编库在内存中生成可执行代码。

Read More

Cript一门脚本语言

2016/04/20 - 17:23

对,半年前的 CUA 系列文章真的烂尾了。但是,作为挖坑小能手,半年之后我又挖了一个新坑。这次挖的坑,完成度更高。

新的坑名叫 Cript (对就是把 script 前面那个 s 给去掉了,Github),是一个类似于 lua 的脚本语言,拥有动态类型,字节码执行,Copy-and-Swap GC 等等一系列特性,并且能够和 C 语言无缝贴合。

一个简单的 Hello World:

1
global.println('Hello World!');
Read More

Lets Encrypt

2016/02/21 - 14:21Website

本来我的博客用的是 StartSSL 的证书,而且是刚申请的证书,但是这几天听说 StartSSL 的 KPI 系统被 360 托管了,这让我很不放心。于是就想着把证书替换成 Let’s Encrypt 的。然后我就找到了这篇教程。过程非常简单,没几分钟就完成了,效果如下:

新证书

我也顺便翻译了教程,各位客官们可以看着参考下。

Read More

面向数据的设计

2016/02/04 - 11:02Programming

本文翻译自 Data-Oriented Design,已取得作者同意。

想一想这样:在开发周期的末尾,你的游戏变得慢慢的。到那时你却无法在 profiler 里面看到任何显著的性能热点。那么问题的根源到底在哪里呢?其实是随机的内存访问模式和典型的 cache misses。在某一次提高性能的尝试中,你试着将一部分代码并行化,尽管费劲了力气,可是,结果却不尽人意。因为大量的同步机制的存在,你的游戏很难能够非常大的速度提升。并且最重要的是,你的代码已经变得非常复杂,导致 bug 满天飞,连修 bug 都会引入新的问题,更别提添加新的 feature 了。听着是不是很熟悉?

可以说,在我过去十年开发的每一个游戏中,都会出现这样的场景。究其原因并不是我们所用的编程语言,也不是我们所用的工具链,甚至都不是规章制度的问题。在我看来,这个锅得由 OOP 和 OOP 使用的历史文化来背。OOP 有时候可能并不会帮助你的项目,反而会妨碍其进展。

Read More

MIPS 上的 C 语言工具链

2015/12/01 - 17:08Compiler

我们这学期有一门课,虽然这门课的名字叫做“汇编与接口”,但实际上这门课要求我们以小组为单位从硬件到软件做出一个小型的计算机系统来。我主要负责软件部分。虽然课程名字中有汇编二字,但是实际上并不一定用汇编语言来写。偷懒如我,一开始通过在汇编中加上一些标记,将函数调用时的栈操作和寄存器分配自动化了,使得汇编可以这样写:

1
@def max
	@param a
	@param b
	
	slt @compare_result, @a, @b
	beq @compare_result, @zero, _max_a_is_greater
	move(@retval, @a)
	@return
_max_a_is_greater:
	move(@retval, @b)
@enddef

虽然省去了一些动脑子的地方,但是由于大部分指令还是汇编指令,非常讨厌。尤其是 sltbeq/bne 连用的时候,经常要想半天。还是非常不方便。

因此决定把 C 语言的整套工具链搞出来。

Read More

人生第一个破万行的项目

2015/11/11 - 12:30Programming

时隔好久没有写博客了,这段时间中,我一直在写一个小型的 SQL 数据库。这个小项目是我浙数据库系统设计的作业,课程要求是 3 - 5 个人组队完成,当时想着这个项目很有趣,就决定一个人完成。在刚才,整个项目已经完成。总行数达到了 12789 行,又破了一项人生记录。

我人生中第一个破 1000 行的项目,是一个用 OpenGL 写的 3D 版贪吃蛇,蛇可以在 10x10x10 的三维空间中游走。而此前最大的项目是 5000+ 行的小型操作系统,代码已经不可考了。

写完这个项目,其实有很多很多没做好的地方:

  • 单元测试没到位,导致很多 BUG 没发现
  • 系统架构不合理,写业务部分的时候感觉挺心累的
  • 没有遵循 RAII,后期出现了好多资源方面的问题,现在也未必全解决了
  • 后面时间有点赶,代码质量也逐渐下降了
  • ……

无论如何,写完这个项目受益良多。虽然好多都是老生常谈,但是有些事情真是只有自己亲身经历过才会记牢:

Read More

VIM 格式化 JSON

2015/09/09 - 10:28Life

VIM 真的好厉害,除去其他的不谈,今天我又发现了一种新的用法,能够将一长串的 JSON 格式化为人类可读的版本。

先上命令:

1
:%!python -m json.tool
Read More
Categories