Monday, June 30, 2008

Memories of Murder (殺人回憶)

雖然韓劇已經紅了很久了,但我還是一部都沒看完過 (大長今、順風婦產科有看個片斷),但近幾年的韓片真是讓人無法錯過。剛開始會覺得韓片蠻像日片的感覺,尤其是鬼怪片,營造的感覺和題材都接近日本鬼怪片。但除了一些比較老套的題材外,也會有一些意外之舉,像是之前的朴贊郁的復仇三部曲(復仇, Old Body, 親切的金子)就真的令人非常印象深刻。而這一部殺人回憶又是一部讓人難忘的片子。

這部片第一個給人的印象是,雙腳凌空飛踢真的是生活中可以使出的招式 :)

再來就是刑求。還記得以前看香港變態片時,到最後總是要來個警察刑求逼供這種事,你總要告訴自己這個被刑求的傢伙以前幹了什麼事才不會同情他,而且通常這些傢伙都是忍耐力過人,所以警察才能玩許多花招...,一直覺得很奇怪,難道香港警方不覺得這種片會破壞形象嗎?但本片不像這些變態片,觀眾並沒有看到兇手行兇,要如何把刑求這件事說得不讓人太過反感,除了恢諧的手法外,讓觀眾站在警察的角度,體會警察的無力感也是重要的因素 (當然無力感的主因是當時落後的辦案技術啦)。

片中像是空襲演習,示威抗議的情節,有類似經驗的我們應該會覺得會心一笑吧。
== 以下感想和情節有關 ===



劇情的主線還是這一系列的重大刑案。這麼重大的案件,而且到現在仍未破案,要如何去呈現這種對警察及社會的打擊?是否會把故事說得讓人沈重的化不開嗎?還是後來暗指某個兇手呢?片中兩個不同性格的警察,開始莽撞粗暴的,因了解莽撞無助偵查而變得自制,但開始講究科學辦案的卻因無力感而喪失理性,如果個性的轉換能說服觀眾,就能進入劇情的氛圍,我想本片是成功的。導演奉俊昊第二部長片就如此成功,接下來的駭人怪物也大賣,真是成功的商業片導演。

最後一段不只呼應開頭場景,也加強了劇情了不時透露出的"遺憾",真是讓人印象深刻。多次出現的構圖,是否仍在凝視著逍遙法外的兇手呢?

Wednesday, June 25, 2008

在 blogger 內文中使用 google maps api

Blogger.com 號稱是最自由的 Blog Service Provider,可以不放廣告,也沒有篇數留言數的限制。是不是最自由我不確定 (因為我沒認真用過其它的系統),但我知道 Blogger 的 template 系統真的很難搞,首先就是他的 template 使用 xml 語法真是我最不喜歡的做法,要用到比較複雜的控制時,寫出來的 template 都是難看到一個程度 (如果寫得出來的話,凡是用 xml 來充當語法的都很糟),更別提那個 module layout 系統,如果是乖乖的只用它提供的拖拖拉拉系統的話,或許還會覺得蠻好用的,不過想要改一下 html 佈局時,打開他的 module 原始碼就會讓你昏倒了。再來就是他強制中獎使用 iframe 的 Navbar 和 WidgetManager ,讓你的網頁怎麼寫都不可能通過 XHTML 1.0 Strict 的 validate。還有他預設把換行改成
,但又不會聰明跳過 pre, code 不處理,造成在網頁上放 javascript 程式時的麻煩
==== 抱怨分隔線 ====

