少年听雨歌楼上,红烛昏罗帐.壮年听雨客舟中,江阔云低断雁叫西风. 而今听雨僧庐下,鬓已星星也! 悲欢离合总无情,一任阶前点滴到天明。

2004年7月31日星期六

贝多芬的《第一钢琴协奏曲》

米开朗基利的手刚落下,奇迹就出现了。层次那么清楚,深思熟虑的落健,和几乎幽默的装饰音,都让人感到了大师的风范。当然,贝多芬的这个协奏曲也并非等闲之辈。很多人觉得这部作品受了海顿、莫扎特等人的影响,但是那种成熟的贝多芬风格已经在这部作品中展现无遗。以前听过布伦德尔的演奏,速度更快些,但是缺少这种幽默感。对,笑,缺少微笑,一种微笑面对生活的态度。是的,很难想象贝多芬的微笑,但是又在意料之中。只有伟大的人才能真正在内心中笑得出来。米开朗基利很让人震撼。不是典型的德奥风格,不是那种不问世事的冷漠,而是在微笑里面透出一份关爱,那种几乎察觉不出的情感的流逝和那种几乎无处不在的浪漫让人觉得既无法理解,当同时又那么自然。第一乐章几乎完美。第二乐章似乎是一种看透红尘的无所谓。但是那种谈话似的调侃却又被米开朗基利敏锐的把握到了。第三乐章排山倒海之势让人感到了作曲家的伟大和钢琴家的创造力。伟大!贝多芬的钢琴协奏曲真的都是精品。

2004年7月30日星期五

贪吃蛇进度(2)

目前把事件机制终于做好了。所有的操作都封装到事件里面。这是头文件snake.h:
/* Keyboard definition */
#define ENTER 13

/* Macro for quick control */
#define NEWEVENT (EventLink)malloc(sizeof(event))
#define REGISTER(name,in) tempevent=NEWEVENT;\
tempevent->interval=in;\
tempevent->timer=0;\
tempevent->invoke=name;
/* The prototype of bool type */
typedef enum
{
true,
false
}bool;


/* The prototype of directions */
typedef enum
{
up,
right,
down,
left
}direction;

/* The prototype of a point of the snake */
typedef struct
{
int posx;
int posy;
direction dir; /* The current direction of this point */
}point;


/* The prototype of the snake */
typedef struct
{
point dots[MAXSNAKELEN];
}snake;

#ifndef __SNAKE

/* prevent multiple includes */
#define __SNAKE
/* The prototype of the event */
typedef struct
{
long interval;/* The interval of the event occurs */
long timer;
void (*invoke)(); /* The function pointer to the invoke action */
}event;


/* The prototype of the eventlist */
struct eventlist
{
event *eventnow;
struct eventlist *next;
};


typedef struct eventlist Node;
typedef Node *Link;
typedef event *EventLink;



int screenx=0;
int screeny=0;

void Init();
void EventHandler(Link);
void EventInsert(Link,EventLink);
Link EventCreater(Link);
void EventFree(Link);

void Kernel();

/******************************************************/
void Kernel()
{
}

void EventInsert(Link eventhead,EventLink newevent)
{
Link pointer;
Link newlist;
pointer=eventhead;
while(1)
{
if (pointer->next==NULL)
{
newlist=(Link)malloc(sizeof(Node));
newlist->eventnow=newevent;
newlist->next=NULL;
pointer->next=newlist;
break;
}
pointer=pointer->next;
}
}

Link EventCreater(Link eventhead)
{
Link newevent;
EventLink tempevent;

int i;

eventhead=(Link)malloc(sizeof(Node));
/* Create event list */
if (eventhead==NULL)
{
printf("Memory allocate Failure!!\n");
}
else
{
tempevent=(EventLink)malloc(sizeof(event));
tempevent->interval=1;
tempevent->timer=0;
tempevent->invoke=Kernel;
eventhead->eventnow=tempevent;
eventhead->next=NULL;
}
return eventhead;
}

void EventFree(Link eventhead)
{
Link pointer;
EventLink tempevent;
while(eventhead !=NULL)
{
pointer=eventhead;
eventhead=eventhead->next;
tempevent=eventhead->eventnow;
free(pointer);
free(tempevent);
}
}
#endif

这里面没有什么解释的。Link EventCreater(Link)就是建立一个链表存放所有的事件。void EventInsert(Link,EventLink)是一个添加事件的函数。void EventFree(Link)是最后释放链表的函数。
下面是主程序snake.c
#include
#include
#include
#include
#include
#include
#include

/* Standard macro for quick caculation */
#define SNAKEUP if (me.dots[i].posy==0)\
me.dots[i].posy=getmaxy();\
else\
me.dots[i].posy--;\

#define SNAKEDOWN if (me.dots[i].posy==getmaxy())\
me.dots[i].posy=0;\
else\
me.dots[i].posy++;\

