December 08, 2008

最近一直在想一个问题,到底决定我们留在一个地方的东西是什么?
最近看了一个很喜欢的blog,谈关于《海角七号》,说实话,看这部电影的感觉远远没有看他的评论来的煽情了:
"
谁给我写一封信
有一期《口述历史》,主角是从纺织女工到中国第一任女副总理的吴桂贤。
她谈到自己的老伴,说:
“我们谈了六年恋爱,实际上是他给我写了六年的信。六年来,我只回过一封信。
我很过意不去,他却说:我反正是认定你了。”
如果这世上有一个愿意一直给你写信的人,请你一定要对他好一点。

我觉得自己对电影的要求向来是不高的,我不会在意一部电影投资了多少钱,不会在意它是不是名导演的作品,不会在意里面有没有我喜欢的演员,不会在意它的镜头有多么唯美,不会在意它的配乐是不是动听,我甚至可以不在意它有没有讲一个动人的故事。
我不是说这些东西不重要,但是它们都不是一部电影最本质的东西。
电影的本质是叙述一个故事。故事的好坏当然很重要,但是更重要的是你如何去讲述它。
我相信这个世上很少有坏的故事,如果你觉得一个故事很瞎,那往往只是因为叙述得太差而已。
我们骂很多投资浩大的大片,是因为我们感觉不到拍那些电影的人好好讲述一个故事的诚意。

《海角七号》是一部有诚意的作品,起码我是这样觉得的。
肯花心思处理细节的电影,很少让人感觉没有诚意。
而细节,是《海角七号》让我印象最深刻的地方。"

我只是记得那个小女孩在电梯里带着耳机唱"但若你劈腿,就去死一死"了。。
记得里面的那个黑社会镇长有一次很深沉的说:这么美的一片海,怎么就是留不住我们呢?

不知道为什么在我的内心深处是很渴望离开的,就是那种不断的跳跃到一个陌生的地方开始陌生的纠结。我一直不是很理解自己这种欲望,似乎我的逻辑就是,在一个遥远的地方纠结总比总呆在一个地方纠结要好。虽然偶尔也会有一种呆在一个地方静静地乖乖的过日子的想法。但是总是在不到几分钟之内被扼杀在襁褓之中。
是不是大家也都是这样的。还是,我太过沉浸在这种不用负责的快感里?如果有一个地方能让我停下这种感觉,那会是哪里?
紫金港对我来说已经几乎是我的第二个home一样了。
我怀念紫金港的很多的东西。确切的说,我怀念紫金港给我的那种感觉。
但还是不停的在想下一个destination.不想停下来。

也有的时候,我告诉自己说,也许离开是为了有机会回来。就像吃饭是为了饿一样的道理。在一个地方有一段回忆。多么浪漫的事情。
前几天,我一个弟弟让我去校内看一个写我的日志:
"
抽走了恶心的东西,其实离散还是很曼妙的。
最曼妙的一点就是认识了姐姐这个奇妙的生物……
姐姐:我书包里永远放着一本Algorithm和一个苹果。因为我有一个梦想,有一天,我被车撞死了,人们在我的书包里发现一本Algorithm,还有一个苹果,他们说:这个女孩的死就是因为Algorithm。(缓慢的悲情的语调……)
我(若有所思状……):那苹果呢?
姐姐:你不觉得这个故事放一个苹果进去很有悲情色彩么?
我:………………………………囧TZ……………………………………
过了一会儿……
姐姐:你知道一个女人一生绝对不能错过的两样东西是什么吗?
我(若有所思状……):是什么?
姐姐:第一个是一个爱你的人,第二个是,末班车……
我(依旧若有所思状……):……
姐姐:为什么是末班车呢?
我(还是若有所思状……):……
姐姐:你不觉得把末班车放进去很有悲情色彩么?
我:………………………………囧TZ…………………………………
……………………
我:3P…(念做三P…为什么讲到这个捏,忘了……)
姐姐:我们管这叫Three-son……(受教了,果然美剧看多了就是不一样……)
……………………

