月度归档:2012年02月

『造梦的雨果』

『造梦的雨果』是一部获奖无数的少儿文学作品,适宜人群为12-16岁之间,因为它涉及了梦想、责任、诚信、希望、爱心、亲情和好奇心,而这些特征正是懵懂少年们需要和具备的。

少年雨果自从父亲意外被火烧死以后就一直与他的酒鬼伯父一起生活,伯父的职业是火车站27口大大小小的钟的管理员,每日负责为钟校对时间和上发条。从小对机械感兴趣雨果自然也对钟表和其他机械人特别感兴趣,他目前最大的梦想就是修理好一个机器人,这个机器人是他的父亲在博物馆里发现的,因为它的手上握着一支笔,所以父子两人就猜想修好以后的机器人会写些什么东西,当他的父亲不幸发生意外死去后,孤独的雨果决定一个人按着父亲留下的笔记本完成这项工作,这个时候的雨果把希望都寄托在了这个残缺的机器人身上,“他感到机器人写出来的东西肯定会回答他所有的问题,告诉他在孤独的时候应该怎么办,它写出来的东西能够拯救他。” 所以他要去玩具店偷些材料来,不幸的是,偷东西被抓,笔记本被老板乔治没收,凭着自己对机械的理解以及朋友们的帮助,雨果在没有笔记本的情况下修理好了机器人。上了发条之后,机器人画了一幅画,这幅画的内容雨果听他父亲描述过,来自于一部早期的电影,关键是,机器人的落款是乔治·梅里爱,就是那个玩具店的老板乔治。至此机器人之谜解开,这个机器人是乔治制作的,它冰冷的身上凝固了乔治大量的心血和想象力。乔治·梅里爱本是一个魔术师,在卢米埃尔兄弟发明电影之后,他就转行做了电影导演,在他看来,电影和魔术一样,都可以造梦,电影的片场就是一个造梦的地方,他拍了上百部电影,最后因为战争、行业竞争等关系,公司破产,团队解散,乔治·梅里爱将电影出售,胶片被融化做成了鞋跟,他本人亦屈身于火车站旁经营一个小玩具店,外界传闻他已死去。书中有一个伏笔,乔治一直无法容忍鞋跟与接触地板发出的声音,因为那是他的电影灰飞烟灭的声音。

童话总是美好的,雨果的努力不仅重新振作了乔治·梅里爱,也拯救了自己的生活。长大以后,雨果成了魔术师,又一个造梦者。

随着由此书改编的『雨果』冲击多项奥斯卡大奖,我想世界会兴起一股乔治·梅里爱热,一部向电影先驱者致敬的电影题材无疑会为其获奖添加重要砝码。书中机器人画的那张画是乔治·梅里爱所导演的『月球旅行记』的剧照,这部电影同时也是世界上最早的一部科幻电影。关于乔治·梅里爱的生平可参见magasa的这篇文章『梅里爱之败』

--EOF--

SimpleXML函数库在豆瓣API调用中的应用

SimpleXML是PHP5提供的一套用于处理XML的函数库,它通过simplexml_load_file和simplexml_load_string两个函数实现将XML对象转换为simplexml对象(SimpleXMLElement),前者用于处理XML文档,后者用于处理符合XML标准的字符串,程序员可以通过simplexml对象直接读写XML内容。

相比普通XML格式文件,调用豆瓣API返回的结果中有两个地方需要特殊处理:

1. 节点名称中含命名空间。例如<db:attribute />、<db:tag /> 、<gd:rating />等节点分别包含在db和gd的命名空间中,命名空间在XML文件会有定义。对于包含在命名空间的节点名的处理,SimpleXML函数库提供了children函数。通常children函数是用来获得SimpleXMLElement对象的子节点的值,其时,children函数还接受namespace的参数,用来获取当前节点内部指定命名空间中的子节点的值。因此,通过带namespace参数的children函数可以解析上述的<db:attribute />、<db:tag />和<gd:rating />子节点。

2. 节点名称内部包含属性值。例如<db:tag count="63706" name="青春" />,tag节点的内部属性count的值为“63706”,内部属性name的值为“青春”。内部属性的名称和值在一些场合下非常有用,甚至必需。SimpleXML函数库提供了attributes函数来解析节点的内部属性。对一个节点调用attributes函数,会返回一个关联数组,键为内部属性名,值为内部属性值,例如上述的tag节点会被解析为数组:Array ( [count] => 63706 [name] => 青春 ) )。

以我最近比较喜欢的电影『那些年,我们一起追的女孩』为例,这部电影相关信息的API地址为http://api.douban.com/movie/subject/4920528(缓存页面),通过SimpleXML函数库解析返回结果的PHP代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
header("Content-type: text/html; charset=utf-8");//中文支持。
$url = 'http://api.douban.com/movie/subject/4920528';//影片对应的API地址。
$xml =  simplexml_load_file($url); //解析XML文件形式的返回结果。
 