#define SNAKERIGHT if (me.dots[i].posx==getmaxx())\
me.dots[i].posx=0;\
else\
me.dots[i].posx++;\

#define SNAKELEFT if (me.dots[i].posx==0)\
me.dots[i].posx=getmaxx();\
else\
me.dots[i].posx--;\


/* The definition of keyboard */
#define KBUP 72
#define KBDOWN 80
#define KBRIGHT 77
#define KBLEFT 75

snake me;

/* Registry Events */
void Controler(); /* The main keyboard controler */
void DrawSnake();
void Calculate();

/* Registry Method */
void RegisterEvents(Link);





int main(void)
{
Link head;
int gdriver=DETECT,gmode;
/* Init graphic mode */
initgraph(&gdriver,&gmode,"");
Init();
head=EventCreater(head);
RegisterEvents(head);
EventHandler(head);
EventFree(head);
closegraph();
clrscr();
return 0;
}

void Controler()
{
char controlchar;
if (kbhit())
{
controlchar=getch();
switch (controlchar)
{
case ENTER:exit(0);break;
case KBUP:me.dots[0].dir=up;break;
case KBDOWN:me.dots[0].dir=down;break;
case KBRIGHT:me.dots[0].dir=right;break;
case KBLEFT:me.dots[0].dir=left;break;
}
}
}