一般來說,在 blog 使用 JavaScript 通常都是放到側邊裡,做來顯示一些小工具等等,在 blogger.com 中就是要改 template,雖然 template 難看,倒也沒為難使用者,想用的都可以正常使用。但如果是在 blog 內文中要放 JavaScript 時就會遇到上面說的 <br /> 問題 (還好並不會過濾掉 <script> )。例如你在內文中寫
<script type="text/javascript">
google.load("maps", "2");
google.setOnLoadCallback(function(){
  var map = new google.maps.Map2(document.getElementById("map"));
  map.setCenter(new google.maps.LatLng(23.63446,120.970459), 7);
});
</script>
後來輸出的文章就會變成
<script type="text/javascript"><br />google.load("maps", "2");<br />google.setOnLoadCallback(function(){<br />  var map = new google.maps.Map2(document.getElementById("map"));<br />  map.setCenter(new google.maps.LatLng(23.63446,120.970459), 7);<br />});<br /></script>
想當然就不會正常執行。這個問題避開的方法最好的就是關掉把換行轉為 <br /> 的設定,不過因為這個設定是 global 的,會影響到所有的文章,所以除非一開始就這樣設定,不然後來再改等於要修改之前所有的文章。不然就是要把程式寫成一行,這樣就不會被 <br /> 影響了,要達到這個做法第一個就是自己動手改,另一個方式就是在程式頭尾都加上註解,如下
<script type="text/javascript">/*
*/google.load("maps", "2");/*
*/google.setOnLoadCallback(function(){/*
*/  var map = new google.maps.Map2(document.getElementById("map"));/*
*/  map.setCenter(new google.maps.LatLng(23.63446,120.970459), 7);/*
*/});/*
*/</script>
這樣最後的輸出就會正好把 <br /> 註解掉,很蠢但會動 (前提是你的 Script 可以被寫成一行) :)

再來就是和 google maps api 有關。如果你在文章中用 maps api 時使用下面的方法載入程式
<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2.x&key=ABCD">
如果當你兩篇文章都使用到 maps api 並同時出現的話,上面的主程式就會被載入兩次,雖然使用上不會有問題,但卻是無意義的浪費頻寬 (maps api 蠻大的)。這個問題的解法一是把上面那段放到 template 中,而在本文中不再載入,但這樣做當你的 blog 中沒有用到 maps api 時,也會強制載入。第二個方法就是用 ajaxlib 來載入 maps api,也是官方使用範例:
<script type="text/javascript" src="http://www.google.com/jsapi?key=ABCD"/>

google.load("maps", "2");

google.setOnLoadCallback(function(){
  var map = new google.maps.Map2(document.getElementById("map"));
  map.setCenter(new google.maps.LatLng(23.63446,120.970459), 7);
});
使用時一樣是把載入 http://www.google.com/jsapi?key=ABCD 這段放到 template 中,不過還好這玩意兒很小,而在每一篇要用到 maps api 的地方都使用 google.load 和 google.setOnLoadCallback 。雖然看起來好像變麻煩了,但這樣的好處是當多個地方都這樣用時,maps api 主程式的部分不會重複載入,而且現在 ajaxlib 已經整合好幾個主流 JavaScript Library 了(例如 jQuery...),快速方便又有良好架構。

Friday, June 20, 2008

Maps API, GTileLayer

要放大圖才是男子漢~~

當瀏覽 Google Maps API 的設計時,會覺得功能相當複雜細緻,當然最簡單的功能按照範例是很容易的,但除了最簡單的功能以外就完全的不容易了。也不知道是不是因為 JavaScript 的文法太自由了,所以文件也就跟著難寫,光看 Google 官方的文件會看得出來一些進階的功能才有鬼。你會想反正是 JavaScript 寫的嘛,大不了就去看 Code 總行了吧,但無奈小氣的 Google 把他們的 API 都進行混淆了,雖然認真看還是可以看出一些頭緒來,但實在是很費力。所以,當Maps API 最好的方法就是去看看別人是怎麼寫的,照著抄就是了。

