Scheme 与 Church Number

最近在看SICP,然后看到练习2.6,十分的有趣,刚好和上学期计科导讲过的自然数的构造有点类似。题目首先给了0和加一的实现,然后问1和2应该怎么直接定义,再问如何直接定义加法。

(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

(Read this Article →)

一个简单的物理引擎

之前物理课的时候看到了PPT上一张分子热运动的图,觉得很有趣,于是那个星期就做了个二维球体完全弹性碰撞的简单物理引擎。非常凑巧的是,刚好这个东西可以拿来做最后的物理大作业,也算是非常开心吧。

Translational Motion

先放上这次物理大作业做的三个热学演示吧,其实核心代码是一样的,只不过根据不同演示的需要做了一定的修改:

写引擎之前我隐约知道,好像大部分的物理引擎都是在每一帧里面,让每个物体往前前进一点,然后当两个物体重叠之后再做碰撞的处理。但是我对这一套理论十分的不了解,而且总是觉得这么做十分的麻烦,又怕当碰撞十分复杂的时候(比如接连有好多个物体碰撞)会出问题,所以我决定按照另外一个十分显然的思路来写引擎。

(Read this Article →)

C++ Placement New

问题的引入

最近有若干同学和我讨论在实现 C++ vector 容器的时候如何实例化一个没有默认构造函数的类。比如下面的代码:

#include <cstddef>

template <class T>
class vector {
    size_t capacity, size;
    T *data;
public:
    vector() :
        capacity(10), // for example
        size(0),
        data(new T[capacity]) {
    }

    ~vector() {
        delete [] data;
    }
};

struct Point {
    int x, y;
    Point(int a, int b): x(a), y(b) {}
};

int main() {
    vector<int> a;
    vector<Point> b;
}

在实例化 vector<int> 的时候不会有问题,然而当实例化 vector<Point> 的时候就会出错了

placement_new.cc:11:18: error: no matching constructor for initialization of 'Point'
        data(new T[capacity]) {
                 ^
placement_new.cc:26:19: note: in instantiation of member function 'vector<Point>::vector' requested here
    vector<Point> b;

(Read this Article →)

OS X: Vagrant搭建PHP开发环境

最近想要改用 PHP 写网站,然而又不想在 OS X 上装上一大堆的 PHP 开发环境。想起来一直没试过 Vagrant ,干脆这次就试下。

安装

从官网上下载并安装 Vagrant: https://www.vagrantup.com/downloads.html

因为我的虚拟机用的是 Parallels Desktop ,不想再装个 VirtualBox 了,所以要装个 Vagrant 插件

$ vagrant plugin install vagrant-parallels

接下来安装系统,因为国内的下载速度并不是很理想,所以还是单独下载吧。Parallels Desktop 的 box 可以在这边搜索到:http://www.vagrantbox.es/

然后添加这个 box 并且创建一个虚拟机:

$ vagrant box add ubuntu ~/Downloads/parallels_ubuntu-14.04.box
$ 
$ cd ~/Developer
$ vagrant init ubuntu
$ vagrant up

现在就可以 ssh 进去虚拟机了:

$ vagrant ssh

配置

(Read this Article →)