"
忽然很欣喜的发现自己还是很受人爱戴的了。
在电脑上的自己和现实生活里的自己差的是有点远。主要原因我觉得是,我快乐的时候都在平常的时候发泄出去了,于是只有纠结的时候才过来写博客。。
发现这个原因的时候顿时很懊恼。因为这就表示我永远不可能写成一个技术性的博客了。不过管他呢。还是觉得很久很久以后自己看着年轻时候的纠结是蛮好玩的事情。毕竟,我觉得自己本性纯良,如果不能对别人幸灾乐祸的话,对自己幸灾乐祸一下下也还是蛮不错的。

好像本来想说什么东西可以把我牵在一个地方不想走的。
我想,应该没什么东西做得到。

December 02, 2008

Edward Norton

You're not your job. You're not how much money you have in the bank. You're not the car you drive. You're not the contents of your wallet. You're not your ing khakis. You're the all-singing, all-dancing crap of the world...

November 16, 2008

yes, we can

那一刻,美国的人民聚集到芝加哥,像仰望灯塔一样仰望着他,Barack Obama.
对于这么一个精英阶层的代表,我本来无甚好感,但是我承认,在听到他的victory speech的时候,我也心潮澎湃了。
yes, we can.even though been told that we can't.
想到前两天看完的《贝多芬病毒》里艾玛冯说,我说这些不是因为故作姿态,而是因为我也有过一样的童年,住集装箱,把自己唯一拥有的自行车,书包全部卖掉去比赛,并且最后还是没有赢。就是这样的我,告诉自己,我也可以。(童年和我好相似)。

November 12, 2008

人生果然是起伏不定的

我一直觉得我怎么忽然就那么心情美好呢。然后就忧郁了。

第一次被邀请去Mask Gala,可是我既没有晚礼服,也没有面具。我只有一大堆要due的assignment和deadline的project。

猪和我说,要不要一起去丽江。sr说,要不要这周一起去南丫岛。par说,去UA cinema看电影吧。我说,对不起...

discrete mathemetics的midterm拿了94.5/100.大概是我所有midterm里最好的一门了。algorithm的midterm拿了13/23.大概是我所有midterm里最差的一门了。虽然还不知道operating system,data structure,Java 和ai.

最近开始有希望人生可以重来的傻叉想法。开始考虑做事情的后果。这么多年了,无论是对自己的人生还是对自己的电脑,我好像都是一时冲动。一直都觉得没什么。最近忽然很讨厌那个样子的自己。

anyway,我只是想过有趣的生活而已。

November 02, 2008

Tic-Tac-Toe

某人和我讲说,blog要技术含量啊技术含量。
我想了想,于是把做的minimax implementation in prolog贴出来纪念。

我想也许以后我都不会再去写prolog的程序了。
虽然这个语言确实是很可爱。

第一个algorithm是用huristic找goodmove:
:- dynamic o/1.
:- dynamic x/1.

not(Z) :- Z,!,fail.
not(Z).

ordered_line(1,2,3). ordered_line(4,5,6). ordered_line(7,8,9).
ordered_line(1,4,7). ordered_line(2,5,8). ordered_line(3,6,9).
ordered_line(1,5,9). ordered_line(3,5,7).
line(A, B, C) :- ordered_line(A, B, C).
line(A, B, C) :- ordered_line(A, C, B).
line(A, B, C) :- ordered_line(B, A, C).
line(A, B, C) :- ordered_line(B, C, A).
line(A, B, C) :- ordered_line(C, A, B).
line(A, B, C) :- ordered_line(C, B, A).

full(A) :- x(A). full(A) :- o(A). empty(A) :- not(full(A)).

same(A, A).
different(A, B) :- not(same(A, B)).

move(A) :- good(A), empty(A), !.

/* Strategy */
good(A) :- win(A).
good(A) :- block_win(A).
good(A) :- split(A).
good(A) :- block_split(A).
good(A) :- build(A).

good(5). good(1). good(3). good(7). good(9).
good(2). good(4). good(6). good(8).