但學了半天 API,總覺得只能看 Google 提供的地圖不夠過癮,像是如果能用來看一些很不像地圖的地圖…
《清明上河圖》的原畫長528公分,高24.8公分,最早的版本屬於北宋畫家張擇端(1085-1145)的作品,現今典藏在北京的故宮博物院。該圖描繪了清明時節[1]北宋京城汴梁及汴河兩岸的繁華和熱鬧的景象和優美的自然風光。作品以長捲形式,採用散點透視的構圖法,將繁雜的景物納入統一而富於變化的畫捲中,畫中主要分開兩部份,一部份是農村,另一部是市集。畫中有814人,牲畜60多匹,船隻28艘,房屋樓宇30多棟,車20輛,轎8頂,樹木170多棵,往來衣著不同,神情各異,栩栩如生,其間還穿插各種活動,註重情節,構圖疏密有致,富有節奏感和韻律的變化,筆墨章法都很巧妙,頗見功底。這幅畫作對於各種形態的幾何正確描繪性使其負有盛名,也因此被稱之為中國的蒙那麗莎。 ---- Wikipedia
雖然我怎麼看都覺得這應該是地圖,不過既然有人要說這是中國的蒙娜麗莎,那讓我們先來看看真正的蒙娜麗莎長什麼樣,根據阿宅集中地的說法,是男子漢就要放大圖 (握拳...),而且最好是大得一眼看不到全部的大圖,雖然如此,可以是我們還是要一眼就能看到全部:
科科~~

雖然大家不明說,不過其實阿宅都知道看這張圖時,視線的集中點在哪裡…
科科~~

不過藝術品或明星距離阿宅都太遙遠了,還是 cosplay 正妹比較容易讓人親近…
科科科~~


============== 解說分隔線 ==============
程式簡化後的範例請參考(1,2,3,4)

基本上,這個效果是為 Maps 加上自己的 GTileLayer,Tile Layer 可以讓你用一定規則的 url 來形成地圖層,例如 'http://wctang-info.googlecode.com/svn/trunk/imgs/01/{Z}_{Y}_{X}.jpg' 這樣的指定方式 (也可以用 callback 的方式來指定,如果你的 url 比較沒有規則的話)。

要加入 Tile Layer 的方式有兩種,比較單純的就是用 GTileLayerOverlay 的方式加入,這種方式沒辦法沒辦法指定定位的方式,例如這個官方的無趣例子。另一種就是組成 GMapType,這種方式除了 TileLayer 外,還需要 GProjection ,這個 Projection 的用處其實就是要指定把你的 Layer 投影到地圖上的方式。要知道,Maps API 終究還是個看地圖的工具,雖然外表看起來可能是個讓阿宅科科笑的大圖,但程式內部還是認為他是個有經緯度的地圖,所以 Project 就是在做圖片位置與經緯度轉換的工作。不過 Google 只提供了 GMercatorProjection ,這是適合地球經緯度的映射方式,不適合用來放平鋪圖片,所以就要自己寫,把圖片投影成 經度 -180~180, 緯度 -90~90。
  function EuclideanProjection(s){ this.s=s; }
  EuclideanProjection.prototype=new google.maps.Projection();
  EuclideanProjection.prototype.fromLatLngToPixel=function(latlng,zoom){
    return new google.maps.Point( Math.ceil(this.s[zoom].w*(latlng.lng()+180)/360), Math.ceil(this.s[zoom].h*(90-latlng.lat())/180) );
  };
  EuclideanProjection.prototype.fromPixelToLatLng=function(pixel,zoom,unbounded){
    return new google.maps.LatLng( (0.5-(pixel.y/this.s[zoom].h))*180, ((pixel.x/this.s[zoom].w)-0.5)*360, unbounded);
  };
  EuclideanProjection.prototype.tileCheckRange=function(tile,zoom,size){
    if(zoom >= tile.length || tile.x < 0 || tile.y < 0) return false;
    if(tile.x >= Math.ceil(this.s[zoom].w/256)) return false;
    if(tile.y >= Math.ceil(this.s[zoom].h/256)) return false;
    return true;
  }
  EuclideanProjection.prototype.getWrapWidth=function(zoom) {
    return this.s[zoom].w;
  }

  function ImageMapType(name, layerdef, pathpattern) {
    var myCopyright = new google.maps.CopyrightCollection("");
    myCopyright.addCopyright(new google.maps.Copyright('', new google.maps.LatLngBounds(new google.maps.LatLng(-90,-180), new google.maps.LatLng(90,180)), 0, ''));
    var tilelayers = [new google.maps.TileLayer(myCopyright, 0, layerdef.length-1, {opacity:1, isPng:!!/\.png$/.exec(pathpattern), tileUrlTemplate:pathpattern})];
    return new google.maps.MapType(tilelayers, new EuclideanProjection(layerdef), name);
  }


