Published on
2010年04月2日 in
备忘.
自己写小东西什么的还是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文件,内容大约可以这样:
代码杯具了怎么办~
这样就把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
Published on
2010年02月3日 in
备忘.
Tags: C, fsvm, 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还是老实点好 >_<
Published on
2010年01月30日 in
备忘.
Tags: C, trick.
写小东西需要用到哈希表这样的数据结构时候才后悔没用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;
}
终究不如模板来的自然,呵呵~不过也不错了。
Published on
2010年01月26日 in
备忘.
Tags: 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回来了…
Published on
2009年11月29日 in
备忘.
Tags: Kernel.
- 如何在有限的空间(如内存和硬盘,可以将其看作一个大数组)内储存不定长度不定生命周期的个体(如进程或者文件)?
- 如何限制一个进程在运行时无法访问或修改其他进程的数据?
- 如何实现共享库或者系统调用?
- 能否把进程的调度、连续对象(字节、页)的分配抽象为纯粹的最优问题?
最近看几本linux内核的书,貌似开始弄明白了点门道。通过分页机制实现一个虚拟地址空间貌似就可以解决上述的问题。不过现在只了解其机制,而不解其策略。纸上谈兵显然还差的远。
大约去年这时候曾经问过FlowerCode一些关于分页的东西,当时fc说分页有点像文件系统,现在才越想越觉得有道理。后知后觉了一些,呵呵 :)
Comment