win(A) :- x(B), x(C), line(A,B,C).
block_win(A) :- o(B), o(C), line(A,B,C).
split(A) :- x(B), x(C), different(B,C), line(A,B,D), line(A,C,E), empty(D), empty(E).
block_split(A) :- o(B), o(C), different(B,C), line(A,B,D), line(A,C,E), empty(D), empty(E).
build(A) :- x(B), line(A,B,C), empty(C).

all_full :- full(1), full(2), full(3), full(4), full(5), full(6), full(7), full(8), full(9).

done :- ordered_line(A,B,C), x(A), x(B), x(C), write('Computer won.'), nl.
done :- ordered_line(A,B,C), o(A), o(B), o(C), write('Human won.'), nl. % should NOT happen
done :- all_full, write('It\'s a tie.'), nl.

equal(X,X).
checkmove(X) :-equal(X,1).
checkmove(X) :-equal(X,2).
checkmove(X) :-equal(X,3).
checkmove(X) :-equal(X,4).
checkmove(X) :-equal(X,5).
checkmove(X) :-equal(X,6).
checkmove(X) :-equal(X,7).
checkmove(X) :-equal(X,8).
checkmove(X) :-equal(X,9).
/*repeated asking if not valid move.*/
getmove :- repeat,write('What is your move? '), read(X), empty(X),checkmove(X),assert(o(X)).

makemove :- move(X), !, assert(x(X)).
makemove :- all_full.

printsquare(N) :- o(N), write(' o ').
printsquare(N) :- x(N), write(' x ').
printsquare(N) :- empty(N), write(' ').
printboard :-
write(' 1 | 2 | 3 '),
printsquare(1),write('|'), printsquare(2),write('|'), printsquare(3), nl,
write('---+---+--- ---+---+---'),nl,
write(' 4 | 5 | 6 '),
printsquare(4),write('|'), printsquare(5),write('|'), printsquare(6), nl,
write('---+---+--- ---+---+---'),nl,
write(' 7 | 8 | 9 '),
printsquare(7),write('|'), printsquare(8),write('|'),printsquare(9), nl.

clear :- x(A), retract(x(A)), fail.
clear :- o(A), retract(o(A)), fail.

% main goal:
play :- not(clear), repeat, printboard,getmove,printboard,write('Thinking...'),nl,makemove,printboard,done.


第二个algorithm是minimax的implementation:
话说写完这个我自己和电脑玩了很久。。

%%%defining global symbols
setflag(Name,X) :-
nonvar(Name), %only constants allowed
retract(flag(Name,Val)), %kill if defined
!,asserta(flag(Name,X)). %freeze & redefine
setflag(Name,X) :-
nonvar(Name), %only constants allowed
asserta(flag(Name,X)). %initial value

%%%strarting the game
new_game(XorO,S) :- setflag(theboard,[[b,b,b],[b,b,b],[b,b,b]]),
Searchdepth is 4,
setflag(sdepth,Searchdepth),
flag(theboard,B), %retrive the blank board
pprint(B),
begin(XorO,S,B,Searchdepth).

begin(x,x,B,Searchdepth) :- %matches if human goes first
write('What is your move?'),tab(2),read(M),check(M,x).
begin(x,o,B,Searchdepth) :-
write('What is your move?'),tab(2),read(M),check(M,o).

begin(o,o,B,Searchdepth) :- %matches if computer goes first
computermoves(B,o,Searchdepth).
begin(o,x,B,Searchdepth) :- %matches if computer goes first
computermoves(B,x,Searchdepth).

%%%user interface rule
check(M,x) :- number(M),M>=1,M=<9 br="" enter="" x=""> write('Invalid move.Try again.'),nl,
write('What is your move?'),tab(2),read(N),check(N,x).
check(M,o) :- number(M),M>=1,M=<9 br="" enter="" o=""> write('Invalid move.Try again.'),nl,
write('What is your move?'),tab(2),read(N),check(N,o).