除了程式以外,另一個重點就是圖片來源。
基本上就是要找張夠大的圖,然後分幾個層次縮圖,再把每張縮圖切成 256x256 的小圖組。這工作想必不會是手動來做的,所以一定要找圖片處理工具來做,這方面很出名的工具就是 ImageMagick。下面的 Perl script 是可以指定縮小的比例或尺寸,再自動切成 256x256 的小圖,用到了 ImageMagick 的二個工具:identify, convert 。
#!/usr/bin/perl

use POSIX qw(ceil floor);


my $name = shift;
my $out = shift;
my $resiz = shift;
my $quality = shift;

my $unit = 256;

if(! defined $name || ! defined $out) { die('croppic.pl   ()'); }

$name =~ /(\.\w*)$/;
my $type = $1;

if($resiz) {
  `convert $name -resize $resiz temp$type`;
  $name = "temp$type";
}

`identify $name` =~ /(\S*)\s*(\S*)\s*(\d*)\D*(\d*)/;

print "$3 x $4 ---> ";

my $nw = ceil($3/$unit);
my $w = $nw*$unit;
my $nh = ceil($4/$unit);
my $h = $nh*$unit;
my $siz = $w.'x'.$h;

print "$siz ($nw x $nh) \n";

if($quality) {
  `convert $name -background \#E5E3DF -gravity NorthWest -extent $siz -quality $quality $out$type`;
} else {
  `convert $name -background \#E5E3DF -gravity NorthWest -extent $siz $out$type`;
}

my $ss = $w.'x256';
my $so = $out."_%d$type";
`convert $out$type -crop $ss +repage $so`;

for($i=0;$i<$nh;$i++) {
  $ss = $out.'_'.$i.$type;
  $so = $out.'_'.$i."_%d$type";
  $tt = $unit.'x'.$unit;
  `convert $ss -crop $tt +repage $so`;
  unlink($ss);
}
unlink("$out$type");
unlink("temp$type");
執行完下面這一串後,就產生出一堆小圖了。
croppic.pl monalisa.jpg 3
croppic.pl monalisa.jpg 2 75%
croppic.pl monalisa.jpg 1 50%
croppic.pl monalisa.jpg 0 25%
大圖合體:

Tuesday, June 17, 2008

快快樂樂學 Google Geo API

Google 對於地理地圖相關應用真是越來越多彩多姿,一開始由 Google Maps API 出發,延伸出 Mapplets API, Static Maps API, Maps API for Flash, 整合導航資訊交通流量Streat ViewGeocode,一直延伸到 Google Earth Plug-in API,還有 Google Earth 上的進展,像 3D 模型,45度視圖,整合相片,YouTube,和超級多相關的地理資訊,甚至 Google Sky 更是超有創意的應用。也才只是在不久前,在網路上要找地圖是多困難的事,不僅有提供地圖的服務極少,品質不好,而且操作起來十分難用,一格一格的,按一下方向等個半天。

以編程的角度來說,Maps API 的用法也慢慢的有點改變,比起以前的用法更方便,限制也更少。這裡收集一些 API 的最簡範例,算是"快快樂樂學 Geo Programming" 吧。