void Calculate()
{

int i,j;

for (i=0;i<>
{
if (i==0)
{
j=0;
}
else
{
j=i-1;
}
switch(me.dots[j].dir)
{
case up:SNAKEUP;break;
case down:SNAKEDOWN;break;
case right:SNAKERIGHT;break;
case left:SNAKELEFT;break;
}
me.dots[i].dir=me.dots[j].dir;
}
}

void Init()
{
int i,j;
int sx=DEFAULTSTARTX,sy=DEFAULTSTARTY;
randomize();
for (i=0;i<>
{
me.dots[i].posx=sx;
me.dots[i].posy=sy;
me.dots[i].dir=up;
sy++;
}
screenx=getmaxx();
screeny=getmaxy();
}

/* Draw snake */
void DrawSnake()
{
int i;
cleardevice();
for (i=0;i<>
{
putpixel(me.dots[i].posx,me.dots[i].posy,DEFAULTSNAKECOLOR);
}
}

void RegisterEvents(Link head)
{
EventLink tempevent;
REGISTER(Controler,1);
EventInsert(head,tempevent);
REGISTER(Calculate,1000);
EventInsert(head,tempevent);
REGISTER(DrawSnake,1000);
EventInsert(head,tempevent);
}

void EventHandler(Link eventhead)
{
int i;
Link pointer;
while(1)
{
delay(1);
pointer=eventhead;
while (pointer!=NULL)
{

pointer->eventnow->timer++;
if ((pointer->eventnow->timer)>=(pointer->eventnow->interval))
{

/* Invoke current event */
pointer->eventnow->invoke();
pointer->eventnow->timer=0;
}
pointer=pointer->next;

}
/*if(kbhit())
{
if (getch()==KBUP)
break;
}*/
}
}
解释:void RegisterEvents(Link)是想注册事件的函数。这个函数是对void EventInsert(Link,EventLink)的更高级的封装。void Controler()是控制键盘的函数。void DrawSnake()是控制绘制蛇的函数.void Calculate()是计算蛇当前位置的函数。

下一步的任务就是使蛇准确按照键盘的输入移动。目前的移动有问题。

2004年7月28日星期三

灵山游(二)

晚上我和她一起看了《钢琴家》。很不一样的感觉。在那种环境下,两个人偎依在一起看一部生命的电影。有时候生活美得让你自己都觉得不可思议。有时都害怕时间的流逝,觉得要静止了才好。不过看完以后很快就睡觉了,一夜都睡得很好。所谓一夜,也就是三个小时。

早上六点过起床,一点都没有疲劳的感觉。早上吃的东西还是很不错的。山上的早上笼罩着一层雾。很遗憾,天气似乎不是很好。要是照相的话,也许就没办法了。吃了早餐,刚刚七点过,我们就上路了。一条很不起眼的小路,开始了上山的过程。北方的山再险峻也比不过南方的,特别是四川的。走了很短一段路,我和她就开始犹豫要不要做缆车。因为我们的时间不是那么的宽裕,所以,传说中的四个小时的山路我们不太可能都走完,而我们又特别想爬到最高点,毕竟好不容易来一趟。120元的缆车费,带着我们在雾气的绿草上慢慢地前进。因为是早上,还不是很多人上山。周围很是安静,其实景色还是很美的。关键是这份闲适很难得。是的,这份自由经常不可求。说实话,在缆车上我是感到不太安全。可是,悬在半空的感觉却是很好的,特别是和她在一起在空中的那种拥抱,真的让人觉得很虚幻。来到了半山腰,雾气更大了,伴随着的是寒冷。开始还有租军大衣的想法,不过我们一听价格还是觉得既然在爬山,运动着肯定不会太冷的。我倒是买了一个拐杖,走起来似乎要轻松些。能见度非常低,走在通向云中的山路上很有仙境的意象。五米之外就是一片白。只有这样的山路才让人感觉是一种享受,至少没有一种公园的感觉。走了不久,就遇到了山民卖烤包谷和烤羊肉,买了来吃,很有味道。越往上走,伴随着雾气和寒冷的还有风,那种刺骨的寒风,很难想象七月的北京会有这种地方。灵山不是单纯的高山草甸,而是在草甸上会突然出现很多嶙峋怪石。还有就是漫山遍野的各种野花,很纯洁的颜色。这种野花让我想起了四川的四姑娘山上的野花,四川的花还要更艳丽一些,北方的花则相对朴实很多。其实也没有走多久就来到了最高峰,2303米,北京的最高峰。很奇怪,这个灵山有很多喇嘛教的东西,很多西藏的东西,连最高峰上也有一个很西藏的石头堆,就是扔一个石头上去就会有一个梦想得到实现。我和她都扔了好多石头上去。随后我们来到石头堆后面坐下,石头堆后面的风小得多了。两个人坐在一起享受单独的时光实在是很美的事情。下山的路走得就更自由了,我们离开石板路,到周围的草地上,怪石中照相,乱跑。的确,以前这种放松的状态是我想都不敢想的,是她让我能这么自在。可是时间又是过得那么快。下山还是坐缆车,不过却有一点找不到上山来的感觉了。到了山脚,还是做一两小面的,来到了坐公共汽车的地方。灵山之行算是到了尾声。

需要补充的是,我们回去的路上遇到了北京突降暴雨,很费了一番周折才回到学校。连地铁都堵了一个多小时,不过因为我们都很高兴,所以这些都根本不值得一提了。

2004年7月10-11日

2004年7月27日星期二

广安之旅

(这是给她的一封信的部分内容,就当是游记了)下午六点过终于从广安归来。恩,还是有很多的感想。总的来说,由于是跟着大人去玩儿,所以更像是一种任务。去的人都是我妈妈的大学同学。广安是四川的一个地区(一种行政单位),以前重庆没有划出去的时候地处四川的中部,现在则是在川东了,距离成都大概三百公里的地方。从成都出来一路的绿绿茵茵,以前没有高速公路(成都到南充、广安、达州)的时候,听说这三百公里要走一天。以前从来没有到过四川中部的这些地方,这次一看还是很喜欢的,就是那种很自然的小丘陵,和没有那么多现代化的城市气息。

广安是邓小平的故里,确切的说,邓小平从他十多岁离开那里就再也没有回去过了。我妈大学的一个同学在广安当市委副书记。所以,一到广安就是最高档次的接待,让人觉得很不自在。广安市在渠江边上,现在新县城修得很好,好得很多地方都比成都漂亮。当然,中央肯定投了很多钱,比如有中国最大的主题广场--思源广场,吉尼斯世界纪录的什么千年鼎。这个我等会儿再来评论。中午是在一个五星级宾馆吃的。都是我这种穷人没见过的菜肴,没吃饱也没吃好。我觉得这样出来玩儿很别扭。大人们自然很高兴,市委书记亲自给他们敬酒。最好笑也最让我深思的就是,市委书记手下的好多人也忙里忙外,我们几个小孩也被伺候得让我们自己都觉得不习惯。吃了饭,就由市委书记和手下一群什么什么书记局长带着我们去了才开发出来一个旅游景点--华蓥山大盆景风景区。华蓥山距离广安二十多公里,是四川东部最高山。如果你看过《红岩》,你就可能很熟悉华蓥山游击队,什么双枪老太婆,什么江姐都是华蓥山游击队的。我外婆的一个好朋友(现在还在,我还经常去)就是华蓥山游击队的。当然,开发这个旅游景点让我觉得很不伦不类。因为按理说,这个旅游景点不是很好,风景一般,就是喀斯特地貌,不过和云南、桂林的差远了,也就是有一些奇怪的石头和天然的树林而已。恩,还是可以啦,至少比较凉快。倒是有一个景点还可以,就是一个大天坑。所谓天坑就是一个山之间的坑,但是却不积水,因为水可以渗下去,很奇怪。其他的就没什么了,两个多小时,就当锻炼了身体吧。总之,这个景点我觉得就是因为要配合邓小平故里这个主题,硬着开发的一个景点,所谓配套的。玩儿了华蓥山,就到了一个农家山庄去吃饭,都是野味,还可以,就是觉得东西很杂。当然,农家院的东西要比中午的那些吃不来的山珍海味要好得多了。

吃了东西又返回广安县城,到思源广场观看所谓中国最大的水幕电影。水幕电影就是类似音乐喷泉,不过除了音乐还有就是把电影投影到水上看。我们去的时候已经演完了。当然,由于有领导在,所以破例又给我们演了一次,然后我们做在广场中间贵宾席坐下。真的很让人不自在,因为周围的老百姓只能在远处站着看,就我们二十多个人坐着看,然后还有保安,更可笑的是广播里面放音:“欢迎领导观看”。我当时感到十分的羞愧。不过,这个水幕电影确实很不错。气势和精彩程度相当让人激动。这套设备是几千万引进的。看了这个,晚上又返回华蓥住在一个当地最好的宾馆里,包了一层楼。市委底下跑腿的累得够呛,还让我们几个小孩去洗桑拿,被我们坚决拒绝了,当然本来我们几个小孩都在看你推荐的《海上钢琴师》。今天早上八点起来,广安的气候很像重庆,早上一起来就很热了,坐车从宾馆出来到了邓小平故居。在我想象中,故居肯定是在一个小城镇里面,结果让我大吃一惊的是故居居然都是一个公园了!也就是说就那么孤零零的一座房子,周围都重新修成很现代化的公园了。我旁边的人都说难道邓小平家是地主庄园? 还是特殊化,别人游人都是走路,我们坐着电瓶车。理所当然,公园修建得很政治化。首先,公园绿化很好,周围的树林都是中央各部门捐建的,然后每个部门捐建的树林前面有一个石碑,刻着某某部门。我细细看了一下,总之好像大家还争先在这个地方捐建树林。可以想象,这也是一种政治荣誉。其实这个公园里面没什么东西,就是一个邓小平雕像,现在还没有安放好,要等八月22日一百周年诞辰的时候由中央领导揭开。然后就是一个邓小平纪念馆,也没有开馆,还在布置。当然我们又因为特殊的原因,所以进去参观了。就是邓小平的生平展览。很现代化的纪念馆,我看比北京任何一个展览馆都要好得多。特别说一下的还有就是纪念馆这个建筑修的还不错。是一种很抽象的建筑,不像北京那些四四方方的建筑。纪念馆以后就是正题:故居。故居自然经过翻修,不过里面的东西却没有动过,还是那些破破旧旧的东西,这个出乎我的意料。看完了故居也都中午了,又拉到邓小平的那个村子--牌坊村(就在这个公园旁边)吃饭。整个牌坊村都经过完全设计并且修建。都是那种很假的古建筑,一排一排的,所有的农民都住里面。看上去很不自然。又是在一家类似农家乐的地方吃饭。还凑合,大人们就是喝酒。很快就踏上了返回成都的路。我也混混沉沉的睡去了。 下面说一说我的感想。我的第一个感想就是,如果邓小平在世,那么他的家乡绝对不会这么搞。首先,他肯定不会同意。这完全是和他的精神相违背的。整个广安打的就是“邓小平牌”,就是所谓的“伟人游”。邓小平成了一个发财致富的品牌。显然,这个肯定是务实的邓小平所不能接受的。这也是一种造神,一种扭曲的个人崇拜,包括华蓥山旅游区的开发也是所谓“伟人游”的一部分,让人觉得很多余,很浪费资源。第二个感想就是,为什么广安不好好搞建设,而要去搞很多的政绩工程,很多面子活儿。

乍一看广安,比成都,甚至比北京都要好,现代化程度都要高。城市里面的交警都是女警察,非常好看。可是,我们所见到的仅仅是新城,也就是拿出来顾面子的城区,老城区在新城区的旁边,我想肯定更多的老百姓是住在老城区里,那么老城区的生活是什么样子呢?还是新城区这样的花天酒地吗?不可能吧。广安是四川的穷地方,这个根本不容质疑。问题是,那么多的钱都去弄各种政绩了,真正的发展在哪里?到处都是邓小平的语录“发展才是硬道理”。我却对广安的发展深表怀疑。

第三个感想就是,我终于领会到了腐败旅游,终于知道了什么是特权化。同时我也知道了,当官或者说是走仕途有多么多的应酬是怎么回事了。本来,就是一群大学同学聚会。可是弄成了招待首长的级别,很多与这个根本没有关系的人参与进来,比如我说过的什么什么局长,什么什么区委书记。然后吃饭就变成了政治化的聚餐。这些什么什么长还给我们小孩敬酒(我当然没喝),我都不知道这是哪儿跟哪儿。一个市委书记的大学同学聚会要搞成这样,地下的干部不去工作,而是陪玩儿,陪吃,这个建设怎么搞得好,好几个干部还很自豪的说,每天都要陪人,习惯了,甚至最近好些天都是一天陪几个团体。天!这就是我们基层干部!最后走了,还送我们很贵重的礼物--邓小平纪念邮票一本(是非卖品,我估计好几百)。这些让我觉得很恶心了。整个广安,借邓小平致富的办法令我很悲哀。这就是我们对待我们伟人的方法。

贪吃蛇进度(1)

现在实现了计时器机制和事件机制。下一步是怎么去实现贪吃蛇的走动。

现在分为两个文件:snake.h和snake.c
如下:snake.h
#define NEWEVENT (EventLink)malloc(sizeof(event))
#define MAXSNAKELEN 30 /* Max length of the snake */
#define DEFAULTSNAKECOLOR WHITE /* The default snake color */

#define DEFAULTSPEED 100000 /* The start speed of the snake */
#define DEFAULTSTARTX 100 /* The start x of the snake */
#define DEFAULTSTARTY 100 /* The start y of the snake */
#define MAXEVENT 1 /* The startup event number */

/* Keyboard definition */
#define ENTER 13

/* The prototype of bool type */
typedef enum
{
true,
false
}bool;


/* The prototype of directions */
typedef enum
{
up,
right,
down,
left
}direction;

/* The prototype of a point of the snake */
typedef struct
{
int posx;
int posy;
direction dir; /* The current direction of this point */
}point;


/* The prototype of the snake */
typedef struct
{
point dots[MAXSNAKELEN];
}snake;

#ifndef __SNAKE

/* prevent multiple includes */
#define __SNAKE
/* The prototype of the event */
typedef struct
{
long interval;/* The interval of the event occurs */
long timer;
void (*invoke)(); /* The function pointer to the invoke action */
}event;


/* The prototype of the eventlist */
struct eventlist
{
event *eventnow;
struct eventlist *next;
};


typedef struct eventlist Node;
typedef Node *Link;
typedef event *EventLink;



int screenx=0;
int screeny=0;

void Init(snake *s);
void EventHandler(Link);
void EventInsert(Link,EventLink);
Link EventCreater(Link);
void EventFree(Link);

/* Registry Events */
void Controler(); /* The main keyboard controler */
void DrawPoint();
void DrawLine();
void DrawSnake(snake *s);

void EventInsert(Link eventhead,EventLink newevent)
{
Link pointer;
Link newlist;
pointer=eventhead;
while(1)
{
if (pointer->next==NULL)
{
newlist=(Link)malloc(sizeof(Node));
newlist->eventnow=newevent;
newlist->next=NULL;
pointer->next=newlist;
break;
}
pointer=pointer->next;
}
}

Link EventCreater(Link eventhead)
{
Link newevent;
EventLink tempevent;

int i;

eventhead=(Link)malloc(sizeof(Node));
/* Create event list */
if (eventhead==NULL)
{
printf("Memory allocate Failure!!\n");
}
else
{
tempevent=(EventLink)malloc(sizeof(event));
tempevent->interval=1;
tempevent->timer=0;
tempevent->invoke=Controler;
eventhead->eventnow=tempevent;
eventhead->next=NULL;
}
return eventhead;
}

void EventFree(Link eventhead)
{
Link pointer;
EventLink tempevent;
while(eventhead !=NULL)
{
pointer=eventhead;
eventhead=eventhead->next;
tempevent=eventhead->eventnow;
free(pointer);
free(tempevent);
}
}
#endif


Snake.c
#include
#include
#include
#include
#include
#include
#include

/* To return the head pointer of the eventlist */


int main(void)
{
snake me;
Link head;
int gdriver=DETECT,gmode;
EventLink tempevent;

/* Init graphic mode */
initgraph(&gdriver,&gmode,"");
Init(&me);
head=EventCreater(head);
tempevent=NEWEVENT;
tempevent->interval=10000;
tempevent->timer=0;
tempevent->invoke=DrawPoint;
EventInsert(head,tempevent);
EventHandler(head);
EventFree(head);
closegraph();
clrscr();
return 0;
}

void DrawLine()
{
int x;
int y;
x=random(500);
y=random(500);
circle(x,y,20);
}

void DrawPoint()
{
int x1,x2;
int y1,y2;
x1=random(200);x2=random(100);
y1=random(200);y2=random(100);
line(x1,y1,x2,y2);
}

void Controler()
{

}

void Init(snake *s)
{
int i,j;
int sx=DEFAULTSTARTX,sy=DEFAULTSTARTY;
randomize();
for (i=0;i<>
{
s->dots[i].posx=sx;
s->dots[i].posy=sy;
s->dots[i].dir=up;
sy++;
}
screenx=getmaxx();
screeny=getmaxy();
}

/* Draw snake */
void DrawSnake(snake *s)
{
int i;
for (i=0;i<>
{
putpixel(s->dots[i].posx,s->dots[i].posy,DEFAULTSNAKECOLOR);
}
}

void EventHandler(Link eventhead)
{
int i;
Link pointer;
while(1)
{
delay(1);
pointer=eventhead;
while (pointer!=NULL)
{

pointer->eventnow->timer++;
if ((pointer->eventnow->timer)>=(pointer->eventnow->interval))
{

/* Invoke current event */
pointer->eventnow->invoke();
pointer->eventnow->timer=0;
}
pointer=pointer->next;

}
if(kbhit())
{
if (getch()==ENTER)
break;
}
}
}

2004年7月21日星期三

解决了动态加载的问题

果然,在网上查了一些资料以后,终于动态加载了dll并且调用了里面的方法。其实搞懂了以后还是很简单的。具体实现的代码如下:
Assembly ass;
ass=Assembly.LoadFrom(Server.MapPath("")+"\\bin\\kernel.dll");
Type myType=ass.GetType("Kernel.DbControl");
MethodInfo mi=myType.GetMethod("ViewAllData");
Object[] arg=new object[1];
arg[0]=Server.MapPath("");
Object obj = Activator.CreateInstance(myType,arg);
Test.DataSource=(DataSet)mi.Invoke(obj,null);
Test.DataBind();

首先要把dll加载进来。然后得到特定的类名。再就是得到这个类里里面某个方法。最重要的一句就是:Object obj = Activator.CreateInstance(myType,arg); 这句的作用就是使这个类实例化。注意,实例化可以带上参数(这要看构造函数是什么样子的)。实例化了类以后就是调用方法,也和实例化类一样,要有参数的传递。当然,最好强制转换一下类型。

开始工作

今天正式开始工作了。应该说,两个人在一起的效率的确很高,至少要比一个人要高很多。第一天还是有一些收获的。比如先是做了一个dll,然后把数据库操作封装到了这个dll里面。再在一个web application里面调用这个dll。这个做的还是很成功的。中间有一个小问题就是,在dll里面,如何得到当前的工作路径。没有解决!只有从web application里面把这个路径传过去。当然这也是一种折中的方法。然后开始试验动态载入程序集。应该说,动态载入本身是没有难度的,关键是如何运行类里面的方法。这个就不是那么容易了。试验了很多,都不行。在网上查了一下,发现有很多类似的问题被大家都讨论过了。看看明天能不能解决这个问题。

2004年7月19日星期一

吉列尔斯的格里格

当亚瑟 鲁宾斯坦在火车站看见那个红发少年的时候,他也许还不能预见到这个少年未来所能达到的高度。几年后,在一次钢琴大赛上,鲁宾斯坦再次和这个年轻人相遇,是的,就是这个年轻人拿走了这次比赛的第一名。对于鲁宾斯坦这样的大师来说,有才华,有天赋的青年钢琴家肯定见多了。不过,吉列尔斯绝对是一个例外。

鲁宾斯坦给涅高思说,一定要把这个年轻人弄到彼得堡来。吉列尔斯的天赋不是里赫特那样的狂放,也不是基辛那样的锋芒毕露,而是一种智慧般的内敛。以前通过布拉姆斯的钢琴协奏曲和贝多芬的奏鸣曲就已经认识了吉列尔斯的伟大。但是,很多大师可以通过小品的演奏来得以检验。Pletnev的格里格是色彩飞扬的,是一种很造型化的美。吉列尔斯的格里格来得就自然得多。没有了太多做作,只有不经意间的微笑和叹息。其实,像格里格这种曲子,每个人似乎都可以去尝试,但是并不是每个人都能把这些曲子激发出火花。吉列尔斯做到了,通过一个个小曲子来,窥视宇宙。这种充满灵性的演奏很让人陶醉。吉列尔斯,果然就是奇迹。

灵山游(一)

其实,我很不习惯出去旅游的。因为对于我来说,旅游是一种很奢侈的事情。是的,就像她说的那样,我从小生活在城市里,而且是最典型的城市生活。典型,是的,又不是。我的生活谈不上。不过,旅游这种很自由的事情的确离我很远。在我这么多年的日子里面,真的很难寻觅出我旅游的踪迹。而且从总体上来说,我也不是一个很能够欣赏自然美景的人。这倒不是说我没有能力去辨别自然的美,而是说这种美不在我的审美范围内。因为,我总觉得,那种悲怆的美,那种死亡的味道更符合我的性格。说实话,我在去之前心里很怀疑自己能不能够找到一种感觉。当然,我就要禁不住问自己,自己寻找的是一种什么感觉呢?也许是自由?也许是放松。但也许什么都不是。其实,也有可能只是想和她有一段属于我们自己的时间和空间。对,一切都有可能。

不过,这次去旅游真的给我很多以前从没有的感触。我突然觉得城市的生活非常的灰暗。不是说城市的生活是没有乐趣的,只是在钢筋混泥土的世界里生活太久也就像这些灰色的楼房一样刻板而没有活力。哦,对,灵山,北京的最高峰。启程很普通,可以说就像去哪个博物馆,抑或是逛街。前面的一切都是未知的。自己出行就是要去操心很多很多。行车确实是一个问题。当然,北京的交通已经是算方便的了。不过对于灵山这种景点来说,是不是应该有专门的旅游线路呢?最大的问题可能就是,除了夏季这几天可以是一个旅游的旺季,平时灵山根本没人问津。当然,也就没有必要去专门开设一个旅游专线。门头沟的山很有四川的味道。让我想起了都江堰往西走的那种山谷之美。不过,四川的山水更加灵秀些,更加隽永。北方的山水更加粗犷,豪放。拥挤在类似于八十年代的公交车里,在蜿蜒的山路中行驶,身体前前后后,左左右右的摇晃着,似乎要摇晃掉那都市的晦气。

三个小时的路途到达了一个小山村,双塘涧,很秀丽的名字,却没有想象中的溪流和凉爽。十九公里的山路带着我和她来到了灵山脚下。其实,灵山很普通,也可以说就是一座没有什么特点的山。这种山放在南方,会很不起眼,根本就没有人问津。但是,这里是北方,是首都。所以,灵山就像它的名字一样有着南方般的身段。住宿,花了很一段时间才安顿下来。山民其实很纯朴,纯朴得把那种赚钱心切的心情暴露的那么明显,让人觉得可恨,可怜。最终,在一个类似住家般的招待所住下了。老实说,我还是很满意的,至少有热水,有电视。而且感觉几个管理人员的态度都很不错。柳开始很担心那关不好的窗子,不过我却少有的没那么害怕。因为,一种说不清楚的感觉告诉我,旅游嘛,并不是绝对的都很安全的。不过这些小插曲的确很有意思,恩,一种很生活化的意味。晚上的菜很贵,但是很家常。柳责怪我花了太多的钱,是的,要是我们在外面吃,或者是自己来得时候多带一些东西,可能花费要小一些。但是呢,我还是觉得这个吃的开销是值得的。这可能就是柳说我的过好日子过惯了吧。是啊,我这种在都市生活了十九年的人,走在哪里都是带着都市的味道。本来在灵山这种地方看见满天的星星应该是不足为奇的,但是当看到满天繁星的时候,还是有一种的激动。我忽然觉得贝多芬的《第九交响曲》就在天上。黑黑的画布上镶嵌着深浅不一的星星,也许我也是其中的一员。尘世的很多东西都忘却了。当然,最重要的还是和她在一起。在星空下,两个人的世界真的是那么美妙而短暂。是啊,往往美丽的东西,也是短暂的。在旅店的平台上,很冷的空气,却让我觉得有一种爱的灼烧。是的,我感到压抑了很久的爱终于可以去释放,给能够接受它的人。这种良辰美景真的是很让人觉得不现实。不过幸福是肯定的。我从没有和一个人单独出去过,她也肯定是。很难说这样的情景以后还会不会有,但是我觉得,有过就已经说明了爱的伟大。灵山,但愿给我和她的爱带来灵性。

2004年7月11日星期日

Wand的布鲁克纳第七

Wand的演奏永远是纯粹的德国。和乔希姆的指挥相比,Wand要理智很多。这种理智不是冷酷,而是在恰到好处的地方不过分的去流露浪漫和温情。布鲁克纳的《第七交响曲》常常被滥情。的确,从第一分钟就开始的那种温馨,那种庄严是很多指挥家的最爱,同时过于慢的速度,使本来就很长的曲子显得更加冗长。Wand的开始非常灵巧,一点也不拖泥带水。弦乐的流动性特别好。平衡感也特别好。第一乐章的结尾处理得非常宏伟。不知道为什么,这种庄严给我一种十分悲壮的感觉。第二乐章和第一乐章相比,布鲁克纳显得更加加诙谐。当然还是建立在一种庄严的基础上的诙谐。Wand的演奏很大气,这种大气带来的就是乐队的跳动。第三乐章很美,也很静。第四乐章舞曲的节奏被Wand充分的调动起来了。总之,布鲁克纳的《第七交响曲》在Wand手中经历了伟大的创造的过程。其实,Wand应该是一个大家的,可能是那种本性,决定了这位伟大的指挥家的低调和睿智。

乌戈尔斯基的穆索尔斯基

听乌戈尔斯基的"Pictures at the exhibition"绝对是一种不同的感觉。是的,这种感觉是不同里赫特的,也是不同于基辛的。乌戈尔斯基一开始就是一种悲情,一种庄严。穆索尔斯基的这个作品绝对是一部杰作。任何一个人都可以有不同的诠释。关键是这种诠释的基础是什么?是图画本身?还是展览?乌戈尔斯基的演奏使本来很雄壮的地方格外的悲凉。和Pletnev相比,乌戈尔斯基更侧重的是一种情感。而Pletnev的演奏很有造型感。一种塑造的感觉。这点和Horowitz是差不多的。俄罗斯钢琴中间的几个很有造形艺术的钢琴家都对《图画展览会》有惊人的诠释。乌戈尔斯基的演奏是貌不惊人的。“古堡”那段是哀而不伤。有诉说不完的惆怅。“漫步”主题十分的无奈,但是又有一种很奇怪的坚定。这就是一种很深的功底。说实话,听乌戈尔斯基的《图画展览会》给我一种心中完美诠释的典范。一直以来我都对很多钢琴家对这首曲子的演奏不太满意。现在,我终于找到了这么一种演奏。现在,我很想听的就是乌戈尔斯基的舒曼的《童年憧憬》。以前看过《爱乐》介绍过。看来,一些不太知名的钢琴家中并不是没有大师。

2004年7月1日星期四

C语言的问题

昨天把下雨的题终于编完了。对Graphics.h里面的一些函数有了一个初步的了解。我觉得我设计的这个程序是一种多线程的程序的雏形,因为两个雨滴是相互独立的,互不影响。这是放在一个数组里面实现的。目前的问题是如果把间隔时间设置的相对短些的话,动画要光滑些,但是有闪烁的感觉。这也是所有编程语言的擦坪函数所带来的,怎么解决,确实是一个问题。

附上源程序:


#include <stdio.h>

#include <math.h>

#include <graphics.h>

#include <stdlib.h>

#include <time.h>

#include <dos.h>

#include <conio.h>


#define PI 3.1415926


#define RAINDROPLEN 15 /* The length of a raindrop */

#define RAINTANGLE 0 /* The tangle of each raindrop */

#define RAINDROPZ 0 /* The internal of each raindrop */

#define RAINCOLOR white /* The color of each raindrop */

#define RAINWAVELEVEL 40 /* The level of each wave */

#define DELAYTIME 2000 /* The internal of each flash of the screen */


/* Calculate the next X,Y of a raindrop */

#define RAINDROPNEXTX(n,m) (int)((RAINDROPLEN/m+n)*sin(RAINTANGLE*(PI/180)))

#define RAINDROPNEXTY(n,m) (int)((RAINDROPLEN/m+n)*cos(RAINTANGLE*(PI/180)))


#define RAINDROPS 100 /* The total numbers of raindrops */



struct raindrop

{

int posx;

int posy;

int state; /* The current state of raindrop. 1 for raindrop. 2 for wave. */

int wavelevel; /* The current wave level */

};


void Init(struct raindrop *drops);

void DrawDrops(struct raindrop *drops); /* Draw all the raindrops */

void CalDrops(struct raindrop *drops); /* Calculate the next raindrops position */



int main(void)

{

struct raindrop drops[RAINDROPS];

int gdriver=DETECT,gmode,i=0;

initgraph(&gdriver,&gmode,""); /* Init graphic mode */

Init(drops);

setbkcolor(0);

while(!kbhit())

{

cleardevice();

DrawDrops(drops);

delay(DELAYTIME);

CalDrops(drops);

}

return 0;

}


void Init(struct raindrop *drops)

{

int i;

randomize();

for(i=0;i<RAINDROPS;i++,drops++)

{

drops->posx=random(600);

drops->posy=random(300);

drops->state=1;

drops->wavelevel=0;

}

}


void DrawDrops(struct raindrop *drops)

{

int i;

int endx,endy;

setcolor(WHITE);

for(i=0;i<RAINDROPS;i++,drops++)

{

if (drops->state==1)

{

endx=RAINDROPNEXTX(0,1);

endy=RAINDROPNEXTY(0,1);

line(drops->posx,drops->posy,drops->posx+endx,drops->posy+endy);

}

else

{


ellipse(drops->posx,drops->posy,0,360,1+(drops->wavelevel)*0.75,0.05+(drops->wavelevel)*0.15);

}

}

}


void CalDrops(struct raindrop *drops)

{

int i;

int endx,endy;

int temp;

for(i=0;i<RAINDROPS;i++,drops++)

{

if (drops->state==1)

{

endx=RAINDROPNEXTX(RAINDROPZ,10);

endy=RAINDROPNEXTY(RAINDROPZ,10);

if ((endx+drops->posx)>=640(endy+drops->posy)>=400)

{

temp=random(100);

if (temp%2==0(endx+drops->posx)>=680(endy+drops->posy)>=550)

{

drops->state=2;

drops->wavelevel=1;

}

else

{

drops->posx=drops->posx+endx;

drops->posy=drops->posy+endy;

}


}

else

{

drops->posx=drops->posx+endx;

drops->posy=drops->posy+endy;

}

}

else

{

if ((drops->wavelevel)<RAINWAVELEVEL)

{


drops->wavelevel++;

}

else

{

drops->posx=random(600);

drops->posy=random(100);

drops->wavelevel=0;

drops->state=1;

}

}

}