Amour GUO's Blog

得之我幸, 失之我命.

Monthly Archives: 3月 2010

爱丽丝梦游仙境

早就在时光网的一次观影活动上订了一张《爱丽丝梦游仙境》在UME首映的票,爸爸妈妈对凌晨去看电影表示很难理解,说我是疯子,其实偶然做做疯子也提好的,只是晚上回家太晚估计会影响爸妈休息了,有些愧疚。
到了电影院了,突然想起来今天是限行的,老是生活在五环以外,对这个都有点淡忘了,不过后来听说11点之后是不在限行之列的。
时光网在UME的放票处还给每个领票的人都照了相,不知干嘛用。

书归正传,说说电影。
电影开始部分,很多原书的影子,看过书的人再去看电影感觉会更好一些(我只看过Alice’s Adventures In Wonderland, 没看Through the Looking-Glass, 好像电影中有一些角色也有是取自后者的),看书的时候虽然也会有插图,但始终不够丰满,总是会继续去想像各个角的样子,而在电影中,你可以一一去印证你的心中的各个角色与电影中的差别,
说一下对电影的比较具体的一些感觉:
最杯具是红心皇后的那只倒霉的鹰怪,
还有一个比较杯具的是Jabberwocky的名字,被翻成了"炸脖龙",
处理的最传神的是那只偷嘴的青蛙,
最无厘头的就是白心皇后了,
最经典的一句话当然非"Off with his/her/their head(s)!"莫数了,
睡鼠在电影里边一直也没睡觉,
红心武士的马说:"Dogs will believe anything",觉得我就象那只dog,
最喜欢的角色是柴郡猫,呵呵,优哉游哉,不去做坏事,也不去逞英雄,却总是在该出现的时候出现,
看来迪斯尼挺在意中国市场,最后Alice也象Google一样都跑香港去了,估计如果有续集的话会在中国拍也不是没有可能的了。
回到家已经2:00am了,洗洗睡了,天亮还要上工。

我记得的一些人物列表:
爱丽丝(Alice)
疯帽子(The Mad Hatter)
红皇后(The Red Queen)
白皇后(The White Queen)
红心骑士(The Knave of Hearts)
大白兔(The White Rabbit)
渡渡鸟(The Dodo)
蓝毛虫(The Caterpillar)
柴郡猫(The Cheshire Cat)
三月兔 (The March Hare)
睡鼠(The Dormouse)
红心骑士 (The Knave of Hearts)
胖胖兄弟(Tweedledum and Tweedledee)
炸脖龙(Jabberwocky, 有人喜欢他嘛?)
鹰怪(格里芬/Gryphon?)
鱼仆人(The Fish-Footman)
蛙仆人 (The Frog-Footman)
大狗贝亚德(Bayard)
大毛兽(The Bandersnatch)
其他群众演员…

CGI Server Push(CGI Comet) study

Lately we got a requirement about CGI Server Push implementation with plain CGI(aka: CGI Comet) from one of our clients,
I’m not familiar with C, so spent a couple of days making some studies,
And here is what I got so far:

First, CGI Server Push is technically feasible, but  it’s quite a departure from standard HTTP usage, which leads to several problems:
    1) There are unfortunate memory implications, because the message keep accumulating, and the browser retains all of that. All messages pile up in memory and on my POC app, Firefox got crashed after it keep running for 40 minutes. (A periodic refresh is a workaround here to solve this problem, say every 10 minutes, we should restart the long lived connection, that will be not pure PUSH, it becomes PUSH + PULL, but at least it works);
    2) The Two HTTP Connection Limit Issue, I remember this topic has been discussed in our team before, browsers typically only allow 2 concurrent HTTP connections per server. If a browser session has two HTTP connections already, any further connection requests will have to wait until one of these two HTTP connections is finished, but a long lived connection we use to implement PUSH is endless;
    3) The development cycle will be longer if we use CGI Server Push; Since I haven’t found a mature opensource framework for CGI PUSH so far, so we need to do a lot of work by ourselves;

If we really need to do that, here are the 2 options we can choose(actually there are also some other solutions for comet, but do not fit our case, so ignored them):
    1) XmlHttpRequest + Message delimited by a special token;
        The solution here is when XHR status is 3(means there is data comes in), then parse the response string and only look at the last valid value, and then invoke a JS method with the value(in JSON, XML or other data object);
    2) Hidden Iframe + Page Streaming with <script> tag;
        Every time browser engine encounter a </script> tag, the script in the tag pair will be excuted, so we can push script to client in denomination of script tag pair;
    Both of the 2 approaches need to restart the long lived connection in a while(I think 5 to 20 minutes is OK) to avoid the increasing memory consuming issue;

Also attach a snippet of a very simple POC on this subject:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//amourguo(at)gmail.com

int main()
{
  time_t t;
  struct tm *p;
  //printf("Content-Type:multipart/x-mixed-replace;boundary=amourboundary\r\n\r\n");//for non-IE browsers only
  printf("Content-Type:text/plain;");
  printf("Cache-Control:no-cache\r\n\r\n");
  while(1)
  {
    t = time(NULL);
    p = localtime(&t);
printf("–amourboundarystart");
    //printf("Content-Type: text/plain\r\n\r\n");
    printf("%d-%d-%d %d:%d:%d",p->tm_year+1900,p->tm_mon+1,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
printf("–amourboundaryend");
fflush(stdout);
sleep(1000);
  }
  //printf("–amourboundary–\r\n");
  return 0;
}

P.S.
Since DWR already provide the well-tested mature solution, and we are more fimiliar with that way,
So, if there is any chance, We should not give up talking our client into using DWR, it means LOW risk and agile development for us;
If our client persists in using plain CGI, then we will have a long way to go~