最簡單的是 Static Maps API,Static Maps API 就是你給 Google 一個 url 指示要顯示哪裡的地圖, Google 就回傳給你一張圖,就這樣。像是
http://maps.google.com/staticmap?center=23.63446,120.970459&zoom=7&size=512x512&key=ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSsTL4WIgxhMZ0ZK_kHjwHeQuOD4xQJpBVbSrqNn69S6DOTv203MQ5ufA
這樣的網址,就會顯示一張圖: 其中的參數像 center, zoom, size 都很明顯,比較麻煩的是 key 這個參數,幾乎所有的 Google Maps 相關的 API 都會需要這個 key,雖然有點麻煩,但也只是要在這裡申請,馬上就拿到了,至於申請的網址要填什麼,因為在測試階段(在 Local 端使用,在 Static Maps API 的情況就是顯示圖片的 request 不是由其他網站 redirect 來的),其實 Google 的 API 是不會真的檢查 Key,所以申請網址就隨便寫就行了。

再來就是 Google Maps API。Google Maps API 是個 JavaScript Library,除了圖資是在 Server 端外,其他所有的動作都是在 Browser 上執行。最完整的說明當然是官方文件。自己在測試時是不用申請 api key 的,直接打開記事本,塞進下面這段 code:
<!DOCTYPE html "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Hello Google Maps!</title>
<script type="text/javascript" src="http://www.google.com/jsapi?key=ABCDEFG"></script>
</head>
<body onunload="GUnload()">
<div id="map" style="width:512px; height:512px"></div>

<script type="text/javascript">
google.load("maps", "2.x");

// Call this function when the page has been loaded
function initialize() {
  var map = new google.maps.Map2(document.getElementById("map"));
  map.setCenter(new google.maps.LatLng(23.63446,120.970459), 7);
}

google.setOnLoadCallback(initialize);
</script>
</body>
</html>
存檔為 googlemapsapi.html,用 browser 打開,就完成了。


再下來是 Google Earth Plug-in API。Google Earth Plug-in API 是 Google 開發的一個 Browser Plug-in,在 Browser 上做出一個比較簡化的 Google Earth,而且支援用 JavaScript 來做為 Scripting language。首先安裝這個 Plug-in,之後再用記事本塞進這段:
<!DOCTYPE html "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Hello Google Earth!</title>
<script type="text/javascript" src="http://www.google.com/jsapi?key=ABCDEFG"></script>
</head>
<body>
<div id="map3d" style="width:512px; height:512px"></div>

<script type="text/javascript">
google.load("earth", "1");

function initCallback(ge) {
  ge.getWindow().setVisibility(true);
  var lookAt=ge.createLookAt("");
  lookAt.setLatitude(23.63446);
  lookAt.setLongitude(120.970459);
  lookAt.setAltitude(800000);
  ge.getView().setAbstractView(lookAt);
}

function initialize() {
  google.earth.createInstance("map3d", initCallback);
}

google.setOnLoadCallback(initialize);
</script>
</body>
</html>
存檔為 googleearthapi.html,用 browser 打開,就完成了。


這裡可以看到,兩種 api 的程式非常類似,兩者都用到了相同的 loading JavaScript 機制,這也是 API 經過幾次修改後整合起來的型式。

最後再來看 Maps API for Flash。要弄 Flash 版本比較麻煩一點,要下載 flex sdk,再下載 google maps sdk,把 flex sdk 解開(eg: c:\flex_sdk_3\),開個目錄 (eg: test.flex),把 google maps api 解開,得到 map_flex_1_4.swc,這樣開發環境就出來了。

