魔镜魔镜
下班后生活太无聊,为了讨好妹子,决定做一些有趣的事情,正好手头有个闲置的树莓派 3,决定把它利用起来,做这个魔镜。右上角有天气和新闻,以及一只比丢,这只比丢可以借由摄像头看着你。先展示下效果图:
下班后生活太无聊,为了讨好妹子,决定做一些有趣的事情,正好手头有个闲置的树莓派 3,决定把它利用起来,做这个魔镜。右上角有天气和新闻,以及一只比丢,这只比丢可以借由摄像头看着你。先展示下效果图:
开始实习了,我也从学校里搬了出去,租了一间小房子,办好了野鸡宽带,买了路由器,配好了树莓派上的 AFP 和 SAMBA 以及各台电脑的自动备份,然后为了方便,就把所有的东西(光猫,路由器,树莓派和一个移动硬盘)都放在了一个专门的小柜子里。然而这个时候问题就来了,散热怎么办?
众所周知,路由器、树莓派都是发热大户,移动硬盘在备份的时候发热量也不可小觑。而且正好是在夏天,晚上我在家的时候开着空调开着柜子门反倒没啥,但是白天我上班去了,即使开着柜子门,树莓派的 CPU 温度也很容易升到 70 ~ 80 度,感觉怕怕的。于是我就买了一个 USB 风扇,对着他们吹。这么做散热是好了,但是风扇会和柜子产生共振,非常吵,只能出门开风扇,回家关风扇,这就很不优雅了。最终我还是决定得自动化一些,让树莓派自己来控制风扇。
Read More今天是我大学里最后一天上课。虽然现在才大三,不过到这个学期末我已经修够了毕业所需要的学分,大四基本上只剩一个体测和一个毕业论文啦。
总结一下整个大学生活。大学生活跟高中时候自己的憧憬还是挺不一样的,当时想象中的大学就是平平淡淡的读读书、学学习、睡睡觉。当时本身的经历也有限,只能想想是扩展版的高中生活。但是到了真正的大学,特么才发现这么多屁事……
我大学的绩点非常低,大概是专业的后百分之二十几三十几的样子,尤其是数学课。自从大一开始,我其实就没有读研的打算。一方面根据学长学姐的说法,在国内读研其实感觉挺水的,意义不大;另一方面在大二的时候我去校内的 CAD 实验室打过工,也证实了我自己的想法。可能是特例,但是实验室压抑的氛围感觉真的不适合我。所以当时就抱着一种绩点无用论在上课。
但是现在想想,专业课不听其实无所谓,反正最终自己也会学会。但是诸如数学课如果不听,你就真的再也不会了。反正我是基本不会在课后再接触数学的东西——除了要用到之外。
说起来也确实是这样,当你真正要用数学的时候,你会发现它真的挺有用的。这个学期写的搜索引擎中,就运用了一些概率论的知识,比如贝叶斯公式等。而在写游戏时,一些基础的数学根底也提供了挺大的帮助。但是要我再选一次,我还是会选择自学。自学的效率远远高于上课。
在大学不去上课,总不能在寝室打游戏吧。但是偏偏我自己又不大喜欢玩游戏。所以就把所有的兴趣都点在了编程上。大一大二,我加入了求是潮,这是一个学生组织,我所在得部门负责维护一个网站和几个 APP。在这里我和一群挺厉害得同学们一起学习了 Web 应用开发得各种知识。这些知识让我在大二的时候拿到了阿里的前端开发实习。同时我也在这里碰到了我心爱的小岚岚。我在阿里只实习了一个月,拿了好多钱,也做了一个小东西。这时候我发现,和别人沟通真的不是我的强项。尤其是根据用户需求开发产品,很难让人沉淀下成就感。说回来,在阿里的实习我学到最多的并不是前端的知识,而是代码的组织和架构。这让我受益良多。
阿里实习结束后,大三开始了。大三我写了很多代码,尝试了计算机的各个方面。这一年中我写成的项目有这么一些:
以及还有好多没写完的项目。
刚也说了大二的时候本着试一试的态度去面了阿里,侥幸通过了,受益良多。而这个学期,我也通过了微软的笔试面试,从暑假开始就要去上海实习了,想着也能收获很多东西吧。
我的毕设选题是想着做一个多线程的 JavaScript 引擎,引擎能够通过分析,将代码中的一部分并行执行,使得白白通过引擎获得可观的性能提升。相信自己可以做出来。
本文翻译自 Data-Oriented Design,已取得作者同意。
想一想这样:在开发周期的末尾,你的游戏变得慢慢的。到那时你却无法在 profiler 里面看到任何显著的性能热点。那么问题的根源到底在哪里呢?其实是随机的内存访问模式和典型的 cache misses。在某一次提高性能的尝试中,你试着将一部分代码并行化,尽管费劲了力气,可是,结果却不尽人意。因为大量的同步机制的存在,你的游戏很难能够非常大的速度提升。并且最重要的是,你的代码已经变得非常复杂,导致 bug 满天飞,连修 bug 都会引入新的问题,更别提添加新的 feature 了。听着是不是很熟悉?
可以说,在我过去十年开发的每一个游戏中,都会出现这样的场景。究其原因并不是我们所用的编程语言,也不是我们所用的工具链,甚至都不是规章制度的问题。在我看来,这个锅得由 OOP 和 OOP 使用的历史文化来背。OOP 有时候可能并不会帮助你的项目,反而会妨碍其进展。
Read More我们这学期有一门课,虽然这门课的名字叫做“汇编与接口”,但实际上这门课要求我们以小组为单位从硬件到软件做出一个小型的计算机系统来。我主要负责软件部分。虽然课程名字中有汇编二字,但是实际上并不一定用汇编语言来写。偷懒如我,一开始通过在汇编中加上一些标记,将函数调用时的栈操作和寄存器分配自动化了,使得汇编可以这样写:
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 |
虽然省去了一些动脑子的地方,但是由于大部分指令还是汇编指令,非常讨厌。尤其是 slt
和 beq/bne
连用的时候,经常要想半天。还是非常不方便。
因此决定把 C 语言的整套工具链搞出来。
Read More时隔好久没有写博客了,这段时间中,我一直在写一个小型的 SQL 数据库。这个小项目是我浙数据库系统设计的作业,课程要求是 3 - 5 个人组队完成,当时想着这个项目很有趣,就决定一个人完成。在刚才,整个项目已经完成。总行数达到了 12789 行,又破了一项人生记录。
我人生中第一个破 1000 行的项目,是一个用 OpenGL
写的 3D 版贪吃蛇,蛇可以在 10x10x10 的三维空间中游走。而此前最大的项目是 5000+ 行的小型操作系统,代码已经不可考了。
写完这个项目,其实有很多很多没做好的地方:
无论如何,写完这个项目受益良多。虽然好多都是老生常谈,但是有些事情真是只有自己亲身经历过才会记牢:
Read More