git 使用笔记 (2)

合并指定文件

假设 master 中有文件 a 和 b,在分支 br1 中对 a 和 b 都进行了修改并且已经提交,如果只想把在 br1 中对 a 的修改合并到 master 中,执行命令:

git co master
git co br1 a

即先切换到要修改的分支(例如这里的 master),然后执行命令:

git co [分支名称] [要合并的文件1] [要合并的文件2] ...

分支的删除

假设有一个中心仓库 git-repos,有分支 master 和 br1;两个工作目录 …

阅读全文…

sicp 笔记 (5)

第二章习题 2.73 - 2.97 的解答。

E-2.73:

(a) 因为 number 和 variable 使用的是 scheme 提供的原子类型,并不是自定义的类型。

(b)

(define (install-deriv-package)

  (define (deriv-sum expression var)
    (make-sum ((get 'deriv (operator expression)) (addend expression) var)
              ((get 'deriv (operator expression)) (augend expression) var)))

  (define (deriv-product expression var)
    

阅读全文…

debian 硬盘安装 linuxmint

debian7 出来后马上试用了一下,gnome3 不出意外地令人失望。本来想换 xfce 的,忽然想起 linuxmint 搞的 mate 和 cinnamon,其中 mate 是基于 gnome2 改的,而 cinnamon 基于 gnome3。本着与时俱进的原则,网上搜了下 cinnamon 发现挺好看的,而且发展了有一段时间了(最重要是这个,谁都不想一个软件用了两天作者就说不干了)。在 kvm 上试用了一下 linuxmint 打包的 debian cinnamon 201303 版,越用越爽,果断连论文都不改了,先换了系统再说。

官网的 iso 是 dvd 的,而我只有一张 cdrw,很不幸地光驱又抽风了,于是想用硬盘安装。用 google 搜“linuxmint 硬盘安装”,第一条结果是参考资料 [1],但是试了几次都出错了,说什么“getpwuid_r(): failed due to …

阅读全文…

bash 实现目录遍历

脚本的最初原型是当年用 fvwm 的时候为了山寨一个生成家目录下的树形结构菜单写的一个广度优先遍历;后来在把文件系统从 ext3 转到 ext4 的时候重新分区,把文件备份到 windows 上,结果还原回来的时候权限都乱了,于是把 queue 整理了一下写成一个单独的脚本用来改权限;后来还实现了一个深度优先遍历的版本。今天把这两个函数都整理一下。一般来说简单的操作用 find + 各种工具就行了,除非是对遍历顺序有要求或操作比较复杂。

#!/bin/bash

# http://ouonline.net/

IFS=$(echo -en "\n\b") # in case of space(s) in dentry name

# -------------------------------------------------------------------------- #

function dfs()
{
    #if [ $# -ne 2 ]; 

阅读全文…

sicp 笔记 (3)

第二章习题 2.33 - 2.51 的解答。

E-2.33:

(define (accumulate op initial sequence)
  (if (null? sequence)
    initial
    (op (car sequence)
        (accumulate op initial (cdr sequence)))))

; -----------------------------------------------------------------------

(define (my-map p sequence)
  (accumulate (lambda (x y) (append (list x) y)) (list) sequence))

(define 

阅读全文…

使用 fuse 编写文件系统 (2)

读写文件

在第一个程序的基础上增加读写 hello-world 的功能:

#define FUSE_USE_VERSION 26

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fuse.h>

#define BUFFSIZE 8192

static int content_size;
static char content[BUFFSIZE];
static const char* fname = "hello-world";

static int ou_readdir(const char* path, void* buf, fuse_fill_dir_t filler,
                      off_t 

阅读全文…

使用 fuse 编写文件系统 (1)

FUSE 的全称是“Filesystem in Userspace”,即“用户空间的文件系统”,这是一个内核模块,能够让用户在用户空间实现文件系统并且挂载到某个目录,就像在内核实现的文件系统一样。使用 FUSE 有几个好处:一是因为在用户空间实现,开发和调试都比较方便;二是可以把一些常用的服务以文件系统的形式展现,方便操作,如 ftpfs,sshfs,mailfs 等;另外可以避免一些版权问题,如 Linux 上对 ntfs,zfs 的操作都是通过 FUSE 实现的。当然用户空间的实现也有缺点,最明显的就是由多次在用户态/内核态切换带来的性能下降。

根据参考资料 [1] 的介绍,用户通过 FUSE 和内核的通信过程如下:

                   +----------------+
                   | myfs /tmp/fuse |
                   +----------------+
                          |   ^
+--------------+          v   |
| ls /tmp/fuse |    +--------------+
+--------------+    |    libfuse   |
      ^  

阅读全文…

programming in lua (12)

第 9 章和第 30 章部分内容,都是讲线程相关的。

基本概念

lua 中的 coroutine 和我们通常说的“线程”概念相近,但是这里的 coroutine 并不是真正的线程,在某个时刻只有一个 coroutine 在执行。lua 将 coroutine 的所有函数都放在一个叫“coroutine”的 table 中,下面来看一下这些函数。

co = coroutine.create(function () print("hello") end)
print(co) -- thread: 0x11fa810
print(coroutine.status(co)) -- suspended
coroutine.resume(co) -- hello
print(coroutine.status(co)) -- dead

create() 接收一个函数作为参数,创建一个对应的 …

阅读全文…