10.28.08
搬迁
博客转移至www.gleery.com
Welcome to be here
随实验室开完年会归来,错过了GCJ Round2的时间,比较可惜。看了下结果发现ACRush大牛排到了第3,非常的orz。昨天小研究了一下ACRush写的baidu杀人游戏,添加了些自己的注释,发在这里。要是不知道题目就baidu一下吧。
#i nclude <stdio.h>
int n,m,T,r[10005],testcase,i,k;
int main(int argc,char *arg[])
{
freopen(arg[1],”r”,stdin);
for (scanf(”%d”,&testcase);testcase>0;testcase–)
{
scanf(”%d%d%d”,&n,&m,&T);
for (k=1,i=n;i>2;i–)
{
k=(k+m-2)%i+1; // 被杀的人的后面所有人的号码减一
if (k==T) k=k%i+1; // 如果为T,则加一
r[i]=k; // 保存被杀者的号码
if (k<T) T–; //如果被杀的是比T还小的任务标号, 就把T减一
}
for(int i=1; i<=n; ++i) printf(”%4d”, r[i]);
printf(”\nT=%d\n”, T);
int result=3-T; // T为1或2,3-T表示最后剩下的人的号码
for (i=3;i<=n;i++)
if (r[i]<=result) // 在每轮中,如果被杀者的号码大于上一轮被杀的人,那么它的号码应该相对于上一轮小1,否则为真实号码
result++;
printf(”%d\n”,result);
}
return 0;
}
round1的第一场比赛,这一次做的相当的搓,早上到实验室来晚了,比赛开始了十几分钟才开始做题,第一题简单,不过在看第二题的时候把题目理解错了,本来也不难的,想了很久,最后才发现自己理解错了,只剩下20分钟,狂飙代码,终于在最后一分钟的时候提交上去,Correct了。最后的结果出来,发现第一题的Large-set居然挂了,有点莫名其妙。发现自己还排到了4XX名,让我很是不解,看来参加google-jam的人的水平不怎么高啊,这样都还可以进前500。看到前面最牛的人基本上在40分钟内秒杀3道题,是在是强悍啊~
简单的把bat版的改成了c语言版的,bat里面貌似没有延时机制,所以占CPU很厉害。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(){
printf(”program starts\n”);
while(true){
system(”arp -d”);
Sleep(1000);
}
system(”pause”);
}
Google Code Jam今天开始了资格赛,自己之前也报了名。比赛一共3道题, A题比较简单,略微证明一下就清楚了。B题也不是很难,弄懂题目后就很简单了。最bt的是C题,纯粹一道几何题而且超级麻烦,之前也没有做过这种题目,所以走了不少弯路,一开始还想用微积分,后来发现圆的积分是不可积的,仔细想了一下,发现可以拆分成扇形和三角形,不知道这种方法会不会太笨了,反正写起来很是繁琐,用了不少时间调试,最后居然通过了。反正比赛的15分时全部拿到了,就看剩下的60分有没有问题了。目前的成绩rank 300多,:)。
今天早上来看比赛的结果,发现3道题都pass,最后的rank达到了22x,虽然资格赛并不需要全部做完(所以很多大牛估计懒得做了),不过对于我这种业余选手能够做出这样的成绩还是很开心的:)
今天在写程序是时候遇到一个很诡异的内存问题,程序没有缓存任何东西,但是却使用了1G的内存。Java程序出现内存问题一样非常难以调试,由于是程序自动回收,反而难以从程序本身入手。通常的原因是使用了对象却没有释放,也许我们认为应该释放了,但实际却没有被释放,或者在一些被封装的很深的地方占用了大量的内存而没有被程序员所察觉。
Java里面有一些能够帮助找到内存泄漏的程序,其中Java Memory Profiler比较好用,免费的工具而且是图形化的界面。跑了一便程序后发现在jdbc哪里累计了很多的内存。回头来检查程序,发现唯一有可能的地方是Connection,之前不是很确定应该每次使用时创建新的Connection还是是使用一个,Java的文档里面也并没有说使用Connection应该注意什么。所以 便共享了一个Connection。改了程序后再跑,发现内存果然没有飞涨了。很明显Connection会使得数据库操作中的大量对象无法被释放,从而导致内存泄漏,每次创建新的Connection,使用完后释放则没有问题。仔细想想Connection更多保存着和数据库操作相关的本地对象,对于数据库来说维持一个Connection,在不做任何操作的情况下并不是太大的负担。
之后在网上找了一下,看到有一个人遇到和我类似的问题,页面在这里 。
把他的代码转过来
在写javascript的时候,为了做一个测试在全局域里面写了一个onkeydown函数,名字是随便起的,不过带来的问题却让人汗颜,原来这个名字在无意间居然把window的onkeydown事件给拦截了,导致测试的时候出现许多无法理解的问题,实在是无语。看来没有语法检查的时候还是要非常小心呢。
javascript所能做的事情比想象中的多得多,这一点已经被很多人验证过了,之前写的一些程序也告诉我javascript可以用来做很多传统语言才能做到的事情,恩,拭目以待吧。
关于gleery kernel 的介绍似乎早就应该开始了。 gleery是一个非常tiny的os kernel,其实就它目前的功能来说只是一个bootstrap plus版。虽然功能很简单,但是学到的东西还是非常多的,而且最困难的部分也已经被跨越了。
gleery os kernel主要是大四上完成的,实现一个自己的os kernel总是一件很让人感兴趣的事情。我首先从阅读《自己动手写操作系统》一书开始,作为内核领域内的新手,这样的一本入门级的指导书可以省去很多盲目的尝试。操作系统内核的编写在一开始的时候其实是面向机器的编程,需要了解很多Intel处理器的相关知识和汇编指令的工作方式。我觉得这是最困难的部分,一旦克服了这一关,后面的工作就是纯粹的软件设计和实现的工作了。在编写的过程中我参考了很多资料,包括minix源代码,linux早前版本的源代码,以及Intel处理器的手册和一些其他资料。
我执意要在Windows上开发这个os,所以也遇到了很多障碍。之前就花了很多时间去弄清楚怎么将gcc编译的obj文件和nasmw编译的o文件链接到一起,并且声称没有PE头或ELF头的二进制程序。这方面的资料很少,因为大多数人都是在linux上做开发。不过在windows上的开发也给我带来很大的便利,比如我用source insight建立工程极大的方便了代码的编写和阅读。
下面介绍一下我在开发中使用的开发环境和工具:
source insight:编辑器,以及minix代码的阅读器,同时提供了一键编译和一键调试功能。
一键编译主要是设置source insight 调用make.exe实现了,主要的流程在makefile文件里面控制。
一键调试则是调用bochs的程序,设置启动参数实现的。
有了这两个功能,开发过程就变得非常舒适了,代码的修改和调试可以马上看到结果。在此之前我需要在命令行里面编译代码,然后手动运行bochs,如果需要频繁的改动然后查看结果,效率会非常低。
编译器: dev C++ 中自带的mingw, 以及nasmw。
自定义的工具:自己用C写了一些工具用来生成最后的软盘镜像。
这次决定发布的版本只是一个demo版,仅仅演示了时钟和键盘中断的效果,以及一个IDLE进程。以后会发布一个更加完善的版本。
你可以从http://code.google.com/p/gleery/上check out到源代码
要毕业了,日子在倒数中逝去,心中恍然若失。明天会怎样呢?回到4年前的我,让我在做一次选择,我会怎样呢?离别总是不可避免的发生着,曾经有过,以后还会有。不知怎的,发现自己以大不如从前了,心性变了许多。我在追逐怎样的人生呢,我好像知道,又好像不知道。生活就是这样,其中的一些道理当真已经看透了吗?回忆似乎总是带着一点伤感,也许正应了那句话:经历得少,才懂得珍惜。
论文暂时写完了,做毕设的心情似乎很早就没了。其实现在最想做的就是拼命的去看书,一本接一本的看,还有论文,很讨厌每天坐在电脑前面的感觉。觉得没有让人激动的想法的时候,编程成为一件索然无味的事情。还记得之前写操作系统的kernel, 一开始还很有激情,每一行正确的输出都有让人激动,可是逐渐的就没有兴趣了,倘若我只是简单的重复别人的工作又有什么意义呢?所以当听到别人用C#写操作系统时,我觉得如果我要写我也一定要做一些只属于我的东西。
我渴望着自己的original idea。