enter(M,x) :-
flag(sdepth,SD),flag(theboard,B), %recover the board
Row is ((M+2)//3),Col is ((M+2)mod 3)+1,
install(x,[Row,Col],B,NewB), %place 'x'
pprint(NewB),
endgamecheck(NewB), %did he win?
computermoves(NewB,o,SD).
enter(M,o) :-
flag(sdepth,SD),flag(theboard,B),
Row is ((M+2)//3),Col is ((M+2)mod 3)+1,
install(o,[Row,Col],B,NewB), %place 'x'
pprint(NewB),
endgamecheck(NewB), %did he win?
computermoves(NewB,x,SD).

computermoves(Board,x,Searchdepth) :-
choosemove(x,Board,Searchdepth,Movechoice,Maxvalue),
%find the best move;Maxvalue is the largest of choices

install(x,Movechoice,Board,NewB), %compute board
setflag(theboard,NewB), %store new board
write('Thinking...'),nl,pprint(NewB),
endgamecheck(NewB),
write('What is your move?'),tab(2),read(M),check(M,o).
computermoves(Board,o,Searchdepth) :-
choosemove(o,Board,Searchdepth,Movechoice,Maxvalue),
%find the best move;Maxvalue is the largest of choices

install(o,Movechoice,Board,NewB), %compute board
setflag(theboard,NewB), %store new board
write('Thinking...'),nl,pprint(NewB),
endgamecheck(NewB),
write('What is your move?'),tab(2),read(M),check(M,x).

%%%choosing the best move
choosemove(XorO,B,SD,[],10000) :-terminalwin(B).
choosemove(XorO,B,SD,[],-10000) :-terminalloss(B).
choosemove(XorO,B,SD,Posn,Best) :-
NewSD is SD-1, %1 step deeper
genposns(B,Posnlist), %all possible moves from here
evalmovelist(XorO,B,NewSD,Posnlist,Valuelist), %a value for each
bestmove(XorO,Posnlist,Valuelist,Posn,Best). %pick the best


%%%where can we move
genposns(B,Posnlist) :-setof(P,openposn(B,P),Posnlist),!.
genposns(B,[]). %if 'setof' fails,Posnlist should be empty

openposn(B,[R,C]) :- row(R),column(C),install(o,[R,C],B,B1).
row(1). row(2). row(3). column(1). column(2). column(3).

%%%putting an x or o on the board
install(XorO,[1,Col],[BdRow|Rest],[New|Rest]) :-
!,installinrow(XorO,Col,BdRow,New). %move into row
install(XorO,[Row,Col],[BdRow|Rest],[BdRow|New]) :-
Next is Row-1,install(XorO,[Next,Col],Rest,New).

installinrow(XorO,1,[b|Rest],[XorO|Rest]) :-!.
installinrow(XorO,Col,[FirstCol|Rest],[FirstCol|New]) :-
Next is Col-1,installinrow(XorO,Next,Rest,New).

%%%ealuate a list of moves
evalmovelist(XorO,B,SD,[],[]). %empty base case

evalmovelist(XorO,B,SD,[Pos], [Val]):- %1 element list
evalmove(XorO, B, SD, Pos, Val).

evalmovelist(XorO, B, SD, [Pos|P], [Val|V]):-
evalmovelist(XorO, B, SD, P, V), %do the rest of it,
evalmove(XorO, B, SD, Pos, Val). %now the 1st element

evalmove(XorO, B, 0, Pos, Val):- %Basecase; at search limit.
!, install(XorO, Pos, B, B1), %Freeze choice,place the x or o and compute static value
staticvalue(B1, Val).

evalmove(XorO, B, SD, Pos, Val):-
install(XorO, Pos, B, B1), %place the x or o
toggle(XorO, OorX), %move from the resulting choices
choosemove(OorX, B1, SD, Ignore, Val).

toggle(x, o):-!. %Given x or o in one argument, it binds
toggle(o, x):-!. %the other argument to the opposite token

%%%selecting the best from the list
bestmove(XorO,[],[],[],0) :-!. %non possible, give it a zero

bestmove(XorO,[Move],[Value],Move,Value) :-!. %only one, it is the best

bestmove(o,[M1|Othermoves],[V1|Othervalues],M,V) :-
bestmove(o,Othermoves,Othervalues,M,V),
V

>=
V1,!.
bestmove(o,[M1|Othermoves],[V1|Othervalues],M1,V1). %else best is the first


bestmove(x,[M1|Othermoves],[V1|Othervalues],M,V) :-
bestmove(x,Othermoves,Othervalues,M,V), %best=best of the rest if
V
=<
V1,!. %the best of the rest is =<1st .="" br="" freeze="">bestmove(x,[M1|Othermoves],[V1|Othervalues],M1,V1). %else best is the first

%%%evaluate the current board

staticvalue(B,10000) :- terminalwin(B),!.
staticvalue(B,-10000) :-terminalloss(B),!.
staticvalue(B,V) :-
extractrcd(B,RCDlist),evallist(RCDlist,V).

extractrcd([[SQ11,SQ12,SQ13],[SQ21,SQ22,SQ23],[SQ31,SQ32,SQ33]],
[[SQ11,SQ12,SQ13],[SQ21,SQ22,SQ23], % 1st 2 rows
[SQ31,SQ32,SQ33],[SQ11,SQ21,SQ31], % 3rd row ,1st col
[SQ12,SQ22,SQ32],[SQ13,SQ23,SQ33], % last 2 cols
[SQ11,SQ22,SQ33],[SQ13,SQ22,SQ31]]). % 2 diagonals

evallist([L],V) :-!,eval(L,V). %only first list,evaluate it
evallist([L1|Lr],V) :-evallist(Lr,V1),
eval(L1,V2),
V is V1+V2.
eval([b,b,b],0) :-!.
eval(L,V) :-numberof(x,L,Nx),numberof(o,L,No),
val(Nx,No,V).
numberof(Char,[],0).
numberof(Char,[Char|Y],N) :-numberof(Char,Y,Nrest),
N is Nrest+1,!.
numberof(Char,[X|Y],N) :-numberof(char,Y,N).

val(Nx,No,0) :-Nx
>0,No>
0,!.
val(Nx,0,V) :- !, V is -(Nx ** 3). %V is -Nx^3
val(0,No,V) :- !, V is (No ** 3).

%%%recognizing the end
endgamecheck(B) :- terminalwin(B),!,
write('Computer win.'),nl,abort.
endgamecheck(B) :- terminalloss(B),!,
write('Human win'),nl,abort. %should not happen.
endgamecheck(B) :- fullboard(B),!,
write('It is a tie.'),nl,abort.
endgamecheck(B).

terminalwin(B) :-extractrcd(B,RCDlist),
o3(RCDlist).

o3([[o,o,o] | Rest]) :- !.
o3([Head | Rest]) :- o3(Rest).

terminalloss(B) :- extractrcd(B, RCDlist),
x3(RCDlist).

x3([[x,x,x] | Rest]) :- !.
x3([Head | Rest]) :- x3(Rest).

fullboard([Row1,Row2,Row3]) :- not(member(b,Row1)),
not(member(b,Row2)),
not(member(b,Row3)).

%%%printing out the board
pprint([[S11,S12,S13],[S21,S22,S23],[S31,S32,S33]]) :-
tab(2), write(' 1 | 2 | 3 '),tab(5), pprintrow(S11,S12,S13),nl,
tab(2),type2,tab(5), type2,nl,
tab(2), write(' 4 | 5 | 6 '),tab(5), pprintrow(S21,S22,S23),nl,
tab(2),type2,tab(5), type2,nl,
tab(2), write(' 7 | 8 | 9 '),tab(5), pprintrow(S31,S32,S33),nl.

type1 :- tab(5), write('|'), tab(5), write('|'), tab(5).
type2 :- write('---+---+---').

pprintrow(C1, C2, C3) :- write(' '),
pprintchar(C1),
write(' | '),
pprintchar(C2),
write(' | '),
pprintchar(C3),
write(' ').

pprintchar(b) :- write(' '), !.
pprintchar(Char) :- write(Char).

%%%some definition
not(Z) :-Z,!,fail.
not(Z).

member(X,[X|Tail]).
member(X,[Head|Tail]) :- member(X,Tail).

October 26, 2008

故事

“然而故事开始的意义,并不在于它会结束,而在于之后更多的故事。“

October 25, 2008

宿命的熊猫

说实在的,比起《功夫熊猫》这部电影,关于电影的许多评论更加让人印象深刻。

网络真的是个好东西,它不但大大增加了中国信息的流动性和透明性,也极大地释放了中国民间久被压抑的巨大创造力。


这只熊猫,披着励志的外衣,本质上还是宿命论。
其实宿命论是无可奈何的选择,因为这样起码不需要去解释为什么英雄救必须是这只熊猫,而不是他的鸭子爸爸或者路人甲乙丙丁(猪或兔子)。
这个问题根本就是没法解释的吧?
谁能保证你就是你的世界里那唯一的一只熊猫?在一百万分之九十九万九千九百九十九的可能下,你都只是一只猪或者一只兔子而已。即便你也有一个功夫的梦想,即便你也很想努力,Master乌龟也不会莫名其妙地指定你做龙战士。
我们中的大部分人,就只能这么平凡至死。

October 21, 2008

孤独

"本杰明有部作品,叫《没有人会飞,没有人会记得》。
放荡不羁的漫画家,无条件爱他的傻女孩,这样的故事总会有一个结局。
到结局的那一天,即便他在大街上都画满她的身影,她也再不会回来。
无论多么倔强的头颅,最终也会被生活压低吧?
其实真的没有人会飞。

也没有人会记得。"

October 18, 2008

痛快的工作,痛快的玩

我们以为自己明白的,
真的明白吗?

October 12, 2008

写给过期的Halloween

“是为了得到这种快乐,才干这份工作的吧。”

仿佛是全然忘记了自己当初选择的原因,渐渐和所有自己以前所不屑的人一样,比较,权衡,职业化,为了所谓的胜利和高人一等的感觉而做着现在所做的事情。

常常感觉寂寞,觉得孤单,觉得不被理解,觉得没有人再会理解自己的心情了。
可是,回想起来,到底是被人所抛弃的自己,还是选择被抛弃的自己呢--在CU被通知也无视的自己,对所有人都冷冷无所谓的态度的自己,依赖转系生又选了一堆3字开头专业课的冲动当理由回避所有应当出席地点的自己。
对猪说,你来吧,但把她带去图书馆的自己。
我真的,就那么理直气壮,那么认真工作么。

从什么时候开始,开始变成如此冷漠的一个人,渐渐被自己忽略的手机,无视的莊会,一起从浙大来的朋友说,一起去吃海鲜吧,一起去海洋公园吧,一起……我总说,对不起,我要考试,我要写代码,我要做project,我还有很多assignment没有写。其实,有时候,自己也还是躲在寝室里关起门来睡觉或者看动画。

今天忽然发现,一个朋友的生日过了,Halloween过了,一张cinema的券就要过期了,而和爸爸妈妈也已经很长很长的时间没有联系了。
难道这就是我所希望的效率化的生活吗?
我当真,快乐吗?
我当初,为什么要放弃自己所拥有的东西?难道这就是理由吗?
我所有,用来当借口的学习的理由,真的是理由吗?
我现在,所有不快,痛苦,纠结的原因,真的不是自己一手造成的吗?

很久以前就明白的,痛快的工作,痛快的学习,我现在,真的还明白吗?

我所遇到的,情感上的,生活上的,纠结的事情,从某种意义上来说,都是可以解决的吧。
因为自己的软弱,不想丢失别人的帮助,而过分的依赖某些人,真的让自己很失望。

我想知道,自己不仅要一个人坚强的活下去,也要和大家一起,快乐的活下去呢。

会快乐吗?