然後一樣,記事本塞程式:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:UIComponent id="mapc" initialize="startMap(event);" resize="resizeMap(event)" width="100%" height="100%"/>
<mx:Script><![CDATA[
import flash.events.Event;
import com.google.maps.MapEvent;
import com.google.maps.Map;
import com.google.maps.LatLng;

private var map:Map;

private function onMapReady(event:MapEvent):void {
  map.setCenter(new LatLng(23.63446, 120.970459), 7);
}

public function resizeMap(event:Event):void {
  map.setSize(new Point(mapc.width, mapc.height));
}

public function startMap(event:Event):void {
  map = new Map();
  map.addEventListener(MapEvent.MAP_READY, onMapReady);
  mapc.addChild(map);
}
]]>
</mx:Script>
</mx:Application>
存檔為 googlemapsflashapi.mxml,然後將 mxml 編譯出 swf:
c:\flex_sdk_3\bin\mxmlc -library-path+=map_flex_1_4.swc googlemapsflashapi.mxml

再開另一個檔案:
<html>
<head>
<title>Hello Google Maps for Flash!</title>
</head>
<body>
<object
  classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"
  width="512px" height="512px">
  <param name="movie" value="./googlemapsflashapi.swf">
  <param name="quality" value="high">
  <param name="flashVars" value="key=ABQIAAAA7QUChpcnvnmXxsjC7s1fCxQGj0PqsCtxKvarsoS-iqLdqZSKfxTd7Xf-2rEc_PC9o8IsJde80Wnj4g">
  <embed width="512px" height="512px" src="./googlemapsflashapi.swf" quality="high"
    flashVars="key=ABQIAAAA7QUChpcnvnmXxsjC7s1fCxQGj0PqsCtxKvarsoS-iqLdqZSKfxTd7Xf-2rEc_PC9o8IsJde80Wnj4g"
    pluginspage="http://www.macromedia.com/go/getflashplayer"
    type="application/x-shockwave-flash"></embed>
</object>
</body>
</html>
存檔為 googlemapsflashapi.html,用 browser 打開,就完成了。

綜觀這幾個例子,可以看出這些程式是蠻相似的,都是用 markup language 訂出介面,再用 script language 處理互動,相信如果有 silverlight 版本也會是一樣的作法。

Tuesday, June 3, 2008

鬼玩人, 新空房禁地

最近真是瘋狂的看電影,常常假日白天去二輪看個二片,晚上回來再看個二片,其實還蠻容易打發時間的,不過就是沒看的書堆得越來越多,會讓人覺得很癈…

Eval Dead (1981), Eval Dead 2 (1987) 這兩片的中文譯名蠻亂的,港譯名和台譯名又不同 (死靈嚇破膽,鬼玩人,屍變等等),反正就是 Sam Raimi (山姆雷米,蜘蛛人導演) 早期拍的 Cult Film。這兩片在當時或許真的會讓人覺得害怕,毫不避諱的血"奶"亂噴、砍頭、分屍,拿筆戳你還不夠,戳進去後還一定要轉一轉拍給你看才行,人拿電鋸砍僵屍玩過了,僵屍電鋸砍自己才夠棒。不過以現在的角度來看真實度己經不足以讓人會有噁心的感覺 (至少我啦),反而讓人有特別的趣味感,裡面有非常多黏土特效,如果不計較真實感的話,其實做得非常有感覺。不過 Eval Dead 3 (1992) 就主要是在搞笑了,第二集主角最後和魔鬼被傳送回中古世紀,而第三集就變成和中古世紀的死人軍團作戰了,雖然是更明顯的要走黑色幽默的路線,但反而不像前兩集那樣 cult 味十足了。

Dead Alive (新空房禁地) 則是 Peter Jackson (魔戒導演)早期作品,這片好像比較多人看過,應該也是很多人心中最噁心的片子,其血腥的程度更勝上面兩片,但卻也更有戲謔的效果,使中國功夫(動作真不錯)的神父變男僵屍,被砍一半頭的護士變女僵屍,變成僵屍後再搞一搞生個小僵屍;僵屍臉皮掉下來,用膠水黏回去…,玩成這樣不覺得真的會讓人大笑嗎:) 更別說最後鋤草機大屠殺和巨乳肥臀女魔頭,這種片如果是和很多人一起在戲院看一定很棒!! 其實在看最後的片段時,我一直想到類似倩女幽魂的黑山姥姥,其實咱們早期拍的一些武俠或鬼怪片也是屬於我們的 cult film 吧 :)