print "id: " . $xml->id . "<br>";//影片ID,URL。
print "title: ".$xml->title . "<br>";//标题。
print "author: ".$xml->author->name . "<br>";//导演。
print "summary: " . $xml->summary . "<br>";//故事梗概。
 
//调用children函数获取db命名空间下的节点数组。
$db_xml = $xml->children('http://www.douban.com/xmlns/');
//var_dump($db_xml); //db命名空间只包含attribute节点和tag节点。
foreach($db_xml->attribute as $obj){//遍历所有<db:attribute />节点。
	print "db:attribute: ";
	$attrname = $obj->attributes();//调用attributes()函数获取内部属性数组。
	foreach($attrname as $key=>$value){//遍历当前节点的所有内部属性。
		print $key . "=>" . $value . " ";
	}
	print $obj . "<br>";
}
//<db:tag />节点的解析同<db:attribute />。省略。
 
//获取gd命名空间下的节点的方法同db命名空间。省略。
?>

上述程序的运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
id: http://api.douban.com/movie/subject/4920528
title: 那些年,我们一起追的女孩
author: 九把刀 Giddens
summary: 柯景腾(柯震东 饰)、老曹(敖犬 饰)、勃起(鄢胜宇 饰)、该边(蔡昌宪 饰),
、阿和(赦绍文 饰),从国中到高中,一直是不离不弃的死党。他们都对班花沈佳宜(陈妍希 饰)
有着一种纠结的感情。一方面,他们瞧不起这种只会用功读书的女生,另一方面他们又为她的美好
气质倾倒。因为学习成绩较差,柯景腾被老师安排坐在沈佳宜前面。因为他的一次英雄救美,她开始
用强制的方式帮他补习功课。此事令其他兄弟羡慕嫉妒恨,但是大家都未说破。毕业后,柯景腾和
沈佳宜在各自大学保持恋人般的联系。直到他举办比武大会,事情才出现了变化…… 本片根据导演
兼编剧九把刀在2007年的自传体小说改编。柯震东凭借本片获第48届金马奖最佳新演员。©豆瓣
db:attribute: name=>director 九把刀
db:attribute: lang=>zh_CN name=>aka 那些年,我们一起追的女孩
db:attribute: name=>movie_type 剧情
db:attribute: name=>movie_type 喜剧
db:attribute: name=>movie_type 爱情
db:attribute: name=>website www.appleofmyeye.com.tw
db:attribute: name=>movie_duration 110分钟(港澳台)
db:attribute: name=>movie_duration 100分钟(中国大陆)
db:attribute: name=>year 2011
db:attribute: name=>writer 九把刀
db:attribute: name=>language 汉语普通话
db:attribute: name=>imdb http://www.imdb.com/title/tt2036416/
db:attribute: name=>aka You Are the Apple of My Eye
db:attribute: name=>aka 나사년, 아문일기추적녀해
db:attribute: name=>aka あの頃、君を追いかけた
db:attribute: name=>aka 那些年,我們一起追的女孩
db:attribute: name=>aka 那些年,我们一起追的女孩
db:attribute: name=>title 那些年,我们一起追的女孩
db:attribute: name=>country 台湾
db:attribute: name=>pubdate 2011-08-19(台湾)
db:attribute: name=>pubdate 2011-10-20(香港)
db:attribute: name=>pubdate 2012-01-06(中国大陆)
db:attribute: name=>cast 柯震东
db:attribute: name=>cast 陈妍希
db:attribute: name=>cast 敖犬
db:attribute: name=>cast 郝邵文
db:attribute: name=>cast 蔡昌宪
db:attribute: name=>cast 鄢胜宇
db:attribute: name=>cast 弯弯
db:attribute: name=>cast 邱彦翔

更多的SimpleXML函数库用法可参见官方文档

--EOF--

『右一刀』

李承鹏球评人出身,如今已转行,虽然还是写文章,但内容多半是楼评社评,甚至影评,唯独不再写球评。曾经,他是个由着自己个性写作的人,写文章就像玩文字游戏。

凡是看不惯的东西,都会被大眼无情批判。为缅怀张国荣,F4躺着中枪成为“狗粮”。他痛诉房产行业无良把原本用来补充体力、忘掉忧愁的地方变为每天做噩梦的地方,批判城市规划的不合理,酒楼、地铁、交通等无一幸免。甚至,香港人圣诞疯狂购物也被视作他们受到资本家压迫导致心理扭曲后的一次发泄……凡是看得顺眼的,有缺点也是一种美,他认为“人类本身就有缺点,缺点是人性中最重要的元素,否则人就成神仙了,而神仙是宇宙中最无趣的一部分”。所以他“不怕把拇指摁断”也要给李宇春投票,所以他高喊“啃老无罪”,认为“啃老只是把老一辈占了国家的太多便宜匀一点到这一辈身上”……

