Archive for the '备忘' Category

Page 2 of 5

git使用入门

自己写小东西什么的还是git最省心 ^_^

版本控制工具里的命令什么还真够多的,所幸一个人要求不高,平时用的功能也就这么几个了。所以…..忘掉svn吧! =V=

开始

git init 
git add .
git commit -a -m "commit message"

git init就是创建当前目录的版本库,所有信息都在.git这一个文件夹里面。比起svn的每个目录下边都一个.svn可要清爽多了 :)
git add . 将目录中的所有文件加入跟踪,新建文件时候别忘了这个。
git commit 就是提交啦~注意下这个commit只是提交到本地。

git是跟踪代码变动的工具,而不是上传工具。commit时候需要注意的一点就是不要把二进制什么的文件交进去。记得在根目录下边加个.gitignore文件,内容大约可以这样:

*.o
*.so
*.a
*.exe
*~

代码杯具了怎么办~

git checkout -- blah.c

这样就把blah.c恢复到了commit时的状态,存档复活~

要恢复到之前的版本就用git reset了,git在每次提交的时候都有个hash作为标记,知道这个hash就行了(例如git log或者直接翻github的history之类)

git reset --hard 4df38hdf29f

(reset好像有三种?初学者不用刨根究底的 =v=)

分支

git branch blah 
git checkout blah

就创建出了一个名为blah的分支了~
git checkout 的功能就是将当前工作目录转向blah~

合并分支…

git branch master
git merge blah

blah就合并进master啦~

github

ssh密钥好像比较绕…github使用ssh协议传输东东也做了身份验证嘛,所以需要一个双向的密匙。具体的操作步骤忘了囧,不过照着提示来也就一次性的工作啦~

git config --global user.name 'Fleurer'
git config --global user.email me.ssword@gmail.com
 
git remote add origin git@github.com:(你的名字,这里是Fleurer~)/项目名.git  
git push origin master

Fleurer’s Stack VM

http://github.com/Fleurer/fsvm
尝试用C写的堆栈机,好像烂尾了 – -!

只是个运行时,无视了语法分析。随便写的东西也没什么规划,编写的时候就郁闷不知道哪部分该归分析器那部分该归vm,也不知道现有的部分能不能真用到解释器上,于是华丽地烂尾~只实现了20来条指令,可以递归可以闭包,不过不能算乘法…囧,很简陋啦~

好像是第一次写C,不会make就先凑合了rake – -! 对C不熟悉,满地的Segmentation Fault对我们只会用printf调试的菜鸟太残酷了…用了那个保守式的gc库Boehm GC,面对满地的malloc而无free不清楚泄漏起来会怎样…囧

本来是对C++那套OO无爱,想单用struct和函数也可以OO么。于是用了C,然后就后悔了:我不想重新实现hashmap之类的东西,C++那stl多好…T_T。倒也找到了个C的泛型库khash,不过宏终究不如模板来的好看…现在想来,信息学奥赛acm中用C的那些同学做题的时候都是自己实现一遍各个数据结构么?

拿段伪代码:

def main:
     sum(10)
 
def sum(i):
     if (i==0) : return 0;
     else: return(i+sum(i-1));

放到fsvm下大约是这样:

int test_rec(){
    Op op_main[]={
        OP_PUSH_NUM, 10, 
        OP_PUSH_CONST, 0, //"sum"  
        OP_PUSH_VAR, 
        OP_CALL, 1,
        OP_RET
    };
    Op op_sum[]={
        OP_PUSH_CONST, 0, //"i"
        OP_PUSH_VAR, 
        OP_POP_TMP, 0, //store i
        OP_PUSH_TMP, 0, //push i
        OP_PUSH_NUM, 0, 
        OP_EQ,
        OP_NOT, // i!=0?
        OP_BRANCH, 3, 
            OP_PUSH_NUM, 0,
            OP_RET,
        //else
            OP_PUSH_TMP, 0, 
            OP_PUSH_NUM, 1, //1
            OP_SUB, 
            OP_PUSH_CONST, 1, //"sum"
            OP_PUSH_VAR, 
            OP_CALL, 1,   //sum(tmp[0]-1)
            OP_PUSH_TMP, 0, 
            OP_PRINT_STACK, 
            OP_ADD, //tmp[0]+sum(tmp[0]-1)
        OP_RET
    };
    Env *env=fnew_env(NULL); 
 
    Proto *p_main = fnew_proto(op_main, 0);
    fset_const(p_main, 0, fstr("sum"));
    Func* f_main=fnew_func(p_main, env);
    Obj o_main=ffunc(f_main);
 
    Proto* p_sum=fnew_proto(op_sum, 1);
    fset_const(p_sum, 0, fstr("i"));
    fset_const(p_sum, 1, fstr("sum"));
    Func* f_sum=fnew_func(p_sum, env);
    Obj o_sum=ffunc(f_sum);
 
    fbind_var(env, "sum", o_sum);
 
    fio_puts(fcall(0, f_main));
    return 0;
}

创建函数的那几个函数我自己也看着别扭…不过写C还是老实点好 >_<

C的泛型库khash

写小东西需要用到哈希表这样的数据结构时候才后悔没用C++,最起码还有stl能用来着。虽说C也能搞泛型,不过宏实现的泛型…真的好恐怖。

tinyrb用了khash做哈希表,据作者说已经是一个稳定的实现了。

khash.h的内容:
http://attractivechaos.awardspace.com/khash.h.html

大体可以这么用:

#include "stdio.h"
#include "khash.h"
KHASH_MAP_INIT_STR(str, int) //以“str”这名字初始化一个类型的map,键类型为字符串,值类型为int
int main() {
    int ret, is_missing;
    khiter_t k; //khash的索引器,好像就是个int
    khash_t(str) *h = kh_init(str); //str只是个名字,初始化
    k = kh_put(str, h, "test", &ret); //“test”即键,ret判定操作是否成功,返回k为索引器
 
    if (!ret) kh_del(str, h, k); //如果h中已经存在了这个键,就删除之
    kh_value(h, k) = 10; //设置键“test”对应的值(10)
 
    printf("%d\n", kh_val(h,k)); //kh_val(h,k)即10
 
    k = kh_get(str, h, "test"); //获得“test”对应的索引器k
    printf("%d\n", kh_val(h,k)); //得10
 
    kh_destroy(str, h);
    return 0;
}

终究不如模板来的自然,呵呵~不过也不错了。

折腾grub小记

蛋疼用PQMagic改了下/swap分区的大小,重启发现mbr没了。

拿手机google下之后,找了张windows me的光盘(初一时候买的盘还能用…orz)引导进入dos,fdisk /mbr,windows原地满血复活…满血,是的,windows又把mbr占了…

接着装个wingrub,折腾半天找回了原先的menu.lst,重启,接着是:

Error 2: Bad file or directory type

而且在grub命令下无法列出ext3分区的文件,当时冷汗天杀的PQMagic没把我盘格了吧…回头想下,感情这个wingrub好像不认ext3…

下载个live-CD,进去发现可以读那个分区。apt-get一个grub,进入命令行之后:

root (hd0, 4)
setup (hd0)

提示成功。重启,原先的grub回来了…

关于进程的疑问集

  1. 如何在有限的空间(如内存和硬盘,可以将其看作一个大数组)内储存不定长度不定生命周期的个体(如进程或者文件)?
  2. 如何限制一个进程在运行时无法访问或修改其他进程的数据?
  3. 如何实现共享库或者系统调用?
  4. 能否把进程的调度、连续对象(字节、页)的分配抽象为纯粹的最优问题?

最近看几本linux内核的书,貌似开始弄明白了点门道。通过分页机制实现一个虚拟地址空间貌似就可以解决上述的问题。不过现在只了解其机制,而不解其策略。纸上谈兵显然还差的远。

大约去年这时候曾经问过FlowerCode一些关于分页的东西,当时fc说分页有点像文件系统,现在才越想越觉得有道理。后知后觉了一些,呵呵 :)