功夫神父,ㄟ…還是有點噁心啦,有心理準備就還好。

Thursday, May 29, 2008

Dr. Jones

印第安納瓊斯:水晶骷髏王國

外星人?核爆?最好是這樣啦。前幾集的劇情雖然也是扯,但至少還是考古學的風格 (第二集魔宮也很牽強),這集最好是開始來個核爆,結局來個 ET phone home 啦。很明顯是想把兒子扯出來,以後繼續撈錢,不過這個兒子也沒什麼特色 (以前演爺爺的 Sean Connery 就很有個人風格),爺爺拿雨傘怕老鼠,老爸拿鞭子怕蛇,兒子呢拿小刀怕蠍子?外形沒什麼特色耶,你看你老爸笑起來多帥…

評價起來,還是第一集和第三集比較好,整個劇情最平衡,尋寶的過程和結局也不錯,第二集除了礦車外就只是個 B 級片罷了 (餵鱷魚?是想不到更好的結局嗎?),這集的話,普普吧,不過大概是沒有第 5 集了。

雖然這次也有個 Jones 女郎 (Cate Blanchett),不過這次是從頭到尾的反派,也沒啥曖昧關係,最後也是回歸好男人的劇情,這到是和 007 不同了。

Monday, April 7, 2008

memento

這部片子的特別之處可以參考這裡,也提到為什麼不要看台灣的版本。的確是好片,但要看的人可以要精神好一點時再來看,因為故事敘事的手法太特別了,一不注意可能會有點混亂,不過絕對是部毫無冷場的片。既然台灣版本有問題,那怎麼看到正確的"混亂"版本呢?只能說是無邊無盡的啊。

以下算微雷吧,應該不影響看片樂趣。

主角不停的強調他不是失憶,而是"can't make new memory",翻譯是沒有短期記憶。這個病不是亂編的,以前在 Discvery 討論到記憶的形成時就提到這種病,也有不少真實的病例,現實情況中病患也的確是用錄音,照片,筆記等方式來試圖取代短期記憶(說到這,錄音後再整理應該是比較方便有效的方式,這裡的主角沒用錄音應該為了突顯情況),因為人類的長期記憶是由短期記憶中再進行重整固化,所以無法形成短期記憶也就無法形成長期記憶,至於實際的病因,就會看到一堆和海馬有關的文章了 :)。討論記憶的電影其實不少,但大部分都是失憶,說到這種病症好像是第一次看到。

再來,為什麼這部電影的手法需要這麼特別也是有原因的,不光只是玩弄技巧而已。一般如果去描述這個病症的話,可能會讓人感到驚訝,同情,甚至是有點荒謬的有趣(片中也有不少這種片斷),但因為短期記憶對人類太重要,也太依賴了,很難讓人能去體會沒有短期記憶是什麼樣的情況 (失憶就不同了,忘了東西忘了人是每個人都會有的經驗,不難想像),如果只是看主角喝下自己吐了口水的啤酒,或是跑著跑著連正在追人或被追都忘了,要不是他是主角大概就是被當成活寶角色吧,如果能讓觀眾也能親身體會記憶只有十分鐘的情況,一定會更有感覺的。我想導演應該有想過讓整部電影的順序整個打亂,讓大家的短期記憶也難以發揮,不過我想如果這樣應該真的沒人看得下去,而這種十分鐘一段的倒敘法讓人有些許感受到主角身處的情況, 也讓人有體會到自己的短期記憶果然還是有發揮作用 (所以要專心一點看啊) :)

要稍微體會一下這片的精髓,可以看一下這個偽曼陀珠(mentos)的廣告,看一部簡單的廣告亂序後多麼有趣 (放心,和劇情完全無關)