大眼笔下的江湖是有趣的,因为他有着球评人中最犀利的文笔;大眼笔下的江湖是无趣的,因为他把才华都耗在了类似中国足球和房地产这些操蛋的事情上。

--EOF--

短网址API调用实例(PHP实现)

短网址是随着微博的流行而出现,目前市面上的短网址服务林林总总不计其数,评价一个短网址服务好坏的最重要标准是其服务的稳定性。试想,短网址服务做的工作就是为原先的长网址加一层映射关系,而这种映射关系是握在短网址服务提供商手上的,如果这个环节出了问题,导致映射关系丢失,那也就意味着再也无法找回原先的长网址。

以上差不多都是废话。

国内外比较有实力的短网址提供商如goo.gl(Google)、dwz.cn(百度)、is.gd等都提供了API的方式供外部生成短网址,该方式只需模拟一个HTTP请求,以长网址作为参数向服务器发送该请求,如果请求成功,服务器就会返回缩短以后的短网址。

有些API要求将HTTP请求以POST方式提交,例如goo.gl和dwz.cn(demo),这时可以采用基于PHP的cURL库来完成HTTP请求的发送和接收。以goo.gl为例(更多细节可参考『Google URL Shortener API』):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$apiKey = 'APIKEY'; //google短网址所需。
//API key从http://code.google.com/apis/console/得到
$postData = array('longUrl' => "http://fengchj.com", 'key' => $apiKey);
$jsonData = json_encode($postData);
$co = curl_init();
curl_setopt($co, CURLOPT_URL, 'https://www.googleapis.com/urlshortener/v1/url');
curl_setopt($co, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($co, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($co, CURLOPT_HEADER, 0);
curl_setopt($co, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt($co, CURLOPT_POST, 1);
curl_setopt($co, CURLOPT_POSTFIELDS, $jsonData);
$strResponse = curl_exec($co);
curl_close($co);
$arrResponse = json_decode($strResponse );
print $arrResponse->id; //得到http://goo.gl/xxxx类型的短网址。

有些短网址服务API接受以GET方式提交的长网址,例如is.gd,用户只需将长网址作为参数向提供商给出的URL发送请求即可,如:

1
print file_get_contents("http://is.gd/create.php?format=simple&url=http://fengchj.com");

实际上这里也可采用cURL库进行GET方式HTTP请求的封装,但是由于GET方式的幂等特性,用file_get_contents来请求给定URL页面更为方便。相对于cURL库,file_get_contents方式的缺点在于无法对HTTP请求过程进行错误处理。

调用外部API生成短网址的效果可参见http://fengchj.com/?page_id=1619

--EOF--

解决网站被Google降权的问题

至去年12月份博客开通已有半年,通过CNZZ站长统计工具探得当时流量每日有两位数的独立IP,三位数的PV。但是从12月份的某一天开始,网站的流量忽然降为个位数。因为百度对WP并不友好,我的搜索引擎入口主要来自Google,占95%以上。因此很明显是Google排名出了问题。之前我未对博客尝试过任何SEO技巧(安装利于爬虫抓取的WP插件、静态化等),一来因为精力和经验有限,无暇顾及,二来当初开通博客的目的在于梳理所学知识,并不在意流量。但是被Google这样选择性地忽视掉,心里还是略有不甘的。去网上看了些SEO的资料,结合网站的情况,基本确定是被Google降权了。

被Google降权的原因有很多种,可能性比较大的一种是垃圾评论太多。Google Spider会将WP的每条评论都当成一个拥有独立URL的页面来处理,在当时,我博客上的垃圾评论有400多条,这些垃圾评论的共有特征是带有至少1个、至多10+个外部链接,这些链接都是链到垃圾网站的,加上Google对垃圾网站的处罚非常严厉,估计就此认定本站也是垃圾网站。针对这个可能引起的原因,我通过一些WP自带的站点设置,比如提升评论权限,创建垃圾评论屏蔽规则,另外安装了一个据说WP平台上最流行的反垃圾评论插件Akismet,希望能早日恢复站点在Google的权重。网上有人说,Google恢复站点权重最快只要24小时,于是我便开始等,这一等就等了两个多月,这两个月来,Akismet为我拦下了垃圾评论2400+条。几天前,我去Google搜索站名关键字,排名已重新排在了首位,CNZZ中亦显示PV有所恢复,被Google降权的问题基本解决。

在此提个醒,垃圾评论对于网站有百害而无一利,垃圾评论越早屏蔽越好,宁可错杀一千,也不可漏过一条。

--EOF--